Repository: TheAlgorithms/Python Branch: master Commit: 68473afc4b22 Files: 1489 Total size: 8.4 MB Directory structure: gitextract_lj21xc5n/ ├── .devcontainer/ │ ├── Dockerfile │ ├── README.md │ ├── devcontainer.json │ └── post_install ├── .gitattributes ├── .github/ │ ├── CODEOWNERS │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ ├── config.yml │ │ ├── feature_request.yml │ │ └── other.yml │ ├── dependabot.yml │ ├── pull_request_template.md │ ├── stale.yml │ └── workflows/ │ ├── build.yml │ ├── devcontainer_ci.yml │ ├── directory_writer.yml │ ├── project_euler.yml │ ├── ruff.yml │ └── sphinx.yml ├── .gitignore ├── .gitpod.yml ├── .pre-commit-config.yaml ├── CONTRIBUTING.md ├── DIRECTORY.md ├── LICENSE.md ├── README.md ├── audio_filters/ │ ├── README.md │ ├── __init__.py │ ├── butterworth_filter.py │ ├── equal_loudness_filter.py.broken.txt │ ├── iir_filter.py │ ├── loudness_curve.json │ └── show_response.py ├── backtracking/ │ ├── README.md │ ├── __init__.py │ ├── all_combinations.py │ ├── all_permutations.py │ ├── all_subsequences.py │ ├── coloring.py │ ├── combination_sum.py │ ├── crossword_puzzle_solver.py │ ├── generate_parentheses.py │ ├── generate_parentheses_iterative.py │ ├── hamiltonian_cycle.py │ ├── knight_tour.py │ ├── match_word_pattern.py │ ├── minimax.py │ ├── n_queens.py │ ├── n_queens_math.py │ ├── power_sum.py │ ├── rat_in_maze.py │ ├── sudoku.py │ ├── sum_of_subsets.py │ ├── word_break.py │ ├── word_ladder.py │ └── word_search.py ├── bit_manipulation/ │ ├── README.md │ ├── __init__.py │ ├── binary_and_operator.py │ ├── binary_coded_decimal.py │ ├── binary_count_setbits.py │ ├── binary_count_trailing_zeros.py │ ├── binary_or_operator.py │ ├── binary_shifts.py │ ├── binary_twos_complement.py │ ├── binary_xor_operator.py │ ├── bitwise_addition_recursive.py │ ├── count_1s_brian_kernighan_method.py │ ├── count_number_of_one_bits.py │ ├── excess_3_code.py │ ├── find_previous_power_of_two.py │ ├── find_unique_number.py │ ├── gray_code_sequence.py │ ├── highest_set_bit.py │ ├── index_of_rightmost_set_bit.py │ ├── is_even.py │ ├── is_power_of_two.py │ ├── largest_pow_of_two_le_num.py │ ├── missing_number.py │ ├── numbers_different_signs.py │ ├── power_of_4.py │ ├── reverse_bits.py │ ├── single_bit_manipulation_operations.py │ └── swap_all_odd_and_even_bits.py ├── blockchain/ │ ├── README.md │ ├── __init__.py │ └── diophantine_equation.py ├── boolean_algebra/ │ ├── README.md │ ├── __init__.py │ ├── and_gate.py │ ├── imply_gate.py │ ├── karnaugh_map_simplification.py │ ├── multiplexer.py │ ├── nand_gate.py │ ├── nimply_gate.py │ ├── nor_gate.py │ ├── not_gate.py │ ├── or_gate.py │ ├── quine_mc_cluskey.py │ ├── xnor_gate.py │ └── xor_gate.py ├── cellular_automata/ │ ├── README.md │ ├── __init__.py │ ├── conways_game_of_life.py │ ├── game_of_life.py │ ├── langtons_ant.py │ ├── nagel_schrekenberg.py │ ├── one_dimensional.py │ └── wa_tor.py ├── ciphers/ │ ├── README.md │ ├── __init__.py │ ├── a1z26.py │ ├── affine_cipher.py │ ├── atbash.py │ ├── autokey.py │ ├── baconian_cipher.py │ ├── base16.py │ ├── base32.py │ ├── base64_cipher.py │ ├── base85.py │ ├── beaufort_cipher.py │ ├── bifid.py │ ├── brute_force_caesar_cipher.py │ ├── caesar_cipher.py │ ├── cryptomath_module.py │ ├── decrypt_caesar_with_chi_squared.py │ ├── deterministic_miller_rabin.py │ ├── diffie.py │ ├── diffie_hellman.py │ ├── elgamal_key_generator.py │ ├── enigma_machine2.py │ ├── fractionated_morse_cipher.py │ ├── gronsfeld_cipher.py │ ├── hill_cipher.py │ ├── mixed_keyword_cypher.py │ ├── mono_alphabetic_ciphers.py │ ├── morse_code.py │ ├── onepad_cipher.py │ ├── permutation_cipher.py │ ├── playfair_cipher.py │ ├── polybius.py │ ├── porta_cipher.py │ ├── prehistoric_men.txt │ ├── rabin_miller.py │ ├── rail_fence_cipher.py │ ├── rot13.py │ ├── rsa_cipher.py │ ├── rsa_factorization.py │ ├── rsa_key_generator.py │ ├── running_key_cipher.py │ ├── shuffled_shift_cipher.py │ ├── simple_keyword_cypher.py │ ├── simple_substitution_cipher.py │ ├── transposition_cipher.py │ ├── transposition_cipher_encrypt_decrypt_file.py │ ├── trifid_cipher.py │ ├── vernam_cipher.py │ ├── vigenere_cipher.py │ └── xor_cipher.py ├── computer_vision/ │ ├── README.md │ ├── __init__.py │ ├── cnn_classification.py │ ├── flip_augmentation.py │ ├── haralick_descriptors.py │ ├── harris_corner.py │ ├── horn_schunck.py │ ├── intensity_based_segmentation.py │ ├── mean_threshold.py │ ├── mosaic_augmentation.py │ └── pooling_functions.py ├── conversions/ │ ├── README.md │ ├── __init__.py │ ├── astronomical_length_scale_conversion.py │ ├── binary_to_decimal.py │ ├── binary_to_hexadecimal.py │ ├── binary_to_octal.py │ ├── convert_number_to_words.py │ ├── decimal_to_any.py │ ├── decimal_to_binary.py │ ├── decimal_to_hexadecimal.py │ ├── decimal_to_octal.py │ ├── energy_conversions.py │ ├── excel_title_to_column.py │ ├── hex_to_bin.py │ ├── hexadecimal_to_decimal.py │ ├── ipv4_conversion.py │ ├── length_conversion.py │ ├── molecular_chemistry.py │ ├── octal_to_binary.py │ ├── octal_to_decimal.py │ ├── octal_to_hexadecimal.py │ ├── prefix_conversions.py │ ├── prefix_conversions_string.py │ ├── pressure_conversions.py │ ├── rectangular_to_polar.py │ ├── rgb_cmyk_conversion.py │ ├── rgb_hsv_conversion.py │ ├── roman_numerals.py │ ├── speed_conversions.py │ ├── temperature_conversions.py │ ├── time_conversions.py │ ├── volume_conversions.py │ └── weight_conversion.py ├── data_compression/ │ ├── README.md │ ├── __init__.py │ ├── burrows_wheeler.py │ ├── coordinate_compression.py │ ├── huffman.py │ ├── lempel_ziv.py │ ├── lempel_ziv_decompress.py │ ├── lz77.py │ ├── peak_signal_to_noise_ratio.py │ └── run_length_encoding.py ├── data_structures/ │ ├── __init__.py │ ├── arrays/ │ │ ├── __init__.py │ │ ├── equilibrium_index_in_array.py │ │ ├── find_triplets_with_0_sum.py │ │ ├── index_2d_array_in_1d.py │ │ ├── kth_largest_element.py │ │ ├── median_two_array.py │ │ ├── monotonic_array.py │ │ ├── pairs_with_given_sum.py │ │ ├── permutations.py │ │ ├── prefix_sum.py │ │ ├── product_sum.py │ │ ├── rotate_array.py │ │ ├── sparse_table.py │ │ └── sudoku_solver.py │ ├── binary_tree/ │ │ ├── README.md │ │ ├── __init__.py │ │ ├── avl_tree.py │ │ ├── basic_binary_tree.py │ │ ├── binary_search_tree.py │ │ ├── binary_search_tree_recursive.py │ │ ├── binary_tree_mirror.py │ │ ├── binary_tree_node_sum.py │ │ ├── binary_tree_path_sum.py │ │ ├── binary_tree_traversals.py │ │ ├── diameter_of_binary_tree.py │ │ ├── diff_views_of_binary_tree.py │ │ ├── distribute_coins.py │ │ ├── fenwick_tree.py │ │ ├── flatten_binarytree_to_linkedlist.py │ │ ├── floor_and_ceiling.py │ │ ├── inorder_tree_traversal_2022.py │ │ ├── is_sorted.py │ │ ├── is_sum_tree.py │ │ ├── lazy_segment_tree.py │ │ ├── lowest_common_ancestor.py │ │ ├── maximum_fenwick_tree.py │ │ ├── maximum_sum_bst.py │ │ ├── merge_two_binary_trees.py │ │ ├── mirror_binary_tree.py │ │ ├── non_recursive_segment_tree.py │ │ ├── number_of_possible_binary_trees.py │ │ ├── red_black_tree.py │ │ ├── segment_tree.py │ │ ├── segment_tree_other.py │ │ ├── serialize_deserialize_binary_tree.py │ │ ├── symmetric_tree.py │ │ ├── treap.py │ │ └── wavelet_tree.py │ ├── disjoint_set/ │ │ ├── __init__.py │ │ ├── alternate_disjoint_set.py │ │ └── disjoint_set.py │ ├── hashing/ │ │ ├── __init__.py │ │ ├── bloom_filter.py │ │ ├── double_hash.py │ │ ├── hash_map.py │ │ ├── hash_table.py │ │ ├── hash_table_with_linked_list.py │ │ ├── number_theory/ │ │ │ ├── __init__.py │ │ │ └── prime_numbers.py │ │ ├── quadratic_probing.py │ │ └── tests/ │ │ ├── __init__.py │ │ └── test_hash_map.py │ ├── heap/ │ │ ├── __init__.py │ │ ├── binomial_heap.py │ │ ├── heap.py │ │ ├── heap_generic.py │ │ ├── max_heap.py │ │ ├── min_heap.py │ │ ├── randomized_heap.py │ │ └── skew_heap.py │ ├── kd_tree/ │ │ ├── __init__.py │ │ ├── build_kdtree.py │ │ ├── example/ │ │ │ ├── __init__.py │ │ │ ├── example_usage.py │ │ │ └── hypercube_points.py │ │ ├── kd_node.py │ │ ├── nearest_neighbour_search.py │ │ └── tests/ │ │ ├── __init__.py │ │ └── test_kdtree.py │ ├── linked_list/ │ │ ├── __init__.py │ │ ├── circular_linked_list.py │ │ ├── deque_doubly.py │ │ ├── doubly_linked_list.py │ │ ├── doubly_linked_list_two.py │ │ ├── floyds_cycle_detection.py │ │ ├── from_sequence.py │ │ ├── has_loop.py │ │ ├── is_palindrome.py │ │ ├── merge_two_lists.py │ │ ├── middle_element_of_linked_list.py │ │ ├── print_reverse.py │ │ ├── reverse_k_group.py │ │ ├── rotate_to_the_right.py │ │ ├── singly_linked_list.py │ │ ├── skip_list.py │ │ └── swap_nodes.py │ ├── queues/ │ │ ├── __init__.py │ │ ├── circular_queue.py │ │ ├── circular_queue_linked_list.py │ │ ├── double_ended_queue.py │ │ ├── linked_queue.py │ │ ├── priority_queue_using_list.py │ │ ├── queue_by_list.py │ │ ├── queue_by_two_stacks.py │ │ └── queue_on_pseudo_stack.py │ ├── stacks/ │ │ ├── __init__.py │ │ ├── balanced_parentheses.py │ │ ├── dijkstras_two_stack_algorithm.py │ │ ├── infix_to_postfix_conversion.py │ │ ├── infix_to_prefix_conversion.py │ │ ├── largest_rectangle_histogram.py │ │ ├── lexicographical_numbers.py │ │ ├── next_greater_element.py │ │ ├── postfix_evaluation.py │ │ ├── prefix_evaluation.py │ │ ├── stack.py │ │ ├── stack_using_two_queues.py │ │ ├── stack_with_doubly_linked_list.py │ │ ├── stack_with_singly_linked_list.py │ │ └── stock_span_problem.py │ ├── suffix_tree/ │ │ ├── __init__.py │ │ ├── example/ │ │ │ ├── __init__.py │ │ │ └── example_usage.py │ │ ├── suffix_tree.py │ │ ├── suffix_tree_node.py │ │ └── tests/ │ │ ├── __init__.py │ │ └── test_suffix_tree.py │ └── trie/ │ ├── __init__.py │ ├── radix_tree.py │ └── trie.py ├── digital_image_processing/ │ ├── __init__.py │ ├── change_brightness.py │ ├── change_contrast.py │ ├── convert_to_negative.py │ ├── dithering/ │ │ ├── __init__.py │ │ └── burkes.py │ ├── edge_detection/ │ │ ├── __init__.py │ │ └── canny.py │ ├── filters/ │ │ ├── __init__.py │ │ ├── bilateral_filter.py │ │ ├── convolve.py │ │ ├── gabor_filter.py │ │ ├── gaussian_filter.py │ │ ├── laplacian_filter.py │ │ ├── local_binary_pattern.py │ │ ├── median_filter.py │ │ └── sobel_filter.py │ ├── histogram_equalization/ │ │ ├── __init__.py │ │ ├── histogram_stretch.py │ │ ├── image_data/ │ │ │ └── __init__.py │ │ └── output_data/ │ │ └── __init__.py │ ├── image_data/ │ │ └── __init__.py │ ├── index_calculation.py │ ├── morphological_operations/ │ │ ├── __init__.py │ │ ├── dilation_operation.py │ │ └── erosion_operation.py │ ├── resize/ │ │ ├── __init__.py │ │ └── resize.py │ ├── rotation/ │ │ ├── __init__.py │ │ └── rotation.py │ ├── sepia.py │ └── test_digital_image_processing.py ├── divide_and_conquer/ │ ├── __init__.py │ ├── closest_pair_of_points.py │ ├── convex_hull.py │ ├── heaps_algorithm.py │ ├── heaps_algorithm_iterative.py │ ├── inversions.py │ ├── kth_order_statistic.py │ ├── max_difference_pair.py │ ├── max_subarray.py │ ├── mergesort.py │ ├── peak.py │ ├── power.py │ └── strassen_matrix_multiplication.py ├── docs/ │ ├── __init__.py │ ├── conf.py │ └── source/ │ └── __init__.py ├── dynamic_programming/ │ ├── __init__.py │ ├── abbreviation.py │ ├── all_construct.py │ ├── bitmask.py │ ├── catalan_numbers.py │ ├── climbing_stairs.py │ ├── combination_sum_iv.py │ ├── edit_distance.py │ ├── factorial.py │ ├── fast_fibonacci.py │ ├── fibonacci.py │ ├── fizz_buzz.py │ ├── floyd_warshall.py │ ├── integer_partition.py │ ├── iterating_through_submasks.py │ ├── k_means_clustering_tensorflow.py │ ├── knapsack.py │ ├── largest_divisible_subset.py │ ├── longest_common_subsequence.py │ ├── longest_common_substring.py │ ├── longest_increasing_subsequence.py │ ├── longest_increasing_subsequence_iterative.py │ ├── longest_increasing_subsequence_o_nlogn.py │ ├── longest_palindromic_subsequence.py │ ├── matrix_chain_multiplication.py │ ├── matrix_chain_order.py │ ├── max_non_adjacent_sum.py │ ├── max_product_subarray.py │ ├── max_subarray_sum.py │ ├── min_distance_up_bottom.py │ ├── minimum_coin_change.py │ ├── minimum_cost_path.py │ ├── minimum_partition.py │ ├── minimum_size_subarray_sum.py │ ├── minimum_squares_to_represent_a_number.py │ ├── minimum_steps_to_one.py │ ├── minimum_tickets_cost.py │ ├── narcissistic_number.py │ ├── optimal_binary_search_tree.py │ ├── palindrome_partitioning.py │ ├── range_sum_query.py │ ├── regex_match.py │ ├── rod_cutting.py │ ├── smith_waterman.py │ ├── subset_generation.py │ ├── sum_of_subset.py │ ├── trapped_water.py │ ├── tribonacci.py │ ├── viterbi.py │ ├── wildcard_matching.py │ └── word_break.py ├── electronics/ │ ├── __init__.py │ ├── apparent_power.py │ ├── builtin_voltage.py │ ├── capacitor_equivalence.py │ ├── carrier_concentration.py │ ├── charging_capacitor.py │ ├── charging_inductor.py │ ├── circular_convolution.py │ ├── coulombs_law.py │ ├── electric_conductivity.py │ ├── electric_power.py │ ├── electrical_impedance.py │ ├── ic_555_timer.py │ ├── ind_reactance.py │ ├── ohms_law.py │ ├── real_and_reactive_power.py │ ├── resistor_color_code.py │ ├── resistor_equivalence.py │ ├── resonant_frequency.py │ └── wheatstone_bridge.py ├── file_transfer/ │ ├── __init__.py │ ├── mytext.txt │ ├── receive_file.py │ ├── send_file.py │ └── tests/ │ ├── __init__.py │ └── test_send_file.py ├── financial/ │ ├── README.md │ ├── __init__.py │ ├── equated_monthly_installments.py │ ├── exponential_moving_average.py │ ├── interest.py │ ├── present_value.py │ ├── price_plus_tax.py │ ├── simple_moving_average.py │ ├── straight_line_depreciation.py │ └── time_and_half_pay.py ├── fractals/ │ ├── __init__.py │ ├── julia_sets.py │ ├── koch_snowflake.py │ ├── mandelbrot.py │ ├── sierpinski_triangle.py │ └── vicsek.py ├── fuzzy_logic/ │ ├── __init__.py │ ├── fuzzy_operations.py │ └── fuzzy_operations.py.DISABLED.txt ├── genetic_algorithm/ │ ├── __init__.py │ └── basic_string.py ├── geodesy/ │ ├── __init__.py │ ├── haversine_distance.py │ └── lamberts_ellipsoidal_distance.py ├── geometry/ │ ├── __init__.py │ ├── geometry.py │ ├── graham_scan.py │ ├── jarvis_march.py │ └── tests/ │ ├── __init__.py │ ├── test_graham_scan.py │ └── test_jarvis_march.py ├── graphics/ │ ├── __init__.py │ ├── bezier_curve.py │ ├── butterfly_pattern.py │ ├── digital_differential_analyzer_line.py │ └── vector3_for_2d_rendering.py ├── graphs/ │ ├── __init__.py │ ├── a_star.py │ ├── ant_colony_optimization_algorithms.py │ ├── articulation_points.py │ ├── basic_graphs.py │ ├── bellman_ford.py │ ├── bi_directional_dijkstra.py │ ├── bidirectional_a_star.py │ ├── bidirectional_breadth_first_search.py │ ├── bidirectional_search.py │ ├── boruvka.py │ ├── breadth_first_search.py │ ├── breadth_first_search_2.py │ ├── breadth_first_search_shortest_path.py │ ├── breadth_first_search_shortest_path_2.py │ ├── breadth_first_search_zero_one_shortest_path.py │ ├── check_bipatrite.py │ ├── check_cycle.py │ ├── connected_components.py │ ├── deep_clone_graph.py │ ├── depth_first_search.py │ ├── depth_first_search_2.py │ ├── dijkstra.py │ ├── dijkstra_2.py │ ├── dijkstra_algorithm.py │ ├── dijkstra_alternate.py │ ├── dijkstra_binary_grid.py │ ├── dinic.py │ ├── directed_and_undirected_weighted_graph.py │ ├── edmonds_karp_multiple_source_and_sink.py │ ├── eulerian_path_and_circuit_for_undirected_graph.py │ ├── even_tree.py │ ├── finding_bridges.py │ ├── frequent_pattern_graph_miner.py │ ├── g_topological_sort.py │ ├── gale_shapley_bigraph.py │ ├── graph_adjacency_list.py │ ├── graph_adjacency_matrix.py │ ├── graph_list.py │ ├── graphs_floyd_warshall.py │ ├── greedy_best_first.py │ ├── greedy_min_vertex_cover.py │ ├── kahns_algorithm_long.py │ ├── kahns_algorithm_topo.py │ ├── karger.py │ ├── lanczos_eigenvectors.py │ ├── markov_chain.py │ ├── matching_min_vertex_cover.py │ ├── minimum_path_sum.py │ ├── minimum_spanning_tree_boruvka.py │ ├── minimum_spanning_tree_kruskal.py │ ├── minimum_spanning_tree_kruskal2.py │ ├── minimum_spanning_tree_prims.py │ ├── minimum_spanning_tree_prims2.py │ ├── multi_heuristic_astar.py │ ├── page_rank.py │ ├── prim.py │ ├── random_graph_generator.py │ ├── scc_kosaraju.py │ ├── strongly_connected_components.py │ ├── tarjans_scc.py │ └── tests/ │ ├── __init__.py │ ├── test_min_spanning_tree_kruskal.py │ └── test_min_spanning_tree_prim.py ├── greedy_methods/ │ ├── __init__.py │ ├── best_time_to_buy_and_sell_stock.py │ ├── fractional_cover_problem.py │ ├── fractional_knapsack.py │ ├── fractional_knapsack_2.py │ ├── gas_station.py │ ├── minimum_coin_change.py │ ├── minimum_waiting_time.py │ ├── optimal_merge_pattern.py │ └── smallest_range.py ├── hashes/ │ ├── README.md │ ├── __init__.py │ ├── adler32.py │ ├── chaos_machine.py │ ├── djb2.py │ ├── elf.py │ ├── enigma_machine.py │ ├── fletcher16.py │ ├── hamming_code.py │ ├── luhn.py │ ├── md5.py │ ├── sdbm.py │ ├── sha1.py │ └── sha256.py ├── index.md ├── knapsack/ │ ├── README.md │ ├── __init__.py │ ├── greedy_knapsack.py │ ├── knapsack.py │ ├── recursive_approach_knapsack.py │ └── tests/ │ ├── __init__.py │ ├── test_greedy_knapsack.py │ └── test_knapsack.py ├── linear_algebra/ │ ├── README.md │ ├── __init__.py │ ├── gaussian_elimination.py │ ├── jacobi_iteration_method.py │ ├── lu_decomposition.py │ ├── matrix_inversion.py │ └── src/ │ ├── __init__.py │ ├── conjugate_gradient.py │ ├── gaussian_elimination_pivoting.py │ ├── lib.py │ ├── polynom_for_points.py │ ├── power_iteration.py │ ├── rank_of_matrix.py │ ├── rayleigh_quotient.py │ ├── schur_complement.py │ ├── test_linear_algebra.py │ └── transformations_2d.py ├── linear_programming/ │ ├── __init__.py │ └── simplex.py ├── machine_learning/ │ ├── __init__.py │ ├── apriori_algorithm.py │ ├── astar.py │ ├── automatic_differentiation.py │ ├── data_transformations.py │ ├── decision_tree.py │ ├── dimensionality_reduction.py │ ├── forecasting/ │ │ ├── __init__.py │ │ ├── ex_data.csv │ │ └── run.py │ ├── frequent_pattern_growth.py │ ├── gaussian_naive_bayes.py.broken.txt │ ├── gradient_boosting_classifier.py │ ├── gradient_boosting_regressor.py.broken.txt │ ├── gradient_descent.py │ ├── k_means_clust.py │ ├── k_nearest_neighbours.py │ ├── linear_discriminant_analysis.py │ ├── linear_regression.py │ ├── local_weighted_learning/ │ │ ├── README.md │ │ ├── __init__.py │ │ └── local_weighted_learning.py │ ├── logistic_regression.py │ ├── loss_functions.py │ ├── lstm/ │ │ ├── __init__.py │ │ ├── lstm_prediction.py │ │ └── sample_data.csv │ ├── mfcc.py │ ├── multilayer_perceptron_classifier.py │ ├── polynomial_regression.py │ ├── principle_component_analysis.py │ ├── random_forest_classifier.py.broken.txt │ ├── random_forest_regressor.py.broken.txt │ ├── scoring_functions.py │ ├── self_organizing_map.py │ ├── sequential_minimum_optimization.py │ ├── similarity_search.py │ ├── support_vector_machines.py │ ├── t_stochastic_neighbour_embedding.py │ ├── word_frequency_functions.py │ ├── xgboost_classifier.py │ └── xgboost_regressor.py ├── maths/ │ ├── __init__.py │ ├── abs.py │ ├── addition_without_arithmetic.py │ ├── aliquot_sum.py │ ├── allocation_number.py │ ├── arc_length.py │ ├── area.py │ ├── area_under_curve.py │ ├── average_absolute_deviation.py │ ├── average_mean.py │ ├── average_median.py │ ├── average_mode.py │ ├── bailey_borwein_plouffe.py │ ├── base_neg2_conversion.py │ ├── basic_maths.py │ ├── binary_exponentiation.py │ ├── binary_multiplication.py │ ├── binomial_coefficient.py │ ├── binomial_distribution.py │ ├── ceil.py │ ├── chebyshev_distance.py │ ├── check_polygon.py │ ├── chinese_remainder_theorem.py │ ├── chudnovsky_algorithm.py │ ├── collatz_sequence.py │ ├── combinations.py │ ├── continued_fraction.py │ ├── decimal_isolate.py │ ├── decimal_to_fraction.py │ ├── dodecahedron.py │ ├── double_factorial.py │ ├── dual_number_automatic_differentiation.py │ ├── entropy.py │ ├── euclidean_distance.py │ ├── euler_method.py │ ├── euler_modified.py │ ├── eulers_totient.py │ ├── extended_euclidean_algorithm.py │ ├── factorial.py │ ├── factors.py │ ├── fast_inverse_sqrt.py │ ├── fermat_little_theorem.py │ ├── fibonacci.py │ ├── find_max.py │ ├── find_min.py │ ├── floor.py │ ├── gamma.py │ ├── gaussian.py │ ├── gcd_of_n_numbers.py │ ├── geometric_mean.py │ ├── germain_primes.py │ ├── greatest_common_divisor.py │ ├── hardy_ramanujanalgo.py │ ├── images/ │ │ └── __init__.py │ ├── integer_square_root.py │ ├── interquartile_range.py │ ├── is_int_palindrome.py │ ├── is_ip_v4_address_valid.py │ ├── is_square_free.py │ ├── jaccard_similarity.py │ ├── joint_probability_distribution.py │ ├── josephus_problem.py │ ├── juggler_sequence.py │ ├── karatsuba.py │ ├── kth_lexicographic_permutation.py │ ├── largest_of_very_large_numbers.py │ ├── least_common_multiple.py │ ├── line_length.py │ ├── liouville_lambda.py │ ├── lucas_lehmer_primality_test.py │ ├── lucas_series.py │ ├── maclaurin_series.py │ ├── manhattan_distance.py │ ├── matrix_exponentiation.py │ ├── max_sum_sliding_window.py │ ├── minkowski_distance.py │ ├── mobius_function.py │ ├── modular_division.py │ ├── modular_exponential.py │ ├── monte_carlo.py │ ├── monte_carlo_dice.py │ ├── number_of_digits.py │ ├── numerical_analysis/ │ │ ├── __init__.py │ │ ├── adams_bashforth.py │ │ ├── bisection.py │ │ ├── bisection_2.py │ │ ├── integration_by_simpson_approx.py │ │ ├── intersection.py │ │ ├── nevilles_method.py │ │ ├── newton_forward_interpolation.py │ │ ├── newton_raphson.py │ │ ├── numerical_integration.py │ │ ├── proper_fractions.py │ │ ├── runge_kutta.py │ │ ├── runge_kutta_fehlberg_45.py │ │ ├── runge_kutta_gills.py │ │ ├── secant_method.py │ │ ├── simpson_rule.py │ │ ├── square_root.py │ │ └── weierstrass_method.py │ ├── odd_sieve.py │ ├── perfect_cube.py │ ├── perfect_number.py │ ├── perfect_square.py │ ├── persistence.py │ ├── pi_generator.py │ ├── pi_monte_carlo_estimation.py │ ├── points_are_collinear_3d.py │ ├── pollard_rho.py │ ├── polynomial_evaluation.py │ ├── polynomials/ │ │ ├── __init__.py │ │ └── single_indeterminate_operations.py │ ├── power_using_recursion.py │ ├── prime_check.py │ ├── prime_factors.py │ ├── prime_numbers.py │ ├── prime_sieve_eratosthenes.py │ ├── primelib.py │ ├── print_multiplication_table.py │ ├── pythagoras.py │ ├── qr_decomposition.py │ ├── quadratic_equations_complex_numbers.py │ ├── radians.py │ ├── radix2_fft.py │ ├── remove_digit.py │ ├── segmented_sieve.py │ ├── series/ │ │ ├── __init__.py │ │ ├── arithmetic.py │ │ ├── geometric.py │ │ ├── geometric_series.py │ │ ├── harmonic.py │ │ ├── harmonic_series.py │ │ ├── hexagonal_numbers.py │ │ └── p_series.py │ ├── sieve_of_eratosthenes.py │ ├── sigmoid.py │ ├── signum.py │ ├── simultaneous_linear_equation_solver.py │ ├── sin.py │ ├── sock_merchant.py │ ├── softmax.py │ ├── solovay_strassen_primality_test.py │ ├── spearman_rank_correlation_coefficient.py │ ├── special_numbers/ │ │ ├── __init__.py │ │ ├── armstrong_numbers.py │ │ ├── automorphic_number.py │ │ ├── bell_numbers.py │ │ ├── carmichael_number.py │ │ ├── catalan_number.py │ │ ├── hamming_numbers.py │ │ ├── happy_number.py │ │ ├── harshad_numbers.py │ │ ├── hexagonal_number.py │ │ ├── krishnamurthy_number.py │ │ ├── perfect_number.py │ │ ├── polygonal_numbers.py │ │ ├── pronic_number.py │ │ ├── proth_number.py │ │ ├── triangular_numbers.py │ │ ├── ugly_numbers.py │ │ └── weird_number.py │ ├── sum_of_arithmetic_series.py │ ├── sum_of_digits.py │ ├── sum_of_geometric_progression.py │ ├── sum_of_harmonic_series.py │ ├── sumset.py │ ├── sylvester_sequence.py │ ├── tanh.py │ ├── test_factorial.py │ ├── test_prime_check.py │ ├── three_sum.py │ ├── trapezoidal_rule.py │ ├── triplet_sum.py │ ├── twin_prime.py │ ├── two_pointer.py │ ├── two_sum.py │ ├── volume.py │ └── zellers_congruence.py ├── matrix/ │ ├── __init__.py │ ├── binary_search_matrix.py │ ├── count_islands_in_matrix.py │ ├── count_negative_numbers_in_sorted_matrix.py │ ├── count_paths.py │ ├── cramers_rule_2x2.py │ ├── inverse_of_matrix.py │ ├── largest_square_area_in_matrix.py │ ├── matrix_based_game.py │ ├── matrix_class.py │ ├── matrix_equalization.py │ ├── matrix_multiplication_recursion.py │ ├── matrix_operation.py │ ├── max_area_of_island.py │ ├── median_matrix.py │ ├── nth_fibonacci_using_matrix_exponentiation.py │ ├── pascal_triangle.py │ ├── rotate_matrix.py │ ├── searching_in_sorted_matrix.py │ ├── sherman_morrison.py │ ├── spiral_print.py │ ├── tests/ │ │ ├── __init__.py │ │ ├── pytest.ini │ │ └── test_matrix_operation.py │ └── validate_sudoku_board.py ├── networking_flow/ │ ├── __init__.py │ ├── ford_fulkerson.py │ └── minimum_cut.py ├── neural_network/ │ ├── __init__.py │ ├── activation_functions/ │ │ ├── __init__.py │ │ ├── binary_step.py │ │ ├── exponential_linear_unit.py │ │ ├── gaussian_error_linear_unit.py │ │ ├── leaky_rectified_linear_unit.py │ │ ├── mish.py │ │ ├── rectified_linear_unit.py │ │ ├── scaled_exponential_linear_unit.py │ │ ├── soboleva_modified_hyperbolic_tangent.py │ │ ├── softplus.py │ │ ├── squareplus.py │ │ └── swish.py │ ├── back_propagation_neural_network.py │ ├── convolution_neural_network.py │ ├── gan.py_tf │ ├── input_data.py │ ├── perceptron.py.DISABLED │ ├── simple_neural_network.py │ └── two_hidden_layers_neural_network.py ├── other/ │ ├── __init__.py │ ├── activity_selection.py │ ├── alternative_list_arrange.py │ ├── bankers_algorithm.py │ ├── davis_putnam_logemann_loveland.py │ ├── doomsday.py │ ├── fischer_yates_shuffle.py │ ├── gauss_easter.py │ ├── graham_scan.py │ ├── greedy.py │ ├── guess_the_number_search.py │ ├── h_index.py │ ├── least_recently_used.py │ ├── lfu_cache.py │ ├── linear_congruential_generator.py │ ├── lru_cache.py │ ├── magicdiamondpattern.py │ ├── majority_vote_algorithm.py │ ├── maximum_subsequence.py │ ├── nested_brackets.py │ ├── number_container_system.py │ ├── password.py │ ├── quine.py │ ├── scoring_algorithm.py │ ├── sdes.py │ ├── sliding_window_maximum.py │ ├── tower_of_hanoi.py │ └── word_search.py ├── physics/ │ ├── __init__.py │ ├── altitude_pressure.py │ ├── archimedes_principle_of_buoyant_force.py │ ├── basic_orbital_capture.py │ ├── casimir_effect.py │ ├── center_of_mass.py │ ├── centripetal_force.py │ ├── coulombs_law.py │ ├── doppler_frequency.py │ ├── escape_velocity.py │ ├── grahams_law.py │ ├── horizontal_projectile_motion.py │ ├── hubble_parameter.py │ ├── ideal_gas_law.py │ ├── image_data/ │ │ └── __init__.py │ ├── in_static_equilibrium.py │ ├── kinetic_energy.py │ ├── lens_formulae.py │ ├── lorentz_transformation_four_vector.py │ ├── malus_law.py │ ├── mass_energy_equivalence.py │ ├── mirror_formulae.py │ ├── n_body_simulation.py │ ├── newtons_law_of_gravitation.py │ ├── newtons_second_law_of_motion.py │ ├── orbital_transfer_work.py │ ├── period_of_pendulum.py │ ├── photoelectric_effect.py │ ├── potential_energy.py │ ├── rainfall_intensity.py │ ├── reynolds_number.py │ ├── rms_speed_of_molecule.py │ ├── shear_stress.py │ ├── speed_of_sound.py │ ├── speeds_of_gas_molecules.py │ └── terminal_velocity.py ├── project_euler/ │ ├── README.md │ ├── __init__.py │ ├── problem_001/ │ │ ├── __init__.py │ │ ├── sol1.py │ │ ├── sol2.py │ │ ├── sol3.py │ │ ├── sol4.py │ │ ├── sol5.py │ │ ├── sol6.py │ │ └── sol7.py │ ├── problem_002/ │ │ ├── __init__.py │ │ ├── sol1.py │ │ ├── sol2.py │ │ ├── sol3.py │ │ ├── sol4.py │ │ └── sol5.py │ ├── problem_003/ │ │ ├── __init__.py │ │ ├── sol1.py │ │ ├── sol2.py │ │ └── sol3.py │ ├── problem_004/ │ │ ├── __init__.py │ │ ├── sol1.py │ │ └── sol2.py │ ├── problem_005/ │ │ ├── __init__.py │ │ ├── sol1.py │ │ └── sol2.py │ ├── problem_006/ │ │ ├── __init__.py │ │ ├── sol1.py │ │ ├── sol2.py │ │ ├── sol3.py │ │ └── sol4.py │ ├── problem_007/ │ │ ├── __init__.py │ │ ├── sol1.py │ │ ├── sol2.py │ │ └── sol3.py │ ├── problem_008/ │ │ ├── __init__.py │ │ ├── sol1.py │ │ ├── sol2.py │ │ └── sol3.py │ ├── problem_009/ │ │ ├── __init__.py │ │ ├── sol1.py │ │ ├── sol2.py │ │ ├── sol3.py │ │ └── sol4.py │ ├── problem_010/ │ │ ├── __init__.py │ │ ├── sol1.py │ │ ├── sol2.py │ │ └── sol3.py │ ├── problem_011/ │ │ ├── __init__.py │ │ ├── grid.txt │ │ ├── sol1.py │ │ └── sol2.py │ ├── problem_012/ │ │ ├── __init__.py │ │ ├── sol1.py │ │ └── sol2.py │ ├── problem_013/ │ │ ├── __init__.py │ │ ├── num.txt │ │ └── sol1.py │ ├── problem_014/ │ │ ├── __init__.py │ │ ├── sol1.py │ │ └── sol2.py │ ├── problem_015/ │ │ ├── __init__.py │ │ ├── sol1.py │ │ └── sol2.py │ ├── problem_016/ │ │ ├── __init__.py │ │ ├── sol1.py │ │ └── sol2.py │ ├── problem_017/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_018/ │ │ ├── __init__.py │ │ ├── solution.py │ │ └── triangle.txt │ ├── problem_019/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_020/ │ │ ├── __init__.py │ │ ├── sol1.py │ │ ├── sol2.py │ │ ├── sol3.py │ │ └── sol4.py │ ├── problem_021/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_022/ │ │ ├── __init__.py │ │ ├── p022_names.txt │ │ ├── sol1.py │ │ └── sol2.py │ ├── problem_023/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_024/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_025/ │ │ ├── __init__.py │ │ ├── sol1.py │ │ ├── sol2.py │ │ └── sol3.py │ ├── problem_026/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_027/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_028/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_029/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_030/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_031/ │ │ ├── __init__.py │ │ ├── sol1.py │ │ └── sol2.py │ ├── problem_032/ │ │ ├── __init__.py │ │ └── sol32.py │ ├── problem_033/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_034/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_035/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_036/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_037/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_038/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_039/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_040/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_041/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_042/ │ │ ├── __init__.py │ │ ├── solution42.py │ │ └── words.txt │ ├── problem_043/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_044/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_045/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_046/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_047/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_048/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_049/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_050/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_051/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_052/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_053/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_054/ │ │ ├── __init__.py │ │ ├── poker_hands.txt │ │ ├── sol1.py │ │ └── test_poker_hand.py │ ├── problem_055/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_056/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_057/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_058/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_059/ │ │ ├── __init__.py │ │ ├── p059_cipher.txt │ │ ├── sol1.py │ │ └── test_cipher.txt │ ├── problem_062/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_063/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_064/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_065/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_067/ │ │ ├── __init__.py │ │ ├── sol1.py │ │ ├── sol2.py │ │ └── triangle.txt │ ├── problem_068/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_069/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_070/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_071/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_072/ │ │ ├── __init__.py │ │ ├── sol1.py │ │ └── sol2.py │ ├── problem_073/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_074/ │ │ ├── __init__.py │ │ ├── sol1.py │ │ └── sol2.py │ ├── problem_075/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_076/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_077/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_078/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_079/ │ │ ├── __init__.py │ │ ├── keylog.txt │ │ ├── keylog_test.txt │ │ └── sol1.py │ ├── problem_080/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_081/ │ │ ├── __init__.py │ │ ├── matrix.txt │ │ └── sol1.py │ ├── problem_082/ │ │ ├── __init__.py │ │ ├── input.txt │ │ ├── sol1.py │ │ └── test_matrix.txt │ ├── problem_085/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_086/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_087/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_089/ │ │ ├── __init__.py │ │ ├── numeralcleanup_test.txt │ │ ├── p089_roman.txt │ │ └── sol1.py │ ├── problem_091/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_092/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_094/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_095/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_097/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_099/ │ │ ├── __init__.py │ │ ├── base_exp.txt │ │ └── sol1.py │ ├── problem_100/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_101/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_102/ │ │ ├── __init__.py │ │ ├── p102_triangles.txt │ │ ├── sol1.py │ │ └── test_triangles.txt │ ├── problem_104/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_107/ │ │ ├── __init__.py │ │ ├── p107_network.txt │ │ ├── sol1.py │ │ └── test_network.txt │ ├── problem_109/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_112/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_113/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_114/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_115/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_116/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_117/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_119/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_120/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_121/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_122/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_123/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_125/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_129/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_131/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_135/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_136/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_144/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_145/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_164/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_173/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_174/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_180/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_187/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_188/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_190/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_191/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_203/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_205/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_206/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_207/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_234/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_301/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_345/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_493/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_551/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_587/ │ │ ├── __init__.py │ │ └── sol1.py │ ├── problem_686/ │ │ ├── __init__.py │ │ └── sol1.py │ └── problem_800/ │ ├── __init__.py │ └── sol1.py ├── pyproject.toml ├── quantum/ │ ├── README.md │ ├── __init__.py │ ├── bb84.py.DISABLED.txt │ ├── deutsch_jozsa.py.DISABLED.txt │ ├── half_adder.py.DISABLED.txt │ ├── not_gate.py.DISABLED.txt │ ├── q_fourier_transform.py │ ├── q_full_adder.py.DISABLED.txt │ ├── quantum_entanglement.py.DISABLED.txt │ ├── quantum_random.py.DISABLED.txt │ ├── quantum_teleportation.py.DISABLED.txt │ ├── ripple_adder_classic.py.DISABLED.txt │ ├── single_qubit_measure.py.DISABLED.txt │ └── superdense_coding.py.DISABLED.txt ├── scheduling/ │ ├── __init__.py │ ├── first_come_first_served.py │ ├── highest_response_ratio_next.py │ ├── job_sequence_with_deadline.py │ ├── job_sequencing_with_deadline.py │ ├── multi_level_feedback_queue.py │ ├── non_preemptive_shortest_job_first.py │ ├── round_robin.py │ └── shortest_job_first.py ├── scripts/ │ ├── README.md │ ├── __init__.py │ ├── build_directory_md.py │ ├── close_pull_requests_with_awaiting_changes.sh │ ├── close_pull_requests_with_failing_tests.sh │ ├── close_pull_requests_with_require_descriptive_names.sh │ ├── close_pull_requests_with_require_tests.sh │ ├── close_pull_requests_with_require_type_hints.sh │ ├── find_git_conflicts.sh │ ├── project_euler_answers.json │ ├── validate_filenames.py │ └── validate_solutions.py ├── searches/ │ ├── __init__.py │ ├── binary_search.py │ ├── binary_tree_traversal.py │ ├── double_linear_search.py │ ├── double_linear_search_recursion.py │ ├── exponential_search.py │ ├── fibonacci_search.py │ ├── hill_climbing.py │ ├── interpolation_search.py │ ├── jump_search.py │ ├── linear_search.py │ ├── median_of_medians.py │ ├── quick_select.py │ ├── sentinel_linear_search.py │ ├── simple_binary_search.py │ ├── simulated_annealing.py │ ├── tabu_search.py │ ├── tabu_test_data.txt │ └── ternary_search.py ├── sorts/ │ ├── README.md │ ├── __init__.py │ ├── bead_sort.py │ ├── binary_insertion_sort.py │ ├── bitonic_sort.py │ ├── bogo_sort.py │ ├── bubble_sort.py │ ├── bucket_sort.py │ ├── circle_sort.py │ ├── cocktail_shaker_sort.py │ ├── comb_sort.py │ ├── counting_sort.py │ ├── cycle_sort.py │ ├── cyclic_sort.py │ ├── double_sort.py │ ├── dutch_national_flag_sort.py │ ├── exchange_sort.py │ ├── external_sort.py │ ├── gnome_sort.py │ ├── heap_sort.py │ ├── insertion_sort.py │ ├── intro_sort.py │ ├── iterative_merge_sort.py │ ├── merge_insertion_sort.py │ ├── merge_sort.py │ ├── msd_radix_sort.py │ ├── natural_sort.py │ ├── normal_distribution_quick_sort.md │ ├── odd_even_sort.py │ ├── odd_even_transposition_parallel.py │ ├── odd_even_transposition_single_threaded.py │ ├── pancake_sort.py │ ├── patience_sort.py │ ├── pigeon_sort.py │ ├── pigeonhole_sort.py │ ├── quick_sort.py │ ├── quick_sort_3_partition.py │ ├── radix_sort.py │ ├── recursive_insertion_sort.py │ ├── recursive_mergesort_array.py │ ├── recursive_quick_sort.py │ ├── selection_sort.py │ ├── shell_sort.py │ ├── shrink_shell_sort.py │ ├── slowsort.py │ ├── stalin_sort.py │ ├── stooge_sort.py │ ├── strand_sort.py │ ├── tim_sort.py │ ├── topological_sort.py │ ├── tree_sort.py │ ├── unknown_sort.py │ └── wiggle_sort.py ├── strings/ │ ├── __init__.py │ ├── aho_corasick.py │ ├── alternative_string_arrange.py │ ├── anagrams.py │ ├── anagrams.txt │ ├── autocomplete_using_trie.py │ ├── barcode_validator.py │ ├── bitap_string_match.py │ ├── boyer_moore_search.py │ ├── camel_case_to_snake_case.py │ ├── can_string_be_rearranged_as_palindrome.py │ ├── capitalize.py │ ├── check_anagrams.py │ ├── count_vowels.py │ ├── credit_card_validator.py │ ├── damerau_levenshtein_distance.py │ ├── detecting_english_programmatically.py │ ├── dictionary.txt │ ├── dna.py │ ├── edit_distance.py │ ├── frequency_finder.py │ ├── hamming_distance.py │ ├── indian_phone_validator.py │ ├── is_contains_unique_chars.py │ ├── is_isogram.py │ ├── is_pangram.py │ ├── is_polish_national_id.py │ ├── is_spain_national_id.py │ ├── is_srilankan_phone_number.py │ ├── is_valid_email_address.py │ ├── jaro_winkler.py │ ├── join.py │ ├── knuth_morris_pratt.py │ ├── levenshtein_distance.py │ ├── lower.py │ ├── manacher.py │ ├── min_cost_string_conversion.py │ ├── naive_string_search.py │ ├── ngram.py │ ├── palindrome.py │ ├── pig_latin.py │ ├── prefix_function.py │ ├── rabin_karp.py │ ├── remove_duplicate.py │ ├── reverse_letters.py │ ├── reverse_words.py │ ├── snake_case_to_camel_pascal_case.py │ ├── split.py │ ├── string_switch_case.py │ ├── strip.py │ ├── text_justification.py │ ├── title.py │ ├── top_k_frequent_words.py │ ├── upper.py │ ├── wave_string.py │ ├── wildcard_pattern_matching.py │ ├── word_occurrence.py │ ├── word_patterns.py │ ├── words.txt │ └── z_function.py └── web_programming/ ├── __init__.py ├── co2_emission.py ├── covid_stats_via_xpath.py ├── crawl_google_results.py ├── crawl_google_scholar_citation.py ├── currency_converter.py ├── current_stock_price.py ├── current_weather.py ├── daily_horoscope.py ├── download_images_from_google_query.py ├── emails_from_url.py ├── fetch_anime_and_play.py ├── fetch_bbc_news.py ├── fetch_github_info.py ├── fetch_jobs.py ├── fetch_quotes.py ├── fetch_well_rx_price.py ├── get_amazon_product_data.py ├── get_imdb_top_250_movies_csv.py ├── get_imdbtop.py.DISABLED ├── get_ip_geolocation.py ├── get_top_billionaires.py ├── get_top_hn_posts.py ├── get_user_tweets.py.DISABLED ├── giphy.py ├── instagram_crawler.py ├── instagram_pic.py ├── instagram_video.py ├── nasa_data.py ├── open_google_results.py ├── random_anime_character.py ├── recaptcha_verification.py ├── reddit.py ├── search_books_by_isbn.py ├── slack_message.py ├── test_fetch_github_info.py └── world_covid19_stats.py ================================================ FILE CONTENTS ================================================ ================================================ FILE: .devcontainer/Dockerfile ================================================ # https://github.com/microsoft/vscode-dev-containers/blob/main/containers/python-3/README.md ARG VARIANT=3.13-bookworm FROM mcr.microsoft.com/vscode/devcontainers/python:${VARIANT} COPY requirements.txt /tmp/pip-tmp/ RUN python3 -m pip install --upgrade pip \ && python3 -m pip install --no-cache-dir -r /tmp/pip-tmp/requirements.txt \ && pipx install pre-commit ruff ================================================ FILE: .devcontainer/README.md ================================================ # Development Container This is **Devcontainer** configuration to provide a consistent development environment for all contributors. ## Features - [x] Pre-configured **Python environment** - [x] Automatic installation of **pre-commit hooks** - [x] **Ruff** linter ready to check your code - [x] **Oh My Zsh** with plugins: - `zsh-autosuggestions` - `zsh-syntax-highlighting` ## Usage 1. Install [**Docker** ](https://www.docker.com/get-started/) and [**Visual Studio Code**](https://code.visualstudio.com/) 2. Install the **Remote - Containers** extension in VS Code - Do `CTRL+P`, paste this command and press `Enter` ```shell ext install ms-vscode-remote.remote-containers ``` 3. Open this repository in VS Code 4. When prompted, click **"Reopen in Container"** 5. Wait for the environment to build and initialize After setup: - `pre-commit` hooks are installed - `ruff` and other tools are available - The shell uses Zsh by default ## Tips To manually run checks on all files: ```bash pre-commit run --all-files ``` > For further information here's [Microsoft tutorial about devcontainers.](https://code.visualstudio.com/docs/devcontainers/tutorial) ================================================ FILE: .devcontainer/devcontainer.json ================================================ { "name": "Python 3", "build": { "dockerfile": "Dockerfile", "context": "..", "args": { // Update 'VARIANT' to pick a Python version: 3, 3.11, 3.10, 3.9, 3.8 // Append -bullseye or -buster to pin to an OS version. // Use -bullseye variants on local on arm64/Apple Silicon. "VARIANT": "3.13-bookworm" } }, "postCreateCommand": "zsh .devcontainer/post_install", // Configure tool-specific properties. "customizations": { // Configure properties specific to VS Code. "vscode": { // Set *default* container specific settings.json values on container create. "settings": { "python.defaultInterpreterPath": "/usr/local/bin/python", "python.linting.enabled": true, "python.formatting.blackPath": "/usr/local/py-utils/bin/black", "python.linting.mypyPath": "/usr/local/py-utils/bin/mypy", "terminal.integrated.defaultProfile.linux": "zsh" }, // Add the IDs of extensions you want installed when the container is created. "extensions": [ "ms-python.python", "ms-python.vscode-pylance" ] } }, // Use 'forwardPorts' to make a list of ports inside the container available locally. // "forwardPorts": [], // Use 'postCreateCommand' to run commands after the container is created. // "postCreateCommand": "pip3 install --user -r requirements.txt", // Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. "remoteUser": "vscode" } ================================================ FILE: .devcontainer/post_install ================================================ #!/usr/bin/env bash echo "Begin post-installation steps..." set -e echo "Installing pre-commit hooks..." pre-commit install echo "Installing Oh My Zsh plugins..." # Install zsh-autosuggestions if not present if [ ! -d "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-autosuggestions" ]; then echo "Cloning zsh-autosuggestions..." git clone https://github.com/zsh-users/zsh-autosuggestions \ "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-autosuggestions" fi # Install zsh-syntax-highlighting if not present if [ ! -d "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting" ]; then echo "Cloning zsh-syntax-highlighting..." git clone https://github.com/zsh-users/zsh-syntax-highlighting.git \ "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting" fi echo "Configuring plugins in ~/.zshrc..." sed -i '/^plugins=/c\plugins=(git zsh-autosuggestions zsh-syntax-highlighting)' ~/.zshrc echo "Post-installation steps completed successfully. Enjoy!" ================================================ FILE: .gitattributes ================================================ * text=auto ================================================ FILE: .github/CODEOWNERS ================================================ # This is a comment. # Each line is a file pattern followed by one or more owners. # More details are here: https://help.github.com/articles/about-codeowners/ # The '*' pattern is global owners. # Order is important. The last matching pattern has the most precedence. /.* @cclauss # /backtracking/ # /bit_manipulation/ # /blockchain/ # /boolean_algebra/ # /cellular_automata/ # /ciphers/ # /compression/ # /computer_vision/ # /conversions/ # /data_structures/ # /digital_image_processing/ # /divide_and_conquer/ # /dynamic_programming/ # /file_transfer/ # /fuzzy_logic/ # /genetic_algorithm/ # /geodesy/ # /graphics/ # /graphs/ # /greedy_method/ # /hashes/ # /images/ # /linear_algebra/ # /machine_learning/ # /maths/ # /matrix/ # /networking_flow/ # /neural_network/ # /other/ # /project_euler/ # /quantum/ # /scheduling/ # /scripts/ # /searches/ # /sorts/ # /strings/ # /traversals/ /web_programming/ @cclauss ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.yml ================================================ name: Bug report description: Create a bug report to help us address errors in the repository labels: [bug] body: - type: markdown attributes: value: > Before requesting please search [existing issues](https://github.com/TheAlgorithms/Python/labels/bug). Usage questions such as "How do I...?" belong on the [Discord](https://discord.gg/c7MnfGFGa6) and will be closed. - type: input attributes: label: "Repository commit" description: > The commit hash for `TheAlgorithms/Python` repository. You can get this by running the command `git rev-parse HEAD` locally. placeholder: "a0b0f414ae134aa1772d33bb930e5a960f9979e8" validations: required: true - type: input attributes: label: "Python version (python --version)" placeholder: "Python 3.10.7" validations: required: true - type: textarea attributes: label: "Dependencies version (pip freeze)" description: > This is the output of the command `pip freeze --all`. Note that the actual output might be different as compared to the placeholder text. placeholder: | appnope==0.1.3 asttokens==2.0.8 backcall==0.2.0 ... validations: required: true - type: textarea attributes: label: "Expected behavior" description: "Describe the behavior you expect. May include images or videos." validations: required: true - type: textarea attributes: label: "Actual behavior" validations: required: true ================================================ FILE: .github/ISSUE_TEMPLATE/config.yml ================================================ blank_issues_enabled: false contact_links: - name: Discord community url: https://discord.gg/c7MnfGFGa6 about: Have any questions or need any help? Please contact us via Discord ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.yml ================================================ name: Feature request description: Suggest features, propose improvements, discuss new ideas. labels: [enhancement] body: - type: markdown attributes: value: > Before requesting please search [existing issues](https://github.com/TheAlgorithms/Python/labels/enhancement). Do not create issues to implement new algorithms as these will be closed. Usage questions such as "How do I...?" belong on the [Discord](https://discord.gg/c7MnfGFGa6) and will be closed. - type: textarea attributes: label: "Feature description" description: > This could include new topics or improving any existing implementations. validations: required: true ================================================ FILE: .github/ISSUE_TEMPLATE/other.yml ================================================ name: Other description: Use this for any other issues. PLEASE do not create blank issues labels: ["awaiting triage"] body: - type: textarea id: issuedescription attributes: label: What would you like to share? description: Provide a clear and concise explanation of your issue. validations: required: true - type: textarea id: extrainfo attributes: label: Additional information description: Is there anything else we should know about this issue? validations: required: false ================================================ FILE: .github/dependabot.yml ================================================ # Keep GitHub Actions up to date with Dependabot... # https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot version: 2 updates: - package-ecosystem: "github-actions" directory: "/" schedule: interval: "daily" ================================================ FILE: .github/pull_request_template.md ================================================ ### Describe your change: * [ ] Add an algorithm? * [ ] Fix a bug or typo in an existing algorithm? * [ ] Add or change doctests? -- Note: Please avoid changing both code and tests in a single pull request. * [ ] Documentation change? ### Checklist: * [ ] I have read [CONTRIBUTING.md](https://github.com/TheAlgorithms/Python/blob/master/CONTRIBUTING.md). * [ ] This pull request is all my own work -- I have not plagiarized. * [ ] I know that pull requests will not be merged if they fail the automated tests. * [ ] This PR only changes one algorithm file. To ease review, please open separate PRs for separate algorithms. * [ ] All new Python files are placed inside an existing directory. * [ ] All filenames are in all lowercase characters with no spaces or dashes. * [ ] All functions and variable names follow Python naming conventions. * [ ] All function parameters and return values are annotated with Python [type hints](https://docs.python.org/3/library/typing.html). * [ ] All functions have [doctests](https://docs.python.org/3/library/doctest.html) that pass the automated testing. * [ ] All new algorithms include at least one URL that points to Wikipedia or another similar explanation. * [ ] If this pull request resolves one or more open issues then the description above includes the issue number(s) with a [closing keyword](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue): "Fixes #ISSUE-NUMBER". ================================================ FILE: .github/stale.yml ================================================ # Configuration for probot-stale - https://github.com/probot/stale # Number of days of inactivity before an Issue or Pull Request becomes stale daysUntilStale: 30 # Number of days of inactivity before an Issue or Pull Request with the stale label is closed. # Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. daysUntilClose: 7 # Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled) onlyLabels: [] # Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable exemptLabels: - "Status: on hold" # Set to true to ignore issues in a project (defaults to false) exemptProjects: false # Set to true to ignore issues in a milestone (defaults to false) exemptMilestones: false # Set to true to ignore issues with an assignee (defaults to false) exemptAssignees: false # Label to use when marking as stale staleLabel: stale # Limit the number of actions per hour, from 1-30. Default is 30 limitPerRun: 5 # Comment to post when removing the stale label. # unmarkComment: > # Your comment here. # Optionally, specify configuration settings that are specific to just 'issues' or 'pulls': pulls: # Comment to post when marking as stale. Set to `false` to disable markComment: > This pull request has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions. # Comment to post when closing a stale Pull Request. closeComment: > Please reopen this pull request once you commit the changes requested or make improvements on the code. If this is not the case and you need some help, feel free to seek help from our [Gitter](https://gitter.im/TheAlgorithms/community) or ping one of the reviewers. Thank you for your contributions! issues: # Comment to post when marking as stale. Set to `false` to disable markComment: > This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions. # Comment to post when closing a stale Issue. closeComment: > Please reopen this issue once you add more information and updates here. If this is not the case and you need some help, feel free to seek help from our [Gitter](https://gitter.im/TheAlgorithms/community) or ping one of the reviewers. Thank you for your contributions! ================================================ FILE: .github/workflows/build.yml ================================================ name: "build" on: pull_request: schedule: - cron: "0 0 * * *" # Run everyday jobs: build: runs-on: ubuntu-latest steps: - run: sudo apt-get update && sudo apt-get install -y libhdf5-dev - uses: actions/checkout@v6 - uses: astral-sh/setup-uv@v7 with: enable-cache: true cache-dependency-glob: uv.lock - uses: actions/setup-python@v6 with: python-version: 3.14 allow-prereleases: true - run: uv sync --group=test - name: Run tests # TODO: #8818 Re-enable quantum tests run: uv run --with=pytest-run-parallel pytest --iterations=8 --parallel-threads=auto --ignore=computer_vision/cnn_classification.py --ignore=docs/conf.py --ignore=dynamic_programming/k_means_clustering_tensorflow.py --ignore=machine_learning/local_weighted_learning/local_weighted_learning.py --ignore=machine_learning/lstm/lstm_prediction.py --ignore=neural_network/input_data.py --ignore=project_euler/ --ignore=quantum/q_fourier_transform.py --ignore=scripts/validate_solutions.py --ignore=web_programming/current_stock_price.py --ignore=web_programming/fetch_anime_and_play.py --cov-report=term-missing:skip-covered --cov=. . - if: ${{ success() }} run: scripts/build_directory_md.py 2>&1 | tee DIRECTORY.md ================================================ FILE: .github/workflows/devcontainer_ci.yml ================================================ name: Test DevContainer Build on: push: paths: - ".devcontainer/**" pull_request: paths: - ".devcontainer/**" jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: devcontainers/ci@v0.3 with: push: never runCmd: "true" ================================================ FILE: .github/workflows/directory_writer.yml ================================================ # The objective of this GitHub Action is to update the DIRECTORY.md file (if needed) # when doing a git push name: directory_writer on: [push] jobs: directory_writer: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - uses: actions/setup-python@v6 with: python-version: 3.14 allow-prereleases: true - name: Write DIRECTORY.md run: | scripts/build_directory_md.py 2>&1 | tee DIRECTORY.md git config --global user.name "$GITHUB_ACTOR" git config --global user.email "$GITHUB_ACTOR@users.noreply.github.com" git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/$GITHUB_REPOSITORY - name: Update DIRECTORY.md run: | git add DIRECTORY.md git commit -am "updating DIRECTORY.md" || true git push --force origin HEAD:$GITHUB_REF || true ================================================ FILE: .github/workflows/project_euler.yml ================================================ on: pull_request: # Run only if a file is changed within the project_euler directory and related files paths: - "project_euler/**" - ".github/workflows/project_euler.yml" - "scripts/validate_solutions.py" schedule: - cron: "0 0 * * *" # Run everyday name: "Project Euler" jobs: project-euler: runs-on: ubuntu-latest steps: - run: sudo apt-get update && sudo apt-get install -y libtiff5-dev libjpeg8-dev libopenjp2-7-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python3-tk libharfbuzz-dev libfribidi-dev libxcb1-dev libxml2-dev libxslt-dev libhdf5-dev libopenblas-dev - uses: actions/checkout@v6 - uses: astral-sh/setup-uv@v7 - uses: actions/setup-python@v6 with: python-version: 3.14 allow-prereleases: true - run: uv sync --group=euler-validate --group=test - run: uv run pytest --doctest-modules --cov-report=term-missing:skip-covered --cov=project_euler/ project_euler/ validate-solutions: runs-on: ubuntu-latest steps: - run: sudo apt-get update && sudo apt-get install -y libtiff5-dev libjpeg8-dev libopenjp2-7-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python3-tk libharfbuzz-dev libfribidi-dev libxcb1-dev libxml2-dev libxslt-dev libhdf5-dev libopenblas-dev - uses: actions/checkout@v6 - uses: astral-sh/setup-uv@v7 - uses: actions/setup-python@v6 with: python-version: 3.14 allow-prereleases: true - run: uv sync --group=euler-validate --group=test - run: uv run pytest scripts/validate_solutions.py env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} ================================================ FILE: .github/workflows/ruff.yml ================================================ # https://beta.ruff.rs name: ruff on: push: branches: - master pull_request: branches: - master jobs: ruff: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: astral-sh/setup-uv@v7 - run: uvx ruff check --output-format=github . ================================================ FILE: .github/workflows/sphinx.yml ================================================ name: sphinx on: # Triggers the workflow on push or pull request events but only for the "master" branch push: branches: ["master"] pull_request: branches: ["master"] # Or manually from the Actions tab workflow_dispatch: # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages permissions: contents: read pages: write id-token: write # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. concurrency: group: "pages" cancel-in-progress: false jobs: build_docs: runs-on: ubuntu-24.04-arm steps: - run: sudo apt-get update && sudo apt-get install -y libtiff5-dev libjpeg8-dev libopenjp2-7-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python3-tk libharfbuzz-dev libfribidi-dev libxcb1-dev libxml2-dev libxslt-dev libhdf5-dev libopenblas-dev - uses: actions/checkout@v6 - uses: astral-sh/setup-uv@v7 - uses: actions/setup-python@v6 with: python-version: 3.14 allow-prereleases: true - run: uv sync --group=docs - uses: actions/configure-pages@v5 - run: uv run sphinx-build -c docs . docs/_build/html - uses: actions/upload-pages-artifact@v4 with: path: docs/_build/html deploy_docs: environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} if: github.event_name != 'pull_request' needs: build_docs runs-on: ubuntu-latest steps: - uses: actions/deploy-pages@v4 id: deployment ================================================ FILE: .gitignore ================================================ # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a Python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover .hypothesis/ .pytest_cache/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # pyenv .python-version # celery beat schedule file celerybeat-schedule # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ .DS_Store .idea .try .vscode/ .vs/ ================================================ FILE: .gitpod.yml ================================================ tasks: - init: pip3 install -r ./requirements.txt ================================================ FILE: .pre-commit-config.yaml ================================================ ci: autoupdate_schedule: monthly repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v6.0.0 hooks: - id: check-executables-have-shebangs - id: check-toml - id: check-yaml - id: end-of-file-fixer types: [python] - id: trailing-whitespace - id: requirements-txt-fixer - repo: https://github.com/MarcoGorelli/auto-walrus rev: 0.4.1 hooks: - id: auto-walrus - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.14.14 hooks: - id: ruff-check - id: ruff-format - repo: https://github.com/codespell-project/codespell rev: v2.4.1 hooks: - id: codespell additional_dependencies: - tomli - repo: https://github.com/tox-dev/pyproject-fmt rev: v2.12.1 hooks: - id: pyproject-fmt - repo: local hooks: - id: validate-filenames name: Validate filenames entry: ./scripts/validate_filenames.py language: script pass_filenames: false - repo: https://github.com/abravalheri/validate-pyproject rev: v0.24.1 hooks: - id: validate-pyproject - repo: https://github.com/pre-commit/mirrors-mypy rev: v1.19.1 hooks: - id: mypy args: - --explicit-package-bases - --ignore-missing-imports - --install-types - --non-interactive - repo: https://github.com/pre-commit/mirrors-prettier rev: v4.0.0-alpha.8 hooks: - id: prettier types_or: [toml, yaml] ================================================ FILE: CONTRIBUTING.md ================================================ # Contributing guidelines ## Before contributing Welcome to [TheAlgorithms/Python](https://github.com/TheAlgorithms/Python)! Before submitting your pull requests, please ensure that you __read the whole guidelines__. If you have any doubts about the contributing guide, please feel free to [state it clearly in an issue](https://github.com/TheAlgorithms/Python/issues/new) or ask the community on [Gitter](https://gitter.im/TheAlgorithms/community). ## Contributing ### Contributor We are delighted that you are considering implementing algorithms and data structures for others! This repository is referenced and used by learners from all over the globe. By being one of our contributors, you agree and confirm that: - You did your work - no plagiarism allowed. - Any plagiarized work will not be merged. - Your work will be distributed under [MIT License](LICENSE.md) once your pull request is merged. - Your submitted work fulfills or mostly fulfills our styles and standards. __New implementation__ is welcome! For example, new solutions for a problem, different representations for a graph data structure or algorithm designs with different complexity, but __identical implementation__ of an existing implementation is not allowed. Please check whether the solution is already implemented or not before submitting your pull request. __Improving comments__ and __writing proper tests__ are also highly welcome. ### Contribution We appreciate any contribution, from fixing a grammar mistake in a comment to implementing complex algorithms. Please read this section if you are contributing your work. Your contribution will be tested by our [automated testing on GitHub Actions](https://github.com/TheAlgorithms/Python/actions) to save time and mental energy. After you have submitted your pull request, you should see the GitHub Actions tests start to run at the bottom of your submission page. If those tests fail, then click on the ___details___ button to read through the GitHub Actions output to understand the failure. If you do not understand, please leave a comment on your submission page and a community member will try to help. #### Issues If you are interested in resolving an [open issue](https://github.com/TheAlgorithms/Python/issues), simply make a pull request with your proposed fix. __We do not assign issues in this repo__ so please do not ask for permission to work on an issue. __Do not__ create an issue to contribute an algorithm. Please submit a pull request instead. Please help us keep our issue list small by adding `Fixes #{$ISSUE_NUMBER}` to the description of pull requests that resolve open issues. For example, if your pull request fixes issue #10, then please add the following to its description: ``` Fixes #10 ``` GitHub will use this tag to [auto-close the issue](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue) if and when the PR is merged. #### What is an Algorithm? An Algorithm is one or more functions (or classes) that: * take one or more inputs, * perform some internal calculations or data manipulations, * return one or more outputs, * have minimal side effects (Ex. `print()`, `plot()`, `read()`, `write()`). Algorithms should be packaged in a way that would make it easy for readers to put them into larger programs. Algorithms should: * have intuitive class and function names that make their purpose clear to readers * use Python naming conventions and intuitive variable names to ease comprehension * be flexible to take different input values * have Python type hints for their input parameters and return values * raise Python exceptions (`ValueError`, etc.) on erroneous input values * have docstrings with clear explanations and/or URLs to source materials * contain doctests that test both valid and erroneous input values * return all calculation results instead of printing or plotting them Algorithms in this repo should not be how-to examples for existing Python packages. Instead, they should perform internal calculations or manipulations to convert input values into different output values. Those calculations or manipulations can use data types, classes, or functions of existing Python packages but each algorithm in this repo should add unique value. #### Pre-commit plugin Use [pre-commit](https://pre-commit.com/#installation) to automatically format your code to match our coding style: ```bash python3 -m pip install pre-commit # only required the first time pre-commit install ``` That's it! The plugin will run every time you commit any changes. If there are any errors found during the run, fix them and commit those changes. You can even run the plugin manually on all files: ```bash pre-commit run --all-files --show-diff-on-failure ``` #### Coding Style We want your work to be readable by others; therefore, we encourage you to note the following: - Please write in Python 3.13+. For instance: `print()` is a function in Python 3 so `print "Hello"` will *not* work but `print("Hello")` will. - Please focus hard on the naming of functions, classes, and variables. Help your reader by using __descriptive names__ that can help you to remove redundant comments. - Single letter variable names are *old school* so please avoid them unless their life only spans a few lines. - Expand acronyms because `gcd()` is hard to understand but `greatest_common_divisor()` is not. - Please follow the [Python Naming Conventions](https://pep8.org/#prescriptive-naming-conventions) so variable_names and function_names should be lower_case, CONSTANTS in UPPERCASE, ClassNames should be CamelCase, etc. - We encourage the use of Python [f-strings](https://realpython.com/python-f-strings/#f-strings-a-new-and-improved-way-to-format-strings-in-python) where they make the code easier to read. - Please consider running [__psf/black__](https://github.com/python/black) on your Python file(s) before submitting your pull request. This is not yet a requirement but it does make your code more readable and automatically aligns it with much of [PEP 8](https://www.python.org/dev/peps/pep-0008/). There are other code formatters (autopep8, yapf) but the __black__ formatter is now hosted by the Python Software Foundation. To use it, ```bash python3 -m pip install black # only required the first time black . ``` - All submissions will need to pass the test `ruff .` before they will be accepted so if possible, try this test locally on your Python file(s) before submitting your pull request. ```bash python3 -m pip install ruff # only required the first time ruff check ``` - Original code submissions require docstrings or comments to describe your work. - More on docstrings and comments: If you used a Wikipedia article or some other source material to create your algorithm, please add the URL in a docstring or comment to help your reader. The following are considered to be bad and may be requested to be improved: ```python x = x + 2 # increased by 2 ``` This is too trivial. Comments are expected to be explanatory. For comments, you can write them above, on or below a line of code, as long as you are consistent within the same piece of code. We encourage you to put docstrings inside your functions but please pay attention to the indentation of docstrings. The following is a good example: ```python def sum_ab(a, b): """ Return the sum of two integers a and b. """ return a + b ``` - Write tests (especially [__doctests__](https://docs.python.org/3/library/doctest.html)) to illustrate and verify your work. We highly encourage the use of _doctests on all functions_. ```python def sum_ab(a, b): """ Return the sum of two integers a and b >>> sum_ab(2, 2) 4 >>> sum_ab(-2, 3) 1 >>> sum_ab(4.9, 5.1) 10.0 """ return a + b ``` These doctests will be run by pytest as part of our automated testing so please try to run your doctests locally and make sure that they are found and pass: ```bash python3 -m doctest -v my_submission.py ``` The use of the Python built-in `input()` function is __not__ encouraged: ```python input('Enter your input:') # Or even worse... input = eval(input("Enter your input: ")) ``` However, if your code uses `input()` then we encourage you to gracefully deal with leading and trailing whitespace in user input by adding `.strip()` as in: ```python starting_value = int(input("Please enter a starting value: ").strip()) ``` The use of [Python type hints](https://docs.python.org/3/library/typing.html) is encouraged for function parameters and return values. Our automated testing will run [mypy](https://mypy-lang.org) so run that locally before making your submission. ```python def sum_ab(a: int, b: int) -> int: return a + b ``` Instructions on how to install mypy can be found [here](https://github.com/python/mypy). Please use the command `mypy --ignore-missing-imports .` to test all files or `mypy --ignore-missing-imports path/to/file.py` to test a specific file. - [__List comprehensions and generators__](https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions) are preferred over the use of `lambda`, `map`, `filter`, `reduce` but the important thing is to demonstrate the power of Python in code that is easy to read and maintain. - Avoid importing external libraries for basic algorithms. Only use those libraries for complicated algorithms. - If you need a third-party module that is not in the file __requirements.txt__, please add it to that file as part of your submission. #### Other Requirements for Submissions - If you are submitting code in the `project_euler/` directory, please also read [the dedicated Guideline](https://github.com/TheAlgorithms/Python/blob/master/project_euler/README.md) before contributing to our Project Euler library. - The file extension for code files should be `.py`. Jupyter Notebooks should be submitted to [TheAlgorithms/Jupyter](https://github.com/TheAlgorithms/Jupyter). - Strictly use snake_case (underscore_separated) in your file_name, as it will be easy to parse in future using scripts. - Please avoid creating new directories if at all possible. Try to fit your work into the existing directory structure. - If possible, follow the standard *within* the folder you are submitting to. - If you have modified/added code work, make sure the code compiles before submitting. - If you have modified/added documentation work, ensure your language is concise and contains no grammar errors. - Do not update the README.md or DIRECTORY.md file which will be periodically autogenerated by our GitHub Actions processes. - Add a corresponding explanation to [Algorithms-Explanation](https://github.com/TheAlgorithms/Algorithms-Explanation) (Optional but recommended). - All submissions will be tested with [__mypy__](http://www.mypy-lang.org) so we encourage you to add [__Python type hints__](https://docs.python.org/3/library/typing.html) where it makes sense to do so. - Most importantly, - __Be consistent in the use of these guidelines when submitting.__ - __Join__ us on [Discord](https://discord.com/invite/c7MnfGFGa6) and [Gitter](https://gitter.im/TheAlgorithms/community) __now!__ - Happy coding! Writer [@poyea](https://github.com/poyea), Jun 2019. ================================================ FILE: DIRECTORY.md ================================================ ## Audio Filters * [Butterworth Filter](audio_filters/butterworth_filter.py) * [Iir Filter](audio_filters/iir_filter.py) * [Show Response](audio_filters/show_response.py) ## Backtracking * [All Combinations](backtracking/all_combinations.py) * [All Permutations](backtracking/all_permutations.py) * [All Subsequences](backtracking/all_subsequences.py) * [Coloring](backtracking/coloring.py) * [Combination Sum](backtracking/combination_sum.py) * [Crossword Puzzle Solver](backtracking/crossword_puzzle_solver.py) * [Generate Parentheses](backtracking/generate_parentheses.py) * [Generate Parentheses Iterative](backtracking/generate_parentheses_iterative.py) * [Hamiltonian Cycle](backtracking/hamiltonian_cycle.py) * [Knight Tour](backtracking/knight_tour.py) * [Match Word Pattern](backtracking/match_word_pattern.py) * [Minimax](backtracking/minimax.py) * [N Queens](backtracking/n_queens.py) * [N Queens Math](backtracking/n_queens_math.py) * [Power Sum](backtracking/power_sum.py) * [Rat In Maze](backtracking/rat_in_maze.py) * [Sudoku](backtracking/sudoku.py) * [Sum Of Subsets](backtracking/sum_of_subsets.py) * [Word Break](backtracking/word_break.py) * [Word Ladder](backtracking/word_ladder.py) * [Word Search](backtracking/word_search.py) ## Bit Manipulation * [Binary And Operator](bit_manipulation/binary_and_operator.py) * [Binary Coded Decimal](bit_manipulation/binary_coded_decimal.py) * [Binary Count Setbits](bit_manipulation/binary_count_setbits.py) * [Binary Count Trailing Zeros](bit_manipulation/binary_count_trailing_zeros.py) * [Binary Or Operator](bit_manipulation/binary_or_operator.py) * [Binary Shifts](bit_manipulation/binary_shifts.py) * [Binary Twos Complement](bit_manipulation/binary_twos_complement.py) * [Binary Xor Operator](bit_manipulation/binary_xor_operator.py) * [Bitwise Addition Recursive](bit_manipulation/bitwise_addition_recursive.py) * [Count 1S Brian Kernighan Method](bit_manipulation/count_1s_brian_kernighan_method.py) * [Count Number Of One Bits](bit_manipulation/count_number_of_one_bits.py) * [Excess 3 Code](bit_manipulation/excess_3_code.py) * [Find Previous Power Of Two](bit_manipulation/find_previous_power_of_two.py) * [Find Unique Number](bit_manipulation/find_unique_number.py) * [Gray Code Sequence](bit_manipulation/gray_code_sequence.py) * [Highest Set Bit](bit_manipulation/highest_set_bit.py) * [Index Of Rightmost Set Bit](bit_manipulation/index_of_rightmost_set_bit.py) * [Is Even](bit_manipulation/is_even.py) * [Is Power Of Two](bit_manipulation/is_power_of_two.py) * [Largest Pow Of Two Le Num](bit_manipulation/largest_pow_of_two_le_num.py) * [Missing Number](bit_manipulation/missing_number.py) * [Numbers Different Signs](bit_manipulation/numbers_different_signs.py) * [Power Of 4](bit_manipulation/power_of_4.py) * [Reverse Bits](bit_manipulation/reverse_bits.py) * [Single Bit Manipulation Operations](bit_manipulation/single_bit_manipulation_operations.py) * [Swap All Odd And Even Bits](bit_manipulation/swap_all_odd_and_even_bits.py) ## Blockchain * [Diophantine Equation](blockchain/diophantine_equation.py) ## Boolean Algebra * [And Gate](boolean_algebra/and_gate.py) * [Imply Gate](boolean_algebra/imply_gate.py) * [Karnaugh Map Simplification](boolean_algebra/karnaugh_map_simplification.py) * [Multiplexer](boolean_algebra/multiplexer.py) * [Nand Gate](boolean_algebra/nand_gate.py) * [Nimply Gate](boolean_algebra/nimply_gate.py) * [Nor Gate](boolean_algebra/nor_gate.py) * [Not Gate](boolean_algebra/not_gate.py) * [Or Gate](boolean_algebra/or_gate.py) * [Quine Mc Cluskey](boolean_algebra/quine_mc_cluskey.py) * [Xnor Gate](boolean_algebra/xnor_gate.py) * [Xor Gate](boolean_algebra/xor_gate.py) ## Cellular Automata * [Conways Game Of Life](cellular_automata/conways_game_of_life.py) * [Game Of Life](cellular_automata/game_of_life.py) * [Langtons Ant](cellular_automata/langtons_ant.py) * [Nagel Schrekenberg](cellular_automata/nagel_schrekenberg.py) * [One Dimensional](cellular_automata/one_dimensional.py) * [Wa Tor](cellular_automata/wa_tor.py) ## Ciphers * [A1Z26](ciphers/a1z26.py) * [Affine Cipher](ciphers/affine_cipher.py) * [Atbash](ciphers/atbash.py) * [Autokey](ciphers/autokey.py) * [Baconian Cipher](ciphers/baconian_cipher.py) * [Base16](ciphers/base16.py) * [Base32](ciphers/base32.py) * [Base64 Cipher](ciphers/base64_cipher.py) * [Base85](ciphers/base85.py) * [Beaufort Cipher](ciphers/beaufort_cipher.py) * [Bifid](ciphers/bifid.py) * [Brute Force Caesar Cipher](ciphers/brute_force_caesar_cipher.py) * [Caesar Cipher](ciphers/caesar_cipher.py) * [Cryptomath Module](ciphers/cryptomath_module.py) * [Decrypt Caesar With Chi Squared](ciphers/decrypt_caesar_with_chi_squared.py) * [Deterministic Miller Rabin](ciphers/deterministic_miller_rabin.py) * [Diffie](ciphers/diffie.py) * [Diffie Hellman](ciphers/diffie_hellman.py) * [Elgamal Key Generator](ciphers/elgamal_key_generator.py) * [Enigma Machine2](ciphers/enigma_machine2.py) * [Fractionated Morse Cipher](ciphers/fractionated_morse_cipher.py) * [Gronsfeld Cipher](ciphers/gronsfeld_cipher.py) * [Hill Cipher](ciphers/hill_cipher.py) * [Mixed Keyword Cypher](ciphers/mixed_keyword_cypher.py) * [Mono Alphabetic Ciphers](ciphers/mono_alphabetic_ciphers.py) * [Morse Code](ciphers/morse_code.py) * [Onepad Cipher](ciphers/onepad_cipher.py) * [Permutation Cipher](ciphers/permutation_cipher.py) * [Playfair Cipher](ciphers/playfair_cipher.py) * [Polybius](ciphers/polybius.py) * [Porta Cipher](ciphers/porta_cipher.py) * [Rabin Miller](ciphers/rabin_miller.py) * [Rail Fence Cipher](ciphers/rail_fence_cipher.py) * [Rot13](ciphers/rot13.py) * [Rsa Cipher](ciphers/rsa_cipher.py) * [Rsa Factorization](ciphers/rsa_factorization.py) * [Rsa Key Generator](ciphers/rsa_key_generator.py) * [Running Key Cipher](ciphers/running_key_cipher.py) * [Shuffled Shift Cipher](ciphers/shuffled_shift_cipher.py) * [Simple Keyword Cypher](ciphers/simple_keyword_cypher.py) * [Simple Substitution Cipher](ciphers/simple_substitution_cipher.py) * [Transposition Cipher](ciphers/transposition_cipher.py) * [Transposition Cipher Encrypt Decrypt File](ciphers/transposition_cipher_encrypt_decrypt_file.py) * [Trifid Cipher](ciphers/trifid_cipher.py) * [Vernam Cipher](ciphers/vernam_cipher.py) * [Vigenere Cipher](ciphers/vigenere_cipher.py) * [Xor Cipher](ciphers/xor_cipher.py) ## Computer Vision * [Cnn Classification](computer_vision/cnn_classification.py) * [Flip Augmentation](computer_vision/flip_augmentation.py) * [Haralick Descriptors](computer_vision/haralick_descriptors.py) * [Harris Corner](computer_vision/harris_corner.py) * [Horn Schunck](computer_vision/horn_schunck.py) * [Intensity Based Segmentation](computer_vision/intensity_based_segmentation.py) * [Mean Threshold](computer_vision/mean_threshold.py) * [Mosaic Augmentation](computer_vision/mosaic_augmentation.py) * [Pooling Functions](computer_vision/pooling_functions.py) ## Conversions * [Astronomical Length Scale Conversion](conversions/astronomical_length_scale_conversion.py) * [Binary To Decimal](conversions/binary_to_decimal.py) * [Binary To Hexadecimal](conversions/binary_to_hexadecimal.py) * [Binary To Octal](conversions/binary_to_octal.py) * [Convert Number To Words](conversions/convert_number_to_words.py) * [Decimal To Any](conversions/decimal_to_any.py) * [Decimal To Binary](conversions/decimal_to_binary.py) * [Decimal To Hexadecimal](conversions/decimal_to_hexadecimal.py) * [Decimal To Octal](conversions/decimal_to_octal.py) * [Energy Conversions](conversions/energy_conversions.py) * [Excel Title To Column](conversions/excel_title_to_column.py) * [Hex To Bin](conversions/hex_to_bin.py) * [Hexadecimal To Decimal](conversions/hexadecimal_to_decimal.py) * [Ipv4 Conversion](conversions/ipv4_conversion.py) * [Length Conversion](conversions/length_conversion.py) * [Molecular Chemistry](conversions/molecular_chemistry.py) * [Octal To Binary](conversions/octal_to_binary.py) * [Octal To Decimal](conversions/octal_to_decimal.py) * [Octal To Hexadecimal](conversions/octal_to_hexadecimal.py) * [Prefix Conversions](conversions/prefix_conversions.py) * [Prefix Conversions String](conversions/prefix_conversions_string.py) * [Pressure Conversions](conversions/pressure_conversions.py) * [Rectangular To Polar](conversions/rectangular_to_polar.py) * [Rgb Cmyk Conversion](conversions/rgb_cmyk_conversion.py) * [Rgb Hsv Conversion](conversions/rgb_hsv_conversion.py) * [Roman Numerals](conversions/roman_numerals.py) * [Speed Conversions](conversions/speed_conversions.py) * [Temperature Conversions](conversions/temperature_conversions.py) * [Time Conversions](conversions/time_conversions.py) * [Volume Conversions](conversions/volume_conversions.py) * [Weight Conversion](conversions/weight_conversion.py) ## Data Compression * [Burrows Wheeler](data_compression/burrows_wheeler.py) * [Coordinate Compression](data_compression/coordinate_compression.py) * [Huffman](data_compression/huffman.py) * [Lempel Ziv](data_compression/lempel_ziv.py) * [Lempel Ziv Decompress](data_compression/lempel_ziv_decompress.py) * [Lz77](data_compression/lz77.py) * [Peak Signal To Noise Ratio](data_compression/peak_signal_to_noise_ratio.py) * [Run Length Encoding](data_compression/run_length_encoding.py) ## Data Structures * Arrays * [Equilibrium Index In Array](data_structures/arrays/equilibrium_index_in_array.py) * [Find Triplets With 0 Sum](data_structures/arrays/find_triplets_with_0_sum.py) * [Index 2D Array In 1D](data_structures/arrays/index_2d_array_in_1d.py) * [Kth Largest Element](data_structures/arrays/kth_largest_element.py) * [Median Two Array](data_structures/arrays/median_two_array.py) * [Monotonic Array](data_structures/arrays/monotonic_array.py) * [Pairs With Given Sum](data_structures/arrays/pairs_with_given_sum.py) * [Permutations](data_structures/arrays/permutations.py) * [Prefix Sum](data_structures/arrays/prefix_sum.py) * [Product Sum](data_structures/arrays/product_sum.py) * [Rotate Array](data_structures/arrays/rotate_array.py) * [Sparse Table](data_structures/arrays/sparse_table.py) * [Sudoku Solver](data_structures/arrays/sudoku_solver.py) * Binary Tree * [Avl Tree](data_structures/binary_tree/avl_tree.py) * [Basic Binary Tree](data_structures/binary_tree/basic_binary_tree.py) * [Binary Search Tree](data_structures/binary_tree/binary_search_tree.py) * [Binary Search Tree Recursive](data_structures/binary_tree/binary_search_tree_recursive.py) * [Binary Tree Mirror](data_structures/binary_tree/binary_tree_mirror.py) * [Binary Tree Node Sum](data_structures/binary_tree/binary_tree_node_sum.py) * [Binary Tree Path Sum](data_structures/binary_tree/binary_tree_path_sum.py) * [Binary Tree Traversals](data_structures/binary_tree/binary_tree_traversals.py) * [Diameter Of Binary Tree](data_structures/binary_tree/diameter_of_binary_tree.py) * [Diff Views Of Binary Tree](data_structures/binary_tree/diff_views_of_binary_tree.py) * [Distribute Coins](data_structures/binary_tree/distribute_coins.py) * [Fenwick Tree](data_structures/binary_tree/fenwick_tree.py) * [Flatten Binarytree To Linkedlist](data_structures/binary_tree/flatten_binarytree_to_linkedlist.py) * [Floor And Ceiling](data_structures/binary_tree/floor_and_ceiling.py) * [Inorder Tree Traversal 2022](data_structures/binary_tree/inorder_tree_traversal_2022.py) * [Is Sorted](data_structures/binary_tree/is_sorted.py) * [Is Sum Tree](data_structures/binary_tree/is_sum_tree.py) * [Lazy Segment Tree](data_structures/binary_tree/lazy_segment_tree.py) * [Lowest Common Ancestor](data_structures/binary_tree/lowest_common_ancestor.py) * [Maximum Fenwick Tree](data_structures/binary_tree/maximum_fenwick_tree.py) * [Maximum Sum Bst](data_structures/binary_tree/maximum_sum_bst.py) * [Merge Two Binary Trees](data_structures/binary_tree/merge_two_binary_trees.py) * [Mirror Binary Tree](data_structures/binary_tree/mirror_binary_tree.py) * [Non Recursive Segment Tree](data_structures/binary_tree/non_recursive_segment_tree.py) * [Number Of Possible Binary Trees](data_structures/binary_tree/number_of_possible_binary_trees.py) * [Red Black Tree](data_structures/binary_tree/red_black_tree.py) * [Segment Tree](data_structures/binary_tree/segment_tree.py) * [Segment Tree Other](data_structures/binary_tree/segment_tree_other.py) * [Serialize Deserialize Binary Tree](data_structures/binary_tree/serialize_deserialize_binary_tree.py) * [Symmetric Tree](data_structures/binary_tree/symmetric_tree.py) * [Treap](data_structures/binary_tree/treap.py) * [Wavelet Tree](data_structures/binary_tree/wavelet_tree.py) * Disjoint Set * [Alternate Disjoint Set](data_structures/disjoint_set/alternate_disjoint_set.py) * [Disjoint Set](data_structures/disjoint_set/disjoint_set.py) * Hashing * [Bloom Filter](data_structures/hashing/bloom_filter.py) * [Double Hash](data_structures/hashing/double_hash.py) * [Hash Map](data_structures/hashing/hash_map.py) * [Hash Table](data_structures/hashing/hash_table.py) * [Hash Table With Linked List](data_structures/hashing/hash_table_with_linked_list.py) * Number Theory * [Prime Numbers](data_structures/hashing/number_theory/prime_numbers.py) * [Quadratic Probing](data_structures/hashing/quadratic_probing.py) * Tests * [Test Hash Map](data_structures/hashing/tests/test_hash_map.py) * Heap * [Binomial Heap](data_structures/heap/binomial_heap.py) * [Heap](data_structures/heap/heap.py) * [Heap Generic](data_structures/heap/heap_generic.py) * [Max Heap](data_structures/heap/max_heap.py) * [Min Heap](data_structures/heap/min_heap.py) * [Randomized Heap](data_structures/heap/randomized_heap.py) * [Skew Heap](data_structures/heap/skew_heap.py) * Kd Tree * [Build Kdtree](data_structures/kd_tree/build_kdtree.py) * Example * [Example Usage](data_structures/kd_tree/example/example_usage.py) * [Hypercube Points](data_structures/kd_tree/example/hypercube_points.py) * [Kd Node](data_structures/kd_tree/kd_node.py) * [Nearest Neighbour Search](data_structures/kd_tree/nearest_neighbour_search.py) * Tests * [Test Kdtree](data_structures/kd_tree/tests/test_kdtree.py) * Linked List * [Circular Linked List](data_structures/linked_list/circular_linked_list.py) * [Deque Doubly](data_structures/linked_list/deque_doubly.py) * [Doubly Linked List](data_structures/linked_list/doubly_linked_list.py) * [Doubly Linked List Two](data_structures/linked_list/doubly_linked_list_two.py) * [Floyds Cycle Detection](data_structures/linked_list/floyds_cycle_detection.py) * [From Sequence](data_structures/linked_list/from_sequence.py) * [Has Loop](data_structures/linked_list/has_loop.py) * [Is Palindrome](data_structures/linked_list/is_palindrome.py) * [Merge Two Lists](data_structures/linked_list/merge_two_lists.py) * [Middle Element Of Linked List](data_structures/linked_list/middle_element_of_linked_list.py) * [Print Reverse](data_structures/linked_list/print_reverse.py) * [Reverse K Group](data_structures/linked_list/reverse_k_group.py) * [Rotate To The Right](data_structures/linked_list/rotate_to_the_right.py) * [Singly Linked List](data_structures/linked_list/singly_linked_list.py) * [Skip List](data_structures/linked_list/skip_list.py) * [Swap Nodes](data_structures/linked_list/swap_nodes.py) * Queues * [Circular Queue](data_structures/queues/circular_queue.py) * [Circular Queue Linked List](data_structures/queues/circular_queue_linked_list.py) * [Double Ended Queue](data_structures/queues/double_ended_queue.py) * [Linked Queue](data_structures/queues/linked_queue.py) * [Priority Queue Using List](data_structures/queues/priority_queue_using_list.py) * [Queue By List](data_structures/queues/queue_by_list.py) * [Queue By Two Stacks](data_structures/queues/queue_by_two_stacks.py) * [Queue On Pseudo Stack](data_structures/queues/queue_on_pseudo_stack.py) * Stacks * [Balanced Parentheses](data_structures/stacks/balanced_parentheses.py) * [Dijkstras Two Stack Algorithm](data_structures/stacks/dijkstras_two_stack_algorithm.py) * [Infix To Postfix Conversion](data_structures/stacks/infix_to_postfix_conversion.py) * [Infix To Prefix Conversion](data_structures/stacks/infix_to_prefix_conversion.py) * [Largest Rectangle Histogram](data_structures/stacks/largest_rectangle_histogram.py) * [Lexicographical Numbers](data_structures/stacks/lexicographical_numbers.py) * [Next Greater Element](data_structures/stacks/next_greater_element.py) * [Postfix Evaluation](data_structures/stacks/postfix_evaluation.py) * [Prefix Evaluation](data_structures/stacks/prefix_evaluation.py) * [Stack](data_structures/stacks/stack.py) * [Stack Using Two Queues](data_structures/stacks/stack_using_two_queues.py) * [Stack With Doubly Linked List](data_structures/stacks/stack_with_doubly_linked_list.py) * [Stack With Singly Linked List](data_structures/stacks/stack_with_singly_linked_list.py) * [Stock Span Problem](data_structures/stacks/stock_span_problem.py) * Suffix Tree * Example * [Example Usage](data_structures/suffix_tree/example/example_usage.py) * [Suffix Tree](data_structures/suffix_tree/suffix_tree.py) * [Suffix Tree Node](data_structures/suffix_tree/suffix_tree_node.py) * Tests * [Test Suffix Tree](data_structures/suffix_tree/tests/test_suffix_tree.py) * Trie * [Radix Tree](data_structures/trie/radix_tree.py) * [Trie](data_structures/trie/trie.py) ## Digital Image Processing * [Change Brightness](digital_image_processing/change_brightness.py) * [Change Contrast](digital_image_processing/change_contrast.py) * [Convert To Negative](digital_image_processing/convert_to_negative.py) * Dithering * [Burkes](digital_image_processing/dithering/burkes.py) * Edge Detection * [Canny](digital_image_processing/edge_detection/canny.py) * Filters * [Bilateral Filter](digital_image_processing/filters/bilateral_filter.py) * [Convolve](digital_image_processing/filters/convolve.py) * [Gabor Filter](digital_image_processing/filters/gabor_filter.py) * [Gaussian Filter](digital_image_processing/filters/gaussian_filter.py) * [Laplacian Filter](digital_image_processing/filters/laplacian_filter.py) * [Local Binary Pattern](digital_image_processing/filters/local_binary_pattern.py) * [Median Filter](digital_image_processing/filters/median_filter.py) * [Sobel Filter](digital_image_processing/filters/sobel_filter.py) * Histogram Equalization * [Histogram Stretch](digital_image_processing/histogram_equalization/histogram_stretch.py) * [Index Calculation](digital_image_processing/index_calculation.py) * Morphological Operations * [Dilation Operation](digital_image_processing/morphological_operations/dilation_operation.py) * [Erosion Operation](digital_image_processing/morphological_operations/erosion_operation.py) * Resize * [Resize](digital_image_processing/resize/resize.py) * Rotation * [Rotation](digital_image_processing/rotation/rotation.py) * [Sepia](digital_image_processing/sepia.py) * [Test Digital Image Processing](digital_image_processing/test_digital_image_processing.py) ## Divide And Conquer * [Closest Pair Of Points](divide_and_conquer/closest_pair_of_points.py) * [Convex Hull](divide_and_conquer/convex_hull.py) * [Heaps Algorithm](divide_and_conquer/heaps_algorithm.py) * [Heaps Algorithm Iterative](divide_and_conquer/heaps_algorithm_iterative.py) * [Inversions](divide_and_conquer/inversions.py) * [Kth Order Statistic](divide_and_conquer/kth_order_statistic.py) * [Max Difference Pair](divide_and_conquer/max_difference_pair.py) * [Max Subarray](divide_and_conquer/max_subarray.py) * [Mergesort](divide_and_conquer/mergesort.py) * [Peak](divide_and_conquer/peak.py) * [Power](divide_and_conquer/power.py) * [Strassen Matrix Multiplication](divide_and_conquer/strassen_matrix_multiplication.py) ## Docs * [Conf](docs/conf.py) ## Dynamic Programming * [Abbreviation](dynamic_programming/abbreviation.py) * [All Construct](dynamic_programming/all_construct.py) * [Bitmask](dynamic_programming/bitmask.py) * [Catalan Numbers](dynamic_programming/catalan_numbers.py) * [Climbing Stairs](dynamic_programming/climbing_stairs.py) * [Combination Sum Iv](dynamic_programming/combination_sum_iv.py) * [Edit Distance](dynamic_programming/edit_distance.py) * [Factorial](dynamic_programming/factorial.py) * [Fast Fibonacci](dynamic_programming/fast_fibonacci.py) * [Fibonacci](dynamic_programming/fibonacci.py) * [Fizz Buzz](dynamic_programming/fizz_buzz.py) * [Floyd Warshall](dynamic_programming/floyd_warshall.py) * [Integer Partition](dynamic_programming/integer_partition.py) * [Iterating Through Submasks](dynamic_programming/iterating_through_submasks.py) * [K Means Clustering Tensorflow](dynamic_programming/k_means_clustering_tensorflow.py) * [Knapsack](dynamic_programming/knapsack.py) * [Largest Divisible Subset](dynamic_programming/largest_divisible_subset.py) * [Longest Common Subsequence](dynamic_programming/longest_common_subsequence.py) * [Longest Common Substring](dynamic_programming/longest_common_substring.py) * [Longest Increasing Subsequence](dynamic_programming/longest_increasing_subsequence.py) * [Longest Increasing Subsequence Iterative](dynamic_programming/longest_increasing_subsequence_iterative.py) * [Longest Increasing Subsequence O Nlogn](dynamic_programming/longest_increasing_subsequence_o_nlogn.py) * [Longest Palindromic Subsequence](dynamic_programming/longest_palindromic_subsequence.py) * [Matrix Chain Multiplication](dynamic_programming/matrix_chain_multiplication.py) * [Matrix Chain Order](dynamic_programming/matrix_chain_order.py) * [Max Non Adjacent Sum](dynamic_programming/max_non_adjacent_sum.py) * [Max Product Subarray](dynamic_programming/max_product_subarray.py) * [Max Subarray Sum](dynamic_programming/max_subarray_sum.py) * [Min Distance Up Bottom](dynamic_programming/min_distance_up_bottom.py) * [Minimum Coin Change](dynamic_programming/minimum_coin_change.py) * [Minimum Cost Path](dynamic_programming/minimum_cost_path.py) * [Minimum Partition](dynamic_programming/minimum_partition.py) * [Minimum Size Subarray Sum](dynamic_programming/minimum_size_subarray_sum.py) * [Minimum Squares To Represent A Number](dynamic_programming/minimum_squares_to_represent_a_number.py) * [Minimum Steps To One](dynamic_programming/minimum_steps_to_one.py) * [Minimum Tickets Cost](dynamic_programming/minimum_tickets_cost.py) * [Narcissistic Number](dynamic_programming/narcissistic_number.py) * [Optimal Binary Search Tree](dynamic_programming/optimal_binary_search_tree.py) * [Palindrome Partitioning](dynamic_programming/palindrome_partitioning.py) * [Range Sum Query](dynamic_programming/range_sum_query.py) * [Regex Match](dynamic_programming/regex_match.py) * [Rod Cutting](dynamic_programming/rod_cutting.py) * [Smith Waterman](dynamic_programming/smith_waterman.py) * [Subset Generation](dynamic_programming/subset_generation.py) * [Sum Of Subset](dynamic_programming/sum_of_subset.py) * [Trapped Water](dynamic_programming/trapped_water.py) * [Tribonacci](dynamic_programming/tribonacci.py) * [Viterbi](dynamic_programming/viterbi.py) * [Wildcard Matching](dynamic_programming/wildcard_matching.py) * [Word Break](dynamic_programming/word_break.py) ## Electronics * [Apparent Power](electronics/apparent_power.py) * [Builtin Voltage](electronics/builtin_voltage.py) * [Capacitor Equivalence](electronics/capacitor_equivalence.py) * [Carrier Concentration](electronics/carrier_concentration.py) * [Charging Capacitor](electronics/charging_capacitor.py) * [Charging Inductor](electronics/charging_inductor.py) * [Circular Convolution](electronics/circular_convolution.py) * [Coulombs Law](electronics/coulombs_law.py) * [Electric Conductivity](electronics/electric_conductivity.py) * [Electric Power](electronics/electric_power.py) * [Electrical Impedance](electronics/electrical_impedance.py) * [Ic 555 Timer](electronics/ic_555_timer.py) * [Ind Reactance](electronics/ind_reactance.py) * [Ohms Law](electronics/ohms_law.py) * [Real And Reactive Power](electronics/real_and_reactive_power.py) * [Resistor Color Code](electronics/resistor_color_code.py) * [Resistor Equivalence](electronics/resistor_equivalence.py) * [Resonant Frequency](electronics/resonant_frequency.py) * [Wheatstone Bridge](electronics/wheatstone_bridge.py) ## File Transfer * [Receive File](file_transfer/receive_file.py) * [Send File](file_transfer/send_file.py) * Tests * [Test Send File](file_transfer/tests/test_send_file.py) ## Financial * [Equated Monthly Installments](financial/equated_monthly_installments.py) * [Exponential Moving Average](financial/exponential_moving_average.py) * [Interest](financial/interest.py) * [Present Value](financial/present_value.py) * [Price Plus Tax](financial/price_plus_tax.py) * [Simple Moving Average](financial/simple_moving_average.py) * [Straight Line Depreciation](financial/straight_line_depreciation.py) * [Time And Half Pay](financial/time_and_half_pay.py) ## Fractals * [Julia Sets](fractals/julia_sets.py) * [Koch Snowflake](fractals/koch_snowflake.py) * [Mandelbrot](fractals/mandelbrot.py) * [Sierpinski Triangle](fractals/sierpinski_triangle.py) * [Vicsek](fractals/vicsek.py) ## Fuzzy Logic * [Fuzzy Operations](fuzzy_logic/fuzzy_operations.py) ## Genetic Algorithm * [Basic String](genetic_algorithm/basic_string.py) ## Geodesy * [Haversine Distance](geodesy/haversine_distance.py) * [Lamberts Ellipsoidal Distance](geodesy/lamberts_ellipsoidal_distance.py) ## Geometry * [Geometry](geometry/geometry.py) * [Graham Scan](geometry/graham_scan.py) * [Jarvis March](geometry/jarvis_march.py) * Tests * [Test Graham Scan](geometry/tests/test_graham_scan.py) * [Test Jarvis March](geometry/tests/test_jarvis_march.py) ## Graphics * [Bezier Curve](graphics/bezier_curve.py) * [Butterfly Pattern](graphics/butterfly_pattern.py) * [Digital Differential Analyzer Line](graphics/digital_differential_analyzer_line.py) * [Vector3 For 2D Rendering](graphics/vector3_for_2d_rendering.py) ## Graphs * [A Star](graphs/a_star.py) * [Ant Colony Optimization Algorithms](graphs/ant_colony_optimization_algorithms.py) * [Articulation Points](graphs/articulation_points.py) * [Basic Graphs](graphs/basic_graphs.py) * [Bellman Ford](graphs/bellman_ford.py) * [Bi Directional Dijkstra](graphs/bi_directional_dijkstra.py) * [Bidirectional A Star](graphs/bidirectional_a_star.py) * [Bidirectional Breadth First Search](graphs/bidirectional_breadth_first_search.py) * [Bidirectional Search](graphs/bidirectional_search.py) * [Boruvka](graphs/boruvka.py) * [Breadth First Search](graphs/breadth_first_search.py) * [Breadth First Search 2](graphs/breadth_first_search_2.py) * [Breadth First Search Shortest Path](graphs/breadth_first_search_shortest_path.py) * [Breadth First Search Shortest Path 2](graphs/breadth_first_search_shortest_path_2.py) * [Breadth First Search Zero One Shortest Path](graphs/breadth_first_search_zero_one_shortest_path.py) * [Check Bipatrite](graphs/check_bipatrite.py) * [Check Cycle](graphs/check_cycle.py) * [Connected Components](graphs/connected_components.py) * [Deep Clone Graph](graphs/deep_clone_graph.py) * [Depth First Search](graphs/depth_first_search.py) * [Depth First Search 2](graphs/depth_first_search_2.py) * [Dijkstra](graphs/dijkstra.py) * [Dijkstra 2](graphs/dijkstra_2.py) * [Dijkstra Algorithm](graphs/dijkstra_algorithm.py) * [Dijkstra Alternate](graphs/dijkstra_alternate.py) * [Dijkstra Binary Grid](graphs/dijkstra_binary_grid.py) * [Dinic](graphs/dinic.py) * [Directed And Undirected Weighted Graph](graphs/directed_and_undirected_weighted_graph.py) * [Edmonds Karp Multiple Source And Sink](graphs/edmonds_karp_multiple_source_and_sink.py) * [Eulerian Path And Circuit For Undirected Graph](graphs/eulerian_path_and_circuit_for_undirected_graph.py) * [Even Tree](graphs/even_tree.py) * [Finding Bridges](graphs/finding_bridges.py) * [Frequent Pattern Graph Miner](graphs/frequent_pattern_graph_miner.py) * [G Topological Sort](graphs/g_topological_sort.py) * [Gale Shapley Bigraph](graphs/gale_shapley_bigraph.py) * [Graph Adjacency List](graphs/graph_adjacency_list.py) * [Graph Adjacency Matrix](graphs/graph_adjacency_matrix.py) * [Graph List](graphs/graph_list.py) * [Graphs Floyd Warshall](graphs/graphs_floyd_warshall.py) * [Greedy Best First](graphs/greedy_best_first.py) * [Greedy Min Vertex Cover](graphs/greedy_min_vertex_cover.py) * [Kahns Algorithm Long](graphs/kahns_algorithm_long.py) * [Kahns Algorithm Topo](graphs/kahns_algorithm_topo.py) * [Karger](graphs/karger.py) * [Lanczos Eigenvectors](graphs/lanczos_eigenvectors.py) * [Markov Chain](graphs/markov_chain.py) * [Matching Min Vertex Cover](graphs/matching_min_vertex_cover.py) * [Minimum Path Sum](graphs/minimum_path_sum.py) * [Minimum Spanning Tree Boruvka](graphs/minimum_spanning_tree_boruvka.py) * [Minimum Spanning Tree Kruskal](graphs/minimum_spanning_tree_kruskal.py) * [Minimum Spanning Tree Kruskal2](graphs/minimum_spanning_tree_kruskal2.py) * [Minimum Spanning Tree Prims](graphs/minimum_spanning_tree_prims.py) * [Minimum Spanning Tree Prims2](graphs/minimum_spanning_tree_prims2.py) * [Multi Heuristic Astar](graphs/multi_heuristic_astar.py) * [Page Rank](graphs/page_rank.py) * [Prim](graphs/prim.py) * [Random Graph Generator](graphs/random_graph_generator.py) * [Scc Kosaraju](graphs/scc_kosaraju.py) * [Strongly Connected Components](graphs/strongly_connected_components.py) * [Tarjans Scc](graphs/tarjans_scc.py) * Tests * [Test Min Spanning Tree Kruskal](graphs/tests/test_min_spanning_tree_kruskal.py) * [Test Min Spanning Tree Prim](graphs/tests/test_min_spanning_tree_prim.py) ## Greedy Methods * [Best Time To Buy And Sell Stock](greedy_methods/best_time_to_buy_and_sell_stock.py) * [Fractional Cover Problem](greedy_methods/fractional_cover_problem.py) * [Fractional Knapsack](greedy_methods/fractional_knapsack.py) * [Fractional Knapsack 2](greedy_methods/fractional_knapsack_2.py) * [Gas Station](greedy_methods/gas_station.py) * [Minimum Coin Change](greedy_methods/minimum_coin_change.py) * [Minimum Waiting Time](greedy_methods/minimum_waiting_time.py) * [Optimal Merge Pattern](greedy_methods/optimal_merge_pattern.py) * [Smallest Range](greedy_methods/smallest_range.py) ## Hashes * [Adler32](hashes/adler32.py) * [Chaos Machine](hashes/chaos_machine.py) * [Djb2](hashes/djb2.py) * [Elf](hashes/elf.py) * [Enigma Machine](hashes/enigma_machine.py) * [Fletcher16](hashes/fletcher16.py) * [Hamming Code](hashes/hamming_code.py) * [Luhn](hashes/luhn.py) * [Md5](hashes/md5.py) * [Sdbm](hashes/sdbm.py) * [Sha1](hashes/sha1.py) * [Sha256](hashes/sha256.py) ## Knapsack * [Greedy Knapsack](knapsack/greedy_knapsack.py) * [Knapsack](knapsack/knapsack.py) * [Recursive Approach Knapsack](knapsack/recursive_approach_knapsack.py) * Tests * [Test Greedy Knapsack](knapsack/tests/test_greedy_knapsack.py) * [Test Knapsack](knapsack/tests/test_knapsack.py) ## Linear Algebra * [Gaussian Elimination](linear_algebra/gaussian_elimination.py) * [Jacobi Iteration Method](linear_algebra/jacobi_iteration_method.py) * [Lu Decomposition](linear_algebra/lu_decomposition.py) * [Matrix Inversion](linear_algebra/matrix_inversion.py) * Src * [Conjugate Gradient](linear_algebra/src/conjugate_gradient.py) * [Gaussian Elimination Pivoting](linear_algebra/src/gaussian_elimination_pivoting.py) * [Lib](linear_algebra/src/lib.py) * [Polynom For Points](linear_algebra/src/polynom_for_points.py) * [Power Iteration](linear_algebra/src/power_iteration.py) * [Rank Of Matrix](linear_algebra/src/rank_of_matrix.py) * [Rayleigh Quotient](linear_algebra/src/rayleigh_quotient.py) * [Schur Complement](linear_algebra/src/schur_complement.py) * [Test Linear Algebra](linear_algebra/src/test_linear_algebra.py) * [Transformations 2D](linear_algebra/src/transformations_2d.py) ## Linear Programming * [Simplex](linear_programming/simplex.py) ## Machine Learning * [Apriori Algorithm](machine_learning/apriori_algorithm.py) * [Astar](machine_learning/astar.py) * [Automatic Differentiation](machine_learning/automatic_differentiation.py) * [Data Transformations](machine_learning/data_transformations.py) * [Decision Tree](machine_learning/decision_tree.py) * [Dimensionality Reduction](machine_learning/dimensionality_reduction.py) * Forecasting * [Run](machine_learning/forecasting/run.py) * [Frequent Pattern Growth](machine_learning/frequent_pattern_growth.py) * [Gradient Boosting Classifier](machine_learning/gradient_boosting_classifier.py) * [Gradient Descent](machine_learning/gradient_descent.py) * [K Means Clust](machine_learning/k_means_clust.py) * [K Nearest Neighbours](machine_learning/k_nearest_neighbours.py) * [Linear Discriminant Analysis](machine_learning/linear_discriminant_analysis.py) * [Linear Regression](machine_learning/linear_regression.py) * Local Weighted Learning * [Local Weighted Learning](machine_learning/local_weighted_learning/local_weighted_learning.py) * [Logistic Regression](machine_learning/logistic_regression.py) * [Loss Functions](machine_learning/loss_functions.py) * Lstm * [Lstm Prediction](machine_learning/lstm/lstm_prediction.py) * [Mfcc](machine_learning/mfcc.py) * [Multilayer Perceptron Classifier](machine_learning/multilayer_perceptron_classifier.py) * [Polynomial Regression](machine_learning/polynomial_regression.py) * [Principle Component Analysis](machine_learning/principle_component_analysis.py) * [Scoring Functions](machine_learning/scoring_functions.py) * [Self Organizing Map](machine_learning/self_organizing_map.py) * [Sequential Minimum Optimization](machine_learning/sequential_minimum_optimization.py) * [Similarity Search](machine_learning/similarity_search.py) * [Support Vector Machines](machine_learning/support_vector_machines.py) * [T Stochastic Neighbour Embedding](machine_learning/t_stochastic_neighbour_embedding.py) * [Word Frequency Functions](machine_learning/word_frequency_functions.py) * [Xgboost Classifier](machine_learning/xgboost_classifier.py) * [Xgboost Regressor](machine_learning/xgboost_regressor.py) ## Maths * [Abs](maths/abs.py) * [Addition Without Arithmetic](maths/addition_without_arithmetic.py) * [Aliquot Sum](maths/aliquot_sum.py) * [Allocation Number](maths/allocation_number.py) * [Arc Length](maths/arc_length.py) * [Area](maths/area.py) * [Area Under Curve](maths/area_under_curve.py) * [Average Absolute Deviation](maths/average_absolute_deviation.py) * [Average Mean](maths/average_mean.py) * [Average Median](maths/average_median.py) * [Average Mode](maths/average_mode.py) * [Bailey Borwein Plouffe](maths/bailey_borwein_plouffe.py) * [Base Neg2 Conversion](maths/base_neg2_conversion.py) * [Basic Maths](maths/basic_maths.py) * [Binary Exponentiation](maths/binary_exponentiation.py) * [Binary Multiplication](maths/binary_multiplication.py) * [Binomial Coefficient](maths/binomial_coefficient.py) * [Binomial Distribution](maths/binomial_distribution.py) * [Ceil](maths/ceil.py) * [Chebyshev Distance](maths/chebyshev_distance.py) * [Check Polygon](maths/check_polygon.py) * [Chinese Remainder Theorem](maths/chinese_remainder_theorem.py) * [Chudnovsky Algorithm](maths/chudnovsky_algorithm.py) * [Collatz Sequence](maths/collatz_sequence.py) * [Combinations](maths/combinations.py) * [Continued Fraction](maths/continued_fraction.py) * [Decimal Isolate](maths/decimal_isolate.py) * [Decimal To Fraction](maths/decimal_to_fraction.py) * [Dodecahedron](maths/dodecahedron.py) * [Double Factorial](maths/double_factorial.py) * [Dual Number Automatic Differentiation](maths/dual_number_automatic_differentiation.py) * [Entropy](maths/entropy.py) * [Euclidean Distance](maths/euclidean_distance.py) * [Euler Method](maths/euler_method.py) * [Euler Modified](maths/euler_modified.py) * [Eulers Totient](maths/eulers_totient.py) * [Extended Euclidean Algorithm](maths/extended_euclidean_algorithm.py) * [Factorial](maths/factorial.py) * [Factors](maths/factors.py) * [Fast Inverse Sqrt](maths/fast_inverse_sqrt.py) * [Fermat Little Theorem](maths/fermat_little_theorem.py) * [Fibonacci](maths/fibonacci.py) * [Find Max](maths/find_max.py) * [Find Min](maths/find_min.py) * [Floor](maths/floor.py) * [Gamma](maths/gamma.py) * [Gaussian](maths/gaussian.py) * [Gcd Of N Numbers](maths/gcd_of_n_numbers.py) * [Geometric Mean](maths/geometric_mean.py) * [Germain Primes](maths/germain_primes.py) * [Greatest Common Divisor](maths/greatest_common_divisor.py) * [Hardy Ramanujanalgo](maths/hardy_ramanujanalgo.py) * [Integer Square Root](maths/integer_square_root.py) * [Interquartile Range](maths/interquartile_range.py) * [Is Int Palindrome](maths/is_int_palindrome.py) * [Is Ip V4 Address Valid](maths/is_ip_v4_address_valid.py) * [Is Square Free](maths/is_square_free.py) * [Jaccard Similarity](maths/jaccard_similarity.py) * [Joint Probability Distribution](maths/joint_probability_distribution.py) * [Josephus Problem](maths/josephus_problem.py) * [Juggler Sequence](maths/juggler_sequence.py) * [Karatsuba](maths/karatsuba.py) * [Kth Lexicographic Permutation](maths/kth_lexicographic_permutation.py) * [Largest Of Very Large Numbers](maths/largest_of_very_large_numbers.py) * [Least Common Multiple](maths/least_common_multiple.py) * [Line Length](maths/line_length.py) * [Liouville Lambda](maths/liouville_lambda.py) * [Lucas Lehmer Primality Test](maths/lucas_lehmer_primality_test.py) * [Lucas Series](maths/lucas_series.py) * [Maclaurin Series](maths/maclaurin_series.py) * [Manhattan Distance](maths/manhattan_distance.py) * [Matrix Exponentiation](maths/matrix_exponentiation.py) * [Max Sum Sliding Window](maths/max_sum_sliding_window.py) * [Minkowski Distance](maths/minkowski_distance.py) * [Mobius Function](maths/mobius_function.py) * [Modular Division](maths/modular_division.py) * [Modular Exponential](maths/modular_exponential.py) * [Monte Carlo](maths/monte_carlo.py) * [Monte Carlo Dice](maths/monte_carlo_dice.py) * [Number Of Digits](maths/number_of_digits.py) * Numerical Analysis * [Adams Bashforth](maths/numerical_analysis/adams_bashforth.py) * [Bisection](maths/numerical_analysis/bisection.py) * [Bisection 2](maths/numerical_analysis/bisection_2.py) * [Integration By Simpson Approx](maths/numerical_analysis/integration_by_simpson_approx.py) * [Intersection](maths/numerical_analysis/intersection.py) * [Nevilles Method](maths/numerical_analysis/nevilles_method.py) * [Newton Forward Interpolation](maths/numerical_analysis/newton_forward_interpolation.py) * [Newton Raphson](maths/numerical_analysis/newton_raphson.py) * [Numerical Integration](maths/numerical_analysis/numerical_integration.py) * [Proper Fractions](maths/numerical_analysis/proper_fractions.py) * [Runge Kutta](maths/numerical_analysis/runge_kutta.py) * [Runge Kutta Fehlberg 45](maths/numerical_analysis/runge_kutta_fehlberg_45.py) * [Runge Kutta Gills](maths/numerical_analysis/runge_kutta_gills.py) * [Secant Method](maths/numerical_analysis/secant_method.py) * [Simpson Rule](maths/numerical_analysis/simpson_rule.py) * [Square Root](maths/numerical_analysis/square_root.py) * [Weierstrass Method](maths/numerical_analysis/weierstrass_method.py) * [Odd Sieve](maths/odd_sieve.py) * [Perfect Cube](maths/perfect_cube.py) * [Perfect Number](maths/perfect_number.py) * [Perfect Square](maths/perfect_square.py) * [Persistence](maths/persistence.py) * [Pi Generator](maths/pi_generator.py) * [Pi Monte Carlo Estimation](maths/pi_monte_carlo_estimation.py) * [Points Are Collinear 3D](maths/points_are_collinear_3d.py) * [Pollard Rho](maths/pollard_rho.py) * [Polynomial Evaluation](maths/polynomial_evaluation.py) * Polynomials * [Single Indeterminate Operations](maths/polynomials/single_indeterminate_operations.py) * [Power Using Recursion](maths/power_using_recursion.py) * [Prime Check](maths/prime_check.py) * [Prime Factors](maths/prime_factors.py) * [Prime Numbers](maths/prime_numbers.py) * [Prime Sieve Eratosthenes](maths/prime_sieve_eratosthenes.py) * [Primelib](maths/primelib.py) * [Print Multiplication Table](maths/print_multiplication_table.py) * [Pythagoras](maths/pythagoras.py) * [Qr Decomposition](maths/qr_decomposition.py) * [Quadratic Equations Complex Numbers](maths/quadratic_equations_complex_numbers.py) * [Radians](maths/radians.py) * [Radix2 Fft](maths/radix2_fft.py) * [Remove Digit](maths/remove_digit.py) * [Segmented Sieve](maths/segmented_sieve.py) * Series * [Arithmetic](maths/series/arithmetic.py) * [Geometric](maths/series/geometric.py) * [Geometric Series](maths/series/geometric_series.py) * [Harmonic](maths/series/harmonic.py) * [Harmonic Series](maths/series/harmonic_series.py) * [Hexagonal Numbers](maths/series/hexagonal_numbers.py) * [P Series](maths/series/p_series.py) * [Sieve Of Eratosthenes](maths/sieve_of_eratosthenes.py) * [Sigmoid](maths/sigmoid.py) * [Signum](maths/signum.py) * [Simultaneous Linear Equation Solver](maths/simultaneous_linear_equation_solver.py) * [Sin](maths/sin.py) * [Sock Merchant](maths/sock_merchant.py) * [Softmax](maths/softmax.py) * [Solovay Strassen Primality Test](maths/solovay_strassen_primality_test.py) * [Spearman Rank Correlation Coefficient](maths/spearman_rank_correlation_coefficient.py) * Special Numbers * [Armstrong Numbers](maths/special_numbers/armstrong_numbers.py) * [Automorphic Number](maths/special_numbers/automorphic_number.py) * [Bell Numbers](maths/special_numbers/bell_numbers.py) * [Carmichael Number](maths/special_numbers/carmichael_number.py) * [Catalan Number](maths/special_numbers/catalan_number.py) * [Hamming Numbers](maths/special_numbers/hamming_numbers.py) * [Happy Number](maths/special_numbers/happy_number.py) * [Harshad Numbers](maths/special_numbers/harshad_numbers.py) * [Hexagonal Number](maths/special_numbers/hexagonal_number.py) * [Krishnamurthy Number](maths/special_numbers/krishnamurthy_number.py) * [Perfect Number](maths/special_numbers/perfect_number.py) * [Polygonal Numbers](maths/special_numbers/polygonal_numbers.py) * [Pronic Number](maths/special_numbers/pronic_number.py) * [Proth Number](maths/special_numbers/proth_number.py) * [Triangular Numbers](maths/special_numbers/triangular_numbers.py) * [Ugly Numbers](maths/special_numbers/ugly_numbers.py) * [Weird Number](maths/special_numbers/weird_number.py) * [Sum Of Arithmetic Series](maths/sum_of_arithmetic_series.py) * [Sum Of Digits](maths/sum_of_digits.py) * [Sum Of Geometric Progression](maths/sum_of_geometric_progression.py) * [Sum Of Harmonic Series](maths/sum_of_harmonic_series.py) * [Sumset](maths/sumset.py) * [Sylvester Sequence](maths/sylvester_sequence.py) * [Tanh](maths/tanh.py) * [Test Factorial](maths/test_factorial.py) * [Test Prime Check](maths/test_prime_check.py) * [Three Sum](maths/three_sum.py) * [Trapezoidal Rule](maths/trapezoidal_rule.py) * [Triplet Sum](maths/triplet_sum.py) * [Twin Prime](maths/twin_prime.py) * [Two Pointer](maths/two_pointer.py) * [Two Sum](maths/two_sum.py) * [Volume](maths/volume.py) * [Zellers Congruence](maths/zellers_congruence.py) ## Matrix * [Binary Search Matrix](matrix/binary_search_matrix.py) * [Count Islands In Matrix](matrix/count_islands_in_matrix.py) * [Count Negative Numbers In Sorted Matrix](matrix/count_negative_numbers_in_sorted_matrix.py) * [Count Paths](matrix/count_paths.py) * [Cramers Rule 2X2](matrix/cramers_rule_2x2.py) * [Inverse Of Matrix](matrix/inverse_of_matrix.py) * [Largest Square Area In Matrix](matrix/largest_square_area_in_matrix.py) * [Matrix Based Game](matrix/matrix_based_game.py) * [Matrix Class](matrix/matrix_class.py) * [Matrix Equalization](matrix/matrix_equalization.py) * [Matrix Multiplication Recursion](matrix/matrix_multiplication_recursion.py) * [Matrix Operation](matrix/matrix_operation.py) * [Max Area Of Island](matrix/max_area_of_island.py) * [Median Matrix](matrix/median_matrix.py) * [Nth Fibonacci Using Matrix Exponentiation](matrix/nth_fibonacci_using_matrix_exponentiation.py) * [Pascal Triangle](matrix/pascal_triangle.py) * [Rotate Matrix](matrix/rotate_matrix.py) * [Searching In Sorted Matrix](matrix/searching_in_sorted_matrix.py) * [Sherman Morrison](matrix/sherman_morrison.py) * [Spiral Print](matrix/spiral_print.py) * Tests * [Test Matrix Operation](matrix/tests/test_matrix_operation.py) * [Validate Sudoku Board](matrix/validate_sudoku_board.py) ## Networking Flow * [Ford Fulkerson](networking_flow/ford_fulkerson.py) * [Minimum Cut](networking_flow/minimum_cut.py) ## Neural Network * Activation Functions * [Binary Step](neural_network/activation_functions/binary_step.py) * [Exponential Linear Unit](neural_network/activation_functions/exponential_linear_unit.py) * [Gaussian Error Linear Unit](neural_network/activation_functions/gaussian_error_linear_unit.py) * [Leaky Rectified Linear Unit](neural_network/activation_functions/leaky_rectified_linear_unit.py) * [Mish](neural_network/activation_functions/mish.py) * [Rectified Linear Unit](neural_network/activation_functions/rectified_linear_unit.py) * [Scaled Exponential Linear Unit](neural_network/activation_functions/scaled_exponential_linear_unit.py) * [Soboleva Modified Hyperbolic Tangent](neural_network/activation_functions/soboleva_modified_hyperbolic_tangent.py) * [Softplus](neural_network/activation_functions/softplus.py) * [Squareplus](neural_network/activation_functions/squareplus.py) * [Swish](neural_network/activation_functions/swish.py) * [Back Propagation Neural Network](neural_network/back_propagation_neural_network.py) * [Convolution Neural Network](neural_network/convolution_neural_network.py) * [Input Data](neural_network/input_data.py) * [Simple Neural Network](neural_network/simple_neural_network.py) * [Two Hidden Layers Neural Network](neural_network/two_hidden_layers_neural_network.py) ## Other * [Activity Selection](other/activity_selection.py) * [Alternative List Arrange](other/alternative_list_arrange.py) * [Bankers Algorithm](other/bankers_algorithm.py) * [Davis Putnam Logemann Loveland](other/davis_putnam_logemann_loveland.py) * [Doomsday](other/doomsday.py) * [Fischer Yates Shuffle](other/fischer_yates_shuffle.py) * [Gauss Easter](other/gauss_easter.py) * [Graham Scan](other/graham_scan.py) * [Greedy](other/greedy.py) * [Guess The Number Search](other/guess_the_number_search.py) * [H Index](other/h_index.py) * [Least Recently Used](other/least_recently_used.py) * [Lfu Cache](other/lfu_cache.py) * [Linear Congruential Generator](other/linear_congruential_generator.py) * [Lru Cache](other/lru_cache.py) * [Magicdiamondpattern](other/magicdiamondpattern.py) * [Majority Vote Algorithm](other/majority_vote_algorithm.py) * [Maximum Subsequence](other/maximum_subsequence.py) * [Nested Brackets](other/nested_brackets.py) * [Number Container System](other/number_container_system.py) * [Password](other/password.py) * [Quine](other/quine.py) * [Scoring Algorithm](other/scoring_algorithm.py) * [Sdes](other/sdes.py) * [Sliding Window Maximum](other/sliding_window_maximum.py) * [Tower Of Hanoi](other/tower_of_hanoi.py) * [Word Search](other/word_search.py) ## Physics * [Altitude Pressure](physics/altitude_pressure.py) * [Archimedes Principle Of Buoyant Force](physics/archimedes_principle_of_buoyant_force.py) * [Basic Orbital Capture](physics/basic_orbital_capture.py) * [Casimir Effect](physics/casimir_effect.py) * [Center Of Mass](physics/center_of_mass.py) * [Centripetal Force](physics/centripetal_force.py) * [Coulombs Law](physics/coulombs_law.py) * [Doppler Frequency](physics/doppler_frequency.py) * [Escape Velocity](physics/escape_velocity.py) * [Grahams Law](physics/grahams_law.py) * [Horizontal Projectile Motion](physics/horizontal_projectile_motion.py) * [Hubble Parameter](physics/hubble_parameter.py) * [Ideal Gas Law](physics/ideal_gas_law.py) * [In Static Equilibrium](physics/in_static_equilibrium.py) * [Kinetic Energy](physics/kinetic_energy.py) * [Lens Formulae](physics/lens_formulae.py) * [Lorentz Transformation Four Vector](physics/lorentz_transformation_four_vector.py) * [Malus Law](physics/malus_law.py) * [Mass Energy Equivalence](physics/mass_energy_equivalence.py) * [Mirror Formulae](physics/mirror_formulae.py) * [N Body Simulation](physics/n_body_simulation.py) * [Newtons Law Of Gravitation](physics/newtons_law_of_gravitation.py) * [Newtons Second Law Of Motion](physics/newtons_second_law_of_motion.py) * [Orbital Transfer Work](physics/orbital_transfer_work.py) * [Period Of Pendulum](physics/period_of_pendulum.py) * [Photoelectric Effect](physics/photoelectric_effect.py) * [Potential Energy](physics/potential_energy.py) * [Rainfall Intensity](physics/rainfall_intensity.py) * [Reynolds Number](physics/reynolds_number.py) * [Rms Speed Of Molecule](physics/rms_speed_of_molecule.py) * [Shear Stress](physics/shear_stress.py) * [Speed Of Sound](physics/speed_of_sound.py) * [Speeds Of Gas Molecules](physics/speeds_of_gas_molecules.py) * [Terminal Velocity](physics/terminal_velocity.py) ## Project Euler * Problem 001 * [Sol1](project_euler/problem_001/sol1.py) * [Sol2](project_euler/problem_001/sol2.py) * [Sol3](project_euler/problem_001/sol3.py) * [Sol4](project_euler/problem_001/sol4.py) * [Sol5](project_euler/problem_001/sol5.py) * [Sol6](project_euler/problem_001/sol6.py) * [Sol7](project_euler/problem_001/sol7.py) * Problem 002 * [Sol1](project_euler/problem_002/sol1.py) * [Sol2](project_euler/problem_002/sol2.py) * [Sol3](project_euler/problem_002/sol3.py) * [Sol4](project_euler/problem_002/sol4.py) * [Sol5](project_euler/problem_002/sol5.py) * Problem 003 * [Sol1](project_euler/problem_003/sol1.py) * [Sol2](project_euler/problem_003/sol2.py) * [Sol3](project_euler/problem_003/sol3.py) * Problem 004 * [Sol1](project_euler/problem_004/sol1.py) * [Sol2](project_euler/problem_004/sol2.py) * Problem 005 * [Sol1](project_euler/problem_005/sol1.py) * [Sol2](project_euler/problem_005/sol2.py) * Problem 006 * [Sol1](project_euler/problem_006/sol1.py) * [Sol2](project_euler/problem_006/sol2.py) * [Sol3](project_euler/problem_006/sol3.py) * [Sol4](project_euler/problem_006/sol4.py) * Problem 007 * [Sol1](project_euler/problem_007/sol1.py) * [Sol2](project_euler/problem_007/sol2.py) * [Sol3](project_euler/problem_007/sol3.py) * Problem 008 * [Sol1](project_euler/problem_008/sol1.py) * [Sol2](project_euler/problem_008/sol2.py) * [Sol3](project_euler/problem_008/sol3.py) * Problem 009 * [Sol1](project_euler/problem_009/sol1.py) * [Sol2](project_euler/problem_009/sol2.py) * [Sol3](project_euler/problem_009/sol3.py) * [Sol4](project_euler/problem_009/sol4.py) * Problem 010 * [Sol1](project_euler/problem_010/sol1.py) * [Sol2](project_euler/problem_010/sol2.py) * [Sol3](project_euler/problem_010/sol3.py) * Problem 011 * [Sol1](project_euler/problem_011/sol1.py) * [Sol2](project_euler/problem_011/sol2.py) * Problem 012 * [Sol1](project_euler/problem_012/sol1.py) * [Sol2](project_euler/problem_012/sol2.py) * Problem 013 * [Sol1](project_euler/problem_013/sol1.py) * Problem 014 * [Sol1](project_euler/problem_014/sol1.py) * [Sol2](project_euler/problem_014/sol2.py) * Problem 015 * [Sol1](project_euler/problem_015/sol1.py) * [Sol2](project_euler/problem_015/sol2.py) * Problem 016 * [Sol1](project_euler/problem_016/sol1.py) * [Sol2](project_euler/problem_016/sol2.py) * Problem 017 * [Sol1](project_euler/problem_017/sol1.py) * Problem 018 * [Solution](project_euler/problem_018/solution.py) * Problem 019 * [Sol1](project_euler/problem_019/sol1.py) * Problem 020 * [Sol1](project_euler/problem_020/sol1.py) * [Sol2](project_euler/problem_020/sol2.py) * [Sol3](project_euler/problem_020/sol3.py) * [Sol4](project_euler/problem_020/sol4.py) * Problem 021 * [Sol1](project_euler/problem_021/sol1.py) * Problem 022 * [Sol1](project_euler/problem_022/sol1.py) * [Sol2](project_euler/problem_022/sol2.py) * Problem 023 * [Sol1](project_euler/problem_023/sol1.py) * Problem 024 * [Sol1](project_euler/problem_024/sol1.py) * Problem 025 * [Sol1](project_euler/problem_025/sol1.py) * [Sol2](project_euler/problem_025/sol2.py) * [Sol3](project_euler/problem_025/sol3.py) * Problem 026 * [Sol1](project_euler/problem_026/sol1.py) * Problem 027 * [Sol1](project_euler/problem_027/sol1.py) * Problem 028 * [Sol1](project_euler/problem_028/sol1.py) * Problem 029 * [Sol1](project_euler/problem_029/sol1.py) * Problem 030 * [Sol1](project_euler/problem_030/sol1.py) * Problem 031 * [Sol1](project_euler/problem_031/sol1.py) * [Sol2](project_euler/problem_031/sol2.py) * Problem 032 * [Sol32](project_euler/problem_032/sol32.py) * Problem 033 * [Sol1](project_euler/problem_033/sol1.py) * Problem 034 * [Sol1](project_euler/problem_034/sol1.py) * Problem 035 * [Sol1](project_euler/problem_035/sol1.py) * Problem 036 * [Sol1](project_euler/problem_036/sol1.py) * Problem 037 * [Sol1](project_euler/problem_037/sol1.py) * Problem 038 * [Sol1](project_euler/problem_038/sol1.py) * Problem 039 * [Sol1](project_euler/problem_039/sol1.py) * Problem 040 * [Sol1](project_euler/problem_040/sol1.py) * Problem 041 * [Sol1](project_euler/problem_041/sol1.py) * Problem 042 * [Solution42](project_euler/problem_042/solution42.py) * Problem 043 * [Sol1](project_euler/problem_043/sol1.py) * Problem 044 * [Sol1](project_euler/problem_044/sol1.py) * Problem 045 * [Sol1](project_euler/problem_045/sol1.py) * Problem 046 * [Sol1](project_euler/problem_046/sol1.py) * Problem 047 * [Sol1](project_euler/problem_047/sol1.py) * Problem 048 * [Sol1](project_euler/problem_048/sol1.py) * Problem 049 * [Sol1](project_euler/problem_049/sol1.py) * Problem 050 * [Sol1](project_euler/problem_050/sol1.py) * Problem 051 * [Sol1](project_euler/problem_051/sol1.py) * Problem 052 * [Sol1](project_euler/problem_052/sol1.py) * Problem 053 * [Sol1](project_euler/problem_053/sol1.py) * Problem 054 * [Sol1](project_euler/problem_054/sol1.py) * [Test Poker Hand](project_euler/problem_054/test_poker_hand.py) * Problem 055 * [Sol1](project_euler/problem_055/sol1.py) * Problem 056 * [Sol1](project_euler/problem_056/sol1.py) * Problem 057 * [Sol1](project_euler/problem_057/sol1.py) * Problem 058 * [Sol1](project_euler/problem_058/sol1.py) * Problem 059 * [Sol1](project_euler/problem_059/sol1.py) * Problem 062 * [Sol1](project_euler/problem_062/sol1.py) * Problem 063 * [Sol1](project_euler/problem_063/sol1.py) * Problem 064 * [Sol1](project_euler/problem_064/sol1.py) * Problem 065 * [Sol1](project_euler/problem_065/sol1.py) * Problem 067 * [Sol1](project_euler/problem_067/sol1.py) * [Sol2](project_euler/problem_067/sol2.py) * Problem 068 * [Sol1](project_euler/problem_068/sol1.py) * Problem 069 * [Sol1](project_euler/problem_069/sol1.py) * Problem 070 * [Sol1](project_euler/problem_070/sol1.py) * Problem 071 * [Sol1](project_euler/problem_071/sol1.py) * Problem 072 * [Sol1](project_euler/problem_072/sol1.py) * [Sol2](project_euler/problem_072/sol2.py) * Problem 073 * [Sol1](project_euler/problem_073/sol1.py) * Problem 074 * [Sol1](project_euler/problem_074/sol1.py) * [Sol2](project_euler/problem_074/sol2.py) * Problem 075 * [Sol1](project_euler/problem_075/sol1.py) * Problem 076 * [Sol1](project_euler/problem_076/sol1.py) * Problem 077 * [Sol1](project_euler/problem_077/sol1.py) * Problem 078 * [Sol1](project_euler/problem_078/sol1.py) * Problem 079 * [Sol1](project_euler/problem_079/sol1.py) * Problem 080 * [Sol1](project_euler/problem_080/sol1.py) * Problem 081 * [Sol1](project_euler/problem_081/sol1.py) * Problem 082 * [Sol1](project_euler/problem_082/sol1.py) * Problem 085 * [Sol1](project_euler/problem_085/sol1.py) * Problem 086 * [Sol1](project_euler/problem_086/sol1.py) * Problem 087 * [Sol1](project_euler/problem_087/sol1.py) * Problem 089 * [Sol1](project_euler/problem_089/sol1.py) * Problem 091 * [Sol1](project_euler/problem_091/sol1.py) * Problem 092 * [Sol1](project_euler/problem_092/sol1.py) * Problem 094 * [Sol1](project_euler/problem_094/sol1.py) * Problem 095 * [Sol1](project_euler/problem_095/sol1.py) * Problem 097 * [Sol1](project_euler/problem_097/sol1.py) * Problem 099 * [Sol1](project_euler/problem_099/sol1.py) * Problem 100 * [Sol1](project_euler/problem_100/sol1.py) * Problem 101 * [Sol1](project_euler/problem_101/sol1.py) * Problem 102 * [Sol1](project_euler/problem_102/sol1.py) * Problem 104 * [Sol1](project_euler/problem_104/sol1.py) * Problem 107 * [Sol1](project_euler/problem_107/sol1.py) * Problem 109 * [Sol1](project_euler/problem_109/sol1.py) * Problem 112 * [Sol1](project_euler/problem_112/sol1.py) * Problem 113 * [Sol1](project_euler/problem_113/sol1.py) * Problem 114 * [Sol1](project_euler/problem_114/sol1.py) * Problem 115 * [Sol1](project_euler/problem_115/sol1.py) * Problem 116 * [Sol1](project_euler/problem_116/sol1.py) * Problem 117 * [Sol1](project_euler/problem_117/sol1.py) * Problem 119 * [Sol1](project_euler/problem_119/sol1.py) * Problem 120 * [Sol1](project_euler/problem_120/sol1.py) * Problem 121 * [Sol1](project_euler/problem_121/sol1.py) * Problem 122 * [Sol1](project_euler/problem_122/sol1.py) * Problem 123 * [Sol1](project_euler/problem_123/sol1.py) * Problem 125 * [Sol1](project_euler/problem_125/sol1.py) * Problem 129 * [Sol1](project_euler/problem_129/sol1.py) * Problem 131 * [Sol1](project_euler/problem_131/sol1.py) * Problem 135 * [Sol1](project_euler/problem_135/sol1.py) * Problem 136 * [Sol1](project_euler/problem_136/sol1.py) * Problem 144 * [Sol1](project_euler/problem_144/sol1.py) * Problem 145 * [Sol1](project_euler/problem_145/sol1.py) * Problem 164 * [Sol1](project_euler/problem_164/sol1.py) * Problem 173 * [Sol1](project_euler/problem_173/sol1.py) * Problem 174 * [Sol1](project_euler/problem_174/sol1.py) * Problem 180 * [Sol1](project_euler/problem_180/sol1.py) * Problem 187 * [Sol1](project_euler/problem_187/sol1.py) * Problem 188 * [Sol1](project_euler/problem_188/sol1.py) * Problem 190 * [Sol1](project_euler/problem_190/sol1.py) * Problem 191 * [Sol1](project_euler/problem_191/sol1.py) * Problem 203 * [Sol1](project_euler/problem_203/sol1.py) * Problem 205 * [Sol1](project_euler/problem_205/sol1.py) * Problem 206 * [Sol1](project_euler/problem_206/sol1.py) * Problem 207 * [Sol1](project_euler/problem_207/sol1.py) * Problem 234 * [Sol1](project_euler/problem_234/sol1.py) * Problem 301 * [Sol1](project_euler/problem_301/sol1.py) * Problem 345 * [Sol1](project_euler/problem_345/sol1.py) * Problem 493 * [Sol1](project_euler/problem_493/sol1.py) * Problem 551 * [Sol1](project_euler/problem_551/sol1.py) * Problem 587 * [Sol1](project_euler/problem_587/sol1.py) * Problem 686 * [Sol1](project_euler/problem_686/sol1.py) * Problem 800 * [Sol1](project_euler/problem_800/sol1.py) ## Quantum * [Q Fourier Transform](quantum/q_fourier_transform.py) ## Scheduling * [First Come First Served](scheduling/first_come_first_served.py) * [Highest Response Ratio Next](scheduling/highest_response_ratio_next.py) * [Job Sequence With Deadline](scheduling/job_sequence_with_deadline.py) * [Job Sequencing With Deadline](scheduling/job_sequencing_with_deadline.py) * [Multi Level Feedback Queue](scheduling/multi_level_feedback_queue.py) * [Non Preemptive Shortest Job First](scheduling/non_preemptive_shortest_job_first.py) * [Round Robin](scheduling/round_robin.py) * [Shortest Job First](scheduling/shortest_job_first.py) ## Searches * [Binary Search](searches/binary_search.py) * [Binary Tree Traversal](searches/binary_tree_traversal.py) * [Double Linear Search](searches/double_linear_search.py) * [Double Linear Search Recursion](searches/double_linear_search_recursion.py) * [Exponential Search](searches/exponential_search.py) * [Fibonacci Search](searches/fibonacci_search.py) * [Hill Climbing](searches/hill_climbing.py) * [Interpolation Search](searches/interpolation_search.py) * [Jump Search](searches/jump_search.py) * [Linear Search](searches/linear_search.py) * [Median Of Medians](searches/median_of_medians.py) * [Quick Select](searches/quick_select.py) * [Sentinel Linear Search](searches/sentinel_linear_search.py) * [Simple Binary Search](searches/simple_binary_search.py) * [Simulated Annealing](searches/simulated_annealing.py) * [Tabu Search](searches/tabu_search.py) * [Ternary Search](searches/ternary_search.py) ## Sorts * [Bead Sort](sorts/bead_sort.py) * [Binary Insertion Sort](sorts/binary_insertion_sort.py) * [Bitonic Sort](sorts/bitonic_sort.py) * [Bogo Sort](sorts/bogo_sort.py) * [Bubble Sort](sorts/bubble_sort.py) * [Bucket Sort](sorts/bucket_sort.py) * [Circle Sort](sorts/circle_sort.py) * [Cocktail Shaker Sort](sorts/cocktail_shaker_sort.py) * [Comb Sort](sorts/comb_sort.py) * [Counting Sort](sorts/counting_sort.py) * [Cycle Sort](sorts/cycle_sort.py) * [Cyclic Sort](sorts/cyclic_sort.py) * [Double Sort](sorts/double_sort.py) * [Dutch National Flag Sort](sorts/dutch_national_flag_sort.py) * [Exchange Sort](sorts/exchange_sort.py) * [External Sort](sorts/external_sort.py) * [Gnome Sort](sorts/gnome_sort.py) * [Heap Sort](sorts/heap_sort.py) * [Insertion Sort](sorts/insertion_sort.py) * [Intro Sort](sorts/intro_sort.py) * [Iterative Merge Sort](sorts/iterative_merge_sort.py) * [Merge Insertion Sort](sorts/merge_insertion_sort.py) * [Merge Sort](sorts/merge_sort.py) * [Msd Radix Sort](sorts/msd_radix_sort.py) * [Natural Sort](sorts/natural_sort.py) * [Odd Even Sort](sorts/odd_even_sort.py) * [Odd Even Transposition Parallel](sorts/odd_even_transposition_parallel.py) * [Odd Even Transposition Single Threaded](sorts/odd_even_transposition_single_threaded.py) * [Pancake Sort](sorts/pancake_sort.py) * [Patience Sort](sorts/patience_sort.py) * [Pigeon Sort](sorts/pigeon_sort.py) * [Pigeonhole Sort](sorts/pigeonhole_sort.py) * [Quick Sort](sorts/quick_sort.py) * [Quick Sort 3 Partition](sorts/quick_sort_3_partition.py) * [Radix Sort](sorts/radix_sort.py) * [Recursive Insertion Sort](sorts/recursive_insertion_sort.py) * [Recursive Mergesort Array](sorts/recursive_mergesort_array.py) * [Recursive Quick Sort](sorts/recursive_quick_sort.py) * [Selection Sort](sorts/selection_sort.py) * [Shell Sort](sorts/shell_sort.py) * [Shrink Shell Sort](sorts/shrink_shell_sort.py) * [Slowsort](sorts/slowsort.py) * [Stalin Sort](sorts/stalin_sort.py) * [Stooge Sort](sorts/stooge_sort.py) * [Strand Sort](sorts/strand_sort.py) * [Tim Sort](sorts/tim_sort.py) * [Topological Sort](sorts/topological_sort.py) * [Tree Sort](sorts/tree_sort.py) * [Unknown Sort](sorts/unknown_sort.py) * [Wiggle Sort](sorts/wiggle_sort.py) ## Strings * [Aho Corasick](strings/aho_corasick.py) * [Alternative String Arrange](strings/alternative_string_arrange.py) * [Anagrams](strings/anagrams.py) * [Autocomplete Using Trie](strings/autocomplete_using_trie.py) * [Barcode Validator](strings/barcode_validator.py) * [Bitap String Match](strings/bitap_string_match.py) * [Boyer Moore Search](strings/boyer_moore_search.py) * [Camel Case To Snake Case](strings/camel_case_to_snake_case.py) * [Can String Be Rearranged As Palindrome](strings/can_string_be_rearranged_as_palindrome.py) * [Capitalize](strings/capitalize.py) * [Check Anagrams](strings/check_anagrams.py) * [Count Vowels](strings/count_vowels.py) * [Credit Card Validator](strings/credit_card_validator.py) * [Damerau Levenshtein Distance](strings/damerau_levenshtein_distance.py) * [Detecting English Programmatically](strings/detecting_english_programmatically.py) * [Dna](strings/dna.py) * [Edit Distance](strings/edit_distance.py) * [Frequency Finder](strings/frequency_finder.py) * [Hamming Distance](strings/hamming_distance.py) * [Indian Phone Validator](strings/indian_phone_validator.py) * [Is Contains Unique Chars](strings/is_contains_unique_chars.py) * [Is Isogram](strings/is_isogram.py) * [Is Pangram](strings/is_pangram.py) * [Is Polish National Id](strings/is_polish_national_id.py) * [Is Spain National Id](strings/is_spain_national_id.py) * [Is Srilankan Phone Number](strings/is_srilankan_phone_number.py) * [Is Valid Email Address](strings/is_valid_email_address.py) * [Jaro Winkler](strings/jaro_winkler.py) * [Join](strings/join.py) * [Knuth Morris Pratt](strings/knuth_morris_pratt.py) * [Levenshtein Distance](strings/levenshtein_distance.py) * [Lower](strings/lower.py) * [Manacher](strings/manacher.py) * [Min Cost String Conversion](strings/min_cost_string_conversion.py) * [Naive String Search](strings/naive_string_search.py) * [Ngram](strings/ngram.py) * [Palindrome](strings/palindrome.py) * [Pig Latin](strings/pig_latin.py) * [Prefix Function](strings/prefix_function.py) * [Rabin Karp](strings/rabin_karp.py) * [Remove Duplicate](strings/remove_duplicate.py) * [Reverse Letters](strings/reverse_letters.py) * [Reverse Words](strings/reverse_words.py) * [Snake Case To Camel Pascal Case](strings/snake_case_to_camel_pascal_case.py) * [Split](strings/split.py) * [String Switch Case](strings/string_switch_case.py) * [Strip](strings/strip.py) * [Text Justification](strings/text_justification.py) * [Title](strings/title.py) * [Top K Frequent Words](strings/top_k_frequent_words.py) * [Upper](strings/upper.py) * [Wave String](strings/wave_string.py) * [Wildcard Pattern Matching](strings/wildcard_pattern_matching.py) * [Word Occurrence](strings/word_occurrence.py) * [Word Patterns](strings/word_patterns.py) * [Z Function](strings/z_function.py) ## Web Programming * [Co2 Emission](web_programming/co2_emission.py) * [Covid Stats Via Xpath](web_programming/covid_stats_via_xpath.py) * [Crawl Google Results](web_programming/crawl_google_results.py) * [Crawl Google Scholar Citation](web_programming/crawl_google_scholar_citation.py) * [Currency Converter](web_programming/currency_converter.py) * [Current Stock Price](web_programming/current_stock_price.py) * [Current Weather](web_programming/current_weather.py) * [Daily Horoscope](web_programming/daily_horoscope.py) * [Download Images From Google Query](web_programming/download_images_from_google_query.py) * [Emails From Url](web_programming/emails_from_url.py) * [Fetch Anime And Play](web_programming/fetch_anime_and_play.py) * [Fetch Bbc News](web_programming/fetch_bbc_news.py) * [Fetch Github Info](web_programming/fetch_github_info.py) * [Fetch Jobs](web_programming/fetch_jobs.py) * [Fetch Quotes](web_programming/fetch_quotes.py) * [Fetch Well Rx Price](web_programming/fetch_well_rx_price.py) * [Get Amazon Product Data](web_programming/get_amazon_product_data.py) * [Get Imdb Top 250 Movies Csv](web_programming/get_imdb_top_250_movies_csv.py) * [Get Ip Geolocation](web_programming/get_ip_geolocation.py) * [Get Top Billionaires](web_programming/get_top_billionaires.py) * [Get Top Hn Posts](web_programming/get_top_hn_posts.py) * [Giphy](web_programming/giphy.py) * [Instagram Crawler](web_programming/instagram_crawler.py) * [Instagram Pic](web_programming/instagram_pic.py) * [Instagram Video](web_programming/instagram_video.py) * [Nasa Data](web_programming/nasa_data.py) * [Open Google Results](web_programming/open_google_results.py) * [Random Anime Character](web_programming/random_anime_character.py) * [Recaptcha Verification](web_programming/recaptcha_verification.py) * [Reddit](web_programming/reddit.py) * [Search Books By Isbn](web_programming/search_books_by_isbn.py) * [Slack Message](web_programming/slack_message.py) * [Test Fetch Github Info](web_programming/test_fetch_github_info.py) * [World Covid19 Stats](web_programming/world_covid19_stats.py) ================================================ FILE: LICENSE.md ================================================ ## MIT License Copyright (c) 2016-2022 TheAlgorithms and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================

The Algorithms - Python

Gitpod Ready-to-Code Contributions Welcome Discord chat Gitter chat
GitHub Workflow Status pre-commit code style: black

All algorithms implemented in Python - for education 📚

Implementations are for learning purposes only. They may be less efficient than the implementations in the Python standard library. Use them at your discretion. ## 🚀 Getting Started 📋 Read through our [Contribution Guidelines](CONTRIBUTING.md) before you contribute. ## 🌐 Community Channels We are on [Discord](https://the-algorithms.com/discord) and [Gitter](https://gitter.im/TheAlgorithms/community)! Community channels are a great way for you to ask questions and get help. Please join us! ## 📜 List of Algorithms See our [directory](DIRECTORY.md) for easier navigation and a better overview of the project. ================================================ FILE: audio_filters/README.md ================================================ # Audio Filter Audio filters work on the frequency of an audio signal to attenuate unwanted frequency and amplify wanted ones. They are used within anything related to sound, whether it is radio communication or a hi-fi system. * * * * ================================================ FILE: audio_filters/__init__.py ================================================ ================================================ FILE: audio_filters/butterworth_filter.py ================================================ from math import cos, sin, sqrt, tau from audio_filters.iir_filter import IIRFilter """ Create 2nd-order IIR filters with Butterworth design. Code based on https://webaudio.github.io/Audio-EQ-Cookbook/audio-eq-cookbook.html Alternatively you can use scipy.signal.butter, which should yield the same results. """ def make_lowpass( frequency: int, samplerate: int, q_factor: float = 1 / sqrt(2), ) -> IIRFilter: """ Creates a low-pass filter >>> filter = make_lowpass(1000, 48000) >>> filter.a_coeffs + filter.b_coeffs # doctest: +NORMALIZE_WHITESPACE [1.0922959556412573, -1.9828897227476208, 0.9077040443587427, 0.004277569313094809, 0.008555138626189618, 0.004277569313094809] """ w0 = tau * frequency / samplerate _sin = sin(w0) _cos = cos(w0) alpha = _sin / (2 * q_factor) b0 = (1 - _cos) / 2 b1 = 1 - _cos a0 = 1 + alpha a1 = -2 * _cos a2 = 1 - alpha filt = IIRFilter(2) filt.set_coefficients([a0, a1, a2], [b0, b1, b0]) return filt def make_highpass( frequency: int, samplerate: int, q_factor: float = 1 / sqrt(2), ) -> IIRFilter: """ Creates a high-pass filter >>> filter = make_highpass(1000, 48000) >>> filter.a_coeffs + filter.b_coeffs # doctest: +NORMALIZE_WHITESPACE [1.0922959556412573, -1.9828897227476208, 0.9077040443587427, 0.9957224306869052, -1.9914448613738105, 0.9957224306869052] """ w0 = tau * frequency / samplerate _sin = sin(w0) _cos = cos(w0) alpha = _sin / (2 * q_factor) b0 = (1 + _cos) / 2 b1 = -1 - _cos a0 = 1 + alpha a1 = -2 * _cos a2 = 1 - alpha filt = IIRFilter(2) filt.set_coefficients([a0, a1, a2], [b0, b1, b0]) return filt def make_bandpass( frequency: int, samplerate: int, q_factor: float = 1 / sqrt(2), ) -> IIRFilter: """ Creates a band-pass filter >>> filter = make_bandpass(1000, 48000) >>> filter.a_coeffs + filter.b_coeffs # doctest: +NORMALIZE_WHITESPACE [1.0922959556412573, -1.9828897227476208, 0.9077040443587427, 0.06526309611002579, 0, -0.06526309611002579] """ w0 = tau * frequency / samplerate _sin = sin(w0) _cos = cos(w0) alpha = _sin / (2 * q_factor) b0 = _sin / 2 b1 = 0 b2 = -b0 a0 = 1 + alpha a1 = -2 * _cos a2 = 1 - alpha filt = IIRFilter(2) filt.set_coefficients([a0, a1, a2], [b0, b1, b2]) return filt def make_allpass( frequency: int, samplerate: int, q_factor: float = 1 / sqrt(2), ) -> IIRFilter: """ Creates an all-pass filter >>> filter = make_allpass(1000, 48000) >>> filter.a_coeffs + filter.b_coeffs # doctest: +NORMALIZE_WHITESPACE [1.0922959556412573, -1.9828897227476208, 0.9077040443587427, 0.9077040443587427, -1.9828897227476208, 1.0922959556412573] """ w0 = tau * frequency / samplerate _sin = sin(w0) _cos = cos(w0) alpha = _sin / (2 * q_factor) b0 = 1 - alpha b1 = -2 * _cos b2 = 1 + alpha filt = IIRFilter(2) filt.set_coefficients([b2, b1, b0], [b0, b1, b2]) return filt def make_peak( frequency: int, samplerate: int, gain_db: float, q_factor: float = 1 / sqrt(2), ) -> IIRFilter: """ Creates a peak filter >>> filter = make_peak(1000, 48000, 6) >>> filter.a_coeffs + filter.b_coeffs # doctest: +NORMALIZE_WHITESPACE [1.0653405327119334, -1.9828897227476208, 0.9346594672880666, 1.1303715025601122, -1.9828897227476208, 0.8696284974398878] """ w0 = tau * frequency / samplerate _sin = sin(w0) _cos = cos(w0) alpha = _sin / (2 * q_factor) big_a = 10 ** (gain_db / 40) b0 = 1 + alpha * big_a b1 = -2 * _cos b2 = 1 - alpha * big_a a0 = 1 + alpha / big_a a1 = -2 * _cos a2 = 1 - alpha / big_a filt = IIRFilter(2) filt.set_coefficients([a0, a1, a2], [b0, b1, b2]) return filt def make_lowshelf( frequency: int, samplerate: int, gain_db: float, q_factor: float = 1 / sqrt(2), ) -> IIRFilter: """ Creates a low-shelf filter >>> filter = make_lowshelf(1000, 48000, 6) >>> filter.a_coeffs + filter.b_coeffs # doctest: +NORMALIZE_WHITESPACE [3.0409336710888786, -5.608870992220748, 2.602157875636628, 3.139954022810743, -5.591841778072785, 2.5201667380627257] """ w0 = tau * frequency / samplerate _sin = sin(w0) _cos = cos(w0) alpha = _sin / (2 * q_factor) big_a = 10 ** (gain_db / 40) pmc = (big_a + 1) - (big_a - 1) * _cos ppmc = (big_a + 1) + (big_a - 1) * _cos mpc = (big_a - 1) - (big_a + 1) * _cos pmpc = (big_a - 1) + (big_a + 1) * _cos aa2 = 2 * sqrt(big_a) * alpha b0 = big_a * (pmc + aa2) b1 = 2 * big_a * mpc b2 = big_a * (pmc - aa2) a0 = ppmc + aa2 a1 = -2 * pmpc a2 = ppmc - aa2 filt = IIRFilter(2) filt.set_coefficients([a0, a1, a2], [b0, b1, b2]) return filt def make_highshelf( frequency: int, samplerate: int, gain_db: float, q_factor: float = 1 / sqrt(2), ) -> IIRFilter: """ Creates a high-shelf filter >>> filter = make_highshelf(1000, 48000, 6) >>> filter.a_coeffs + filter.b_coeffs # doctest: +NORMALIZE_WHITESPACE [2.2229172136088806, -3.9587208137297303, 1.7841414181566304, 4.295432981120543, -7.922740859457287, 3.6756456963725253] """ w0 = tau * frequency / samplerate _sin = sin(w0) _cos = cos(w0) alpha = _sin / (2 * q_factor) big_a = 10 ** (gain_db / 40) pmc = (big_a + 1) - (big_a - 1) * _cos ppmc = (big_a + 1) + (big_a - 1) * _cos mpc = (big_a - 1) - (big_a + 1) * _cos pmpc = (big_a - 1) + (big_a + 1) * _cos aa2 = 2 * sqrt(big_a) * alpha b0 = big_a * (ppmc + aa2) b1 = -2 * big_a * pmpc b2 = big_a * (ppmc - aa2) a0 = pmc + aa2 a1 = 2 * mpc a2 = pmc - aa2 filt = IIRFilter(2) filt.set_coefficients([a0, a1, a2], [b0, b1, b2]) return filt ================================================ FILE: audio_filters/equal_loudness_filter.py.broken.txt ================================================ from json import loads from pathlib import Path import numpy as np from yulewalker import yulewalk from audio_filters.butterworth_filter import make_highpass from audio_filters.iir_filter import IIRFilter data = loads((Path(__file__).resolve().parent / "loudness_curve.json").read_text()) class EqualLoudnessFilter: r""" An equal-loudness filter which compensates for the human ear's non-linear response to sound. This filter corrects this by cascading a yulewalk filter and a butterworth filter. Designed for use with samplerate of 44.1kHz and above. If you're using a lower samplerate, use with caution. Code based on matlab implementation at https://bit.ly/3eqh2HU (url shortened for ruff) Target curve: https://i.imgur.com/3g2VfaM.png Yulewalk response: https://i.imgur.com/J9LnJ4C.png Butterworth and overall response: https://i.imgur.com/3g2VfaM.png Images and original matlab implementation by David Robinson, 2001 """ def __init__(self, samplerate: int = 44100) -> None: self.yulewalk_filter = IIRFilter(10) self.butterworth_filter = make_highpass(150, samplerate) # pad the data to nyquist curve_freqs = np.array(data["frequencies"] + [max(20000.0, samplerate / 2)]) curve_gains = np.array(data["gains"] + [140]) # Convert to angular frequency freqs_normalized = curve_freqs / samplerate * 2 # Invert the curve and normalize to 0dB gains_normalized = np.power(10, (np.min(curve_gains) - curve_gains) / 20) # Scipy's `yulewalk` function is a stub, so we're using the # `yulewalker` library instead. # This function computes the coefficients using a least-squares # fit to the specified curve. ya, yb = yulewalk(10, freqs_normalized, gains_normalized) self.yulewalk_filter.set_coefficients(ya, yb) def process(self, sample: float) -> float: """ Process a single sample through both filters >>> filt = EqualLoudnessFilter() >>> filt.process(0.0) 0.0 """ tmp = self.yulewalk_filter.process(sample) return self.butterworth_filter.process(tmp) ================================================ FILE: audio_filters/iir_filter.py ================================================ from __future__ import annotations class IIRFilter: r""" N-Order IIR filter Assumes working with float samples normalized on [-1, 1] --- Implementation details: Based on the 2nd-order function from https://en.wikipedia.org/wiki/Digital_biquad_filter, this generalized N-order function was made. Using the following transfer function .. math:: H(z)=\frac{b_{0}+b_{1}z^{-1}+b_{2}z^{-2}+...+b_{k}z^{-k}} {a_{0}+a_{1}z^{-1}+a_{2}z^{-2}+...+a_{k}z^{-k}} we can rewrite this to .. math:: y[n]={\frac{1}{a_{0}}} \left(\left(b_{0}x[n]+b_{1}x[n-1]+b_{2}x[n-2]+...+b_{k}x[n-k]\right)- \left(a_{1}y[n-1]+a_{2}y[n-2]+...+a_{k}y[n-k]\right)\right) """ def __init__(self, order: int) -> None: self.order = order # a_{0} ... a_{k} self.a_coeffs = [1.0] + [0.0] * order # b_{0} ... b_{k} self.b_coeffs = [1.0] + [0.0] * order # x[n-1] ... x[n-k] self.input_history = [0.0] * self.order # y[n-1] ... y[n-k] self.output_history = [0.0] * self.order def set_coefficients(self, a_coeffs: list[float], b_coeffs: list[float]) -> None: """ Set the coefficients for the IIR filter. These should both be of size `order` + 1. :math:`a_0` may be left out, and it will use 1.0 as default value. This method works well with scipy's filter design functions >>> # Make a 2nd-order 1000Hz butterworth lowpass filter >>> import scipy.signal >>> b_coeffs, a_coeffs = scipy.signal.butter(2, 1000, ... btype='lowpass', ... fs=48000) >>> filt = IIRFilter(2) >>> filt.set_coefficients(a_coeffs, b_coeffs) """ if len(a_coeffs) < self.order: a_coeffs = [1.0, *a_coeffs] if len(a_coeffs) != self.order + 1: msg = ( f"Expected a_coeffs to have {self.order + 1} elements " f"for {self.order}-order filter, got {len(a_coeffs)}" ) raise ValueError(msg) if len(b_coeffs) != self.order + 1: msg = ( f"Expected b_coeffs to have {self.order + 1} elements " f"for {self.order}-order filter, got {len(a_coeffs)}" ) raise ValueError(msg) self.a_coeffs = a_coeffs self.b_coeffs = b_coeffs def process(self, sample: float) -> float: """ Calculate :math:`y[n]` >>> filt = IIRFilter(2) >>> filt.process(0) 0.0 """ result = 0.0 # Start at index 1 and do index 0 at the end. for i in range(1, self.order + 1): result += ( self.b_coeffs[i] * self.input_history[i - 1] - self.a_coeffs[i] * self.output_history[i - 1] ) result = (result + self.b_coeffs[0] * sample) / self.a_coeffs[0] self.input_history[1:] = self.input_history[:-1] self.output_history[1:] = self.output_history[:-1] self.input_history[0] = sample self.output_history[0] = result return result ================================================ FILE: audio_filters/loudness_curve.json ================================================ { "_comment": "The following is a representative average of the Equal Loudness Contours as measured by Robinson and Dadson, 1956", "_doi": "10.1088/0508-3443/7/5/302", "frequencies": [ 0, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1500, 2000, 2500, 3000, 3700, 4000, 5000, 6000, 7000, 8000, 9000, 10000, 12000, 15000, 20000 ], "gains": [ 120, 113, 103, 97, 93, 91, 89, 87, 86, 85, 78, 76, 76, 76, 76, 77, 78, 79.5, 80, 79, 77, 74, 71.5, 70, 70.5, 74, 79, 84, 86, 86, 85, 95, 110, 125 ] } ================================================ FILE: audio_filters/show_response.py ================================================ from __future__ import annotations from abc import abstractmethod from math import pi from typing import Protocol import matplotlib.pyplot as plt import numpy as np class FilterType(Protocol): @abstractmethod def process(self, sample: float) -> float: """ Calculate y[n] >>> issubclass(FilterType, Protocol) True """ def get_bounds( fft_results: np.ndarray, samplerate: int ) -> tuple[int | float, int | float]: """ Get bounds for printing fft results >>> import numpy >>> array = numpy.linspace(-20.0, 20.0, 1000) >>> get_bounds(array, 1000) (-20, 20) """ lowest = min([-20, np.min(fft_results[1 : samplerate // 2 - 1])]) highest = max([20, np.max(fft_results[1 : samplerate // 2 - 1])]) return lowest, highest def show_frequency_response(filter_type: FilterType, samplerate: int) -> None: """ Show frequency response of a filter >>> from audio_filters.iir_filter import IIRFilter >>> filt = IIRFilter(4) >>> show_frequency_response(filt, 48000) """ size = 512 inputs = [1] + [0] * (size - 1) outputs = [filter_type.process(item) for item in inputs] filler = [0] * (samplerate - size) # zero-padding outputs += filler fft_out = np.abs(np.fft.fft(outputs)) fft_db = 20 * np.log10(fft_out) # Frequencies on log scale from 24 to nyquist frequency plt.xlim(24, samplerate / 2 - 1) plt.xlabel("Frequency (Hz)") plt.xscale("log") # Display within reasonable bounds bounds = get_bounds(fft_db, samplerate) plt.ylim(max([-80, bounds[0]]), min([80, bounds[1]])) plt.ylabel("Gain (dB)") plt.plot(fft_db) plt.show() def show_phase_response(filter_type: FilterType, samplerate: int) -> None: """ Show phase response of a filter >>> from audio_filters.iir_filter import IIRFilter >>> filt = IIRFilter(4) >>> show_phase_response(filt, 48000) """ size = 512 inputs = [1] + [0] * (size - 1) outputs = [filter_type.process(item) for item in inputs] filler = [0] * (samplerate - size) # zero-padding outputs += filler fft_out = np.angle(np.fft.fft(outputs)) # Frequencies on log scale from 24 to nyquist frequency plt.xlim(24, samplerate / 2 - 1) plt.xlabel("Frequency (Hz)") plt.xscale("log") plt.ylim(-2 * pi, 2 * pi) plt.ylabel("Phase shift (Radians)") plt.plot(np.unwrap(fft_out, -2 * pi)) plt.show() ================================================ FILE: backtracking/README.md ================================================ # Backtracking Backtracking is a way to speed up the search process by removing candidates when they can't be the solution of a problem. * * * * ================================================ FILE: backtracking/__init__.py ================================================ ================================================ FILE: backtracking/all_combinations.py ================================================ """ In this problem, we want to determine all possible combinations of k numbers out of 1 ... n. We use backtracking to solve this problem. Time complexity: O(C(n,k)) which is O(n choose k) = O((n!/(k! * (n - k)!))), """ from __future__ import annotations from itertools import combinations def combination_lists(n: int, k: int) -> list[list[int]]: """ Generates all possible combinations of k numbers out of 1 ... n using itertools. >>> combination_lists(n=4, k=2) [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]] """ return [list(x) for x in combinations(range(1, n + 1), k)] def generate_all_combinations(n: int, k: int) -> list[list[int]]: """ Generates all possible combinations of k numbers out of 1 ... n using backtracking. >>> generate_all_combinations(n=4, k=2) [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]] >>> generate_all_combinations(n=0, k=0) [[]] >>> generate_all_combinations(n=10, k=-1) Traceback (most recent call last): ... ValueError: k must not be negative >>> generate_all_combinations(n=-1, k=10) Traceback (most recent call last): ... ValueError: n must not be negative >>> generate_all_combinations(n=5, k=4) [[1, 2, 3, 4], [1, 2, 3, 5], [1, 2, 4, 5], [1, 3, 4, 5], [2, 3, 4, 5]] >>> generate_all_combinations(n=3, k=3) [[1, 2, 3]] >>> generate_all_combinations(n=3, k=1) [[1], [2], [3]] >>> generate_all_combinations(n=1, k=0) [[]] >>> generate_all_combinations(n=1, k=1) [[1]] >>> from itertools import combinations >>> all(generate_all_combinations(n, k) == combination_lists(n, k) ... for n in range(1, 6) for k in range(1, 6)) True """ if k < 0: raise ValueError("k must not be negative") if n < 0: raise ValueError("n must not be negative") result: list[list[int]] = [] create_all_state(1, n, k, [], result) return result def create_all_state( increment: int, total_number: int, level: int, current_list: list[int], total_list: list[list[int]], ) -> None: """ Helper function to recursively build all combinations. >>> create_all_state(1, 4, 2, [], result := []) >>> result [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]] >>> create_all_state(1, 3, 3, [], result := []) >>> result [[1, 2, 3]] >>> create_all_state(2, 2, 1, [1], result := []) >>> result [[1, 2]] >>> create_all_state(1, 0, 0, [], result := []) >>> result [[]] >>> create_all_state(1, 4, 0, [1, 2], result := []) >>> result [[1, 2]] >>> create_all_state(5, 4, 2, [1, 2], result := []) >>> result [] """ if level == 0: total_list.append(current_list[:]) return for i in range(increment, total_number - level + 2): current_list.append(i) create_all_state(i + 1, total_number, level - 1, current_list, total_list) current_list.pop() if __name__ == "__main__": from doctest import testmod testmod() print(generate_all_combinations(n=4, k=2)) tests = ((n, k) for n in range(1, 5) for k in range(1, 5)) for n, k in tests: print(n, k, generate_all_combinations(n, k) == combination_lists(n, k)) print("Benchmark:") from timeit import timeit for func in ("combination_lists", "generate_all_combinations"): print(f"{func:>25}(): {timeit(f'{func}(n=4, k = 2)', globals=globals())}") ================================================ FILE: backtracking/all_permutations.py ================================================ """ In this problem, we want to determine all possible permutations of the given sequence. We use backtracking to solve this problem. Time complexity: O(n! * n), where n denotes the length of the given sequence. """ from __future__ import annotations def generate_all_permutations(sequence: list[int | str]) -> None: create_state_space_tree(sequence, [], 0, [0 for i in range(len(sequence))]) def create_state_space_tree( sequence: list[int | str], current_sequence: list[int | str], index: int, index_used: list[int], ) -> None: """ Creates a state space tree to iterate through each branch using DFS. We know that each state has exactly len(sequence) - index children. It terminates when it reaches the end of the given sequence. :param sequence: The input sequence for which permutations are generated. :param current_sequence: The current permutation being built. :param index: The current index in the sequence. :param index_used: list to track which elements are used in permutation. Example 1: >>> sequence = [1, 2, 3] >>> current_sequence = [] >>> index_used = [False, False, False] >>> create_state_space_tree(sequence, current_sequence, 0, index_used) [1, 2, 3] [1, 3, 2] [2, 1, 3] [2, 3, 1] [3, 1, 2] [3, 2, 1] Example 2: >>> sequence = ["A", "B", "C"] >>> current_sequence = [] >>> index_used = [False, False, False] >>> create_state_space_tree(sequence, current_sequence, 0, index_used) ['A', 'B', 'C'] ['A', 'C', 'B'] ['B', 'A', 'C'] ['B', 'C', 'A'] ['C', 'A', 'B'] ['C', 'B', 'A'] Example 3: >>> sequence = [1] >>> current_sequence = [] >>> index_used = [False] >>> create_state_space_tree(sequence, current_sequence, 0, index_used) [1] """ if index == len(sequence): print(current_sequence) return for i in range(len(sequence)): if not index_used[i]: current_sequence.append(sequence[i]) index_used[i] = True create_state_space_tree(sequence, current_sequence, index + 1, index_used) current_sequence.pop() index_used[i] = False """ remove the comment to take an input from the user print("Enter the elements") sequence = list(map(int, input().split())) """ sequence: list[int | str] = [3, 1, 2, 4] generate_all_permutations(sequence) sequence_2: list[int | str] = ["A", "B", "C"] generate_all_permutations(sequence_2) ================================================ FILE: backtracking/all_subsequences.py ================================================ """ In this problem, we want to determine all possible subsequences of the given sequence. We use backtracking to solve this problem. Time complexity: O(2^n), where n denotes the length of the given sequence. """ from __future__ import annotations from typing import Any def generate_all_subsequences(sequence: list[Any]) -> None: create_state_space_tree(sequence, [], 0) def create_state_space_tree( sequence: list[Any], current_subsequence: list[Any], index: int ) -> None: """ Creates a state space tree to iterate through each branch using DFS. We know that each state has exactly two children. It terminates when it reaches the end of the given sequence. :param sequence: The input sequence for which subsequences are generated. :param current_subsequence: The current subsequence being built. :param index: The current index in the sequence. Example: >>> sequence = [3, 2, 1] >>> current_subsequence = [] >>> create_state_space_tree(sequence, current_subsequence, 0) [] [1] [2] [2, 1] [3] [3, 1] [3, 2] [3, 2, 1] >>> sequence = ["A", "B"] >>> current_subsequence = [] >>> create_state_space_tree(sequence, current_subsequence, 0) [] ['B'] ['A'] ['A', 'B'] >>> sequence = [] >>> current_subsequence = [] >>> create_state_space_tree(sequence, current_subsequence, 0) [] >>> sequence = [1, 2, 3, 4] >>> current_subsequence = [] >>> create_state_space_tree(sequence, current_subsequence, 0) [] [4] [3] [3, 4] [2] [2, 4] [2, 3] [2, 3, 4] [1] [1, 4] [1, 3] [1, 3, 4] [1, 2] [1, 2, 4] [1, 2, 3] [1, 2, 3, 4] """ if index == len(sequence): print(current_subsequence) return create_state_space_tree(sequence, current_subsequence, index + 1) current_subsequence.append(sequence[index]) create_state_space_tree(sequence, current_subsequence, index + 1) current_subsequence.pop() if __name__ == "__main__": seq: list[Any] = [1, 2, 3] generate_all_subsequences(seq) seq.clear() seq.extend(["A", "B", "C"]) generate_all_subsequences(seq) ================================================ FILE: backtracking/coloring.py ================================================ """ Graph Coloring also called "m coloring problem" consists of coloring a given graph with at most m colors such that no adjacent vertices are assigned the same color Wikipedia: https://en.wikipedia.org/wiki/Graph_coloring """ def valid_coloring( neighbours: list[int], colored_vertices: list[int], color: int ) -> bool: """ For each neighbour check if the coloring constraint is satisfied If any of the neighbours fail the constraint return False If all neighbours validate the constraint return True >>> neighbours = [0,1,0,1,0] >>> colored_vertices = [0, 2, 1, 2, 0] >>> color = 1 >>> valid_coloring(neighbours, colored_vertices, color) True >>> color = 2 >>> valid_coloring(neighbours, colored_vertices, color) False """ # Does any neighbour not satisfy the constraints return not any( neighbour == 1 and colored_vertices[i] == color for i, neighbour in enumerate(neighbours) ) def util_color( graph: list[list[int]], max_colors: int, colored_vertices: list[int], index: int ) -> bool: """ Pseudo-Code Base Case: 1. Check if coloring is complete 1.1 If complete return True (meaning that we successfully colored the graph) Recursive Step: 2. Iterates over each color: Check if the current coloring is valid: 2.1. Color given vertex 2.2. Do recursive call, check if this coloring leads to a solution 2.4. if current coloring leads to a solution return 2.5. Uncolor given vertex >>> graph = [[0, 1, 0, 0, 0], ... [1, 0, 1, 0, 1], ... [0, 1, 0, 1, 0], ... [0, 1, 1, 0, 0], ... [0, 1, 0, 0, 0]] >>> max_colors = 3 >>> colored_vertices = [0, 1, 0, 0, 0] >>> index = 3 >>> util_color(graph, max_colors, colored_vertices, index) True >>> max_colors = 2 >>> util_color(graph, max_colors, colored_vertices, index) False """ # Base Case if index == len(graph): return True # Recursive Step for i in range(max_colors): if valid_coloring(graph[index], colored_vertices, i): # Color current vertex colored_vertices[index] = i # Validate coloring if util_color(graph, max_colors, colored_vertices, index + 1): return True # Backtrack colored_vertices[index] = -1 return False def color(graph: list[list[int]], max_colors: int) -> list[int]: """ Wrapper function to call subroutine called util_color which will either return True or False. If True is returned colored_vertices list is filled with correct colorings >>> graph = [[0, 1, 0, 0, 0], ... [1, 0, 1, 0, 1], ... [0, 1, 0, 1, 0], ... [0, 1, 1, 0, 0], ... [0, 1, 0, 0, 0]] >>> max_colors = 3 >>> color(graph, max_colors) [0, 1, 0, 2, 0] >>> max_colors = 2 >>> color(graph, max_colors) [] >>> color([], 2) # empty graph [] >>> color([[0]], 1) # single node, 1 color [0] >>> color([[0, 1], [1, 0]], 1) # 2 nodes, 1 color (impossible) [] >>> color([[0, 1], [1, 0]], 2) # 2 nodes, 2 colors (possible) [0, 1] """ colored_vertices = [-1] * len(graph) if util_color(graph, max_colors, colored_vertices, 0): return colored_vertices return [] ================================================ FILE: backtracking/combination_sum.py ================================================ """ In the Combination Sum problem, we are given a list consisting of distinct integers. We need to find all the combinations whose sum equals to target given. We can use an element more than one. Time complexity(Average Case): O(n!) Constraints: 1 <= candidates.length <= 30 2 <= candidates[i] <= 40 All elements of candidates are distinct. 1 <= target <= 40 """ def backtrack( candidates: list, path: list, answer: list, target: int, previous_index: int ) -> None: """ A recursive function that searches for possible combinations. Backtracks in case of a bigger current combination value than the target value. Parameters ---------- previous_index: Last index from the previous search target: The value we need to obtain by summing our integers in the path list. answer: A list of possible combinations path: Current combination candidates: A list of integers we can use. """ if target == 0: answer.append(path.copy()) else: for index in range(previous_index, len(candidates)): if target >= candidates[index]: path.append(candidates[index]) backtrack(candidates, path, answer, target - candidates[index], index) path.pop(len(path) - 1) def combination_sum(candidates: list, target: int) -> list: """ >>> combination_sum([2, 3, 5], 8) [[2, 2, 2, 2], [2, 3, 3], [3, 5]] >>> combination_sum([2, 3, 6, 7], 7) [[2, 2, 3], [7]] >>> combination_sum([-8, 2.3, 0], 1) Traceback (most recent call last): ... ValueError: All elements in candidates must be non-negative >>> combination_sum([], 1) Traceback (most recent call last): ... ValueError: Candidates list should not be empty """ if not candidates: raise ValueError("Candidates list should not be empty") if any(x < 0 for x in candidates): raise ValueError("All elements in candidates must be non-negative") path = [] # type: list[int] answer = [] # type: list[int] backtrack(candidates, path, answer, target, 0) return answer def main() -> None: print(combination_sum([-8, 2.3, 0], 1)) if __name__ == "__main__": import doctest doctest.testmod() main() ================================================ FILE: backtracking/crossword_puzzle_solver.py ================================================ # https://www.geeksforgeeks.org/solve-crossword-puzzle/ def is_valid( puzzle: list[list[str]], word: str, row: int, col: int, vertical: bool ) -> bool: """ Check if a word can be placed at the given position. >>> puzzle = [ ... ['', '', '', ''], ... ['', '', '', ''], ... ['', '', '', ''], ... ['', '', '', ''] ... ] >>> is_valid(puzzle, 'word', 0, 0, True) True >>> puzzle = [ ... ['', '', '', ''], ... ['', '', '', ''], ... ['', '', '', ''], ... ['', '', '', ''] ... ] >>> is_valid(puzzle, 'word', 0, 0, False) True """ for i in range(len(word)): if vertical: if row + i >= len(puzzle) or puzzle[row + i][col] != "": return False elif col + i >= len(puzzle[0]) or puzzle[row][col + i] != "": return False return True def place_word( puzzle: list[list[str]], word: str, row: int, col: int, vertical: bool ) -> None: """ Place a word at the given position. >>> puzzle = [ ... ['', '', '', ''], ... ['', '', '', ''], ... ['', '', '', ''], ... ['', '', '', ''] ... ] >>> place_word(puzzle, 'word', 0, 0, True) >>> puzzle [['w', '', '', ''], ['o', '', '', ''], ['r', '', '', ''], ['d', '', '', '']] """ for i, char in enumerate(word): if vertical: puzzle[row + i][col] = char else: puzzle[row][col + i] = char def remove_word( puzzle: list[list[str]], word: str, row: int, col: int, vertical: bool ) -> None: """ Remove a word from the given position. >>> puzzle = [ ... ['w', '', '', ''], ... ['o', '', '', ''], ... ['r', '', '', ''], ... ['d', '', '', ''] ... ] >>> remove_word(puzzle, 'word', 0, 0, True) >>> puzzle [['', '', '', ''], ['', '', '', ''], ['', '', '', ''], ['', '', '', '']] """ for i in range(len(word)): if vertical: puzzle[row + i][col] = "" else: puzzle[row][col + i] = "" def solve_crossword(puzzle: list[list[str]], words: list[str]) -> bool: """ Solve the crossword puzzle using backtracking. >>> puzzle = [ ... ['', '', '', ''], ... ['', '', '', ''], ... ['', '', '', ''], ... ['', '', '', ''] ... ] >>> words = ['word', 'four', 'more', 'last'] >>> solve_crossword(puzzle, words) True >>> puzzle = [ ... ['', '', '', ''], ... ['', '', '', ''], ... ['', '', '', ''], ... ['', '', '', ''] ... ] >>> words = ['word', 'four', 'more', 'paragraphs'] >>> solve_crossword(puzzle, words) False """ for row in range(len(puzzle)): for col in range(len(puzzle[0])): if puzzle[row][col] == "": for word in words: for vertical in [True, False]: if is_valid(puzzle, word, row, col, vertical): place_word(puzzle, word, row, col, vertical) words.remove(word) if solve_crossword(puzzle, words): return True words.append(word) remove_word(puzzle, word, row, col, vertical) return False return True if __name__ == "__main__": PUZZLE = [[""] * 3 for _ in range(3)] WORDS = ["cat", "dog", "car"] if solve_crossword(PUZZLE, WORDS): print("Solution found:") for row in PUZZLE: print(" ".join(row)) else: print("No solution found:") ================================================ FILE: backtracking/generate_parentheses.py ================================================ """ author: Aayush Soni Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. Input: n = 2 Output: ["(())","()()"] Leetcode link: https://leetcode.com/problems/generate-parentheses/description/ """ def backtrack( partial: str, open_count: int, close_count: int, n: int, result: list[str] ) -> None: """ Generate valid combinations of balanced parentheses using recursion. :param partial: A string representing the current combination. :param open_count: An integer representing the count of open parentheses. :param close_count: An integer representing the count of close parentheses. :param n: An integer representing the total number of pairs. :param result: A list to store valid combinations. :return: None This function uses recursion to explore all possible combinations, ensuring that at each step, the parentheses remain balanced. Example: >>> result = [] >>> backtrack("", 0, 0, 2, result) >>> result ['(())', '()()'] """ if len(partial) == 2 * n: # When the combination is complete, add it to the result. result.append(partial) return if open_count < n: # If we can add an open parenthesis, do so, and recurse. backtrack(partial + "(", open_count + 1, close_count, n, result) if close_count < open_count: # If we can add a close parenthesis (it won't make the combination invalid), # do so, and recurse. backtrack(partial + ")", open_count, close_count + 1, n, result) def generate_parenthesis(n: int) -> list[str]: """ Generate valid combinations of balanced parentheses for a given n. :param n: An integer representing the number of pairs of parentheses. :return: A list of strings with valid combinations. This function uses a recursive approach to generate the combinations. Time Complexity: O(2^(2n)) - In the worst case, we have 2^(2n) combinations. Space Complexity: O(n) - where 'n' is the number of pairs. Example 1: >>> generate_parenthesis(3) ['((()))', '(()())', '(())()', '()(())', '()()()'] Example 2: >>> generate_parenthesis(1) ['()'] Example 3: >>> generate_parenthesis(0) [''] """ result: list[str] = [] backtrack("", 0, 0, n, result) return result if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: backtracking/generate_parentheses_iterative.py ================================================ def generate_parentheses_iterative(length: int) -> list[str]: """ Generate all valid combinations of parentheses (Iterative Approach). The algorithm works as follows: 1. Initialize an empty list to store the combinations. 2. Initialize a stack to keep track of partial combinations. 3. Start with empty string and push it on stack along with the counts of '(' and ')'. 4. While the stack is not empty: a. Pop a partial combination and its open and close counts from the stack. b. If the combination length is equal to 2*length, add it to the result. c. If open count < length, push new combination with added '(' on stack. d. If close count < open count, push new combination with added ')' on stack. 5. Return the result containing all valid combinations. Args: length: The desired length of the parentheses combinations Returns: A list of strings representing valid combinations of parentheses Time Complexity: O(2^(2*length)) Space Complexity: O(2^(2*length)) >>> generate_parentheses_iterative(3) ['()()()', '()(())', '(())()', '(()())', '((()))'] >>> generate_parentheses_iterative(2) ['()()', '(())'] >>> generate_parentheses_iterative(1) ['()'] >>> generate_parentheses_iterative(0) [''] """ if length == 0: return [""] result: list[str] = [] stack: list[tuple[str, int, int]] = [] # Each element in stack is a tuple (current_combination, open_count, close_count) stack.append(("", 0, 0)) while stack: current_combination, open_count, close_count = stack.pop() if len(current_combination) == 2 * length: result.append(current_combination) continue if open_count < length: stack.append((current_combination + "(", open_count + 1, close_count)) if close_count < open_count: stack.append((current_combination + ")", open_count, close_count + 1)) return result if __name__ == "__main__": import doctest doctest.testmod() print(generate_parentheses_iterative(3)) ================================================ FILE: backtracking/hamiltonian_cycle.py ================================================ """ A Hamiltonian cycle (Hamiltonian circuit) is a graph cycle through a graph that visits each node exactly once. Determining whether such paths and cycles exist in graphs is the 'Hamiltonian path problem', which is NP-complete. Wikipedia: https://en.wikipedia.org/wiki/Hamiltonian_path """ def valid_connection( graph: list[list[int]], next_ver: int, curr_ind: int, path: list[int] ) -> bool: """ Checks whether it is possible to add next into path by validating 2 statements 1. There should be path between current and next vertex 2. Next vertex should not be in path If both validations succeed we return True, saying that it is possible to connect this vertices, otherwise we return False Case 1:Use exact graph as in main function, with initialized values >>> graph = [[0, 1, 0, 1, 0], ... [1, 0, 1, 1, 1], ... [0, 1, 0, 0, 1], ... [1, 1, 0, 0, 1], ... [0, 1, 1, 1, 0]] >>> path = [0, -1, -1, -1, -1, 0] >>> curr_ind = 1 >>> next_ver = 1 >>> valid_connection(graph, next_ver, curr_ind, path) True Case 2: Same graph, but trying to connect to node that is already in path >>> path = [0, 1, 2, 4, -1, 0] >>> curr_ind = 4 >>> next_ver = 1 >>> valid_connection(graph, next_ver, curr_ind, path) False """ # 1. Validate that path exists between current and next vertices if graph[path[curr_ind - 1]][next_ver] == 0: return False # 2. Validate that next vertex is not already in path return not any(vertex == next_ver for vertex in path) def util_hamilton_cycle(graph: list[list[int]], path: list[int], curr_ind: int) -> bool: """ Pseudo-Code Base Case: 1. Check if we visited all of vertices 1.1 If last visited vertex has path to starting vertex return True either return False Recursive Step: 2. Iterate over each vertex Check if next vertex is valid for transiting from current vertex 2.1 Remember next vertex as next transition 2.2 Do recursive call and check if going to this vertex solves problem 2.3 If next vertex leads to solution return True 2.4 Else backtrack, delete remembered vertex Case 1: Use exact graph as in main function, with initialized values >>> graph = [[0, 1, 0, 1, 0], ... [1, 0, 1, 1, 1], ... [0, 1, 0, 0, 1], ... [1, 1, 0, 0, 1], ... [0, 1, 1, 1, 0]] >>> path = [0, -1, -1, -1, -1, 0] >>> curr_ind = 1 >>> util_hamilton_cycle(graph, path, curr_ind) True >>> path [0, 1, 2, 4, 3, 0] Case 2: Use exact graph as in previous case, but in the properties taken from middle of calculation >>> graph = [[0, 1, 0, 1, 0], ... [1, 0, 1, 1, 1], ... [0, 1, 0, 0, 1], ... [1, 1, 0, 0, 1], ... [0, 1, 1, 1, 0]] >>> path = [0, 1, 2, -1, -1, 0] >>> curr_ind = 3 >>> util_hamilton_cycle(graph, path, curr_ind) True >>> path [0, 1, 2, 4, 3, 0] """ # Base Case if curr_ind == len(graph): # return whether path exists between current and starting vertices return graph[path[curr_ind - 1]][path[0]] == 1 # Recursive Step for next_ver in range(len(graph)): if valid_connection(graph, next_ver, curr_ind, path): # Insert current vertex into path as next transition path[curr_ind] = next_ver # Validate created path if util_hamilton_cycle(graph, path, curr_ind + 1): return True # Backtrack path[curr_ind] = -1 return False def hamilton_cycle(graph: list[list[int]], start_index: int = 0) -> list[int]: r""" Wrapper function to call subroutine called util_hamilton_cycle, which will either return array of vertices indicating hamiltonian cycle or an empty list indicating that hamiltonian cycle was not found. Case 1: Following graph consists of 5 edges. If we look closely, we can see that there are multiple Hamiltonian cycles. For example one result is when we iterate like: (0)->(1)->(2)->(4)->(3)->(0) (0)---(1)---(2) | / \ | | / \ | | / \ | |/ \| (3)---------(4) >>> graph = [[0, 1, 0, 1, 0], ... [1, 0, 1, 1, 1], ... [0, 1, 0, 0, 1], ... [1, 1, 0, 0, 1], ... [0, 1, 1, 1, 0]] >>> hamilton_cycle(graph) [0, 1, 2, 4, 3, 0] Case 2: Same Graph as it was in Case 1, changed starting index from default to 3 (0)---(1)---(2) | / \ | | / \ | | / \ | |/ \| (3)---------(4) >>> graph = [[0, 1, 0, 1, 0], ... [1, 0, 1, 1, 1], ... [0, 1, 0, 0, 1], ... [1, 1, 0, 0, 1], ... [0, 1, 1, 1, 0]] >>> hamilton_cycle(graph, 3) [3, 0, 1, 2, 4, 3] Case 3: Following Graph is exactly what it was before, but edge 3-4 is removed. Result is that there is no Hamiltonian Cycle anymore. (0)---(1)---(2) | / \ | | / \ | | / \ | |/ \| (3) (4) >>> graph = [[0, 1, 0, 1, 0], ... [1, 0, 1, 1, 1], ... [0, 1, 0, 0, 1], ... [1, 1, 0, 0, 0], ... [0, 1, 1, 0, 0]] >>> hamilton_cycle(graph,4) [] """ # Initialize path with -1, indicating that we have not visited them yet path = [-1] * (len(graph) + 1) # initialize start and end of path with starting index path[0] = path[-1] = start_index # evaluate and if we find answer return path either return empty array return path if util_hamilton_cycle(graph, path, 1) else [] ================================================ FILE: backtracking/knight_tour.py ================================================ # Knight Tour Intro: https://www.youtube.com/watch?v=ab_dY3dZFHM from __future__ import annotations def get_valid_pos(position: tuple[int, int], n: int) -> list[tuple[int, int]]: """ Find all the valid positions a knight can move to from the current position. >>> get_valid_pos((1, 3), 4) [(2, 1), (0, 1), (3, 2)] """ y, x = position positions = [ (y + 1, x + 2), (y - 1, x + 2), (y + 1, x - 2), (y - 1, x - 2), (y + 2, x + 1), (y + 2, x - 1), (y - 2, x + 1), (y - 2, x - 1), ] permissible_positions = [] for inner_position in positions: y_test, x_test = inner_position if 0 <= y_test < n and 0 <= x_test < n: permissible_positions.append(inner_position) return permissible_positions def is_complete(board: list[list[int]]) -> bool: """ Check if the board (matrix) has been completely filled with non-zero values. >>> is_complete([[1]]) True >>> is_complete([[1, 2], [3, 0]]) False """ return not any(elem == 0 for row in board for elem in row) def open_knight_tour_helper( board: list[list[int]], pos: tuple[int, int], curr: int ) -> bool: """ Helper function to solve knight tour problem. """ if is_complete(board): return True for position in get_valid_pos(pos, len(board)): y, x = position if board[y][x] == 0: board[y][x] = curr + 1 if open_knight_tour_helper(board, position, curr + 1): return True board[y][x] = 0 return False def open_knight_tour(n: int) -> list[list[int]]: """ Find the solution for the knight tour problem for a board of size n. Raises ValueError if the tour cannot be performed for the given size. >>> open_knight_tour(1) [[1]] >>> open_knight_tour(2) Traceback (most recent call last): ... ValueError: Open Knight Tour cannot be performed on a board of size 2 """ board = [[0 for i in range(n)] for j in range(n)] for i in range(n): for j in range(n): board[i][j] = 1 if open_knight_tour_helper(board, (i, j), 1): return board board[i][j] = 0 msg = f"Open Knight Tour cannot be performed on a board of size {n}" raise ValueError(msg) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: backtracking/match_word_pattern.py ================================================ def match_word_pattern(pattern: str, input_string: str) -> bool: """ Determine if a given pattern matches a string using backtracking. pattern: The pattern to match. input_string: The string to match against the pattern. return: True if the pattern matches the string, False otherwise. >>> match_word_pattern("aba", "GraphTreesGraph") True >>> match_word_pattern("xyx", "PythonRubyPython") True >>> match_word_pattern("GG", "PythonJavaPython") False """ def backtrack(pattern_index: int, str_index: int) -> bool: """ >>> backtrack(0, 0) True >>> backtrack(0, 1) True >>> backtrack(0, 4) False """ if pattern_index == len(pattern) and str_index == len(input_string): return True if pattern_index == len(pattern) or str_index == len(input_string): return False char = pattern[pattern_index] if char in pattern_map: mapped_str = pattern_map[char] if input_string.startswith(mapped_str, str_index): return backtrack(pattern_index + 1, str_index + len(mapped_str)) else: return False for end in range(str_index + 1, len(input_string) + 1): substr = input_string[str_index:end] if substr in str_map: continue pattern_map[char] = substr str_map[substr] = char if backtrack(pattern_index + 1, end): return True del pattern_map[char] del str_map[substr] return False pattern_map: dict[str, str] = {} str_map: dict[str, str] = {} return backtrack(0, 0) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: backtracking/minimax.py ================================================ """ Minimax helps to achieve maximum score in a game by checking all possible moves depth is current depth in game tree. nodeIndex is index of current node in scores[]. if move is of maximizer return true else false leaves of game tree is stored in scores[] height is maximum height of Game tree """ from __future__ import annotations import math def minimax( depth: int, node_index: int, is_max: bool, scores: list[int], height: float ) -> int: """ This function implements the minimax algorithm, which helps achieve the optimal score for a player in a two-player game by checking all possible moves. If the player is the maximizer, then the score is maximized. If the player is the minimizer, then the score is minimized. Parameters: - depth: Current depth in the game tree. - node_index: Index of the current node in the scores list. - is_max: A boolean indicating whether the current move is for the maximizer (True) or minimizer (False). - scores: A list containing the scores of the leaves of the game tree. - height: The maximum height of the game tree. Returns: - An integer representing the optimal score for the current player. >>> import math >>> scores = [90, 23, 6, 33, 21, 65, 123, 34423] >>> height = math.log(len(scores), 2) >>> minimax(0, 0, True, scores, height) 65 >>> minimax(-1, 0, True, scores, height) Traceback (most recent call last): ... ValueError: Depth cannot be less than 0 >>> minimax(0, 0, True, [], 2) Traceback (most recent call last): ... ValueError: Scores cannot be empty >>> scores = [3, 5, 2, 9, 12, 5, 23, 23] >>> height = math.log(len(scores), 2) >>> minimax(0, 0, True, scores, height) 12 """ if depth < 0: raise ValueError("Depth cannot be less than 0") if len(scores) == 0: raise ValueError("Scores cannot be empty") # Base case: If the current depth equals the height of the tree, # return the score of the current node. if depth == height: return scores[node_index] # If it's the maximizer's turn, choose the maximum score # between the two possible moves. if is_max: return max( minimax(depth + 1, node_index * 2, False, scores, height), minimax(depth + 1, node_index * 2 + 1, False, scores, height), ) # If it's the minimizer's turn, choose the minimum score # between the two possible moves. return min( minimax(depth + 1, node_index * 2, True, scores, height), minimax(depth + 1, node_index * 2 + 1, True, scores, height), ) def main() -> None: # Sample scores and height calculation scores = [90, 23, 6, 33, 21, 65, 123, 34423] height = math.log(len(scores), 2) # Calculate and print the optimal value using the minimax algorithm print("Optimal value : ", end="") print(minimax(0, 0, True, scores, height)) if __name__ == "__main__": import doctest doctest.testmod() main() ================================================ FILE: backtracking/n_queens.py ================================================ """ The nqueens problem is of placing N queens on a N * N chess board such that no queen can attack any other queens placed on that chess board. This means that one queen cannot have any other queen on its horizontal, vertical and diagonal lines. """ from __future__ import annotations solution = [] def is_safe(board: list[list[int]], row: int, column: int) -> bool: """ This function returns a boolean value True if it is safe to place a queen there considering the current state of the board. Parameters: board (2D matrix): The chessboard row, column: Coordinates of the cell on the board Returns: Boolean Value >>> is_safe([[0, 0, 0], [0, 0, 0], [0, 0, 0]], 1, 1) True >>> is_safe([[0, 1, 0], [0, 0, 0], [0, 0, 0]], 1, 1) False >>> is_safe([[1, 0, 0], [0, 0, 0], [0, 0, 0]], 1, 1) False >>> is_safe([[0, 0, 1], [0, 0, 0], [0, 0, 0]], 1, 1) False >>> is_safe([[1, 0, 0], [0, 0, 0], [0, 0, 0]], 1, 2) True >>> is_safe([[1, 0, 0], [0, 0, 0], [0, 0, 0]], 2, 1) True >>> is_safe([[0, 0, 0], [1, 0, 0], [0, 0, 0]], 0, 2) True >>> is_safe([[0, 0, 0], [1, 0, 0], [0, 0, 0]], 2, 2) True """ n = len(board) # Size of the board # Check if there is any queen in the same upper column, # left upper diagonal and right upper diagonal return ( all(board[i][j] != 1 for i, j in zip(range(row), [column] * row)) and all( board[i][j] != 1 for i, j in zip(range(row - 1, -1, -1), range(column - 1, -1, -1)) ) and all( board[i][j] != 1 for i, j in zip(range(row - 1, -1, -1), range(column + 1, n)) ) ) def solve(board: list[list[int]], row: int) -> bool: """ This function creates a state space tree and calls the safe function until it receives a False Boolean and terminates that branch and backtracks to the next possible solution branch. """ if row >= len(board): """ If the row number exceeds N, we have a board with a successful combination and that combination is appended to the solution list and the board is printed. """ solution.append(board) printboard(board) print() return True for i in range(len(board)): """ For every row, it iterates through each column to check if it is feasible to place a queen there. If all the combinations for that particular branch are successful, the board is reinitialized for the next possible combination. """ if is_safe(board, row, i): board[row][i] = 1 solve(board, row + 1) board[row][i] = 0 return False def printboard(board: list[list[int]]) -> None: """ Prints the boards that have a successful combination. """ for i in range(len(board)): for j in range(len(board)): if board[i][j] == 1: print("Q", end=" ") # Queen is present else: print(".", end=" ") # Empty cell print() # Number of queens (e.g., n=8 for an 8x8 board) n = 8 board = [[0 for i in range(n)] for j in range(n)] solve(board, 0) print("The total number of solutions are:", len(solution)) ================================================ FILE: backtracking/n_queens_math.py ================================================ r""" Problem: The n queens problem is: placing N queens on a N * N chess board such that no queen can attack any other queens placed on that chess board. This means that one queen cannot have any other queen on its horizontal, vertical and diagonal lines. Solution: To solve this problem we will use simple math. First we know the queen can move in all the possible ways, we can simplify it in this: vertical, horizontal, diagonal left and diagonal right. We can visualize it like this: left diagonal = \ right diagonal = / On a chessboard vertical movement could be the rows and horizontal movement could be the columns. In programming we can use an array, and in this array each index could be the rows and each value in the array could be the column. For example: . Q . . We have this chessboard with one queen in each column and each queen . . . Q can't attack to each other. Q . . . The array for this example would look like this: [1, 3, 0, 2] . . Q . So if we use an array and we verify that each value in the array is different to each other we know that at least the queens can't attack each other in horizontal and vertical. At this point we have it halfway completed and we will treat the chessboard as a Cartesian plane. Hereinafter we are going to remember basic math, so in the school we learned this formula: Slope of a line: y2 - y1 m = ---------- x2 - x1 This formula allow us to get the slope. For the angles 45º (right diagonal) and 135º (left diagonal) this formula gives us m = 1, and m = -1 respectively. See:: https://www.enotes.com/homework-help/write-equation-line-that-hits-origin-45-degree-1474860 Then we have this other formula: Slope intercept: y = mx + b b is where the line crosses the Y axis (to get more information see: https://www.mathsisfun.com/y_intercept.html), if we change the formula to solve for b we would have: y - mx = b And since we already have the m values for the angles 45º and 135º, this formula would look like this: 45º: y - (1)x = b 45º: y - x = b 135º: y - (-1)x = b 135º: y + x = b y = row x = column Applying these two formulas we can check if a queen in some position is being attacked for another one or vice versa. """ from __future__ import annotations def depth_first_search( possible_board: list[int], diagonal_right_collisions: list[int], diagonal_left_collisions: list[int], boards: list[list[str]], n: int, ) -> None: """ >>> boards = [] >>> depth_first_search([], [], [], boards, 4) >>> for board in boards: ... print(board) ['. Q . . ', '. . . Q ', 'Q . . . ', '. . Q . '] ['. . Q . ', 'Q . . . ', '. . . Q ', '. Q . . '] """ # Get next row in the current board (possible_board) to fill it with a queen row = len(possible_board) # If row is equal to the size of the board it means there are a queen in each row in # the current board (possible_board) if row == n: # We convert the variable possible_board that looks like this: [1, 3, 0, 2] to # this: ['. Q . . ', '. . . Q ', 'Q . . . ', '. . Q . '] boards.append([". " * i + "Q " + ". " * (n - 1 - i) for i in possible_board]) return # We iterate each column in the row to find all possible results in each row for col in range(n): # We apply that we learned previously. First we check that in the current board # (possible_board) there are not other same value because if there is it means # that there are a collision in vertical. Then we apply the two formulas we # learned before: # # 45º: y - x = b or 45: row - col = b # 135º: y + x = b or row + col = b. # # And we verify if the results of this two formulas not exist in their variables # respectively. (diagonal_right_collisions, diagonal_left_collisions) # # If any or these are True it means there is a collision so we continue to the # next value in the for loop. if ( col in possible_board or row - col in diagonal_right_collisions or row + col in diagonal_left_collisions ): continue # If it is False we call dfs function again and we update the inputs depth_first_search( [*possible_board, col], [*diagonal_right_collisions, row - col], [*diagonal_left_collisions, row + col], boards, n, ) def n_queens_solution(n: int) -> None: boards: list[list[str]] = [] depth_first_search([], [], [], boards, n) # Print all the boards for board in boards: for column in board: print(column) print("") print(len(boards), "solutions were found.") if __name__ == "__main__": import doctest doctest.testmod() n_queens_solution(4) ================================================ FILE: backtracking/power_sum.py ================================================ """ Problem source: https://www.hackerrank.com/challenges/the-power-sum/problem Find the number of ways that a given integer X, can be expressed as the sum of the Nth powers of unique, natural numbers. For example, if X=13 and N=2. We have to find all combinations of unique squares adding up to 13. The only solution is 2^2+3^2. Constraints: 1<=X<=1000, 2<=N<=10. """ def backtrack( needed_sum: int, power: int, current_number: int, current_sum: int, solutions_count: int, ) -> tuple[int, int]: """ >>> backtrack(13, 2, 1, 0, 0) (0, 1) >>> backtrack(10, 2, 1, 0, 0) (0, 1) >>> backtrack(10, 3, 1, 0, 0) (0, 0) >>> backtrack(20, 2, 1, 0, 0) (0, 1) >>> backtrack(15, 10, 1, 0, 0) (0, 0) >>> backtrack(16, 2, 1, 0, 0) (0, 1) >>> backtrack(20, 1, 1, 0, 0) (0, 64) """ if current_sum == needed_sum: # If the sum of the powers is equal to needed_sum, then we have a solution. solutions_count += 1 return current_sum, solutions_count i_to_n = current_number**power if current_sum + i_to_n <= needed_sum: # If the sum of the powers is less than needed_sum, then continue adding powers. current_sum += i_to_n current_sum, solutions_count = backtrack( needed_sum, power, current_number + 1, current_sum, solutions_count ) current_sum -= i_to_n if i_to_n < needed_sum: # If the power of i is less than needed_sum, then try with the next power. current_sum, solutions_count = backtrack( needed_sum, power, current_number + 1, current_sum, solutions_count ) return current_sum, solutions_count def solve(needed_sum: int, power: int) -> int: """ >>> solve(13, 2) 1 >>> solve(10, 2) 1 >>> solve(10, 3) 0 >>> solve(20, 2) 1 >>> solve(15, 10) 0 >>> solve(16, 2) 1 >>> solve(20, 1) Traceback (most recent call last): ... ValueError: Invalid input needed_sum must be between 1 and 1000, power between 2 and 10. >>> solve(-10, 5) Traceback (most recent call last): ... ValueError: Invalid input needed_sum must be between 1 and 1000, power between 2 and 10. """ if not (1 <= needed_sum <= 1000 and 2 <= power <= 10): raise ValueError( "Invalid input\n" "needed_sum must be between 1 and 1000, power between 2 and 10." ) return backtrack(needed_sum, power, 1, 0, 0)[1] # Return the solutions_count if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: backtracking/rat_in_maze.py ================================================ from __future__ import annotations def solve_maze( maze: list[list[int]], source_row: int, source_column: int, destination_row: int, destination_column: int, ) -> list[list[int]]: """ This method solves the "rat in maze" problem. Parameters : - maze: A two dimensional matrix of zeros and ones. - source_row: The row index of the starting point. - source_column: The column index of the starting point. - destination_row: The row index of the destination point. - destination_column: The column index of the destination point. Returns: - solution: A 2D matrix representing the solution path if it exists. Raises: - ValueError: If no solution exists or if the source or destination coordinates are invalid. Description: This method navigates through a maze represented as an n by n matrix, starting from a specified source cell and aiming to reach a destination cell. The maze consists of walls (1s) and open paths (0s). By providing custom row and column values, the source and destination cells can be adjusted. >>> maze = [[0, 1, 0, 1, 1], ... [0, 0, 0, 0, 0], ... [1, 0, 1, 0, 1], ... [0, 0, 1, 0, 0], ... [1, 0, 0, 1, 0]] >>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1) # doctest: +NORMALIZE_WHITESPACE [[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0]] Note: In the output maze, the zeros (0s) represent one of the possible paths from the source to the destination. >>> maze = [[0, 1, 0, 1, 1], ... [0, 0, 0, 0, 0], ... [0, 0, 0, 0, 1], ... [0, 0, 0, 0, 0], ... [0, 0, 0, 0, 0]] >>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1) # doctest: +NORMALIZE_WHITESPACE [[0, 1, 1, 1, 1], [0, 1, 1, 1, 1], [0, 1, 1, 1, 1], [0, 1, 1, 1, 1], [0, 0, 0, 0, 0]] >>> maze = [[0, 0, 0], ... [0, 1, 0], ... [1, 0, 0]] >>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1) # doctest: +NORMALIZE_WHITESPACE [[0, 0, 0], [1, 1, 0], [1, 1, 0]] >>> maze = [[1, 0, 0], ... [0, 1, 0], ... [1, 0, 0]] >>> solve_maze(maze,0,1,len(maze)-1,len(maze)-1) # doctest: +NORMALIZE_WHITESPACE [[1, 0, 0], [1, 1, 0], [1, 1, 0]] >>> maze = [[1, 1, 0, 0, 1, 0, 0, 1], ... [1, 0, 1, 0, 0, 1, 1, 1], ... [0, 1, 0, 1, 0, 0, 1, 0], ... [1, 1, 1, 0, 0, 1, 0, 1], ... [0, 1, 0, 0, 1, 0, 1, 1], ... [0, 0, 0, 1, 1, 1, 0, 1], ... [0, 1, 0, 1, 0, 1, 1, 1], ... [1, 1, 0, 0, 0, 0, 0, 1]] >>> solve_maze(maze,0,2,len(maze)-1,2) # doctest: +NORMALIZE_WHITESPACE [[1, 1, 0, 0, 1, 1, 1, 1], [1, 1, 1, 0, 0, 1, 1, 1], [1, 1, 1, 1, 0, 1, 1, 1], [1, 1, 1, 0, 0, 1, 1, 1], [1, 1, 0, 0, 1, 1, 1, 1], [1, 1, 0, 1, 1, 1, 1, 1], [1, 1, 0, 1, 1, 1, 1, 1], [1, 1, 0, 1, 1, 1, 1, 1]] >>> maze = [[1, 0, 0], ... [0, 1, 1], ... [1, 0, 1]] >>> solve_maze(maze,0,1,len(maze)-1,len(maze)-1) Traceback (most recent call last): ... ValueError: No solution exists! >>> maze = [[0, 0], ... [1, 1]] >>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1) Traceback (most recent call last): ... ValueError: No solution exists! >>> maze = [[0, 1], ... [1, 0]] >>> solve_maze(maze,2,0,len(maze)-1,len(maze)-1) Traceback (most recent call last): ... ValueError: Invalid source or destination coordinates >>> maze = [[1, 0, 0], ... [0, 1, 0], ... [1, 0, 0]] >>> solve_maze(maze,0,1,len(maze),len(maze)-1) Traceback (most recent call last): ... ValueError: Invalid source or destination coordinates """ size = len(maze) # Check if source and destination coordinates are Invalid. if not (0 <= source_row <= size - 1 and 0 <= source_column <= size - 1) or ( not (0 <= destination_row <= size - 1 and 0 <= destination_column <= size - 1) ): raise ValueError("Invalid source or destination coordinates") # We need to create solution object to save path. solutions = [[1 for _ in range(size)] for _ in range(size)] solved = run_maze( maze, source_row, source_column, destination_row, destination_column, solutions ) if solved: return solutions else: raise ValueError("No solution exists!") def run_maze( maze: list[list[int]], i: int, j: int, destination_row: int, destination_column: int, solutions: list[list[int]], ) -> bool: """ This method is recursive starting from (i, j) and going in one of four directions: up, down, left, right. If a path is found to destination it returns True otherwise it returns False. Parameters maze: A two dimensional matrix of zeros and ones. i, j : coordinates of matrix solutions: A two dimensional matrix of solutions. Returns: Boolean if path is found True, Otherwise False. """ size = len(maze) # Final check point. if i == destination_row and j == destination_column and maze[i][j] == 0: solutions[i][j] = 0 return True lower_flag = (not i < 0) and (not j < 0) # Check lower bounds upper_flag = (i < size) and (j < size) # Check upper bounds if lower_flag and upper_flag: # check for already visited and block points. block_flag = (solutions[i][j]) and (not maze[i][j]) if block_flag: # check visited solutions[i][j] = 0 # check for directions if ( run_maze(maze, i + 1, j, destination_row, destination_column, solutions) or run_maze( maze, i, j + 1, destination_row, destination_column, solutions ) or run_maze( maze, i - 1, j, destination_row, destination_column, solutions ) or run_maze( maze, i, j - 1, destination_row, destination_column, solutions ) ): return True solutions[i][j] = 1 return False return False if __name__ == "__main__": import doctest doctest.testmod(optionflags=doctest.NORMALIZE_WHITESPACE) ================================================ FILE: backtracking/sudoku.py ================================================ """ Given a partially filled 9x9 2D array, the objective is to fill a 9x9 square grid with digits numbered 1 to 9, so that every row, column, and and each of the nine 3x3 sub-grids contains all of the digits. This can be solved using Backtracking and is similar to n-queens. We check to see if a cell is safe or not and recursively call the function on the next column to see if it returns True. if yes, we have solved the puzzle. else, we backtrack and place another number in that cell and repeat this process. """ from __future__ import annotations Matrix = list[list[int]] # assigning initial values to the grid initial_grid: Matrix = [ [3, 0, 6, 5, 0, 8, 4, 0, 0], [5, 2, 0, 0, 0, 0, 0, 0, 0], [0, 8, 7, 0, 0, 0, 0, 3, 1], [0, 0, 3, 0, 1, 0, 0, 8, 0], [9, 0, 0, 8, 6, 3, 0, 0, 5], [0, 5, 0, 0, 9, 0, 6, 0, 0], [1, 3, 0, 0, 0, 0, 2, 5, 0], [0, 0, 0, 0, 0, 0, 0, 7, 4], [0, 0, 5, 2, 0, 6, 3, 0, 0], ] # a grid with no solution no_solution: Matrix = [ [5, 0, 6, 5, 0, 8, 4, 0, 3], [5, 2, 0, 0, 0, 0, 0, 0, 2], [1, 8, 7, 0, 0, 0, 0, 3, 1], [0, 0, 3, 0, 1, 0, 0, 8, 0], [9, 0, 0, 8, 6, 3, 0, 0, 5], [0, 5, 0, 0, 9, 0, 6, 0, 0], [1, 3, 0, 0, 0, 0, 2, 5, 0], [0, 0, 0, 0, 0, 0, 0, 7, 4], [0, 0, 5, 2, 0, 6, 3, 0, 0], ] def is_safe(grid: Matrix, row: int, column: int, n: int) -> bool: """ This function checks the grid to see if each row, column, and the 3x3 subgrids contain the digit 'n'. It returns False if it is not 'safe' (a duplicate digit is found) else returns True if it is 'safe' """ for i in range(9): if n in {grid[row][i], grid[i][column]}: return False for i in range(3): for j in range(3): if grid[(row - row % 3) + i][(column - column % 3) + j] == n: return False return True def find_empty_location(grid: Matrix) -> tuple[int, int] | None: """ This function finds an empty location so that we can assign a number for that particular row and column. """ for i in range(9): for j in range(9): if grid[i][j] == 0: return i, j return None def sudoku(grid: Matrix) -> Matrix | None: """ Takes a partially filled-in grid and attempts to assign values to all unassigned locations in such a way to meet the requirements for Sudoku solution (non-duplication across rows, columns, and boxes) >>> sudoku(initial_grid) # doctest: +NORMALIZE_WHITESPACE [[3, 1, 6, 5, 7, 8, 4, 9, 2], [5, 2, 9, 1, 3, 4, 7, 6, 8], [4, 8, 7, 6, 2, 9, 5, 3, 1], [2, 6, 3, 4, 1, 5, 9, 8, 7], [9, 7, 4, 8, 6, 3, 1, 2, 5], [8, 5, 1, 7, 9, 2, 6, 4, 3], [1, 3, 8, 9, 4, 7, 2, 5, 6], [6, 9, 2, 3, 5, 1, 8, 7, 4], [7, 4, 5, 2, 8, 6, 3, 1, 9]] >>> sudoku(no_solution) is None True """ if location := find_empty_location(grid): row, column = location else: # If the location is ``None``, then the grid is solved. return grid for digit in range(1, 10): if is_safe(grid, row, column, digit): grid[row][column] = digit if sudoku(grid) is not None: return grid grid[row][column] = 0 return None def print_solution(grid: Matrix) -> None: """ A function to print the solution in the form of a 9x9 grid """ for row in grid: for cell in row: print(cell, end=" ") print() if __name__ == "__main__": # make a copy of grid so that you can compare with the unmodified grid for example_grid in (initial_grid, no_solution): print("\nExample grid:\n" + "=" * 20) print_solution(example_grid) print("\nExample grid solution:") solution = sudoku(example_grid) if solution is not None: print_solution(solution) else: print("Cannot find a solution.") ================================================ FILE: backtracking/sum_of_subsets.py ================================================ """ The sum-of-subsets problem states that a set of non-negative integers, and a value M, determine all possible subsets of the given set whose summation sum equal to given M. Summation of the chosen numbers must be equal to given number M and one number can be used only once. """ def generate_sum_of_subsets_solutions(nums: list[int], max_sum: int) -> list[list[int]]: """ The main function. For list of numbers 'nums' find the subsets with sum equal to 'max_sum' >>> generate_sum_of_subsets_solutions(nums=[3, 34, 4, 12, 5, 2], max_sum=9) [[3, 4, 2], [4, 5]] >>> generate_sum_of_subsets_solutions(nums=[3, 34, 4, 12, 5, 2], max_sum=3) [[3]] >>> generate_sum_of_subsets_solutions(nums=[3, 34, 4, 12, 5, 2], max_sum=1) [] """ result: list[list[int]] = [] path: list[int] = [] num_index = 0 remaining_nums_sum = sum(nums) create_state_space_tree(nums, max_sum, num_index, path, result, remaining_nums_sum) return result def create_state_space_tree( nums: list[int], max_sum: int, num_index: int, path: list[int], result: list[list[int]], remaining_nums_sum: int, ) -> None: """ Creates a state space tree to iterate through each branch using DFS. It terminates the branching of a node when any of the two conditions given below satisfy. This algorithm follows depth-fist-search and backtracks when the node is not branchable. >>> path = [] >>> result = [] >>> create_state_space_tree( ... nums=[1], ... max_sum=1, ... num_index=0, ... path=path, ... result=result, ... remaining_nums_sum=1) >>> path [] >>> result [[1]] """ if sum(path) > max_sum or (remaining_nums_sum + sum(path)) < max_sum: return if sum(path) == max_sum: result.append(path) return for index in range(num_index, len(nums)): create_state_space_tree( nums, max_sum, index + 1, [*path, nums[index]], result, remaining_nums_sum - nums[index], ) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: backtracking/word_break.py ================================================ """ Word Break Problem is a well-known problem in computer science. Given a string and a dictionary of words, the task is to determine if the string can be segmented into a sequence of one or more dictionary words. Wikipedia: https://en.wikipedia.org/wiki/Word_break_problem """ def backtrack(input_string: str, word_dict: set[str], start: int) -> bool: """ Helper function that uses backtracking to determine if a valid word segmentation is possible starting from index 'start'. Parameters: input_string (str): The input string to be segmented. word_dict (set[str]): A set of valid dictionary words. start (int): The starting index of the substring to be checked. Returns: bool: True if a valid segmentation is possible, otherwise False. Example: >>> backtrack("leetcode", {"leet", "code"}, 0) True >>> backtrack("applepenapple", {"apple", "pen"}, 0) True >>> backtrack("catsandog", {"cats", "dog", "sand", "and", "cat"}, 0) False """ # Base case: if the starting index has reached the end of the string if start == len(input_string): return True # Try every possible substring from 'start' to 'end' for end in range(start + 1, len(input_string) + 1): if input_string[start:end] in word_dict and backtrack( input_string, word_dict, end ): return True return False def word_break(input_string: str, word_dict: set[str]) -> bool: """ Determines if the input string can be segmented into a sequence of valid dictionary words using backtracking. Parameters: input_string (str): The input string to segment. word_dict (set[str]): The set of valid words. Returns: bool: True if the string can be segmented into valid words, otherwise False. Example: >>> word_break("leetcode", {"leet", "code"}) True >>> word_break("applepenapple", {"apple", "pen"}) True >>> word_break("catsandog", {"cats", "dog", "sand", "and", "cat"}) False >>> word_break("applepenapple", {}) False """ return backtrack(input_string, word_dict, 0) ================================================ FILE: backtracking/word_ladder.py ================================================ """ Word Ladder is a classic problem in computer science. The problem is to transform a start word into an end word by changing one letter at a time. Each intermediate word must be a valid word from a given list of words. The goal is to find a transformation sequence from the start word to the end word. Wikipedia: https://en.wikipedia.org/wiki/Word_ladder """ import string def backtrack( current_word: str, path: list[str], end_word: str, word_set: set[str] ) -> list[str]: """ Helper function to perform backtracking to find the transformation from the current_word to the end_word. Parameters: current_word (str): The current word in the transformation sequence. path (list[str]): The list of transformations from begin_word to current_word. end_word (str): The target word for transformation. word_set (set[str]): The set of valid words for transformation. Returns: list[str]: The list of transformations from begin_word to end_word. Returns an empty list if there is no valid transformation from current_word to end_word. Example: >>> backtrack("hit", ["hit"], "cog", {"hot", "dot", "dog", "lot", "log", "cog"}) ['hit', 'hot', 'dot', 'lot', 'log', 'cog'] >>> backtrack("hit", ["hit"], "cog", {"hot", "dot", "dog", "lot", "log"}) [] >>> backtrack("lead", ["lead"], "gold", {"load", "goad", "gold", "lead", "lord"}) ['lead', 'lead', 'load', 'goad', 'gold'] >>> backtrack("game", ["game"], "code", {"came", "cage", "code", "cade", "gave"}) ['game', 'came', 'cade', 'code'] """ # Base case: If the current word is the end word, return the path if current_word == end_word: return path # Try all possible single-letter transformations for i in range(len(current_word)): for c in string.ascii_lowercase: # Try changing each letter transformed_word = current_word[:i] + c + current_word[i + 1 :] if transformed_word in word_set: word_set.remove(transformed_word) # Recur with the new word added to the path result = backtrack( transformed_word, [*path, transformed_word], end_word, word_set ) if result: # valid transformation found return result word_set.add(transformed_word) # backtrack return [] # No valid transformation found def word_ladder(begin_word: str, end_word: str, word_set: set[str]) -> list[str]: """ Solve the Word Ladder problem using Backtracking and return the list of transformations from begin_word to end_word. Parameters: begin_word (str): The word from which the transformation starts. end_word (str): The target word for transformation. word_list (list[str]): The list of valid words for transformation. Returns: list[str]: The list of transformations from begin_word to end_word. Returns an empty list if there is no valid transformation. Example: >>> word_ladder("hit", "cog", ["hot", "dot", "dog", "lot", "log", "cog"]) ['hit', 'hot', 'dot', 'lot', 'log', 'cog'] >>> word_ladder("hit", "cog", ["hot", "dot", "dog", "lot", "log"]) [] >>> word_ladder("lead", "gold", ["load", "goad", "gold", "lead", "lord"]) ['lead', 'lead', 'load', 'goad', 'gold'] >>> word_ladder("game", "code", ["came", "cage", "code", "cade", "gave"]) ['game', 'came', 'cade', 'code'] """ if end_word not in word_set: # no valid transformation possible return [] # Perform backtracking starting from the begin_word return backtrack(begin_word, [begin_word], end_word, word_set) ================================================ FILE: backtracking/word_search.py ================================================ """ Author : Alexander Pantyukhin Date : November 24, 2022 Task: Given an m x n grid of characters board and a string word, return true if word exists in the grid. The word can be constructed from letters of sequentially adjacent cells, where adjacent cells are horizontally or vertically neighboring. The same letter cell may not be used more than once. Example: Matrix: --------- |A|B|C|E| |S|F|C|S| |A|D|E|E| --------- Word: "ABCCED" Result: True Implementation notes: Use backtracking approach. At each point, check all neighbors to try to find the next letter of the word. leetcode: https://leetcode.com/problems/word-search/ """ def get_point_key(len_board: int, len_board_column: int, row: int, column: int) -> int: """ Returns the hash key of matrix indexes. >>> get_point_key(10, 20, 1, 0) 200 """ return len_board * len_board_column * row + column def exits_word( board: list[list[str]], word: str, row: int, column: int, word_index: int, visited_points_set: set[int], ) -> bool: """ Return True if it's possible to search the word suffix starting from the word_index. >>> exits_word([["A"]], "B", 0, 0, 0, set()) False """ if board[row][column] != word[word_index]: return False if word_index == len(word) - 1: return True traverts_directions = [(0, 1), (0, -1), (-1, 0), (1, 0)] len_board = len(board) len_board_column = len(board[0]) for direction in traverts_directions: next_i = row + direction[0] next_j = column + direction[1] if not (0 <= next_i < len_board and 0 <= next_j < len_board_column): continue key = get_point_key(len_board, len_board_column, next_i, next_j) if key in visited_points_set: continue visited_points_set.add(key) if exits_word(board, word, next_i, next_j, word_index + 1, visited_points_set): return True visited_points_set.remove(key) return False def word_exists(board: list[list[str]], word: str) -> bool: """ >>> word_exists([["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], "ABCCED") True >>> word_exists([["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], "SEE") True >>> word_exists([["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], "ABCB") False >>> word_exists([["A"]], "A") True >>> word_exists([["B", "A", "A"], ["A", "A", "A"], ["A", "B", "A"]], "ABB") False >>> word_exists([["A"]], 123) Traceback (most recent call last): ... ValueError: The word parameter should be a string of length greater than 0. >>> word_exists([["A"]], "") Traceback (most recent call last): ... ValueError: The word parameter should be a string of length greater than 0. >>> word_exists([[]], "AB") Traceback (most recent call last): ... ValueError: The board should be a non empty matrix of single chars strings. >>> word_exists([], "AB") Traceback (most recent call last): ... ValueError: The board should be a non empty matrix of single chars strings. >>> word_exists([["A"], [21]], "AB") Traceback (most recent call last): ... ValueError: The board should be a non empty matrix of single chars strings. """ # Validate board board_error_message = ( "The board should be a non empty matrix of single chars strings." ) len_board = len(board) if not isinstance(board, list) or len(board) == 0: raise ValueError(board_error_message) for row in board: if not isinstance(row, list) or len(row) == 0: raise ValueError(board_error_message) for item in row: if not isinstance(item, str) or len(item) != 1: raise ValueError(board_error_message) # Validate word if not isinstance(word, str) or len(word) == 0: raise ValueError( "The word parameter should be a string of length greater than 0." ) len_board_column = len(board[0]) for i in range(len_board): for j in range(len_board_column): if exits_word( board, word, i, j, 0, {get_point_key(len_board, len_board_column, i, j)} ): return True return False if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: bit_manipulation/README.md ================================================ # Bit manipulation Bit manipulation is the act of manipulating bits to detect errors (hamming code), encrypts and decrypts messages (more on that in the 'ciphers' folder) or just do anything at the lowest level of your computer. * * * * * * * ================================================ FILE: bit_manipulation/__init__.py ================================================ ================================================ FILE: bit_manipulation/binary_and_operator.py ================================================ # https://www.tutorialspoint.com/python3/bitwise_operators_example.htm def binary_and(a: int, b: int) -> str: """ Take in 2 integers, convert them to binary, return a binary number that is the result of a binary and operation on the integers provided. >>> binary_and(25, 32) '0b000000' >>> binary_and(37, 50) '0b100000' >>> binary_and(21, 30) '0b10100' >>> binary_and(58, 73) '0b0001000' >>> binary_and(0, 255) '0b00000000' >>> binary_and(256, 256) '0b100000000' >>> binary_and(0, -1) Traceback (most recent call last): ... ValueError: the value of both inputs must be positive >>> binary_and(0, 1.1) Traceback (most recent call last): ... ValueError: Unknown format code 'b' for object of type 'float' >>> binary_and("0", "1") Traceback (most recent call last): ... TypeError: '<' not supported between instances of 'str' and 'int' """ if a < 0 or b < 0: raise ValueError("the value of both inputs must be positive") a_binary = format(a, "b") b_binary = format(b, "b") max_len = max(len(a_binary), len(b_binary)) return "0b" + "".join( str(int(char_a == "1" and char_b == "1")) for char_a, char_b in zip(a_binary.zfill(max_len), b_binary.zfill(max_len)) ) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: bit_manipulation/binary_coded_decimal.py ================================================ def binary_coded_decimal(number: int) -> str: """ Find binary coded decimal (bcd) of integer base 10. Each digit of the number is represented by a 4-bit binary. Example: >>> binary_coded_decimal(-2) '0b0000' >>> binary_coded_decimal(-1) '0b0000' >>> binary_coded_decimal(0) '0b0000' >>> binary_coded_decimal(3) '0b0011' >>> binary_coded_decimal(2) '0b0010' >>> binary_coded_decimal(12) '0b00010010' >>> binary_coded_decimal(987) '0b100110000111' """ return "0b" + "".join( str(bin(int(digit)))[2:].zfill(4) for digit in str(max(0, number)) ) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: bit_manipulation/binary_count_setbits.py ================================================ def binary_count_setbits(a: int) -> int: """ Take in 1 integer, return a number that is the number of 1's in binary representation of that number. >>> binary_count_setbits(25) 3 >>> binary_count_setbits(36) 2 >>> binary_count_setbits(16) 1 >>> binary_count_setbits(58) 4 >>> binary_count_setbits(4294967295) 32 >>> binary_count_setbits(0) 0 >>> binary_count_setbits(-10) Traceback (most recent call last): ... ValueError: Input value must be a positive integer >>> binary_count_setbits(0.8) Traceback (most recent call last): ... TypeError: Input value must be a 'int' type >>> binary_count_setbits("0") Traceback (most recent call last): ... TypeError: '<' not supported between instances of 'str' and 'int' """ if a < 0: raise ValueError("Input value must be a positive integer") elif isinstance(a, float): raise TypeError("Input value must be a 'int' type") return bin(a).count("1") if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: bit_manipulation/binary_count_trailing_zeros.py ================================================ from math import log2 def binary_count_trailing_zeros(a: int) -> int: """ Take in 1 integer, return a number that is the number of trailing zeros in binary representation of that number. >>> binary_count_trailing_zeros(25) 0 >>> binary_count_trailing_zeros(36) 2 >>> binary_count_trailing_zeros(16) 4 >>> binary_count_trailing_zeros(58) 1 >>> binary_count_trailing_zeros(4294967296) 32 >>> binary_count_trailing_zeros(0) 0 >>> binary_count_trailing_zeros(-10) Traceback (most recent call last): ... ValueError: Input value must be a positive integer >>> binary_count_trailing_zeros(0.8) Traceback (most recent call last): ... TypeError: Input value must be a 'int' type >>> binary_count_trailing_zeros("0") Traceback (most recent call last): ... TypeError: '<' not supported between instances of 'str' and 'int' """ if a < 0: raise ValueError("Input value must be a positive integer") elif isinstance(a, float): raise TypeError("Input value must be a 'int' type") return 0 if (a == 0) else int(log2(a & -a)) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: bit_manipulation/binary_or_operator.py ================================================ # https://www.tutorialspoint.com/python3/bitwise_operators_example.htm def binary_or(a: int, b: int) -> str: """ Take in 2 integers, convert them to binary, and return a binary number that is the result of a binary or operation on the integers provided. >>> binary_or(25, 32) '0b111001' >>> binary_or(37, 50) '0b110111' >>> binary_or(21, 30) '0b11111' >>> binary_or(58, 73) '0b1111011' >>> binary_or(0, 255) '0b11111111' >>> binary_or(0, 256) '0b100000000' >>> binary_or(0, -1) Traceback (most recent call last): ... ValueError: the value of both inputs must be positive >>> binary_or(0, 1.1) Traceback (most recent call last): ... TypeError: 'float' object cannot be interpreted as an integer >>> binary_or("0", "1") Traceback (most recent call last): ... TypeError: '<' not supported between instances of 'str' and 'int' """ if a < 0 or b < 0: raise ValueError("the value of both inputs must be positive") a_binary = str(bin(a))[2:] # remove the leading "0b" b_binary = str(bin(b))[2:] max_len = max(len(a_binary), len(b_binary)) return "0b" + "".join( str(int("1" in (char_a, char_b))) for char_a, char_b in zip(a_binary.zfill(max_len), b_binary.zfill(max_len)) ) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: bit_manipulation/binary_shifts.py ================================================ # Information on binary shifts: # https://docs.python.org/3/library/stdtypes.html#bitwise-operations-on-integer-types # https://www.interviewcake.com/concept/java/bit-shift def logical_left_shift(number: int, shift_amount: int) -> str: """ Take in 2 positive integers. 'number' is the integer to be logically left shifted 'shift_amount' times. i.e. (number << shift_amount) Return the shifted binary representation. >>> logical_left_shift(0, 1) '0b00' >>> logical_left_shift(1, 1) '0b10' >>> logical_left_shift(1, 5) '0b100000' >>> logical_left_shift(17, 2) '0b1000100' >>> logical_left_shift(1983, 4) '0b111101111110000' >>> logical_left_shift(1, -1) Traceback (most recent call last): ... ValueError: both inputs must be positive integers """ if number < 0 or shift_amount < 0: raise ValueError("both inputs must be positive integers") binary_number = str(bin(number)) binary_number += "0" * shift_amount return binary_number def logical_right_shift(number: int, shift_amount: int) -> str: """ Take in positive 2 integers. 'number' is the integer to be logically right shifted 'shift_amount' times. i.e. (number >>> shift_amount) Return the shifted binary representation. >>> logical_right_shift(0, 1) '0b0' >>> logical_right_shift(1, 1) '0b0' >>> logical_right_shift(1, 5) '0b0' >>> logical_right_shift(17, 2) '0b100' >>> logical_right_shift(1983, 4) '0b1111011' >>> logical_right_shift(1, -1) Traceback (most recent call last): ... ValueError: both inputs must be positive integers """ if number < 0 or shift_amount < 0: raise ValueError("both inputs must be positive integers") binary_number = str(bin(number))[2:] if shift_amount >= len(binary_number): return "0b0" shifted_binary_number = binary_number[: len(binary_number) - shift_amount] return "0b" + shifted_binary_number def arithmetic_right_shift(number: int, shift_amount: int) -> str: """ Take in 2 integers. 'number' is the integer to be arithmetically right shifted 'shift_amount' times. i.e. (number >> shift_amount) Return the shifted binary representation. >>> arithmetic_right_shift(0, 1) '0b00' >>> arithmetic_right_shift(1, 1) '0b00' >>> arithmetic_right_shift(-1, 1) '0b11' >>> arithmetic_right_shift(17, 2) '0b000100' >>> arithmetic_right_shift(-17, 2) '0b111011' >>> arithmetic_right_shift(-1983, 4) '0b111110000100' """ if number >= 0: # Get binary representation of positive number binary_number = "0" + str(bin(number)).strip("-")[2:] else: # Get binary (2's complement) representation of negative number binary_number_length = len(bin(number)[3:]) # Find 2's complement of number binary_number = bin(abs(number) - (1 << binary_number_length))[3:] binary_number = ( "1" + "0" * (binary_number_length - len(binary_number)) + binary_number ) if shift_amount >= len(binary_number): return "0b" + binary_number[0] * len(binary_number) return ( "0b" + binary_number[0] * shift_amount + binary_number[: len(binary_number) - shift_amount] ) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: bit_manipulation/binary_twos_complement.py ================================================ # Information on 2's complement: https://en.wikipedia.org/wiki/Two%27s_complement def twos_complement(number: int) -> str: """ Take in a negative integer 'number'. Return the two's complement representation of 'number'. >>> twos_complement(0) '0b0' >>> twos_complement(-1) '0b11' >>> twos_complement(-5) '0b1011' >>> twos_complement(-17) '0b101111' >>> twos_complement(-207) '0b100110001' >>> twos_complement(1) Traceback (most recent call last): ... ValueError: input must be a negative integer """ if number > 0: raise ValueError("input must be a negative integer") binary_number_length = len(bin(number)[3:]) twos_complement_number = bin(abs(number) - (1 << binary_number_length))[3:] twos_complement_number = ( ( "1" + "0" * (binary_number_length - len(twos_complement_number)) + twos_complement_number ) if number < 0 else "0" ) return "0b" + twos_complement_number if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: bit_manipulation/binary_xor_operator.py ================================================ # https://www.tutorialspoint.com/python3/bitwise_operators_example.htm def binary_xor(a: int, b: int) -> str: """ Take in 2 integers, convert them to binary, return a binary number that is the result of a binary xor operation on the integers provided. >>> binary_xor(25, 32) '0b111001' >>> binary_xor(37, 50) '0b010111' >>> binary_xor(21, 30) '0b01011' >>> binary_xor(58, 73) '0b1110011' >>> binary_xor(0, 255) '0b11111111' >>> binary_xor(256, 256) '0b000000000' >>> binary_xor(0, -1) Traceback (most recent call last): ... ValueError: the value of both inputs must be positive >>> binary_xor(0, 1.1) Traceback (most recent call last): ... TypeError: 'float' object cannot be interpreted as an integer >>> binary_xor("0", "1") Traceback (most recent call last): ... TypeError: '<' not supported between instances of 'str' and 'int' """ if a < 0 or b < 0: raise ValueError("the value of both inputs must be positive") a_binary = str(bin(a))[2:] # remove the leading "0b" b_binary = str(bin(b))[2:] # remove the leading "0b" max_len = max(len(a_binary), len(b_binary)) return "0b" + "".join( str(int(char_a != char_b)) for char_a, char_b in zip(a_binary.zfill(max_len), b_binary.zfill(max_len)) ) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: bit_manipulation/bitwise_addition_recursive.py ================================================ """ Calculates the sum of two non-negative integers using bitwise operators Wikipedia explanation: https://en.wikipedia.org/wiki/Binary_number """ def bitwise_addition_recursive(number: int, other_number: int) -> int: """ >>> bitwise_addition_recursive(4, 5) 9 >>> bitwise_addition_recursive(8, 9) 17 >>> bitwise_addition_recursive(0, 4) 4 >>> bitwise_addition_recursive(4.5, 9) Traceback (most recent call last): ... TypeError: Both arguments MUST be integers! >>> bitwise_addition_recursive('4', 9) Traceback (most recent call last): ... TypeError: Both arguments MUST be integers! >>> bitwise_addition_recursive('4.5', 9) Traceback (most recent call last): ... TypeError: Both arguments MUST be integers! >>> bitwise_addition_recursive(-1, 9) Traceback (most recent call last): ... ValueError: Both arguments MUST be non-negative! >>> bitwise_addition_recursive(1, -9) Traceback (most recent call last): ... ValueError: Both arguments MUST be non-negative! """ if not isinstance(number, int) or not isinstance(other_number, int): raise TypeError("Both arguments MUST be integers!") if number < 0 or other_number < 0: raise ValueError("Both arguments MUST be non-negative!") bitwise_sum = number ^ other_number carry = number & other_number if carry == 0: return bitwise_sum return bitwise_addition_recursive(bitwise_sum, carry << 1) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: bit_manipulation/count_1s_brian_kernighan_method.py ================================================ def get_1s_count(number: int) -> int: """ Count the number of set bits in a 32 bit integer using Brian Kernighan's way. Ref - https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan >>> get_1s_count(25) 3 >>> get_1s_count(37) 3 >>> get_1s_count(21) 3 >>> get_1s_count(58) 4 >>> get_1s_count(0) 0 >>> get_1s_count(256) 1 >>> get_1s_count(-1) Traceback (most recent call last): ... ValueError: Input must be a non-negative integer >>> get_1s_count(0.8) Traceback (most recent call last): ... ValueError: Input must be a non-negative integer >>> get_1s_count("25") Traceback (most recent call last): ... ValueError: Input must be a non-negative integer """ if not isinstance(number, int) or number < 0: raise ValueError("Input must be a non-negative integer") count = 0 while number: # This way we arrive at next set bit (next 1) instead of looping # through each bit and checking for 1s hence the # loop won't run 32 times it will only run the number of `1` times number &= number - 1 count += 1 return count if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: bit_manipulation/count_number_of_one_bits.py ================================================ from timeit import timeit def get_set_bits_count_using_brian_kernighans_algorithm(number: int) -> int: """ Count the number of set bits in a 32 bit integer >>> get_set_bits_count_using_brian_kernighans_algorithm(25) 3 >>> get_set_bits_count_using_brian_kernighans_algorithm(37) 3 >>> get_set_bits_count_using_brian_kernighans_algorithm(21) 3 >>> get_set_bits_count_using_brian_kernighans_algorithm(58) 4 >>> get_set_bits_count_using_brian_kernighans_algorithm(0) 0 >>> get_set_bits_count_using_brian_kernighans_algorithm(256) 1 >>> get_set_bits_count_using_brian_kernighans_algorithm(-1) Traceback (most recent call last): ... ValueError: the value of input must not be negative """ if number < 0: raise ValueError("the value of input must not be negative") result = 0 while number: number &= number - 1 result += 1 return result def get_set_bits_count_using_modulo_operator(number: int) -> int: """ Count the number of set bits in a 32 bit integer >>> get_set_bits_count_using_modulo_operator(25) 3 >>> get_set_bits_count_using_modulo_operator(37) 3 >>> get_set_bits_count_using_modulo_operator(21) 3 >>> get_set_bits_count_using_modulo_operator(58) 4 >>> get_set_bits_count_using_modulo_operator(0) 0 >>> get_set_bits_count_using_modulo_operator(256) 1 >>> get_set_bits_count_using_modulo_operator(-1) Traceback (most recent call last): ... ValueError: the value of input must not be negative """ if number < 0: raise ValueError("the value of input must not be negative") result = 0 while number: if number % 2 == 1: result += 1 number >>= 1 return result def benchmark() -> None: """ Benchmark code for comparing 2 functions, with different length int values. Brian Kernighan's algorithm is consistently faster than using modulo_operator. """ def do_benchmark(number: int) -> None: setup = "import __main__ as z" print(f"Benchmark when {number = }:") print(f"{get_set_bits_count_using_modulo_operator(number) = }") timing = timeit( f"z.get_set_bits_count_using_modulo_operator({number})", setup=setup ) print(f"timeit() runs in {timing} seconds") print(f"{get_set_bits_count_using_brian_kernighans_algorithm(number) = }") timing = timeit( f"z.get_set_bits_count_using_brian_kernighans_algorithm({number})", setup=setup, ) print(f"timeit() runs in {timing} seconds") for number in (25, 37, 58, 0): do_benchmark(number) print() if __name__ == "__main__": import doctest doctest.testmod() benchmark() ================================================ FILE: bit_manipulation/excess_3_code.py ================================================ def excess_3_code(number: int) -> str: """ Find excess-3 code of integer base 10. Add 3 to all digits in a decimal number then convert to a binary-coded decimal. https://en.wikipedia.org/wiki/Excess-3 >>> excess_3_code(0) '0b0011' >>> excess_3_code(3) '0b0110' >>> excess_3_code(2) '0b0101' >>> excess_3_code(20) '0b01010011' >>> excess_3_code(120) '0b010001010011' """ num = "" for digit in str(max(0, number)): num += str(bin(int(digit) + 3))[2:].zfill(4) return "0b" + num if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: bit_manipulation/find_previous_power_of_two.py ================================================ def find_previous_power_of_two(number: int) -> int: """ Find the largest power of two that is less than or equal to a given integer. https://stackoverflow.com/questions/1322510 >>> [find_previous_power_of_two(i) for i in range(18)] [0, 1, 2, 2, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 16, 16] >>> find_previous_power_of_two(-5) Traceback (most recent call last): ... ValueError: Input must be a non-negative integer >>> find_previous_power_of_two(10.5) Traceback (most recent call last): ... ValueError: Input must be a non-negative integer """ if not isinstance(number, int) or number < 0: raise ValueError("Input must be a non-negative integer") if number == 0: return 0 power = 1 while power <= number: power <<= 1 # Equivalent to multiplying by 2 return power >> 1 if number > 1 else 1 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: bit_manipulation/find_unique_number.py ================================================ def find_unique_number(arr: list[int]) -> int: """ Given a list of integers where every element appears twice except for one, this function returns the element that appears only once using bitwise XOR. >>> find_unique_number([1, 1, 2, 2, 3]) 3 >>> find_unique_number([4, 5, 4, 6, 6]) 5 >>> find_unique_number([7]) 7 >>> find_unique_number([10, 20, 10]) 20 >>> find_unique_number([]) Traceback (most recent call last): ... ValueError: input list must not be empty >>> find_unique_number([1, 'a', 1]) Traceback (most recent call last): ... TypeError: all elements must be integers """ if not arr: raise ValueError("input list must not be empty") if not all(isinstance(x, int) for x in arr): raise TypeError("all elements must be integers") result = 0 for num in arr: result ^= num return result if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: bit_manipulation/gray_code_sequence.py ================================================ def gray_code(bit_count: int) -> list: """ Takes in an integer n and returns a n-bit gray code sequence An n-bit gray code sequence is a sequence of 2^n integers where: a) Every integer is between [0,2^n -1] inclusive b) The sequence begins with 0 c) An integer appears at most one times in the sequence d)The binary representation of every pair of integers differ by exactly one bit e) The binary representation of first and last bit also differ by exactly one bit >>> gray_code(2) [0, 1, 3, 2] >>> gray_code(1) [0, 1] >>> gray_code(3) [0, 1, 3, 2, 6, 7, 5, 4] >>> gray_code(-1) Traceback (most recent call last): ... ValueError: The given input must be positive >>> gray_code(10.6) Traceback (most recent call last): ... TypeError: unsupported operand type(s) for <<: 'int' and 'float' """ # bit count represents no. of bits in the gray code if bit_count < 0: raise ValueError("The given input must be positive") # get the generated string sequence sequence = gray_code_sequence_string(bit_count) # # convert them to integers for i in range(len(sequence)): sequence[i] = int(sequence[i], 2) return sequence def gray_code_sequence_string(bit_count: int) -> list: """ Will output the n-bit grey sequence as a string of bits >>> gray_code_sequence_string(2) ['00', '01', '11', '10'] >>> gray_code_sequence_string(1) ['0', '1'] """ # The approach is a recursive one # Base case achieved when either n = 0 or n=1 if bit_count == 0: return ["0"] if bit_count == 1: return ["0", "1"] seq_len = 1 << bit_count # defines the length of the sequence # 1<< n is equivalent to 2^n # recursive answer will generate answer for n-1 bits smaller_sequence = gray_code_sequence_string(bit_count - 1) sequence = [] # append 0 to first half of the smaller sequence generated for i in range(seq_len // 2): generated_no = "0" + smaller_sequence[i] sequence.append(generated_no) # append 1 to second half ... start from the end of the list for i in reversed(range(seq_len // 2)): generated_no = "1" + smaller_sequence[i] sequence.append(generated_no) return sequence if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: bit_manipulation/highest_set_bit.py ================================================ def get_highest_set_bit_position(number: int) -> int: """ Returns position of the highest set bit of a number. Ref - https://graphics.stanford.edu/~seander/bithacks.html#IntegerLogObvious >>> get_highest_set_bit_position(25) 5 >>> get_highest_set_bit_position(37) 6 >>> get_highest_set_bit_position(1) 1 >>> get_highest_set_bit_position(4) 3 >>> get_highest_set_bit_position(0) 0 >>> get_highest_set_bit_position(0.8) Traceback (most recent call last): ... TypeError: Input value must be an 'int' type """ if not isinstance(number, int): raise TypeError("Input value must be an 'int' type") position = 0 while number: position += 1 number >>= 1 return position if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: bit_manipulation/index_of_rightmost_set_bit.py ================================================ # Reference: https://www.geeksforgeeks.org/position-of-rightmost-set-bit/ def get_index_of_rightmost_set_bit(number: int) -> int: """ Take in a positive integer 'number'. Returns the zero-based index of first set bit in that 'number' from right. Returns -1, If no set bit found. >>> get_index_of_rightmost_set_bit(0) -1 >>> get_index_of_rightmost_set_bit(5) 0 >>> get_index_of_rightmost_set_bit(36) 2 >>> get_index_of_rightmost_set_bit(8) 3 >>> get_index_of_rightmost_set_bit(-18) Traceback (most recent call last): ... ValueError: Input must be a non-negative integer >>> get_index_of_rightmost_set_bit('test') Traceback (most recent call last): ... ValueError: Input must be a non-negative integer >>> get_index_of_rightmost_set_bit(1.25) Traceback (most recent call last): ... ValueError: Input must be a non-negative integer """ if not isinstance(number, int) or number < 0: raise ValueError("Input must be a non-negative integer") intermediate = number & ~(number - 1) index = 0 while intermediate: intermediate >>= 1 index += 1 return index - 1 if __name__ == "__main__": """ Finding the index of rightmost set bit has some very peculiar use-cases, especially in finding missing or/and repeating numbers in a list of positive integers. """ import doctest doctest.testmod(verbose=True) ================================================ FILE: bit_manipulation/is_even.py ================================================ def is_even(number: int) -> bool: """ return true if the input integer is even Explanation: Lets take a look at the following decimal to binary conversions 2 => 10 14 => 1110 100 => 1100100 3 => 11 13 => 1101 101 => 1100101 from the above examples we can observe that for all the odd integers there is always 1 set bit at the end also, 1 in binary can be represented as 001, 00001, or 0000001 so for any odd integer n => n&1 is always equals 1 else the integer is even >>> is_even(1) False >>> is_even(4) True >>> is_even(9) False >>> is_even(15) False >>> is_even(40) True >>> is_even(100) True >>> is_even(101) False """ return number & 1 == 0 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: bit_manipulation/is_power_of_two.py ================================================ """ Author : Alexander Pantyukhin Date : November 1, 2022 Task: Given a positive int number. Return True if this number is power of 2 or False otherwise. Implementation notes: Use bit manipulation. For example if the number is the power of two it's bits representation: n = 0..100..00 n - 1 = 0..011..11 n & (n - 1) - no intersections = 0 """ def is_power_of_two(number: int) -> bool: """ Return True if this number is power of 2 or False otherwise. >>> is_power_of_two(0) True >>> is_power_of_two(1) True >>> is_power_of_two(2) True >>> is_power_of_two(4) True >>> is_power_of_two(6) False >>> is_power_of_two(8) True >>> is_power_of_two(17) False >>> is_power_of_two(-1) Traceback (most recent call last): ... ValueError: number must not be negative >>> is_power_of_two(1.2) Traceback (most recent call last): ... TypeError: unsupported operand type(s) for &: 'float' and 'float' # Test all powers of 2 from 0 to 10,000 >>> all(is_power_of_two(int(2 ** i)) for i in range(10000)) True """ if number < 0: raise ValueError("number must not be negative") return number & (number - 1) == 0 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: bit_manipulation/largest_pow_of_two_le_num.py ================================================ """ Author : Naman Sharma Date : October 2, 2023 Task: To Find the largest power of 2 less than or equal to a given number. Implementation notes: Use bit manipulation. We start from 1 & left shift the set bit to check if (res<<1)<=number. Each left bit shift represents a pow of 2. For example: number: 15 res: 1 0b1 2 0b10 4 0b100 8 0b1000 16 0b10000 (Exit) """ def largest_pow_of_two_le_num(number: int) -> int: """ Return the largest power of two less than or equal to a number. >>> largest_pow_of_two_le_num(0) 0 >>> largest_pow_of_two_le_num(1) 1 >>> largest_pow_of_two_le_num(-1) 0 >>> largest_pow_of_two_le_num(3) 2 >>> largest_pow_of_two_le_num(15) 8 >>> largest_pow_of_two_le_num(99) 64 >>> largest_pow_of_two_le_num(178) 128 >>> largest_pow_of_two_le_num(999999) 524288 >>> largest_pow_of_two_le_num(99.9) Traceback (most recent call last): ... TypeError: Input value must be a 'int' type """ if isinstance(number, float): raise TypeError("Input value must be a 'int' type") if number <= 0: return 0 res = 1 while (res << 1) <= number: res <<= 1 return res if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: bit_manipulation/missing_number.py ================================================ def find_missing_number(nums: list[int]) -> int: """ Finds the missing number in a list of consecutive integers. Args: nums: A list of integers. Returns: The missing number. Example: >>> find_missing_number([0, 1, 3, 4]) 2 >>> find_missing_number([4, 3, 1, 0]) 2 >>> find_missing_number([-4, -3, -1, 0]) -2 >>> find_missing_number([-2, 2, 1, 3, 0]) -1 >>> find_missing_number([1, 3, 4, 5, 6]) 2 >>> find_missing_number([6, 5, 4, 2, 1]) 3 >>> find_missing_number([6, 1, 5, 3, 4]) 2 """ low = min(nums) high = max(nums) missing_number = high for i in range(low, high): missing_number ^= i ^ nums[i - low] return missing_number if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: bit_manipulation/numbers_different_signs.py ================================================ """ Author : Alexander Pantyukhin Date : November 30, 2022 Task: Given two int numbers. Return True these numbers have opposite signs or False otherwise. Implementation notes: Use bit manipulation. Use XOR for two numbers. """ def different_signs(num1: int, num2: int) -> bool: """ Return True if numbers have opposite signs False otherwise. >>> different_signs(1, -1) True >>> different_signs(1, 1) False >>> different_signs(1000000000000000000000000000, -1000000000000000000000000000) True >>> different_signs(-1000000000000000000000000000, 1000000000000000000000000000) True >>> different_signs(50, 278) False >>> different_signs(0, 2) False >>> different_signs(2, 0) False """ return num1 ^ num2 < 0 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: bit_manipulation/power_of_4.py ================================================ """ Task: Given a positive int number. Return True if this number is power of 4 or False otherwise. Implementation notes: Use bit manipulation. For example if the number is the power of 2 it's bits representation: n = 0..100..00 n - 1 = 0..011..11 n & (n - 1) - no intersections = 0 If the number is a power of 4 then it should be a power of 2 and the set bit should be at an odd position. """ def power_of_4(number: int) -> bool: """ Return True if this number is power of 4 or False otherwise. >>> power_of_4(0) Traceback (most recent call last): ... ValueError: number must be positive >>> power_of_4(1) True >>> power_of_4(2) False >>> power_of_4(4) True >>> power_of_4(6) False >>> power_of_4(8) False >>> power_of_4(17) False >>> power_of_4(64) True >>> power_of_4(-1) Traceback (most recent call last): ... ValueError: number must be positive >>> power_of_4(1.2) Traceback (most recent call last): ... TypeError: number must be an integer """ if not isinstance(number, int): raise TypeError("number must be an integer") if number <= 0: raise ValueError("number must be positive") if number & (number - 1) == 0: c = 0 while number: c += 1 number >>= 1 return c % 2 == 1 else: return False if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: bit_manipulation/reverse_bits.py ================================================ def get_reverse_bit_string(number: int) -> str: """ Return the reverse bit string of a 32 bit integer >>> get_reverse_bit_string(9) '10010000000000000000000000000000' >>> get_reverse_bit_string(43) '11010100000000000000000000000000' >>> get_reverse_bit_string(2873) '10011100110100000000000000000000' >>> get_reverse_bit_string(2550136832) '00000000000000000000000000011001' >>> get_reverse_bit_string("this is not a number") Traceback (most recent call last): ... TypeError: operation can not be conducted on an object of type str """ if not isinstance(number, int): msg = ( "operation can not be conducted on an object of type " f"{type(number).__name__}" ) raise TypeError(msg) bit_string = "" for _ in range(32): bit_string += str(number % 2) number >>= 1 return bit_string def reverse_bit(number: int) -> int: """ Take in a 32 bit integer, reverse its bits, return a 32 bit integer result >>> reverse_bit(25) 2550136832 >>> reverse_bit(37) 2751463424 >>> reverse_bit(21) 2818572288 >>> reverse_bit(58) 1543503872 >>> reverse_bit(0) 0 >>> reverse_bit(256) 8388608 >>> reverse_bit(2550136832) 25 >>> reverse_bit(-1) Traceback (most recent call last): ... ValueError: The value of input must be non-negative >>> reverse_bit(1.1) Traceback (most recent call last): ... TypeError: Input value must be an 'int' type >>> reverse_bit("0") Traceback (most recent call last): ... TypeError: Input value must be an 'int' type """ if not isinstance(number, int): raise TypeError("Input value must be an 'int' type") if number < 0: raise ValueError("The value of input must be non-negative") result = 0 # iterator over [0 to 31], since we are dealing with a 32 bit integer for _ in range(32): # left shift the bits by unity result <<= 1 # get the end bit end_bit = number & 1 # right shift the bits by unity number >>= 1 # add that bit to our answer result |= end_bit return result if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: bit_manipulation/single_bit_manipulation_operations.py ================================================ #!/usr/bin/env python3 """Provide the functionality to manipulate a single bit.""" def set_bit(number: int, position: int) -> int: """ Set the bit at position to 1. Details: perform bitwise or for given number and X. Where X is a number with all the bits - zeroes and bit on given position - one. >>> set_bit(0b1101, 1) # 0b1111 15 >>> set_bit(0b0, 5) # 0b100000 32 >>> set_bit(0b1111, 1) # 0b1111 15 """ return number | (1 << position) def clear_bit(number: int, position: int) -> int: """ Set the bit at position to 0. Details: perform bitwise and for given number and X. Where X is a number with all the bits - ones and bit on given position - zero. >>> clear_bit(0b10010, 1) # 0b10000 16 >>> clear_bit(0b0, 5) # 0b0 0 """ return number & ~(1 << position) def flip_bit(number: int, position: int) -> int: """ Flip the bit at position. Details: perform bitwise xor for given number and X. Where X is a number with all the bits - zeroes and bit on given position - one. >>> flip_bit(0b101, 1) # 0b111 7 >>> flip_bit(0b101, 0) # 0b100 4 """ return number ^ (1 << position) def is_bit_set(number: int, position: int) -> bool: """ Is the bit at position set? Details: Shift the bit at position to be the first (smallest) bit. Then check if the first bit is set by anding the shifted number with 1. >>> is_bit_set(0b1010, 0) False >>> is_bit_set(0b1010, 1) True >>> is_bit_set(0b1010, 2) False >>> is_bit_set(0b1010, 3) True >>> is_bit_set(0b0, 17) False """ return ((number >> position) & 1) == 1 def get_bit(number: int, position: int) -> int: """ Get the bit at the given position Details: perform bitwise and for the given number and X, Where X is a number with all the bits - zeroes and bit on given position - one. If the result is not equal to 0, then the bit on the given position is 1, else 0. >>> get_bit(0b1010, 0) 0 >>> get_bit(0b1010, 1) 1 >>> get_bit(0b1010, 2) 0 >>> get_bit(0b1010, 3) 1 """ return int((number & (1 << position)) != 0) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: bit_manipulation/swap_all_odd_and_even_bits.py ================================================ def show_bits(before: int, after: int) -> str: """ >>> print(show_bits(0, 0xFFFF)) 0: 00000000 65535: 1111111111111111 """ return f"{before:>5}: {before:08b}\n{after:>5}: {after:08b}" def swap_odd_even_bits(num: int) -> int: """ 1. We use bitwise AND operations to separate the even bits (0, 2, 4, 6, etc.) and odd bits (1, 3, 5, 7, etc.) in the input number. 2. We then right-shift the even bits by 1 position and left-shift the odd bits by 1 position to swap them. 3. Finally, we combine the swapped even and odd bits using a bitwise OR operation to obtain the final result. >>> print(show_bits(0, swap_odd_even_bits(0))) 0: 00000000 0: 00000000 >>> print(show_bits(1, swap_odd_even_bits(1))) 1: 00000001 2: 00000010 >>> print(show_bits(2, swap_odd_even_bits(2))) 2: 00000010 1: 00000001 >>> print(show_bits(3, swap_odd_even_bits(3))) 3: 00000011 3: 00000011 >>> print(show_bits(4, swap_odd_even_bits(4))) 4: 00000100 8: 00001000 >>> print(show_bits(5, swap_odd_even_bits(5))) 5: 00000101 10: 00001010 >>> print(show_bits(6, swap_odd_even_bits(6))) 6: 00000110 9: 00001001 >>> print(show_bits(23, swap_odd_even_bits(23))) 23: 00010111 43: 00101011 """ # Get all even bits - 0xAAAAAAAA is a 32-bit number with all even bits set to 1 even_bits = num & 0xAAAAAAAA # Get all odd bits - 0x55555555 is a 32-bit number with all odd bits set to 1 odd_bits = num & 0x55555555 # Right shift even bits and left shift odd bits and swap them return even_bits >> 1 | odd_bits << 1 if __name__ == "__main__": import doctest doctest.testmod() for i in (-1, 0, 1, 2, 3, 4, 23, 24): print(show_bits(i, swap_odd_even_bits(i)), "\n") ================================================ FILE: blockchain/README.md ================================================ # Blockchain A Blockchain is a type of **distributed ledger** technology (DLT) that consists of a growing list of records, called **blocks**, that are securely linked together using **cryptography**. Let's break down the terminologies in the above definition. We find below terminologies, - Digital Ledger Technology (DLT) - Blocks - Cryptography ## Digital Ledger Technology Blockchain is also called distributed ledger technology. It is simply the opposite of a centralized database. Firstly, what is a **ledger**? A ledger is a book or collection of accounts that records account transactions. *Why is Blockchain addressed as a digital ledger if it can record more than account transactions? What other transaction details and information can it hold?* Digital Ledger Technology is just a ledger that is shared among multiple nodes. This way there exists no need for a central authority to hold the info. Okay, how is it differentiated from a central database and what are their benefits? Suppose that there is an organization that has 4 branches whose data are stored in a centralized database. So even if one branch needs any data from the ledger it needs approval from the database in charge. And if one hacks the central database he gets to tamper and control all the data. Now let's assume every branch has a copy of the ledger and then once anything is added to the ledger by any branch it is gonna automatically reflect in all other ledgers available in other branches. This is done using a peer-to-peer network. This means that even if information is tampered with in one branch we can find out. If one branch is hacked we can be alerted, so we can safeguard other branches. Now, assume these branches as computers or nodes and the ledger is a transaction record or digital receipt. If one ledger is hacked in a node we can detect since there will be a mismatch in comparison with other node information. So this is the concept of Digital Ledger Technology. *Is it required for all nodes to have access to all information in other nodes? Wouldn't this require enormous storage space in each node?* ## Blocks In short, a block is nothing but a collection of records with a labelled header. These are connected cryptographically. Once a new block is added to a chain, the previous block is connected, more precisely said as locked, and hence will remain unaltered. We can understand this concept once we get a clear understanding of the working mechanism of blockchain. ## Cryptography Cryptography is the practice and study of secure communication techniques amid adversarial behavior. More broadly, cryptography is the creation and analysis of protocols that prevent third parties or the general public from accessing private messages. *Which cryptography technology is most widely used in blockchain and why?* So, in general, blockchain technology is a distributed record holder that records the information about ownership of an asset. To define precisely, > Blockchain is a distributed, immutable ledger that makes it easier to record transactions and track assets in a corporate network. An asset could be tangible (such as a house, car, cash, or land) or intangible (such as a business) (intellectual property, patents, copyrights, branding). A blockchain network can track and sell almost anything of value, lowering risk and costs for everyone involved. So this is all about the introduction to blockchain technology. To learn more about the topic refer below links.... * * * * ================================================ FILE: blockchain/__init__.py ================================================ ================================================ FILE: blockchain/diophantine_equation.py ================================================ from __future__ import annotations from maths.greatest_common_divisor import greatest_common_divisor def diophantine(a: int, b: int, c: int) -> tuple[float, float]: """ Diophantine Equation : Given integers a,b,c ( at least one of a and b != 0), the diophantine equation a*x + b*y = c has a solution (where x and y are integers) iff greatest_common_divisor(a,b) divides c. GCD ( Greatest Common Divisor ) or HCF ( Highest Common Factor ) >>> diophantine(10,6,14) (-7.0, 14.0) >>> diophantine(391,299,-69) (9.0, -12.0) But above equation has one more solution i.e., x = -4, y = 5. That's why we need diophantine all solution function. """ assert ( c % greatest_common_divisor(a, b) == 0 ) # greatest_common_divisor(a,b) is in maths directory (d, x, y) = extended_gcd(a, b) # extended_gcd(a,b) function implemented below r = c / d return (r * x, r * y) def diophantine_all_soln(a: int, b: int, c: int, n: int = 2) -> None: """ Lemma : if n|ab and gcd(a,n) = 1, then n|b. Finding All solutions of Diophantine Equations: Theorem : Let gcd(a,b) = d, a = d*p, b = d*q. If (x0,y0) is a solution of Diophantine Equation a*x + b*y = c. a*x0 + b*y0 = c, then all the solutions have the form a(x0 + t*q) + b(y0 - t*p) = c, where t is an arbitrary integer. n is the number of solution you want, n = 2 by default >>> diophantine_all_soln(10, 6, 14) -7.0 14.0 -4.0 9.0 >>> diophantine_all_soln(10, 6, 14, 4) -7.0 14.0 -4.0 9.0 -1.0 4.0 2.0 -1.0 >>> diophantine_all_soln(391, 299, -69, n = 4) 9.0 -12.0 22.0 -29.0 35.0 -46.0 48.0 -63.0 """ (x0, y0) = diophantine(a, b, c) # Initial value d = greatest_common_divisor(a, b) p = a // d q = b // d for i in range(n): x = x0 + i * q y = y0 - i * p print(x, y) def extended_gcd(a: int, b: int) -> tuple[int, int, int]: """ Extended Euclid's Algorithm : If d divides a and b and d = a*x + b*y for integers x and y, then d = gcd(a,b) >>> extended_gcd(10, 6) (2, -1, 2) >>> extended_gcd(7, 5) (1, -2, 3) """ assert a >= 0 assert b >= 0 if b == 0: d, x, y = a, 1, 0 else: (d, p, q) = extended_gcd(b, a % b) x = q y = p - q * (a // b) assert a % d == 0 assert b % d == 0 assert d == a * x + b * y return (d, x, y) if __name__ == "__main__": from doctest import testmod testmod(name="diophantine", verbose=True) testmod(name="diophantine_all_soln", verbose=True) testmod(name="extended_gcd", verbose=True) testmod(name="greatest_common_divisor", verbose=True) ================================================ FILE: boolean_algebra/README.md ================================================ # Boolean Algebra Boolean algebra is used to do arithmetic with bits of values True (1) or False (0). There are three basic operations: 'and', 'or' and 'not'. * * ================================================ FILE: boolean_algebra/__init__.py ================================================ ================================================ FILE: boolean_algebra/and_gate.py ================================================ """ An AND Gate is a logic gate in boolean algebra which results to 1 (True) if all the inputs are 1 (True), and 0 (False) otherwise. Following is the truth table of a Two Input AND Gate: ------------------------------ | Input 1 | Input 2 | Output | ------------------------------ | 0 | 0 | 0 | | 0 | 1 | 0 | | 1 | 0 | 0 | | 1 | 1 | 1 | ------------------------------ Refer - https://www.geeksforgeeks.org/logic-gates/ """ def and_gate(input_1: int, input_2: int) -> int: """ Calculate AND of the input values >>> and_gate(0, 0) 0 >>> and_gate(0, 1) 0 >>> and_gate(1, 0) 0 >>> and_gate(1, 1) 1 """ return int(input_1 and input_2) def n_input_and_gate(inputs: list[int]) -> int: """ Calculate AND of a list of input values >>> n_input_and_gate([1, 0, 1, 1, 0]) 0 >>> n_input_and_gate([1, 1, 1, 1, 1]) 1 """ return int(all(inputs)) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: boolean_algebra/imply_gate.py ================================================ """ An IMPLY Gate is a logic gate in boolean algebra which results to 1 if either input 1 is 0, or if input 1 is 1, then the output is 1 only if input 2 is 1. It is true if input 1 implies input 2. Following is the truth table of an IMPLY Gate: ------------------------------ | Input 1 | Input 2 | Output | ------------------------------ | 0 | 0 | 1 | | 0 | 1 | 1 | | 1 | 0 | 0 | | 1 | 1 | 1 | ------------------------------ Refer - https://en.wikipedia.org/wiki/IMPLY_gate """ def imply_gate(input_1: int, input_2: int) -> int: """ Calculate IMPLY of the input values >>> imply_gate(0, 0) 1 >>> imply_gate(0, 1) 1 >>> imply_gate(1, 0) 0 >>> imply_gate(1, 1) 1 """ return int(input_1 == 0 or input_2 == 1) def recursive_imply_list(input_list: list[int]) -> int: """ Recursively calculates the implication of a list. Strictly the implication is applied consecutively left to right: ( (a -> b) -> c ) -> d ... >>> recursive_imply_list([]) Traceback (most recent call last): ... ValueError: Input list must contain at least two elements >>> recursive_imply_list([0]) Traceback (most recent call last): ... ValueError: Input list must contain at least two elements >>> recursive_imply_list([1]) Traceback (most recent call last): ... ValueError: Input list must contain at least two elements >>> recursive_imply_list([0, 0]) 1 >>> recursive_imply_list([0, 1]) 1 >>> recursive_imply_list([1, 0]) 0 >>> recursive_imply_list([1, 1]) 1 >>> recursive_imply_list([0, 0, 0]) 0 >>> recursive_imply_list([0, 0, 1]) 1 >>> recursive_imply_list([0, 1, 0]) 0 >>> recursive_imply_list([0, 1, 1]) 1 >>> recursive_imply_list([1, 0, 0]) 1 >>> recursive_imply_list([1, 0, 1]) 1 >>> recursive_imply_list([1, 1, 0]) 0 >>> recursive_imply_list([1, 1, 1]) 1 """ if len(input_list) < 2: raise ValueError("Input list must contain at least two elements") first_implication = imply_gate(input_list[0], input_list[1]) if len(input_list) == 2: return first_implication new_list = [first_implication, *input_list[2:]] return recursive_imply_list(new_list) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: boolean_algebra/karnaugh_map_simplification.py ================================================ """ https://en.wikipedia.org/wiki/Karnaugh_map https://www.allaboutcircuits.com/technical-articles/karnaugh-map-boolean-algebraic-simplification-technique """ def simplify_kmap(kmap: list[list[int]]) -> str: """ Simplify the Karnaugh map. >>> simplify_kmap(kmap=[[0, 1], [1, 1]]) "A'B + AB' + AB" >>> simplify_kmap(kmap=[[0, 0], [0, 0]]) '' >>> simplify_kmap(kmap=[[0, 1], [1, -1]]) "A'B + AB' + AB" >>> simplify_kmap(kmap=[[0, 1], [1, 2]]) "A'B + AB' + AB" >>> simplify_kmap(kmap=[[0, 1], [1, 1.1]]) "A'B + AB' + AB" >>> simplify_kmap(kmap=[[0, 1], [1, 'a']]) "A'B + AB' + AB" """ simplified_f = [] for a, row in enumerate(kmap): for b, item in enumerate(row): if item: term = ("A" if a else "A'") + ("B" if b else "B'") simplified_f.append(term) return " + ".join(simplified_f) def main() -> None: """ Main function to create and simplify a K-Map. >>> main() [0, 1] [1, 1] Simplified Expression: A'B + AB' + AB """ kmap = [[0, 1], [1, 1]] # Manually generate the product of [0, 1] and [0, 1] for row in kmap: print(row) print("Simplified Expression:") print(simplify_kmap(kmap)) if __name__ == "__main__": main() print(f"{simplify_kmap(kmap=[[0, 1], [1, 1]]) = }") ================================================ FILE: boolean_algebra/multiplexer.py ================================================ def mux(input0: int, input1: int, select: int) -> int: """ Implement a 2-to-1 Multiplexer. :param input0: The first input value (0 or 1). :param input1: The second input value (0 or 1). :param select: The select signal (0 or 1) to choose between input0 and input1. :return: The output based on the select signal. input1 if select else input0. https://www.electrically4u.com/solved-problems-on-multiplexer https://en.wikipedia.org/wiki/Multiplexer >>> mux(0, 1, 0) 0 >>> mux(0, 1, 1) 1 >>> mux(1, 0, 0) 1 >>> mux(1, 0, 1) 0 >>> mux(2, 1, 0) Traceback (most recent call last): ... ValueError: Inputs and select signal must be 0 or 1 >>> mux(0, -1, 0) Traceback (most recent call last): ... ValueError: Inputs and select signal must be 0 or 1 >>> mux(0, 1, 1.1) Traceback (most recent call last): ... ValueError: Inputs and select signal must be 0 or 1 """ if all(i in (0, 1) for i in (input0, input1, select)): return input1 if select else input0 raise ValueError("Inputs and select signal must be 0 or 1") if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: boolean_algebra/nand_gate.py ================================================ """ A NAND Gate is a logic gate in boolean algebra which results to 0 (False) if both the inputs are 1, and 1 (True) otherwise. It's similar to adding a NOT gate along with an AND gate. Following is the truth table of a NAND Gate: ------------------------------ | Input 1 | Input 2 | Output | ------------------------------ | 0 | 0 | 1 | | 0 | 1 | 1 | | 1 | 0 | 1 | | 1 | 1 | 0 | ------------------------------ Refer - https://www.geeksforgeeks.org/logic-gates-in-python/ """ def nand_gate(input_1: int, input_2: int) -> int: """ Calculate NAND of the input values >>> nand_gate(0, 0) 1 >>> nand_gate(0, 1) 1 >>> nand_gate(1, 0) 1 >>> nand_gate(1, 1) 0 """ return int(not (input_1 and input_2)) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: boolean_algebra/nimply_gate.py ================================================ """ An NIMPLY Gate is a logic gate in boolean algebra which results to 0 if either input 1 is 0, or if input 1 is 1, then it is 0 only if input 2 is 1. It is false if input 1 implies input 2. It is the negated form of imply Following is the truth table of an NIMPLY Gate: ------------------------------ | Input 1 | Input 2 | Output | ------------------------------ | 0 | 0 | 0 | | 0 | 1 | 0 | | 1 | 0 | 1 | | 1 | 1 | 0 | ------------------------------ Refer - https://en.wikipedia.org/wiki/NIMPLY_gate """ def nimply_gate(input_1: int, input_2: int) -> int: """ Calculate NIMPLY of the input values >>> nimply_gate(0, 0) 0 >>> nimply_gate(0, 1) 0 >>> nimply_gate(1, 0) 1 >>> nimply_gate(1, 1) 0 """ return int(input_1 == 1 and input_2 == 0) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: boolean_algebra/nor_gate.py ================================================ """ A NOR Gate is a logic gate in boolean algebra which results in false(0) if any of the inputs is 1, and True(1) if all inputs are 0. Following is the truth table of a NOR Gate: Truth Table of NOR Gate: | Input 1 | Input 2 | Output | | 0 | 0 | 1 | | 0 | 1 | 0 | | 1 | 0 | 0 | | 1 | 1 | 0 | Code provided by Akshaj Vishwanathan https://www.geeksforgeeks.org/logic-gates-in-python """ from collections.abc import Callable def nor_gate(input_1: int, input_2: int) -> int: """ >>> nor_gate(0, 0) 1 >>> nor_gate(0, 1) 0 >>> nor_gate(1, 0) 0 >>> nor_gate(1, 1) 0 >>> nor_gate(0.0, 0.0) 1 >>> nor_gate(0, -7) 0 """ return int(input_1 == input_2 == 0) def truth_table(func: Callable) -> str: """ >>> print(truth_table(nor_gate)) Truth Table of NOR Gate: | Input 1 | Input 2 | Output | | 0 | 0 | 1 | | 0 | 1 | 0 | | 1 | 0 | 0 | | 1 | 1 | 0 | """ def make_table_row(items: list | tuple) -> str: """ >>> make_table_row(("One", "Two", "Three")) '| One | Two | Three |' """ return f"| {' | '.join(f'{item:^8}' for item in items)} |" return "\n".join( ( "Truth Table of NOR Gate:", make_table_row(("Input 1", "Input 2", "Output")), *[make_table_row((i, j, func(i, j))) for i in (0, 1) for j in (0, 1)], ) ) if __name__ == "__main__": import doctest doctest.testmod() print(truth_table(nor_gate)) ================================================ FILE: boolean_algebra/not_gate.py ================================================ """ A NOT Gate is a logic gate in boolean algebra which results to 0 (False) if the input is high, and 1 (True) if the input is low. Following is the truth table of a XOR Gate: ------------------------------ | Input | Output | ------------------------------ | 0 | 1 | | 1 | 0 | ------------------------------ Refer - https://www.geeksforgeeks.org/logic-gates-in-python/ """ def not_gate(input_1: int) -> int: """ Calculate NOT of the input values >>> not_gate(0) 1 >>> not_gate(1) 0 """ return 1 if input_1 == 0 else 0 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: boolean_algebra/or_gate.py ================================================ """ An OR Gate is a logic gate in boolean algebra which results to 0 (False) if both the inputs are 0, and 1 (True) otherwise. Following is the truth table of an AND Gate: ------------------------------ | Input 1 | Input 2 | Output | ------------------------------ | 0 | 0 | 0 | | 0 | 1 | 1 | | 1 | 0 | 1 | | 1 | 1 | 1 | ------------------------------ Refer - https://www.geeksforgeeks.org/logic-gates-in-python/ """ def or_gate(input_1: int, input_2: int) -> int: """ Calculate OR of the input values >>> or_gate(0, 0) 0 >>> or_gate(0, 1) 1 >>> or_gate(1, 0) 1 >>> or_gate(1, 1) 1 """ return int((input_1, input_2).count(1) != 0) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: boolean_algebra/quine_mc_cluskey.py ================================================ from __future__ import annotations from collections.abc import Sequence from typing import Literal def compare_string(string1: str, string2: str) -> str | Literal[False]: """ >>> compare_string('0010','0110') '0_10' >>> compare_string('0110','1101') False """ list1 = list(string1) list2 = list(string2) count = 0 for i in range(len(list1)): if list1[i] != list2[i]: count += 1 list1[i] = "_" if count > 1: return False else: return "".join(list1) def check(binary: list[str]) -> list[str]: """ >>> check(['0.00.01.5']) ['0.00.01.5'] """ pi = [] while True: check1 = ["$"] * len(binary) temp = [] for i in range(len(binary)): for j in range(i + 1, len(binary)): k = compare_string(binary[i], binary[j]) if k is False: check1[i] = "*" check1[j] = "*" temp.append("X") for i in range(len(binary)): if check1[i] == "$": pi.append(binary[i]) if len(temp) == 0: return pi binary = list(set(temp)) def decimal_to_binary(no_of_variable: int, minterms: Sequence[float]) -> list[str]: """ >>> decimal_to_binary(3,[1.5]) ['0.00.01.5'] """ temp = [] for minterm in minterms: string = "" for _ in range(no_of_variable): string = str(minterm % 2) + string minterm //= 2 temp.append(string) return temp def is_for_table(string1: str, string2: str, count: int) -> bool: """ >>> is_for_table('__1','011',2) True >>> is_for_table('01_','001',1) False """ list1 = list(string1) list2 = list(string2) count_n = sum(item1 != item2 for item1, item2 in zip(list1, list2)) return count_n == count def selection(chart: list[list[int]], prime_implicants: list[str]) -> list[str]: """ >>> selection([[1]],['0.00.01.5']) ['0.00.01.5'] >>> selection([[1]],['0.00.01.5']) ['0.00.01.5'] """ temp = [] select = [0] * len(chart) for i in range(len(chart[0])): count = sum(row[i] == 1 for row in chart) if count == 1: rem = max(j for j, row in enumerate(chart) if row[i] == 1) select[rem] = 1 for i, item in enumerate(select): if item != 1: continue for j in range(len(chart[0])): if chart[i][j] != 1: continue for row in chart: row[j] = 0 temp.append(prime_implicants[i]) while True: counts = [chart[i].count(1) for i in range(len(chart))] max_n = max(counts) rem = counts.index(max_n) if max_n == 0: return temp temp.append(prime_implicants[rem]) for j in range(len(chart[0])): if chart[rem][j] != 1: continue for i in range(len(chart)): chart[i][j] = 0 def prime_implicant_chart( prime_implicants: list[str], binary: list[str] ) -> list[list[int]]: """ >>> prime_implicant_chart(['0.00.01.5'],['0.00.01.5']) [[1]] """ chart = [[0 for x in range(len(binary))] for x in range(len(prime_implicants))] for i in range(len(prime_implicants)): count = prime_implicants[i].count("_") for j in range(len(binary)): if is_for_table(prime_implicants[i], binary[j], count): chart[i][j] = 1 return chart def main() -> None: no_of_variable = int(input("Enter the no. of variables\n")) minterms = [ float(x) for x in input( "Enter the decimal representation of Minterms 'Spaces Separated'\n" ).split() ] binary = decimal_to_binary(no_of_variable, minterms) prime_implicants = check(binary) print("Prime Implicants are:") print(prime_implicants) chart = prime_implicant_chart(prime_implicants, binary) essential_prime_implicants = selection(chart, prime_implicants) print("Essential Prime Implicants are:") print(essential_prime_implicants) if __name__ == "__main__": import doctest doctest.testmod() main() ================================================ FILE: boolean_algebra/xnor_gate.py ================================================ """ A XNOR Gate is a logic gate in boolean algebra which results to 0 (False) if both the inputs are different, and 1 (True), if the inputs are same. It's similar to adding a NOT gate to an XOR gate Following is the truth table of a XNOR Gate: ------------------------------ | Input 1 | Input 2 | Output | ------------------------------ | 0 | 0 | 1 | | 0 | 1 | 0 | | 1 | 0 | 0 | | 1 | 1 | 1 | ------------------------------ Refer - https://www.geeksforgeeks.org/logic-gates-in-python/ """ def xnor_gate(input_1: int, input_2: int) -> int: """ Calculate XOR of the input values >>> xnor_gate(0, 0) 1 >>> xnor_gate(0, 1) 0 >>> xnor_gate(1, 0) 0 >>> xnor_gate(1, 1) 1 """ return 1 if input_1 == input_2 else 0 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: boolean_algebra/xor_gate.py ================================================ """ A XOR Gate is a logic gate in boolean algebra which results to 1 (True) if only one of the two inputs is 1, and 0 (False) if an even number of inputs are 1. Following is the truth table of a XOR Gate: ------------------------------ | Input 1 | Input 2 | Output | ------------------------------ | 0 | 0 | 0 | | 0 | 1 | 1 | | 1 | 0 | 1 | | 1 | 1 | 0 | ------------------------------ Refer - https://www.geeksforgeeks.org/logic-gates-in-python/ """ def xor_gate(input_1: int, input_2: int) -> int: """ calculate xor of the input values >>> xor_gate(0, 0) 0 >>> xor_gate(0, 1) 1 >>> xor_gate(1, 0) 1 >>> xor_gate(1, 1) 0 """ return (input_1, input_2).count(0) % 2 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: cellular_automata/README.md ================================================ # Cellular Automata Cellular automata are a way to simulate the behavior of "life", no matter if it is a robot or cell. They usually follow simple rules but can lead to the creation of complex forms. The most popular cellular automaton is Conway's [Game of Life](https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life). * * ================================================ FILE: cellular_automata/__init__.py ================================================ ================================================ FILE: cellular_automata/conways_game_of_life.py ================================================ """ Conway's Game of Life implemented in Python. https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life """ from __future__ import annotations from PIL import Image # Define glider example GLIDER = [ [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [1, 1, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], ] # Define blinker example BLINKER = [[0, 1, 0], [0, 1, 0], [0, 1, 0]] def new_generation(cells: list[list[int]]) -> list[list[int]]: """ Generates the next generation for a given state of Conway's Game of Life. >>> new_generation(BLINKER) [[0, 0, 0], [1, 1, 1], [0, 0, 0]] """ next_generation = [] for i in range(len(cells)): next_generation_row = [] for j in range(len(cells[i])): # Get the number of live neighbours neighbour_count = 0 if i > 0 and j > 0: neighbour_count += cells[i - 1][j - 1] if i > 0: neighbour_count += cells[i - 1][j] if i > 0 and j < len(cells[i]) - 1: neighbour_count += cells[i - 1][j + 1] if j > 0: neighbour_count += cells[i][j - 1] if j < len(cells[i]) - 1: neighbour_count += cells[i][j + 1] if i < len(cells) - 1 and j > 0: neighbour_count += cells[i + 1][j - 1] if i < len(cells) - 1: neighbour_count += cells[i + 1][j] if i < len(cells) - 1 and j < len(cells[i]) - 1: neighbour_count += cells[i + 1][j + 1] # Rules of the game of life (excerpt from Wikipedia): # 1. Any live cell with two or three live neighbours survives. # 2. Any dead cell with three live neighbours becomes a live cell. # 3. All other live cells die in the next generation. # Similarly, all other dead cells stay dead. alive = cells[i][j] == 1 if (alive and 2 <= neighbour_count <= 3) or ( not alive and neighbour_count == 3 ): next_generation_row.append(1) else: next_generation_row.append(0) next_generation.append(next_generation_row) return next_generation def generate_images(cells: list[list[int]], frames: int) -> list[Image.Image]: """ Generates a list of images of subsequent Game of Life states. """ images = [] for _ in range(frames): # Create output image img = Image.new("RGB", (len(cells[0]), len(cells))) pixels = img.load() # Save cells to image for x in range(len(cells)): for y in range(len(cells[0])): colour = 255 - cells[y][x] * 255 pixels[x, y] = (colour, colour, colour) # Save image images.append(img) cells = new_generation(cells) return images if __name__ == "__main__": images = generate_images(GLIDER, 16) images[0].save("out.gif", save_all=True, append_images=images[1:]) ================================================ FILE: cellular_automata/game_of_life.py ================================================ """Conway's Game Of Life, Author Anurag Kumar(mailto:anuragkumarak95@gmail.com) Requirements: - numpy - random - time - matplotlib Python: - 3.5 Usage: - $python3 game_of_life Game-Of-Life Rules: 1. Any live cell with fewer than two live neighbours dies, as if caused by under-population. 2. Any live cell with two or three live neighbours lives on to the next generation. 3. Any live cell with more than three live neighbours dies, as if by over-population. 4. Any dead cell with exactly three live neighbours be- comes a live cell, as if by reproduction. """ import random import sys import numpy as np from matplotlib import pyplot as plt from matplotlib.colors import ListedColormap usage_doc = "Usage of script: script_name " choice = [0] * 100 + [1] * 10 random.shuffle(choice) def create_canvas(size: int) -> list[list[bool]]: canvas = [[False for i in range(size)] for j in range(size)] return canvas def seed(canvas: list[list[bool]]) -> None: for i, row in enumerate(canvas): for j, _ in enumerate(row): canvas[i][j] = bool(random.getrandbits(1)) def run(canvas: list[list[bool]]) -> list[list[bool]]: """ This function runs the rules of game through all points, and changes their status accordingly.(in the same canvas) @Args: -- canvas : canvas of population to run the rules on. @returns: -- canvas of population after one step """ current_canvas = np.array(canvas) next_gen_canvas = np.array(create_canvas(current_canvas.shape[0])) for r, row in enumerate(current_canvas): for c, pt in enumerate(row): next_gen_canvas[r][c] = __judge_point( pt, current_canvas[r - 1 : r + 2, c - 1 : c + 2] ) return next_gen_canvas.tolist() def __judge_point(pt: bool, neighbours: list[list[bool]]) -> bool: dead = 0 alive = 0 # finding dead or alive neighbours count. for i in neighbours: for status in i: if status: alive += 1 else: dead += 1 # handling duplicate entry for focus pt. if pt: alive -= 1 else: dead -= 1 # running the rules of game here. state = pt if pt: if alive < 2: state = False elif alive in {2, 3}: state = True elif alive > 3: state = False elif alive == 3: state = True return state if __name__ == "__main__": if len(sys.argv) != 2: raise Exception(usage_doc) canvas_size = int(sys.argv[1]) # main working structure of this module. c = create_canvas(canvas_size) seed(c) fig, ax = plt.subplots() fig.show() cmap = ListedColormap(["w", "k"]) try: while True: c = run(c) ax.matshow(c, cmap=cmap) fig.canvas.draw() ax.cla() except KeyboardInterrupt: # do nothing. pass ================================================ FILE: cellular_automata/langtons_ant.py ================================================ """ Langton's ant @ https://en.wikipedia.org/wiki/Langton%27s_ant @ https://upload.wikimedia.org/wikipedia/commons/0/09/LangtonsAntAnimated.gif """ from functools import partial from matplotlib import pyplot as plt from matplotlib.animation import FuncAnimation WIDTH = 80 HEIGHT = 80 class LangtonsAnt: """ Represents the main LangonsAnt algorithm. >>> la = LangtonsAnt(2, 2) >>> la.board [[True, True], [True, True]] >>> la.ant_position (1, 1) """ def __init__(self, width: int, height: int) -> None: # Each square is either True or False where True is white and False is black self.board = [[True] * width for _ in range(height)] self.ant_position: tuple[int, int] = (width // 2, height // 2) # Initially pointing left (similar to the wikipedia image) # (0 = 0° | 1 = 90° | 2 = 180 ° | 3 = 270°) self.ant_direction: int = 3 def move_ant(self, axes: plt.Axes | None, display: bool, _frame: int) -> None: """ Performs three tasks: 1. The ant turns either clockwise or anti-clockwise according to the colour of the square that it is currently on. If the square is white, the ant turns clockwise, and if the square is black the ant turns anti-clockwise 2. The ant moves one square in the direction that it is currently facing 3. The square the ant was previously on is inverted (White -> Black and Black -> White) If display is True, the board will also be displayed on the axes >>> la = LangtonsAnt(2, 2) >>> la.move_ant(None, True, 0) >>> la.board [[True, True], [True, False]] >>> la.move_ant(None, True, 0) >>> la.board [[True, False], [True, False]] """ directions = { 0: (-1, 0), # 0° 1: (0, 1), # 90° 2: (1, 0), # 180° 3: (0, -1), # 270° } x, y = self.ant_position # Turn clockwise or anti-clockwise according to colour of square if self.board[x][y] is True: # The square is white so turn 90° clockwise self.ant_direction = (self.ant_direction + 1) % 4 else: # The square is black so turn 90° anti-clockwise self.ant_direction = (self.ant_direction - 1) % 4 # Move ant move_x, move_y = directions[self.ant_direction] self.ant_position = (x + move_x, y + move_y) # Flip colour of square self.board[x][y] = not self.board[x][y] if display and axes: # Display the board on the axes axes.get_xaxis().set_ticks([]) axes.get_yaxis().set_ticks([]) axes.imshow(self.board, cmap="gray", interpolation="nearest") def display(self, frames: int = 100_000) -> None: """ Displays the board without delay in a matplotlib plot to visually understand and track the ant. >>> _ = LangtonsAnt(WIDTH, HEIGHT) """ fig, ax = plt.subplots() # Assign animation to a variable to prevent it from getting garbage collected self.animation = FuncAnimation( fig, partial(self.move_ant, ax, True), frames=frames, interval=1 ) plt.show() if __name__ == "__main__": import doctest doctest.testmod() LangtonsAnt(WIDTH, HEIGHT).display() ================================================ FILE: cellular_automata/nagel_schrekenberg.py ================================================ """ Simulate the evolution of a highway with only one road that is a loop. The highway is divided in cells, each cell can have at most one car in it. The highway is a loop so when a car comes to one end, it will come out on the other. Each car is represented by its speed (from 0 to 5). Some information about speed: -1 means that the cell on the highway is empty 0 to 5 are the speed of the cars with 0 being the lowest and 5 the highest highway: list[int] Where every position and speed of every car will be stored probability The probability that a driver will slow down initial_speed The speed of the cars a the start frequency How many cells there are between two cars at the start max_speed The maximum speed a car can go to number_of_cells How many cell are there in the highway number_of_update How many times will the position be updated More information here: https://en.wikipedia.org/wiki/Nagel%E2%80%93Schreckenberg_model Examples for doctest: >>> simulate(construct_highway(6, 3, 0), 2, 0, 2) [[0, -1, -1, 0, -1, -1], [-1, 1, -1, -1, 1, -1], [-1, -1, 1, -1, -1, 1]] >>> simulate(construct_highway(5, 2, -2), 3, 0, 2) [[0, -1, 0, -1, 0], [0, -1, 0, -1, -1], [0, -1, -1, 1, -1], [-1, 1, -1, 0, -1]] """ from random import randint, random def construct_highway( number_of_cells: int, frequency: int, initial_speed: int, random_frequency: bool = False, random_speed: bool = False, max_speed: int = 5, ) -> list: """ Build the highway following the parameters given >>> construct_highway(10, 2, 6) [[6, -1, 6, -1, 6, -1, 6, -1, 6, -1]] >>> construct_highway(10, 10, 2) [[2, -1, -1, -1, -1, -1, -1, -1, -1, -1]] """ highway = [[-1] * number_of_cells] # Create a highway without any car i = 0 initial_speed = max(initial_speed, 0) while i < number_of_cells: highway[0][i] = ( randint(0, max_speed) if random_speed else initial_speed ) # Place the cars i += ( randint(1, max_speed * 2) if random_frequency else frequency ) # Arbitrary number, may need tuning return highway def get_distance(highway_now: list, car_index: int) -> int: """ Get the distance between a car (at index car_index) and the next car >>> get_distance([6, -1, 6, -1, 6], 2) 1 >>> get_distance([2, -1, -1, -1, 3, 1, 0, 1, 3, 2], 0) 3 >>> get_distance([-1, -1, -1, -1, 2, -1, -1, -1, 3], -1) 4 """ distance = 0 cells = highway_now[car_index + 1 :] for cell in range(len(cells)): # May need a better name for this if cells[cell] != -1: # If the cell is not empty then return distance # we have the distance we wanted distance += 1 # Here if the car is near the end of the highway return distance + get_distance(highway_now, -1) def update(highway_now: list, probability: float, max_speed: int) -> list: """ Update the speed of the cars >>> update([-1, -1, -1, -1, -1, 2, -1, -1, -1, -1, 3], 0.0, 5) [-1, -1, -1, -1, -1, 3, -1, -1, -1, -1, 4] >>> update([-1, -1, 2, -1, -1, -1, -1, 3], 0.0, 5) [-1, -1, 3, -1, -1, -1, -1, 1] """ number_of_cells = len(highway_now) # Beforce calculations, the highway is empty next_highway = [-1] * number_of_cells for car_index in range(number_of_cells): if highway_now[car_index] != -1: # Add 1 to the current speed of the car and cap the speed next_highway[car_index] = min(highway_now[car_index] + 1, max_speed) # Number of empty cell before the next car dn = get_distance(highway_now, car_index) - 1 # We can't have the car causing an accident next_highway[car_index] = min(next_highway[car_index], dn) if random() < probability: # Randomly, a driver will slow down next_highway[car_index] = max(next_highway[car_index] - 1, 0) return next_highway def simulate( highway: list, number_of_update: int, probability: float, max_speed: int ) -> list: """ The main function, it will simulate the evolution of the highway >>> simulate([[-1, 2, -1, -1, -1, 3]], 2, 0.0, 3) [[-1, 2, -1, -1, -1, 3], [-1, -1, -1, 2, -1, 0], [1, -1, -1, 0, -1, -1]] >>> simulate([[-1, 2, -1, 3]], 4, 0.0, 3) [[-1, 2, -1, 3], [-1, 0, -1, 0], [-1, 0, -1, 0], [-1, 0, -1, 0], [-1, 0, -1, 0]] """ number_of_cells = len(highway[0]) for i in range(number_of_update): next_speeds_calculated = update(highway[i], probability, max_speed) real_next_speeds = [-1] * number_of_cells for car_index in range(number_of_cells): speed = next_speeds_calculated[car_index] if speed != -1: # Change the position based on the speed (with % to create the loop) index = (car_index + speed) % number_of_cells # Commit the change of position real_next_speeds[index] = speed highway.append(real_next_speeds) return highway if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: cellular_automata/one_dimensional.py ================================================ """ Return an image of 16 generations of one-dimensional cellular automata based on a given ruleset number https://mathworld.wolfram.com/ElementaryCellularAutomaton.html """ from __future__ import annotations from PIL import Image # Define the first generation of cells # fmt: off CELLS = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] # fmt: on def format_ruleset(ruleset: int) -> list[int]: """ >>> format_ruleset(11100) [0, 0, 0, 1, 1, 1, 0, 0] >>> format_ruleset(0) [0, 0, 0, 0, 0, 0, 0, 0] >>> format_ruleset(11111111) [1, 1, 1, 1, 1, 1, 1, 1] """ return [int(c) for c in f"{ruleset:08}"[:8]] def new_generation(cells: list[list[int]], rule: list[int], time: int) -> list[int]: population = len(cells[0]) # 31 next_generation = [] for i in range(population): # Get the neighbors of each cell # Handle neighbours outside bounds by using 0 as their value left_neighbor = 0 if i == 0 else cells[time][i - 1] right_neighbor = 0 if i == population - 1 else cells[time][i + 1] # Define a new cell and add it to the new generation situation = 7 - int(f"{left_neighbor}{cells[time][i]}{right_neighbor}", 2) next_generation.append(rule[situation]) return next_generation def generate_image(cells: list[list[int]]) -> Image.Image: """ Convert the cells into a greyscale PIL.Image.Image and return it to the caller. >>> from random import random >>> cells = [[random() for w in range(31)] for h in range(16)] >>> img = generate_image(cells) >>> isinstance(img, Image.Image) True >>> img.width, img.height (31, 16) """ # Create the output image img = Image.new("RGB", (len(cells[0]), len(cells))) pixels = img.load() # Generates image for w in range(img.width): for h in range(img.height): color = 255 - int(255 * cells[h][w]) pixels[w, h] = (color, color, color) return img if __name__ == "__main__": rule_num = bin(int(input("Rule:\n").strip()))[2:] rule = format_ruleset(int(rule_num)) for time in range(16): CELLS.append(new_generation(CELLS, rule, time)) img = generate_image(CELLS) # Uncomment to save the image # img.save(f"rule_{rule_num}.png") img.show() ================================================ FILE: cellular_automata/wa_tor.py ================================================ """ Wa-Tor algorithm (1984) | @ https://en.wikipedia.org/wiki/Wa-Tor | @ https://beltoforion.de/en/wator/ | @ https://beltoforion.de/en/wator/images/wator_medium.webm This solution aims to completely remove any systematic approach to the Wa-Tor planet, and utilise fully random methods. The constants are a working set that allows the Wa-Tor planet to result in one of the three possible results. """ from collections.abc import Callable from random import randint, shuffle from time import sleep from typing import Literal WIDTH = 50 # Width of the Wa-Tor planet HEIGHT = 50 # Height of the Wa-Tor planet PREY_INITIAL_COUNT = 30 # The initial number of prey entities PREY_REPRODUCTION_TIME = 5 # The chronons before reproducing PREDATOR_INITIAL_COUNT = 50 # The initial number of predator entities # The initial energy value of predator entities PREDATOR_INITIAL_ENERGY_VALUE = 15 # The energy value provided when consuming prey PREDATOR_FOOD_VALUE = 5 PREDATOR_REPRODUCTION_TIME = 20 # The chronons before reproducing MAX_ENTITIES = 500 # The max number of organisms on the board # The number of entities to delete from the unbalanced side DELETE_UNBALANCED_ENTITIES = 50 class Entity: """ Represents an entity (either prey or predator). >>> e = Entity(True, coords=(0, 0)) >>> e.prey True >>> e.coords (0, 0) >>> e.alive True """ def __init__(self, prey: bool, coords: tuple[int, int]) -> None: self.prey = prey # The (row, col) pos of the entity self.coords = coords self.remaining_reproduction_time = ( PREY_REPRODUCTION_TIME if prey else PREDATOR_REPRODUCTION_TIME ) self.energy_value = None if prey is True else PREDATOR_INITIAL_ENERGY_VALUE self.alive = True def reset_reproduction_time(self) -> None: """ >>> e = Entity(True, coords=(0, 0)) >>> e.reset_reproduction_time() >>> e.remaining_reproduction_time == PREY_REPRODUCTION_TIME True >>> e = Entity(False, coords=(0, 0)) >>> e.reset_reproduction_time() >>> e.remaining_reproduction_time == PREDATOR_REPRODUCTION_TIME True """ self.remaining_reproduction_time = ( PREY_REPRODUCTION_TIME if self.prey is True else PREDATOR_REPRODUCTION_TIME ) def __repr__(self) -> str: """ >>> Entity(prey=True, coords=(1, 1)) Entity(prey=True, coords=(1, 1), remaining_reproduction_time=5) >>> Entity(prey=False, coords=(2, 1)) # doctest: +NORMALIZE_WHITESPACE Entity(prey=False, coords=(2, 1), remaining_reproduction_time=20, energy_value=15) """ repr_ = ( f"Entity(prey={self.prey}, coords={self.coords}, " f"remaining_reproduction_time={self.remaining_reproduction_time}" ) if self.energy_value is not None: repr_ += f", energy_value={self.energy_value}" return f"{repr_})" class WaTor: """ Represents the main Wa-Tor algorithm. :attr time_passed: A function that is called every time time passes (a chronon) in order to visually display the new Wa-Tor planet. The `time_passed` function can block using ``time.sleep`` to slow the algorithm progression. >>> wt = WaTor(10, 15) >>> wt.width 10 >>> wt.height 15 >>> len(wt.planet) 15 >>> len(wt.planet[0]) 10 >>> len(wt.get_entities()) == PREDATOR_INITIAL_COUNT + PREY_INITIAL_COUNT True """ time_passed: Callable[["WaTor", int], None] | None def __init__(self, width: int, height: int) -> None: self.width = width self.height = height self.time_passed = None self.planet: list[list[Entity | None]] = [[None] * width for _ in range(height)] # Populate planet with predators and prey randomly for _ in range(PREY_INITIAL_COUNT): self.add_entity(prey=True) for _ in range(PREDATOR_INITIAL_COUNT): self.add_entity(prey=False) self.set_planet(self.planet) def set_planet(self, planet: list[list[Entity | None]]) -> None: """ Ease of access for testing >>> wt = WaTor(WIDTH, HEIGHT) >>> planet = [ ... [None, None, None], ... [None, Entity(True, coords=(1, 1)), None] ... ] >>> wt.set_planet(planet) >>> wt.planet == planet True >>> wt.width 3 >>> wt.height 2 """ self.planet = planet self.width = len(planet[0]) self.height = len(planet) def add_entity(self, prey: bool) -> None: """ Adds an entity, making sure the entity does not override another entity >>> wt = WaTor(WIDTH, HEIGHT) >>> wt.set_planet([[None, None], [None, None]]) >>> wt.add_entity(True) >>> len(wt.get_entities()) 1 >>> wt.add_entity(False) >>> len(wt.get_entities()) 2 """ while True: row, col = randint(0, self.height - 1), randint(0, self.width - 1) if self.planet[row][col] is None: self.planet[row][col] = Entity(prey=prey, coords=(row, col)) return def get_entities(self) -> list[Entity]: """ Returns a list of all the entities within the planet. >>> wt = WaTor(WIDTH, HEIGHT) >>> len(wt.get_entities()) == PREDATOR_INITIAL_COUNT + PREY_INITIAL_COUNT True """ return [entity for column in self.planet for entity in column if entity] def balance_predators_and_prey(self) -> None: """ Balances predators and preys so that prey can not dominate the predators, blocking up space for them to reproduce. >>> wt = WaTor(WIDTH, HEIGHT) >>> for i in range(2000): ... row, col = i // HEIGHT, i % WIDTH ... wt.planet[row][col] = Entity(True, coords=(row, col)) >>> entities = len(wt.get_entities()) >>> wt.balance_predators_and_prey() >>> len(wt.get_entities()) == entities False """ entities = self.get_entities() shuffle(entities) if len(entities) >= MAX_ENTITIES - MAX_ENTITIES / 10: prey = [entity for entity in entities if entity.prey] predators = [entity for entity in entities if not entity.prey] prey_count, predator_count = len(prey), len(predators) entities_to_purge = ( prey[:DELETE_UNBALANCED_ENTITIES] if prey_count > predator_count else predators[:DELETE_UNBALANCED_ENTITIES] ) for entity in entities_to_purge: self.planet[entity.coords[0]][entity.coords[1]] = None def get_surrounding_prey(self, entity: Entity) -> list[Entity]: """ Returns all the prey entities around (N, S, E, W) a predator entity. Subtly different to the `move_and_reproduce`. >>> wt = WaTor(WIDTH, HEIGHT) >>> wt.set_planet([ ... [None, Entity(True, (0, 1)), None], ... [None, Entity(False, (1, 1)), None], ... [None, Entity(True, (2, 1)), None]]) >>> wt.get_surrounding_prey( ... Entity(False, (1, 1))) # doctest: +NORMALIZE_WHITESPACE [Entity(prey=True, coords=(0, 1), remaining_reproduction_time=5), Entity(prey=True, coords=(2, 1), remaining_reproduction_time=5)] >>> wt.set_planet([[Entity(False, (0, 0))]]) >>> wt.get_surrounding_prey(Entity(False, (0, 0))) [] >>> wt.set_planet([ ... [Entity(True, (0, 0)), Entity(False, (1, 0)), Entity(False, (2, 0))], ... [None, Entity(False, (1, 1)), Entity(True, (2, 1))], ... [None, None, None]]) >>> wt.get_surrounding_prey(Entity(False, (1, 0))) [Entity(prey=True, coords=(0, 0), remaining_reproduction_time=5)] """ row, col = entity.coords adjacent: list[tuple[int, int]] = [ (row - 1, col), # North (row + 1, col), # South (row, col - 1), # West (row, col + 1), # East ] return [ ent for r, c in adjacent if 0 <= r < self.height and 0 <= c < self.width and (ent := self.planet[r][c]) is not None and ent.prey ] def move_and_reproduce( self, entity: Entity, direction_orders: list[Literal["N", "E", "S", "W"]] ) -> None: """ Attempts to move to an unoccupied neighbouring square in either of the four directions (North, South, East, West). If the move was successful and the `remaining_reproduction_time` is equal to 0, then a new prey or predator can also be created in the previous square. :param direction_orders: Ordered list (like priority queue) depicting order to attempt to move. Removes any systematic approach of checking neighbouring squares. >>> planet = [ ... [None, None, None], ... [None, Entity(True, coords=(1, 1)), None], ... [None, None, None] ... ] >>> wt = WaTor(WIDTH, HEIGHT) >>> wt.set_planet(planet) >>> wt.move_and_reproduce(Entity(True, coords=(1, 1)), direction_orders=["N"]) >>> wt.planet # doctest: +NORMALIZE_WHITESPACE [[None, Entity(prey=True, coords=(0, 1), remaining_reproduction_time=4), None], [None, None, None], [None, None, None]] >>> wt.planet[0][0] = Entity(True, coords=(0, 0)) >>> wt.move_and_reproduce(Entity(True, coords=(0, 1)), ... direction_orders=["N", "W", "E", "S"]) >>> wt.planet # doctest: +NORMALIZE_WHITESPACE [[Entity(prey=True, coords=(0, 0), remaining_reproduction_time=5), None, Entity(prey=True, coords=(0, 2), remaining_reproduction_time=4)], [None, None, None], [None, None, None]] >>> wt.planet[0][1] = wt.planet[0][2] >>> wt.planet[0][2] = None >>> wt.move_and_reproduce(Entity(True, coords=(0, 1)), ... direction_orders=["N", "W", "S", "E"]) >>> wt.planet # doctest: +NORMALIZE_WHITESPACE [[Entity(prey=True, coords=(0, 0), remaining_reproduction_time=5), None, None], [None, Entity(prey=True, coords=(1, 1), remaining_reproduction_time=4), None], [None, None, None]] >>> wt = WaTor(WIDTH, HEIGHT) >>> reproducable_entity = Entity(False, coords=(0, 1)) >>> reproducable_entity.remaining_reproduction_time = 0 >>> wt.planet = [[None, reproducable_entity]] >>> wt.move_and_reproduce(reproducable_entity, ... direction_orders=["N", "W", "S", "E"]) >>> wt.planet # doctest: +NORMALIZE_WHITESPACE [[Entity(prey=False, coords=(0, 0), remaining_reproduction_time=20, energy_value=15), Entity(prey=False, coords=(0, 1), remaining_reproduction_time=20, energy_value=15)]] """ row, col = coords = entity.coords adjacent_squares: dict[Literal["N", "E", "S", "W"], tuple[int, int]] = { "N": (row - 1, col), # North "S": (row + 1, col), # South "W": (row, col - 1), # West "E": (row, col + 1), # East } # Weight adjacent locations adjacent: list[tuple[int, int]] = [] for order in direction_orders: adjacent.append(adjacent_squares[order]) for r, c in adjacent: if ( 0 <= r < self.height and 0 <= c < self.width and self.planet[r][c] is None ): # Move entity to empty adjacent square self.planet[r][c] = entity self.planet[row][col] = None entity.coords = (r, c) break # (2.) See if it possible to reproduce in previous square if coords != entity.coords and entity.remaining_reproduction_time <= 0: # Check if the entities on the planet is less than the max limit if len(self.get_entities()) < MAX_ENTITIES: # Reproduce in previous square self.planet[row][col] = Entity(prey=entity.prey, coords=coords) entity.reset_reproduction_time() else: entity.remaining_reproduction_time -= 1 def perform_prey_actions( self, entity: Entity, direction_orders: list[Literal["N", "E", "S", "W"]] ) -> None: """ Performs the actions for a prey entity For prey the rules are: 1. At each chronon, a prey moves randomly to one of the adjacent unoccupied squares. If there are no free squares, no movement takes place. 2. Once a prey has survived a certain number of chronons it may reproduce. This is done as it moves to a neighbouring square, leaving behind a new prey in its old position. Its reproduction time is also reset to zero. >>> wt = WaTor(WIDTH, HEIGHT) >>> reproducable_entity = Entity(True, coords=(0, 1)) >>> reproducable_entity.remaining_reproduction_time = 0 >>> wt.planet = [[None, reproducable_entity]] >>> wt.perform_prey_actions(reproducable_entity, ... direction_orders=["N", "W", "S", "E"]) >>> wt.planet # doctest: +NORMALIZE_WHITESPACE [[Entity(prey=True, coords=(0, 0), remaining_reproduction_time=5), Entity(prey=True, coords=(0, 1), remaining_reproduction_time=5)]] """ self.move_and_reproduce(entity, direction_orders) def perform_predator_actions( self, entity: Entity, occupied_by_prey_coords: tuple[int, int] | None, direction_orders: list[Literal["N", "E", "S", "W"]], ) -> None: """ Performs the actions for a predator entity :param occupied_by_prey_coords: Move to this location if there is prey there For predators the rules are: 1. At each chronon, a predator moves randomly to an adjacent square occupied by a prey. If there is none, the predator moves to a random adjacent unoccupied square. If there are no free squares, no movement takes place. 2. At each chronon, each predator is deprived of a unit of energy. 3. Upon reaching zero energy, a predator dies. 4. If a predator moves to a square occupied by a prey, it eats the prey and earns a certain amount of energy. 5. Once a predator has survived a certain number of chronons it may reproduce in exactly the same way as the prey. >>> wt = WaTor(WIDTH, HEIGHT) >>> wt.set_planet([[Entity(True, coords=(0, 0)), Entity(False, coords=(0, 1))]]) >>> wt.perform_predator_actions(Entity(False, coords=(0, 1)), (0, 0), []) >>> wt.planet # doctest: +NORMALIZE_WHITESPACE [[Entity(prey=False, coords=(0, 0), remaining_reproduction_time=20, energy_value=19), None]] """ assert entity.energy_value is not None # [type checking] # (3.) If the entity has 0 energy, it will die if entity.energy_value == 0: self.planet[entity.coords[0]][entity.coords[1]] = None return # (1.) Move to entity if possible if occupied_by_prey_coords is not None: # Kill the prey prey = self.planet[occupied_by_prey_coords[0]][occupied_by_prey_coords[1]] assert prey is not None prey.alive = False # Move onto prey self.planet[occupied_by_prey_coords[0]][occupied_by_prey_coords[1]] = entity self.planet[entity.coords[0]][entity.coords[1]] = None entity.coords = occupied_by_prey_coords # (4.) Eats the prey and earns energy entity.energy_value += PREDATOR_FOOD_VALUE else: # (5.) If it has survived the certain number of chronons it will also # reproduce in this function self.move_and_reproduce(entity, direction_orders) # (2.) Each chronon, the predator is deprived of a unit of energy entity.energy_value -= 1 def run(self, *, iteration_count: int) -> None: """ Emulate time passing by looping `iteration_count` times >>> wt = WaTor(WIDTH, HEIGHT) >>> wt.run(iteration_count=PREDATOR_INITIAL_ENERGY_VALUE - 1) >>> len(list(filter(lambda entity: entity.prey is False, ... wt.get_entities()))) >= PREDATOR_INITIAL_COUNT True """ for iter_num in range(iteration_count): # Generate list of all entities in order to randomly # pop an entity at a time to simulate true randomness # This removes the systematic approach of iterating # through each entity width by height all_entities = self.get_entities() for __ in range(len(all_entities)): entity = all_entities.pop(randint(0, len(all_entities) - 1)) if entity.alive is False: continue directions: list[Literal["N", "E", "S", "W"]] = ["N", "E", "S", "W"] shuffle(directions) # Randomly shuffle directions if entity.prey: self.perform_prey_actions(entity, directions) else: # Create list of surrounding prey surrounding_prey = self.get_surrounding_prey(entity) surrounding_prey_coords = None if surrounding_prey: # Again, randomly shuffle directions shuffle(surrounding_prey) surrounding_prey_coords = surrounding_prey[0].coords self.perform_predator_actions( entity, surrounding_prey_coords, directions ) # Balance out the predators and prey self.balance_predators_and_prey() if self.time_passed is not None: # Call time_passed function for Wa-Tor planet # visualisation in a terminal or a graph. self.time_passed(self, iter_num) def visualise(wt: WaTor, iter_number: int, *, colour: bool = True) -> None: """ Visually displays the Wa-Tor planet using an ascii code in terminal to clear and re-print the Wa-Tor planet at intervals. Uses ascii colour codes to colourfully display the predators and prey: * (0x60f197) Prey = ``#`` * (0xfffff) Predator = ``x`` >>> wt = WaTor(30, 30) >>> wt.set_planet([ ... [Entity(True, coords=(0, 0)), Entity(False, coords=(0, 1)), None], ... [Entity(False, coords=(1, 0)), None, Entity(False, coords=(1, 2))], ... [None, Entity(True, coords=(2, 1)), None] ... ]) >>> visualise(wt, 0, colour=False) # doctest: +NORMALIZE_WHITESPACE # x . x . x . # . Iteration: 0 | Prey count: 2 | Predator count: 3 | """ if colour: __import__("os").system("") print("\x1b[0;0H\x1b[2J\x1b[?25l") reprint = "\x1b[0;0H" if colour else "" ansi_colour_end = "\x1b[0m " if colour else " " planet = wt.planet output = "" # Iterate over every entity in the planet for row in planet: for entity in row: if entity is None: output += " . " else: if colour is True: output += ( "\x1b[38;2;96;241;151m" if entity.prey else "\x1b[38;2;255;255;15m" ) output += f" {'#' if entity.prey else 'x'}{ansi_colour_end}" output += "\n" entities = wt.get_entities() prey_count = sum(entity.prey for entity in entities) print( f"{output}\n Iteration: {iter_number} | Prey count: {prey_count} | " f"Predator count: {len(entities) - prey_count} | {reprint}" ) # Block the thread to be able to visualise seeing the algorithm sleep(0.05) if __name__ == "__main__": import doctest doctest.testmod() wt = WaTor(WIDTH, HEIGHT) wt.time_passed = visualise wt.run(iteration_count=100_000) ================================================ FILE: ciphers/README.md ================================================ # Ciphers Ciphers are used to protect data from people that are not allowed to have it. They are everywhere on the internet to protect your connections. * * * ================================================ FILE: ciphers/__init__.py ================================================ ================================================ FILE: ciphers/a1z26.py ================================================ """ Convert a string of characters to a sequence of numbers corresponding to the character's position in the alphabet. https://www.dcode.fr/letter-number-cipher http://bestcodes.weebly.com/a1z26.html """ from __future__ import annotations def encode(plain: str) -> list[int]: """ >>> encode("myname") [13, 25, 14, 1, 13, 5] """ return [ord(elem) - 96 for elem in plain] def decode(encoded: list[int]) -> str: """ >>> decode([13, 25, 14, 1, 13, 5]) 'myname' """ return "".join(chr(elem + 96) for elem in encoded) def main() -> None: encoded = encode(input("-> ").strip().lower()) print("Encoded: ", encoded) print("Decoded:", decode(encoded)) if __name__ == "__main__": main() ================================================ FILE: ciphers/affine_cipher.py ================================================ import random import sys from maths.greatest_common_divisor import gcd_by_iterative from . import cryptomath_module as cryptomath SYMBOLS = ( r""" !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`""" r"""abcdefghijklmnopqrstuvwxyz{|}~""" ) def check_keys(key_a: int, key_b: int, mode: str) -> None: if mode == "encrypt": if key_a == 1: sys.exit( "The affine cipher becomes weak when key " "A is set to 1. Choose different key" ) if key_b == 0: sys.exit( "The affine cipher becomes weak when key " "B is set to 0. Choose different key" ) if key_a < 0 or key_b < 0 or key_b > len(SYMBOLS) - 1: sys.exit( "Key A must be greater than 0 and key B must " f"be between 0 and {len(SYMBOLS) - 1}." ) if gcd_by_iterative(key_a, len(SYMBOLS)) != 1: sys.exit( f"Key A {key_a} and the symbol set size {len(SYMBOLS)} " "are not relatively prime. Choose a different key." ) def encrypt_message(key: int, message: str) -> str: """ >>> encrypt_message(4545, 'The affine cipher is a type of monoalphabetic ' ... 'substitution cipher.') 'VL}p MM{I}p~{HL}Gp{vp pFsH}pxMpyxIx JHL O}F{~pvuOvF{FuF{xIp~{HL}Gi' """ key_a, key_b = divmod(key, len(SYMBOLS)) check_keys(key_a, key_b, "encrypt") cipher_text = "" for symbol in message: if symbol in SYMBOLS: sym_index = SYMBOLS.find(symbol) cipher_text += SYMBOLS[(sym_index * key_a + key_b) % len(SYMBOLS)] else: cipher_text += symbol return cipher_text def decrypt_message(key: int, message: str) -> str: """ >>> decrypt_message(4545, 'VL}p MM{I}p~{HL}Gp{vp pFsH}pxMpyxIx JHL O}F{~pvuOvF{FuF' ... '{xIp~{HL}Gi') 'The affine cipher is a type of monoalphabetic substitution cipher.' """ key_a, key_b = divmod(key, len(SYMBOLS)) check_keys(key_a, key_b, "decrypt") plain_text = "" mod_inverse_of_key_a = cryptomath.find_mod_inverse(key_a, len(SYMBOLS)) for symbol in message: if symbol in SYMBOLS: sym_index = SYMBOLS.find(symbol) plain_text += SYMBOLS[ (sym_index - key_b) * mod_inverse_of_key_a % len(SYMBOLS) ] else: plain_text += symbol return plain_text def get_random_key() -> int: while True: key_b = random.randint(2, len(SYMBOLS)) key_b = random.randint(2, len(SYMBOLS)) if gcd_by_iterative(key_b, len(SYMBOLS)) == 1 and key_b % len(SYMBOLS) != 0: return key_b * len(SYMBOLS) + key_b def main() -> None: """ >>> key = get_random_key() >>> msg = "This is a test!" >>> decrypt_message(key, encrypt_message(key, msg)) == msg True """ message = input("Enter message: ").strip() key = int(input("Enter key [2000 - 9000]: ").strip()) mode = input("Encrypt/Decrypt [E/D]: ").strip().lower() if mode.startswith("e"): mode = "encrypt" translated = encrypt_message(key, message) elif mode.startswith("d"): mode = "decrypt" translated = decrypt_message(key, message) print(f"\n{mode.title()}ed text: \n{translated}") if __name__ == "__main__": import doctest doctest.testmod() # main() ================================================ FILE: ciphers/atbash.py ================================================ """https://en.wikipedia.org/wiki/Atbash""" import string def atbash_slow(sequence: str) -> str: """ >>> atbash_slow("ABCDEFG") 'ZYXWVUT' >>> atbash_slow("aW;;123BX") 'zD;;123YC' """ output = "" for i in sequence: extract = ord(i) if 65 <= extract <= 90: output += chr(155 - extract) elif 97 <= extract <= 122: output += chr(219 - extract) else: output += i return output def atbash(sequence: str) -> str: """ >>> atbash("ABCDEFG") 'ZYXWVUT' >>> atbash("aW;;123BX") 'zD;;123YC' """ letters = string.ascii_letters letters_reversed = string.ascii_lowercase[::-1] + string.ascii_uppercase[::-1] return "".join( letters_reversed[letters.index(c)] if c in letters else c for c in sequence ) def benchmark() -> None: """Let's benchmark our functions side-by-side...""" from timeit import timeit print("Running performance benchmarks...") setup = "from string import printable ; from __main__ import atbash, atbash_slow" print(f"> atbash_slow(): {timeit('atbash_slow(printable)', setup=setup)} seconds") print(f"> atbash(): {timeit('atbash(printable)', setup=setup)} seconds") if __name__ == "__main__": for example in ("ABCDEFGH", "123GGjj", "testStringtest", "with space"): print(f"{example} encrypted in atbash: {atbash(example)}") benchmark() ================================================ FILE: ciphers/autokey.py ================================================ """ https://en.wikipedia.org/wiki/Autokey_cipher An autokey cipher (also known as the autoclave cipher) is a cipher that incorporates the message (the plaintext) into the key. The key is generated from the message in some automated fashion, sometimes by selecting certain letters from the text or, more commonly, by adding a short primer key to the front of the message. """ def encrypt(plaintext: str, key: str) -> str: """ Encrypt a given `plaintext` (string) and `key` (string), returning the encrypted ciphertext. >>> encrypt("hello world", "coffee") 'jsqqs avvwo' >>> encrypt("coffee is good as python", "TheAlgorithms") 'vvjfpk wj ohvp su ddylsv' >>> encrypt("coffee is good as python", 2) Traceback (most recent call last): ... TypeError: key must be a string >>> encrypt("", "TheAlgorithms") Traceback (most recent call last): ... ValueError: plaintext is empty >>> encrypt("coffee is good as python", "") Traceback (most recent call last): ... ValueError: key is empty >>> encrypt(527.26, "TheAlgorithms") Traceback (most recent call last): ... TypeError: plaintext must be a string """ if not isinstance(plaintext, str): raise TypeError("plaintext must be a string") if not isinstance(key, str): raise TypeError("key must be a string") if not plaintext: raise ValueError("plaintext is empty") if not key: raise ValueError("key is empty") key += plaintext plaintext = plaintext.lower() key = key.lower() plaintext_iterator = 0 key_iterator = 0 ciphertext = "" while plaintext_iterator < len(plaintext): if ( ord(plaintext[plaintext_iterator]) < 97 or ord(plaintext[plaintext_iterator]) > 122 ): ciphertext += plaintext[plaintext_iterator] plaintext_iterator += 1 elif ord(key[key_iterator]) < 97 or ord(key[key_iterator]) > 122: key_iterator += 1 else: ciphertext += chr( ( (ord(plaintext[plaintext_iterator]) - 97 + ord(key[key_iterator])) - 97 ) % 26 + 97 ) key_iterator += 1 plaintext_iterator += 1 return ciphertext def decrypt(ciphertext: str, key: str) -> str: """ Decrypt a given `ciphertext` (string) and `key` (string), returning the decrypted ciphertext. >>> decrypt("jsqqs avvwo", "coffee") 'hello world' >>> decrypt("vvjfpk wj ohvp su ddylsv", "TheAlgorithms") 'coffee is good as python' >>> decrypt("vvjfpk wj ohvp su ddylsv", "") Traceback (most recent call last): ... ValueError: key is empty >>> decrypt(527.26, "TheAlgorithms") Traceback (most recent call last): ... TypeError: ciphertext must be a string >>> decrypt("", "TheAlgorithms") Traceback (most recent call last): ... ValueError: ciphertext is empty >>> decrypt("vvjfpk wj ohvp su ddylsv", 2) Traceback (most recent call last): ... TypeError: key must be a string """ if not isinstance(ciphertext, str): raise TypeError("ciphertext must be a string") if not isinstance(key, str): raise TypeError("key must be a string") if not ciphertext: raise ValueError("ciphertext is empty") if not key: raise ValueError("key is empty") key = key.lower() ciphertext_iterator = 0 key_iterator = 0 plaintext = "" while ciphertext_iterator < len(ciphertext): if ( ord(ciphertext[ciphertext_iterator]) < 97 or ord(ciphertext[ciphertext_iterator]) > 122 ): plaintext += ciphertext[ciphertext_iterator] else: plaintext += chr( (ord(ciphertext[ciphertext_iterator]) - ord(key[key_iterator])) % 26 + 97 ) key += chr( (ord(ciphertext[ciphertext_iterator]) - ord(key[key_iterator])) % 26 + 97 ) key_iterator += 1 ciphertext_iterator += 1 return plaintext if __name__ == "__main__": import doctest doctest.testmod() operation = int(input("Type 1 to encrypt or 2 to decrypt:")) if operation == 1: plaintext = input("Typeplaintext to be encrypted:\n") key = input("Type the key:\n") print(encrypt(plaintext, key)) elif operation == 2: ciphertext = input("Type the ciphertext to be decrypted:\n") key = input("Type the key:\n") print(decrypt(ciphertext, key)) decrypt("jsqqs avvwo", "coffee") ================================================ FILE: ciphers/baconian_cipher.py ================================================ """ Program to encode and decode Baconian or Bacon's Cipher Wikipedia reference : https://en.wikipedia.org/wiki/Bacon%27s_cipher """ encode_dict = { "a": "AAAAA", "b": "AAAAB", "c": "AAABA", "d": "AAABB", "e": "AABAA", "f": "AABAB", "g": "AABBA", "h": "AABBB", "i": "ABAAA", "j": "BBBAA", "k": "ABAAB", "l": "ABABA", "m": "ABABB", "n": "ABBAA", "o": "ABBAB", "p": "ABBBA", "q": "ABBBB", "r": "BAAAA", "s": "BAAAB", "t": "BAABA", "u": "BAABB", "v": "BBBAB", "w": "BABAA", "x": "BABAB", "y": "BABBA", "z": "BABBB", " ": " ", } decode_dict = {value: key for key, value in encode_dict.items()} def encode(word: str) -> str: """ Encodes to Baconian cipher >>> encode("hello") 'AABBBAABAAABABAABABAABBAB' >>> encode("hello world") 'AABBBAABAAABABAABABAABBAB BABAAABBABBAAAAABABAAAABB' >>> encode("hello world!") Traceback (most recent call last): ... Exception: encode() accepts only letters of the alphabet and spaces """ encoded = "" for letter in word.lower(): if letter.isalpha() or letter == " ": encoded += encode_dict[letter] else: raise Exception("encode() accepts only letters of the alphabet and spaces") return encoded def decode(coded: str) -> str: """ Decodes from Baconian cipher >>> decode("AABBBAABAAABABAABABAABBAB BABAAABBABBAAAAABABAAAABB") 'hello world' >>> decode("AABBBAABAAABABAABABAABBAB") 'hello' >>> decode("AABBBAABAAABABAABABAABBAB BABAAABBABBAAAAABABAAAABB!") Traceback (most recent call last): ... Exception: decode() accepts only 'A', 'B' and spaces """ if set(coded) - {"A", "B", " "} != set(): raise Exception("decode() accepts only 'A', 'B' and spaces") decoded = "" for word in coded.split(): while len(word) != 0: decoded += decode_dict[word[:5]] word = word[5:] decoded += " " return decoded.strip() if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: ciphers/base16.py ================================================ def base16_encode(data: bytes) -> str: """ Encodes the given bytes into base16. >>> base16_encode(b'Hello World!') '48656C6C6F20576F726C6421' >>> base16_encode(b'HELLO WORLD!') '48454C4C4F20574F524C4421' >>> base16_encode(b'') '' """ # Turn the data into a list of integers (where each integer is a byte), # Then turn each byte into its hexadecimal representation, make sure # it is uppercase, and then join everything together and return it. return "".join([hex(byte)[2:].zfill(2).upper() for byte in list(data)]) def base16_decode(data: str) -> bytes: """ Decodes the given base16 encoded data into bytes. >>> base16_decode('48656C6C6F20576F726C6421') b'Hello World!' >>> base16_decode('48454C4C4F20574F524C4421') b'HELLO WORLD!' >>> base16_decode('') b'' >>> base16_decode('486') Traceback (most recent call last): ... ValueError: Base16 encoded data is invalid: Data does not have an even number of hex digits. >>> base16_decode('48656c6c6f20576f726c6421') Traceback (most recent call last): ... ValueError: Base16 encoded data is invalid: Data is not uppercase hex or it contains invalid characters. >>> base16_decode('This is not base64 encoded data.') Traceback (most recent call last): ... ValueError: Base16 encoded data is invalid: Data is not uppercase hex or it contains invalid characters. """ # Check data validity, following RFC3548 # https://www.ietf.org/rfc/rfc3548.txt if (len(data) % 2) != 0: raise ValueError( """Base16 encoded data is invalid: Data does not have an even number of hex digits.""" ) # Check the character set - the standard base16 alphabet # is uppercase according to RFC3548 section 6 if not set(data) <= set("0123456789ABCDEF"): raise ValueError( """Base16 encoded data is invalid: Data is not uppercase hex or it contains invalid characters.""" ) # For every two hexadecimal digits (= a byte), turn it into an integer. # Then, string the result together into bytes, and return it. return bytes(int(data[i] + data[i + 1], 16) for i in range(0, len(data), 2)) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: ciphers/base32.py ================================================ """ Base32 encoding and decoding https://en.wikipedia.org/wiki/Base32 """ B32_CHARSET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567" def base32_encode(data: bytes) -> bytes: """ >>> base32_encode(b"Hello World!") b'JBSWY3DPEBLW64TMMQQQ====' >>> base32_encode(b"123456") b'GEZDGNBVGY======' >>> base32_encode(b"some long complex string") b'ONXW2ZJANRXW4ZZAMNXW24DMMV4CA43UOJUW4ZY=' """ binary_data = "".join(bin(ord(d))[2:].zfill(8) for d in data.decode("utf-8")) binary_data = binary_data.ljust(5 * ((len(binary_data) // 5) + 1), "0") b32_chunks = map("".join, zip(*[iter(binary_data)] * 5)) b32_result = "".join(B32_CHARSET[int(chunk, 2)] for chunk in b32_chunks) return bytes(b32_result.ljust(8 * ((len(b32_result) // 8) + 1), "="), "utf-8") def base32_decode(data: bytes) -> bytes: """ >>> base32_decode(b'JBSWY3DPEBLW64TMMQQQ====') b'Hello World!' >>> base32_decode(b'GEZDGNBVGY======') b'123456' >>> base32_decode(b'ONXW2ZJANRXW4ZZAMNXW24DMMV4CA43UOJUW4ZY=') b'some long complex string' """ binary_chunks = "".join( bin(B32_CHARSET.index(_d))[2:].zfill(5) for _d in data.decode("utf-8").strip("=") ) binary_data = list(map("".join, zip(*[iter(binary_chunks)] * 8))) return bytes("".join([chr(int(_d, 2)) for _d in binary_data]), "utf-8") if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: ciphers/base64_cipher.py ================================================ B64_CHARSET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" def base64_encode(data: bytes) -> bytes: """Encodes data according to RFC4648. The data is first transformed to binary and appended with binary digits so that its length becomes a multiple of 6, then each 6 binary digits will match a character in the B64_CHARSET string. The number of appended binary digits would later determine how many "=" signs should be added, the padding. For every 2 binary digits added, a "=" sign is added in the output. We can add any binary digits to make it a multiple of 6, for instance, consider the following example: "AA" -> 0010100100101001 -> 001010 010010 1001 As can be seen above, 2 more binary digits should be added, so there's 4 possibilities here: 00, 01, 10 or 11. That being said, Base64 encoding can be used in Steganography to hide data in these appended digits. >>> from base64 import b64encode >>> a = b"This pull request is part of Hacktoberfest20!" >>> b = b"https://tools.ietf.org/html/rfc4648" >>> c = b"A" >>> base64_encode(a) == b64encode(a) True >>> base64_encode(b) == b64encode(b) True >>> base64_encode(c) == b64encode(c) True >>> base64_encode("abc") Traceback (most recent call last): ... TypeError: a bytes-like object is required, not 'str' """ # Make sure the supplied data is a bytes-like object if not isinstance(data, bytes): msg = f"a bytes-like object is required, not '{data.__class__.__name__}'" raise TypeError(msg) binary_stream = "".join(bin(byte)[2:].zfill(8) for byte in data) padding_needed = len(binary_stream) % 6 != 0 if padding_needed: # The padding that will be added later padding = b"=" * ((6 - len(binary_stream) % 6) // 2) # Append binary_stream with arbitrary binary digits (0's by default) to make its # length a multiple of 6. binary_stream += "0" * (6 - len(binary_stream) % 6) else: padding = b"" # Encode every 6 binary digits to their corresponding Base64 character return ( "".join( B64_CHARSET[int(binary_stream[index : index + 6], 2)] for index in range(0, len(binary_stream), 6) ).encode() + padding ) def base64_decode(encoded_data: str) -> bytes: """Decodes data according to RFC4648. This does the reverse operation of base64_encode. We first transform the encoded data back to a binary stream, take off the previously appended binary digits according to the padding, at this point we would have a binary stream whose length is multiple of 8, the last step is to convert every 8 bits to a byte. >>> from base64 import b64decode >>> a = "VGhpcyBwdWxsIHJlcXVlc3QgaXMgcGFydCBvZiBIYWNrdG9iZXJmZXN0MjAh" >>> b = "aHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ2NDg=" >>> c = "QQ==" >>> base64_decode(a) == b64decode(a) True >>> base64_decode(b) == b64decode(b) True >>> base64_decode(c) == b64decode(c) True >>> base64_decode("abc") Traceback (most recent call last): ... AssertionError: Incorrect padding """ # Make sure encoded_data is either a string or a bytes-like object if not isinstance(encoded_data, bytes) and not isinstance(encoded_data, str): msg = ( "argument should be a bytes-like object or ASCII string, " f"not '{encoded_data.__class__.__name__}'" ) raise TypeError(msg) # In case encoded_data is a bytes-like object, make sure it contains only # ASCII characters so we convert it to a string object if isinstance(encoded_data, bytes): try: encoded_data = encoded_data.decode("utf-8") except UnicodeDecodeError: raise ValueError("base64 encoded data should only contain ASCII characters") padding = encoded_data.count("=") # Check if the encoded string contains non base64 characters if padding: assert all(char in B64_CHARSET for char in encoded_data[:-padding]), ( "Invalid base64 character(s) found." ) else: assert all(char in B64_CHARSET for char in encoded_data), ( "Invalid base64 character(s) found." ) # Check the padding assert len(encoded_data) % 4 == 0 and padding < 3, "Incorrect padding" if padding: # Remove padding if there is one encoded_data = encoded_data[:-padding] binary_stream = "".join( bin(B64_CHARSET.index(char))[2:].zfill(6) for char in encoded_data )[: -padding * 2] else: binary_stream = "".join( bin(B64_CHARSET.index(char))[2:].zfill(6) for char in encoded_data ) data = [ int(binary_stream[index : index + 8], 2) for index in range(0, len(binary_stream), 8) ] return bytes(data) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: ciphers/base85.py ================================================ """ Base85 (Ascii85) encoding and decoding https://en.wikipedia.org/wiki/Ascii85 """ def _base10_to_85(d: int) -> str: return "".join(chr(d % 85 + 33)) + _base10_to_85(d // 85) if d > 0 else "" def _base85_to_10(digits: list) -> int: return sum(char * 85**i for i, char in enumerate(reversed(digits))) def ascii85_encode(data: bytes) -> bytes: """ >>> ascii85_encode(b"") b'' >>> ascii85_encode(b"12345") b'0etOA2#' >>> ascii85_encode(b"base 85") b'@UX=h+?24' """ binary_data = "".join(bin(ord(d))[2:].zfill(8) for d in data.decode("utf-8")) null_values = (32 * ((len(binary_data) // 32) + 1) - len(binary_data)) // 8 binary_data = binary_data.ljust(32 * ((len(binary_data) // 32) + 1), "0") b85_chunks = [int(_s, 2) for _s in map("".join, zip(*[iter(binary_data)] * 32))] result = "".join(_base10_to_85(chunk)[::-1] for chunk in b85_chunks) return bytes(result[:-null_values] if null_values % 4 != 0 else result, "utf-8") def ascii85_decode(data: bytes) -> bytes: """ >>> ascii85_decode(b"") b'' >>> ascii85_decode(b"0etOA2#") b'12345' >>> ascii85_decode(b"@UX=h+?24") b'base 85' """ null_values = 5 * ((len(data) // 5) + 1) - len(data) binary_data = data.decode("utf-8") + "u" * null_values b85_chunks = map("".join, zip(*[iter(binary_data)] * 5)) b85_segments = [[ord(_s) - 33 for _s in chunk] for chunk in b85_chunks] results = [bin(_base85_to_10(chunk))[2::].zfill(32) for chunk in b85_segments] char_chunks = [ [chr(int(_s, 2)) for _s in map("".join, zip(*[iter(r)] * 8))] for r in results ] result = "".join("".join(char) for char in char_chunks) offset = int(null_values % 5 == 0) return bytes(result[: offset - null_values], "utf-8") if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: ciphers/beaufort_cipher.py ================================================ """ Author: Mohit Radadiya """ from string import ascii_uppercase dict1 = {char: i for i, char in enumerate(ascii_uppercase)} dict2 = dict(enumerate(ascii_uppercase)) # This function generates the key in # a cyclic manner until it's length isn't # equal to the length of original text def generate_key(message: str, key: str) -> str: """ >>> generate_key("THE GERMAN ATTACK","SECRET") 'SECRETSECRETSECRE' """ x = len(message) i = 0 while True: if x == i: i = 0 if len(key) == len(message): break key += key[i] i += 1 return key # This function returns the encrypted text # generated with the help of the key def cipher_text(message: str, key_new: str) -> str: """ >>> cipher_text("THE GERMAN ATTACK","SECRETSECRETSECRE") 'BDC PAYUWL JPAIYI' """ cipher_text = "" i = 0 for letter in message: if letter == " ": cipher_text += " " else: x = (dict1[letter] - dict1[key_new[i]]) % 26 i += 1 cipher_text += dict2[x] return cipher_text # This function decrypts the encrypted text # and returns the original text def original_text(cipher_text: str, key_new: str) -> str: """ >>> original_text("BDC PAYUWL JPAIYI","SECRETSECRETSECRE") 'THE GERMAN ATTACK' """ or_txt = "" i = 0 for letter in cipher_text: if letter == " ": or_txt += " " else: x = (dict1[letter] + dict1[key_new[i]] + 26) % 26 i += 1 or_txt += dict2[x] return or_txt def main() -> None: message = "THE GERMAN ATTACK" key = "SECRET" key_new = generate_key(message, key) s = cipher_text(message, key_new) print(f"Encrypted Text = {s}") print(f"Original Text = {original_text(s, key_new)}") if __name__ == "__main__": import doctest doctest.testmod() main() ================================================ FILE: ciphers/bifid.py ================================================ #!/usr/bin/env python3 """ The Bifid Cipher uses a Polybius Square to encipher a message in a way that makes it fairly difficult to decipher without knowing the secret. https://www.braingle.com/brainteasers/codes/bifid.php """ import numpy as np SQUARE = [ ["a", "b", "c", "d", "e"], ["f", "g", "h", "i", "k"], ["l", "m", "n", "o", "p"], ["q", "r", "s", "t", "u"], ["v", "w", "x", "y", "z"], ] class BifidCipher: def __init__(self) -> None: self.SQUARE = np.array(SQUARE) def letter_to_numbers(self, letter: str) -> np.ndarray: """ Return the pair of numbers that represents the given letter in the polybius square >>> np.array_equal(BifidCipher().letter_to_numbers('a'), [1,1]) True >>> np.array_equal(BifidCipher().letter_to_numbers('u'), [4,5]) True """ index1, index2 = np.where(letter == self.SQUARE) indexes = np.concatenate([index1 + 1, index2 + 1]) return indexes def numbers_to_letter(self, index1: int, index2: int) -> str: """ Return the letter corresponding to the position [index1, index2] in the polybius square >>> BifidCipher().numbers_to_letter(4, 5) == "u" True >>> BifidCipher().numbers_to_letter(1, 1) == "a" True """ letter = self.SQUARE[index1 - 1, index2 - 1] return letter def encode(self, message: str) -> str: """ Return the encoded version of message according to the polybius cipher >>> BifidCipher().encode('testmessage') == 'qtltbdxrxlk' True >>> BifidCipher().encode('Test Message') == 'qtltbdxrxlk' True >>> BifidCipher().encode('test j') == BifidCipher().encode('test i') True """ message = message.lower() message = message.replace(" ", "") message = message.replace("j", "i") first_step = np.empty((2, len(message))) for letter_index in range(len(message)): numbers = self.letter_to_numbers(message[letter_index]) first_step[0, letter_index] = numbers[0] first_step[1, letter_index] = numbers[1] second_step = first_step.reshape(2 * len(message)) encoded_message = "" for numbers_index in range(len(message)): index1 = int(second_step[numbers_index * 2]) index2 = int(second_step[(numbers_index * 2) + 1]) letter = self.numbers_to_letter(index1, index2) encoded_message = encoded_message + letter return encoded_message def decode(self, message: str) -> str: """ Return the decoded version of message according to the polybius cipher >>> BifidCipher().decode('qtltbdxrxlk') == 'testmessage' True """ message = message.lower() message.replace(" ", "") first_step = np.empty(2 * len(message)) for letter_index in range(len(message)): numbers = self.letter_to_numbers(message[letter_index]) first_step[letter_index * 2] = numbers[0] first_step[letter_index * 2 + 1] = numbers[1] second_step = first_step.reshape((2, len(message))) decoded_message = "" for numbers_index in range(len(message)): index1 = int(second_step[0, numbers_index]) index2 = int(second_step[1, numbers_index]) letter = self.numbers_to_letter(index1, index2) decoded_message = decoded_message + letter return decoded_message ================================================ FILE: ciphers/brute_force_caesar_cipher.py ================================================ import string def decrypt(message: str) -> None: """ >>> decrypt('TMDETUX PMDVU') Decryption using Key #0: TMDETUX PMDVU Decryption using Key #1: SLCDSTW OLCUT Decryption using Key #2: RKBCRSV NKBTS Decryption using Key #3: QJABQRU MJASR Decryption using Key #4: PIZAPQT LIZRQ Decryption using Key #5: OHYZOPS KHYQP Decryption using Key #6: NGXYNOR JGXPO Decryption using Key #7: MFWXMNQ IFWON Decryption using Key #8: LEVWLMP HEVNM Decryption using Key #9: KDUVKLO GDUML Decryption using Key #10: JCTUJKN FCTLK Decryption using Key #11: IBSTIJM EBSKJ Decryption using Key #12: HARSHIL DARJI Decryption using Key #13: GZQRGHK CZQIH Decryption using Key #14: FYPQFGJ BYPHG Decryption using Key #15: EXOPEFI AXOGF Decryption using Key #16: DWNODEH ZWNFE Decryption using Key #17: CVMNCDG YVMED Decryption using Key #18: BULMBCF XULDC Decryption using Key #19: ATKLABE WTKCB Decryption using Key #20: ZSJKZAD VSJBA Decryption using Key #21: YRIJYZC URIAZ Decryption using Key #22: XQHIXYB TQHZY Decryption using Key #23: WPGHWXA SPGYX Decryption using Key #24: VOFGVWZ ROFXW Decryption using Key #25: UNEFUVY QNEWV """ for key in range(len(string.ascii_uppercase)): translated = "" for symbol in message: if symbol in string.ascii_uppercase: num = string.ascii_uppercase.find(symbol) num = num - key if num < 0: num = num + len(string.ascii_uppercase) translated = translated + string.ascii_uppercase[num] else: translated = translated + symbol print(f"Decryption using Key #{key}: {translated}") def main() -> None: message = input("Encrypted message: ") message = message.upper() decrypt(message) if __name__ == "__main__": import doctest doctest.testmod() main() ================================================ FILE: ciphers/caesar_cipher.py ================================================ from __future__ import annotations from string import ascii_letters def encrypt(input_string: str, key: int, alphabet: str | None = None) -> str: """ encrypt ======= Encodes a given string with the caesar cipher and returns the encoded message Parameters: ----------- * `input_string`: the plain-text that needs to be encoded * `key`: the number of letters to shift the message by Optional: * `alphabet` (``None``): the alphabet used to encode the cipher, if not specified, the standard english alphabet with upper and lowercase letters is used Returns: * A string containing the encoded cipher-text More on the caesar cipher ========================= The caesar cipher is named after Julius Caesar who used it when sending secret military messages to his troops. This is a simple substitution cipher where every character in the plain-text is shifted by a certain number known as the "key" or "shift". Example: Say we have the following message: ``Hello, captain`` And our alphabet is made up of lower and uppercase letters: ``abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`` And our shift is ``2`` We can then encode the message, one letter at a time. ``H`` would become ``J``, since ``J`` is two letters away, and so on. If the shift is ever too large, or our letter is at the end of the alphabet, we just start at the beginning (``Z`` would shift to ``a`` then ``b`` and so on). Our final message would be ``Jgnnq, ecrvckp`` Further reading =============== * https://en.m.wikipedia.org/wiki/Caesar_cipher Doctests ======== >>> encrypt('The quick brown fox jumps over the lazy dog', 8) 'bpm yCqks jzwEv nwF rCuxA wDmz Bpm tiHG lwo' >>> encrypt('A very large key', 8000) 's nWjq dSjYW cWq' >>> encrypt('a lowercase alphabet', 5, 'abcdefghijklmnopqrstuvwxyz') 'f qtbjwhfxj fqumfgjy' """ # Set default alphabet to lower and upper case english chars alpha = alphabet or ascii_letters # The final result string result = "" for character in input_string: if character not in alpha: # Append without encryption if character is not in the alphabet result += character else: # Get the index of the new key and make sure it isn't too large new_key = (alpha.index(character) + key) % len(alpha) # Append the encoded character to the alphabet result += alpha[new_key] return result def decrypt(input_string: str, key: int, alphabet: str | None = None) -> str: """ decrypt ======= Decodes a given string of cipher-text and returns the decoded plain-text Parameters: ----------- * `input_string`: the cipher-text that needs to be decoded * `key`: the number of letters to shift the message backwards by to decode Optional: * `alphabet` (``None``): the alphabet used to decode the cipher, if not specified, the standard english alphabet with upper and lowercase letters is used Returns: * A string containing the decoded plain-text More on the caesar cipher ========================= The caesar cipher is named after Julius Caesar who used it when sending secret military messages to his troops. This is a simple substitution cipher where very character in the plain-text is shifted by a certain number known as the "key" or "shift". Please keep in mind, here we will be focused on decryption. Example: Say we have the following cipher-text: ``Jgnnq, ecrvckp`` And our alphabet is made up of lower and uppercase letters: ``abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`` And our shift is ``2`` To decode the message, we would do the same thing as encoding, but in reverse. The first letter, ``J`` would become ``H`` (remember: we are decoding) because ``H`` is two letters in reverse (to the left) of ``J``. We would continue doing this. A letter like ``a`` would shift back to the end of the alphabet, and would become ``Z`` or ``Y`` and so on. Our final message would be ``Hello, captain`` Further reading =============== * https://en.m.wikipedia.org/wiki/Caesar_cipher Doctests ======== >>> decrypt('bpm yCqks jzwEv nwF rCuxA wDmz Bpm tiHG lwo', 8) 'The quick brown fox jumps over the lazy dog' >>> decrypt('s nWjq dSjYW cWq', 8000) 'A very large key' >>> decrypt('f qtbjwhfxj fqumfgjy', 5, 'abcdefghijklmnopqrstuvwxyz') 'a lowercase alphabet' """ # Turn on decode mode by making the key negative key *= -1 return encrypt(input_string, key, alphabet) def brute_force(input_string: str, alphabet: str | None = None) -> dict[int, str]: """ brute_force =========== Returns all the possible combinations of keys and the decoded strings in the form of a dictionary Parameters: ----------- * `input_string`: the cipher-text that needs to be used during brute-force Optional: * `alphabet` (``None``): the alphabet used to decode the cipher, if not specified, the standard english alphabet with upper and lowercase letters is used More about brute force ====================== Brute force is when a person intercepts a message or password, not knowing the key and tries every single combination. This is easy with the caesar cipher since there are only all the letters in the alphabet. The more complex the cipher, the larger amount of time it will take to do brute force Ex: Say we have a ``5`` letter alphabet (``abcde``), for simplicity and we intercepted the following message: ``dbc``, we could then just write out every combination: ``ecd``... and so on, until we reach a combination that makes sense: ``cab`` Further reading =============== * https://en.wikipedia.org/wiki/Brute_force Doctests ======== >>> brute_force("jFyuMy xIH'N vLONy zILwy Gy!")[20] "Please don't brute force me!" >>> brute_force(1) Traceback (most recent call last): TypeError: 'int' object is not iterable """ # Set default alphabet to lower and upper case english chars alpha = alphabet or ascii_letters # To store data on all the combinations brute_force_data = {} # Cycle through each combination for key in range(1, len(alpha) + 1): # Decrypt the message and store the result in the data brute_force_data[key] = decrypt(input_string, key, alpha) return brute_force_data if __name__ == "__main__": while True: print(f"\n{'-' * 10}\n Menu\n{'-' * 10}") print(*["1.Encrypt", "2.Decrypt", "3.BruteForce", "4.Quit"], sep="\n") # get user input choice = input("\nWhat would you like to do?: ").strip() or "4" # run functions based on what the user chose if choice not in ("1", "2", "3", "4"): print("Invalid choice, please enter a valid choice") elif choice == "1": input_string = input("Please enter the string to be encrypted: ") key = int(input("Please enter off-set: ").strip()) print(encrypt(input_string, key)) elif choice == "2": input_string = input("Please enter the string to be decrypted: ") key = int(input("Please enter off-set: ").strip()) print(decrypt(input_string, key)) elif choice == "3": input_string = input("Please enter the string to be decrypted: ") brute_force_data = brute_force(input_string) for key, value in brute_force_data.items(): print(f"Key: {key} | Message: {value}") elif choice == "4": print("Goodbye.") break ================================================ FILE: ciphers/cryptomath_module.py ================================================ from maths.greatest_common_divisor import gcd_by_iterative def find_mod_inverse(a: int, m: int) -> int: if gcd_by_iterative(a, m) != 1: msg = f"mod inverse of {a!r} and {m!r} does not exist" raise ValueError(msg) u1, u2, u3 = 1, 0, a v1, v2, v3 = 0, 1, m while v3 != 0: q = u3 // v3 v1, v2, v3, u1, u2, u3 = (u1 - q * v1), (u2 - q * v2), (u3 - q * v3), v1, v2, v3 return u1 % m ================================================ FILE: ciphers/decrypt_caesar_with_chi_squared.py ================================================ #!/usr/bin/env python3 from __future__ import annotations def decrypt_caesar_with_chi_squared( ciphertext: str, cipher_alphabet: list[str] | None = None, frequencies_dict: dict[str, float] | None = None, case_sensitive: bool = False, ) -> tuple[int, float, str]: """ Basic Usage =========== Arguments: * `ciphertext` (str): the text to decode (encoded with the caesar cipher) Optional Arguments: * `cipher_alphabet` (list): the alphabet used for the cipher (each letter is a string separated by commas) * `frequencies_dict` (dict): a dictionary of word frequencies where keys are the letters and values are a percentage representation of the frequency as a decimal/float * `case_sensitive` (bool): a boolean value: ``True`` if the case matters during decryption, ``False`` if it doesn't Returns: * A tuple in the form of: (`most_likely_cipher`, `most_likely_cipher_chi_squared_value`, `decoded_most_likely_cipher`) where... - `most_likely_cipher` is an integer representing the shift of the smallest chi-squared statistic (most likely key) - `most_likely_cipher_chi_squared_value` is a float representing the chi-squared statistic of the most likely shift - `decoded_most_likely_cipher` is a string with the decoded cipher (decoded by the most_likely_cipher key) The Chi-squared test ==================== The caesar cipher ----------------- The caesar cipher is a very insecure encryption algorithm, however it has been used since Julius Caesar. The cipher is a simple substitution cipher where each character in the plain text is replaced by a character in the alphabet a certain number of characters after the original character. The number of characters away is called the shift or key. For example: | Plain text: ``hello`` | Key: ``1`` | Cipher text: ``ifmmp`` | (each letter in ``hello`` has been shifted one to the right in the eng. alphabet) As you can imagine, this doesn't provide lots of security. In fact decrypting ciphertext by brute-force is extremely easy even by hand. However one way to do that is the chi-squared test. The chi-squared test -------------------- Each letter in the english alphabet has a frequency, or the amount of times it shows up compared to other letters (usually expressed as a decimal representing the percentage likelihood). The most common letter in the english language is ``e`` with a frequency of ``0.11162`` or ``11.162%``. The test is completed in the following fashion. 1. The ciphertext is decoded in a brute force way (every combination of the ``26`` possible combinations) 2. For every combination, for each letter in the combination, the average amount of times the letter should appear the message is calculated by multiplying the total number of characters by the frequency of the letter. | For example: | In a message of ``100`` characters, ``e`` should appear around ``11.162`` times. 3. Then, to calculate the margin of error (the amount of times the letter SHOULD appear with the amount of times the letter DOES appear), we use the chi-squared test. The following formula is used: Let: - n be the number of times the letter actually appears - p be the predicted value of the number of times the letter should appear (see item ``2``) - let v be the chi-squared test result (referred to here as chi-squared value/statistic) :: (n - p)^2 --------- = v p 4. Each chi squared value for each letter is then added up to the total. The total is the chi-squared statistic for that encryption key. 5. The encryption key with the lowest chi-squared value is the most likely to be the decoded answer. Further Reading =============== * http://practicalcryptography.com/cryptanalysis/text-characterisation/chi-squared-statistic/ * https://en.wikipedia.org/wiki/Letter_frequency * https://en.wikipedia.org/wiki/Chi-squared_test * https://en.m.wikipedia.org/wiki/Caesar_cipher Doctests ======== >>> decrypt_caesar_with_chi_squared( ... 'dof pz aol jhlzhy jpwoly zv wvwbshy? pa pz avv lhzf av jyhjr!' ... ) # doctest: +NORMALIZE_WHITESPACE (7, 3129.228005747531, 'why is the caesar cipher so popular? it is too easy to crack!') >>> decrypt_caesar_with_chi_squared('crybd cdbsxq') (10, 233.35343938980898, 'short string') >>> decrypt_caesar_with_chi_squared('Crybd Cdbsxq', case_sensitive=True) (10, 233.35343938980898, 'Short String') >>> decrypt_caesar_with_chi_squared(12) Traceback (most recent call last): AttributeError: 'int' object has no attribute 'lower' """ alphabet_letters = cipher_alphabet or [chr(i) for i in range(97, 123)] # If the argument is None or the user provided an empty dictionary if not frequencies_dict: # Frequencies of letters in the english language (how much they show up) frequencies = { "a": 0.08497, "b": 0.01492, "c": 0.02202, "d": 0.04253, "e": 0.11162, "f": 0.02228, "g": 0.02015, "h": 0.06094, "i": 0.07546, "j": 0.00153, "k": 0.01292, "l": 0.04025, "m": 0.02406, "n": 0.06749, "o": 0.07507, "p": 0.01929, "q": 0.00095, "r": 0.07587, "s": 0.06327, "t": 0.09356, "u": 0.02758, "v": 0.00978, "w": 0.02560, "x": 0.00150, "y": 0.01994, "z": 0.00077, } else: # Custom frequencies dictionary frequencies = frequencies_dict if not case_sensitive: ciphertext = ciphertext.lower() # Chi squared statistic values chi_squared_statistic_values: dict[int, tuple[float, str]] = {} # cycle through all of the shifts for shift in range(len(alphabet_letters)): decrypted_with_shift = "" # decrypt the message with the shift for letter in ciphertext: try: # Try to index the letter in the alphabet new_key = (alphabet_letters.index(letter.lower()) - shift) % len( alphabet_letters ) decrypted_with_shift += ( alphabet_letters[new_key].upper() if case_sensitive and letter.isupper() else alphabet_letters[new_key] ) except ValueError: # Append the character if it isn't in the alphabet decrypted_with_shift += letter chi_squared_statistic = 0.0 # Loop through each letter in the decoded message with the shift for letter in decrypted_with_shift: if case_sensitive: letter = letter.lower() if letter in frequencies: # Get the amount of times the letter occurs in the message occurrences = decrypted_with_shift.lower().count(letter) # Get the excepcted amount of times the letter should appear based # on letter frequencies expected = frequencies[letter] * occurrences # Complete the chi squared statistic formula chi_letter_value = ((occurrences - expected) ** 2) / expected # Add the margin of error to the total chi squared statistic chi_squared_statistic += chi_letter_value elif letter.lower() in frequencies: # Get the amount of times the letter occurs in the message occurrences = decrypted_with_shift.count(letter) # Get the excepcted amount of times the letter should appear based # on letter frequencies expected = frequencies[letter] * occurrences # Complete the chi squared statistic formula chi_letter_value = ((occurrences - expected) ** 2) / expected # Add the margin of error to the total chi squared statistic chi_squared_statistic += chi_letter_value # Add the data to the chi_squared_statistic_values dictionary chi_squared_statistic_values[shift] = ( chi_squared_statistic, decrypted_with_shift, ) # Get the most likely cipher by finding the cipher with the smallest chi squared # statistic def chi_squared_statistic_values_sorting_key(key: int) -> tuple[float, str]: return chi_squared_statistic_values[key] most_likely_cipher: int = min( chi_squared_statistic_values, key=chi_squared_statistic_values_sorting_key, ) # Get all the data from the most likely cipher (key, decoded message) ( most_likely_cipher_chi_squared_value, decoded_most_likely_cipher, ) = chi_squared_statistic_values[most_likely_cipher] # Return the data on the most likely shift return ( most_likely_cipher, most_likely_cipher_chi_squared_value, decoded_most_likely_cipher, ) ================================================ FILE: ciphers/deterministic_miller_rabin.py ================================================ """Created by Nathan Damon, @bizzfitch on github >>> test_miller_rabin() """ def miller_rabin(n: int, allow_probable: bool = False) -> bool: """Deterministic Miller-Rabin algorithm for primes ~< 3.32e24. Uses numerical analysis results to return whether or not the passed number is prime. If the passed number is above the upper limit, and allow_probable is True, then a return value of True indicates that n is probably prime. This test does not allow False negatives- a return value of False is ALWAYS composite. Parameters ---------- n : int The integer to be tested. Since we usually care if a number is prime, n < 2 returns False instead of raising a ValueError. allow_probable: bool, default False Whether or not to test n above the upper bound of the deterministic test. Raises ------ ValueError Reference --------- https://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test """ if n == 2: return True if not n % 2 or n < 2: return False if n > 5 and n % 10 not in (1, 3, 7, 9): # can quickly check last digit return False if n > 3_317_044_064_679_887_385_961_981 and not allow_probable: raise ValueError( "Warning: upper bound of deterministic test is exceeded. " "Pass allow_probable=True to allow probabilistic test. " "A return value of True indicates a probable prime." ) # array bounds provided by analysis bounds = [ 2_047, 1_373_653, 25_326_001, 3_215_031_751, 2_152_302_898_747, 3_474_749_660_383, 341_550_071_728_321, 1, 3_825_123_056_546_413_051, 1, 1, 318_665_857_834_031_151_167_461, 3_317_044_064_679_887_385_961_981, ] primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41] for idx, _p in enumerate(bounds, 1): if n < _p: # then we have our last prime to check plist = primes[:idx] break d, s = n - 1, 0 # break up n -1 into a power of 2 (s) and # remaining odd component # essentially, solve for d * 2 ** s == n - 1 while d % 2 == 0: d //= 2 s += 1 for prime in plist: pr = False for r in range(s): m = pow(prime, d * 2**r, n) # see article for analysis explanation for m if (r == 0 and m == 1) or ((m + 1) % n == 0): pr = True # this loop will not determine compositeness break if pr: continue # if pr is False, then the above loop never evaluated to true, # and the n MUST be composite return False return True def test_miller_rabin() -> None: """Testing a nontrivial (ends in 1, 3, 7, 9) composite and a prime in each range. """ assert not miller_rabin(561) assert miller_rabin(563) # 2047 assert not miller_rabin(838_201) assert miller_rabin(838_207) # 1_373_653 assert not miller_rabin(17_316_001) assert miller_rabin(17_316_017) # 25_326_001 assert not miller_rabin(3_078_386_641) assert miller_rabin(3_078_386_653) # 3_215_031_751 assert not miller_rabin(1_713_045_574_801) assert miller_rabin(1_713_045_574_819) # 2_152_302_898_747 assert not miller_rabin(2_779_799_728_307) assert miller_rabin(2_779_799_728_327) # 3_474_749_660_383 assert not miller_rabin(113_850_023_909_441) assert miller_rabin(113_850_023_909_527) # 341_550_071_728_321 assert not miller_rabin(1_275_041_018_848_804_351) assert miller_rabin(1_275_041_018_848_804_391) # 3_825_123_056_546_413_051 assert not miller_rabin(79_666_464_458_507_787_791_867) assert miller_rabin(79_666_464_458_507_787_791_951) # 318_665_857_834_031_151_167_461 assert not miller_rabin(552_840_677_446_647_897_660_333) assert miller_rabin(552_840_677_446_647_897_660_359) # 3_317_044_064_679_887_385_961_981 # upper limit for probabilistic test if __name__ == "__main__": test_miller_rabin() ================================================ FILE: ciphers/diffie.py ================================================ from __future__ import annotations def find_primitive(modulus: int) -> int | None: """ Find a primitive root modulo modulus, if one exists. Args: modulus : The modulus for which to find a primitive root. Returns: The primitive root if one exists, or None if there is none. Examples: >>> find_primitive(7) # Modulo 7 has primitive root 3 3 >>> find_primitive(11) # Modulo 11 has primitive root 2 2 >>> find_primitive(8) == None # Modulo 8 has no primitive root True """ for r in range(1, modulus): li = [] for x in range(modulus - 1): val = pow(r, x, modulus) if val in li: break li.append(val) else: return r return None if __name__ == "__main__": import doctest doctest.testmod() prime = int(input("Enter a prime number q: ")) primitive_root = find_primitive(prime) if primitive_root is None: print(f"Cannot find the primitive for the value: {primitive_root!r}") else: a_private = int(input("Enter private key of A: ")) a_public = pow(primitive_root, a_private, prime) b_private = int(input("Enter private key of B: ")) b_public = pow(primitive_root, b_private, prime) a_secret = pow(b_public, a_private, prime) b_secret = pow(a_public, b_private, prime) print("The key value generated by A is: ", a_secret) print("The key value generated by B is: ", b_secret) ================================================ FILE: ciphers/diffie_hellman.py ================================================ from binascii import hexlify from hashlib import sha256 from os import urandom # RFC 3526 - More Modular Exponential (MODP) Diffie-Hellman groups for # Internet Key Exchange (IKE) https://tools.ietf.org/html/rfc3526 primes = { # 1536-bit 5: { "prime": int( "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" "83655D23DCA3AD961C62F356208552BB9ED529077096966D" "670C354E4ABC9804F1746C08CA237327FFFFFFFFFFFFFFFF", base=16, ), "generator": 2, }, # 2048-bit 14: { "prime": int( "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" "83655D23DCA3AD961C62F356208552BB9ED529077096966D" "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" "15728E5A8AACAA68FFFFFFFFFFFFFFFF", base=16, ), "generator": 2, }, # 3072-bit 15: { "prime": int( "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" "83655D23DCA3AD961C62F356208552BB9ED529077096966D" "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64" "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7" "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B" "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C" "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31" "43DB5BFCE0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF", base=16, ), "generator": 2, }, # 4096-bit 16: { "prime": int( "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" "83655D23DCA3AD961C62F356208552BB9ED529077096966D" "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64" "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7" "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B" "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C" "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31" "43DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7" "88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA" "2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6" "287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED" "1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9" "93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199" "FFFFFFFFFFFFFFFF", base=16, ), "generator": 2, }, # 6144-bit 17: { "prime": int( "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08" "8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B" "302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9" "A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6" "49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8" "FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D" "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C" "180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718" "3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D" "04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D" "B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226" "1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C" "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC" "E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26" "99C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB" "04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2" "233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127" "D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492" "36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BDF8FF9406" "AD9E530EE5DB382F413001AEB06A53ED9027D831179727B0865A8918" "DA3EDBEBCF9B14ED44CE6CBACED4BB1BDB7F1447E6CC254B33205151" "2BD7AF426FB8F401378CD2BF5983CA01C64B92ECF032EA15D1721D03" "F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E59E7C97F" "BEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA" "CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58B" "B7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632" "387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E" "6DCC4024FFFFFFFFFFFFFFFF", base=16, ), "generator": 2, }, # 8192-bit 18: { "prime": int( "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" "83655D23DCA3AD961C62F356208552BB9ED529077096966D" "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64" "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7" "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B" "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C" "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31" "43DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7" "88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA" "2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6" "287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED" "1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9" "93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492" "36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BD" "F8FF9406AD9E530EE5DB382F413001AEB06A53ED9027D831" "179727B0865A8918DA3EDBEBCF9B14ED44CE6CBACED4BB1B" "DB7F1447E6CC254B332051512BD7AF426FB8F401378CD2BF" "5983CA01C64B92ECF032EA15D1721D03F482D7CE6E74FEF6" "D55E702F46980C82B5A84031900B1C9E59E7C97FBEC7E8F3" "23A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA" "CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE328" "06A1D58BB7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55C" "DA56C9EC2EF29632387FE8D76E3C0468043E8F663F4860EE" "12BF2D5B0B7474D6E694F91E6DBE115974A3926F12FEE5E4" "38777CB6A932DF8CD8BEC4D073B931BA3BC832B68D9DD300" "741FA7BF8AFC47ED2576F6936BA424663AAB639C5AE4F568" "3423B4742BF1C978238F16CBE39D652DE3FDB8BEFC848AD9" "22222E04A4037C0713EB57A81A23F0C73473FC646CEA306B" "4BCBC8862F8385DDFA9D4B7FA2C087E879683303ED5BDD3A" "062B3CF5B3A278A66D2A13F83F44F82DDF310EE074AB6A36" "4597E899A0255DC164F31CC50846851DF9AB48195DED7EA1" "B1D510BD7EE74D73FAF36BC31ECFA268359046F4EB879F92" "4009438B481C6CD7889A002ED5EE382BC9190DA6FC026E47" "9558E4475677E9AA9E3050E2765694DFC81F56E880B96E71" "60C980DD98EDD3DFFFFFFFFFFFFFFFFF", base=16, ), "generator": 2, }, } class DiffieHellman: """ Class to represent the Diffie-Hellman key exchange protocol >>> alice = DiffieHellman() >>> bob = DiffieHellman() >>> alice_private = alice.get_private_key() >>> alice_public = alice.generate_public_key() >>> bob_private = bob.get_private_key() >>> bob_public = bob.generate_public_key() >>> # generating shared key using the DH object >>> alice_shared = alice.generate_shared_key(bob_public) >>> bob_shared = bob.generate_shared_key(alice_public) >>> assert alice_shared == bob_shared >>> # generating shared key using static methods >>> alice_shared = DiffieHellman.generate_shared_key_static( ... alice_private, bob_public ... ) >>> bob_shared = DiffieHellman.generate_shared_key_static( ... bob_private, alice_public ... ) >>> assert alice_shared == bob_shared """ # Current minimum recommendation is 2048 bit (group 14) def __init__(self, group: int = 14) -> None: if group not in primes: raise ValueError("Unsupported Group") self.prime = primes[group]["prime"] self.generator = primes[group]["generator"] self.__private_key = int(hexlify(urandom(32)), base=16) def get_private_key(self) -> str: return hex(self.__private_key)[2:] def generate_public_key(self) -> str: public_key = pow(self.generator, self.__private_key, self.prime) return hex(public_key)[2:] def is_valid_public_key(self, key: int) -> bool: # check if the other public key is valid based on NIST SP800-56 return ( 2 <= key <= self.prime - 2 and pow(key, (self.prime - 1) // 2, self.prime) == 1 ) def generate_shared_key(self, other_key_str: str) -> str: other_key = int(other_key_str, base=16) if not self.is_valid_public_key(other_key): raise ValueError("Invalid public key") shared_key = pow(other_key, self.__private_key, self.prime) return sha256(str(shared_key).encode()).hexdigest() @staticmethod def is_valid_public_key_static(remote_public_key_str: int, prime: int) -> bool: # check if the other public key is valid based on NIST SP800-56 return ( 2 <= remote_public_key_str <= prime - 2 and pow(remote_public_key_str, (prime - 1) // 2, prime) == 1 ) @staticmethod def generate_shared_key_static( local_private_key_str: str, remote_public_key_str: str, group: int = 14 ) -> str: local_private_key = int(local_private_key_str, base=16) remote_public_key = int(remote_public_key_str, base=16) prime = primes[group]["prime"] if not DiffieHellman.is_valid_public_key_static(remote_public_key, prime): raise ValueError("Invalid public key") shared_key = pow(remote_public_key, local_private_key, prime) return sha256(str(shared_key).encode()).hexdigest() if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: ciphers/elgamal_key_generator.py ================================================ import os import random import sys from . import cryptomath_module as cryptomath from . import rabin_miller min_primitive_root = 3 # I have written my code naively same as definition of primitive root # however every time I run this program, memory exceeded... # so I used 4.80 Algorithm in # Handbook of Applied Cryptography(CRC Press, ISBN : 0-8493-8523-7, October 1996) # and it seems to run nicely! def primitive_root(p_val: int) -> int: print("Generating primitive root of p") while True: g = random.randrange(3, p_val) if pow(g, 2, p_val) == 1: continue if pow(g, p_val, p_val) == 1: continue return g def generate_key(key_size: int) -> tuple[tuple[int, int, int, int], tuple[int, int]]: print("Generating prime p...") p = rabin_miller.generate_large_prime(key_size) # select large prime number. e_1 = primitive_root(p) # one primitive root on modulo p. d = random.randrange(3, p) # private_key -> have to be greater than 2 for safety. e_2 = cryptomath.find_mod_inverse(pow(e_1, d, p), p) public_key = (key_size, e_1, e_2, p) private_key = (key_size, d) return public_key, private_key def make_key_files(name: str, key_size: int) -> None: if os.path.exists(f"{name}_pubkey.txt") or os.path.exists(f"{name}_privkey.txt"): print("\nWARNING:") print( f'"{name}_pubkey.txt" or "{name}_privkey.txt" already exists. \n' "Use a different name or delete these files and re-run this program." ) sys.exit() public_key, private_key = generate_key(key_size) print(f"\nWriting public key to file {name}_pubkey.txt...") with open(f"{name}_pubkey.txt", "w") as fo: fo.write(f"{public_key[0]},{public_key[1]},{public_key[2]},{public_key[3]}") print(f"Writing private key to file {name}_privkey.txt...") with open(f"{name}_privkey.txt", "w") as fo: fo.write(f"{private_key[0]},{private_key[1]}") def main() -> None: print("Making key files...") make_key_files("elgamal", 2048) print("Key files generation successful") if __name__ == "__main__": main() ================================================ FILE: ciphers/enigma_machine2.py ================================================ """ | Wikipedia: https://en.wikipedia.org/wiki/Enigma_machine | Video explanation: https://youtu.be/QwQVMqfoB2E | Also check out Numberphile's and Computerphile's videos on this topic This module contains function ``enigma`` which emulates the famous Enigma machine from WWII. Module includes: - ``enigma`` function - showcase of function usage - ``9`` randomly generated rotors - reflector (aka static rotor) - original alphabet Created by TrapinchO """ from __future__ import annotations RotorPositionT = tuple[int, int, int] RotorSelectionT = tuple[str, str, str] # used alphabet -------------------------- # from string.ascii_uppercase abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" # -------------------------- default selection -------------------------- # rotors -------------------------- rotor1 = "EGZWVONAHDCLFQMSIPJBYUKXTR" rotor2 = "FOBHMDKEXQNRAULPGSJVTYICZW" rotor3 = "ZJXESIUQLHAVRMDOYGTNFWPBKC" # reflector -------------------------- reflector = { "A": "N", "N": "A", "B": "O", "O": "B", "C": "P", "P": "C", "D": "Q", "Q": "D", "E": "R", "R": "E", "F": "S", "S": "F", "G": "T", "T": "G", "H": "U", "U": "H", "I": "V", "V": "I", "J": "W", "W": "J", "K": "X", "X": "K", "L": "Y", "Y": "L", "M": "Z", "Z": "M", } # -------------------------- extra rotors -------------------------- rotor4 = "RMDJXFUWGISLHVTCQNKYPBEZOA" rotor5 = "SGLCPQWZHKXAREONTFBVIYJUDM" rotor6 = "HVSICLTYKQUBXDWAJZOMFGPREN" rotor7 = "RZWQHFMVDBKICJLNTUXAGYPSOE" rotor8 = "LFKIJODBEGAMQPXVUHYSTCZRWN" rotor9 = "KOAEGVDHXPQZMLFTYWJNBRCIUS" def _validator( rotpos: RotorPositionT, rotsel: RotorSelectionT, pb: str ) -> tuple[RotorPositionT, RotorSelectionT, dict[str, str]]: """ Checks if the values can be used for the ``enigma`` function >>> _validator((1,1,1), (rotor1, rotor2, rotor3), 'POLAND') ((1, 1, 1), ('EGZWVONAHDCLFQMSIPJBYUKXTR', 'FOBHMDKEXQNRAULPGSJVTYICZW', \ 'ZJXESIUQLHAVRMDOYGTNFWPBKC'), \ {'P': 'O', 'O': 'P', 'L': 'A', 'A': 'L', 'N': 'D', 'D': 'N'}) :param rotpos: rotor_positon :param rotsel: rotor_selection :param pb: plugb -> validated and transformed :return: (`rotpos`, `rotsel`, `pb`) """ # Checks if there are 3 unique rotors if (unique_rotsel := len(set(rotsel))) < 3: msg = f"Please use 3 unique rotors (not {unique_rotsel})" raise Exception(msg) # Checks if rotor positions are valid rotorpos1, rotorpos2, rotorpos3 = rotpos if not 0 < rotorpos1 <= len(abc): msg = f"First rotor position is not within range of 1..26 ({rotorpos1}" raise ValueError(msg) if not 0 < rotorpos2 <= len(abc): msg = f"Second rotor position is not within range of 1..26 ({rotorpos2})" raise ValueError(msg) if not 0 < rotorpos3 <= len(abc): msg = f"Third rotor position is not within range of 1..26 ({rotorpos3})" raise ValueError(msg) # Validates string and returns dict pbdict = _plugboard(pb) return rotpos, rotsel, pbdict def _plugboard(pbstring: str) -> dict[str, str]: """ https://en.wikipedia.org/wiki/Enigma_machine#Plugboard >>> _plugboard('PICTURES') {'P': 'I', 'I': 'P', 'C': 'T', 'T': 'C', 'U': 'R', 'R': 'U', 'E': 'S', 'S': 'E'} >>> _plugboard('POLAND') {'P': 'O', 'O': 'P', 'L': 'A', 'A': 'L', 'N': 'D', 'D': 'N'} In the code, ``pb`` stands for ``plugboard`` Pairs can be separated by spaces :param pbstring: string containing plugboard setting for the Enigma machine :return: dictionary containing converted pairs """ # tests the input string if it # a) is type string # b) has even length (so pairs can be made) if not isinstance(pbstring, str): msg = f"Plugboard setting isn't type string ({type(pbstring)})" raise TypeError(msg) elif len(pbstring) % 2 != 0: msg = f"Odd number of symbols ({len(pbstring)})" raise Exception(msg) elif pbstring == "": return {} pbstring.replace(" ", "") # Checks if all characters are unique tmppbl = set() for i in pbstring: if i not in abc: msg = f"'{i}' not in list of symbols" raise Exception(msg) elif i in tmppbl: msg = f"Duplicate symbol ({i})" raise Exception(msg) else: tmppbl.add(i) del tmppbl # Created the dictionary pb = {} for j in range(0, len(pbstring) - 1, 2): pb[pbstring[j]] = pbstring[j + 1] pb[pbstring[j + 1]] = pbstring[j] return pb def enigma( text: str, rotor_position: RotorPositionT, rotor_selection: RotorSelectionT = (rotor1, rotor2, rotor3), plugb: str = "", ) -> str: """ The only difference with real-world enigma is that ``I`` allowed string input. All characters are converted to uppercase. (non-letter symbol are ignored) | How it works: | (for every letter in the message) - Input letter goes into the plugboard. If it is connected to another one, switch it. - Letter goes through ``3`` rotors. Each rotor can be represented as ``2`` sets of symbol, where one is shuffled. Each symbol from the first set has corresponding symbol in the second set and vice versa. example:: | ABCDEFGHIJKLMNOPQRSTUVWXYZ | e.g. F=D and D=F | VKLEPDBGRNWTFCJOHQAMUZYIXS | - Symbol then goes through reflector (static rotor). There it is switched with paired symbol. The reflector can be represented as ``2`` sets, each with half of the alphanet. There are usually ``10`` pairs of letters. Example:: | ABCDEFGHIJKLM | e.g. E is paired to X | ZYXWVUTSRQPON | so when E goes in X goes out and vice versa - Letter then goes through the rotors again - If the letter is connected to plugboard, it is switched. - Return the letter >>> enigma('Hello World!', (1, 2, 1), plugb='pictures') 'KORYH JUHHI!' >>> enigma('KORYH, juhhi!', (1, 2, 1), plugb='pictures') 'HELLO, WORLD!' >>> enigma('hello world!', (1, 1, 1), plugb='pictures') 'FPNCZ QWOBU!' >>> enigma('FPNCZ QWOBU', (1, 1, 1), plugb='pictures') 'HELLO WORLD' :param text: input message :param rotor_position: tuple with ``3`` values in range ``1``.. ``26`` :param rotor_selection: tuple with ``3`` rotors :param plugb: string containing plugboard configuration (default ``''``) :return: en/decrypted string """ text = text.upper() rotor_position, rotor_selection, plugboard = _validator( rotor_position, rotor_selection, plugb.upper() ) rotorpos1, rotorpos2, rotorpos3 = rotor_position rotor1, rotor2, rotor3 = rotor_selection rotorpos1 -= 1 rotorpos2 -= 1 rotorpos3 -= 1 result = [] # encryption/decryption process -------------------------- for symbol in text: if symbol in abc: # 1st plugboard -------------------------- if symbol in plugboard: symbol = plugboard[symbol] # rotor ra -------------------------- index = abc.index(symbol) + rotorpos1 symbol = rotor1[index % len(abc)] # rotor rb -------------------------- index = abc.index(symbol) + rotorpos2 symbol = rotor2[index % len(abc)] # rotor rc -------------------------- index = abc.index(symbol) + rotorpos3 symbol = rotor3[index % len(abc)] # reflector -------------------------- # this is the reason you don't need another machine to decipher symbol = reflector[symbol] # 2nd rotors symbol = abc[rotor3.index(symbol) - rotorpos3] symbol = abc[rotor2.index(symbol) - rotorpos2] symbol = abc[rotor1.index(symbol) - rotorpos1] # 2nd plugboard if symbol in plugboard: symbol = plugboard[symbol] # moves/resets rotor positions rotorpos1 += 1 if rotorpos1 >= len(abc): rotorpos1 = 0 rotorpos2 += 1 if rotorpos2 >= len(abc): rotorpos2 = 0 rotorpos3 += 1 if rotorpos3 >= len(abc): rotorpos3 = 0 # else: # pass # Error could be also raised # raise ValueError( # 'Invalid symbol('+repr(symbol)+')') result.append(symbol) return "".join(result) if __name__ == "__main__": message = "This is my Python script that emulates the Enigma machine from WWII." rotor_pos = (1, 1, 1) pb = "pictures" rotor_sel = (rotor2, rotor4, rotor8) en = enigma(message, rotor_pos, rotor_sel, pb) print("Encrypted message:", en) print("Decrypted message:", enigma(en, rotor_pos, rotor_sel, pb)) ================================================ FILE: ciphers/fractionated_morse_cipher.py ================================================ """ Python program for the Fractionated Morse Cipher. The Fractionated Morse cipher first converts the plaintext to Morse code, then enciphers fixed-size blocks of Morse code back to letters. This procedure means plaintext letters are mixed into the ciphertext letters, making it more secure than substitution ciphers. http://practicalcryptography.com/ciphers/fractionated-morse-cipher/ """ import string MORSE_CODE_DICT = { "A": ".-", "B": "-...", "C": "-.-.", "D": "-..", "E": ".", "F": "..-.", "G": "--.", "H": "....", "I": "..", "J": ".---", "K": "-.-", "L": ".-..", "M": "--", "N": "-.", "O": "---", "P": ".--.", "Q": "--.-", "R": ".-.", "S": "...", "T": "-", "U": "..-", "V": "...-", "W": ".--", "X": "-..-", "Y": "-.--", "Z": "--..", " ": "", } # Define possible trigrams of Morse code MORSE_COMBINATIONS = [ "...", "..-", "..x", ".-.", ".--", ".-x", ".x.", ".x-", ".xx", "-..", "-.-", "-.x", "--.", "---", "--x", "-x.", "-x-", "-xx", "x..", "x.-", "x.x", "x-.", "x--", "x-x", "xx.", "xx-", "xxx", ] # Create a reverse dictionary for Morse code REVERSE_DICT = {value: key for key, value in MORSE_CODE_DICT.items()} def encode_to_morse(plaintext: str) -> str: """Encode a plaintext message into Morse code. Args: plaintext: The plaintext message to encode. Returns: The Morse code representation of the plaintext message. Example: >>> encode_to_morse("defend the east") '-..x.x..-.x.x-.x-..xx-x....x.xx.x.-x...x-' """ return "x".join([MORSE_CODE_DICT.get(letter.upper(), "") for letter in plaintext]) def encrypt_fractionated_morse(plaintext: str, key: str) -> str: """Encrypt a plaintext message using Fractionated Morse Cipher. Args: plaintext: The plaintext message to encrypt. key: The encryption key. Returns: The encrypted ciphertext. Example: >>> encrypt_fractionated_morse("defend the east","Roundtable") 'ESOAVVLJRSSTRX' """ morse_code = encode_to_morse(plaintext) key = key.upper() + string.ascii_uppercase key = "".join(sorted(set(key), key=key.find)) # Ensure morse_code length is a multiple of 3 padding_length = 3 - (len(morse_code) % 3) morse_code += "x" * padding_length fractionated_morse_dict = {v: k for k, v in zip(key, MORSE_COMBINATIONS)} fractionated_morse_dict["xxx"] = "" encrypted_text = "".join( [ fractionated_morse_dict[morse_code[i : i + 3]] for i in range(0, len(morse_code), 3) ] ) return encrypted_text def decrypt_fractionated_morse(ciphertext: str, key: str) -> str: """Decrypt a ciphertext message encrypted with Fractionated Morse Cipher. Args: ciphertext: The ciphertext message to decrypt. key: The decryption key. Returns: The decrypted plaintext message. Example: >>> decrypt_fractionated_morse("ESOAVVLJRSSTRX","Roundtable") 'DEFEND THE EAST' """ key = key.upper() + string.ascii_uppercase key = "".join(sorted(set(key), key=key.find)) inverse_fractionated_morse_dict = dict(zip(key, MORSE_COMBINATIONS)) morse_code = "".join( [inverse_fractionated_morse_dict.get(letter, "") for letter in ciphertext] ) decrypted_text = "".join( [REVERSE_DICT[code] for code in morse_code.split("x")] ).strip() return decrypted_text if __name__ == "__main__": """ Example usage of Fractionated Morse Cipher. """ plaintext = "defend the east" print("Plain Text:", plaintext) key = "ROUNDTABLE" ciphertext = encrypt_fractionated_morse(plaintext, key) print("Encrypted:", ciphertext) decrypted_text = decrypt_fractionated_morse(ciphertext, key) print("Decrypted:", decrypted_text) ================================================ FILE: ciphers/gronsfeld_cipher.py ================================================ from string import ascii_uppercase def gronsfeld(text: str, key: str) -> str: """ Encrypt plaintext with the Gronsfeld cipher >>> gronsfeld('hello', '412') 'LFNPP' >>> gronsfeld('hello', '123') 'IGOMQ' >>> gronsfeld('', '123') '' >>> gronsfeld('yes, ¥€$ - _!@#%?', '0') 'YES, ¥€$ - _!@#%?' >>> gronsfeld('yes, ¥€$ - _!@#%?', '01') 'YFS, ¥€$ - _!@#%?' >>> gronsfeld('yes, ¥€$ - _!@#%?', '012') 'YFU, ¥€$ - _!@#%?' >>> gronsfeld('yes, ¥€$ - _!@#%?', '') Traceback (most recent call last): ... ZeroDivisionError: division by zero """ ascii_len = len(ascii_uppercase) key_len = len(key) encrypted_text = "" keys = [int(char) for char in key] upper_case_text = text.upper() for i, char in enumerate(upper_case_text): if char in ascii_uppercase: new_position = (ascii_uppercase.index(char) + keys[i % key_len]) % ascii_len shifted_letter = ascii_uppercase[new_position] encrypted_text += shifted_letter else: encrypted_text += char return encrypted_text if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: ciphers/hill_cipher.py ================================================ """ Hill Cipher: The 'HillCipher' class below implements the Hill Cipher algorithm which uses modern linear algebra techniques to encode and decode text using an encryption key matrix. Algorithm: Let the order of the encryption key be N (as it is a square matrix). Your text is divided into batches of length N and converted to numerical vectors by a simple mapping starting with A=0 and so on. The key is then multiplied with the newly created batch vector to obtain the encoded vector. After each multiplication modular 36 calculations are performed on the vectors so as to bring the numbers between 0 and 36 and then mapped with their corresponding alphanumerics. While decrypting, the decrypting key is found which is the inverse of the encrypting key modular 36. The same process is repeated for decrypting to get the original message back. Constraints: The determinant of the encryption key matrix must be relatively prime w.r.t 36. Note: This implementation only considers alphanumerics in the text. If the length of the text to be encrypted is not a multiple of the break key(the length of one batch of letters), the last character of the text is added to the text until the length of the text reaches a multiple of the break_key. So the text after decrypting might be a little different than the original text. References: https://apprendre-en-ligne.net/crypto/hill/Hillciph.pdf https://www.youtube.com/watch?v=kfmNeskzs2o https://www.youtube.com/watch?v=4RhLNDqcjpA """ import string import numpy as np from maths.greatest_common_divisor import greatest_common_divisor class HillCipher: key_string = string.ascii_uppercase + string.digits # This cipher takes alphanumerics into account # i.e. a total of 36 characters # take x and return x % len(key_string) modulus = np.vectorize(lambda x: x % 36) to_int = np.vectorize(round) def __init__(self, encrypt_key: np.ndarray) -> None: """ encrypt_key is an NxN numpy array """ self.encrypt_key = self.modulus(encrypt_key) # mod36 calc's on the encrypt key self.check_determinant() # validate the determinant of the encryption key self.break_key = encrypt_key.shape[0] def replace_letters(self, letter: str) -> int: """ >>> hill_cipher = HillCipher(np.array([[2, 5], [1, 6]])) >>> hill_cipher.replace_letters('T') 19 >>> hill_cipher.replace_letters('0') 26 """ return self.key_string.index(letter) def replace_digits(self, num: int) -> str: """ >>> hill_cipher = HillCipher(np.array([[2, 5], [1, 6]])) >>> hill_cipher.replace_digits(19) 'T' >>> hill_cipher.replace_digits(26) '0' >>> hill_cipher.replace_digits(26.1) '0' """ return self.key_string[int(num)] def check_determinant(self) -> None: """ >>> hill_cipher = HillCipher(np.array([[2, 5], [1, 6]])) >>> hill_cipher.check_determinant() """ det = round(np.linalg.det(self.encrypt_key)) if det < 0: det = det % len(self.key_string) req_l = len(self.key_string) if greatest_common_divisor(det, len(self.key_string)) != 1: msg = ( f"determinant modular {req_l} of encryption key({det}) " f"is not co prime w.r.t {req_l}.\nTry another key." ) raise ValueError(msg) def process_text(self, text: str) -> str: """ >>> hill_cipher = HillCipher(np.array([[2, 5], [1, 6]])) >>> hill_cipher.process_text('Testing Hill Cipher') 'TESTINGHILLCIPHERR' >>> hill_cipher.process_text('hello') 'HELLOO' """ chars = [char for char in text.upper() if char in self.key_string] last = chars[-1] while len(chars) % self.break_key != 0: chars.append(last) return "".join(chars) def encrypt(self, text: str) -> str: """ >>> hill_cipher = HillCipher(np.array([[2, 5], [1, 6]])) >>> hill_cipher.encrypt('testing hill cipher') 'WHXYJOLM9C6XT085LL' >>> hill_cipher.encrypt('hello') '85FF00' """ text = self.process_text(text.upper()) encrypted = "" for i in range(0, len(text) - self.break_key + 1, self.break_key): batch = text[i : i + self.break_key] vec = [self.replace_letters(char) for char in batch] batch_vec = np.array([vec]).T batch_encrypted = self.modulus(self.encrypt_key.dot(batch_vec)).T.tolist()[ 0 ] encrypted_batch = "".join( self.replace_digits(num) for num in batch_encrypted ) encrypted += encrypted_batch return encrypted def make_decrypt_key(self) -> np.ndarray: """ >>> hill_cipher = HillCipher(np.array([[2, 5], [1, 6]])) >>> hill_cipher.make_decrypt_key() array([[ 6, 25], [ 5, 26]]) """ det = round(np.linalg.det(self.encrypt_key)) if det < 0: det = det % len(self.key_string) det_inv = None for i in range(len(self.key_string)): if (det * i) % len(self.key_string) == 1: det_inv = i break inv_key = ( det_inv * np.linalg.det(self.encrypt_key) * np.linalg.inv(self.encrypt_key) ) return self.to_int(self.modulus(inv_key)) def decrypt(self, text: str) -> str: """ >>> hill_cipher = HillCipher(np.array([[2, 5], [1, 6]])) >>> hill_cipher.decrypt('WHXYJOLM9C6XT085LL') 'TESTINGHILLCIPHERR' >>> hill_cipher.decrypt('85FF00') 'HELLOO' """ decrypt_key = self.make_decrypt_key() text = self.process_text(text.upper()) decrypted = "" for i in range(0, len(text) - self.break_key + 1, self.break_key): batch = text[i : i + self.break_key] vec = [self.replace_letters(char) for char in batch] batch_vec = np.array([vec]).T batch_decrypted = self.modulus(decrypt_key.dot(batch_vec)).T.tolist()[0] decrypted_batch = "".join( self.replace_digits(num) for num in batch_decrypted ) decrypted += decrypted_batch return decrypted def main() -> None: n = int(input("Enter the order of the encryption key: ")) hill_matrix = [] print("Enter each row of the encryption key with space separated integers") for _ in range(n): row = [int(x) for x in input().split()] hill_matrix.append(row) hc = HillCipher(np.array(hill_matrix)) print("Would you like to encrypt or decrypt some text? (1 or 2)") option = input("\n1. Encrypt\n2. Decrypt\n") if option == "1": text_e = input("What text would you like to encrypt?: ") print("Your encrypted text is:") print(hc.encrypt(text_e)) elif option == "2": text_d = input("What text would you like to decrypt?: ") print("Your decrypted text is:") print(hc.decrypt(text_d)) if __name__ == "__main__": import doctest doctest.testmod() main() ================================================ FILE: ciphers/mixed_keyword_cypher.py ================================================ from string import ascii_uppercase def mixed_keyword( keyword: str, plaintext: str, verbose: bool = False, alphabet: str = ascii_uppercase ) -> str: """ For keyword: hello H E L O A B C D F G I J K M N P Q R S T U V W X Y Z and map vertically >>> mixed_keyword("college", "UNIVERSITY", True) # doctest: +NORMALIZE_WHITESPACE {'A': 'C', 'B': 'A', 'C': 'I', 'D': 'P', 'E': 'U', 'F': 'Z', 'G': 'O', 'H': 'B', 'I': 'J', 'J': 'Q', 'K': 'V', 'L': 'L', 'M': 'D', 'N': 'K', 'O': 'R', 'P': 'W', 'Q': 'E', 'R': 'F', 'S': 'M', 'T': 'S', 'U': 'X', 'V': 'G', 'W': 'H', 'X': 'N', 'Y': 'T', 'Z': 'Y'} 'XKJGUFMJST' >>> mixed_keyword("college", "UNIVERSITY", False) # doctest: +NORMALIZE_WHITESPACE 'XKJGUFMJST' """ keyword = keyword.upper() plaintext = plaintext.upper() alphabet_set = set(alphabet) # create a list of unique characters in the keyword - their order matters # it determines how we will map plaintext characters to the ciphertext unique_chars = [] for char in keyword: if char in alphabet_set and char not in unique_chars: unique_chars.append(char) # the number of those unique characters will determine the number of rows num_unique_chars_in_keyword = len(unique_chars) # create a shifted version of the alphabet shifted_alphabet = unique_chars + [ char for char in alphabet if char not in unique_chars ] # create a modified alphabet by splitting the shifted alphabet into rows modified_alphabet = [ shifted_alphabet[k : k + num_unique_chars_in_keyword] for k in range(0, 26, num_unique_chars_in_keyword) ] # map the alphabet characters to the modified alphabet characters # going 'vertically' through the modified alphabet - consider columns first mapping = {} letter_index = 0 for column in range(num_unique_chars_in_keyword): for row in modified_alphabet: # if current row (the last one) is too short, break out of loop if len(row) <= column: break # map current letter to letter in modified alphabet mapping[alphabet[letter_index]] = row[column] letter_index += 1 if verbose: print(mapping) # create the encrypted text by mapping the plaintext to the modified alphabet return "".join(mapping.get(char, char) for char in plaintext) if __name__ == "__main__": # example use print(mixed_keyword("college", "UNIVERSITY")) ================================================ FILE: ciphers/mono_alphabetic_ciphers.py ================================================ from typing import Literal LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" def translate_message( key: str, message: str, mode: Literal["encrypt", "decrypt"] ) -> str: """ >>> translate_message("QWERTYUIOPASDFGHJKLZXCVBNM","Hello World","encrypt") 'Pcssi Bidsm' """ chars_a = LETTERS if mode == "decrypt" else key chars_b = key if mode == "decrypt" else LETTERS translated = "" # loop through each symbol in the message for symbol in message: if symbol.upper() in chars_a: # encrypt/decrypt the symbol sym_index = chars_a.find(symbol.upper()) if symbol.isupper(): translated += chars_b[sym_index].upper() else: translated += chars_b[sym_index].lower() else: # symbol is not in LETTERS, just add it translated += symbol return translated def encrypt_message(key: str, message: str) -> str: """ >>> encrypt_message("QWERTYUIOPASDFGHJKLZXCVBNM", "Hello World") 'Pcssi Bidsm' """ return translate_message(key, message, "encrypt") def decrypt_message(key: str, message: str) -> str: """ >>> decrypt_message("QWERTYUIOPASDFGHJKLZXCVBNM", "Hello World") 'Itssg Vgksr' """ return translate_message(key, message, "decrypt") def main() -> None: message = "Hello World" key = "QWERTYUIOPASDFGHJKLZXCVBNM" mode = "decrypt" # set to 'encrypt' or 'decrypt' if mode == "encrypt": translated = encrypt_message(key, message) elif mode == "decrypt": translated = decrypt_message(key, message) print(f"Using the key {key}, the {mode}ed message is: {translated}") if __name__ == "__main__": import doctest doctest.testmod() main() ================================================ FILE: ciphers/morse_code.py ================================================ #!/usr/bin/env python3 """ Python program to translate to and from Morse code. https://en.wikipedia.org/wiki/Morse_code """ # fmt: off MORSE_CODE_DICT = { "A": ".-", "B": "-...", "C": "-.-.", "D": "-..", "E": ".", "F": "..-.", "G": "--.", "H": "....", "I": "..", "J": ".---", "K": "-.-", "L": ".-..", "M": "--", "N": "-.", "O": "---", "P": ".--.", "Q": "--.-", "R": ".-.", "S": "...", "T": "-", "U": "..-", "V": "...-", "W": ".--", "X": "-..-", "Y": "-.--", "Z": "--..", "1": ".----", "2": "..---", "3": "...--", "4": "....-", "5": ".....", "6": "-....", "7": "--...", "8": "---..", "9": "----.", "0": "-----", "&": ".-...", "@": ".--.-.", ":": "---...", ",": "--..--", ".": ".-.-.-", "'": ".----.", '"': ".-..-.", "?": "..--..", "/": "-..-.", "=": "-...-", "+": ".-.-.", "-": "-....-", "(": "-.--.", ")": "-.--.-", "!": "-.-.--", " ": "/" } # Exclamation mark is not in ITU-R recommendation # fmt: on REVERSE_DICT = {value: key for key, value in MORSE_CODE_DICT.items()} def encrypt(message: str) -> str: """ >>> encrypt("Sos!") '... --- ... -.-.--' >>> encrypt("SOS!") == encrypt("sos!") True """ return " ".join(MORSE_CODE_DICT[char] for char in message.upper()) def decrypt(message: str) -> str: """ >>> decrypt('... --- ... -.-.--') 'SOS!' """ return "".join(REVERSE_DICT[char] for char in message.split()) def main() -> None: """ >>> s = "".join(MORSE_CODE_DICT) >>> decrypt(encrypt(s)) == s True """ message = "Morse code here!" print(message) message = encrypt(message) print(message) message = decrypt(message) print(message) if __name__ == "__main__": main() ================================================ FILE: ciphers/onepad_cipher.py ================================================ import random class Onepad: @staticmethod def encrypt(text: str) -> tuple[list[int], list[int]]: """ Function to encrypt text using pseudo-random numbers >>> Onepad().encrypt("") ([], []) >>> Onepad().encrypt([]) ([], []) >>> random.seed(1) >>> Onepad().encrypt(" ") ([6969], [69]) >>> random.seed(1) >>> Onepad().encrypt("Hello") ([9729, 114756, 4653, 31309, 10492], [69, 292, 33, 131, 61]) >>> Onepad().encrypt(1) Traceback (most recent call last): ... TypeError: 'int' object is not iterable >>> Onepad().encrypt(1.1) Traceback (most recent call last): ... TypeError: 'float' object is not iterable """ plain = [ord(i) for i in text] key = [] cipher = [] for i in plain: k = random.randint(1, 300) c = (i + k) * k cipher.append(c) key.append(k) return cipher, key @staticmethod def decrypt(cipher: list[int], key: list[int]) -> str: """ Function to decrypt text using pseudo-random numbers. >>> Onepad().decrypt([], []) '' >>> Onepad().decrypt([35], []) '' >>> Onepad().decrypt([], [35]) Traceback (most recent call last): ... IndexError: list index out of range >>> random.seed(1) >>> Onepad().decrypt([9729, 114756, 4653, 31309, 10492], [69, 292, 33, 131, 61]) 'Hello' """ plain = [] for i in range(len(key)): p = int((cipher[i] - (key[i]) ** 2) / key[i]) plain.append(chr(p)) return "".join(plain) if __name__ == "__main__": c, k = Onepad().encrypt("Hello") print(c, k) print(Onepad().decrypt(c, k)) ================================================ FILE: ciphers/permutation_cipher.py ================================================ """ The permutation cipher, also called the transposition cipher, is a simple encryption technique that rearranges the characters in a message based on a secret key. It divides the message into blocks and applies a permutation to the characters within each block according to the key. The key is a sequence of unique integers that determine the order of character rearrangement. For more info: https://www.nku.edu/~christensen/1402%20permutation%20ciphers.pdf """ import random def generate_valid_block_size(message_length: int) -> int: """ Generate a valid block size that is a factor of the message length. Args: message_length (int): The length of the message. Returns: int: A valid block size. Example: >>> random.seed(1) >>> generate_valid_block_size(12) 3 """ block_sizes = [ block_size for block_size in range(2, message_length + 1) if message_length % block_size == 0 ] return random.choice(block_sizes) def generate_permutation_key(block_size: int) -> list[int]: """ Generate a random permutation key of a specified block size. Args: block_size (int): The size of each permutation block. Returns: list[int]: A list containing a random permutation of digits. Example: >>> random.seed(0) >>> generate_permutation_key(4) [2, 0, 1, 3] """ digits = list(range(block_size)) random.shuffle(digits) return digits def encrypt( message: str, key: list[int] | None = None, block_size: int | None = None ) -> tuple[str, list[int]]: """ Encrypt a message using a permutation cipher with block rearrangement using a key. Args: message (str): The plaintext message to be encrypted. key (list[int]): The permutation key for decryption. block_size (int): The size of each permutation block. Returns: tuple: A tuple containing the encrypted message and the encryption key. Example: >>> encrypted_message, key = encrypt("HELLO WORLD") >>> decrypted_message = decrypt(encrypted_message, key) >>> decrypted_message 'HELLO WORLD' """ message = message.upper() message_length = len(message) if key is None or block_size is None: block_size = generate_valid_block_size(message_length) key = generate_permutation_key(block_size) encrypted_message = "" for i in range(0, message_length, block_size): block = message[i : i + block_size] rearranged_block = [block[digit] for digit in key] encrypted_message += "".join(rearranged_block) return encrypted_message, key def decrypt(encrypted_message: str, key: list[int]) -> str: """ Decrypt an encrypted message using a permutation cipher with block rearrangement. Args: encrypted_message (str): The encrypted message. key (list[int]): The permutation key for decryption. Returns: str: The decrypted plaintext message. Example: >>> encrypted_message, key = encrypt("HELLO WORLD") >>> decrypted_message = decrypt(encrypted_message, key) >>> decrypted_message 'HELLO WORLD' """ key_length = len(key) decrypted_message = "" for i in range(0, len(encrypted_message), key_length): block = encrypted_message[i : i + key_length] original_block = [""] * key_length for j, digit in enumerate(key): original_block[digit] = block[j] decrypted_message += "".join(original_block) return decrypted_message def main() -> None: """ Driver function to pass message to get encrypted, then decrypted. Example: >>> main() Decrypted message: HELLO WORLD """ message = "HELLO WORLD" encrypted_message, key = encrypt(message) decrypted_message = decrypt(encrypted_message, key) print(f"Decrypted message: {decrypted_message}") if __name__ == "__main__": import doctest doctest.testmod() main() ================================================ FILE: ciphers/playfair_cipher.py ================================================ """ https://en.wikipedia.org/wiki/Playfair_cipher#Description The Playfair cipher was developed by Charles Wheatstone in 1854 It's use was heavily promotedby Lord Playfair, hence its name Some features of the Playfair cipher are: 1) It was the first literal diagram substitution cipher 2) It is a manual symmetric encryption technique 3) It is a multiple letter encryption cipher The implementation in the code below encodes alphabets only. It removes spaces, special characters and numbers from the code. Playfair is no longer used by military forces because of known insecurities and of the advent of automated encryption devices. This cipher is regarded as insecure since before World War I. """ import itertools import string from collections.abc import Generator, Iterable def chunker(seq: Iterable[str], size: int) -> Generator[tuple[str, ...]]: it = iter(seq) while True: chunk = tuple(itertools.islice(it, size)) if not chunk: return yield chunk def prepare_input(dirty: str) -> str: """ Prepare the plaintext by up-casing it and separating repeated letters with X's """ dirty = "".join([c.upper() for c in dirty if c in string.ascii_letters]) clean = "" if len(dirty) < 2: return dirty for i in range(len(dirty) - 1): clean += dirty[i] if dirty[i] == dirty[i + 1]: clean += "X" clean += dirty[-1] if len(clean) & 1: clean += "X" return clean def generate_table(key: str) -> list[str]: # I and J are used interchangeably to allow # us to use a 5x5 table (25 letters) alphabet = "ABCDEFGHIKLMNOPQRSTUVWXYZ" # we're using a list instead of a '2d' array because it makes the math # for setting up the table and doing the actual encoding/decoding simpler table = [] # copy key chars into the table if they are in `alphabet` ignoring duplicates for char in key.upper(): if char not in table and char in alphabet: table.append(char) # fill the rest of the table in with the remaining alphabet chars for char in alphabet: if char not in table: table.append(char) return table def encode(plaintext: str, key: str) -> str: """ Encode the given plaintext using the Playfair cipher. Takes the plaintext and the key as input and returns the encoded string. >>> encode("Hello", "MONARCHY") 'CFSUPM' >>> encode("attack on the left flank", "EMERGENCY") 'DQZSBYFSDZFMFNLOHFDRSG' >>> encode("Sorry!", "SPECIAL") 'AVXETX' >>> encode("Number 1", "NUMBER") 'UMBENF' >>> encode("Photosynthesis!", "THE SUN") 'OEMHQHVCHESUKE' """ table = generate_table(key) plaintext = prepare_input(plaintext) ciphertext = "" for char1, char2 in chunker(plaintext, 2): row1, col1 = divmod(table.index(char1), 5) row2, col2 = divmod(table.index(char2), 5) if row1 == row2: ciphertext += table[row1 * 5 + (col1 + 1) % 5] ciphertext += table[row2 * 5 + (col2 + 1) % 5] elif col1 == col2: ciphertext += table[((row1 + 1) % 5) * 5 + col1] ciphertext += table[((row2 + 1) % 5) * 5 + col2] else: # rectangle ciphertext += table[row1 * 5 + col2] ciphertext += table[row2 * 5 + col1] return ciphertext def decode(ciphertext: str, key: str) -> str: """ Decode the input string using the provided key. >>> decode("BMZFAZRZDH", "HAZARD") 'FIREHAZARD' >>> decode("HNBWBPQT", "AUTOMOBILE") 'DRIVINGX' >>> decode("SLYSSAQS", "CASTLE") 'ATXTACKX' """ table = generate_table(key) plaintext = "" for char1, char2 in chunker(ciphertext, 2): row1, col1 = divmod(table.index(char1), 5) row2, col2 = divmod(table.index(char2), 5) if row1 == row2: plaintext += table[row1 * 5 + (col1 - 1) % 5] plaintext += table[row2 * 5 + (col2 - 1) % 5] elif col1 == col2: plaintext += table[((row1 - 1) % 5) * 5 + col1] plaintext += table[((row2 - 1) % 5) * 5 + col2] else: # rectangle plaintext += table[row1 * 5 + col2] plaintext += table[row2 * 5 + col1] return plaintext if __name__ == "__main__": import doctest doctest.testmod() print("Encoded:", encode("BYE AND THANKS", "GREETING")) print("Decoded:", decode("CXRBANRLBALQ", "GREETING")) ================================================ FILE: ciphers/polybius.py ================================================ #!/usr/bin/env python3 """ A Polybius Square is a table that allows someone to translate letters into numbers. https://www.braingle.com/brainteasers/codes/polybius.php """ import numpy as np SQUARE = [ ["a", "b", "c", "d", "e"], ["f", "g", "h", "i", "k"], ["l", "m", "n", "o", "p"], ["q", "r", "s", "t", "u"], ["v", "w", "x", "y", "z"], ] class PolybiusCipher: def __init__(self) -> None: self.SQUARE = np.array(SQUARE) def letter_to_numbers(self, letter: str) -> np.ndarray: """ Return the pair of numbers that represents the given letter in the polybius square >>> np.array_equal(PolybiusCipher().letter_to_numbers('a'), [1,1]) True >>> np.array_equal(PolybiusCipher().letter_to_numbers('u'), [4,5]) True """ index1, index2 = np.where(letter == self.SQUARE) indexes = np.concatenate([index1 + 1, index2 + 1]) return indexes def numbers_to_letter(self, index1: int, index2: int) -> str: """ Return the letter corresponding to the position [index1, index2] in the polybius square >>> PolybiusCipher().numbers_to_letter(4, 5) == "u" True >>> PolybiusCipher().numbers_to_letter(1, 1) == "a" True """ return self.SQUARE[index1 - 1, index2 - 1] def encode(self, message: str) -> str: """ Return the encoded version of message according to the polybius cipher >>> PolybiusCipher().encode("test message") == "44154344 32154343112215" True >>> PolybiusCipher().encode("Test Message") == "44154344 32154343112215" True """ message = message.lower() message = message.replace("j", "i") encoded_message = "" for letter_index in range(len(message)): if message[letter_index] != " ": numbers = self.letter_to_numbers(message[letter_index]) encoded_message = encoded_message + str(numbers[0]) + str(numbers[1]) elif message[letter_index] == " ": encoded_message = encoded_message + " " return encoded_message def decode(self, message: str) -> str: """ Return the decoded version of message according to the polybius cipher >>> PolybiusCipher().decode("44154344 32154343112215") == "test message" True >>> PolybiusCipher().decode("4415434432154343112215") == "testmessage" True """ message = message.replace(" ", " ") decoded_message = "" for numbers_index in range(int(len(message) / 2)): if message[numbers_index * 2] != " ": index1 = message[numbers_index * 2] index2 = message[numbers_index * 2 + 1] letter = self.numbers_to_letter(int(index1), int(index2)) decoded_message = decoded_message + letter elif message[numbers_index * 2] == " ": decoded_message = decoded_message + " " return decoded_message ================================================ FILE: ciphers/porta_cipher.py ================================================ alphabet = { "A": ("ABCDEFGHIJKLM", "NOPQRSTUVWXYZ"), "B": ("ABCDEFGHIJKLM", "NOPQRSTUVWXYZ"), "C": ("ABCDEFGHIJKLM", "ZNOPQRSTUVWXY"), "D": ("ABCDEFGHIJKLM", "ZNOPQRSTUVWXY"), "E": ("ABCDEFGHIJKLM", "YZNOPQRSTUVWX"), "F": ("ABCDEFGHIJKLM", "YZNOPQRSTUVWX"), "G": ("ABCDEFGHIJKLM", "XYZNOPQRSTUVW"), "H": ("ABCDEFGHIJKLM", "XYZNOPQRSTUVW"), "I": ("ABCDEFGHIJKLM", "WXYZNOPQRSTUV"), "J": ("ABCDEFGHIJKLM", "WXYZNOPQRSTUV"), "K": ("ABCDEFGHIJKLM", "VWXYZNOPQRSTU"), "L": ("ABCDEFGHIJKLM", "VWXYZNOPQRSTU"), "M": ("ABCDEFGHIJKLM", "UVWXYZNOPQRST"), "N": ("ABCDEFGHIJKLM", "UVWXYZNOPQRST"), "O": ("ABCDEFGHIJKLM", "TUVWXYZNOPQRS"), "P": ("ABCDEFGHIJKLM", "TUVWXYZNOPQRS"), "Q": ("ABCDEFGHIJKLM", "STUVWXYZNOPQR"), "R": ("ABCDEFGHIJKLM", "STUVWXYZNOPQR"), "S": ("ABCDEFGHIJKLM", "RSTUVWXYZNOPQ"), "T": ("ABCDEFGHIJKLM", "RSTUVWXYZNOPQ"), "U": ("ABCDEFGHIJKLM", "QRSTUVWXYZNOP"), "V": ("ABCDEFGHIJKLM", "QRSTUVWXYZNOP"), "W": ("ABCDEFGHIJKLM", "PQRSTUVWXYZNO"), "X": ("ABCDEFGHIJKLM", "PQRSTUVWXYZNO"), "Y": ("ABCDEFGHIJKLM", "OPQRSTUVWXYZN"), "Z": ("ABCDEFGHIJKLM", "OPQRSTUVWXYZN"), } def generate_table(key: str) -> list[tuple[str, str]]: """ >>> generate_table('marvin') # doctest: +NORMALIZE_WHITESPACE [('ABCDEFGHIJKLM', 'UVWXYZNOPQRST'), ('ABCDEFGHIJKLM', 'NOPQRSTUVWXYZ'), ('ABCDEFGHIJKLM', 'STUVWXYZNOPQR'), ('ABCDEFGHIJKLM', 'QRSTUVWXYZNOP'), ('ABCDEFGHIJKLM', 'WXYZNOPQRSTUV'), ('ABCDEFGHIJKLM', 'UVWXYZNOPQRST')] """ return [alphabet[char] for char in key.upper()] def encrypt(key: str, words: str) -> str: """ >>> encrypt('marvin', 'jessica') 'QRACRWU' """ cipher = "" count = 0 table = generate_table(key) for char in words.upper(): cipher += get_opponent(table[count], char) count = (count + 1) % len(table) return cipher def decrypt(key: str, words: str) -> str: """ >>> decrypt('marvin', 'QRACRWU') 'JESSICA' """ return encrypt(key, words) def get_position(table: tuple[str, str], char: str) -> tuple[int, int]: """ >>> get_position(generate_table('marvin')[0], 'M') (0, 12) """ # `char` is either in the 0th row or the 1st row row = 0 if char in table[0] else 1 col = table[row].index(char) return row, col def get_opponent(table: tuple[str, str], char: str) -> str: """ >>> get_opponent(generate_table('marvin')[0], 'M') 'T' """ row, col = get_position(table, char.upper()) if row == 1: return table[0][col] else: return table[1][col] if row == 0 else char if __name__ == "__main__": import doctest doctest.testmod() # Fist ensure that all our tests are passing... """ Demo: Enter key: marvin Enter text to encrypt: jessica Encrypted: QRACRWU Decrypted with key: JESSICA """ key = input("Enter key: ").strip() text = input("Enter text to encrypt: ").strip() cipher_text = encrypt(key, text) print(f"Encrypted: {cipher_text}") print(f"Decrypted with key: {decrypt(key, cipher_text)}") ================================================ FILE: ciphers/prehistoric_men.txt ================================================ The Project Gutenberg eBook, Prehistoric Men, by Robert J. (Robert John) Braidwood, Illustrated by Susan T. Richert This eBook is for the use of anyone anywhere in the United States and most other parts of the world at no cost and with almost no restrictions whatsoever. You may copy it, give it away or re-use it under the terms of the Project Gutenberg License included with this eBook or online at www.gutenberg.org. If you are not located in the United States, you'll have to check the laws of the country where you are located before using this ebook. Title: Prehistoric Men Author: Robert J. (Robert John) Braidwood Release Date: July 28, 2016 [eBook #52664] Language: English Character set encoding: UTF-8 ***START OF THE PROJECT GUTENBERG EBOOK PREHISTORIC MEN*** E-text prepared by Stephen Hutcheson, Dave Morgan, Charlie Howard, and the Online Distributed Proofreading Team (http://www.pgdp.net) Note: Project Gutenberg also has an HTML version of this file which includes the original illustrations. See 52664-h.htm or 52664-h.zip: (http://www.gutenberg.org/files/52664/52664-h/52664-h.htm) or (http://www.gutenberg.org/files/52664/52664-h.zip) Transcriber's note: Some characters might not display in this UTF-8 text version. If so, the reader should consult the HTML version referred to above. One example of this might occur in the second paragraph under "Choppers and Adze-like Tools", page 46, which contains the phrase �an adze cutting edge is ? shaped�. The symbol before �shaped� looks like a sharply-italicized sans-serif �L�. Devices that cannot display that symbol may substitute a question mark, a square, or other symbol. PREHISTORIC MEN by ROBERT J. BRAIDWOOD Research Associate, Old World Prehistory Professor Oriental Institute and Department of Anthropology University of Chicago Drawings by Susan T. Richert [Illustration] Chicago Natural History Museum Popular Series Anthropology, Number 37 Third Edition Issued in Co-operation with The Oriental Institute, The University of Chicago Edited by Lillian A. Ross Printed in the United States of America by Chicago Natural History Museum Press Copyright 1948, 1951, and 1957 by Chicago Natural History Museum First edition 1948 Second edition 1951 Third edition 1957 Fourth edition 1959 Preface [Illustration] Like the writing of most professional archeologists, mine has been confined to so-called learned papers. Good, bad, or indifferent, these papers were in a jargon that only my colleagues and a few advanced students could understand. Hence, when I was asked to do this little book, I soon found it extremely difficult to say what I meant in simple fashion. The style is new to me, but I hope the reader will not find it forced or pedantic; at least I have done my very best to tell the story simply and clearly. Many friends have aided in the preparation of the book. The whimsical charm of Miss Susan Richert�s illustrations add enormously to the spirit I wanted. She gave freely of her own time on the drawings and in planning the book with me. My colleagues at the University of Chicago, especially Professor Wilton M. Krogman (now of the University of Pennsylvania), and also Mrs. Linda Braidwood, Associate of the Oriental Institute, and Professors Fay-Cooper Cole and Sol Tax, of the Department of Anthropology, gave me counsel in matters bearing on their special fields, and the Department of Anthropology bore some of the expense of the illustrations. From Mrs. Irma Hunter and Mr. Arnold Maremont, who are not archeologists at all and have only an intelligent layman�s notion of archeology, I had sound advice on how best to tell the story. I am deeply indebted to all these friends. While I was preparing the second edition, I had the great fortune to be able to rework the third chapter with Professor Sherwood L. Washburn, now of the Department of Anthropology of the University of California, and the fourth, fifth, and sixth chapters with Professor Hallum L. Movius, Jr., of the Peabody Museum, Harvard University. The book has gained greatly in accuracy thereby. In matters of dating, Professor Movius and the indications of Professor W. F. Libby�s Carbon 14 chronology project have both encouraged me to choose the lowest dates now current for the events of the Pleistocene Ice Age. There is still no certain way of fixing a direct chronology for most of the Pleistocene, but Professor Libby�s method appears very promising for its end range and for proto-historic dates. In any case, this book names �periods,� and new dates may be written in against mine, if new and better dating systems appear. I wish to thank Dr. Clifford C. Gregg, Director of Chicago Natural History Museum, for the opportunity to publish this book. My old friend, Dr. Paul S. Martin, Chief Curator in the Department of Anthropology, asked me to undertake the job and inspired me to complete it. I am also indebted to Miss Lillian A. Ross, Associate Editor of Scientific Publications, and to Mr. George I. Quimby, Curator of Exhibits in Anthropology, for all the time they have given me in getting the manuscript into proper shape. ROBERT J. BRAIDWOOD _June 15, 1950_ Preface to the Third Edition In preparing the enlarged third edition, many of the above mentioned friends have again helped me. I have picked the brains of Professor F. Clark Howell of the Department of Anthropology of the University of Chicago in reworking the earlier chapters, and he was very patient in the matter, which I sincerely appreciate. All of Mrs. Susan Richert Allen�s original drawings appear, but a few necessary corrections have been made in some of the charts and some new drawings have been added by Mr. John Pfiffner, Staff Artist, Chicago Natural History Museum. ROBERT J. BRAIDWOOD _March 1, 1959_ Contents PAGE How We Learn about Prehistoric Men 7 The Changing World in Which Prehistoric Men Lived 17 Prehistoric Men Themselves 22 Cultural Beginnings 38 More Evidence of Culture 56 Early Moderns 70 End and Prelude 92 The First Revolution 121 The Conquest of Civilization 144 End of Prehistory 162 Summary 176 List of Books 180 Index 184 HOW WE LEARN about Prehistoric Men [Illustration] Prehistory means the time before written history began. Actually, more than 99 per cent of man�s story is prehistory. Man is at least half a million years old, but he did not begin to write history (or to write anything) until about 5,000 years ago. The men who lived in prehistoric times left us no history books, but they did unintentionally leave a record of their presence and their way of life. This record is studied and interpreted by different kinds of scientists. SCIENTISTS WHO FIND OUT ABOUT PREHISTORIC MEN The scientists who study the bones and teeth and any other parts they find of the bodies of prehistoric men, are called _physical anthropologists_. Physical anthropologists are trained, much like doctors, to know all about the human body. They study living people, too; they know more about the biological facts of human �races� than anybody else. If the police find a badly decayed body in a trunk, they ask a physical anthropologist to tell them what the person originally looked like. The physical anthropologists who specialize in prehistoric men work with fossils, so they are sometimes called _human paleontologists_. ARCHEOLOGISTS There is a kind of scientist who studies the things that prehistoric men made and did. Such a scientist is called an _archeologist_. It is the archeologist�s business to look for the stone and metal tools, the pottery, the graves, and the caves or huts of the men who lived before history began. But there is more to archeology than just looking for things. In Professor V. Gordon Childe�s words, archeology �furnishes a sort of history of human activity, provided always that the actions have produced concrete results and left recognizable material traces.� You will see that there are at least three points in what Childe says: 1. The archeologists have to find the traces of things left behind by ancient man, and 2. Only a few objects may be found, for most of these were probably too soft or too breakable to last through the years. However, 3. The archeologist must use whatever he can find to tell a story--to make a �sort of history�--from the objects and living-places and graves that have escaped destruction. What I mean is this: Let us say you are walking through a dump yard, and you find a rusty old spark plug. If you want to think about what the spark plug means, you quickly remember that it is a part of an automobile motor. This tells you something about the man who threw the spark plug on the dump. He either had an automobile, or he knew or lived near someone who did. He can�t have lived so very long ago, you�ll remember, because spark plugs and automobiles are only about sixty years old. When you think about the old spark plug in this way you have just been making the beginnings of what we call an archeological _interpretation_; you have been making the spark plug tell a story. It is the same way with the man-made things we archeologists find and put in museums. Usually, only a few of these objects are pretty to look at; but each of them has some sort of story to tell. Making the interpretation of his finds is the most important part of the archeologist�s job. It is the way he gets at the �sort of history of human activity� which is expected of archeology. SOME OTHER SCIENTISTS There are many other scientists who help the archeologist and the physical anthropologist find out about prehistoric men. The geologists help us tell the age of the rocks or caves or gravel beds in which human bones or man-made objects are found. There are other scientists with names which all begin with �paleo� (the Greek word for �old�). The _paleontologists_ study fossil animals. There are also, for example, such scientists as _paleobotanists_ and _paleoclimatologists_, who study ancient plants and climates. These scientists help us to know the kinds of animals and plants that were living in prehistoric times and so could be used for food by ancient man; what the weather was like; and whether there were glaciers. Also, when I tell you that prehistoric men did not appear until long after the great dinosaurs had disappeared, I go on the say-so of the paleontologists. They know that fossils of men and of dinosaurs are not found in the same geological period. The dinosaur fossils come in early periods, the fossils of men much later. Since World War II even the atomic scientists have been helping the archeologists. By testing the amount of radioactivity left in charcoal, wood, or other vegetable matter obtained from archeological sites, they have been able to date the sites. Shell has been used also, and even the hair of Egyptian mummies. The dates of geological and climatic events have also been discovered. Some of this work has been done from drillings taken from the bottom of the sea. This dating by radioactivity has considerably shortened the dates which the archeologists used to give. If you find that some of the dates I give here are more recent than the dates you see in other books on prehistory, it is because I am using one of the new lower dating systems. [Illustration: RADIOCARBON CHART The rate of disappearance of radioactivity as time passes.[1]] [1] It is important that the limitations of the radioactive carbon �dating� system be held in mind. As the statistics involved in the system are used, there are two chances in three that the �date� of the sample falls within the range given as plus or minus an added number of years. For example, the �date� for the Jarmo village (see chart), given as 6750 � 200 B.C., really means that there are only two chances in three that the real date of the charcoal sampled fell between 6950 and 6550 B.C. We have also begun to suspect that there are ways in which the samples themselves may have become �contaminated,� either on the early or on the late side. We now tend to be suspicious of single radioactive carbon determinations, or of determinations from one site alone. But as a fabric of consistent determinations for several or more sites of one archeological period, we gain confidence in the dates. HOW THE SCIENTISTS FIND OUT So far, this chapter has been mainly about the people who find out about prehistoric men. We also need a word about _how_ they find out. All our finds came by accident until about a hundred years ago. Men digging wells, or digging in caves for fertilizer, often turned up ancient swords or pots or stone arrowheads. People also found some odd pieces of stone that didn�t look like natural forms, but they also didn�t look like any known tool. As a result, the people who found them gave them queer names; for example, �thunderbolts.� The people thought the strange stones came to earth as bolts of lightning. We know now that these strange stones were prehistoric stone tools. Many important finds still come to us by accident. In 1935, a British dentist, A. T. Marston, found the first of two fragments of a very important fossil human skull, in a gravel pit at Swanscombe, on the River Thames, England. He had to wait nine months, until the face of the gravel pit had been dug eight yards farther back, before the second fragment appeared. They fitted! Then, twenty years later, still another piece appeared. In 1928 workmen who were blasting out rock for the breakwater in the port of Haifa began to notice flint tools. Thus the story of cave men on Mount Carmel, in Palestine, began to be known. Planned archeological digging is only about a century old. Even before this, however, a few men realized the significance of objects they dug from the ground; one of these early archeologists was our own Thomas Jefferson. The first real mound-digger was a German grocer�s clerk, Heinrich Schliemann. Schliemann made a fortune as a merchant, first in Europe and then in the California gold-rush of 1849. He became an American citizen. Then he retired and had both money and time to test an old idea of his. He believed that the heroes of ancient Troy and Mycenae were once real Trojans and Greeks. He proved it by going to Turkey and Greece and digging up the remains of both cities. Schliemann had the great good fortune to find rich and spectacular treasures, and he also had the common sense to keep notes and make descriptions of what he found. He proved beyond doubt that many ancient city mounds can be _stratified_. This means that there may be the remains of many towns in a mound, one above another, like layers in a cake. You might like to have an idea of how mounds come to be in layers. The original settlers may have chosen the spot because it had a good spring and there were good fertile lands nearby, or perhaps because it was close to some road or river or harbor. These settlers probably built their town of stone and mud-brick. Finally, something would have happened to the town--a flood, or a burning, or a raid by enemies--and the walls of the houses would have fallen in or would have melted down as mud in the rain. Nothing would have remained but the mud and debris of a low mound of _one_ layer. The second settlers would have wanted the spot for the same reasons the first settlers did--good water, land, and roads. Also, the second settlers would have found a nice low mound to build their houses on, a protection from floods. But again, something would finally have happened to the second town, and the walls of _its_ houses would have come tumbling down. This makes the _second_ layer. And so on.... In Syria I once had the good fortune to dig on a large mound that had no less than fifteen layers. Also, most of the layers were thick, and there were signs of rebuilding and repairs within each layer. The mound was more than a hundred feet high. In each layer, the building material used had been a soft, unbaked mud-brick, and most of the debris consisted of fallen or rain-melted mud from these mud-bricks. This idea of _stratification_, like the cake layers, was already a familiar one to the geologists by Schliemann�s time. They could show that their lowest layer of rock was oldest or earliest, and that the overlying layers became more recent as one moved upward. Schliemann�s digging proved the same thing at Troy. His first (lowest and earliest) city had at least nine layers above it; he thought that the second layer contained the remains of Homer�s Troy. We now know that Homeric Troy was layer VIIa from the bottom; also, we count eleven layers or sub-layers in total. Schliemann�s work marks the beginnings of modern archeology. Scholars soon set out to dig on ancient sites, from Egypt to Central America. ARCHEOLOGICAL INFORMATION As time went on, the study of archeological materials--found either by accident or by digging on purpose--began to show certain things. Archeologists began to get ideas as to the kinds of objects that belonged together. If you compared a mail-order catalogue of 1890 with one of today, you would see a lot of differences. If you really studied the two catalogues hard, you would also begin to see that certain objects �go together.� Horseshoes and metal buggy tires and pieces of harness would begin to fit into a picture with certain kinds of coal stoves and furniture and china dishes and kerosene lamps. Our friend the spark plug, and radios and electric refrigerators and light bulbs would fit into a picture with different kinds of furniture and dishes and tools. You won�t be old enough to remember the kind of hats that women wore in 1890, but you�ve probably seen pictures of them, and you know very well they couldn�t be worn with the fashions of today. This is one of the ways that archeologists study their materials. The various tools and weapons and jewelry, the pottery, the kinds of houses, and even the ways of burying the dead tend to fit into pictures. Some archeologists call all of the things that go together to make such a picture an _assemblage_. The assemblage of the first layer of Schliemann�s Troy was as different from that of the seventh layer as our 1900 mail-order catalogue is from the one of today. The archeologists who came after Schliemann began to notice other things and to compare them with occurrences in modern times. The idea that people will buy better mousetraps goes back into very ancient times. Today, if we make good automobiles or radios, we can sell some of them in Turkey or even in Timbuktu. This means that a few present-day types of American automobiles and radios form part of present-day �assemblages� in both Turkey and Timbuktu. The total present-day �assemblage� of Turkey is quite different from that of Timbuktu or that of America, but they have at least some automobiles and some radios in common. Now these automobiles and radios will eventually wear out. Let us suppose we could go to some remote part of Turkey or to Timbuktu in a dream. We don�t know what the date is, in our dream, but we see all sorts of strange things and ways of living in both places. Nobody tells us what the date is. But suddenly we see a 1936 Ford; so we know that in our dream it has to be at least the year 1936, and only as many years after that as we could reasonably expect a Ford to keep in running order. The Ford would probably break down in twenty years� time, so the Turkish or Timbuktu �assemblage� we�re seeing in our dream has to date at about A.D. 1936-56. Archeologists not only �date� their ancient materials in this way; they also see over what distances and between which peoples trading was done. It turns out that there was a good deal of trading in ancient times, probably all on a barter and exchange basis. EVERYTHING BEGINS TO FIT TOGETHER Now we need to pull these ideas all together and see the complicated structure the archeologists can build with their materials. Even the earliest archeologists soon found that there was a very long range of prehistoric time which would yield only very simple things. For this very long early part of prehistory, there was little to be found but the flint tools which wandering, hunting and gathering people made, and the bones of the wild animals they ate. Toward the end of prehistoric time there was a general settling down with the coming of agriculture, and all sorts of new things began to be made. Archeologists soon got a general notion of what ought to appear with what. Thus, it would upset a French prehistorian digging at the bottom of a very early cave if he found a fine bronze sword, just as much as it would upset him if he found a beer bottle. The people of his very early cave layer simply could not have made bronze swords, which came later, just as do beer bottles. Some accidental disturbance of the layers of his cave must have happened. With any luck, archeologists do their digging in a layered, stratified site. They find the remains of everything that would last through time, in several different layers. They know that the assemblage in the bottom layer was laid down earlier than the assemblage in the next layer above, and so on up to the topmost layer, which is the latest. They look at the results of other �digs� and find that some other archeologist 900 miles away has found ax-heads in his lowest layer, exactly like the ax-heads of their fifth layer. This means that their fifth layer must have been lived in at about the same time as was the first layer in the site 200 miles away. It also may mean that the people who lived in the two layers knew and traded with each other. Or it could mean that they didn�t necessarily know each other, but simply that both traded with a third group at about the same time. You can see that the more we dig and find, the more clearly the main facts begin to stand out. We begin to be more sure of which people lived at the same time, which earlier and which later. We begin to know who traded with whom, and which peoples seemed to live off by themselves. We begin to find enough skeletons in burials so that the physical anthropologists can tell us what the people looked like. We get animal bones, and a paleontologist may tell us they are all bones of wild animals; or he may tell us that some or most of the bones are those of domesticated animals, for instance, sheep or cattle, and therefore the people must have kept herds. More important than anything else--as our structure grows more complicated and our materials increase--is the fact that �a sort of history of human activity� does begin to appear. The habits or traditions that men formed in the making of their tools and in the ways they did things, begin to stand out for us. How characteristic were these habits and traditions? What areas did they spread over? How long did they last? We watch the different tools and the traces of the way things were done--how the burials were arranged, what the living-places were like, and so on. We wonder about the people themselves, for the traces of habits and traditions are useful to us only as clues to the men who once had them. So we ask the physical anthropologists about the skeletons that we found in the burials. The physical anthropologists tell us about the anatomy and the similarities and differences which the skeletons show when compared with other skeletons. The physical anthropologists are even working on a method--chemical tests of the bones--that will enable them to discover what the blood-type may have been. One thing is sure. We have never found a group of skeletons so absolutely similar among themselves--so cast from a single mould, so to speak--that we could claim to have a �pure� race. I am sure we never shall. We become particularly interested in any signs of change--when new materials and tool types and ways of doing things replace old ones. We watch for signs of social change and progress in one way or another. We must do all this without one word of written history to aid us. Everything we are concerned with goes back to the time _before_ men learned to write. That is the prehistorian�s job--to find out what happened before history began. THE CHANGING WORLD in which Prehistoric Men Lived [Illustration] Mankind, we�ll say, is at least a half million years old. It is very hard to understand how long a time half a million years really is. If we were to compare this whole length of time to one day, we�d get something like this: The present time is midnight, and Jesus was born just five minutes and thirty-six seconds ago. Earliest history began less than fifteen minutes ago. Everything before 11:45 was in prehistoric time. Or maybe we can grasp the length of time better in terms of generations. As you know, primitive peoples tend to marry and have children rather early in life. So suppose we say that twenty years will make an average generation. At this rate there would be 25,000 generations in a half-million years. But our United States is much less than ten generations old, twenty-five generations take us back before the time of Columbus, Julius Caesar was alive just 100 generations ago, David was king of Israel less than 150 generations ago, 250 generations take us back to the beginning of written history. And there were 24,750 generations of men before written history began! I should probably tell you that there is a new method of prehistoric dating which would cut the earliest dates in my reckoning almost in half. Dr. Cesare Emiliani, combining radioactive (C14) and chemical (oxygen isotope) methods in the study of deep-sea borings, has developed a system which would lower the total range of human prehistory to about 300,000 years. The system is still too new to have had general examination and testing. Hence, I have not used it in this book; it would mainly affect the dates earlier than 25,000 years ago. CHANGES IN ENVIRONMENT The earth probably hasn�t changed much in the last 5,000 years (250 generations). Men have built things on its surface and dug into it and drawn boundaries on maps of it, but the places where rivers, lakes, seas, and mountains now stand have changed very little. In earlier times the earth looked very different. Geologists call the last great geological period the _Pleistocene_. It began somewhere between a half million and a million years ago, and was a time of great changes. Sometimes we call it the Ice Age, for in the Pleistocene there were at least three or four times when large areas of earth were covered with glaciers. The reason for my uncertainty is that while there seem to have been four major mountain or alpine phases of glaciation, there may only have been three general continental phases in the Old World.[2] [2] This is a complicated affair and I do not want to bother you with its details. Both the alpine and the continental ice sheets seem to have had minor fluctuations during their _main_ phases, and the advances of the later phases destroyed many of the traces of the earlier phases. The general textbooks have tended to follow the names and numbers established for the Alps early in this century by two German geologists. I will not bother you with the names, but there were _four_ major phases. It is the second of these alpine phases which seems to fit the traces of the earliest of the great continental glaciations. In this book, I will use the four-part system, since it is the most familiar, but will add the word _alpine_ so you may remember to make the transition to the continental system if you wish to do so. Glaciers are great sheets of ice, sometimes over a thousand feet thick, which are now known only in Greenland and Antarctica and in high mountains. During several of the glacial periods in the Ice Age, the glaciers covered most of Canada and the northern United States and reached down to southern England and France in Europe. Smaller ice sheets sat like caps on the Rockies, the Alps, and the Himalayas. The continental glaciation only happened north of the equator, however, so remember that �Ice Age� is only half true. As you know, the amount of water on and about the earth does not vary. These large glaciers contained millions of tons of water frozen into ice. Because so much water was frozen and contained in the glaciers, the water level of lakes and oceans was lowered. Flooded areas were drained and appeared as dry land. There were times in the Ice Age when there was no English Channel, so that England was not an island, and a land bridge at the Dardanelles probably divided the Mediterranean from the Black Sea. A very important thing for people living during the time of a glaciation was the region adjacent to the glacier. They could not, of course, live on the ice itself. The questions would be how close could they live to it, and how would they have had to change their way of life to do so. GLACIERS CHANGE THE WEATHER Great sheets of ice change the weather. When the front of a glacier stood at Milwaukee, the weather must have been bitterly cold in Chicago. The climate of the whole world would have been different, and you can see how animals and men would have been forced to move from one place to another in search of food and warmth. On the other hand, it looks as if only a minor proportion of the whole Ice Age was really taken up by times of glaciation. In between came the _interglacial_ periods. During these times the climate around Chicago was as warm as it is now, and sometimes even warmer. It may interest you to know that the last great glacier melted away less than 10,000 years ago. Professor Ernst Antevs thinks we may be living in an interglacial period and that the Ice Age may not be over yet. So if you want to make a killing in real estate for your several hundred times great-grandchildren, you might buy some land in the Arizona desert or the Sahara. We do not yet know just why the glaciers appeared and disappeared, as they did. It surely had something to do with an increase in rainfall and a fall in temperature. It probably also had to do with a general tendency for the land to rise at the beginning of the Pleistocene. We know there was some mountain-building at that time. Hence, rain-bearing winds nourished the rising and cooler uplands with snow. An increase in all three of these factors--if they came together--would only have needed to be slight. But exactly why this happened we do not know. The reason I tell you about the glaciers is simply to remind you of the changing world in which prehistoric men lived. Their surroundings--the animals and plants they used for food, and the weather they had to protect themselves from--were always changing. On the other hand, this change happened over so long a period of time and was so slow that individual people could not have noticed it. Glaciers, about which they probably knew nothing, moved in hundreds of miles to the north of them. The people must simply have wandered ever more southward in search of the plants and animals on which they lived. Or some men may have stayed where they were and learned to hunt different animals and eat different foods. Prehistoric men had to keep adapting themselves to new environments and those who were most adaptive were most successful. OTHER CHANGES Changes took place in the men themselves as well as in the ways they lived. As time went on, they made better tools and weapons. Then, too, we begin to find signs of how they started thinking of other things than food and the tools to get it with. We find that they painted on the walls of caves, and decorated their tools; we find that they buried their dead. At about the time when the last great glacier was finally melting away, men in the Near East made the first basic change in human economy. They began to plant grain, and they learned to raise and herd certain animals. This meant that they could store food in granaries and �on the hoof� against the bad times of the year. This first really basic change in man�s way of living has been called the �food-producing revolution.� By the time it happened, a modern kind of climate was beginning. Men had already grown to look as they do now. Know-how in ways of living had developed and progressed, slowly but surely, up to a point. It was impossible for men to go beyond that point if they only hunted and fished and gathered wild foods. Once the basic change was made--once the food-producing revolution became effective--technology leaped ahead and civilization and written history soon began. Prehistoric Men THEMSELVES [Illustration] DO WE KNOW WHERE MAN ORIGINATED? For a long time some scientists thought the �cradle of mankind� was in central Asia. Other scientists insisted it was in Africa, and still others said it might have been in Europe. Actually, we don�t know where it was. We don�t even know that there was only _one_ �cradle.� If we had to choose a �cradle� at this moment, we would probably say Africa. But the southern portions of Asia and Europe may also have been included in the general area. The scene of the early development of mankind was certainly the Old World. It is pretty certain men didn�t reach North or South America until almost the end of the Ice Age--had they done so earlier we would certainly have found some trace of them by now. The earliest tools we have yet found come from central and south Africa. By the dating system I�m using, these tools must be over 500,000 years old. There are now reports that a few such early tools have been found--at the Sterkfontein cave in South Africa--along with the bones of small fossil men called �australopithecines.� Not all scientists would agree that the australopithecines were �men,� or would agree that the tools were made by the australopithecines themselves. For these sticklers, the earliest bones of men come from the island of Java. The date would be about 450,000 years ago. So far, we have not yet found the tools which we suppose these earliest men in the Far East must have made. Let me say it another way. How old are the earliest traces of men we now have? Over half a million years. This was a time when the first alpine glaciation was happening in the north. What has been found so far? The tools which the men of those times made, in different parts of Africa. It is now fairly generally agreed that the �men� who made the tools were the australopithecines. There is also a more �man-like� jawbone at Kanam in Kenya, but its find-spot has been questioned. The next earliest bones we have were found in Java, and they may be almost a hundred thousand years younger than the earliest African finds. We haven�t yet found the tools of these early Javanese. Our knowledge of tool-using in Africa spreads quickly as time goes on: soon after the appearance of tools in the south we shall have them from as far north as Algeria. Very soon after the earliest Javanese come the bones of slightly more developed people in Java, and the jawbone of a man who once lived in what is now Germany. The same general glacial beds which yielded the later Javanese bones and the German jawbone also include tools. These finds come from the time of the second alpine glaciation. So this is the situation. By the time of the end of the second alpine or first continental glaciation (say 400,000 years ago) we have traces of men from the extremes of the more southerly portions of the Old World--South Africa, eastern Asia, and western Europe. There are also some traces of men in the middle ground. In fact, Professor Franz Weidenreich believed that creatures who were the immediate ancestors of men had already spread over Europe, Africa, and Asia by the time the Ice Age began. We certainly have no reason to disbelieve this, but fortunate accidents of discovery have not yet given us the evidence to prove it. MEN AND APES Many people used to get extremely upset at the ill-formed notion that �man descended from the apes.� Such words were much more likely to start fights or �monkey trials� than the correct notion that all living animals, including man, ascended or evolved from a single-celled organism which lived in the primeval seas hundreds of millions of years ago. Men are mammals, of the order called Primates, and man�s living relatives are the great apes. Men didn�t �descend� from the apes or apes from men, and mankind must have had much closer relatives who have since become extinct. Men stand erect. They also walk and run on their two feet. Apes are happiest in trees, swinging with their arms from branch to branch. Few branches of trees will hold the mighty gorilla, although he still manages to sleep in trees. Apes can�t stand really erect in our sense, and when they have to run on the ground, they use the knuckles of their hands as well as their feet. A key group of fossil bones here are the south African australopithecines. These are called the _Australopithecinae_ or �man-apes� or sometimes even �ape-men.� We do not _know_ that they were directly ancestral to men but they can hardly have been so to apes. Presently I�ll describe them a bit more. The reason I mention them here is that while they had brains no larger than those of apes, their hipbones were enough like ours so that they must have stood erect. There is no good reason to think they couldn�t have walked as we do. BRAINS, HANDS, AND TOOLS Whether the australopithecines were our ancestors or not, the proper ancestors of men must have been able to stand erect and to walk on their two feet. Three further important things probably were involved, next, before they could become men proper. These are: 1. The increasing size and development of the brain. 2. The increasing usefulness (specialization) of the thumb and hand. 3. The use of tools. Nobody knows which of these three is most important, or which came first. Most probably the growth of all three things was very much blended together. If you think about each of the things, you will see what I mean. Unless your hand is more flexible than a paw, and your thumb will work against (or oppose) your fingers, you can�t hold a tool very well. But you wouldn�t get the idea of using a tool unless you had enough brain to help you see cause and effect. And it is rather hard to see how your hand and brain would develop unless they had something to practice on--like using tools. In Professor Krogman�s words, �the hand must become the obedient servant of the eye and the brain.� It is the _co-ordination_ of these things that counts. Many other things must have been happening to the bodies of the creatures who were the ancestors of men. Our ancestors had to develop organs of speech. More than that, they had to get the idea of letting _certain sounds_ made with these speech organs have _certain meanings_. All this must have gone very slowly. Probably everything was developing little by little, all together. Men became men very slowly. WHEN SHALL WE CALL MEN MEN? What do I mean when I say �men�? People who looked pretty much as we do, and who used different tools to do different things, are men to me. We�ll probably never know whether the earliest ones talked or not. They probably had vocal cords, so they could make sounds, but did they know how to make sounds work as symbols to carry meanings? But if the fossil bones look like our skeletons, and if we find tools which we�ll agree couldn�t have been made by nature or by animals, then I�d say we had traces of _men_. The australopithecine finds of the Transvaal and Bechuanaland, in south Africa, are bound to come into the discussion here. I�ve already told you that the australopithecines could have stood upright and walked on their two hind legs. They come from the very base of the Pleistocene or Ice Age, and a few coarse stone tools have been found with the australopithecine fossils. But there are three varieties of the australopithecines and they last on until a time equal to that of the second alpine glaciation. They are the best suggestion we have yet as to what the ancestors of men _may_ have looked like. They were certainly closer to men than to apes. Although their brain size was no larger than the brains of modern apes their body size and stature were quite small; hence, relative to their small size, their brains were large. We have not been able to prove without doubt that the australopithecines were _tool-making_ creatures, even though the recent news has it that tools have been found with australopithecine bones. The doubt as to whether the australopithecines used the tools themselves goes like this--just suppose some man-like creature (whose bones we have not yet found) made the tools and used them to kill and butcher australopithecines. Hence a few experts tend to let australopithecines still hang in limbo as �man-apes.� THE EARLIEST MEN WE KNOW I�ll postpone talking about the tools of early men until the next chapter. The men whose bones were the earliest of the Java lot have been given the name _Meganthropus_. The bones are very fragmentary. We would not understand them very well unless we had the somewhat later Javanese lot--the more commonly known _Pithecanthropus_ or �Java man�--against which to refer them for study. One of the less well-known and earliest fragments, a piece of lower jaw and some teeth, rather strongly resembles the lower jaws and teeth of the australopithecine type. Was _Meganthropus_ a sort of half-way point between the australopithecines and _Pithecanthropus_? It is still too early to say. We shall need more finds before we can be definite one way or the other. Java man, _Pithecanthropus_, comes from geological beds equal in age to the latter part of the second alpine glaciation; the _Meganthropus_ finds refer to beds of the beginning of this glaciation. The first finds of Java man were made in 1891-92 by Dr. Eugene Dubois, a Dutch doctor in the colonial service. Finds have continued to be made. There are now bones enough to account for four skulls. There are also four jaws and some odd teeth and thigh bones. Java man, generally speaking, was about five feet six inches tall, and didn�t hold his head very erect. His skull was very thick and heavy and had room for little more than two-thirds as large a brain as we have. He had big teeth and a big jaw and enormous eyebrow ridges. No tools were found in the geological deposits where bones of Java man appeared. There are some tools in the same general area, but they come a bit later in time. One reason we accept the Java man as man--aside from his general anatomical appearance--is that these tools probably belonged to his near descendants. Remember that there are several varieties of men in the whole early Java lot, at least two of which are earlier than the _Pithecanthropus_, �Java man.� Some of the earlier ones seem to have gone in for bigness, in tooth-size at least. _Meganthropus_ is one of these earlier varieties. As we said, he _may_ turn out to be a link to the australopithecines, who _may_ or _may not_ be ancestral to men. _Meganthropus_ is best understandable in terms of _Pithecanthropus_, who appeared later in the same general area. _Pithecanthropus_ is pretty well understandable from the bones he left us, and also because of his strong resemblance to the fully tool-using cave-dwelling �Peking man,� _Sinanthropus_, about whom we shall talk next. But you can see that the physical anthropologists and prehistoric archeologists still have a lot of work to do on the problem of earliest men. PEKING MEN AND SOME EARLY WESTERNERS The earliest known Chinese are called _Sinanthropus_, or �Peking man,� because the finds were made near that city. In World War II, the United States Marine guard at our Embassy in Peking tried to help get the bones out of the city before the Japanese attack. Nobody knows where these bones are now. The Red Chinese accuse us of having stolen them. They were last seen on a dock-side at a Chinese port. But should you catch a Marine with a sack of old bones, perhaps we could achieve peace in Asia by returning them! Fortunately, there is a complete set of casts of the bones. Peking man lived in a cave in a limestone hill, made tools, cracked animal bones to get the marrow out, and used fire. Incidentally, the bones of Peking man were found because Chinese dig for what they call �dragon bones� and �dragon teeth.� Uneducated Chinese buy these things in their drug stores and grind them into powder for medicine. The �dragon teeth� and �bones� are really fossils of ancient animals, and sometimes of men. The people who supply the drug stores have learned where to dig for strange bones and teeth. Paleontologists who get to China go to the drug stores to buy fossils. In a roundabout way, this is how the fallen-in cave of Peking man at Choukoutien was discovered. Peking man was not quite as tall as Java man but he probably stood straighter. His skull looked very much like that of the Java skull except that it had room for a slightly larger brain. His face was less brutish than was Java man�s face, but this isn�t saying much. Peking man dates from early in the interglacial period following the second alpine glaciation. He probably lived close to 350,000 years ago. There are several finds to account for in Europe by about this time, and one from northwest Africa. The very large jawbone found near Heidelberg in Germany is doubtless even earlier than Peking man. The beds where it was found are of second alpine glacial times, and recently some tools have been said to have come from the same beds. There is not much I need tell you about the Heidelberg jaw save that it seems certainly to have belonged to an early man, and that it is very big. Another find in Germany was made at Steinheim. It consists of the fragmentary skull of a man. It is very important because of its relative completeness, but it has not yet been fully studied. The bone is thick, but the back of the head is neither very low nor primitive, and the face is also not primitive. The forehead does, however, have big ridges over the eyes. The more fragmentary skull from Swanscombe in England (p. 11) has been much more carefully studied. Only the top and back of that skull have been found. Since the skull rounds up nicely, it has been assumed that the face and forehead must have been quite �modern.� Careful comparison with Steinheim shows that this was not necessarily so. This is important because it bears on the question of how early truly �modern� man appeared. Recently two fragmentary jaws were found at Ternafine in Algeria, northwest Africa. They look like the jaws of Peking man. Tools were found with them. Since no jaws have yet been found at Steinheim or Swanscombe, but the time is the same, one wonders if these people had jaws like those of Ternafine. WHAT HAPPENED TO JAVA AND PEKING MEN Professor Weidenreich thought that there were at least a dozen ways in which the Peking man resembled the modern Mongoloids. This would seem to indicate that Peking man was really just a very early Chinese. Several later fossil men have been found in the Java-Australian area. The best known of these is the so-called Solo man. There are some finds from Australia itself which we now know to be quite late. But it looks as if we may assume a line of evolution from Java man down to the modern Australian natives. During parts of the Ice Age there was a land bridge all the way from Java to Australia. TWO ENGLISHMEN WHO WEREN�T OLD The older textbooks contain descriptions of two English finds which were thought to be very old. These were called Piltdown (_Eoanthropus dawsoni_) and Galley Hill. The skulls were very modern in appearance. In 1948-49, British scientists began making chemical tests which proved that neither of these finds is very old. It is now known that both �Piltdown man� and the tools which were said to have been found with him were part of an elaborate fake! TYPICAL �CAVE MEN� The next men we have to talk about are all members of a related group. These are the Neanderthal group. �Neanderthal man� himself was found in the Neander Valley, near D�sseldorf, Germany, in 1856. He was the first human fossil to be recognized as such. [Illustration: PRINCIPAL KNOWN TYPES OF FOSSIL MEN CRO-MAGNON NEANDERTHAL MODERN SKULL COMBE-CAPELLE SINANTHROPUS PITHECANTHROPUS] Some of us think that the neanderthaloids proper are only those people of western Europe who didn�t get out before the beginning of the last great glaciation, and who found themselves hemmed in by the glaciers in the Alps and northern Europe. Being hemmed in, they intermarried a bit too much and developed into a special type. Professor F. Clark Howell sees it this way. In Europe, the earliest trace of men we now know is the Heidelberg jaw. Evolution continued in Europe, from Heidelberg through the Swanscombe and Steinheim types to a group of pre-neanderthaloids. There are traces of these pre-neanderthaloids pretty much throughout Europe during the third interglacial period--say 100,000 years ago. The pre-neanderthaloids are represented by such finds as the ones at Ehringsdorf in Germany and Saccopastore in Italy. I won�t describe them for you, since they are simply less extreme than the neanderthaloids proper--about half way between Steinheim and the classic Neanderthal people. Professor Howell believes that the pre-neanderthaloids who happened to get caught in the pocket of the southwest corner of Europe at the onset of the last great glaciation became the classic Neanderthalers. Out in the Near East, Howell thinks, it is possible to see traces of people evolving from the pre-neanderthaloid type toward that of fully modern man. Certainly, we don�t see such extreme cases of �neanderthaloidism� outside of western Europe. There are at least a dozen good examples in the main or classic Neanderthal group in Europe. They date to just before and in the earlier part of the last great glaciation (85,000 to 40,000 years ago). Many of the finds have been made in caves. The �cave men� the movies and the cartoonists show you are probably meant to be Neanderthalers. I�m not at all sure they dragged their women by the hair; the women were probably pretty tough, too! Neanderthal men had large bony heads, but plenty of room for brains. Some had brain cases even larger than the average for modern man. Their faces were heavy, and they had eyebrow ridges of bone, but the ridges were not as big as those of Java man. Their foreheads were very low, and they didn�t have much chin. They were about five feet three inches tall, but were heavy and barrel-chested. But the Neanderthalers didn�t slouch as much as they�ve been blamed for, either. One important thing about the Neanderthal group is that there is a fair number of them to study. Just as important is the fact that we know something about how they lived, and about some of the tools they made. OTHER MEN CONTEMPORARY WITH THE NEANDERTHALOIDS We have seen that the neanderthaloids seem to be a specialization in a corner of Europe. What was going on elsewhere? We think that the pre-neanderthaloid type was a generally widespread form of men. From this type evolved other more or less extreme although generally related men. The Solo finds in Java form one such case. Another was the Rhodesian man of Africa, and the more recent Hopefield finds show more of the general Rhodesian type. It is more confusing than it needs to be if these cases outside western Europe are called neanderthaloids. They lived during the same approximate time range but they were all somewhat different-looking people. EARLY MODERN MEN How early is modern man (_Homo sapiens_), the �wise man�? Some people have thought that he was very early, a few still think so. Piltdown and Galley Hill, which were quite modern in anatomical appearance and _supposedly_ very early in date, were the best �evidence� for very early modern men. Now that Piltdown has been liquidated and Galley Hill is known to be very late, what is left of the idea? The backs of the skulls of the Swanscombe and Steinheim finds look rather modern. Unless you pay attention to the face and forehead of the Steinheim find--which not many people have--and perhaps also consider the Ternafine jaws, you might come to the conclusion that the crown of the Swanscombe head was that of a modern-like man. Two more skulls, again without faces, are available from a French cave site, Font�chevade. They come from the time of the last great interglacial, as did the pre-neanderthaloids. The crowns of the Font�chevade skulls also look quite modern. There is a bit of the forehead preserved on one of these skulls and the brow-ridge is not heavy. Nevertheless, there is a suggestion that the bones belonged to an immature individual. In this case, his (or even more so, if _her_) brow-ridges would have been weak anyway. The case for the Font�chevade fossils, as modern type men, is little stronger than that for Swanscombe, although Professor Vallois believes it a good case. It seems to add up to the fact that there were people living in Europe--before the classic neanderthaloids--who looked more modern, in some features, than the classic western neanderthaloids did. Our best suggestion of what men looked like--just before they became fully modern--comes from a cave on Mount Carmel in Palestine. THE FIRST MODERNS Professor T. D. McCown and the late Sir Arthur Keith, who studied the Mount Carmel bones, figured out that one of the two groups involved was as much as 70 per cent modern. There were, in fact, two groups or varieties of men in the Mount Carmel caves and in at least two other Palestinian caves of about the same time. The time would be about that of the onset of colder weather, when the last glaciation was beginning in the north--say 75,000 years ago. The 70 per cent modern group came from only one cave, Mugharet es-Skhul (�cave of the kids�). The other group, from several caves, had bones of men of the type we�ve been calling pre-neanderthaloid which we noted were widespread in Europe and beyond. The tools which came with each of these finds were generally similar, and McCown and Keith, and other scholars since their study, have tended to assume that both the Skhul group and the pre-neanderthaloid group came from exactly the same time. The conclusion was quite natural: here was a population of men in the act of evolving in two different directions. But the time may not be exactly the same. It is very difficult to be precise, within say 10,000 years, for a time some 75,000 years ago. If the Skhul men are in fact later than the pre-neanderthaloid group of Palestine, as some of us think, then they show how relatively modern some men were--men who lived at the same time as the classic Neanderthalers of the European pocket. Soon after the first extremely cold phase of the last glaciation, we begin to get a number of bones of completely modern men in Europe. We also get great numbers of the tools they made, and their living places in caves. Completely modern skeletons begin turning up in caves dating back to toward 40,000 years ago. The time is about that of the beginning of the second phase of the last glaciation. These skeletons belonged to people no different from many people we see today. Like people today, not everybody looked alike. (The positions of the more important fossil men of later Europe are shown in the chart on page 72.) DIFFERENCES IN THE EARLY MODERNS The main early European moderns have been divided into two groups, the Cro-Magnon group and the Combe Capelle-Br�nn group. Cro-Magnon people were tall and big-boned, with large, long, and rugged heads. They must have been built like many present-day Scandinavians. The Combe Capelle-Br�nn people were shorter; they had narrow heads and faces, and big eyebrow-ridges. Of course we don�t find the skin or hair of these people. But there is little doubt they were Caucasoids (�Whites�). Another important find came in the Italian Riviera, near Monte Carlo. Here, in a cave near Grimaldi, there was a grave containing a woman and a young boy, buried together. The two skeletons were first called �Negroid� because some features of their bones were thought to resemble certain features of modern African Negro bones. But more recently, Professor E. A. Hooton and other experts questioned the use of the word �Negroid� in describing the Grimaldi skeletons. It is true that nothing is known of the skin color, hair form, or any other fleshy feature of the Grimaldi people, so that the word �Negroid� in its usual meaning is not proper here. It is also not clear whether the features of the bones claimed to be �Negroid� are really so at all. From a place called Wadjak, in Java, we have �proto-Australoid� skulls which closely resemble those of modern Australian natives. Some of the skulls found in South Africa, especially the Boskop skull, look like those of modern Bushmen, but are much bigger. The ancestors of the Bushmen seem to have once been very widespread south of the Sahara Desert. True African Negroes were forest people who apparently expanded out of the west central African area only in the last several thousand years. Although dark in skin color, neither the Australians nor the Bushmen are Negroes; neither the Wadjak nor the Boskop skulls are �Negroid.� As we�ve already mentioned, Professor Weidenreich believed that Peking man was already on the way to becoming a Mongoloid. Anyway, the Mongoloids would seem to have been present by the time of the �Upper Cave� at Choukoutien, the _Sinanthropus_ find-spot. WHAT THE DIFFERENCES MEAN What does all this difference mean? It means that, at one moment in time, within each different area, men tended to look somewhat alike. From area to area, men tended to look somewhat different, just as they do today. This is all quite natural. People _tended_ to mate near home; in the anthropological jargon, they made up geographically localized breeding populations. The simple continental division of �stocks�--black = Africa, yellow = Asia, white = Europe--is too simple a picture to fit the facts. People became accustomed to life in some particular area within a continent (we might call it a �natural area�). As they went on living there, they evolved towards some particular physical variety. It would, of course, have been difficult to draw a clear boundary between two adjacent areas. There must always have been some mating across the boundaries in every case. One thing human beings don�t do, and never have done, is to mate for �purity.� It is self-righteous nonsense when we try to kid ourselves into thinking that they do. I am not going to struggle with the whole business of modern stocks and races. This is a book about prehistoric men, not recent historic or modern men. My physical anthropologist friends have been very patient in helping me to write and rewrite this chapter--I am not going to break their patience completely. Races are their business, not mine, and they must do the writing about races. I shall, however, give two modern definitions of race, and then make one comment. Dr. William G. Boyd, professor of Immunochemistry, School of Medicine, Boston University: �We may define a human race as a population which differs significantly from other human populations in regard to the frequency of one or more of the genes it possesses.� Professor Sherwood L. Washburn, professor of Physical Anthropology, Department of Anthropology, the University of California: �A �race� is a group of genetically similar populations, and races intergrade because there are always intermediate populations.� My comment is that the ideas involved here are all biological: they concern groups, _not_ individuals. Boyd and Washburn may differ a bit on what they want to consider a �population,� but a population is a group nevertheless, and genetics is biology to the hilt. Now a lot of people still think of race in terms of how people dress or fix their food or of other habits or customs they have. The next step is to talk about racial �purity.� None of this has anything whatever to do with race proper, which is a matter of the biology of groups. Incidentally, I�m told that if man very carefully _controls_ the breeding of certain animals over generations--dogs, cattle, chickens--he might achieve a �pure� race of animals. But he doesn�t do it. Some unfortunate genetic trait soon turns up, so this has just as carefully to be bred out again, and so on. SUMMARY OF PRESENT KNOWLEDGE OF FOSSIL MEN The earliest bones of men we now have--upon which all the experts would probably agree--are those of _Meganthropus_, from Java, of about 450,000 years ago. The earlier australopithecines of Africa were possibly not tool-users and may not have been ancestral to men at all. But there is an alternate and evidently increasingly stronger chance that some of them may have been. The Kanam jaw from Kenya, another early possibility, is not only very incomplete but its find-spot is very questionable. Java man proper, _Pithecanthropus_, comes next, at about 400,000 years ago, and the big Heidelberg jaw in Germany must be of about the same date. Next comes Swanscombe in England, Steinheim in Germany, the Ternafine jaws in Algeria, and Peking man, _Sinanthropus_. They all date to the second great interglacial period, about 350,000 years ago. Piltdown and Galley Hill are out, and with them, much of the starch in the old idea that there were two distinct lines of development in human evolution: (1) a line of �paleoanthropic� development from Heidelberg to the Neanderthalers where it became extinct, and (2) a very early �modern� line, through Piltdown, Galley Hill, Swanscombe, to us. Swanscombe, Steinheim, and Ternafine are just as easily cases of very early pre-neanderthaloids. The pre-neanderthaloids were very widespread during the third interglacial: Ehringsdorf, Saccopastore, some of the Mount Carmel people, and probably Font�chevade are cases in point. A variety of their descendants can be seen, from Java (Solo), Africa (Rhodesian man), and about the Mediterranean and in western Europe. As the acute cold of the last glaciation set in, the western Europeans found themselves surrounded by water, ice, or bitter cold tundra. To vastly over-simplify it, they �bred in� and became classic neanderthaloids. But on Mount Carmel, the Skhul cave-find with its 70 per cent modern features shows what could happen elsewhere at the same time. Lastly, from about 40,000 or 35,000 years ago--the time of the onset of the second phase of the last glaciation--we begin to find the fully modern skeletons of men. The modern skeletons differ from place to place, just as different groups of men living in different places still look different. What became of the Neanderthalers? Nobody can tell me for sure. I�ve a hunch they were simply �bred out� again when the cold weather was over. Many Americans, as the years go by, are no longer ashamed to claim they have �Indian blood in their veins.� Give us a few more generations and there will not be very many other Americans left to whom we can brag about it. It certainly isn�t inconceivable to me to imagine a little Cro-Magnon boy bragging to his friends about his tough, strong, Neanderthaler great-great-great-great-grandfather! Cultural BEGINNINGS [Illustration] Men, unlike the lower animals, are made up of much more than flesh and blood and bones; for men have �culture.� WHAT IS CULTURE? �Culture� is a word with many meanings. The doctors speak of making a �culture� of a certain kind of bacteria, and ants are said to have a �culture.� Then there is the Emily Post kind of �culture�--you say a person is �cultured,� or that he isn�t, depending on such things as whether or not he eats peas with his knife. The anthropologists use the word too, and argue heatedly over its finer meanings; but they all agree that every human being is part of or has some kind of culture. Each particular human group has a particular culture; that is one of the ways in which we can tell one group of men from another. In this sense, a CULTURE means the way the members of a group of people think and believe and live, the tools they make, and the way they do things. Professor Robert Redfield says a culture is an organized or formalized body of conventional understandings. �Conventional understandings� means the whole set of rules, beliefs, and standards which a group of people lives by. These understandings show themselves in art, and in the other things a people may make and do. The understandings continue to last, through tradition, from one generation to another. They are what really characterize different human groups. SOME CHARACTERISTICS OF CULTURE A culture lasts, although individual men in the group die off. On the other hand, a culture changes as the different conventions and understandings change. You could almost say that a culture lives in the minds of the men who have it. But people are not born with it; they get it as they grow up. Suppose a day-old Hungarian baby is adopted by a family in Oshkosh, Wisconsin, and the child is not told that he is Hungarian. He will grow up with no more idea of Hungarian culture than anyone else in Oshkosh. So when I speak of ancient Egyptian culture, I mean the whole body of understandings and beliefs and knowledge possessed by the ancient Egyptians. I mean their beliefs as to why grain grew, as well as their ability to make tools with which to reap the grain. I mean their beliefs about life after death. What I am thinking about as culture is a thing which lasted in time. If any one Egyptian, even the Pharaoh, died, it didn�t affect the Egyptian culture of that particular moment. PREHISTORIC CULTURES For that long period of man�s history that is all prehistory, we have no written descriptions of cultures. We find only the tools men made, the places where they lived, the graves in which they buried their dead. Fortunately for us, these tools and living places and graves all tell us something about the ways these men lived and the things they believed. But the story we learn of the very early cultures must be only a very small part of the whole, for we find so few things. The rest of the story is gone forever. We have to do what we can with what we find. For all of the time up to about 75,000 years ago, which was the time of the classic European Neanderthal group of men, we have found few cave-dwelling places of very early prehistoric men. First, there is the fallen-in cave where Peking man was found, near Peking. Then there are two or three other _early_, but not _very early_, possibilities. The finds at the base of the French cave of Font�chevade, those in one of the Makapan caves in South Africa, and several open sites such as Dr. L. S. B. Leakey�s Olorgesailie in Kenya doubtless all lie earlier than the time of the main European Neanderthal group, but none are so early as the Peking finds. You can see that we know very little about the home life of earlier prehistoric men. We find different kinds of early stone tools, but we can�t even be really sure which tools may have been used together. WHY LITTLE HAS LASTED FROM EARLY TIMES Except for the rare find-spots mentioned above, all our very early finds come from geological deposits, or from the wind-blown surfaces of deserts. Here is what the business of geological deposits really means. Let us say that a group of people was living in England about 300,000 years ago. They made the tools they needed, lived in some sort of camp, almost certainly built fires, and perhaps buried their dead. While the climate was still warm, many generations may have lived in the same place, hunting, and gathering nuts and berries; but after some few thousand years, the weather began very gradually to grow colder. These early Englishmen would not have known that a glacier was forming over northern Europe. They would only have noticed that the animals they hunted seemed to be moving south, and that the berries grew larger toward the south. So they would have moved south, too. The camp site they left is the place we archeologists would really have liked to find. All of the different tools the people used would have been there together--many broken, some whole. The graves, and traces of fire, and the tools would have been there. But the glacier got there first! The front of this enormous sheet of ice moved down over the country, crushing and breaking and plowing up everything, like a gigantic bulldozer. You can see what happened to our camp site. Everything the glacier couldn�t break, it pushed along in front of it or plowed beneath it. Rocks were ground to gravel, and soil was caught into the ice, which afterwards melted and ran off as muddy water. Hard tools of flint sometimes remained whole. Human bones weren�t so hard; it�s a wonder _any_ of them lasted. Gushing streams of melt water flushed out the debris from underneath the glacier, and water flowed off the surface and through great crevasses. The hard materials these waters carried were even more rolled and ground up. Finally, such materials were dropped by the rushing waters as gravels, miles from the front of the glacier. At last the glacier reached its greatest extent; then it melted backward toward the north. Debris held in the ice was dropped where the ice melted, or was flushed off by more melt water. When the glacier, leaving the land, had withdrawn to the sea, great hunks of ice were broken off as icebergs. These icebergs probably dropped the materials held in their ice wherever they floated and melted. There must be many tools and fragmentary bones of prehistoric men on the bottom of the Atlantic Ocean and the North Sea. Remember, too, that these glaciers came and went at least three or four times during the Ice Age. Then you will realize why the earlier things we find are all mixed up. Stone tools from one camp site got mixed up with stone tools from many other camp sites--tools which may have been made tens of thousands or more years apart. The glaciers mixed them all up, and so we cannot say which particular sets of tools belonged together in the first place. �EOLITHS� But what sort of tools do we find earliest? For almost a century, people have been picking up odd bits of flint and other stone in the oldest Ice Age gravels in England and France. It is now thought these odd bits of stone weren�t actually worked by prehistoric men. The stones were given a name, _eoliths_, or �dawn stones.� You can see them in many museums; but you can be pretty sure that very few of them were actually fashioned by men. It is impossible to pick out �eoliths� that seem to be made in any one _tradition_. By �tradition� I mean a set of habits for making one kind of tool for some particular job. No two �eoliths� look very much alike: tools made as part of some one tradition all look much alike. Now it�s easy to suppose that the very earliest prehistoric men picked up and used almost any sort of stone. This wouldn�t be surprising; you and I do it when we go camping. In other words, some of these �eoliths� may actually have been used by prehistoric men. They must have used anything that might be handy when they needed it. We could have figured that out without the �eoliths.� THE ROAD TO STANDARDIZATION Reasoning from what we know or can easily imagine, there should have been three major steps in the prehistory of tool-making. The first step would have been simple _utilization_ of what was at hand. This is the step into which the �eoliths� would fall. The second step would have been _fashioning_--the haphazard preparation of a tool when there was a need for it. Probably many of the earlier pebble tools, which I shall describe next, fall into this group. The third step would have been _standardization_. Here, men began to make tools according to certain set traditions. Counting the better-made pebble tools, there are four such traditions or sets of habits for the production of stone tools in earliest prehistoric times. Toward the end of the Pleistocene, a fifth tradition appears. PEBBLE TOOLS At the beginning of the last chapter, you�ll remember that I said there were tools from very early geological beds. The earliest bones of men have not yet been found in such early beds although the Sterkfontein australopithecine cave approaches this early date. The earliest tools come from Africa. They date back to the time of the first great alpine glaciation and are at least 500,000 years old. The earliest ones are made of split pebbles, about the size of your fist or a bit bigger. They go under the name of pebble tools. There are many natural exposures of early Pleistocene geological beds in Africa, and the prehistoric archeologists of south and central Africa have concentrated on searching for early tools. Other finds of early pebble tools have recently been made in Algeria and Morocco. [Illustration: SOUTH AFRICAN PEBBLE TOOL] There are probably early pebble tools to be found in areas of the Old World besides Africa; in fact, some prehistorians already claim to have identified a few. Since the forms and the distinct ways of making the earlier pebble tools had not yet sufficiently jelled into a set tradition, they are difficult for us to recognize. It is not so difficult, however, if there are great numbers of �possibles� available. A little later in time the tradition becomes more clearly set, and pebble tools are easier to recognize. So far, really large collections of pebble tools have only been found and examined in Africa. CORE-BIFACE TOOLS The next tradition we�ll look at is the _core_ or biface one. The tools are large pear-shaped pieces of stone trimmed flat on the two opposite sides or �faces.� Hence �biface� has been used to describe these tools. The front view is like that of a pear with a rather pointed top, and the back view looks almost exactly the same. Look at them side on, and you can see that the front and back faces are the same and have been trimmed to a thin tip. The real purpose in trimming down the two faces was to get a good cutting edge all around. You can see all this in the illustration. [Illustration: ABBEVILLIAN BIFACE] We have very little idea of the way in which these core-bifaces were used. They have been called �hand axes,� but this probably gives the wrong idea, for an ax, to us, is not a pointed tool. All of these early tools must have been used for a number of jobs--chopping, scraping, cutting, hitting, picking, and prying. Since the core-bifaces tend to be pointed, it seems likely that they were used for hitting, picking, and prying. But they have rough cutting edges, so they could have been used for chopping, scraping, and cutting. FLAKE TOOLS The third tradition is the _flake_ tradition. The idea was to get a tool with a good cutting edge by simply knocking a nice large flake off a big block of stone. You had to break off the flake in such a way that it was broad and thin, and also had a good sharp cutting edge. Once you really got on to the trick of doing it, this was probably a simpler way to make a good cutting tool than preparing a biface. You have to know how, though; I�ve tried it and have mashed my fingers more than once. The flake tools look as if they were meant mainly for chopping, scraping, and cutting jobs. When one made a flake tool, the idea seems to have been to produce a broad, sharp, cutting edge. [Illustration: CLACTONIAN FLAKE] The core-biface and the flake traditions were spread, from earliest times, over much of Europe, Africa, and western Asia. The map on page 52 shows the general area. Over much of this great region there was flint. Both of these traditions seem well adapted to flint, although good core-bifaces and flakes were made from other kinds of stone, especially in Africa south of the Sahara. CHOPPERS AND ADZE-LIKE TOOLS The fourth early tradition is found in southern and eastern Asia, from northwestern India through Java and Burma into China. Father Maringer recently reported an early group of tools in Japan, which most resemble those of Java, called Patjitanian. The prehistoric men in this general area mostly used quartz and tuff and even petrified wood for their stone tools (see illustration, p. 46). This fourth early tradition is called the _chopper-chopping tool_ tradition. It probably has its earliest roots in the pebble tool tradition of African type. There are several kinds of tools in this tradition, but all differ from the western core-bifaces and flakes. There are broad, heavy scrapers or cleavers, and tools with an adze-like cutting edge. These last-named tools are called �hand adzes,� just as the core-bifaces of the west have often been called �hand axes.� The section of an adze cutting edge is ? shaped; the section of an ax is < shaped. [Illustration: ANYATHIAN ADZE-LIKE TOOL] There are also pointed pebble tools. Thus the tool kit of these early south and east Asiatic peoples seems to have included tools for doing as many different jobs as did the tools of the Western traditions. Dr. H. L. Movius has emphasized that the tools which were found in the Peking cave with Peking man belong to the chopper-tool tradition. This is the only case as yet where the tools and the man have been found together from very earliest times--if we except Sterkfontein. DIFFERENCES WITHIN THE TOOL-MAKING TRADITIONS The latter three great traditions in the manufacture of stone tools--and the less clear-cut pebble tools before them--are all we have to show of the cultures of the men of those times. Changes happened in each of the traditions. As time went on, the tools in each tradition were better made. There could also be slight regional differences in the tools within one tradition. Thus, tools with small differences, but all belonging to one tradition, can be given special group (facies) names. This naming of special groups has been going on for some time. Here are some of these names, since you may see them used in museum displays of flint tools, or in books. Within each tradition of tool-making (save the chopper tools), the earliest tool type is at the bottom of the list, just as it appears in the lowest beds of a geological stratification.[3] [3] Archeologists usually make their charts and lists with the earliest materials at the bottom and the latest on top, since this is the way they find them in the ground. Chopper tool (all about equally early): Anyathian (Burma) Choukoutienian (China) Patjitanian (Java) Soan (India) Flake: �Typical Mousterian� Levalloiso-Mousterian Levalloisian Tayacian Clactonian (localized in England) Core-biface: Some blended elements in �Mousterian� Micoquian (= Acheulean 6 and 7) Acheulean Abbevillian (once called �Chellean�) Pebble tool: Oldowan Ain Hanech pre-Stellenbosch Kafuan The core-biface and the flake traditions appear in the chart (p. 65). The early archeologists had many of the tool groups named before they ever realized that there were broader tool preparation traditions. This was understandable, for in dealing with the mixture of things that come out of glacial gravels the easiest thing to do first is to isolate individual types of tools into groups. First you put a bushel-basketful of tools on a table and begin matching up types. Then you give names to the groups of each type. The groups and the types are really matters of the archeologists� choice; in real life, they were probably less exact than the archeologists� lists of them. We now know pretty well in which of the early traditions the various early groups belong. THE MEANING OF THE DIFFERENT TRADITIONS What do the traditions really mean? I see them as the standardization of ways to make tools for particular jobs. We may not know exactly what job the maker of a particular core-biface or flake tool had in mind. We can easily see, however, that he already enjoyed a know-how, a set of persistent habits of tool preparation, which would always give him the same type of tool when he wanted to make it. Therefore, the traditions show us that persistent habits already existed for the preparation of one type of tool or another. This tells us that one of the characteristic aspects of human culture was already present. There must have been, in the minds of these early men, a notion of the ideal type of tool for a particular job. Furthermore, since we find so many thousands upon thousands of tools of one type or another, the notion of the ideal types of tools _and_ the know-how for the making of each type must have been held in common by many men. The notions of the ideal types and the know-how for their production must have been passed on from one generation to another. I could even guess that the notions of the ideal type of one or the other of these tools stood out in the minds of men of those times somewhat like a symbol of �perfect tool for good job.� If this were so--remember it�s only a wild guess of mine--then men were already symbol users. Now let�s go on a further step to the fact that the words men speak are simply sounds, each different sound being a symbol for a different meaning. If standardized tool-making suggests symbol-making, is it also possible that crude word-symbols were also being made? I suppose that it is not impossible. There may, of course, be a real question whether tool-utilizing creatures--our first step, on page 42--were actually men. Other animals utilize things at hand as tools. The tool-fashioning creature of our second step is more suggestive, although we may not yet feel sure that many of the earlier pebble tools were man-made products. But with the step to standardization and the appearance of the traditions, I believe we must surely be dealing with the traces of culture-bearing _men_. The �conventional understandings� which Professor Redfield�s definition of culture suggests are now evidenced for us in the persistent habits for the preparation of stone tools. Were we able to see the other things these prehistoric men must have made--in materials no longer preserved for the archeologist to find--I believe there would be clear signs of further conventional understandings. The men may have been physically primitive and pretty shaggy in appearance, but I think we must surely call them men. AN OLDER INTERPRETATION OF THE WESTERN TRADITIONS In the last chapter, I told you that many of the older archeologists and human paleontologists used to think that modern man was very old. The supposed ages of Piltdown and Galley Hill were given as evidence of the great age of anatomically modern man, and some interpretations of the Swanscombe and Font�chevade fossils were taken to support this view. The conclusion was that there were two parallel lines or �phyla� of men already present well back in the Pleistocene. The first of these, the more primitive or �paleoanthropic� line, was said to include Heidelberg, the proto-neanderthaloids and classic Neanderthal. The more anatomically modern or �neanthropic� line was thought to consist of Piltdown and the others mentioned above. The Neanderthaler or paleoanthropic line was thought to have become extinct after the first phase of the last great glaciation. Of course, the modern or neanthropic line was believed to have persisted into the present, as the basis for the world�s population today. But with Piltdown liquidated, Galley Hill known to be very late, and Swanscombe and Font�chevade otherwise interpreted, there is little left of the so-called parallel phyla theory. While the theory was in vogue, however, and as long as the European archeological evidence was looked at in one short-sighted way, the archeological materials _seemed_ to fit the parallel phyla theory. It was simply necessary to believe that the flake tools were made only by the paleoanthropic Neanderthaler line, and that the more handsome core-biface tools were the product of the neanthropic modern-man line. Remember that _almost_ all of the early prehistoric European tools came only from the redeposited gravel beds. This means that the tools were not normally found in the remains of camp sites or work shops where they had actually been dropped by the men who made and used them. The tools came, rather, from the secondary hodge-podge of the glacial gravels. I tried to give you a picture of the bulldozing action of glaciers (p. 40) and of the erosion and weathering that were side-effects of a glacially conditioned climate on the earth�s surface. As we said above, if one simply plucks tools out of the redeposited gravels, his natural tendency is to �type� the tools by groups, and to think that the groups stand for something _on their own_. In 1906, M. Victor Commont actually made a rare find of what seems to have been a kind of workshop site, on a terrace above the Somme river in France. Here, Commont realized, flake tools appeared clearly in direct association with core-biface tools. Few prehistorians paid attention to Commont or his site, however. It was easier to believe that flake tools represented a distinct �culture� and that this �culture� was that of the Neanderthaler or paleoanthropic line, and that the core-bifaces stood for another �culture� which was that of the supposed early modern or neanthropic line. Of course, I am obviously skipping many details here. Some later sites with Neanderthal fossils do seem to have only flake tools, but other such sites have both types of tools. The flake tools which appeared _with_ the core-bifaces in the Swanscombe gravels were never made much of, although it was embarrassing for the parallel phyla people that Font�chevade ran heavily to flake tools. All in all, the parallel phyla theory flourished because it seemed so neat and easy to understand. TRADITIONS ARE TOOL-MAKING HABITS, NOT CULTURES In case you think I simply enjoy beating a dead horse, look in any standard book on prehistory written twenty (or even ten) years ago, or in most encyclopedias. You�ll find that each of the individual tool types, of the West, at least, was supposed to represent a �culture.� The �cultures� were believed to correspond to parallel lines of human evolution. In 1937, Mr. Harper Kelley strongly re-emphasized the importance of Commont�s workshop site and the presence of flake tools with core-bifaces. Next followed Dr. Movius� clear delineation of the chopper-chopping tool tradition of the Far East. This spoiled the nice symmetry of the flake-tool = paleoanthropic, core-biface = neanthropic equations. Then came increasing understanding of the importance of the pebble tools in Africa, and the location of several more workshop sites there, especially at Olorgesailie in Kenya. Finally came the liquidation of Piltdown and the deflation of Galley Hill�s date. So it is at last possible to picture an individual prehistoric man making a flake tool to do one job and a core-biface tool to do another. Commont showed us this picture in 1906, but few believed him. [Illustration: DISTRIBUTION OF TOOL-PREPARATION TRADITIONS Time approximately 100,000 years ago] There are certainly a few cases in which flake tools did appear with few or no core-bifaces. The flake-tool group called Clactonian in England is such a case. Another good, but certainly later case is that of the cave on Mount Carmel in Palestine, where the blended pre-neanderthaloid, 70 per cent modern-type skulls were found. Here, in the same level with the skulls, were 9,784 flint tools. Of these, only three--doubtless strays--were core-bifaces; all the rest were flake tools or flake chips. We noted above how the Font�chevade cave ran to flake tools. The only conclusion I would draw from this is that times and circumstances did exist in which prehistoric men needed only flake tools. So they only made flake tools for those particular times and circumstances. LIFE IN EARLIEST TIMES What do we actually know of life in these earliest times? In the glacial gravels, or in the terrace gravels of rivers once swollen by floods of melt water or heavy rains, or on the windswept deserts, we find stone tools. The earliest and coarsest of these are the pebble tools. We do not yet know what the men who made them looked like, although the Sterkfontein australopithecines probably give us a good hint. Then begin the more formal tool preparation traditions of the west--the core-bifaces and the flake tools--and the chopper-chopping tool series of the farther east. There is an occasional roughly worked piece of bone. From the gravels which yield the Clactonian flakes of England comes the fire-hardened point of a wooden spear. There are also the chance finds of the fossil human bones themselves, of which we spoke in the last chapter. Aside from the cave of Peking man, none of the earliest tools have been found in caves. Open air or �workshop� sites which do not seem to have been disturbed later by some geological agency are very rare. The chart on page 65 shows graphically what the situation in west-central Europe seems to have been. It is not yet certain whether there were pebble tools there or not. The Font�chevade cave comes into the picture about 100,000 years ago or more. But for the earlier hundreds of thousands of years--below the red-dotted line on the chart--the tools we find come almost entirely from the haphazard mixture within the geological contexts. The stone tools of each of the earlier traditions are the simplest kinds of all-purpose tools. Almost any one of them could be used for hacking, chopping, cutting, and scraping; so the men who used them must have been living in a rough and ready sort of way. They found or hunted their food wherever they could. In the anthropological jargon, they were �food-gatherers,� pure and simple. Because of the mixture in the gravels and in the materials they carried, we can�t be sure which animals these men hunted. Bones of the larger animals turn up in the gravels, but they could just as well belong to the animals who hunted the men, rather than the other way about. We don�t know. This is why camp sites like Commont�s and Olorgesailie in Kenya are so important when we do find them. The animal bones at Olorgesailie belonged to various mammals of extremely large size. Probably they were taken in pit-traps, but there are a number of groups of three round stones on the site which suggest that the people used bolas. The South American Indians used three-ball bolas, with the stones in separate leather bags connected by thongs. These were whirled and then thrown through the air so as to entangle the feet of a fleeing animal. Professor F. Clark Howell recently returned from excavating another important open air site at Isimila in Tanganyika. The site yielded the bones of many fossil animals and also thousands of core-bifaces, flakes, and choppers. But Howell�s reconstruction of the food-getting habits of the Isimila people certainly suggests that the word �hunting� is too dignified for what they did; �scavenging� would be much nearer the mark. During a great part of this time the climate was warm and pleasant. The second interglacial period (the time between the second and third great alpine glaciations) lasted a long time, and during much of this time the climate may have been even better than ours is now. We don�t know that earlier prehistoric men in Europe or Africa lived in caves. They may not have needed to; much of the weather may have been so nice that they lived in the open. Perhaps they didn�t wear clothes, either. WHAT THE PEKING CAVE-FINDS TELL US The one early cave-dwelling we have found is that of Peking man, in China. Peking man had fire. He probably cooked his meat, or used the fire to keep dangerous animals away from his den. In the cave were bones of dangerous animals, members of the wolf, bear, and cat families. Some of the cat bones belonged to beasts larger than tigers. There were also bones of other wild animals: buffalo, camel, deer, elephants, horses, sheep, and even ostriches. Seventy per cent of the animals Peking man killed were fallow deer. It�s much too cold and dry in north China for all these animals to live there today. So this list helps us know that the weather was reasonably warm, and that there was enough rain to grow grass for the grazing animals. The list also helps the paleontologists to date the find. Peking man also seems to have eaten plant food, for there are hackberry seeds in the debris of the cave. His tools were made of sandstone and quartz and sometimes of a rather bad flint. As we�ve already seen, they belong in the chopper-tool tradition. It seems fairly clear that some of the edges were chipped by right-handed people. There are also many split pieces of heavy bone. Peking man probably split them so he could eat the bone marrow, but he may have used some of them as tools. Many of these split bones were the bones of Peking men. Each one of the skulls had already had the base broken out of it. In no case were any of the bones resting together in their natural relation to one another. There is nothing like a burial; all of the bones are scattered. Now it�s true that animals could have scattered bodies that were not cared for or buried. But splitting bones lengthwise and carefully removing the base of a skull call for both the tools and the people to use them. It�s pretty clear who the people were. Peking man was a cannibal. * * * * * This rounds out about all we can say of the life and times of early prehistoric men. In those days life was rough. You evidently had to watch out not only for dangerous animals but also for your fellow men. You ate whatever you could catch or find growing. But you had sense enough to build fires, and you had already formed certain habits for making the kinds of stone tools you needed. That�s about all we know. But I think we�ll have to admit that cultural beginnings had been made, and that these early people were really _men_. MORE EVIDENCE of Culture [Illustration] While the dating is not yet sure, the material that we get from caves in Europe must go back to about 100,000 years ago; the time of the classic Neanderthal group followed soon afterwards. We don�t know why there is no earlier material in the caves; apparently they were not used before the last interglacial phase (the period just before the last great glaciation). We know that men of the classic Neanderthal group were living in caves from about 75,000 to 45,000 years ago. New radioactive carbon dates even suggest that some of the traces of culture we�ll describe in this chapter may have lasted to about 35,000 years ago. Probably some of the pre-neanderthaloid types of men had also lived in caves. But we have so far found their bones in caves only in Palestine and at Font�chevade. THE CAVE LAYERS In parts of France, some peasants still live in caves. In prehistoric time, many generations of people lived in them. As a result, many caves have deep layers of debris. The first people moved in and lived on the rock floor. They threw on the floor whatever they didn�t want, and they tracked in mud; nobody bothered to clean house in those days. Their debris--junk and mud and garbage and what not--became packed into a layer. As time went on, and generations passed, the layer grew thicker. Then there might have been a break in the occupation of the cave for a while. Perhaps the game animals got scarce and the people moved away; or maybe the cave became flooded. Later on, other people moved in and began making a new layer of their own on top of the first layer. Perhaps this process of layering went on in the same cave for a hundred thousand years; you can see what happened. The drawing on this page shows a section through such a cave. The earliest layer is on the bottom, the latest one on top. They go in order from bottom to top, earliest to latest. This is the _stratification_ we talked about (p. 12). [Illustration: SECTION OF SHELTER ON LOWER TERRACE, LE MOUSTIER] While we may find a mix-up in caves, it�s not nearly as bad as the mixing up that was done by glaciers. The animal bones and shells, the fireplaces, the bones of men, and the tools the men made all belong together, if they come from one layer. That�s the reason why the cave of Peking man is so important. It is also the reason why the caves in Europe and the Near East are so important. We can get an idea of which things belong together and which lot came earliest and which latest. In most cases, prehistoric men lived only in the mouths of caves. They didn�t like the dark inner chambers as places to live in. They preferred rock-shelters, at the bases of overhanging cliffs, if there was enough overhang to give shelter. When the weather was good, they no doubt lived in the open air as well. I�ll go on using the term �cave� since it�s more familiar, but remember that I really mean rock-shelter, as a place in which people actually lived. The most important European cave sites are in Spain, France, and central Europe; there are also sites in England and Italy. A few caves are known in the Near East and Africa, and no doubt more sites will be found when the out-of-the-way parts of Europe, Africa, and Asia are studied. AN �INDUSTRY� DEFINED We have already seen that the earliest European cave materials are those from the cave of Font�chevade. Movius feels certain that the lowest materials here date back well into the third interglacial stage, that which lay between the Riss (next to the last) and the W�rm I (first stage of the last) alpine glaciations. This material consists of an _industry_ of stone tools, apparently all made in the flake tradition. This is the first time we have used the word �industry.� It is useful to call all of the different tools found together in one layer and made of _one kind of material_ an industry; that is, the tools must be found together as men left them. Tools taken from the glacial gravels (or from windswept desert surfaces or river gravels or any geological deposit) are not �together� in this sense. We might say the latter have only �geological,� not �archeological� context. Archeological context means finding things just as men left them. We can tell what tools go together in an �industrial� sense only if we have archeological context. Up to now, the only things we could have called �industries� were the worked stone industry and perhaps the worked (?) bone industry of the Peking cave. We could add some of the very clear cases of open air sites, like Olorgesailie. We couldn�t use the term for the stone tools from the glacial gravels, because we do not know which tools belonged together. But when the cave materials begin to appear in Europe, we can begin to speak of industries. Most of the European caves of this time contain industries of flint tools alone. THE EARLIEST EUROPEAN CAVE LAYERS We�ve just mentioned the industry from what is said to be the oldest inhabited cave in Europe; that is, the industry from the deepest layer of the site at Font�chevade. Apparently it doesn�t amount to much. The tools are made of stone, in the flake tradition, and are very poorly worked. This industry is called _Tayacian_. Its type tool seems to be a smallish flake tool, but there are also larger flakes which seem to have been fashioned for hacking. In fact, the type tool seems to be simply a smaller edition of the Clactonian tool (pictured on p. 45). None of the Font�chevade tools are really good. There are scrapers, and more or less pointed tools, and tools that may have been used for hacking and chopping. Many of the tools from the earlier glacial gravels are better made than those of this first industry we see in a European cave. There is so little of this material available that we do not know which is really typical and which is not. You would probably find it hard to see much difference between this industry and a collection of tools of the type called Clactonian, taken from the glacial gravels, especially if the Clactonian tools were small-sized. The stone industry of the bottommost layer of the Mount Carmel cave, in Palestine, where somewhat similar tools were found, has also been called Tayacian. I shall have to bring in many unfamiliar words for the names of the industries. The industries are usually named after the places where they were first found, and since these were in most cases in France, most of the names which follow will be of French origin. However, the names have simply become handles and are in use far beyond the boundaries of France. It would be better if we had a non-place-name terminology, but archeologists have not yet been able to agree on such a terminology. THE ACHEULEAN INDUSTRY Both in France and in Palestine, as well as in some African cave sites, the next layers in the deep caves have an industry in both the core-biface and the flake traditions. The core-biface tools usually make up less than half of all the tools in the industry. However, the name of the biface type of tool is generally given to the whole industry. It is called the _Acheulean_, actually a late form of it, as �Acheulean� is also used for earlier core-biface tools taken from the glacial gravels. In western Europe, the name used is _Upper Acheulean_ or _Micoquian_. The same terms have been borrowed to name layers E and F in the Tabun cave, on Mount Carmel in Palestine. The Acheulean core-biface type of tool is worked on two faces so as to give a cutting edge all around. The outline of its front view may be oval, or egg-shaped, or a quite pointed pear shape. The large chip-scars of the Acheulean core-bifaces are shallow and flat. It is suspected that this resulted from the removal of the chips with a wooden club; the deep chip-scars of the earlier Abbevillian core-biface came from beating the tool against a stone anvil. These tools are really the best and also the final products of the core-biface tradition. We first noticed the tradition in the early glacial gravels (p. 43); now we see its end, but also its finest examples, in the deeper cave levels. The flake tools, which really make up the greater bulk of this industry, are simple scrapers and chips with sharp cutting edges. The habits used to prepare them must have been pretty much the same as those used for at least one of the flake industries we shall mention presently. There is very little else in these early cave layers. We do not have a proper �industry� of bone tools. There are traces of fire, and of animal bones, and a few shells. In Palestine, there are many more bones of deer than of gazelle in these layers; the deer lives in a wetter climate than does the gazelle. In the European cave layers, the animal bones are those of beasts that live in a warm climate. They belonged in the last interglacial period. We have not yet found the bones of fossil men definitely in place with this industry. [Illustration: ACHEULEAN BIFACE] FLAKE INDUSTRIES FROM THE CAVES Two more stone industries--the _Levalloisian_ and the �_Mousterian_�--turn up at approximately the same time in the European cave layers. Their tools seem to be mainly in the flake tradition, but according to some of the authorities their preparation also shows some combination with the habits by which the core-biface tools were prepared. Now notice that I don�t tell you the Levalloisian and the �Mousterian� layers are both above the late Acheulean layers. Look at the cave section (p. 57) and you�ll find that some �Mousterian of Acheulean tradition� appears above some �typical Mousterian.� This means that there may be some kinds of Acheulean industries that are later than some kinds of �Mousterian.� The same is true of the Levalloisian. There were now several different kinds of habits that men used in making stone tools. These habits were based on either one or the other of the two traditions--core-biface or flake--or on combinations of the habits used in the preparation techniques of both traditions. All were popular at about the same time. So we find that people who made one kind of stone tool industry lived in a cave for a while. Then they gave up the cave for some reason, and people with another industry moved in. Then the first people came back--or at least somebody with the same tool-making habits as the first people. Or maybe a third group of tool-makers moved in. The people who had these different habits for making their stone tools seem to have moved around a good deal. They no doubt borrowed and exchanged tricks of the trade with each other. There were no patent laws in those days. The extremely complicated interrelationships of the different habits used by the tool-makers of this range of time are at last being systematically studied. M. Fran�ois Bordes has developed a statistical method of great importance for understanding these tool preparation habits. THE LEVALLOISIAN AND MOUSTERIAN The easiest Levalloisian tool to spot is a big flake tool. The trick in making it was to fashion carefully a big chunk of stone (called the Levalloisian �tortoise core,� because it resembles the shape of a turtle-shell) and then to whack this in such a way that a large flake flew off. This large thin flake, with sharp cutting edges, is the finished Levalloisian tool. There were various other tools in a Levalloisian industry, but this is the characteristic _Levalloisian_ tool. There are several �typical Mousterian� stone tools. Different from the tools of the Levalloisian type, these were made from �disc-like cores.� There are medium-sized flake �side scrapers.� There are also some small pointed tools and some small �hand axes.� The last of these tool types is often a flake worked on both of the flat sides (that is, bifacially). There are also pieces of flint worked into the form of crude balls. The pointed tools may have been fixed on shafts to make short jabbing spears; the round flint balls may have been used as bolas. Actually, we don�t _know_ what either tool was used for. The points and side scrapers are illustrated (pp. 64 and 66). [Illustration: LEVALLOIS FLAKE] THE MIXING OF TRADITIONS Nowadays the archeologists are less and less sure of the importance of any one specific tool type and name. Twenty years ago, they used to speak simply of Acheulean or Levalloisian or Mousterian tools. Now, more and more, _all_ of the tools from some one layer in a cave are called an �industry,� which is given a mixed name. Thus we have �Levalloiso-Mousterian,� and �Acheuleo-Levalloisian,� and even �Acheuleo-Mousterian� (or �Mousterian of Acheulean tradition�). Bordes� systematic work is beginning to clear up some of our confusion. The time of these late Acheuleo-Levalloiso-Mousterioid industries is from perhaps as early as 100,000 years ago. It may have lasted until well past 50,000 years ago. This was the time of the first phase of the last great glaciation. It was also the time that the classic group of Neanderthal men was living in Europe. A number of the Neanderthal fossil finds come from these cave layers. Before the different habits of tool preparation were understood it used to be popular to say Neanderthal man was �Mousterian man.� I think this is wrong. What used to be called �Mousterian� is now known to be a variety of industries with tools of both core-biface and flake habits, and so mixed that the word �Mousterian� used alone really doesn�t mean anything. The Neanderthalers doubtless understood the tool preparation habits by means of which Acheulean, Levalloisian and Mousterian type tools were produced. We also have the more modern-like Mount Carmel people, found in a cave layer of Palestine with tools almost entirely in the flake tradition, called �Levalloiso-Mousterian,� and the Font�chevade-Tayacian (p. 59). [Illustration: MOUSTERIAN POINT] OTHER SUGGESTIONS OF LIFE IN THE EARLY CAVE LAYERS Except for the stone tools, what do we know of the way men lived in the time range after 100,000 to perhaps 40,000 years ago or even later? We know that in the area from Europe to Palestine, at least some of the people (some of the time) lived in the fronts of caves and warmed themselves over fires. In Europe, in the cave layers of these times, we find the bones of different animals; the bones in the lowest layers belong to animals that lived in a warm climate; above them are the bones of those who could stand the cold, like the reindeer and mammoth. Thus, the meat diet must have been changing, as the glacier crept farther south. Shells and possibly fish bones have lasted in these cave layers, but there is not a trace of the vegetable foods and the nuts and berries and other wild fruits that must have been eaten when they could be found. [Illustration: CHART SHOWING PRESENT UNDERSTANDING OF RELATIONSHIPS AND SUCCESSION OF TOOL-PREPARATION TRADITIONS, INDUSTRIES, AND ASSEMBLAGES OF WEST-CENTRAL EUROPE Wavy lines indicate transitions in industrial habits. These transitions are not yet understood in detail. The glacial and climatic scheme shown is the alpine one.] Bone tools have also been found from this period. Some are called scrapers, and there are also long chisel-like leg-bone fragments believed to have been used for skinning animals. Larger hunks of bone, which seem to have served as anvils or chopping blocks, are fairly common. Bits of mineral, used as coloring matter, have also been found. We don�t know what the color was used for. [Illustration: MOUSTERIAN SIDE SCRAPER] There is a small but certain number of cases of intentional burials. These burials have been found on the floors of the caves; in other words, the people dug graves in the places where they lived. The holes made for the graves were small. For this reason (or perhaps for some other?) the bodies were in a curled-up or contracted position. Flint or bone tools or pieces of meat seem to have been put in with some of the bodies. In several cases, flat stones had been laid over the graves. TOOLS FROM AFRICA AND ASIA ABOUT 100,000 YEARS AGO Professor Movius characterizes early prehistoric Africa as a continent showing a variety of stone industries. Some of these industries were purely local developments and some were practically identical with industries found in Europe at the same time. From northwest Africa to Capetown--excepting the tropical rain forest region of the west center--tools of developed Acheulean, Levalloisian, and Mousterian types have been recognized. Often they are named after African place names. In east and south Africa lived people whose industries show a development of the Levalloisian technique. Such industries are called Stillbay. Another industry, developed on the basis of the Acheulean technique, is called Fauresmith. From the northwest comes an industry with tanged points and flake-blades; this is called the Aterian. The tropical rain forest region contained people whose stone tools apparently show adjustment to this peculiar environment; the so-called Sangoan industry includes stone picks, adzes, core-bifaces of specialized Acheulean type, and bifacial points which were probably spearheads. In western Asia, even as far as the east coast of India, the tools of the Eurafrican core-biface and flake tool traditions continued to be used. But in the Far East, as we noted in the last chapter, men had developed characteristic stone chopper and chopping tools. This tool preparation tradition--basically a pebble tool tradition--lasted to the very end of the Ice Age. When more intact open air sites such as that of an earlier time at Olorgesailie, and more stratified cave sites are found and excavated in Asia and Africa, we shall be able to get a more complete picture. So far, our picture of the general cultural level of the Old World at about 100,000 years ago--and soon afterwards--is best from Europe, but it is still far from complete there, too. CULTURE AT THE BEGINNING OF THE LAST GREAT GLACIAL PERIOD The few things we have found must indicate only a very small part of the total activities of the people who lived at the time. All of the things they made of wood and bark, of skins, of anything soft, are gone. The fact that burials were made, at least in Europe and Palestine, is pretty clear proof that the people had some notion of a life after death. But what this notion really was, or what gods (if any) men believed in, we cannot know. Dr. Movius has also reminded me of the so-called bear cults--cases in which caves have been found which contain the skulls of bears in apparently purposeful arrangement. This might suggest some notion of hoarding up the spirits or the strength of bears killed in the hunt. Probably the people lived in small groups, as hunting and food-gathering seldom provide enough food for large groups of people. These groups probably had some kind of leader or �chief.� Very likely the rude beginnings of rules for community life and politics, and even law, were being made. But what these were, we do not know. We can only guess about such things, as we can only guess about many others; for example, how the idea of a family must have been growing, and how there may have been witch doctors who made beginnings in medicine or in art, in the materials they gathered for their trade. The stone tools help us most. They have lasted, and we can find them. As they come to us, from this cave or that, and from this layer or that, the tool industries show a variety of combinations of the different basic habits or traditions of tool preparation. This seems only natural, as the groups of people must have been very small. The mixtures and blendings of the habits used in making stone tools must mean that there were also mixtures and blends in many of the other ideas and beliefs of these small groups. And what this probably means is that there was no one _culture_ of the time. It is certainly unlikely that there were simply three cultures, �Acheulean,� �Levalloisian,� and �Mousterian,� as has been thought in the past. Rather there must have been a great variety of loosely related cultures at about the same stage of advancement. We could say, too, that here we really begin to see, for the first time, that remarkable ability of men to adapt themselves to a variety of conditions. We shall see this adaptive ability even more clearly as time goes on and the record becomes more complete. Over how great an area did these loosely related cultures reach in the time 75,000 to 45,000 or even as late as 35,000 years ago? We have described stone tools made in one or another of the flake and core-biface habits, for an enormous area. It covers all of Europe, all of Africa, the Near East, and parts of India. It is perfectly possible that the flake and core-biface habits lasted on after 35,000 years ago, in some places outside of Europe. In northern Africa, for example, we are certain that they did (see chart, p. 72). On the other hand, in the Far East (China, Burma, Java) and in northern India, the tools of the old chopper-tool tradition were still being made. Out there, we must assume, there was a different set of loosely related cultures. At least, there was a different set of loosely related habits for the making of tools. But the men who made them must have looked much like the men of the West. Their tools were different, but just as useful. As to what the men of the West looked like, I�ve already hinted at all we know so far (pp. 29 ff.). The Neanderthalers were present at the time. Some more modern-like men must have been about, too, since fossils of them have turned up at Mount Carmel in Palestine, and at Teshik Tash, in Trans-caspian Russia. It is still too soon to know whether certain combinations of tools within industries were made only by certain physical types of men. But since tools of both the core-biface and the flake traditions, and their blends, turn up from South Africa to England to India, it is most unlikely that only one type of man used only one particular habit in the preparation of tools. What seems perfectly clear is that men in Africa and men in India were making just as good tools as the men who lived in western Europe. EARLY MODERNS [Illustration] From some time during the first inter-stadial of the last great glaciation (say some time after about 40,000 years ago), we have more accurate dates for the European-Mediterranean area and less accurate ones for the rest of the Old World. This is probably because the effects of the last glaciation have been studied in the European-Mediterranean area more than they have been elsewhere. A NEW TRADITION APPEARS Something new was probably beginning to happen in the European-Mediterranean area about 40,000 years ago, though all the rest of the Old World seems to have been going on as it had been. I can�t be sure of this because the information we are using as a basis for dates is very inaccurate for the areas outside of Europe and the Mediterranean. We can at least make a guess. In Egypt and north Africa, men were still using the old methods of making stone tools. This was especially true of flake tools of the Levalloisian type, save that they were growing smaller and smaller as time went on. But at the same time, a new tradition was becoming popular in westernmost Asia and in Europe. This was the blade-tool tradition. BLADE TOOLS A stone blade is really just a long parallel-sided flake, as the drawing shows. It has sharp cutting edges, and makes a very useful knife. The real trick is to be able to make one. It is almost impossible to make a blade out of any stone but flint or a natural volcanic glass called obsidian. And even if you have flint or obsidian, you first have to work up a special cone-shaped �blade-core,� from which to whack off blades. [Illustration: PLAIN BLADE] You whack with a hammer stone against a bone or antler punch which is directed at the proper place on the blade-core. The blade-core has to be well supported or gripped while this is going on. To get a good flint blade tool takes a great deal of know-how. Remember that a tradition in stone tools means no more than that some particular way of making the tools got started and lasted a long time. Men who made some tools in one tradition or set of habits would also make other tools for different purposes by means of another tradition or set of habits. It was even possible for the two sets of habits to become combined. THE EARLIEST BLADE TOOLS The oldest blade tools we have found were deep down in the layers of the Mount Carmel caves, in Tabun Eb and Ea. Similar tools have been found in equally early cave levels in Syria; their popularity there seems to fluctuate a bit. Some more or less parallel-sided flakes are known in the Levalloisian industry in France, but they are probably no earlier than Tabun E. The Tabun blades are part of a local late �Acheulean� industry, which is characterized by core-biface �hand axes,� but which has many flake tools as well. Professor F. E. Zeuner believes that this industry may be more than 120,000 years old; actually its date has not yet been fixed, but it is very old--older than the fossil finds of modern-like men in the same caves. [Illustration: SUCCESSION OF ICE AGE FLINT TYPES, INDUSTRIES, AND ASSEMBLAGES, AND OF FOSSIL MEN, IN NORTHWESTERN EURAFRASIA] For some reason, the habit of making blades in Palestine and Syria was interrupted. Blades only reappeared there at about the same time they were first made in Europe, some time after 45,000 years ago; that is, after the first phase of the last glaciation was ended. [Illustration: BACKED BLADE] We are not sure just where the earliest _persisting_ habits for the production of blade tools developed. Impressed by the very early momentary appearance of blades at Tabun on Mount Carmel, Professor Dorothy A. Garrod first favored the Near East as a center of origin. She spoke of �some as yet unidentified Asiatic centre,� which she thought might be in the highlands of Iran or just beyond. But more recent work has been done in this area, especially by Professor Coon, and the blade tools do not seem to have an early appearance there. When the blade tools reappear in the Syro-Palestinian area, they do so in industries which also include Levalloiso-Mousterian flake tools. From the point of view of form and workmanship, the blade tools themselves are not so fine as those which seem to be making their appearance in western Europe about the same time. There is a characteristic Syro-Palestinian flake point, possibly a projectile tip, called the Emiran, which is not known from Europe. The appearance of blade tools, together with Levalloiso-Mousterian flakes, continues even after the Emiran point has gone out of use. It seems clear that the production of blade tools did not immediately swamp the set of older habits in Europe, too; the use of flake tools also continued there. This was not so apparent to the older archeologists, whose attention was focused on individual tool types. It is not, in fact, impossible--although it is certainly not proved--that the technique developed in the preparation of the Levalloisian tortoise core (and the striking of the Levalloisian flake from it) might have followed through to the conical core and punch technique for the production of blades. Professor Garrod is much impressed with the speed of change during the later phases of the last glaciation, and its probable consequences. She speaks of �the greater number of industries having enough individual character to be classified as distinct ... since evolution now starts to outstrip diffusion.� Her �evolution� here is of course an industrial evolution rather than a biological one. Certainly the people of Europe had begun to make blade tools during the warm spell after the first phase of the last glaciation. By about 40,000 years ago blades were well established. The bones of the blade tool makers we�ve found so far indicate that anatomically modern men had now certainly appeared. Unfortunately, only a few fossil men have so far been found from the very beginning of the blade tool range in Europe (or elsewhere). What I certainly shall _not_ tell you is that conquering bands of fine, strong, anatomically modern men, armed with superior blade tools, came sweeping out of the East to exterminate the lowly Neanderthalers. Even if we don�t know exactly what happened, I�d lay a good bet it wasn�t that simple. We do know a good deal about different blade industries in Europe. Almost all of them come from cave layers. There is a great deal of complication in what we find. The chart (p. 72) tries to simplify this complication; in fact, it doubtless simplifies it too much. But it may suggest all the complication of industries which is going on at this time. You will note that the upper portion of my much simpler chart (p. 65) covers the same material (in the section marked �Various Blade-Tool Industries�). That chart is certainly too simplified. You will realize that all this complication comes not only from the fact that we are finding more material. It is due also to the increasing ability of men to adapt themselves to a great variety of situations. Their tools indicate this adaptiveness. We know there was a good deal of climatic change at this time. The plants and animals that men used for food were changing, too. The great variety of tools and industries we now find reflect these changes and the ability of men to keep up with the times. Now, for example, is the first time we are sure that there are tools to _make_ other tools. They also show men�s increasing ability to adapt themselves. SPECIAL TYPES OF BLADE TOOLS The most useful tools that appear at this time were made from blades. 1. The �backed� blade. This is a knife made of a flint blade, with one edge purposely blunted, probably to save the user�s fingers from being cut. There are several shapes of backed blades (p. 73). [Illustration: TWO BURINS] 2. The _burin_ or �graver.� The burin was the original chisel. Its cutting edge is _transverse_, like a chisel�s. Some burins are made like a screw-driver, save that burins are sharp. Others have edges more like the blade of a chisel or a push plane, with only one bevel. Burins were probably used to make slots in wood and bone; that is, to make handles or shafts for other tools. They must also be the tools with which much of the engraving on bone (see p. 83) was done. There is a bewildering variety of different kinds of burins. [Illustration: TANGED POINT] 3. The �tanged� point. These stone points were used to tip arrows or light spears. They were made from blades, and they had a long tang at the bottom where they were fixed to the shaft. At the place where the tang met the main body of the stone point, there was a marked �shoulder,� the beginnings of a barb. Such points had either one or two shoulders. [Illustration: NOTCHED BLADE] 4. The �notched� or �strangulated� blade. Along with the points for arrows or light spears must go a tool to prepare the arrow or spear shaft. Today, such a tool would be called a �draw-knife� or a �spoke-shave,� and this is what the notched blades probably are. Our spoke-shaves have sharp straight cutting blades and really �shave.� Notched blades of flint probably scraped rather than cut. 5. The �awl,� �drill,� or �borer.� These blade tools are worked out to a spike-like point. They must have been used for making holes in wood, bone, shell, skin, or other things. [Illustration: DRILL OR AWL] 6. The �end-scraper on a blade� is a tool with one or both ends worked so as to give a good scraping edge. It could have been used to hollow out wood or bone, scrape hides, remove bark from trees, and a number of other things (p. 78). There is one very special type of flint tool, which is best known from western Europe in an industry called the Solutrean. These tools were usually made of blades, but the best examples are so carefully worked on both sides (bifacially) that it is impossible to see the original blade. This tool is 7. The �laurel leaf� point. Some of these tools were long and dagger-like, and must have been used as knives or daggers. Others were small, called �willow leaf,� and must have been mounted on spear or arrow shafts. Another typical Solutrean tool is the �shouldered� point. Both the �laurel leaf� and �shouldered� point types are illustrated (see above and p. 79). [Illustration: END-SCRAPER ON A BLADE] [Illustration: LAUREL LEAF POINT] The industries characterized by tools in the blade tradition also yield some flake and core tools. We will end this list with two types of tools that appear at this time. The first is made of a flake; the second is a core tool. [Illustration: SHOULDERED POINT] 8. The �keel-shaped round scraper� is usually small and quite round, and has had chips removed up to a peak in the center. It is called �keel-shaped� because it is supposed to look (when upside down) like a section through a boat. Actually, it looks more like a tent or an umbrella. Its outer edges are sharp all the way around, and it was probably a general purpose scraping tool (see illustration, p. 81). 9. The �keel-shaped nosed scraper� is a much larger and heavier tool than the round scraper. It was made on a core with a flat bottom, and has one nicely worked end or �nose.� Such tools are usually large enough to be easily grasped, and probably were used like push planes (see illustration, p. 81). [Illustration: KEEL-SHAPED ROUND SCRAPER] [Illustration: KEEL-SHAPED NOSED SCRAPER] The stone tools (usually made of flint) we have just listed are among the most easily recognized blade tools, although they show differences in detail at different times. There are also many other kinds. Not all of these tools appear in any one industry at one time. Thus the different industries shown in the chart (p. 72) each have only some of the blade tools we�ve just listed, and also a few flake tools. Some industries even have a few core tools. The particular types of blade tools appearing in one cave layer or another, and the frequency of appearance of the different types, tell which industry we have in each layer. OTHER KINDS OF TOOLS By this time in Europe--say from about 40,000 to about 10,000 years ago--we begin to find other kinds of material too. Bone tools begin to appear. There are knives, pins, needles with eyes, and little double-pointed straight bars of bone that were probably fish-hooks. The fish-line would have been fastened in the center of the bar; when the fish swallowed the bait, the bar would have caught cross-wise in the fish�s mouth. One quite special kind of bone tool is a long flat point for a light spear. It has a deep notch cut up into the breadth of its base, and is called a �split-based bone point� (p. 82). We know examples of bone beads from these times, and of bone handles for flint tools. Pierced teeth of some animals were worn as beads or pendants, but I am not sure that elks� teeth were worn this early. There are even spool-shaped �buttons� or toggles. [Illustration: SPLIT-BASED BONE POINT] [Illustration: SPEAR-THROWER] [Illustration: BONE HARPOON] Antler came into use for tools, especially in central and western Europe. We do not know the use of one particular antler tool that has a large hole bored in one end. One suggestion is that it was a thong-stropper used to strop or work up hide thongs (see illustration, below); another suggestion is that it was an arrow-shaft straightener. Another interesting tool, usually of antler, is the spear-thrower, which is little more than a stick with a notch or hook on one end. The hook fits into the butt end of the spear, and the length of the spear-thrower allows you to put much more power into the throw (p. 82). It works on pretty much the same principle as the sling. Very fancy harpoons of antler were also made in the latter half of the period in western Europe. These harpoons had barbs on one or both sides and a base which would slip out of the shaft (p. 82). Some have engraved decoration. THE BEGINNING OF ART [Illustration: THONG-STROPPER] In western Europe, at least, the period saw the beginning of several kinds of art work. It is handy to break the art down into two great groups: the movable art, and the cave paintings and sculpture. The movable art group includes the scratchings, engravings, and modeling which decorate tools and weapons. Knives, stroppers, spear-throwers, harpoons, and sometimes just plain fragments of bone or antler are often carved. There is also a group of large flat pebbles which seem almost to have served as sketch blocks. The surfaces of these various objects may show animals, or rather abstract floral designs, or geometric designs. [Illustration: �VENUS� FIGURINE FROM WILLENDORF] Some of the movable art is not done on tools. The most remarkable examples of this class are little figures of women. These women seem to be pregnant, and their most female characteristics are much emphasized. It is thought that these �Venus� or �Mother-goddess� figurines may be meant to show the great forces of nature--fertility and the birth of life. CAVE PAINTINGS In the paintings on walls and ceilings of caves we have some examples that compare with the best art of any time. The subjects were usually animals, the great cold-weather beasts of the end of the Ice Age: the mammoth, the wooly rhinoceros, the bison, the reindeer, the wild horse, the bear, the wild boar, and wild cattle. As in the movable art, there are different styles in the cave art. The really great cave art is pretty well restricted to southern France and Cantabrian (northwestern) Spain. There are several interesting things about the �Franco-Cantabrian� cave art. It was done deep down in the darkest and most dangerous parts of the caves, although the men lived only in the openings of caves. If you think what they must have had for lights--crude lamps of hollowed stone have been found, which must have burned some kind of oil or grease, with a matted hair or fiber wick--and of the animals that may have lurked in the caves, you�ll understand the part about danger. Then, too, we�re sure the pictures these people painted were not simply to be looked at and admired, for they painted one picture right over other pictures which had been done earlier. Clearly, it was the _act_ of _painting_ that counted. The painter had to go way down into the most mysterious depths of the earth and create an animal in paint. Possibly he believed that by doing this he gained some sort of magic power over the same kind of animal when he hunted it in the open air. It certainly doesn�t look as if he cared very much about the picture he painted--as a finished product to be admired--for he or somebody else soon went down and painted another animal right over the one he had done. The cave art of the Franco-Cantabrian style is one of the great artistic achievements of all time. The subjects drawn are almost always the larger animals of the time: the bison, wild cattle and horses, the wooly rhinoceros, the mammoth, the wild boar, and the bear. In some of the best examples, the beasts are drawn in full color and the paintings are remarkably alive and charged with energy. They come from the hands of men who knew the great animals well--knew the feel of their fur, the tremendous drive of their muscles, and the danger one faced when he hunted them. Another artistic style has been found in eastern Spain. It includes lively drawings, often of people hunting with bow and arrow. The East Spanish art is found on open rock faces and in rock-shelters. It is less spectacular and apparently more recent than the Franco-Cantabrian cave art. LIFE AT THE END OF THE ICE AGE IN EUROPE Life in these times was probably as good as a hunter could expect it to be. Game and fish seem to have been plentiful; berries and wild fruits probably were, too. From France to Russia, great pits or piles of animal bones have been found. Some of this killing was done as our Plains Indians killed the buffalo--by stampeding them over steep river banks or cliffs. There were also good tools for hunting, however. In western Europe, people lived in the openings of caves and under overhanging rocks. On the great plains of eastern Europe, very crude huts were being built, half underground. The first part of this time must have been cold, for it was the middle and end phases of the last great glaciation. Northern Europe from Scotland to Scandinavia, northern Germany and Russia, and also the higher mountains to the south, were certainly covered with ice. But people had fire, and the needles and tools that were used for scraping hides must mean that they wore clothing. It is clear that men were thinking of a great variety of things beside the tools that helped them get food and shelter. Such burials as we find have more grave-gifts than before. Beads and ornaments and often flint, bone, or antler tools are included in the grave, and sometimes the body is sprinkled with red ochre. Red is the color of blood, which means life, and of fire, which means heat. Professor Childe wonders if the red ochre was a pathetic attempt at magic--to give back to the body the heat that had gone from it. But pathetic or not, it is sure proof that these people were already moved by death as men still are moved by it. Their art is another example of the direction the human mind was taking. And when I say human, I mean it in the fullest sense, for this is the time in which fully modern man has appeared. On page 34, we spoke of the Cro-Magnon group and of the Combe Capelle-Br�nn group of Caucasoids and of the Grimaldi �Negroids,� who are no longer believed to be Negroid. I doubt that any one of these groups produced most of the achievements of the times. It�s not yet absolutely sure which particular group produced the great cave art. The artists were almost certainly a blend of several (no doubt already mixed) groups. The pair of Grimaldians were buried in a grave with a sprinkling of red ochre, and were provided with shell beads and ornaments and with some blade tools of flint. Regardless of the different names once given them by the human paleontologists, each of these groups seems to have shared equally in the cultural achievements of the times, for all that the archeologists can say. MICROLITHS One peculiar set of tools seems to serve as a marker for the very last phase of the Ice Age in southwestern Europe. This tool-making habit is also found about the shore of the Mediterranean basin, and it moved into northern Europe as the last glaciation pulled northward. People began making blade tools of very small size. They learned how to chip very slender and tiny blades from a prepared core. Then they made these little blades into tiny triangles, half-moons (�lunates�), trapezoids, and several other geometric forms. These little tools are called �microliths.� They are so small that most of them must have been fixed in handles or shafts. [Illustration: MICROLITHS BLADE FRAGMENT BURIN LUNATE TRAPEZOID SCALENE TRIANGLE ARROWHEAD] We have found several examples of microliths mounted in shafts. In northern Europe, where their use soon spread, the microlithic triangles or lunates were set in rows down each side of a bone or wood point. One corner of each little triangle stuck out, and the whole thing made a fine barbed harpoon. In historic times in Egypt, geometric trapezoidal microliths were still in use as arrowheads. They were fastened--broad end out--on the end of an arrow shaft. It seems queer to give an arrow a point shaped like a �T.� Actually, the little points were very sharp, and must have pierced the hides of animals very easily. We also think that the broader cutting edge of the point may have caused more bleeding than a pointed arrowhead would. In hunting fleet-footed animals like the gazelle, which might run for miles after being shot with an arrow, it was an advantage to cause as much bleeding as possible, for the animal would drop sooner. We are not really sure where the microliths were first invented. There is some evidence that they appear early in the Near East. Their use was very common in northwest Africa but this came later. The microlith makers who reached south Russia and central Europe possibly moved up out of the Near East. Or it may have been the other way around; we simply don�t yet know. Remember that the microliths we are talking about here were made from carefully prepared little blades, and are often geometric in outline. Each microlithic industry proper was made up, in good part, of such tiny blade tools. But there were also some normal-sized blade tools and even some flake scrapers, in most microlithic industries. I emphasize this bladelet and the geometric character of the microlithic industries of the western Old World, since there has sometimes been confusion in the matter. Sometimes small flake chips, utilized as minute pointed tools, have been called �microliths.� They may be _microlithic_ in size in terms of the general meaning of the word, but they do not seem to belong to the sub-tradition of the blade tool preparation habits which we have been discussing here. LATER BLADE-TOOL INDUSTRIES OF THE NEAR EAST AND AFRICA The blade-tool industries of normal size we talked about earlier spread from Europe to central Siberia. We noted that blade tools were made in western Asia too, and early, although Professor Garrod is no longer sure that the whole tradition originated in the Near East. If you look again at my chart (p. 72) you will note that in western Asia I list some of the names of the western European industries, but with the qualification �-like� (for example, �Gravettian-like�). The western Asiatic blade-tool industries do vaguely recall some aspects of those of western Europe, but we would probably be better off if we used completely local names for them. The �Emiran� of my chart is such an example; its industry includes a long spike-like blade point which has no western European counterpart. When we last spoke of Africa (p. 66), I told you that stone tools there were continuing in the Levalloisian flake tradition, and were becoming smaller. At some time during this process, two new tool types appeared in northern Africa: one was the Aterian point with a tang (p. 67), and the other was a sort of �laurel leaf� point, called the �Sbaikian.� These two tool types were both produced from flakes. The Sbaikian points, especially, are roughly similar to some of the Solutrean points of Europe. It has been suggested that both the Sbaikian and Aterian points may be seen on their way to France through their appearance in the Spanish cave deposits of Parpallo, but there is also a rival �pre-Solutrean� in central Europe. We still do not know whether there was any contact between the makers of these north African tools and the Solutrean tool-makers. What does seem clear is that the blade-tool tradition itself arrived late in northern Africa. NETHER AFRICA Blade tools and �laurel leaf� points and some other probably late stone tool types also appear in central and southern Africa. There are geometric microliths on bladelets and even some coarse pottery in east Africa. There is as yet no good way of telling just where these items belong in time; in broad geological terms they are �late.� Some people have guessed that they are as early as similar European and Near Eastern examples, but I doubt it. The makers of small-sized Levalloisian flake tools occupied much of Africa until very late in time. THE FAR EAST India and the Far East still seem to be going their own way. In India, some blade tools have been found. These are not well dated, save that we believe they must be post-Pleistocene. In the Far East it looks as if the old chopper-tool tradition was still continuing. For Burma, Dr. Movius feels this is fairly certain; for China he feels even more certain. Actually, we know very little about the Far East at about the time of the last glaciation. This is a shame, too, as you will soon agree. THE NEW WORLD BECOMES INHABITED At some time toward the end of the last great glaciation--almost certainly after 20,000 years ago--people began to move over Bering Strait, from Asia into America. As you know, the American Indians have been assumed to be basically Mongoloids. New studies of blood group types make this somewhat uncertain, but there is no doubt that the ancestors of the American Indians came from Asia. The stone-tool traditions of Europe, Africa, the Near and Middle East, and central Siberia, did _not_ move into the New World. With only a very few special or late exceptions, there are _no_ core-bifaces, flakes, or blade tools of the Old World. Such things just haven�t been found here. This is why I say it�s a shame we don�t know more of the end of the chopper-tool tradition in the Far East. According to Weidenreich, the Mongoloids were in the Far East long before the end of the last glaciation. If the genetics of the blood group types do demand a non-Mongoloid ancestry for the American Indians, who else may have been in the Far East 25,000 years ago? We know a little about the habits for making stone tools which these first people brought with them, and these habits don�t conform with those of the western Old World. We�d better keep our eyes open for whatever happened to the end of the chopper-tool tradition in northern China; already there are hints that it lasted late there. Also we should watch future excavations in eastern Siberia. Perhaps we shall find the chopper-tool tradition spreading up that far. THE NEW ERA Perhaps it comes in part from the way I read the evidence and perhaps in part it is only intuition, but I feel that the materials of this chapter suggest a new era in the ways of life. Before about 40,000 years ago, people simply �gathered� their food, wandering over large areas to scavenge or to hunt in a simple sort of way. But here we have seen them �settling-in� more, perhaps restricting themselves in their wanderings and adapting themselves to a given locality in more intensive ways. This intensification might be suggested by the word �collecting.� The ways of life we described in the earlier chapters were �food-gathering� ways, but now an era of �food-collecting� has begun. We shall see further intensifications of it in the next chapter. End and PRELUDE [Illustration] Up to the end of the last glaciation, we prehistorians have a relatively comfortable time schedule. The farther back we go the less exact we can be about time and details. Elbow-room of five, ten, even fifty or more thousands of years becomes available for us to maneuver in as we work backward in time. But now our story has come forward to the point where more exact methods of dating are at hand. The radioactive carbon method reaches back into the span of the last glaciation. There are other methods, developed by the geologists and paleobotanists, which supplement and extend the usefulness of the radioactive carbon dates. And, happily, as our means of being more exact increases, our story grows more exciting. There are also more details of culture for us to deal with, which add to the interest. CHANGES AT THE END OF THE ICE AGE The last great glaciation of the Ice Age was a two-part affair, with a sub-phase at the end of the second part. In Europe the last sub-phase of this glaciation commenced somewhere around 15,000 years ago. Then the glaciers began to melt back, for the last time. Remember that Professor Antevs (p. 19) isn�t sure the Ice Age is over yet! This melting sometimes went by fits and starts, and the weather wasn�t always changing for the better; but there was at least one time when European weather was even better than it is now. The melting back of the glaciers and the weather fluctuations caused other changes, too. We know a fair amount about these changes in Europe. In an earlier chapter, we said that the whole Ice Age was a matter of continual change over long periods of time. As the last glaciers began to melt back some interesting things happened to mankind. In Europe, along with the melting of the last glaciers, geography itself was changing. Britain and Ireland had certainly become islands by 5000 B.C. The Baltic was sometimes a salt sea, sometimes a large fresh-water lake. Forests began to grow where the glaciers had been, and in what had once been the cold tundra areas in front of the glaciers. The great cold-weather animals--the mammoth and the wooly rhinoceros--retreated northward and finally died out. It is probable that the efficient hunting of the earlier people of 20,000 or 25,000 to about 12,000 years ago had helped this process along (see p. 86). Europeans, especially those of the post-glacial period, had to keep changing to keep up with the times. The archeological materials for the time from 10,000 to 6000 B.C. seem simpler than those of the previous five thousand years. The great cave art of France and Spain had gone; so had the fine carving in bone and antler. Smaller, speedier animals were moving into the new forests. New ways of hunting them, or ways of getting other food, had to be found. Hence, new tools and weapons were necessary. Some of the people who moved into northern Germany were successful reindeer hunters. Then the reindeer moved off to the north, and again new sources of food had to be found. THE READJUSTMENTS COMPLETED IN EUROPE After a few thousand years, things began to look better. Or at least we can say this: By about 6000 B.C. we again get hotter archeological materials. The best of these come from the north European area: Britain, Belgium, Holland, Denmark, north Germany, southern Norway and Sweden. Much of this north European material comes from bogs and swamps where it had become water-logged and has kept very well. Thus we have much more complete _assemblages_[4] than for any time earlier. [4] �Assemblage� is a useful word when there are different kinds of archeological materials belonging together, from one area and of one time. An assemblage is made up of a number of �industries� (that is, all the tools in chipped stone, all the tools in bone, all the tools in wood, the traces of houses, etc.) and everything else that manages to survive, such as the art, the burials, the bones of the animals used as food, and the traces of plant foods; in fact, everything that has been left to us and can be used to help reconstruct the lives of the people to whom it once belonged. Our own present-day �assemblage� would be the sum total of all the objects in our mail-order catalogues, department stores and supply houses of every sort, our churches, our art galleries and other buildings, together with our roads, canals, dams, irrigation ditches, and any other traces we might leave of ourselves, from graves to garbage dumps. Not everything would last, so that an archeologist digging us up--say 2,000 years from now--would find only the most durable items in our assemblage. The best known of these assemblages is the _Maglemosian_, named after a great Danish peat-swamp where much has been found. [Illustration: SKETCH OF MAGLEMOSIAN ASSEMBLAGE CHIPPED STONE HEMP GROUND STONE BONE AND ANTLER WOOD] In the Maglemosian assemblage the flint industry was still very important. Blade tools, tanged arrow points, and burins were still made, but there were also axes for cutting the trees in the new forests. Moreover, the tiny microlithic blades, in a variety of geometric forms, are also found. Thus, a specialized tradition that possibly began east of the Mediterranean had reached northern Europe. There was also a ground stone industry; some axes and club-heads were made by grinding and polishing rather than by chipping. The industries in bone and antler show a great variety of tools: axes, fish-hooks, fish spears, handles and hafts for other tools, harpoons, and clubs. A remarkable industry in wood has been preserved. Paddles, sled runners, handles for tools, and bark floats for fish-nets have been found. There are even fish-nets made of plant fibers. Canoes of some kind were no doubt made. Bone and antler tools were decorated with simple patterns, and amber was collected. Wooden bows and arrows are found. It seems likely that the Maglemosian bog finds are remains of summer camps, and that in winter the people moved to higher and drier regions. Childe calls them the �Forest folk�; they probably lived much the same sort of life as did our pre-agricultural Indians of the north central states. They hunted small game or deer; they did a great deal of fishing; they collected what plant food they could find. In fact, their assemblage shows us again that remarkable ability of men to adapt themselves to change. They had succeeded in domesticating the dog; he was still a very wolf-like dog, but his long association with mankind had now begun. Professor Coon believes that these people were direct descendants of the men of the glacial age and that they had much the same appearance. He believes that most of the Ice Age survivors still extant are living today in the northwestern European area. SOUTH AND CENTRAL EUROPE PERHAPS AS READJUSTED AS THE NORTH There is always one trouble with things that come from areas where preservation is exceptionally good: The very quantity of materials in such an assemblage tends to make things from other areas look poor and simple, although they may not have been so originally at all. The assemblages of the people who lived to the south of the Maglemosian area may also have been quite large and varied; but, unfortunately, relatively little of the southern assemblages has lasted. The water-logged sites of the Maglemosian area preserved a great deal more. Hence the Maglemosian itself _looks_ quite advanced to us, when we compare it with the few things that have happened to last in other areas. If we could go back and wander over the Europe of eight thousand years ago, we would probably find that the peoples of France, central Europe, and south central Russia were just as advanced as those of the north European-Baltic belt. South of the north European belt the hunting-food-collecting peoples were living on as best they could during this time. One interesting group, which seems to have kept to the regions of sandy soil and scrub forest, made great quantities of geometric microliths. These are the materials called _Tardenoisian_. The materials of the �Forest folk� of France and central Europe generally are called _Azilian_; Dr. Movius believes the term might best be restricted to the area south of the Loire River. HOW MUCH REAL CHANGE WAS THERE? You can see that no really _basic_ change in the way of life has yet been described. Childe sees the problem that faced the Europeans of 10,000 to 3000 B.C. as a problem in readaptation to the post-glacial forest environment. By 6000 B.C. some quite successful solutions of the problem--like the Maglemosian--had been made. The upsets that came with the melting of the last ice gradually brought about all sorts of changes in the tools and food-getting habits, but the people themselves were still just as much simple hunters, fishers, and food-collectors as they had been in 25,000 B.C. It could be said that they changed just enough so that they would not have to change. But there is a bit more to it than this. Professor Mathiassen of Copenhagen, who knows the archeological remains of this time very well, poses a question. He speaks of the material as being neither rich nor progressive, in fact �rather stagnant,� but he goes on to add that the people had a certain �receptiveness� and were able to adapt themselves quickly when the next change did come. My own understanding of the situation is that the �Forest folk� made nothing as spectacular as had the producers of the earlier Magdalenian assemblage and the Franco-Cantabrian art. On the other hand, they _seem_ to have been making many more different kinds of tools for many more different kinds of tasks than had their Ice Age forerunners. I emphasize �seem� because the preservation in the Maglemosian bogs is very complete; certainly we cannot list anywhere near as many different things for earlier times as we did for the Maglemosians (p. 94). I believe this experimentation with all kinds of new tools and gadgets, this intensification of adaptiveness (p. 91), this �receptiveness,� even if it is still only pointed toward hunting, fishing, and food-collecting, is an important thing. Remember that the only marker we have handy for the _beginning_ of this tendency toward �receptiveness� and experimentation is the little microlithic blade tools of various geometric forms. These, we saw, began before the last ice had melted away, and they lasted on in use for a very long time. I wish there were a better marker than the microliths but I do not know of one. Remember, too, that as yet we can only use the microliths as a marker in Europe and about the Mediterranean. CHANGES IN OTHER AREAS? All this last section was about Europe. How about the rest of the world when the last glaciers were melting away? We simply don�t know much about this particular time in other parts of the world except in Europe, the Mediterranean basin and the Middle East. People were certainly continuing to move into the New World by way of Siberia and the Bering Strait about this time. But for the greater part of Africa and Asia, we do not know exactly what was happening. Some day, we shall no doubt find out; today we are without clear information. REAL CHANGE AND PRELUDE IN THE NEAR EAST The appearance of the microliths and the developments made by the �Forest folk� of northwestern Europe also mark an end. They show us the terminal phase of the old food-collecting way of life. It grows increasingly clear that at about the same time that the Maglemosian and other �Forest folk� were adapting themselves to hunting, fishing, and collecting in new ways to fit the post-glacial environment, something completely new was being made ready in western Asia. Unfortunately, we do not have as much understanding of the climate and environment of the late Ice Age in western Asia as we have for most of Europe. Probably the weather was never so violent or life quite so rugged as it was in northern Europe. We know that the microliths made their appearance in western Asia at least by 10,000 B.C. and possibly earlier, marking the beginning of the terminal phase of food-collecting. Then, gradually, we begin to see the build-up towards the first _basic change_ in human life. This change amounted to a revolution just as important as the Industrial Revolution. In it, men first learned to domesticate plants and animals. They began _producing_ their food instead of simply gathering or collecting it. When their food-production became reasonably effective, people could and did settle down in village-farming communities. With the appearance of the little farming villages, a new way of life was actually under way. Professor Childe has good reason to speak of the �food-producing revolution,� for it was indeed a revolution. QUESTIONS ABOUT CAUSE We do not yet know _how_ and _why_ this great revolution took place. We are only just beginning to put the questions properly. I suspect the answers will concern some delicate and subtle interplay between man and nature. Clearly, both the level of culture and the natural condition of the environment must have been ready for the great change, before the change itself could come about. It is going to take years of co-operative field work by both archeologists and the natural scientists who are most helpful to them before the _how_ and _why_ answers begin to appear. Anthropologically trained archeologists are fascinated with the cultures of men in times of great change. About ten or twelve thousand years ago, the general level of culture in many parts of the world seems to have been ready for change. In northwestern Europe, we saw that cultures �changed just enough so that they would not have to change.� We linked this to environmental changes with the coming of post-glacial times. In western Asia, we archeologists can prove that the food-producing revolution actually took place. We can see _the_ important consequence of effective domestication of plants and animals in the appearance of the settled village-farming community. And within the village-farming community was the seed of civilization. The way in which effective domestication of plants and animals came about, however, must also be linked closely with the natural environment. Thus the archeologists will not solve the _how_ and _why_ questions alone--they will need the help of interested natural scientists in the field itself. PRECONDITIONS FOR THE REVOLUTION Especially at this point in our story, we must remember how culture and environment go hand in hand. Neither plants nor animals domesticate themselves; men domesticate them. Furthermore, men usually domesticate only those plants and animals which are useful. There is a good question here: What is cultural usefulness? But I shall side-step it to save time. Men cannot domesticate plants and animals that do not exist in the environment where the men live. Also, there are certainly some animals and probably some plants that resist domestication, although they might be useful. This brings me back again to the point that _both_ the level of culture and the natural condition of the environment--with the proper plants and animals in it--must have been ready before domestication could have happened. But this is precondition, not cause. Why did effective food-production happen first in the Near East? Why did it happen independently in the New World slightly later? Why also in the Far East? Why did it happen at all? Why are all human beings not still living as the Maglemosians did? These are the questions we still have to face. CULTURAL �RECEPTIVENESS� AND PROMISING ENVIRONMENTS Until the archeologists and the natural scientists--botanists, geologists, zoologists, and general ecologists--have spent many more years on the problem, we shall not have full _how_ and _why_ answers. I do think, however, that we are beginning to understand what to look for. We shall have to learn much more of what makes the cultures of men �receptive� and experimental. Did change in the environment alone force it? Was it simply a case of Professor Toynbee�s �challenge and response?� I cannot believe the answer is quite that simple. Were it so simple, we should want to know why the change hadn�t come earlier, along with earlier environmental changes. We shall not know the answer, however, until we have excavated the traces of many more cultures of the time in question. We shall doubtless also have to learn more about, and think imaginatively about, the simpler cultures still left today. The �mechanics� of culture in general will be bound to interest us. It will also be necessary to learn much more of the environments of 10,000 to 12,000 years ago. In which regions of the world were the natural conditions most promising? Did this promise include plants and animals which could be domesticated, or did it only offer new ways of food-collecting? There is much work to do on this problem, but we are beginning to get some general hints. Before I begin to detail the hints we now have from western Asia, I want to do two things. First, I shall tell you of an old theory as to how food-production might have appeared. Second, I will bother you with some definitions which should help us in our thinking as the story goes on. AN OLD THEORY AS TO THE CAUSE OF THE REVOLUTION The idea that change would result, if the balance between nature and culture became upset, is of course not a new one. For at least twenty-five years, there has been a general theory as to _how_ the food-producing revolution happened. This theory depends directly on the idea of natural change in the environment. The five thousand years following about 10,000 B.C. must have been very difficult ones, the theory begins. These were the years when the most marked melting of the last glaciers was going on. While the glaciers were in place, the climate to the south of them must have been different from the climate in those areas today. You have no doubt read that people once lived in regions now covered by the Sahara Desert. This is true; just when is not entirely clear. The theory is that during the time of the glaciers, there was a broad belt of rain winds south of the glaciers. These rain winds would have kept north Africa, the Nile Valley, and the Middle East green and fertile. But when the glaciers melted back to the north, the belt of rain winds is supposed to have moved north too. Then the people living south and east of the Mediterranean would have found that their water supply was drying up, that the animals they hunted were dying or moving away, and that the plant foods they collected were dried up and scarce. According to the theory, all this would have been true except in the valleys of rivers and in oases in the growing deserts. Here, in the only places where water was left, the men and animals and plants would have clustered. They would have been forced to live close to one another, in order to live at all. Presently the men would have seen that some animals were more useful or made better food than others, and so they would have begun to protect these animals from their natural enemies. The men would also have been forced to try new plant foods--foods which possibly had to be prepared before they could be eaten. Thus, with trials and errors, but by being forced to live close to plants and animals, men would have learned to domesticate them. THE OLD THEORY TOO SIMPLE FOR THE FACTS This theory was set up before we really knew anything in detail about the later prehistory of the Near and Middle East. We now know that the facts which have been found don�t fit the old theory at all well. Also, I have yet to find an American meteorologist who feels that we know enough about the changes in the weather pattern to say that it can have been so simple and direct. And, of course, the glacial ice which began melting after 12,000 years ago was merely the last sub-phase of the last great glaciation. There had also been three earlier periods of great alpine glaciers, and long periods of warm weather in between. If the rain belt moved north as the glaciers melted for the last time, it must have moved in the same direction in earlier times. Thus, the forced neighborliness of men, plants, and animals in river valleys and oases must also have happened earlier. Why didn�t domestication happen earlier, then? Furthermore, it does not seem to be in the oases and river valleys that we have our first or only traces of either food-production or the earliest farming villages. These traces are also in the hill-flanks of the mountains of western Asia. Our earliest sites of the village-farmers do not seem to indicate a greatly different climate from that which the same region now shows. In fact, everything we now know suggests that the old theory was just too simple an explanation to have been the true one. The only reason I mention it--beyond correcting the ideas you may get in the general texts--is that it illustrates the kind of thinking we shall have to do, even if it is doubtless wrong in detail. We archeologists shall have to depend much more than we ever have on the natural scientists who can really help us. I can tell you this from experience. I had the great good fortune to have on my expedition staff in Iraq in 1954-55, a geologist, a botanist, and a zoologist. Their studies added whole new bands of color to my spectrum of thinking about _how_ and _why_ the revolution took place and how the village-farming community began. But it was only a beginning; as I said earlier, we are just now learning to ask the proper questions. ABOUT STAGES AND ERAS Now come some definitions, so I may describe my material more easily. Archeologists have always loved to make divisions and subdivisions within the long range of materials which they have found. They often disagree violently about which particular assemblage of material goes into which subdivision, about what the subdivisions should be named, about what the subdivisions really mean culturally. Some archeologists, probably through habit, favor an old scheme of Grecized names for the subdivisions: paleolithic, mesolithic, neolithic. I refuse to use these words myself. They have meant too many different things to too many different people and have tended to hide some pretty fuzzy thinking. Probably you haven�t even noticed my own scheme of subdivision up to now, but I�d better tell you in general what it is. I think of the earliest great group of archeological materials, from which we can deduce only a food-gathering way of culture, as the _food-gathering stage_. I say �stage� rather than �age,� because it is not quite over yet; there are still a few primitive people in out-of-the-way parts of the world who remain in the _food-gathering stage_. In fact, Professor Julian Steward would probably prefer to call it a food-gathering _level_ of existence, rather than a stage. This would be perfectly acceptable to me. I also tend to find myself using _collecting_, rather than _gathering_, for the more recent aspects or era of the stage, as the word �collecting� appears to have more sense of purposefulness and specialization than does �gathering� (see p. 91). Now, while I think we could make several possible subdivisions of the food-gathering stage--I call my subdivisions of stages _eras_[5]--I believe the only one which means much to us here is the last or _terminal sub-era of food-collecting_ of the whole food-gathering stage. The microliths seem to mark its approach in the northwestern part of the Old World. It is really shown best in the Old World by the materials of the �Forest folk,� the cultural adaptation to the post-glacial environment in northwestern Europe. We talked about the �Forest folk� at the beginning of this chapter, and I used the Maglemosian assemblage of Denmark as an example. [5] It is difficult to find words which have a sequence or gradation of meaning with respect to both development and a range of time in the past, or with a range of time from somewhere in the past which is perhaps not yet ended. One standard Webster definition of _stage_ is: �One of the steps into which the material development of man ... is divided.� I cannot find any dictionary definition that suggests which of the words, _stage_ or _era_, has the meaning of a longer span of time. Therefore, I have chosen to let my eras be shorter, and to subdivide my stages into eras. Webster gives _era_ as: �A signal stage of history, an epoch.� When I want to subdivide my eras, I find myself using _sub-eras_. Thus I speak of the _eras_ within a _stage_ and of the _sub-eras_ within an _era_; that is, I do so when I feel that I really have to, and when the evidence is clear enough to allow it. The food-producing revolution ushers in the _food-producing stage_. This stage began to be replaced by the _industrial stage_ only about two hundred years ago. Now notice that my stage divisions are in terms of technology and economics. We must think sharply to be sure that the subdivisions of the stages, the eras, are in the same terms. This does not mean that I think technology and economics are the only important realms of culture. It is rather that for most of prehistoric time the materials left to the archeologists tend to limit our deductions to technology and economics. I�m so soon out of my competence, as conventional ancient history begins, that I shall only suggest the earlier eras of the food-producing stage to you. This book is about prehistory, and I�m not a universal historian. THE TWO EARLIEST ERAS OF THE FOOD-PRODUCING STAGE The food-producing stage seems to appear in western Asia with really revolutionary suddenness. It is seen by the relative speed with which the traces of new crafts appear in the earliest village-farming community sites we�ve dug. It is seen by the spread and multiplication of these sites themselves, and the remarkable growth in human population we deduce from this increase in sites. We�ll look at some of these sites and the archeological traces they yield in the next chapter. When such village sites begin to appear, I believe we are in the _era of the primary village-farming community_. I also believe this is the second era of the food-producing stage. The first era of the food-producing stage, I believe, was an _era of incipient cultivation and animal domestication_. I keep saying �I believe� because the actual evidence for this earlier era is so slight that one has to set it up mainly by playing a hunch for it. The reason for playing the hunch goes about as follows. One thing we seem to be able to see, in the food-collecting era in general, is a tendency for people to begin to settle down. This settling down seemed to become further intensified in the terminal era. How this is connected with Professor Mathiassen�s �receptiveness� and the tendency to be experimental, we do not exactly know. The evidence from the New World comes into play here as well as that from the Old World. With this settling down in one place, the people of the terminal era--especially the �Forest folk� whom we know best--began making a great variety of new things. I remarked about this earlier in the chapter. Dr. Robert M. Adams is of the opinion that this atmosphere of experimentation with new tools--with new ways of collecting food--is the kind of atmosphere in which one might expect trials at planting and at animal domestication to have been made. We first begin to find traces of more permanent life in outdoor camp sites, although caves were still inhabited at the beginning of the terminal era. It is not surprising at all that the �Forest folk� had already domesticated the dog. In this sense, the whole era of food-collecting was becoming ready and almost �incipient� for cultivation and animal domestication. Northwestern Europe was not the place for really effective beginnings in agriculture and animal domestication. These would have had to take place in one of those natural environments of promise, where a variety of plants and animals, each possible of domestication, was available in the wild state. Let me spell this out. Really effective food-production must include a variety of items to make up a reasonably well-rounded diet. The food-supply so produced must be trustworthy, even though the food-producing peoples themselves might be happy to supplement it with fish and wild strawberries, just as we do when such things are available. So, as we said earlier, part of our problem is that of finding a region with a natural environment which includes--and did include, some ten thousand years ago--a variety of possibly domesticable wild plants and animals. NUCLEAR AREAS Now comes the last of my definitions. A region with a natural environment which included a variety of wild plants and animals, both possible and ready for domestication, would be a central or core or _nuclear area_, that is, it would be when and _if_ food-production took place within it. It is pretty hard for me to imagine food-production having ever made an independent start outside such a nuclear area, although there may be some possible nuclear areas in which food-production never took place (possibly in parts of Africa, for example). We know of several such nuclear areas. In the New World, Middle America and the Andean highlands make up one or two; it is my understanding that the evidence is not yet clear as to which. There seems to have been a nuclear area somewhere in southeastern Asia, in the Malay peninsula or Burma perhaps, connected with the early cultivation of taro, breadfruit, the banana and the mango. Possibly the cultivation of rice and the domestication of the chicken and of zebu cattle and the water buffalo belong to this southeast Asiatic nuclear area. We know relatively little about it archeologically, as yet. The nuclear area which was the scene of the earliest experiment in effective food-production was in western Asia. Since I know it best, I shall use it as my example. THE NUCLEAR NEAR EAST The nuclear area of western Asia is naturally the one of greatest interest to people of the western cultural tradition. Our cultural heritage began within it. The area itself is the region of the hilly flanks of rain-watered grass-land which build up to the high mountain ridges of Iran, Iraq, Turkey, Syria, and Palestine. The map on page 125 indicates the region. If you have a good atlas, try to locate the zone which surrounds the drainage basin of the Tigris and Euphrates Rivers at elevations of from approximately 2,000 to 5,000 feet. The lower alluvial land of the Tigris-Euphrates basin itself has very little rainfall. Some years ago Professor James Henry Breasted called the alluvial lands of the Tigris-Euphrates a part of the �fertile crescent.� These alluvial lands are very fertile if irrigated. Breasted was most interested in the oriental civilizations of conventional ancient history, and irrigation had been discovered before they appeared. The country of hilly flanks above Breasted�s crescent receives from 10 to 20 or more inches of winter rainfall each year, which is about what Kansas has. Above the hilly-flanks zone tower the peaks and ridges of the Lebanon-Amanus chain bordering the coast-line from Palestine to Turkey, the Taurus Mountains of southern Turkey, and the Zagros range of the Iraq-Iran borderland. This rugged mountain frame for our hilly-flanks zone rises to some magnificent alpine scenery, with peaks of from ten to fifteen thousand feet in elevation. There are several gaps in the Mediterranean coastal portion of the frame, through which the winter�s rain-bearing winds from the sea may break so as to carry rain to the foothills of the Taurus and the Zagros. The picture I hope you will have from this description is that of an intermediate hilly-flanks zone lying between two regions of extremes. The lower Tigris-Euphrates basin land is low and far too dry and hot for agriculture based on rainfall alone; to the south and southwest, it merges directly into the great desert of Arabia. The mountains which lie above the hilly-flanks zone are much too high and rugged to have encouraged farmers. THE NATURAL ENVIRONMENT OF THE NUCLEAR NEAR EAST The more we learn of this hilly-flanks zone that I describe, the more it seems surely to have been a nuclear area. This is where we archeologists need, and are beginning to get, the help of natural scientists. They are coming to the conclusion that the natural environment of the hilly-flanks zone today is much as it was some eight to ten thousand years ago. There are still two kinds of wild wheat and a wild barley, and the wild sheep, goat, and pig. We have discovered traces of each of these at about nine thousand years ago, also traces of wild ox, horse, and dog, each of which appears to be the probable ancestor of the domesticated form. In fact, at about nine thousand years ago, the two wheats, the barley, and at least the goat, were already well on the road to domestication. The wild wheats give us an interesting clue. They are only available together with the wild barley within the hilly-flanks zone. While the wild barley grows in a variety of elevations and beyond the zone, at least one of the wild wheats does not seem to grow below the hill country. As things look at the moment, the domestication of both the wheats together could _only_ have taken place within the hilly-flanks zone. Barley seems to have first come into cultivation due to its presence as a weed in already cultivated wheat fields. There is also a suggestion--there is still much more to learn in the matter--that the animals which were first domesticated were most at home up in the hilly-flanks zone in their wild state. With a single exception--that of the dog--the earliest positive evidence of domestication includes the two forms of wheat, the barley, and the goat. The evidence comes from within the hilly-flanks zone. However, it comes from a settled village proper, Jarmo (which I�ll describe in the next chapter), and is thus from the era of the primary village-farming community. We are still without positive evidence of domesticated grain and animals in the first era of the food-producing stage, that of incipient cultivation and animal domestication. THE ERA OF INCIPIENT CULTIVATION AND ANIMAL DOMESTICATION I said above (p. 105) that my era of incipient cultivation and animal domestication is mainly set up by playing a hunch. Although we cannot really demonstrate it--and certainly not in the Near East--it would be very strange for food-collectors not to have known a great deal about the plants and animals most useful to them. They do seem to have domesticated the dog. We can easily imagine them remembering to go back, season after season, to a particular patch of ground where seeds or acorns or berries grew particularly well. Most human beings, unless they are extremely hungry, are attracted to baby animals, and many wild pups or fawns or piglets must have been brought back alive by hunting parties. In this last sense, man has probably always been an incipient cultivator and domesticator. But I believe that Adams is right in suggesting that this would be doubly true with the experimenters of the terminal era of food-collecting. We noticed that they also seem to have had a tendency to settle down. Now my hunch goes that _when_ this experimentation and settling down took place within a potential nuclear area--where a whole constellation of plants and animals possible of domestication was available--the change was easily made. Professor Charles A. Reed, our field colleague in zoology, agrees that year-round settlement with plant domestication probably came before there were important animal domestications. INCIPIENT ERAS AND NUCLEAR AREAS I have put this scheme into a simple chart (p. 111) with the names of a few of the sites we are going to talk about. You will see that my hunch means that there are eras of incipient cultivation _only_ within nuclear areas. In a nuclear area, the terminal era of food-collecting would probably have been quite short. I do not know for how long a time the era of incipient cultivation and domestication would have lasted, but perhaps for several thousand years. Then it passed on into the era of the primary village-farming community. Outside a nuclear area, the terminal era of food-collecting would last for a long time; in a few out-of-the-way parts of the world, it still hangs on. It would end in any particular place through contact with and the spread of ideas of people who had passed on into one of the more developed eras. In many cases, the terminal era of food-collecting was ended by the incoming of the food-producing peoples themselves. For example, the practices of food-production were carried into Europe by the actual movement of some numbers of peoples (we don�t know how many) who had reached at least the level of the primary village-farming community. The �Forest folk� learned food-production from them. There was never an era of incipient cultivation and domestication proper in Europe, if my hunch is right. ARCHEOLOGICAL DIFFICULTIES IN SEEING THE INCIPIENT ERA The way I see it, two things were required in order that an era of incipient cultivation and domestication could begin. First, there had to be the natural environment of a nuclear area, with its whole group of plants and animals capable of domestication. This is the aspect of the matter which we�ve said is directly given by nature. But it is quite possible that such an environment with such a group of plants and animals in it may have existed well before ten thousand years ago in the Near East. It is also quite possible that the same promising condition may have existed in regions which never developed into nuclear areas proper. Here, again, we come back to the cultural factor. I think it was that �atmosphere of experimentation� we�ve talked about once or twice before. I can�t define it for you, other than to say that by the end of the Ice Age, the general level of many cultures was ready for change. Ask me how and why this was so, and I�ll tell you we don�t know yet, and that if we did understand this kind of question, there would be no need for me to go on being a prehistorian! [Illustration: POSSIBLE RELATIONSHIPS OF STAGES AND ERAS IN WESTERN ASIA AND NORTHEASTERN AFRICA] Now since this was an era of incipience, of the birth of new ideas, and of experimentation, it is very difficult to see its traces archeologically. New tools having to do with the new ways of getting and, in fact, producing food would have taken some time to develop. It need not surprise us too much if we cannot find hoes for planting and sickles for reaping grain at the very beginning. We might expect a time of making-do with some of the older tools, or with make-shift tools, for some of the new jobs. The present-day wild cousin of the domesticated sheep still lives in the mountains of western Asia. It has no wool, only a fine down under hair like that of a deer, so it need not surprise us to find neither the whorls used for spinning nor traces of woolen cloth. It must have taken some time for a wool-bearing sheep to develop and also time for the invention of the new tools which go with weaving. It would have been the same with other kinds of tools for the new way of life. It is difficult even for an experienced comparative zoologist to tell which are the bones of domesticated animals and which are those of their wild cousins. This is especially so because the animal bones the archeologists find are usually fragmentary. Furthermore, we do not have a sort of library collection of the skeletons of the animals or an herbarium of the plants of those times, against which the traces which the archeologists find may be checked. We are only beginning to get such collections for the modern wild forms of animals and plants from some of our nuclear areas. In the nuclear area in the Near East, some of the wild animals, at least, have already become extinct. There are no longer wild cattle or wild horses in western Asia. We know they were there from the finds we�ve made in caves of late Ice Age times, and from some slightly later sites. SITES WITH ANTIQUITIES OF THE INCIPIENT ERA So far, we know only a very few sites which would suit my notion of the incipient era of cultivation and animal domestication. I am closing this chapter with descriptions of two of the best Near Eastern examples I know of. You may not be satisfied that what I am able to describe makes a full-bodied era of development at all. Remember, however, that I�ve told you I�m largely playing a kind of a hunch, and also that the archeological materials of this era will always be extremely difficult to interpret. At the beginning of any new way of life, there will be a great tendency for people to make-do, at first, with tools and habits they are already used to. I would suspect that a great deal of this making-do went on almost to the end of this era. THE NATUFIAN, AN ASSEMBLAGE OF THE INCIPIENT ERA The assemblage called the Natufian comes from the upper layers of a number of caves in Palestine. Traces of its flint industry have also turned up in Syria and Lebanon. We don�t know just how old it is. I guess that it probably falls within five hundred years either way of about 5000 B.C. Until recently, the people who produced the Natufian assemblage were thought to have been only cave dwellers, but now at least three open air Natufian sites have been briefly described. In their best-known dwelling place, on Mount Carmel, the Natufian folk lived in the open mouth of a large rock-shelter and on the terrace in front of it. On the terrace, they had set at least two short curving lines of stones; but these were hardly architecture; they seem more like benches or perhaps the low walls of open pens. There were also one or two small clusters of stones laid like paving, and a ring of stones around a hearth or fireplace. One very round and regular basin-shaped depression had been cut into the rocky floor of the terrace, and there were other less regular basin-like depressions. In the newly reported open air sites, there seem to have been huts with rounded corners. Most of the finds in the Natufian layer of the Mount Carmel cave were flints. About 80 per cent of these flint tools were microliths made by the regular working of tiny blades into various tools, some having geometric forms. The larger flint tools included backed blades, burins, scrapers, a few arrow points, some larger hacking or picking tools, and one special type. This last was the sickle blade. We know a sickle blade of flint when we see one, because of a strange polish or sheen which seems to develop on the cutting edge when the blade has been used to cut grasses or grain, or--perhaps--reeds. In the Natufian, we have even found the straight bone handles in which a number of flint sickle blades were set in a line. There was a small industry in ground or pecked stone (that is, abraded not chipped) in the Natufian. This included some pestle and mortar fragments. The mortars are said to have a deep and narrow hole, and some of the pestles show traces of red ochre. We are not sure that these mortars and pestles were also used for grinding food. In addition, there were one or two bits of carving in stone. NATUFIAN ANTIQUITIES IN OTHER MATERIALS; BURIALS AND PEOPLE The Natufian industry in bone was quite rich. It included, beside the sickle hafts mentioned above, points and harpoons, straight and curved types of fish-hooks, awls, pins and needles, and a variety of beads and pendants. There were also beads and pendants of pierced teeth and shell. A number of Natufian burials have been found in the caves; some burials were grouped together in one grave. The people who were buried within the Mount Carmel cave were laid on their backs in an extended position, while those on the terrace seem to have been �flexed� (placed in their graves in a curled-up position). This may mean no more than that it was easier to dig a long hole in cave dirt than in the hard-packed dirt of the terrace. The people often had some kind of object buried with them, and several of the best collections of beads come from the burials. On two of the skulls there were traces of elaborate head-dresses of shell beads. [Illustration: SKETCH OF NATUFIAN ASSEMBLAGE MICROLITHS ARCHITECTURE? BURIAL CHIPPED STONE GROUND STONE BONE] The animal bones of the Natufian layers show beasts of a �modern� type, but with some differences from those of present-day Palestine. The bones of the gazelle far outnumber those of the deer; since gazelles like a much drier climate than deer, Palestine must then have had much the same climate that it has today. Some of the animal bones were those of large or dangerous beasts: the hyena, the bear, the wild boar, and the leopard. But the Natufian people may have had the help of a large domesticated dog. If our guess at a date for the Natufian is right (about 7750 B.C.), this is an earlier dog than was that in the Maglemosian of northern Europe. More recently, it has been reported that a domesticated goat is also part of the Natufian finds. The study of the human bones from the Natufian burials is not yet complete. Until Professor McCown�s study becomes available, we may note Professor Coon�s assessment that these people were of a �basically Mediterranean type.� THE KARIM SHAHIR ASSEMBLAGE Karim Shahir differs from the Natufian sites in that it shows traces of a temporary open site or encampment. It lies on the top of a bluff in the Kurdish hill-country of northeastern Iraq. It was dug by Dr. Bruce Howe of the expedition I directed in 1950-51 for the Oriental Institute and the American Schools of Oriental Research. In 1954-55, our expedition located another site, M�lefaat, with general resemblance to Karim Shahir, but about a hundred miles north of it. In 1956, Dr. Ralph Solecki located still another Karim Shahir type of site called Zawi Chemi Shanidar. The Zawi Chemi site has a radiocarbon date of 8900 � 300 B.C. Karim Shahir has evidence of only one very shallow level of occupation. It was probably not lived on very long, although the people who lived on it spread out over about three acres of area. In spots, the single layer yielded great numbers of fist-sized cracked pieces of limestone, which had been carried up from the bed of a stream at the bottom of the bluff. We think these cracked stones had something to do with a kind of architecture, but we were unable to find positive traces of hut plans. At M�lefaat and Zawi Chemi, there were traces of rounded hut plans. As in the Natufian, the great bulk of small objects of the Karim Shahir assemblage was in chipped flint. A large proportion of the flint tools were microlithic bladelets and geometric forms. The flint sickle blade was almost non-existent, being far scarcer than in the Natufian. The people of Karim Shahir did a modest amount of work in the grinding of stone; there were milling stone fragments of both the mortar and the quern type, and stone hoes or axes with polished bits. Beads, pendants, rings, and bracelets were made of finer quality stone. We found a few simple points and needles of bone, and even two rather formless unbaked clay figurines which seemed to be of animal form. [Illustration: SKETCH OF KARIM SHAHIR ASSEMBLAGE CHIPPED STONE GROUND STONE UNBAKED CLAY SHELL BONE �ARCHITECTURE�] Karim Shahir did not yield direct evidence of the kind of vegetable food its people ate. The animal bones showed a considerable increase in the proportion of the bones of the species capable of domestication--sheep, goat, cattle, horse, dog--as compared with animal bones from the earlier cave sites of the area, which have a high proportion of bones of wild forms like deer and gazelle. But we do not know that any of the Karim Shahir animals were actually domesticated. Some of them may have been, in an �incipient� way, but we have no means at the moment that will tell us from the bones alone. WERE THE NATUFIAN AND KARIM SHAHIR PEOPLES FOOD-PRODUCERS? It is clear that a great part of the food of the Natufian people must have been hunted or collected. Shells of land, fresh-water, and sea animals occur in their cave layers. The same is true as regards Karim Shahir, save for sea shells. But on the other hand, we have the sickles, the milling stones, the possible Natufian dog, and the goat, and the general animal situation at Karim Shahir to hint at an incipient approach to food-production. At Karim Shahir, there was the tendency to settle down out in the open; this is echoed by the new reports of open air Natufian sites. The large number of cracked stones certainly indicates that it was worth the peoples� while to have some kind of structure, even if the site as a whole was short-lived. It is a part of my hunch that these things all point toward food-production--that the hints we seek are there. But in the sense that the peoples of the era of the primary village-farming community, which we shall look at next, are fully food-producing, the Natufian and Karim Shahir folk had not yet arrived. I think they were part of a general build-up to full scale food-production. They were possibly controlling a few animals of several kinds and perhaps one or two plants, without realizing the full possibilities of this �control� as a new way of life. This is why I think of the Karim Shahir and Natufian folk as being at a level, or in an era, of incipient cultivation and domestication. But we shall have to do a great deal more excavation in this range of time before we�ll get the kind of positive information we need. SUMMARY I am sorry that this chapter has had to be so much more about ideas than about the archeological traces of prehistoric men themselves. But the antiquities of the incipient era of cultivation and animal domestication will not be spectacular, even when we do have them excavated in quantity. Few museums will be interested in these antiquities for exhibition purposes. The charred bits or impressions of plants, the fragments of animal bone and shell, and the varied clues to climate and environment will be as important as the artifacts themselves. It will be the ideas to which these traces lead us that will be important. I am sure that this unspectacular material--when we have much more of it, and learn how to understand what it says--will lead us to how and why answers about the first great change in human history. We know the earliest village-farming communities appeared in western Asia, in a nuclear area. We do not yet know why the Near Eastern experiment came first, or why it didn�t happen earlier in some other nuclear area. Apparently, the level of culture and the promise of the natural environment were ready first in western Asia. The next sites we look at will show a simple but effective food-production already in existence. Without effective food-production and the settled village-farming communities, civilization never could have followed. How effective food-production came into being by the end of the incipient era, is, I believe, one of the most fascinating questions any archeologist could face. It now seems probable--from possibly two of the Palestinian sites with varieties of the Natufian (Jericho and Nahal Oren)--that there were one or more local Palestinian developments out of the Natufian into later times. In the same way, what followed after the Karim Shahir type of assemblage in northeastern Iraq was in some ways a reflection of beginnings made at Karim Shahir and Zawi Chemi. THE First Revolution [Illustration] As the incipient era of cultivation and animal domestication passed onward into the era of the primary village-farming community, the first basic change in human economy was fully achieved. In southwestern Asia, this seems to have taken place about nine thousand years ago. I am going to restrict my description to this earliest Near Eastern case--I do not know enough about the later comparable experiments in the Far East and in the New World. Let us first, once again, think of the contrast between food-collecting and food-producing as ways of life. THE DIFFERENCE BETWEEN FOOD-COLLECTORS AND FOOD-PRODUCERS Childe used the word �revolution� because of the radical change that took place in the habits and customs of man. Food-collectors--that is, hunters, fishers, berry- and nut-gatherers--had to live in small groups or bands, for they had to be ready to move wherever their food supply moved. Not many people can be fed in this way in one area, and small children and old folks are a burden. There is not enough food to store, and it is not the kind that can be stored for long. Do you see how this all fits into a picture? Small groups of people living now in this cave, now in that--or out in the open--as they moved after the animals they hunted; no permanent villages, a few half-buried huts at best; no breakable utensils; no pottery; no signs of anything for clothing beyond the tools that were probably used to dress the skins of animals; no time to think of much of anything but food and protection and disposal of the dead when death did come: an existence which takes nature as it finds it, which does little or nothing to modify nature--all in all, a savage�s existence, and a very tough one. A man who spends his whole life following animals just to kill them to eat, or moving from one berry patch to another, is really living just like an animal himself. THE FOOD-PRODUCING ECONOMY Against this picture let me try to draw another--that of man�s life after food-production had begun. His meat was stored �on the hoof,� his grain in silos or great pottery jars. He lived in a house: it was worth his while to build one, because he couldn�t move far from his fields and flocks. In his neighborhood enough food could be grown and enough animals bred so that many people were kept busy. They all lived close to their flocks and fields, in a village. The village was already of a fair size, and it was growing, too. Everybody had more to eat; they were presumably all stronger, and there were more children. Children and old men could shepherd the animals by day or help with the lighter work in the fields. After the crops had been harvested the younger men might go hunting and some of them would fish, but the food they brought in was only an addition to the food in the village; the villagers wouldn�t starve, even if the hunters and fishermen came home empty-handed. There was more time to do different things, too. They began to modify nature. They made pottery out of raw clay, and textiles out of hair or fiber. People who became good at pottery-making traded their pots for food and spent all of their time on pottery alone. Other people were learning to weave cloth or to make new tools. There were already people in the village who were becoming full-time craftsmen. Other things were changing, too. The villagers must have had to agree on new rules for living together. The head man of the village had problems different from those of the chief of the small food-collectors� band. If somebody�s flock of sheep spoiled a wheat field, the owner wanted payment for the grain he lost. The chief of the hunters was never bothered with such questions. Even the gods had changed. The spirits and the magic that had been used by hunters weren�t of any use to the villagers. They needed gods who would watch over the fields and the flocks, and they eventually began to erect buildings where their gods might dwell, and where the men who knew most about the gods might live. WAS FOOD-PRODUCTION A �REVOLUTION�? If you can see the difference between these two pictures--between life in the food-collecting stage and life after food-production had begun--you�ll see why Professor Childe speaks of a revolution. By revolution, he doesn�t mean that it happened over night or that it happened only once. We don�t know exactly how long it took. Some people think that all these changes may have occurred in less than 500 years, but I doubt that. The incipient era was probably an affair of some duration. Once the level of the village-farming community had been established, however, things did begin to move very fast. By six thousand years ago, the descendants of the first villagers had developed irrigation and plow agriculture in the relatively rainless Mesopotamian alluvium and were living in towns with temples. Relative to the half million years of food-gathering which lay behind, this had been achieved with truly revolutionary suddenness. GAPS IN OUR KNOWLEDGE OF THE NEAR EAST If you�ll look again at the chart (p. 111) you�ll see that I have very few sites and assemblages to name in the incipient era of cultivation and domestication, and not many in the earlier part of the primary village-farming level either. Thanks in no small part to the intelligent co-operation given foreign excavators by the Iraq Directorate General of Antiquities, our understanding of the sequence in Iraq is growing more complete. I shall use Iraq as my main yard-stick here. But I am far from being able to show you a series of Sears Roebuck catalogues, even century by century, for any part of the nuclear area. There is still a great deal of earth to move, and a great mass of material to recover and interpret before we even begin to understand �how� and �why.� Perhaps here, because this kind of archeology is really my specialty, you�ll excuse it if I become personal for a moment. I very much look forward to having further part in closing some of the gaps in knowledge of the Near East. This is not, as I�ve told you, the spectacular range of Near Eastern archeology. There are no royal tombs, no gold, no great buildings or sculpture, no writing, in fact nothing to excite the normal museum at all. Nevertheless it is a range which, idea-wise, gives the archeologist tremendous satisfaction. The country of the hilly flanks is an exciting combination of green grasslands and mountainous ridges. The Kurds, who inhabit the part of the area in which I�ve worked most recently, are an extremely interesting and hospitable people. Archeologists don�t become rich, but I�ll forego the Cadillac for any bright spring morning in the Kurdish hills, on a good site with a happy crew of workmen and an interested and efficient staff. It is probably impossible to convey the full feeling which life on such a dig holds--halcyon days for the body and acute pleasurable stimulation for the mind. Old things coming newly out of the good dirt, and the pieces of the human puzzle fitting into place! I think I am an honest man; I cannot tell you that I am sorry the job is not yet finished and that there are still gaps in this part of the Near Eastern archeological sequence. EARLIEST SITES OF THE VILLAGE FARMERS So far, the Karim Shahir type of assemblage, which we looked at in the last chapter, is the earliest material available in what I take to be the nuclear area. We do not believe that Karim Shahir was a village site proper: it looks more like the traces of a temporary encampment. Two caves, called Belt and Hotu, which are outside the nuclear area and down on the foreshore of the Caspian Sea, have been excavated by Professor Coon. These probably belong in the later extension of the terminal era of food-gathering; in their upper layers are traits like the use of pottery borrowed from the more developed era of the same time in the nuclear area. The same general explanation doubtless holds true for certain materials in Egypt, along the upper Nile and in the Kharga oasis: these materials, called Sebilian III, the Khartoum �neolithic,� and the Khargan microlithic, are from surface sites, not from caves. The chart (p. 111) shows where I would place these materials in era and time. [Illustration: THE HILLY FLANKS OF THE CRESCENT AND EARLY SITES OF THE NEAR EAST] Both M�lefaat and Dr. Solecki�s Zawi Chemi Shanidar site appear to have been slightly more �settled in� than was Karim Shahir itself. But I do not think they belong to the era of farming-villages proper. The first site of this era, in the hills of Iraqi Kurdistan, is Jarmo, on which we have spent three seasons of work. Following Jarmo comes a variety of sites and assemblages which lie along the hilly flanks of the crescent and just below it. I am going to describe and illustrate some of these for you. Since not very much archeological excavation has yet been done on sites of this range of time, I shall have to mention the names of certain single sites which now alone stand for an assemblage. This does not mean that I think the individual sites I mention were unique. In the times when their various cultures flourished, there must have been many little villages which shared the same general assemblage. We are only now beginning to locate them again. Thus, if I speak of Jarmo, or Jericho, or Sialk as single examples of their particular kinds of assemblages, I don�t mean that they were unique at all. I think I could take you to the sites of at least three more Jarmos, within twenty miles of the original one. They are there, but they simply haven�t yet been excavated. In 1956, a Danish expedition discovered material of Jarmo type at Shimshara, only two dozen miles northeast of Jarmo, and below an assemblage of Hassunan type (which I shall describe presently). THE GAP BETWEEN KARIM SHAHIR AND JARMO As we see the matter now, there is probably still a gap in the available archeological record between the Karim Shahir-M�lefaat-Zawi Chemi group (of the incipient era) and that of Jarmo (of the village-farming era). Although some items of the Jarmo type materials do reflect the beginnings of traditions set in the Karim Shahir group (see p. 120), there is not a clear continuity. Moreover--to the degree that we may trust a few radiocarbon dates--there would appear to be around two thousand years of difference in time. The single available Zawi Chemi �date� is 8900 � 300 B.C.; the most reasonable group of �dates� from Jarmo average to about 6750 � 200 B.C. I am uncertain about this two thousand years--I do not think it can have been so long. This suggests that we still have much work to do in Iraq. You can imagine how earnestly we await the return of political stability in the Republic of Iraq. JARMO, IN THE KURDISH HILLS, IRAQ The site of Jarmo has a depth of deposit of about twenty-seven feet, and approximately a dozen layers of architectural renovation and change. Nevertheless it is a �one period� site: its assemblage remains essentially the same throughout, although one or two new items are added in later levels. It covers about four acres of the top of a bluff, below which runs a small stream. Jarmo lies in the hill country east of the modern oil town of Kirkuk. The Iraq Directorate General of Antiquities suggested that we look at it in 1948, and we have had three seasons of digging on it since. The people of Jarmo grew the barley plant and two different kinds of wheat. They made flint sickles with which to reap their grain, mortars or querns on which to crack it, ovens in which it might be parched, and stone bowls out of which they might eat their porridge. We are sure that they had the domesticated goat, but Professor Reed (the staff zoologist) is not convinced that the bones of the other potentially domesticable animals of Jarmo--sheep, cattle, pig, horse, dog--show sure signs of domestication. We had first thought that all of these animals were domesticated ones, but Reed feels he must find out much more before he can be sure. As well as their grain and the meat from their animals, the people of Jarmo consumed great quantities of land snails. Botanically, the Jarmo wheat stands about half way between fully bred wheat and the wild forms. ARCHITECTURE: HALL-MARK OF THE VILLAGE The sure sign of the village proper is in its traces of architectural permanence. The houses of Jarmo were only the size of a small cottage by our standards, but each was provided with several rectangular rooms. The walls of the houses were made of puddled mud, often set on crude foundations of stone. (The puddled mud wall, which the Arabs call _touf_, is built by laying a three to six inch course of soft mud, letting this sun-dry for a day or two, then adding the next course, etc.) The village probably looked much like the simple Kurdish farming village of today, with its mud-walled houses and low mud-on-brush roofs. I doubt that the Jarmo village had more than twenty houses at any one moment of its existence. Today, an average of about seven people live in a comparable Kurdish house; probably the population of Jarmo was about 150 people. [Illustration: SKETCH OF JARMO ASSEMBLAGE CHIPPED STONE UNBAKED CLAY GROUND STONE POTTERY _UPPER THIRD OF SITE ONLY._ REED MATTING BONE ARCHITECTURE] It is interesting that portable pottery does not appear until the last third of the life of the Jarmo village. Throughout the duration of the village, however, its people had experimented with the plastic qualities of clay. They modeled little figurines of animals and of human beings in clay; one type of human figurine they favored was that of a markedly pregnant woman, probably the expression of some sort of fertility spirit. They provided their house floors with baked-in-place depressions, either as basins or hearths, and later with domed ovens of clay. As we�ve noted, the houses themselves were of clay or mud; one could almost say they were built up like a house-sized pot. Then, finally, the idea of making portable pottery itself appeared, although I very much doubt that the people of the Jarmo village discovered the art. On the other hand, the old tradition of making flint blades and microlithic tools was still very strong at Jarmo. The sickle-blade was made in quantities, but so also were many of the much older tool types. Strangely enough, it is within this age-old category of chipped stone tools that we see one of the clearest pointers to a newer age. Many of the Jarmo chipped stone tools--microliths--were made of obsidian, a black volcanic natural glass. The obsidian beds nearest to Jarmo are over three hundred miles to the north. Already a bulk carrying trade had been established--the forerunner of commerce--and the routes were set by which, in later times, the metal trade was to move. There are now twelve radioactive carbon �dates� from Jarmo. The most reasonable cluster of determinations averages to about 6750 � 200 B.C., although there is a completely unreasonable range of �dates� running from 3250 to 9250 B.C.! _If_ I am right in what I take to be �reasonable,� the first flush of the food-producing revolution had been achieved almost nine thousand years ago. HASSUNA, IN UPPER MESOPOTAMIAN IRAQ We are not sure just how soon after Jarmo the next assemblage of Iraqi material is to be placed. I do not think the time was long, and there are a few hints that detailed habits in the making of pottery and ground stone tools were actually continued from Jarmo times into the time of the next full assemblage. This is called after a site named Hassuna, a few miles to the south and west of modern Mosul. We also have Hassunan type materials from several other sites in the same general region. It is probably too soon to make generalizations about it, but the Hassunan sites seem to cluster at slightly lower elevations than those we have been talking about so far. The catalogue of the Hassuna assemblage is of course more full and elaborate than that of Jarmo. The Iraqi government�s archeologists who dug Hassuna itself, exposed evidence of increasing architectural know-how. The walls of houses were still formed of puddled mud; sun-dried bricks appear only in later periods. There were now several different ways of making and decorating pottery vessels. One style of pottery painting, called the Samarran style, is an extremely handsome one and must have required a great deal of concentration and excellence of draftsmanship. On the other hand, the old habits for the preparation of good chipped stone tools--still apparent at Jarmo--seem to have largely disappeared by Hassunan times. The flint work of the Hassunan catalogue is, by and large, a wretched affair. We might guess that the kinaesthetic concentration of the Hassuna craftsmen now went into other categories; that is, they suddenly discovered they might have more fun working with the newer materials. It�s a shame, for example, that none of their weaving is preserved for us. The two available radiocarbon determinations from Hassunan contexts stand at about 5100 and 5600 B.C. � 250 years. OTHER EARLY VILLAGE SITES IN THE NUCLEAR AREA I�ll now name and very briefly describe a few of the other early village assemblages either in or adjacent to the hilly flanks of the crescent. Unfortunately, we do not have radioactive carbon dates for many of these materials. We may guess that some particular assemblage, roughly comparable to that of Hassuna, for example, must reflect a culture which lived at just about the same time as that of Hassuna. We do this guessing on the basis of the general similarity and degree of complexity of the Sears Roebuck catalogues of the particular assemblage and that of Hassuna. We suppose that for sites near at hand and of a comparable cultural level, as indicated by their generally similar assemblages, the dating must be about the same. We may also know that in a general stratigraphic sense, the sites in question may both appear at the bottom of the ascending village sequence in their respective areas. Without a number of consistent radioactive carbon dates, we cannot be precise about priorities. [Illustration: SKETCH OF HASSUNA ASSEMBLAGE POTTERY POTTERY OBJECTS CHIPPED STONE BONE GROUND STONE ARCHITECTURE REED MATTING BURIAL] The ancient mound at Jericho, in the Dead Sea valley in Palestine, yields some very interesting material. Its catalogue somewhat resembles that of Jarmo, especially in the sense that there is a fair depth of deposit without portable pottery vessels. On the other hand, the architecture of Jericho is surprisingly complex, with traces of massive stone fortification walls and the general use of formed sun-dried mud brick. Jericho lies in a somewhat strange and tropically lush ecological niche, some seven hundred feet below sea level; it is geographically within the hilly-flanks zone but environmentally not part of it. Several radiocarbon �dates� for Jericho fall within the range of those I find reasonable for Jarmo, and their internal statistical consistency is far better than that for the Jarmo determinations. It is not yet clear exactly what this means. The mound at Jericho (Tell es-Sultan) contains a remarkably fine sequence, which perhaps does not have the gap we noted in Iraqi-Kurdistan between the Karim Shahir group and Jarmo. While I am not sure that the Jericho sequence will prove valid for those parts of Palestine outside the special Dead Sea environmental niche, the sequence does appear to proceed from the local variety of Natufian into that of a very well settled community. So far, we have little direct evidence for the food-production basis upon which the Jericho people subsisted. There is an early village assemblage with strong characteristics of its own in the land bordering the northeast corner of the Mediterranean Sea, where Syria and the Cilician province of Turkey join. This early Syro-Cilician assemblage must represent a general cultural pattern which was at least in part contemporary with that of the Hassuna assemblage. These materials from the bases of the mounds at Mersin, and from Judaidah in the Amouq plain, as well as from a few other sites, represent the remains of true villages. The walls of their houses were built of puddled mud, but some of the house foundations were of stone. Several different kinds of pottery were made by the people of these villages. None of it resembles the pottery from Hassuna or from the upper levels of Jarmo or Jericho. The Syro-Cilician people had not lost their touch at working flint. An important southern variation of the Syro-Cilician assemblage has been cleared recently at Byblos, a port town famous in later Phoenician times. There are three radiocarbon determinations which suggest that the time range for these developments was in the sixth or early fifth millennium B.C. It would be fascinating to search for traces of even earlier village-farming communities and for the remains of the incipient cultivation era, in the Syro-Cilician region. THE IRANIAN PLATEAU AND THE NILE VALLEY The map on page 125 shows some sites which lie either outside or in an extension of the hilly-flanks zone proper. From the base of the great mound at Sialk on the Iranian plateau came an assemblage of early village material, generally similar, in the kinds of things it contained, to the catalogues of Hassuna and Judaidah. The details of how things were made are different; the Sialk assemblage represents still another cultural pattern. I suspect it appeared a bit later in time than did that of Hassuna. There is an important new item in the Sialk catalogue. The Sialk people made small drills or pins of hammered copper. Thus the metallurgist�s specialized craft had made its appearance. There is at least one very early Iranian site on the inward slopes of the hilly-flanks zone. It is the earlier of two mounds at a place called Bakun, in southwestern Iran; the results of the excavations there are not yet published and we only know of its coarse and primitive pottery. I only mention Bakun because it helps us to plot the extent of the hilly-flanks zone villages on the map. The Nile Valley lies beyond the peculiar environmental zone of the hilly flanks of the crescent, and it is probable that the earliest village-farming communities in Egypt were established by a few people who wandered into the Nile delta area from the nuclear area. The assemblage which is most closely comparable to the catalogue of Hassuna or Judaidah, for example, is that from little settlements along the shore of the Fayum lake. The Fayum materials come mainly from grain bins or silos. Another site, Merimde, in the western part of the Nile delta, shows the remains of a true village, but it may be slightly later than the settlement of the Fayum. There are radioactive carbon �dates� for the Fayum materials at about 4275 B.C. � 320 years, which is almost fifteen hundred years later than the determinations suggested for the Hassunan or Syro-Cilician assemblages. I suspect that this is a somewhat over-extended indication of the time it took for the generalized cultural pattern of village-farming community life to spread from the nuclear area down into Egypt, but as yet we have no way of testing these matters. In this same vein, we have two radioactive carbon dates for an assemblage from sites near Khartoum in the Sudan, best represented by the mound called Shaheinab. The Shaheinab catalogue roughly corresponds to that of the Fayum; the distance between the two places, as the Nile flows, is roughly 1,500 miles. Thus it took almost a thousand years for the new way of life to be carried as far south into Africa as Khartoum; the two Shaheinab �dates� average about 3300 B.C. � 400 years. If the movement was up the Nile (southward), as these dates suggest, then I suspect that the earliest available village material of middle Egypt, the so-called Tasian, is also later than that of the Fayum. The Tasian materials come from a few graves near a village called Deir Tasa, and I have an uncomfortable feeling that the Tasian �assemblage� may be mainly an artificial selection of poor examples of objects which belong in the following range of time. SPREAD IN TIME AND SPACE There are now two things we can do; in fact, we have already begun to do them. We can watch the spread of the new way of life upward through time in the nuclear area. We can also see how the new way of life spread outward in space from the nuclear area, as time went on. There is good archeological evidence that both these processes took place. For the hill country of northeastern Iraq, in the nuclear area, we have already noticed how the succession (still with gaps) from Karim Shahir, through M�lefaat and Jarmo, to Hassuna can be charted (see chart, p. 111). In the next chapter, we shall continue this charting and description of what happened in Iraq upward through time. We also watched traces of the new way of life move through space up the Nile into Africa, to reach Khartoum in the Sudan some thirty-five hundred years later than we had seen it at Jarmo or Jericho. We caught glimpses of it in the Fayum and perhaps at Tasa along the way. For the remainder of this chapter, I shall try to suggest briefly for you the directions taken by the spread of the new way of life from the nuclear area in the Near East. First, let me make clear again that I _do not_ believe that the village-farming community way of life was invented only once and in the Near East. It seems to me that the evidence is very clear that a separate experiment arose in the New World. For China, the question of independence or borrowing--in the appearance of the village-farming community there--is still an open one. In the last chapter, we noted the probability of an independent nuclear area in southeastern Asia. Professor Carl Sauer strongly champions the great importance of this area as _the_ original center of agricultural pursuits, as a kind of �cradle� of all incipient eras of the Old World at least. While there is certainly not the slightest archeological evidence to allow us to go that far, we may easily expect that an early southeast Asian development would have been felt in China. However, the appearance of the village-farming community in the northwest of India, at least, seems to have depended on the earlier development in the Near East. It is also probable that ideas of the new way of life moved well beyond Khartoum in Africa. THE SPREAD OF THE VILLAGE-FARMING COMMUNITY WAY OF LIFE INTO EUROPE How about Europe? I won�t give you many details. You can easily imagine that the late prehistoric prelude to European history is a complicated affair. We all know very well how complicated an area Europe is now, with its welter of different languages and cultures. Remember, however, that a great deal of archeology has been done on the late prehistory of Europe, and very little on that of further Asia and Africa. If we knew as much about these areas as we do of Europe, I expect we�d find them just as complicated. This much is clear for Europe, as far as the spread of the village-community way of life is concerned. The general idea and much of the know-how and the basic tools of food-production moved from the Near East to Europe. So did the plants and animals which had been domesticated; they were not naturally at home in Europe, as they were in western Asia. I do not, of course, mean that there were traveling salesmen who carried these ideas and things to Europe with a commercial gleam in their eyes. The process took time, and the ideas and things must have been passed on from one group of people to the next. There was also some actual movement of peoples, but we don�t know the size of the groups that moved. The story of the �colonization� of Europe by the first farmers is thus one of (1) the movement from the eastern Mediterranean lands of some people who were farmers; (2) the spread of ideas and things beyond the Near East itself and beyond the paths along which the �colonists� moved; and (3) the adaptations of the ideas and things by the indigenous �Forest folk�, about whose �receptiveness� Professor Mathiassen speaks (p. 97). It is important to note that the resulting cultures in the new European environment were European, not Near Eastern. The late Professor Childe remarked that �the peoples of the West were not slavish imitators; they adapted the gifts from the East ... into a new and organic whole capable of developing on its own original lines.� THE WAYS TO EUROPE Suppose we want to follow the traces of those earliest village-farmers who did travel from western Asia into Europe. Let us start from Syro-Cilicia, that part of the hilly-flanks zone proper which lies in the very northeastern corner of the Mediterranean. Three ways would be open to us (of course we could not be worried about permission from the Soviet authorities!). We would go north, or north and slightly east, across Anatolian Turkey, and skirt along either shore of the Black Sea or even to the east of the Caucasus Mountains along the Caspian Sea, to reach the plains of Ukrainian Russia. From here, we could march across eastern Europe to the Baltic and Scandinavia, or even hook back southwestward to Atlantic Europe. Our second way from Syro-Cilicia would also lie over Anatolia, to the northwest, where we would have to swim or raft ourselves over the Dardanelles or the Bosphorus to the European shore. Then we would bear left toward Greece, but some of us might turn right again in Macedonia, going up the valley of the Vardar River to its divide and on down the valley of the Morava beyond, to reach the Danube near Belgrade in Jugoslavia. Here we would turn left, following the great river valley of the Danube up into central Europe. We would have a number of tributary valleys to explore, or we could cross the divide and go down the valley of the Rhine to the North Sea. Our third way from Syro-Cilicia would be by sea. We would coast along southern Anatolia and visit Cyprus, Crete, and the Aegean islands on our way to Greece, where, in the north, we might meet some of those who had taken the second route. From Greece, we would sail on to Italy and the western isles, to reach southern France and the coasts of Spain. Eventually a few of us would sail up the Atlantic coast of Europe, to reach western Britain and even Ireland. [Illustration: PROBABLE ROUTES AND TIMING IN THE SPREAD OF THE VILLAGE-FARMING COMMUNITY WAY OF LIFE FROM THE NEAR EAST TO EUROPE] Of course none of us could ever take these journeys as the first farmers took them, since the whole course of each journey must have lasted many lifetimes. The date given to the assemblage called Windmill Hill, the earliest known trace of village-farming communities in England, is about 2500 B.C. I would expect about 5500 B.C. to be a safe date to give for the well-developed early village communities of Syro-Cilicia. We suspect that the spread throughout Europe did not proceed at an even rate. Professor Piggott writes that �at a date probably about 2600 B.C., simple agricultural communities were being established in Spain and southern France, and from the latter region a spread northwards can be traced ... from points on the French seaboard of the [English] Channel ... there were emigrations of a certain number of these tribes by boat, across to the chalk lands of Wessex and Sussex [in England], probably not more than three or four generations later than the formation of the south French colonies.� New radiocarbon determinations are becoming available all the time--already several suggest that the food-producing way of life had reached the lower Rhine and Holland by 4000 B.C. But not all prehistorians accept these �dates,� so I do not show them on my map (p. 139). THE EARLIEST FARMERS OF ENGLAND To describe the later prehistory of all Europe for you would take another book and a much larger one than this is. Therefore, I have decided to give you only a few impressions of the later prehistory of Britain. Of course the British Isles lie at the other end of Europe from our base-line in western Asia. Also, they received influences along at least two of the three ways in which the new way of life moved into Europe. We will look at more of their late prehistory in a following chapter: here, I shall speak only of the first farmers. The assemblage called Windmill Hill, which appears in the south of England, exhibits three different kinds of structures, evidence of grain-growing and of stock-breeding, and some distinctive types of pottery and stone implements. The most remarkable type of structure is the earthwork enclosures which seem to have served as seasonal cattle corrals. These enclosures were roughly circular, reached over a thousand feet in diameter, and sometimes included two or three concentric sets of banks and ditches. Traces of oblong timber houses have been found, but not within the enclosures. The second type of structure is mine-shafts, dug down into the chalk beds where good flint for the making of axes or hoes could be found. The third type of structure is long simple mounds or �unchambered barrows,� in one end of which burials were made. It has been commonly believed that the Windmill Hill assemblage belonged entirely to the cultural tradition which moved up through France to the Channel. Professor Piggott is now convinced, however, that important elements of Windmill Hill stem from northern Germany and Denmark--products of the first way into Europe from the east. The archeological traces of a second early culture are to be found in the west of England, western and northern Scotland, and most of Ireland. The bearers of this culture had come up the Atlantic coast by sea from southern France and Spain. The evidence they have left us consists mainly of tombs and the contents of tombs, with only very rare settlement sites. The tombs were of some size and received the bodies of many people. The tombs themselves were built of stone, heaped over with earth; the stones enclosed a passage to a central chamber (�passage graves�), or to a simple long gallery, along the sides of which the bodies were laid (�gallery graves�). The general type of construction is called �megalithic� (= great stone), and the whole earth-mounded structure is often called a _barrow_. Since many have proper chambers, in one sense or another, we used the term �unchambered barrow� above to distinguish those of the Windmill Hill type from these megalithic structures. There is some evidence for sacrifice, libations, and ceremonial fires, and it is clear that some form of community ritual was focused on the megalithic tombs. The cultures of the people who produced the Windmill Hill assemblage and of those who made the megalithic tombs flourished, at least in part, at the same time. Although the distributions of the two different types of archeological traces are in quite different parts of the country, there is Windmill Hill pottery in some of the megalithic tombs. But the tombs also contain pottery which seems to have arrived with the tomb builders themselves. The third early British group of antiquities of this general time (following 2500 B.C.) comes from sites in southern and eastern England. It is not so certain that the people who made this assemblage, called Peterborough, were actually farmers. While they may on occasion have practiced a simple agriculture, many items of their assemblage link them closely with that of the �Forest folk� of earlier times in England and in the Baltic countries. Their pottery is decorated with impressions of cords and is quite different from that of Windmill Hill and the megalithic builders. In addition, the distribution of their finds extends into eastern Britain, where the other cultures have left no trace. The Peterborough people had villages with semi-subterranean huts, and the bones of oxen, pigs, and sheep have been found in a few of these. On the whole, however, hunting and fishing seem to have been their vital occupations. They also established trade routes especially to acquire the raw material for stone axes. A probably slightly later culture, whose traces are best known from Skara Brae on Orkney, also had its roots in those cultures of the Baltic area which fused out of the meeting of the �Forest folk� and the peoples who took the eastern way into Europe. Skara Brae is very well preserved, having been built of thin stone slabs about which dune-sand drifted after the village died. The individual houses, the bedsteads, the shelves, the chests for clothes and oddments--all built of thin stone-slabs--may still be seen in place. But the Skara Brae people lived entirely by sheep- and cattle-breeding, and by catching shellfish. Neither grain nor the instruments of agriculture appeared at Skara Brae. THE EUROPEAN ACHIEVEMENT The above is only a very brief description of what went on in Britain with the arrival of the first farmers. There are many interesting details which I have omitted in order to shorten the story. I believe some of the difficulty we have in understanding the establishment of the first farming communities in Europe is with the word �colonization.� We have a natural tendency to think of �colonization� as it has happened within the last few centuries. In the case of the colonization of the Americas, for example, the colonists came relatively quickly, and in increasingly vast numbers. They had vastly superior technical, political, and war-making skills, compared with those of the Indians. There was not much mixing with the Indians. The case in Europe five or six thousand years ago must have been very different. I wonder if it is even proper to call people �colonists� who move some miles to a new region, settle down and farm it for some years, then move on again, generation after generation? The ideas and the things which these new people carried were only _potentially_ superior. The ideas and things and the people had to prove themselves in their adaptation to each new environment. Once this was done another link to the chain would be added, and then the forest-dwellers and other indigenous folk of Europe along the way might accept the new ideas and things. It is quite reasonable to expect that there must have been much mixture of the migrants and the indigenes along the way; the Peterborough and Skara Brae assemblages we mentioned above would seem to be clear traces of such fused cultures. Sometimes, especially if the migrants were moving by boat, long distances may have been covered in a short time. Remember, however, we seem to have about three thousand years between the early Syro-Cilician villages and Windmill Hill. Let me repeat Professor Childe again. �The peoples of the West were not slavish imitators: they adapted the gifts from the East ... into a new and organic whole capable of developing on its own original lines.� Childe is of course completely conscious of the fact that his �peoples of the West� were in part the descendants of migrants who came originally from the �East,� bringing their �gifts� with them. This was the late prehistoric achievement of Europe--to take new ideas and things and some migrant peoples and, by mixing them with the old in its own environments, to forge a new and unique series of cultures. What we know of the ways of men suggests to us that when the details of the later prehistory of further Asia and Africa are learned, their stories will be just as exciting. THE Conquest of Civilization [Illustration] Now we must return to the Near East again. We are coming to the point where history is about to begin. I am going to stick pretty close to Iraq and Egypt in this chapter. These countries will perhaps be the most interesting to most of us, for the foundations of western civilization were laid in the river lands of the Tigris and Euphrates and of the Nile. I shall probably stick closest of all to Iraq, because things first happened there and also because I know it best. There is another interesting thing, too. We have seen that the first experiment in village-farming took place in the Near East. So did the first experiment in civilization. Both experiments �took.� The traditions we live by today are based, ultimately, on those ancient beginnings in food-production and civilization in the Near East. WHAT �CIVILIZATION� MEANS I shall not try to define �civilization� for you; rather, I shall tell you what the word brings to my mind. To me civilization means urbanization: the fact that there are cities. It means a formal political set-up--that there are kings or governing bodies that the people have set up. It means formal laws--rules of conduct--which the government (if not the people) believes are necessary. It probably means that there are formalized projects--roads, harbors, irrigation canals, and the like--and also some sort of army or police force to protect them. It means quite new and different art forms. It also usually means there is writing. (The people of the Andes--the Incas--had everything which goes to make up a civilization but formal writing. I can see no reason to say they were not civilized.) Finally, as the late Professor Redfield reminded us, civilization seems to bring with it the dawn of a new kind of moral order. In different civilizations, there may be important differences in the way such things as the above are managed. In early civilizations, it is usual to find religion very closely tied in with government, law, and so forth. The king may also be a high priest, or he may even be thought of as a god. The laws are usually thought to have been given to the people by the gods. The temples are protected just as carefully as the other projects. CIVILIZATION IMPOSSIBLE WITHOUT FOOD-PRODUCTION Civilizations have to be made up of many people. Some of the people live in the country; some live in very large towns or cities. Classes of society have begun. There are officials and government people; there are priests or religious officials; there are merchants and traders; there are craftsmen, metal-workers, potters, builders, and so on; there are also farmers, and these are the people who produce the food for the whole population. It must be obvious that civilization cannot exist without food-production and that food-production must also be at a pretty efficient level of village-farming before civilization can even begin. But people can be food-producing without being civilized. In many parts of the world this is still the case. When the white men first came to America, the Indians in most parts of this hemisphere were food-producers. They grew corn, potatoes, tomatoes, squash, and many other things the white men had never eaten before. But only the Aztecs of Mexico, the Mayas of Yucatan and Guatemala, and the Incas of the Andes were civilized. WHY DIDN�T CIVILIZATION COME TO ALL FOOD-PRODUCERS? Once you have food-production, even at the well-advanced level of the village-farming community, what else has to happen before you get civilization? Many men have asked this question and have failed to give a full and satisfactory answer. There is probably no _one_ answer. I shall give you my own idea about how civilization _may_ have come about in the Near East alone. Remember, it is only a guess--a putting together of hunches from incomplete evidence. It is _not_ meant to explain how civilization began in any of the other areas--China, southeast Asia, the Americas--where other early experiments in civilization went on. The details in those areas are quite different. Whether certain general principles hold, for the appearance of any early civilization, is still an open and very interesting question. WHERE CIVILIZATION FIRST APPEARED IN THE NEAR EAST You remember that our earliest village-farming communities lay along the hilly flanks of a great �crescent.� (See map on p. 125.) Professor Breasted�s �fertile crescent� emphasized the rich river valleys of the Nile and the Tigris-Euphrates Rivers. Our hilly-flanks area of the crescent zone arches up from Egypt through Palestine and Syria, along southern Turkey into northern Iraq, and down along the southwestern fringe of Iran. The earliest food-producing villages we know already existed in this area by about 6750 B.C. (� 200 years). Now notice that this hilly-flanks zone does not include southern Mesopotamia, the alluvial land of the lower Tigris and Euphrates in Iraq, or the Nile Valley proper. The earliest known villages of classic Mesopotamia and Egypt seem to appear fifteen hundred or more years after those of the hilly-flanks zone. For example, the early Fayum village which lies near a lake west of the Nile Valley proper (see p. 135) has a radiocarbon date of 4275 B.C. � 320 years. It was in the river lands, however, that the immediate beginnings of civilization were made. We know that by about 3200 B.C. the Early Dynastic period had begun in southern Mesopotamia. The beginnings of writing go back several hundred years earlier, but we can safely say that civilization had begun in Mesopotamia by 3200 B.C. In Egypt, the beginning of the First Dynasty is slightly later, at about 3100 B.C., and writing probably did not appear much earlier. There is no question but that history and civilization were well under way in both Mesopotamia and Egypt by 3000 B.C.--about five thousand years ago. THE HILLY-FLANKS ZONE VERSUS THE RIVER LANDS Why did these two civilizations spring up in these two river lands which apparently were not even part of the area where the village-farming community began? Why didn�t we have the first civilizations in Palestine, Syria, north Iraq, or Iran, where we�re sure food-production had had a long time to develop? I think the probable answer gives a clue to the ways in which civilization began in Egypt and Mesopotamia. The land in the hilly flanks is of a sort which people can farm without too much trouble. There is a fairly fertile coastal strip in Palestine and Syria. There are pleasant mountain slopes, streams running out to the sea, and rain, at least in the winter months. The rain belt and the foothills of the Turkish mountains also extend to northern Iraq and on to the Iranian plateau. The Iranian plateau has its mountain valleys, streams, and some rain. These hilly flanks of the �crescent,� through most of its arc, are almost made-to-order for beginning farmers. The grassy slopes of the higher hills would be pasture for their herds and flocks. As soon as the earliest experiments with agriculture and domestic animals had been successful, a pleasant living could be made--and without too much trouble. I should add here again, that our evidence points increasingly to a climate for those times which is very little different from that for the area today. Now look at Egypt and southern Mesopotamia. Both are lands without rain, for all intents and purposes. Both are lands with rivers that have laid down very fertile soil--soil perhaps superior to that in the hilly flanks. But in both lands, the rivers are of no great aid without some control. The Nile floods its banks once a year, in late September or early October. It not only soaks the narrow fertile strip of land on either side; it lays down a fresh layer of new soil each year. Beyond the fertile strip on either side rise great cliffs, and behind them is the desert. In its natural, uncontrolled state, the yearly flood of the Nile must have caused short-lived swamps that were full of crocodiles. After a short time, the flood level would have dropped, the water and the crocodiles would have run back into the river, and the swamp plants would have become parched and dry. The Tigris and the Euphrates of Mesopotamia are less likely to flood regularly than the Nile. The Tigris has a shorter and straighter course than the Euphrates; it is also the more violent river. Its banks are high, and when the snows melt and flow into all of its tributary rivers it is swift and dangerous. The Euphrates has a much longer and more curving course and few important tributaries. Its banks are lower and it is less likely to flood dangerously. The land on either side and between the two rivers is very fertile, south of the modern city of Baghdad. Unlike the Nile Valley, neither the Tigris nor the Euphrates is flanked by cliffs. The land on either side of the rivers stretches out for miles and is not much rougher than a poor tennis court. THE RIVERS MUST BE CONTROLLED The real trick in both Egypt and Mesopotamia is to make the rivers work for you. In Egypt, this is a matter of building dikes and reservoirs that will catch and hold the Nile flood. In this way, the water is held and allowed to run off over the fields as it is needed. In Mesopotamia, it is a matter of taking advantage of natural river channels and branch channels, and of leading ditches from these onto the fields. Obviously, we can no longer find the first dikes or reservoirs of the Nile Valley, or the first canals or ditches of Mesopotamia. The same land has been lived on far too long for any traces of the first attempts to be left; or, especially in Egypt, it has been covered by the yearly deposits of silt, dropped by the river floods. But we�re pretty sure the first food-producers of Egypt and southern Mesopotamia must have made such dikes, canals, and ditches. In the first place, there can�t have been enough rain for them to grow things otherwise. In the second place, the patterns for such projects seem to have been pretty well set by historic times. CONTROL OF THE RIVERS THE BUSINESS OF EVERYONE Here, then, is a _part_ of the reason why civilization grew in Egypt and Mesopotamia first--not in Palestine, Syria, or Iran. In the latter areas, people could manage to produce their food as individuals. It wasn�t too hard; there were rain and some streams, and good pasturage for the animals even if a crop or two went wrong. In Egypt and Mesopotamia, people had to put in a much greater amount of work, and this work couldn�t be individual work. Whole villages or groups of people had to turn out to fix dikes or dig ditches. The dikes had to be repaired and the ditches carefully cleared of silt each year, or they would become useless. There also had to be hard and fast rules. The person who lived nearest the ditch or the reservoir must not be allowed to take all the water and leave none for his neighbors. It was not only a business of learning to control the rivers and of making their waters do the farmer�s work. It also meant controlling men. But once these men had managed both kinds of controls, what a wonderful yield they had! The soil was already fertile, and the silt which came in the floods and ditches kept adding fertile soil. THE GERM OF CIVILIZATION IN EGYPT AND MESOPOTAMIA This learning to work together for the common good was the real germ of the Egyptian and the Mesopotamian civilizations. The bare elements of civilization were already there: the need for a governing hand and for laws to see that the communities� work was done and that the water was justly shared. You may object that there is a sort of chicken and egg paradox in this idea. How could the people set up the rules until they had managed to get a way to live, and how could they manage to get a way to live until they had set up the rules? I think that small groups must have moved down along the mud-flats of the river banks quite early, making use of naturally favorable spots, and that the rules grew out of such cases. It would have been like the hand-in-hand growth of automobiles and paved highways in the United States. Once the rules and the know-how did get going, there must have been a constant interplay of the two. Thus, the more the crops yielded, the richer and better-fed the people would have been, and the more the population would have grown. As the population grew, more land would have needed to be flooded or irrigated, and more complex systems of dikes, reservoirs, canals, and ditches would have been built. The more complex the system, the more necessity for work on new projects and for the control of their use.... And so on.... What I have just put down for you is a guess at the manner of growth of some of the formalized systems that go to make up a civilized society. My explanation has been pointed particularly at Egypt and Mesopotamia. I have already told you that the irrigation and water-control part of it does not apply to the development of the Aztecs or the Mayas, or perhaps anybody else. But I think that a fair part of the story of Egypt and Mesopotamia must be as I�ve just told you. I am particularly anxious that you do _not_ understand me to mean that irrigation _caused_ civilization. I am sure it was not that simple at all. For, in fact, a complex and highly engineered irrigation system proper did not come until later times. Let�s say rather that the simple beginnings of irrigation allowed and in fact encouraged a great number of things in the technological, political, social, and moral realms of culture. We do not yet understand what all these things were or how they worked. But without these other aspects of culture, I do not think that urbanization and civilization itself could have come into being. THE ARCHEOLOGICAL SEQUENCE TO CIVILIZATION IN IRAQ We last spoke of the archeological materials of Iraq on page 130, where I described the village-farming community of Hassunan type. The Hassunan type villages appear in the hilly-flanks zone and in the rolling land adjacent to the Tigris in northern Iraq. It is probable that even before the Hassuna pattern of culture lived its course, a new assemblage had been established in northern Iraq and Syria. This assemblage is called Halaf, after a site high on a tributary of the Euphrates, on the Syro-Turkish border. [Illustration: SKETCH OF SELECTED ITEMS OF HALAFIAN ASSEMBLAGE BEADS AND PENDANTS POTTERY MOTIFS POTTERY] The Halafian assemblage is incompletely known. The culture it represents included a remarkably handsome painted pottery. Archeologists have tended to be so fascinated with this pottery that they have bothered little with the rest of the Halafian assemblage. We do know that strange stone-founded houses, with plans like those of the popular notion of an Eskimo igloo, were built. Like the pottery of the Samarran style, which appears as part of the Hassunan assemblage (see p. 131), the Halafian painted pottery implies great concentration and excellence of draftsmanship on the part of the people who painted it. We must mention two very interesting sites adjacent to the mud-flats of the rivers, half way down from northern Iraq to the classic alluvial Mesopotamian area. One is Baghouz on the Euphrates; the other is Samarra on the Tigris (see map, p. 125). Both these sites yield the handsome painted pottery of the style called Samarran: in fact it is Samarra which gives its name to the pottery. Neither Baghouz nor Samarra have completely Hassunan types of assemblages, and at Samarra there are a few pots of proper Halafian style. I suppose that Samarra and Baghouz give us glimpses of those early farmers who had begun to finger their way down the mud-flats of the river banks toward the fertile but yet untilled southland. CLASSIC SOUTHERN MESOPOTAMIA FIRST OCCUPIED Our next step is into the southland proper. Here, deep in the core of the mound which later became the holy Sumerian city of Eridu, Iraqi archeologists uncovered a handsome painted pottery. Pottery of the same type had been noticed earlier by German archeologists on the surface of a small mound, awash in the spring floods, near the remains of the Biblical city of Erich (Sumerian = Uruk; Arabic = Warka). This �Eridu� pottery, which is about all we have of the assemblage of the people who once produced it, may be seen as a blend of the Samarran and Halafian painted pottery styles. This may over-simplify the case, but as yet we do not have much evidence to go on. The idea does at least fit with my interpretation of the meaning of Baghouz and Samarra as way-points on the mud-flats of the rivers half way down from the north. My colleague, Robert Adams, believes that there were certainly riverine-adapted food-collectors living in lower Mesopotamia. The presence of such would explain why the Eridu assemblage is not simply the sum of the Halafian and Samarran assemblages. But the domesticated plants and animals and the basic ways of food-production must have come from the hilly-flanks country in the north. Above the basal Eridu levels, and at a number of other sites in the south, comes a full-fledged assemblage called Ubaid. Incidentally, there is an aspect of the Ubaidian assemblage in the north as well. It seems to move into place before the Halaf manifestation is finished, and to blend with it. The Ubaidian assemblage in the south is by far the more spectacular. The development of the temple has been traced at Eridu from a simple little structure to a monumental building some 62 feet long, with a pilaster-decorated fa�ade and an altar in its central chamber. There is painted Ubaidian pottery, but the style is hurried and somewhat careless and gives the _impression_ of having been a cheap mass-production means of decoration when compared with the carefully drafted styles of Samarra and Halaf. The Ubaidian people made other items of baked clay: sickles and axes of very hard-baked clay are found. The northern Ubaidian sites have yielded tools of copper, but metal tools of unquestionable Ubaidian find-spots are not yet available from the south. Clay figurines of human beings with monstrous turtle-like faces are another item in the southern Ubaidian assemblage. [Illustration: SKETCH OF SELECTED ITEMS OF UBAIDIAN ASSEMBLAGE] There is a large Ubaid cemetery at Eridu, much of it still awaiting excavation. The few skeletons so far tentatively studied reveal a completely modern type of �Mediterraneanoid�; the individuals whom the skeletons represent would undoubtedly blend perfectly into the modern population of southern Iraq. What the Ubaidian assemblage says to us is that these people had already adapted themselves and their culture to the peculiar riverine environment of classic southern Mesopotamia. For example, hard-baked clay axes will chop bundles of reeds very well, or help a mason dress his unbaked mud bricks, and there were only a few soft and pithy species of trees available. The Ubaidian levels of Eridu yield quantities of date pits; that excellent and characteristically Iraqi fruit was already in use. The excavators also found the clay model of a ship, with the stepping-point for a mast, so that Sinbad the Sailor must have had his antecedents as early as the time of Ubaid. The bones of fish, which must have flourished in the larger canals as well as in the rivers, are common in the Ubaidian levels and thereafter. THE UBAIDIAN ACHIEVEMENT On present evidence, my tendency is to see the Ubaidian assemblage in southern Iraq as the trace of a new era. I wish there were more evidence, but what we have suggests this to me. The culture of southern Ubaid soon became a culture of towns--of centrally located towns with some rural villages about them. The town had a temple and there must have been priests. These priests probably had political and economic functions as well as religious ones, if the somewhat later history of Mesopotamia may suggest a pattern for us. Presently the temple and its priesthood were possibly the focus of the market; the temple received its due, and may already have had its own lands and herds and flocks. The people of the town, undoubtedly at least in consultation with the temple administration, planned and maintained the simple irrigation ditches. As the system flourished, the community of rural farmers would have produced more than sufficient food. The tendency for specialized crafts to develop--tentative at best at the cultural level of the earlier village-farming community era--would now have been achieved, and probably many other specialists in temple administration, water control, architecture, and trade would also have appeared, as the surplus food-supply was assured. Southern Mesopotamia is not a land rich in natural resources other than its fertile soil. Stone, good wood for construction, metal, and innumerable other things would have had to be imported. Grain and dates--although both are bulky and difficult to transport--and wool and woven stuffs must have been the mediums of exchange. Over what area did the trading net-work of Ubaid extend? We start with the idea that the Ubaidian assemblage is most richly developed in the south. We assume, I think, correctly, that it represents a cultural flowering of the south. On the basis of the pottery of the still elusive �Eridu� immigrants who had first followed the rivers into alluvial Mesopotamia, we get the notion that the characteristic painted pottery style of Ubaid was developed in the southland. If this reconstruction is correct then we may watch with interest where the Ubaid pottery-painting tradition spread. We have already mentioned that there is a substantial assemblage of (and from the southern point of view, _fairly_ pure) Ubaidian material in northern Iraq. The pottery appears all along the Iranian flanks, even well east of the head of the Persian Gulf, and ends in a later and spectacular flourish in an extremely handsome painted style called the �Susa� style. Ubaidian pottery has been noted up the valleys of both of the great rivers, well north of the Iraqi and Syrian borders on the southern flanks of the Anatolian plateau. It reaches the Mediterranean Sea and the valley of the Orontes in Syria, and it may be faintly reflected in the painted style of a site called Ghassul, on the east bank of the Jordan in the Dead Sea Valley. Over this vast area--certainly in all of the great basin of the Tigris-Euphrates drainage system and its natural extensions--I believe we may lay our fingers on the traces of a peculiar way of decorating pottery, which we call Ubaidian. This cursive and even slap-dash decoration, it appears to me, was part of a new cultural tradition which arose from the adjustments which immigrant northern farmers first made to the new and challenging environment of southern Mesopotamia. But exciting as the idea of the spread of influences of the Ubaid tradition in space may be, I believe you will agree that the consequences of the growth of that tradition in southern Mesopotamia itself, as time passed, are even more important. THE WARKA PHASE IN THE SOUTH So far, there are only two radiocarbon determinations for the Ubaidian assemblage, one from Tepe Gawra in the north and one from Warka in the south. My hunch would be to use the dates 4500 to 3750 B.C., with a plus or more probably a minus factor of about two hundred years for each, as the time duration of the Ubaidian assemblage in southern Mesopotamia. Next, much to our annoyance, we have what is almost a temporary black-out. According to the system of terminology I favor, our next �assemblage� after that of Ubaid is called the _Warka_ phase, from the Arabic name for the site of Uruk or Erich. We know it only from six or seven levels in a narrow test-pit at Warka, and from an even smaller hole at another site. This �assemblage,� so far, is known only by its pottery, some of which still bears Ubaidian style painting. The characteristic Warkan pottery is unpainted, with smoothed red or gray surfaces and peculiar shapes. Unquestionably, there must be a great deal more to say about the Warkan assemblage, but someone will first have to excavate it! THE DAWN OF CIVILIZATION After our exasperation with the almost unknown Warka interlude, following the brilliant �false dawn� of Ubaid, we move next to an assemblage which yields traces of a preponderance of those elements which we noted (p. 144) as meaning civilization. This assemblage is that called _Proto-Literate_; it already contains writing. On the somewhat shaky principle that writing, however early, means history--and no longer prehistory--the assemblage is named for the historical implications of its content, and no longer after the name of the site where it was first found. Since some of the older books used site-names for this assemblage, I will tell you that the Proto-Literate includes the latter half of what used to be called the �Uruk period� _plus_ all of what used to be called the �Jemdet Nasr period.� It shows a consistent development from beginning to end. I shall, in fact, leave much of the description and the historic implications of the Proto-Literate assemblage to the conventional historians. Professor T. J. Jacobsen, reaching backward from the legends he finds in the cuneiform writings of slightly later times, can in fact tell you a more complete story of Proto-Literate culture than I can. It should be enough here if I sum up briefly what the excavated archeological evidence shows. We have yet to dig a Proto-Literate site in its entirety, but the indications are that the sites cover areas the size of small cities. In architecture, we know of large and monumental temple structures, which were built on elaborate high terraces. The plans and decoration of these temples follow the pattern set in the Ubaid phase: the chief difference is one of size. The German excavators at the site of Warka reckoned that the construction of only one of the Proto-Literate temple complexes there must have taken 1,500 men, each working a ten-hour day, five years to build. ART AND WRITING If the architecture, even in its monumental forms, can be seen to stem from Ubaidian developments, this is not so with our other evidence of Proto-Literate artistic expression. In relief and applied sculpture, in sculpture in the round, and on the engraved cylinder seals--all of which now make their appearance--several completely new artistic principles are apparent. These include the composition of subject-matter in groups, commemorative scenes, and especially the ability and apparent desire to render the human form and face. Excellent as the animals of the Franco-Cantabrian art may have been (see p. 85), and however handsome were the carefully drafted geometric designs and conventionalized figures on the pottery of the early farmers, there seems to have been, up to this time, a mental block about the drawing of the human figure and especially the human face. We do not yet know what caused this self-consciousness about picturing themselves which seems characteristic of men before the appearance of civilization. We do know that with civilization, the mental block seems to have been removed. Clay tablets bearing pictographic signs are the Proto-Literate forerunners of cuneiform writing. The earliest examples are not well understood but they seem to be �devices for making accounts and for remembering accounts.� Different from the later case in Egypt, where writing appears fully formed in the earliest examples, the development from simple pictographic signs to proper cuneiform writing may be traced, step by step, in Mesopotamia. It is most probable that the development of writing was connected with the temple and the need for keeping account of the temple�s possessions. Professor Jacobsen sees writing as a means for overcoming space, time, and the increasing complications of human affairs: �Literacy, which began with ... civilization, enhanced mightily those very tendencies in its development which characterize it as a civilization and mark it off as such from other types of culture.� [Illustration: RELIEF ON A PROTO-LITERATE STONE VASE, WARKA Unrolled drawing, with restoration suggested by figures from contemporary cylinder seals] While the new principles in art and the idea of writing are not foreshadowed in the Ubaid phase, or in what little we know of the Warkan, I do not think we need to look outside southern Mesopotamia for their beginnings. We do know something of the adjacent areas, too, and these beginnings are not there. I think we must accept them as completely new discoveries, made by the people who were developing the whole new culture pattern of classic southern Mesopotamia. Full description of the art, architecture, and writing of the Proto-Literate phase would call for many details. Men like Professor Jacobsen and Dr. Adams can give you these details much better than I can. Nor shall I do more than tell you that the common pottery of the Proto-Literate phase was so well standardized that it looks factory made. There was also some handsome painted pottery, and there were stone bowls with inlaid decoration. Well-made tools in metal had by now become fairly common, and the metallurgist was experimenting with the casting process. Signs for plows have been identified in the early pictographs, and a wheeled chariot is shown on a cylinder seal engraving. But if I were forced to a guess in the matter, I would say that the development of plows and draft-animals probably began in the Ubaid period and was another of the great innovations of that time. The Proto-Literate assemblage clearly suggests a highly developed and sophisticated culture. While perhaps not yet fully urban, it is on the threshold of urbanization. There seems to have been a very dense settlement of Proto-Literate sites in classic southern Mesopotamia, many of them newly founded on virgin soil where no earlier settlements had been. When we think for a moment of what all this implies, of the growth of an irrigation system which must have existed to allow the flourish of this culture, and of the social and political organization necessary to maintain the irrigation system, I think we will agree that at last we are dealing with civilization proper. FROM PREHISTORY TO HISTORY Now it is time for the conventional ancient historians to take over the story from me. Remember this when you read what they write. Their real base-line is with cultures ruled over by later kings and emperors, whose writings describe military campaigns and the administration of laws and fully organized trading ventures. To these historians, the Proto-Literate phase is still a simple beginning for what is to follow. If they mention the Ubaid assemblage at all--the one I was so lyrical about--it will be as some dim and fumbling step on the path to the civilized way of life. I suppose you could say that the difference in the approach is that as a prehistorian I have been looking forward or upward in time, while the historians look backward to glimpse what I�ve been describing here. My base-line was half a million years ago with a being who had little more than the capacity to make tools and fire to distinguish him from the animals about him. Thus my point of view and that of the conventional historian are bound to be different. You will need both if you want to understand all of the story of men, as they lived through time to the present. End of PREHISTORY [Illustration] You�ll doubtless easily recall your general course in ancient history: how the Sumerian dynasties of Mesopotamia were supplanted by those of Babylonia, how the Hittite kingdom appeared in Anatolian Turkey, and about the three great phases of Egyptian history. The literate kingdom of Crete arose, and by 1500 B.C. there were splendid fortified Mycenean towns on the mainland of Greece. This was the time--about the whole eastern end of the Mediterranean--of what Professor Breasted called the �first great internationalism,� with flourishing trade, international treaties, and royal marriages between Egyptians, Babylonians, and Hittites. By 1200 B.C., the whole thing had fragmented: �the peoples of the sea were restless in their isles,� and the great ancient centers in Egypt, Mesopotamia, and Anatolia were eclipsed. Numerous smaller states arose--Assyria, Phoenicia, Israel--and the Trojan war was fought. Finally Assyria became the paramount power of all the Near East, presently to be replaced by Persia. A new culture, partaking of older west Asiatic and Egyptian elements, but casting them with its own tradition into a new mould, arose in mainland Greece. I once shocked my Classical colleagues to the core by referring to Greece as �a second degree derived civilization,� but there is much truth in this. The principles of bronze- and then of iron-working, of the alphabet, and of many other elements in Greek culture were borrowed from western Asia. Our debt to the Greeks is too well known for me even to mention it, beyond recalling to you that it is to Greece we owe the beginnings of rational or empirical science and thought in general. But Greece fell in its turn to Rome, and in 55 B.C. Caesar invaded Britain. I last spoke of Britain on page 142; I had chosen it as my single example for telling you something of how the earliest farming communities were established in Europe. Now I will continue with Britain�s later prehistory, so you may sense something of the end of prehistory itself. Remember that Britain is simply a single example we select; the same thing could be done for all the other countries of Europe, and will be possible also, some day, for further Asia and Africa. Remember, too, that prehistory in most of Europe runs on for three thousand or more years _after_ conventional ancient history begins in the Near East. Britain is a good example to use in showing how prehistory ended in Europe. As we said earlier, it lies at the opposite end of Europe from the area of highest cultural achievement in those times, and should you care to read more of the story in detail, you may do so in the English language. METAL USERS REACH ENGLAND We left the story of Britain with the peoples who made three different assemblages--the Windmill Hill, the megalith-builders, and the Peterborough--making adjustments to their environments, to the original inhabitants of the island, and to each other. They had first arrived about 2500 B.C., and were simple pastoralists and hoe cultivators who lived in little village communities. Some of them planted little if any grain. By 2000 B.C., they were well settled in. Then, somewhere in the range from about 1900 to 1800 B.C., the traces of the invasion of a new series of peoples began to appear. The first newcomers are called the Beaker folk, after the name of a peculiar form of pottery they made. The beaker type of pottery seems oldest in Spain, where it occurs with great collective tombs of megalithic construction and with copper tools. But the Beaker folk who reached England seem already to have moved first from Spain(?) to the Rhineland and Holland. While in the Rhineland, and before leaving for England, the Beaker folk seem to have mixed with the local population and also with incomers from northeastern Europe whose culture included elements brought originally from the Near East by the eastern way through the steppes. This last group has also been named for a peculiar article in its assemblage; the group is called the Battle-axe folk. A few Battle-axe folk elements, including, in fact, stone battle-axes, reached England with the earliest Beaker folk,[6] coming from the Rhineland. [6] The British authors use the term �Beaker folk� to mean both archeological assemblage and human physical type. They speak of a �... tall, heavy-boned, rugged, and round-headed� strain which they take to have developed, apparently in the Rhineland, by a mixture of the original (Spanish?) beaker-makers and the northeast European battle-axe makers. However, since the science of physical anthropology is very much in flux at the moment, and since I am not able to assess the evidence for these physical types, I _do not_ use the term �folk� in this book with its usual meaning of standardized physical type. When I use �folk� here, I mean simply _the makers of a given archeological assemblage_. The difficulty only comes when assemblages are named for some item in them; it is too clumsy to make an adjective of the item and refer to a �beakerian� assemblage. The Beaker folk settled earliest in the agriculturally fertile south and east. There seem to have been several phases of Beaker folk invasions, and it is not clear whether these all came strictly from the Rhineland or Holland. We do know that their copper daggers and awls and armlets are more of Irish or Atlantic European than of Rhineland origin. A few simple habitation sites and many burials of the Beaker folk are known. They buried their dead singly, sometimes in conspicuous individual barrows with the dead warrior in his full trappings. The spectacular element in the assemblage of the Beaker folk is a group of large circular monuments with ditches and with uprights of wood or stone. These �henges� became truly monumental several hundred years later; while they were occasionally dedicated with a burial, they were not primarily tombs. The effect of the invasion of the Beaker folk seems to cut across the whole fabric of life in Britain. [Illustration: BEAKER] There was, however, a second major element in British life at this time. It shows itself in the less well understood traces of a group again called after one of the items in their catalogue, the Food-vessel folk. There are many burials in these �food-vessel� pots in northern England, Scotland, and Ireland, and the pottery itself seems to link back to that of the Peterborough assemblage. Like the earlier Peterborough people in the highland zone before them, the makers of the food-vessels seem to have been heavily involved in trade. It is quite proper to wonder whether the food-vessel pottery itself was made by local women who were married to traders who were middlemen in the transmission of Irish metal objects to north Germany and Scandinavia. The belt of high, relatively woodless country, from southwest to northeast, was already established as a natural route for inland trade. MORE INVASIONS About 1500 B.C., the situation became further complicated by the arrival of new people in the region of southern England anciently called Wessex. The traces suggest the Brittany coast of France as a source, and the people seem at first to have been a small but �heroic� group of aristocrats. Their �heroes� are buried with wealth and ceremony, surrounded by their axes and daggers of bronze, their gold ornaments, and amber and jet beads. These rich finds show that the trade-linkage these warriors patronized spread from the Baltic sources of amber to Mycenean Greece or even Egypt, as evidenced by glazed blue beads. The great visual trace of Wessex achievement is the final form of the spectacular sanctuary at Stonehenge. A wooden henge or circular monument was first made several hundred years earlier, but the site now received its great circles of stone uprights and lintels. The diameter of the surrounding ditch at Stonehenge is about 350 feet, the diameter of the inner circle of large stones is about 100 feet, and the tallest stone of the innermost horseshoe-shaped enclosure is 29 feet 8 inches high. One circle is made of blue stones which must have been transported from Pembrokeshire, 145 miles away as the crow flies. Recently, many carvings representing the profile of a standard type of bronze axe of the time, and several profiles of bronze daggers--one of which has been called Mycenean in type--have been found carved in the stones. We cannot, of course, describe the details of the religious ceremonies which must have been staged in Stonehenge, but we can certainly imagine the well-integrated and smoothly working culture which must have been necessary before such a great monument could have been built. �THIS ENGLAND� The range from 1900 to about 1400 B.C. includes the time of development of the archeological features usually called the �Early Bronze Age� in Britain. In fact, traces of the Wessex warriors persisted down to about 1200 B.C. The main regions of the island were populated, and the adjustments to the highland and lowland zones were distinct and well marked. The different aspects of the assemblages of the Beaker folk and the clearly expressed activities of the Food-vessel folk and the Wessex warriors show that Britain was already taking on her characteristic trading role, separated from the European continent but conveniently adjacent to it. The tin of Cornwall--so important in the production of good bronze--as well as the copper of the west and of Ireland, taken with the gold of Ireland and the general excellence of Irish metal work, assured Britain a trader�s place in the then known world. Contacts with the eastern Mediterranean may have been by sea, with Cornish tin as the attraction, or may have been made by the Food-vessel middlemen on their trips to the Baltic coast. There they would have encountered traders who traveled the great north-south European road, by which Baltic amber moved southward to Greece and the Levant, and ideas and things moved northward again. There was, however, the Channel between England and Europe, and this relative isolation gave some peace and also gave time for a leveling and further fusion of culture. The separate cultural traditions began to have more in common. The growing of barley, the herding of sheep and cattle, and the production of woolen garments were already features common to all Britain�s inhabitants save a few in the remote highlands, the far north, and the distant islands not yet fully touched by food-production. The �personality of Britain� was being formed. CREMATION BURIALS BEGIN Along with people of certain religious faiths, archeologists are against cremation (for other people!). Individuals to be cremated seem in past times to have been dressed in their trappings and put upon a large pyre: it takes a lot of wood and a very hot fire for a thorough cremation. When the burning had been completed, the few fragile scraps of bone and such odd beads of stone or other rare items as had resisted the great heat seem to have been whisked into a pot and the pot buried. The archeologist is left with the pot and the unsatisfactory scraps in it. Tentatively, after about 1400 B.C. and almost completely over the whole island by 1200 B.C., Britain became the scene of cremation burials in urns. We know very little of the people themselves. None of their settlements have been identified, although there is evidence that they grew barley and made enclosures for cattle. The urns used for the burials seem to have antecedents in the pottery of the Food-vessel folk, and there are some other links with earlier British traditions. In Lancashire, a wooden circle seems to have been built about a grave with cremated burials in urns. Even occasional instances of cremation may be noticed earlier in Britain, and it is not clear what, if any, connection the British cremation burials in urns have with the classic _Urnfields_ which were now beginning in the east Mediterranean and which we shall mention below. The British cremation-burial-in-urns folk survived a long time in the highland zone. In the general British scheme, they make up what is called the �Middle Bronze Age,� but in the highland zone they last until after 900 B.C. and are considered to be a specialized highland �Late Bronze Age.� In the highland zone, these later cremation-burial folk seem to have continued the older Food-vessel tradition of being middlemen in the metal market. Granting that our knowledge of this phase of British prehistory is very restricted because the cremations have left so little for the archeologist, it does not appear that the cremation-burial-urn folk can be sharply set off from their immediate predecessors. But change on a grander scale was on the way. REVERBERATIONS FROM CENTRAL EUROPE In the centuries immediately following 1000 B.C., we see with fair clarity two phases of a cultural process which must have been going on for some time. Certainly several of the invasions we have already described in this chapter were due to earlier phases of the same cultural process, but we could not see the details. [Illustration: SLASHING SWORD] Around 1200 B.C. central Europe was upset by the spread of the so-called Urnfield folk, who practiced cremation burial in urns and whom we also know to have been possessors of long, slashing swords and the horse. I told you above that we have no idea that the Urnfield folk proper were in any way connected with the people who made cremation-burial-urn cemeteries a century or so earlier in Britain. It has been supposed that the Urnfield folk themselves may have shared ideas with the people who sacked Troy. We know that the Urnfield pressure from central Europe displaced other people in northern France, and perhaps in northwestern Germany, and that this reverberated into Britain about 1000 B.C. Soon after 750 B.C., the same thing happened again. This time, the pressure from central Europe came from the Hallstatt folk who were iron tool makers: the reverberation brought people from the western Alpine region across the Channel into Britain. At first it is possible to see the separate results of these folk movements, but the developing cultures soon fused with each other and with earlier British elements. Presently there were also strains of other northern and western European pottery and traces of Urnfield practices themselves which appeared in the finished British product. I hope you will sense that I am vastly over-simplifying the details. The result seems to have been--among other things--a new kind of agricultural system. The land was marked off by ditched divisions. Rectangular fields imply the plow rather than hoe cultivation. We seem to get a picture of estate or tribal boundaries which included village communities; we find a variety of tools in bronze, and even whetstones which show that iron has been honed on them (although the scarce iron has not been found). Let me give you the picture in Professor S. Piggott�s words: �The ... Late Bronze Age of southern England was but the forerunner of the earliest Iron Age in the same region, not only in the techniques of agriculture, but almost certainly in terms of ethnic kinship ... we can with some assurance talk of the Celts ... the great early Celtic expansion of the Continent is recognized to be that of the Urnfield people.� Thus, certainly by 500 B.C., there were people in Britain, some of whose descendants we may recognize today in name or language in remote parts of Wales, Scotland, and the Hebrides. THE COMING OF IRON Iron--once the know-how of reducing it from its ore in a very hot, closed fire has been achieved--produces a far cheaper and much more efficient set of tools than does bronze. Iron tools seem first to have been made in quantity in Hittite Anatolia about 1500 B.C. In continental Europe, the earliest, so-called Hallstatt, iron-using cultures appeared in Germany soon after 750 B.C. Somewhat later, Greek and especially Etruscan exports of _objets d�art_--which moved with a flourishing trans-Alpine wine trade--influenced the Hallstatt iron-working tradition. Still later new classical motifs, together with older Hallstatt, oriental, and northern nomad motifs, gave rise to a new style in metal decoration which characterizes the so-called La T�ne phase. A few iron users reached Britain a little before 400 B.C. Not long after that, a number of allied groups appeared in southern and southeastern England. They came over the Channel from France and must have been Celts with dialects related to those already in England. A second wave of Celts arrived from the Marne district in France about 250 B.C. Finally, in the second quarter of the first century B.C., there were several groups of newcomers, some of whom were Belgae of a mixed Teutonic-Celtic confederacy of tribes in northern France and Belgium. The Belgae preceded the Romans by only a few years. HILL-FORTS AND FARMS The earliest iron-users seem to have entrenched themselves temporarily within hill-top forts, mainly in the south. Gradually, they moved inland, establishing _individual_ farm sites with extensive systems of rectangular fields. We recognize these fields by the �lynchets� or lines of soil-creep which plowing left on the slopes of hills. New crops appeared; there were now bread wheat, oats, and rye, as well as barley. At Little Woodbury, near the town of Salisbury, a farmstead has been rather completely excavated. The rustic buildings were within a palisade, the round house itself was built of wood, and there were various outbuildings and pits for the storage of grain. Weaving was done on the farm, but not blacksmithing, which must have been a specialized trade. Save for the lack of firearms, the place might almost be taken for a farmstead on the American frontier in the early 1800�s. Toward 250 B.C. there seems to have been a hasty attempt to repair the hill-forts and to build new ones, evidently in response to signs of restlessness being shown by remote relatives in France. THE SECOND PHASE Perhaps the hill-forts were not entirely effective or perhaps a compromise was reached. In any case, the newcomers from the Marne district did establish themselves, first in the southeast and then to the north and west. They brought iron with decoration of the La T�ne type and also the two-wheeled chariot. Like the Wessex warriors of over a thousand years earlier, they made �heroes�� graves, with their warriors buried in the war-chariots and dressed in full trappings. [Illustration: CELTIC BUCKLE] The metal work of these Marnian newcomers is excellent. The peculiar Celtic art style, based originally on the classic tendril motif, is colorful and virile, and fits with Greek and Roman descriptions of Celtic love of color in dress. There is a strong trace of these newcomers northward in Yorkshire, linked by Ptolemy�s description to the Parisii, doubtless part of the Celtic tribe which originally gave its name to Paris on the Seine. Near Glastonbury, in Somerset, two villages in swamps have been excavated. They seem to date toward the middle of the first century B.C., which was a troubled time in Britain. The circular houses were built on timber platforms surrounded with palisades. The preservation of antiquities by the water-logged peat of the swamp has yielded us a long catalogue of the materials of these villagers. In Scotland, which yields its first iron tools at a date of about 100 B.C., and in northern Ireland even slightly earlier, the effects of the two phases of newcomers tend especially to blend. Hill-forts, �brochs� (stone-built round towers) and a variety of other strange structures seem to appear as the new ideas develop in the comparative isolation of northern Britain. THE THIRD PHASE For the time of about the middle of the first century B.C., we again see traces of frantic hill-fort construction. This simple military architecture now took some new forms. Its multiple ramparts must reflect the use of slings as missiles, rather than spears. We probably know the reason. In 56 B.C., Julius Caesar chastised the Veneti of Brittany for outraging the dignity of Roman ambassadors. The Veneti were famous slingers, and doubtless the reverberations of escaping Veneti were felt across the Channel. The military architecture suggests that some Veneti did escape to Britain. Also, through Caesar, we learn the names of newcomers who arrived in two waves, about 75 B.C. and about 50 B.C. These were the Belgae. Now, at last, we can even begin to speak of dynasties and individuals. Some time before 55 B.C., the Catuvellauni, originally from the Marne district in France, had possessed themselves of a large part of southeastern England. They evidently sailed up the Thames and built a town of over a hundred acres in area. Here ruled Cassivellaunus, �the first man in England whose name we know,� and whose town Caesar sacked. The town sprang up elsewhere again, however. THE END OF PREHISTORY Prehistory, strictly speaking, is now over in southern Britain. Claudius� effective invasion took place in 43 A.D.; by 83 A.D., a raid had been made as far north as Aberdeen in Scotland. But by 127 A.D., Hadrian had completed his wall from the Solway to the Tyne, and the Romans settled behind it. In Scotland, Romanization can have affected the countryside very little. Professor Piggott adds that �... it is when the pressure of Romanization is relaxed by the break-up of the Dark Ages that we see again the Celtic metal-smiths handling their material with the same consummate skill as they had before the Roman Conquest, and with traditional styles that had not even then forgotten their Marnian and Belgic heritage.� In fact, many centuries go by, in Britain as well as in the rest of Europe, before the archeologist�s task is complete and the historian on his own is able to describe the ways of men in the past. BRITAIN AS A SAMPLE OF THE GENERAL COURSE OF PREHISTORY IN EUROPE In giving this very brief outline of the later prehistory of Britain, you will have noticed how often I had to refer to the European continent itself. Britain, beyond the English Channel for all of her later prehistory, had a much simpler course of events than did most of the rest of Europe in later prehistoric times. This holds, in spite of all the �invasions� and �reverberations� from the continent. Most of Europe was the scene of an even more complicated ebb and flow of cultural change, save in some of its more remote mountain valleys and peninsulas. The whole course of later prehistory in Europe is, in fact, so very complicated that there is no single good book to cover it all; certainly there is none in English. There are some good regional accounts and some good general accounts of part of the range from about 3000 B.C. to A.D. 1. I suspect that the difficulty of making a good book that covers all of its later prehistory is another aspect of what makes Europe so very complicated a continent today. The prehistoric foundations for Europe�s very complicated set of civilizations, cultures, and sub-cultures--which begin to appear as history proceeds--were in themselves very complicated. Hence, I selected the case of Britain as a single example of how prehistory ends in Europe. It could have been more complicated than we found it to be. Even in the subject matter on Britain in the chapter before the last, we did not see direct traces of the effect on Britain of the very important developments which took place in the Danubian way from the Near East. Apparently Britain was not affected. Britain received the impulses which brought copper, bronze, and iron tools from an original east Mediterranean homeland into Europe, almost at the ends of their journeys. But by the same token, they had had time en route to take on their characteristic European aspects. Some time ago, Sir Cyril Fox wrote a famous book called _The Personality of Britain_, sub-titled �Its Influence on Inhabitant and Invader in Prehistoric and Early Historic Times.� We have not gone into the post-Roman early historic period here; there are still the Anglo-Saxons and Normans to account for as well as the effects of the Romans. But what I have tried to do was to begin the story of how the personality of Britain was formed. The principles that Fox used, in trying to balance cultural and environmental factors and interrelationships would not be greatly different for other lands. Summary [Illustration] In the pages you have read so far, you have been brought through the earliest 99 per cent of the story of man�s life on this planet. I have left only 1 per cent of the story for the historians to tell. THE DRAMA OF THE PAST Men first became men when evolution had carried them to a certain point. This was the point where the eye-hand-brain co-ordination was good enough so that tools could be made. When tools began to be made according to sets of lasting habits, we know that men had appeared. This happened over a half million years ago. The stage for the play may have been as broad as all of Europe, Africa, and Asia. At least, it seems unlikely that it was only one little region that saw the beginning of the drama. Glaciers and different climates came and went, to change the settings. But the play went on in the same first act for a very long time. The men who were the players had simple roles. They had to feed themselves and protect themselves as best they could. They did this by hunting, catching, and finding food wherever they could, and by taking such protection as caves, fire, and their simple tools would give them. Before the first act was over, the last of the glaciers was melting away, and the players had added the New World to their stage. If we want a special name for the first act, we could call it _The Food-Gatherers_. There were not many climaxes in the first act, so far as we can see. But I think there may have been a few. Certainly the pace of the first act accelerated with the swing from simple gathering to more intensified collecting. The great cave art of France and Spain was probably an expression of a climax. Even the ideas of burying the dead and of the �Venus� figurines must also point to levels of human thought and activity that were over and above pure food-getting. THE SECOND ACT The second act began only about ten thousand years ago. A few of the players started it by themselves near the center of the Old World part of the stage, in the Near East. It began as a plant and animal act, but it soon became much more complicated. But the players in this one part of the stage--in the Near East--were not the only ones to start off on the second act by themselves. Other players, possibly in several places in the Far East, and certainly in the New World, also started second acts that began as plant and animal acts, and then became complicated. We can call the whole second act _The Food-Producers_. THE FIRST GREAT CLIMAX OF THE SECOND ACT In the Near East, the first marked climax of the second act happened in Mesopotamia and Egypt. The play and the players reached that great climax that we call civilization. This seems to have come less than five thousand years after the second act began. But it could never have happened in the first act at all. There is another curious thing about the first act. Many of the players didn�t know it was over and they kept on with their roles long after the second act had begun. On the edges of the stage there are today some players who are still going on with the first act. The Eskimos, and the native Australians, and certain tribes in the Amazon jungle are some of these players. They seem perfectly happy to keep on with the first act. The second act moved from climax to climax. The civilizations of Mesopotamia and Egypt were only the earliest of these climaxes. The players to the west caught the spirit of the thing, and climaxes followed there. So also did climaxes come in the Far Eastern and New World portions of the stage. The greater part of the second act should really be described to you by a historian. Although it was a very short act when compared to the first one, the climaxes complicate it a great deal. I, a prehistorian, have told you about only the first act, and the very beginning of the second. THE THIRD ACT Also, as a prehistorian I probably should not even mention the third act--it began so recently. The third act is _The Industrialization_. It is the one in which we ourselves are players. If the pace of the second act was so much faster than that of the first, the pace of the third act is terrific. The danger is that it may wear down the players completely. What sort of climaxes will the third act have, and are we already in one? You have seen by now that the acts of my play are given in terms of modes or basic patterns of human economy--ways in which people get food and protection and safety. The climaxes involve more than human economy. Economics and technological factors may be part of the climaxes, but they are not all. The climaxes may be revolutions in their own way, intellectual and social revolutions if you like. If the third act follows the pattern of the second act, a climax should come soon after the act begins. We may be due for one soon if we are not already in it. Remember the terrific pace of this third act. WHY BOTHER WITH PREHISTORY? Why do we bother about prehistory? The main reason is that we think it may point to useful ideas for the present. We are in the troublesome beginnings of the third act of the play. The beginnings of the second act may have lessons for us and give depth to our thinking. I know there are at least _some_ lessons, even in the present incomplete state of our knowledge. The players who began the second act--that of food-production--separately, in different parts of the world, were not all of one �pure race� nor did they have �pure� cultural traditions. Some apparently quite mixed Mediterraneans got off to the first start on the second act and brought it to its first two climaxes as well. Peoples of quite different physical type achieved the first climaxes in China and in the New World. In our British example of how the late prehistory of Europe worked, we listed a continuous series of �invasions� and �reverberations.� After each of these came fusion. Even though the Channel protected Britain from some of the extreme complications of the mixture and fusion of continental Europe, you can see how silly it would be to refer to a �pure� British race or a �pure� British culture. We speak of the United States as a �melting pot.� But this is nothing new. Actually, Britain and all the rest of the world have been �melting pots� at one time or another. By the time the written records of Mesopotamia and Egypt begin to turn up in number, the climaxes there are well under way. To understand the beginnings of the climaxes, and the real beginnings of the second act itself, we are thrown back on prehistoric archeology. And this is as true for China, India, Middle America, and the Andes, as it is for the Near East. There are lessons to be learned from all of man�s past, not simply lessons of how to fight battles or win peace conferences, but of how human society evolves from one stage to another. Many of these lessons can only be looked for in the prehistoric past. So far, we have only made a beginning. There is much still to do, and many gaps in the story are yet to be filled. The prehistorian�s job is to find the evidence, to fill the gaps, and to discover the lessons men have learned in the past. As I see it, this is not only an exciting but a very practical goal for which to strive. List of Books BOOKS OF GENERAL INTEREST (Chosen from a variety of the increasingly useful list of cheap paperbound books.) Childe, V. Gordon _What Happened in History._ 1954. Penguin. _Man Makes Himself._ 1955. Mentor. _The Prehistory of European Society._ 1958. Penguin. Dunn, L. C., and Dobzhansky, Th. _Heredity, Race, and Society._ 1952. Mentor. Frankfort, Henri, Frankfort, H. A., Jacobsen, Thorkild, and Wilson, John A. _Before Philosophy._ 1954. Penguin. Simpson, George G. _The Meaning of Evolution._ 1955. Mentor. Wheeler, Sir Mortimer _Archaeology from the Earth._ 1956. Penguin. GEOCHRONOLOGY AND THE ICE AGE (Two general books. Some Pleistocene geologists disagree with Zeuner�s interpretation of the dating evidence, but their points of view appear in professional journals, in articles too cumbersome to list here.) Flint, R. F. _Glacial Geology and the Pleistocene Epoch._ 1947. John Wiley and Sons. Zeuner, F. E. _Dating the Past._ 1952 (3rd ed.). Methuen and Co. FOSSIL MEN AND RACE (The points of view of physical anthropologists and human paleontologists are changing very quickly. Two of the different points of view are listed here.) Clark, W. E. Le Gros _History of the Primates._ 1956 (5th ed.). British Museum (Natural History). (Also in Phoenix edition, 1957.) Howells, W. W. _Mankind So Far._ 1944. Doubleday, Doran. GENERAL ANTHROPOLOGY (These are standard texts not absolutely up to date in every detail, or interpretative essays concerned with cultural change through time as well as in space.) Kroeber, A. L. _Anthropology._ 1948. Harcourt, Brace. Linton, Ralph _The Tree of Culture._ 1955. Alfred A. Knopf, Inc. Redfield, Robert _The Primitive World and Its Transformations._ 1953. Cornell University Press. Steward, Julian H. _Theory of Culture Change._ 1955. University of Illinois Press. White, Leslie _The Science of Culture._ 1949. Farrar, Strauss. GENERAL PREHISTORY (A sampling of the more useful and current standard works in English.) Childe, V. Gordon _The Dawn of European Civilization._ 1957. Kegan Paul, Trench, Trubner. _Prehistoric Migrations in Europe._ 1950. Instituttet for Sammenlignende Kulturforskning. Clark, Grahame _Archaeology and Society._ 1957. Harvard University Press. Clark, J. G. D. _Prehistoric Europe: The Economic Basis._ 1952. Methuen and Co. Garrod, D. A. E. _Environment, Tools, and Man._ 1946. Cambridge University Press. Movius, Hallam L., Jr. �Old World Prehistory: Paleolithic� in _Anthropology Today_. Kroeber, A. L., ed. 1953. University of Chicago Press. Oakley, Kenneth P. _Man the Tool-Maker._ 1956. British Museum (Natural History). (Also in Phoenix edition, 1957.) Piggott, Stuart _British Prehistory._ 1949. Oxford University Press. Pittioni, Richard _Die Urgeschichtlichen Grundlagen der Europ�ischen Kultur._ 1949. Deuticke. (A single book which does attempt to cover the whole range of European prehistory to ca. 1 A.D.) THE NEAR EAST Adams, Robert M. �Developmental Stages in Ancient Mesopotamia,� _in_ Steward, Julian, _et al_, _Irrigation Civilizations: A Comparative Study_. 1955. Pan American Union. Braidwood, Robert J. _The Near East and the Foundations for Civilization._ 1952. University of Oregon. Childe, V. Gordon _New Light on the Most Ancient East._ 1952. Oriental Dept., Routledge and Kegan Paul. Frankfort, Henri _The Birth of Civilization in the Near East._ 1951. University of Indiana Press. (Also in Anchor edition, 1956.) Pallis, Svend A. _The Antiquity of Iraq._ 1956. Munksgaard. Wilson, John A. _The Burden of Egypt._ 1951. University of Chicago Press. (Also in Phoenix edition, called _The Culture of Ancient Egypt_, 1956.) HOW DIGGING IS DONE Braidwood, Linda _Digging beyond the Tigris._ 1953. Schuman, New York. Wheeler, Sir Mortimer _Archaeology from the Earth._ 1954. Oxford, London. Index Abbevillian, 48; core-biface tool, 44, 48 Acheulean, 48, 60 Acheuleo-Levalloisian, 63 Acheuleo-Mousterian, 63 Adams, R. M., 106 Adzes, 45 Africa, east, 67, 89; north, 70, 89; south, 22, 25, 34, 40, 67 Agriculture, incipient, in England, 140; in Near East, 123 Ain Hanech, 48 Amber, taken from Baltic to Greece, 167 American Indians, 90, 142 Anatolia, used as route to Europe, 138 Animals, in caves, 54, 64; in cave art, 85 Antevs, Ernst, 19 Anyathian, 47 Archeological interpretation, 8 Archeology, defined, 8 Architecture, at Jarmo, 128; at Jericho, 133 Arrow, points, 94; shaft straightener, 83 Art, in caves, 84; East Spanish, 85; figurines, 84; Franco-Cantabrian, 84, 85; movable (engravings, modeling, scratchings), 83; painting, 83; sculpture, 83 Asia, western, 67 Assemblage, defined, 13, 14; European, 94; Jarmo, 129; Maglemosian, 94; Natufian, 113 Aterian, industry, 67; point, 89 Australopithecinae, 24 Australopithecine, 25, 26 Awls, 77 Axes, 62, 94 Ax-heads, 15 Azilian, 97 Aztecs, 145 Baghouz, 152 Bakun, 134 Baltic sea, 93 Banana, 107 Barley, wild, 108 Barrow, 141 Battle-axe folk, 164; assemblage, 164 Beads, 80; bone, 114 Beaker folk, 164; assemblage, 164-165 Bear, in cave art, 85; cult, 68 Belgium, 94 Belt cave, 126 Bering Strait, used as route to New World, 98 Bison, in cave art, 85 Blade, awl, 77; backed, 75; blade-core, 71; end-scraper, 77; stone, defined, 71; strangulated (notched), 76; tanged point, 76; tools, 71, 75-80, 90; tool tradition, 70 Boar, wild, in cave art, 85 Bogs, source of archeological materials, 94 Bolas, 54 Bordes, Fran�ois, 62 Borer, 77 Boskop skull, 34 Boyd, William C., 35 Bracelets, 118 Brain, development of, 24 Breadfruit, 107 Breasted, James H., 107 Brick, at Jericho, 133 Britain, 94; late prehistory, 163-175; invaders, 173 Broch, 172 Buffalo, in China, 54; killed by stampede, 86 Burials, 66, 86; in �henges,� 164; in urns, 168 Burins, 75 Burma, 90 Byblos, 134 Camel, 54 Cannibalism, 55 Cattle, wild, 85, 112; in cave art, 85; domesticated, 15; at Skara Brae, 142 Caucasoids, 34 Cave men, 29 Caves, 62; art in, 84 Celts, 170 Chariot, 160 Chicken, domestication of, 107 Chiefs, in food-gathering groups, 68 Childe, V. Gordon, 8 China, 136 Choukoutien, 28, 35 Choukoutienian, 47 Civilization, beginnings, 144, 149, 157; meaning of, 144 Clactonian, 45, 47 Clay, used in modeling, 128; baked, used for tools, 153 Club-heads, 82, 94 Colonization, in America, 142; in Europe, 142 Combe Capelle, 30 Combe Capelle-Br�nn group, 34 Commont, Victor, 51 Coon, Carlton S., 73 Copper, 134 Corn, in America, 145 Corrals for cattle, 140 �Cradle of mankind,� 136 Cremation, 167 Crete, 162 Cro-Magnon, 30, 34 Cultivation, incipient, 105, 109, 111 Culture, change, 99; characteristics, defined, 38, 49; prehistoric, 39 Danube Valley, used as route from Asia, 138 Dates, 153 Deer, 54, 96 Dog, domesticated, 96 Domestication, of animals, 100, 105, 107; of plants, 100 �Dragon teeth� fossils in China, 28 Drill, 77 Dubois, Eugene, 26 Early Dynastic Period, Mesopotamia, 147 East Spanish art, 72, 85 Egypt, 70, 126 Ehringsdorf, 31 Elephant, 54 Emiliani, Cesare, 18 Emiran flake point, 73 England, 163-168; prehistoric, 19, 40; farmers in, 140 Eoanthropus dawsoni, 29 Eoliths, 41 Erich, 152 Eridu, 152 Euphrates River, floods in, 148 Europe, cave dwellings, 58; at end of Ice Age, 93; early farmers, 140; glaciers in, 40; huts in, 86; routes into, 137-140; spread of food-production to, 136 Far East, 69, 90 Farmers, 103 Fauresmith industry, 67 Fayum, 135; radiocarbon date, 146 �Fertile Crescent,� 107, 146 Figurines, �Venus,� 84; at Jarmo, 128; at Ubaid, 153 Fire, used by Peking man, 54 First Dynasty, Egypt, 147 Fish-hooks, 80, 94 Fishing, 80; by food-producers, 122 Fish-lines, 80 Fish spears, 94 Flint industry, 127 Font�chevade, 32, 56, 58 Food-collecting, 104, 121; end of, 104 Food-gatherers, 53, 176 Food-gathering, 99, 104; in Old World, 104; stages of, 104 Food-producers, 176 Food-producing economy, 122; in America, 145; in Asia, 105 Food-producing revolution, 99, 105; causes of, 101; preconditions for, 100 Food-production, beginnings of, 99; carried to Europe, 110 Food-vessel folk, 164 �Forest folk,� 97, 98, 104, 110 Fox, Sir Cyril, 174 France, caves in, 56 Galley Hill (fossil type), 29 Garrod, D. A., 73 Gazelle, 114 Germany, 94 Ghassul, 156 Glaciers, 18, 30; destruction by, 40 Goat, wild, 108; domesticated, 128 Grain, first planted, 20 Graves, passage, 141; gallery, 141 Greece, civilization in, 163; as route to western Europe, 138; towns in, 162 Grimaldi skeletons, 34 Hackberry seeds used as food, 55 Halaf, 151; assemblage, 151 Hallstatt, tradition, 169 Hand, development of, 24, 25 Hand adzes, 46 Hand axes, 44 Harpoons, antler, 83, 94; bone, 82, 94 Hassuna, 131; assemblage, 131, 132 Heidelberg, fossil type, 28 Hill-forts, in England, 171; in Scotland, 172 Hilly flanks of Near East, 107, 108, 125, 131, 146, 147 History, beginning of, 7, 17 Hoes, 112 Holland, 164 Homo sapiens, 32 Hooton, E. A., 34 Horse, 112; wild, in cave art, 85; in China, 54 Hotu cave, 126 Houses, 122; at Jarmo, 128; at Halaf, 151 Howe, Bruce, 116 Howell, F. Clark, 30 Hunting, 93 Ice Age, in Asia, 99; beginning of, 18; glaciers in, 41; last glaciation, 93 Incas, 145 India, 90, 136 Industrialization, 178 Industry, blade-tool, 88; defined, 58; ground stone, 94 Internationalism, 162 Iran, 107, 147 Iraq, 107, 124, 127, 136, 147 Iron, introduction of, 170 Irrigation, 123, 149, 155 Italy, 138 Jacobsen, T. J., 157 Jarmo, 109, 126, 128, 130; assemblage, 129 Java, 23, 29 Java man, 26, 27, 29 Jefferson, Thomas, 11 Jericho, 119, 133 Judaidah, 134 Kafuan, 48 Kanam, 23, 36 Karim Shahir, 116-119, 124; assemblage, 116, 117 Keith, Sir Arthur, 33 Kelley, Harper, 51 Kharga, 126 Khartoum, 136 Knives, 80 Krogman, W. M., 3, 25 Lamps, 85 Land bridges in Mediterranean, 19 La T�ne phase, 170 Laurel leaf point, 78, 89 Leakey, L. S. B., 40 Le Moustier, 57 Levalloisian, 47, 61, 62 Levalloiso-Mousterian, 47, 63 Little Woodbury, 170 Magic, used by hunters, 123 Maglemosian, assemblage, 94, 95; folk, 98 Makapan, 40 Mammoth, 93; in cave art, 85 �Man-apes,� 26 Mango, 107 Mankind, age, 17 Maringer, J., 45 Markets, 155 Marston, A. T., 11 Mathiassen, T., 97 McCown, T. D., 33 Meganthropus, 26, 27, 36 Men, defined, 25; modern, 32 Merimde, 135 Mersin, 133 Metal-workers, 160, 163, 167, 172 Micoquian, 48, 60 Microliths, 87; at Jarmo, 130; �lunates,� 87; trapezoids, 87; triangles, 87 Minerals used as coloring matter, 66 Mine-shafts, 140 M�lefaat, 126, 127 Mongoloids, 29, 90 Mortars, 114, 118, 127 Mounds, how formed, 12 Mount Carmel, 11, 33, 52, 59, 64, 69, 113, 114 �Mousterian man,� 64 �Mousterian� tools, 61, 62; of Acheulean tradition, 62 Movius, H. L., 47 Natufian, animals in, 114; assemblage, 113, 114, 115; burials, 114; date of, 113 Neanderthal man, 29, 30, 31, 56 Near East, beginnings of civilization in, 20, 144; cave sites, 58; climate in Ice Age, 99; �Fertile Crescent,� 107, 146; food-production in, 99; Natufian assemblage in, 113-115; stone tools, 114 Needles, 80 Negroid, 34 New World, 90 Nile River valley, 102, 134; floods in, 148 Nuclear area, 106, 110; in Near East, 107 Obsidian, used for blade tools, 71; at Jarmo, 130 Ochre, red, with burials, 86 Oldowan, 48 Old World, 67, 70, 90; continental phases in, 18 Olorgesailie, 40, 51 Ostrich, in China, 54 Ovens, 128 Oxygen isotopes, 18 Paintings in caves, 83 Paleoanthropic man, 50 Palestine, burials, 56; cave sites, 52; types of man, 69 Parpallo, 89 Patjitanian, 45, 47 Pebble tools, 42 Peking cave, 54; animals in, 54 Peking man, 27, 28, 29, 54, 58 Pendants, 80; bone, 114 Pestle, 114 Peterborough, 141; assemblage, 141 Pictographic signs, 158 Pig, wild, 108 �Piltdown man,� 29 Pins, 80 Pithecanthropus, 26, 27, 30, 36 Pleistocene, 18, 25 Plows developed, 123 Points, arrow, 76; laurel leaf, 78; shouldered, 78, 79; split-based bone, 80, 82; tanged, 76; willow leaf, 78 Potatoes, in America, 145 Pottery, 122, 130, 156; decorated, 142; painted, 131, 151, 152; Susa style, 156; in tombs, 141 Prehistory, defined, 7; range of, 18 Pre-neanderthaloids, 30, 31, 37 Pre-Solutrean point, 89 Pre-Stellenbosch, 48 Proto-Literate assemblage, 157-160 Race, 35; biological, 36; �pure,� 16 Radioactivity, 9, 10 Radioactive carbon dates, 18, 92, 120, 130, 135, 156 Redfield, Robert, 38, 49 Reed, C. A., 128 Reindeer, 94 Rhinoceros, 93; in cave art, 85 Rhodesian man, 32 Riss glaciation, 58 Rock-shelters, 58; art in, 85 Saccopastore, 31 Sahara Desert, 34, 102 Samarra, 152; pottery, 131, 152 Sangoan industry, 67 Sauer, Carl, 136 Sbaikian point, 89 Schliemann, H., 11, 12 Scotland, 171 Scraper, flake, 79; end-scraper on blade, 77, 78; keel-shaped, 79, 80, 81 Sculpture in caves, 83 Sebilian III, 126 Shaheinab, 135 Sheep, wild, 108; at Skara Brae, 142; in China, 54 Shellfish, 142 Ship, Ubaidian, 153 Sialk, 126, 134; assemblage, 134 Siberia, 88; pathway to New World, 98 Sickle, 112, 153; blade, 113, 130 Silo, 122 Sinanthropus, 27, 30, 35 Skara Brae, 142 Snails used as food, 128 Soan, 47 Solecki, R., 116 Solo (fossil type), 29, 32 Solutrean industry, 77 Spear, shaft, 78; thrower, 82, 83 Speech, development of organs of, 25 Squash, in America, 145 Steinheim fossil skull, 28 Stillbay industry, 67 Stonehenge, 166 Stratification, in caves, 12, 57; in sites, 12 Swanscombe (fossil type), 11, 28 Syria, 107 Tabun, 60, 71 Tardenoisian, 97 Taro, 107 Tasa, 135 Tayacian, 47, 59 Teeth, pierced, in beads and pendants, 114 Temples, 123, 155 Tepe Gawra, 156 Ternafine, 29 Teshik Tash, 69 Textiles, 122 Thong-stropper, 80 Tigris River, floods in, 148 Toggle, 80 Tomatoes, in America, 145 Tombs, megalithic, 141 Tool-making, 42, 49 Tool-preparation traditions, 65 Tools, 62; antler, 80; blade, 70, 71, 75; bone, 66; chopper, 47; core-biface, 43, 48, 60, 61; flake, 44, 47, 51, 60, 64; flint, 80, 127; ground stone, 68, 127; handles, 94; pebble, 42, 43, 48, 53; use of, 24 Touf (mud wall), 128 Toynbee, A. J., 101 Trade, 130, 155, 162 Traders, 167 Traditions, 15; blade tool, 70; definition of, 51; interpretation of, 49; tool-making, 42, 48; chopper-tool, 47; chopper-chopping tool, 45; core-biface, 43, 48; flake, 44, 47; pebble tool, 42, 48 Tool-making, prehistory of, 42 Turkey, 107, 108 Ubaid, 153; assemblage, 153-155 Urnfields, 168, 169 Village-farming community era, 105, 119 Wad B, 72 Wadjak, 34 Warka phase, 156; assemblage, 156 Washburn, Sherwood L., 36 Water buffalo, domestication of, 107 Weidenreich, F., 29, 34 Wessex, 166, 167 Wheat, wild, 108; partially domesticated, 127 Willow leaf point, 78 Windmill Hill, 138; assemblage, 138, 140 Witch doctors, 68 Wool, 112; in garments, 167 Writing, 158; cuneiform, 158 W�rm I glaciation, 58 Zebu cattle, domestication of, 107 Zeuner, F. E., 73 * * * * * * Transcriber�s note: Punctuation, hyphenation, and spelling were made consistent when a predominant preference was found in this book; otherwise they were not changed. Simple typographical errors were corrected; occasional unbalanced quotation marks retained. Ambiguous hyphens at the ends of lines were retained. Index not checked for proper alphabetization or correct page references. In the original book, chapter headings were accompanied by illustrations, sometimes above, sometimes below, and sometimes adjacent. In this eBook those ilustrations always appear below the headings. ***END OF THE PROJECT GUTENBERG EBOOK PREHISTORIC MEN*** ******* This file should be named 52664-0.txt or 52664-0.zip ******* This and all associated files of various formats will be found in: http://www.gutenberg.org/dirs/5/2/6/6/52664 Updated editions will replace the previous one--the old editions will be renamed. Creating the works from print editions not protected by U.S. copyright law means that no one owns a United States copyright in these works, so the Foundation (and you!) can copy and distribute it in the United States without permission and without paying copyright royalties. Special rules, set forth in the General Terms of Use part of this license, apply to copying and distributing Project Gutenberg-tm electronic works to protect the PROJECT GUTENBERG-tm concept and trademark. Project Gutenberg is a registered trademark, and may not be used if you charge for the eBooks, unless you receive specific permission. If you do not charge anything for copies of this eBook, complying with the rules is very easy. You may use this eBook for nearly any purpose such as creation of derivative works, reports, performances and research. They may be modified and printed and given away--you may do practically ANYTHING in the United States with eBooks not protected by U.S. copyright law. Redistribution is subject to the trademark license, especially commercial redistribution. START: FULL LICENSE THE FULL PROJECT GUTENBERG LICENSE PLEASE READ THIS BEFORE YOU DISTRIBUTE OR USE THIS WORK To protect the Project Gutenberg-tm mission of promoting the free distribution of electronic works, by using or distributing this work (or any other work associated in any way with the phrase "Project Gutenberg"), you agree to comply with all the terms of the Full Project Gutenberg-tm License available with this file or online at www.gutenberg.org/license. Section 1. General Terms of Use and Redistributing Project Gutenberg-tm electronic works 1.A. By reading or using any part of this Project Gutenberg-tm electronic work, you indicate that you have read, understand, agree to and accept all the terms of this license and intellectual property (trademark/copyright) agreement. If you do not agree to abide by all the terms of this agreement, you must cease using and return or destroy all copies of Project Gutenberg-tm electronic works in your possession. If you paid a fee for obtaining a copy of or access to a Project Gutenberg-tm electronic work and you do not agree to be bound by the terms of this agreement, you may obtain a refund from the person or entity to whom you paid the fee as set forth in paragraph 1.E.8. 1.B. "Project Gutenberg" is a registered trademark. It may only be used on or associated in any way with an electronic work by people who agree to be bound by the terms of this agreement. There are a few things that you can do with most Project Gutenberg-tm electronic works even without complying with the full terms of this agreement. See paragraph 1.C below. There are a lot of things you can do with Project Gutenberg-tm electronic works if you follow the terms of this agreement and help preserve free future access to Project Gutenberg-tm electronic works. See paragraph 1.E below. 1.C. The Project Gutenberg Literary Archive Foundation ("the Foundation" or PGLAF), owns a compilation copyright in the collection of Project Gutenberg-tm electronic works. Nearly all the individual works in the collection are in the public domain in the United States. If an individual work is unprotected by copyright law in the United States and you are located in the United States, we do not claim a right to prevent you from copying, distributing, performing, displaying or creating derivative works based on the work as long as all references to Project Gutenberg are removed. Of course, we hope that you will support the Project Gutenberg-tm mission of promoting free access to electronic works by freely sharing Project Gutenberg-tm works in compliance with the terms of this agreement for keeping the Project Gutenberg-tm name associated with the work. You can easily comply with the terms of this agreement by keeping this work in the same format with its attached full Project Gutenberg-tm License when you share it without charge with others. 1.D. The copyright laws of the place where you are located also govern what you can do with this work. Copyright laws in most countries are in a constant state of change. If you are outside the United States, check the laws of your country in addition to the terms of this agreement before downloading, copying, displaying, performing, distributing or creating derivative works based on this work or any other Project Gutenberg-tm work. The Foundation makes no representations concerning the copyright status of any work in any country outside the United States. 1.E. Unless you have removed all references to Project Gutenberg: 1.E.1. The following sentence, with active links to, or other immediate access to, the full Project Gutenberg-tm License must appear prominently whenever any copy of a Project Gutenberg-tm work (any work on which the phrase "Project Gutenberg" appears, or with which the phrase "Project Gutenberg" is associated) is accessed, displayed, performed, viewed, copied or distributed: This eBook is for the use of anyone anywhere in the United States and most other parts of the world at no cost and with almost no restrictions whatsoever. You may copy it, give it away or re-use it under the terms of the Project Gutenberg License included with this eBook or online at www.gutenberg.org. If you are not located in the United States, you'll have to check the laws of the country where you are located before using this ebook. 1.E.2. If an individual Project Gutenberg-tm electronic work is derived from texts not protected by U.S. copyright law (does not contain a notice indicating that it is posted with permission of the copyright holder), the work can be copied and distributed to anyone in the United States without paying any fees or charges. If you are redistributing or providing access to a work with the phrase "Project Gutenberg" associated with or appearing on the work, you must comply either with the requirements of paragraphs 1.E.1 through 1.E.7 or obtain permission for the use of the work and the Project Gutenberg-tm trademark as set forth in paragraphs 1.E.8 or 1.E.9. 1.E.3. If an individual Project Gutenberg-tm electronic work is posted with the permission of the copyright holder, your use and distribution must comply with both paragraphs 1.E.1 through 1.E.7 and any additional terms imposed by the copyright holder. Additional terms will be linked to the Project Gutenberg-tm License for all works posted with the permission of the copyright holder found at the beginning of this work. 1.E.4. Do not unlink or detach or remove the full Project Gutenberg-tm License terms from this work, or any files containing a part of this work or any other work associated with Project Gutenberg-tm. 1.E.5. Do not copy, display, perform, distribute or redistribute this electronic work, or any part of this electronic work, without prominently displaying the sentence set forth in paragraph 1.E.1 with active links or immediate access to the full terms of the Project Gutenberg-tm License. 1.E.6. You may convert to and distribute this work in any binary, compressed, marked up, nonproprietary or proprietary form, including any word processing or hypertext form. However, if you provide access to or distribute copies of a Project Gutenberg-tm work in a format other than "Plain Vanilla ASCII" or other format used in the official version posted on the official Project Gutenberg-tm web site (www.gutenberg.org), you must, at no additional cost, fee or expense to the user, provide a copy, a means of exporting a copy, or a means of obtaining a copy upon request, of the work in its original "Plain Vanilla ASCII" or other form. Any alternate format must include the full Project Gutenberg-tm License as specified in paragraph 1.E.1. 1.E.7. Do not charge a fee for access to, viewing, displaying, performing, copying or distributing any Project Gutenberg-tm works unless you comply with paragraph 1.E.8 or 1.E.9. 1.E.8. You may charge a reasonable fee for copies of or providing access to or distributing Project Gutenberg-tm electronic works provided that * You pay a royalty fee of 20% of the gross profits you derive from the use of Project Gutenberg-tm works calculated using the method you already use to calculate your applicable taxes. The fee is owed to the owner of the Project Gutenberg-tm trademark, but he has agreed to donate royalties under this paragraph to the Project Gutenberg Literary Archive Foundation. Royalty payments must be paid within 60 days following each date on which you prepare (or are legally required to prepare) your periodic tax returns. Royalty payments should be clearly marked as such and sent to the Project Gutenberg Literary Archive Foundation at the address specified in Section 4, "Information about donations to the Project Gutenberg Literary Archive Foundation." * You provide a full refund of any money paid by a user who notifies you in writing (or by e-mail) within 30 days of receipt that s/he does not agree to the terms of the full Project Gutenberg-tm License. You must require such a user to return or destroy all copies of the works possessed in a physical medium and discontinue all use of and all access to other copies of Project Gutenberg-tm works. * You provide, in accordance with paragraph 1.F.3, a full refund of any money paid for a work or a replacement copy, if a defect in the electronic work is discovered and reported to you within 90 days of receipt of the work. * You comply with all other terms of this agreement for free distribution of Project Gutenberg-tm works. 1.E.9. If you wish to charge a fee or distribute a Project Gutenberg-tm electronic work or group of works on different terms than are set forth in this agreement, you must obtain permission in writing from both the Project Gutenberg Literary Archive Foundation and The Project Gutenberg Trademark LLC, the owner of the Project Gutenberg-tm trademark. Contact the Foundation as set forth in Section 3 below. 1.F. 1.F.1. Project Gutenberg volunteers and employees expend considerable effort to identify, do copyright research on, transcribe and proofread works not protected by U.S. copyright law in creating the Project Gutenberg-tm collection. Despite these efforts, Project Gutenberg-tm electronic works, and the medium on which they may be stored, may contain "Defects," such as, but not limited to, incomplete, inaccurate or corrupt data, transcription errors, a copyright or other intellectual property infringement, a defective or damaged disk or other medium, a computer virus, or computer codes that damage or cannot be read by your equipment. 1.F.2. LIMITED WARRANTY, DISCLAIMER OF DAMAGES - Except for the "Right of Replacement or Refund" described in paragraph 1.F.3, the Project Gutenberg Literary Archive Foundation, the owner of the Project Gutenberg-tm trademark, and any other party distributing a Project Gutenberg-tm electronic work under this agreement, disclaim all liability to you for damages, costs and expenses, including legal fees. YOU AGREE THAT YOU HAVE NO REMEDIES FOR NEGLIGENCE, STRICT LIABILITY, BREACH OF WARRANTY OR BREACH OF CONTRACT EXCEPT THOSE PROVIDED IN PARAGRAPH 1.F.3. YOU AGREE THAT THE FOUNDATION, THE TRADEMARK OWNER, AND ANY DISTRIBUTOR UNDER THIS AGREEMENT WILL NOT BE LIABLE TO YOU FOR ACTUAL, DIRECT, INDIRECT, CONSEQUENTIAL, PUNITIVE OR INCIDENTAL DAMAGES EVEN IF YOU GIVE NOTICE OF THE POSSIBILITY OF SUCH DAMAGE. 1.F.3. LIMITED RIGHT OF REPLACEMENT OR REFUND - If you discover a defect in this electronic work within 90 days of receiving it, you can receive a refund of the money (if any) you paid for it by sending a written explanation to the person you received the work from. If you received the work on a physical medium, you must return the medium with your written explanation. The person or entity that provided you with the defective work may elect to provide a replacement copy in lieu of a refund. If you received the work electronically, the person or entity providing it to you may choose to give you a second opportunity to receive the work electronically in lieu of a refund. If the second copy is also defective, you may demand a refund in writing without further opportunities to fix the problem. 1.F.4. Except for the limited right of replacement or refund set forth in paragraph 1.F.3, this work is provided to you 'AS-IS', WITH NO OTHER WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PURPOSE. 1.F.5. Some states do not allow disclaimers of certain implied warranties or the exclusion or limitation of certain types of damages. If any disclaimer or limitation set forth in this agreement violates the law of the state applicable to this agreement, the agreement shall be interpreted to make the maximum disclaimer or limitation permitted by the applicable state law. The invalidity or unenforceability of any provision of this agreement shall not void the remaining provisions. 1.F.6. INDEMNITY - You agree to indemnify and hold the Foundation, the trademark owner, any agent or employee of the Foundation, anyone providing copies of Project Gutenberg-tm electronic works in accordance with this agreement, and any volunteers associated with the production, promotion and distribution of Project Gutenberg-tm electronic works, harmless from all liability, costs and expenses, including legal fees, that arise directly or indirectly from any of the following which you do or cause to occur: (a) distribution of this or any Project Gutenberg-tm work, (b) alteration, modification, or additions or deletions to any Project Gutenberg-tm work, and (c) any Defect you cause. Section 2. Information about the Mission of Project Gutenberg-tm Project Gutenberg-tm is synonymous with the free distribution of electronic works in formats readable by the widest variety of computers including obsolete, old, middle-aged and new computers. It exists because of the efforts of hundreds of volunteers and donations from people in all walks of life. Volunteers and financial support to provide volunteers with the assistance they need are critical to reaching Project Gutenberg-tm's goals and ensuring that the Project Gutenberg-tm collection will remain freely available for generations to come. In 2001, the Project Gutenberg Literary Archive Foundation was created to provide a secure and permanent future for Project Gutenberg-tm and future generations. To learn more about the Project Gutenberg Literary Archive Foundation and how your efforts and donations can help, see Sections 3 and 4 and the Foundation information page at www.gutenberg.org Section 3. Information about the Project Gutenberg Literary Archive Foundation The Project Gutenberg Literary Archive Foundation is a non profit 501(c)(3) educational corporation organized under the laws of the state of Mississippi and granted tax exempt status by the Internal Revenue Service. The Foundation's EIN or federal tax identification number is 64-6221541. Contributions to the Project Gutenberg Literary Archive Foundation are tax deductible to the full extent permitted by U.S. federal laws and your state's laws. The Foundation's principal office is in Fairbanks, Alaska, with the mailing address: PO Box 750175, Fairbanks, AK 99775, but its volunteers and employees are scattered throughout numerous locations. Its business office is located at 809 North 1500 West, Salt Lake City, UT 84116, (801) 596-1887. Email contact links and up to date contact information can be found at the Foundation's web site and official page at www.gutenberg.org/contact For additional contact information: Dr. Gregory B. Newby Chief Executive and Director gbnewby@pglaf.org Section 4. Information about Donations to the Project Gutenberg Literary Archive Foundation Project Gutenberg-tm depends upon and cannot survive without wide spread public support and donations to carry out its mission of increasing the number of public domain and licensed works that can be freely distributed in machine readable form accessible by the widest array of equipment including outdated equipment. Many small donations ($1 to $5,000) are particularly important to maintaining tax exempt status with the IRS. The Foundation is committed to complying with the laws regulating charities and charitable donations in all 50 states of the United States. Compliance requirements are not uniform and it takes a considerable effort, much paperwork and many fees to meet and keep up with these requirements. We do not solicit donations in locations where we have not received written confirmation of compliance. To SEND DONATIONS or determine the status of compliance for any particular state visit www.gutenberg.org/donate While we cannot and do not solicit contributions from states where we have not met the solicitation requirements, we know of no prohibition against accepting unsolicited donations from donors in such states who approach us with offers to donate. International donations are gratefully accepted, but we cannot make any statements concerning tax treatment of donations received from outside the United States. U.S. laws alone swamp our small staff. Please check the Project Gutenberg Web pages for current donation methods and addresses. Donations are accepted in a number of other ways including checks, online payments and credit card donations. To donate, please visit: www.gutenberg.org/donate Section 5. General Information About Project Gutenberg-tm electronic works. Professor Michael S. Hart was the originator of the Project Gutenberg-tm concept of a library of electronic works that could be freely shared with anyone. For forty years, he produced and distributed Project Gutenberg-tm eBooks with only a loose network of volunteer support. Project Gutenberg-tm eBooks are often created from several printed editions, all of which are confirmed as not protected by copyright in the U.S. unless a copyright notice is included. Thus, we do not necessarily keep eBooks in compliance with any particular paper edition. Most people start at our Web site which has the main PG search facility: www.gutenberg.org This Web site includes information about Project Gutenberg-tm, including how to make donations to the Project Gutenberg Literary Archive Foundation, how to help produce our new eBooks, and how to subscribe to our email newsletter to hear about new eBooks. ================================================ FILE: ciphers/rabin_miller.py ================================================ # Primality Testing with the Rabin-Miller Algorithm import random def rabin_miller(num: int) -> bool: s = num - 1 t = 0 while s % 2 == 0: s = s // 2 t += 1 for _ in range(5): a = random.randrange(2, num - 1) v = pow(a, s, num) if v != 1: i = 0 while v != (num - 1): if i == t - 1: return False else: i = i + 1 v = (v**2) % num return True def is_prime_low_num(num: int) -> bool: if num < 2: return False low_primes = [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, ] if num in low_primes: return True for prime in low_primes: if (num % prime) == 0: return False return rabin_miller(num) def generate_large_prime(keysize: int = 1024) -> int: while True: num = random.randrange(2 ** (keysize - 1), 2 ** (keysize)) if is_prime_low_num(num): return num if __name__ == "__main__": num = generate_large_prime() print(("Prime number:", num)) print(("is_prime_low_num:", is_prime_low_num(num))) ================================================ FILE: ciphers/rail_fence_cipher.py ================================================ """https://en.wikipedia.org/wiki/Rail_fence_cipher""" def encrypt(input_string: str, key: int) -> str: """ Shuffles the character of a string by placing each of them in a grid (the height is dependent on the key) in a zigzag formation and reading it left to right. >>> encrypt("Hello World", 4) 'HWe olordll' >>> encrypt("This is a message", 0) Traceback (most recent call last): ... ValueError: Height of grid can't be 0 or negative >>> encrypt(b"This is a byte string", 5) Traceback (most recent call last): ... TypeError: sequence item 0: expected str instance, int found """ temp_grid: list[list[str]] = [[] for _ in range(key)] lowest = key - 1 if key <= 0: raise ValueError("Height of grid can't be 0 or negative") if key == 1 or len(input_string) <= key: return input_string for position, character in enumerate(input_string): num = position % (lowest * 2) # puts it in bounds num = min(num, lowest * 2 - num) # creates zigzag pattern temp_grid[num].append(character) grid = ["".join(row) for row in temp_grid] output_string = "".join(grid) return output_string def decrypt(input_string: str, key: int) -> str: """ Generates a template based on the key and fills it in with the characters of the input string and then reading it in a zigzag formation. >>> decrypt("HWe olordll", 4) 'Hello World' >>> decrypt("This is a message", -10) Traceback (most recent call last): ... ValueError: Height of grid can't be 0 or negative >>> decrypt("My key is very big", 100) 'My key is very big' """ grid = [] lowest = key - 1 if key <= 0: raise ValueError("Height of grid can't be 0 or negative") if key == 1: return input_string temp_grid: list[list[str]] = [[] for _ in range(key)] # generates template for position in range(len(input_string)): num = position % (lowest * 2) # puts it in bounds num = min(num, lowest * 2 - num) # creates zigzag pattern temp_grid[num].append("*") counter = 0 for row in temp_grid: # fills in the characters splice = input_string[counter : counter + len(row)] grid.append(list(splice)) counter += len(row) output_string = "" # reads as zigzag for position in range(len(input_string)): num = position % (lowest * 2) # puts it in bounds num = min(num, lowest * 2 - num) # creates zigzag pattern output_string += grid[num][0] grid[num].pop(0) return output_string def bruteforce(input_string: str) -> dict[int, str]: """Uses decrypt function by guessing every key >>> bruteforce("HWe olordll")[4] 'Hello World' """ results = {} for key_guess in range(1, len(input_string)): # tries every key results[key_guess] = decrypt(input_string, key_guess) return results if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: ciphers/rot13.py ================================================ def dencrypt(s: str, n: int = 13) -> str: """ https://en.wikipedia.org/wiki/ROT13 >>> msg = "My secret bank account number is 173-52946 so don't tell anyone!!" >>> s = dencrypt(msg) >>> s "Zl frperg onax nppbhag ahzore vf 173-52946 fb qba'g gryy nalbar!!" >>> dencrypt(s) == msg True """ out = "" for c in s: if "A" <= c <= "Z": out += chr(ord("A") + (ord(c) - ord("A") + n) % 26) elif "a" <= c <= "z": out += chr(ord("a") + (ord(c) - ord("a") + n) % 26) else: out += c return out def main() -> None: s0 = input("Enter message: ") s1 = dencrypt(s0, 13) print("Encryption:", s1) s2 = dencrypt(s1, 13) print("Decryption: ", s2) if __name__ == "__main__": import doctest doctest.testmod() main() ================================================ FILE: ciphers/rsa_cipher.py ================================================ import os import sys from . import rsa_key_generator as rkg DEFAULT_BLOCK_SIZE = 128 BYTE_SIZE = 256 def get_blocks_from_text( message: str, block_size: int = DEFAULT_BLOCK_SIZE ) -> list[int]: message_bytes = message.encode("ascii") block_ints = [] for block_start in range(0, len(message_bytes), block_size): block_int = 0 for i in range(block_start, min(block_start + block_size, len(message_bytes))): block_int += message_bytes[i] * (BYTE_SIZE ** (i % block_size)) block_ints.append(block_int) return block_ints def get_text_from_blocks( block_ints: list[int], message_length: int, block_size: int = DEFAULT_BLOCK_SIZE ) -> str: message: list[str] = [] for block_int in block_ints: block_message: list[str] = [] for i in range(block_size - 1, -1, -1): if len(message) + i < message_length: ascii_number = block_int // (BYTE_SIZE**i) block_int = block_int % (BYTE_SIZE**i) block_message.insert(0, chr(ascii_number)) message.extend(block_message) return "".join(message) def encrypt_message( message: str, key: tuple[int, int], block_size: int = DEFAULT_BLOCK_SIZE ) -> list[int]: encrypted_blocks = [] n, e = key for block in get_blocks_from_text(message, block_size): encrypted_blocks.append(pow(block, e, n)) return encrypted_blocks def decrypt_message( encrypted_blocks: list[int], message_length: int, key: tuple[int, int], block_size: int = DEFAULT_BLOCK_SIZE, ) -> str: decrypted_blocks = [] n, d = key for block in encrypted_blocks: decrypted_blocks.append(pow(block, d, n)) return get_text_from_blocks(decrypted_blocks, message_length, block_size) def read_key_file(key_filename: str) -> tuple[int, int, int]: with open(key_filename) as fo: content = fo.read() key_size, n, eor_d = content.split(",") return (int(key_size), int(n), int(eor_d)) def encrypt_and_write_to_file( message_filename: str, key_filename: str, message: str, block_size: int = DEFAULT_BLOCK_SIZE, ) -> str: key_size, n, e = read_key_file(key_filename) if key_size < block_size * 8: sys.exit( f"ERROR: Block size is {block_size * 8} bits and key size is {key_size} " "bits. The RSA cipher requires the block size to be equal to or greater " "than the key size. Either decrease the block size or use different keys." ) encrypted_blocks = [str(i) for i in encrypt_message(message, (n, e), block_size)] encrypted_content = ",".join(encrypted_blocks) encrypted_content = f"{len(message)}_{block_size}_{encrypted_content}" with open(message_filename, "w") as fo: fo.write(encrypted_content) return encrypted_content def read_from_file_and_decrypt(message_filename: str, key_filename: str) -> str: key_size, n, d = read_key_file(key_filename) with open(message_filename) as fo: content = fo.read() message_length_str, block_size_str, encrypted_message = content.split("_") message_length = int(message_length_str) block_size = int(block_size_str) if key_size < block_size * 8: sys.exit( f"ERROR: Block size is {block_size * 8} bits and key size is {key_size} " "bits. The RSA cipher requires the block size to be equal to or greater " "than the key size. Were the correct key file and encrypted file specified?" ) encrypted_blocks = [] for block in encrypted_message.split(","): encrypted_blocks.append(int(block)) return decrypt_message(encrypted_blocks, message_length, (n, d), block_size) def main() -> None: filename = "encrypted_file.txt" response = input(r"Encrypt\Decrypt [e\d]: ") if response.lower().startswith("e"): mode = "encrypt" elif response.lower().startswith("d"): mode = "decrypt" if mode == "encrypt": if not os.path.exists("rsa_pubkey.txt"): rkg.make_key_files("rsa", 1024) message = input("\nEnter message: ") pubkey_filename = "rsa_pubkey.txt" print(f"Encrypting and writing to {filename}...") encrypted_text = encrypt_and_write_to_file(filename, pubkey_filename, message) print("\nEncrypted text:") print(encrypted_text) elif mode == "decrypt": privkey_filename = "rsa_privkey.txt" print(f"Reading from {filename} and decrypting...") decrypted_text = read_from_file_and_decrypt(filename, privkey_filename) print("writing decryption to rsa_decryption.txt...") with open("rsa_decryption.txt", "w") as dec: dec.write(decrypted_text) print("\nDecryption:") print(decrypted_text) if __name__ == "__main__": main() ================================================ FILE: ciphers/rsa_factorization.py ================================================ """ An RSA prime factor algorithm. The program can efficiently factor RSA prime number given the private key d and public key e. | Source: on page ``3`` of https://crypto.stanford.edu/~dabo/papers/RSA-survey.pdf | More readable source: https://www.di-mgt.com.au/rsa_factorize_n.html large number can take minutes to factor, therefore are not included in doctest. """ from __future__ import annotations import math import random def rsafactor(d: int, e: int, n: int) -> list[int]: """ This function returns the factors of N, where p*q=N Return: [p, q] We call N the RSA modulus, e the encryption exponent, and d the decryption exponent. The pair (N, e) is the public key. As its name suggests, it is public and is used to encrypt messages. The pair (N, d) is the secret key or private key and is known only to the recipient of encrypted messages. >>> rsafactor(3, 16971, 25777) [149, 173] >>> rsafactor(7331, 11, 27233) [113, 241] >>> rsafactor(4021, 13, 17711) [89, 199] """ k = d * e - 1 p = 0 q = 0 while p == 0: g = random.randint(2, n - 1) t = k while True: if t % 2 == 0: t = t // 2 x = (g**t) % n y = math.gcd(x - 1, n) if x > 1 and y > 1: p = y q = n // y break # find the correct factors else: break # t is not divisible by 2, break and choose another g return sorted([p, q]) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: ciphers/rsa_key_generator.py ================================================ import os import random import sys from maths.greatest_common_divisor import gcd_by_iterative from . import cryptomath_module, rabin_miller def main() -> None: print("Making key files...") make_key_files("rsa", 1024) print("Key files generation successful.") def generate_key(key_size: int) -> tuple[tuple[int, int], tuple[int, int]]: """ >>> random.seed(0) # for repeatability >>> public_key, private_key = generate_key(8) >>> public_key (26569, 239) >>> private_key (26569, 2855) """ p = rabin_miller.generate_large_prime(key_size) q = rabin_miller.generate_large_prime(key_size) n = p * q # Generate e that is relatively prime to (p - 1) * (q - 1) while True: e = random.randrange(2 ** (key_size - 1), 2 ** (key_size)) if gcd_by_iterative(e, (p - 1) * (q - 1)) == 1: break # Calculate d that is mod inverse of e d = cryptomath_module.find_mod_inverse(e, (p - 1) * (q - 1)) public_key = (n, e) private_key = (n, d) return (public_key, private_key) def make_key_files(name: str, key_size: int) -> None: if os.path.exists(f"{name}_pubkey.txt") or os.path.exists(f"{name}_privkey.txt"): print("\nWARNING:") print( f'"{name}_pubkey.txt" or "{name}_privkey.txt" already exists. \n' "Use a different name or delete these files and re-run this program." ) sys.exit() public_key, private_key = generate_key(key_size) print(f"\nWriting public key to file {name}_pubkey.txt...") with open(f"{name}_pubkey.txt", "w") as out_file: out_file.write(f"{key_size},{public_key[0]},{public_key[1]}") print(f"Writing private key to file {name}_privkey.txt...") with open(f"{name}_privkey.txt", "w") as out_file: out_file.write(f"{key_size},{private_key[0]},{private_key[1]}") if __name__ == "__main__": main() ================================================ FILE: ciphers/running_key_cipher.py ================================================ """ https://en.wikipedia.org/wiki/Running_key_cipher """ def running_key_encrypt(key: str, plaintext: str) -> str: """ Encrypts the plaintext using the Running Key Cipher. :param key: The running key (long piece of text). :param plaintext: The plaintext to be encrypted. :return: The ciphertext. """ plaintext = plaintext.replace(" ", "").upper() key = key.replace(" ", "").upper() key_length = len(key) ciphertext = [] ord_a = ord("A") for i, char in enumerate(plaintext): p = ord(char) - ord_a k = ord(key[i % key_length]) - ord_a c = (p + k) % 26 ciphertext.append(chr(c + ord_a)) return "".join(ciphertext) def running_key_decrypt(key: str, ciphertext: str) -> str: """ Decrypts the ciphertext using the Running Key Cipher. :param key: The running key (long piece of text). :param ciphertext: The ciphertext to be decrypted. :return: The plaintext. """ ciphertext = ciphertext.replace(" ", "").upper() key = key.replace(" ", "").upper() key_length = len(key) plaintext = [] ord_a = ord("A") for i, char in enumerate(ciphertext): c = ord(char) - ord_a k = ord(key[i % key_length]) - ord_a p = (c - k) % 26 plaintext.append(chr(p + ord_a)) return "".join(plaintext) def test_running_key_encrypt() -> None: """ >>> key = "How does the duck know that? said Victor" >>> ciphertext = running_key_encrypt(key, "DEFEND THIS") >>> running_key_decrypt(key, ciphertext) == "DEFENDTHIS" True """ if __name__ == "__main__": import doctest doctest.testmod() test_running_key_encrypt() plaintext = input("Enter the plaintext: ").upper() print(f"\n{plaintext = }") key = "How does the duck know that? said Victor" encrypted_text = running_key_encrypt(key, plaintext) print(f"{encrypted_text = }") decrypted_text = running_key_decrypt(key, encrypted_text) print(f"{decrypted_text = }") ================================================ FILE: ciphers/shuffled_shift_cipher.py ================================================ from __future__ import annotations import random import string class ShuffledShiftCipher: """ This algorithm uses the Caesar Cipher algorithm but removes the option to use brute force to decrypt the message. The passcode is a random password from the selection buffer of 1. uppercase letters of the English alphabet 2. lowercase letters of the English alphabet 3. digits from 0 to 9 Using unique characters from the passcode, the normal list of characters, that can be allowed in the plaintext, is pivoted and shuffled. Refer to docstring of __make_key_list() to learn more about the shuffling. Then, using the passcode, a number is calculated which is used to encrypt the plaintext message with the normal shift cipher method, only in this case, the reference, to look back at while decrypting, is shuffled. Each cipher object can possess an optional argument as passcode, without which a new passcode is generated for that object automatically. cip1 = ShuffledShiftCipher('d4usr9TWxw9wMD') cip2 = ShuffledShiftCipher() """ def __init__(self, passcode: str | None = None) -> None: """ Initializes a cipher object with a passcode as it's entity Note: No new passcode is generated if user provides a passcode while creating the object """ self.__passcode = passcode or self.__passcode_creator() self.__key_list = self.__make_key_list() self.__shift_key = self.__make_shift_key() def __str__(self) -> str: """ :return: passcode of the cipher object """ return "".join(self.__passcode) def __neg_pos(self, iterlist: list[int]) -> list[int]: """ Mutates the list by changing the sign of each alternate element :param iterlist: takes a list iterable :return: the mutated list """ for i in range(1, len(iterlist), 2): iterlist[i] *= -1 return iterlist def __passcode_creator(self) -> list[str]: """ Creates a random password from the selection buffer of 1. uppercase letters of the English alphabet 2. lowercase letters of the English alphabet 3. digits from 0 to 9 :rtype: list :return: a password of a random length between 10 to 20 """ choices = string.ascii_letters + string.digits password = [random.choice(choices) for _ in range(random.randint(10, 20))] return password def __make_key_list(self) -> list[str]: """ Shuffles the ordered character choices by pivoting at breakpoints Breakpoints are the set of characters in the passcode eg: if, ABCDEFGHIJKLMNOPQRSTUVWXYZ are the possible characters and CAMERA is the passcode then, breakpoints = [A,C,E,M,R] # sorted set of characters from passcode shuffled parts: [A,CB,ED,MLKJIHGF,RQPON,ZYXWVUTS] shuffled __key_list : ACBEDMLKJIHGFRQPONZYXWVUTS Shuffling only 26 letters of the english alphabet can generate 26! combinations for the shuffled list. In the program we consider, a set of 97 characters (including letters, digits, punctuation and whitespaces), thereby creating a possibility of 97! combinations (which is a 152 digit number in itself), thus diminishing the possibility of a brute force approach. Moreover, shift keys even introduce a multiple of 26 for a brute force approach for each of the already 97! combinations. """ # key_list_options contain nearly all printable except few elements from # string.whitespace key_list_options = ( string.ascii_letters + string.digits + string.punctuation + " \t\n" ) keys_l = [] # creates points known as breakpoints to break the key_list_options at those # points and pivot each substring breakpoints = sorted(set(self.__passcode)) temp_list: list[str] = [] # algorithm for creating a new shuffled list, keys_l, out of key_list_options for i in key_list_options: temp_list.extend(i) # checking breakpoints at which to pivot temporary sublist and add it into # keys_l if i in breakpoints or i == key_list_options[-1]: keys_l.extend(temp_list[::-1]) temp_list.clear() # returning a shuffled keys_l to prevent brute force guessing of shift key return keys_l def __make_shift_key(self) -> int: """ sum() of the mutated list of ascii values of all characters where the mutated list is the one returned by __neg_pos() """ num = sum(self.__neg_pos([ord(x) for x in self.__passcode])) return num if num > 0 else len(self.__passcode) def decrypt(self, encoded_message: str) -> str: """ Performs shifting of the encoded_message w.r.t. the shuffled __key_list to create the decoded_message >>> ssc = ShuffledShiftCipher('4PYIXyqeQZr44') >>> ssc.decrypt("d>**-1z6&'5z'5z:z+-='$'>=zp:>5:#z<'.&>#") 'Hello, this is a modified Caesar cipher' """ decoded_message = "" # decoding shift like Caesar cipher algorithm implementing negative shift or # reverse shift or left shift for i in encoded_message: position = self.__key_list.index(i) decoded_message += self.__key_list[ (position - self.__shift_key) % -len(self.__key_list) ] return decoded_message def encrypt(self, plaintext: str) -> str: """ Performs shifting of the plaintext w.r.t. the shuffled __key_list to create the encoded_message >>> ssc = ShuffledShiftCipher('4PYIXyqeQZr44') >>> ssc.encrypt('Hello, this is a modified Caesar cipher') "d>**-1z6&'5z'5z:z+-='$'>=zp:>5:#z<'.&>#" """ encoded_message = "" # encoding shift like Caesar cipher algorithm implementing positive shift or # forward shift or right shift for i in plaintext: position = self.__key_list.index(i) encoded_message += self.__key_list[ (position + self.__shift_key) % len(self.__key_list) ] return encoded_message def test_end_to_end(msg: str = "Hello, this is a modified Caesar cipher") -> str: """ >>> test_end_to_end() 'Hello, this is a modified Caesar cipher' """ cip1 = ShuffledShiftCipher() return cip1.decrypt(cip1.encrypt(msg)) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: ciphers/simple_keyword_cypher.py ================================================ def remove_duplicates(key: str) -> str: """ Removes duplicate alphabetic characters in a keyword (letter is ignored after its first appearance). :param key: Keyword to use :return: String with duplicates removed >>> remove_duplicates('Hello World!!') 'Helo Wrd' """ key_no_dups = "" for ch in key: if ch == " " or (ch not in key_no_dups and ch.isalpha()): key_no_dups += ch return key_no_dups def create_cipher_map(key: str) -> dict[str, str]: """ Returns a cipher map given a keyword. :param key: keyword to use :return: dictionary cipher map """ # Create a list of the letters in the alphabet alphabet = [chr(i + 65) for i in range(26)] # Remove duplicate characters from key key = remove_duplicates(key.upper()) offset = len(key) # First fill cipher with key characters cipher_alphabet = {alphabet[i]: char for i, char in enumerate(key)} # Then map remaining characters in alphabet to # the alphabet from the beginning for i in range(len(cipher_alphabet), 26): char = alphabet[i - offset] # Ensure we are not mapping letters to letters previously mapped while char in key: offset -= 1 char = alphabet[i - offset] cipher_alphabet[alphabet[i]] = char return cipher_alphabet def encipher(message: str, cipher_map: dict[str, str]) -> str: """ Enciphers a message given a cipher map. :param message: Message to encipher :param cipher_map: Cipher map :return: enciphered string >>> encipher('Hello World!!', create_cipher_map('Goodbye!!')) 'CYJJM VMQJB!!' """ return "".join(cipher_map.get(ch, ch) for ch in message.upper()) def decipher(message: str, cipher_map: dict[str, str]) -> str: """ Deciphers a message given a cipher map :param message: Message to decipher :param cipher_map: Dictionary mapping to use :return: Deciphered string >>> cipher_map = create_cipher_map('Goodbye!!') >>> decipher(encipher('Hello World!!', cipher_map), cipher_map) 'HELLO WORLD!!' """ # Reverse our cipher mappings rev_cipher_map = {v: k for k, v in cipher_map.items()} return "".join(rev_cipher_map.get(ch, ch) for ch in message.upper()) def main() -> None: """ Handles I/O :return: void """ message = input("Enter message to encode or decode: ").strip() key = input("Enter keyword: ").strip() option = input("Encipher or decipher? E/D:").strip()[0].lower() try: func = {"e": encipher, "d": decipher}[option] except KeyError: raise KeyError("invalid input option") cipher_map = create_cipher_map(key) print(func(message, cipher_map)) if __name__ == "__main__": import doctest doctest.testmod() main() ================================================ FILE: ciphers/simple_substitution_cipher.py ================================================ import random import sys LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" def main() -> None: message = input("Enter message: ") key = "LFWOAYUISVKMNXPBDCRJTQEGHZ" resp = input("Encrypt/Decrypt [e/d]: ") check_valid_key(key) if resp.lower().startswith("e"): mode = "encrypt" translated = encrypt_message(key, message) elif resp.lower().startswith("d"): mode = "decrypt" translated = decrypt_message(key, message) print(f"\n{mode.title()}ion: \n{translated}") def check_valid_key(key: str) -> None: key_list = list(key) letters_list = list(LETTERS) key_list.sort() letters_list.sort() if key_list != letters_list: sys.exit("Error in the key or symbol set.") def encrypt_message(key: str, message: str) -> str: """ >>> encrypt_message('LFWOAYUISVKMNXPBDCRJTQEGHZ', 'Harshil Darji') 'Ilcrism Olcvs' """ return translate_message(key, message, "encrypt") def decrypt_message(key: str, message: str) -> str: """ >>> decrypt_message('LFWOAYUISVKMNXPBDCRJTQEGHZ', 'Ilcrism Olcvs') 'Harshil Darji' """ return translate_message(key, message, "decrypt") def translate_message(key: str, message: str, mode: str) -> str: translated = "" chars_a = LETTERS chars_b = key if mode == "decrypt": chars_a, chars_b = chars_b, chars_a for symbol in message: if symbol.upper() in chars_a: sym_index = chars_a.find(symbol.upper()) if symbol.isupper(): translated += chars_b[sym_index].upper() else: translated += chars_b[sym_index].lower() else: translated += symbol return translated def get_random_key() -> str: key = list(LETTERS) random.shuffle(key) return "".join(key) if __name__ == "__main__": main() ================================================ FILE: ciphers/transposition_cipher.py ================================================ import math """ In cryptography, the TRANSPOSITION cipher is a method of encryption where the positions of plaintext are shifted a certain number(determined by the key) that follows a regular system that results in the permuted text, known as the encrypted text. The type of transposition cipher demonstrated under is the ROUTE cipher. """ def main() -> None: message = input("Enter message: ") key = int(input(f"Enter key [2-{len(message) - 1}]: ")) mode = input("Encryption/Decryption [e/d]: ") if mode.lower().startswith("e"): text = encrypt_message(key, message) elif mode.lower().startswith("d"): text = decrypt_message(key, message) # Append pipe symbol (vertical bar) to identify spaces at the end. print(f"Output:\n{text + '|'}") def encrypt_message(key: int, message: str) -> str: """ >>> encrypt_message(6, 'Harshil Darji') 'Hlia rDsahrij' """ cipher_text = [""] * key for col in range(key): pointer = col while pointer < len(message): cipher_text[col] += message[pointer] pointer += key return "".join(cipher_text) def decrypt_message(key: int, message: str) -> str: """ >>> decrypt_message(6, 'Hlia rDsahrij') 'Harshil Darji' """ num_cols = math.ceil(len(message) / key) num_rows = key num_shaded_boxes = (num_cols * num_rows) - len(message) plain_text = [""] * num_cols col = 0 row = 0 for symbol in message: plain_text[col] += symbol col += 1 if (col == num_cols) or ( (col == num_cols - 1) and (row >= num_rows - num_shaded_boxes) ): col = 0 row += 1 return "".join(plain_text) if __name__ == "__main__": import doctest doctest.testmod() main() ================================================ FILE: ciphers/transposition_cipher_encrypt_decrypt_file.py ================================================ import os import sys import time from . import transposition_cipher as trans_cipher def main() -> None: input_file = "./prehistoric_men.txt" output_file = "./Output.txt" key = int(input("Enter key: ")) mode = input("Encrypt/Decrypt [e/d]: ") if not os.path.exists(input_file): print(f"File {input_file} does not exist. Quitting...") sys.exit() if os.path.exists(output_file): print(f"Overwrite {output_file}? [y/n]") response = input("> ") if not response.lower().startswith("y"): sys.exit() start_time = time.time() if mode.lower().startswith("e"): with open(input_file) as f: content = f.read() translated = trans_cipher.encrypt_message(key, content) elif mode.lower().startswith("d"): with open(output_file) as f: content = f.read() translated = trans_cipher.decrypt_message(key, content) with open(output_file, "w") as output_obj: output_obj.write(translated) total_time = round(time.time() - start_time, 2) print(("Done (", total_time, "seconds )")) if __name__ == "__main__": main() ================================================ FILE: ciphers/trifid_cipher.py ================================================ """ The trifid cipher uses a table to fractionate each plaintext letter into a trigram, mixes the constituents of the trigrams, and then applies the table in reverse to turn these mixed trigrams into ciphertext letters. https://en.wikipedia.org/wiki/Trifid_cipher """ from __future__ import annotations # fmt: off TEST_CHARACTER_TO_NUMBER = { "A": "111", "B": "112", "C": "113", "D": "121", "E": "122", "F": "123", "G": "131", "H": "132", "I": "133", "J": "211", "K": "212", "L": "213", "M": "221", "N": "222", "O": "223", "P": "231", "Q": "232", "R": "233", "S": "311", "T": "312", "U": "313", "V": "321", "W": "322", "X": "323", "Y": "331", "Z": "332", "+": "333", } # fmt: off TEST_NUMBER_TO_CHARACTER = {val: key for key, val in TEST_CHARACTER_TO_NUMBER.items()} def __encrypt_part(message_part: str, character_to_number: dict[str, str]) -> str: """ Arrange the triagram value of each letter of `message_part` vertically and join them horizontally. >>> __encrypt_part('ASK', TEST_CHARACTER_TO_NUMBER) '132111112' """ one, two, three = "", "", "" for each in (character_to_number[character] for character in message_part): one += each[0] two += each[1] three += each[2] return one + two + three def __decrypt_part( message_part: str, character_to_number: dict[str, str] ) -> tuple[str, str, str]: """ Convert each letter of the input string into their respective trigram values, join them and split them into three equal groups of strings which are returned. >>> __decrypt_part('ABCDE', TEST_CHARACTER_TO_NUMBER) ('11111', '21131', '21122') """ this_part = "".join(character_to_number[character] for character in message_part) result = [] tmp = "" for digit in this_part: tmp += digit if len(tmp) == len(message_part): result.append(tmp) tmp = "" return result[0], result[1], result[2] def __prepare( message: str, alphabet: str ) -> tuple[str, str, dict[str, str], dict[str, str]]: """ A helper function that generates the triagrams and assigns each letter of the alphabet to its corresponding triagram and stores this in a dictionary (`character_to_number` and `number_to_character`) after confirming if the alphabet's length is ``27``. >>> test = __prepare('I aM a BOy','abCdeFghijkLmnopqrStuVwxYZ+') >>> expected = ('IAMABOY','ABCDEFGHIJKLMNOPQRSTUVWXYZ+', ... TEST_CHARACTER_TO_NUMBER, TEST_NUMBER_TO_CHARACTER) >>> test == expected True Testing with incomplete alphabet >>> __prepare('I aM a BOy','abCdeFghijkLmnopqrStuVw') Traceback (most recent call last): ... KeyError: 'Length of alphabet has to be 27.' Testing with extra long alphabets >>> __prepare('I aM a BOy','abCdeFghijkLmnopqrStuVwxyzzwwtyyujjgfd') Traceback (most recent call last): ... KeyError: 'Length of alphabet has to be 27.' Testing with punctuation not in the given alphabet >>> __prepare('am i a boy?','abCdeFghijkLmnopqrStuVwxYZ+') Traceback (most recent call last): ... ValueError: Each message character has to be included in alphabet! Testing with numbers >>> __prepare(500,'abCdeFghijkLmnopqrStuVwxYZ+') Traceback (most recent call last): ... AttributeError: 'int' object has no attribute 'replace' """ # Validate message and alphabet, set to upper and remove spaces alphabet = alphabet.replace(" ", "").upper() message = message.replace(" ", "").upper() # Check length and characters if len(alphabet) != 27: raise KeyError("Length of alphabet has to be 27.") if any(char not in alphabet for char in message): raise ValueError("Each message character has to be included in alphabet!") # Generate dictionares character_to_number = dict(zip(alphabet, TEST_CHARACTER_TO_NUMBER.values())) number_to_character = { number: letter for letter, number in character_to_number.items() } return message, alphabet, character_to_number, number_to_character def encrypt_message( message: str, alphabet: str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ.", period: int = 5 ) -> str: """ encrypt_message =============== Encrypts a message using the trifid_cipher. Any punctuatuion chars that would be used should be added to the alphabet. PARAMETERS ---------- * `message`: The message you want to encrypt. * `alphabet` (optional): The characters to be used for the cipher . * `period` (optional): The number of characters you want in a group whilst encrypting. >>> encrypt_message('I am a boy') 'BCDGBQY' >>> encrypt_message(' ') '' >>> encrypt_message(' aide toi le c iel ta id era ', ... 'FELIXMARDSTBCGHJKNOPQUVWYZ+',5) 'FMJFVOISSUFTFPUFEQQC' """ message, alphabet, character_to_number, number_to_character = __prepare( message, alphabet ) encrypted_numeric = "" for i in range(0, len(message) + 1, period): encrypted_numeric += __encrypt_part( message[i : i + period], character_to_number ) encrypted = "" for i in range(0, len(encrypted_numeric), 3): encrypted += number_to_character[encrypted_numeric[i : i + 3]] return encrypted def decrypt_message( message: str, alphabet: str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ.", period: int = 5 ) -> str: """ decrypt_message =============== Decrypts a trifid_cipher encrypted message. PARAMETERS ---------- * `message`: The message you want to decrypt. * `alphabet` (optional): The characters used for the cipher. * `period` (optional): The number of characters used in grouping when it was encrypted. >>> decrypt_message('BCDGBQY') 'IAMABOY' Decrypting with your own alphabet and period >>> decrypt_message('FMJFVOISSUFTFPUFEQQC','FELIXMARDSTBCGHJKNOPQUVWYZ+',5) 'AIDETOILECIELTAIDERA' """ message, alphabet, character_to_number, number_to_character = __prepare( message, alphabet ) decrypted_numeric = [] for i in range(0, len(message), period): a, b, c = __decrypt_part(message[i : i + period], character_to_number) for j in range(len(a)): decrypted_numeric.append(a[j] + b[j] + c[j]) return "".join(number_to_character[each] for each in decrypted_numeric) if __name__ == "__main__": import doctest doctest.testmod() msg = "DEFEND THE EAST WALL OF THE CASTLE." encrypted = encrypt_message(msg, "EPSDUCVWYM.ZLKXNBTFGORIJHAQ") decrypted = decrypt_message(encrypted, "EPSDUCVWYM.ZLKXNBTFGORIJHAQ") print(f"Encrypted: {encrypted}\nDecrypted: {decrypted}") ================================================ FILE: ciphers/vernam_cipher.py ================================================ def vernam_encrypt(plaintext: str, key: str) -> str: """ >>> vernam_encrypt("HELLO","KEY") 'RIJVS' """ ciphertext = "" for i in range(len(plaintext)): ct = ord(key[i % len(key)]) - 65 + ord(plaintext[i]) - 65 while ct > 25: ct = ct - 26 ciphertext += chr(65 + ct) return ciphertext def vernam_decrypt(ciphertext: str, key: str) -> str: """ >>> vernam_decrypt("RIJVS","KEY") 'HELLO' """ decrypted_text = "" for i in range(len(ciphertext)): ct = ord(ciphertext[i]) - ord(key[i % len(key)]) while ct < 0: ct = 26 + ct decrypted_text += chr(65 + ct) return decrypted_text if __name__ == "__main__": from doctest import testmod testmod() # Example usage plaintext = "HELLO" key = "KEY" encrypted_text = vernam_encrypt(plaintext, key) decrypted_text = vernam_decrypt(encrypted_text, key) print("\n\n") print("Plaintext:", plaintext) print("Encrypted:", encrypted_text) print("Decrypted:", decrypted_text) ================================================ FILE: ciphers/vigenere_cipher.py ================================================ LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" def main() -> None: message = input("Enter message: ") key = input("Enter key [alphanumeric]: ") mode = input("Encrypt/Decrypt [e/d]: ") if mode.lower().startswith("e"): mode = "encrypt" translated = encrypt_message(key, message) elif mode.lower().startswith("d"): mode = "decrypt" translated = decrypt_message(key, message) print(f"\n{mode.title()}ed message:") print(translated) def encrypt_message(key: str, message: str) -> str: """ >>> encrypt_message('HDarji', 'This is Harshil Darji from Dharmaj.') 'Akij ra Odrjqqs Gaisq muod Mphumrs.' """ return translate_message(key, message, "encrypt") def decrypt_message(key: str, message: str) -> str: """ >>> decrypt_message('HDarji', 'Akij ra Odrjqqs Gaisq muod Mphumrs.') 'This is Harshil Darji from Dharmaj.' """ return translate_message(key, message, "decrypt") def translate_message(key: str, message: str, mode: str) -> str: translated = [] key_index = 0 key = key.upper() for symbol in message: num = LETTERS.find(symbol.upper()) if num != -1: if mode == "encrypt": num += LETTERS.find(key[key_index]) elif mode == "decrypt": num -= LETTERS.find(key[key_index]) num %= len(LETTERS) if symbol.isupper(): translated.append(LETTERS[num]) elif symbol.islower(): translated.append(LETTERS[num].lower()) key_index += 1 if key_index == len(key): key_index = 0 else: translated.append(symbol) return "".join(translated) if __name__ == "__main__": main() ================================================ FILE: ciphers/xor_cipher.py ================================================ """ author: Christian Bender date: 21.12.2017 class: XORCipher This class implements the XOR-cipher algorithm and provides some useful methods for encrypting and decrypting strings and files. Overview about methods - encrypt : list of char - decrypt : list of char - encrypt_string : str - decrypt_string : str - encrypt_file : boolean - decrypt_file : boolean """ from __future__ import annotations class XORCipher: def __init__(self, key: int = 0): """ simple constructor that receives a key or uses default key = 0 """ # private field self.__key = key def encrypt(self, content: str, key: int) -> list[str]: """ input: 'content' of type string and 'key' of type int output: encrypted string 'content' as a list of chars if key not passed the method uses the key by the constructor. otherwise key = 1 Empty list >>> XORCipher().encrypt("", 5) [] One key >>> XORCipher().encrypt("hallo welt", 1) ['i', '`', 'm', 'm', 'n', '!', 'v', 'd', 'm', 'u'] Normal key >>> XORCipher().encrypt("HALLO WELT", 32) ['h', 'a', 'l', 'l', 'o', '\\x00', 'w', 'e', 'l', 't'] Key greater than 255 >>> XORCipher().encrypt("hallo welt", 256) ['h', 'a', 'l', 'l', 'o', ' ', 'w', 'e', 'l', 't'] """ # precondition assert isinstance(key, int) assert isinstance(content, str) key = key or self.__key or 1 # make sure key is an appropriate size key %= 256 return [chr(ord(ch) ^ key) for ch in content] def decrypt(self, content: str, key: int) -> list[str]: """ input: 'content' of type list and 'key' of type int output: decrypted string 'content' as a list of chars if key not passed the method uses the key by the constructor. otherwise key = 1 Empty list >>> XORCipher().decrypt("", 5) [] One key >>> XORCipher().decrypt("hallo welt", 1) ['i', '`', 'm', 'm', 'n', '!', 'v', 'd', 'm', 'u'] Normal key >>> XORCipher().decrypt("HALLO WELT", 32) ['h', 'a', 'l', 'l', 'o', '\\x00', 'w', 'e', 'l', 't'] Key greater than 255 >>> XORCipher().decrypt("hallo welt", 256) ['h', 'a', 'l', 'l', 'o', ' ', 'w', 'e', 'l', 't'] """ # precondition assert isinstance(key, int) assert isinstance(content, str) key = key or self.__key or 1 # make sure key is an appropriate size key %= 256 return [chr(ord(ch) ^ key) for ch in content] def encrypt_string(self, content: str, key: int = 0) -> str: """ input: 'content' of type string and 'key' of type int output: encrypted string 'content' if key not passed the method uses the key by the constructor. otherwise key = 1 Empty list >>> XORCipher().encrypt_string("", 5) '' One key >>> XORCipher().encrypt_string("hallo welt", 1) 'i`mmn!vdmu' Normal key >>> XORCipher().encrypt_string("HALLO WELT", 32) 'hallo\\x00welt' Key greater than 255 >>> XORCipher().encrypt_string("hallo welt", 256) 'hallo welt' """ # precondition assert isinstance(key, int) assert isinstance(content, str) key = key or self.__key or 1 # make sure key is an appropriate size key %= 256 # This will be returned ans = "" for ch in content: ans += chr(ord(ch) ^ key) return ans def decrypt_string(self, content: str, key: int = 0) -> str: """ input: 'content' of type string and 'key' of type int output: decrypted string 'content' if key not passed the method uses the key by the constructor. otherwise key = 1 Empty list >>> XORCipher().decrypt_string("", 5) '' One key >>> XORCipher().decrypt_string("hallo welt", 1) 'i`mmn!vdmu' Normal key >>> XORCipher().decrypt_string("HALLO WELT", 32) 'hallo\\x00welt' Key greater than 255 >>> XORCipher().decrypt_string("hallo welt", 256) 'hallo welt' """ # precondition assert isinstance(key, int) assert isinstance(content, str) key = key or self.__key or 1 # make sure key is an appropriate size key %= 256 # This will be returned ans = "" for ch in content: ans += chr(ord(ch) ^ key) return ans def encrypt_file(self, file: str, key: int = 0) -> bool: """ input: filename (str) and a key (int) output: returns true if encrypt process was successful otherwise false if key not passed the method uses the key by the constructor. otherwise key = 1 """ # precondition assert isinstance(file, str) assert isinstance(key, int) # make sure key is an appropriate size key %= 256 try: with open(file) as fin, open("encrypt.out", "w+") as fout: # actual encrypt-process for line in fin: fout.write(self.encrypt_string(line, key)) except OSError: return False return True def decrypt_file(self, file: str, key: int) -> bool: """ input: filename (str) and a key (int) output: returns true if decrypt process was successful otherwise false if key not passed the method uses the key by the constructor. otherwise key = 1 """ # precondition assert isinstance(file, str) assert isinstance(key, int) # make sure key is an appropriate size key %= 256 try: with open(file) as fin, open("decrypt.out", "w+") as fout: # actual encrypt-process for line in fin: fout.write(self.decrypt_string(line, key)) except OSError: return False return True if __name__ == "__main__": from doctest import testmod testmod() # Tests # crypt = XORCipher() # key = 67 # # test encrypt # print(crypt.encrypt("hallo welt",key)) # # test decrypt # print(crypt.decrypt(crypt.encrypt("hallo welt",key), key)) # # test encrypt_string # print(crypt.encrypt_string("hallo welt",key)) # # test decrypt_string # print(crypt.decrypt_string(crypt.encrypt_string("hallo welt",key),key)) # if (crypt.encrypt_file("test.txt",key)): # print("encrypt successful") # else: # print("encrypt unsuccessful") # if (crypt.decrypt_file("encrypt.out",key)): # print("decrypt successful") # else: # print("decrypt unsuccessful") ================================================ FILE: computer_vision/README.md ================================================ # Computer Vision Computer vision is a field of computer science that works on enabling computers to see, identify and process images in the same way that human does, and provide appropriate output. It is like imparting human intelligence and instincts to a computer. Image processing and computer vision are a little different from each other. Image processing means applying some algorithms for transforming image from one form to the other like smoothing, contrasting, stretching, etc. While computer vision comes from modelling image processing using the techniques of machine learning, computer vision applies machine learning to recognize patterns for interpretation of images (much like the process of visual reasoning of human vision). * ================================================ FILE: computer_vision/__init__.py ================================================ ================================================ FILE: computer_vision/cnn_classification.py ================================================ """ Convolutional Neural Network Objective : To train a CNN model detect if TB is present in Lung X-ray or not. Resources CNN Theory : https://en.wikipedia.org/wiki/Convolutional_neural_network Resources Tensorflow : https://www.tensorflow.org/tutorials/images/cnn Download dataset from : https://lhncbc.nlm.nih.gov/LHC-publications/pubs/TuberculosisChestXrayImageDataSets.html 1. Download the dataset folder and create two folder training set and test set in the parent dataset folder 2. Move 30-40 image from both TB positive and TB Negative folder in the test set folder 3. The labels of the images will be extracted from the folder name the image is present in. """ # Part 1 - Building the CNN import numpy as np # Importing the Keras libraries and packages import tensorflow as tf from keras import layers, models if __name__ == "__main__": # Initialising the CNN # (Sequential- Building the model layer by layer) classifier = models.Sequential() # Step 1 - Convolution # Here 64,64 is the length & breadth of dataset images and 3 is for the RGB channel # (3,3) is the kernel size (filter matrix) classifier.add( layers.Conv2D(32, (3, 3), input_shape=(64, 64, 3), activation="relu") ) # Step 2 - Pooling classifier.add(layers.MaxPooling2D(pool_size=(2, 2))) # Adding a second convolutional layer classifier.add(layers.Conv2D(32, (3, 3), activation="relu")) classifier.add(layers.MaxPooling2D(pool_size=(2, 2))) # Step 3 - Flattening classifier.add(layers.Flatten()) # Step 4 - Full connection classifier.add(layers.Dense(units=128, activation="relu")) classifier.add(layers.Dense(units=1, activation="sigmoid")) # Compiling the CNN classifier.compile( optimizer="adam", loss="binary_crossentropy", metrics=["accuracy"] ) # Part 2 - Fitting the CNN to the images # Load Trained model weights # from keras.models import load_model # regressor=load_model('cnn.h5') train_datagen = tf.keras.preprocessing.image.ImageDataGenerator( rescale=1.0 / 255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True ) test_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1.0 / 255) training_set = train_datagen.flow_from_directory( "dataset/training_set", target_size=(64, 64), batch_size=32, class_mode="binary" ) test_set = test_datagen.flow_from_directory( "dataset/test_set", target_size=(64, 64), batch_size=32, class_mode="binary" ) classifier.fit_generator( training_set, steps_per_epoch=5, epochs=30, validation_data=test_set ) classifier.save("cnn.h5") # Part 3 - Making new predictions test_image = tf.keras.preprocessing.image.load_img( "dataset/single_prediction/image.png", target_size=(64, 64) ) test_image = tf.keras.preprocessing.image.img_to_array(test_image) test_image = np.expand_dims(test_image, axis=0) result = classifier.predict(test_image) # training_set.class_indices if result[0][0] == 0: prediction = "Normal" if result[0][0] == 1: prediction = "Abnormality detected" ================================================ FILE: computer_vision/flip_augmentation.py ================================================ import glob import os import random from string import ascii_lowercase, digits import cv2 """ Flip image and bounding box for computer vision task https://paperswithcode.com/method/randomhorizontalflip """ # Params LABEL_DIR = "" IMAGE_DIR = "" OUTPUT_DIR = "" FLIP_TYPE = 1 # (0 is vertical, 1 is horizontal) def main() -> None: """ Get images list and annotations list from input dir. Update new images and annotations. Save images and annotations in output dir. """ img_paths, annos = get_dataset(LABEL_DIR, IMAGE_DIR) print("Processing...") new_images, new_annos, paths = update_image_and_anno(img_paths, annos, FLIP_TYPE) for index, image in enumerate(new_images): # Get random string code: '7b7ad245cdff75241935e4dd860f3bad' letter_code = random_chars(32) file_name = paths[index].split(os.sep)[-1].rsplit(".", 1)[0] file_root = f"{OUTPUT_DIR}/{file_name}_FLIP_{letter_code}" cv2.imwrite(f"{file_root}.jpg", image, [cv2.IMWRITE_JPEG_QUALITY, 85]) print(f"Success {index + 1}/{len(new_images)} with {file_name}") annos_list = [] for anno in new_annos[index]: obj = f"{anno[0]} {anno[1]} {anno[2]} {anno[3]} {anno[4]}" annos_list.append(obj) with open(f"{file_root}.txt", "w") as outfile: outfile.write("\n".join(line for line in annos_list)) def get_dataset(label_dir: str, img_dir: str) -> tuple[list, list]: """ - label_dir : Path to label include annotation of images - img_dir : Path to folder contain images Return : List of images path and labels """ img_paths = [] labels = [] for label_file in glob.glob(os.path.join(label_dir, "*.txt")): label_name = label_file.split(os.sep)[-1].rsplit(".", 1)[0] with open(label_file) as in_file: obj_lists = in_file.readlines() img_path = os.path.join(img_dir, f"{label_name}.jpg") boxes = [] for obj_list in obj_lists: obj = obj_list.rstrip("\n").split(" ") boxes.append( [ int(obj[0]), float(obj[1]), float(obj[2]), float(obj[3]), float(obj[4]), ] ) if not boxes: continue img_paths.append(img_path) labels.append(boxes) return img_paths, labels def update_image_and_anno( img_list: list, anno_list: list, flip_type: int = 1 ) -> tuple[list, list, list]: """ - img_list : list of all images - anno_list : list of all annotations of specific image - flip_type : 0 is vertical, 1 is horizontal Return: - new_imgs_list : image after resize - new_annos_lists : list of new annotation after scale - path_list : list the name of image file """ new_annos_lists = [] path_list = [] new_imgs_list = [] for idx in range(len(img_list)): new_annos = [] path = img_list[idx] path_list.append(path) img_annos = anno_list[idx] img = cv2.imread(path) if flip_type == 1: new_img = cv2.flip(img, flip_type) for bbox in img_annos: x_center_new = 1 - bbox[1] new_annos.append([bbox[0], x_center_new, bbox[2], bbox[3], bbox[4]]) elif flip_type == 0: new_img = cv2.flip(img, flip_type) for bbox in img_annos: y_center_new = 1 - bbox[2] new_annos.append([bbox[0], bbox[1], y_center_new, bbox[3], bbox[4]]) new_annos_lists.append(new_annos) new_imgs_list.append(new_img) return new_imgs_list, new_annos_lists, path_list def random_chars(number_char: int = 32) -> str: """ Automatic generate random 32 characters. Get random string code: '7b7ad245cdff75241935e4dd860f3bad' >>> len(random_chars(32)) 32 """ assert number_char > 1, "The number of character should greater than 1" letter_code = ascii_lowercase + digits return "".join(random.choice(letter_code) for _ in range(number_char)) if __name__ == "__main__": main() print("DONE ✅") ================================================ FILE: computer_vision/haralick_descriptors.py ================================================ """ https://en.wikipedia.org/wiki/Image_texture https://en.wikipedia.org/wiki/Co-occurrence_matrix#Application_to_image_analysis """ import imageio.v2 as imageio import numpy as np def root_mean_square_error(original: np.ndarray, reference: np.ndarray) -> float: """Simple implementation of Root Mean Squared Error for two N dimensional numpy arrays. Examples: >>> root_mean_square_error(np.array([1, 2, 3]), np.array([1, 2, 3])) 0.0 >>> root_mean_square_error(np.array([1, 2, 3]), np.array([2, 2, 2])) 0.816496580927726 >>> root_mean_square_error(np.array([1, 2, 3]), np.array([6, 4, 2])) 3.1622776601683795 """ return float(np.sqrt(((original - reference) ** 2).mean())) def normalize_image( image: np.ndarray, cap: float = 255.0, data_type: np.dtype = np.uint8 ) -> np.ndarray: """ Normalizes image in Numpy 2D array format, between ranges 0-cap, as to fit uint8 type. Args: image: 2D numpy array representing image as matrix, with values in any range cap: Maximum cap amount for normalization data_type: numpy data type to set output variable to Returns: return 2D numpy array of type uint8, corresponding to limited range matrix Examples: >>> normalize_image(np.array([[1, 2, 3], [4, 5, 10]]), ... cap=1.0, data_type=np.float64) array([[0. , 0.11111111, 0.22222222], [0.33333333, 0.44444444, 1. ]]) >>> normalize_image(np.array([[4, 4, 3], [1, 7, 2]])) array([[127, 127, 85], [ 0, 255, 42]], dtype=uint8) """ normalized = (image - np.min(image)) / (np.max(image) - np.min(image)) * cap return normalized.astype(data_type) def normalize_array(array: np.ndarray, cap: float = 1) -> np.ndarray: """Normalizes a 1D array, between ranges 0-cap. Args: array: List containing values to be normalized between cap range. cap: Maximum cap amount for normalization. Returns: return 1D numpy array, corresponding to limited range array Examples: >>> normalize_array(np.array([2, 3, 5, 7])) array([0. , 0.2, 0.6, 1. ]) >>> normalize_array(np.array([[5], [7], [11], [13]])) array([[0. ], [0.25], [0.75], [1. ]]) """ diff = np.max(array) - np.min(array) return (array - np.min(array)) / (1 if diff == 0 else diff) * cap def grayscale(image: np.ndarray) -> np.ndarray: """ Uses luminance weights to transform RGB channel to greyscale, by taking the dot product between the channel and the weights. Example: >>> grayscale(np.array([[[108, 201, 72], [255, 11, 127]], ... [[56, 56, 56], [128, 255, 107]]])) array([[158, 97], [ 56, 200]], dtype=uint8) """ return np.dot(image[:, :, 0:3], [0.299, 0.587, 0.114]).astype(np.uint8) def binarize(image: np.ndarray, threshold: float = 127.0) -> np.ndarray: """ Binarizes a grayscale image based on a given threshold value, setting values to 1 or 0 accordingly. Examples: >>> binarize(np.array([[128, 255], [101, 156]])) array([[1, 1], [0, 1]]) >>> binarize(np.array([[0.07, 1], [0.51, 0.3]]), threshold=0.5) array([[0, 1], [1, 0]]) """ return np.where(image > threshold, 1, 0) def transform( image: np.ndarray, kind: str, kernel: np.ndarray | None = None ) -> np.ndarray: """ Simple image transformation using one of two available filter functions: Erosion and Dilation. Args: image: binarized input image, onto which to apply transformation kind: Can be either 'erosion', in which case the :func:np.max function is called, or 'dilation', when :func:np.min is used instead. kernel: n x n kernel with shape < :attr:image.shape, to be used when applying convolution to original image Returns: returns a numpy array with same shape as input image, corresponding to applied binary transformation. Examples: >>> img = np.array([[1, 0.5], [0.2, 0.7]]) >>> img = binarize(img, threshold=0.5) >>> transform(img, 'erosion') array([[1, 1], [1, 1]], dtype=uint8) >>> transform(img, 'dilation') array([[0, 0], [0, 0]], dtype=uint8) """ if kernel is None: kernel = np.ones((3, 3)) if kind == "erosion": constant = 1 apply = np.max else: constant = 0 apply = np.min center_x, center_y = (x // 2 for x in kernel.shape) # Use padded image when applying convolution # to not go out of bounds of the original the image transformed = np.zeros(image.shape, dtype=np.uint8) padded = np.pad(image, 1, "constant", constant_values=constant) for x in range(center_x, padded.shape[0] - center_x): for y in range(center_y, padded.shape[1] - center_y): center = padded[ x - center_x : x + center_x + 1, y - center_y : y + center_y + 1 ] # Apply transformation method to the centered section of the image transformed[x - center_x, y - center_y] = apply(center[kernel == 1]) return transformed def opening_filter(image: np.ndarray, kernel: np.ndarray | None = None) -> np.ndarray: """ Opening filter, defined as the sequence of erosion and then a dilation filter on the same image. Examples: >>> img = np.array([[1, 0.5], [0.2, 0.7]]) >>> img = binarize(img, threshold=0.5) >>> opening_filter(img) array([[1, 1], [1, 1]], dtype=uint8) """ if kernel is None: np.ones((3, 3)) return transform(transform(image, "dilation", kernel), "erosion", kernel) def closing_filter(image: np.ndarray, kernel: np.ndarray | None = None) -> np.ndarray: """ Opening filter, defined as the sequence of dilation and then erosion filter on the same image. Examples: >>> img = np.array([[1, 0.5], [0.2, 0.7]]) >>> img = binarize(img, threshold=0.5) >>> closing_filter(img) array([[0, 0], [0, 0]], dtype=uint8) """ if kernel is None: kernel = np.ones((3, 3)) return transform(transform(image, "erosion", kernel), "dilation", kernel) def binary_mask( image_gray: np.ndarray, image_map: np.ndarray ) -> tuple[np.ndarray, np.ndarray]: """ Apply binary mask, or thresholding based on bit mask value (mapping mask is binary). Returns the mapped true value mask and its complementary false value mask. Example: >>> img = np.array([[[108, 201, 72], [255, 11, 127]], ... [[56, 56, 56], [128, 255, 107]]]) >>> gray = grayscale(img) >>> binary = binarize(gray) >>> morphological = opening_filter(binary) >>> binary_mask(gray, morphological) (array([[1, 1], [1, 1]], dtype=uint8), array([[158, 97], [ 56, 200]], dtype=uint8)) """ true_mask, false_mask = image_gray.copy(), image_gray.copy() true_mask[image_map == 1] = 1 false_mask[image_map == 0] = 0 return true_mask, false_mask def matrix_concurrency(image: np.ndarray, coordinate: tuple[int, int]) -> np.ndarray: """ Calculate sample co-occurrence matrix based on input image as well as selected coordinates on image. Implementation is made using basic iteration, as function to be performed (np.max) is non-linear and therefore not callable on the frequency domain. Example: >>> img = np.array([[[108, 201, 72], [255, 11, 127]], ... [[56, 56, 56], [128, 255, 107]]]) >>> gray = grayscale(img) >>> binary = binarize(gray) >>> morphological = opening_filter(binary) >>> mask_1 = binary_mask(gray, morphological)[0] >>> matrix_concurrency(mask_1, (0, 1)) array([[0., 0.], [0., 0.]]) """ matrix = np.zeros([np.max(image) + 1, np.max(image) + 1]) offset_x, offset_y = coordinate for x in range(1, image.shape[0] - 1): for y in range(1, image.shape[1] - 1): base_pixel = image[x, y] offset_pixel = image[x + offset_x, y + offset_y] matrix[base_pixel, offset_pixel] += 1 matrix_sum = np.sum(matrix) return matrix / (1 if matrix_sum == 0 else matrix_sum) def haralick_descriptors(matrix: np.ndarray) -> list[float]: """Calculates all 8 Haralick descriptors based on co-occurrence input matrix. All descriptors are as follows: Maximum probability, Inverse Difference, Homogeneity, Entropy, Energy, Dissimilarity, Contrast and Correlation Args: matrix: Co-occurrence matrix to use as base for calculating descriptors. Returns: Reverse ordered list of resulting descriptors Example: >>> img = np.array([[[108, 201, 72], [255, 11, 127]], ... [[56, 56, 56], [128, 255, 107]]]) >>> gray = grayscale(img) >>> binary = binarize(gray) >>> morphological = opening_filter(binary) >>> mask_1 = binary_mask(gray, morphological)[0] >>> concurrency = matrix_concurrency(mask_1, (0, 1)) >>> [float(f) for f in haralick_descriptors(concurrency)] [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] """ # Function np.indices could be used for bigger input types, # but np.ogrid works just fine i, j = np.ogrid[0 : matrix.shape[0], 0 : matrix.shape[1]] # np.indices() # Pre-calculate frequent multiplication and subtraction prod = np.multiply(i, j) sub = np.subtract(i, j) # Calculate numerical value of Maximum Probability maximum_prob = np.max(matrix) # Using the definition for each descriptor individually to calculate its matrix correlation = prod * matrix energy = np.power(matrix, 2) contrast = matrix * np.power(sub, 2) dissimilarity = matrix * np.abs(sub) inverse_difference = matrix / (1 + np.abs(sub)) homogeneity = matrix / (1 + np.power(sub, 2)) entropy = -(matrix[matrix > 0] * np.log(matrix[matrix > 0])) # Sum values for descriptors ranging from the first one to the last, # as all are their respective origin matrix and not the resulting value yet. return [ maximum_prob, correlation.sum(), energy.sum(), contrast.sum(), dissimilarity.sum(), inverse_difference.sum(), homogeneity.sum(), entropy.sum(), ] def get_descriptors( masks: tuple[np.ndarray, np.ndarray], coordinate: tuple[int, int] ) -> np.ndarray: """ Calculate all Haralick descriptors for a sequence of different co-occurrence matrices, given input masks and coordinates. Example: >>> img = np.array([[[108, 201, 72], [255, 11, 127]], ... [[56, 56, 56], [128, 255, 107]]]) >>> gray = grayscale(img) >>> binary = binarize(gray) >>> morphological = opening_filter(binary) >>> get_descriptors(binary_mask(gray, morphological), (0, 1)) array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]) """ descriptors = np.array( [haralick_descriptors(matrix_concurrency(mask, coordinate)) for mask in masks] ) # Concatenate each individual descriptor into # one single list containing sequence of descriptors return np.concatenate(descriptors, axis=None) def euclidean(point_1: np.ndarray, point_2: np.ndarray) -> float: """ Simple method for calculating the euclidean distance between two points, with type np.ndarray. Example: >>> a = np.array([1, 0, -2]) >>> b = np.array([2, -1, 1]) >>> euclidean(a, b) 3.3166247903554 """ return float(np.sqrt(np.sum(np.square(point_1 - point_2)))) def get_distances(descriptors: np.ndarray, base: int) -> list[tuple[int, float]]: """ Calculate all Euclidean distances between a selected base descriptor and all other Haralick descriptors The resulting comparison is return in decreasing order, showing which descriptor is the most similar to the selected base. Args: descriptors: Haralick descriptors to compare with base index base: Haralick descriptor index to use as base when calculating respective euclidean distance to other descriptors. Returns: Ordered distances between descriptors Example: >>> index = 1 >>> img = np.array([[[108, 201, 72], [255, 11, 127]], ... [[56, 56, 56], [128, 255, 107]]]) >>> gray = grayscale(img) >>> binary = binarize(gray) >>> morphological = opening_filter(binary) >>> get_distances(get_descriptors( ... binary_mask(gray, morphological), (0, 1)), ... index) [(0, 0.0), (1, 0.0), (2, 0.0), (3, 0.0), (4, 0.0), (5, 0.0), \ (6, 0.0), (7, 0.0), (8, 0.0), (9, 0.0), (10, 0.0), (11, 0.0), (12, 0.0), \ (13, 0.0), (14, 0.0), (15, 0.0)] """ distances = np.array( [euclidean(descriptor, descriptors[base]) for descriptor in descriptors] ) # Normalize distances between range [0, 1] normalized_distances: list[float] = normalize_array(distances, 1).tolist() enum_distances = list(enumerate(normalized_distances)) enum_distances.sort(key=lambda tup: tup[1], reverse=True) return enum_distances if __name__ == "__main__": # Index to compare haralick descriptors to index = int(input()) q_value_list = [int(value) for value in input().split()] q_value = (q_value_list[0], q_value_list[1]) # Format is the respective filter to apply, # can be either 1 for the opening filter or else for the closing parameters = {"format": int(input()), "threshold": int(input())} # Number of images to perform methods on b_number = int(input()) files, descriptors = [], [] for _ in range(b_number): file = input().rstrip() files.append(file) # Open given image and calculate morphological filter, # respective masks and correspondent Harralick Descriptors. image = imageio.imread(file).astype(np.float32) gray = grayscale(image) threshold = binarize(gray, parameters["threshold"]) morphological = ( opening_filter(threshold) if parameters["format"] == 1 else closing_filter(threshold) ) masks = binary_mask(gray, morphological) descriptors.append(get_descriptors(masks, q_value)) # Transform ordered distances array into a sequence of indexes # corresponding to original file position distances = get_distances(np.array(descriptors), index) indexed_distances = np.array(distances).astype(np.uint8)[:, 0] # Finally, print distances considering the Haralick descriptions from the base # file to all other images using the morphology method of choice. print(f"Query: {files[index]}") print("Ranking:") for idx, file_idx in enumerate(indexed_distances): print(f"({idx}) {files[file_idx]}", end="\n") ================================================ FILE: computer_vision/harris_corner.py ================================================ import cv2 import numpy as np """ Harris Corner Detector https://en.wikipedia.org/wiki/Harris_Corner_Detector """ class HarrisCorner: def __init__(self, k: float, window_size: int): """ k : is an empirically determined constant in [0.04,0.06] window_size : neighbourhoods considered """ if k in (0.04, 0.06): self.k = k self.window_size = window_size else: raise ValueError("invalid k value") def __str__(self) -> str: return str(self.k) def detect(self, img_path: str) -> tuple[cv2.Mat, list[list[int]]]: """ Returns the image with corners identified img_path : path of the image output : list of the corner positions, image """ img = cv2.imread(img_path, 0) h, w = img.shape corner_list: list[list[int]] = [] color_img = img.copy() color_img = cv2.cvtColor(color_img, cv2.COLOR_GRAY2RGB) dy, dx = np.gradient(img) ixx = dx**2 iyy = dy**2 ixy = dx * dy k = 0.04 offset = self.window_size // 2 for y in range(offset, h - offset): for x in range(offset, w - offset): wxx = ixx[ y - offset : y + offset + 1, x - offset : x + offset + 1 ].sum() wyy = iyy[ y - offset : y + offset + 1, x - offset : x + offset + 1 ].sum() wxy = ixy[ y - offset : y + offset + 1, x - offset : x + offset + 1 ].sum() det = (wxx * wyy) - (wxy**2) trace = wxx + wyy r = det - k * (trace**2) # Can change the value if r > 0.5: corner_list.append([x, y, r]) color_img.itemset((y, x, 0), 0) color_img.itemset((y, x, 1), 0) color_img.itemset((y, x, 2), 255) return color_img, corner_list if __name__ == "__main__": edge_detect = HarrisCorner(0.04, 3) color_img, _ = edge_detect.detect("path_to_image") cv2.imwrite("detect.png", color_img) ================================================ FILE: computer_vision/horn_schunck.py ================================================ """ The Horn-Schunck method estimates the optical flow for every single pixel of a sequence of images. It works by assuming brightness constancy between two consecutive frames and smoothness in the optical flow. Useful resources: Wikipedia: https://en.wikipedia.org/wiki/Horn%E2%80%93Schunck_method Paper: http://image.diku.dk/imagecanon/material/HornSchunckOptical_Flow.pdf """ from typing import SupportsIndex import numpy as np from scipy.ndimage import convolve def warp( image: np.ndarray, horizontal_flow: np.ndarray, vertical_flow: np.ndarray ) -> np.ndarray: """ Warps the pixels of an image into a new image using the horizontal and vertical flows. Pixels that are warped from an invalid location are set to 0. Parameters: image: Grayscale image horizontal_flow: Horizontal flow vertical_flow: Vertical flow Returns: Warped image >>> warp(np.array([[0, 1, 2], [0, 3, 0], [2, 2, 2]]), \ np.array([[0, 1, -1], [-1, 0, 0], [1, 1, 1]]), \ np.array([[0, 0, 0], [0, 1, 0], [0, 0, 1]])) array([[0, 0, 0], [3, 1, 0], [0, 2, 3]]) """ flow = np.stack((horizontal_flow, vertical_flow), 2) # Create a grid of all pixel coordinates and subtract the flow to get the # target pixels coordinates grid = np.stack( np.meshgrid(np.arange(0, image.shape[1]), np.arange(0, image.shape[0])), 2 ) grid = np.round(grid - flow).astype(np.int32) # Find the locations outside of the original image invalid = (grid < 0) | (grid >= np.array([image.shape[1], image.shape[0]])) grid[invalid] = 0 warped = image[grid[:, :, 1], grid[:, :, 0]] # Set pixels at invalid locations to 0 warped[invalid[:, :, 0] | invalid[:, :, 1]] = 0 return warped def horn_schunck( image0: np.ndarray, image1: np.ndarray, num_iter: SupportsIndex, alpha: float | None = None, ) -> tuple[np.ndarray, np.ndarray]: """ This function performs the Horn-Schunck algorithm and returns the estimated optical flow. It is assumed that the input images are grayscale and normalized to be in [0, 1]. Parameters: image0: First image of the sequence image1: Second image of the sequence alpha: Regularization constant num_iter: Number of iterations performed Returns: estimated horizontal & vertical flow >>> np.round(horn_schunck(np.array([[0, 0, 2], [0, 0, 2]]), \ np.array([[0, 2, 0], [0, 2, 0]]), alpha=0.1, num_iter=110)).\ astype(np.int32) array([[[ 0, -1, -1], [ 0, -1, -1]], [[ 0, 0, 0], [ 0, 0, 0]]], dtype=int32) """ if alpha is None: alpha = 0.1 # Initialize flow horizontal_flow = np.zeros_like(image0) vertical_flow = np.zeros_like(image0) # Prepare kernels for the calculation of the derivatives and the average velocity kernel_x = np.array([[-1, 1], [-1, 1]]) * 0.25 kernel_y = np.array([[-1, -1], [1, 1]]) * 0.25 kernel_t = np.array([[1, 1], [1, 1]]) * 0.25 kernel_laplacian = np.array( [[1 / 12, 1 / 6, 1 / 12], [1 / 6, 0, 1 / 6], [1 / 12, 1 / 6, 1 / 12]] ) # Iteratively refine the flow for _ in range(num_iter): warped_image = warp(image0, horizontal_flow, vertical_flow) derivative_x = convolve(warped_image, kernel_x) + convolve(image1, kernel_x) derivative_y = convolve(warped_image, kernel_y) + convolve(image1, kernel_y) derivative_t = convolve(warped_image, kernel_t) + convolve(image1, -kernel_t) avg_horizontal_velocity = convolve(horizontal_flow, kernel_laplacian) avg_vertical_velocity = convolve(vertical_flow, kernel_laplacian) # This updates the flow as proposed in the paper (Step 12) update = ( derivative_x * avg_horizontal_velocity + derivative_y * avg_vertical_velocity + derivative_t ) update = update / (alpha**2 + derivative_x**2 + derivative_y**2) horizontal_flow = avg_horizontal_velocity - derivative_x * update vertical_flow = avg_vertical_velocity - derivative_y * update return horizontal_flow, vertical_flow if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: computer_vision/intensity_based_segmentation.py ================================================ # Source: "https://www.ijcse.com/docs/IJCSE11-02-03-117.pdf" # Importing necessary libraries import matplotlib.pyplot as plt import numpy as np from PIL import Image def segment_image(image: np.ndarray, thresholds: list[int]) -> np.ndarray: """ Performs image segmentation based on intensity thresholds. Args: image: Input grayscale image as a 2D array. thresholds: Intensity thresholds to define segments. Returns: A labeled 2D array where each region corresponds to a threshold range. Example: >>> img = np.array([[80, 120, 180], [40, 90, 150], [20, 60, 100]]) >>> segment_image(img, [50, 100, 150]) array([[1, 2, 3], [0, 1, 2], [0, 1, 1]], dtype=int32) """ # Initialize segmented array with zeros segmented = np.zeros_like(image, dtype=np.int32) # Assign labels based on thresholds for i, threshold in enumerate(thresholds): segmented[image > threshold] = i + 1 return segmented if __name__ == "__main__": # Load the image image_path = "path_to_image" # Replace with your image path original_image = Image.open(image_path).convert("L") image_array = np.array(original_image) # Define thresholds thresholds = [50, 100, 150, 200] # Perform segmentation segmented_image = segment_image(image_array, thresholds) # Display the results plt.figure(figsize=(10, 5)) plt.subplot(1, 2, 1) plt.title("Original Image") plt.imshow(image_array, cmap="gray") plt.axis("off") plt.subplot(1, 2, 2) plt.title("Segmented Image") plt.imshow(segmented_image, cmap="tab20") plt.axis("off") plt.show() ================================================ FILE: computer_vision/mean_threshold.py ================================================ from PIL import Image """ Mean thresholding algorithm for image processing https://en.wikipedia.org/wiki/Thresholding_(image_processing) """ def mean_threshold(image: Image) -> Image: """ image: is a grayscale PIL image object """ height, width = image.size mean = 0 pixels = image.load() for i in range(width): for j in range(height): pixel = pixels[j, i] mean += pixel mean //= width * height for j in range(width): for i in range(height): pixels[i, j] = 255 if pixels[i, j] > mean else 0 return image if __name__ == "__main__": image = mean_threshold(Image.open("path_to_image").convert("L")) image.save("output_image_path") ================================================ FILE: computer_vision/mosaic_augmentation.py ================================================ """Source: https://github.com/jason9075/opencv-mosaic-data-aug""" import glob import os import random from string import ascii_lowercase, digits import cv2 import numpy as np # Parameters OUTPUT_SIZE = (720, 1280) # Height, Width SCALE_RANGE = (0.4, 0.6) # if height or width lower than this scale, drop it. FILTER_TINY_SCALE = 1 / 100 LABEL_DIR = "" IMG_DIR = "" OUTPUT_DIR = "" NUMBER_IMAGES = 250 def main() -> None: """ Get images list and annotations list from input dir. Update new images and annotations. Save images and annotations in output dir. """ img_paths, annos = get_dataset(LABEL_DIR, IMG_DIR) for index in range(NUMBER_IMAGES): idxs = random.sample(range(len(annos)), 4) new_image, new_annos, path = update_image_and_anno( img_paths, annos, idxs, OUTPUT_SIZE, SCALE_RANGE, filter_scale=FILTER_TINY_SCALE, ) # Get random string code: '7b7ad245cdff75241935e4dd860f3bad' letter_code = random_chars(32) file_name = path.split(os.sep)[-1].rsplit(".", 1)[0] file_root = f"{OUTPUT_DIR}/{file_name}_MOSAIC_{letter_code}" cv2.imwrite(f"{file_root}.jpg", new_image, [cv2.IMWRITE_JPEG_QUALITY, 85]) print(f"Succeeded {index + 1}/{NUMBER_IMAGES} with {file_name}") annos_list = [] for anno in new_annos: width = anno[3] - anno[1] height = anno[4] - anno[2] x_center = anno[1] + width / 2 y_center = anno[2] + height / 2 obj = f"{anno[0]} {x_center} {y_center} {width} {height}" annos_list.append(obj) with open(f"{file_root}.txt", "w") as outfile: outfile.write("\n".join(line for line in annos_list)) def get_dataset(label_dir: str, img_dir: str) -> tuple[list, list]: """ - label_dir : Path to label include annotation of images - img_dir : Path to folder contain images Return : List of images path and labels """ img_paths = [] labels = [] for label_file in glob.glob(os.path.join(label_dir, "*.txt")): label_name = label_file.split(os.sep)[-1].rsplit(".", 1)[0] with open(label_file) as in_file: obj_lists = in_file.readlines() img_path = os.path.join(img_dir, f"{label_name}.jpg") boxes = [] for obj_list in obj_lists: obj = obj_list.rstrip("\n").split(" ") xmin = float(obj[1]) - float(obj[3]) / 2 ymin = float(obj[2]) - float(obj[4]) / 2 xmax = float(obj[1]) + float(obj[3]) / 2 ymax = float(obj[2]) + float(obj[4]) / 2 boxes.append([int(obj[0]), xmin, ymin, xmax, ymax]) if not boxes: continue img_paths.append(img_path) labels.append(boxes) return img_paths, labels def update_image_and_anno( all_img_list: list, all_annos: list, idxs: list[int], output_size: tuple[int, int], scale_range: tuple[float, float], filter_scale: float = 0.0, ) -> tuple[list, list, str]: """ - all_img_list : list of all images - all_annos : list of all annotations of specific image - idxs : index of image in list - output_size : size of output image (Height, Width) - scale_range : range of scale image - filter_scale : the condition of downscale image and bounding box Return: - output_img : image after resize - new_anno : list of new annotation after scale - path[0] : get the name of image file """ output_img = np.zeros([output_size[0], output_size[1], 3], dtype=np.uint8) scale_x = scale_range[0] + random.random() * (scale_range[1] - scale_range[0]) scale_y = scale_range[0] + random.random() * (scale_range[1] - scale_range[0]) divid_point_x = int(scale_x * output_size[1]) divid_point_y = int(scale_y * output_size[0]) new_anno = [] path_list = [] for i, index in enumerate(idxs): path = all_img_list[index] path_list.append(path) img_annos = all_annos[index] img = cv2.imread(path) if i == 0: # top-left img = cv2.resize(img, (divid_point_x, divid_point_y)) output_img[:divid_point_y, :divid_point_x, :] = img for bbox in img_annos: xmin = bbox[1] * scale_x ymin = bbox[2] * scale_y xmax = bbox[3] * scale_x ymax = bbox[4] * scale_y new_anno.append([bbox[0], xmin, ymin, xmax, ymax]) elif i == 1: # top-right img = cv2.resize(img, (output_size[1] - divid_point_x, divid_point_y)) output_img[:divid_point_y, divid_point_x : output_size[1], :] = img for bbox in img_annos: xmin = scale_x + bbox[1] * (1 - scale_x) ymin = bbox[2] * scale_y xmax = scale_x + bbox[3] * (1 - scale_x) ymax = bbox[4] * scale_y new_anno.append([bbox[0], xmin, ymin, xmax, ymax]) elif i == 2: # bottom-left img = cv2.resize(img, (divid_point_x, output_size[0] - divid_point_y)) output_img[divid_point_y : output_size[0], :divid_point_x, :] = img for bbox in img_annos: xmin = bbox[1] * scale_x ymin = scale_y + bbox[2] * (1 - scale_y) xmax = bbox[3] * scale_x ymax = scale_y + bbox[4] * (1 - scale_y) new_anno.append([bbox[0], xmin, ymin, xmax, ymax]) else: # bottom-right img = cv2.resize( img, (output_size[1] - divid_point_x, output_size[0] - divid_point_y) ) output_img[ divid_point_y : output_size[0], divid_point_x : output_size[1], : ] = img for bbox in img_annos: xmin = scale_x + bbox[1] * (1 - scale_x) ymin = scale_y + bbox[2] * (1 - scale_y) xmax = scale_x + bbox[3] * (1 - scale_x) ymax = scale_y + bbox[4] * (1 - scale_y) new_anno.append([bbox[0], xmin, ymin, xmax, ymax]) # Remove bounding box small than scale of filter if filter_scale > 0: new_anno = [ anno for anno in new_anno if filter_scale < (anno[3] - anno[1]) and filter_scale < (anno[4] - anno[2]) ] return output_img, new_anno, path_list[0] def random_chars(number_char: int) -> str: """ Automatic generate random 32 characters. Get random string code: '7b7ad245cdff75241935e4dd860f3bad' >>> len(random_chars(32)) 32 """ assert number_char > 1, "The number of character should greater than 1" letter_code = ascii_lowercase + digits return "".join(random.choice(letter_code) for _ in range(number_char)) if __name__ == "__main__": main() print("DONE ✅") ================================================ FILE: computer_vision/pooling_functions.py ================================================ # Source : https://computersciencewiki.org/index.php/Max-pooling_/_Pooling # Importing the libraries import numpy as np from PIL import Image # Maxpooling Function def maxpooling(arr: np.ndarray, size: int, stride: int) -> np.ndarray: """ This function is used to perform maxpooling on the input array of 2D matrix(image) Args: arr: numpy array size: size of pooling matrix stride: the number of pixels shifts over the input matrix Returns: numpy array of maxpooled matrix Sample Input Output: >>> maxpooling([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]], 2, 2) array([[ 6., 8.], [14., 16.]]) >>> maxpooling([[147, 180, 122],[241, 76, 32],[126, 13, 157]], 2, 1) array([[241., 180.], [241., 157.]]) """ arr = np.array(arr) if arr.shape[0] != arr.shape[1]: raise ValueError("The input array is not a square matrix") i = 0 j = 0 mat_i = 0 mat_j = 0 # compute the shape of the output matrix maxpool_shape = (arr.shape[0] - size) // stride + 1 # initialize the output matrix with zeros of shape maxpool_shape updated_arr = np.zeros((maxpool_shape, maxpool_shape)) while i < arr.shape[0]: if i + size > arr.shape[0]: # if the end of the matrix is reached, break break while j < arr.shape[1]: # if the end of the matrix is reached, break if j + size > arr.shape[1]: break # compute the maximum of the pooling matrix updated_arr[mat_i][mat_j] = np.max(arr[i : i + size, j : j + size]) # shift the pooling matrix by stride of column pixels j += stride mat_j += 1 # shift the pooling matrix by stride of row pixels i += stride mat_i += 1 # reset the column index to 0 j = 0 mat_j = 0 return updated_arr # Averagepooling Function def avgpooling(arr: np.ndarray, size: int, stride: int) -> np.ndarray: """ This function is used to perform avgpooling on the input array of 2D matrix(image) Args: arr: numpy array size: size of pooling matrix stride: the number of pixels shifts over the input matrix Returns: numpy array of avgpooled matrix Sample Input Output: >>> avgpooling([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]], 2, 2) array([[ 3., 5.], [11., 13.]]) >>> avgpooling([[147, 180, 122],[241, 76, 32],[126, 13, 157]], 2, 1) array([[161., 102.], [114., 69.]]) """ arr = np.array(arr) if arr.shape[0] != arr.shape[1]: raise ValueError("The input array is not a square matrix") i = 0 j = 0 mat_i = 0 mat_j = 0 # compute the shape of the output matrix avgpool_shape = (arr.shape[0] - size) // stride + 1 # initialize the output matrix with zeros of shape avgpool_shape updated_arr = np.zeros((avgpool_shape, avgpool_shape)) while i < arr.shape[0]: # if the end of the matrix is reached, break if i + size > arr.shape[0]: break while j < arr.shape[1]: # if the end of the matrix is reached, break if j + size > arr.shape[1]: break # compute the average of the pooling matrix updated_arr[mat_i][mat_j] = int(np.average(arr[i : i + size, j : j + size])) # shift the pooling matrix by stride of column pixels j += stride mat_j += 1 # shift the pooling matrix by stride of row pixels i += stride mat_i += 1 # reset the column index to 0 j = 0 mat_j = 0 return updated_arr # Main Function if __name__ == "__main__": from doctest import testmod testmod(name="avgpooling", verbose=True) # Loading the image image = Image.open("path_to_image") # Converting the image to numpy array and maxpooling, displaying the result # Ensure that the image is a square matrix Image.fromarray(maxpooling(np.array(image), size=3, stride=2)).show() # Converting the image to numpy array and averagepooling, displaying the result # Ensure that the image is a square matrix Image.fromarray(avgpooling(np.array(image), size=3, stride=2)).show() ================================================ FILE: conversions/README.md ================================================ # Conversion Conversion programs convert a type of data, a number from a numerical base or unit into one of another type, base or unit, e.g. binary to decimal, integer to string or foot to meters. * * ================================================ FILE: conversions/__init__.py ================================================ ================================================ FILE: conversions/astronomical_length_scale_conversion.py ================================================ """ Conversion of length units. Available Units: Metre, Kilometre, Megametre, Gigametre, Terametre, Petametre, Exametre, Zettametre, Yottametre USAGE : -> Import this file into their respective project. -> Use the function length_conversion() for conversion of length units. -> Parameters : -> value : The number of from units you want to convert -> from_type : From which type you want to convert -> to_type : To which type you want to convert REFERENCES : -> Wikipedia reference: https://en.wikipedia.org/wiki/Meter -> Wikipedia reference: https://en.wikipedia.org/wiki/Kilometer -> Wikipedia reference: https://en.wikipedia.org/wiki/Orders_of_magnitude_(length) """ UNIT_SYMBOL = { "meter": "m", "kilometer": "km", "megametre": "Mm", "gigametre": "Gm", "terametre": "Tm", "petametre": "Pm", "exametre": "Em", "zettametre": "Zm", "yottametre": "Ym", } # Exponent of the factor(meter) METRIC_CONVERSION = { "m": 0, "km": 3, "Mm": 6, "Gm": 9, "Tm": 12, "Pm": 15, "Em": 18, "Zm": 21, "Ym": 24, } def length_conversion(value: float, from_type: str, to_type: str) -> float: """ Conversion between astronomical length units. >>> length_conversion(1, "meter", "kilometer") 0.001 >>> length_conversion(1, "meter", "megametre") 1e-06 >>> length_conversion(1, "gigametre", "meter") 1000000000 >>> length_conversion(1, "gigametre", "terametre") 0.001 >>> length_conversion(1, "petametre", "terametre") 1000 >>> length_conversion(1, "petametre", "exametre") 0.001 >>> length_conversion(1, "terametre", "zettametre") 1e-09 >>> length_conversion(1, "yottametre", "zettametre") 1000 >>> length_conversion(4, "wrongUnit", "inch") Traceback (most recent call last): ... ValueError: Invalid 'from_type' value: 'wrongUnit'. Conversion abbreviations are: m, km, Mm, Gm, Tm, Pm, Em, Zm, Ym """ from_sanitized = from_type.lower().strip("s") to_sanitized = to_type.lower().strip("s") from_sanitized = UNIT_SYMBOL.get(from_sanitized, from_sanitized) to_sanitized = UNIT_SYMBOL.get(to_sanitized, to_sanitized) if from_sanitized not in METRIC_CONVERSION: msg = ( f"Invalid 'from_type' value: {from_type!r}.\n" f"Conversion abbreviations are: {', '.join(METRIC_CONVERSION)}" ) raise ValueError(msg) if to_sanitized not in METRIC_CONVERSION: msg = ( f"Invalid 'to_type' value: {to_type!r}.\n" f"Conversion abbreviations are: {', '.join(METRIC_CONVERSION)}" ) raise ValueError(msg) from_exponent = METRIC_CONVERSION[from_sanitized] to_exponent = METRIC_CONVERSION[to_sanitized] exponent = 1 if from_exponent > to_exponent: exponent = from_exponent - to_exponent else: exponent = -(to_exponent - from_exponent) return value * pow(10, exponent) if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: conversions/binary_to_decimal.py ================================================ def bin_to_decimal(bin_string: str) -> int: """ Convert a binary value to its decimal equivalent >>> bin_to_decimal("101") 5 >>> bin_to_decimal(" 1010 ") 10 >>> bin_to_decimal("-11101") -29 >>> bin_to_decimal("0") 0 >>> bin_to_decimal("a") Traceback (most recent call last): ... ValueError: Non-binary value was passed to the function >>> bin_to_decimal("") Traceback (most recent call last): ... ValueError: Empty string was passed to the function >>> bin_to_decimal("39") Traceback (most recent call last): ... ValueError: Non-binary value was passed to the function """ bin_string = str(bin_string).strip() if not bin_string: raise ValueError("Empty string was passed to the function") is_negative = bin_string[0] == "-" if is_negative: bin_string = bin_string[1:] if not all(char in "01" for char in bin_string): raise ValueError("Non-binary value was passed to the function") decimal_number = 0 for char in bin_string: decimal_number = 2 * decimal_number + int(char) return -decimal_number if is_negative else decimal_number if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: conversions/binary_to_hexadecimal.py ================================================ BITS_TO_HEX = { "0000": "0", "0001": "1", "0010": "2", "0011": "3", "0100": "4", "0101": "5", "0110": "6", "0111": "7", "1000": "8", "1001": "9", "1010": "a", "1011": "b", "1100": "c", "1101": "d", "1110": "e", "1111": "f", } def bin_to_hexadecimal(binary_str: str) -> str: """ Converting a binary string into hexadecimal using Grouping Method >>> bin_to_hexadecimal('101011111') '0x15f' >>> bin_to_hexadecimal(' 1010 ') '0x0a' >>> bin_to_hexadecimal('-11101') '-0x1d' >>> bin_to_hexadecimal('a') Traceback (most recent call last): ... ValueError: Non-binary value was passed to the function >>> bin_to_hexadecimal('') Traceback (most recent call last): ... ValueError: Empty string was passed to the function """ # Sanitising parameter binary_str = str(binary_str).strip() # Exceptions if not binary_str: raise ValueError("Empty string was passed to the function") is_negative = binary_str[0] == "-" binary_str = binary_str[1:] if is_negative else binary_str if not all(char in "01" for char in binary_str): raise ValueError("Non-binary value was passed to the function") binary_str = ( "0" * (4 * (divmod(len(binary_str), 4)[0] + 1) - len(binary_str)) + binary_str ) hexadecimal = [] for x in range(0, len(binary_str), 4): hexadecimal.append(BITS_TO_HEX[binary_str[x : x + 4]]) hexadecimal_str = "0x" + "".join(hexadecimal) return "-" + hexadecimal_str if is_negative else hexadecimal_str if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: conversions/binary_to_octal.py ================================================ """ The function below will convert any binary string to the octal equivalent. >>> bin_to_octal("1111") '17' >>> bin_to_octal("101010101010011") '52523' >>> bin_to_octal("") Traceback (most recent call last): ... ValueError: Empty string was passed to the function >>> bin_to_octal("a-1") Traceback (most recent call last): ... ValueError: Non-binary value was passed to the function """ def bin_to_octal(bin_string: str) -> str: if not all(char in "01" for char in bin_string): raise ValueError("Non-binary value was passed to the function") if not bin_string: raise ValueError("Empty string was passed to the function") oct_string = "" while len(bin_string) % 3 != 0: bin_string = "0" + bin_string bin_string_in_3_list = [ bin_string[index : index + 3] for index in range(len(bin_string)) if index % 3 == 0 ] for bin_group in bin_string_in_3_list: oct_val = 0 for index, val in enumerate(bin_group): oct_val += int(2 ** (2 - index) * int(val)) oct_string += str(oct_val) return oct_string if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: conversions/convert_number_to_words.py ================================================ from enum import Enum from typing import Literal class NumberingSystem(Enum): SHORT = ( (15, "quadrillion"), (12, "trillion"), (9, "billion"), (6, "million"), (3, "thousand"), (2, "hundred"), ) LONG = ( (15, "billiard"), (9, "milliard"), (6, "million"), (3, "thousand"), (2, "hundred"), ) INDIAN = ( (14, "crore crore"), (12, "lakh crore"), (7, "crore"), (5, "lakh"), (3, "thousand"), (2, "hundred"), ) @classmethod def max_value(cls, system: str) -> int: """ Gets the max value supported by the given number system. >>> NumberingSystem.max_value("short") == 10**18 - 1 True >>> NumberingSystem.max_value("long") == 10**21 - 1 True >>> NumberingSystem.max_value("indian") == 10**19 - 1 True """ match system_enum := cls[system.upper()]: case cls.SHORT: max_exp = system_enum.value[0][0] + 3 case cls.LONG: max_exp = system_enum.value[0][0] + 6 case cls.INDIAN: max_exp = 19 case _: raise ValueError("Invalid numbering system") return 10**max_exp - 1 class NumberWords(Enum): ONES = { # noqa: RUF012 0: "", 1: "one", 2: "two", 3: "three", 4: "four", 5: "five", 6: "six", 7: "seven", 8: "eight", 9: "nine", } TEENS = { # noqa: RUF012 0: "ten", 1: "eleven", 2: "twelve", 3: "thirteen", 4: "fourteen", 5: "fifteen", 6: "sixteen", 7: "seventeen", 8: "eighteen", 9: "nineteen", } TENS = { # noqa: RUF012 2: "twenty", 3: "thirty", 4: "forty", 5: "fifty", 6: "sixty", 7: "seventy", 8: "eighty", 9: "ninety", } def convert_small_number(num: int) -> str: """ Converts small, non-negative integers with irregular constructions in English (i.e., numbers under 100) into words. >>> convert_small_number(0) 'zero' >>> convert_small_number(5) 'five' >>> convert_small_number(10) 'ten' >>> convert_small_number(15) 'fifteen' >>> convert_small_number(20) 'twenty' >>> convert_small_number(25) 'twenty-five' >>> convert_small_number(-1) Traceback (most recent call last): ... ValueError: This function only accepts non-negative integers >>> convert_small_number(123) Traceback (most recent call last): ... ValueError: This function only converts numbers less than 100 """ if num < 0: raise ValueError("This function only accepts non-negative integers") if num >= 100: raise ValueError("This function only converts numbers less than 100") tens, ones = divmod(num, 10) if tens == 0: return NumberWords.ONES.value[ones] or "zero" if tens == 1: return NumberWords.TEENS.value[ones] return ( NumberWords.TENS.value[tens] + ("-" if NumberWords.ONES.value[ones] else "") + NumberWords.ONES.value[ones] ) def convert_number( num: int, system: Literal["short", "long", "indian"] = "short" ) -> str: """ Converts an integer to English words. :param num: The integer to be converted :param system: The numbering system (short, long, or Indian) >>> convert_number(0) 'zero' >>> convert_number(1) 'one' >>> convert_number(100) 'one hundred' >>> convert_number(-100) 'negative one hundred' >>> convert_number(123_456_789_012_345) # doctest: +NORMALIZE_WHITESPACE 'one hundred twenty-three trillion four hundred fifty-six billion seven hundred eighty-nine million twelve thousand three hundred forty-five' >>> convert_number(123_456_789_012_345, "long") # doctest: +NORMALIZE_WHITESPACE 'one hundred twenty-three thousand four hundred fifty-six milliard seven hundred eighty-nine million twelve thousand three hundred forty-five' >>> convert_number(12_34_56_78_90_12_345, "indian") # doctest: +NORMALIZE_WHITESPACE 'one crore crore twenty-three lakh crore forty-five thousand six hundred seventy-eight crore ninety lakh twelve thousand three hundred forty-five' >>> convert_number(10**18) Traceback (most recent call last): ... ValueError: Input number is too large >>> convert_number(10**21, "long") Traceback (most recent call last): ... ValueError: Input number is too large >>> convert_number(10**19, "indian") Traceback (most recent call last): ... ValueError: Input number is too large """ word_groups = [] if num < 0: word_groups.append("negative") num *= -1 if num > NumberingSystem.max_value(system): raise ValueError("Input number is too large") for power, unit in NumberingSystem[system.upper()].value: digit_group, num = divmod(num, 10**power) if digit_group > 0: word_group = ( convert_number(digit_group, system) if digit_group >= 100 else convert_small_number(digit_group) ) word_groups.append(f"{word_group} {unit}") if num > 0 or not word_groups: # word_groups is only empty if input num was 0 word_groups.append(convert_small_number(num)) return " ".join(word_groups) if __name__ == "__main__": import doctest doctest.testmod() print(f"{convert_number(123456789) = }") ================================================ FILE: conversions/decimal_to_any.py ================================================ """Convert a positive Decimal Number to Any Other Representation""" from string import ascii_uppercase ALPHABET_VALUES = {str(ord(c) - 55): c for c in ascii_uppercase} def decimal_to_any(num: int, base: int) -> str: """ Convert a positive integer to another base as str. >>> decimal_to_any(0, 2) '0' >>> decimal_to_any(5, 4) '11' >>> decimal_to_any(20, 3) '202' >>> decimal_to_any(58, 16) '3A' >>> decimal_to_any(243, 17) 'E5' >>> decimal_to_any(34923, 36) 'QY3' >>> decimal_to_any(10, 11) 'A' >>> decimal_to_any(16, 16) '10' >>> decimal_to_any(36, 36) '10' >>> # negatives will error >>> decimal_to_any(-45, 8) # doctest: +ELLIPSIS Traceback (most recent call last): ... ValueError: parameter must be positive int >>> # floats will error >>> decimal_to_any(34.4, 6) # doctest: +ELLIPSIS Traceback (most recent call last): ... TypeError: int() can't convert non-string with explicit base >>> # a float base will error >>> decimal_to_any(5, 2.5) # doctest: +ELLIPSIS Traceback (most recent call last): ... TypeError: 'float' object cannot be interpreted as an integer >>> # a str base will error >>> decimal_to_any(10, '16') # doctest: +ELLIPSIS Traceback (most recent call last): ... TypeError: 'str' object cannot be interpreted as an integer >>> # a base less than 2 will error >>> decimal_to_any(7, 0) # doctest: +ELLIPSIS Traceback (most recent call last): ... ValueError: base must be >= 2 >>> # a base greater than 36 will error >>> decimal_to_any(34, 37) # doctest: +ELLIPSIS Traceback (most recent call last): ... ValueError: base must be <= 36 """ if isinstance(num, float): raise TypeError("int() can't convert non-string with explicit base") if num < 0: raise ValueError("parameter must be positive int") if isinstance(base, str): raise TypeError("'str' object cannot be interpreted as an integer") if isinstance(base, float): raise TypeError("'float' object cannot be interpreted as an integer") if base in (0, 1): raise ValueError("base must be >= 2") if base > 36: raise ValueError("base must be <= 36") new_value = "" mod = 0 div = 0 while div != 1: div, mod = divmod(num, base) if base >= 11 and 9 < mod < 36: actual_value = ALPHABET_VALUES[str(mod)] else: actual_value = str(mod) new_value += actual_value div = num // base num = div if div == 0: return str(new_value[::-1]) elif div == 1: new_value += str(div) return str(new_value[::-1]) return new_value[::-1] if __name__ == "__main__": import doctest doctest.testmod() for base in range(2, 37): for num in range(1000): assert int(decimal_to_any(num, base), base) == num, ( num, base, decimal_to_any(num, base), int(decimal_to_any(num, base), base), ) ================================================ FILE: conversions/decimal_to_binary.py ================================================ """Convert a Decimal Number to a Binary Number.""" def decimal_to_binary_iterative(num: int) -> str: """ Convert an Integer Decimal Number to a Binary Number as str. >>> decimal_to_binary_iterative(0) '0b0' >>> decimal_to_binary_iterative(2) '0b10' >>> decimal_to_binary_iterative(7) '0b111' >>> decimal_to_binary_iterative(35) '0b100011' >>> # negatives work too >>> decimal_to_binary_iterative(-2) '-0b10' >>> # other floats will error >>> decimal_to_binary_iterative(16.16) # doctest: +ELLIPSIS Traceback (most recent call last): ... TypeError: 'float' object cannot be interpreted as an integer >>> # strings will error as well >>> decimal_to_binary_iterative('0xfffff') # doctest: +ELLIPSIS Traceback (most recent call last): ... TypeError: 'str' object cannot be interpreted as an integer """ if isinstance(num, float): raise TypeError("'float' object cannot be interpreted as an integer") if isinstance(num, str): raise TypeError("'str' object cannot be interpreted as an integer") if num == 0: return "0b0" negative = False if num < 0: negative = True num = -num binary: list[int] = [] while num > 0: binary.insert(0, num % 2) num >>= 1 if negative: return "-0b" + "".join(str(e) for e in binary) return "0b" + "".join(str(e) for e in binary) def decimal_to_binary_recursive_helper(decimal: int) -> str: """ Take a positive integer value and return its binary equivalent. >>> decimal_to_binary_recursive_helper(1000) '1111101000' >>> decimal_to_binary_recursive_helper("72") '1001000' >>> decimal_to_binary_recursive_helper("number") Traceback (most recent call last): ... ValueError: invalid literal for int() with base 10: 'number' """ decimal = int(decimal) if decimal in (0, 1): # Exit cases for the recursion return str(decimal) div, mod = divmod(decimal, 2) return decimal_to_binary_recursive_helper(div) + str(mod) def decimal_to_binary_recursive(number: str) -> str: """ Take an integer value and raise ValueError for wrong inputs, call the function above and return the output with prefix "0b" & "-0b" for positive and negative integers respectively. >>> decimal_to_binary_recursive(0) '0b0' >>> decimal_to_binary_recursive(40) '0b101000' >>> decimal_to_binary_recursive(-40) '-0b101000' >>> decimal_to_binary_recursive(40.8) Traceback (most recent call last): ... ValueError: Input value is not an integer >>> decimal_to_binary_recursive("forty") Traceback (most recent call last): ... ValueError: Input value is not an integer """ number = str(number).strip() if not number: raise ValueError("No input value was provided") negative = "-" if number.startswith("-") else "" number = number.lstrip("-") if not number.isnumeric(): raise ValueError("Input value is not an integer") return f"{negative}0b{decimal_to_binary_recursive_helper(int(number))}" if __name__ == "__main__": import doctest doctest.testmod() print(decimal_to_binary_recursive(input("Input a decimal number: "))) ================================================ FILE: conversions/decimal_to_hexadecimal.py ================================================ """Convert Base 10 (Decimal) Values to Hexadecimal Representations""" # set decimal value for each hexadecimal digit values = { 0: "0", 1: "1", 2: "2", 3: "3", 4: "4", 5: "5", 6: "6", 7: "7", 8: "8", 9: "9", 10: "a", 11: "b", 12: "c", 13: "d", 14: "e", 15: "f", } def decimal_to_hexadecimal(decimal: float) -> str: """ take integer decimal value, return hexadecimal representation as str beginning with 0x >>> decimal_to_hexadecimal(5) '0x5' >>> decimal_to_hexadecimal(15) '0xf' >>> decimal_to_hexadecimal(37) '0x25' >>> decimal_to_hexadecimal(255) '0xff' >>> decimal_to_hexadecimal(4096) '0x1000' >>> decimal_to_hexadecimal(999098) '0xf3eba' >>> # negatives work too >>> decimal_to_hexadecimal(-256) '-0x100' >>> # floats are acceptable if equivalent to an int >>> decimal_to_hexadecimal(17.0) '0x11' >>> # other floats will error >>> decimal_to_hexadecimal(16.16) # doctest: +ELLIPSIS Traceback (most recent call last): ... AssertionError >>> # strings will error as well >>> decimal_to_hexadecimal('0xfffff') # doctest: +ELLIPSIS Traceback (most recent call last): ... AssertionError >>> # results are the same when compared to Python's default hex function >>> decimal_to_hexadecimal(-256) == hex(-256) True """ assert isinstance(decimal, (int, float)) assert decimal == int(decimal) decimal = int(decimal) hexadecimal = "" negative = False if decimal < 0: negative = True decimal *= -1 while decimal > 0: decimal, remainder = divmod(decimal, 16) hexadecimal = values[remainder] + hexadecimal hexadecimal = "0x" + hexadecimal if negative: hexadecimal = "-" + hexadecimal return hexadecimal if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: conversions/decimal_to_octal.py ================================================ """Convert a Decimal Number to an Octal Number.""" import math # Modified from: # https://github.com/TheAlgorithms/Javascript/blob/master/Conversions/DecimalToOctal.js def decimal_to_octal(num: int) -> str: """Convert a Decimal Number to an Octal Number. >>> all(decimal_to_octal(i) == oct(i) for i ... in (0, 2, 8, 64, 65, 216, 255, 256, 512)) True """ octal = 0 counter = 0 while num > 0: remainder = num % 8 octal = octal + (remainder * math.floor(math.pow(10, counter))) counter += 1 num = math.floor(num / 8) # basically /= 8 without remainder if any # This formatting removes trailing '.0' from `octal`. return f"0o{int(octal)}" def main() -> None: """Print octal equivalents of decimal numbers.""" print("\n2 in octal is:") print(decimal_to_octal(2)) # = 2 print("\n8 in octal is:") print(decimal_to_octal(8)) # = 10 print("\n65 in octal is:") print(decimal_to_octal(65)) # = 101 print("\n216 in octal is:") print(decimal_to_octal(216)) # = 330 print("\n512 in octal is:") print(decimal_to_octal(512)) # = 1000 print("\n") if __name__ == "__main__": main() ================================================ FILE: conversions/energy_conversions.py ================================================ """ Conversion of energy units. Available units: joule, kilojoule, megajoule, gigajoule,\ wattsecond, watthour, kilowatthour, newtonmeter, calorie_nutr,\ kilocalorie_nutr, electronvolt, britishthermalunit_it, footpound USAGE : -> Import this file into their respective project. -> Use the function energy_conversion() for conversion of energy units. -> Parameters : -> from_type : From which type you want to convert -> to_type : To which type you want to convert -> value : the value which you want to convert REFERENCES : -> Wikipedia reference: https://en.wikipedia.org/wiki/Units_of_energy -> Wikipedia reference: https://en.wikipedia.org/wiki/Joule -> Wikipedia reference: https://en.wikipedia.org/wiki/Kilowatt-hour -> Wikipedia reference: https://en.wikipedia.org/wiki/Newton-metre -> Wikipedia reference: https://en.wikipedia.org/wiki/Calorie -> Wikipedia reference: https://en.wikipedia.org/wiki/Electronvolt -> Wikipedia reference: https://en.wikipedia.org/wiki/British_thermal_unit -> Wikipedia reference: https://en.wikipedia.org/wiki/Foot-pound_(energy) -> Unit converter reference: https://www.unitconverters.net/energy-converter.html """ ENERGY_CONVERSION: dict[str, float] = { "joule": 1.0, "kilojoule": 1_000, "megajoule": 1_000_000, "gigajoule": 1_000_000_000, "wattsecond": 1.0, "watthour": 3_600, "kilowatthour": 3_600_000, "newtonmeter": 1.0, "calorie_nutr": 4_186.8, "kilocalorie_nutr": 4_186_800.00, "electronvolt": 1.602_176_634e-19, "britishthermalunit_it": 1_055.055_85, "footpound": 1.355_818, } def energy_conversion(from_type: str, to_type: str, value: float) -> float: """ Conversion of energy units. >>> energy_conversion("joule", "joule", 1) 1.0 >>> energy_conversion("joule", "kilojoule", 1) 0.001 >>> energy_conversion("joule", "megajoule", 1) 1e-06 >>> energy_conversion("joule", "gigajoule", 1) 1e-09 >>> energy_conversion("joule", "wattsecond", 1) 1.0 >>> energy_conversion("joule", "watthour", 1) 0.0002777777777777778 >>> energy_conversion("joule", "kilowatthour", 1) 2.7777777777777776e-07 >>> energy_conversion("joule", "newtonmeter", 1) 1.0 >>> energy_conversion("joule", "calorie_nutr", 1) 0.00023884589662749592 >>> energy_conversion("joule", "kilocalorie_nutr", 1) 2.388458966274959e-07 >>> energy_conversion("joule", "electronvolt", 1) 6.241509074460763e+18 >>> energy_conversion("joule", "britishthermalunit_it", 1) 0.0009478171226670134 >>> energy_conversion("joule", "footpound", 1) 0.7375621211696556 >>> energy_conversion("joule", "megajoule", 1000) 0.001 >>> energy_conversion("calorie_nutr", "kilocalorie_nutr", 1000) 1.0 >>> energy_conversion("kilowatthour", "joule", 10) 36000000.0 >>> energy_conversion("britishthermalunit_it", "footpound", 1) 778.1692306784539 >>> energy_conversion("watthour", "joule", "a") # doctest: +ELLIPSIS Traceback (most recent call last): ... TypeError: unsupported operand type(s) for /: 'str' and 'float' >>> energy_conversion("wrongunit", "joule", 1) # doctest: +ELLIPSIS Traceback (most recent call last): ... ValueError: Incorrect 'from_type' or 'to_type' value: 'wrongunit', 'joule' Valid values are: joule, ... footpound >>> energy_conversion("joule", "wrongunit", 1) # doctest: +ELLIPSIS Traceback (most recent call last): ... ValueError: Incorrect 'from_type' or 'to_type' value: 'joule', 'wrongunit' Valid values are: joule, ... footpound >>> energy_conversion("123", "abc", 1) # doctest: +ELLIPSIS Traceback (most recent call last): ... ValueError: Incorrect 'from_type' or 'to_type' value: '123', 'abc' Valid values are: joule, ... footpound """ if to_type not in ENERGY_CONVERSION or from_type not in ENERGY_CONVERSION: msg = ( f"Incorrect 'from_type' or 'to_type' value: {from_type!r}, {to_type!r}\n" f"Valid values are: {', '.join(ENERGY_CONVERSION)}" ) raise ValueError(msg) return value * ENERGY_CONVERSION[from_type] / ENERGY_CONVERSION[to_type] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: conversions/excel_title_to_column.py ================================================ def excel_title_to_column(column_title: str) -> int: """ Given a string column_title that represents the column title in an Excel sheet, return its corresponding column number. >>> excel_title_to_column("A") 1 >>> excel_title_to_column("B") 2 >>> excel_title_to_column("AB") 28 >>> excel_title_to_column("Z") 26 """ assert column_title.isupper() answer = 0 index = len(column_title) - 1 power = 0 while index >= 0: value = (ord(column_title[index]) - 64) * pow(26, power) answer += value power += 1 index -= 1 return answer if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: conversions/hex_to_bin.py ================================================ def hex_to_bin(hex_num: str) -> int: """ Convert a hexadecimal value to its binary equivalent #https://stackoverflow.com/questions/1425493/convert-hex-to-binary Here, we have used the bitwise right shift operator: >> Shifts the bits of the number to the right and fills 0 on voids left as a result. Similar effect as of dividing the number with some power of two. Example: a = 10 a >> 1 = 5 >>> hex_to_bin("AC") 10101100 >>> hex_to_bin("9A4") 100110100100 >>> hex_to_bin(" 12f ") 100101111 >>> hex_to_bin("FfFf") 1111111111111111 >>> hex_to_bin("-fFfF") -1111111111111111 >>> hex_to_bin("F-f") Traceback (most recent call last): ... ValueError: Invalid value was passed to the function >>> hex_to_bin("") Traceback (most recent call last): ... ValueError: No value was passed to the function """ hex_num = hex_num.strip() if not hex_num: raise ValueError("No value was passed to the function") is_negative = hex_num[0] == "-" if is_negative: hex_num = hex_num[1:] try: int_num = int(hex_num, 16) except ValueError: raise ValueError("Invalid value was passed to the function") bin_str = "" while int_num > 0: bin_str = str(int_num % 2) + bin_str int_num >>= 1 return int(("-" + bin_str) if is_negative else bin_str) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: conversions/hexadecimal_to_decimal.py ================================================ hex_table = {hex(i)[2:]: i for i in range(16)} # Use [:2] to strip off the leading '0x' def hex_to_decimal(hex_string: str) -> int: """ Convert a hexadecimal value to its decimal equivalent #https://www.programiz.com/python-programming/methods/built-in/hex >>> hex_to_decimal("a") 10 >>> hex_to_decimal("12f") 303 >>> hex_to_decimal(" 12f ") 303 >>> hex_to_decimal("FfFf") 65535 >>> hex_to_decimal("-Ff") -255 >>> hex_to_decimal("F-f") Traceback (most recent call last): ... ValueError: Non-hexadecimal value was passed to the function >>> hex_to_decimal("") Traceback (most recent call last): ... ValueError: Empty string was passed to the function >>> hex_to_decimal("12m") Traceback (most recent call last): ... ValueError: Non-hexadecimal value was passed to the function """ hex_string = hex_string.strip().lower() if not hex_string: raise ValueError("Empty string was passed to the function") is_negative = hex_string[0] == "-" if is_negative: hex_string = hex_string[1:] if not all(char in hex_table for char in hex_string): raise ValueError("Non-hexadecimal value was passed to the function") decimal_number = 0 for char in hex_string: decimal_number = 16 * decimal_number + hex_table[char] return -decimal_number if is_negative else decimal_number if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: conversions/ipv4_conversion.py ================================================ # https://www.geeksforgeeks.org/convert-ip-address-to-integer-and-vice-versa/ def ipv4_to_decimal(ipv4_address: str) -> int: """ Convert an IPv4 address to its decimal representation. Args: ip_address: A string representing an IPv4 address (e.g., "192.168.0.1"). Returns: int: The decimal representation of the IP address. >>> ipv4_to_decimal("192.168.0.1") 3232235521 >>> ipv4_to_decimal("10.0.0.255") 167772415 >>> ipv4_to_decimal("10.0.255") Traceback (most recent call last): ... ValueError: Invalid IPv4 address format >>> ipv4_to_decimal("10.0.0.256") Traceback (most recent call last): ... ValueError: Invalid IPv4 octet 256 """ octets = [int(octet) for octet in ipv4_address.split(".")] if len(octets) != 4: raise ValueError("Invalid IPv4 address format") decimal_ipv4 = 0 for octet in octets: if not 0 <= octet <= 255: raise ValueError(f"Invalid IPv4 octet {octet}") # noqa: EM102 decimal_ipv4 = (decimal_ipv4 << 8) + int(octet) return decimal_ipv4 def alt_ipv4_to_decimal(ipv4_address: str) -> int: """ >>> alt_ipv4_to_decimal("192.168.0.1") 3232235521 >>> alt_ipv4_to_decimal("10.0.0.255") 167772415 """ return int("0x" + "".join(f"{int(i):02x}" for i in ipv4_address.split(".")), 16) def decimal_to_ipv4(decimal_ipv4: int) -> str: """ Convert a decimal representation of an IP address to its IPv4 format. Args: decimal_ipv4: An integer representing the decimal IP address. Returns: The IPv4 representation of the decimal IP address. >>> decimal_to_ipv4(3232235521) '192.168.0.1' >>> decimal_to_ipv4(167772415) '10.0.0.255' >>> decimal_to_ipv4(-1) Traceback (most recent call last): ... ValueError: Invalid decimal IPv4 address """ if not (0 <= decimal_ipv4 <= 4294967295): raise ValueError("Invalid decimal IPv4 address") ip_parts = [] for _ in range(4): ip_parts.append(str(decimal_ipv4 & 255)) decimal_ipv4 >>= 8 return ".".join(reversed(ip_parts)) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: conversions/length_conversion.py ================================================ """ Conversion of length units. Available Units:- Metre,Kilometre,Feet,Inch,Centimeter,Yard,Foot,Mile,Millimeter USAGE : -> Import this file into their respective project. -> Use the function length_conversion() for conversion of length units. -> Parameters : -> value : The number of from units you want to convert -> from_type : From which type you want to convert -> to_type : To which type you want to convert REFERENCES : -> Wikipedia reference: https://en.wikipedia.org/wiki/Meter -> Wikipedia reference: https://en.wikipedia.org/wiki/Kilometer -> Wikipedia reference: https://en.wikipedia.org/wiki/Feet -> Wikipedia reference: https://en.wikipedia.org/wiki/Inch -> Wikipedia reference: https://en.wikipedia.org/wiki/Centimeter -> Wikipedia reference: https://en.wikipedia.org/wiki/Yard -> Wikipedia reference: https://en.wikipedia.org/wiki/Foot -> Wikipedia reference: https://en.wikipedia.org/wiki/Mile -> Wikipedia reference: https://en.wikipedia.org/wiki/Millimeter """ from typing import NamedTuple class FromTo(NamedTuple): from_factor: float to_factor: float TYPE_CONVERSION = { "millimeter": "mm", "centimeter": "cm", "meter": "m", "kilometer": "km", "inch": "in", "inche": "in", # Trailing 's' has been stripped off "feet": "ft", "foot": "ft", "yard": "yd", "mile": "mi", } METRIC_CONVERSION = { "mm": FromTo(0.001, 1000), "cm": FromTo(0.01, 100), "m": FromTo(1, 1), "km": FromTo(1000, 0.001), "in": FromTo(0.0254, 39.3701), "ft": FromTo(0.3048, 3.28084), "yd": FromTo(0.9144, 1.09361), "mi": FromTo(1609.34, 0.000621371), } def length_conversion(value: float, from_type: str, to_type: str) -> float: """ Conversion between length units. >>> length_conversion(4, "METER", "FEET") 13.12336 >>> length_conversion(4, "M", "FT") 13.12336 >>> length_conversion(1, "meter", "kilometer") 0.001 >>> length_conversion(1, "kilometer", "inch") 39370.1 >>> length_conversion(3, "kilometer", "mile") 1.8641130000000001 >>> length_conversion(2, "feet", "meter") 0.6096 >>> length_conversion(4, "feet", "yard") 1.333329312 >>> length_conversion(1, "inch", "meter") 0.0254 >>> length_conversion(2, "inch", "mile") 3.15656468e-05 >>> length_conversion(2, "centimeter", "millimeter") 20.0 >>> length_conversion(2, "centimeter", "yard") 0.0218722 >>> length_conversion(4, "yard", "meter") 3.6576 >>> length_conversion(4, "yard", "kilometer") 0.0036576 >>> length_conversion(3, "foot", "meter") 0.9144000000000001 >>> length_conversion(3, "foot", "inch") 36.00001944 >>> length_conversion(4, "mile", "kilometer") 6.43736 >>> length_conversion(2, "miles", "InChEs") 126719.753468 >>> length_conversion(3, "millimeter", "centimeter") 0.3 >>> length_conversion(3, "mm", "in") 0.1181103 >>> length_conversion(4, "wrongUnit", "inch") Traceback (most recent call last): ... ValueError: Invalid 'from_type' value: 'wrongUnit'. Conversion abbreviations are: mm, cm, m, km, in, ft, yd, mi """ new_from = from_type.lower().rstrip("s") new_from = TYPE_CONVERSION.get(new_from, new_from) new_to = to_type.lower().rstrip("s") new_to = TYPE_CONVERSION.get(new_to, new_to) if new_from not in METRIC_CONVERSION: msg = ( f"Invalid 'from_type' value: {from_type!r}.\n" f"Conversion abbreviations are: {', '.join(METRIC_CONVERSION)}" ) raise ValueError(msg) if new_to not in METRIC_CONVERSION: msg = ( f"Invalid 'to_type' value: {to_type!r}.\n" f"Conversion abbreviations are: {', '.join(METRIC_CONVERSION)}" ) raise ValueError(msg) return ( value * METRIC_CONVERSION[new_from].from_factor * METRIC_CONVERSION[new_to].to_factor ) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: conversions/molecular_chemistry.py ================================================ """ Functions useful for doing molecular chemistry: * molarity_to_normality * moles_to_pressure * moles_to_volume * pressure_and_volume_to_temperature """ def molarity_to_normality(nfactor: int, moles: float, volume: float) -> float: """ Convert molarity to normality. Volume is taken in litres. Wikipedia reference: https://en.wikipedia.org/wiki/Equivalent_concentration Wikipedia reference: https://en.wikipedia.org/wiki/Molar_concentration >>> molarity_to_normality(2, 3.1, 0.31) 20 >>> molarity_to_normality(4, 11.4, 5.7) 8 """ return round(float(moles / volume) * nfactor) def moles_to_pressure(volume: float, moles: float, temperature: float) -> float: """ Convert moles to pressure. Ideal gas laws are used. Temperature is taken in kelvin. Volume is taken in litres. Pressure has atm as SI unit. Wikipedia reference: https://en.wikipedia.org/wiki/Gas_laws Wikipedia reference: https://en.wikipedia.org/wiki/Pressure Wikipedia reference: https://en.wikipedia.org/wiki/Temperature >>> moles_to_pressure(0.82, 3, 300) 90 >>> moles_to_pressure(8.2, 5, 200) 10 """ return round(float((moles * 0.0821 * temperature) / (volume))) def moles_to_volume(pressure: float, moles: float, temperature: float) -> float: """ Convert moles to volume. Ideal gas laws are used. Temperature is taken in kelvin. Volume is taken in litres. Pressure has atm as SI unit. Wikipedia reference: https://en.wikipedia.org/wiki/Gas_laws Wikipedia reference: https://en.wikipedia.org/wiki/Pressure Wikipedia reference: https://en.wikipedia.org/wiki/Temperature >>> moles_to_volume(0.82, 3, 300) 90 >>> moles_to_volume(8.2, 5, 200) 10 """ return round(float((moles * 0.0821 * temperature) / (pressure))) def pressure_and_volume_to_temperature( pressure: float, moles: float, volume: float ) -> float: """ Convert pressure and volume to temperature. Ideal gas laws are used. Temperature is taken in kelvin. Volume is taken in litres. Pressure has atm as SI unit. Wikipedia reference: https://en.wikipedia.org/wiki/Gas_laws Wikipedia reference: https://en.wikipedia.org/wiki/Pressure Wikipedia reference: https://en.wikipedia.org/wiki/Temperature >>> pressure_and_volume_to_temperature(0.82, 1, 2) 20 >>> pressure_and_volume_to_temperature(8.2, 5, 3) 60 """ return round(float((pressure * volume) / (0.0821 * moles))) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: conversions/octal_to_binary.py ================================================ """ * Author: Bama Charan Chhandogi (https://github.com/BamaCharanChhandogi) * Description: Convert a Octal number to Binary. References for better understanding: https://en.wikipedia.org/wiki/Binary_number https://en.wikipedia.org/wiki/Octal """ def octal_to_binary(octal_number: str) -> str: """ Convert an Octal number to Binary. >>> octal_to_binary("17") '001111' >>> octal_to_binary("7") '111' >>> octal_to_binary("Av") Traceback (most recent call last): ... ValueError: Non-octal value was passed to the function >>> octal_to_binary("@#") Traceback (most recent call last): ... ValueError: Non-octal value was passed to the function >>> octal_to_binary("") Traceback (most recent call last): ... ValueError: Empty string was passed to the function """ if not octal_number: raise ValueError("Empty string was passed to the function") binary_number = "" octal_digits = "01234567" for digit in octal_number: if digit not in octal_digits: raise ValueError("Non-octal value was passed to the function") binary_digit = "" value = int(digit) for _ in range(3): binary_digit = str(value % 2) + binary_digit value //= 2 binary_number += binary_digit return binary_number if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: conversions/octal_to_decimal.py ================================================ def oct_to_decimal(oct_string: str) -> int: """ Convert a octal value to its decimal equivalent >>> oct_to_decimal("") Traceback (most recent call last): ... ValueError: Empty string was passed to the function >>> oct_to_decimal("-") Traceback (most recent call last): ... ValueError: Non-octal value was passed to the function >>> oct_to_decimal("e") Traceback (most recent call last): ... ValueError: Non-octal value was passed to the function >>> oct_to_decimal("8") Traceback (most recent call last): ... ValueError: Non-octal value was passed to the function >>> oct_to_decimal("-e") Traceback (most recent call last): ... ValueError: Non-octal value was passed to the function >>> oct_to_decimal("-8") Traceback (most recent call last): ... ValueError: Non-octal value was passed to the function >>> oct_to_decimal("1") 1 >>> oct_to_decimal("-1") -1 >>> oct_to_decimal("12") 10 >>> oct_to_decimal(" 12 ") 10 >>> oct_to_decimal("-45") -37 >>> oct_to_decimal("-") Traceback (most recent call last): ... ValueError: Non-octal value was passed to the function >>> oct_to_decimal("0") 0 >>> oct_to_decimal("-4055") -2093 >>> oct_to_decimal("2-0Fm") Traceback (most recent call last): ... ValueError: Non-octal value was passed to the function >>> oct_to_decimal("") Traceback (most recent call last): ... ValueError: Empty string was passed to the function >>> oct_to_decimal("19") Traceback (most recent call last): ... ValueError: Non-octal value was passed to the function """ oct_string = str(oct_string).strip() if not oct_string: raise ValueError("Empty string was passed to the function") is_negative = oct_string[0] == "-" if is_negative: oct_string = oct_string[1:] if not oct_string.isdigit() or not all(0 <= int(char) <= 7 for char in oct_string): raise ValueError("Non-octal value was passed to the function") decimal_number = 0 for char in oct_string: decimal_number = 8 * decimal_number + int(char) if is_negative: decimal_number = -decimal_number return decimal_number if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: conversions/octal_to_hexadecimal.py ================================================ def octal_to_hex(octal: str) -> str: """ Convert an Octal number to Hexadecimal number. For more information: https://en.wikipedia.org/wiki/Octal >>> octal_to_hex("100") '0x40' >>> octal_to_hex("235") '0x9D' >>> octal_to_hex(17) Traceback (most recent call last): ... TypeError: Expected a string as input >>> octal_to_hex("Av") Traceback (most recent call last): ... ValueError: Not a Valid Octal Number >>> octal_to_hex("") Traceback (most recent call last): ... ValueError: Empty string was passed to the function """ if not isinstance(octal, str): raise TypeError("Expected a string as input") if octal.startswith("0o"): octal = octal[2:] if octal == "": raise ValueError("Empty string was passed to the function") if any(char not in "01234567" for char in octal): raise ValueError("Not a Valid Octal Number") decimal = 0 for char in octal: decimal <<= 3 decimal |= int(char) hex_char = "0123456789ABCDEF" revhex = "" while decimal: revhex += hex_char[decimal & 15] decimal >>= 4 return "0x" + revhex[::-1] if __name__ == "__main__": import doctest doctest.testmod() nums = ["030", "100", "247", "235", "007"] ## Main Tests for num in nums: hexadecimal = octal_to_hex(num) expected = "0x" + hex(int(num, 8))[2:].upper() assert hexadecimal == expected print(f"Hex of '0o{num}' is: {hexadecimal}") print(f"Expected was: {expected}") print("---") ================================================ FILE: conversions/prefix_conversions.py ================================================ """ Convert International System of Units (SI) and Binary prefixes """ from __future__ import annotations from enum import Enum class SIUnit(Enum): yotta = 24 zetta = 21 exa = 18 peta = 15 tera = 12 giga = 9 mega = 6 kilo = 3 hecto = 2 deca = 1 deci = -1 centi = -2 milli = -3 micro = -6 nano = -9 pico = -12 femto = -15 atto = -18 zepto = -21 yocto = -24 class BinaryUnit(Enum): yotta = 8 zetta = 7 exa = 6 peta = 5 tera = 4 giga = 3 mega = 2 kilo = 1 def convert_si_prefix( known_amount: float, known_prefix: str | SIUnit, unknown_prefix: str | SIUnit, ) -> float: """ Wikipedia reference: https://en.wikipedia.org/wiki/Binary_prefix Wikipedia reference: https://en.wikipedia.org/wiki/International_System_of_Units >>> convert_si_prefix(1, SIUnit.giga, SIUnit.mega) 1000 >>> convert_si_prefix(1, SIUnit.mega, SIUnit.giga) 0.001 >>> convert_si_prefix(1, SIUnit.kilo, SIUnit.kilo) 1 >>> convert_si_prefix(1, 'giga', 'mega') 1000 >>> convert_si_prefix(1, 'gIGa', 'mEGa') 1000 """ if isinstance(known_prefix, str): known_prefix = SIUnit[known_prefix.lower()] if isinstance(unknown_prefix, str): unknown_prefix = SIUnit[unknown_prefix.lower()] unknown_amount: float = known_amount * ( 10 ** (known_prefix.value - unknown_prefix.value) ) return unknown_amount def convert_binary_prefix( known_amount: float, known_prefix: str | BinaryUnit, unknown_prefix: str | BinaryUnit, ) -> float: """ Wikipedia reference: https://en.wikipedia.org/wiki/Metric_prefix >>> convert_binary_prefix(1, BinaryUnit.giga, BinaryUnit.mega) 1024 >>> convert_binary_prefix(1, BinaryUnit.mega, BinaryUnit.giga) 0.0009765625 >>> convert_binary_prefix(1, BinaryUnit.kilo, BinaryUnit.kilo) 1 >>> convert_binary_prefix(1, 'giga', 'mega') 1024 >>> convert_binary_prefix(1, 'gIGa', 'mEGa') 1024 """ if isinstance(known_prefix, str): known_prefix = BinaryUnit[known_prefix.lower()] if isinstance(unknown_prefix, str): unknown_prefix = BinaryUnit[unknown_prefix.lower()] unknown_amount: float = known_amount * ( 2 ** ((known_prefix.value - unknown_prefix.value) * 10) ) return unknown_amount if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: conversions/prefix_conversions_string.py ================================================ """ * Author: Manuel Di Lullo (https://github.com/manueldilullo) * Description: Convert a number to use the correct SI or Binary unit prefix. Inspired by prefix_conversion.py file in this repository by lance-pyles URL: https://en.wikipedia.org/wiki/Metric_prefix#List_of_SI_prefixes URL: https://en.wikipedia.org/wiki/Binary_prefix """ from __future__ import annotations from enum import Enum, unique from typing import TypeVar # Create a generic variable that can be 'Enum', or any subclass. T = TypeVar("T", bound="Enum") @unique class BinaryUnit(Enum): yotta = 80 zetta = 70 exa = 60 peta = 50 tera = 40 giga = 30 mega = 20 kilo = 10 @unique class SIUnit(Enum): yotta = 24 zetta = 21 exa = 18 peta = 15 tera = 12 giga = 9 mega = 6 kilo = 3 hecto = 2 deca = 1 deci = -1 centi = -2 milli = -3 micro = -6 nano = -9 pico = -12 femto = -15 atto = -18 zepto = -21 yocto = -24 @classmethod def get_positive(cls) -> dict: """ Returns a dictionary with only the elements of this enum that has a positive value >>> from itertools import islice >>> positive = SIUnit.get_positive() >>> inc = iter(positive.items()) >>> dict(islice(inc, len(positive) // 2)) {'yotta': 24, 'zetta': 21, 'exa': 18, 'peta': 15, 'tera': 12} >>> dict(inc) {'giga': 9, 'mega': 6, 'kilo': 3, 'hecto': 2, 'deca': 1} """ return {unit.name: unit.value for unit in cls if unit.value > 0} @classmethod def get_negative(cls) -> dict: """ Returns a dictionary with only the elements of this enum that has a negative value @example >>> from itertools import islice >>> negative = SIUnit.get_negative() >>> inc = iter(negative.items()) >>> dict(islice(inc, len(negative) // 2)) {'deci': -1, 'centi': -2, 'milli': -3, 'micro': -6, 'nano': -9} >>> dict(inc) {'pico': -12, 'femto': -15, 'atto': -18, 'zepto': -21, 'yocto': -24} """ return {unit.name: unit.value for unit in cls if unit.value < 0} def add_si_prefix(value: float) -> str: """ Function that converts a number to his version with SI prefix @input value (an integer) @example: >>> add_si_prefix(10000) '10.0 kilo' """ prefixes = SIUnit.get_positive() if value > 0 else SIUnit.get_negative() for name_prefix, value_prefix in prefixes.items(): numerical_part = value / (10**value_prefix) if numerical_part > 1: return f"{numerical_part!s} {name_prefix}" return str(value) def add_binary_prefix(value: float) -> str: """ Function that converts a number to his version with Binary prefix @input value (an integer) @example: >>> add_binary_prefix(65536) '64.0 kilo' """ for prefix in BinaryUnit: numerical_part = value / (2**prefix.value) if numerical_part > 1: return f"{numerical_part!s} {prefix.name}" return str(value) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: conversions/pressure_conversions.py ================================================ """ Conversion of pressure units. Available Units:- Pascal,Bar,Kilopascal,Megapascal,psi(pound per square inch), inHg(in mercury column),torr,atm USAGE : -> Import this file into their respective project. -> Use the function pressure_conversion() for conversion of pressure units. -> Parameters : -> value : The number of from units you want to convert -> from_type : From which type you want to convert -> to_type : To which type you want to convert REFERENCES : -> Wikipedia reference: https://en.wikipedia.org/wiki/Pascal_(unit) -> Wikipedia reference: https://en.wikipedia.org/wiki/Pound_per_square_inch -> Wikipedia reference: https://en.wikipedia.org/wiki/Inch_of_mercury -> Wikipedia reference: https://en.wikipedia.org/wiki/Torr -> https://en.wikipedia.org/wiki/Standard_atmosphere_(unit) -> https://msestudent.com/what-are-the-units-of-pressure/ -> https://www.unitconverters.net/pressure-converter.html """ from typing import NamedTuple class FromTo(NamedTuple): from_factor: float to_factor: float PRESSURE_CONVERSION = { "atm": FromTo(1, 1), "pascal": FromTo(0.0000098, 101325), "bar": FromTo(0.986923, 1.01325), "kilopascal": FromTo(0.00986923, 101.325), "megapascal": FromTo(9.86923, 0.101325), "psi": FromTo(0.068046, 14.6959), "inHg": FromTo(0.0334211, 29.9213), "torr": FromTo(0.00131579, 760), } def pressure_conversion(value: float, from_type: str, to_type: str) -> float: """ Conversion between pressure units. >>> pressure_conversion(4, "atm", "pascal") 405300 >>> pressure_conversion(1, "pascal", "psi") 0.00014401981999999998 >>> pressure_conversion(1, "bar", "atm") 0.986923 >>> pressure_conversion(3, "kilopascal", "bar") 0.029999991892499998 >>> pressure_conversion(2, "megapascal", "psi") 290.074434314 >>> pressure_conversion(4, "psi", "torr") 206.85984 >>> pressure_conversion(1, "inHg", "atm") 0.0334211 >>> pressure_conversion(1, "torr", "psi") 0.019336718261000002 >>> pressure_conversion(4, "wrongUnit", "atm") Traceback (most recent call last): ... ValueError: Invalid 'from_type' value: 'wrongUnit' Supported values are: atm, pascal, bar, kilopascal, megapascal, psi, inHg, torr """ if from_type not in PRESSURE_CONVERSION: raise ValueError( f"Invalid 'from_type' value: {from_type!r} Supported values are:\n" + ", ".join(PRESSURE_CONVERSION) ) if to_type not in PRESSURE_CONVERSION: raise ValueError( f"Invalid 'to_type' value: {to_type!r}. Supported values are:\n" + ", ".join(PRESSURE_CONVERSION) ) return ( value * PRESSURE_CONVERSION[from_type].from_factor * PRESSURE_CONVERSION[to_type].to_factor ) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: conversions/rectangular_to_polar.py ================================================ import math def rectangular_to_polar(real: float, img: float) -> tuple[float, float]: """ https://en.wikipedia.org/wiki/Polar_coordinate_system >>> rectangular_to_polar(5,-5) (7.07, -45.0) >>> rectangular_to_polar(-1,1) (1.41, 135.0) >>> rectangular_to_polar(-1,-1) (1.41, -135.0) >>> rectangular_to_polar(1e-10,1e-10) (0.0, 45.0) >>> rectangular_to_polar(-1e-10,1e-10) (0.0, 135.0) >>> rectangular_to_polar(9.75,5.93) (11.41, 31.31) >>> rectangular_to_polar(10000,99999) (100497.76, 84.29) """ mod = round(math.sqrt((real**2) + (img**2)), 2) ang = round(math.degrees(math.atan2(img, real)), 2) return (mod, ang) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: conversions/rgb_cmyk_conversion.py ================================================ def rgb_to_cmyk(r_input: int, g_input: int, b_input: int) -> tuple[int, int, int, int]: """ Simple RGB to CMYK conversion. Returns percentages of CMYK paint. https://www.programmingalgorithms.com/algorithm/rgb-to-cmyk/ Note: this is a very popular algorithm that converts colors linearly and gives only approximate results. Actual preparation for printing requires advanced color conversion considering the color profiles and parameters of the target device. >>> rgb_to_cmyk(255, 200, "a") Traceback (most recent call last): ... ValueError: Expected int, found (, , ) >>> rgb_to_cmyk(255, 255, 999) Traceback (most recent call last): ... ValueError: Expected int of the range 0..255 >>> rgb_to_cmyk(255, 255, 255) # white (0, 0, 0, 0) >>> rgb_to_cmyk(128, 128, 128) # gray (0, 0, 0, 50) >>> rgb_to_cmyk(0, 0, 0) # black (0, 0, 0, 100) >>> rgb_to_cmyk(255, 0, 0) # red (0, 100, 100, 0) >>> rgb_to_cmyk(0, 255, 0) # green (100, 0, 100, 0) >>> rgb_to_cmyk(0, 0, 255) # blue (100, 100, 0, 0) """ if ( not isinstance(r_input, int) or not isinstance(g_input, int) or not isinstance(b_input, int) ): msg = f"Expected int, found {type(r_input), type(g_input), type(b_input)}" raise ValueError(msg) if not 0 <= r_input < 256 or not 0 <= g_input < 256 or not 0 <= b_input < 256: raise ValueError("Expected int of the range 0..255") # changing range from 0..255 to 0..1 r = r_input / 255 g = g_input / 255 b = b_input / 255 k = 1 - max(r, g, b) if k == 1: # pure black return 0, 0, 0, 100 c = round(100 * (1 - r - k) / (1 - k)) m = round(100 * (1 - g - k) / (1 - k)) y = round(100 * (1 - b - k) / (1 - k)) k = round(100 * k) return c, m, y, k if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: conversions/rgb_hsv_conversion.py ================================================ """ The RGB color model is an additive color model in which red, green, and blue light are added together in various ways to reproduce a broad array of colors. The name of the model comes from the initials of the three additive primary colors, red, green, and blue. Meanwhile, the HSV representation models how colors appear under light. In it, colors are represented using three components: hue, saturation and (brightness-)value. This file provides functions for converting colors from one representation to the other. (description adapted from https://en.wikipedia.org/wiki/RGB_color_model and https://en.wikipedia.org/wiki/HSL_and_HSV). """ def hsv_to_rgb(hue: float, saturation: float, value: float) -> list[int]: """ Conversion from the HSV-representation to the RGB-representation. Expected RGB-values taken from https://www.rapidtables.com/convert/color/hsv-to-rgb.html >>> hsv_to_rgb(0, 0, 0) [0, 0, 0] >>> hsv_to_rgb(0, 0, 1) [255, 255, 255] >>> hsv_to_rgb(0, 1, 1) [255, 0, 0] >>> hsv_to_rgb(60, 1, 1) [255, 255, 0] >>> hsv_to_rgb(120, 1, 1) [0, 255, 0] >>> hsv_to_rgb(240, 1, 1) [0, 0, 255] >>> hsv_to_rgb(300, 1, 1) [255, 0, 255] >>> hsv_to_rgb(180, 0.5, 0.5) [64, 128, 128] >>> hsv_to_rgb(234, 0.14, 0.88) [193, 196, 224] >>> hsv_to_rgb(330, 0.75, 0.5) [128, 32, 80] """ if hue < 0 or hue > 360: raise Exception("hue should be between 0 and 360") if saturation < 0 or saturation > 1: raise Exception("saturation should be between 0 and 1") if value < 0 or value > 1: raise Exception("value should be between 0 and 1") chroma = value * saturation hue_section = hue / 60 second_largest_component = chroma * (1 - abs(hue_section % 2 - 1)) match_value = value - chroma if hue_section >= 0 and hue_section <= 1: red = round(255 * (chroma + match_value)) green = round(255 * (second_largest_component + match_value)) blue = round(255 * (match_value)) elif hue_section > 1 and hue_section <= 2: red = round(255 * (second_largest_component + match_value)) green = round(255 * (chroma + match_value)) blue = round(255 * (match_value)) elif hue_section > 2 and hue_section <= 3: red = round(255 * (match_value)) green = round(255 * (chroma + match_value)) blue = round(255 * (second_largest_component + match_value)) elif hue_section > 3 and hue_section <= 4: red = round(255 * (match_value)) green = round(255 * (second_largest_component + match_value)) blue = round(255 * (chroma + match_value)) elif hue_section > 4 and hue_section <= 5: red = round(255 * (second_largest_component + match_value)) green = round(255 * (match_value)) blue = round(255 * (chroma + match_value)) else: red = round(255 * (chroma + match_value)) green = round(255 * (match_value)) blue = round(255 * (second_largest_component + match_value)) return [red, green, blue] def rgb_to_hsv(red: int, green: int, blue: int) -> list[float]: """ Conversion from the RGB-representation to the HSV-representation. The tested values are the reverse values from the hsv_to_rgb-doctests. Function "approximately_equal_hsv" is needed because of small deviations due to rounding for the RGB-values. >>> approximately_equal_hsv(rgb_to_hsv(0, 0, 0), [0, 0, 0]) True >>> approximately_equal_hsv(rgb_to_hsv(255, 255, 255), [0, 0, 1]) True >>> approximately_equal_hsv(rgb_to_hsv(255, 0, 0), [0, 1, 1]) True >>> approximately_equal_hsv(rgb_to_hsv(255, 255, 0), [60, 1, 1]) True >>> approximately_equal_hsv(rgb_to_hsv(0, 255, 0), [120, 1, 1]) True >>> approximately_equal_hsv(rgb_to_hsv(0, 0, 255), [240, 1, 1]) True >>> approximately_equal_hsv(rgb_to_hsv(255, 0, 255), [300, 1, 1]) True >>> approximately_equal_hsv(rgb_to_hsv(64, 128, 128), [180, 0.5, 0.5]) True >>> approximately_equal_hsv(rgb_to_hsv(193, 196, 224), [234, 0.14, 0.88]) True >>> approximately_equal_hsv(rgb_to_hsv(128, 32, 80), [330, 0.75, 0.5]) True """ if red < 0 or red > 255: raise Exception("red should be between 0 and 255") if green < 0 or green > 255: raise Exception("green should be between 0 and 255") if blue < 0 or blue > 255: raise Exception("blue should be between 0 and 255") float_red = red / 255 float_green = green / 255 float_blue = blue / 255 value = max(float_red, float_green, float_blue) chroma = value - min(float_red, float_green, float_blue) saturation = 0 if value == 0 else chroma / value if chroma == 0: hue = 0.0 elif value == float_red: hue = 60 * (0 + (float_green - float_blue) / chroma) elif value == float_green: hue = 60 * (2 + (float_blue - float_red) / chroma) else: hue = 60 * (4 + (float_red - float_green) / chroma) hue = (hue + 360) % 360 return [hue, saturation, value] def approximately_equal_hsv(hsv_1: list[float], hsv_2: list[float]) -> bool: """ Utility-function to check that two hsv-colors are approximately equal >>> approximately_equal_hsv([0, 0, 0], [0, 0, 0]) True >>> approximately_equal_hsv([180, 0.5, 0.3], [179.9999, 0.500001, 0.30001]) True >>> approximately_equal_hsv([0, 0, 0], [1, 0, 0]) False >>> approximately_equal_hsv([180, 0.5, 0.3], [179.9999, 0.6, 0.30001]) False """ check_hue = abs(hsv_1[0] - hsv_2[0]) < 0.2 check_saturation = abs(hsv_1[1] - hsv_2[1]) < 0.002 check_value = abs(hsv_1[2] - hsv_2[2]) < 0.002 return check_hue and check_saturation and check_value ================================================ FILE: conversions/roman_numerals.py ================================================ ROMAN = [ (1000, "M"), (900, "CM"), (500, "D"), (400, "CD"), (100, "C"), (90, "XC"), (50, "L"), (40, "XL"), (10, "X"), (9, "IX"), (5, "V"), (4, "IV"), (1, "I"), ] def roman_to_int(roman: str) -> int: """ LeetCode No. 13 Roman to Integer Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. https://en.wikipedia.org/wiki/Roman_numerals >>> tests = {"III": 3, "CLIV": 154, "MIX": 1009, "MMD": 2500, "MMMCMXCIX": 3999} >>> all(roman_to_int(key) == value for key, value in tests.items()) True """ vals = {"I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000} total = 0 place = 0 while place < len(roman): if (place + 1 < len(roman)) and (vals[roman[place]] < vals[roman[place + 1]]): total += vals[roman[place + 1]] - vals[roman[place]] place += 2 else: total += vals[roman[place]] place += 1 return total def int_to_roman(number: int) -> str: """ Given a integer, convert it to an roman numeral. https://en.wikipedia.org/wiki/Roman_numerals >>> tests = {"III": 3, "CLIV": 154, "MIX": 1009, "MMD": 2500, "MMMCMXCIX": 3999} >>> all(int_to_roman(value) == key for key, value in tests.items()) True """ result = [] for arabic, roman in ROMAN: (factor, number) = divmod(number, arabic) result.append(roman * factor) if number == 0: break return "".join(result) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: conversions/speed_conversions.py ================================================ """ Convert speed units https://en.wikipedia.org/wiki/Kilometres_per_hour https://en.wikipedia.org/wiki/Miles_per_hour https://en.wikipedia.org/wiki/Knot_(unit) https://en.wikipedia.org/wiki/Metre_per_second """ speed_chart: dict[str, float] = { "km/h": 1.0, "m/s": 3.6, "mph": 1.609344, "knot": 1.852, } speed_chart_inverse: dict[str, float] = { "km/h": 1.0, "m/s": 0.277777778, "mph": 0.621371192, "knot": 0.539956803, } def convert_speed(speed: float, unit_from: str, unit_to: str) -> float: """ Convert speed from one unit to another using the speed_chart above. "km/h": 1.0, "m/s": 3.6, "mph": 1.609344, "knot": 1.852, >>> convert_speed(100, "km/h", "m/s") 27.778 >>> convert_speed(100, "km/h", "mph") 62.137 >>> convert_speed(100, "km/h", "knot") 53.996 >>> convert_speed(100, "m/s", "km/h") 360.0 >>> convert_speed(100, "m/s", "mph") 223.694 >>> convert_speed(100, "m/s", "knot") 194.384 >>> convert_speed(100, "mph", "km/h") 160.934 >>> convert_speed(100, "mph", "m/s") 44.704 >>> convert_speed(100, "mph", "knot") 86.898 >>> convert_speed(100, "knot", "km/h") 185.2 >>> convert_speed(100, "knot", "m/s") 51.444 >>> convert_speed(100, "knot", "mph") 115.078 """ if unit_to not in speed_chart or unit_from not in speed_chart_inverse: msg = ( f"Incorrect 'from_type' or 'to_type' value: {unit_from!r}, {unit_to!r}\n" f"Valid values are: {', '.join(speed_chart_inverse)}" ) raise ValueError(msg) return round(speed * speed_chart[unit_from] * speed_chart_inverse[unit_to], 3) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: conversions/temperature_conversions.py ================================================ """Convert between different units of temperature""" def celsius_to_fahrenheit(celsius: float, ndigits: int = 2) -> float: """ Convert a given value from Celsius to Fahrenheit and round it to 2 decimal places. Wikipedia reference: https://en.wikipedia.org/wiki/Celsius Wikipedia reference: https://en.wikipedia.org/wiki/Fahrenheit >>> celsius_to_fahrenheit(273.354, 3) 524.037 >>> celsius_to_fahrenheit(273.354, 0) 524.0 >>> celsius_to_fahrenheit(-40.0) -40.0 >>> celsius_to_fahrenheit(-20.0) -4.0 >>> celsius_to_fahrenheit(0) 32.0 >>> celsius_to_fahrenheit(20) 68.0 >>> celsius_to_fahrenheit("40") 104.0 >>> celsius_to_fahrenheit("celsius") Traceback (most recent call last): ... ValueError: could not convert string to float: 'celsius' """ return round((float(celsius) * 9 / 5) + 32, ndigits) def celsius_to_kelvin(celsius: float, ndigits: int = 2) -> float: """ Convert a given value from Celsius to Kelvin and round it to 2 decimal places. Wikipedia reference: https://en.wikipedia.org/wiki/Celsius Wikipedia reference: https://en.wikipedia.org/wiki/Kelvin >>> celsius_to_kelvin(273.354, 3) 546.504 >>> celsius_to_kelvin(273.354, 0) 547.0 >>> celsius_to_kelvin(0) 273.15 >>> celsius_to_kelvin(20.0) 293.15 >>> celsius_to_kelvin("40") 313.15 >>> celsius_to_kelvin("celsius") Traceback (most recent call last): ... ValueError: could not convert string to float: 'celsius' """ return round(float(celsius) + 273.15, ndigits) def celsius_to_rankine(celsius: float, ndigits: int = 2) -> float: """ Convert a given value from Celsius to Rankine and round it to 2 decimal places. Wikipedia reference: https://en.wikipedia.org/wiki/Celsius Wikipedia reference: https://en.wikipedia.org/wiki/Rankine_scale >>> celsius_to_rankine(273.354, 3) 983.707 >>> celsius_to_rankine(273.354, 0) 984.0 >>> celsius_to_rankine(0) 491.67 >>> celsius_to_rankine(20.0) 527.67 >>> celsius_to_rankine("40") 563.67 >>> celsius_to_rankine("celsius") Traceback (most recent call last): ... ValueError: could not convert string to float: 'celsius' """ return round((float(celsius) * 9 / 5) + 491.67, ndigits) def fahrenheit_to_celsius(fahrenheit: float, ndigits: int = 2) -> float: """ Convert a given value from Fahrenheit to Celsius and round it to 2 decimal places. Wikipedia reference: https://en.wikipedia.org/wiki/Fahrenheit Wikipedia reference: https://en.wikipedia.org/wiki/Celsius >>> fahrenheit_to_celsius(273.354, 3) 134.086 >>> fahrenheit_to_celsius(273.354, 0) 134.0 >>> fahrenheit_to_celsius(0) -17.78 >>> fahrenheit_to_celsius(20.0) -6.67 >>> fahrenheit_to_celsius(40.0) 4.44 >>> fahrenheit_to_celsius(60) 15.56 >>> fahrenheit_to_celsius(80) 26.67 >>> fahrenheit_to_celsius("100") 37.78 >>> fahrenheit_to_celsius("fahrenheit") Traceback (most recent call last): ... ValueError: could not convert string to float: 'fahrenheit' """ return round((float(fahrenheit) - 32) * 5 / 9, ndigits) def fahrenheit_to_kelvin(fahrenheit: float, ndigits: int = 2) -> float: """ Convert a given value from Fahrenheit to Kelvin and round it to 2 decimal places. Wikipedia reference: https://en.wikipedia.org/wiki/Fahrenheit Wikipedia reference: https://en.wikipedia.org/wiki/Kelvin >>> fahrenheit_to_kelvin(273.354, 3) 407.236 >>> fahrenheit_to_kelvin(273.354, 0) 407.0 >>> fahrenheit_to_kelvin(0) 255.37 >>> fahrenheit_to_kelvin(20.0) 266.48 >>> fahrenheit_to_kelvin(40.0) 277.59 >>> fahrenheit_to_kelvin(60) 288.71 >>> fahrenheit_to_kelvin(80) 299.82 >>> fahrenheit_to_kelvin("100") 310.93 >>> fahrenheit_to_kelvin("fahrenheit") Traceback (most recent call last): ... ValueError: could not convert string to float: 'fahrenheit' """ return round(((float(fahrenheit) - 32) * 5 / 9) + 273.15, ndigits) def fahrenheit_to_rankine(fahrenheit: float, ndigits: int = 2) -> float: """ Convert a given value from Fahrenheit to Rankine and round it to 2 decimal places. Wikipedia reference: https://en.wikipedia.org/wiki/Fahrenheit Wikipedia reference: https://en.wikipedia.org/wiki/Rankine_scale >>> fahrenheit_to_rankine(273.354, 3) 733.024 >>> fahrenheit_to_rankine(273.354, 0) 733.0 >>> fahrenheit_to_rankine(0) 459.67 >>> fahrenheit_to_rankine(20.0) 479.67 >>> fahrenheit_to_rankine(40.0) 499.67 >>> fahrenheit_to_rankine(60) 519.67 >>> fahrenheit_to_rankine(80) 539.67 >>> fahrenheit_to_rankine("100") 559.67 >>> fahrenheit_to_rankine("fahrenheit") Traceback (most recent call last): ... ValueError: could not convert string to float: 'fahrenheit' """ return round(float(fahrenheit) + 459.67, ndigits) def kelvin_to_celsius(kelvin: float, ndigits: int = 2) -> float: """ Convert a given value from Kelvin to Celsius and round it to 2 decimal places. Wikipedia reference: https://en.wikipedia.org/wiki/Kelvin Wikipedia reference: https://en.wikipedia.org/wiki/Celsius >>> kelvin_to_celsius(273.354, 3) 0.204 >>> kelvin_to_celsius(273.354, 0) 0.0 >>> kelvin_to_celsius(273.15) 0.0 >>> kelvin_to_celsius(300) 26.85 >>> kelvin_to_celsius("315.5") 42.35 >>> kelvin_to_celsius("kelvin") Traceback (most recent call last): ... ValueError: could not convert string to float: 'kelvin' """ return round(float(kelvin) - 273.15, ndigits) def kelvin_to_fahrenheit(kelvin: float, ndigits: int = 2) -> float: """ Convert a given value from Kelvin to Fahrenheit and round it to 2 decimal places. Wikipedia reference: https://en.wikipedia.org/wiki/Kelvin Wikipedia reference: https://en.wikipedia.org/wiki/Fahrenheit >>> kelvin_to_fahrenheit(273.354, 3) 32.367 >>> kelvin_to_fahrenheit(273.354, 0) 32.0 >>> kelvin_to_fahrenheit(273.15) 32.0 >>> kelvin_to_fahrenheit(300) 80.33 >>> kelvin_to_fahrenheit("315.5") 108.23 >>> kelvin_to_fahrenheit("kelvin") Traceback (most recent call last): ... ValueError: could not convert string to float: 'kelvin' """ return round(((float(kelvin) - 273.15) * 9 / 5) + 32, ndigits) def kelvin_to_rankine(kelvin: float, ndigits: int = 2) -> float: """ Convert a given value from Kelvin to Rankine and round it to 2 decimal places. Wikipedia reference: https://en.wikipedia.org/wiki/Kelvin Wikipedia reference: https://en.wikipedia.org/wiki/Rankine_scale >>> kelvin_to_rankine(273.354, 3) 492.037 >>> kelvin_to_rankine(273.354, 0) 492.0 >>> kelvin_to_rankine(0) 0.0 >>> kelvin_to_rankine(20.0) 36.0 >>> kelvin_to_rankine("40") 72.0 >>> kelvin_to_rankine("kelvin") Traceback (most recent call last): ... ValueError: could not convert string to float: 'kelvin' """ return round((float(kelvin) * 9 / 5), ndigits) def rankine_to_celsius(rankine: float, ndigits: int = 2) -> float: """ Convert a given value from Rankine to Celsius and round it to 2 decimal places. Wikipedia reference: https://en.wikipedia.org/wiki/Rankine_scale Wikipedia reference: https://en.wikipedia.org/wiki/Celsius >>> rankine_to_celsius(273.354, 3) -121.287 >>> rankine_to_celsius(273.354, 0) -121.0 >>> rankine_to_celsius(273.15) -121.4 >>> rankine_to_celsius(300) -106.48 >>> rankine_to_celsius("315.5") -97.87 >>> rankine_to_celsius("rankine") Traceback (most recent call last): ... ValueError: could not convert string to float: 'rankine' """ return round((float(rankine) - 491.67) * 5 / 9, ndigits) def rankine_to_fahrenheit(rankine: float, ndigits: int = 2) -> float: """ Convert a given value from Rankine to Fahrenheit and round it to 2 decimal places. Wikipedia reference: https://en.wikipedia.org/wiki/Rankine_scale Wikipedia reference: https://en.wikipedia.org/wiki/Fahrenheit >>> rankine_to_fahrenheit(273.15) -186.52 >>> rankine_to_fahrenheit(300) -159.67 >>> rankine_to_fahrenheit("315.5") -144.17 >>> rankine_to_fahrenheit("rankine") Traceback (most recent call last): ... ValueError: could not convert string to float: 'rankine' """ return round(float(rankine) - 459.67, ndigits) def rankine_to_kelvin(rankine: float, ndigits: int = 2) -> float: """ Convert a given value from Rankine to Kelvin and round it to 2 decimal places. Wikipedia reference: https://en.wikipedia.org/wiki/Rankine_scale Wikipedia reference: https://en.wikipedia.org/wiki/Kelvin >>> rankine_to_kelvin(0) 0.0 >>> rankine_to_kelvin(20.0) 11.11 >>> rankine_to_kelvin("40") 22.22 >>> rankine_to_kelvin("rankine") Traceback (most recent call last): ... ValueError: could not convert string to float: 'rankine' """ return round((float(rankine) * 5 / 9), ndigits) def reaumur_to_kelvin(reaumur: float, ndigits: int = 2) -> float: """ Convert a given value from reaumur to Kelvin and round it to 2 decimal places. Reference:- http://www.csgnetwork.com/temp2conv.html >>> reaumur_to_kelvin(0) 273.15 >>> reaumur_to_kelvin(20.0) 298.15 >>> reaumur_to_kelvin(40) 323.15 >>> reaumur_to_kelvin("reaumur") Traceback (most recent call last): ... ValueError: could not convert string to float: 'reaumur' """ return round((float(reaumur) * 1.25 + 273.15), ndigits) def reaumur_to_fahrenheit(reaumur: float, ndigits: int = 2) -> float: """ Convert a given value from reaumur to fahrenheit and round it to 2 decimal places. Reference:- http://www.csgnetwork.com/temp2conv.html >>> reaumur_to_fahrenheit(0) 32.0 >>> reaumur_to_fahrenheit(20.0) 77.0 >>> reaumur_to_fahrenheit(40) 122.0 >>> reaumur_to_fahrenheit("reaumur") Traceback (most recent call last): ... ValueError: could not convert string to float: 'reaumur' """ return round((float(reaumur) * 2.25 + 32), ndigits) def reaumur_to_celsius(reaumur: float, ndigits: int = 2) -> float: """ Convert a given value from reaumur to celsius and round it to 2 decimal places. Reference:- http://www.csgnetwork.com/temp2conv.html >>> reaumur_to_celsius(0) 0.0 >>> reaumur_to_celsius(20.0) 25.0 >>> reaumur_to_celsius(40) 50.0 >>> reaumur_to_celsius("reaumur") Traceback (most recent call last): ... ValueError: could not convert string to float: 'reaumur' """ return round((float(reaumur) * 1.25), ndigits) def reaumur_to_rankine(reaumur: float, ndigits: int = 2) -> float: """ Convert a given value from reaumur to rankine and round it to 2 decimal places. Reference:- http://www.csgnetwork.com/temp2conv.html >>> reaumur_to_rankine(0) 491.67 >>> reaumur_to_rankine(20.0) 536.67 >>> reaumur_to_rankine(40) 581.67 >>> reaumur_to_rankine("reaumur") Traceback (most recent call last): ... ValueError: could not convert string to float: 'reaumur' """ return round((float(reaumur) * 2.25 + 32 + 459.67), ndigits) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: conversions/time_conversions.py ================================================ """ A unit of time is any particular time interval, used as a standard way of measuring or expressing duration. The base unit of time in the International System of Units (SI), and by extension most of the Western world, is the second, defined as about 9 billion oscillations of the caesium atom. https://en.wikipedia.org/wiki/Unit_of_time """ time_chart: dict[str, float] = { "seconds": 1.0, "minutes": 60.0, # 1 minute = 60 sec "hours": 3600.0, # 1 hour = 60 minutes = 3600 seconds "days": 86400.0, # 1 day = 24 hours = 1440 min = 86400 sec "weeks": 604800.0, # 1 week=7d=168hr=10080min = 604800 sec "months": 2629800.0, # Approximate value for a month in seconds "years": 31557600.0, # Approximate value for a year in seconds } time_chart_inverse: dict[str, float] = { key: 1 / value for key, value in time_chart.items() } def convert_time(time_value: float, unit_from: str, unit_to: str) -> float: """ Convert time from one unit to another using the time_chart above. >>> convert_time(3600, "seconds", "hours") 1.0 >>> convert_time(3500, "Seconds", "Hours") 0.972 >>> convert_time(1, "DaYs", "hours") 24.0 >>> convert_time(120, "minutes", "SeCoNdS") 7200.0 >>> convert_time(2, "WEEKS", "days") 14.0 >>> convert_time(0.5, "hours", "MINUTES") 30.0 >>> convert_time(-3600, "seconds", "hours") Traceback (most recent call last): ... ValueError: 'time_value' must be a non-negative number. >>> convert_time("Hello", "hours", "minutes") Traceback (most recent call last): ... ValueError: 'time_value' must be a non-negative number. >>> convert_time([0, 1, 2], "weeks", "days") Traceback (most recent call last): ... ValueError: 'time_value' must be a non-negative number. >>> convert_time(1, "cool", "century") # doctest: +ELLIPSIS Traceback (most recent call last): ... ValueError: Invalid unit cool is not in seconds, minutes, hours, days, weeks, ... >>> convert_time(1, "seconds", "hot") # doctest: +ELLIPSIS Traceback (most recent call last): ... ValueError: Invalid unit hot is not in seconds, minutes, hours, days, weeks, ... """ if not isinstance(time_value, (int, float)) or time_value < 0: msg = "'time_value' must be a non-negative number." raise ValueError(msg) unit_from = unit_from.lower() unit_to = unit_to.lower() if unit_from not in time_chart or unit_to not in time_chart: invalid_unit = unit_from if unit_from not in time_chart else unit_to msg = f"Invalid unit {invalid_unit} is not in {', '.join(time_chart)}." raise ValueError(msg) return round( time_value * time_chart[unit_from] * time_chart_inverse[unit_to], 3, ) if __name__ == "__main__": import doctest doctest.testmod() print(f"{convert_time(3600,'seconds', 'hours') = :,}") print(f"{convert_time(360, 'days', 'months') = :,}") print(f"{convert_time(360, 'months', 'years') = :,}") print(f"{convert_time(1, 'years', 'seconds') = :,}") ================================================ FILE: conversions/volume_conversions.py ================================================ """ Conversion of volume units. Available Units:- Cubic metre,Litre,KiloLitre,Gallon,Cubic yard,Cubic foot,cup USAGE : -> Import this file into their respective project. -> Use the function length_conversion() for conversion of volume units. -> Parameters : -> value : The number of from units you want to convert -> from_type : From which type you want to convert -> to_type : To which type you want to convert REFERENCES : -> Wikipedia reference: https://en.wikipedia.org/wiki/Cubic_metre -> Wikipedia reference: https://en.wikipedia.org/wiki/Litre -> Wikipedia reference: https://en.wiktionary.org/wiki/kilolitre -> Wikipedia reference: https://en.wikipedia.org/wiki/Gallon -> Wikipedia reference: https://en.wikipedia.org/wiki/Cubic_yard -> Wikipedia reference: https://en.wikipedia.org/wiki/Cubic_foot -> Wikipedia reference: https://en.wikipedia.org/wiki/Cup_(unit) """ from typing import NamedTuple class FromTo(NamedTuple): from_factor: float to_factor: float METRIC_CONVERSION = { "cubic meter": FromTo(1, 1), "litre": FromTo(0.001, 1000), "kilolitre": FromTo(1, 1), "gallon": FromTo(0.00454, 264.172), "cubic yard": FromTo(0.76455, 1.30795), "cubic foot": FromTo(0.028, 35.3147), "cup": FromTo(0.000236588, 4226.75), } def volume_conversion(value: float, from_type: str, to_type: str) -> float: """ Conversion between volume units. >>> volume_conversion(4, "cubic meter", "litre") 4000 >>> volume_conversion(1, "litre", "gallon") 0.264172 >>> volume_conversion(1, "kilolitre", "cubic meter") 1 >>> volume_conversion(3, "gallon", "cubic yard") 0.017814279 >>> volume_conversion(2, "cubic yard", "litre") 1529.1 >>> volume_conversion(4, "cubic foot", "cup") 473.396 >>> volume_conversion(1, "cup", "kilolitre") 0.000236588 >>> volume_conversion(4, "wrongUnit", "litre") Traceback (most recent call last): ... ValueError: Invalid 'from_type' value: 'wrongUnit' Supported values are: cubic meter, litre, kilolitre, gallon, cubic yard, cubic foot, cup """ if from_type not in METRIC_CONVERSION: raise ValueError( f"Invalid 'from_type' value: {from_type!r} Supported values are:\n" + ", ".join(METRIC_CONVERSION) ) if to_type not in METRIC_CONVERSION: raise ValueError( f"Invalid 'to_type' value: {to_type!r}. Supported values are:\n" + ", ".join(METRIC_CONVERSION) ) return ( value * METRIC_CONVERSION[from_type].from_factor * METRIC_CONVERSION[to_type].to_factor ) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: conversions/weight_conversion.py ================================================ """ Conversion of weight units. __author__ = "Anubhav Solanki" __license__ = "MIT" __version__ = "1.1.0" __maintainer__ = "Anubhav Solanki" __email__ = "anubhavsolanki0@gmail.com" USAGE : -> Import this file into their respective project. -> Use the function weight_conversion() for conversion of weight units. -> Parameters : -> from_type : From which type you want to convert -> to_type : To which type you want to convert -> value : the value which you want to convert REFERENCES : -> Wikipedia reference: https://en.wikipedia.org/wiki/Kilogram -> Wikipedia reference: https://en.wikipedia.org/wiki/Gram -> Wikipedia reference: https://en.wikipedia.org/wiki/Millimetre -> Wikipedia reference: https://en.wikipedia.org/wiki/Tonne -> Wikipedia reference: https://en.wikipedia.org/wiki/Long_ton -> Wikipedia reference: https://en.wikipedia.org/wiki/Short_ton -> Wikipedia reference: https://en.wikipedia.org/wiki/Pound -> Wikipedia reference: https://en.wikipedia.org/wiki/Ounce -> Wikipedia reference: https://en.wikipedia.org/wiki/Fineness#Karat -> Wikipedia reference: https://en.wikipedia.org/wiki/Dalton_(unit) -> Wikipedia reference: https://en.wikipedia.org/wiki/Stone_(unit) """ KILOGRAM_CHART: dict[str, float] = { "kilogram": 1, "gram": pow(10, 3), "milligram": pow(10, 6), "metric-ton": pow(10, -3), "long-ton": 0.0009842073, "short-ton": 0.0011023122, "pound": 2.2046244202, "stone": 0.1574731728, "ounce": 35.273990723, "carrat": 5000, "atomic-mass-unit": 6.022136652e26, } WEIGHT_TYPE_CHART: dict[str, float] = { "kilogram": 1, "gram": pow(10, -3), "milligram": pow(10, -6), "metric-ton": pow(10, 3), "long-ton": 1016.04608, "short-ton": 907.184, "pound": 0.453592, "stone": 6.35029, "ounce": 0.0283495, "carrat": 0.0002, "atomic-mass-unit": 1.660540199e-27, } def weight_conversion(from_type: str, to_type: str, value: float) -> float: """ Conversion of weight unit with the help of KILOGRAM_CHART "kilogram" : 1, "gram" : pow(10, 3), "milligram" : pow(10, 6), "metric-ton" : pow(10, -3), "long-ton" : 0.0009842073, "short-ton" : 0.0011023122, "pound" : 2.2046244202, "stone": 0.1574731728, "ounce" : 35.273990723, "carrat" : 5000, "atomic-mass-unit" : 6.022136652E+26 >>> weight_conversion("kilogram","kilogram",4) 4 >>> weight_conversion("kilogram","gram",1) 1000 >>> weight_conversion("kilogram","milligram",4) 4000000 >>> weight_conversion("kilogram","metric-ton",4) 0.004 >>> weight_conversion("kilogram","long-ton",3) 0.0029526219 >>> weight_conversion("kilogram","short-ton",1) 0.0011023122 >>> weight_conversion("kilogram","pound",4) 8.8184976808 >>> weight_conversion("kilogram","stone",5) 0.7873658640000001 >>> weight_conversion("kilogram","ounce",4) 141.095962892 >>> weight_conversion("kilogram","carrat",3) 15000 >>> weight_conversion("kilogram","atomic-mass-unit",1) 6.022136652e+26 >>> weight_conversion("gram","kilogram",1) 0.001 >>> weight_conversion("gram","gram",3) 3.0 >>> weight_conversion("gram","milligram",2) 2000.0 >>> weight_conversion("gram","metric-ton",4) 4e-06 >>> weight_conversion("gram","long-ton",3) 2.9526219e-06 >>> weight_conversion("gram","short-ton",3) 3.3069366000000003e-06 >>> weight_conversion("gram","pound",3) 0.0066138732606 >>> weight_conversion("gram","stone",4) 0.0006298926912000001 >>> weight_conversion("gram","ounce",1) 0.035273990723 >>> weight_conversion("gram","carrat",2) 10.0 >>> weight_conversion("gram","atomic-mass-unit",1) 6.022136652e+23 >>> weight_conversion("milligram","kilogram",1) 1e-06 >>> weight_conversion("milligram","gram",2) 0.002 >>> weight_conversion("milligram","milligram",3) 3.0 >>> weight_conversion("milligram","metric-ton",3) 3e-09 >>> weight_conversion("milligram","long-ton",3) 2.9526219e-09 >>> weight_conversion("milligram","short-ton",1) 1.1023122e-09 >>> weight_conversion("milligram","pound",3) 6.6138732605999995e-06 >>> weight_conversion("milligram","ounce",2) 7.054798144599999e-05 >>> weight_conversion("milligram","carrat",1) 0.005 >>> weight_conversion("milligram","atomic-mass-unit",1) 6.022136652e+20 >>> weight_conversion("metric-ton","kilogram",2) 2000 >>> weight_conversion("metric-ton","gram",2) 2000000 >>> weight_conversion("metric-ton","milligram",3) 3000000000 >>> weight_conversion("metric-ton","metric-ton",2) 2.0 >>> weight_conversion("metric-ton","long-ton",3) 2.9526219 >>> weight_conversion("metric-ton","short-ton",2) 2.2046244 >>> weight_conversion("metric-ton","pound",3) 6613.8732606 >>> weight_conversion("metric-ton","ounce",4) 141095.96289199998 >>> weight_conversion("metric-ton","carrat",4) 20000000 >>> weight_conversion("metric-ton","atomic-mass-unit",1) 6.022136652e+29 >>> weight_conversion("long-ton","kilogram",4) 4064.18432 >>> weight_conversion("long-ton","gram",4) 4064184.32 >>> weight_conversion("long-ton","milligram",3) 3048138240.0 >>> weight_conversion("long-ton","metric-ton",4) 4.06418432 >>> weight_conversion("long-ton","long-ton",3) 2.999999907217152 >>> weight_conversion("long-ton","short-ton",1) 1.119999989746176 >>> weight_conversion("long-ton","pound",3) 6720.000000049448 >>> weight_conversion("long-ton","ounce",1) 35840.000000060514 >>> weight_conversion("long-ton","carrat",4) 20320921.599999998 >>> weight_conversion("long-ton","atomic-mass-unit",4) 2.4475073353955697e+30 >>> weight_conversion("short-ton","kilogram",3) 2721.5519999999997 >>> weight_conversion("short-ton","gram",3) 2721552.0 >>> weight_conversion("short-ton","milligram",1) 907184000.0 >>> weight_conversion("short-ton","metric-ton",4) 3.628736 >>> weight_conversion("short-ton","long-ton",3) 2.6785713457296 >>> weight_conversion("short-ton","short-ton",3) 2.9999999725344 >>> weight_conversion("short-ton","pound",2) 4000.0000000294335 >>> weight_conversion("short-ton","ounce",4) 128000.00000021611 >>> weight_conversion("short-ton","carrat",4) 18143680.0 >>> weight_conversion("short-ton","atomic-mass-unit",1) 5.463186016507968e+29 >>> weight_conversion("pound","kilogram",4) 1.814368 >>> weight_conversion("pound","gram",2) 907.184 >>> weight_conversion("pound","milligram",3) 1360776.0 >>> weight_conversion("pound","metric-ton",3) 0.001360776 >>> weight_conversion("pound","long-ton",2) 0.0008928571152432 >>> weight_conversion("pound","short-ton",1) 0.0004999999954224 >>> weight_conversion("pound","pound",3) 3.0000000000220752 >>> weight_conversion("pound","ounce",1) 16.000000000027015 >>> weight_conversion("pound","carrat",1) 2267.96 >>> weight_conversion("pound","atomic-mass-unit",4) 1.0926372033015936e+27 >>> weight_conversion("stone","kilogram",5) 31.751450000000002 >>> weight_conversion("stone","gram",2) 12700.58 >>> weight_conversion("stone","milligram",3) 19050870.0 >>> weight_conversion("stone","metric-ton",3) 0.01905087 >>> weight_conversion("stone","long-ton",3) 0.018750005325351003 >>> weight_conversion("stone","short-ton",3) 0.021000006421614002 >>> weight_conversion("stone","pound",2) 28.00000881870372 >>> weight_conversion("stone","ounce",1) 224.00007054835967 >>> weight_conversion("stone","carrat",2) 63502.9 >>> weight_conversion("ounce","kilogram",3) 0.0850485 >>> weight_conversion("ounce","gram",3) 85.0485 >>> weight_conversion("ounce","milligram",4) 113398.0 >>> weight_conversion("ounce","metric-ton",4) 0.000113398 >>> weight_conversion("ounce","long-ton",4) 0.0001116071394054 >>> weight_conversion("ounce","short-ton",4) 0.0001249999988556 >>> weight_conversion("ounce","pound",1) 0.0625000000004599 >>> weight_conversion("ounce","ounce",2) 2.000000000003377 >>> weight_conversion("ounce","carrat",1) 141.7475 >>> weight_conversion("ounce","atomic-mass-unit",1) 1.70724563015874e+25 >>> weight_conversion("carrat","kilogram",1) 0.0002 >>> weight_conversion("carrat","gram",4) 0.8 >>> weight_conversion("carrat","milligram",2) 400.0 >>> weight_conversion("carrat","metric-ton",2) 4.0000000000000003e-07 >>> weight_conversion("carrat","long-ton",3) 5.9052438e-07 >>> weight_conversion("carrat","short-ton",4) 8.818497600000002e-07 >>> weight_conversion("carrat","pound",1) 0.00044092488404000004 >>> weight_conversion("carrat","ounce",2) 0.0141095962892 >>> weight_conversion("carrat","carrat",4) 4.0 >>> weight_conversion("carrat","atomic-mass-unit",4) 4.8177093216e+23 >>> weight_conversion("atomic-mass-unit","kilogram",4) 6.642160796e-27 >>> weight_conversion("atomic-mass-unit","gram",2) 3.321080398e-24 >>> weight_conversion("atomic-mass-unit","milligram",2) 3.3210803980000002e-21 >>> weight_conversion("atomic-mass-unit","metric-ton",3) 4.9816205970000004e-30 >>> weight_conversion("atomic-mass-unit","long-ton",3) 4.9029473573977584e-30 >>> weight_conversion("atomic-mass-unit","short-ton",1) 1.830433719948128e-30 >>> weight_conversion("atomic-mass-unit","pound",3) 1.0982602420317504e-26 >>> weight_conversion("atomic-mass-unit","ounce",2) 1.1714775914938915e-25 >>> weight_conversion("atomic-mass-unit","carrat",2) 1.660540199e-23 >>> weight_conversion("atomic-mass-unit","atomic-mass-unit",2) 1.999999998903455 >>> weight_conversion("slug", "kilogram", 1) Traceback (most recent call last): ... ValueError: Invalid 'from_type' or 'to_type' value: 'slug', 'kilogram' Supported values are: kilogram, gram, milligram, metric-ton, long-ton, short-ton, \ pound, stone, ounce, carrat, atomic-mass-unit """ if to_type not in KILOGRAM_CHART or from_type not in WEIGHT_TYPE_CHART: msg = ( f"Invalid 'from_type' or 'to_type' value: {from_type!r}, {to_type!r}\n" f"Supported values are: {', '.join(WEIGHT_TYPE_CHART)}" ) raise ValueError(msg) return value * KILOGRAM_CHART[to_type] * WEIGHT_TYPE_CHART[from_type] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_compression/README.md ================================================ # Compression Data compression is everywhere, you need it to store data without taking too much space. Either the compression loses some data (then we talk about lossy compression, such as .jpg) or it does not (and then it is lossless compression, such as .png) Lossless compression is mainly used for archive purpose as it allows storing data without losing information about the file archived. On the other hand, lossy compression is used for transfer of file where quality isn't necessarily what is required (i.e: images on Twitter). * * * ================================================ FILE: data_compression/__init__.py ================================================ ================================================ FILE: data_compression/burrows_wheeler.py ================================================ """ https://en.wikipedia.org/wiki/Burrows%E2%80%93Wheeler_transform The Burrows-Wheeler transform (BWT, also called block-sorting compression) rearranges a character string into runs of similar characters. This is useful for compression, since it tends to be easy to compress a string that has runs of repeated characters by techniques such as move-to-front transform and run-length encoding. More importantly, the transformation is reversible, without needing to store any additional data except the position of the first original character. The BWT is thus a "free" method of improving the efficiency of text compression algorithms, costing only some extra computation. """ from __future__ import annotations from typing import TypedDict class BWTTransformDict(TypedDict): bwt_string: str idx_original_string: int def all_rotations(s: str) -> list[str]: """ :param s: The string that will be rotated len(s) times. :return: A list with the rotations. :raises TypeError: If s is not an instance of str. Examples: >>> all_rotations("^BANANA|") # doctest: +NORMALIZE_WHITESPACE ['^BANANA|', 'BANANA|^', 'ANANA|^B', 'NANA|^BA', 'ANA|^BAN', 'NA|^BANA', 'A|^BANAN', '|^BANANA'] >>> all_rotations("a_asa_da_casa") # doctest: +NORMALIZE_WHITESPACE ['a_asa_da_casa', '_asa_da_casaa', 'asa_da_casaa_', 'sa_da_casaa_a', 'a_da_casaa_as', '_da_casaa_asa', 'da_casaa_asa_', 'a_casaa_asa_d', '_casaa_asa_da', 'casaa_asa_da_', 'asaa_asa_da_c', 'saa_asa_da_ca', 'aa_asa_da_cas'] >>> all_rotations("panamabanana") # doctest: +NORMALIZE_WHITESPACE ['panamabanana', 'anamabananap', 'namabananapa', 'amabananapan', 'mabananapana', 'abananapanam', 'bananapanama', 'ananapanamab', 'nanapanamaba', 'anapanamaban', 'napanamabana', 'apanamabanan'] >>> all_rotations(5) Traceback (most recent call last): ... TypeError: The parameter s type must be str. """ if not isinstance(s, str): raise TypeError("The parameter s type must be str.") return [s[i:] + s[:i] for i in range(len(s))] def bwt_transform(s: str) -> BWTTransformDict: """ :param s: The string that will be used at bwt algorithm :return: the string composed of the last char of each row of the ordered rotations and the index of the original string at ordered rotations list :raises TypeError: If the s parameter type is not str :raises ValueError: If the s parameter is empty Examples: >>> bwt_transform("^BANANA") {'bwt_string': 'BNN^AAA', 'idx_original_string': 6} >>> bwt_transform("a_asa_da_casa") {'bwt_string': 'aaaadss_c__aa', 'idx_original_string': 3} >>> bwt_transform("panamabanana") {'bwt_string': 'mnpbnnaaaaaa', 'idx_original_string': 11} >>> bwt_transform(4) Traceback (most recent call last): ... TypeError: The parameter s type must be str. >>> bwt_transform('') Traceback (most recent call last): ... ValueError: The parameter s must not be empty. """ if not isinstance(s, str): raise TypeError("The parameter s type must be str.") if not s: raise ValueError("The parameter s must not be empty.") rotations = all_rotations(s) rotations.sort() # sort the list of rotations in alphabetically order # make a string composed of the last char of each rotation response: BWTTransformDict = { "bwt_string": "".join([word[-1] for word in rotations]), "idx_original_string": rotations.index(s), } return response def reverse_bwt(bwt_string: str, idx_original_string: int) -> str: """ :param bwt_string: The string returned from bwt algorithm execution :param idx_original_string: A 0-based index of the string that was used to generate bwt_string at ordered rotations list :return: The string used to generate bwt_string when bwt was executed :raises TypeError: If the bwt_string parameter type is not str :raises ValueError: If the bwt_string parameter is empty :raises TypeError: If the idx_original_string type is not int or if not possible to cast it to int :raises ValueError: If the idx_original_string value is lower than 0 or greater than len(bwt_string) - 1 >>> reverse_bwt("BNN^AAA", 6) '^BANANA' >>> reverse_bwt("aaaadss_c__aa", 3) 'a_asa_da_casa' >>> reverse_bwt("mnpbnnaaaaaa", 11) 'panamabanana' >>> reverse_bwt(4, 11) Traceback (most recent call last): ... TypeError: The parameter bwt_string type must be str. >>> reverse_bwt("", 11) Traceback (most recent call last): ... ValueError: The parameter bwt_string must not be empty. >>> reverse_bwt("mnpbnnaaaaaa", "asd") # doctest: +NORMALIZE_WHITESPACE Traceback (most recent call last): ... TypeError: The parameter idx_original_string type must be int or passive of cast to int. >>> reverse_bwt("mnpbnnaaaaaa", -1) Traceback (most recent call last): ... ValueError: The parameter idx_original_string must not be lower than 0. >>> reverse_bwt("mnpbnnaaaaaa", 12) # doctest: +NORMALIZE_WHITESPACE Traceback (most recent call last): ... ValueError: The parameter idx_original_string must be lower than len(bwt_string). >>> reverse_bwt("mnpbnnaaaaaa", 11.0) 'panamabanana' >>> reverse_bwt("mnpbnnaaaaaa", 11.4) 'panamabanana' """ if not isinstance(bwt_string, str): raise TypeError("The parameter bwt_string type must be str.") if not bwt_string: raise ValueError("The parameter bwt_string must not be empty.") try: idx_original_string = int(idx_original_string) except ValueError: raise TypeError( "The parameter idx_original_string type must be int or passive" " of cast to int." ) if idx_original_string < 0: raise ValueError("The parameter idx_original_string must not be lower than 0.") if idx_original_string >= len(bwt_string): raise ValueError( "The parameter idx_original_string must be lower than len(bwt_string)." ) ordered_rotations = [""] * len(bwt_string) for _ in range(len(bwt_string)): for i in range(len(bwt_string)): ordered_rotations[i] = bwt_string[i] + ordered_rotations[i] ordered_rotations.sort() return ordered_rotations[idx_original_string] if __name__ == "__main__": entry_msg = "Provide a string that I will generate its BWT transform: " s = input(entry_msg).strip() result = bwt_transform(s) print( f"Burrows Wheeler transform for string '{s}' results " f"in '{result['bwt_string']}'" ) original_string = reverse_bwt(result["bwt_string"], result["idx_original_string"]) print( f"Reversing Burrows Wheeler transform for entry '{result['bwt_string']}' " f"we get original string '{original_string}'" ) ================================================ FILE: data_compression/coordinate_compression.py ================================================ """ Assumption: - The values to compress are assumed to be comparable, values can be sorted and compared with '<' and '>' operators. """ class CoordinateCompressor: """ A class for coordinate compression. This class allows you to compress and decompress a list of values. Mapping: In addition to compression and decompression, this class maintains a mapping between original values and their compressed counterparts using two data structures: a dictionary `coordinate_map` and a list `reverse_map`: - `coordinate_map`: A dictionary that maps original values to their compressed coordinates. Keys are original values, and values are compressed coordinates. - `reverse_map`: A list used for reverse mapping, where each index corresponds to a compressed coordinate, and the value at that index is the original value. Example of mapping: Original: 10, Compressed: 0 Original: 52, Compressed: 1 Original: 83, Compressed: 2 Original: 100, Compressed: 3 This mapping allows for efficient compression and decompression of values within the list. """ def __init__(self, arr: list[int | float | str]) -> None: """ Initialize the CoordinateCompressor with a list. Args: arr: The list of values to be compressed. >>> arr = [100, 10, 52, 83] >>> cc = CoordinateCompressor(arr) >>> cc.compress(100) 3 >>> cc.compress(52) 1 >>> cc.decompress(1) 52 """ # A dictionary to store compressed coordinates self.coordinate_map: dict[int | float | str, int] = {} # A list to store reverse mapping self.reverse_map: list[int | float | str] = [-1] * len(arr) self.arr = sorted(arr) # The input list self.n = len(arr) # The length of the input list self.compress_coordinates() def compress_coordinates(self) -> None: """ Compress the coordinates in the input list. >>> arr = [100, 10, 52, 83] >>> cc = CoordinateCompressor(arr) >>> cc.coordinate_map[83] 2 >>> cc.coordinate_map[80] # Value not in the original list Traceback (most recent call last): ... KeyError: 80 >>> cc.reverse_map[2] 83 """ key = 0 for val in self.arr: if val not in self.coordinate_map: self.coordinate_map[val] = key self.reverse_map[key] = val key += 1 def compress(self, original: float | str) -> int: """ Compress a single value. Args: original: The value to compress. Returns: The compressed integer, or -1 if not found in the original list. >>> arr = [100, 10, 52, 83] >>> cc = CoordinateCompressor(arr) >>> cc.compress(100) 3 >>> cc.compress(7) # Value not in the original list -1 """ return self.coordinate_map.get(original, -1) def decompress(self, num: int) -> int | float | str: """ Decompress a single integer. Args: num: The compressed integer to decompress. Returns: The original value. >>> arr = [100, 10, 52, 83] >>> cc = CoordinateCompressor(arr) >>> cc.decompress(0) 10 >>> cc.decompress(5) # Compressed coordinate out of range -1 """ return self.reverse_map[num] if 0 <= num < len(self.reverse_map) else -1 if __name__ == "__main__": from doctest import testmod testmod() arr: list[int | float | str] = [100, 10, 52, 83] cc = CoordinateCompressor(arr) for original in arr: compressed = cc.compress(original) decompressed = cc.decompress(compressed) print(f"Original: {decompressed}, Compressed: {compressed}") ================================================ FILE: data_compression/huffman.py ================================================ from __future__ import annotations import sys class Letter: def __init__(self, letter: str, freq: int): self.letter: str = letter self.freq: int = freq self.bitstring: dict[str, str] = {} def __repr__(self) -> str: return f"{self.letter}:{self.freq}" class TreeNode: def __init__(self, freq: int, left: Letter | TreeNode, right: Letter | TreeNode): self.freq: int = freq self.left: Letter | TreeNode = left self.right: Letter | TreeNode = right def parse_file(file_path: str) -> list[Letter]: """ Read the file and build a dict of all letters and their frequencies, then convert the dict into a list of Letters. """ chars: dict[str, int] = {} with open(file_path) as f: while True: c = f.read(1) if not c: break chars[c] = chars[c] + 1 if c in chars else 1 return sorted((Letter(c, f) for c, f in chars.items()), key=lambda x: x.freq) def build_tree(letters: list[Letter]) -> Letter | TreeNode: """ Run through the list of Letters and build the min heap for the Huffman Tree. """ response: list[Letter | TreeNode] = list(letters) while len(response) > 1: left = response.pop(0) right = response.pop(0) total_freq = left.freq + right.freq node = TreeNode(total_freq, left, right) response.append(node) response.sort(key=lambda x: x.freq) return response[0] def traverse_tree(root: Letter | TreeNode, bitstring: str) -> list[Letter]: """ Recursively traverse the Huffman Tree to set each Letter's bitstring dictionary, and return the list of Letters """ if isinstance(root, Letter): root.bitstring[root.letter] = bitstring return [root] treenode: TreeNode = root letters = [] letters += traverse_tree(treenode.left, bitstring + "0") letters += traverse_tree(treenode.right, bitstring + "1") return letters def huffman(file_path: str) -> None: """ Parse the file, build the tree, then run through the file again, using the letters dictionary to find and print out the bitstring for each letter. """ letters_list = parse_file(file_path) root = build_tree(letters_list) letters = { k: v for letter in traverse_tree(root, "") for k, v in letter.bitstring.items() } print(f"Huffman Coding of {file_path}: ") with open(file_path) as f: while True: c = f.read(1) if not c: break print(letters[c], end=" ") print() if __name__ == "__main__": # pass the file path to the huffman function huffman(sys.argv[1]) ================================================ FILE: data_compression/lempel_ziv.py ================================================ """ One of the several implementations of Lempel-Ziv-Welch compression algorithm https://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Welch """ import math import os import sys def read_file_binary(file_path: str) -> str: """ Reads given file as bytes and returns them as a long string """ result = "" try: with open(file_path, "rb") as binary_file: data = binary_file.read() for dat in data: curr_byte = f"{dat:08b}" result += curr_byte return result except OSError: print("File not accessible") sys.exit() def add_key_to_lexicon( lexicon: dict[str, str], curr_string: str, index: int, last_match_id: str ) -> None: """ Adds new strings (curr_string + "0", curr_string + "1") to the lexicon """ lexicon.pop(curr_string) lexicon[curr_string + "0"] = last_match_id if math.log2(index).is_integer(): for curr_key, value in lexicon.items(): lexicon[curr_key] = f"0{value}" lexicon[curr_string + "1"] = bin(index)[2:] def compress_data(data_bits: str) -> str: """ Compresses given data_bits using Lempel-Ziv-Welch compression algorithm and returns the result as a string """ lexicon = {"0": "0", "1": "1"} result, curr_string = "", "" index = len(lexicon) for i in range(len(data_bits)): curr_string += data_bits[i] if curr_string not in lexicon: continue last_match_id = lexicon[curr_string] result += last_match_id add_key_to_lexicon(lexicon, curr_string, index, last_match_id) index += 1 curr_string = "" while curr_string != "" and curr_string not in lexicon: curr_string += "0" if curr_string != "": last_match_id = lexicon[curr_string] result += last_match_id return result def add_file_length(source_path: str, compressed: str) -> str: """ Adds given file's length in front (using Elias gamma coding) of the compressed string """ file_length = os.path.getsize(source_path) file_length_binary = bin(file_length)[2:] length_length = len(file_length_binary) return "0" * (length_length - 1) + file_length_binary + compressed def write_file_binary(file_path: str, to_write: str) -> None: """ Writes given to_write string (should only consist of 0's and 1's) as bytes in the file """ byte_length = 8 try: with open(file_path, "wb") as opened_file: result_byte_array = [ to_write[i : i + byte_length] for i in range(0, len(to_write), byte_length) ] if len(result_byte_array[-1]) % byte_length == 0: result_byte_array.append("10000000") else: result_byte_array[-1] += "1" + "0" * ( byte_length - len(result_byte_array[-1]) - 1 ) for elem in result_byte_array: opened_file.write(int(elem, 2).to_bytes(1, byteorder="big")) except OSError: print("File not accessible") sys.exit() def compress(source_path: str, destination_path: str) -> None: """ Reads source file, compresses it and writes the compressed result in destination file """ data_bits = read_file_binary(source_path) compressed = compress_data(data_bits) compressed = add_file_length(source_path, compressed) write_file_binary(destination_path, compressed) if __name__ == "__main__": compress(sys.argv[1], sys.argv[2]) ================================================ FILE: data_compression/lempel_ziv_decompress.py ================================================ """ One of the several implementations of Lempel-Ziv-Welch decompression algorithm https://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Welch """ import math import sys def read_file_binary(file_path: str) -> str: """ Reads given file as bytes and returns them as a long string """ result = "" try: with open(file_path, "rb") as binary_file: data = binary_file.read() for dat in data: curr_byte = f"{dat:08b}" result += curr_byte return result except OSError: print("File not accessible") sys.exit() def decompress_data(data_bits: str) -> str: """ Decompresses given data_bits using Lempel-Ziv-Welch compression algorithm and returns the result as a string """ lexicon = {"0": "0", "1": "1"} result, curr_string = "", "" index = len(lexicon) for i in range(len(data_bits)): curr_string += data_bits[i] if curr_string not in lexicon: continue last_match_id = lexicon[curr_string] result += last_match_id lexicon[curr_string] = last_match_id + "0" if math.log2(index).is_integer(): new_lex = {} for curr_key in list(lexicon): new_lex["0" + curr_key] = lexicon.pop(curr_key) lexicon = new_lex lexicon[bin(index)[2:]] = last_match_id + "1" index += 1 curr_string = "" return result def write_file_binary(file_path: str, to_write: str) -> None: """ Writes given to_write string (should only consist of 0's and 1's) as bytes in the file """ byte_length = 8 try: with open(file_path, "wb") as opened_file: result_byte_array = [ to_write[i : i + byte_length] for i in range(0, len(to_write), byte_length) ] if len(result_byte_array[-1]) % byte_length == 0: result_byte_array.append("10000000") else: result_byte_array[-1] += "1" + "0" * ( byte_length - len(result_byte_array[-1]) - 1 ) for elem in result_byte_array[:-1]: opened_file.write(int(elem, 2).to_bytes(1, byteorder="big")) except OSError: print("File not accessible") sys.exit() def remove_prefix(data_bits: str) -> str: """ Removes size prefix, that compressed file should have Returns the result """ counter = 0 for letter in data_bits: if letter == "1": break counter += 1 data_bits = data_bits[counter:] data_bits = data_bits[counter + 1 :] return data_bits def compress(source_path: str, destination_path: str) -> None: """ Reads source file, decompresses it and writes the result in destination file """ data_bits = read_file_binary(source_path) data_bits = remove_prefix(data_bits) decompressed = decompress_data(data_bits) write_file_binary(destination_path, decompressed) if __name__ == "__main__": compress(sys.argv[1], sys.argv[2]) ================================================ FILE: data_compression/lz77.py ================================================ """ LZ77 compression algorithm - lossless data compression published in papers by Abraham Lempel and Jacob Ziv in 1977 - also known as LZ1 or sliding-window compression - form the basis for many variations including LZW, LZSS, LZMA and others It uses a “sliding window” method. Within the sliding window we have: - search buffer - look ahead buffer len(sliding_window) = len(search_buffer) + len(look_ahead_buffer) LZ77 manages a dictionary that uses triples composed of: - Offset into search buffer, it's the distance between the start of a phrase and the beginning of a file. - Length of the match, it's the number of characters that make up a phrase. - The indicator is represented by a character that is going to be encoded next. As a file is parsed, the dictionary is dynamically updated to reflect the compressed data contents and size. Examples: "cabracadabrarrarrad" <-> [(0, 0, 'c'), (0, 0, 'a'), (0, 0, 'b'), (0, 0, 'r'), (3, 1, 'c'), (2, 1, 'd'), (7, 4, 'r'), (3, 5, 'd')] "ababcbababaa" <-> [(0, 0, 'a'), (0, 0, 'b'), (2, 2, 'c'), (4, 3, 'a'), (2, 2, 'a')] "aacaacabcabaaac" <-> [(0, 0, 'a'), (1, 1, 'c'), (3, 4, 'b'), (3, 3, 'a'), (1, 2, 'c')] Sources: en.wikipedia.org/wiki/LZ77_and_LZ78 """ from dataclasses import dataclass __version__ = "0.1" __author__ = "Lucia Harcekova" @dataclass class Token: """ Dataclass representing triplet called token consisting of length, offset and indicator. This triplet is used during LZ77 compression. """ offset: int length: int indicator: str def __repr__(self) -> str: """ >>> token = Token(1, 2, "c") >>> repr(token) '(1, 2, c)' >>> str(token) '(1, 2, c)' """ return f"({self.offset}, {self.length}, {self.indicator})" class LZ77Compressor: """ Class containing compress and decompress methods using LZ77 compression algorithm. """ def __init__(self, window_size: int = 13, lookahead_buffer_size: int = 6) -> None: self.window_size = window_size self.lookahead_buffer_size = lookahead_buffer_size self.search_buffer_size = self.window_size - self.lookahead_buffer_size def compress(self, text: str) -> list[Token]: """ Compress the given string text using LZ77 compression algorithm. Args: text: string to be compressed Returns: output: the compressed text as a list of Tokens >>> lz77_compressor = LZ77Compressor() >>> str(lz77_compressor.compress("ababcbababaa")) '[(0, 0, a), (0, 0, b), (2, 2, c), (4, 3, a), (2, 2, a)]' >>> str(lz77_compressor.compress("aacaacabcabaaac")) '[(0, 0, a), (1, 1, c), (3, 4, b), (3, 3, a), (1, 2, c)]' """ output = [] search_buffer = "" # while there are still characters in text to compress while text: # find the next encoding phrase # - triplet with offset, length, indicator (the next encoding character) token = self._find_encoding_token(text, search_buffer) # update the search buffer: # - add new characters from text into it # - check if size exceed the max search buffer size, if so, drop the # oldest elements search_buffer += text[: token.length + 1] if len(search_buffer) > self.search_buffer_size: search_buffer = search_buffer[-self.search_buffer_size :] # update the text text = text[token.length + 1 :] # append the token to output output.append(token) return output def decompress(self, tokens: list[Token]) -> str: """ Convert the list of tokens into an output string. Args: tokens: list containing triplets (offset, length, char) Returns: output: decompressed text Tests: >>> lz77_compressor = LZ77Compressor() >>> lz77_compressor.decompress([Token(0, 0, 'c'), Token(0, 0, 'a'), ... Token(0, 0, 'b'), Token(0, 0, 'r'), Token(3, 1, 'c'), ... Token(2, 1, 'd'), Token(7, 4, 'r'), Token(3, 5, 'd')]) 'cabracadabrarrarrad' >>> lz77_compressor.decompress([Token(0, 0, 'a'), Token(0, 0, 'b'), ... Token(2, 2, 'c'), Token(4, 3, 'a'), Token(2, 2, 'a')]) 'ababcbababaa' >>> lz77_compressor.decompress([Token(0, 0, 'a'), Token(1, 1, 'c'), ... Token(3, 4, 'b'), Token(3, 3, 'a'), Token(1, 2, 'c')]) 'aacaacabcabaaac' """ output = "" for token in tokens: for _ in range(token.length): output += output[-token.offset] output += token.indicator return output def _find_encoding_token(self, text: str, search_buffer: str) -> Token: """Finds the encoding token for the first character in the text. Tests: >>> lz77_compressor = LZ77Compressor() >>> lz77_compressor._find_encoding_token("abrarrarrad", "abracad").offset 7 >>> lz77_compressor._find_encoding_token("adabrarrarrad", "cabrac").length 1 >>> lz77_compressor._find_encoding_token("abc", "xyz").offset 0 >>> lz77_compressor._find_encoding_token("", "xyz").offset Traceback (most recent call last): ... ValueError: We need some text to work with. >>> lz77_compressor._find_encoding_token("abc", "").offset 0 """ if not text: raise ValueError("We need some text to work with.") # Initialise result parameters to default values length, offset = 0, 0 if not search_buffer: return Token(offset, length, text[length]) for i, character in enumerate(search_buffer): found_offset = len(search_buffer) - i if character == text[0]: found_length = self._match_length_from_index(text, search_buffer, 0, i) # if the found length is bigger than the current or if it's equal, # which means it's offset is smaller: update offset and length if found_length >= length: offset, length = found_offset, found_length return Token(offset, length, text[length]) def _match_length_from_index( self, text: str, window: str, text_index: int, window_index: int ) -> int: """Calculate the longest possible match of text and window characters from text_index in text and window_index in window. Args: text: _description_ window: sliding window text_index: index of character in text window_index: index of character in sliding window Returns: The maximum match between text and window, from given indexes. Tests: >>> lz77_compressor = LZ77Compressor(13, 6) >>> lz77_compressor._match_length_from_index("rarrad", "adabrar", 0, 4) 5 >>> lz77_compressor._match_length_from_index("adabrarrarrad", ... "cabrac", 0, 1) 1 """ if not text or text[text_index] != window[window_index]: return 0 return 1 + self._match_length_from_index( text, window + text[text_index], text_index + 1, window_index + 1 ) if __name__ == "__main__": from doctest import testmod testmod() # Initialize compressor class lz77_compressor = LZ77Compressor(window_size=13, lookahead_buffer_size=6) # Example TEXT = "cabracadabrarrarrad" compressed_text = lz77_compressor.compress(TEXT) print(lz77_compressor.compress("ababcbababaa")) decompressed_text = lz77_compressor.decompress(compressed_text) assert decompressed_text == TEXT, "The LZ77 algorithm returned the invalid result." ================================================ FILE: data_compression/peak_signal_to_noise_ratio.py ================================================ """ Peak signal-to-noise ratio - PSNR https://en.wikipedia.org/wiki/Peak_signal-to-noise_ratio Source: https://tutorials.techonical.com/how-to-calculate-psnr-value-of-two-images-using-python """ import math import os import cv2 import numpy as np PIXEL_MAX = 255.0 def peak_signal_to_noise_ratio(original: float, contrast: float) -> float: mse = np.mean((original - contrast) ** 2) if mse == 0: return 100 return 20 * math.log10(PIXEL_MAX / math.sqrt(mse)) def main() -> None: dir_path = os.path.dirname(os.path.realpath(__file__)) # Loading images (original image and compressed image) original = cv2.imread(os.path.join(dir_path, "image_data/original_image.png")) contrast = cv2.imread(os.path.join(dir_path, "image_data/compressed_image.png"), 1) original2 = cv2.imread(os.path.join(dir_path, "image_data/PSNR-example-base.png")) contrast2 = cv2.imread( os.path.join(dir_path, "image_data/PSNR-example-comp-10.jpg"), 1 ) # Value expected: 29.73dB print("-- First Test --") print(f"PSNR value is {peak_signal_to_noise_ratio(original, contrast)} dB") # # Value expected: 31.53dB (Wikipedia Example) print("\n-- Second Test --") print(f"PSNR value is {peak_signal_to_noise_ratio(original2, contrast2)} dB") if __name__ == "__main__": main() ================================================ FILE: data_compression/run_length_encoding.py ================================================ # https://en.wikipedia.org/wiki/Run-length_encoding def run_length_encode(text: str) -> list: """ Performs Run Length Encoding >>> run_length_encode("AAAABBBCCDAA") [('A', 4), ('B', 3), ('C', 2), ('D', 1), ('A', 2)] >>> run_length_encode("A") [('A', 1)] >>> run_length_encode("AA") [('A', 2)] >>> run_length_encode("AAADDDDDDFFFCCCAAVVVV") [('A', 3), ('D', 6), ('F', 3), ('C', 3), ('A', 2), ('V', 4)] """ encoded = [] count = 1 for i in range(len(text)): if i + 1 < len(text) and text[i] == text[i + 1]: count += 1 else: encoded.append((text[i], count)) count = 1 return encoded def run_length_decode(encoded: list) -> str: """ Performs Run Length Decoding >>> run_length_decode([('A', 4), ('B', 3), ('C', 2), ('D', 1), ('A', 2)]) 'AAAABBBCCDAA' >>> run_length_decode([('A', 1)]) 'A' >>> run_length_decode([('A', 2)]) 'AA' >>> run_length_decode([('A', 3), ('D', 6), ('F', 3), ('C', 3), ('A', 2), ('V', 4)]) 'AAADDDDDDFFFCCCAAVVVV' """ return "".join(char * length for char, length in encoded) if __name__ == "__main__": from doctest import testmod testmod(name="run_length_encode", verbose=True) testmod(name="run_length_decode", verbose=True) ================================================ FILE: data_structures/__init__.py ================================================ ================================================ FILE: data_structures/arrays/__init__.py ================================================ ================================================ FILE: data_structures/arrays/equilibrium_index_in_array.py ================================================ """ Find the Equilibrium Index of an Array. Reference: https://www.geeksforgeeks.org/equilibrium-index-of-an-array/ Python doctest can be run with the following command: python -m doctest -v equilibrium_index_in_array.py Given a sequence arr[] of size n, this function returns an equilibrium index (if any) or -1 if no equilibrium index exists. The equilibrium index of an array is an index such that the sum of elements at lower indexes is equal to the sum of elements at higher indexes. Example Input: arr = [-7, 1, 5, 2, -4, 3, 0] Output: 3 """ def equilibrium_index(arr: list[int]) -> int: """ Find the equilibrium index of an array. Args: arr (list[int]): The input array of integers. Returns: int: The equilibrium index or -1 if no equilibrium index exists. Examples: >>> equilibrium_index([-7, 1, 5, 2, -4, 3, 0]) 3 >>> equilibrium_index([1, 2, 3, 4, 5]) -1 >>> equilibrium_index([1, 1, 1, 1, 1]) 2 >>> equilibrium_index([2, 4, 6, 8, 10, 3]) -1 """ total_sum = sum(arr) left_sum = 0 for i, value in enumerate(arr): total_sum -= value if left_sum == total_sum: return i left_sum += value return -1 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/arrays/find_triplets_with_0_sum.py ================================================ from itertools import combinations def find_triplets_with_0_sum(nums: list[int]) -> list[list[int]]: """ Given a list of integers, return elements a, b, c such that a + b + c = 0. Args: nums: list of integers Returns: list of lists of integers where sum(each_list) == 0 Examples: >>> find_triplets_with_0_sum([-1, 0, 1, 2, -1, -4]) [[-1, -1, 2], [-1, 0, 1]] >>> find_triplets_with_0_sum([]) [] >>> find_triplets_with_0_sum([0, 0, 0]) [[0, 0, 0]] >>> find_triplets_with_0_sum([1, 2, 3, 0, -1, -2, -3]) [[-3, 0, 3], [-3, 1, 2], [-2, -1, 3], [-2, 0, 2], [-1, 0, 1]] """ return [ list(x) for x in sorted({abc for abc in combinations(sorted(nums), 3) if not sum(abc)}) ] def find_triplets_with_0_sum_hashing(arr: list[int]) -> list[list[int]]: """ Function for finding the triplets with a given sum in the array using hashing. Given a list of integers, return elements a, b, c such that a + b + c = 0. Args: nums: list of integers Returns: list of lists of integers where sum(each_list) == 0 Examples: >>> find_triplets_with_0_sum_hashing([-1, 0, 1, 2, -1, -4]) [[-1, 0, 1], [-1, -1, 2]] >>> find_triplets_with_0_sum_hashing([]) [] >>> find_triplets_with_0_sum_hashing([0, 0, 0]) [[0, 0, 0]] >>> find_triplets_with_0_sum_hashing([1, 2, 3, 0, -1, -2, -3]) [[-1, 0, 1], [-3, 1, 2], [-2, 0, 2], [-2, -1, 3], [-3, 0, 3]] Time complexity: O(N^2) Auxiliary Space: O(N) """ target_sum = 0 # Initialize the final output array with blank. output_arr = [] # Set the initial element as arr[i]. for index, item in enumerate(arr[:-2]): # to store second elements that can complement the final sum. set_initialize = set() # current sum needed for reaching the target sum current_sum = target_sum - item # Traverse the subarray arr[i+1:]. for other_item in arr[index + 1 :]: # required value for the second element required_value = current_sum - other_item # Verify if the desired value exists in the set. if required_value in set_initialize: # finding triplet elements combination. combination_array = sorted([item, other_item, required_value]) if combination_array not in output_arr: output_arr.append(combination_array) # Include the current element in the set # for subsequent complement verification. set_initialize.add(other_item) # Return all the triplet combinations. return output_arr if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: data_structures/arrays/index_2d_array_in_1d.py ================================================ """ Retrieves the value of an 0-indexed 1D index from a 2D array. There are two ways to retrieve value(s): 1. Index2DArrayIterator(matrix) -> Iterator[int] This iterator allows you to iterate through a 2D array by passing in the matrix and calling next(your_iterator). You can also use the iterator in a loop. Examples: list(Index2DArrayIterator(matrix)) set(Index2DArrayIterator(matrix)) tuple(Index2DArrayIterator(matrix)) sum(Index2DArrayIterator(matrix)) -5 in Index2DArrayIterator(matrix) 2. index_2d_array_in_1d(array: list[int], index: int) -> int This function allows you to provide a 2D array and a 0-indexed 1D integer index, and retrieves the integer value at that index. Python doctests can be run using this command: python3 -m doctest -v index_2d_array_in_1d.py """ from collections.abc import Iterator from dataclasses import dataclass @dataclass class Index2DArrayIterator: matrix: list[list[int]] def __iter__(self) -> Iterator[int]: """ >>> tuple(Index2DArrayIterator([[5], [-523], [-1], [34], [0]])) (5, -523, -1, 34, 0) >>> tuple(Index2DArrayIterator([[5, -523, -1], [34, 0]])) (5, -523, -1, 34, 0) >>> tuple(Index2DArrayIterator([[5, -523, -1, 34, 0]])) (5, -523, -1, 34, 0) >>> t = Index2DArrayIterator([[5, 2, 25], [23, 14, 5], [324, -1, 0]]) >>> tuple(t) (5, 2, 25, 23, 14, 5, 324, -1, 0) >>> list(t) [5, 2, 25, 23, 14, 5, 324, -1, 0] >>> sorted(t) [-1, 0, 2, 5, 5, 14, 23, 25, 324] >>> tuple(t)[3] 23 >>> sum(t) 397 >>> -1 in t True >>> t = iter(Index2DArrayIterator([[5], [-523], [-1], [34], [0]])) >>> next(t) 5 >>> next(t) -523 """ for row in self.matrix: yield from row def index_2d_array_in_1d(array: list[list[int]], index: int) -> int: """ Retrieves the value of the one-dimensional index from a two-dimensional array. Args: array: A 2D array of integers where all rows are the same size and all columns are the same size. index: A 1D index. Returns: int: The 0-indexed value of the 1D index in the array. Examples: >>> index_2d_array_in_1d([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]], 5) 5 >>> index_2d_array_in_1d([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]], -1) Traceback (most recent call last): ... ValueError: index out of range >>> index_2d_array_in_1d([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]], 12) Traceback (most recent call last): ... ValueError: index out of range >>> index_2d_array_in_1d([[]], 0) Traceback (most recent call last): ... ValueError: no items in array """ rows = len(array) cols = len(array[0]) if rows == 0 or cols == 0: raise ValueError("no items in array") if index < 0 or index >= rows * cols: raise ValueError("index out of range") return array[index // cols][index % cols] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/arrays/kth_largest_element.py ================================================ """ Given an array of integers and an integer k, find the kth largest element in the array. https://stackoverflow.com/questions/251781 """ def partition(arr: list[int], low: int, high: int) -> int: """ Partitions list based on the pivot element. This function rearranges the elements in the input list 'elements' such that all elements greater than or equal to the chosen pivot are on the right side of the pivot, and all elements smaller than the pivot are on the left side. Args: arr: The list to be partitioned low: The lower index of the list high: The higher index of the list Returns: int: The index of pivot element after partitioning Examples: >>> partition([3, 1, 4, 5, 9, 2, 6, 5, 3, 5], 0, 9) 4 >>> partition([7, 1, 4, 5, 9, 2, 6, 5, 8], 0, 8) 1 >>> partition(['apple', 'cherry', 'date', 'banana'], 0, 3) 2 >>> partition([3.1, 1.2, 5.6, 4.7], 0, 3) 1 """ pivot = arr[high] i = low - 1 for j in range(low, high): if arr[j] >= pivot: i += 1 arr[i], arr[j] = arr[j], arr[i] arr[i + 1], arr[high] = arr[high], arr[i + 1] return i + 1 def kth_largest_element(arr: list[int], position: int) -> int: """ Finds the kth largest element in a list. Should deliver similar results to: ```python def kth_largest_element(arr, position): return sorted(arr)[-position] ``` Args: nums: The list of numbers. k: The position of the desired kth largest element. Returns: int: The kth largest element. Examples: >>> kth_largest_element([3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5], 3) 5 >>> kth_largest_element([2, 5, 6, 1, 9, 3, 8, 4, 7, 3, 5], 1) 9 >>> kth_largest_element([2, 5, 6, 1, 9, 3, 8, 4, 7, 3, 5], -2) Traceback (most recent call last): ... ValueError: Invalid value of 'position' >>> kth_largest_element([9, 1, 3, 6, 7, 9, 8, 4, 2, 4, 9], 110) Traceback (most recent call last): ... ValueError: Invalid value of 'position' >>> kth_largest_element([1, 2, 4, 3, 5, 9, 7, 6, 5, 9, 3], 0) Traceback (most recent call last): ... ValueError: Invalid value of 'position' >>> kth_largest_element(['apple', 'cherry', 'date', 'banana'], 2) 'cherry' >>> kth_largest_element([3.1, 1.2, 5.6, 4.7,7.9,5,0], 2) 5.6 >>> kth_largest_element([-2, -5, -4, -1], 1) -1 >>> kth_largest_element([], 1) -1 >>> kth_largest_element([3.1, 1.2, 5.6, 4.7, 7.9, 5, 0], 1.5) Traceback (most recent call last): ... ValueError: The position should be an integer >>> kth_largest_element((4, 6, 1, 2), 4) Traceback (most recent call last): ... TypeError: 'tuple' object does not support item assignment """ if not arr: return -1 if not isinstance(position, int): raise ValueError("The position should be an integer") if not 1 <= position <= len(arr): raise ValueError("Invalid value of 'position'") low, high = 0, len(arr) - 1 while low <= high: if low > len(arr) - 1 or high < 0: return -1 pivot_index = partition(arr, low, high) if pivot_index == position - 1: return arr[pivot_index] elif pivot_index > position - 1: high = pivot_index - 1 else: low = pivot_index + 1 return -1 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/arrays/median_two_array.py ================================================ """ https://www.enjoyalgorithms.com/blog/median-of-two-sorted-arrays """ def find_median_sorted_arrays(nums1: list[int], nums2: list[int]) -> float: """ Find the median of two arrays. Args: nums1: The first array. nums2: The second array. Returns: The median of the two arrays. Examples: >>> find_median_sorted_arrays([1, 3], [2]) 2.0 >>> find_median_sorted_arrays([1, 2], [3, 4]) 2.5 >>> find_median_sorted_arrays([0, 0], [0, 0]) 0.0 >>> find_median_sorted_arrays([], []) Traceback (most recent call last): ... ValueError: Both input arrays are empty. >>> find_median_sorted_arrays([], [1]) 1.0 >>> find_median_sorted_arrays([-1000], [1000]) 0.0 >>> find_median_sorted_arrays([-1.1, -2.2], [-3.3, -4.4]) -2.75 """ if not nums1 and not nums2: raise ValueError("Both input arrays are empty.") # Merge the arrays into a single sorted array. merged = sorted(nums1 + nums2) total = len(merged) if total % 2 == 1: # If the total number of elements is odd return float(merged[total // 2]) # then return the middle element # If the total number of elements is even, calculate # the average of the two middle elements as the median. middle1 = merged[total // 2 - 1] middle2 = merged[total // 2] return (float(middle1) + float(middle2)) / 2.0 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/arrays/monotonic_array.py ================================================ # https://leetcode.com/problems/monotonic-array/ def is_monotonic(nums: list[int]) -> bool: """ Check if a list is monotonic. >>> is_monotonic([1, 2, 2, 3]) True >>> is_monotonic([6, 5, 4, 4]) True >>> is_monotonic([1, 3, 2]) False >>> is_monotonic([1,2,3,4,5,6,5]) False >>> is_monotonic([-3,-2,-1]) True >>> is_monotonic([-5,-6,-7]) True >>> is_monotonic([0,0,0]) True >>> is_monotonic([-100,0,100]) True """ return all(nums[i] <= nums[i + 1] for i in range(len(nums) - 1)) or all( nums[i] >= nums[i + 1] for i in range(len(nums) - 1) ) # Test the function with your examples if __name__ == "__main__": # Test the function with your examples print(is_monotonic([1, 2, 2, 3])) # Output: True print(is_monotonic([6, 5, 4, 4])) # Output: True print(is_monotonic([1, 3, 2])) # Output: False import doctest doctest.testmod() ================================================ FILE: data_structures/arrays/pairs_with_given_sum.py ================================================ #!/usr/bin/env python3 """ Given an array of integers and an integer req_sum, find the number of pairs of array elements whose sum is equal to req_sum. https://practice.geeksforgeeks.org/problems/count-pairs-with-given-sum5022/0 """ from itertools import combinations def pairs_with_sum(arr: list, req_sum: int) -> int: """ Return the no. of pairs with sum "sum" >>> pairs_with_sum([1, 5, 7, 1], 6) 2 >>> pairs_with_sum([1, 1, 1, 1, 1, 1, 1, 1], 2) 28 >>> pairs_with_sum([1, 7, 6, 2, 5, 4, 3, 1, 9, 8], 7) 4 """ return len([1 for a, b in combinations(arr, 2) if a + b == req_sum]) if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: data_structures/arrays/permutations.py ================================================ def permute_recursive(nums: list[int]) -> list[list[int]]: """ Return all permutations. >>> permute_recursive([1, 2, 3]) [[3, 2, 1], [2, 3, 1], [1, 3, 2], [3, 1, 2], [2, 1, 3], [1, 2, 3]] """ result: list[list[int]] = [] if len(nums) == 0: return [[]] for _ in range(len(nums)): n = nums.pop(0) permutations = permute_recursive(nums.copy()) for perm in permutations: perm.append(n) result.extend(permutations) nums.append(n) return result def permute_backtrack(nums: list[int]) -> list[list[int]]: """ Return all permutations of the given list. >>> permute_backtrack([1, 2, 3]) [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 2, 1], [3, 1, 2]] """ def backtrack(start: int) -> None: if start == len(nums) - 1: output.append(nums[:]) else: for i in range(start, len(nums)): nums[start], nums[i] = nums[i], nums[start] backtrack(start + 1) nums[start], nums[i] = nums[i], nums[start] # backtrack output: list[list[int]] = [] backtrack(0) return output if __name__ == "__main__": import doctest result = permute_backtrack([1, 2, 3]) print(result) doctest.testmod() ================================================ FILE: data_structures/arrays/prefix_sum.py ================================================ """ Author : Alexander Pantyukhin Date : November 3, 2022 Implement the class of prefix sum with useful functions based on it. """ class PrefixSum: def __init__(self, array: list[int]) -> None: len_array = len(array) self.prefix_sum = [0] * len_array if len_array > 0: self.prefix_sum[0] = array[0] for i in range(1, len_array): self.prefix_sum[i] = self.prefix_sum[i - 1] + array[i] def get_sum(self, start: int, end: int) -> int: """ The function returns the sum of array from the start to the end indexes. Runtime : O(1) Space: O(1) >>> PrefixSum([1,2,3]).get_sum(0, 2) 6 >>> PrefixSum([1,2,3]).get_sum(1, 2) 5 >>> PrefixSum([1,2,3]).get_sum(2, 2) 3 >>> PrefixSum([]).get_sum(0, 0) Traceback (most recent call last): ... ValueError: The array is empty. >>> PrefixSum([1,2,3]).get_sum(-1, 2) Traceback (most recent call last): ... ValueError: Invalid range specified. >>> PrefixSum([1,2,3]).get_sum(2, 3) Traceback (most recent call last): ... ValueError: Invalid range specified. >>> PrefixSum([1,2,3]).get_sum(2, 1) Traceback (most recent call last): ... ValueError: Invalid range specified. """ if not self.prefix_sum: raise ValueError("The array is empty.") if start < 0 or end >= len(self.prefix_sum) or start > end: raise ValueError("Invalid range specified.") if start == 0: return self.prefix_sum[end] return self.prefix_sum[end] - self.prefix_sum[start - 1] def contains_sum(self, target_sum: int) -> bool: """ The function returns True if array contains the target_sum, False otherwise. Runtime : O(n) Space: O(n) >>> PrefixSum([1,2,3]).contains_sum(6) True >>> PrefixSum([1,2,3]).contains_sum(5) True >>> PrefixSum([1,2,3]).contains_sum(3) True >>> PrefixSum([1,2,3]).contains_sum(4) False >>> PrefixSum([1,2,3]).contains_sum(7) False >>> PrefixSum([1,-2,3]).contains_sum(2) True """ sums = {0} for sum_item in self.prefix_sum: if sum_item - target_sum in sums: return True sums.add(sum_item) return False if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/arrays/product_sum.py ================================================ """ Calculate the Product Sum from a Special Array. reference: https://dev.to/sfrasica/algorithms-product-sum-from-an-array-dc6 Python doctests can be run with the following command: python -m doctest -v product_sum.py Calculate the product sum of a "special" array which can contain integers or nested arrays. The product sum is obtained by adding all elements and multiplying by their respective depths. For example, in the array [x, y], the product sum is (x + y). In the array [x, [y, z]], the product sum is x + 2 * (y + z). In the array [x, [y, [z]]], the product sum is x + 2 * (y + 3z). Example Input: [5, 2, [-7, 1], 3, [6, [-13, 8], 4]] Output: 12 """ def product_sum(arr: list[int | list], depth: int) -> int: """ Recursively calculates the product sum of an array. The product sum of an array is defined as the sum of its elements multiplied by their respective depths. If an element is a list, its product sum is calculated recursively by multiplying the sum of its elements with its depth plus one. Args: arr: The array of integers and nested lists. depth: The current depth level. Returns: int: The product sum of the array. Examples: >>> product_sum([1, 2, 3], 1) 6 >>> product_sum([-1, 2, [-3, 4]], 2) 8 >>> product_sum([1, 2, 3], -1) -6 >>> product_sum([1, 2, 3], 0) 0 >>> product_sum([1, 2, 3], 7) 42 >>> product_sum((1, 2, 3), 7) 42 >>> product_sum({1, 2, 3}, 7) 42 >>> product_sum([1, -1], 1) 0 >>> product_sum([1, -2], 1) -1 >>> product_sum([-3.5, [1, [0.5]]], 1) 1.5 """ total_sum = 0 for ele in arr: total_sum += product_sum(ele, depth + 1) if isinstance(ele, list) else ele return total_sum * depth def product_sum_array(array: list[int | list]) -> int: """ Calculates the product sum of an array. Args: array (List[Union[int, List]]): The array of integers and nested lists. Returns: int: The product sum of the array. Examples: >>> product_sum_array([1, 2, 3]) 6 >>> product_sum_array([1, [2, 3]]) 11 >>> product_sum_array([1, [2, [3, 4]]]) 47 >>> product_sum_array([0]) 0 >>> product_sum_array([-3.5, [1, [0.5]]]) 1.5 >>> product_sum_array([1, -2]) -1 """ return product_sum(array, 1) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/arrays/rotate_array.py ================================================ def rotate_array(arr: list[int], steps: int) -> list[int]: """ Rotates a list to the right by steps positions. Parameters: arr (List[int]): The list of integers to rotate. steps (int): Number of positions to rotate. Can be negative for left rotation. Returns: List[int]: Rotated list. Examples: >>> rotate_array([1, 2, 3, 4, 5], 2) [4, 5, 1, 2, 3] >>> rotate_array([1, 2, 3, 4, 5], -2) [3, 4, 5, 1, 2] >>> rotate_array([1, 2, 3, 4, 5], 7) [4, 5, 1, 2, 3] >>> rotate_array([], 3) [] """ n = len(arr) if n == 0: return arr steps = steps % n if steps < 0: steps += n def reverse(start: int, end: int) -> None: """ Reverses a portion of the list in place from index start to end. Parameters: start (int): Starting index of the portion to reverse. end (int): Ending index of the portion to reverse. Returns: None Examples: >>> example = [1, 2, 3, 4, 5] >>> def reverse_test(arr, start, end): ... while start < end: ... arr[start], arr[end] = arr[end], arr[start] ... start += 1 ... end -= 1 >>> reverse_test(example, 0, 2) >>> example [3, 2, 1, 4, 5] >>> reverse_test(example, 2, 4) >>> example [3, 2, 5, 4, 1] """ while start < end: arr[start], arr[end] = arr[end], arr[start] start += 1 end -= 1 reverse(0, n - 1) reverse(0, steps - 1) reverse(steps, n - 1) return arr if __name__ == "__main__": examples = [ ([1, 2, 3, 4, 5], 2), ([1, 2, 3, 4, 5], -2), ([1, 2, 3, 4, 5], 7), ([], 3), ] for arr, steps in examples: rotated = rotate_array(arr.copy(), steps) print(f"Rotate {arr} by {steps}: {rotated}") ================================================ FILE: data_structures/arrays/sparse_table.py ================================================ """ Sparse table is a data structure that allows answering range queries on a static number list, i.e. the elements do not change throughout all the queries. The implementation below will solve the problem of Range Minimum Query: Finding the minimum value of a subset [L..R] of a static number list. Overall time complexity: O(nlogn) Overall space complexity: O(nlogn) Wikipedia link: https://en.wikipedia.org/wiki/Range_minimum_query """ from math import log2 def build_sparse_table(number_list: list[int]) -> list[list[int]]: """ Precompute range minimum queries with power of two length and store the precomputed values in a table. >>> build_sparse_table([8, 1, 0, 3, 4, 9, 3]) [[8, 1, 0, 3, 4, 9, 3], [1, 0, 0, 3, 4, 3, 0], [0, 0, 0, 3, 0, 0, 0]] >>> build_sparse_table([3, 1, 9]) [[3, 1, 9], [1, 1, 0]] >>> build_sparse_table([]) Traceback (most recent call last): ... ValueError: empty number list not allowed """ if not number_list: raise ValueError("empty number list not allowed") length = len(number_list) # Initialise sparse_table -- sparse_table[j][i] represents the minimum value of the # subset of length (2 ** j) of number_list, starting from index i. # smallest power of 2 subset length that fully covers number_list row = int(log2(length)) + 1 sparse_table = [[0 for i in range(length)] for j in range(row)] # minimum of subset of length 1 is that value itself for i, value in enumerate(number_list): sparse_table[0][i] = value j = 1 # compute the minimum value for all intervals with size (2 ** j) while (1 << j) <= length: i = 0 # while subset starting from i still have at least (2 ** j) elements while (i + (1 << j) - 1) < length: # split range [i, i + 2 ** j] and find minimum of 2 halves sparse_table[j][i] = min( sparse_table[j - 1][i + (1 << (j - 1))], sparse_table[j - 1][i] ) i += 1 j += 1 return sparse_table def query(sparse_table: list[list[int]], left_bound: int, right_bound: int) -> int: """ >>> query(build_sparse_table([8, 1, 0, 3, 4, 9, 3]), 0, 4) 0 >>> query(build_sparse_table([8, 1, 0, 3, 4, 9, 3]), 4, 6) 3 >>> query(build_sparse_table([3, 1, 9]), 2, 2) 9 >>> query(build_sparse_table([3, 1, 9]), 0, 1) 1 >>> query(build_sparse_table([8, 1, 0, 3, 4, 9, 3]), 0, 11) Traceback (most recent call last): ... IndexError: list index out of range >>> query(build_sparse_table([]), 0, 0) Traceback (most recent call last): ... ValueError: empty number list not allowed """ if left_bound < 0 or right_bound >= len(sparse_table[0]): raise IndexError("list index out of range") # highest subset length of power of 2 that is within range [left_bound, right_bound] j = int(log2(right_bound - left_bound + 1)) # minimum of 2 overlapping smaller subsets: # [left_bound, left_bound + 2 ** j - 1] and [right_bound - 2 ** j + 1, right_bound] return min(sparse_table[j][right_bound - (1 << j) + 1], sparse_table[j][left_bound]) if __name__ == "__main__": from doctest import testmod testmod() print(f"{query(build_sparse_table([3, 1, 9]), 2, 2) = }") ================================================ FILE: data_structures/arrays/sudoku_solver.py ================================================ """ Please do not modify this file! It is published at https://norvig.com/sudoku.html with only minimal changes to work with modern versions of Python. If you have improvements, please make them in a separate file. """ import random import time def cross(items_a, items_b): """ Cross product of elements in A and elements in B. >>> cross('AB', '12') ['A1', 'A2', 'B1', 'B2'] >>> cross('ABC', '123') ['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3'] >>> cross('ABC', '1234') ['A1', 'A2', 'A3', 'A4', 'B1', 'B2', 'B3', 'B4', 'C1', 'C2', 'C3', 'C4'] >>> cross('', '12') [] >>> cross('A', '') [] >>> cross('', '') [] """ return [a + b for a in items_a for b in items_b] digits = "123456789" rows = "ABCDEFGHI" cols = digits squares = cross(rows, cols) unitlist = ( [cross(rows, c) for c in cols] + [cross(r, cols) for r in rows] + [cross(rs, cs) for rs in ("ABC", "DEF", "GHI") for cs in ("123", "456", "789")] ) units = {s: [u for u in unitlist if s in u] for s in squares} peers = {s: {x for u in units[s] for x in u} - {s} for s in squares} def test(): """A set of unit tests.""" assert len(squares) == 81 assert len(unitlist) == 27 assert all(len(units[s]) == 3 for s in squares) assert all(len(peers[s]) == 20 for s in squares) assert units["C2"] == [ ["A2", "B2", "C2", "D2", "E2", "F2", "G2", "H2", "I2"], ["C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9"], ["A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3"], ] # fmt: off assert peers["C2"] == { "A2", "B2", "D2", "E2", "F2", "G2", "H2", "I2", "C1", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "A1", "A3", "B1", "B3" } # fmt: on print("All tests pass.") def parse_grid(grid): """ Convert grid to a dict of possible values, {square: digits}, or return False if a contradiction is detected. """ ## To start, every square can be any digit; then assign values from the grid. values = dict.fromkeys(squares, digits) for s, d in grid_values(grid).items(): if d in digits and not assign(values, s, d): return False ## (Fail if we can't assign d to square s.) return values def grid_values(grid): """ Convert grid into a dict of {square: char} with '0' or '.' for empties. """ chars = [c for c in grid if c in digits or c in "0."] assert len(chars) == 81 return dict(zip(squares, chars)) def assign(values, s, d): """ Eliminate all the other values (except d) from values[s] and propagate. Return values, except return False if a contradiction is detected. """ other_values = values[s].replace(d, "") if all(eliminate(values, s, d2) for d2 in other_values): return values else: return False def eliminate(values, s, d): """ Eliminate d from values[s]; propagate when values or places <= 2. Return values, except return False if a contradiction is detected. """ if d not in values[s]: return values ## Already eliminated values[s] = values[s].replace(d, "") ## (1) If a square s is reduced to one value d2, then eliminate d2 from the peers. if len(values[s]) == 0: return False ## Contradiction: removed last value elif len(values[s]) == 1: d2 = values[s] if not all(eliminate(values, s2, d2) for s2 in peers[s]): return False ## (2) If a unit u is reduced to only one place for a value d, then put it there. for u in units[s]: dplaces = [s for s in u if d in values[s]] if len(dplaces) == 0: return False ## Contradiction: no place for this value # d can only be in one place in unit; assign it there elif len(dplaces) == 1 and not assign(values, dplaces[0], d): return False return values def display(values): """ Display these values as a 2-D grid. """ width = 1 + max(len(values[s]) for s in squares) line = "+".join(["-" * (width * 3)] * 3) for r in rows: print( "".join( values[r + c].center(width) + ("|" if c in "36" else "") for c in cols ) ) if r in "CF": print(line) print() def solve(grid): """ Solve the grid. """ return search(parse_grid(grid)) def some(seq): """Return some element of seq that is true.""" for e in seq: if e: return e return False def search(values): """ Using depth-first search and propagation, try all possible values. """ if values is False: return False ## Failed earlier if all(len(values[s]) == 1 for s in squares): return values ## Solved! ## Chose the unfilled square s with the fewest possibilities _n, s = min((len(values[s]), s) for s in squares if len(values[s]) > 1) return some(search(assign(values.copy(), s, d)) for d in values[s]) def solve_all(grids, name="", showif=0.0): """ Attempt to solve a sequence of grids. Report results. When showif is a number of seconds, display puzzles that take longer. When showif is None, don't display any puzzles. """ def time_solve(grid): start = time.monotonic() values = solve(grid) t = time.monotonic() - start ## Display puzzles that take long enough if showif is not None and t > showif: display(grid_values(grid)) if values: display(values) print(f"({t:.5f} seconds)\n") return (t, solved(values)) times, results = zip(*[time_solve(grid) for grid in grids]) if (n := len(grids)) > 1: print( "Solved %d of %d %s puzzles (avg %.2f secs (%d Hz), max %.2f secs)." # noqa: UP031 % (sum(results), n, name, sum(times) / n, n / sum(times), max(times)) ) def solved(values): """ A puzzle is solved if each unit is a permutation of the digits 1 to 9. """ def unitsolved(unit): return {values[s] for s in unit} == set(digits) return values is not False and all(unitsolved(unit) for unit in unitlist) def from_file(filename, sep="\n"): "Parse a file into a list of strings, separated by sep." with open(filename) as file: return file.read().strip().split(sep) def random_puzzle(assignments=17): """ Make a random puzzle with N or more assignments. Restart on contradictions. Note the resulting puzzle is not guaranteed to be solvable, but empirically about 99.8% of them are solvable. Some have multiple solutions. """ values = dict.fromkeys(squares, digits) for s in shuffled(squares): if not assign(values, s, random.choice(values[s])): break ds = [values[s] for s in squares if len(values[s]) == 1] if len(ds) >= assignments and len(set(ds)) >= 8: return "".join(values[s] if len(values[s]) == 1 else "." for s in squares) return random_puzzle(assignments) ## Give up and make a new puzzle def shuffled(seq): """ Return a randomly shuffled copy of the input sequence. """ seq = list(seq) random.shuffle(seq) return seq grid1 = ( "003020600900305001001806400008102900700000008006708200002609500800203009005010300" ) grid2 = ( "4.....8.5.3..........7......2.....6.....8.4......1.......6.3.7.5..2.....1.4......" ) hard1 = ( ".....6....59.....82....8....45........3........6..3.54...325..6.................." ) if __name__ == "__main__": test() # solve_all(from_file("easy50.txt", '========'), "easy", None) # solve_all(from_file("top95.txt"), "hard", None) # solve_all(from_file("hardest.txt"), "hardest", None) solve_all([random_puzzle() for _ in range(99)], "random", 100.0) for puzzle in (grid1, grid2): # , hard1): # Takes 22 sec to solve on my M1 Mac. display(parse_grid(puzzle)) start = time.monotonic() solve(puzzle) t = time.monotonic() - start print(f"Solved: {t:.5f} sec") ================================================ FILE: data_structures/binary_tree/README.md ================================================ # Binary Tree Traversal ## Overview The combination of binary trees being data structures and traversal being an algorithm relates to classic problems, either directly or indirectly. > If you can grasp the traversal of binary trees, the traversal of other complicated trees will be easy for you. The following are some common ways to traverse trees. - Depth First Traversals (DFS): In-order, Pre-order, Post-order - Level Order Traversal or Breadth First or Traversal (BFS) There are applications for both DFS and BFS. Stack can be used to simplify the process of DFS traversal. Besides, since tree is a recursive data structure, recursion and stack are two key points for DFS. Graph for DFS: ![binary-tree-traversal-dfs](https://tva1.sinaimg.cn/large/007S8ZIlly1ghluhzhynsg30dw0dw3yl.gif) The key point of BFS is how to determine whether the traversal of each level has been completed. The answer is to use a variable as a flag to represent the end of the traversal of current level. ## Pre-order Traversal The traversal order of pre-order traversal is `root-left-right`. Algorithm Pre-order 1. Visit the root node and push it into a stack. 2. Pop a node from the stack, and push its right and left child node into the stack respectively. 3. Repeat step 2. Conclusion: This problem involves the classic recursive data structure (i.e. a binary tree), and the algorithm above demonstrates how a simplified solution can be reached by using a stack. If you look at the bigger picture, you'll find that the process of traversal is as followed. `Visit the left subtrees respectively from top to bottom, and visit the right subtrees respectively from bottom to top`. If we are to implement it from this perspective, things will be somewhat different. For the `top to bottom` part we can simply use recursion, and for the `bottom to top` part we can turn to stack. ## In-order Traversal The traversal order of in-order traversal is `left-root-right`. So the root node is not printed first. Things are getting a bit complicated here. Algorithm In-order 1. Visit the root and push it into a stack. 2. If there is a left child node, push it into the stack. Repeat this process until a leaf node reached. > At this point the root node and all the left nodes are in the stack. 3. Start popping nodes from the stack. If a node has a right child node, push the child node into the stack. Repeat step 2. It's worth pointing out that the in-order traversal of a binary search tree (BST) is a sorted array, which is helpful for coming up simplified solutions for some problems. ## Post-order Traversal The traversal order of post-order traversal is `left-right-root`. This one is a bit of a challenge. It deserves the `hard` tag of LeetCode. In this case, the root node is printed not as the first but the last one. A cunning way to do it is to: Record whether the current node has been visited. If 1) it's a leaf node or 2) both its left and right subtrees have been traversed, then it can be popped from the stack. As for `1) it's a leaf node`, you can easily tell whether a node is a leaf if both its left and right are `null`. As for `2) both its left and right subtrees have been traversed`, we only need a variable to record whether a node has been visited or not. In the worst case, we need to record the status for every single node and the space complexity is `O(n)`. But if you come to think about it, as we are using a stack and start printing the result from the leaf nodes, it makes sense that we only record the status for the current node popping from the stack, reducing the space complexity to `O(1)`. ## Level Order Traversal The key point of level order traversal is how do we know whether the traversal of each level is done. The answer is that we use a variable as a flag representing the end of the traversal of the current level. ![binary-tree-traversal-bfs](https://tva1.sinaimg.cn/large/007S8ZIlly1ghlui1tpoug30dw0dw3yl.gif) Algorithm Level-order 1. Visit the root node, put it in a FIFO queue, put in the queue a special flag (we are using `null` here). 2. Dequeue a node. 3. If the node equals `null`, it means that all nodes of the current level have been visited. If the queue is empty, we do nothing. Or else we put in another `null`. 4. If the node is not `null`, meaning the traversal of current level has not finished yet, we enqueue its left subtree and right subtree respectively. ## Bi-color marking We know that there is a tri-color marking in garbage collection algorithm, which works as described below. - The white color represents "not visited". - The gray color represents "not all child nodes visited". - The black color represents "all child nodes visited". Enlightened by tri-color marking, a bi-color marking method can be invented to solve all three traversal problems with one solution. The core idea is as follow. - Use a color to mark whether a node has been visited or not. Nodes yet to be visited are marked as white and visited nodes are marked as gray. - If we are visiting a white node, turn it into gray, and push its right child node, itself, and it's left child node into the stack respectively. - If we are visiting a gray node, print it. Implementation of pre-order and post-order traversal algorithms can be easily done by changing the order of pushing the child nodes into the stack. Reference: [LeetCode](https://github.com/azl397985856/leetcode/blob/master/thinkings/binary-tree-traversal.en.md) ================================================ FILE: data_structures/binary_tree/__init__.py ================================================ ================================================ FILE: data_structures/binary_tree/avl_tree.py ================================================ """ Implementation of an auto-balanced binary tree! For doctests run following command: python3 -m doctest -v avl_tree.py For testing run: python avl_tree.py """ from __future__ import annotations import math import random from typing import Any class MyQueue: def __init__(self) -> None: self.data: list[Any] = [] self.head: int = 0 self.tail: int = 0 def is_empty(self) -> bool: return self.head == self.tail def push(self, data: Any) -> None: self.data.append(data) self.tail = self.tail + 1 def pop(self) -> Any: ret = self.data[self.head] self.head = self.head + 1 return ret def count(self) -> int: return self.tail - self.head def print_queue(self) -> None: print(self.data) print("**************") print(self.data[self.head : self.tail]) class MyNode: def __init__(self, data: Any) -> None: self.data = data self.left: MyNode | None = None self.right: MyNode | None = None self.height: int = 1 def get_data(self) -> Any: return self.data def get_left(self) -> MyNode | None: return self.left def get_right(self) -> MyNode | None: return self.right def get_height(self) -> int: return self.height def set_data(self, data: Any) -> None: self.data = data def set_left(self, node: MyNode | None) -> None: self.left = node def set_right(self, node: MyNode | None) -> None: self.right = node def set_height(self, height: int) -> None: self.height = height def get_height(node: MyNode | None) -> int: if node is None: return 0 return node.get_height() def my_max(a: int, b: int) -> int: if a > b: return a return b def right_rotation(node: MyNode) -> MyNode: r""" A B / \ / \ B C Bl A / \ --> / / \ Bl Br UB Br C / UB UB = unbalanced node """ print("left rotation node:", node.get_data()) ret = node.get_left() assert ret is not None node.set_left(ret.get_right()) ret.set_right(node) h1 = my_max(get_height(node.get_right()), get_height(node.get_left())) + 1 node.set_height(h1) h2 = my_max(get_height(ret.get_right()), get_height(ret.get_left())) + 1 ret.set_height(h2) return ret def left_rotation(node: MyNode) -> MyNode: """ a mirror symmetry rotation of the left_rotation """ print("right rotation node:", node.get_data()) ret = node.get_right() assert ret is not None node.set_right(ret.get_left()) ret.set_left(node) h1 = my_max(get_height(node.get_right()), get_height(node.get_left())) + 1 node.set_height(h1) h2 = my_max(get_height(ret.get_right()), get_height(ret.get_left())) + 1 ret.set_height(h2) return ret def lr_rotation(node: MyNode) -> MyNode: r""" A A Br / \ / \ / \ B C LR Br C RR B A / \ --> / \ --> / / \ Bl Br B UB Bl UB C \ / UB Bl RR = right_rotation LR = left_rotation """ left_child = node.get_left() assert left_child is not None node.set_left(left_rotation(left_child)) return right_rotation(node) def rl_rotation(node: MyNode) -> MyNode: right_child = node.get_right() assert right_child is not None node.set_right(right_rotation(right_child)) return left_rotation(node) def insert_node(node: MyNode | None, data: Any) -> MyNode | None: if node is None: return MyNode(data) if data < node.get_data(): node.set_left(insert_node(node.get_left(), data)) if ( get_height(node.get_left()) - get_height(node.get_right()) == 2 ): # an unbalance detected left_child = node.get_left() assert left_child is not None if ( data < left_child.get_data() ): # new node is the left child of the left child node = right_rotation(node) else: node = lr_rotation(node) else: node.set_right(insert_node(node.get_right(), data)) if get_height(node.get_right()) - get_height(node.get_left()) == 2: right_child = node.get_right() assert right_child is not None if data < right_child.get_data(): node = rl_rotation(node) else: node = left_rotation(node) h1 = my_max(get_height(node.get_right()), get_height(node.get_left())) + 1 node.set_height(h1) return node def get_right_most(root: MyNode) -> Any: while True: right_child = root.get_right() if right_child is None: break root = right_child return root.get_data() def get_left_most(root: MyNode) -> Any: while True: left_child = root.get_left() if left_child is None: break root = left_child return root.get_data() def del_node(root: MyNode, data: Any) -> MyNode | None: left_child = root.get_left() right_child = root.get_right() if root.get_data() == data: if left_child is not None and right_child is not None: temp_data = get_left_most(right_child) root.set_data(temp_data) root.set_right(del_node(right_child, temp_data)) elif left_child is not None: root = left_child elif right_child is not None: root = right_child else: return None elif root.get_data() > data: if left_child is None: print("No such data") return root else: root.set_left(del_node(left_child, data)) # root.get_data() < data elif right_child is None: return root else: root.set_right(del_node(right_child, data)) # Re-fetch left_child and right_child references left_child = root.get_left() right_child = root.get_right() if get_height(right_child) - get_height(left_child) == 2: assert right_child is not None if get_height(right_child.get_right()) > get_height(right_child.get_left()): root = left_rotation(root) else: root = rl_rotation(root) elif get_height(right_child) - get_height(left_child) == -2: assert left_child is not None if get_height(left_child.get_left()) > get_height(left_child.get_right()): root = right_rotation(root) else: root = lr_rotation(root) height = my_max(get_height(root.get_right()), get_height(root.get_left())) + 1 root.set_height(height) return root class AVLtree: """ An AVL tree doctest Examples: >>> t = AVLtree() >>> t.insert(4) insert:4 >>> print(str(t).replace(" \\n","\\n")) 4 ************************************* >>> t.insert(2) insert:2 >>> print(str(t).replace(" \\n","\\n").replace(" \\n","\\n")) 4 2 * ************************************* >>> t.insert(3) insert:3 right rotation node: 2 left rotation node: 4 >>> print(str(t).replace(" \\n","\\n").replace(" \\n","\\n")) 3 2 4 ************************************* >>> t.get_height() 2 >>> t.del_node(3) delete:3 >>> print(str(t).replace(" \\n","\\n").replace(" \\n","\\n")) 4 2 * ************************************* """ def __init__(self) -> None: self.root: MyNode | None = None def get_height(self) -> int: return get_height(self.root) def insert(self, data: Any) -> None: print("insert:" + str(data)) self.root = insert_node(self.root, data) def del_node(self, data: Any) -> None: print("delete:" + str(data)) if self.root is None: print("Tree is empty!") return self.root = del_node(self.root, data) def __str__( self, ) -> str: # a level traversale, gives a more intuitive look on the tree output = "" q = MyQueue() q.push(self.root) layer = self.get_height() if layer == 0: return output cnt = 0 while not q.is_empty(): node = q.pop() space = " " * int(math.pow(2, layer - 1)) output += space if node is None: output += "*" q.push(None) q.push(None) else: output += str(node.get_data()) q.push(node.get_left()) q.push(node.get_right()) output += space cnt = cnt + 1 for i in range(100): if cnt == math.pow(2, i) - 1: layer = layer - 1 if layer == 0: output += "\n*************************************" return output output += "\n" break output += "\n*************************************" return output def _test() -> None: import doctest doctest.testmod() if __name__ == "__main__": _test() t = AVLtree() lst = list(range(10)) random.shuffle(lst) for i in lst: t.insert(i) print(str(t)) random.shuffle(lst) for i in lst: t.del_node(i) print(str(t)) ================================================ FILE: data_structures/binary_tree/basic_binary_tree.py ================================================ from __future__ import annotations from collections.abc import Iterator from dataclasses import dataclass @dataclass class Node: data: int left: Node | None = None right: Node | None = None def __iter__(self) -> Iterator[int]: if self.left: yield from self.left yield self.data if self.right: yield from self.right def __len__(self) -> int: return sum(1 for _ in self) def is_full(self) -> bool: if not self or (not self.left and not self.right): return True if self.left and self.right: return self.left.is_full() and self.right.is_full() return False @dataclass class BinaryTree: root: Node def __iter__(self) -> Iterator[int]: return iter(self.root) def __len__(self) -> int: return len(self.root) @classmethod def small_tree(cls) -> BinaryTree: """ Return a small binary tree with 3 nodes. >>> binary_tree = BinaryTree.small_tree() >>> len(binary_tree) 3 >>> list(binary_tree) [1, 2, 3] """ binary_tree = BinaryTree(Node(2)) binary_tree.root.left = Node(1) binary_tree.root.right = Node(3) return binary_tree @classmethod def medium_tree(cls) -> BinaryTree: """ Return a medium binary tree with 3 nodes. >>> binary_tree = BinaryTree.medium_tree() >>> len(binary_tree) 7 >>> list(binary_tree) [1, 2, 3, 4, 5, 6, 7] """ binary_tree = BinaryTree(Node(4)) binary_tree.root.left = two = Node(2) two.left = Node(1) two.right = Node(3) binary_tree.root.right = five = Node(5) five.right = six = Node(6) six.right = Node(7) return binary_tree def depth(self) -> int: """ Returns the depth of the tree >>> BinaryTree(Node(1)).depth() 1 >>> BinaryTree.small_tree().depth() 2 >>> BinaryTree.medium_tree().depth() 4 """ return self._depth(self.root) def _depth(self, node: Node | None) -> int: if not node: return 0 return 1 + max(self._depth(node.left), self._depth(node.right)) def is_full(self) -> bool: """ Returns True if the tree is full >>> BinaryTree(Node(1)).is_full() True >>> BinaryTree.small_tree().is_full() True >>> BinaryTree.medium_tree().is_full() False """ return self.root.is_full() if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/binary_tree/binary_search_tree.py ================================================ r""" A binary search Tree Example 8 / \ 3 10 / \ \ 1 6 14 / \ / 4 7 13 >>> t = BinarySearchTree().insert(8, 3, 6, 1, 10, 14, 13, 4, 7) >>> print(" ".join(repr(i.value) for i in t.traversal_tree())) 8 3 1 6 4 7 10 14 13 >>> tuple(i.value for i in t.traversal_tree(inorder)) (1, 3, 4, 6, 7, 8, 10, 13, 14) >>> tuple(t) (1, 3, 4, 6, 7, 8, 10, 13, 14) >>> t.find_kth_smallest(3, t.root) 4 >>> tuple(t)[3-1] 4 >>> print(" ".join(repr(i.value) for i in t.traversal_tree(postorder))) 1 4 7 6 3 13 14 10 8 >>> t.remove(20) Traceback (most recent call last): ... ValueError: Value 20 not found >>> BinarySearchTree().search(6) Traceback (most recent call last): ... IndexError: Warning: Tree is empty! please use another. Other example: >>> testlist = (8, 3, 6, 1, 10, 14, 13, 4, 7) >>> t = BinarySearchTree() >>> for i in testlist: ... t.insert(i) # doctest: +ELLIPSIS BinarySearchTree(root=8) BinarySearchTree(root={'8': (3, None)}) BinarySearchTree(root={'8': ({'3': (None, 6)}, None)}) BinarySearchTree(root={'8': ({'3': (1, 6)}, None)}) BinarySearchTree(root={'8': ({'3': (1, 6)}, 10)}) BinarySearchTree(root={'8': ({'3': (1, 6)}, {'10': (None, 14)})}) BinarySearchTree(root={'8': ({'3': (1, 6)}, {'10': (None, {'14': (13, None)})})}) BinarySearchTree(root={'8': ({'3': (1, {'6': (4, None)})}, {'10': (None, {'14': ... BinarySearchTree(root={'8': ({'3': (1, {'6': (4, 7)})}, {'10': (None, {'14': (13, ... Prints all the elements of the list in order traversal >>> print(t) {'8': ({'3': (1, {'6': (4, 7)})}, {'10': (None, {'14': (13, None)})})} Test existence >>> t.search(6) is not None True >>> 6 in t True >>> t.search(-1) is not None False >>> -1 in t False >>> t.search(6).is_right True >>> t.search(1).is_right False >>> t.get_max().value 14 >>> max(t) 14 >>> t.get_min().value 1 >>> min(t) 1 >>> t.empty() False >>> not t False >>> for i in testlist: ... t.remove(i) >>> t.empty() True >>> not t True """ from __future__ import annotations from collections.abc import Iterable, Iterator from dataclasses import dataclass from typing import Any, Self @dataclass class Node: value: int left: Node | None = None right: Node | None = None parent: Node | None = None # Added in order to delete a node easier def __iter__(self) -> Iterator[int]: """ >>> list(Node(0)) [0] >>> list(Node(0, Node(-1), Node(1), None)) [-1, 0, 1] """ yield from self.left or [] yield self.value yield from self.right or [] def __repr__(self) -> str: from pprint import pformat if self.left is None and self.right is None: return str(self.value) return pformat({f"{self.value}": (self.left, self.right)}, indent=1) @property def is_right(self) -> bool: return bool(self.parent and self is self.parent.right) @dataclass class BinarySearchTree: root: Node | None = None def __bool__(self) -> bool: return bool(self.root) def __iter__(self) -> Iterator[int]: yield from self.root or [] def __str__(self) -> str: """ Return a string of all the Nodes using in order traversal """ return str(self.root) def __reassign_nodes(self, node: Node, new_children: Node | None) -> None: if new_children is not None: # reset its kids new_children.parent = node.parent if node.parent is not None: # reset its parent if node.is_right: # If it is the right child node.parent.right = new_children else: node.parent.left = new_children else: self.root = new_children def empty(self) -> bool: """ Returns True if the tree does not have any element(s). False if the tree has element(s). >>> BinarySearchTree().empty() True >>> BinarySearchTree().insert(1).empty() False >>> BinarySearchTree().insert(8, 3, 6, 1, 10, 14, 13, 4, 7).empty() False """ return not self.root def __insert(self, value) -> None: """ Insert a new node in Binary Search Tree with value label """ new_node = Node(value) # create a new Node if self.empty(): # if Tree is empty self.root = new_node # set its root else: # Tree is not empty parent_node = self.root # from root if parent_node is None: return while True: # While we don't get to a leaf if value < parent_node.value: # We go left if parent_node.left is None: parent_node.left = new_node # We insert the new node in a leaf break else: parent_node = parent_node.left elif parent_node.right is None: parent_node.right = new_node break else: parent_node = parent_node.right new_node.parent = parent_node def insert(self, *values) -> Self: for value in values: self.__insert(value) return self def search(self, value) -> Node | None: """ >>> tree = BinarySearchTree().insert(10, 20, 30, 40, 50) >>> tree.search(10) {'10': (None, {'20': (None, {'30': (None, {'40': (None, 50)})})})} >>> tree.search(20) {'20': (None, {'30': (None, {'40': (None, 50)})})} >>> tree.search(30) {'30': (None, {'40': (None, 50)})} >>> tree.search(40) {'40': (None, 50)} >>> tree.search(50) 50 >>> tree.search(5) is None # element not present True >>> tree.search(0) is None # element not present True >>> tree.search(-5) is None # element not present True >>> BinarySearchTree().search(10) Traceback (most recent call last): ... IndexError: Warning: Tree is empty! please use another. """ if self.empty(): raise IndexError("Warning: Tree is empty! please use another.") else: node = self.root # use lazy evaluation here to avoid NoneType Attribute error while node is not None and node.value is not value: node = node.left if value < node.value else node.right return node def get_max(self, node: Node | None = None) -> Node | None: """ We go deep on the right branch >>> BinarySearchTree().insert(10, 20, 30, 40, 50).get_max() 50 >>> BinarySearchTree().insert(-5, -1, 0.1, -0.3, -4.5).get_max() {'0.1': (-0.3, None)} >>> BinarySearchTree().insert(1, 78.3, 30, 74.0, 1).get_max() {'78.3': ({'30': (1, 74.0)}, None)} >>> BinarySearchTree().insert(1, 783, 30, 740, 1).get_max() {'783': ({'30': (1, 740)}, None)} """ if node is None: if self.root is None: return None node = self.root if not self.empty(): while node.right is not None: node = node.right return node def get_min(self, node: Node | None = None) -> Node | None: """ We go deep on the left branch >>> BinarySearchTree().insert(10, 20, 30, 40, 50).get_min() {'10': (None, {'20': (None, {'30': (None, {'40': (None, 50)})})})} >>> BinarySearchTree().insert(-5, -1, 0, -0.3, -4.5).get_min() {'-5': (None, {'-1': (-4.5, {'0': (-0.3, None)})})} >>> BinarySearchTree().insert(1, 78.3, 30, 74.0, 1).get_min() {'1': (None, {'78.3': ({'30': (1, 74.0)}, None)})} >>> BinarySearchTree().insert(1, 783, 30, 740, 1).get_min() {'1': (None, {'783': ({'30': (1, 740)}, None)})} """ if node is None: node = self.root if self.root is None: return None if not self.empty(): node = self.root while node.left is not None: node = node.left return node def remove(self, value: int) -> None: # Look for the node with that label node = self.search(value) if node is None: msg = f"Value {value} not found" raise ValueError(msg) if node.left is None and node.right is None: # If it has no children self.__reassign_nodes(node, None) elif node.left is None: # Has only right children self.__reassign_nodes(node, node.right) elif node.right is None: # Has only left children self.__reassign_nodes(node, node.left) else: predecessor = self.get_max( node.left ) # Gets the max value of the left branch self.remove(predecessor.value) # type: ignore[union-attr] node.value = ( predecessor.value # type: ignore[union-attr] ) # Assigns the value to the node to delete and keep tree structure def preorder_traverse(self, node: Node | None) -> Iterable: if node is not None: yield node # Preorder Traversal yield from self.preorder_traverse(node.left) yield from self.preorder_traverse(node.right) def traversal_tree(self, traversal_function=None) -> Any: """ This function traversal the tree. You can pass a function to traversal the tree as needed by client code """ if traversal_function is None: return self.preorder_traverse(self.root) else: return traversal_function(self.root) def inorder(self, arr: list, node: Node | None) -> None: """Perform an inorder traversal and append values of the nodes to a list named arr""" if node: self.inorder(arr, node.left) arr.append(node.value) self.inorder(arr, node.right) def find_kth_smallest(self, k: int, node: Node) -> int: """Return the kth smallest element in a binary search tree""" arr: list[int] = [] self.inorder(arr, node) # append all values to list using inorder traversal return arr[k - 1] def inorder(curr_node: Node | None) -> list[Node]: """ inorder (left, self, right) """ node_list = [] if curr_node is not None: node_list = [*inorder(curr_node.left), curr_node, *inorder(curr_node.right)] return node_list def postorder(curr_node: Node | None) -> list[Node]: """ postOrder (left, right, self) """ node_list = [] if curr_node is not None: node_list = postorder(curr_node.left) + postorder(curr_node.right) + [curr_node] return node_list if __name__ == "__main__": import doctest doctest.testmod(verbose=True) ================================================ FILE: data_structures/binary_tree/binary_search_tree_recursive.py ================================================ """ This is a python3 implementation of binary search tree using recursion To run tests: python -m unittest binary_search_tree_recursive.py To run an example: python binary_search_tree_recursive.py """ from __future__ import annotations import unittest from collections.abc import Iterator import pytest class Node: def __init__(self, label: int, parent: Node | None) -> None: self.label = label self.parent = parent self.left: Node | None = None self.right: Node | None = None class BinarySearchTree: def __init__(self) -> None: self.root: Node | None = None def empty(self) -> None: """ Empties the tree >>> t = BinarySearchTree() >>> assert t.root is None >>> t.put(8) >>> assert t.root is not None """ self.root = None def is_empty(self) -> bool: """ Checks if the tree is empty >>> t = BinarySearchTree() >>> t.is_empty() True >>> t.put(8) >>> t.is_empty() False """ return self.root is None def put(self, label: int) -> None: """ Put a new node in the tree >>> t = BinarySearchTree() >>> t.put(8) >>> assert t.root.parent is None >>> assert t.root.label == 8 >>> t.put(10) >>> assert t.root.right.parent == t.root >>> assert t.root.right.label == 10 >>> t.put(3) >>> assert t.root.left.parent == t.root >>> assert t.root.left.label == 3 """ self.root = self._put(self.root, label) def _put(self, node: Node | None, label: int, parent: Node | None = None) -> Node: if node is None: node = Node(label, parent) elif label < node.label: node.left = self._put(node.left, label, node) elif label > node.label: node.right = self._put(node.right, label, node) else: msg = f"Node with label {label} already exists" raise ValueError(msg) return node def search(self, label: int) -> Node: """ Searches a node in the tree >>> t = BinarySearchTree() >>> t.put(8) >>> t.put(10) >>> node = t.search(8) >>> assert node.label == 8 >>> node = t.search(3) Traceback (most recent call last): ... ValueError: Node with label 3 does not exist """ return self._search(self.root, label) def _search(self, node: Node | None, label: int) -> Node: if node is None: msg = f"Node with label {label} does not exist" raise ValueError(msg) elif label < node.label: node = self._search(node.left, label) elif label > node.label: node = self._search(node.right, label) return node def remove(self, label: int) -> None: """ Removes a node in the tree >>> t = BinarySearchTree() >>> t.put(8) >>> t.put(10) >>> t.remove(8) >>> assert t.root.label == 10 >>> t.remove(3) Traceback (most recent call last): ... ValueError: Node with label 3 does not exist """ node = self.search(label) if node.right and node.left: lowest_node = self._get_lowest_node(node.right) lowest_node.left = node.left lowest_node.right = node.right node.left.parent = lowest_node if node.right: node.right.parent = lowest_node self._reassign_nodes(node, lowest_node) elif not node.right and node.left: self._reassign_nodes(node, node.left) elif node.right and not node.left: self._reassign_nodes(node, node.right) else: self._reassign_nodes(node, None) def _reassign_nodes(self, node: Node, new_children: Node | None) -> None: if new_children: new_children.parent = node.parent if node.parent: if node.parent.right == node: node.parent.right = new_children else: node.parent.left = new_children else: self.root = new_children def _get_lowest_node(self, node: Node) -> Node: if node.left: lowest_node = self._get_lowest_node(node.left) else: lowest_node = node self._reassign_nodes(node, node.right) return lowest_node def exists(self, label: int) -> bool: """ Checks if a node exists in the tree >>> t = BinarySearchTree() >>> t.put(8) >>> t.put(10) >>> t.exists(8) True >>> t.exists(3) False """ try: self.search(label) return True except ValueError: return False def get_max_label(self) -> int: """ Gets the max label inserted in the tree >>> t = BinarySearchTree() >>> t.get_max_label() Traceback (most recent call last): ... ValueError: Binary search tree is empty >>> t.put(8) >>> t.put(10) >>> t.get_max_label() 10 """ if self.root is None: raise ValueError("Binary search tree is empty") node = self.root while node.right is not None: node = node.right return node.label def get_min_label(self) -> int: """ Gets the min label inserted in the tree >>> t = BinarySearchTree() >>> t.get_min_label() Traceback (most recent call last): ... ValueError: Binary search tree is empty >>> t.put(8) >>> t.put(10) >>> t.get_min_label() 8 """ if self.root is None: raise ValueError("Binary search tree is empty") node = self.root while node.left is not None: node = node.left return node.label def inorder_traversal(self) -> Iterator[Node]: """ Return the inorder traversal of the tree >>> t = BinarySearchTree() >>> [i.label for i in t.inorder_traversal()] [] >>> t.put(8) >>> t.put(10) >>> t.put(9) >>> [i.label for i in t.inorder_traversal()] [8, 9, 10] """ return self._inorder_traversal(self.root) def _inorder_traversal(self, node: Node | None) -> Iterator[Node]: if node is not None: yield from self._inorder_traversal(node.left) yield node yield from self._inorder_traversal(node.right) def preorder_traversal(self) -> Iterator[Node]: """ Return the preorder traversal of the tree >>> t = BinarySearchTree() >>> [i.label for i in t.preorder_traversal()] [] >>> t.put(8) >>> t.put(10) >>> t.put(9) >>> [i.label for i in t.preorder_traversal()] [8, 10, 9] """ return self._preorder_traversal(self.root) def _preorder_traversal(self, node: Node | None) -> Iterator[Node]: if node is not None: yield node yield from self._preorder_traversal(node.left) yield from self._preorder_traversal(node.right) class BinarySearchTreeTest(unittest.TestCase): @staticmethod def _get_binary_search_tree() -> BinarySearchTree: r""" 8 / \ 3 10 / \ \ 1 6 14 / \ / 4 7 13 \ 5 """ t = BinarySearchTree() t.put(8) t.put(3) t.put(6) t.put(1) t.put(10) t.put(14) t.put(13) t.put(4) t.put(7) t.put(5) return t def test_put(self) -> None: t = BinarySearchTree() assert t.is_empty() t.put(8) r""" 8 """ assert t.root is not None assert t.root.parent is None assert t.root.label == 8 t.put(10) r""" 8 \ 10 """ assert t.root.right is not None assert t.root.right.parent == t.root assert t.root.right.label == 10 t.put(3) r""" 8 / \ 3 10 """ assert t.root.left is not None assert t.root.left.parent == t.root assert t.root.left.label == 3 t.put(6) r""" 8 / \ 3 10 \ 6 """ assert t.root.left.right is not None assert t.root.left.right.parent == t.root.left assert t.root.left.right.label == 6 t.put(1) r""" 8 / \ 3 10 / \ 1 6 """ assert t.root.left.left is not None assert t.root.left.left.parent == t.root.left assert t.root.left.left.label == 1 with pytest.raises(ValueError): t.put(1) def test_search(self) -> None: t = self._get_binary_search_tree() node = t.search(6) assert node.label == 6 node = t.search(13) assert node.label == 13 with pytest.raises(ValueError): t.search(2) def test_remove(self) -> None: t = self._get_binary_search_tree() t.remove(13) r""" 8 / \ 3 10 / \ \ 1 6 14 / \ 4 7 \ 5 """ assert t.root is not None assert t.root.right is not None assert t.root.right.right is not None assert t.root.right.right.right is None assert t.root.right.right.left is None t.remove(7) r""" 8 / \ 3 10 / \ \ 1 6 14 / 4 \ 5 """ assert t.root.left is not None assert t.root.left.right is not None assert t.root.left.right.left is not None assert t.root.left.right.right is None assert t.root.left.right.left.label == 4 t.remove(6) r""" 8 / \ 3 10 / \ \ 1 4 14 \ 5 """ assert t.root.left.left is not None assert t.root.left.right.right is not None assert t.root.left.left.label == 1 assert t.root.left.right.label == 4 assert t.root.left.right.right.label == 5 assert t.root.left.right.left is None assert t.root.left.left.parent == t.root.left assert t.root.left.right.parent == t.root.left t.remove(3) r""" 8 / \ 4 10 / \ \ 1 5 14 """ assert t.root is not None assert t.root.left.label == 4 assert t.root.left.right.label == 5 assert t.root.left.left.label == 1 assert t.root.left.parent == t.root assert t.root.left.left.parent == t.root.left assert t.root.left.right.parent == t.root.left t.remove(4) r""" 8 / \ 5 10 / \ 1 14 """ assert t.root.left is not None assert t.root.left.left is not None assert t.root.left.label == 5 assert t.root.left.right is None assert t.root.left.left.label == 1 assert t.root.left.parent == t.root assert t.root.left.left.parent == t.root.left def test_remove_2(self) -> None: t = self._get_binary_search_tree() t.remove(3) r""" 8 / \ 4 10 / \ \ 1 6 14 / \ / 5 7 13 """ assert t.root is not None assert t.root.left is not None assert t.root.left.left is not None assert t.root.left.right is not None assert t.root.left.right.left is not None assert t.root.left.right.right is not None assert t.root.left.label == 4 assert t.root.left.right.label == 6 assert t.root.left.left.label == 1 assert t.root.left.right.right.label == 7 assert t.root.left.right.left.label == 5 assert t.root.left.parent == t.root assert t.root.left.right.parent == t.root.left assert t.root.left.left.parent == t.root.left assert t.root.left.right.left.parent == t.root.left.right def test_empty(self) -> None: t = self._get_binary_search_tree() t.empty() assert t.root is None def test_is_empty(self) -> None: t = self._get_binary_search_tree() assert not t.is_empty() t.empty() assert t.is_empty() def test_exists(self) -> None: t = self._get_binary_search_tree() assert t.exists(6) assert not t.exists(-1) def test_get_max_label(self) -> None: t = self._get_binary_search_tree() assert t.get_max_label() == 14 t.empty() with pytest.raises(ValueError): t.get_max_label() def test_get_min_label(self) -> None: t = self._get_binary_search_tree() assert t.get_min_label() == 1 t.empty() with pytest.raises(ValueError): t.get_min_label() def test_inorder_traversal(self) -> None: t = self._get_binary_search_tree() inorder_traversal_nodes = [i.label for i in t.inorder_traversal()] assert inorder_traversal_nodes == [1, 3, 4, 5, 6, 7, 8, 10, 13, 14] def test_preorder_traversal(self) -> None: t = self._get_binary_search_tree() preorder_traversal_nodes = [i.label for i in t.preorder_traversal()] assert preorder_traversal_nodes == [8, 3, 1, 6, 4, 5, 7, 10, 14, 13] def binary_search_tree_example() -> None: r""" Example 8 / \ 3 10 / \ \ 1 6 14 / \ / 4 7 13 \ 5 Example After Deletion 4 / \ 1 7 \ 5 """ t = BinarySearchTree() t.put(8) t.put(3) t.put(6) t.put(1) t.put(10) t.put(14) t.put(13) t.put(4) t.put(7) t.put(5) print( """ 8 / \\ 3 10 / \\ \\ 1 6 14 / \\ / 4 7 13 \\ 5 """ ) print("Label 6 exists:", t.exists(6)) print("Label 13 exists:", t.exists(13)) print("Label -1 exists:", t.exists(-1)) print("Label 12 exists:", t.exists(12)) # Prints all the elements of the list in inorder traversal inorder_traversal_nodes = [i.label for i in t.inorder_traversal()] print("Inorder traversal:", inorder_traversal_nodes) # Prints all the elements of the list in preorder traversal preorder_traversal_nodes = [i.label for i in t.preorder_traversal()] print("Preorder traversal:", preorder_traversal_nodes) print("Max. label:", t.get_max_label()) print("Min. label:", t.get_min_label()) # Delete elements print("\nDeleting elements 13, 10, 8, 3, 6, 14") print( """ 4 / \\ 1 7 \\ 5 """ ) t.remove(13) t.remove(10) t.remove(8) t.remove(3) t.remove(6) t.remove(14) # Prints all the elements of the list in inorder traversal after delete inorder_traversal_nodes = [i.label for i in t.inorder_traversal()] print("Inorder traversal after delete:", inorder_traversal_nodes) # Prints all the elements of the list in preorder traversal after delete preorder_traversal_nodes = [i.label for i in t.preorder_traversal()] print("Preorder traversal after delete:", preorder_traversal_nodes) print("Max. label:", t.get_max_label()) print("Min. label:", t.get_min_label()) if __name__ == "__main__": binary_search_tree_example() ================================================ FILE: data_structures/binary_tree/binary_tree_mirror.py ================================================ """ Problem Description: Given a binary tree, return its mirror. """ def binary_tree_mirror_dict(binary_tree_mirror_dictionary: dict, root: int): if not root or root not in binary_tree_mirror_dictionary: return left_child, right_child = binary_tree_mirror_dictionary[root][:2] binary_tree_mirror_dictionary[root] = [right_child, left_child] binary_tree_mirror_dict(binary_tree_mirror_dictionary, left_child) binary_tree_mirror_dict(binary_tree_mirror_dictionary, right_child) def binary_tree_mirror(binary_tree: dict, root: int = 1) -> dict: """ >>> binary_tree_mirror({ 1: [2,3], 2: [4,5], 3: [6,7], 7: [8,9]}, 1) {1: [3, 2], 2: [5, 4], 3: [7, 6], 7: [9, 8]} >>> binary_tree_mirror({ 1: [2,3], 2: [4,5], 3: [6,7], 4: [10,11]}, 1) {1: [3, 2], 2: [5, 4], 3: [7, 6], 4: [11, 10]} >>> binary_tree_mirror({ 1: [2,3], 2: [4,5], 3: [6,7], 4: [10,11]}, 5) Traceback (most recent call last): ... ValueError: root 5 is not present in the binary_tree >>> binary_tree_mirror({}, 5) Traceback (most recent call last): ... ValueError: binary tree cannot be empty """ if not binary_tree: raise ValueError("binary tree cannot be empty") if root not in binary_tree: msg = f"root {root} is not present in the binary_tree" raise ValueError(msg) binary_tree_mirror_dictionary = dict(binary_tree) binary_tree_mirror_dict(binary_tree_mirror_dictionary, root) return binary_tree_mirror_dictionary if __name__ == "__main__": binary_tree = {1: [2, 3], 2: [4, 5], 3: [6, 7], 7: [8, 9]} print(f"Binary tree: {binary_tree}") binary_tree_mirror_dictionary = binary_tree_mirror(binary_tree, 5) print(f"Binary tree mirror: {binary_tree_mirror_dictionary}") ================================================ FILE: data_structures/binary_tree/binary_tree_node_sum.py ================================================ """ Sum of all nodes in a binary tree. Python implementation: O(n) time complexity - Recurses through :meth:`depth_first_search` with each element. O(n) space complexity - At any point in time maximum number of stack frames that could be in memory is `n` """ from __future__ import annotations from collections.abc import Iterator class Node: """ A Node has a value variable and pointers to Nodes to its left and right. """ def __init__(self, value: int) -> None: self.value = value self.left: Node | None = None self.right: Node | None = None class BinaryTreeNodeSum: r""" The below tree looks like this 10 / \ 5 -3 / / \ 12 8 0 >>> tree = Node(10) >>> sum(BinaryTreeNodeSum(tree)) 10 >>> tree.left = Node(5) >>> sum(BinaryTreeNodeSum(tree)) 15 >>> tree.right = Node(-3) >>> sum(BinaryTreeNodeSum(tree)) 12 >>> tree.left.left = Node(12) >>> sum(BinaryTreeNodeSum(tree)) 24 >>> tree.right.left = Node(8) >>> tree.right.right = Node(0) >>> sum(BinaryTreeNodeSum(tree)) 32 """ def __init__(self, tree: Node) -> None: self.tree = tree def depth_first_search(self, node: Node | None) -> int: if node is None: return 0 return node.value + ( self.depth_first_search(node.left) + self.depth_first_search(node.right) ) def __iter__(self) -> Iterator[int]: yield self.depth_first_search(self.tree) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/binary_tree/binary_tree_path_sum.py ================================================ """ Given the root of a binary tree and an integer target, find the number of paths where the sum of the values along the path equals target. Leetcode reference: https://leetcode.com/problems/path-sum-iii/ """ from __future__ import annotations class Node: """ A Node has value variable and pointers to Nodes to its left and right. """ def __init__(self, value: int) -> None: self.value = value self.left: Node | None = None self.right: Node | None = None class BinaryTreePathSum: r""" The below tree looks like this 10 / \ 5 -3 / \ \ 3 2 11 / \ \ 3 -2 1 >>> tree = Node(10) >>> tree.left = Node(5) >>> tree.right = Node(-3) >>> tree.left.left = Node(3) >>> tree.left.right = Node(2) >>> tree.right.right = Node(11) >>> tree.left.left.left = Node(3) >>> tree.left.left.right = Node(-2) >>> tree.left.right.right = Node(1) >>> BinaryTreePathSum().path_sum(tree, 8) 3 >>> BinaryTreePathSum().path_sum(tree, 7) 2 >>> tree.right.right = Node(10) >>> BinaryTreePathSum().path_sum(tree, 8) 2 >>> BinaryTreePathSum().path_sum(None, 0) 0 >>> BinaryTreePathSum().path_sum(tree, 0) 0 The second tree looks like this 0 / \ 5 5 >>> tree2 = Node(0) >>> tree2.left = Node(5) >>> tree2.right = Node(5) >>> BinaryTreePathSum().path_sum(tree2, 5) 4 >>> BinaryTreePathSum().path_sum(tree2, -1) 0 >>> BinaryTreePathSum().path_sum(tree2, 0) 1 """ target: int def __init__(self) -> None: self.paths = 0 def depth_first_search(self, node: Node | None, path_sum: int) -> None: if node is None: return if path_sum == self.target: self.paths += 1 if node.left: self.depth_first_search(node.left, path_sum + node.left.value) if node.right: self.depth_first_search(node.right, path_sum + node.right.value) def path_sum(self, node: Node | None, target: int | None = None) -> int: if node is None: return 0 if target is not None: self.target = target self.depth_first_search(node, node.value) self.path_sum(node.left) self.path_sum(node.right) return self.paths if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/binary_tree/binary_tree_traversals.py ================================================ from __future__ import annotations from collections import deque from collections.abc import Generator from dataclasses import dataclass # https://en.wikipedia.org/wiki/Tree_traversal @dataclass class Node: data: int left: Node | None = None right: Node | None = None def make_tree() -> Node | None: r""" The below tree 1 / \ 2 3 / \ 4 5 """ tree = Node(1) tree.left = Node(2) tree.right = Node(3) tree.left.left = Node(4) tree.left.right = Node(5) return tree def preorder(root: Node | None) -> Generator[int]: """ Pre-order traversal visits root node, left subtree, right subtree. >>> list(preorder(make_tree())) [1, 2, 4, 5, 3] """ if not root: return yield root.data yield from preorder(root.left) yield from preorder(root.right) def postorder(root: Node | None) -> Generator[int]: """ Post-order traversal visits left subtree, right subtree, root node. >>> list(postorder(make_tree())) [4, 5, 2, 3, 1] """ if not root: return yield from postorder(root.left) yield from postorder(root.right) yield root.data def inorder(root: Node | None) -> Generator[int]: """ In-order traversal visits left subtree, root node, right subtree. >>> list(inorder(make_tree())) [4, 2, 5, 1, 3] """ if not root: return yield from inorder(root.left) yield root.data yield from inorder(root.right) def reverse_inorder(root: Node | None) -> Generator[int]: """ Reverse in-order traversal visits right subtree, root node, left subtree. >>> list(reverse_inorder(make_tree())) [3, 1, 5, 2, 4] """ if not root: return yield from reverse_inorder(root.right) yield root.data yield from reverse_inorder(root.left) def height(root: Node | None) -> int: """ Recursive function for calculating the height of the binary tree. >>> height(None) 0 >>> height(make_tree()) 3 """ return (max(height(root.left), height(root.right)) + 1) if root else 0 def level_order(root: Node | None) -> Generator[int]: """ Returns a list of nodes value from a whole binary tree in Level Order Traverse. Level Order traverse: Visit nodes of the tree level-by-level. >>> list(level_order(make_tree())) [1, 2, 3, 4, 5] """ if root is None: return process_queue = deque([root]) while process_queue: node = process_queue.popleft() yield node.data if node.left: process_queue.append(node.left) if node.right: process_queue.append(node.right) def get_nodes_from_left_to_right(root: Node | None, level: int) -> Generator[int]: """ Returns a list of nodes value from a particular level: Left to right direction of the binary tree. >>> list(get_nodes_from_left_to_right(make_tree(), 1)) [1] >>> list(get_nodes_from_left_to_right(make_tree(), 2)) [2, 3] """ def populate_output(root: Node | None, level: int) -> Generator[int]: if not root: return if level == 1: yield root.data elif level > 1: yield from populate_output(root.left, level - 1) yield from populate_output(root.right, level - 1) yield from populate_output(root, level) def get_nodes_from_right_to_left(root: Node | None, level: int) -> Generator[int]: """ Returns a list of nodes value from a particular level: Right to left direction of the binary tree. >>> list(get_nodes_from_right_to_left(make_tree(), 1)) [1] >>> list(get_nodes_from_right_to_left(make_tree(), 2)) [3, 2] """ def populate_output(root: Node | None, level: int) -> Generator[int]: if not root: return if level == 1: yield root.data elif level > 1: yield from populate_output(root.right, level - 1) yield from populate_output(root.left, level - 1) yield from populate_output(root, level) def zigzag(root: Node | None) -> Generator[int]: """ ZigZag traverse: Returns a list of nodes value from left to right and right to left, alternatively. >>> list(zigzag(make_tree())) [1, 3, 2, 4, 5] """ if root is None: return flag = 0 height_tree = height(root) for h in range(1, height_tree + 1): if not flag: yield from get_nodes_from_left_to_right(root, h) flag = 1 else: yield from get_nodes_from_right_to_left(root, h) flag = 0 def main() -> None: # Main function for testing. # Create binary tree. root = make_tree() # All Traversals of the binary are as follows: print(f"In-order Traversal: {list(inorder(root))}") print(f"Reverse In-order Traversal: {list(reverse_inorder(root))}") print(f"Pre-order Traversal: {list(preorder(root))}") print(f"Post-order Traversal: {list(postorder(root))}", "\n") print(f"Height of Tree: {height(root)}", "\n") print("Complete Level Order Traversal: ") print(f"{list(level_order(root))} \n") print("Level-wise order Traversal: ") for level in range(1, height(root) + 1): print(f"Level {level}:", list(get_nodes_from_left_to_right(root, level=level))) print("\nZigZag order Traversal: ") print(f"{list(zigzag(root))}") if __name__ == "__main__": import doctest doctest.testmod() main() ================================================ FILE: data_structures/binary_tree/diameter_of_binary_tree.py ================================================ """ The diameter/width of a tree is defined as the number of nodes on the longest path between two end nodes. """ from __future__ import annotations from dataclasses import dataclass @dataclass class Node: data: int left: Node | None = None right: Node | None = None def depth(self) -> int: """ >>> root = Node(1) >>> root.depth() 1 >>> root.left = Node(2) >>> root.depth() 2 >>> root.left.depth() 1 >>> root.right = Node(3) >>> root.depth() 2 """ left_depth = self.left.depth() if self.left else 0 right_depth = self.right.depth() if self.right else 0 return max(left_depth, right_depth) + 1 def diameter(self) -> int: """ >>> root = Node(1) >>> root.diameter() 1 >>> root.left = Node(2) >>> root.diameter() 2 >>> root.left.diameter() 1 >>> root.right = Node(3) >>> root.diameter() 3 """ left_depth = self.left.depth() if self.left else 0 right_depth = self.right.depth() if self.right else 0 return left_depth + right_depth + 1 if __name__ == "__main__": from doctest import testmod testmod() root = Node(1) root.left = Node(2) root.right = Node(3) root.left.left = Node(4) root.left.right = Node(5) r""" Constructed binary tree is 1 / \ 2 3 / \ 4 5 """ print(f"{root.diameter() = }") # 4 print(f"{root.left.diameter() = }") # 3 print(f"{root.right.diameter() = }") # 1 ================================================ FILE: data_structures/binary_tree/diff_views_of_binary_tree.py ================================================ r""" Problem: Given root of a binary tree, return the: 1. binary-tree-right-side-view 2. binary-tree-left-side-view 3. binary-tree-top-side-view 4. binary-tree-bottom-side-view """ from __future__ import annotations from collections import defaultdict from dataclasses import dataclass @dataclass class TreeNode: val: int left: TreeNode | None = None right: TreeNode | None = None def make_tree() -> TreeNode: """ >>> make_tree().val 3 """ return TreeNode(3, TreeNode(9), TreeNode(20, TreeNode(15), TreeNode(7))) def binary_tree_right_side_view(root: TreeNode) -> list[int]: r""" Function returns the right side view of binary tree. 3 <- 3 / \ 9 20 <- 20 / \ 15 7 <- 7 >>> binary_tree_right_side_view(make_tree()) [3, 20, 7] >>> binary_tree_right_side_view(None) [] """ def depth_first_search( root: TreeNode | None, depth: int, right_view: list[int] ) -> None: """ A depth first search preorder traversal to append the values at right side of tree. """ if not root: return if depth == len(right_view): right_view.append(root.val) depth_first_search(root.right, depth + 1, right_view) depth_first_search(root.left, depth + 1, right_view) right_view: list = [] if not root: return right_view depth_first_search(root, 0, right_view) return right_view def binary_tree_left_side_view(root: TreeNode) -> list[int]: r""" Function returns the left side view of binary tree. 3 -> 3 / \ 9 -> 9 20 / \ 15 -> 15 7 >>> binary_tree_left_side_view(make_tree()) [3, 9, 15] >>> binary_tree_left_side_view(None) [] """ def depth_first_search( root: TreeNode | None, depth: int, left_view: list[int] ) -> None: """ A depth first search preorder traversal to append the values at left side of tree. """ if not root: return if depth == len(left_view): left_view.append(root.val) depth_first_search(root.left, depth + 1, left_view) depth_first_search(root.right, depth + 1, left_view) left_view: list = [] if not root: return left_view depth_first_search(root, 0, left_view) return left_view def binary_tree_top_side_view(root: TreeNode) -> list[int]: r""" Function returns the top side view of binary tree. 9 3 20 7 ⬇ ⬇ ⬇ ⬇ 3 / \ 9 20 / \ 15 7 >>> binary_tree_top_side_view(make_tree()) [9, 3, 20, 7] >>> binary_tree_top_side_view(None) [] """ def breadth_first_search(root: TreeNode, top_view: list[int]) -> None: """ A breadth first search traversal with defaultdict ds to append the values of tree from top view """ queue = [(root, 0)] lookup = defaultdict(list) while queue: first = queue.pop(0) node, hd = first lookup[hd].append(node.val) if node.left: queue.append((node.left, hd - 1)) if node.right: queue.append((node.right, hd + 1)) for pair in sorted(lookup.items(), key=lambda each: each[0]): top_view.append(pair[1][0]) top_view: list = [] if not root: return top_view breadth_first_search(root, top_view) return top_view def binary_tree_bottom_side_view(root: TreeNode) -> list[int]: r""" Function returns the bottom side view of binary tree 3 / \ 9 20 / \ 15 7 ↑ ↑ ↑ ↑ 9 15 20 7 >>> binary_tree_bottom_side_view(make_tree()) [9, 15, 20, 7] >>> binary_tree_bottom_side_view(None) [] """ from collections import defaultdict def breadth_first_search(root: TreeNode, bottom_view: list[int]) -> None: """ A breadth first search traversal with defaultdict ds to append the values of tree from bottom view """ queue = [(root, 0)] lookup = defaultdict(list) while queue: first = queue.pop(0) node, hd = first lookup[hd].append(node.val) if node.left: queue.append((node.left, hd - 1)) if node.right: queue.append((node.right, hd + 1)) for pair in sorted(lookup.items(), key=lambda each: each[0]): bottom_view.append(pair[1][-1]) bottom_view: list = [] if not root: return bottom_view breadth_first_search(root, bottom_view) return bottom_view if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/binary_tree/distribute_coins.py ================================================ """ Author : Alexander Pantyukhin Date : November 7, 2022 Task: You are given a tree root of a binary tree with n nodes, where each node has node.data coins. There are exactly n coins in whole tree. In one move, we may choose two adjacent nodes and move one coin from one node to another. A move may be from parent to child, or from child to parent. Return the minimum number of moves required to make every node have exactly one coin. Example 1: 3 / \ 0 0 Result: 2 Example 2: 0 / \ 3 0 Result 3 leetcode: https://leetcode.com/problems/distribute-coins-in-binary-tree/ Implementation notes: User depth-first search approach. Let n is the number of nodes in tree Runtime: O(n) Space: O(1) """ from __future__ import annotations from dataclasses import dataclass from typing import NamedTuple @dataclass class TreeNode: data: int left: TreeNode | None = None right: TreeNode | None = None class CoinsDistribResult(NamedTuple): moves: int excess: int def distribute_coins(root: TreeNode | None) -> int: """ >>> distribute_coins(TreeNode(3, TreeNode(0), TreeNode(0))) 2 >>> distribute_coins(TreeNode(0, TreeNode(3), TreeNode(0))) 3 >>> distribute_coins(TreeNode(0, TreeNode(0), TreeNode(3))) 3 >>> distribute_coins(None) 0 >>> distribute_coins(TreeNode(0, TreeNode(0), TreeNode(0))) Traceback (most recent call last): ... ValueError: The nodes number should be same as the number of coins >>> distribute_coins(TreeNode(0, TreeNode(1), TreeNode(1))) Traceback (most recent call last): ... ValueError: The nodes number should be same as the number of coins """ if root is None: return 0 # Validation def count_nodes(node: TreeNode | None) -> int: """ >>> count_nodes(None) 0 """ if node is None: return 0 return count_nodes(node.left) + count_nodes(node.right) + 1 def count_coins(node: TreeNode | None) -> int: """ >>> count_coins(None) 0 """ if node is None: return 0 return count_coins(node.left) + count_coins(node.right) + node.data if count_nodes(root) != count_coins(root): raise ValueError("The nodes number should be same as the number of coins") # Main calculation def get_distrib(node: TreeNode | None) -> CoinsDistribResult: """ >>> get_distrib(None) namedtuple("CoinsDistribResult", "0 2") """ if node is None: return CoinsDistribResult(0, 1) left_distrib_moves, left_distrib_excess = get_distrib(node.left) right_distrib_moves, right_distrib_excess = get_distrib(node.right) coins_to_left = 1 - left_distrib_excess coins_to_right = 1 - right_distrib_excess result_moves = ( left_distrib_moves + right_distrib_moves + abs(coins_to_left) + abs(coins_to_right) ) result_excess = node.data - coins_to_left - coins_to_right return CoinsDistribResult(result_moves, result_excess) return get_distrib(root)[0] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/binary_tree/fenwick_tree.py ================================================ from copy import deepcopy class FenwickTree: """ Fenwick Tree More info: https://en.wikipedia.org/wiki/Fenwick_tree """ def __init__(self, arr: list[int] | None = None, size: int | None = None) -> None: """ Constructor for the Fenwick tree Parameters: arr (list): list of elements to initialize the tree with (optional) size (int): size of the Fenwick tree (if arr is None) """ if arr is None and size is not None: self.size = size self.tree = [0] * size elif arr is not None: self.init(arr) else: raise ValueError("Either arr or size must be specified") def init(self, arr: list[int]) -> None: """ Initialize the Fenwick tree with arr in O(N) Parameters: arr (list): list of elements to initialize the tree with Returns: None >>> a = [1, 2, 3, 4, 5] >>> f1 = FenwickTree(a) >>> f2 = FenwickTree(size=len(a)) >>> for index, value in enumerate(a): ... f2.add(index, value) >>> f1.tree == f2.tree True """ self.size = len(arr) self.tree = deepcopy(arr) for i in range(1, self.size): j = self.next_(i) if j < self.size: self.tree[j] += self.tree[i] def get_array(self) -> list[int]: """ Get the Normal Array of the Fenwick tree in O(N) Returns: list: Normal Array of the Fenwick tree >>> a = [i for i in range(128)] >>> f = FenwickTree(a) >>> f.get_array() == a True """ arr = self.tree[:] for i in range(self.size - 1, 0, -1): j = self.next_(i) if j < self.size: arr[j] -= arr[i] return arr @staticmethod def next_(index: int) -> int: return index + (index & (-index)) @staticmethod def prev(index: int) -> int: return index - (index & (-index)) def add(self, index: int, value: int) -> None: """ Add a value to index in O(lg N) Parameters: index (int): index to add value to value (int): value to add to index Returns: None >>> f = FenwickTree([1, 2, 3, 4, 5]) >>> f.add(0, 1) >>> f.add(1, 2) >>> f.add(2, 3) >>> f.add(3, 4) >>> f.add(4, 5) >>> f.get_array() [2, 4, 6, 8, 10] """ if index == 0: self.tree[0] += value return while index < self.size: self.tree[index] += value index = self.next_(index) def update(self, index: int, value: int) -> None: """ Set the value of index in O(lg N) Parameters: index (int): index to set value to value (int): value to set in index Returns: None >>> f = FenwickTree([5, 4, 3, 2, 1]) >>> f.update(0, 1) >>> f.update(1, 2) >>> f.update(2, 3) >>> f.update(3, 4) >>> f.update(4, 5) >>> f.get_array() [1, 2, 3, 4, 5] """ self.add(index, value - self.get(index)) def prefix(self, right: int) -> int: """ Prefix sum of all elements in [0, right) in O(lg N) Parameters: right (int): right bound of the query (exclusive) Returns: int: sum of all elements in [0, right) >>> a = [i for i in range(128)] >>> f = FenwickTree(a) >>> res = True >>> for i in range(len(a)): ... res = res and f.prefix(i) == sum(a[:i]) >>> res True """ if right == 0: return 0 result = self.tree[0] right -= 1 # make right inclusive while right > 0: result += self.tree[right] right = self.prev(right) return result def query(self, left: int, right: int) -> int: """ Query the sum of all elements in [left, right) in O(lg N) Parameters: left (int): left bound of the query (inclusive) right (int): right bound of the query (exclusive) Returns: int: sum of all elements in [left, right) >>> a = [i for i in range(128)] >>> f = FenwickTree(a) >>> res = True >>> for i in range(len(a)): ... for j in range(i + 1, len(a)): ... res = res and f.query(i, j) == sum(a[i:j]) >>> res True """ return self.prefix(right) - self.prefix(left) def get(self, index: int) -> int: """ Get value at index in O(lg N) Parameters: index (int): index to get the value Returns: int: Value of element at index >>> a = [i for i in range(128)] >>> f = FenwickTree(a) >>> res = True >>> for i in range(len(a)): ... res = res and f.get(i) == a[i] >>> res True """ return self.query(index, index + 1) def rank_query(self, value: int) -> int: """ Find the largest index with prefix(i) <= value in O(lg N) NOTE: Requires that all values are non-negative! Parameters: value (int): value to find the largest index of Returns: -1: if value is smaller than all elements in prefix sum int: largest index with prefix(i) <= value >>> f = FenwickTree([1, 2, 0, 3, 0, 5]) >>> f.rank_query(0) -1 >>> f.rank_query(2) 0 >>> f.rank_query(1) 0 >>> f.rank_query(3) 2 >>> f.rank_query(5) 2 >>> f.rank_query(6) 4 >>> f.rank_query(11) 5 """ value -= self.tree[0] if value < 0: return -1 j = 1 # Largest power of 2 <= size while j * 2 < self.size: j *= 2 i = 0 while j > 0: if i + j < self.size and self.tree[i + j] <= value: value -= self.tree[i + j] i += j j //= 2 return i if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/binary_tree/flatten_binarytree_to_linkedlist.py ================================================ """ Binary Tree Flattening Algorithm This code defines an algorithm to flatten a binary tree into a linked list represented using the right pointers of the tree nodes. It uses in-place flattening and demonstrates the flattening process along with a display function to visualize the flattened linked list. https://www.geeksforgeeks.org/flatten-a-binary-tree-into-linked-list Author: Arunkumar A Date: 04/09/2023 """ from __future__ import annotations class TreeNode: """ A TreeNode has data variable and pointers to TreeNode objects for its left and right children. """ def __init__(self, data: int) -> None: self.data = data self.left: TreeNode | None = None self.right: TreeNode | None = None def build_tree() -> TreeNode: """ Build and return a sample binary tree. Returns: TreeNode: The root of the binary tree. Examples: >>> root = build_tree() >>> root.data 1 >>> root.left.data 2 >>> root.right.data 5 >>> root.left.left.data 3 >>> root.left.right.data 4 >>> root.right.right.data 6 """ root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(5) root.left.left = TreeNode(3) root.left.right = TreeNode(4) root.right.right = TreeNode(6) return root def flatten(root: TreeNode | None) -> None: """ Flatten a binary tree into a linked list in-place, where the linked list is represented using the right pointers of the tree nodes. Args: root (TreeNode): The root of the binary tree to be flattened. Examples: >>> root = TreeNode(1) >>> root.left = TreeNode(2) >>> root.right = TreeNode(5) >>> root.left.left = TreeNode(3) >>> root.left.right = TreeNode(4) >>> root.right.right = TreeNode(6) >>> flatten(root) >>> root.data 1 >>> root.right.right is None False >>> root.right.right = TreeNode(3) >>> root.right.right.right is None True """ if not root: return # Flatten the left subtree flatten(root.left) # Save the right subtree right_subtree = root.right # Make the left subtree the new right subtree root.right = root.left root.left = None # Find the end of the new right subtree current = root while current.right: current = current.right # Append the original right subtree to the end current.right = right_subtree # Flatten the updated right subtree flatten(right_subtree) def display_linked_list(root: TreeNode | None) -> None: """ Display the flattened linked list. Args: root (TreeNode | None): The root of the flattened linked list. Examples: >>> root = TreeNode(1) >>> root.right = TreeNode(2) >>> root.right.right = TreeNode(3) >>> display_linked_list(root) 1 2 3 >>> root = None >>> display_linked_list(root) """ current = root while current: if current.right is None: print(current.data, end="") break print(current.data, end=" ") current = current.right if __name__ == "__main__": print("Flattened Linked List:") root = build_tree() flatten(root) display_linked_list(root) ================================================ FILE: data_structures/binary_tree/floor_and_ceiling.py ================================================ """ In a binary search tree (BST): * The floor of key 'k' is the maximum value that is smaller than or equal to 'k'. * The ceiling of key 'k' is the minimum value that is greater than or equal to 'k'. Reference: https://bit.ly/46uB0a2 Author : Arunkumar Date : 14th October 2023 """ from __future__ import annotations from collections.abc import Iterator from dataclasses import dataclass @dataclass class Node: key: int left: Node | None = None right: Node | None = None def __iter__(self) -> Iterator[int]: if self.left: yield from self.left yield self.key if self.right: yield from self.right def __len__(self) -> int: return sum(1 for _ in self) def floor_ceiling(root: Node | None, key: int) -> tuple[int | None, int | None]: """ Find the floor and ceiling values for a given key in a Binary Search Tree (BST). Args: root: The root of the binary search tree. key: The key for which to find the floor and ceiling. Returns: A tuple containing the floor and ceiling values, respectively. Examples: >>> root = Node(10) >>> root.left = Node(5) >>> root.right = Node(20) >>> root.left.left = Node(3) >>> root.left.right = Node(7) >>> root.right.left = Node(15) >>> root.right.right = Node(25) >>> tuple(root) (3, 5, 7, 10, 15, 20, 25) >>> floor_ceiling(root, 8) (7, 10) >>> floor_ceiling(root, 14) (10, 15) >>> floor_ceiling(root, -1) (None, 3) >>> floor_ceiling(root, 30) (25, None) """ floor_val = None ceiling_val = None while root: if root.key == key: floor_val = root.key ceiling_val = root.key break if key < root.key: ceiling_val = root.key root = root.left else: floor_val = root.key root = root.right return floor_val, ceiling_val if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/binary_tree/inorder_tree_traversal_2022.py ================================================ """ Illustrate how to implement inorder traversal in binary search tree. Author: Gurneet Singh https://www.geeksforgeeks.org/tree-traversals-inorder-preorder-and-postorder/ """ class BinaryTreeNode: """Defining the structure of BinaryTreeNode""" def __init__(self, data: int) -> None: self.data = data self.left_child: BinaryTreeNode | None = None self.right_child: BinaryTreeNode | None = None def insert(node: BinaryTreeNode | None, new_value: int) -> BinaryTreeNode | None: """ If the binary search tree is empty, make a new node and declare it as root. >>> node_a = BinaryTreeNode(12345) >>> node_b = insert(node_a, 67890) >>> node_a.left_child == node_b.left_child True >>> node_a.right_child == node_b.right_child True >>> node_a.data == node_b.data True """ if node is None: node = BinaryTreeNode(new_value) return node # binary search tree is not empty, # so we will insert it into the tree # if new_value is less than value of data in node, # add it to left subtree and proceed recursively if new_value < node.data: node.left_child = insert(node.left_child, new_value) else: # if new_value is greater than value of data in node, # add it to right subtree and proceed recursively node.right_child = insert(node.right_child, new_value) return node def inorder(node: None | BinaryTreeNode) -> list[int]: # if node is None,return """ >>> inorder(make_tree()) [6, 10, 14, 15, 20, 25, 60] """ if node: inorder_array = inorder(node.left_child) inorder_array = [*inorder_array, node.data] inorder_array = inorder_array + inorder(node.right_child) else: inorder_array = [] return inorder_array def make_tree() -> BinaryTreeNode | None: root = insert(None, 15) insert(root, 10) insert(root, 25) insert(root, 6) insert(root, 14) insert(root, 20) insert(root, 60) return root def main() -> None: # main function root = make_tree() print("Printing values of binary search tree in Inorder Traversal.") inorder(root) if __name__ == "__main__": import doctest doctest.testmod() main() ================================================ FILE: data_structures/binary_tree/is_sorted.py ================================================ """ Given the root of a binary tree, determine if it is a valid binary search tree (BST). A valid binary search tree is defined as follows: - The left subtree of a node contains only nodes with keys less than the node's key. - The right subtree of a node contains only nodes with keys greater than the node's key. - Both the left and right subtrees must also be binary search trees. In effect, a binary tree is a valid BST if its nodes are sorted in ascending order. leetcode: https://leetcode.com/problems/validate-binary-search-tree/ If n is the number of nodes in the tree then: Runtime: O(n) Space: O(1) """ from __future__ import annotations from collections.abc import Iterator from dataclasses import dataclass @dataclass class Node: data: float left: Node | None = None right: Node | None = None def __iter__(self) -> Iterator[float]: """ >>> root = Node(data=2.1) >>> list(root) [2.1] >>> root.left=Node(data=2.0) >>> list(root) [2.0, 2.1] >>> root.right=Node(data=2.2) >>> list(root) [2.0, 2.1, 2.2] """ if self.left: yield from self.left yield self.data if self.right: yield from self.right @property def is_sorted(self) -> bool: """ >>> Node(data='abc').is_sorted True >>> Node(data=2, ... left=Node(data=1.999), ... right=Node(data=3)).is_sorted True >>> Node(data=0, ... left=Node(data=0), ... right=Node(data=0)).is_sorted True >>> Node(data=0, ... left=Node(data=-11), ... right=Node(data=3)).is_sorted True >>> Node(data=5, ... left=Node(data=1), ... right=Node(data=4, left=Node(data=3))).is_sorted False >>> Node(data='a', ... left=Node(data=1), ... right=Node(data=4, left=Node(data=3))).is_sorted Traceback (most recent call last): ... TypeError: '<' not supported between instances of 'str' and 'int' >>> Node(data=2, ... left=Node([]), ... right=Node(data=4, left=Node(data=3))).is_sorted Traceback (most recent call last): ... TypeError: '<' not supported between instances of 'int' and 'list' """ if self.left and (self.data < self.left.data or not self.left.is_sorted): return False return not ( self.right and (self.data > self.right.data or not self.right.is_sorted) ) if __name__ == "__main__": import doctest doctest.testmod() tree = Node(data=2.1, left=Node(data=2.0), right=Node(data=2.2)) print(f"Tree {list(tree)} is sorted: {tree.is_sorted = }.") assert tree.right tree.right.data = 2.0 print(f"Tree {list(tree)} is sorted: {tree.is_sorted = }.") tree.right.data = 2.1 print(f"Tree {list(tree)} is sorted: {tree.is_sorted = }.") ================================================ FILE: data_structures/binary_tree/is_sum_tree.py ================================================ """ Is a binary tree a sum tree where the value of every non-leaf node is equal to the sum of the values of its left and right subtrees? https://www.geeksforgeeks.org/check-if-a-given-binary-tree-is-sumtree """ from __future__ import annotations from collections.abc import Iterator from dataclasses import dataclass @dataclass class Node: data: int left: Node | None = None right: Node | None = None def __iter__(self) -> Iterator[int]: """ >>> root = Node(2) >>> list(root) [2] >>> root.left = Node(1) >>> tuple(root) (1, 2) """ if self.left: yield from self.left yield self.data if self.right: yield from self.right def __len__(self) -> int: """ >>> root = Node(2) >>> len(root) 1 >>> root.left = Node(1) >>> len(root) 2 """ return sum(1 for _ in self) @property def is_sum_node(self) -> bool: """ >>> root = Node(3) >>> root.is_sum_node True >>> root.left = Node(1) >>> root.is_sum_node False >>> root.right = Node(2) >>> root.is_sum_node True """ if not self.left and not self.right: return True # leaf nodes are considered sum nodes left_sum = sum(self.left) if self.left else 0 right_sum = sum(self.right) if self.right else 0 return all( ( self.data == left_sum + right_sum, self.left.is_sum_node if self.left else True, self.right.is_sum_node if self.right else True, ) ) @dataclass class BinaryTree: root: Node def __iter__(self) -> Iterator[int]: """ >>> list(BinaryTree.build_a_tree()) [1, 2, 7, 11, 15, 29, 35, 40] """ return iter(self.root) def __len__(self) -> int: """ >>> len(BinaryTree.build_a_tree()) 8 """ return len(self.root) def __str__(self) -> str: """ Returns a string representation of the inorder traversal of the binary tree. >>> str(list(BinaryTree.build_a_tree())) '[1, 2, 7, 11, 15, 29, 35, 40]' """ return str(list(self)) @property def is_sum_tree(self) -> bool: """ >>> BinaryTree.build_a_tree().is_sum_tree False >>> BinaryTree.build_a_sum_tree().is_sum_tree True """ return self.root.is_sum_node @classmethod def build_a_tree(cls) -> BinaryTree: r""" Create a binary tree with the specified structure: 11 / \ 2 29 / \ / \ 1 7 15 40 \ 35 >>> list(BinaryTree.build_a_tree()) [1, 2, 7, 11, 15, 29, 35, 40] """ tree = BinaryTree(Node(11)) root = tree.root root.left = Node(2) root.right = Node(29) root.left.left = Node(1) root.left.right = Node(7) root.right.left = Node(15) root.right.right = Node(40) root.right.right.left = Node(35) return tree @classmethod def build_a_sum_tree(cls) -> BinaryTree: r""" Create a binary tree with the specified structure: 26 / \ 10 3 / \ \ 4 6 3 >>> list(BinaryTree.build_a_sum_tree()) [4, 10, 6, 26, 3, 3] """ tree = BinaryTree(Node(26)) root = tree.root root.left = Node(10) root.right = Node(3) root.left.left = Node(4) root.left.right = Node(6) root.right.right = Node(3) return tree if __name__ == "__main__": from doctest import testmod testmod() tree = BinaryTree.build_a_tree() print(f"{tree} has {len(tree)} nodes and {tree.is_sum_tree = }.") tree = BinaryTree.build_a_sum_tree() print(f"{tree} has {len(tree)} nodes and {tree.is_sum_tree = }.") ================================================ FILE: data_structures/binary_tree/lazy_segment_tree.py ================================================ from __future__ import annotations import math class SegmentTree: def __init__(self, size: int) -> None: self.size = size # approximate the overall size of segment tree with given value self.segment_tree = [0 for i in range(4 * size)] # create array to store lazy update self.lazy = [0 for i in range(4 * size)] self.flag = [0 for i in range(4 * size)] # flag for lazy update def left(self, idx: int) -> int: """ >>> segment_tree = SegmentTree(15) >>> segment_tree.left(1) 2 >>> segment_tree.left(2) 4 >>> segment_tree.left(12) 24 """ return idx * 2 def right(self, idx: int) -> int: """ >>> segment_tree = SegmentTree(15) >>> segment_tree.right(1) 3 >>> segment_tree.right(2) 5 >>> segment_tree.right(12) 25 """ return idx * 2 + 1 def build( self, idx: int, left_element: int, right_element: int, a: list[int] ) -> None: if left_element == right_element: self.segment_tree[idx] = a[left_element - 1] else: mid = (left_element + right_element) // 2 self.build(self.left(idx), left_element, mid, a) self.build(self.right(idx), mid + 1, right_element, a) self.segment_tree[idx] = max( self.segment_tree[self.left(idx)], self.segment_tree[self.right(idx)] ) def update( self, idx: int, left_element: int, right_element: int, a: int, b: int, val: int ) -> bool: """ update with O(lg n) (Normal segment tree without lazy update will take O(nlg n) for each update) update(1, 1, size, a, b, v) for update val v to [a,b] """ if self.flag[idx] is True: self.segment_tree[idx] = self.lazy[idx] self.flag[idx] = False if left_element != right_element: self.lazy[self.left(idx)] = self.lazy[idx] self.lazy[self.right(idx)] = self.lazy[idx] self.flag[self.left(idx)] = True self.flag[self.right(idx)] = True if right_element < a or left_element > b: return True if left_element >= a and right_element <= b: self.segment_tree[idx] = val if left_element != right_element: self.lazy[self.left(idx)] = val self.lazy[self.right(idx)] = val self.flag[self.left(idx)] = True self.flag[self.right(idx)] = True return True mid = (left_element + right_element) // 2 self.update(self.left(idx), left_element, mid, a, b, val) self.update(self.right(idx), mid + 1, right_element, a, b, val) self.segment_tree[idx] = max( self.segment_tree[self.left(idx)], self.segment_tree[self.right(idx)] ) return True # query with O(lg n) def query( self, idx: int, left_element: int, right_element: int, a: int, b: int ) -> int | float: """ query(1, 1, size, a, b) for query max of [a,b] >>> A = [1, 2, -4, 7, 3, -5, 6, 11, -20, 9, 14, 15, 5, 2, -8] >>> segment_tree = SegmentTree(15) >>> segment_tree.build(1, 1, 15, A) >>> segment_tree.query(1, 1, 15, 4, 6) 7 >>> segment_tree.query(1, 1, 15, 7, 11) 14 >>> segment_tree.query(1, 1, 15, 7, 12) 15 """ if self.flag[idx] is True: self.segment_tree[idx] = self.lazy[idx] self.flag[idx] = False if left_element != right_element: self.lazy[self.left(idx)] = self.lazy[idx] self.lazy[self.right(idx)] = self.lazy[idx] self.flag[self.left(idx)] = True self.flag[self.right(idx)] = True if right_element < a or left_element > b: return -math.inf if left_element >= a and right_element <= b: return self.segment_tree[idx] mid = (left_element + right_element) // 2 q1 = self.query(self.left(idx), left_element, mid, a, b) q2 = self.query(self.right(idx), mid + 1, right_element, a, b) return max(q1, q2) def __str__(self) -> str: return str([self.query(1, 1, self.size, i, i) for i in range(1, self.size + 1)]) if __name__ == "__main__": A = [1, 2, -4, 7, 3, -5, 6, 11, -20, 9, 14, 15, 5, 2, -8] size = 15 segt = SegmentTree(size) segt.build(1, 1, size, A) print(segt.query(1, 1, size, 4, 6)) print(segt.query(1, 1, size, 7, 11)) print(segt.query(1, 1, size, 7, 12)) segt.update(1, 1, size, 1, 3, 111) print(segt.query(1, 1, size, 1, 15)) segt.update(1, 1, size, 7, 8, 235) print(segt) ================================================ FILE: data_structures/binary_tree/lowest_common_ancestor.py ================================================ # https://en.wikipedia.org/wiki/Lowest_common_ancestor # https://en.wikipedia.org/wiki/Breadth-first_search from __future__ import annotations from queue import Queue def swap(a: int, b: int) -> tuple[int, int]: """ Return a tuple (b, a) when given two integers a and b >>> swap(2,3) (3, 2) >>> swap(3,4) (4, 3) >>> swap(67, 12) (12, 67) >>> swap(3,-4) (-4, 3) """ a ^= b b ^= a a ^= b return a, b def create_sparse(max_node: int, parent: list[list[int]]) -> list[list[int]]: """ creating sparse table which saves each nodes 2^i-th parent >>> max_node = 6 >>> parent = [[0, 0, 1, 1, 2, 2, 3]] + [[0] * 7 for _ in range(19)] >>> parent = create_sparse(max_node=max_node, parent=parent) >>> parent[0] [0, 0, 1, 1, 2, 2, 3] >>> parent[1] [0, 0, 0, 0, 1, 1, 1] >>> parent[2] [0, 0, 0, 0, 0, 0, 0] >>> max_node = 1 >>> parent = [[0, 0]] + [[0] * 2 for _ in range(19)] >>> parent = create_sparse(max_node=max_node, parent=parent) >>> parent[0] [0, 0] >>> parent[1] [0, 0] """ j = 1 while (1 << j) < max_node: for i in range(1, max_node + 1): parent[j][i] = parent[j - 1][parent[j - 1][i]] j += 1 return parent # returns lca of node u,v def lowest_common_ancestor( u: int, v: int, level: list[int], parent: list[list[int]] ) -> int: """ Return the lowest common ancestor between u and v >>> level = [-1, 0, 1, 1, 2, 2, 2] >>> parent = [[0, 0, 1, 1, 2, 2, 3],[0, 0, 0, 0, 1, 1, 1]] + \ [[0] * 7 for _ in range(17)] >>> lowest_common_ancestor(u=4, v=5, level=level, parent=parent) 2 >>> lowest_common_ancestor(u=4, v=6, level=level, parent=parent) 1 >>> lowest_common_ancestor(u=2, v=3, level=level, parent=parent) 1 >>> lowest_common_ancestor(u=6, v=6, level=level, parent=parent) 6 """ # u must be deeper in the tree than v if level[u] < level[v]: u, v = swap(u, v) # making depth of u same as depth of v for i in range(18, -1, -1): if level[u] - (1 << i) >= level[v]: u = parent[i][u] # at the same depth if u==v that mean lca is found if u == v: return u # moving both nodes upwards till lca in found for i in range(18, -1, -1): if parent[i][u] not in [0, parent[i][v]]: u, v = parent[i][u], parent[i][v] # returning longest common ancestor of u,v return parent[0][u] # runs a breadth first search from root node of the tree def breadth_first_search( level: list[int], parent: list[list[int]], max_node: int, graph: dict[int, list[int]], root: int = 1, ) -> tuple[list[int], list[list[int]]]: """ sets every nodes direct parent parent of root node is set to 0 calculates depth of each node from root node >>> level = [-1] * 7 >>> parent = [[0] * 7 for _ in range(20)] >>> graph = {1: [2, 3], 2: [4, 5], 3: [6], 4: [], 5: [], 6: []} >>> level, parent = breadth_first_search( ... level=level, parent=parent, max_node=6, graph=graph, root=1) >>> level [-1, 0, 1, 1, 2, 2, 2] >>> parent[0] [0, 0, 1, 1, 2, 2, 3] >>> level = [-1] * 2 >>> parent = [[0] * 2 for _ in range(20)] >>> graph = {1: []} >>> level, parent = breadth_first_search( ... level=level, parent=parent, max_node=1, graph=graph, root=1) >>> level [-1, 0] >>> parent[0] [0, 0] """ level[root] = 0 q: Queue[int] = Queue(maxsize=max_node) q.put(root) while q.qsize() != 0: u = q.get() for v in graph[u]: if level[v] == -1: level[v] = level[u] + 1 q.put(v) parent[0][v] = u return level, parent def main() -> None: max_node = 13 # initializing with 0 parent = [[0 for _ in range(max_node + 10)] for _ in range(20)] # initializing with -1 which means every node is unvisited level = [-1 for _ in range(max_node + 10)] graph: dict[int, list[int]] = { 1: [2, 3, 4], 2: [5], 3: [6, 7], 4: [8], 5: [9, 10], 6: [11], 7: [], 8: [12, 13], 9: [], 10: [], 11: [], 12: [], 13: [], } level, parent = breadth_first_search(level, parent, max_node, graph, 1) parent = create_sparse(max_node, parent) print("LCA of node 1 and 3 is: ", lowest_common_ancestor(1, 3, level, parent)) print("LCA of node 5 and 6 is: ", lowest_common_ancestor(5, 6, level, parent)) print("LCA of node 7 and 11 is: ", lowest_common_ancestor(7, 11, level, parent)) print("LCA of node 6 and 7 is: ", lowest_common_ancestor(6, 7, level, parent)) print("LCA of node 4 and 12 is: ", lowest_common_ancestor(4, 12, level, parent)) print("LCA of node 8 and 8 is: ", lowest_common_ancestor(8, 8, level, parent)) if __name__ == "__main__": main() ================================================ FILE: data_structures/binary_tree/maximum_fenwick_tree.py ================================================ class MaxFenwickTree: """ Maximum Fenwick Tree More info: https://cp-algorithms.com/data_structures/fenwick.html --------- >>> ft = MaxFenwickTree(5) >>> ft.query(0, 5) 0 >>> ft.update(4, 100) >>> ft.query(0, 5) 100 >>> ft.update(4, 0) >>> ft.update(2, 20) >>> ft.query(0, 5) 20 >>> ft.update(4, 10) >>> ft.query(2, 5) 20 >>> ft.query(1, 5) 20 >>> ft.update(2, 0) >>> ft.query(0, 5) 10 >>> ft = MaxFenwickTree(10000) >>> ft.update(255, 30) >>> ft.query(0, 10000) 30 >>> ft = MaxFenwickTree(6) >>> ft.update(5, 1) >>> ft.query(5, 6) 1 >>> ft = MaxFenwickTree(6) >>> ft.update(0, 1000) >>> ft.query(0, 1) 1000 """ def __init__(self, size: int) -> None: """ Create empty Maximum Fenwick Tree with specified size Parameters: size: size of Array Returns: None """ self.size = size self.arr = [0] * size self.tree = [0] * size @staticmethod def get_next(index: int) -> int: """ Get next index in O(1) """ return index | (index + 1) @staticmethod def get_prev(index: int) -> int: """ Get previous index in O(1) """ return (index & (index + 1)) - 1 def update(self, index: int, value: int) -> None: """ Set index to value in O(lg^2 N) Parameters: index: index to update value: value to set Returns: None """ self.arr[index] = value while index < self.size: current_left_border = self.get_prev(index) + 1 if current_left_border == index: self.tree[index] = value else: self.tree[index] = max(value, current_left_border, index) index = self.get_next(index) def query(self, left: int, right: int) -> int: """ Answer the query of maximum range [l, r) in O(lg^2 N) Parameters: left: left index of query range (inclusive) right: right index of query range (exclusive) Returns: Maximum value of range [left, right) """ right -= 1 # Because of right is exclusive result = 0 while left <= right: current_left = self.get_prev(right) if left <= current_left: result = max(result, self.tree[right]) right = current_left else: result = max(result, self.arr[right]) right -= 1 return result if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/binary_tree/maximum_sum_bst.py ================================================ from __future__ import annotations import sys from dataclasses import dataclass INT_MIN = -sys.maxsize + 1 INT_MAX = sys.maxsize - 1 @dataclass class TreeNode: val: int = 0 left: TreeNode | None = None right: TreeNode | None = None def max_sum_bst(root: TreeNode | None) -> int: """ The solution traverses a binary tree to find the maximum sum of keys in any subtree that is a Binary Search Tree (BST). It uses recursion to validate BST properties and calculates sums, returning the highest sum found among all valid BST subtrees. >>> t1 = TreeNode(4) >>> t1.left = TreeNode(3) >>> t1.left.left = TreeNode(1) >>> t1.left.right = TreeNode(2) >>> print(max_sum_bst(t1)) 2 >>> t2 = TreeNode(-4) >>> t2.left = TreeNode(-2) >>> t2.right = TreeNode(-5) >>> print(max_sum_bst(t2)) 0 >>> t3 = TreeNode(1) >>> t3.left = TreeNode(4) >>> t3.left.left = TreeNode(2) >>> t3.left.right = TreeNode(4) >>> t3.right = TreeNode(3) >>> t3.right.left = TreeNode(2) >>> t3.right.right = TreeNode(5) >>> t3.right.right.left = TreeNode(4) >>> t3.right.right.right = TreeNode(6) >>> print(max_sum_bst(t3)) 20 """ ans: int = 0 def solver(node: TreeNode | None) -> tuple[bool, int, int, int]: """ Returns the maximum sum by making recursive calls >>> t1 = TreeNode(1) >>> print(solver(t1)) 1 """ nonlocal ans if not node: return True, INT_MAX, INT_MIN, 0 # Valid BST, min, max, sum is_left_valid, min_left, max_left, sum_left = solver(node.left) is_right_valid, min_right, max_right, sum_right = solver(node.right) if is_left_valid and is_right_valid and max_left < node.val < min_right: total_sum = sum_left + sum_right + node.val ans = max(ans, total_sum) return True, min(min_left, node.val), max(max_right, node.val), total_sum return False, -1, -1, -1 # Not a valid BST solver(root) return ans if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/binary_tree/merge_two_binary_trees.py ================================================ #!/usr/local/bin/python3 """ Problem Description: Given two binary tree, return the merged tree. The rule for merging is that if two nodes overlap, then put the value sum of both nodes to the new value of the merged node. Otherwise, the NOT null node will be used as the node of new tree. """ from __future__ import annotations class Node: """ A binary node has value variable and pointers to its left and right node. """ def __init__(self, value: int = 0) -> None: self.value = value self.left: Node | None = None self.right: Node | None = None def merge_two_binary_trees(tree1: Node | None, tree2: Node | None) -> Node | None: """ Returns root node of the merged tree. >>> tree1 = Node(5) >>> tree1.left = Node(6) >>> tree1.right = Node(7) >>> tree1.left.left = Node(2) >>> tree2 = Node(4) >>> tree2.left = Node(5) >>> tree2.right = Node(8) >>> tree2.left.right = Node(1) >>> tree2.right.right = Node(4) >>> merged_tree = merge_two_binary_trees(tree1, tree2) >>> print_preorder(merged_tree) 9 11 2 1 15 4 """ if tree1 is None: return tree2 if tree2 is None: return tree1 tree1.value = tree1.value + tree2.value tree1.left = merge_two_binary_trees(tree1.left, tree2.left) tree1.right = merge_two_binary_trees(tree1.right, tree2.right) return tree1 def print_preorder(root: Node | None) -> None: """ Print pre-order traversal of the tree. >>> root = Node(1) >>> root.left = Node(2) >>> root.right = Node(3) >>> print_preorder(root) 1 2 3 >>> print_preorder(root.right) 3 """ if root: print(root.value) print_preorder(root.left) print_preorder(root.right) if __name__ == "__main__": tree1 = Node(1) tree1.left = Node(2) tree1.right = Node(3) tree1.left.left = Node(4) tree2 = Node(2) tree2.left = Node(4) tree2.right = Node(6) tree2.left.right = Node(9) tree2.right.right = Node(5) print("Tree1 is: ") print_preorder(tree1) print("Tree2 is: ") print_preorder(tree2) merged_tree = merge_two_binary_trees(tree1, tree2) print("Merged Tree is: ") print_preorder(merged_tree) ================================================ FILE: data_structures/binary_tree/mirror_binary_tree.py ================================================ """ Given the root of a binary tree, mirror the tree, and return its root. Leetcode problem reference: https://leetcode.com/problems/mirror-binary-tree/ """ from __future__ import annotations from collections.abc import Iterator from dataclasses import dataclass @dataclass class Node: """ A Node has value variable and pointers to Nodes to its left and right. """ value: int left: Node | None = None right: Node | None = None def __iter__(self) -> Iterator[int]: if self.left: yield from self.left yield self.value if self.right: yield from self.right def __len__(self) -> int: return sum(1 for _ in self) def mirror(self) -> Node: """ Mirror the binary tree rooted at this node by swapping left and right children. >>> tree = Node(0) >>> list(tree) [0] >>> list(tree.mirror()) [0] >>> tree = Node(1, Node(0), Node(3, Node(2), Node(4, None, Node(5)))) >>> tuple(tree) (0, 1, 2, 3, 4, 5) >>> tuple(tree.mirror()) (5, 4, 3, 2, 1, 0) """ self.left, self.right = self.right, self.left if self.left: self.left.mirror() if self.right: self.right.mirror() return self def make_tree_seven() -> Node: r""" Return a binary tree with 7 nodes that looks like this: :: 1 / \ 2 3 / \ / \ 4 5 6 7 >>> tree_seven = make_tree_seven() >>> len(tree_seven) 7 >>> list(tree_seven) [4, 2, 5, 1, 6, 3, 7] """ tree = Node(1) tree.left = Node(2) tree.right = Node(3) tree.left.left = Node(4) tree.left.right = Node(5) tree.right.left = Node(6) tree.right.right = Node(7) return tree def make_tree_nine() -> Node: r""" Return a binary tree with 9 nodes that looks like this: :: 1 / \ 2 3 / \ \ 4 5 6 / \ \ 7 8 9 >>> tree_nine = make_tree_nine() >>> len(tree_nine) 9 >>> list(tree_nine) [7, 4, 8, 2, 5, 9, 1, 3, 6] """ tree = Node(1) tree.left = Node(2) tree.right = Node(3) tree.left.left = Node(4) tree.left.right = Node(5) tree.right.right = Node(6) tree.left.left.left = Node(7) tree.left.left.right = Node(8) tree.left.right.right = Node(9) return tree def main() -> None: r""" Mirror binary trees with the given root and returns the root >>> tree = make_tree_nine() >>> tuple(tree) (7, 4, 8, 2, 5, 9, 1, 3, 6) >>> tuple(tree.mirror()) (6, 3, 1, 9, 5, 2, 8, 4, 7) nine_tree:: 1 / \ 2 3 / \ \ 4 5 6 / \ \ 7 8 9 The mirrored tree looks like this:: 1 / \ 3 2 / / \ 6 5 4 / / \ 9 8 7 """ trees = {"zero": Node(0), "seven": make_tree_seven(), "nine": make_tree_nine()} for name, tree in trees.items(): print(f" The {name} tree: {tuple(tree)}") # (0,) # (4, 2, 5, 1, 6, 3, 7) # (7, 4, 8, 2, 5, 9, 1, 3, 6) print(f"Mirror of {name} tree: {tuple(tree.mirror())}") # (0,) # (7, 3, 6, 1, 5, 2, 4) # (6, 3, 1, 9, 5, 2, 8, 4, 7) if __name__ == "__main__": import doctest doctest.testmod() main() ================================================ FILE: data_structures/binary_tree/non_recursive_segment_tree.py ================================================ """ A non-recursive Segment Tree implementation with range query and single element update, works virtually with any list of the same type of elements with a "commutative" combiner. Explanation: https://www.geeksforgeeks.org/iterative-segment-tree-range-minimum-query/ https://www.geeksforgeeks.org/segment-tree-efficient-implementation/ >>> SegmentTree([1, 2, 3], lambda a, b: a + b).query(0, 2) 6 >>> SegmentTree([3, 1, 2], min).query(0, 2) 1 >>> SegmentTree([2, 3, 1], max).query(0, 2) 3 >>> st = SegmentTree([1, 5, 7, -1, 6], lambda a, b: a + b) >>> st.update(1, -1) >>> st.update(2, 3) >>> st.query(1, 2) 2 >>> st.query(1, 1) -1 >>> st.update(4, 1) >>> st.query(3, 4) 0 >>> st = SegmentTree([[1, 2, 3], [3, 2, 1], [1, 1, 1]], lambda a, b: [a[i] + b[i] for i ... in range(len(a))]) >>> st.query(0, 1) [4, 4, 4] >>> st.query(1, 2) [4, 3, 2] >>> st.update(1, [-1, -1, -1]) >>> st.query(1, 2) [0, 0, 0] >>> st.query(0, 2) [1, 2, 3] """ from __future__ import annotations from collections.abc import Callable from typing import Any, TypeVar T = TypeVar("T") class SegmentTree[T]: def __init__(self, arr: list[T], fnc: Callable[[T, T], T]) -> None: """ Segment Tree constructor, it works just with commutative combiner. :param arr: list of elements for the segment tree :param fnc: commutative function for combine two elements >>> SegmentTree(['a', 'b', 'c'], lambda a, b: f'{a}{b}').query(0, 2) 'abc' >>> SegmentTree([(1, 2), (2, 3), (3, 4)], ... lambda a, b: (a[0] + b[0], a[1] + b[1])).query(0, 2) (6, 9) """ any_type: Any | T = None self.N: int = len(arr) self.st: list[T] = [any_type for _ in range(self.N)] + arr self.fn = fnc self.build() def build(self) -> None: for p in range(self.N - 1, 0, -1): self.st[p] = self.fn(self.st[p * 2], self.st[p * 2 + 1]) def update(self, p: int, v: T) -> None: """ Update an element in log(N) time :param p: position to be update :param v: new value >>> st = SegmentTree([3, 1, 2, 4], min) >>> st.query(0, 3) 1 >>> st.update(2, -1) >>> st.query(0, 3) -1 """ p += self.N self.st[p] = v while p > 1: p = p // 2 self.st[p] = self.fn(self.st[p * 2], self.st[p * 2 + 1]) def query(self, left: int, right: int) -> T | None: """ Get range query value in log(N) time :param left: left element index :param right: right element index :return: element combined in the range [left, right] >>> st = SegmentTree([1, 2, 3, 4], lambda a, b: a + b) >>> st.query(0, 2) 6 >>> st.query(1, 2) 5 >>> st.query(0, 3) 10 >>> st.query(2, 3) 7 """ left, right = left + self.N, right + self.N res: T | None = None while left <= right: if left % 2 == 1: res = self.st[left] if res is None else self.fn(res, self.st[left]) if right % 2 == 0: res = self.st[right] if res is None else self.fn(res, self.st[right]) left, right = (left + 1) // 2, (right - 1) // 2 return res if __name__ == "__main__": from functools import reduce test_array = [1, 10, -2, 9, -3, 8, 4, -7, 5, 6, 11, -12] test_updates = { 0: 7, 1: 2, 2: 6, 3: -14, 4: 5, 5: 4, 6: 7, 7: -10, 8: 9, 9: 10, 10: 12, 11: 1, } min_segment_tree = SegmentTree(test_array, min) max_segment_tree = SegmentTree(test_array, max) sum_segment_tree = SegmentTree(test_array, lambda a, b: a + b) def test_all_segments() -> None: """ Test all possible segments """ for i in range(len(test_array)): for j in range(i, len(test_array)): min_range = reduce(min, test_array[i : j + 1]) max_range = reduce(max, test_array[i : j + 1]) sum_range = reduce(lambda a, b: a + b, test_array[i : j + 1]) assert min_range == min_segment_tree.query(i, j) assert max_range == max_segment_tree.query(i, j) assert sum_range == sum_segment_tree.query(i, j) test_all_segments() for index, value in test_updates.items(): test_array[index] = value min_segment_tree.update(index, value) max_segment_tree.update(index, value) sum_segment_tree.update(index, value) test_all_segments() ================================================ FILE: data_structures/binary_tree/number_of_possible_binary_trees.py ================================================ """ Hey, we are going to find an exciting number called Catalan number which is use to find the number of possible binary search trees from tree of a given number of nodes. We will use the formula: t(n) = SUMMATION(i = 1 to n)t(i-1)t(n-i) Further details at Wikipedia: https://en.wikipedia.org/wiki/Catalan_number """ """ Our Contribution: Basically we Create the 2 function: 1. catalan_number(node_count: int) -> int Returns the number of possible binary search trees for n nodes. 2. binary_tree_count(node_count: int) -> int Returns the number of possible binary trees for n nodes. """ def binomial_coefficient(n: int, k: int) -> int: """ Since Here we Find the Binomial Coefficient: https://en.wikipedia.org/wiki/Binomial_coefficient C(n,k) = n! / k!(n-k)! :param n: 2 times of Number of nodes :param k: Number of nodes :return: Integer Value >>> binomial_coefficient(4, 2) 6 """ result = 1 # To kept the Calculated Value # Since C(n, k) = C(n, n-k) k = min(k, n - k) # Calculate C(n,k) for i in range(k): result *= n - i result //= i + 1 return result def catalan_number(node_count: int) -> int: """ We can find Catalan number many ways but here we use Binomial Coefficient because it does the job in O(n) return the Catalan number of n using 2nCn/(n+1). :param n: number of nodes :return: Catalan number of n nodes >>> catalan_number(5) 42 >>> catalan_number(6) 132 """ return binomial_coefficient(2 * node_count, node_count) // (node_count + 1) def factorial(n: int) -> int: """ Return the factorial of a number. :param n: Number to find the Factorial of. :return: Factorial of n. >>> import math >>> all(factorial(i) == math.factorial(i) for i in range(10)) True >>> factorial(-5) # doctest: +ELLIPSIS Traceback (most recent call last): ... ValueError: factorial() not defined for negative values """ if n < 0: raise ValueError("factorial() not defined for negative values") result = 1 for i in range(1, n + 1): result *= i return result def binary_tree_count(node_count: int) -> int: """ Return the number of possible of binary trees. :param n: number of nodes :return: Number of possible binary trees >>> binary_tree_count(5) 5040 >>> binary_tree_count(6) 95040 """ return catalan_number(node_count) * factorial(node_count) if __name__ == "__main__": node_count = int(input("Enter the number of nodes: ").strip() or 0) if node_count <= 0: raise ValueError("We need some nodes to work with.") print( f"Given {node_count} nodes, there are {binary_tree_count(node_count)} " f"binary trees and {catalan_number(node_count)} binary search trees." ) ================================================ FILE: data_structures/binary_tree/red_black_tree.py ================================================ from __future__ import annotations from collections.abc import Iterator class RedBlackTree: """ A Red-Black tree, which is a self-balancing BST (binary search tree). This tree has similar performance to AVL trees, but the balancing is less strict, so it will perform faster for writing/deleting nodes and slower for reading in the average case, though, because they're both balanced binary search trees, both will get the same asymptotic performance. To read more about them, https://en.wikipedia.org/wiki/Red-black_tree Unless otherwise specified, all asymptotic runtimes are specified in terms of the size of the tree. """ def __init__( self, label: int | None = None, color: int = 0, parent: RedBlackTree | None = None, left: RedBlackTree | None = None, right: RedBlackTree | None = None, ) -> None: """Initialize a new Red-Black Tree node with the given values: label: The value associated with this node color: 0 if black, 1 if red parent: The parent to this node left: This node's left child right: This node's right child """ self.label = label self.parent = parent self.left = left self.right = right self.color = color # Here are functions which are specific to red-black trees def rotate_left(self) -> RedBlackTree: """Rotate the subtree rooted at this node to the left and returns the new root to this subtree. Performing one rotation can be done in O(1). """ parent = self.parent right = self.right if right is None: return self self.right = right.left if self.right: self.right.parent = self self.parent = right right.left = self if parent is not None: if parent.left == self: parent.left = right else: parent.right = right right.parent = parent return right def rotate_right(self) -> RedBlackTree: """Rotate the subtree rooted at this node to the right and returns the new root to this subtree. Performing one rotation can be done in O(1). """ if self.left is None: return self parent = self.parent left = self.left self.left = left.right if self.left: self.left.parent = self self.parent = left left.right = self if parent is not None: if parent.right is self: parent.right = left else: parent.left = left left.parent = parent return left def insert(self, label: int) -> RedBlackTree: """Inserts label into the subtree rooted at self, performs any rotations necessary to maintain balance, and then returns the new root to this subtree (likely self). This is guaranteed to run in O(log(n)) time. """ if self.label is None: # Only possible with an empty tree self.label = label return self if self.label == label: return self elif self.label > label: if self.left: self.left.insert(label) else: self.left = RedBlackTree(label, 1, self) self.left._insert_repair() elif self.right: self.right.insert(label) else: self.right = RedBlackTree(label, 1, self) self.right._insert_repair() return self.parent or self def _insert_repair(self) -> None: """Repair the coloring from inserting into a tree.""" if self.parent is None: # This node is the root, so it just needs to be black self.color = 0 elif color(self.parent) == 0: # If the parent is black, then it just needs to be red self.color = 1 else: uncle = self.parent.sibling if color(uncle) == 0: if self.is_left() and self.parent.is_right(): self.parent.rotate_right() if self.right: self.right._insert_repair() elif self.is_right() and self.parent.is_left(): self.parent.rotate_left() if self.left: self.left._insert_repair() elif self.is_left(): if self.grandparent: self.grandparent.rotate_right() self.parent.color = 0 if self.parent.right: self.parent.right.color = 1 else: if self.grandparent: self.grandparent.rotate_left() self.parent.color = 0 if self.parent.left: self.parent.left.color = 1 else: self.parent.color = 0 if uncle and self.grandparent: uncle.color = 0 self.grandparent.color = 1 self.grandparent._insert_repair() def remove(self, label: int) -> RedBlackTree: """Remove label from this tree.""" if self.label == label: if self.left and self.right: # It's easier to balance a node with at most one child, # so we replace this node with the greatest one less than # it and remove that. value = self.left.get_max() if value is not None: self.label = value self.left.remove(value) else: # This node has at most one non-None child, so we don't # need to replace child = self.left or self.right if self.color == 1: # This node is red, and its child is black # The only way this happens to a node with one child # is if both children are None leaves. # We can just remove this node and call it a day. if self.parent: if self.is_left(): self.parent.left = None else: self.parent.right = None # The node is black elif child is None: # This node and its child are black if self.parent is None: # The tree is now empty return RedBlackTree(None) else: self._remove_repair() if self.is_left(): self.parent.left = None else: self.parent.right = None self.parent = None else: # This node is black and its child is red # Move the child node here and make it black self.label = child.label self.left = child.left self.right = child.right if self.left: self.left.parent = self if self.right: self.right.parent = self elif self.label is not None and self.label > label: if self.left: self.left.remove(label) elif self.right: self.right.remove(label) return self.parent or self def _remove_repair(self) -> None: """Repair the coloring of the tree that may have been messed up.""" if ( self.parent is None or self.sibling is None or self.parent.sibling is None or self.grandparent is None ): return if color(self.sibling) == 1: self.sibling.color = 0 self.parent.color = 1 if self.is_left(): self.parent.rotate_left() else: self.parent.rotate_right() if ( color(self.parent) == 0 and color(self.sibling) == 0 and color(self.sibling.left) == 0 and color(self.sibling.right) == 0 ): self.sibling.color = 1 self.parent._remove_repair() return if ( color(self.parent) == 1 and color(self.sibling) == 0 and color(self.sibling.left) == 0 and color(self.sibling.right) == 0 ): self.sibling.color = 1 self.parent.color = 0 return if ( self.is_left() and color(self.sibling) == 0 and color(self.sibling.right) == 0 and color(self.sibling.left) == 1 ): self.sibling.rotate_right() self.sibling.color = 0 if self.sibling.right: self.sibling.right.color = 1 if ( self.is_right() and color(self.sibling) == 0 and color(self.sibling.right) == 1 and color(self.sibling.left) == 0 ): self.sibling.rotate_left() self.sibling.color = 0 if self.sibling.left: self.sibling.left.color = 1 if ( self.is_left() and color(self.sibling) == 0 and color(self.sibling.right) == 1 ): self.parent.rotate_left() self.grandparent.color = self.parent.color self.parent.color = 0 self.parent.sibling.color = 0 if ( self.is_right() and color(self.sibling) == 0 and color(self.sibling.left) == 1 ): self.parent.rotate_right() self.grandparent.color = self.parent.color self.parent.color = 0 self.parent.sibling.color = 0 def check_color_properties(self) -> bool: """Check the coloring of the tree, and return True iff the tree is colored in a way which matches these five properties: (wording stolen from wikipedia article) 1. Each node is either red or black. 2. The root node is black. 3. All leaves are black. 4. If a node is red, then both its children are black. 5. Every path from any node to all of its descendent NIL nodes has the same number of black nodes. This function runs in O(n) time, because properties 4 and 5 take that long to check. """ # I assume property 1 to hold because there is nothing that can # make the color be anything other than 0 or 1. # Property 2 if self.color: # The root was red print("Property 2") return False # Property 3 does not need to be checked, because None is assumed # to be black and is all the leaves. # Property 4 if not self.check_coloring(): print("Property 4") return False # Property 5 if self.black_height() is None: print("Property 5") return False # All properties were met return True def check_coloring(self) -> bool: """A helper function to recursively check Property 4 of a Red-Black Tree. See check_color_properties for more info. """ if self.color == 1 and 1 in (color(self.left), color(self.right)): return False if self.left and not self.left.check_coloring(): return False return not (self.right and not self.right.check_coloring()) def black_height(self) -> int | None: """Returns the number of black nodes from this node to the leaves of the tree, or None if there isn't one such value (the tree is color incorrectly). """ if self is None or self.left is None or self.right is None: # If we're already at a leaf, there is no path return 1 left = RedBlackTree.black_height(self.left) right = RedBlackTree.black_height(self.right) if left is None or right is None: # There are issues with coloring below children nodes return None if left != right: # The two children have unequal depths return None # Return the black depth of children, plus one if this node is # black return left + (1 - self.color) # Here are functions which are general to all binary search trees def __contains__(self, label: int) -> bool: """Search through the tree for label, returning True iff it is found somewhere in the tree. Guaranteed to run in O(log(n)) time. """ return self.search(label) is not None def search(self, label: int) -> RedBlackTree | None: """Search through the tree for label, returning its node if it's found, and None otherwise. This method is guaranteed to run in O(log(n)) time. """ if self.label == label: return self elif self.label is not None and label > self.label: if self.right is None: return None else: return self.right.search(label) elif self.left is None: return None else: return self.left.search(label) def floor(self, label: int) -> int | None: """Returns the largest element in this tree which is at most label. This method is guaranteed to run in O(log(n)) time.""" if self.label == label: return self.label elif self.label is not None and self.label > label: if self.left: return self.left.floor(label) else: return None else: if self.right: attempt = self.right.floor(label) if attempt is not None: return attempt return self.label def ceil(self, label: int) -> int | None: """Returns the smallest element in this tree which is at least label. This method is guaranteed to run in O(log(n)) time. """ if self.label == label: return self.label elif self.label is not None and self.label < label: if self.right: return self.right.ceil(label) else: return None else: if self.left: attempt = self.left.ceil(label) if attempt is not None: return attempt return self.label def get_max(self) -> int | None: """Returns the largest element in this tree. This method is guaranteed to run in O(log(n)) time. """ if self.right: # Go as far right as possible return self.right.get_max() else: return self.label def get_min(self) -> int | None: """Returns the smallest element in this tree. This method is guaranteed to run in O(log(n)) time. """ if self.left: # Go as far left as possible return self.left.get_min() else: return self.label @property def grandparent(self) -> RedBlackTree | None: """Get the current node's grandparent, or None if it doesn't exist.""" if self.parent is None: return None else: return self.parent.parent @property def sibling(self) -> RedBlackTree | None: """Get the current node's sibling, or None if it doesn't exist.""" if self.parent is None: return None elif self.parent.left is self: return self.parent.right else: return self.parent.left def is_left(self) -> bool: """Returns true iff this node is the left child of its parent.""" if self.parent is None: return False return self.parent.left is self def is_right(self) -> bool: """Returns true iff this node is the right child of its parent.""" if self.parent is None: return False return self.parent.right is self def __bool__(self) -> bool: return True def __len__(self) -> int: """ Return the number of nodes in this tree. """ ln = 1 if self.left: ln += len(self.left) if self.right: ln += len(self.right) return ln def preorder_traverse(self) -> Iterator[int | None]: yield self.label if self.left: yield from self.left.preorder_traverse() if self.right: yield from self.right.preorder_traverse() def inorder_traverse(self) -> Iterator[int | None]: if self.left: yield from self.left.inorder_traverse() yield self.label if self.right: yield from self.right.inorder_traverse() def postorder_traverse(self) -> Iterator[int | None]: if self.left: yield from self.left.postorder_traverse() if self.right: yield from self.right.postorder_traverse() yield self.label def __repr__(self) -> str: from pprint import pformat if self.left is None and self.right is None: return f"'{self.label} {(self.color and 'red') or 'blk'}'" return pformat( { f"{self.label} {(self.color and 'red') or 'blk'}": ( self.left, self.right, ) }, indent=1, ) def __eq__(self, other: object) -> bool: """Test if two trees are equal.""" if not isinstance(other, RedBlackTree): return NotImplemented if self.label == other.label: return self.left == other.left and self.right == other.right else: return False def color(node: RedBlackTree | None) -> int: """Returns the color of a node, allowing for None leaves.""" if node is None: return 0 else: return node.color """ Code for testing the various functions of the red-black tree. """ def test_rotations() -> bool: """Test that the rotate_left and rotate_right functions work.""" # Make a tree to test on tree = RedBlackTree(0) tree.left = RedBlackTree(-10, parent=tree) tree.right = RedBlackTree(10, parent=tree) tree.left.left = RedBlackTree(-20, parent=tree.left) tree.left.right = RedBlackTree(-5, parent=tree.left) tree.right.left = RedBlackTree(5, parent=tree.right) tree.right.right = RedBlackTree(20, parent=tree.right) # Make the right rotation left_rot = RedBlackTree(10) left_rot.left = RedBlackTree(0, parent=left_rot) left_rot.left.left = RedBlackTree(-10, parent=left_rot.left) left_rot.left.right = RedBlackTree(5, parent=left_rot.left) left_rot.left.left.left = RedBlackTree(-20, parent=left_rot.left.left) left_rot.left.left.right = RedBlackTree(-5, parent=left_rot.left.left) left_rot.right = RedBlackTree(20, parent=left_rot) tree = tree.rotate_left() if tree != left_rot: return False tree = tree.rotate_right() tree = tree.rotate_right() # Make the left rotation right_rot = RedBlackTree(-10) right_rot.left = RedBlackTree(-20, parent=right_rot) right_rot.right = RedBlackTree(0, parent=right_rot) right_rot.right.left = RedBlackTree(-5, parent=right_rot.right) right_rot.right.right = RedBlackTree(10, parent=right_rot.right) right_rot.right.right.left = RedBlackTree(5, parent=right_rot.right.right) right_rot.right.right.right = RedBlackTree(20, parent=right_rot.right.right) return tree == right_rot def test_insertion_speed() -> bool: """Test that the tree balances inserts to O(log(n)) by doing a lot of them. """ tree = RedBlackTree(-1) for i in range(300000): tree = tree.insert(i) return True def test_insert() -> bool: """Test the insert() method of the tree correctly balances, colors, and inserts. """ tree = RedBlackTree(0) tree.insert(8) tree.insert(-8) tree.insert(4) tree.insert(12) tree.insert(10) tree.insert(11) ans = RedBlackTree(0, 0) ans.left = RedBlackTree(-8, 0, ans) ans.right = RedBlackTree(8, 1, ans) ans.right.left = RedBlackTree(4, 0, ans.right) ans.right.right = RedBlackTree(11, 0, ans.right) ans.right.right.left = RedBlackTree(10, 1, ans.right.right) ans.right.right.right = RedBlackTree(12, 1, ans.right.right) return tree == ans def test_insert_and_search() -> bool: """Tests searching through the tree for values.""" tree = RedBlackTree(0) tree.insert(8) tree.insert(-8) tree.insert(4) tree.insert(12) tree.insert(10) tree.insert(11) if any(i in tree for i in (5, -6, -10, 13)): # Found something not in there return False # Find all these things in there return all(i in tree for i in (11, 12, -8, 0)) def test_insert_delete() -> bool: """Test the insert() and delete() method of the tree, verifying the insertion and removal of elements, and the balancing of the tree. """ tree = RedBlackTree(0) tree = tree.insert(-12) tree = tree.insert(8) tree = tree.insert(-8) tree = tree.insert(15) tree = tree.insert(4) tree = tree.insert(12) tree = tree.insert(10) tree = tree.insert(9) tree = tree.insert(11) tree = tree.remove(15) tree = tree.remove(-12) tree = tree.remove(9) if not tree.check_color_properties(): return False return list(tree.inorder_traverse()) == [-8, 0, 4, 8, 10, 11, 12] def test_floor_ceil() -> bool: """Tests the floor and ceiling functions in the tree.""" tree = RedBlackTree(0) tree.insert(-16) tree.insert(16) tree.insert(8) tree.insert(24) tree.insert(20) tree.insert(22) tuples = [(-20, None, -16), (-10, -16, 0), (8, 8, 8), (50, 24, None)] for val, floor, ceil in tuples: if tree.floor(val) != floor or tree.ceil(val) != ceil: return False return True def test_min_max() -> bool: """Tests the min and max functions in the tree.""" tree = RedBlackTree(0) tree.insert(-16) tree.insert(16) tree.insert(8) tree.insert(24) tree.insert(20) tree.insert(22) return not (tree.get_max() != 22 or tree.get_min() != -16) def test_tree_traversal() -> bool: """Tests the three different tree traversal functions.""" tree = RedBlackTree(0) tree = tree.insert(-16) tree.insert(16) tree.insert(8) tree.insert(24) tree.insert(20) tree.insert(22) if list(tree.inorder_traverse()) != [-16, 0, 8, 16, 20, 22, 24]: return False if list(tree.preorder_traverse()) != [0, -16, 16, 8, 22, 20, 24]: return False return list(tree.postorder_traverse()) == [-16, 8, 20, 24, 22, 16, 0] def test_tree_chaining() -> bool: """Tests the three different tree chaining functions.""" tree = RedBlackTree(0) tree = tree.insert(-16).insert(16).insert(8).insert(24).insert(20).insert(22) if list(tree.inorder_traverse()) != [-16, 0, 8, 16, 20, 22, 24]: return False if list(tree.preorder_traverse()) != [0, -16, 16, 8, 22, 20, 24]: return False return list(tree.postorder_traverse()) == [-16, 8, 20, 24, 22, 16, 0] def print_results(msg: str, passes: bool) -> None: print(str(msg), "works!" if passes else "doesn't work :(") def pytests() -> None: assert test_rotations() assert test_insert() assert test_insert_and_search() assert test_insert_delete() assert test_floor_ceil() assert test_tree_traversal() assert test_tree_chaining() def main() -> None: """ >>> pytests() """ print_results("Rotating right and left", test_rotations()) print_results("Inserting", test_insert()) print_results("Searching", test_insert_and_search()) print_results("Deleting", test_insert_delete()) print_results("Floor and ceil", test_floor_ceil()) print_results("Tree traversal", test_tree_traversal()) print_results("Tree traversal", test_tree_chaining()) print("Testing tree balancing...") print("This should only be a few seconds.") test_insertion_speed() print("Done!") if __name__ == "__main__": main() ================================================ FILE: data_structures/binary_tree/segment_tree.py ================================================ import math class SegmentTree: def __init__(self, a): self.A = a self.N = len(self.A) self.st = [0] * ( 4 * self.N ) # approximate the overall size of segment tree with array N if self.N: self.build(1, 0, self.N - 1) def left(self, idx): """ Returns the left child index for a given index in a binary tree. >>> s = SegmentTree([1, 2, 3]) >>> s.left(1) 2 >>> s.left(2) 4 """ return idx * 2 def right(self, idx): """ Returns the right child index for a given index in a binary tree. >>> s = SegmentTree([1, 2, 3]) >>> s.right(1) 3 >>> s.right(2) 5 """ return idx * 2 + 1 def build(self, idx, left, right): if left == right: self.st[idx] = self.A[left] else: mid = (left + right) // 2 self.build(self.left(idx), left, mid) self.build(self.right(idx), mid + 1, right) self.st[idx] = max(self.st[self.left(idx)], self.st[self.right(idx)]) def update(self, a, b, val): """ Update the values in the segment tree in the range [a,b] with the given value. >>> s = SegmentTree([1, 2, 3, 4, 5]) >>> s.update(2, 4, 10) True >>> s.query(1, 5) 10 """ return self.update_recursive(1, 0, self.N - 1, a - 1, b - 1, val) def update_recursive(self, idx, left, right, a, b, val): """ update(1, 1, N, a, b, v) for update val v to [a,b] """ if right < a or left > b: return True if left == right: self.st[idx] = val return True mid = (left + right) // 2 self.update_recursive(self.left(idx), left, mid, a, b, val) self.update_recursive(self.right(idx), mid + 1, right, a, b, val) self.st[idx] = max(self.st[self.left(idx)], self.st[self.right(idx)]) return True def query(self, a, b): """ Query the maximum value in the range [a,b]. >>> s = SegmentTree([1, 2, 3, 4, 5]) >>> s.query(1, 3) 3 >>> s.query(1, 5) 5 """ return self.query_recursive(1, 0, self.N - 1, a - 1, b - 1) def query_recursive(self, idx, left, right, a, b): """ query(1, 1, N, a, b) for query max of [a,b] """ if right < a or left > b: return -math.inf if left >= a and right <= b: return self.st[idx] mid = (left + right) // 2 q1 = self.query_recursive(self.left(idx), left, mid, a, b) q2 = self.query_recursive(self.right(idx), mid + 1, right, a, b) return max(q1, q2) def show_data(self): show_list = [] for i in range(1, self.N + 1): show_list += [self.query(i, i)] print(show_list) if __name__ == "__main__": A = [1, 2, -4, 7, 3, -5, 6, 11, -20, 9, 14, 15, 5, 2, -8] N = 15 segt = SegmentTree(A) print(segt.query(4, 6)) print(segt.query(7, 11)) print(segt.query(7, 12)) segt.update(1, 3, 111) print(segt.query(1, 15)) segt.update(7, 8, 235) segt.show_data() ================================================ FILE: data_structures/binary_tree/segment_tree_other.py ================================================ """ Segment_tree creates a segment tree with a given array and function, allowing queries to be done later in log(N) time function takes 2 values and returns a same type value """ from collections.abc import Sequence from queue import Queue class SegmentTreeNode: def __init__(self, start, end, val, left=None, right=None): self.start = start self.end = end self.val = val self.mid = (start + end) // 2 self.left = left self.right = right def __repr__(self): return f"SegmentTreeNode(start={self.start}, end={self.end}, val={self.val})" class SegmentTree: """ >>> import operator >>> num_arr = SegmentTree([2, 1, 5, 3, 4], operator.add) >>> tuple(num_arr.traverse()) # doctest: +NORMALIZE_WHITESPACE (SegmentTreeNode(start=0, end=4, val=15), SegmentTreeNode(start=0, end=2, val=8), SegmentTreeNode(start=3, end=4, val=7), SegmentTreeNode(start=0, end=1, val=3), SegmentTreeNode(start=2, end=2, val=5), SegmentTreeNode(start=3, end=3, val=3), SegmentTreeNode(start=4, end=4, val=4), SegmentTreeNode(start=0, end=0, val=2), SegmentTreeNode(start=1, end=1, val=1)) >>> >>> num_arr.update(1, 5) >>> tuple(num_arr.traverse()) # doctest: +NORMALIZE_WHITESPACE (SegmentTreeNode(start=0, end=4, val=19), SegmentTreeNode(start=0, end=2, val=12), SegmentTreeNode(start=3, end=4, val=7), SegmentTreeNode(start=0, end=1, val=7), SegmentTreeNode(start=2, end=2, val=5), SegmentTreeNode(start=3, end=3, val=3), SegmentTreeNode(start=4, end=4, val=4), SegmentTreeNode(start=0, end=0, val=2), SegmentTreeNode(start=1, end=1, val=5)) >>> >>> num_arr.query_range(3, 4) 7 >>> num_arr.query_range(2, 2) 5 >>> num_arr.query_range(1, 3) 13 >>> >>> max_arr = SegmentTree([2, 1, 5, 3, 4], max) >>> for node in max_arr.traverse(): ... print(node) ... SegmentTreeNode(start=0, end=4, val=5) SegmentTreeNode(start=0, end=2, val=5) SegmentTreeNode(start=3, end=4, val=4) SegmentTreeNode(start=0, end=1, val=2) SegmentTreeNode(start=2, end=2, val=5) SegmentTreeNode(start=3, end=3, val=3) SegmentTreeNode(start=4, end=4, val=4) SegmentTreeNode(start=0, end=0, val=2) SegmentTreeNode(start=1, end=1, val=1) >>> >>> max_arr.update(1, 5) >>> for node in max_arr.traverse(): ... print(node) ... SegmentTreeNode(start=0, end=4, val=5) SegmentTreeNode(start=0, end=2, val=5) SegmentTreeNode(start=3, end=4, val=4) SegmentTreeNode(start=0, end=1, val=5) SegmentTreeNode(start=2, end=2, val=5) SegmentTreeNode(start=3, end=3, val=3) SegmentTreeNode(start=4, end=4, val=4) SegmentTreeNode(start=0, end=0, val=2) SegmentTreeNode(start=1, end=1, val=5) >>> >>> max_arr.query_range(3, 4) 4 >>> max_arr.query_range(2, 2) 5 >>> max_arr.query_range(1, 3) 5 >>> >>> min_arr = SegmentTree([2, 1, 5, 3, 4], min) >>> for node in min_arr.traverse(): ... print(node) ... SegmentTreeNode(start=0, end=4, val=1) SegmentTreeNode(start=0, end=2, val=1) SegmentTreeNode(start=3, end=4, val=3) SegmentTreeNode(start=0, end=1, val=1) SegmentTreeNode(start=2, end=2, val=5) SegmentTreeNode(start=3, end=3, val=3) SegmentTreeNode(start=4, end=4, val=4) SegmentTreeNode(start=0, end=0, val=2) SegmentTreeNode(start=1, end=1, val=1) >>> >>> min_arr.update(1, 5) >>> for node in min_arr.traverse(): ... print(node) ... SegmentTreeNode(start=0, end=4, val=2) SegmentTreeNode(start=0, end=2, val=2) SegmentTreeNode(start=3, end=4, val=3) SegmentTreeNode(start=0, end=1, val=2) SegmentTreeNode(start=2, end=2, val=5) SegmentTreeNode(start=3, end=3, val=3) SegmentTreeNode(start=4, end=4, val=4) SegmentTreeNode(start=0, end=0, val=2) SegmentTreeNode(start=1, end=1, val=5) >>> >>> min_arr.query_range(3, 4) 3 >>> min_arr.query_range(2, 2) 5 >>> min_arr.query_range(1, 3) 3 >>> """ def __init__(self, collection: Sequence, function): self.collection = collection self.fn = function if self.collection: self.root = self._build_tree(0, len(collection) - 1) def update(self, i, val): """ Update an element in log(N) time :param i: position to be update :param val: new value >>> import operator >>> num_arr = SegmentTree([2, 1, 5, 3, 4], operator.add) >>> num_arr.update(1, 5) >>> num_arr.query_range(1, 3) 13 """ self._update_tree(self.root, i, val) def query_range(self, i, j): """ Get range query value in log(N) time :param i: left element index :param j: right element index :return: element combined in the range [i, j] >>> import operator >>> num_arr = SegmentTree([2, 1, 5, 3, 4], operator.add) >>> num_arr.update(1, 5) >>> num_arr.query_range(3, 4) 7 >>> num_arr.query_range(2, 2) 5 >>> num_arr.query_range(1, 3) 13 >>> """ return self._query_range(self.root, i, j) def _build_tree(self, start, end): if start == end: return SegmentTreeNode(start, end, self.collection[start]) mid = (start + end) // 2 left = self._build_tree(start, mid) right = self._build_tree(mid + 1, end) return SegmentTreeNode(start, end, self.fn(left.val, right.val), left, right) def _update_tree(self, node, i, val): if node.start == i and node.end == i: node.val = val return if i <= node.mid: self._update_tree(node.left, i, val) else: self._update_tree(node.right, i, val) node.val = self.fn(node.left.val, node.right.val) def _query_range(self, node, i, j): if node.start == i and node.end == j: return node.val if i <= node.mid: if j <= node.mid: # range in left child tree return self._query_range(node.left, i, j) else: # range in left child tree and right child tree return self.fn( self._query_range(node.left, i, node.mid), self._query_range(node.right, node.mid + 1, j), ) else: # range in right child tree return self._query_range(node.right, i, j) def traverse(self): if self.root is not None: queue = Queue() queue.put(self.root) while not queue.empty(): node = queue.get() yield node if node.left is not None: queue.put(node.left) if node.right is not None: queue.put(node.right) if __name__ == "__main__": import operator for fn in [operator.add, max, min]: print("*" * 50) arr = SegmentTree([2, 1, 5, 3, 4], fn) for node in arr.traverse(): print(node) print() arr.update(1, 5) for node in arr.traverse(): print(node) print() print(arr.query_range(3, 4)) # 7 print(arr.query_range(2, 2)) # 5 print(arr.query_range(1, 3)) # 13 print() ================================================ FILE: data_structures/binary_tree/serialize_deserialize_binary_tree.py ================================================ from __future__ import annotations from collections.abc import Iterator from dataclasses import dataclass @dataclass class TreeNode: """ A binary tree node has a value, left child, and right child. Props: value: The value of the node. left: The left child of the node. right: The right child of the node. """ value: int = 0 left: TreeNode | None = None right: TreeNode | None = None def __post_init__(self): if not isinstance(self.value, int): raise TypeError("Value must be an integer.") def __iter__(self) -> Iterator[TreeNode]: """ Iterate through the tree in preorder. Returns: An iterator of the tree nodes. >>> list(TreeNode(1)) [1,null,null] >>> tuple(TreeNode(1, TreeNode(2), TreeNode(3))) (1,2,null,null,3,null,null, 2,null,null, 3,null,null) """ yield self yield from self.left or () yield from self.right or () def __len__(self) -> int: """ Count the number of nodes in the tree. Returns: The number of nodes in the tree. >>> len(TreeNode(1)) 1 >>> len(TreeNode(1, TreeNode(2), TreeNode(3))) 3 """ return sum(1 for _ in self) def __repr__(self) -> str: """ Represent the tree as a string. Returns: A string representation of the tree. >>> repr(TreeNode(1)) '1,null,null' >>> repr(TreeNode(1, TreeNode(2), TreeNode(3))) '1,2,null,null,3,null,null' >>> repr(TreeNode(1, TreeNode(2), TreeNode(3, TreeNode(4), TreeNode(5)))) '1,2,null,null,3,4,null,null,5,null,null' """ return f"{self.value},{self.left!r},{self.right!r}".replace("None", "null") @classmethod def five_tree(cls) -> TreeNode: """ >>> repr(TreeNode.five_tree()) '1,2,null,null,3,4,null,null,5,null,null' """ root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(3) root.right.left = TreeNode(4) root.right.right = TreeNode(5) return root def deserialize(data: str) -> TreeNode | None: """ Deserialize a string to a binary tree. Args: data(str): The serialized string. Returns: The root of the binary tree. >>> root = TreeNode.five_tree() >>> serialzed_data = repr(root) >>> deserialized = deserialize(serialzed_data) >>> root == deserialized True >>> root is deserialized # two separate trees False >>> root.right.right.value = 6 >>> root == deserialized False >>> serialzed_data = repr(root) >>> deserialized = deserialize(serialzed_data) >>> root == deserialized True >>> deserialize("") Traceback (most recent call last): ... ValueError: Data cannot be empty. """ if not data: raise ValueError("Data cannot be empty.") # Split the serialized string by a comma to get node values nodes = data.split(",") def build_tree() -> TreeNode | None: # Get the next value from the list value = nodes.pop(0) if value == "null": return None node = TreeNode(int(value)) node.left = build_tree() # Recursively build left subtree node.right = build_tree() # Recursively build right subtree return node return build_tree() if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/binary_tree/symmetric_tree.py ================================================ """ Given the root of a binary tree, check whether it is a mirror of itself (i.e., symmetric around its center). Leetcode reference: https://leetcode.com/problems/symmetric-tree/ """ from __future__ import annotations from dataclasses import dataclass @dataclass class Node: """ A Node represents an element of a binary tree, which contains: Attributes: data: The value stored in the node (int). left: Pointer to the left child node (Node or None). right: Pointer to the right child node (Node or None). Example: >>> node = Node(1, Node(2), Node(3)) >>> node.data 1 >>> node.left.data 2 >>> node.right.data 3 """ data: int left: Node | None = None right: Node | None = None def make_symmetric_tree() -> Node: r""" Create a symmetric tree for testing. The tree looks like this: 1 / \ 2 2 / \ / \ 3 4 4 3 Returns: Node: Root node of a symmetric tree. Example: >>> tree = make_symmetric_tree() >>> tree.data 1 >>> tree.left.data == tree.right.data True >>> tree.left.left.data == tree.right.right.data True """ root = Node(1) root.left = Node(2) root.right = Node(2) root.left.left = Node(3) root.left.right = Node(4) root.right.left = Node(4) root.right.right = Node(3) return root def make_asymmetric_tree() -> Node: r""" Create an asymmetric tree for testing. The tree looks like this: 1 / \ 2 2 / \ / \ 3 4 3 4 Returns: Node: Root node of an asymmetric tree. Example: >>> tree = make_asymmetric_tree() >>> tree.data 1 >>> tree.left.data == tree.right.data True >>> tree.left.left.data == tree.right.right.data False """ root = Node(1) root.left = Node(2) root.right = Node(2) root.left.left = Node(3) root.left.right = Node(4) root.right.left = Node(3) root.right.right = Node(4) return root def is_symmetric_tree(tree: Node) -> bool: """ Check if a binary tree is symmetric (i.e., a mirror of itself). Parameters: tree: The root node of the binary tree. Returns: bool: True if the tree is symmetric, False otherwise. Example: >>> is_symmetric_tree(make_symmetric_tree()) True >>> is_symmetric_tree(make_asymmetric_tree()) False """ if tree: return is_mirror(tree.left, tree.right) return True # An empty tree is considered symmetric. def is_mirror(left: Node | None, right: Node | None) -> bool: """ Check if two subtrees are mirror images of each other. Parameters: left: The root node of the left subtree. right: The root node of the right subtree. Returns: bool: True if the two subtrees are mirrors of each other, False otherwise. Example: >>> tree1 = make_symmetric_tree() >>> is_mirror(tree1.left, tree1.right) True >>> tree2 = make_asymmetric_tree() >>> is_mirror(tree2.left, tree2.right) False """ if left is None and right is None: # Both sides are empty, which is symmetric. return True if left is None or right is None: # One side is empty while the other is not, which is not symmetric. return False if left.data == right.data: # The values match, so check the subtrees recursively. return is_mirror(left.left, right.right) and is_mirror(left.right, right.left) return False if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: data_structures/binary_tree/treap.py ================================================ from __future__ import annotations from random import random class Node: """ Treap's node Treap is a binary tree by value and heap by priority """ def __init__(self, value: int | None = None): self.value = value self.prior = random() self.left: Node | None = None self.right: Node | None = None def __repr__(self) -> str: from pprint import pformat if self.left is None and self.right is None: return f"'{self.value}: {self.prior:.5}'" else: return pformat( {f"{self.value}: {self.prior:.5}": (self.left, self.right)}, indent=1 ) def __str__(self) -> str: value = str(self.value) + " " left = str(self.left or "") right = str(self.right or "") return value + left + right def split(root: Node | None, value: int) -> tuple[Node | None, Node | None]: """ We split current tree into 2 trees with value: Left tree contains all values less than split value. Right tree contains all values greater or equal, than split value """ if root is None or root.value is None: # None tree is split into 2 Nones return None, None elif value < root.value: """ Right tree's root will be current node. Now we split(with the same value) current node's left son Left tree: left part of that split Right tree's left son: right part of that split """ left, root.left = split(root.left, value) return left, root else: """ Just symmetric to previous case """ root.right, right = split(root.right, value) return root, right def merge(left: Node | None, right: Node | None) -> Node | None: """ We merge 2 trees into one. Note: all left tree's values must be less than all right tree's """ if (not left) or (not right): # If one node is None, return the other return left or right elif left.prior < right.prior: """ Left will be root because it has more priority Now we need to merge left's right son and right tree """ left.right = merge(left.right, right) return left else: """ Symmetric as well """ right.left = merge(left, right.left) return right def insert(root: Node | None, value: int) -> Node | None: """ Insert element Split current tree with a value into left, right, Insert new node into the middle Merge left, node, right into root """ node = Node(value) left, right = split(root, value) return merge(merge(left, node), right) def erase(root: Node | None, value: int) -> Node | None: """ Erase element Split all nodes with values less into left, Split all nodes with values greater into right. Merge left, right """ left, right = split(root, value - 1) _, right = split(right, value) return merge(left, right) def inorder(root: Node | None) -> None: """ Just recursive print of a tree """ if not root: # None return else: inorder(root.left) print(root.value, end=",") inorder(root.right) def interact_treap(root: Node | None, args: str) -> Node | None: """ Commands: + value to add value into treap - value to erase all nodes with value >>> root = interact_treap(None, "+1") >>> inorder(root) 1, >>> root = interact_treap(root, "+3 +5 +17 +19 +2 +16 +4 +0") >>> inorder(root) 0,1,2,3,4,5,16,17,19, >>> root = interact_treap(root, "+4 +4 +4") >>> inorder(root) 0,1,2,3,4,4,4,4,5,16,17,19, >>> root = interact_treap(root, "-0") >>> inorder(root) 1,2,3,4,4,4,4,5,16,17,19, >>> root = interact_treap(root, "-4") >>> inorder(root) 1,2,3,5,16,17,19, >>> root = interact_treap(root, "=0") Unknown command """ for arg in args.split(): if arg[0] == "+": root = insert(root, int(arg[1:])) elif arg[0] == "-": root = erase(root, int(arg[1:])) else: print("Unknown command") return root def main() -> None: """After each command, program prints treap""" root = None print( "enter numbers to create a tree, + value to add value into treap, " "- value to erase all nodes with value. 'q' to quit. " ) args = input() while args != "q": root = interact_treap(root, args) print(root) args = input() print("good by!") if __name__ == "__main__": import doctest doctest.testmod() main() ================================================ FILE: data_structures/binary_tree/wavelet_tree.py ================================================ """ Wavelet tree is a data-structure designed to efficiently answer various range queries for arrays. Wavelets trees are different from other binary trees in the sense that the nodes are split based on the actual values of the elements and not on indices, such as the with segment trees or fenwick trees. You can read more about them here: 1. https://users.dcc.uchile.cl/~jperez/papers/ioiconf16.pdf 2. https://www.youtube.com/watch?v=4aSv9PcecDw&t=811s 3. https://www.youtube.com/watch?v=CybAgVF-MMc&t=1178s """ from __future__ import annotations test_array = [2, 1, 4, 5, 6, 0, 8, 9, 1, 2, 0, 6, 4, 2, 0, 6, 5, 3, 2, 7] class Node: def __init__(self, length: int) -> None: self.minn: int = -1 self.maxx: int = -1 self.map_left: list[int] = [-1] * length self.left: Node | None = None self.right: Node | None = None def __repr__(self) -> str: """ >>> node = Node(length=27) >>> repr(node) 'Node(min_value=-1 max_value=-1)' >>> repr(node) == str(node) True """ return f"Node(min_value={self.minn} max_value={self.maxx})" def build_tree(arr: list[int]) -> Node | None: """ Builds the tree for arr and returns the root of the constructed tree >>> build_tree(test_array) Node(min_value=0 max_value=9) """ root = Node(len(arr)) root.minn, root.maxx = min(arr), max(arr) # Leaf node case where the node contains only one unique value if root.minn == root.maxx: return root """ Take the mean of min and max element of arr as the pivot and partition arr into left_arr and right_arr with all elements <= pivot in the left_arr and the rest in right_arr, maintaining the order of the elements, then recursively build trees for left_arr and right_arr """ pivot = (root.minn + root.maxx) // 2 left_arr: list[int] = [] right_arr: list[int] = [] for index, num in enumerate(arr): if num <= pivot: left_arr.append(num) else: right_arr.append(num) root.map_left[index] = len(left_arr) root.left = build_tree(left_arr) root.right = build_tree(right_arr) return root def rank_till_index(node: Node | None, num: int, index: int) -> int: """ Returns the number of occurrences of num in interval [0, index] in the list >>> root = build_tree(test_array) >>> rank_till_index(root, 6, 6) 1 >>> rank_till_index(root, 2, 0) 1 >>> rank_till_index(root, 1, 10) 2 >>> rank_till_index(root, 17, 7) 0 >>> rank_till_index(root, 0, 9) 1 """ if index < 0 or node is None: return 0 # Leaf node cases if node.minn == node.maxx: return index + 1 if node.minn == num else 0 pivot = (node.minn + node.maxx) // 2 if num <= pivot: # go the left subtree and map index to the left subtree return rank_till_index(node.left, num, node.map_left[index] - 1) else: # go to the right subtree and map index to the right subtree return rank_till_index(node.right, num, index - node.map_left[index]) def rank(node: Node | None, num: int, start: int, end: int) -> int: """ Returns the number of occurrences of num in interval [start, end] in the list >>> root = build_tree(test_array) >>> rank(root, 6, 3, 13) 2 >>> rank(root, 2, 0, 19) 4 >>> rank(root, 9, 2 ,2) 0 >>> rank(root, 0, 5, 10) 2 """ if start > end: return 0 rank_till_end = rank_till_index(node, num, end) rank_before_start = rank_till_index(node, num, start - 1) return rank_till_end - rank_before_start def quantile(node: Node | None, index: int, start: int, end: int) -> int: """ Returns the index'th smallest element in interval [start, end] in the list index is 0-indexed >>> root = build_tree(test_array) >>> quantile(root, 2, 2, 5) 5 >>> quantile(root, 5, 2, 13) 4 >>> quantile(root, 0, 6, 6) 8 >>> quantile(root, 4, 2, 5) -1 """ if index > (end - start) or start > end or node is None: return -1 # Leaf node case if node.minn == node.maxx: return node.minn # Number of elements in the left subtree in interval [start, end] num_elements_in_left_tree = node.map_left[end] - ( node.map_left[start - 1] if start else 0 ) if num_elements_in_left_tree > index: return quantile( node.left, index, (node.map_left[start - 1] if start else 0), node.map_left[end] - 1, ) else: return quantile( node.right, index - num_elements_in_left_tree, start - (node.map_left[start - 1] if start else 0), end - node.map_left[end], ) def range_counting( node: Node | None, start: int, end: int, start_num: int, end_num: int ) -> int: """ Returns the number of elements in range [start_num, end_num] in interval [start, end] in the list >>> root = build_tree(test_array) >>> range_counting(root, 1, 10, 3, 7) 3 >>> range_counting(root, 2, 2, 1, 4) 1 >>> range_counting(root, 0, 19, 0, 100) 20 >>> range_counting(root, 1, 0, 1, 100) 0 >>> range_counting(root, 0, 17, 100, 1) 0 """ if ( start > end or node is None or start_num > end_num or node.minn > end_num or node.maxx < start_num ): return 0 if start_num <= node.minn and node.maxx <= end_num: return end - start + 1 left = range_counting( node.left, (node.map_left[start - 1] if start else 0), node.map_left[end] - 1, start_num, end_num, ) right = range_counting( node.right, start - (node.map_left[start - 1] if start else 0), end - node.map_left[end], start_num, end_num, ) return left + right if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/disjoint_set/__init__.py ================================================ ================================================ FILE: data_structures/disjoint_set/alternate_disjoint_set.py ================================================ """ Implements a disjoint set using Lists and some added heuristics for efficiency Union by Rank Heuristic and Path Compression """ class DisjointSet: def __init__(self, set_counts: list) -> None: """ Initialize with a list of the number of items in each set and with rank = 1 for each set """ self.set_counts = set_counts self.max_set = max(set_counts) num_sets = len(set_counts) self.ranks = [1] * num_sets self.parents = list(range(num_sets)) def merge(self, src: int, dst: int) -> bool: """ Merge two sets together using Union by rank heuristic Return True if successful Merge two disjoint sets >>> A = DisjointSet([1, 1, 1]) >>> A.merge(1, 2) True >>> A.merge(0, 2) True >>> A.merge(0, 1) False """ src_parent = self.get_parent(src) dst_parent = self.get_parent(dst) if src_parent == dst_parent: return False if self.ranks[dst_parent] >= self.ranks[src_parent]: self.set_counts[dst_parent] += self.set_counts[src_parent] self.set_counts[src_parent] = 0 self.parents[src_parent] = dst_parent if self.ranks[dst_parent] == self.ranks[src_parent]: self.ranks[dst_parent] += 1 joined_set_size = self.set_counts[dst_parent] else: self.set_counts[src_parent] += self.set_counts[dst_parent] self.set_counts[dst_parent] = 0 self.parents[dst_parent] = src_parent joined_set_size = self.set_counts[src_parent] self.max_set = max(self.max_set, joined_set_size) return True def get_parent(self, disj_set: int) -> int: """ Find the Parent of a given set >>> A = DisjointSet([1, 1, 1]) >>> A.merge(1, 2) True >>> A.get_parent(0) 0 >>> A.get_parent(1) 2 """ if self.parents[disj_set] == disj_set: return disj_set self.parents[disj_set] = self.get_parent(self.parents[disj_set]) return self.parents[disj_set] ================================================ FILE: data_structures/disjoint_set/disjoint_set.py ================================================ """ Disjoint set. Reference: https://en.wikipedia.org/wiki/Disjoint-set_data_structure """ class Node: def __init__(self, data: int) -> None: self.data = data self.rank: int self.parent: Node def make_set(x: Node) -> None: """ Make x as a set. """ # rank is the distance from x to its' parent # root's rank is 0 x.rank = 0 x.parent = x def union_set(x: Node, y: Node) -> None: """ Union of two sets. set with bigger rank should be parent, so that the disjoint set tree will be more flat. """ x, y = find_set(x), find_set(y) if x == y: return elif x.rank > y.rank: y.parent = x else: x.parent = y if x.rank == y.rank: y.rank += 1 def find_set(x: Node) -> Node: """ Return the parent of x """ if x != x.parent: x.parent = find_set(x.parent) return x.parent def find_python_set(node: Node) -> set: """ Return a Python Standard Library set that contains i. """ sets = ({0, 1, 2}, {3, 4, 5}) for s in sets: if node.data in s: return s msg = f"{node.data} is not in {sets}" raise ValueError(msg) def test_disjoint_set() -> None: """ >>> test_disjoint_set() """ vertex = [Node(i) for i in range(6)] for v in vertex: make_set(v) union_set(vertex[0], vertex[1]) union_set(vertex[1], vertex[2]) union_set(vertex[3], vertex[4]) union_set(vertex[3], vertex[5]) for node0 in vertex: for node1 in vertex: if find_python_set(node0).isdisjoint(find_python_set(node1)): assert find_set(node0) != find_set(node1) else: assert find_set(node0) == find_set(node1) if __name__ == "__main__": test_disjoint_set() ================================================ FILE: data_structures/hashing/__init__.py ================================================ ================================================ FILE: data_structures/hashing/bloom_filter.py ================================================ """ See https://en.wikipedia.org/wiki/Bloom_filter The use of this data structure is to test membership in a set. Compared to Python's built-in set() it is more space-efficient. In the following example, only 8 bits of memory will be used: >>> bloom = Bloom(size=8) Initially, the filter contains all zeros: >>> bloom.bitstring '00000000' When an element is added, two bits are set to 1 since there are 2 hash functions in this implementation: >>> "Titanic" in bloom False >>> bloom.add("Titanic") >>> bloom.bitstring '01100000' >>> "Titanic" in bloom True However, sometimes only one bit is added because both hash functions return the same value >>> bloom.add("Avatar") >>> "Avatar" in bloom True >>> bloom.format_hash("Avatar") '00000100' >>> bloom.bitstring '01100100' Not added elements should return False ... >>> not_present_films = ("The Godfather", "Interstellar", "Parasite", "Pulp Fiction") >>> { ... film: bloom.format_hash(film) for film in not_present_films ... } # doctest: +NORMALIZE_WHITESPACE {'The Godfather': '00000101', 'Interstellar': '00000011', 'Parasite': '00010010', 'Pulp Fiction': '10000100'} >>> any(film in bloom for film in not_present_films) False but sometimes there are false positives: >>> "Ratatouille" in bloom True >>> bloom.format_hash("Ratatouille") '01100000' The probability increases with the number of elements added. The probability decreases with the number of bits in the bitarray. >>> bloom.estimated_error_rate 0.140625 >>> bloom.add("The Godfather") >>> bloom.estimated_error_rate 0.25 >>> bloom.bitstring '01100101' """ from hashlib import md5, sha256 HASH_FUNCTIONS = (sha256, md5) class Bloom: def __init__(self, size: int = 8) -> None: self.bitarray = 0b0 self.size = size def add(self, value: str) -> None: h = self.hash_(value) self.bitarray |= h def exists(self, value: str) -> bool: h = self.hash_(value) return (h & self.bitarray) == h def __contains__(self, other: str) -> bool: return self.exists(other) def format_bin(self, bitarray: int) -> str: res = bin(bitarray)[2:] return res.zfill(self.size) @property def bitstring(self) -> str: return self.format_bin(self.bitarray) def hash_(self, value: str) -> int: res = 0b0 for func in HASH_FUNCTIONS: position = ( int.from_bytes(func(value.encode()).digest(), "little") % self.size ) res |= 2**position return res def format_hash(self, value: str) -> str: return self.format_bin(self.hash_(value)) @property def estimated_error_rate(self) -> float: n_ones = bin(self.bitarray).count("1") return (n_ones / self.size) ** len(HASH_FUNCTIONS) ================================================ FILE: data_structures/hashing/double_hash.py ================================================ #!/usr/bin/env python3 """ Double hashing is a collision resolving technique in Open Addressed Hash tables. Double hashing uses the idea of applying a second hash function to key when a collision occurs. The advantage of Double hashing is that it is one of the best form of probing, producing a uniform distribution of records throughout a hash table. This technique does not yield any clusters. It is one of effective method for resolving collisions. Double hashing can be done using: (hash1(key) + i * hash2(key)) % TABLE_SIZE Where hash1() and hash2() are hash functions and TABLE_SIZE is size of hash table. Reference: https://en.wikipedia.org/wiki/Double_hashing """ from .hash_table import HashTable from .number_theory.prime_numbers import is_prime, next_prime class DoubleHash(HashTable): """ Hash Table example with open addressing and Double Hash """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def __hash_function_2(self, value, data): next_prime_gt = ( next_prime(value % self.size_table) if not is_prime(value % self.size_table) else value % self.size_table ) # gt = bigger than return next_prime_gt - (data % next_prime_gt) def __hash_double_function(self, key, data, increment): return (increment * self.__hash_function_2(key, data)) % self.size_table def _collision_resolution(self, key, data=None): """ Examples: 1. Try to add three data elements when the size is three >>> dh = DoubleHash(3) >>> dh.insert_data(10) >>> dh.insert_data(20) >>> dh.insert_data(30) >>> dh.keys() {1: 10, 2: 20, 0: 30} 2. Try to add three data elements when the size is two >>> dh = DoubleHash(2) >>> dh.insert_data(10) >>> dh.insert_data(20) >>> dh.insert_data(30) >>> dh.keys() {10: 10, 9: 20, 8: 30} 3. Try to add three data elements when the size is four >>> dh = DoubleHash(4) >>> dh.insert_data(10) >>> dh.insert_data(20) >>> dh.insert_data(30) >>> dh.keys() {9: 20, 10: 10, 8: 30} """ i = 1 new_key = self.hash_function(data) while self.values[new_key] is not None and self.values[new_key] != key: new_key = ( self.__hash_double_function(key, data, i) if self.balanced_factor() >= self.lim_charge else None ) if new_key is None: break else: i += 1 return new_key if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/hashing/hash_map.py ================================================ """ Hash map with open addressing. https://en.wikipedia.org/wiki/Hash_table Another hash map implementation, with a good explanation. Modern Dictionaries by Raymond Hettinger https://www.youtube.com/watch?v=p33CVV29OG8 """ from collections.abc import Iterator, MutableMapping from dataclasses import dataclass from typing import TypeVar KEY = TypeVar("KEY") VAL = TypeVar("VAL") @dataclass(slots=True) class _Item[KEY, VAL]: key: KEY val: VAL class _DeletedItem(_Item): def __init__(self) -> None: super().__init__(None, None) def __bool__(self) -> bool: return False _deleted = _DeletedItem() class HashMap(MutableMapping[KEY, VAL]): """ Hash map with open addressing. """ def __init__( self, initial_block_size: int = 8, capacity_factor: float = 0.75 ) -> None: self._initial_block_size = initial_block_size self._buckets: list[_Item | None] = [None] * initial_block_size assert 0.0 < capacity_factor < 1.0 self._capacity_factor = capacity_factor self._len = 0 def _get_bucket_index(self, key: KEY) -> int: return hash(key) % len(self._buckets) def _get_next_ind(self, ind: int) -> int: """ Get next index. Implements linear open addressing. >>> HashMap(5)._get_next_ind(3) 4 >>> HashMap(5)._get_next_ind(5) 1 >>> HashMap(5)._get_next_ind(6) 2 >>> HashMap(5)._get_next_ind(9) 0 """ return (ind + 1) % len(self._buckets) def _try_set(self, ind: int, key: KEY, val: VAL) -> bool: """ Try to add value to the bucket. If bucket is empty or key is the same, does insert and return True. If bucket has another key that means that we need to check next bucket. """ stored = self._buckets[ind] if not stored: # A falsy item means that bucket was never used (None) # or was deleted (_deleted). self._buckets[ind] = _Item(key, val) self._len += 1 return True elif stored.key == key: stored.val = val return True else: return False def _is_full(self) -> bool: """ Return true if we have reached safe capacity. So we need to increase the number of buckets to avoid collisions. >>> hm = HashMap(2) >>> hm._add_item(1, 10) >>> hm._add_item(2, 20) >>> hm._is_full() True >>> HashMap(2)._is_full() False """ limit = len(self._buckets) * self._capacity_factor return len(self) >= int(limit) def _is_sparse(self) -> bool: """Return true if we need twice fewer buckets when we have now.""" if len(self._buckets) <= self._initial_block_size: return False limit = len(self._buckets) * self._capacity_factor / 2 return len(self) < limit def _resize(self, new_size: int) -> None: old_buckets = self._buckets self._buckets = [None] * new_size self._len = 0 for item in old_buckets: if item: self._add_item(item.key, item.val) def _size_up(self) -> None: self._resize(len(self._buckets) * 2) def _size_down(self) -> None: self._resize(len(self._buckets) // 2) def _iterate_buckets(self, key: KEY) -> Iterator[int]: ind = self._get_bucket_index(key) for _ in range(len(self._buckets)): yield ind ind = self._get_next_ind(ind) def _add_item(self, key: KEY, val: VAL) -> None: """ Try to add 3 elements when the size is 5 >>> hm = HashMap(5) >>> hm._add_item(1, 10) >>> hm._add_item(2, 20) >>> hm._add_item(3, 30) >>> hm HashMap(1: 10, 2: 20, 3: 30) Try to add 3 elements when the size is 5 >>> hm = HashMap(5) >>> hm._add_item(-5, 10) >>> hm._add_item(6, 30) >>> hm._add_item(-7, 20) >>> hm HashMap(-5: 10, 6: 30, -7: 20) Try to add 3 elements when size is 1 >>> hm = HashMap(1) >>> hm._add_item(10, 13.2) >>> hm._add_item(6, 5.26) >>> hm._add_item(7, 5.155) >>> hm HashMap(10: 13.2) Trying to add an element with a key that is a floating point value >>> hm = HashMap(5) >>> hm._add_item(1.5, 10) >>> hm HashMap(1.5: 10) 5. Trying to add an item with the same key >>> hm = HashMap(5) >>> hm._add_item(1, 10) >>> hm._add_item(1, 20) >>> hm HashMap(1: 20) """ for ind in self._iterate_buckets(key): if self._try_set(ind, key, val): break def __setitem__(self, key: KEY, val: VAL) -> None: """ 1. Changing value of item whose key is present >>> hm = HashMap(5) >>> hm._add_item(1, 10) >>> hm.__setitem__(1, 20) >>> hm HashMap(1: 20) 2. Changing value of item whose key is not present >>> hm = HashMap(5) >>> hm._add_item(1, 10) >>> hm.__setitem__(0, 20) >>> hm HashMap(0: 20, 1: 10) 3. Changing the value of the same item multiple times >>> hm = HashMap(5) >>> hm._add_item(1, 10) >>> hm.__setitem__(1, 20) >>> hm.__setitem__(1, 30) >>> hm HashMap(1: 30) """ if self._is_full(): self._size_up() self._add_item(key, val) def __delitem__(self, key: KEY) -> None: """ >>> hm = HashMap(5) >>> hm._add_item(1, 10) >>> hm._add_item(2, 20) >>> hm._add_item(3, 30) >>> hm.__delitem__(3) >>> hm HashMap(1: 10, 2: 20) >>> hm = HashMap(5) >>> hm._add_item(-5, 10) >>> hm._add_item(6, 30) >>> hm._add_item(-7, 20) >>> hm.__delitem__(-5) >>> hm HashMap(6: 30, -7: 20) # Trying to remove a non-existing item >>> hm = HashMap(5) >>> hm._add_item(1, 10) >>> hm._add_item(2, 20) >>> hm._add_item(3, 30) >>> hm.__delitem__(4) Traceback (most recent call last): ... KeyError: 4 # Test resize down when sparse ## Setup: resize up >>> hm = HashMap(initial_block_size=100, capacity_factor=0.75) >>> len(hm._buckets) 100 >>> for i in range(75): ... hm[i] = i >>> len(hm._buckets) 100 >>> hm[75] = 75 >>> len(hm._buckets) 200 ## Resize down >>> del hm[75] >>> len(hm._buckets) 200 >>> del hm[74] >>> len(hm._buckets) 100 """ for ind in self._iterate_buckets(key): item = self._buckets[ind] if item is None: raise KeyError(key) if item is _deleted: continue if item.key == key: self._buckets[ind] = _deleted self._len -= 1 break if self._is_sparse(): self._size_down() def __getitem__(self, key: KEY) -> VAL: """ Returns the item at the given key >>> hm = HashMap(5) >>> hm._add_item(1, 10) >>> hm.__getitem__(1) 10 >>> hm = HashMap(5) >>> hm._add_item(10, -10) >>> hm._add_item(20, -20) >>> hm.__getitem__(20) -20 >>> hm = HashMap(5) >>> hm._add_item(-1, 10) >>> hm.__getitem__(-1) 10 """ for ind in self._iterate_buckets(key): item = self._buckets[ind] if item is None: break if item is _deleted: continue if item.key == key: return item.val raise KeyError(key) def __len__(self) -> int: """ Returns the number of items present in hashmap >>> hm = HashMap(5) >>> hm._add_item(1, 10) >>> hm._add_item(2, 20) >>> hm._add_item(3, 30) >>> hm.__len__() 3 >>> hm = HashMap(5) >>> hm.__len__() 0 """ return self._len def __iter__(self) -> Iterator[KEY]: yield from (item.key for item in self._buckets if item) def __repr__(self) -> str: val_string = ", ".join( f"{item.key}: {item.val}" for item in self._buckets if item ) return f"HashMap({val_string})" if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/hashing/hash_table.py ================================================ #!/usr/bin/env python3 from abc import abstractmethod from .number_theory.prime_numbers import next_prime class HashTable: """ Basic Hash Table example with open addressing and linear probing """ def __init__( self, size_table: int, charge_factor: int | None = None, lim_charge: float | None = None, ) -> None: self.size_table = size_table self.values = [None] * self.size_table self.lim_charge = 0.75 if lim_charge is None else lim_charge self.charge_factor = 1 if charge_factor is None else charge_factor self.__aux_list: list = [] self._keys: dict = {} def keys(self): """ The keys function returns a dictionary containing the key value pairs. key being the index number in hash table and value being the data value. Examples: 1. creating HashTable with size 10 and inserting 3 elements >>> ht = HashTable(10) >>> ht.insert_data(10) >>> ht.insert_data(20) >>> ht.insert_data(30) >>> ht.keys() {0: 10, 1: 20, 2: 30} 2. creating HashTable with size 5 and inserting 5 elements >>> ht = HashTable(5) >>> ht.insert_data(5) >>> ht.insert_data(4) >>> ht.insert_data(3) >>> ht.insert_data(2) >>> ht.insert_data(1) >>> ht.keys() {0: 5, 4: 4, 3: 3, 2: 2, 1: 1} """ return self._keys def balanced_factor(self): return sum(1 for slot in self.values if slot is not None) / ( self.size_table * self.charge_factor ) def hash_function(self, key): """ Generates hash for the given key value Examples: Creating HashTable with size 5 >>> ht = HashTable(5) >>> ht.hash_function(10) 0 >>> ht.hash_function(20) 0 >>> ht.hash_function(4) 4 >>> ht.hash_function(18) 3 >>> ht.hash_function(-18) 2 >>> ht.hash_function(18.5) 3.5 >>> ht.hash_function(0) 0 >>> ht.hash_function(-0) 0 """ return key % self.size_table def _step_by_step(self, step_ord): print(f"step {step_ord}") print(list(range(len(self.values)))) print(self.values) def bulk_insert(self, values): """ bulk_insert is used for entering more than one element at a time in the HashTable. Examples: 1. >>> ht = HashTable(5) >>> ht.bulk_insert((10,20,30)) step 1 [0, 1, 2, 3, 4] [10, None, None, None, None] step 2 [0, 1, 2, 3, 4] [10, 20, None, None, None] step 3 [0, 1, 2, 3, 4] [10, 20, 30, None, None] 2. >>> ht = HashTable(5) >>> ht.bulk_insert([5,4,3,2,1]) step 1 [0, 1, 2, 3, 4] [5, None, None, None, None] step 2 [0, 1, 2, 3, 4] [5, None, None, None, 4] step 3 [0, 1, 2, 3, 4] [5, None, None, 3, 4] step 4 [0, 1, 2, 3, 4] [5, None, 2, 3, 4] step 5 [0, 1, 2, 3, 4] [5, 1, 2, 3, 4] """ i = 1 self.__aux_list = values for value in values: self.insert_data(value) self._step_by_step(i) i += 1 def _set_value(self, key, data): """ _set_value functions allows to update value at a particular hash Examples: 1. _set_value in HashTable of size 5 >>> ht = HashTable(5) >>> ht.insert_data(10) >>> ht.insert_data(20) >>> ht.insert_data(30) >>> ht._set_value(0,15) >>> ht.keys() {0: 15, 1: 20, 2: 30} 2. _set_value in HashTable of size 2 >>> ht = HashTable(2) >>> ht.insert_data(17) >>> ht.insert_data(18) >>> ht.insert_data(99) >>> ht._set_value(3,15) >>> ht.keys() {3: 15, 2: 17, 4: 99} 3. _set_value in HashTable when hash is not present >>> ht = HashTable(2) >>> ht.insert_data(17) >>> ht.insert_data(18) >>> ht.insert_data(99) >>> ht._set_value(0,15) >>> ht.keys() {3: 18, 2: 17, 4: 99, 0: 15} 4. _set_value in HashTable when multiple hash are not present >>> ht = HashTable(2) >>> ht.insert_data(17) >>> ht.insert_data(18) >>> ht.insert_data(99) >>> ht._set_value(0,15) >>> ht._set_value(1,20) >>> ht.keys() {3: 18, 2: 17, 4: 99, 0: 15, 1: 20} """ self.values[key] = data self._keys[key] = data @abstractmethod def _collision_resolution(self, key, data=None): """ This method is a type of open addressing which is used for handling collision. In this implementation the concept of linear probing has been used. The hash table is searched sequentially from the original location of the hash, if the new hash/location we get is already occupied we check for the next hash/location. references: - https://en.wikipedia.org/wiki/Linear_probing Examples: 1. The collision will be with keys 18 & 99, so new hash will be created for 99 >>> ht = HashTable(3) >>> ht.insert_data(17) >>> ht.insert_data(18) >>> ht.insert_data(99) >>> ht.keys() {2: 17, 0: 18, 1: 99} 2. The collision will be with keys 17 & 101, so new hash will be created for 101 >>> ht = HashTable(4) >>> ht.insert_data(17) >>> ht.insert_data(18) >>> ht.insert_data(99) >>> ht.insert_data(101) >>> ht.keys() {1: 17, 2: 18, 3: 99, 0: 101} 2. The collision will be with all keys, so new hash will be created for all >>> ht = HashTable(1) >>> ht.insert_data(17) >>> ht.insert_data(18) >>> ht.insert_data(99) >>> ht.keys() {2: 17, 3: 18, 4: 99} 3. Trying to insert float key in hash >>> ht = HashTable(1) >>> ht.insert_data(17) >>> ht.insert_data(18) >>> ht.insert_data(99.99) Traceback (most recent call last): ... TypeError: list indices must be integers or slices, not float """ new_key = self.hash_function(key + 1) while self.values[new_key] is not None and self.values[new_key] != key: if self.values.count(None) > 0: new_key = self.hash_function(new_key + 1) else: new_key = None break return new_key def rehashing(self): survivor_values = [value for value in self.values if value is not None] self.size_table = next_prime(self.size_table, factor=2) self._keys.clear() self.values = [None] * self.size_table # hell's pointers D: don't DRY ;/ for value in survivor_values: self.insert_data(value) def insert_data(self, data): """ insert_data is used for inserting a single element at a time in the HashTable. Examples: >>> ht = HashTable(3) >>> ht.insert_data(5) >>> ht.keys() {2: 5} >>> ht = HashTable(5) >>> ht.insert_data(30) >>> ht.insert_data(50) >>> ht.keys() {0: 30, 1: 50} """ key = self.hash_function(data) if self.values[key] is None: self._set_value(key, data) elif self.values[key] == data: pass else: collision_resolution = self._collision_resolution(key, data) if collision_resolution is not None: self._set_value(collision_resolution, data) else: self.rehashing() self.insert_data(data) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/hashing/hash_table_with_linked_list.py ================================================ from collections import deque from .hash_table import HashTable class HashTableWithLinkedList(HashTable): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def _set_value(self, key, data): self.values[key] = deque() if self.values[key] is None else self.values[key] self.values[key].appendleft(data) self._keys[key] = self.values[key] def balanced_factor(self): return ( sum(self.charge_factor - len(slot) for slot in self.values) / self.size_table * self.charge_factor ) def _collision_resolution(self, key, data=None): if not ( len(self.values[key]) == self.charge_factor and self.values.count(None) == 0 ): return key return super()._collision_resolution(key, data) ================================================ FILE: data_structures/hashing/number_theory/__init__.py ================================================ ================================================ FILE: data_structures/hashing/number_theory/prime_numbers.py ================================================ #!/usr/bin/env python3 """ module to operations with prime numbers """ import math def is_prime(number: int) -> bool: """Checks to see if a number is a prime in O(sqrt(n)). A number is prime if it has exactly two factors: 1 and itself. >>> is_prime(0) False >>> is_prime(1) False >>> is_prime(2) True >>> is_prime(3) True >>> is_prime(27) False >>> is_prime(87) False >>> is_prime(563) True >>> is_prime(2999) True >>> is_prime(67483) False """ # precondition assert isinstance(number, int) and (number >= 0), ( "'number' must been an int and positive" ) if 1 < number < 4: # 2 and 3 are primes return True elif number < 2 or not number % 2: # Negatives, 0, 1 and all even numbers are not primes return False odd_numbers = range(3, int(math.sqrt(number) + 1), 2) return not any(not number % i for i in odd_numbers) def next_prime(value, factor=1, **kwargs): value = factor * value first_value_val = value while not is_prime(value): value += 1 if not ("desc" in kwargs and kwargs["desc"] is True) else -1 if value == first_value_val: return next_prime(value + 1, **kwargs) return value ================================================ FILE: data_structures/hashing/quadratic_probing.py ================================================ #!/usr/bin/env python3 from .hash_table import HashTable class QuadraticProbing(HashTable): """ Basic Hash Table example with open addressing using Quadratic Probing """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def _collision_resolution(self, key, data=None): # noqa: ARG002 """ Quadratic probing is an open addressing scheme used for resolving collisions in hash table. It works by taking the original hash index and adding successive values of an arbitrary quadratic polynomial until open slot is found. Hash + 1², Hash + 2², Hash + 3² .... Hash + n² reference: - https://en.wikipedia.org/wiki/Quadratic_probing e.g: 1. Create hash table with size 7 >>> qp = QuadraticProbing(7) >>> qp.insert_data(90) >>> qp.insert_data(340) >>> qp.insert_data(24) >>> qp.insert_data(45) >>> qp.insert_data(99) >>> qp.insert_data(73) >>> qp.insert_data(7) >>> qp.keys() {11: 45, 14: 99, 7: 24, 0: 340, 5: 73, 6: 90, 8: 7} 2. Create hash table with size 8 >>> qp = QuadraticProbing(8) >>> qp.insert_data(0) >>> qp.insert_data(999) >>> qp.insert_data(111) >>> qp.keys() {0: 0, 7: 999, 3: 111} 3. Try to add three data elements when the size is two >>> qp = QuadraticProbing(2) >>> qp.insert_data(0) >>> qp.insert_data(999) >>> qp.insert_data(111) >>> qp.keys() {0: 0, 4: 999, 1: 111} 4. Try to add three data elements when the size is one >>> qp = QuadraticProbing(1) >>> qp.insert_data(0) >>> qp.insert_data(999) >>> qp.insert_data(111) >>> qp.keys() {4: 999, 1: 111} """ i = 1 new_key = self.hash_function(key + i * i) while self.values[new_key] is not None and self.values[new_key] != key: i += 1 new_key = ( self.hash_function(key + i * i) if not self.balanced_factor() >= self.lim_charge else None ) if new_key is None: break return new_key if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/hashing/tests/__init__.py ================================================ ================================================ FILE: data_structures/hashing/tests/test_hash_map.py ================================================ from operator import delitem, getitem, setitem import pytest from data_structures.hashing.hash_map import HashMap def _get(k): return getitem, k def _set(k, v): return setitem, k, v def _del(k): return delitem, k def _run_operation(obj, fun, *args): try: return fun(obj, *args), None except Exception as e: return None, e _add_items = ( _set("key_a", "val_a"), _set("key_b", "val_b"), ) _overwrite_items = [ _set("key_a", "val_a"), _set("key_a", "val_b"), ] _delete_items = [ _set("key_a", "val_a"), _set("key_b", "val_b"), _del("key_a"), _del("key_b"), _set("key_a", "val_a"), _del("key_a"), ] _access_absent_items = [ _get("key_a"), _del("key_a"), _set("key_a", "val_a"), _del("key_a"), _del("key_a"), _get("key_a"), ] _add_with_resize_up = [ *[_set(x, x) for x in range(5)], # guaranteed upsize ] _add_with_resize_down = [ *[_set(x, x) for x in range(5)], # guaranteed upsize *[_del(x) for x in range(5)], _set("key_a", "val_b"), ] @pytest.mark.parametrize( "operations", [ pytest.param(_add_items, id="add items"), pytest.param(_overwrite_items, id="overwrite items"), pytest.param(_delete_items, id="delete items"), pytest.param(_access_absent_items, id="access absent items"), pytest.param(_add_with_resize_up, id="add with resize up"), pytest.param(_add_with_resize_down, id="add with resize down"), ], ) def test_hash_map_is_the_same_as_dict(operations): my = HashMap(initial_block_size=4) py = {} for _, (fun, *args) in enumerate(operations): my_res, my_exc = _run_operation(my, fun, *args) py_res, py_exc = _run_operation(py, fun, *args) assert my_res == py_res assert str(my_exc) == str(py_exc) assert set(py) == set(my) assert len(py) == len(my) assert set(my.items()) == set(py.items()) def test_no_new_methods_was_added_to_api(): def is_public(name: str) -> bool: return not name.startswith("_") dict_public_names = {name for name in dir({}) if is_public(name)} hash_public_names = {name for name in dir(HashMap()) if is_public(name)} assert dict_public_names > hash_public_names ================================================ FILE: data_structures/heap/__init__.py ================================================ ================================================ FILE: data_structures/heap/binomial_heap.py ================================================ """ Binomial Heap Reference: Advanced Data Structures, Peter Brass """ class Node: """ Node in a doubly-linked binomial tree, containing: - value - size of left subtree - link to left, right and parent nodes """ def __init__(self, val): self.val = val # Number of nodes in left subtree self.left_tree_size = 0 self.left = None self.right = None self.parent = None def merge_trees(self, other): """ In-place merge of two binomial trees of equal size. Returns the root of the resulting tree """ assert self.left_tree_size == other.left_tree_size, "Unequal Sizes of Blocks" if self.val < other.val: other.left = self.right other.parent = None if self.right: self.right.parent = other self.right = other self.left_tree_size = self.left_tree_size * 2 + 1 return self else: self.left = other.right self.parent = None if other.right: other.right.parent = self other.right = self other.left_tree_size = other.left_tree_size * 2 + 1 return other class BinomialHeap: r""" Min-oriented priority queue implemented with the Binomial Heap data structure implemented with the BinomialHeap class. It supports: - Insert element in a heap with n elements: Guaranteed logn, amoratized 1 - Merge (meld) heaps of size m and n: O(logn + logm) - Delete Min: O(logn) - Peek (return min without deleting it): O(1) Example: Create a random permutation of 30 integers to be inserted and 19 of them deleted >>> import numpy as np >>> permutation = np.random.permutation(list(range(30))) Create a Heap and insert the 30 integers __init__() test >>> first_heap = BinomialHeap() 30 inserts - insert() test >>> for number in permutation: ... first_heap.insert(number) Size test >>> first_heap.size 30 Deleting - delete() test >>> [int(first_heap.delete_min()) for _ in range(20)] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] Create a new Heap >>> second_heap = BinomialHeap() >>> vals = [17, 20, 31, 34] >>> for value in vals: ... second_heap.insert(value) The heap should have the following structure: 17 / \ # 31 / \ 20 34 / \ / \ # # # # preOrder() test >>> " ".join(str(x) for x in second_heap.pre_order()) "(17, 0) ('#', 1) (31, 1) (20, 2) ('#', 3) ('#', 3) (34, 2) ('#', 3) ('#', 3)" printing Heap - __str__() test >>> print(second_heap) 17 -# -31 --20 ---# ---# --34 ---# ---# mergeHeaps() test >>> >>> merged = second_heap.merge_heaps(first_heap) >>> merged.peek() 17 values in merged heap; (merge is inplace) >>> results = [] >>> while not first_heap.is_empty(): ... results.append(int(first_heap.delete_min())) >>> results [17, 20, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 31, 34] """ def __init__(self, bottom_root=None, min_node=None, heap_size=0): self.size = heap_size self.bottom_root = bottom_root self.min_node = min_node def merge_heaps(self, other): """ In-place merge of two binomial heaps. Both of them become the resulting merged heap """ # Empty heaps corner cases if other.size == 0: return None if self.size == 0: self.size = other.size self.bottom_root = other.bottom_root self.min_node = other.min_node return None # Update size self.size = self.size + other.size # Update min.node if self.min_node.val > other.min_node.val: self.min_node = other.min_node # Merge # Order roots by left_subtree_size combined_roots_list = [] i, j = self.bottom_root, other.bottom_root while i or j: if i and ((not j) or i.left_tree_size < j.left_tree_size): combined_roots_list.append((i, True)) i = i.parent else: combined_roots_list.append((j, False)) j = j.parent # Insert links between them for i in range(len(combined_roots_list) - 1): if combined_roots_list[i][1] != combined_roots_list[i + 1][1]: combined_roots_list[i][0].parent = combined_roots_list[i + 1][0] combined_roots_list[i + 1][0].left = combined_roots_list[i][0] # Consecutively merge roots with same left_tree_size i = combined_roots_list[0][0] while i.parent: if ( (i.left_tree_size == i.parent.left_tree_size) and (not i.parent.parent) ) or ( i.left_tree_size == i.parent.left_tree_size and i.left_tree_size != i.parent.parent.left_tree_size ): # Neighbouring Nodes previous_node = i.left next_node = i.parent.parent # Merging trees i = i.merge_trees(i.parent) # Updating links i.left = previous_node i.parent = next_node if previous_node: previous_node.parent = i if next_node: next_node.left = i else: i = i.parent # Updating self.bottom_root while i.left: i = i.left self.bottom_root = i # Update other other.size = self.size other.bottom_root = self.bottom_root other.min_node = self.min_node # Return the merged heap return self def insert(self, val): """ insert a value in the heap """ if self.size == 0: self.bottom_root = Node(val) self.size = 1 self.min_node = self.bottom_root else: # Create new node new_node = Node(val) # Update size self.size += 1 # update min_node if val < self.min_node.val: self.min_node = new_node # Put new_node as a bottom_root in heap self.bottom_root.left = new_node new_node.parent = self.bottom_root self.bottom_root = new_node # Consecutively merge roots with same left_tree_size while ( self.bottom_root.parent and self.bottom_root.left_tree_size == self.bottom_root.parent.left_tree_size ): # Next node next_node = self.bottom_root.parent.parent # Merge self.bottom_root = self.bottom_root.merge_trees(self.bottom_root.parent) # Update Links self.bottom_root.parent = next_node self.bottom_root.left = None if next_node: next_node.left = self.bottom_root def peek(self): """ return min element without deleting it """ return self.min_node.val def is_empty(self): return self.size == 0 def delete_min(self): """ delete min element and return it """ # assert not self.isEmpty(), "Empty Heap" # Save minimal value min_value = self.min_node.val # Last element in heap corner case if self.size == 1: # Update size self.size = 0 # Update bottom root self.bottom_root = None # Update min_node self.min_node = None return min_value # No right subtree corner case # The structure of the tree implies that this should be the bottom root # and there is at least one other root if self.min_node.right is None: # Update size self.size -= 1 # Update bottom root self.bottom_root = self.bottom_root.parent self.bottom_root.left = None # Update min_node self.min_node = self.bottom_root i = self.bottom_root.parent while i: if i.val < self.min_node.val: self.min_node = i i = i.parent return min_value # General case # Find the BinomialHeap of the right subtree of min_node bottom_of_new = self.min_node.right bottom_of_new.parent = None min_of_new = bottom_of_new size_of_new = 1 # Size, min_node and bottom_root while bottom_of_new.left: size_of_new = size_of_new * 2 + 1 bottom_of_new = bottom_of_new.left if bottom_of_new.val < min_of_new.val: min_of_new = bottom_of_new # Corner case of single root on top left path if (not self.min_node.left) and (not self.min_node.parent): self.size = size_of_new self.bottom_root = bottom_of_new self.min_node = min_of_new # print("Single root, multiple nodes case") return min_value # Remaining cases # Construct heap of right subtree new_heap = BinomialHeap( bottom_root=bottom_of_new, min_node=min_of_new, heap_size=size_of_new ) # Update size self.size = self.size - 1 - size_of_new # Neighbour nodes previous_node = self.min_node.left next_node = self.min_node.parent # Initialize new bottom_root and min_node self.min_node = previous_node or next_node self.bottom_root = next_node # Update links of previous_node and search below for new min_node and # bottom_root if previous_node: previous_node.parent = next_node # Update bottom_root and search for min_node below self.bottom_root = previous_node self.min_node = previous_node while self.bottom_root.left: self.bottom_root = self.bottom_root.left if self.bottom_root.val < self.min_node.val: self.min_node = self.bottom_root if next_node: next_node.left = previous_node # Search for new min_node above min_node i = next_node while i: if i.val < self.min_node.val: self.min_node = i i = i.parent # Merge heaps self.merge_heaps(new_heap) return int(min_value) def pre_order(self): """ Returns the Pre-order representation of the heap including values of nodes plus their level distance from the root; Empty nodes appear as # """ # Find top root top_root = self.bottom_root while top_root.parent: top_root = top_root.parent # preorder heap_pre_order = [] self.__traversal(top_root, heap_pre_order) return heap_pre_order def __traversal(self, curr_node, preorder, level=0): """ Pre-order traversal of nodes """ if curr_node: preorder.append((curr_node.val, level)) self.__traversal(curr_node.left, preorder, level + 1) self.__traversal(curr_node.right, preorder, level + 1) else: preorder.append(("#", level)) def __str__(self): """ Overwriting str for a pre-order print of nodes in heap; Performance is poor, so use only for small examples """ if self.is_empty(): return "" preorder_heap = self.pre_order() return "\n".join(("-" * level + str(value)) for value, level in preorder_heap) # Unit Tests if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/heap/heap.py ================================================ from __future__ import annotations from abc import abstractmethod from collections.abc import Iterable from typing import Protocol, TypeVar class Comparable(Protocol): @abstractmethod def __lt__(self: T, other: T) -> bool: pass @abstractmethod def __gt__(self: T, other: T) -> bool: pass @abstractmethod def __eq__(self: T, other: object) -> bool: pass T = TypeVar("T", bound=Comparable) class Heap[T: Comparable]: """A Max Heap Implementation >>> unsorted = [103, 9, 1, 7, 11, 15, 25, 201, 209, 107, 5] >>> h = Heap() >>> h.build_max_heap(unsorted) >>> h [209, 201, 25, 103, 107, 15, 1, 9, 7, 11, 5] >>> >>> h.extract_max() 209 >>> h [201, 107, 25, 103, 11, 15, 1, 9, 7, 5] >>> >>> h.insert(100) >>> h [201, 107, 25, 103, 100, 15, 1, 9, 7, 5, 11] >>> >>> h.heap_sort() >>> h [1, 5, 7, 9, 11, 15, 25, 100, 103, 107, 201] """ def __init__(self) -> None: self.h: list[T] = [] self.heap_size: int = 0 def __repr__(self) -> str: return str(self.h) def parent_index(self, child_idx: int) -> int | None: """ returns the parent index based on the given child index >>> h = Heap() >>> h.build_max_heap([103, 9, 1, 7, 11, 15, 25, 201, 209, 107, 5]) >>> h [209, 201, 25, 103, 107, 15, 1, 9, 7, 11, 5] >>> h.parent_index(-1) # returns none if index is <=0 >>> h.parent_index(0) # returns none if index is <=0 >>> h.parent_index(1) 0 >>> h.parent_index(2) 0 >>> h.parent_index(3) 1 >>> h.parent_index(4) 1 >>> h.parent_index(5) 2 >>> h.parent_index(10.5) 4.0 >>> h.parent_index(209.0) 104.0 >>> h.parent_index("Test") Traceback (most recent call last): ... TypeError: '>' not supported between instances of 'str' and 'int' """ if child_idx > 0: return (child_idx - 1) // 2 return None def left_child_idx(self, parent_idx: int) -> int | None: """ return the left child index if the left child exists. if not, return None. """ left_child_index = 2 * parent_idx + 1 if left_child_index < self.heap_size: return left_child_index return None def right_child_idx(self, parent_idx: int) -> int | None: """ return the right child index if the right child exists. if not, return None. """ right_child_index = 2 * parent_idx + 2 if right_child_index < self.heap_size: return right_child_index return None def max_heapify(self, index: int) -> None: """ correct a single violation of the heap property in a subtree's root. It is the function that is responsible for restoring the property of Max heap i.e the maximum element is always at top. """ if index < self.heap_size: violation: int = index left_child = self.left_child_idx(index) right_child = self.right_child_idx(index) # check which child is larger than its parent if left_child is not None and self.h[left_child] > self.h[violation]: violation = left_child if right_child is not None and self.h[right_child] > self.h[violation]: violation = right_child # if violation indeed exists if violation != index: # swap to fix the violation self.h[violation], self.h[index] = self.h[index], self.h[violation] # fix the subsequent violation recursively if any self.max_heapify(violation) def build_max_heap(self, collection: Iterable[T]) -> None: """ build max heap from an unsorted array >>> h = Heap() >>> h.build_max_heap([20,40,50,20,10]) >>> h [50, 40, 20, 20, 10] >>> h = Heap() >>> h.build_max_heap([1,2,3,4,5,6,7,8,9,0]) >>> h [9, 8, 7, 4, 5, 6, 3, 2, 1, 0] >>> h = Heap() >>> h.build_max_heap([514,5,61,57,8,99,105]) >>> h [514, 57, 105, 5, 8, 99, 61] >>> h = Heap() >>> h.build_max_heap([514,5,61.6,57,8,9.9,105]) >>> h [514, 57, 105, 5, 8, 9.9, 61.6] """ self.h = list(collection) self.heap_size = len(self.h) if self.heap_size > 1: # max_heapify from right to left but exclude leaves (last level) for i in range(self.heap_size // 2 - 1, -1, -1): self.max_heapify(i) def extract_max(self) -> T: """ get and remove max from heap >>> h = Heap() >>> h.build_max_heap([20,40,50,20,10]) >>> h.extract_max() 50 >>> h = Heap() >>> h.build_max_heap([514,5,61,57,8,99,105]) >>> h.extract_max() 514 >>> h = Heap() >>> h.build_max_heap([1,2,3,4,5,6,7,8,9,0]) >>> h.extract_max() 9 """ if self.heap_size >= 2: me = self.h[0] self.h[0] = self.h.pop(-1) self.heap_size -= 1 self.max_heapify(0) return me elif self.heap_size == 1: self.heap_size -= 1 return self.h.pop(-1) else: raise Exception("Empty heap") def insert(self, value: T) -> None: """ insert a new value into the max heap >>> h = Heap() >>> h.insert(10) >>> h [10] >>> h = Heap() >>> h.insert(10) >>> h.insert(10) >>> h [10, 10] >>> h = Heap() >>> h.insert(10) >>> h.insert(10.1) >>> h [10.1, 10] >>> h = Heap() >>> h.insert(0.1) >>> h.insert(0) >>> h.insert(9) >>> h.insert(5) >>> h [9, 5, 0.1, 0] """ self.h.append(value) idx = (self.heap_size - 1) // 2 self.heap_size += 1 while idx >= 0: self.max_heapify(idx) idx = (idx - 1) // 2 def heap_sort(self) -> None: size = self.heap_size for j in range(size - 1, 0, -1): self.h[0], self.h[j] = self.h[j], self.h[0] self.heap_size -= 1 self.max_heapify(0) self.heap_size = size if __name__ == "__main__": import doctest # run doc test doctest.testmod() # demo for unsorted in [ [0], [2], [3, 5], [5, 3], [5, 5], [0, 0, 0, 0], [1, 1, 1, 1], [2, 2, 3, 5], [0, 2, 2, 3, 5], [2, 5, 3, 0, 2, 3, 0, 3], [6, 1, 2, 7, 9, 3, 4, 5, 10, 8], [103, 9, 1, 7, 11, 15, 25, 201, 209, 107, 5], [-45, -2, -5], ]: print(f"unsorted array: {unsorted}") heap: Heap[int] = Heap() heap.build_max_heap(unsorted) print(f"after build heap: {heap}") print(f"max value: {heap.extract_max()}") print(f"after max value removed: {heap}") heap.insert(100) print(f"after new value 100 inserted: {heap}") heap.heap_sort() print(f"heap-sorted array: {heap}\n") ================================================ FILE: data_structures/heap/heap_generic.py ================================================ from collections.abc import Callable class Heap: """ A generic Heap class, can be used as min or max by passing the key function accordingly. """ def __init__(self, key: Callable | None = None) -> None: # Stores actual heap items. self.arr: list = [] # Stores indexes of each item for supporting updates and deletion. self.pos_map: dict = {} # Stores current size of heap. self.size = 0 # Stores function used to evaluate the score of an item on which basis ordering # will be done. self.key = key or (lambda x: x) def _parent(self, i: int) -> int | None: """Returns parent index of given index if exists else None""" return int((i - 1) / 2) if i > 0 else None def _left(self, i: int) -> int | None: """Returns left-child-index of given index if exists else None""" left = int(2 * i + 1) return left if 0 < left < self.size else None def _right(self, i: int) -> int | None: """Returns right-child-index of given index if exists else None""" right = int(2 * i + 2) return right if 0 < right < self.size else None def _swap(self, i: int, j: int) -> None: """Performs changes required for swapping two elements in the heap""" # First update the indexes of the items in index map. self.pos_map[self.arr[i][0]], self.pos_map[self.arr[j][0]] = ( self.pos_map[self.arr[j][0]], self.pos_map[self.arr[i][0]], ) # Then swap the items in the list. self.arr[i], self.arr[j] = self.arr[j], self.arr[i] def _cmp(self, i: int, j: int) -> bool: """Compares the two items using default comparison""" return self.arr[i][1] < self.arr[j][1] def _get_valid_parent(self, i: int) -> int: """ Returns index of valid parent as per desired ordering among given index and both it's children """ left = self._left(i) right = self._right(i) valid_parent = i if left is not None and not self._cmp(left, valid_parent): valid_parent = left if right is not None and not self._cmp(right, valid_parent): valid_parent = right return valid_parent def _heapify_up(self, index: int) -> None: """Fixes the heap in upward direction of given index""" parent = self._parent(index) while parent is not None and not self._cmp(index, parent): self._swap(index, parent) index, parent = parent, self._parent(parent) def _heapify_down(self, index: int) -> None: """Fixes the heap in downward direction of given index""" valid_parent = self._get_valid_parent(index) while valid_parent != index: self._swap(index, valid_parent) index, valid_parent = valid_parent, self._get_valid_parent(valid_parent) def update_item(self, item: int, item_value: int) -> None: """Updates given item value in heap if present""" if item not in self.pos_map: return index = self.pos_map[item] self.arr[index] = [item, self.key(item_value)] # Make sure heap is right in both up and down direction. # Ideally only one of them will make any change. self._heapify_up(index) self._heapify_down(index) def delete_item(self, item: int) -> None: """Deletes given item from heap if present""" if item not in self.pos_map: return index = self.pos_map[item] del self.pos_map[item] self.arr[index] = self.arr[self.size - 1] self.pos_map[self.arr[self.size - 1][0]] = index self.size -= 1 # Make sure heap is right in both up and down direction. Ideally only one # of them will make any change- so no performance loss in calling both. if self.size > index: self._heapify_up(index) self._heapify_down(index) def insert_item(self, item: int, item_value: int) -> None: """Inserts given item with given value in heap""" arr_len = len(self.arr) if arr_len == self.size: self.arr.append([item, self.key(item_value)]) else: self.arr[self.size] = [item, self.key(item_value)] self.pos_map[item] = self.size self.size += 1 self._heapify_up(self.size - 1) def get_top(self) -> tuple | None: """Returns top item tuple (Calculated value, item) from heap if present""" return self.arr[0] if self.size else None def extract_top(self) -> tuple | None: """ Return top item tuple (Calculated value, item) from heap and removes it as well if present """ top_item_tuple = self.get_top() if top_item_tuple: self.delete_item(top_item_tuple[0]) return top_item_tuple def test_heap() -> None: """ >>> h = Heap() # Max-heap >>> h.insert_item(5, 34) >>> h.insert_item(6, 31) >>> h.insert_item(7, 37) >>> h.get_top() [7, 37] >>> h.extract_top() [7, 37] >>> h.extract_top() [5, 34] >>> h.extract_top() [6, 31] >>> h = Heap(key=lambda x: -x) # Min heap >>> h.insert_item(5, 34) >>> h.insert_item(6, 31) >>> h.insert_item(7, 37) >>> h.get_top() [6, -31] >>> h.extract_top() [6, -31] >>> h.extract_top() [5, -34] >>> h.extract_top() [7, -37] >>> h.insert_item(8, 45) >>> h.insert_item(9, 40) >>> h.insert_item(10, 50) >>> h.get_top() [9, -40] >>> h.update_item(10, 30) >>> h.get_top() [10, -30] >>> h.delete_item(10) >>> h.get_top() [9, -40] """ if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/heap/max_heap.py ================================================ class BinaryHeap: """ A max-heap implementation in Python >>> binary_heap = BinaryHeap() >>> binary_heap.insert(6) >>> binary_heap.insert(10) >>> binary_heap.insert(15) >>> binary_heap.insert(12) >>> binary_heap.pop() 15 >>> binary_heap.pop() 12 >>> binary_heap.get_list [10, 6] >>> len(binary_heap) 2 """ def __init__(self): self.__heap = [0] self.__size = 0 def __swap_up(self, i: int) -> None: """Swap the element up""" temporary = self.__heap[i] while i // 2 > 0: if self.__heap[i] > self.__heap[i // 2]: self.__heap[i] = self.__heap[i // 2] self.__heap[i // 2] = temporary i //= 2 def insert(self, value: int) -> None: """Insert new element""" self.__heap.append(value) self.__size += 1 self.__swap_up(self.__size) def __swap_down(self, i: int) -> None: """Swap the element down""" while self.__size >= 2 * i: if 2 * i + 1 > self.__size: # noqa: SIM114 bigger_child = 2 * i elif self.__heap[2 * i] > self.__heap[2 * i + 1]: bigger_child = 2 * i else: bigger_child = 2 * i + 1 temporary = self.__heap[i] if self.__heap[i] < self.__heap[bigger_child]: self.__heap[i] = self.__heap[bigger_child] self.__heap[bigger_child] = temporary i = bigger_child def pop(self) -> int: """Pop the root element""" max_value = self.__heap[1] self.__heap[1] = self.__heap[self.__size] self.__size -= 1 self.__heap.pop() self.__swap_down(1) return max_value @property def get_list(self): return self.__heap[1:] def __len__(self): """Length of the array""" return self.__size if __name__ == "__main__": import doctest doctest.testmod() # create an instance of BinaryHeap binary_heap = BinaryHeap() binary_heap.insert(6) binary_heap.insert(10) binary_heap.insert(15) binary_heap.insert(12) # pop root(max-values because it is max heap) print(binary_heap.pop()) # 15 print(binary_heap.pop()) # 12 # get the list and size after operations print(binary_heap.get_list) print(len(binary_heap)) ================================================ FILE: data_structures/heap/min_heap.py ================================================ # Min heap data structure # with decrease key functionality - in O(log(n)) time class Node: def __init__(self, name, val): self.name = name self.val = val def __str__(self): return f"{self.__class__.__name__}({self.name}, {self.val})" def __lt__(self, other): return self.val < other.val class MinHeap: """ >>> r = Node("R", -1) >>> b = Node("B", 6) >>> a = Node("A", 3) >>> x = Node("X", 1) >>> e = Node("E", 4) >>> print(b) Node(B, 6) >>> myMinHeap = MinHeap([r, b, a, x, e]) >>> myMinHeap.decrease_key(b, -17) >>> print(b) Node(B, -17) >>> myMinHeap["B"] -17 """ def __init__(self, array): self.idx_of_element = {} self.heap_dict = {} self.heap = self.build_heap(array) def __getitem__(self, key): return self.get_value(key) def get_parent_idx(self, idx): return (idx - 1) // 2 def get_left_child_idx(self, idx): return idx * 2 + 1 def get_right_child_idx(self, idx): return idx * 2 + 2 def get_value(self, key): return self.heap_dict[key] def build_heap(self, array): last_idx = len(array) - 1 start_from = self.get_parent_idx(last_idx) for idx, i in enumerate(array): self.idx_of_element[i] = idx self.heap_dict[i.name] = i.val for i in range(start_from, -1, -1): self.sift_down(i, array) return array # this is min-heapify method def sift_down(self, idx, array): while True: left = self.get_left_child_idx(idx) right = self.get_right_child_idx(idx) smallest = idx if left < len(array) and array[left] < array[idx]: smallest = left if right < len(array) and array[right] < array[smallest]: smallest = right if smallest != idx: array[idx], array[smallest] = array[smallest], array[idx] ( self.idx_of_element[array[idx]], self.idx_of_element[array[smallest]], ) = ( self.idx_of_element[array[smallest]], self.idx_of_element[array[idx]], ) idx = smallest else: break def sift_up(self, idx): p = self.get_parent_idx(idx) while p >= 0 and self.heap[p] > self.heap[idx]: self.heap[p], self.heap[idx] = self.heap[idx], self.heap[p] self.idx_of_element[self.heap[p]], self.idx_of_element[self.heap[idx]] = ( self.idx_of_element[self.heap[idx]], self.idx_of_element[self.heap[p]], ) idx = p p = self.get_parent_idx(idx) def peek(self): return self.heap[0] def remove(self): self.heap[0], self.heap[-1] = self.heap[-1], self.heap[0] self.idx_of_element[self.heap[0]], self.idx_of_element[self.heap[-1]] = ( self.idx_of_element[self.heap[-1]], self.idx_of_element[self.heap[0]], ) x = self.heap.pop() del self.idx_of_element[x] self.sift_down(0, self.heap) return x def insert(self, node): self.heap.append(node) self.idx_of_element[node] = len(self.heap) - 1 self.heap_dict[node.name] = node.val self.sift_up(len(self.heap) - 1) def is_empty(self): return len(self.heap) == 0 def decrease_key(self, node, new_value): assert self.heap[self.idx_of_element[node]].val > new_value, ( "newValue must be less that current value" ) node.val = new_value self.heap_dict[node.name] = new_value self.sift_up(self.idx_of_element[node]) # USAGE r = Node("R", -1) b = Node("B", 6) a = Node("A", 3) x = Node("X", 1) e = Node("E", 4) # Use one of these two ways to generate Min-Heap # Generating Min-Heap from array my_min_heap = MinHeap([r, b, a, x, e]) # Generating Min-Heap by Insert method # myMinHeap.insert(a) # myMinHeap.insert(b) # myMinHeap.insert(x) # myMinHeap.insert(r) # myMinHeap.insert(e) # Before print("Min Heap - before decrease key") for i in my_min_heap.heap: print(i) print("Min Heap - After decrease key of node [B -> -17]") my_min_heap.decrease_key(b, -17) # After for i in my_min_heap.heap: print(i) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/heap/randomized_heap.py ================================================ #!/usr/bin/env python3 from __future__ import annotations import random from collections.abc import Iterable from typing import Any, TypeVar T = TypeVar("T", bound=bool) class RandomizedHeapNode[T: bool]: """ One node of the randomized heap. Contains the value and references to two children. """ def __init__(self, value: T) -> None: self._value: T = value self.left: RandomizedHeapNode[T] | None = None self.right: RandomizedHeapNode[T] | None = None @property def value(self) -> T: """ Return the value of the node. >>> rhn = RandomizedHeapNode(10) >>> rhn.value 10 >>> rhn = RandomizedHeapNode(-10) >>> rhn.value -10 """ return self._value @staticmethod def merge( root1: RandomizedHeapNode[T] | None, root2: RandomizedHeapNode[T] | None ) -> RandomizedHeapNode[T] | None: """ Merge 2 nodes together. >>> rhn1 = RandomizedHeapNode(10) >>> rhn2 = RandomizedHeapNode(20) >>> RandomizedHeapNode.merge(rhn1, rhn2).value 10 >>> rhn1 = RandomizedHeapNode(20) >>> rhn2 = RandomizedHeapNode(10) >>> RandomizedHeapNode.merge(rhn1, rhn2).value 10 >>> rhn1 = RandomizedHeapNode(5) >>> rhn2 = RandomizedHeapNode(0) >>> RandomizedHeapNode.merge(rhn1, rhn2).value 0 """ if not root1: return root2 if not root2: return root1 if root1.value > root2.value: root1, root2 = root2, root1 if random.choice([True, False]): root1.left, root1.right = root1.right, root1.left root1.left = RandomizedHeapNode.merge(root1.left, root2) return root1 class RandomizedHeap[T: bool]: """ A data structure that allows inserting a new value and to pop the smallest values. Both operations take O(logN) time where N is the size of the structure. Wiki: https://en.wikipedia.org/wiki/Randomized_meldable_heap >>> RandomizedHeap([2, 3, 1, 5, 1, 7]).to_sorted_list() [1, 1, 2, 3, 5, 7] >>> rh = RandomizedHeap() >>> rh.pop() Traceback (most recent call last): ... IndexError: Can't get top element for the empty heap. >>> rh.insert(1) >>> rh.insert(-1) >>> rh.insert(0) >>> rh.to_sorted_list() [-1, 0, 1] """ def __init__(self, data: Iterable[T] | None = ()) -> None: """ >>> rh = RandomizedHeap([3, 1, 3, 7]) >>> rh.to_sorted_list() [1, 3, 3, 7] """ self._root: RandomizedHeapNode[T] | None = None if data: for item in data: self.insert(item) def insert(self, value: T) -> None: """ Insert the value into the heap. >>> rh = RandomizedHeap() >>> rh.insert(3) >>> rh.insert(1) >>> rh.insert(3) >>> rh.insert(7) >>> rh.to_sorted_list() [1, 3, 3, 7] """ self._root = RandomizedHeapNode.merge(self._root, RandomizedHeapNode(value)) def pop(self) -> T | None: """ Pop the smallest value from the heap and return it. >>> rh = RandomizedHeap([3, 1, 3, 7]) >>> rh.pop() 1 >>> rh.pop() 3 >>> rh.pop() 3 >>> rh.pop() 7 >>> rh.pop() Traceback (most recent call last): ... IndexError: Can't get top element for the empty heap. """ result = self.top() if self._root is None: return None self._root = RandomizedHeapNode.merge(self._root.left, self._root.right) return result def top(self) -> T: """ Return the smallest value from the heap. >>> rh = RandomizedHeap() >>> rh.insert(3) >>> rh.top() 3 >>> rh.insert(1) >>> rh.top() 1 >>> rh.insert(3) >>> rh.top() 1 >>> rh.insert(7) >>> rh.top() 1 """ if not self._root: raise IndexError("Can't get top element for the empty heap.") return self._root.value def clear(self) -> None: """ Clear the heap. >>> rh = RandomizedHeap([3, 1, 3, 7]) >>> rh.clear() >>> rh.pop() Traceback (most recent call last): ... IndexError: Can't get top element for the empty heap. """ self._root = None def to_sorted_list(self) -> list[Any]: """ Returns sorted list containing all the values in the heap. >>> rh = RandomizedHeap([3, 1, 3, 7]) >>> rh.to_sorted_list() [1, 3, 3, 7] """ result = [] while self: result.append(self.pop()) return result def __bool__(self) -> bool: """ Check if the heap is not empty. >>> rh = RandomizedHeap() >>> bool(rh) False >>> rh.insert(1) >>> bool(rh) True >>> rh.clear() >>> bool(rh) False """ return self._root is not None if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/heap/skew_heap.py ================================================ #!/usr/bin/env python3 from __future__ import annotations from collections.abc import Iterable, Iterator from typing import Any, TypeVar T = TypeVar("T", bound=bool) class SkewNode[T: bool]: """ One node of the skew heap. Contains the value and references to two children. """ def __init__(self, value: T) -> None: self._value: T = value self.left: SkewNode[T] | None = None self.right: SkewNode[T] | None = None @property def value(self) -> T: """ Return the value of the node. >>> SkewNode(0).value 0 >>> SkewNode(3.14159).value 3.14159 >>> SkewNode("hello").value 'hello' >>> SkewNode(None).value >>> SkewNode(True).value True >>> SkewNode([]).value [] >>> SkewNode({}).value {} >>> SkewNode(set()).value set() >>> SkewNode(0.0).value 0.0 >>> SkewNode(-1e-10).value -1e-10 >>> SkewNode(10).value 10 >>> SkewNode(-10.5).value -10.5 >>> SkewNode().value Traceback (most recent call last): ... TypeError: SkewNode.__init__() missing 1 required positional argument: 'value' """ return self._value @staticmethod def merge( root1: SkewNode[T] | None, root2: SkewNode[T] | None ) -> SkewNode[T] | None: """ Merge 2 nodes together. >>> SkewNode.merge(SkewNode(10),SkewNode(-10.5)).value -10.5 >>> SkewNode.merge(SkewNode(10),SkewNode(10.5)).value 10 >>> SkewNode.merge(SkewNode(10),SkewNode(10)).value 10 >>> SkewNode.merge(SkewNode(-100),SkewNode(-10.5)).value -100 """ if not root1: return root2 if not root2: return root1 if root1.value > root2.value: root1, root2 = root2, root1 result = root1 temp = root1.right result.right = root1.left result.left = SkewNode.merge(temp, root2) return result class SkewHeap[T: bool]: """ A data structure that allows inserting a new value and to pop the smallest values. Both operations take O(logN) time where N is the size of the structure. Wiki: https://en.wikipedia.org/wiki/Skew_heap Visualization: https://www.cs.usfca.edu/~galles/visualization/SkewHeap.html >>> list(SkewHeap([2, 3, 1, 5, 1, 7])) [1, 1, 2, 3, 5, 7] >>> sh = SkewHeap() >>> sh.pop() Traceback (most recent call last): ... IndexError: Can't get top element for the empty heap. >>> sh.insert(1) >>> sh.insert(-1) >>> sh.insert(0) >>> list(sh) [-1, 0, 1] """ def __init__(self, data: Iterable[T] | None = ()) -> None: """ >>> sh = SkewHeap([3, 1, 3, 7]) >>> list(sh) [1, 3, 3, 7] """ self._root: SkewNode[T] | None = None if data: for item in data: self.insert(item) def __bool__(self) -> bool: """ Check if the heap is not empty. >>> sh = SkewHeap() >>> bool(sh) False >>> sh.insert(1) >>> bool(sh) True >>> sh.clear() >>> bool(sh) False """ return self._root is not None def __iter__(self) -> Iterator[T]: """ Returns sorted list containing all the values in the heap. >>> sh = SkewHeap([3, 1, 3, 7]) >>> list(sh) [1, 3, 3, 7] """ result: list[Any] = [] while self: result.append(self.pop()) # Pushing items back to the heap not to clear it. for item in result: self.insert(item) return iter(result) def insert(self, value: T) -> None: """ Insert the value into the heap. >>> sh = SkewHeap() >>> sh.insert(3) >>> sh.insert(1) >>> sh.insert(3) >>> sh.insert(7) >>> list(sh) [1, 3, 3, 7] """ self._root = SkewNode.merge(self._root, SkewNode(value)) def pop(self) -> T | None: """ Pop the smallest value from the heap and return it. >>> sh = SkewHeap([3, 1, 3, 7]) >>> sh.pop() 1 >>> sh.pop() 3 >>> sh.pop() 3 >>> sh.pop() 7 >>> sh.pop() Traceback (most recent call last): ... IndexError: Can't get top element for the empty heap. """ result = self.top() self._root = ( SkewNode.merge(self._root.left, self._root.right) if self._root else None ) return result def top(self) -> T: """ Return the smallest value from the heap. >>> sh = SkewHeap() >>> sh.insert(3) >>> sh.top() 3 >>> sh.insert(1) >>> sh.top() 1 >>> sh.insert(3) >>> sh.top() 1 >>> sh.insert(7) >>> sh.top() 1 """ if not self._root: raise IndexError("Can't get top element for the empty heap.") return self._root.value def clear(self) -> None: """ Clear the heap. >>> sh = SkewHeap([3, 1, 3, 7]) >>> sh.clear() >>> sh.pop() Traceback (most recent call last): ... IndexError: Can't get top element for the empty heap. """ self._root = None if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/kd_tree/__init__.py ================================================ ================================================ FILE: data_structures/kd_tree/build_kdtree.py ================================================ # Created by: Ramy-Badr-Ahmed (https://github.com/Ramy-Badr-Ahmed) # in Pull Request: #11532 # https://github.com/TheAlgorithms/Python/pull/11532 # # Please mention me (@Ramy-Badr-Ahmed) in any issue or pull request # addressing bugs/corrections to this file. # Thank you! from data_structures.kd_tree.kd_node import KDNode def build_kdtree(points: list[list[float]], depth: int = 0) -> KDNode | None: """ Builds a KD-Tree from a list of points. Args: points: The list of points to build the KD-Tree from. depth: The current depth in the tree (used to determine axis for splitting). Returns: The root node of the KD-Tree, or None if no points are provided. """ if not points: return None k = len(points[0]) # Dimensionality of the points axis = depth % k # Sort point list and choose median as pivot element points.sort(key=lambda point: point[axis]) median_idx = len(points) // 2 # Create node and construct subtrees left_points = points[:median_idx] right_points = points[median_idx + 1 :] return KDNode( point=points[median_idx], left=build_kdtree(left_points, depth + 1), right=build_kdtree(right_points, depth + 1), ) ================================================ FILE: data_structures/kd_tree/example/__init__.py ================================================ ================================================ FILE: data_structures/kd_tree/example/example_usage.py ================================================ # Created by: Ramy-Badr-Ahmed (https://github.com/Ramy-Badr-Ahmed) # in Pull Request: #11532 # https://github.com/TheAlgorithms/Python/pull/11532 # # Please mention me (@Ramy-Badr-Ahmed) in any issue or pull request # addressing bugs/corrections to this file. # Thank you! import numpy as np from data_structures.kd_tree.build_kdtree import build_kdtree from data_structures.kd_tree.example.hypercube_points import hypercube_points from data_structures.kd_tree.nearest_neighbour_search import nearest_neighbour_search def main() -> None: """ Demonstrates the use of KD-Tree by building it from random points in a 10-dimensional hypercube and performing a nearest neighbor search. """ num_points: int = 5000 cube_size: float = 10.0 # Size of the hypercube (edge length) num_dimensions: int = 10 # Generate random points within the hypercube points: np.ndarray = hypercube_points(num_points, cube_size, num_dimensions) hypercube_kdtree = build_kdtree(points.tolist()) # Generate a random query point within the same space rng = np.random.default_rng() query_point: list[float] = rng.random(num_dimensions).tolist() # Perform nearest neighbor search nearest_point, nearest_dist, nodes_visited = nearest_neighbour_search( hypercube_kdtree, query_point ) # Print the results print(f"Query point: {query_point}") print(f"Nearest point: {nearest_point}") print(f"Distance: {nearest_dist:.4f}") print(f"Nodes visited: {nodes_visited}") if __name__ == "__main__": main() ================================================ FILE: data_structures/kd_tree/example/hypercube_points.py ================================================ # Created by: Ramy-Badr-Ahmed (https://github.com/Ramy-Badr-Ahmed) # in Pull Request: #11532 # https://github.com/TheAlgorithms/Python/pull/11532 # # Please mention me (@Ramy-Badr-Ahmed) in any issue or pull request # addressing bugs/corrections to this file. # Thank you! import numpy as np def hypercube_points( num_points: int, hypercube_size: float, num_dimensions: int ) -> np.ndarray: """ Generates random points uniformly distributed within an n-dimensional hypercube. Args: num_points: Number of points to generate. hypercube_size: Size of the hypercube. num_dimensions: Number of dimensions of the hypercube. Returns: An array of shape (num_points, num_dimensions) with generated points. """ rng = np.random.default_rng() shape = (num_points, num_dimensions) return hypercube_size * rng.random(shape) ================================================ FILE: data_structures/kd_tree/kd_node.py ================================================ # Created by: Ramy-Badr-Ahmed (https://github.com/Ramy-Badr-Ahmed) # in Pull Request: #11532 # https://github.com/TheAlgorithms/Python/pull/11532 # # Please mention me (@Ramy-Badr-Ahmed) in any issue or pull request # addressing bugs/corrections to this file. # Thank you! from __future__ import annotations class KDNode: """ Represents a node in a KD-Tree. Attributes: point: The point stored in this node. left: The left child node. right: The right child node. """ def __init__( self, point: list[float], left: KDNode | None = None, right: KDNode | None = None, ) -> None: """ Initializes a KDNode with the given point and child nodes. Args: point (list[float]): The point stored in this node. left (Optional[KDNode]): The left child node. right (Optional[KDNode]): The right child node. """ self.point = point self.left = left self.right = right ================================================ FILE: data_structures/kd_tree/nearest_neighbour_search.py ================================================ # Created by: Ramy-Badr-Ahmed (https://github.com/Ramy-Badr-Ahmed) # in Pull Request: #11532 # https://github.com/TheAlgorithms/Python/pull/11532 # # Please mention me (@Ramy-Badr-Ahmed) in any issue or pull request # addressing bugs/corrections to this file. # Thank you! from data_structures.kd_tree.kd_node import KDNode def nearest_neighbour_search( root: KDNode | None, query_point: list[float] ) -> tuple[list[float] | None, float, int]: """ Performs a nearest neighbor search in a KD-Tree for a given query point. Args: root (KDNode | None): The root node of the KD-Tree. query_point (list[float]): The point for which the nearest neighbor is being searched. Returns: tuple[list[float] | None, float, int]: - The nearest point found in the KD-Tree to the query point, or None if no point is found. - The squared distance to the nearest point. - The number of nodes visited during the search. """ nearest_point: list[float] | None = None nearest_dist: float = float("inf") nodes_visited: int = 0 def search(node: KDNode | None, depth: int = 0) -> None: """ Recursively searches for the nearest neighbor in the KD-Tree. Args: node: The current node in the KD-Tree. depth: The current depth in the KD-Tree. """ nonlocal nearest_point, nearest_dist, nodes_visited if node is None: return nodes_visited += 1 # Calculate the current distance (squared distance) current_point = node.point current_dist = sum( (query_coord - point_coord) ** 2 for query_coord, point_coord in zip(query_point, current_point) ) # Update nearest point if the current node is closer if nearest_point is None or current_dist < nearest_dist: nearest_point = current_point nearest_dist = current_dist # Determine which subtree to search first (based on axis and query point) k = len(query_point) # Dimensionality of points axis = depth % k if query_point[axis] <= current_point[axis]: nearer_subtree = node.left further_subtree = node.right else: nearer_subtree = node.right further_subtree = node.left # Search the nearer subtree first search(nearer_subtree, depth + 1) # If the further subtree has a closer point if (query_point[axis] - current_point[axis]) ** 2 < nearest_dist: search(further_subtree, depth + 1) search(root, 0) return nearest_point, nearest_dist, nodes_visited ================================================ FILE: data_structures/kd_tree/tests/__init__.py ================================================ ================================================ FILE: data_structures/kd_tree/tests/test_kdtree.py ================================================ # Created by: Ramy-Badr-Ahmed (https://github.com/Ramy-Badr-Ahmed) # in Pull Request: #11532 # https://github.com/TheAlgorithms/Python/pull/11532 # # Please mention me (@Ramy-Badr-Ahmed) in any issue or pull request # addressing bugs/corrections to this file. # Thank you! import numpy as np import pytest from data_structures.kd_tree.build_kdtree import build_kdtree from data_structures.kd_tree.example.hypercube_points import hypercube_points from data_structures.kd_tree.kd_node import KDNode from data_structures.kd_tree.nearest_neighbour_search import nearest_neighbour_search @pytest.mark.parametrize( ("num_points", "cube_size", "num_dimensions", "depth", "expected_result"), [ (0, 10.0, 2, 0, None), # Empty points list (10, 10.0, 2, 2, KDNode), # Depth = 2, 2D points (10, 10.0, 3, -2, KDNode), # Depth = -2, 3D points ], ) def test_build_kdtree(num_points, cube_size, num_dimensions, depth, expected_result): """ Test that KD-Tree is built correctly. Cases: - Empty points list. - Positive depth value. - Negative depth value. """ points = ( hypercube_points(num_points, cube_size, num_dimensions).tolist() if num_points > 0 else [] ) kdtree = build_kdtree(points, depth=depth) if expected_result is None: # Empty points list case assert kdtree is None, f"Expected None for empty points list, got {kdtree}" else: # Check if root node is not None assert kdtree is not None, "Expected a KDNode, got None" # Check if root has correct dimensions assert len(kdtree.point) == num_dimensions, ( f"Expected point dimension {num_dimensions}, got {len(kdtree.point)}" ) # Check that the tree is balanced to some extent (simplistic check) assert isinstance(kdtree, KDNode), ( f"Expected KDNode instance, got {type(kdtree)}" ) def test_nearest_neighbour_search(): """ Test the nearest neighbor search function. """ num_points = 10 cube_size = 10.0 num_dimensions = 2 points = hypercube_points(num_points, cube_size, num_dimensions) kdtree = build_kdtree(points.tolist()) rng = np.random.default_rng() query_point = rng.random(num_dimensions).tolist() nearest_point, nearest_dist, nodes_visited = nearest_neighbour_search( kdtree, query_point ) # Check that nearest point is not None assert nearest_point is not None # Check that distance is a non-negative number assert nearest_dist >= 0 # Check that nodes visited is a non-negative integer assert nodes_visited >= 0 def test_edge_cases(): """ Test edge cases such as an empty KD-Tree. """ empty_kdtree = build_kdtree([]) query_point = [0.0] * 2 # Using a default 2D query point nearest_point, nearest_dist, nodes_visited = nearest_neighbour_search( empty_kdtree, query_point ) # With an empty KD-Tree, nearest_point should be None assert nearest_point is None assert nearest_dist == float("inf") assert nodes_visited == 0 if __name__ == "__main__": import pytest pytest.main() ================================================ FILE: data_structures/linked_list/__init__.py ================================================ """ Linked Lists consists of Nodes. Nodes contain data and also may link to other nodes: - Head Node: First node, the address of the head node gives us access of the complete list - Last node: points to null """ from __future__ import annotations from typing import Any class Node: def __init__(self, item: Any, next: Any) -> None: # noqa: A002 self.item = item self.next = next class LinkedList: def __init__(self) -> None: self.head: Node | None = None self.size = 0 def add(self, item: Any, position: int = 0) -> None: """ Add an item to the LinkedList at the specified position. Default position is 0 (the head). Args: item (Any): The item to add to the LinkedList. position (int, optional): The position at which to add the item. Defaults to 0. Raises: ValueError: If the position is negative or out of bounds. >>> linked_list = LinkedList() >>> linked_list.add(1) >>> linked_list.add(2) >>> linked_list.add(3) >>> linked_list.add(4, 2) >>> print(linked_list) 3 --> 2 --> 4 --> 1 # Test adding to a negative position >>> linked_list.add(5, -3) Traceback (most recent call last): ... ValueError: Position must be non-negative # Test adding to an out-of-bounds position >>> linked_list.add(5,7) Traceback (most recent call last): ... ValueError: Out of bounds >>> linked_list.add(5, 4) >>> print(linked_list) 3 --> 2 --> 4 --> 1 --> 5 """ if position < 0: raise ValueError("Position must be non-negative") if position == 0 or self.head is None: new_node = Node(item, self.head) self.head = new_node else: current = self.head for _ in range(position - 1): current = current.next if current is None: raise ValueError("Out of bounds") new_node = Node(item, current.next) current.next = new_node self.size += 1 def remove(self) -> Any: # Switched 'self.is_empty()' to 'self.head is None' # because mypy was considering the possibility that 'self.head' # can be None in below else part and giving error if self.head is None: return None else: item = self.head.item self.head = self.head.next self.size -= 1 return item def is_empty(self) -> bool: return self.head is None def __str__(self) -> str: """ >>> linked_list = LinkedList() >>> linked_list.add(23) >>> linked_list.add(14) >>> linked_list.add(9) >>> print(linked_list) 9 --> 14 --> 23 """ if self.is_empty(): return "" else: iterate = self.head item_str = "" item_list: list[str] = [] while iterate: item_list.append(str(iterate.item)) iterate = iterate.next item_str = " --> ".join(item_list) return item_str def __len__(self) -> int: """ >>> linked_list = LinkedList() >>> len(linked_list) 0 >>> linked_list.add("a") >>> len(linked_list) 1 >>> linked_list.add("b") >>> len(linked_list) 2 >>> _ = linked_list.remove() >>> len(linked_list) 1 >>> _ = linked_list.remove() >>> len(linked_list) 0 """ return self.size ================================================ FILE: data_structures/linked_list/circular_linked_list.py ================================================ from __future__ import annotations from collections.abc import Iterator from dataclasses import dataclass from typing import Any @dataclass class Node: data: Any next_node: Node | None = None @dataclass class CircularLinkedList: head: Node | None = None # Reference to the head (first node) tail: Node | None = None # Reference to the tail (last node) def __iter__(self) -> Iterator[Any]: """ Iterate through all nodes in the Circular Linked List yielding their data. Yields: The data of each node in the linked list. """ node = self.head while node: yield node.data node = node.next_node if node == self.head: break def __len__(self) -> int: """ Get the length (number of nodes) in the Circular Linked List. """ return sum(1 for _ in self) def __repr__(self) -> str: """ Generate a string representation of the Circular Linked List. Returns: A string of the format "1->2->....->N". """ return "->".join(str(item) for item in iter(self)) def insert_tail(self, data: Any) -> None: """ Insert a node with the given data at the end of the Circular Linked List. """ self.insert_nth(len(self), data) def insert_head(self, data: Any) -> None: """ Insert a node with the given data at the beginning of the Circular Linked List. """ self.insert_nth(0, data) def insert_nth(self, index: int, data: Any) -> None: """ Insert the data of the node at the nth pos in the Circular Linked List. Args: index: The index at which the data should be inserted. data: The data to be inserted. Raises: IndexError: If the index is out of range. """ if index < 0 or index > len(self): raise IndexError("list index out of range.") new_node: Node = Node(data) if self.head is None: new_node.next_node = new_node # First node points to itself self.tail = self.head = new_node elif index == 0: # Insert at the head new_node.next_node = self.head assert self.tail is not None # List is not empty, tail exists self.head = self.tail.next_node = new_node else: temp: Node | None = self.head for _ in range(index - 1): assert temp is not None temp = temp.next_node assert temp is not None new_node.next_node = temp.next_node temp.next_node = new_node if index == len(self) - 1: # Insert at the tail self.tail = new_node def delete_front(self) -> Any: """ Delete and return the data of the node at the front of the Circular Linked List. Raises: IndexError: If the list is empty. """ return self.delete_nth(0) def delete_tail(self) -> Any: """ Delete and return the data of the node at the end of the Circular Linked List. Returns: Any: The data of the deleted node. Raises: IndexError: If the index is out of range. """ return self.delete_nth(len(self) - 1) def delete_nth(self, index: int = 0) -> Any: """ Delete and return the data of the node at the nth pos in Circular Linked List. Args: index (int): The index of the node to be deleted. Defaults to 0. Returns: Any: The data of the deleted node. Raises: IndexError: If the index is out of range. """ if not 0 <= index < len(self): raise IndexError("list index out of range.") assert self.head is not None assert self.tail is not None delete_node: Node = self.head if self.head == self.tail: # Just one node self.head = self.tail = None elif index == 0: # Delete head node assert self.tail.next_node is not None self.tail.next_node = self.tail.next_node.next_node self.head = self.head.next_node else: temp: Node | None = self.head for _ in range(index - 1): assert temp is not None temp = temp.next_node assert temp is not None assert temp.next_node is not None delete_node = temp.next_node temp.next_node = temp.next_node.next_node if index == len(self) - 1: # Delete at tail self.tail = temp return delete_node.data def is_empty(self) -> bool: """ Check if the Circular Linked List is empty. Returns: bool: True if the list is empty, False otherwise. """ return len(self) == 0 def test_circular_linked_list() -> None: """ Test cases for the CircularLinkedList class. >>> test_circular_linked_list() """ circular_linked_list = CircularLinkedList() assert len(circular_linked_list) == 0 assert circular_linked_list.is_empty() is True assert str(circular_linked_list) == "" try: circular_linked_list.delete_front() raise AssertionError # This should not happen except IndexError: assert True # This should happen try: circular_linked_list.delete_tail() raise AssertionError # This should not happen except IndexError: assert True # This should happen try: circular_linked_list.delete_nth(-1) raise AssertionError except IndexError: assert True try: circular_linked_list.delete_nth(0) raise AssertionError except IndexError: assert True assert circular_linked_list.is_empty() is True for i in range(5): assert len(circular_linked_list) == i circular_linked_list.insert_nth(i, i + 1) assert str(circular_linked_list) == "->".join(str(i) for i in range(1, 6)) circular_linked_list.insert_tail(6) assert str(circular_linked_list) == "->".join(str(i) for i in range(1, 7)) circular_linked_list.insert_head(0) assert str(circular_linked_list) == "->".join(str(i) for i in range(7)) assert circular_linked_list.delete_front() == 0 assert circular_linked_list.delete_tail() == 6 assert str(circular_linked_list) == "->".join(str(i) for i in range(1, 6)) assert circular_linked_list.delete_nth(2) == 3 circular_linked_list.insert_nth(2, 3) assert str(circular_linked_list) == "->".join(str(i) for i in range(1, 6)) assert circular_linked_list.is_empty() is False if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/linked_list/deque_doubly.py ================================================ """ Implementing Deque using DoublyLinkedList ... Operations: 1. insertion in the front -> O(1) 2. insertion in the end -> O(1) 3. remove from the front -> O(1) 4. remove from the end -> O(1) """ class _DoublyLinkedBase: """A Private class (to be inherited)""" class _Node: __slots__ = "_data", "_next", "_prev" def __init__(self, link_p, element, link_n): self._prev = link_p self._data = element self._next = link_n def has_next_and_prev(self): return ( f" Prev -> {self._prev is not None}, Next -> {self._next is not None}" ) def __init__(self): self._header = self._Node(None, None, None) self._trailer = self._Node(None, None, None) self._header._next = self._trailer self._trailer._prev = self._header self._size = 0 def __len__(self): return self._size def is_empty(self): return self.__len__() == 0 def _insert(self, predecessor, e, successor): # Create new_node by setting it's prev.link -> header # setting it's next.link -> trailer new_node = self._Node(predecessor, e, successor) predecessor._next = new_node successor._prev = new_node self._size += 1 return self def _delete(self, node): predecessor = node._prev successor = node._next predecessor._next = successor successor._prev = predecessor self._size -= 1 temp = node._data node._prev = node._next = node._data = None del node return temp class LinkedDeque(_DoublyLinkedBase): def first(self): """return first element >>> d = LinkedDeque() >>> d.add_first('A').first() 'A' >>> d.add_first('B').first() 'B' """ if self.is_empty(): raise Exception("List is empty") return self._header._next._data def last(self): """return last element >>> d = LinkedDeque() >>> d.add_last('A').last() 'A' >>> d.add_last('B').last() 'B' """ if self.is_empty(): raise Exception("List is empty") return self._trailer._prev._data # DEque Insert Operations (At the front, At the end) def add_first(self, element): """insertion in the front >>> LinkedDeque().add_first('AV').first() 'AV' """ return self._insert(self._header, element, self._header._next) def add_last(self, element): """insertion in the end >>> LinkedDeque().add_last('B').last() 'B' """ return self._insert(self._trailer._prev, element, self._trailer) # DEqueu Remove Operations (At the front, At the end) def remove_first(self): """removal from the front >>> d = LinkedDeque() >>> d.is_empty() True >>> d.remove_first() Traceback (most recent call last): ... IndexError: remove_first from empty list >>> d.add_first('A') # doctest: +ELLIPSIS >> d.remove_first() 'A' >>> d.is_empty() True """ if self.is_empty(): raise IndexError("remove_first from empty list") return self._delete(self._header._next) def remove_last(self): """removal in the end >>> d = LinkedDeque() >>> d.is_empty() True >>> d.remove_last() Traceback (most recent call last): ... IndexError: remove_first from empty list >>> d.add_first('A') # doctest: +ELLIPSIS >> d.remove_last() 'A' >>> d.is_empty() True """ if self.is_empty(): raise IndexError("remove_first from empty list") return self._delete(self._trailer._prev) ================================================ FILE: data_structures/linked_list/doubly_linked_list.py ================================================ """ https://en.wikipedia.org/wiki/Doubly_linked_list """ class Node: def __init__(self, data): self.data = data self.previous = None self.next = None def __str__(self): return f"{self.data}" class DoublyLinkedList: def __init__(self): self.head = None self.tail = None def __iter__(self): """ >>> linked_list = DoublyLinkedList() >>> linked_list.insert_at_head('b') >>> linked_list.insert_at_head('a') >>> linked_list.insert_at_tail('c') >>> tuple(linked_list) ('a', 'b', 'c') """ node = self.head while node: yield node.data node = node.next def __str__(self): """ >>> linked_list = DoublyLinkedList() >>> linked_list.insert_at_tail('a') >>> linked_list.insert_at_tail('b') >>> linked_list.insert_at_tail('c') >>> str(linked_list) 'a->b->c' """ return "->".join([str(item) for item in self]) def __len__(self): """ >>> linked_list = DoublyLinkedList() >>> for i in range(0, 5): ... linked_list.insert_at_nth(i, i + 1) >>> len(linked_list) == 5 True """ return sum(1 for _ in self) def insert_at_head(self, data): self.insert_at_nth(0, data) def insert_at_tail(self, data): self.insert_at_nth(len(self), data) def insert_at_nth(self, index: int, data): """ >>> linked_list = DoublyLinkedList() >>> linked_list.insert_at_nth(-1, 666) Traceback (most recent call last): .... IndexError: list index out of range >>> linked_list.insert_at_nth(1, 666) Traceback (most recent call last): .... IndexError: list index out of range >>> linked_list.insert_at_nth(0, 2) >>> linked_list.insert_at_nth(0, 1) >>> linked_list.insert_at_nth(2, 4) >>> linked_list.insert_at_nth(2, 3) >>> str(linked_list) '1->2->3->4' >>> linked_list.insert_at_nth(5, 5) Traceback (most recent call last): .... IndexError: list index out of range """ length = len(self) if not 0 <= index <= length: raise IndexError("list index out of range") new_node = Node(data) if self.head is None: self.head = self.tail = new_node elif index == 0: self.head.previous = new_node new_node.next = self.head self.head = new_node elif index == length: self.tail.next = new_node new_node.previous = self.tail self.tail = new_node else: temp = self.head for _ in range(index): temp = temp.next temp.previous.next = new_node new_node.previous = temp.previous new_node.next = temp temp.previous = new_node def delete_head(self): return self.delete_at_nth(0) def delete_tail(self): return self.delete_at_nth(len(self) - 1) def delete_at_nth(self, index: int): """ >>> linked_list = DoublyLinkedList() >>> linked_list.delete_at_nth(0) Traceback (most recent call last): .... IndexError: list index out of range >>> for i in range(0, 5): ... linked_list.insert_at_nth(i, i + 1) >>> linked_list.delete_at_nth(0) == 1 True >>> linked_list.delete_at_nth(3) == 5 True >>> linked_list.delete_at_nth(1) == 3 True >>> str(linked_list) '2->4' >>> linked_list.delete_at_nth(2) Traceback (most recent call last): .... IndexError: list index out of range """ length = len(self) if not 0 <= index <= length - 1: raise IndexError("list index out of range") delete_node = self.head # default first node if length == 1: self.head = self.tail = None elif index == 0: self.head = self.head.next self.head.previous = None elif index == length - 1: delete_node = self.tail self.tail = self.tail.previous self.tail.next = None else: temp = self.head for _ in range(index): temp = temp.next delete_node = temp temp.next.previous = temp.previous temp.previous.next = temp.next return delete_node.data def delete(self, data) -> str: current = self.head while current.data != data: # Find the position to delete if current.next: current = current.next else: # We have reached the end an no value matches raise ValueError("No data matching given value") if current == self.head: self.delete_head() elif current == self.tail: self.delete_tail() else: # Before: 1 <--> 2(current) <--> 3 current.previous.next = current.next # 1 --> 3 current.next.previous = current.previous # 1 <--> 3 return data def is_empty(self): """ >>> linked_list = DoublyLinkedList() >>> linked_list.is_empty() True >>> linked_list.insert_at_tail(1) >>> linked_list.is_empty() False """ return len(self) == 0 def test_doubly_linked_list() -> None: """ >>> test_doubly_linked_list() """ linked_list = DoublyLinkedList() assert linked_list.is_empty() is True assert str(linked_list) == "" try: linked_list.delete_head() raise AssertionError # This should not happen. except IndexError: assert True # This should happen. try: linked_list.delete_tail() raise AssertionError # This should not happen. except IndexError: assert True # This should happen. for i in range(10): assert len(linked_list) == i linked_list.insert_at_nth(i, i + 1) assert str(linked_list) == "->".join(str(i) for i in range(1, 11)) linked_list.insert_at_head(0) linked_list.insert_at_tail(11) assert str(linked_list) == "->".join(str(i) for i in range(12)) assert linked_list.delete_head() == 0 assert linked_list.delete_at_nth(9) == 10 assert linked_list.delete_tail() == 11 assert len(linked_list) == 9 assert str(linked_list) == "->".join(str(i) for i in range(1, 10)) if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: data_structures/linked_list/doubly_linked_list_two.py ================================================ """ - A linked list is similar to an array, it holds values. However, links in a linked list do not have indexes. - This is an example of a double ended, doubly linked list. - Each link references the next link and the previous one. - A Doubly Linked List (DLL) contains an extra pointer, typically called previous pointer, together with next pointer and data which are there in singly linked list. - Advantages over SLL - It can be traversed in both forward and backward direction. Delete operation is more efficient """ from dataclasses import dataclass from typing import Self, TypeVar DataType = TypeVar("DataType") @dataclass class Node[DataType]: data: DataType previous: Self | None = None next: Self | None = None def __str__(self) -> str: return f"{self.data}" class LinkedListIterator: def __init__(self, head): self.current = head def __iter__(self): return self def __next__(self): if not self.current: raise StopIteration else: value = self.current.data self.current = self.current.next return value @dataclass class LinkedList: head: Node | None = None # First node in list tail: Node | None = None # Last node in list def __str__(self): current = self.head nodes = [] while current is not None: nodes.append(current.data) current = current.next return " ".join(str(node) for node in nodes) def __contains__(self, value: DataType): current = self.head while current: if current.data == value: return True current = current.next return False def __iter__(self): return LinkedListIterator(self.head) def get_head_data(self): if self.head: return self.head.data return None def get_tail_data(self): if self.tail: return self.tail.data return None def set_head(self, node: Node) -> None: if self.head is None: self.head = node self.tail = node else: self.insert_before_node(self.head, node) def set_tail(self, node: Node) -> None: if self.tail is None: self.head = node self.tail = node else: self.insert_after_node(self.tail, node) def insert(self, value: DataType) -> None: node = Node(value) if self.head is None: self.set_head(node) else: self.set_tail(node) def insert_before_node(self, node: Node, node_to_insert: Node) -> None: node_to_insert.next = node node_to_insert.previous = node.previous if node.previous is None: self.head = node_to_insert else: node.previous.next = node_to_insert node.previous = node_to_insert def insert_after_node(self, node: Node, node_to_insert: Node) -> None: node_to_insert.previous = node node_to_insert.next = node.next if node.next is None: self.tail = node_to_insert else: node.next.previous = node_to_insert node.next = node_to_insert def insert_at_position(self, position: int, value: DataType) -> None: current_position = 1 new_node = Node(value) node = self.head while node: if current_position == position: self.insert_before_node(node, new_node) return current_position += 1 node = node.next self.set_tail(new_node) def get_node(self, item: DataType) -> Node: node = self.head while node: if node.data == item: return node node = node.next raise Exception("Node not found") def delete_value(self, value): if (node := self.get_node(value)) is not None: if node == self.head: self.head = self.head.next if node == self.tail: self.tail = self.tail.previous self.remove_node_pointers(node) @staticmethod def remove_node_pointers(node: Node) -> None: if node.next: node.next.previous = node.previous if node.previous: node.previous.next = node.next node.next = None node.previous = None def is_empty(self): return self.head is None def create_linked_list() -> None: """ >>> new_linked_list = LinkedList() >>> new_linked_list.get_head_data() is None True >>> new_linked_list.get_tail_data() is None True >>> new_linked_list.is_empty() True >>> new_linked_list.insert(10) >>> new_linked_list.get_head_data() 10 >>> new_linked_list.get_tail_data() 10 >>> new_linked_list.insert_at_position(position=3, value=20) >>> new_linked_list.get_head_data() 10 >>> new_linked_list.get_tail_data() 20 >>> new_linked_list.set_head(Node(1000)) >>> new_linked_list.get_head_data() 1000 >>> new_linked_list.get_tail_data() 20 >>> new_linked_list.set_tail(Node(2000)) >>> new_linked_list.get_head_data() 1000 >>> new_linked_list.get_tail_data() 2000 >>> for value in new_linked_list: ... print(value) 1000 10 20 2000 >>> new_linked_list.is_empty() False >>> for value in new_linked_list: ... print(value) 1000 10 20 2000 >>> 10 in new_linked_list True >>> new_linked_list.delete_value(value=10) >>> 10 in new_linked_list False >>> new_linked_list.delete_value(value=2000) >>> new_linked_list.get_tail_data() 20 >>> new_linked_list.delete_value(value=1000) >>> new_linked_list.get_tail_data() 20 >>> new_linked_list.get_head_data() 20 >>> for value in new_linked_list: ... print(value) 20 >>> new_linked_list.delete_value(value=20) >>> for value in new_linked_list: ... print(value) >>> for value in range(1,10): ... new_linked_list.insert(value=value) >>> for value in new_linked_list: ... print(value) 1 2 3 4 5 6 7 8 9 >>> linked_list = LinkedList() >>> linked_list.insert_at_position(position=1, value=10) >>> str(linked_list) '10' >>> linked_list.insert_at_position(position=2, value=20) >>> str(linked_list) '10 20' >>> linked_list.insert_at_position(position=1, value=30) >>> str(linked_list) '30 10 20' >>> linked_list.insert_at_position(position=3, value=40) >>> str(linked_list) '30 10 40 20' >>> linked_list.insert_at_position(position=5, value=50) >>> str(linked_list) '30 10 40 20 50' """ if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/linked_list/floyds_cycle_detection.py ================================================ """ Floyd's cycle detection algorithm is a popular algorithm used to detect cycles in a linked list. It uses two pointers, a slow pointer and a fast pointer, to traverse the linked list. The slow pointer moves one node at a time while the fast pointer moves two nodes at a time. If there is a cycle in the linked list, the fast pointer will eventually catch up to the slow pointer and they will meet at the same node. If there is no cycle, the fast pointer will reach the end of the linked list and the algorithm will terminate. For more information: https://en.wikipedia.org/wiki/Cycle_detection#Floyd's_tortoise_and_hare """ from collections.abc import Iterator from dataclasses import dataclass from typing import Any, Self @dataclass class Node: """ A class representing a node in a singly linked list. """ data: Any next_node: Self | None = None @dataclass class LinkedList: """ A class representing a singly linked list. """ head: Node | None = None def __iter__(self) -> Iterator: """ Iterates through the linked list. Returns: Iterator: An iterator over the linked list. Examples: >>> linked_list = LinkedList() >>> list(linked_list) [] >>> linked_list.add_node(1) >>> tuple(linked_list) (1,) """ visited = [] node = self.head while node: # Avoid infinite loop in there's a cycle if node in visited: return visited.append(node) yield node.data node = node.next_node def add_node(self, data: Any) -> None: """ Adds a new node to the end of the linked list. Args: data (Any): The data to be stored in the new node. Examples: >>> linked_list = LinkedList() >>> linked_list.add_node(1) >>> linked_list.add_node(2) >>> linked_list.add_node(3) >>> linked_list.add_node(4) >>> tuple(linked_list) (1, 2, 3, 4) """ new_node = Node(data) if self.head is None: self.head = new_node return current_node = self.head while current_node.next_node is not None: current_node = current_node.next_node current_node.next_node = new_node def detect_cycle(self) -> bool: """ Detects if there is a cycle in the linked list using Floyd's cycle detection algorithm. Returns: bool: True if there is a cycle, False otherwise. Examples: >>> linked_list = LinkedList() >>> linked_list.add_node(1) >>> linked_list.add_node(2) >>> linked_list.add_node(3) >>> linked_list.add_node(4) >>> linked_list.detect_cycle() False # Create a cycle in the linked list >>> linked_list.head.next_node.next_node.next_node = linked_list.head.next_node >>> linked_list.detect_cycle() True """ if self.head is None: return False slow_pointer: Node | None = self.head fast_pointer: Node | None = self.head while fast_pointer is not None and fast_pointer.next_node is not None: slow_pointer = slow_pointer.next_node if slow_pointer else None fast_pointer = fast_pointer.next_node.next_node if slow_pointer == fast_pointer: return True return False if __name__ == "__main__": import doctest doctest.testmod() linked_list = LinkedList() linked_list.add_node(1) linked_list.add_node(2) linked_list.add_node(3) linked_list.add_node(4) # Create a cycle in the linked list # It first checks if the head, next_node, and next_node.next_node attributes of the # linked list are not None to avoid any potential type errors. if ( linked_list.head and linked_list.head.next_node and linked_list.head.next_node.next_node ): linked_list.head.next_node.next_node.next_node = linked_list.head.next_node has_cycle = linked_list.detect_cycle() print(has_cycle) # Output: True ================================================ FILE: data_structures/linked_list/from_sequence.py ================================================ """ Recursive Program to create a Linked List from a sequence and print a string representation of it. """ class Node: def __init__(self, data=None): self.data = data self.next = None def __repr__(self): """Returns a visual representation of the node and all its following nodes.""" string_rep = "" temp = self while temp: string_rep += f"<{temp.data}> ---> " temp = temp.next string_rep += "" return string_rep def make_linked_list(elements_list: list | tuple) -> Node: """ Creates a Linked List from the elements of the given sequence (list/tuple) and returns the head of the Linked List. >>> make_linked_list([]) Traceback (most recent call last): ... ValueError: The Elements List is empty >>> make_linked_list(()) Traceback (most recent call last): ... ValueError: The Elements List is empty >>> make_linked_list([1]) <1> ---> >>> make_linked_list((1,)) <1> ---> >>> make_linked_list([1, 3, 5, 32, 44, 12, 43]) <1> ---> <3> ---> <5> ---> <32> ---> <44> ---> <12> ---> <43> ---> >>> make_linked_list((1, 3, 5, 32, 44, 12, 43)) <1> ---> <3> ---> <5> ---> <32> ---> <44> ---> <12> ---> <43> ---> """ # if elements_list is empty if not elements_list: raise ValueError("The Elements List is empty") # Set first element as Head head = Node(elements_list[0]) current = head # Loop through elements from position 1 for data in elements_list[1:]: current.next = Node(data) current = current.next return head ================================================ FILE: data_structures/linked_list/has_loop.py ================================================ from __future__ import annotations from typing import Any class ContainsLoopError(Exception): pass class Node: def __init__(self, data: Any) -> None: self.data: Any = data self.next_node: Node | None = None def __iter__(self): node = self visited = set() while node: if node in visited: raise ContainsLoopError visited.add(node) yield node.data node = node.next_node @property def has_loop(self) -> bool: """ A loop is when the exact same Node appears more than once in a linked list. >>> root_node = Node(1) >>> root_node.next_node = Node(2) >>> root_node.next_node.next_node = Node(3) >>> root_node.next_node.next_node.next_node = Node(4) >>> root_node.has_loop False >>> root_node.next_node.next_node.next_node = root_node.next_node >>> root_node.has_loop True """ try: list(self) return False except ContainsLoopError: return True if __name__ == "__main__": root_node = Node(1) root_node.next_node = Node(2) root_node.next_node.next_node = Node(3) root_node.next_node.next_node.next_node = Node(4) print(root_node.has_loop) # False root_node.next_node.next_node.next_node = root_node.next_node print(root_node.has_loop) # True root_node = Node(5) root_node.next_node = Node(6) root_node.next_node.next_node = Node(5) root_node.next_node.next_node.next_node = Node(6) print(root_node.has_loop) # False root_node = Node(1) print(root_node.has_loop) # False ================================================ FILE: data_structures/linked_list/is_palindrome.py ================================================ from __future__ import annotations from dataclasses import dataclass @dataclass class ListNode: val: int = 0 next_node: ListNode | None = None def is_palindrome(head: ListNode | None) -> bool: """ Check if a linked list is a palindrome. Args: head: The head of the linked list. Returns: bool: True if the linked list is a palindrome, False otherwise. Examples: >>> is_palindrome(None) True >>> is_palindrome(ListNode(1)) True >>> is_palindrome(ListNode(1, ListNode(2))) False >>> is_palindrome(ListNode(1, ListNode(2, ListNode(1)))) True >>> is_palindrome(ListNode(1, ListNode(2, ListNode(2, ListNode(1))))) True """ if not head: return True # split the list to two parts fast: ListNode | None = head.next_node slow: ListNode | None = head while fast and fast.next_node: fast = fast.next_node.next_node slow = slow.next_node if slow else None if slow: # slow will always be defined, # adding this check to resolve mypy static check second = slow.next_node slow.next_node = None # Don't forget here! But forget still works! # reverse the second part node: ListNode | None = None while second: nxt = second.next_node second.next_node = node node = second second = nxt # compare two parts # second part has the same or one less node while node and head: if node.val != head.val: return False node = node.next_node head = head.next_node return True def is_palindrome_stack(head: ListNode | None) -> bool: """ Check if a linked list is a palindrome using a stack. Args: head (ListNode): The head of the linked list. Returns: bool: True if the linked list is a palindrome, False otherwise. Examples: >>> is_palindrome_stack(None) True >>> is_palindrome_stack(ListNode(1)) True >>> is_palindrome_stack(ListNode(1, ListNode(2))) False >>> is_palindrome_stack(ListNode(1, ListNode(2, ListNode(1)))) True >>> is_palindrome_stack(ListNode(1, ListNode(2, ListNode(2, ListNode(1))))) True """ if not head or not head.next_node: return True # 1. Get the midpoint (slow) slow: ListNode | None = head fast: ListNode | None = head while fast and fast.next_node: fast = fast.next_node.next_node slow = slow.next_node if slow else None # slow will always be defined, # adding this check to resolve mypy static check if slow: stack = [slow.val] # 2. Push the second half into the stack while slow.next_node: slow = slow.next_node stack.append(slow.val) # 3. Comparison cur: ListNode | None = head while stack and cur: if stack.pop() != cur.val: return False cur = cur.next_node return True def is_palindrome_dict(head: ListNode | None) -> bool: """ Check if a linked list is a palindrome using a dictionary. Args: head (ListNode): The head of the linked list. Returns: bool: True if the linked list is a palindrome, False otherwise. Examples: >>> is_palindrome_dict(None) True >>> is_palindrome_dict(ListNode(1)) True >>> is_palindrome_dict(ListNode(1, ListNode(2))) False >>> is_palindrome_dict(ListNode(1, ListNode(2, ListNode(1)))) True >>> is_palindrome_dict(ListNode(1, ListNode(2, ListNode(2, ListNode(1))))) True >>> is_palindrome_dict( ... ListNode( ... 1, ListNode(2, ListNode(1, ListNode(3, ListNode(2, ListNode(1))))) ... ) ... ) False """ if not head or not head.next_node: return True d: dict[int, list[int]] = {} pos = 0 while head: if head.val in d: d[head.val].append(pos) else: d[head.val] = [pos] head = head.next_node pos += 1 checksum = pos - 1 middle = 0 for v in d.values(): if len(v) % 2 != 0: middle += 1 else: for step, i in enumerate(range(len(v))): if v[i] + v[len(v) - 1 - step] != checksum: return False if middle > 1: return False return True if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/linked_list/merge_two_lists.py ================================================ """ Algorithm that merges two sorted linked lists into one sorted linked list. """ from __future__ import annotations from collections.abc import Iterable, Iterator from dataclasses import dataclass test_data_odd = (3, 9, -11, 0, 7, 5, 1, -1) test_data_even = (4, 6, 2, 0, 8, 10, 3, -2) @dataclass class Node: data: int next_node: Node | None class SortedLinkedList: def __init__(self, ints: Iterable[int]) -> None: self.head: Node | None = None for i in sorted(ints, reverse=True): self.head = Node(i, self.head) def __iter__(self) -> Iterator[int]: """ >>> tuple(SortedLinkedList(test_data_odd)) == tuple(sorted(test_data_odd)) True >>> tuple(SortedLinkedList(test_data_even)) == tuple(sorted(test_data_even)) True """ node = self.head while node: yield node.data node = node.next_node def __len__(self) -> int: """ >>> for i in range(3): ... len(SortedLinkedList(range(i))) == i True True True >>> len(SortedLinkedList(test_data_odd)) 8 """ return sum(1 for _ in self) def __str__(self) -> str: """ >>> str(SortedLinkedList([])) '' >>> str(SortedLinkedList(test_data_odd)) '-11 -> -1 -> 0 -> 1 -> 3 -> 5 -> 7 -> 9' >>> str(SortedLinkedList(test_data_even)) '-2 -> 0 -> 2 -> 3 -> 4 -> 6 -> 8 -> 10' """ return " -> ".join([str(node) for node in self]) def merge_lists( sll_one: SortedLinkedList, sll_two: SortedLinkedList ) -> SortedLinkedList: """ >>> SSL = SortedLinkedList >>> merged = merge_lists(SSL(test_data_odd), SSL(test_data_even)) >>> len(merged) 16 >>> str(merged) '-11 -> -2 -> -1 -> 0 -> 0 -> 1 -> 2 -> 3 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10' >>> list(merged) == list(sorted(test_data_odd + test_data_even)) True """ return SortedLinkedList(list(sll_one) + list(sll_two)) if __name__ == "__main__": import doctest doctest.testmod() SSL = SortedLinkedList print(merge_lists(SSL(test_data_odd), SSL(test_data_even))) ================================================ FILE: data_structures/linked_list/middle_element_of_linked_list.py ================================================ from __future__ import annotations class Node: def __init__(self, data: int) -> None: self.data = data self.next = None class LinkedList: def __init__(self): self.head = None def push(self, new_data: int) -> int: new_node = Node(new_data) new_node.next = self.head self.head = new_node return self.head.data def middle_element(self) -> int | None: """ >>> link = LinkedList() >>> link.middle_element() No element found. >>> link.push(5) 5 >>> link.push(6) 6 >>> link.push(8) 8 >>> link.push(8) 8 >>> link.push(10) 10 >>> link.push(12) 12 >>> link.push(17) 17 >>> link.push(7) 7 >>> link.push(3) 3 >>> link.push(20) 20 >>> link.push(-20) -20 >>> link.middle_element() 12 >>> """ slow_pointer = self.head fast_pointer = self.head if self.head: while fast_pointer and fast_pointer.next: fast_pointer = fast_pointer.next.next slow_pointer = slow_pointer.next return slow_pointer.data else: print("No element found.") return None if __name__ == "__main__": link = LinkedList() for _ in range(int(input().strip())): data = int(input().strip()) link.push(data) print(link.middle_element()) ================================================ FILE: data_structures/linked_list/print_reverse.py ================================================ from __future__ import annotations from collections.abc import Iterable, Iterator from dataclasses import dataclass @dataclass class Node: data: int next_node: Node | None = None class LinkedList: """A class to represent a Linked List. Use a tail pointer to speed up the append() operation. """ def __init__(self) -> None: """Initialize a LinkedList with the head node set to None. >>> linked_list = LinkedList() >>> (linked_list.head, linked_list.tail) (None, None) """ self.head: Node | None = None self.tail: Node | None = None # Speeds up the append() operation def __iter__(self) -> Iterator[int]: """Iterate the LinkedList yielding each Node's data. >>> linked_list = LinkedList() >>> items = (1, 2, 3, 4, 5) >>> linked_list.extend(items) >>> tuple(linked_list) == items True """ node = self.head while node: yield node.data node = node.next_node def __repr__(self) -> str: """Returns a string representation of the LinkedList. >>> linked_list = LinkedList() >>> str(linked_list) '' >>> linked_list.append(1) >>> str(linked_list) '1' >>> linked_list.extend([2, 3, 4, 5]) >>> str(linked_list) '1 -> 2 -> 3 -> 4 -> 5' """ return " -> ".join([str(data) for data in self]) def append(self, data: int) -> None: """Appends a new node with the given data to the end of the LinkedList. >>> linked_list = LinkedList() >>> str(linked_list) '' >>> linked_list.append(1) >>> str(linked_list) '1' >>> linked_list.append(2) >>> str(linked_list) '1 -> 2' """ if self.tail: self.tail.next_node = self.tail = Node(data) else: self.head = self.tail = Node(data) def extend(self, items: Iterable[int]) -> None: """Appends each item to the end of the LinkedList. >>> linked_list = LinkedList() >>> linked_list.extend([]) >>> str(linked_list) '' >>> linked_list.extend([1, 2]) >>> str(linked_list) '1 -> 2' >>> linked_list.extend([3,4]) >>> str(linked_list) '1 -> 2 -> 3 -> 4' """ for item in items: self.append(item) def make_linked_list(elements_list: Iterable[int]) -> LinkedList: """Creates a Linked List from the elements of the given sequence (list/tuple) and returns the head of the Linked List. >>> make_linked_list([]) Traceback (most recent call last): ... Exception: The Elements List is empty >>> make_linked_list([7]) 7 >>> make_linked_list(['abc']) abc >>> make_linked_list([7, 25]) 7 -> 25 """ if not elements_list: raise Exception("The Elements List is empty") linked_list = LinkedList() linked_list.extend(elements_list) return linked_list def in_reverse(linked_list: LinkedList) -> str: """Prints the elements of the given Linked List in reverse order >>> in_reverse(LinkedList()) '' >>> in_reverse(make_linked_list([69, 88, 73])) '73 <- 88 <- 69' """ return " <- ".join(str(line) for line in reversed(tuple(linked_list))) if __name__ == "__main__": from doctest import testmod testmod() linked_list = make_linked_list((14, 52, 14, 12, 43)) print(f"Linked List: {linked_list}") print(f"Reverse List: {in_reverse(linked_list)}") ================================================ FILE: data_structures/linked_list/reverse_k_group.py ================================================ from __future__ import annotations from collections.abc import Iterable, Iterator from dataclasses import dataclass @dataclass class Node: data: int next_node: Node | None = None class LinkedList: def __init__(self, ints: Iterable[int]) -> None: self.head: Node | None = None for i in ints: self.append(i) def __iter__(self) -> Iterator[int]: """ >>> ints = [] >>> list(LinkedList(ints)) == ints True >>> ints = tuple(range(5)) >>> tuple(LinkedList(ints)) == ints True """ node = self.head while node: yield node.data node = node.next_node def __len__(self) -> int: """ >>> for i in range(3): ... len(LinkedList(range(i))) == i True True True >>> len(LinkedList("abcdefgh")) 8 """ return sum(1 for _ in self) def __str__(self) -> str: """ >>> str(LinkedList([])) '' >>> str(LinkedList(range(5))) '0 -> 1 -> 2 -> 3 -> 4' """ return " -> ".join([str(node) for node in self]) def append(self, data: int) -> None: """ >>> ll = LinkedList([1, 2]) >>> tuple(ll) (1, 2) >>> ll.append(3) >>> tuple(ll) (1, 2, 3) >>> ll.append(4) >>> tuple(ll) (1, 2, 3, 4) >>> len(ll) 4 """ if not self.head: self.head = Node(data) return node = self.head while node.next_node: node = node.next_node node.next_node = Node(data) def reverse_k_nodes(self, group_size: int) -> None: """ reverse nodes within groups of size k >>> ll = LinkedList([1, 2, 3, 4, 5]) >>> ll.reverse_k_nodes(2) >>> tuple(ll) (2, 1, 4, 3, 5) >>> str(ll) '2 -> 1 -> 4 -> 3 -> 5' """ if self.head is None or self.head.next_node is None: return length = len(self) dummy_head = Node(0) dummy_head.next_node = self.head previous_node = dummy_head while length >= group_size: current_node = previous_node.next_node assert current_node next_node = current_node.next_node for _ in range(1, group_size): assert next_node, current_node current_node.next_node = next_node.next_node assert previous_node next_node.next_node = previous_node.next_node previous_node.next_node = next_node next_node = current_node.next_node previous_node = current_node length -= group_size self.head = dummy_head.next_node if __name__ == "__main__": import doctest doctest.testmod() ll = LinkedList([1, 2, 3, 4, 5]) print(f"Original Linked List: {ll}") k = 2 ll.reverse_k_nodes(k) print(f"After reversing groups of size {k}: {ll}") ================================================ FILE: data_structures/linked_list/rotate_to_the_right.py ================================================ from __future__ import annotations from dataclasses import dataclass @dataclass class Node: data: int next_node: Node | None = None def print_linked_list(head: Node | None) -> None: """ Print the entire linked list iteratively. This function prints the elements of a linked list separated by '->'. Parameters: head (Node | None): The head of the linked list to be printed, or None if the linked list is empty. >>> head = insert_node(None, 0) >>> head = insert_node(head, 2) >>> head = insert_node(head, 1) >>> print_linked_list(head) 0->2->1 >>> head = insert_node(head, 4) >>> head = insert_node(head, 5) >>> print_linked_list(head) 0->2->1->4->5 """ if head is None: return while head.next_node is not None: print(head.data, end="->") head = head.next_node print(head.data) def insert_node(head: Node | None, data: int) -> Node: """ Insert a new node at the end of a linked list and return the new head. Parameters: head (Node | None): The head of the linked list. data (int): The data to be inserted into the new node. Returns: Node: The new head of the linked list. >>> head = insert_node(None, 10) >>> head = insert_node(head, 9) >>> head = insert_node(head, 8) >>> print_linked_list(head) 10->9->8 """ new_node = Node(data) # If the linked list is empty, the new_node becomes the head if head is None: return new_node temp_node = head while temp_node.next_node: temp_node = temp_node.next_node temp_node.next_node = new_node return head def rotate_to_the_right(head: Node, places: int) -> Node: """ Rotate a linked list to the right by places times. Parameters: head: The head of the linked list. places: The number of places to rotate. Returns: Node: The head of the rotated linked list. >>> rotate_to_the_right(None, places=1) Traceback (most recent call last): ... ValueError: The linked list is empty. >>> head = insert_node(None, 1) >>> rotate_to_the_right(head, places=1) == head True >>> head = insert_node(None, 1) >>> head = insert_node(head, 2) >>> head = insert_node(head, 3) >>> head = insert_node(head, 4) >>> head = insert_node(head, 5) >>> new_head = rotate_to_the_right(head, places=2) >>> print_linked_list(new_head) 4->5->1->2->3 """ # Check if the list is empty or has only one element if not head: raise ValueError("The linked list is empty.") if head.next_node is None: return head # Calculate the length of the linked list length = 1 temp_node = head while temp_node.next_node is not None: length += 1 temp_node = temp_node.next_node # Adjust the value of places to avoid places longer than the list. places %= length if places == 0: return head # As no rotation is needed. # Find the new head position after rotation. new_head_index = length - places # Traverse to the new head position temp_node = head for _ in range(new_head_index - 1): assert temp_node.next_node temp_node = temp_node.next_node # Update pointers to perform rotation assert temp_node.next_node new_head = temp_node.next_node temp_node.next_node = None temp_node = new_head while temp_node.next_node: temp_node = temp_node.next_node temp_node.next_node = head assert new_head return new_head if __name__ == "__main__": import doctest doctest.testmod() head = insert_node(None, 5) head = insert_node(head, 1) head = insert_node(head, 2) head = insert_node(head, 4) head = insert_node(head, 3) print("Original list: ", end="") print_linked_list(head) places = 3 new_head = rotate_to_the_right(head, places) print(f"After {places} iterations: ", end="") print_linked_list(new_head) ================================================ FILE: data_structures/linked_list/singly_linked_list.py ================================================ from __future__ import annotations from collections.abc import Iterator from dataclasses import dataclass from typing import Any @dataclass class Node: """ Create and initialize Node class instance. >>> Node(20) Node(20) >>> Node("Hello, world!") Node(Hello, world!) >>> Node(None) Node(None) >>> Node(True) Node(True) """ data: Any next_node: Node | None = None def __repr__(self) -> str: """ Get the string representation of this node. >>> Node(10).__repr__() 'Node(10)' >>> repr(Node(10)) 'Node(10)' >>> str(Node(10)) 'Node(10)' >>> Node(10) Node(10) """ return f"Node({self.data})" class LinkedList: def __init__(self): """ Create and initialize LinkedList class instance. >>> linked_list = LinkedList() >>> linked_list.head is None True """ self.head = None def __iter__(self) -> Iterator[Any]: """ This function is intended for iterators to access and iterate through data inside linked list. >>> linked_list = LinkedList() >>> linked_list.insert_tail("tail") >>> linked_list.insert_tail("tail_1") >>> linked_list.insert_tail("tail_2") >>> for node in linked_list: # __iter__ used here. ... node 'tail' 'tail_1' 'tail_2' """ node = self.head while node: yield node.data node = node.next_node def __len__(self) -> int: """ Return length of linked list i.e. number of nodes >>> linked_list = LinkedList() >>> len(linked_list) 0 >>> linked_list.insert_tail("tail") >>> len(linked_list) 1 >>> linked_list.insert_head("head") >>> len(linked_list) 2 >>> _ = linked_list.delete_tail() >>> len(linked_list) 1 >>> _ = linked_list.delete_head() >>> len(linked_list) 0 """ return sum(1 for _ in self) def __repr__(self) -> str: """ String representation/visualization of a Linked Lists >>> linked_list = LinkedList() >>> linked_list.insert_tail(1) >>> linked_list.insert_tail(3) >>> linked_list.__repr__() '1 -> 3' >>> repr(linked_list) '1 -> 3' >>> str(linked_list) '1 -> 3' >>> linked_list.insert_tail(5) >>> f"{linked_list}" '1 -> 3 -> 5' """ return " -> ".join([str(item) for item in self]) def __getitem__(self, index: int) -> Any: """ Indexing Support. Used to get a node at particular position >>> linked_list = LinkedList() >>> for i in range(0, 10): ... linked_list.insert_nth(i, i) >>> all(str(linked_list[i]) == str(i) for i in range(0, 10)) True >>> linked_list[-10] Traceback (most recent call last): ... ValueError: list index out of range. >>> linked_list[len(linked_list)] Traceback (most recent call last): ... ValueError: list index out of range. """ if not 0 <= index < len(self): raise ValueError("list index out of range.") for i, node in enumerate(self): if i == index: return node return None # Used to change the data of a particular node def __setitem__(self, index: int, data: Any) -> None: """ >>> linked_list = LinkedList() >>> for i in range(0, 10): ... linked_list.insert_nth(i, i) >>> linked_list[0] = 666 >>> linked_list[0] 666 >>> linked_list[5] = -666 >>> linked_list[5] -666 >>> linked_list[-10] = 666 Traceback (most recent call last): ... ValueError: list index out of range. >>> linked_list[len(linked_list)] = 666 Traceback (most recent call last): ... ValueError: list index out of range. """ if not 0 <= index < len(self): raise ValueError("list index out of range.") current = self.head for _ in range(index): current = current.next_node current.data = data def insert_tail(self, data: Any) -> None: """ Insert data to the end of linked list. >>> linked_list = LinkedList() >>> linked_list.insert_tail("tail") >>> linked_list tail >>> linked_list.insert_tail("tail_2") >>> linked_list tail -> tail_2 >>> linked_list.insert_tail("tail_3") >>> linked_list tail -> tail_2 -> tail_3 """ self.insert_nth(len(self), data) def insert_head(self, data: Any) -> None: """ Insert data to the beginning of linked list. >>> linked_list = LinkedList() >>> linked_list.insert_head("head") >>> linked_list head >>> linked_list.insert_head("head_2") >>> linked_list head_2 -> head >>> linked_list.insert_head("head_3") >>> linked_list head_3 -> head_2 -> head """ self.insert_nth(0, data) def insert_nth(self, index: int, data: Any) -> None: """ Insert data at given index. >>> linked_list = LinkedList() >>> linked_list.insert_tail("first") >>> linked_list.insert_tail("second") >>> linked_list.insert_tail("third") >>> linked_list first -> second -> third >>> linked_list.insert_nth(1, "fourth") >>> linked_list first -> fourth -> second -> third >>> linked_list.insert_nth(3, "fifth") >>> linked_list first -> fourth -> second -> fifth -> third """ if not 0 <= index <= len(self): raise IndexError("list index out of range") new_node = Node(data) if self.head is None: self.head = new_node elif index == 0: new_node.next_node = self.head # link new_node to head self.head = new_node else: temp = self.head for _ in range(index - 1): temp = temp.next_node new_node.next_node = temp.next_node temp.next_node = new_node def print_list(self) -> None: # print every node data """ This method prints every node data. >>> linked_list = LinkedList() >>> linked_list.insert_tail("first") >>> linked_list.insert_tail("second") >>> linked_list.insert_tail("third") >>> linked_list first -> second -> third """ print(self) def delete_head(self) -> Any: """ Delete the first node and return the node's data. >>> linked_list = LinkedList() >>> linked_list.insert_tail("first") >>> linked_list.insert_tail("second") >>> linked_list.insert_tail("third") >>> linked_list first -> second -> third >>> linked_list.delete_head() 'first' >>> linked_list second -> third >>> linked_list.delete_head() 'second' >>> linked_list third >>> linked_list.delete_head() 'third' >>> linked_list.delete_head() Traceback (most recent call last): ... IndexError: List index out of range. """ return self.delete_nth(0) def delete_tail(self) -> Any: # delete from tail """ Delete the tail end node and return the node's data. >>> linked_list = LinkedList() >>> linked_list.insert_tail("first") >>> linked_list.insert_tail("second") >>> linked_list.insert_tail("third") >>> linked_list first -> second -> third >>> linked_list.delete_tail() 'third' >>> linked_list first -> second >>> linked_list.delete_tail() 'second' >>> linked_list first >>> linked_list.delete_tail() 'first' >>> linked_list.delete_tail() Traceback (most recent call last): ... IndexError: List index out of range. """ return self.delete_nth(len(self) - 1) def delete_nth(self, index: int = 0) -> Any: """ Delete node at given index and return the node's data. >>> linked_list = LinkedList() >>> linked_list.insert_tail("first") >>> linked_list.insert_tail("second") >>> linked_list.insert_tail("third") >>> linked_list first -> second -> third >>> linked_list.delete_nth(1) # delete middle 'second' >>> linked_list first -> third >>> linked_list.delete_nth(5) # this raises error Traceback (most recent call last): ... IndexError: List index out of range. >>> linked_list.delete_nth(-1) # this also raises error Traceback (most recent call last): ... IndexError: List index out of range. """ if not 0 <= index <= len(self) - 1: # test if index is valid raise IndexError("List index out of range.") delete_node = self.head # default first node if index == 0: self.head = self.head.next_node else: temp = self.head for _ in range(index - 1): temp = temp.next_node delete_node = temp.next_node temp.next_node = temp.next_node.next_node return delete_node.data def is_empty(self) -> bool: """ Check if linked list is empty. >>> linked_list = LinkedList() >>> linked_list.is_empty() True >>> linked_list.insert_head("first") >>> linked_list.is_empty() False """ return self.head is None def reverse(self) -> None: """ This reverses the linked list order. >>> linked_list = LinkedList() >>> linked_list.insert_tail("first") >>> linked_list.insert_tail("second") >>> linked_list.insert_tail("third") >>> linked_list first -> second -> third >>> linked_list.reverse() >>> linked_list third -> second -> first """ prev = None current = self.head while current: # Store the current node's next node. next_node = current.next_node # Make the current node's next_node point backwards current.next_node = prev # Make the previous node be the current node prev = current # Make the current node the next_node node (to progress iteration) current = next_node # Return prev in order to put the head at the end self.head = prev def test_singly_linked_list() -> None: """ >>> test_singly_linked_list() """ linked_list = LinkedList() assert linked_list.is_empty() is True assert str(linked_list) == "" try: linked_list.delete_head() raise AssertionError # This should not happen. except IndexError: assert True # This should happen. try: linked_list.delete_tail() raise AssertionError # This should not happen. except IndexError: assert True # This should happen. for i in range(10): assert len(linked_list) == i linked_list.insert_nth(i, i + 1) assert str(linked_list) == " -> ".join(str(i) for i in range(1, 11)) linked_list.insert_head(0) linked_list.insert_tail(11) assert str(linked_list) == " -> ".join(str(i) for i in range(12)) assert linked_list.delete_head() == 0 assert linked_list.delete_nth(9) == 10 assert linked_list.delete_tail() == 11 assert len(linked_list) == 9 assert str(linked_list) == " -> ".join(str(i) for i in range(1, 10)) assert all(linked_list[i] == i + 1 for i in range(9)) is True for i in range(9): linked_list[i] = -i assert all(linked_list[i] == -i for i in range(9)) is True linked_list.reverse() assert str(linked_list) == " -> ".join(str(i) for i in range(-8, 1)) def test_singly_linked_list_2() -> None: """ This section of the test used varying data types for input. >>> test_singly_linked_list_2() """ test_input = [ -9, 100, Node(77345112), "dlrow olleH", 7, 5555, 0, -192.55555, "Hello, world!", 77.9, Node(10), None, None, 12.20, ] linked_list = LinkedList() for i in test_input: linked_list.insert_tail(i) # Check if it's empty or not assert linked_list.is_empty() is False assert ( str(linked_list) == "-9 -> 100 -> Node(77345112) -> dlrow olleH -> 7 -> 5555 -> " "0 -> -192.55555 -> Hello, world! -> 77.9 -> Node(10) -> None -> None -> 12.2" ) # Delete the head result = linked_list.delete_head() assert result == -9 assert ( str(linked_list) == "100 -> Node(77345112) -> dlrow olleH -> 7 -> 5555 -> 0 -> " "-192.55555 -> Hello, world! -> 77.9 -> Node(10) -> None -> None -> 12.2" ) # Delete the tail result = linked_list.delete_tail() assert result == 12.2 assert ( str(linked_list) == "100 -> Node(77345112) -> dlrow olleH -> 7 -> 5555 -> 0 -> " "-192.55555 -> Hello, world! -> 77.9 -> Node(10) -> None -> None" ) # Delete a node in specific location in linked list result = linked_list.delete_nth(10) assert result is None assert ( str(linked_list) == "100 -> Node(77345112) -> dlrow olleH -> 7 -> 5555 -> 0 -> " "-192.55555 -> Hello, world! -> 77.9 -> Node(10) -> None" ) # Add a Node instance to its head linked_list.insert_head(Node("Hello again, world!")) assert ( str(linked_list) == "Node(Hello again, world!) -> 100 -> Node(77345112) -> dlrow olleH -> " "7 -> 5555 -> 0 -> -192.55555 -> Hello, world! -> 77.9 -> Node(10) -> None" ) # Add None to its tail linked_list.insert_tail(None) assert ( str(linked_list) == "Node(Hello again, world!) -> 100 -> Node(77345112) -> dlrow olleH -> 7 -> " "5555 -> 0 -> -192.55555 -> Hello, world! -> 77.9 -> Node(10) -> None -> None" ) # Reverse the linked list linked_list.reverse() assert ( str(linked_list) == "None -> None -> Node(10) -> 77.9 -> Hello, world! -> -192.55555 -> 0 -> " "5555 -> 7 -> dlrow olleH -> Node(77345112) -> 100 -> Node(Hello again, world!)" ) def main(): from doctest import testmod testmod() linked_list = LinkedList() linked_list.insert_head(input("Inserting 1st at head ").strip()) linked_list.insert_head(input("Inserting 2nd at head ").strip()) print("\nPrint list:") linked_list.print_list() linked_list.insert_tail(input("\nInserting 1st at tail ").strip()) linked_list.insert_tail(input("Inserting 2nd at tail ").strip()) print("\nPrint list:") linked_list.print_list() print("\nDelete head") linked_list.delete_head() print("Delete tail") linked_list.delete_tail() print("\nPrint list:") linked_list.print_list() print("\nReverse linked list") linked_list.reverse() print("\nPrint list:") linked_list.print_list() print("\nString representation of linked list:") print(linked_list) print("\nReading/changing Node data using indexing:") print(f"Element at Position 1: {linked_list[1]}") linked_list[1] = input("Enter New Value: ").strip() print("New list:") print(linked_list) print(f"length of linked_list is : {len(linked_list)}") if __name__ == "__main__": main() ================================================ FILE: data_structures/linked_list/skip_list.py ================================================ """ Based on "Skip Lists: A Probabilistic Alternative to Balanced Trees" by William Pugh https://epaperpress.com/sortsearch/download/skiplist.pdf """ from __future__ import annotations from itertools import pairwise from random import random from typing import TypeVar KT = TypeVar("KT") VT = TypeVar("VT") class Node[KT, VT]: def __init__(self, key: KT | str = "root", value: VT | None = None): self.key = key self.value = value self.forward: list[Node[KT, VT]] = [] def __repr__(self) -> str: """ :return: Visual representation of Node >>> node = Node("Key", 2) >>> repr(node) 'Node(Key: 2)' """ return f"Node({self.key}: {self.value})" @property def level(self) -> int: """ :return: Number of forward references >>> node = Node("Key", 2) >>> node.level 0 >>> node.forward.append(Node("Key2", 4)) >>> node.level 1 >>> node.forward.append(Node("Key3", 6)) >>> node.level 2 """ return len(self.forward) class SkipList[KT, VT]: def __init__(self, p: float = 0.5, max_level: int = 16): self.head: Node[KT, VT] = Node[KT, VT]() self.level = 0 self.p = p self.max_level = max_level def __str__(self) -> str: """ :return: Visual representation of SkipList >>> skip_list = SkipList() >>> print(skip_list) SkipList(level=0) >>> skip_list.insert("Key1", "Value") >>> print(skip_list) # doctest: +ELLIPSIS SkipList(level=... [root]--... [Key1]--Key1... None *... >>> skip_list.insert("Key2", "OtherValue") >>> print(skip_list) # doctest: +ELLIPSIS SkipList(level=... [root]--... [Key1]--Key1... [Key2]--Key2... None *... """ items = list(self) if len(items) == 0: return f"SkipList(level={self.level})" label_size = max((len(str(item)) for item in items), default=4) label_size = max(label_size, 4) + 4 node = self.head lines = [] forwards = node.forward.copy() lines.append(f"[{node.key}]".ljust(label_size, "-") + "* " * len(forwards)) lines.append(" " * label_size + "| " * len(forwards)) while len(node.forward) != 0: node = node.forward[0] lines.append( f"[{node.key}]".ljust(label_size, "-") + " ".join(str(n.key) if n.key == node.key else "|" for n in forwards) ) lines.append(" " * label_size + "| " * len(forwards)) forwards[: node.level] = node.forward lines.append("None".ljust(label_size) + "* " * len(forwards)) return f"SkipList(level={self.level})\n" + "\n".join(lines) def __iter__(self): node = self.head while len(node.forward) != 0: yield node.forward[0].key node = node.forward[0] def random_level(self) -> int: """ :return: Random level from [1, self.max_level] interval. Higher values are less likely. """ level = 1 while random() < self.p and level < self.max_level: level += 1 return level def _locate_node(self, key) -> tuple[Node[KT, VT] | None, list[Node[KT, VT]]]: """ :param key: Searched key, :return: Tuple with searched node (or None if given key is not present) and list of nodes that refer (if key is present) of should refer to given node. """ # Nodes with refer or should refer to output node update_vector = [] node = self.head for i in reversed(range(self.level)): # i < node.level - When node level is lesser than `i` decrement `i`. # node.forward[i].key < key - Jumping to node with key value higher # or equal to searched key would result # in skipping searched key. while i < node.level and node.forward[i].key < key: node = node.forward[i] # Each leftmost node (relative to searched node) will potentially have to # be updated. update_vector.append(node) update_vector.reverse() # Note that we were inserting values in reverse order. # len(node.forward) != 0 - If current node doesn't contain any further # references then searched key is not present. # node.forward[0].key == key - Next node key should be equal to search key # if key is present. if len(node.forward) != 0 and node.forward[0].key == key: return node.forward[0], update_vector else: return None, update_vector def delete(self, key: KT): """ :param key: Key to remove from list. >>> skip_list = SkipList() >>> skip_list.insert(2, "Two") >>> skip_list.insert(1, "One") >>> skip_list.insert(3, "Three") >>> list(skip_list) [1, 2, 3] >>> skip_list.delete(2) >>> list(skip_list) [1, 3] """ node, update_vector = self._locate_node(key) if node is not None: for i, update_node in enumerate(update_vector): # Remove or replace all references to removed node. if update_node.level > i and update_node.forward[i].key == key: if node.level > i: update_node.forward[i] = node.forward[i] else: update_node.forward = update_node.forward[:i] def insert(self, key: KT, value: VT): """ :param key: Key to insert. :param value: Value associated with given key. >>> skip_list = SkipList() >>> skip_list.insert(2, "Two") >>> skip_list.find(2) 'Two' >>> list(skip_list) [2] """ node, update_vector = self._locate_node(key) if node is not None: node.value = value else: level = self.random_level() if level > self.level: # After level increase we have to add additional nodes to head. for _ in range(self.level - 1, level): update_vector.append(self.head) self.level = level new_node = Node(key, value) for i, update_node in enumerate(update_vector[:level]): # Change references to pass through new node. if update_node.level > i: new_node.forward.append(update_node.forward[i]) if update_node.level < i + 1: update_node.forward.append(new_node) else: update_node.forward[i] = new_node def find(self, key: VT) -> VT | None: """ :param key: Search key. :return: Value associated with given key or None if given key is not present. >>> skip_list = SkipList() >>> skip_list.find(2) >>> skip_list.insert(2, "Two") >>> skip_list.find(2) 'Two' >>> skip_list.insert(2, "Three") >>> skip_list.find(2) 'Three' """ node, _ = self._locate_node(key) if node is not None: return node.value return None def test_insert(): skip_list = SkipList() skip_list.insert("Key1", 3) skip_list.insert("Key2", 12) skip_list.insert("Key3", 41) skip_list.insert("Key4", -19) node = skip_list.head all_values = {} while node.level != 0: node = node.forward[0] all_values[node.key] = node.value assert len(all_values) == 4 assert all_values["Key1"] == 3 assert all_values["Key2"] == 12 assert all_values["Key3"] == 41 assert all_values["Key4"] == -19 def test_insert_overrides_existing_value(): skip_list = SkipList() skip_list.insert("Key1", 10) skip_list.insert("Key1", 12) skip_list.insert("Key5", 7) skip_list.insert("Key7", 10) skip_list.insert("Key10", 5) skip_list.insert("Key7", 7) skip_list.insert("Key5", 5) skip_list.insert("Key10", 10) node = skip_list.head all_values = {} while node.level != 0: node = node.forward[0] all_values[node.key] = node.value if len(all_values) != 4: print() assert len(all_values) == 4 assert all_values["Key1"] == 12 assert all_values["Key7"] == 7 assert all_values["Key5"] == 5 assert all_values["Key10"] == 10 def test_searching_empty_list_returns_none(): skip_list = SkipList() assert skip_list.find("Some key") is None def test_search(): skip_list = SkipList() skip_list.insert("Key2", 20) assert skip_list.find("Key2") == 20 skip_list.insert("Some Key", 10) skip_list.insert("Key2", 8) skip_list.insert("V", 13) assert skip_list.find("Y") is None assert skip_list.find("Key2") == 8 assert skip_list.find("Some Key") == 10 assert skip_list.find("V") == 13 def test_deleting_item_from_empty_list_do_nothing(): skip_list = SkipList() skip_list.delete("Some key") assert len(skip_list.head.forward) == 0 def test_deleted_items_are_not_founded_by_find_method(): skip_list = SkipList() skip_list.insert("Key1", 12) skip_list.insert("V", 13) skip_list.insert("X", 14) skip_list.insert("Key2", 15) skip_list.delete("V") skip_list.delete("Key2") assert skip_list.find("V") is None assert skip_list.find("Key2") is None def test_delete_removes_only_given_key(): skip_list = SkipList() skip_list.insert("Key1", 12) skip_list.insert("V", 13) skip_list.insert("X", 14) skip_list.insert("Key2", 15) skip_list.delete("V") assert skip_list.find("V") is None assert skip_list.find("X") == 14 assert skip_list.find("Key1") == 12 assert skip_list.find("Key2") == 15 skip_list.delete("X") assert skip_list.find("V") is None assert skip_list.find("X") is None assert skip_list.find("Key1") == 12 assert skip_list.find("Key2") == 15 skip_list.delete("Key1") assert skip_list.find("V") is None assert skip_list.find("X") is None assert skip_list.find("Key1") is None assert skip_list.find("Key2") == 15 skip_list.delete("Key2") assert skip_list.find("V") is None assert skip_list.find("X") is None assert skip_list.find("Key1") is None assert skip_list.find("Key2") is None def test_delete_doesnt_leave_dead_nodes(): skip_list = SkipList() skip_list.insert("Key1", 12) skip_list.insert("V", 13) skip_list.insert("X", 142) skip_list.insert("Key2", 15) skip_list.delete("X") def traverse_keys(node): yield node.key for forward_node in node.forward: yield from traverse_keys(forward_node) assert len(set(traverse_keys(skip_list.head))) == 4 def test_iter_always_yields_sorted_values(): def is_sorted(lst): return all(next_item >= item for item, next_item in pairwise(lst)) skip_list = SkipList() for i in range(10): skip_list.insert(i, i) assert is_sorted(list(skip_list)) skip_list.delete(5) skip_list.delete(8) skip_list.delete(2) assert is_sorted(list(skip_list)) skip_list.insert(-12, -12) skip_list.insert(77, 77) assert is_sorted(list(skip_list)) def pytests(): for _ in range(100): # Repeat test 100 times due to the probabilistic nature of skip list # random values == random bugs test_insert() test_insert_overrides_existing_value() test_searching_empty_list_returns_none() test_search() test_deleting_item_from_empty_list_do_nothing() test_deleted_items_are_not_founded_by_find_method() test_delete_removes_only_given_key() test_delete_doesnt_leave_dead_nodes() test_iter_always_yields_sorted_values() def main(): """ >>> pytests() """ skip_list = SkipList() skip_list.insert(2, "2") skip_list.insert(4, "4") skip_list.insert(6, "4") skip_list.insert(4, "5") skip_list.insert(8, "4") skip_list.insert(9, "4") skip_list.delete(4) print(skip_list) if __name__ == "__main__": import doctest doctest.testmod() main() ================================================ FILE: data_structures/linked_list/swap_nodes.py ================================================ from __future__ import annotations from collections.abc import Iterator from dataclasses import dataclass from typing import Any @dataclass class Node: data: Any next_node: Node | None = None @dataclass class LinkedList: head: Node | None = None def __iter__(self) -> Iterator: """ >>> linked_list = LinkedList() >>> list(linked_list) [] >>> linked_list.push(0) >>> tuple(linked_list) (0,) """ node = self.head while node: yield node.data node = node.next_node def __len__(self) -> int: """ >>> linked_list = LinkedList() >>> len(linked_list) 0 >>> linked_list.push(0) >>> len(linked_list) 1 """ return sum(1 for _ in self) def push(self, new_data: Any) -> None: """ Add a new node with the given data to the beginning of the Linked List. Args: new_data (Any): The data to be added to the new node. Returns: None Examples: >>> linked_list = LinkedList() >>> linked_list.push(5) >>> linked_list.push(4) >>> linked_list.push(3) >>> linked_list.push(2) >>> linked_list.push(1) >>> list(linked_list) [1, 2, 3, 4, 5] """ new_node = Node(new_data) new_node.next_node = self.head self.head = new_node def swap_nodes(self, node_data_1: Any, node_data_2: Any) -> None: """ Swap the positions of two nodes in the Linked List based on their data values. Args: node_data_1: Data value of the first node to be swapped. node_data_2: Data value of the second node to be swapped. Note: If either of the specified data values isn't found then, no swapping occurs. Examples: When both values are present in a linked list. >>> linked_list = LinkedList() >>> linked_list.push(5) >>> linked_list.push(4) >>> linked_list.push(3) >>> linked_list.push(2) >>> linked_list.push(1) >>> list(linked_list) [1, 2, 3, 4, 5] >>> linked_list.swap_nodes(1, 5) >>> tuple(linked_list) (5, 2, 3, 4, 1) When one value is present and the other isn't in the linked list. >>> second_list = LinkedList() >>> second_list.push(6) >>> second_list.push(7) >>> second_list.push(8) >>> second_list.push(9) >>> second_list.swap_nodes(1, 6) is None True When both values are absent in the linked list. >>> second_list = LinkedList() >>> second_list.push(10) >>> second_list.push(9) >>> second_list.push(8) >>> second_list.push(7) >>> second_list.swap_nodes(1, 3) is None True When linkedlist is empty. >>> second_list = LinkedList() >>> second_list.swap_nodes(1, 3) is None True Returns: None """ if node_data_1 == node_data_2: return node_1 = self.head while node_1 and node_1.data != node_data_1: node_1 = node_1.next_node node_2 = self.head while node_2 and node_2.data != node_data_2: node_2 = node_2.next_node if node_1 is None or node_2 is None: return # Swap the data values of the two nodes node_1.data, node_2.data = node_2.data, node_1.data if __name__ == "__main__": """ Python script that outputs the swap of nodes in a linked list. """ from doctest import testmod testmod() linked_list = LinkedList() for i in range(5, 0, -1): linked_list.push(i) print(f"Original Linked List: {list(linked_list)}") linked_list.swap_nodes(1, 4) print(f"Modified Linked List: {list(linked_list)}") print("After swapping the nodes whose data is 1 and 4.") ================================================ FILE: data_structures/queues/__init__.py ================================================ ================================================ FILE: data_structures/queues/circular_queue.py ================================================ # Implementation of Circular Queue (using Python lists) class CircularQueue: """Circular FIFO queue with a fixed capacity""" def __init__(self, n: int): self.n = n self.array = [None] * self.n self.front = 0 # index of the first element self.rear = 0 self.size = 0 def __len__(self) -> int: """ >>> cq = CircularQueue(5) >>> len(cq) 0 >>> cq.enqueue("A") # doctest: +ELLIPSIS >>> cq.array ['A', None, None, None, None] >>> len(cq) 1 """ return self.size def is_empty(self) -> bool: """ Checks whether the queue is empty or not >>> cq = CircularQueue(5) >>> cq.is_empty() True >>> cq.enqueue("A").is_empty() False """ return self.size == 0 def first(self): """ Returns the first element of the queue >>> cq = CircularQueue(5) >>> cq.first() False >>> cq.enqueue("A").first() 'A' """ return False if self.is_empty() else self.array[self.front] def enqueue(self, data): """ This function inserts an element at the end of the queue using self.rear value as an index. >>> cq = CircularQueue(5) >>> cq.enqueue("A") # doctest: +ELLIPSIS >>> (cq.size, cq.first()) (1, 'A') >>> cq.enqueue("B") # doctest: +ELLIPSIS >>> cq.array ['A', 'B', None, None, None] >>> (cq.size, cq.first()) (2, 'A') >>> cq.enqueue("C").enqueue("D").enqueue("E") # doctest: +ELLIPSIS >>> cq.enqueue("F") Traceback (most recent call last): ... Exception: QUEUE IS FULL """ if self.size >= self.n: raise Exception("QUEUE IS FULL") self.array[self.rear] = data self.rear = (self.rear + 1) % self.n self.size += 1 return self def dequeue(self): """ This function removes an element from the queue using on self.front value as an index and returns it >>> cq = CircularQueue(5) >>> cq.dequeue() Traceback (most recent call last): ... Exception: UNDERFLOW >>> cq.enqueue("A").enqueue("B").dequeue() 'A' >>> (cq.size, cq.first()) (1, 'B') >>> cq.dequeue() 'B' >>> cq.dequeue() Traceback (most recent call last): ... Exception: UNDERFLOW """ if self.size == 0: raise Exception("UNDERFLOW") temp = self.array[self.front] self.array[self.front] = None self.front = (self.front + 1) % self.n self.size -= 1 return temp ================================================ FILE: data_structures/queues/circular_queue_linked_list.py ================================================ # Implementation of Circular Queue using linked lists # https://en.wikipedia.org/wiki/Circular_buffer from __future__ import annotations from typing import Any class CircularQueueLinkedList: """ Circular FIFO list with the given capacity (default queue length : 6) >>> cq = CircularQueueLinkedList(2) >>> cq.enqueue('a') >>> cq.enqueue('b') >>> cq.enqueue('c') Traceback (most recent call last): ... Exception: Full Queue """ def __init__(self, initial_capacity: int = 6) -> None: self.front: Node | None = None self.rear: Node | None = None self.create_linked_list(initial_capacity) def create_linked_list(self, initial_capacity: int) -> None: current_node = Node() self.front = current_node self.rear = current_node previous_node = current_node for _ in range(1, initial_capacity): current_node = Node() previous_node.next = current_node current_node.prev = previous_node previous_node = current_node previous_node.next = self.front self.front.prev = previous_node def is_empty(self) -> bool: """ Checks whether the queue is empty or not >>> cq = CircularQueueLinkedList() >>> cq.is_empty() True >>> cq.enqueue('a') >>> cq.is_empty() False >>> cq.dequeue() 'a' >>> cq.is_empty() True """ return ( self.front == self.rear and self.front is not None and self.front.data is None ) def first(self) -> Any | None: """ Returns the first element of the queue >>> cq = CircularQueueLinkedList() >>> cq.first() Traceback (most recent call last): ... Exception: Empty Queue >>> cq.enqueue('a') >>> cq.first() 'a' >>> cq.dequeue() 'a' >>> cq.first() Traceback (most recent call last): ... Exception: Empty Queue >>> cq.enqueue('b') >>> cq.enqueue('c') >>> cq.first() 'b' """ self.check_can_perform_operation() return self.front.data if self.front else None def enqueue(self, data: Any) -> None: """ Saves data at the end of the queue >>> cq = CircularQueueLinkedList() >>> cq.enqueue('a') >>> cq.enqueue('b') >>> cq.dequeue() 'a' >>> cq.dequeue() 'b' >>> cq.dequeue() Traceback (most recent call last): ... Exception: Empty Queue """ if self.rear is None: return self.check_is_full() if not self.is_empty(): self.rear = self.rear.next if self.rear: self.rear.data = data def dequeue(self) -> Any: """ Removes and retrieves the first element of the queue >>> cq = CircularQueueLinkedList() >>> cq.dequeue() Traceback (most recent call last): ... Exception: Empty Queue >>> cq.enqueue('a') >>> cq.dequeue() 'a' >>> cq.dequeue() Traceback (most recent call last): ... Exception: Empty Queue """ self.check_can_perform_operation() if self.rear is None or self.front is None: return None if self.front == self.rear: data = self.front.data self.front.data = None return data old_front = self.front self.front = old_front.next data = old_front.data old_front.data = None return data def check_can_perform_operation(self) -> None: if self.is_empty(): raise Exception("Empty Queue") def check_is_full(self) -> None: if self.rear and self.rear.next == self.front: raise Exception("Full Queue") class Node: def __init__(self) -> None: self.data: Any | None = None self.next: Node | None = None self.prev: Node | None = None if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/queues/double_ended_queue.py ================================================ """ Implementation of double ended queue. """ from __future__ import annotations from collections.abc import Iterable from dataclasses import dataclass from typing import Any class Deque: """ Deque data structure. Operations ---------- append(val: Any) -> None appendleft(val: Any) -> None extend(iterable: Iterable) -> None extendleft(iterable: Iterable) -> None pop() -> Any popleft() -> Any Observers --------- is_empty() -> bool Attributes ---------- _front: _Node front of the deque a.k.a. the first element _back: _Node back of the element a.k.a. the last element _len: int the number of nodes """ __slots__ = ("_back", "_front", "_len") @dataclass class _Node: """ Representation of a node. Contains a value and a pointer to the next node as well as to the previous one. """ val: Any = None next_node: Deque._Node | None = None prev_node: Deque._Node | None = None class _Iterator: """ Helper class for iteration. Will be used to implement iteration. Attributes ---------- _cur: _Node the current node of the iteration. """ __slots__ = ("_cur",) def __init__(self, cur: Deque._Node | None) -> None: self._cur = cur def __iter__(self) -> Deque._Iterator: """ >>> our_deque = Deque([1, 2, 3]) >>> iterator = iter(our_deque) """ return self def __next__(self) -> Any: """ >>> our_deque = Deque([1, 2, 3]) >>> iterator = iter(our_deque) >>> next(iterator) 1 >>> next(iterator) 2 >>> next(iterator) 3 """ if self._cur is None: # finished iterating raise StopIteration val = self._cur.val self._cur = self._cur.next_node return val def __init__(self, iterable: Iterable[Any] | None = None) -> None: self._front: Any = None self._back: Any = None self._len: int = 0 if iterable is not None: # append every value to the deque for val in iterable: self.append(val) def append(self, val: Any) -> None: """ Adds val to the end of the deque. Time complexity: O(1) >>> our_deque_1 = Deque([1, 2, 3]) >>> our_deque_1.append(4) >>> our_deque_1 [1, 2, 3, 4] >>> our_deque_2 = Deque('ab') >>> our_deque_2.append('c') >>> our_deque_2 ['a', 'b', 'c'] >>> from collections import deque >>> deque_collections_1 = deque([1, 2, 3]) >>> deque_collections_1.append(4) >>> deque_collections_1 deque([1, 2, 3, 4]) >>> deque_collections_2 = deque('ab') >>> deque_collections_2.append('c') >>> deque_collections_2 deque(['a', 'b', 'c']) >>> list(our_deque_1) == list(deque_collections_1) True >>> list(our_deque_2) == list(deque_collections_2) True """ node = self._Node(val, None, None) if self.is_empty(): # front = back self._front = self._back = node self._len = 1 else: # connect nodes self._back.next_node = node node.prev_node = self._back self._back = node # assign new back to the new node self._len += 1 # make sure there were no errors assert not self.is_empty(), "Error on appending value." def appendleft(self, val: Any) -> None: """ Adds val to the beginning of the deque. Time complexity: O(1) >>> our_deque_1 = Deque([2, 3]) >>> our_deque_1.appendleft(1) >>> our_deque_1 [1, 2, 3] >>> our_deque_2 = Deque('bc') >>> our_deque_2.appendleft('a') >>> our_deque_2 ['a', 'b', 'c'] >>> from collections import deque >>> deque_collections_1 = deque([2, 3]) >>> deque_collections_1.appendleft(1) >>> deque_collections_1 deque([1, 2, 3]) >>> deque_collections_2 = deque('bc') >>> deque_collections_2.appendleft('a') >>> deque_collections_2 deque(['a', 'b', 'c']) >>> list(our_deque_1) == list(deque_collections_1) True >>> list(our_deque_2) == list(deque_collections_2) True """ node = self._Node(val, None, None) if self.is_empty(): # front = back self._front = self._back = node self._len = 1 else: # connect nodes node.next_node = self._front self._front.prev_node = node self._front = node # assign new front to the new node self._len += 1 # make sure there were no errors assert not self.is_empty(), "Error on appending value." def extend(self, iterable: Iterable[Any]) -> None: """ Appends every value of iterable to the end of the deque. Time complexity: O(n) >>> our_deque_1 = Deque([1, 2, 3]) >>> our_deque_1.extend([4, 5]) >>> our_deque_1 [1, 2, 3, 4, 5] >>> our_deque_2 = Deque('ab') >>> our_deque_2.extend('cd') >>> our_deque_2 ['a', 'b', 'c', 'd'] >>> from collections import deque >>> deque_collections_1 = deque([1, 2, 3]) >>> deque_collections_1.extend([4, 5]) >>> deque_collections_1 deque([1, 2, 3, 4, 5]) >>> deque_collections_2 = deque('ab') >>> deque_collections_2.extend('cd') >>> deque_collections_2 deque(['a', 'b', 'c', 'd']) >>> list(our_deque_1) == list(deque_collections_1) True >>> list(our_deque_2) == list(deque_collections_2) True """ for val in iterable: self.append(val) def extendleft(self, iterable: Iterable[Any]) -> None: """ Appends every value of iterable to the beginning of the deque. Time complexity: O(n) >>> our_deque_1 = Deque([1, 2, 3]) >>> our_deque_1.extendleft([0, -1]) >>> our_deque_1 [-1, 0, 1, 2, 3] >>> our_deque_2 = Deque('cd') >>> our_deque_2.extendleft('ba') >>> our_deque_2 ['a', 'b', 'c', 'd'] >>> from collections import deque >>> deque_collections_1 = deque([1, 2, 3]) >>> deque_collections_1.extendleft([0, -1]) >>> deque_collections_1 deque([-1, 0, 1, 2, 3]) >>> deque_collections_2 = deque('cd') >>> deque_collections_2.extendleft('ba') >>> deque_collections_2 deque(['a', 'b', 'c', 'd']) >>> list(our_deque_1) == list(deque_collections_1) True >>> list(our_deque_2) == list(deque_collections_2) True """ for val in iterable: self.appendleft(val) def pop(self) -> Any: """ Removes the last element of the deque and returns it. Time complexity: O(1) @returns topop.val: the value of the node to pop. >>> our_deque1 = Deque([1]) >>> our_popped1 = our_deque1.pop() >>> our_popped1 1 >>> our_deque1 [] >>> our_deque2 = Deque([1, 2, 3, 15182]) >>> our_popped2 = our_deque2.pop() >>> our_popped2 15182 >>> our_deque2 [1, 2, 3] >>> from collections import deque >>> deque_collections = deque([1, 2, 3, 15182]) >>> collections_popped = deque_collections.pop() >>> collections_popped 15182 >>> deque_collections deque([1, 2, 3]) >>> list(our_deque2) == list(deque_collections) True >>> our_popped2 == collections_popped True """ # make sure the deque has elements to pop assert not self.is_empty(), "Deque is empty." topop = self._back # if only one element in the queue: point the front and back to None # else remove one element from back if self._front == self._back: self._front = None self._back = None else: self._back = self._back.prev_node # set new back # drop the last node, python will deallocate memory automatically self._back.next_node = None self._len -= 1 return topop.val def popleft(self) -> Any: """ Removes the first element of the deque and returns it. Time complexity: O(1) @returns topop.val: the value of the node to pop. >>> our_deque1 = Deque([1]) >>> our_popped1 = our_deque1.pop() >>> our_popped1 1 >>> our_deque1 [] >>> our_deque2 = Deque([15182, 1, 2, 3]) >>> our_popped2 = our_deque2.popleft() >>> our_popped2 15182 >>> our_deque2 [1, 2, 3] >>> from collections import deque >>> deque_collections = deque([15182, 1, 2, 3]) >>> collections_popped = deque_collections.popleft() >>> collections_popped 15182 >>> deque_collections deque([1, 2, 3]) >>> list(our_deque2) == list(deque_collections) True >>> our_popped2 == collections_popped True """ # make sure the deque has elements to pop assert not self.is_empty(), "Deque is empty." topop = self._front # if only one element in the queue: point the front and back to None # else remove one element from front if self._front == self._back: self._front = None self._back = None else: self._front = self._front.next_node # set new front and drop the first node self._front.prev_node = None self._len -= 1 return topop.val def is_empty(self) -> bool: """ Checks if the deque is empty. Time complexity: O(1) >>> our_deque = Deque([1, 2, 3]) >>> our_deque.is_empty() False >>> our_empty_deque = Deque() >>> our_empty_deque.is_empty() True >>> from collections import deque >>> empty_deque_collections = deque() >>> list(our_empty_deque) == list(empty_deque_collections) True """ return self._front is None def __len__(self) -> int: """ Implements len() function. Returns the length of the deque. Time complexity: O(1) >>> our_deque = Deque([1, 2, 3]) >>> len(our_deque) 3 >>> our_empty_deque = Deque() >>> len(our_empty_deque) 0 >>> from collections import deque >>> deque_collections = deque([1, 2, 3]) >>> len(deque_collections) 3 >>> empty_deque_collections = deque() >>> len(empty_deque_collections) 0 >>> len(our_empty_deque) == len(empty_deque_collections) True """ return self._len def __eq__(self, other: object) -> bool: """ Implements "==" operator. Returns if *self* is equal to *other*. Time complexity: O(n) >>> our_deque_1 = Deque([1, 2, 3]) >>> our_deque_2 = Deque([1, 2, 3]) >>> our_deque_1 == our_deque_2 True >>> our_deque_3 = Deque([1, 2]) >>> our_deque_1 == our_deque_3 False >>> from collections import deque >>> deque_collections_1 = deque([1, 2, 3]) >>> deque_collections_2 = deque([1, 2, 3]) >>> deque_collections_1 == deque_collections_2 True >>> deque_collections_3 = deque([1, 2]) >>> deque_collections_1 == deque_collections_3 False >>> (our_deque_1 == our_deque_2) == (deque_collections_1 == deque_collections_2) True >>> (our_deque_1 == our_deque_3) == (deque_collections_1 == deque_collections_3) True """ if not isinstance(other, Deque): return NotImplemented me = self._front oth = other._front # if the length of the dequeues are not the same, they are not equal if len(self) != len(other): return False while me is not None and oth is not None: # compare every value if me.val != oth.val: return False me = me.next_node oth = oth.next_node return True def __iter__(self) -> Deque._Iterator: """ Implements iteration. Time complexity: O(1) >>> our_deque = Deque([1, 2, 3]) >>> for v in our_deque: ... print(v) 1 2 3 >>> from collections import deque >>> deque_collections = deque([1, 2, 3]) >>> for v in deque_collections: ... print(v) 1 2 3 """ return Deque._Iterator(self._front) def __repr__(self) -> str: """ Implements representation of the deque. Represents it as a list, with its values between '[' and ']'. Time complexity: O(n) >>> our_deque = Deque([1, 2, 3]) >>> our_deque [1, 2, 3] """ values_list = [] aux = self._front while aux is not None: # append the values in a list to display values_list.append(aux.val) aux = aux.next_node return f"[{', '.join(repr(val) for val in values_list)}]" if __name__ == "__main__": import doctest doctest.testmod() dq = Deque([3]) dq.pop() ================================================ FILE: data_structures/queues/linked_queue.py ================================================ """A Queue using a linked list like structure""" from __future__ import annotations from collections.abc import Iterator from typing import Any class Node: def __init__(self, data: Any) -> None: self.data: Any = data self.next: Node | None = None def __str__(self) -> str: return f"{self.data}" class LinkedQueue: """ >>> queue = LinkedQueue() >>> queue.is_empty() True >>> queue.put(5) >>> queue.put(9) >>> queue.put('python') >>> queue.is_empty() False >>> queue.get() 5 >>> queue.put('algorithms') >>> queue.get() 9 >>> queue.get() 'python' >>> queue.get() 'algorithms' >>> queue.is_empty() True >>> queue.get() Traceback (most recent call last): ... IndexError: dequeue from empty queue """ def __init__(self) -> None: self.front: Node | None = None self.rear: Node | None = None def __iter__(self) -> Iterator[Any]: node = self.front while node: yield node.data node = node.next def __len__(self) -> int: """ >>> queue = LinkedQueue() >>> for i in range(1, 6): ... queue.put(i) >>> len(queue) 5 >>> for i in range(1, 6): ... assert len(queue) == 6 - i ... _ = queue.get() >>> len(queue) 0 """ return len(tuple(iter(self))) def __str__(self) -> str: """ >>> queue = LinkedQueue() >>> for i in range(1, 4): ... queue.put(i) >>> queue.put("Python") >>> queue.put(3.14) >>> queue.put(True) >>> str(queue) '1 <- 2 <- 3 <- Python <- 3.14 <- True' """ return " <- ".join(str(item) for item in self) def is_empty(self) -> bool: """ >>> queue = LinkedQueue() >>> queue.is_empty() True >>> for i in range(1, 6): ... queue.put(i) >>> queue.is_empty() False """ return len(self) == 0 def put(self, item: Any) -> None: """ >>> queue = LinkedQueue() >>> queue.get() Traceback (most recent call last): ... IndexError: dequeue from empty queue >>> for i in range(1, 6): ... queue.put(i) >>> str(queue) '1 <- 2 <- 3 <- 4 <- 5' """ node = Node(item) if self.is_empty(): self.front = self.rear = node else: assert isinstance(self.rear, Node) self.rear.next = node self.rear = node def get(self) -> Any: """ >>> queue = LinkedQueue() >>> queue.get() Traceback (most recent call last): ... IndexError: dequeue from empty queue >>> queue = LinkedQueue() >>> for i in range(1, 6): ... queue.put(i) >>> for i in range(1, 6): ... assert queue.get() == i >>> len(queue) 0 """ if self.is_empty(): raise IndexError("dequeue from empty queue") assert isinstance(self.front, Node) node = self.front self.front = self.front.next if self.front is None: self.rear = None return node.data def clear(self) -> None: """ >>> queue = LinkedQueue() >>> for i in range(1, 6): ... queue.put(i) >>> queue.clear() >>> len(queue) 0 >>> str(queue) '' """ self.front = self.rear = None if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: data_structures/queues/priority_queue_using_list.py ================================================ """ Pure Python implementations of a Fixed Priority Queue and an Element Priority Queue using Python lists. """ class OverFlowError(Exception): pass class UnderFlowError(Exception): pass class FixedPriorityQueue: """ Tasks can be added to a Priority Queue at any time and in any order but when Tasks are removed then the Task with the highest priority is removed in FIFO order. In code we will use three levels of priority with priority zero Tasks being the most urgent (high priority) and priority 2 tasks being the least urgent. Examples >>> fpq = FixedPriorityQueue() >>> fpq.enqueue(0, 10) >>> fpq.enqueue(1, 70) >>> fpq.enqueue(0, 100) >>> fpq.enqueue(2, 1) >>> fpq.enqueue(2, 5) >>> fpq.enqueue(1, 7) >>> fpq.enqueue(2, 4) >>> fpq.enqueue(1, 64) >>> fpq.enqueue(0, 128) >>> print(fpq) Priority 0: [10, 100, 128] Priority 1: [70, 7, 64] Priority 2: [1, 5, 4] >>> fpq.dequeue() 10 >>> fpq.dequeue() 100 >>> fpq.dequeue() 128 >>> fpq.dequeue() 70 >>> fpq.dequeue() 7 >>> print(fpq) Priority 0: [] Priority 1: [64] Priority 2: [1, 5, 4] >>> fpq.dequeue() 64 >>> fpq.dequeue() 1 >>> fpq.dequeue() 5 >>> fpq.dequeue() 4 >>> fpq.dequeue() Traceback (most recent call last): ... data_structures.queues.priority_queue_using_list.UnderFlowError: All queues are empty >>> print(fpq) Priority 0: [] Priority 1: [] Priority 2: [] """ # noqa: E501 def __init__(self): self.queues = [ [], [], [], ] def enqueue(self, priority: int, data: int) -> None: """ Add an element to a queue based on its priority. If the priority is invalid ValueError is raised. If the queue is full an OverFlowError is raised. """ try: if len(self.queues[priority]) >= 100: raise OverflowError("Maximum queue size is 100") self.queues[priority].append(data) except IndexError: raise ValueError("Valid priorities are 0, 1, and 2") def dequeue(self) -> int: """ Return the highest priority element in FIFO order. If the queue is empty then an under flow exception is raised. """ for queue in self.queues: if queue: return queue.pop(0) raise UnderFlowError("All queues are empty") def __str__(self) -> str: return "\n".join(f"Priority {i}: {q}" for i, q in enumerate(self.queues)) class ElementPriorityQueue: """ Element Priority Queue is the same as Fixed Priority Queue except that the value of the element itself is the priority. The rules for priorities are the same the as Fixed Priority Queue. >>> epq = ElementPriorityQueue() >>> epq.enqueue(10) >>> epq.enqueue(70) >>> epq.enqueue(4) >>> epq.enqueue(1) >>> epq.enqueue(5) >>> epq.enqueue(7) >>> epq.enqueue(4) >>> epq.enqueue(64) >>> epq.enqueue(128) >>> print(epq) [10, 70, 4, 1, 5, 7, 4, 64, 128] >>> epq.dequeue() 1 >>> epq.dequeue() 4 >>> epq.dequeue() 4 >>> epq.dequeue() 5 >>> epq.dequeue() 7 >>> epq.dequeue() 10 >>> print(epq) [70, 64, 128] >>> epq.dequeue() 64 >>> epq.dequeue() 70 >>> epq.dequeue() 128 >>> epq.dequeue() Traceback (most recent call last): ... data_structures.queues.priority_queue_using_list.UnderFlowError: The queue is empty >>> print(epq) [] """ def __init__(self): self.queue = [] def enqueue(self, data: int) -> None: """ This function enters the element into the queue If the queue is full an Exception is raised saying Over Flow! """ if len(self.queue) == 100: raise OverFlowError("Maximum queue size is 100") self.queue.append(data) def dequeue(self) -> int: """ Return the highest priority element in FIFO order. If the queue is empty then an under flow exception is raised. """ if not self.queue: raise UnderFlowError("The queue is empty") else: data = min(self.queue) self.queue.remove(data) return data def __str__(self) -> str: """ Prints all the elements within the Element Priority Queue """ return str(self.queue) def fixed_priority_queue(): fpq = FixedPriorityQueue() fpq.enqueue(0, 10) fpq.enqueue(1, 70) fpq.enqueue(0, 100) fpq.enqueue(2, 1) fpq.enqueue(2, 5) fpq.enqueue(1, 7) fpq.enqueue(2, 4) fpq.enqueue(1, 64) fpq.enqueue(0, 128) print(fpq) print(fpq.dequeue()) print(fpq.dequeue()) print(fpq.dequeue()) print(fpq.dequeue()) print(fpq.dequeue()) print(fpq) print(fpq.dequeue()) print(fpq.dequeue()) print(fpq.dequeue()) print(fpq.dequeue()) print(fpq.dequeue()) def element_priority_queue(): epq = ElementPriorityQueue() epq.enqueue(10) epq.enqueue(70) epq.enqueue(100) epq.enqueue(1) epq.enqueue(5) epq.enqueue(7) epq.enqueue(4) epq.enqueue(64) epq.enqueue(128) print(epq) print(epq.dequeue()) print(epq.dequeue()) print(epq.dequeue()) print(epq.dequeue()) print(epq.dequeue()) print(epq) print(epq.dequeue()) print(epq.dequeue()) print(epq.dequeue()) print(epq.dequeue()) print(epq.dequeue()) if __name__ == "__main__": fixed_priority_queue() element_priority_queue() ================================================ FILE: data_structures/queues/queue_by_list.py ================================================ """Queue represented by a Python list""" from collections.abc import Iterable class QueueByList[T]: def __init__(self, iterable: Iterable[T] | None = None) -> None: """ >>> QueueByList() Queue(()) >>> QueueByList([10, 20, 30]) Queue((10, 20, 30)) >>> QueueByList((i**2 for i in range(1, 4))) Queue((1, 4, 9)) """ self.entries: list[T] = list(iterable or []) def __len__(self) -> int: """ >>> len(QueueByList()) 0 >>> from string import ascii_lowercase >>> len(QueueByList(ascii_lowercase)) 26 >>> queue = QueueByList() >>> for i in range(1, 11): ... queue.put(i) >>> len(queue) 10 >>> for i in range(2): ... queue.get() 1 2 >>> len(queue) 8 """ return len(self.entries) def __repr__(self) -> str: """ >>> queue = QueueByList() >>> queue Queue(()) >>> str(queue) 'Queue(())' >>> queue.put(10) >>> queue Queue((10,)) >>> queue.put(20) >>> queue.put(30) >>> queue Queue((10, 20, 30)) """ return f"Queue({tuple(self.entries)})" def put(self, item: T) -> None: """Put `item` to the Queue >>> queue = QueueByList() >>> queue.put(10) >>> queue.put(20) >>> len(queue) 2 >>> queue Queue((10, 20)) """ self.entries.append(item) def get(self) -> T: """ Get `item` from the Queue >>> queue = QueueByList((10, 20, 30)) >>> queue.get() 10 >>> queue.put(40) >>> queue.get() 20 >>> queue.get() 30 >>> len(queue) 1 >>> queue.get() 40 >>> queue.get() Traceback (most recent call last): ... IndexError: Queue is empty """ if not self.entries: raise IndexError("Queue is empty") return self.entries.pop(0) def rotate(self, rotation: int) -> None: """Rotate the items of the Queue `rotation` times >>> queue = QueueByList([10, 20, 30, 40]) >>> queue Queue((10, 20, 30, 40)) >>> queue.rotate(1) >>> queue Queue((20, 30, 40, 10)) >>> queue.rotate(2) >>> queue Queue((40, 10, 20, 30)) """ put = self.entries.append get = self.entries.pop for _ in range(rotation): put(get(0)) def get_front(self) -> T: """Get the front item from the Queue >>> queue = QueueByList((10, 20, 30)) >>> queue.get_front() 10 >>> queue Queue((10, 20, 30)) >>> queue.get() 10 >>> queue.get_front() 20 """ return self.entries[0] if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: data_structures/queues/queue_by_two_stacks.py ================================================ """Queue implementation using two stacks""" from collections.abc import Iterable class QueueByTwoStacks[T]: def __init__(self, iterable: Iterable[T] | None = None) -> None: """ >>> QueueByTwoStacks() Queue(()) >>> QueueByTwoStacks([10, 20, 30]) Queue((10, 20, 30)) >>> QueueByTwoStacks((i**2 for i in range(1, 4))) Queue((1, 4, 9)) """ self._stack1: list[T] = list(iterable or []) self._stack2: list[T] = [] def __len__(self) -> int: """ >>> len(QueueByTwoStacks()) 0 >>> from string import ascii_lowercase >>> len(QueueByTwoStacks(ascii_lowercase)) 26 >>> queue = QueueByTwoStacks() >>> for i in range(1, 11): ... queue.put(i) ... >>> len(queue) 10 >>> for i in range(2): ... queue.get() 1 2 >>> len(queue) 8 """ return len(self._stack1) + len(self._stack2) def __repr__(self) -> str: """ >>> queue = QueueByTwoStacks() >>> queue Queue(()) >>> str(queue) 'Queue(())' >>> queue.put(10) >>> queue Queue((10,)) >>> queue.put(20) >>> queue.put(30) >>> queue Queue((10, 20, 30)) """ return f"Queue({tuple(self._stack2[::-1] + self._stack1)})" def put(self, item: T) -> None: """ Put `item` into the Queue >>> queue = QueueByTwoStacks() >>> queue.put(10) >>> queue.put(20) >>> len(queue) 2 >>> queue Queue((10, 20)) """ self._stack1.append(item) def get(self) -> T: """ Get `item` from the Queue >>> queue = QueueByTwoStacks((10, 20, 30)) >>> queue.get() 10 >>> queue.put(40) >>> queue.get() 20 >>> queue.get() 30 >>> len(queue) 1 >>> queue.get() 40 >>> queue.get() Traceback (most recent call last): ... IndexError: Queue is empty """ # To reduce number of attribute look-ups in `while` loop. stack1_pop = self._stack1.pop stack2_append = self._stack2.append if not self._stack2: while self._stack1: stack2_append(stack1_pop()) if not self._stack2: raise IndexError("Queue is empty") return self._stack2.pop() if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: data_structures/queues/queue_on_pseudo_stack.py ================================================ """Queue represented by a pseudo stack (represented by a list with pop and append)""" from typing import Any class Queue: def __init__(self): self.stack = [] self.length = 0 def __str__(self): printed = "<" + str(self.stack)[1:-1] + ">" return printed """Enqueues {@code item} @param item item to enqueue""" def put(self, item: Any) -> None: self.stack.append(item) self.length = self.length + 1 """Dequeues {@code item} @requirement: |self.length| > 0 @return dequeued item that was dequeued""" def get(self) -> Any: self.rotate(1) dequeued = self.stack[self.length - 1] self.stack = self.stack[:-1] self.rotate(self.length - 1) self.length = self.length - 1 return dequeued """Rotates the queue {@code rotation} times @param rotation number of times to rotate queue""" def rotate(self, rotation: int) -> None: for _ in range(rotation): temp = self.stack[0] self.stack = self.stack[1:] self.put(temp) self.length = self.length - 1 """Reports item at the front of self @return item at front of self.stack""" def front(self) -> Any: front = self.get() self.put(front) self.rotate(self.length - 1) return front """Returns the length of this.stack""" def size(self) -> int: return self.length ================================================ FILE: data_structures/stacks/__init__.py ================================================ ================================================ FILE: data_structures/stacks/balanced_parentheses.py ================================================ from .stack import Stack def balanced_parentheses(parentheses: str) -> bool: """Use a stack to check if a string of parentheses is balanced. >>> balanced_parentheses("([]{})") True >>> balanced_parentheses("[()]{}{[()()]()}") True >>> balanced_parentheses("[(])") False >>> balanced_parentheses("1+2*3-4") True >>> balanced_parentheses("") True """ stack: Stack[str] = Stack() bracket_pairs = {"(": ")", "[": "]", "{": "}"} for bracket in parentheses: if bracket in bracket_pairs: stack.push(bracket) elif bracket in (")", "]", "}") and ( stack.is_empty() or bracket_pairs[stack.pop()] != bracket ): return False return stack.is_empty() if __name__ == "__main__": from doctest import testmod testmod() examples = ["((()))", "((())", "(()))"] print("Balanced parentheses demonstration:\n") for example in examples: not_str = "" if balanced_parentheses(example) else "not " print(f"{example} is {not_str}balanced") ================================================ FILE: data_structures/stacks/dijkstras_two_stack_algorithm.py ================================================ """ Author: Alexander Joslin GitHub: github.com/echoaj Explanation: https://medium.com/@haleesammar/implemented-in-js-dijkstras-2-stack- algorithm-for-evaluating-mathematical-expressions-fc0837dae1ea We can use Dijkstra's two stack algorithm to solve an equation such as: (5 + ((4 * 2) * (2 + 3))) THESE ARE THE ALGORITHM'S RULES: RULE 1: Scan the expression from left to right. When an operand is encountered, push it onto the operand stack. RULE 2: When an operator is encountered in the expression, push it onto the operator stack. RULE 3: When a left parenthesis is encountered in the expression, ignore it. RULE 4: When a right parenthesis is encountered in the expression, pop an operator off the operator stack. The two operands it must operate on must be the last two operands pushed onto the operand stack. We therefore pop the operand stack twice, perform the operation, and push the result back onto the operand stack so it will be available for use as an operand of the next operator popped off the operator stack. RULE 5: When the entire infix expression has been scanned, the value left on the operand stack represents the value of the expression. NOTE: It only works with whole numbers. """ __author__ = "Alexander Joslin" import operator as op from .stack import Stack def dijkstras_two_stack_algorithm(equation: str) -> int: """ DocTests >>> dijkstras_two_stack_algorithm("(5 + 3)") 8 >>> dijkstras_two_stack_algorithm("((9 - (2 + 9)) + (8 - 1))") 5 >>> dijkstras_two_stack_algorithm("((((3 - 2) - (2 + 3)) + (2 - 4)) + 3)") -3 :param equation: a string :return: result: an integer """ operators = {"*": op.mul, "/": op.truediv, "+": op.add, "-": op.sub} operand_stack: Stack[int] = Stack() operator_stack: Stack[str] = Stack() for i in equation: if i.isdigit(): # RULE 1 operand_stack.push(int(i)) elif i in operators: # RULE 2 operator_stack.push(i) elif i == ")": # RULE 4 opr = operator_stack.peek() operator_stack.pop() num1 = operand_stack.peek() operand_stack.pop() num2 = operand_stack.peek() operand_stack.pop() total = operators[opr](num2, num1) operand_stack.push(total) # RULE 5 return operand_stack.peek() if __name__ == "__main__": equation = "(5 + ((4 * 2) * (2 + 3)))" # answer = 45 print(f"{equation} = {dijkstras_two_stack_algorithm(equation)}") ================================================ FILE: data_structures/stacks/infix_to_postfix_conversion.py ================================================ """ https://en.wikipedia.org/wiki/Infix_notation https://en.wikipedia.org/wiki/Reverse_Polish_notation https://en.wikipedia.org/wiki/Shunting-yard_algorithm """ from typing import Literal from .balanced_parentheses import balanced_parentheses from .stack import Stack PRECEDENCES: dict[str, int] = { "+": 1, "-": 1, "*": 2, "/": 2, "^": 3, } ASSOCIATIVITIES: dict[str, Literal["LR", "RL"]] = { "+": "LR", "-": "LR", "*": "LR", "/": "LR", "^": "RL", } def precedence(char: str) -> int: """ Return integer value representing an operator's precedence, or order of operation. https://en.wikipedia.org/wiki/Order_of_operations """ return PRECEDENCES.get(char, -1) def associativity(char: str) -> Literal["LR", "RL"]: """ Return the associativity of the operator `char`. https://en.wikipedia.org/wiki/Operator_associativity """ return ASSOCIATIVITIES[char] def infix_to_postfix(expression_str: str) -> str: """ >>> infix_to_postfix("(1*(2+3)+4))") Traceback (most recent call last): ... ValueError: Mismatched parentheses >>> infix_to_postfix("") '' >>> infix_to_postfix("3+2") '3 2 +' >>> infix_to_postfix("(3+4)*5-6") '3 4 + 5 * 6 -' >>> infix_to_postfix("(1+2)*3/4-5") '1 2 + 3 * 4 / 5 -' >>> infix_to_postfix("a+b*c+(d*e+f)*g") 'a b c * + d e * f + g * +' >>> infix_to_postfix("x^y/(5*z)+2") 'x y ^ 5 z * / 2 +' >>> infix_to_postfix("2^3^2") '2 3 2 ^ ^' """ if not balanced_parentheses(expression_str): raise ValueError("Mismatched parentheses") stack: Stack[str] = Stack() postfix = [] for char in expression_str: if char.isalpha() or char.isdigit(): postfix.append(char) elif char == "(": stack.push(char) elif char == ")": while not stack.is_empty() and stack.peek() != "(": postfix.append(stack.pop()) stack.pop() else: while True: if stack.is_empty(): stack.push(char) break char_precedence = precedence(char) tos_precedence = precedence(stack.peek()) if char_precedence > tos_precedence: stack.push(char) break if char_precedence < tos_precedence: postfix.append(stack.pop()) continue # Precedences are equal if associativity(char) == "RL": stack.push(char) break postfix.append(stack.pop()) while not stack.is_empty(): postfix.append(stack.pop()) return " ".join(postfix) if __name__ == "__main__": from doctest import testmod testmod() expression = "a+b*(c^d-e)^(f+g*h)-i" print("Infix to Postfix Notation demonstration:\n") print("Infix notation: " + expression) print("Postfix notation: " + infix_to_postfix(expression)) ================================================ FILE: data_structures/stacks/infix_to_prefix_conversion.py ================================================ """ Output: Enter an Infix Equation = a + b ^c Symbol | Stack | Postfix ---------------------------- c | | c ^ | ^ | c b | ^ | cb + | + | cb^ a | + | cb^a | | cb^a+ a+b^c (Infix) -> +a^bc (Prefix) """ def infix_2_postfix(infix: str) -> str: """ >>> infix_2_postfix("a+b^c") # doctest: +NORMALIZE_WHITESPACE Symbol | Stack | Postfix ---------------------------- a | | a + | + | a b | + | ab ^ | +^ | ab c | +^ | abc | + | abc^ | | abc^+ 'abc^+' >>> infix_2_postfix("1*((-a)*2+b)") # doctest: +NORMALIZE_WHITESPACE Symbol | Stack | Postfix ------------------------------------------- 1 | | 1 * | * | 1 ( | *( | 1 ( | *(( | 1 - | *((- | 1 a | *((- | 1a ) | *( | 1a- * | *(* | 1a- 2 | *(* | 1a-2 + | *(+ | 1a-2* b | *(+ | 1a-2*b ) | * | 1a-2*b+ | | 1a-2*b+* '1a-2*b+*' >>> infix_2_postfix("") Symbol | Stack | Postfix ---------------------------- '' >>> infix_2_postfix("(()") Traceback (most recent call last): ... ValueError: invalid expression >>> infix_2_postfix("())") Traceback (most recent call last): ... IndexError: list index out of range """ stack = [] post_fix = [] priority = { "^": 3, "*": 2, "/": 2, "%": 2, "+": 1, "-": 1, } # Priority of each operator print_width = max(len(infix), 7) # Print table header for output print( "Symbol".center(8), "Stack".center(print_width), "Postfix".center(print_width), sep=" | ", ) print("-" * (print_width * 3 + 7)) for x in infix: if x.isalpha() or x.isdigit(): post_fix.append(x) # if x is Alphabet / Digit, add it to Postfix elif x == "(": stack.append(x) # if x is "(" push to Stack elif x == ")": # if x is ")" pop stack until "(" is encountered if len(stack) == 0: # close bracket without open bracket raise IndexError("list index out of range") while stack[-1] != "(": post_fix.append(stack.pop()) # Pop stack & add the content to Postfix stack.pop() elif len(stack) == 0: stack.append(x) # If stack is empty, push x to stack else: # while priority of x is not > priority of element in the stack while stack and stack[-1] != "(" and priority[x] <= priority[stack[-1]]: post_fix.append(stack.pop()) # pop stack & add to Postfix stack.append(x) # push x to stack print( x.center(8), ("".join(stack)).ljust(print_width), ("".join(post_fix)).ljust(print_width), sep=" | ", ) # Output in tabular format while len(stack) > 0: # while stack is not empty if stack[-1] == "(": # open bracket with no close bracket raise ValueError("invalid expression") post_fix.append(stack.pop()) # pop stack & add to Postfix print( " ".center(8), ("".join(stack)).ljust(print_width), ("".join(post_fix)).ljust(print_width), sep=" | ", ) # Output in tabular format return "".join(post_fix) # return Postfix as str def infix_2_prefix(infix: str) -> str: """ >>> infix_2_prefix("a+b^c") # doctest: +NORMALIZE_WHITESPACE Symbol | Stack | Postfix ---------------------------- c | | c ^ | ^ | c b | ^ | cb + | + | cb^ a | + | cb^a | | cb^a+ '+a^bc' >>> infix_2_prefix("1*((-a)*2+b)") # doctest: +NORMALIZE_WHITESPACE Symbol | Stack | Postfix ------------------------------------------- ( | ( | b | ( | b + | (+ | b 2 | (+ | b2 * | (+* | b2 ( | (+*( | b2 a | (+*( | b2a - | (+*(- | b2a ) | (+* | b2a- ) | | b2a-*+ * | * | b2a-*+ 1 | * | b2a-*+1 | | b2a-*+1* '*1+*-a2b' >>> infix_2_prefix('') Symbol | Stack | Postfix ---------------------------- '' >>> infix_2_prefix('(()') Traceback (most recent call last): ... IndexError: list index out of range >>> infix_2_prefix('())') Traceback (most recent call last): ... ValueError: invalid expression """ reversed_infix = list(infix[::-1]) # reverse the infix equation for i in range(len(reversed_infix)): if reversed_infix[i] == "(": reversed_infix[i] = ")" # change "(" to ")" elif reversed_infix[i] == ")": reversed_infix[i] = "(" # change ")" to "(" # call infix_2_postfix on Infix, return reverse of Postfix return (infix_2_postfix("".join(reversed_infix)))[::-1] if __name__ == "__main__": from doctest import testmod testmod() Infix = input("\nEnter an Infix Equation = ") # Input an Infix equation Infix = "".join(Infix.split()) # Remove spaces from the input print("\n\t", Infix, "(Infix) -> ", infix_2_prefix(Infix), "(Prefix)") ================================================ FILE: data_structures/stacks/largest_rectangle_histogram.py ================================================ def largest_rectangle_area(heights: list[int]) -> int: """ Inputs an array of integers representing the heights of bars, and returns the area of the largest rectangle that can be formed >>> largest_rectangle_area([2, 1, 5, 6, 2, 3]) 10 >>> largest_rectangle_area([2, 4]) 4 >>> largest_rectangle_area([6, 2, 5, 4, 5, 1, 6]) 12 >>> largest_rectangle_area([1]) 1 """ stack: list[int] = [] max_area = 0 heights = [*heights, 0] # make a new list by appending the sentinel 0 n = len(heights) for i in range(n): # make sure the stack remains in increasing order while stack and heights[i] < heights[stack[-1]]: h = heights[stack.pop()] # height of the bar # if stack is empty, it means entire width can be taken from index 0 to i-1 w = i if not stack else i - stack[-1] - 1 # calculate width max_area = max(max_area, h * w) stack.append(i) return max_area if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: data_structures/stacks/lexicographical_numbers.py ================================================ from collections.abc import Iterator def lexical_order(max_number: int) -> Iterator[int]: """ Generate numbers in lexical order from 1 to max_number. >>> " ".join(map(str, lexical_order(13))) '1 10 11 12 13 2 3 4 5 6 7 8 9' >>> list(lexical_order(1)) [1] >>> " ".join(map(str, lexical_order(20))) '1 10 11 12 13 14 15 16 17 18 19 2 20 3 4 5 6 7 8 9' >>> " ".join(map(str, lexical_order(25))) '1 10 11 12 13 14 15 16 17 18 19 2 20 21 22 23 24 25 3 4 5 6 7 8 9' >>> list(lexical_order(12)) [1, 10, 11, 12, 2, 3, 4, 5, 6, 7, 8, 9] """ stack = [1] while stack: num = stack.pop() if num > max_number: continue yield num if (num % 10) != 9: stack.append(num + 1) stack.append(num * 10) if __name__ == "__main__": from doctest import testmod testmod() print(f"Numbers from 1 to 25 in lexical order: {list(lexical_order(26))}") ================================================ FILE: data_structures/stacks/next_greater_element.py ================================================ from __future__ import annotations arr = [-10, -5, 0, 5, 5.1, 11, 13, 21, 3, 4, -21, -10, -5, -1, 0] expect = [-5, 0, 5, 5.1, 11, 13, 21, -1, 4, -1, -10, -5, -1, 0, -1] def next_greatest_element_slow(arr: list[float]) -> list[float]: """ Get the Next Greatest Element (NGE) for each element in the array by checking all subsequent elements to find the next greater one. This is a brute-force implementation, and it has a time complexity of O(n^2), where n is the size of the array. Args: arr: List of numbers for which the NGE is calculated. Returns: List containing the next greatest elements. If no greater element is found, -1 is placed in the result. Example: >>> next_greatest_element_slow(arr) == expect True """ result = [] arr_size = len(arr) for i in range(arr_size): next_element: float = -1 for j in range(i + 1, arr_size): if arr[i] < arr[j]: next_element = arr[j] break result.append(next_element) return result def next_greatest_element_fast(arr: list[float]) -> list[float]: """ Find the Next Greatest Element (NGE) for each element in the array using a more readable approach. This implementation utilizes enumerate() for the outer loop and slicing for the inner loop. While this improves readability over next_greatest_element_slow(), it still has a time complexity of O(n^2). Args: arr: List of numbers for which the NGE is calculated. Returns: List containing the next greatest elements. If no greater element is found, -1 is placed in the result. Example: >>> next_greatest_element_fast(arr) == expect True """ result = [] for i, outer in enumerate(arr): next_item: float = -1 for inner in arr[i + 1 :]: if outer < inner: next_item = inner break result.append(next_item) return result def next_greatest_element(arr: list[float]) -> list[float]: """ Efficient solution to find the Next Greatest Element (NGE) for all elements using a stack. The time complexity is reduced to O(n), making it suitable for larger arrays. The stack keeps track of elements for which the next greater element hasn't been found yet. By iterating through the array in reverse (from the last element to the first), the stack is used to efficiently determine the next greatest element for each element. Args: arr: List of numbers for which the NGE is calculated. Returns: List containing the next greatest elements. If no greater element is found, -1 is placed in the result. Example: >>> next_greatest_element(arr) == expect True """ arr_size = len(arr) stack: list[float] = [] result: list[float] = [-1] * arr_size for index in reversed(range(arr_size)): if stack: while stack[-1] <= arr[index]: stack.pop() if not stack: break if stack: result[index] = stack[-1] stack.append(arr[index]) return result if __name__ == "__main__": from doctest import testmod from timeit import timeit testmod() print(next_greatest_element_slow(arr)) print(next_greatest_element_fast(arr)) print(next_greatest_element(arr)) setup = ( "from __main__ import arr, next_greatest_element_slow, " "next_greatest_element_fast, next_greatest_element" ) print( "next_greatest_element_slow():", timeit("next_greatest_element_slow(arr)", setup=setup), ) print( "next_greatest_element_fast():", timeit("next_greatest_element_fast(arr)", setup=setup), ) print( " next_greatest_element():", timeit("next_greatest_element(arr)", setup=setup), ) ================================================ FILE: data_structures/stacks/postfix_evaluation.py ================================================ """ Reverse Polish Nation is also known as Polish postfix notation or simply postfix notation. https://en.wikipedia.org/wiki/Reverse_Polish_notation Classic examples of simple stack implementations. Valid operators are +, -, *, /. Each operand may be an integer or another expression. Output: Enter a Postfix Equation (space separated) = 5 6 9 * + Symbol | Action | Stack ----------------------------------- 5 | push(5) | 5 6 | push(6) | 5,6 9 | push(9) | 5,6,9 | pop(9) | 5,6 | pop(6) | 5 * | push(6*9) | 5,54 | pop(54) | 5 | pop(5) | + | push(5+54) | 59 Result = 59 """ # Defining valid unary operator symbols UNARY_OP_SYMBOLS = ("-", "+") # operators & their respective operation OPERATORS = { "^": lambda p, q: p**q, "*": lambda p, q: p * q, "/": lambda p, q: p / q, "+": lambda p, q: p + q, "-": lambda p, q: p - q, } def parse_token(token: str | float) -> float | str: """ Converts the given data to the appropriate number if it is indeed a number, else returns the data as it is with a False flag. This function also serves as a check of whether the input is a number or not. Parameters ---------- token: The data that needs to be converted to the appropriate operator or number. Returns ------- float or str Returns a float if `token` is a number or a str if `token` is an operator """ if token in OPERATORS: return token try: return float(token) except ValueError: msg = f"{token} is neither a number nor a valid operator" raise ValueError(msg) def evaluate(post_fix: list[str], verbose: bool = False) -> float: """ Evaluate postfix expression using a stack. >>> evaluate(["0"]) 0.0 >>> evaluate(["-0"]) -0.0 >>> evaluate(["1"]) 1.0 >>> evaluate(["-1"]) -1.0 >>> evaluate(["-1.1"]) -1.1 >>> evaluate(["2", "1", "+", "3", "*"]) 9.0 >>> evaluate(["2", "1.9", "+", "3", "*"]) 11.7 >>> evaluate(["2", "-1.9", "+", "3", "*"]) 0.30000000000000027 >>> evaluate(["4", "13", "5", "/", "+"]) 6.6 >>> evaluate(["2", "-", "3", "+"]) 1.0 >>> evaluate(["-4", "5", "*", "6", "-"]) -26.0 >>> evaluate([]) 0 >>> evaluate(["4", "-", "6", "7", "/", "9", "8"]) Traceback (most recent call last): ... ArithmeticError: Input is not a valid postfix expression Parameters ---------- post_fix: The postfix expression is tokenized into operators and operands and stored as a Python list verbose: Display stack contents while evaluating the expression if verbose is True Returns ------- float The evaluated value """ if not post_fix: return 0 # Checking the list to find out whether the postfix expression is valid valid_expression = [parse_token(token) for token in post_fix] if verbose: # print table header print("Symbol".center(8), "Action".center(12), "Stack", sep=" | ") print("-" * (30 + len(post_fix))) stack = [] for x in valid_expression: if x not in OPERATORS: stack.append(x) # append x to stack if verbose: # output in tabular format print( f"{x}".rjust(8), f"push({x})".ljust(12), stack, sep=" | ", ) continue # If x is operator # If only 1 value is inside the stack and + or - is encountered # then this is unary + or - case if x in UNARY_OP_SYMBOLS and len(stack) < 2: b = stack.pop() # pop stack if x == "-": b *= -1 # negate b stack.append(b) if verbose: # output in tabular format print( "".rjust(8), f"pop({b})".ljust(12), stack, sep=" | ", ) print( str(x).rjust(8), f"push({x}{b})".ljust(12), stack, sep=" | ", ) continue b = stack.pop() # pop stack if verbose: # output in tabular format print( "".rjust(8), f"pop({b})".ljust(12), stack, sep=" | ", ) a = stack.pop() # pop stack if verbose: # output in tabular format print( "".rjust(8), f"pop({a})".ljust(12), stack, sep=" | ", ) # evaluate the 2 values popped from stack & push result to stack stack.append(OPERATORS[x](a, b)) # type: ignore[index] if verbose: # output in tabular format print( f"{x}".rjust(8), f"push({a}{x}{b})".ljust(12), stack, sep=" | ", ) # If everything is executed correctly, the stack will contain # only one element which is the result if len(stack) != 1: raise ArithmeticError("Input is not a valid postfix expression") return float(stack[0]) if __name__ == "__main__": # Create a loop so that the user can evaluate postfix expressions multiple times while True: expression = input("Enter a Postfix Expression (space separated): ").split(" ") prompt = "Do you want to see stack contents while evaluating? [y/N]: " verbose = input(prompt).strip().lower() == "y" output = evaluate(expression, verbose) print("Result = ", output) prompt = "Do you want to enter another expression? [y/N]: " if input(prompt).strip().lower() != "y": break ================================================ FILE: data_structures/stacks/prefix_evaluation.py ================================================ """ Program to evaluate a prefix expression. https://en.wikipedia.org/wiki/Polish_notation """ operators = { "+": lambda x, y: x + y, "-": lambda x, y: x - y, "*": lambda x, y: x * y, "/": lambda x, y: x / y, } def is_operand(c): """ Return True if the given char c is an operand, e.g. it is a number >>> is_operand("1") True >>> is_operand("+") False """ return c.isdigit() def evaluate(expression): """ Evaluate a given expression in prefix notation. Asserts that the given expression is valid. >>> evaluate("+ 9 * 2 6") 21 >>> evaluate("/ * 10 2 + 4 1 ") 4.0 >>> evaluate("2") 2 >>> evaluate("+ * 2 3 / 8 4") 8.0 """ stack = [] # iterate over the string in reverse order for c in expression.split()[::-1]: # push operand to stack if is_operand(c): stack.append(int(c)) else: # pop values from stack can calculate the result # push the result onto the stack again o1 = stack.pop() o2 = stack.pop() stack.append(operators[c](o1, o2)) return stack.pop() def evaluate_recursive(expression: list[str]): """ Alternative recursive implementation >>> evaluate_recursive(['2']) 2 >>> expression = ['+', '*', '2', '3', '/', '8', '4'] >>> evaluate_recursive(expression) 8.0 >>> expression [] >>> evaluate_recursive(['+', '9', '*', '2', '6']) 21 >>> evaluate_recursive(['/', '*', '10', '2', '+', '4', '1']) 4.0 """ op = expression.pop(0) if is_operand(op): return int(op) operation = operators[op] a = evaluate_recursive(expression) b = evaluate_recursive(expression) return operation(a, b) # Driver code if __name__ == "__main__": test_expression = "+ 9 * 2 6" print(evaluate(test_expression)) test_expression = "/ * 10 2 + 4 1 " print(evaluate(test_expression)) ================================================ FILE: data_structures/stacks/stack.py ================================================ from __future__ import annotations from typing import TypeVar T = TypeVar("T") class StackOverflowError(BaseException): pass class StackUnderflowError(BaseException): pass class Stack[T]: """A stack is an abstract data type that serves as a collection of elements with two principal operations: push() and pop(). push() adds an element to the top of the stack, and pop() removes an element from the top of a stack. The order in which elements come off of a stack are Last In, First Out (LIFO). https://en.wikipedia.org/wiki/Stack_(abstract_data_type) """ def __init__(self, limit: int = 10): self.stack: list[T] = [] self.limit = limit def __bool__(self) -> bool: return bool(self.stack) def __str__(self) -> str: return str(self.stack) def push(self, data: T) -> None: """ Push an element to the top of the stack. >>> S = Stack(2) # stack size = 2 >>> S.push(10) >>> S.push(20) >>> print(S) [10, 20] >>> S = Stack(1) # stack size = 1 >>> S.push(10) >>> S.push(20) Traceback (most recent call last): ... data_structures.stacks.stack.StackOverflowError """ if len(self.stack) >= self.limit: raise StackOverflowError self.stack.append(data) def pop(self) -> T: """ Pop an element off of the top of the stack. >>> S = Stack() >>> S.push(-5) >>> S.push(10) >>> S.pop() 10 >>> Stack().pop() Traceback (most recent call last): ... data_structures.stacks.stack.StackUnderflowError """ if not self.stack: raise StackUnderflowError return self.stack.pop() def peek(self) -> T: """ Peek at the top-most element of the stack. >>> S = Stack() >>> S.push(-5) >>> S.push(10) >>> S.peek() 10 >>> Stack().peek() Traceback (most recent call last): ... data_structures.stacks.stack.StackUnderflowError """ if not self.stack: raise StackUnderflowError return self.stack[-1] def is_empty(self) -> bool: """ Check if a stack is empty. >>> S = Stack() >>> S.is_empty() True >>> S = Stack() >>> S.push(10) >>> S.is_empty() False """ return not bool(self.stack) def is_full(self) -> bool: """ >>> S = Stack() >>> S.is_full() False >>> S = Stack(1) >>> S.push(10) >>> S.is_full() True """ return self.size() == self.limit def size(self) -> int: """ Return the size of the stack. >>> S = Stack(3) >>> S.size() 0 >>> S = Stack(3) >>> S.push(10) >>> S.size() 1 >>> S = Stack(3) >>> S.push(10) >>> S.push(20) >>> S.size() 2 """ return len(self.stack) def __contains__(self, item: T) -> bool: """ Check if item is in stack >>> S = Stack(3) >>> S.push(10) >>> 10 in S True >>> S = Stack(3) >>> S.push(10) >>> 20 in S False """ return item in self.stack def test_stack() -> None: """ >>> test_stack() """ stack: Stack[int] = Stack(10) assert bool(stack) is False assert stack.is_empty() is True assert stack.is_full() is False assert str(stack) == "[]" try: _ = stack.pop() raise AssertionError # This should not happen except StackUnderflowError: assert True # This should happen try: _ = stack.peek() raise AssertionError # This should not happen except StackUnderflowError: assert True # This should happen for i in range(10): assert stack.size() == i stack.push(i) assert bool(stack) assert not stack.is_empty() assert stack.is_full() assert str(stack) == str(list(range(10))) assert stack.pop() == 9 assert stack.peek() == 8 stack.push(100) assert str(stack) == str([0, 1, 2, 3, 4, 5, 6, 7, 8, 100]) try: stack.push(200) raise AssertionError # This should not happen except StackOverflowError: assert True # This should happen assert not stack.is_empty() assert stack.size() == 10 assert 5 in stack assert 55 not in stack if __name__ == "__main__": test_stack() import doctest doctest.testmod() ================================================ FILE: data_structures/stacks/stack_using_two_queues.py ================================================ from __future__ import annotations from collections import deque from dataclasses import dataclass, field @dataclass class StackWithQueues: """ https://www.geeksforgeeks.org/implement-stack-using-queue/ >>> stack = StackWithQueues() >>> stack.push(1) >>> stack.push(2) >>> stack.push(3) >>> stack.peek() 3 >>> stack.pop() 3 >>> stack.peek() 2 >>> stack.pop() 2 >>> stack.pop() 1 >>> stack.peek() is None True >>> stack.pop() Traceback (most recent call last): ... IndexError: pop from an empty deque """ main_queue: deque[int] = field(default_factory=deque) temp_queue: deque[int] = field(default_factory=deque) def push(self, item: int) -> None: self.temp_queue.append(item) while self.main_queue: self.temp_queue.append(self.main_queue.popleft()) self.main_queue, self.temp_queue = self.temp_queue, self.main_queue def pop(self) -> int: return self.main_queue.popleft() def peek(self) -> int | None: return self.main_queue[0] if self.main_queue else None if __name__ == "__main__": import doctest doctest.testmod() stack: StackWithQueues | None = StackWithQueues() while stack: print("\nChoose operation:") print("1. Push") print("2. Pop") print("3. Peek") print("4. Quit") choice = input("Enter choice (1/2/3/4): ") if choice == "1": element = int(input("Enter an integer to push: ").strip()) stack.push(element) print(f"{element} pushed onto the stack.") elif choice == "2": popped_element = stack.pop() if popped_element is not None: print(f"Popped element: {popped_element}") else: print("Stack is empty.") elif choice == "3": peeked_element = stack.peek() if peeked_element is not None: print(f"Top element: {peeked_element}") else: print("Stack is empty.") elif choice == "4": del stack stack = None else: print("Invalid choice. Please try again.") ================================================ FILE: data_structures/stacks/stack_with_doubly_linked_list.py ================================================ # A complete working Python program to demonstrate all # stack operations using a doubly linked list from __future__ import annotations from typing import TypeVar T = TypeVar("T") class Node[T]: def __init__(self, data: T): self.data = data # Assign data self.next: Node[T] | None = None # Initialize next as null self.prev: Node[T] | None = None # Initialize prev as null class Stack[T]: """ >>> stack = Stack() >>> stack.is_empty() True >>> stack.print_stack() stack elements are: >>> for i in range(4): ... stack.push(i) ... >>> stack.is_empty() False >>> stack.print_stack() stack elements are: 3->2->1->0-> >>> stack.top() 3 >>> len(stack) 4 >>> stack.pop() 3 >>> stack.print_stack() stack elements are: 2->1->0-> """ def __init__(self) -> None: self.head: Node[T] | None = None def push(self, data: T) -> None: """add a Node to the stack""" if self.head is None: self.head = Node(data) else: new_node = Node(data) self.head.prev = new_node new_node.next = self.head new_node.prev = None self.head = new_node def pop(self) -> T | None: """pop the top element off the stack""" if self.head is None: return None else: assert self.head is not None temp = self.head.data self.head = self.head.next if self.head is not None: self.head.prev = None return temp def top(self) -> T | None: """return the top element of the stack""" return self.head.data if self.head is not None else None def __len__(self) -> int: temp = self.head count = 0 while temp is not None: count += 1 temp = temp.next return count def is_empty(self) -> bool: return self.head is None def print_stack(self) -> None: print("stack elements are:") temp = self.head while temp is not None: print(temp.data, end="->") temp = temp.next # Code execution starts here if __name__ == "__main__": # Start with the empty stack stack: Stack[int] = Stack() # Insert 4 at the beginning. So stack becomes 4->None print("Stack operations using Doubly LinkedList") stack.push(4) # Insert 5 at the beginning. So stack becomes 4->5->None stack.push(5) # Insert 6 at the beginning. So stack becomes 4->5->6->None stack.push(6) # Insert 7 at the beginning. So stack becomes 4->5->6->7->None stack.push(7) # Print the stack stack.print_stack() # Print the top element print("\nTop element is ", stack.top()) # Print the stack size print("Size of the stack is ", len(stack)) # pop the top element stack.pop() # pop the top element stack.pop() # two elements have now been popped off stack.print_stack() # Print True if the stack is empty else False print("\nstack is empty:", stack.is_empty()) ================================================ FILE: data_structures/stacks/stack_with_singly_linked_list.py ================================================ """A Stack using a linked list like structure""" from __future__ import annotations from collections.abc import Iterator from typing import TypeVar T = TypeVar("T") class Node[T]: def __init__(self, data: T): self.data = data self.next: Node[T] | None = None def __str__(self) -> str: return f"{self.data}" class LinkedStack[T]: """ Linked List Stack implementing push (to top), pop (from top) and is_empty >>> stack = LinkedStack() >>> stack.is_empty() True >>> stack.push(5) >>> stack.push(9) >>> stack.push('python') >>> stack.is_empty() False >>> stack.pop() 'python' >>> stack.push('algorithms') >>> stack.pop() 'algorithms' >>> stack.pop() 9 >>> stack.pop() 5 >>> stack.is_empty() True >>> stack.pop() Traceback (most recent call last): ... IndexError: pop from empty stack """ def __init__(self) -> None: self.top: Node[T] | None = None def __iter__(self) -> Iterator[T]: node = self.top while node: yield node.data node = node.next def __str__(self) -> str: """ >>> stack = LinkedStack() >>> stack.push("c") >>> stack.push("b") >>> stack.push("a") >>> str(stack) 'a->b->c' """ return "->".join([str(item) for item in self]) def __len__(self) -> int: """ >>> stack = LinkedStack() >>> len(stack) == 0 True >>> stack.push("c") >>> stack.push("b") >>> stack.push("a") >>> len(stack) == 3 True """ return len(tuple(iter(self))) def is_empty(self) -> bool: """ >>> stack = LinkedStack() >>> stack.is_empty() True >>> stack.push(1) >>> stack.is_empty() False """ return self.top is None def push(self, item: T) -> None: """ >>> stack = LinkedStack() >>> stack.push("Python") >>> stack.push("Java") >>> stack.push("C") >>> str(stack) 'C->Java->Python' """ node = Node(item) if not self.is_empty(): node.next = self.top self.top = node def pop(self) -> T: """ >>> stack = LinkedStack() >>> stack.pop() Traceback (most recent call last): ... IndexError: pop from empty stack >>> stack.push("c") >>> stack.push("b") >>> stack.push("a") >>> stack.pop() == 'a' True >>> stack.pop() == 'b' True >>> stack.pop() == 'c' True """ if self.is_empty(): raise IndexError("pop from empty stack") assert isinstance(self.top, Node) pop_node = self.top self.top = self.top.next return pop_node.data def peek(self) -> T: """ >>> stack = LinkedStack() >>> stack.push("Java") >>> stack.push("C") >>> stack.push("Python") >>> stack.peek() 'Python' """ if self.is_empty(): raise IndexError("peek from empty stack") assert self.top is not None return self.top.data def clear(self) -> None: """ >>> stack = LinkedStack() >>> stack.push("Java") >>> stack.push("C") >>> stack.push("Python") >>> str(stack) 'Python->C->Java' >>> stack.clear() >>> len(stack) == 0 True """ self.top = None if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: data_structures/stacks/stock_span_problem.py ================================================ """ The stock span problem is a financial problem where we have a series of n daily price quotes for a stock and we need to calculate span of stock's price for all n days. The span Si of the stock's price on a given day i is defined as the maximum number of consecutive days just before the given day, for which the price of the stock on the current day is less than or equal to its price on the given day. """ def calculate_span(price: list[int]) -> list[int]: """ Calculate the span values for a given list of stock prices. Args: price: List of stock prices. Returns: List of span values. >>> calculate_span([10, 4, 5, 90, 120, 80]) [1, 1, 2, 4, 5, 1] >>> calculate_span([100, 50, 60, 70, 80, 90]) [1, 1, 2, 3, 4, 5] >>> calculate_span([5, 4, 3, 2, 1]) [1, 1, 1, 1, 1] >>> calculate_span([1, 2, 3, 4, 5]) [1, 2, 3, 4, 5] >>> calculate_span([10, 20, 30, 40, 50]) [1, 2, 3, 4, 5] >>> calculate_span([100, 80, 60, 70, 60, 75, 85]) [1, 1, 1, 2, 1, 4, 6] """ n = len(price) s = [0] * n # Create a stack and push index of fist element to it st = [] st.append(0) # Span value of first element is always 1 s[0] = 1 # Calculate span values for rest of the elements for i in range(1, n): # Pop elements from stack while stack is not # empty and top of stack is smaller than price[i] while len(st) > 0 and price[st[-1]] <= price[i]: st.pop() # If stack becomes empty, then price[i] is greater # than all elements on left of it, i.e. price[0], # price[1], ..price[i-1]. Else the price[i] is # greater than elements after top of stack s[i] = i + 1 if len(st) <= 0 else (i - st[-1]) # Push this element to stack st.append(i) return s # A utility function to print elements of array def print_array(arr, n): for i in range(n): print(arr[i], end=" ") # Driver program to test above function price = [10, 4, 5, 90, 120, 80] # Calculate the span values S = calculate_span(price) # Print the calculated span values print_array(S, len(price)) ================================================ FILE: data_structures/suffix_tree/__init__.py ================================================ ================================================ FILE: data_structures/suffix_tree/example/__init__.py ================================================ ================================================ FILE: data_structures/suffix_tree/example/example_usage.py ================================================ # Created by: Ramy-Badr-Ahmed (https://github.com/Ramy-Badr-Ahmed) # in Pull Request: #11554 # https://github.com/TheAlgorithms/Python/pull/11554 # # Please mention me (@Ramy-Badr-Ahmed) in any issue or pull request # addressing bugs/corrections to this file. # Thank you! from data_structures.suffix_tree.suffix_tree import SuffixTree def main() -> None: """ Demonstrate the usage of the SuffixTree class. - Initializes a SuffixTree with a predefined text. - Defines a list of patterns to search for within the suffix tree. - Searches for each pattern in the suffix tree. Patterns tested: - "ana" (found) --> True - "ban" (found) --> True - "na" (found) --> True - "xyz" (not found) --> False - "mon" (found) --> True """ text = "monkey banana" suffix_tree = SuffixTree(text) patterns = ["ana", "ban", "na", "xyz", "mon"] for pattern in patterns: found = suffix_tree.search(pattern) print(f"Pattern '{pattern}' found: {found}") if __name__ == "__main__": main() ================================================ FILE: data_structures/suffix_tree/suffix_tree.py ================================================ # Created by: Ramy-Badr-Ahmed (https://github.com/Ramy-Badr-Ahmed) # in Pull Request: #11554 # https://github.com/TheAlgorithms/Python/pull/11554 # # Please mention me (@Ramy-Badr-Ahmed) in any issue or pull request # addressing bugs/corrections to this file. # Thank you! from data_structures.suffix_tree.suffix_tree_node import SuffixTreeNode class SuffixTree: def __init__(self, text: str) -> None: """ Initializes the suffix tree with the given text. Args: text (str): The text for which the suffix tree is to be built. """ self.text: str = text self.root: SuffixTreeNode = SuffixTreeNode() self.build_suffix_tree() def build_suffix_tree(self) -> None: """ Builds the suffix tree for the given text by adding all suffixes. """ text = self.text n = len(text) for i in range(n): suffix = text[i:] self._add_suffix(suffix, i) def _add_suffix(self, suffix: str, index: int) -> None: """ Adds a suffix to the suffix tree. Args: suffix (str): The suffix to add. index (int): The starting index of the suffix in the original text. """ node = self.root for char in suffix: if char not in node.children: node.children[char] = SuffixTreeNode() node = node.children[char] node.is_end_of_string = True node.start = index node.end = index + len(suffix) - 1 def search(self, pattern: str) -> bool: """ Searches for a pattern in the suffix tree. Args: pattern (str): The pattern to search for. Returns: bool: True if the pattern is found, False otherwise. """ node = self.root for char in pattern: if char not in node.children: return False node = node.children[char] return True ================================================ FILE: data_structures/suffix_tree/suffix_tree_node.py ================================================ # Created by: Ramy-Badr-Ahmed (https://github.com/Ramy-Badr-Ahmed) # in Pull Request: #11554 # https://github.com/TheAlgorithms/Python/pull/11554 # # Please mention me (@Ramy-Badr-Ahmed) in any issue or pull request # addressing bugs/corrections to this file. # Thank you! from __future__ import annotations class SuffixTreeNode: def __init__( self, children: dict[str, SuffixTreeNode] | None = None, is_end_of_string: bool = False, start: int | None = None, end: int | None = None, suffix_link: SuffixTreeNode | None = None, ) -> None: """ Initializes a suffix tree node. Parameters: children (dict[str, SuffixTreeNode] | None): The children of this node. is_end_of_string (bool): Indicates if this node represents the end of a string. start (int | None): The start index of the suffix in the text. end (int | None): The end index of the suffix in the text. suffix_link (SuffixTreeNode | None): Link to another suffix tree node. """ self.children = children or {} self.is_end_of_string = is_end_of_string self.start = start self.end = end self.suffix_link = suffix_link ================================================ FILE: data_structures/suffix_tree/tests/__init__.py ================================================ ================================================ FILE: data_structures/suffix_tree/tests/test_suffix_tree.py ================================================ # Created by: Ramy-Badr-Ahmed (https://github.com/Ramy-Badr-Ahmed) # in Pull Request: #11554 # https://github.com/TheAlgorithms/Python/pull/11554 # # Please mention me (@Ramy-Badr-Ahmed) in any issue or pull request # addressing bugs/corrections to this file. # Thank you! import unittest from data_structures.suffix_tree.suffix_tree import SuffixTree class TestSuffixTree(unittest.TestCase): def setUp(self) -> None: """Set up the initial conditions for each test.""" self.text = "banana" self.suffix_tree = SuffixTree(self.text) def test_search_existing_patterns(self) -> None: """Test searching for patterns that exist in the suffix tree.""" patterns = ["ana", "ban", "na"] for pattern in patterns: with self.subTest(pattern=pattern): assert self.suffix_tree.search(pattern), ( f"Pattern '{pattern}' should be found." ) def test_search_non_existing_patterns(self) -> None: """Test searching for patterns that do not exist in the suffix tree.""" patterns = ["xyz", "apple", "cat"] for pattern in patterns: with self.subTest(pattern=pattern): assert not self.suffix_tree.search(pattern), ( f"Pattern '{pattern}' should not be found." ) def test_search_empty_pattern(self) -> None: """Test searching for an empty pattern.""" assert self.suffix_tree.search(""), "An empty pattern should be found." def test_search_full_text(self) -> None: """Test searching for the full text.""" assert self.suffix_tree.search(self.text), ( "The full text should be found in the suffix tree." ) def test_search_substrings(self) -> None: """Test searching for substrings of the full text.""" substrings = ["ban", "ana", "a", "na"] for substring in substrings: with self.subTest(substring=substring): assert self.suffix_tree.search(substring), ( f"Substring '{substring}' should be found." ) if __name__ == "__main__": unittest.main() ================================================ FILE: data_structures/trie/__init__.py ================================================ ================================================ FILE: data_structures/trie/radix_tree.py ================================================ """ A Radix Tree is a data structure that represents a space-optimized trie (prefix tree) in whicheach node that is the only child is merged with its parent [https://en.wikipedia.org/wiki/Radix_tree] """ class RadixNode: def __init__(self, prefix: str = "", is_leaf: bool = False) -> None: # Mapping from the first character of the prefix of the node self.nodes: dict[str, RadixNode] = {} # A node will be a leaf if the tree contains its word self.is_leaf = is_leaf self.prefix = prefix def match(self, word: str) -> tuple[str, str, str]: """Compute the common substring of the prefix of the node and a word Args: word (str): word to compare Returns: (str, str, str): common substring, remaining prefix, remaining word >>> RadixNode("myprefix").match("mystring") ('my', 'prefix', 'string') """ x = 0 for q, w in zip(self.prefix, word): if q != w: break x += 1 return self.prefix[:x], self.prefix[x:], word[x:] def insert_many(self, words: list[str]) -> None: """Insert many words in the tree Args: words (list[str]): list of words >>> RadixNode("myprefix").insert_many(["mystring", "hello"]) """ for word in words: self.insert(word) def insert(self, word: str) -> None: """Insert a word into the tree Args: word (str): word to insert >>> RadixNode("myprefix").insert("mystring") >>> root = RadixNode() >>> root.insert_many(['myprefix', 'myprefixA', 'myprefixAA']) >>> root.print_tree() - myprefix (leaf) -- A (leaf) --- A (leaf) """ # Case 1: If the word is the prefix of the node # Solution: We set the current node as leaf if self.prefix == word and not self.is_leaf: self.is_leaf = True # Case 2: The node has no edges that have a prefix to the word # Solution: We create an edge from the current node to a new one # containing the word elif word[0] not in self.nodes: self.nodes[word[0]] = RadixNode(prefix=word, is_leaf=True) else: incoming_node = self.nodes[word[0]] matching_string, remaining_prefix, remaining_word = incoming_node.match( word ) # Case 3: The node prefix is equal to the matching # Solution: We insert remaining word on the next node if remaining_prefix == "": self.nodes[matching_string[0]].insert(remaining_word) # Case 4: The word is greater equal to the matching # Solution: Create a node in between both nodes, change # prefixes and add the new node for the remaining word else: incoming_node.prefix = remaining_prefix aux_node = self.nodes[matching_string[0]] self.nodes[matching_string[0]] = RadixNode(matching_string, False) self.nodes[matching_string[0]].nodes[remaining_prefix[0]] = aux_node if remaining_word == "": self.nodes[matching_string[0]].is_leaf = True else: self.nodes[matching_string[0]].insert(remaining_word) def find(self, word: str) -> bool: """Returns if the word is on the tree Args: word (str): word to check Returns: bool: True if the word appears on the tree >>> RadixNode("myprefix").find("mystring") False """ incoming_node = self.nodes.get(word[0], None) if not incoming_node: return False else: _matching_string, remaining_prefix, remaining_word = incoming_node.match( word ) # If there is remaining prefix, the word can't be on the tree if remaining_prefix != "": return False # This applies when the word and the prefix are equal elif remaining_word == "": return incoming_node.is_leaf # We have word remaining so we check the next node else: return incoming_node.find(remaining_word) def delete(self, word: str) -> bool: """Deletes a word from the tree if it exists Args: word (str): word to be deleted Returns: bool: True if the word was found and deleted. False if word is not found >>> RadixNode("myprefix").delete("mystring") False """ incoming_node = self.nodes.get(word[0], None) if not incoming_node: return False else: _matching_string, remaining_prefix, remaining_word = incoming_node.match( word ) # If there is remaining prefix, the word can't be on the tree if remaining_prefix != "": return False # We have word remaining so we check the next node elif remaining_word != "": return incoming_node.delete(remaining_word) # If it is not a leaf, we don't have to delete elif not incoming_node.is_leaf: return False else: # We delete the nodes if no edges go from it if len(incoming_node.nodes) == 0: del self.nodes[word[0]] # We merge the current node with its only child if len(self.nodes) == 1 and not self.is_leaf: merging_node = next(iter(self.nodes.values())) self.is_leaf = merging_node.is_leaf self.prefix += merging_node.prefix self.nodes = merging_node.nodes # If there is more than 1 edge, we just mark it as non-leaf elif len(incoming_node.nodes) > 1: incoming_node.is_leaf = False # If there is 1 edge, we merge it with its child else: merging_node = next(iter(incoming_node.nodes.values())) incoming_node.is_leaf = merging_node.is_leaf incoming_node.prefix += merging_node.prefix incoming_node.nodes = merging_node.nodes return True def print_tree(self, height: int = 0) -> None: """Print the tree Args: height (int, optional): Height of the printed node """ if self.prefix != "": print("-" * height, self.prefix, " (leaf)" if self.is_leaf else "") for value in self.nodes.values(): value.print_tree(height + 1) def test_trie() -> bool: words = "banana bananas bandana band apple all beast".split() root = RadixNode() root.insert_many(words) assert all(root.find(word) for word in words) assert not root.find("bandanas") assert not root.find("apps") root.delete("all") assert not root.find("all") root.delete("banana") assert not root.find("banana") assert root.find("bananas") return True def pytests() -> None: assert test_trie() def main() -> None: """ >>> pytests() """ root = RadixNode() words = "banana bananas bandanas bandana band apple all beast".split() root.insert_many(words) print("Words:", words) print("Tree:") root.print_tree() if __name__ == "__main__": main() ================================================ FILE: data_structures/trie/trie.py ================================================ """ A Trie/Prefix Tree is a kind of search tree used to provide quick lookup of words/patterns in a set of words. A basic Trie however has O(n^2) space complexity making it impractical in practice. It however provides O(max(search_string, length of longest word)) lookup time making it an optimal approach when space is not an issue. """ class TrieNode: def __init__(self) -> None: self.nodes: dict[str, TrieNode] = {} # Mapping from char to TrieNode self.is_leaf = False def insert_many(self, words: list[str]) -> None: """ Inserts a list of words into the Trie :param words: list of string words :return: None """ for word in words: self.insert(word) def insert(self, word: str) -> None: """ Inserts a word into the Trie :param word: word to be inserted :return: None """ curr = self for char in word: if char not in curr.nodes: curr.nodes[char] = TrieNode() curr = curr.nodes[char] curr.is_leaf = True def find(self, word: str) -> bool: """ Tries to find word in a Trie :param word: word to look for :return: Returns True if word is found, False otherwise """ curr = self for char in word: if char not in curr.nodes: return False curr = curr.nodes[char] return curr.is_leaf def delete(self, word: str) -> None: """ Deletes a word in a Trie :param word: word to delete :return: None """ def _delete(curr: TrieNode, word: str, index: int) -> bool: if index == len(word): # If word does not exist if not curr.is_leaf: return False curr.is_leaf = False return len(curr.nodes) == 0 char = word[index] char_node = curr.nodes.get(char) # If char not in current trie node if not char_node: return False # Flag to check if node can be deleted delete_curr = _delete(char_node, word, index + 1) if delete_curr: del curr.nodes[char] return len(curr.nodes) == 0 return delete_curr _delete(self, word, 0) def print_words(node: TrieNode, word: str) -> None: """ Prints all the words in a Trie :param node: root node of Trie :param word: Word variable should be empty at start :return: None """ if node.is_leaf: print(word, end=" ") for key, value in node.nodes.items(): print_words(value, word + key) def test_trie() -> bool: words = "banana bananas bandana band apple all beast".split() root = TrieNode() root.insert_many(words) # print_words(root, "") assert all(root.find(word) for word in words) assert root.find("banana") assert not root.find("bandanas") assert not root.find("apps") assert root.find("apple") assert root.find("all") root.delete("all") assert not root.find("all") root.delete("banana") assert not root.find("banana") assert root.find("bananas") return True def print_results(msg: str, passes: bool) -> None: print(str(msg), "works!" if passes else "doesn't work :(") def pytests() -> None: assert test_trie() def main() -> None: """ >>> pytests() """ print_results("Testing trie functionality", test_trie()) if __name__ == "__main__": main() ================================================ FILE: digital_image_processing/__init__.py ================================================ ================================================ FILE: digital_image_processing/change_brightness.py ================================================ from PIL import Image def change_brightness(img: Image, level: float) -> Image: """ Change the brightness of a PIL Image to a given level. """ def brightness(c: int) -> float: """ Fundamental Transformation/Operation that'll be performed on every bit. """ return 128 + level + (c - 128) if not -255.0 <= level <= 255.0: raise ValueError("level must be between -255.0 (black) and 255.0 (white)") return img.point(brightness) if __name__ == "__main__": # Load image with Image.open("image_data/lena.jpg") as img: # Change brightness to 100 brigt_img = change_brightness(img, 100) brigt_img.save("image_data/lena_brightness.png", format="png") ================================================ FILE: digital_image_processing/change_contrast.py ================================================ """ Changing contrast with PIL This algorithm is used in https://noivce.pythonanywhere.com/ Python web app. psf/black: True ruff : True """ from PIL import Image def change_contrast(img: Image, level: int) -> Image: """ Function to change contrast """ factor = (259 * (level + 255)) / (255 * (259 - level)) def contrast(c: int) -> int: """ Fundamental Transformation/Operation that'll be performed on every bit. """ return int(128 + factor * (c - 128)) return img.point(contrast) if __name__ == "__main__": # Load image with Image.open("image_data/lena.jpg") as img: # Change contrast to 170 cont_img = change_contrast(img, 170) cont_img.save("image_data/lena_high_contrast.png", format="png") ================================================ FILE: digital_image_processing/convert_to_negative.py ================================================ """ Implemented an algorithm using opencv to convert a colored image into its negative """ from cv2 import destroyAllWindows, imread, imshow, waitKey def convert_to_negative(img): # getting number of pixels in the image pixel_h, pixel_v = img.shape[0], img.shape[1] # converting each pixel's color to its negative for i in range(pixel_h): for j in range(pixel_v): img[i][j] = [255, 255, 255] - img[i][j] return img if __name__ == "__main__": # read original image img = imread("image_data/lena.jpg", 1) # convert to its negative neg = convert_to_negative(img) # show result image imshow("negative of original image", img) waitKey(0) destroyAllWindows() ================================================ FILE: digital_image_processing/dithering/__init__.py ================================================ ================================================ FILE: digital_image_processing/dithering/burkes.py ================================================ """ Implementation Burke's algorithm (dithering) """ import numpy as np from cv2 import destroyAllWindows, imread, imshow, waitKey class Burkes: """ Burke's algorithm is using for converting grayscale image to black and white version Source: Source: https://en.wikipedia.org/wiki/Dither Note: * Best results are given with threshold= ~1/2 * max greyscale value. * This implementation get RGB image and converts it to greyscale in runtime. """ def __init__(self, input_img, threshold: int): self.min_threshold = 0 # max greyscale value for #FFFFFF self.max_threshold = int(self.get_greyscale(255, 255, 255)) if not self.min_threshold < threshold < self.max_threshold: msg = f"Factor value should be from 0 to {self.max_threshold}" raise ValueError(msg) self.input_img = input_img self.threshold = threshold self.width, self.height = self.input_img.shape[1], self.input_img.shape[0] # error table size (+4 columns and +1 row) greater than input image because of # lack of if statements self.error_table = [ [0 for _ in range(self.height + 4)] for __ in range(self.width + 1) ] self.output_img = np.ones((self.width, self.height, 3), np.uint8) * 255 @classmethod def get_greyscale(cls, blue: int, green: int, red: int) -> float: """ >>> Burkes.get_greyscale(3, 4, 5) 4.185 >>> Burkes.get_greyscale(0, 0, 0) 0.0 >>> Burkes.get_greyscale(255, 255, 255) 255.0 """ """ Formula from https://en.wikipedia.org/wiki/HSL_and_HSV cf Lightness section, and Fig 13c. We use the first of four possible. """ return 0.114 * blue + 0.587 * green + 0.299 * red def process(self) -> None: for y in range(self.height): for x in range(self.width): greyscale = int(self.get_greyscale(*self.input_img[y][x])) if self.threshold > greyscale + self.error_table[y][x]: self.output_img[y][x] = (0, 0, 0) current_error = greyscale + self.error_table[y][x] else: self.output_img[y][x] = (255, 255, 255) current_error = greyscale + self.error_table[y][x] - 255 """ Burkes error propagation (`*` is current pixel): * 8/32 4/32 2/32 4/32 8/32 4/32 2/32 """ self.error_table[y][x + 1] += int(8 / 32 * current_error) self.error_table[y][x + 2] += int(4 / 32 * current_error) self.error_table[y + 1][x] += int(8 / 32 * current_error) self.error_table[y + 1][x + 1] += int(4 / 32 * current_error) self.error_table[y + 1][x + 2] += int(2 / 32 * current_error) self.error_table[y + 1][x - 1] += int(4 / 32 * current_error) self.error_table[y + 1][x - 2] += int(2 / 32 * current_error) if __name__ == "__main__": # create Burke's instances with original images in greyscale burkes_instances = [ Burkes(imread("image_data/lena.jpg", 1), threshold) for threshold in (1, 126, 130, 140) ] for burkes in burkes_instances: burkes.process() for burkes in burkes_instances: imshow( f"Original image with dithering threshold: {burkes.threshold}", burkes.output_img, ) waitKey(0) destroyAllWindows() ================================================ FILE: digital_image_processing/edge_detection/__init__.py ================================================ ================================================ FILE: digital_image_processing/edge_detection/canny.py ================================================ import cv2 import numpy as np from digital_image_processing.filters.convolve import img_convolve from digital_image_processing.filters.sobel_filter import sobel_filter PI = 180 def gen_gaussian_kernel(k_size, sigma): center = k_size // 2 x, y = np.mgrid[0 - center : k_size - center, 0 - center : k_size - center] g = ( 1 / (2 * np.pi * sigma) * np.exp(-(np.square(x) + np.square(y)) / (2 * np.square(sigma))) ) return g def suppress_non_maximum(image_shape, gradient_direction, sobel_grad): """ Non-maximum suppression. If the edge strength of the current pixel is the largest compared to the other pixels in the mask with the same direction, the value will be preserved. Otherwise, the value will be suppressed. """ destination = np.zeros(image_shape) for row in range(1, image_shape[0] - 1): for col in range(1, image_shape[1] - 1): direction = gradient_direction[row, col] if ( 0 <= direction < PI / 8 or 15 * PI / 8 <= direction <= 2 * PI or 7 * PI / 8 <= direction <= 9 * PI / 8 ): w = sobel_grad[row, col - 1] e = sobel_grad[row, col + 1] if sobel_grad[row, col] >= w and sobel_grad[row, col] >= e: destination[row, col] = sobel_grad[row, col] elif ( PI / 8 <= direction < 3 * PI / 8 or 9 * PI / 8 <= direction < 11 * PI / 8 ): sw = sobel_grad[row + 1, col - 1] ne = sobel_grad[row - 1, col + 1] if sobel_grad[row, col] >= sw and sobel_grad[row, col] >= ne: destination[row, col] = sobel_grad[row, col] elif ( 3 * PI / 8 <= direction < 5 * PI / 8 or 11 * PI / 8 <= direction < 13 * PI / 8 ): n = sobel_grad[row - 1, col] s = sobel_grad[row + 1, col] if sobel_grad[row, col] >= n and sobel_grad[row, col] >= s: destination[row, col] = sobel_grad[row, col] elif ( 5 * PI / 8 <= direction < 7 * PI / 8 or 13 * PI / 8 <= direction < 15 * PI / 8 ): nw = sobel_grad[row - 1, col - 1] se = sobel_grad[row + 1, col + 1] if sobel_grad[row, col] >= nw and sobel_grad[row, col] >= se: destination[row, col] = sobel_grad[row, col] return destination def detect_high_low_threshold( image_shape, destination, threshold_low, threshold_high, weak, strong ): """ High-Low threshold detection. If an edge pixel's gradient value is higher than the high threshold value, it is marked as a strong edge pixel. If an edge pixel's gradient value is smaller than the high threshold value and larger than the low threshold value, it is marked as a weak edge pixel. If an edge pixel's value is smaller than the low threshold value, it will be suppressed. """ for row in range(1, image_shape[0] - 1): for col in range(1, image_shape[1] - 1): if destination[row, col] >= threshold_high: destination[row, col] = strong elif destination[row, col] <= threshold_low: destination[row, col] = 0 else: destination[row, col] = weak def track_edge(image_shape, destination, weak, strong): """ Edge tracking. Usually a weak edge pixel caused from true edges will be connected to a strong edge pixel while noise responses are unconnected. As long as there is one strong edge pixel that is involved in its 8-connected neighborhood, that weak edge point can be identified as one that should be preserved. """ for row in range(1, image_shape[0]): for col in range(1, image_shape[1]): if destination[row, col] == weak: if 255 in ( destination[row, col + 1], destination[row, col - 1], destination[row - 1, col], destination[row + 1, col], destination[row - 1, col - 1], destination[row + 1, col - 1], destination[row - 1, col + 1], destination[row + 1, col + 1], ): destination[row, col] = strong else: destination[row, col] = 0 def canny(image, threshold_low=15, threshold_high=30, weak=128, strong=255): # gaussian_filter gaussian_out = img_convolve(image, gen_gaussian_kernel(9, sigma=1.4)) # get the gradient and degree by sobel_filter sobel_grad, sobel_theta = sobel_filter(gaussian_out) gradient_direction = PI + np.rad2deg(sobel_theta) destination = suppress_non_maximum(image.shape, gradient_direction, sobel_grad) detect_high_low_threshold( image.shape, destination, threshold_low, threshold_high, weak, strong ) track_edge(image.shape, destination, weak, strong) return destination if __name__ == "__main__": # read original image in gray mode lena = cv2.imread(r"../image_data/lena.jpg", 0) # canny edge detection canny_destination = canny(lena) cv2.imshow("canny", canny_destination) cv2.waitKey(0) ================================================ FILE: digital_image_processing/filters/__init__.py ================================================ ================================================ FILE: digital_image_processing/filters/bilateral_filter.py ================================================ """ Implementation of Bilateral filter Inputs: img: A 2d image with values in between 0 and 1 varS: variance in space dimension. varI: variance in Intensity. N: Kernel size(Must be an odd number) Output: img:A 2d zero padded image with values in between 0 and 1 """ import math import sys import cv2 import numpy as np def vec_gaussian(img: np.ndarray, variance: float) -> np.ndarray: # For applying gaussian function for each element in matrix. sigma = math.sqrt(variance) cons = 1 / (sigma * math.sqrt(2 * math.pi)) return cons * np.exp(-((img / sigma) ** 2) * 0.5) def get_slice(img: np.ndarray, x: int, y: int, kernel_size: int) -> np.ndarray: half = kernel_size // 2 return img[x - half : x + half + 1, y - half : y + half + 1] def get_gauss_kernel(kernel_size: int, spatial_variance: float) -> np.ndarray: # Creates a gaussian kernel of given dimension. arr = np.zeros((kernel_size, kernel_size)) for i in range(kernel_size): for j in range(kernel_size): arr[i, j] = math.sqrt( abs(i - kernel_size // 2) ** 2 + abs(j - kernel_size // 2) ** 2 ) return vec_gaussian(arr, spatial_variance) def bilateral_filter( img: np.ndarray, spatial_variance: float, intensity_variance: float, kernel_size: int, ) -> np.ndarray: img2 = np.zeros(img.shape) gauss_ker = get_gauss_kernel(kernel_size, spatial_variance) size_x, size_y = img.shape for i in range(kernel_size // 2, size_x - kernel_size // 2): for j in range(kernel_size // 2, size_y - kernel_size // 2): img_s = get_slice(img, i, j, kernel_size) img_i = img_s - img_s[kernel_size // 2, kernel_size // 2] img_ig = vec_gaussian(img_i, intensity_variance) weights = np.multiply(gauss_ker, img_ig) vals = np.multiply(img_s, weights) val = np.sum(vals) / np.sum(weights) img2[i, j] = val return img2 def parse_args(args: list) -> tuple: filename = args[1] if args[1:] else "../image_data/lena.jpg" spatial_variance = float(args[2]) if args[2:] else 1.0 intensity_variance = float(args[3]) if args[3:] else 1.0 if args[4:]: kernel_size = int(args[4]) kernel_size = kernel_size + abs(kernel_size % 2 - 1) else: kernel_size = 5 return filename, spatial_variance, intensity_variance, kernel_size if __name__ == "__main__": filename, spatial_variance, intensity_variance, kernel_size = parse_args(sys.argv) img = cv2.imread(filename, 0) cv2.imshow("input image", img) out = img / 255 out = out.astype("float32") out = bilateral_filter(out, spatial_variance, intensity_variance, kernel_size) out = out * 255 out = np.uint8(out) cv2.imshow("output image", out) cv2.waitKey(0) cv2.destroyAllWindows() ================================================ FILE: digital_image_processing/filters/convolve.py ================================================ # @Author : lightXu # @File : convolve.py # @Time : 2019/7/8 0008 下午 16:13 from cv2 import COLOR_BGR2GRAY, cvtColor, imread, imshow, waitKey from numpy import array, dot, pad, ravel, uint8, zeros def im2col(image, block_size): rows, cols = image.shape dst_height = cols - block_size[1] + 1 dst_width = rows - block_size[0] + 1 image_array = zeros((dst_height * dst_width, block_size[1] * block_size[0])) row = 0 for i in range(dst_height): for j in range(dst_width): window = ravel(image[i : i + block_size[0], j : j + block_size[1]]) image_array[row, :] = window row += 1 return image_array def img_convolve(image, filter_kernel): height, width = image.shape[0], image.shape[1] k_size = filter_kernel.shape[0] pad_size = k_size // 2 # Pads image with the edge values of array. image_tmp = pad(image, pad_size, mode="edge") # im2col, turn the k_size*k_size pixels into a row and np.vstack all rows image_array = im2col(image_tmp, (k_size, k_size)) # turn the kernel into shape(k*k, 1) kernel_array = ravel(filter_kernel) # reshape and get the dst image dst = dot(image_array, kernel_array).reshape(height, width) return dst if __name__ == "__main__": # read original image img = imread(r"../image_data/lena.jpg") # turn image in gray scale value gray = cvtColor(img, COLOR_BGR2GRAY) # Laplace operator Laplace_kernel = array([[0, 1, 0], [1, -4, 1], [0, 1, 0]]) out = img_convolve(gray, Laplace_kernel).astype(uint8) imshow("Laplacian", out) waitKey(0) ================================================ FILE: digital_image_processing/filters/gabor_filter.py ================================================ # Implementation of the Gaborfilter # https://en.wikipedia.org/wiki/Gabor_filter import numpy as np from cv2 import COLOR_BGR2GRAY, CV_8UC3, cvtColor, filter2D, imread, imshow, waitKey def gabor_filter_kernel( ksize: int, sigma: int, theta: int, lambd: int, gamma: int, psi: int ) -> np.ndarray: """ :param ksize: The kernelsize of the convolutional filter (ksize x ksize) :param sigma: standard deviation of the gaussian bell curve :param theta: The orientation of the normal to the parallel stripes of Gabor function. :param lambd: Wavelength of the sinusoidal component. :param gamma: The spatial aspect ratio and specifies the ellipticity of the support of Gabor function. :param psi: The phase offset of the sinusoidal function. >>> gabor_filter_kernel(3, 8, 0, 10, 0, 0).tolist() [[0.8027212023735046, 1.0, 0.8027212023735046], [0.8027212023735046, 1.0, \ 0.8027212023735046], [0.8027212023735046, 1.0, 0.8027212023735046]] """ # prepare kernel # the kernel size have to be odd if (ksize % 2) == 0: ksize = ksize + 1 gabor = np.zeros((ksize, ksize), dtype=np.float32) # each value for y in range(ksize): for x in range(ksize): # distance from center px = x - ksize // 2 py = y - ksize // 2 # degree to radiant _theta = theta / 180 * np.pi cos_theta = np.cos(_theta) sin_theta = np.sin(_theta) # get kernel x _x = cos_theta * px + sin_theta * py # get kernel y _y = -sin_theta * px + cos_theta * py # fill kernel gabor[y, x] = np.exp(-(_x**2 + gamma**2 * _y**2) / (2 * sigma**2)) * np.cos( 2 * np.pi * _x / lambd + psi ) return gabor if __name__ == "__main__": import doctest doctest.testmod() # read original image img = imread("../image_data/lena.jpg") # turn image in gray scale value gray = cvtColor(img, COLOR_BGR2GRAY) # Apply multiple Kernel to detect edges out = np.zeros(gray.shape[:2]) for theta in [0, 30, 60, 90, 120, 150]: """ ksize = 10 sigma = 8 lambd = 10 gamma = 0 psi = 0 """ kernel_10 = gabor_filter_kernel(10, 8, theta, 10, 0, 0) out += filter2D(gray, CV_8UC3, kernel_10) out = out / out.max() * 255 out = out.astype(np.uint8) imshow("Original", gray) imshow("Gabor filter with 20x20 mask and 6 directions", out) waitKey(0) ================================================ FILE: digital_image_processing/filters/gaussian_filter.py ================================================ """ Implementation of gaussian filter algorithm """ from itertools import product from cv2 import COLOR_BGR2GRAY, cvtColor, imread, imshow, waitKey from numpy import dot, exp, mgrid, pi, ravel, square, uint8, zeros def gen_gaussian_kernel(k_size, sigma): center = k_size // 2 x, y = mgrid[0 - center : k_size - center, 0 - center : k_size - center] g = 1 / (2 * pi * sigma) * exp(-(square(x) + square(y)) / (2 * square(sigma))) return g def gaussian_filter(image, k_size, sigma): height, width = image.shape[0], image.shape[1] # dst image height and width dst_height = height - k_size + 1 dst_width = width - k_size + 1 # im2col, turn the k_size*k_size pixels into a row and np.vstack all rows image_array = zeros((dst_height * dst_width, k_size * k_size)) for row, (i, j) in enumerate(product(range(dst_height), range(dst_width))): window = ravel(image[i : i + k_size, j : j + k_size]) image_array[row, :] = window # turn the kernel into shape(k*k, 1) gaussian_kernel = gen_gaussian_kernel(k_size, sigma) filter_array = ravel(gaussian_kernel) # reshape and get the dst image dst = dot(image_array, filter_array).reshape(dst_height, dst_width).astype(uint8) return dst if __name__ == "__main__": # read original image img = imread(r"../image_data/lena.jpg") # turn image in gray scale value gray = cvtColor(img, COLOR_BGR2GRAY) # get values with two different mask size gaussian3x3 = gaussian_filter(gray, 3, sigma=1) gaussian5x5 = gaussian_filter(gray, 5, sigma=0.8) # show result images imshow("gaussian filter with 3x3 mask", gaussian3x3) imshow("gaussian filter with 5x5 mask", gaussian5x5) waitKey() ================================================ FILE: digital_image_processing/filters/laplacian_filter.py ================================================ # @Author : ojas-wani # @File : laplacian_filter.py # @Date : 10/04/2023 import numpy as np from cv2 import ( BORDER_DEFAULT, COLOR_BGR2GRAY, CV_64F, cvtColor, filter2D, imread, imshow, waitKey, ) from digital_image_processing.filters.gaussian_filter import gaussian_filter def my_laplacian(src: np.ndarray, ksize: int) -> np.ndarray: """ :param src: the source image, which should be a grayscale or color image. :param ksize: the size of the kernel used to compute the Laplacian filter, which can be 1, 3, 5, or 7. >>> my_laplacian(src=np.array([]), ksize=0) Traceback (most recent call last): ... ValueError: ksize must be in (1, 3, 5, 7) """ kernels = { 1: np.array([[0, -1, 0], [-1, 4, -1], [0, -1, 0]]), 3: np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]]), 5: np.array( [ [0, 0, -1, 0, 0], [0, -1, -2, -1, 0], [-1, -2, 16, -2, -1], [0, -1, -2, -1, 0], [0, 0, -1, 0, 0], ] ), 7: np.array( [ [0, 0, 0, -1, 0, 0, 0], [0, 0, -2, -3, -2, 0, 0], [0, -2, -7, -10, -7, -2, 0], [-1, -3, -10, 68, -10, -3, -1], [0, -2, -7, -10, -7, -2, 0], [0, 0, -2, -3, -2, 0, 0], [0, 0, 0, -1, 0, 0, 0], ] ), } if ksize not in kernels: msg = f"ksize must be in {tuple(kernels)}" raise ValueError(msg) # Apply the Laplacian kernel using convolution return filter2D( src, CV_64F, kernels[ksize], 0, borderType=BORDER_DEFAULT, anchor=(0, 0) ) if __name__ == "__main__": # read original image img = imread(r"../image_data/lena.jpg") # turn image in gray scale value gray = cvtColor(img, COLOR_BGR2GRAY) # Applying gaussian filter blur_image = gaussian_filter(gray, 3, sigma=1) # Apply multiple Kernel to detect edges laplacian_image = my_laplacian(ksize=3, src=blur_image) imshow("Original image", img) imshow("Detected edges using laplacian filter", laplacian_image) waitKey(0) ================================================ FILE: digital_image_processing/filters/local_binary_pattern.py ================================================ import cv2 import numpy as np def get_neighbors_pixel( image: np.ndarray, x_coordinate: int, y_coordinate: int, center: int ) -> int: """ Comparing local neighborhood pixel value with threshold value of centre pixel. Exception is required when neighborhood value of a center pixel value is null. i.e. values present at boundaries. :param image: The image we're working with :param x_coordinate: x-coordinate of the pixel :param y_coordinate: The y coordinate of the pixel :param center: center pixel value :return: The value of the pixel is being returned. """ try: return int(image[x_coordinate][y_coordinate] >= center) except (IndexError, TypeError): return 0 def local_binary_value(image: np.ndarray, x_coordinate: int, y_coordinate: int) -> int: """ It takes an image, an x and y coordinate, and returns the decimal value of the local binary patternof the pixel at that coordinate :param image: the image to be processed :param x_coordinate: x coordinate of the pixel :param y_coordinate: the y coordinate of the pixel :return: The decimal value of the binary value of the pixels around the center pixel. """ center = image[x_coordinate][y_coordinate] powers = [1, 2, 4, 8, 16, 32, 64, 128] # skip get_neighbors_pixel if center is null if center is None: return 0 # Starting from the top right, assigning value to pixels clockwise binary_values = [ get_neighbors_pixel(image, x_coordinate - 1, y_coordinate + 1, center), get_neighbors_pixel(image, x_coordinate, y_coordinate + 1, center), get_neighbors_pixel(image, x_coordinate - 1, y_coordinate, center), get_neighbors_pixel(image, x_coordinate + 1, y_coordinate + 1, center), get_neighbors_pixel(image, x_coordinate + 1, y_coordinate, center), get_neighbors_pixel(image, x_coordinate + 1, y_coordinate - 1, center), get_neighbors_pixel(image, x_coordinate, y_coordinate - 1, center), get_neighbors_pixel(image, x_coordinate - 1, y_coordinate - 1, center), ] # Converting the binary value to decimal. return sum( binary_value * power for binary_value, power in zip(binary_values, powers) ) if __name__ == "__main__": # Reading the image and converting it to grayscale. image = cv2.imread( "digital_image_processing/image_data/lena.jpg", cv2.IMREAD_GRAYSCALE ) # Create a numpy array as the same height and width of read image lbp_image = np.zeros((image.shape[0], image.shape[1])) # Iterating through the image and calculating the # local binary pattern value for each pixel. for i in range(image.shape[0]): for j in range(image.shape[1]): lbp_image[i][j] = local_binary_value(image, i, j) cv2.imshow("local binary pattern", lbp_image) cv2.waitKey(0) cv2.destroyAllWindows() ================================================ FILE: digital_image_processing/filters/median_filter.py ================================================ """ Implementation of median filter algorithm """ from cv2 import COLOR_BGR2GRAY, cvtColor, imread, imshow, waitKey from numpy import divide, int8, multiply, ravel, sort, zeros_like def median_filter(gray_img, mask=3): """ :param gray_img: gray image :param mask: mask size :return: image with median filter """ # set image borders bd = int(mask / 2) # copy image size median_img = zeros_like(gray_img) for i in range(bd, gray_img.shape[0] - bd): for j in range(bd, gray_img.shape[1] - bd): # get mask according with mask kernel = ravel(gray_img[i - bd : i + bd + 1, j - bd : j + bd + 1]) # calculate mask median median = sort(kernel)[int8(divide((multiply(mask, mask)), 2) + 1)] median_img[i, j] = median return median_img if __name__ == "__main__": # read original image img = imread("../image_data/lena.jpg") # turn image in gray scale value gray = cvtColor(img, COLOR_BGR2GRAY) # get values with two different mask size median3x3 = median_filter(gray, 3) median5x5 = median_filter(gray, 5) # show result images imshow("median filter with 3x3 mask", median3x3) imshow("median filter with 5x5 mask", median5x5) waitKey(0) ================================================ FILE: digital_image_processing/filters/sobel_filter.py ================================================ # @Author : lightXu # @File : sobel_filter.py # @Time : 2019/7/8 0008 下午 16:26 import numpy as np from cv2 import COLOR_BGR2GRAY, cvtColor, imread, imshow, waitKey from digital_image_processing.filters.convolve import img_convolve def sobel_filter(image): kernel_x = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]) kernel_y = np.array([[1, 2, 1], [0, 0, 0], [-1, -2, -1]]) dst_x = np.abs(img_convolve(image, kernel_x)) dst_y = np.abs(img_convolve(image, kernel_y)) # modify the pix within [0, 255] dst_x = dst_x * 255 / np.max(dst_x) dst_y = dst_y * 255 / np.max(dst_y) dst_xy = np.sqrt((np.square(dst_x)) + (np.square(dst_y))) dst_xy = dst_xy * 255 / np.max(dst_xy) dst = dst_xy.astype(np.uint8) theta = np.arctan2(dst_y, dst_x) return dst, theta if __name__ == "__main__": # read original image img = imread("../image_data/lena.jpg") # turn image in gray scale value gray = cvtColor(img, COLOR_BGR2GRAY) sobel_grad, sobel_theta = sobel_filter(gray) # show result images imshow("sobel filter", sobel_grad) imshow("sobel theta", sobel_theta) waitKey(0) ================================================ FILE: digital_image_processing/histogram_equalization/__init__.py ================================================ ================================================ FILE: digital_image_processing/histogram_equalization/histogram_stretch.py ================================================ """ Created on Fri Sep 28 15:22:29 2018 @author: Binish125 """ import copy import os import cv2 import numpy as np from matplotlib import pyplot as plt class ConstantStretch: def __init__(self): self.img = "" self.original_image = "" self.last_list = [] self.rem = 0 self.L = 256 self.sk = 0 self.k = 0 self.number_of_rows = 0 self.number_of_cols = 0 def stretch(self, input_image): self.img = cv2.imread(input_image, 0) self.original_image = copy.deepcopy(self.img) x, _, _ = plt.hist(self.img.ravel(), 256, [0, 256], label="x") self.k = np.sum(x) for i in range(len(x)): prk = x[i] / self.k self.sk += prk last = (self.L - 1) * self.sk if self.rem != 0: self.rem = int(last % last) last = int(last + 1 if self.rem >= 0.5 else last) self.last_list.append(last) self.number_of_rows = int(np.ma.count(self.img) / self.img[1].size) self.number_of_cols = self.img[1].size for i in range(self.number_of_cols): for j in range(self.number_of_rows): num = self.img[j][i] if num != self.last_list[num]: self.img[j][i] = self.last_list[num] cv2.imwrite("output_data/output.jpg", self.img) def plot_histogram(self): plt.hist(self.img.ravel(), 256, [0, 256]) def show_image(self): cv2.imshow("Output-Image", self.img) cv2.imshow("Input-Image", self.original_image) cv2.waitKey(5000) cv2.destroyAllWindows() if __name__ == "__main__": file_path = os.path.join(os.path.basename(__file__), "image_data/input.jpg") stretcher = ConstantStretch() stretcher.stretch(file_path) stretcher.plot_histogram() stretcher.show_image() ================================================ FILE: digital_image_processing/histogram_equalization/image_data/__init__.py ================================================ ================================================ FILE: digital_image_processing/histogram_equalization/output_data/__init__.py ================================================ ================================================ FILE: digital_image_processing/image_data/__init__.py ================================================ ================================================ FILE: digital_image_processing/index_calculation.py ================================================ # Author: João Gustavo A. Amorim # Author email: joaogustavoamorim@gmail.com # Coding date: jan 2019 # python/black: True # Imports import numpy as np # Class implemented to calculus the index class IndexCalculation: """ # Class Summary This algorithm consists in calculating vegetation indices, these indices can be used for precision agriculture for example (or remote sensing). There are functions to define the data and to calculate the implemented indices. # Vegetation index https://en.wikipedia.org/wiki/Vegetation_Index A Vegetation Index (VI) is a spectral transformation of two or more bands designed to enhance the contribution of vegetation properties and allow reliable spatial and temporal inter-comparisons of terrestrial photosynthetic activity and canopy structural variations # Information about channels (Wavelength range for each) * nir - near-infrared https://www.malvernpanalytical.com/br/products/technology/near-infrared-spectroscopy Wavelength Range 700 nm to 2500 nm * Red Edge https://en.wikipedia.org/wiki/Red_edge Wavelength Range 680 nm to 730 nm * red https://en.wikipedia.org/wiki/Color Wavelength Range 635 nm to 700 nm * blue https://en.wikipedia.org/wiki/Color Wavelength Range 450 nm to 490 nm * green https://en.wikipedia.org/wiki/Color Wavelength Range 520 nm to 560 nm # Implemented index list #"abbreviationOfIndexName" -- list of channels used #"ARVI2" -- red, nir #"CCCI" -- red, redEdge, nir #"CVI" -- red, green, nir #"GLI" -- red, green, blue #"NDVI" -- red, nir #"BNDVI" -- blue, nir #"redEdgeNDVI" -- red, redEdge #"GNDVI" -- green, nir #"GBNDVI" -- green, blue, nir #"GRNDVI" -- red, green, nir #"RBNDVI" -- red, blue, nir #"PNDVI" -- red, green, blue, nir #"ATSAVI" -- red, nir #"BWDRVI" -- blue, nir #"CIgreen" -- green, nir #"CIrededge" -- redEdge, nir #"CI" -- red, blue #"CTVI" -- red, nir #"GDVI" -- green, nir #"EVI" -- red, blue, nir #"GEMI" -- red, nir #"GOSAVI" -- green, nir #"GSAVI" -- green, nir #"Hue" -- red, green, blue #"IVI" -- red, nir #"IPVI" -- red, nir #"I" -- red, green, blue #"RVI" -- red, nir #"MRVI" -- red, nir #"MSAVI" -- red, nir #"NormG" -- red, green, nir #"NormNIR" -- red, green, nir #"NormR" -- red, green, nir #"NGRDI" -- red, green #"RI" -- red, green #"S" -- red, green, blue #"IF" -- red, green, blue #"DVI" -- red, nir #"TVI" -- red, nir #"NDRE" -- redEdge, nir #list of all index implemented #allIndex = ["ARVI2", "CCCI", "CVI", "GLI", "NDVI", "BNDVI", "redEdgeNDVI", "GNDVI", "GBNDVI", "GRNDVI", "RBNDVI", "PNDVI", "ATSAVI", "BWDRVI", "CIgreen", "CIrededge", "CI", "CTVI", "GDVI", "EVI", "GEMI", "GOSAVI", "GSAVI", "Hue", "IVI", "IPVI", "I", "RVI", "MRVI", "MSAVI", "NormG", "NormNIR", "NormR", "NGRDI", "RI", "S", "IF", "DVI", "TVI", "NDRE"] #list of index with not blue channel #notBlueIndex = ["ARVI2", "CCCI", "CVI", "NDVI", "redEdgeNDVI", "GNDVI", "GRNDVI", "ATSAVI", "CIgreen", "CIrededge", "CTVI", "GDVI", "GEMI", "GOSAVI", "GSAVI", "IVI", "IPVI", "RVI", "MRVI", "MSAVI", "NormG", "NormNIR", "NormR", "NGRDI", "RI", "DVI", "TVI", "NDRE"] #list of index just with RGB channels #RGBIndex = ["GLI", "CI", "Hue", "I", "NGRDI", "RI", "S", "IF"] """ def __init__(self, red=None, green=None, blue=None, red_edge=None, nir=None): self.set_matricies(red=red, green=green, blue=blue, red_edge=red_edge, nir=nir) def set_matricies(self, red=None, green=None, blue=None, red_edge=None, nir=None): if red is not None: self.red = red if green is not None: self.green = green if blue is not None: self.blue = blue if red_edge is not None: self.redEdge = red_edge if nir is not None: self.nir = nir return True def calculation( self, index="", red=None, green=None, blue=None, red_edge=None, nir=None ): """ performs the calculation of the index with the values instantiated in the class :str index: abbreviation of index name to perform """ self.set_matricies(red=red, green=green, blue=blue, red_edge=red_edge, nir=nir) funcs = { "ARVI2": self.arv12, "CCCI": self.ccci, "CVI": self.cvi, "GLI": self.gli, "NDVI": self.ndvi, "BNDVI": self.bndvi, "redEdgeNDVI": self.red_edge_ndvi, "GNDVI": self.gndvi, "GBNDVI": self.gbndvi, "GRNDVI": self.grndvi, "RBNDVI": self.rbndvi, "PNDVI": self.pndvi, "ATSAVI": self.atsavi, "BWDRVI": self.bwdrvi, "CIgreen": self.ci_green, "CIrededge": self.ci_rededge, "CI": self.ci, "CTVI": self.ctvi, "GDVI": self.gdvi, "EVI": self.evi, "GEMI": self.gemi, "GOSAVI": self.gosavi, "GSAVI": self.gsavi, "Hue": self.hue, "IVI": self.ivi, "IPVI": self.ipvi, "I": self.i, "RVI": self.rvi, "MRVI": self.mrvi, "MSAVI": self.m_savi, "NormG": self.norm_g, "NormNIR": self.norm_nir, "NormR": self.norm_r, "NGRDI": self.ngrdi, "RI": self.ri, "S": self.s, "IF": self._if, "DVI": self.dvi, "TVI": self.tvi, "NDRE": self.ndre, } try: return funcs[index]() except KeyError: print("Index not in the list!") return False def arv12(self): """ Atmospherically Resistant Vegetation Index 2 https://www.indexdatabase.de/db/i-single.php?id=396 :return: index -0.18+1.17*(self.nir-self.red)/(self.nir+self.red) """ return -0.18 + (1.17 * ((self.nir - self.red) / (self.nir + self.red))) def ccci(self): """ Canopy Chlorophyll Content Index https://www.indexdatabase.de/db/i-single.php?id=224 :return: index """ return ((self.nir - self.redEdge) / (self.nir + self.redEdge)) / ( (self.nir - self.red) / (self.nir + self.red) ) def cvi(self): """ Chlorophyll vegetation index https://www.indexdatabase.de/db/i-single.php?id=391 :return: index """ return self.nir * (self.red / (self.green**2)) def gli(self): """ self.green leaf index https://www.indexdatabase.de/db/i-single.php?id=375 :return: index """ return (2 * self.green - self.red - self.blue) / ( 2 * self.green + self.red + self.blue ) def ndvi(self): """ Normalized Difference self.nir/self.red Normalized Difference Vegetation Index, Calibrated NDVI - CDVI https://www.indexdatabase.de/db/i-single.php?id=58 :return: index """ return (self.nir - self.red) / (self.nir + self.red) def bndvi(self): """ Normalized Difference self.nir/self.blue self.blue-normalized difference vegetation index https://www.indexdatabase.de/db/i-single.php?id=135 :return: index """ return (self.nir - self.blue) / (self.nir + self.blue) def red_edge_ndvi(self): """ Normalized Difference self.rededge/self.red https://www.indexdatabase.de/db/i-single.php?id=235 :return: index """ return (self.redEdge - self.red) / (self.redEdge + self.red) def gndvi(self): """ Normalized Difference self.nir/self.green self.green NDVI https://www.indexdatabase.de/db/i-single.php?id=401 :return: index """ return (self.nir - self.green) / (self.nir + self.green) def gbndvi(self): """ self.green-self.blue NDVI https://www.indexdatabase.de/db/i-single.php?id=186 :return: index """ return (self.nir - (self.green + self.blue)) / ( self.nir + (self.green + self.blue) ) def grndvi(self): """ self.green-self.red NDVI https://www.indexdatabase.de/db/i-single.php?id=185 :return: index """ return (self.nir - (self.green + self.red)) / ( self.nir + (self.green + self.red) ) def rbndvi(self): """ self.red-self.blue NDVI https://www.indexdatabase.de/db/i-single.php?id=187 :return: index """ return (self.nir - (self.blue + self.red)) / (self.nir + (self.blue + self.red)) def pndvi(self): """ Pan NDVI https://www.indexdatabase.de/db/i-single.php?id=188 :return: index """ return (self.nir - (self.green + self.red + self.blue)) / ( self.nir + (self.green + self.red + self.blue) ) def atsavi(self, x=0.08, a=1.22, b=0.03): """ Adjusted transformed soil-adjusted VI https://www.indexdatabase.de/db/i-single.php?id=209 :return: index """ return a * ( (self.nir - a * self.red - b) / (a * self.nir + self.red - a * b + x * (1 + a**2)) ) def bwdrvi(self): """ self.blue-wide dynamic range vegetation index https://www.indexdatabase.de/db/i-single.php?id=136 :return: index """ return (0.1 * self.nir - self.blue) / (0.1 * self.nir + self.blue) def ci_green(self): """ Chlorophyll Index self.green https://www.indexdatabase.de/db/i-single.php?id=128 :return: index """ return (self.nir / self.green) - 1 def ci_rededge(self): """ Chlorophyll Index self.redEdge https://www.indexdatabase.de/db/i-single.php?id=131 :return: index """ return (self.nir / self.redEdge) - 1 def ci(self): """ Coloration Index https://www.indexdatabase.de/db/i-single.php?id=11 :return: index """ return (self.red - self.blue) / self.red def ctvi(self): """ Corrected Transformed Vegetation Index https://www.indexdatabase.de/db/i-single.php?id=244 :return: index """ ndvi = self.ndvi() return ((ndvi + 0.5) / (abs(ndvi + 0.5))) * (abs(ndvi + 0.5) ** (1 / 2)) def gdvi(self): """ Difference self.nir/self.green self.green Difference Vegetation Index https://www.indexdatabase.de/db/i-single.php?id=27 :return: index """ return self.nir - self.green def evi(self): """ Enhanced Vegetation Index https://www.indexdatabase.de/db/i-single.php?id=16 :return: index """ return 2.5 * ( (self.nir - self.red) / (self.nir + 6 * self.red - 7.5 * self.blue + 1) ) def gemi(self): """ Global Environment Monitoring Index https://www.indexdatabase.de/db/i-single.php?id=25 :return: index """ n = (2 * (self.nir**2 - self.red**2) + 1.5 * self.nir + 0.5 * self.red) / ( self.nir + self.red + 0.5 ) return n * (1 - 0.25 * n) - (self.red - 0.125) / (1 - self.red) def gosavi(self, y=0.16): """ self.green Optimized Soil Adjusted Vegetation Index https://www.indexdatabase.de/db/i-single.php?id=29 mit Y = 0,16 :return: index """ return (self.nir - self.green) / (self.nir + self.green + y) def gsavi(self, n=0.5): """ self.green Soil Adjusted Vegetation Index https://www.indexdatabase.de/db/i-single.php?id=31 mit N = 0,5 :return: index """ return ((self.nir - self.green) / (self.nir + self.green + n)) * (1 + n) def hue(self): """ Hue https://www.indexdatabase.de/db/i-single.php?id=34 :return: index """ return np.arctan( ((2 * self.red - self.green - self.blue) / 30.5) * (self.green - self.blue) ) def ivi(self, a=None, b=None): """ Ideal vegetation index https://www.indexdatabase.de/db/i-single.php?id=276 b=intercept of vegetation line a=soil line slope :return: index """ return (self.nir - b) / (a * self.red) def ipvi(self): """ Infraself.red percentage vegetation index https://www.indexdatabase.de/db/i-single.php?id=35 :return: index """ return (self.nir / ((self.nir + self.red) / 2)) * (self.ndvi() + 1) def i(self): """ Intensity https://www.indexdatabase.de/db/i-single.php?id=36 :return: index """ return (self.red + self.green + self.blue) / 30.5 def rvi(self): """ Ratio-Vegetation-Index http://www.seos-project.eu/modules/remotesensing/remotesensing-c03-s01-p01.html :return: index """ return self.nir / self.red def mrvi(self): """ Modified Normalized Difference Vegetation Index RVI https://www.indexdatabase.de/db/i-single.php?id=275 :return: index """ return (self.rvi() - 1) / (self.rvi() + 1) def m_savi(self): """ Modified Soil Adjusted Vegetation Index https://www.indexdatabase.de/db/i-single.php?id=44 :return: index """ return ( (2 * self.nir + 1) - ((2 * self.nir + 1) ** 2 - 8 * (self.nir - self.red)) ** (1 / 2) ) / 2 def norm_g(self): """ Norm G https://www.indexdatabase.de/db/i-single.php?id=50 :return: index """ return self.green / (self.nir + self.red + self.green) def norm_nir(self): """ Norm self.nir https://www.indexdatabase.de/db/i-single.php?id=51 :return: index """ return self.nir / (self.nir + self.red + self.green) def norm_r(self): """ Norm R https://www.indexdatabase.de/db/i-single.php?id=52 :return: index """ return self.red / (self.nir + self.red + self.green) def ngrdi(self): """ Normalized Difference self.green/self.red Normalized self.green self.red difference index, Visible Atmospherically Resistant Indices self.green (VIself.green) https://www.indexdatabase.de/db/i-single.php?id=390 :return: index """ return (self.green - self.red) / (self.green + self.red) def ri(self): """ Normalized Difference self.red/self.green self.redness Index https://www.indexdatabase.de/db/i-single.php?id=74 :return: index """ return (self.red - self.green) / (self.red + self.green) def s(self): """ Saturation https://www.indexdatabase.de/db/i-single.php?id=77 :return: index """ max_value = np.max([np.max(self.red), np.max(self.green), np.max(self.blue)]) min_value = np.min([np.min(self.red), np.min(self.green), np.min(self.blue)]) return (max_value - min_value) / max_value def _if(self): """ Shape Index https://www.indexdatabase.de/db/i-single.php?id=79 :return: index """ return (2 * self.red - self.green - self.blue) / (self.green - self.blue) def dvi(self): """ Simple Ratio self.nir/self.red Difference Vegetation Index, Vegetation Index Number (VIN) https://www.indexdatabase.de/db/i-single.php?id=12 :return: index """ return self.nir / self.red def tvi(self): """ Transformed Vegetation Index https://www.indexdatabase.de/db/i-single.php?id=98 :return: index """ return (self.ndvi() + 0.5) ** (1 / 2) def ndre(self): return (self.nir - self.redEdge) / (self.nir + self.redEdge) """ # genering a random matrices to test this class red = np.ones((1000,1000, 1),dtype="float64") * 46787 green = np.ones((1000,1000, 1),dtype="float64") * 23487 blue = np.ones((1000,1000, 1),dtype="float64") * 14578 redEdge = np.ones((1000,1000, 1),dtype="float64") * 51045 nir = np.ones((1000,1000, 1),dtype="float64") * 52200 # Examples of how to use the class # instantiating the class cl = IndexCalculation() # instantiating the class with the values #cl = indexCalculation(red=red, green=green, blue=blue, redEdge=redEdge, nir=nir) # how set the values after instantiate the class cl, (for update the data or when don't # instantiating the class with the values) cl.setMatrices(red=red, green=green, blue=blue, redEdge=redEdge, nir=nir) # calculating the indices for the instantiated values in the class # Note: the CCCI index can be changed to any index implemented in the class. indexValue_form1 = cl.calculation("CCCI", red=red, green=green, blue=blue, redEdge=redEdge, nir=nir).astype(np.float64) indexValue_form2 = cl.CCCI() # calculating the index with the values directly -- you can set just the values # preferred note: the *calculation* function performs the function *setMatrices* indexValue_form3 = cl.calculation("CCCI", red=red, green=green, blue=blue, redEdge=redEdge, nir=nir).astype(np.float64) print("Form 1: "+np.array2string(indexValue_form1, precision=20, separator=', ', floatmode='maxprec_equal')) print("Form 2: "+np.array2string(indexValue_form2, precision=20, separator=', ', floatmode='maxprec_equal')) print("Form 3: "+np.array2string(indexValue_form3, precision=20, separator=', ', floatmode='maxprec_equal')) # A list of examples results for different type of data at NDVI # float16 -> 0.31567383 #NDVI (red = 50, nir = 100) # float32 -> 0.31578946 #NDVI (red = 50, nir = 100) # float64 -> 0.3157894736842105 #NDVI (red = 50, nir = 100) # longdouble -> 0.3157894736842105 #NDVI (red = 50, nir = 100) """ ================================================ FILE: digital_image_processing/morphological_operations/__init__.py ================================================ ================================================ FILE: digital_image_processing/morphological_operations/dilation_operation.py ================================================ from pathlib import Path import numpy as np from PIL import Image def rgb_to_gray(rgb: np.ndarray) -> np.ndarray: """ Return gray image from rgb image >>> rgb_to_gray(np.array([[[127, 255, 0]]])) array([[187.6453]]) >>> rgb_to_gray(np.array([[[0, 0, 0]]])) array([[0.]]) >>> rgb_to_gray(np.array([[[2, 4, 1]]])) array([[3.0598]]) >>> rgb_to_gray(np.array([[[26, 255, 14], [5, 147, 20], [1, 200, 0]]])) array([[159.0524, 90.0635, 117.6989]]) """ r, g, b = rgb[:, :, 0], rgb[:, :, 1], rgb[:, :, 2] return 0.2989 * r + 0.5870 * g + 0.1140 * b def gray_to_binary(gray: np.ndarray) -> np.ndarray: """ Return binary image from gray image >>> gray_to_binary(np.array([[127, 255, 0]])) array([[False, True, False]]) >>> gray_to_binary(np.array([[0]])) array([[False]]) >>> gray_to_binary(np.array([[26.2409, 4.9315, 1.4729]])) array([[False, False, False]]) >>> gray_to_binary(np.array([[26, 255, 14], [5, 147, 20], [1, 200, 0]])) array([[False, True, False], [False, True, False], [False, True, False]]) """ return (gray > 127) & (gray <= 255) def dilation(image: np.ndarray, kernel: np.ndarray) -> np.ndarray: """ Return dilated image >>> dilation(np.array([[True, False, True]]), np.array([[0, 1, 0]])) array([[False, False, False]]) >>> dilation(np.array([[False, False, True]]), np.array([[1, 0, 1]])) array([[False, False, False]]) """ output = np.zeros_like(image) image_padded = np.zeros( (image.shape[0] + kernel.shape[0] - 1, image.shape[1] + kernel.shape[1] - 1) ) # Copy image to padded image image_padded[kernel.shape[0] - 2 : -1 :, kernel.shape[1] - 2 : -1 :] = image # Iterate over image & apply kernel for x in range(image.shape[1]): for y in range(image.shape[0]): summation = ( kernel * image_padded[y : y + kernel.shape[0], x : x + kernel.shape[1]] ).sum() output[y, x] = int(summation > 0) return output if __name__ == "__main__": # read original image lena_path = Path(__file__).resolve().parent / "image_data" / "lena.jpg" lena = np.array(Image.open(lena_path)) # kernel to be applied structuring_element = np.array([[0, 1, 0], [1, 1, 1], [0, 1, 0]]) output = dilation(gray_to_binary(rgb_to_gray(lena)), structuring_element) # Save the output image pil_img = Image.fromarray(output).convert("RGB") pil_img.save("result_dilation.png") ================================================ FILE: digital_image_processing/morphological_operations/erosion_operation.py ================================================ from pathlib import Path import numpy as np from PIL import Image def rgb_to_gray(rgb: np.ndarray) -> np.ndarray: """ Return gray image from rgb image >>> rgb_to_gray(np.array([[[127, 255, 0]]])) array([[187.6453]]) >>> rgb_to_gray(np.array([[[0, 0, 0]]])) array([[0.]]) >>> rgb_to_gray(np.array([[[2, 4, 1]]])) array([[3.0598]]) >>> rgb_to_gray(np.array([[[26, 255, 14], [5, 147, 20], [1, 200, 0]]])) array([[159.0524, 90.0635, 117.6989]]) """ r, g, b = rgb[:, :, 0], rgb[:, :, 1], rgb[:, :, 2] return 0.2989 * r + 0.5870 * g + 0.1140 * b def gray_to_binary(gray: np.ndarray) -> np.ndarray: """ Return binary image from gray image >>> gray_to_binary(np.array([[127, 255, 0]])) array([[False, True, False]]) >>> gray_to_binary(np.array([[0]])) array([[False]]) >>> gray_to_binary(np.array([[26.2409, 4.9315, 1.4729]])) array([[False, False, False]]) >>> gray_to_binary(np.array([[26, 255, 14], [5, 147, 20], [1, 200, 0]])) array([[False, True, False], [False, True, False], [False, True, False]]) """ return (gray > 127) & (gray <= 255) def erosion(image: np.ndarray, kernel: np.ndarray) -> np.ndarray: """ Return eroded image >>> erosion(np.array([[True, True, False]]), np.array([[0, 1, 0]])) array([[False, False, False]]) >>> erosion(np.array([[True, False, False]]), np.array([[1, 1, 0]])) array([[False, False, False]]) """ output = np.zeros_like(image) image_padded = np.zeros( (image.shape[0] + kernel.shape[0] - 1, image.shape[1] + kernel.shape[1] - 1) ) # Copy image to padded image image_padded[kernel.shape[0] - 2 : -1 :, kernel.shape[1] - 2 : -1 :] = image # Iterate over image & apply kernel for x in range(image.shape[1]): for y in range(image.shape[0]): summation = ( kernel * image_padded[y : y + kernel.shape[0], x : x + kernel.shape[1]] ).sum() output[y, x] = int(summation == 5) return output if __name__ == "__main__": # read original image lena_path = Path(__file__).resolve().parent / "image_data" / "lena.jpg" lena = np.array(Image.open(lena_path)) # kernel to be applied structuring_element = np.array([[0, 1, 0], [1, 1, 1], [0, 1, 0]]) # Apply erosion operation to a binary image output = erosion(gray_to_binary(rgb_to_gray(lena)), structuring_element) # Save the output image pil_img = Image.fromarray(output).convert("RGB") pil_img.save("result_erosion.png") ================================================ FILE: digital_image_processing/resize/__init__.py ================================================ ================================================ FILE: digital_image_processing/resize/resize.py ================================================ """Multiple image resizing techniques""" import numpy as np from cv2 import destroyAllWindows, imread, imshow, waitKey class NearestNeighbour: """ Simplest and fastest version of image resizing. Source: https://en.wikipedia.org/wiki/Nearest-neighbor_interpolation """ def __init__(self, img, dst_width: int, dst_height: int): if dst_width < 0 or dst_height < 0: raise ValueError("Destination width/height should be > 0") self.img = img self.src_w = img.shape[1] self.src_h = img.shape[0] self.dst_w = dst_width self.dst_h = dst_height self.ratio_x = self.src_w / self.dst_w self.ratio_y = self.src_h / self.dst_h self.output = self.output_img = ( np.ones((self.dst_h, self.dst_w, 3), np.uint8) * 255 ) def process(self): for i in range(self.dst_h): for j in range(self.dst_w): self.output[i][j] = self.img[self.get_y(i)][self.get_x(j)] def get_x(self, x: int) -> int: """ Get parent X coordinate for destination X :param x: Destination X coordinate :return: Parent X coordinate based on `x ratio` >>> nn = NearestNeighbour(imread("digital_image_processing/image_data/lena.jpg", ... 1), 100, 100) >>> nn.ratio_x = 0.5 >>> nn.get_x(4) 2 """ return int(self.ratio_x * x) def get_y(self, y: int) -> int: """ Get parent Y coordinate for destination Y :param y: Destination X coordinate :return: Parent X coordinate based on `y ratio` >>> nn = NearestNeighbour(imread("digital_image_processing/image_data/lena.jpg", ... 1), 100, 100) >>> nn.ratio_y = 0.5 >>> nn.get_y(4) 2 """ return int(self.ratio_y * y) if __name__ == "__main__": dst_w, dst_h = 800, 600 im = imread("image_data/lena.jpg", 1) n = NearestNeighbour(im, dst_w, dst_h) n.process() imshow( f"Image resized from: {im.shape[1]}x{im.shape[0]} to {dst_w}x{dst_h}", n.output ) waitKey(0) destroyAllWindows() ================================================ FILE: digital_image_processing/rotation/__init__.py ================================================ ================================================ FILE: digital_image_processing/rotation/rotation.py ================================================ from pathlib import Path import cv2 import numpy as np from matplotlib import pyplot as plt def get_rotation( img: np.ndarray, pt1: np.ndarray, pt2: np.ndarray, rows: int, cols: int ) -> np.ndarray: """ Get image rotation :param img: np.ndarray :param pt1: 3x2 list :param pt2: 3x2 list :param rows: columns image shape :param cols: rows image shape :return: np.ndarray """ matrix = cv2.getAffineTransform(pt1, pt2) return cv2.warpAffine(img, matrix, (rows, cols)) if __name__ == "__main__": # read original image image = cv2.imread( str(Path(__file__).resolve().parent.parent / "image_data" / "lena.jpg") ) # turn image in gray scale value gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # get image shape img_rows, img_cols = gray_img.shape # set different points to rotate image pts1 = np.array([[50, 50], [200, 50], [50, 200]], np.float32) pts2 = np.array([[10, 100], [200, 50], [100, 250]], np.float32) pts3 = np.array([[50, 50], [150, 50], [120, 200]], np.float32) pts4 = np.array([[10, 100], [80, 50], [180, 250]], np.float32) # add all rotated images in a list images = [ gray_img, get_rotation(gray_img, pts1, pts2, img_rows, img_cols), get_rotation(gray_img, pts2, pts3, img_rows, img_cols), get_rotation(gray_img, pts2, pts4, img_rows, img_cols), ] # plot different image rotations fig = plt.figure(1) titles = ["Original", "Rotation 1", "Rotation 2", "Rotation 3"] for i, image in enumerate(images): plt.subplot(2, 2, i + 1), plt.imshow(image, "gray") plt.title(titles[i]) plt.axis("off") plt.subplots_adjust(left=0.0, bottom=0.05, right=1.0, top=0.95) plt.show() ================================================ FILE: digital_image_processing/sepia.py ================================================ """ Implemented an algorithm using opencv to tone an image with sepia technique """ from cv2 import destroyAllWindows, imread, imshow, waitKey def make_sepia(img, factor: int): """ Function create sepia tone. Source: https://en.wikipedia.org/wiki/Sepia_(color) """ pixel_h, pixel_v = img.shape[0], img.shape[1] def to_grayscale(blue, green, red): """ Helper function to create pixel's greyscale representation Src: https://pl.wikipedia.org/wiki/YUV """ return 0.2126 * red + 0.587 * green + 0.114 * blue def normalize(value): """Helper function to normalize R/G/B value -> return 255 if value > 255""" return min(value, 255) for i in range(pixel_h): for j in range(pixel_v): greyscale = int(to_grayscale(*img[i][j])) img[i][j] = [ normalize(greyscale), normalize(greyscale + factor), normalize(greyscale + 2 * factor), ] return img if __name__ == "__main__": # read original image images = { percentage: imread("image_data/lena.jpg", 1) for percentage in (10, 20, 30, 40) } for percentage, img in images.items(): make_sepia(img, percentage) for percentage, img in images.items(): imshow(f"Original image with sepia (factor: {percentage})", img) waitKey(0) destroyAllWindows() ================================================ FILE: digital_image_processing/test_digital_image_processing.py ================================================ """ PyTest's for Digital Image Processing """ import numpy as np from cv2 import COLOR_BGR2GRAY, cvtColor, imread from numpy import array, uint8 from PIL import Image from digital_image_processing import change_contrast as cc from digital_image_processing import convert_to_negative as cn from digital_image_processing import sepia as sp from digital_image_processing.dithering import burkes as bs from digital_image_processing.edge_detection import canny from digital_image_processing.filters import convolve as conv from digital_image_processing.filters import gaussian_filter as gg from digital_image_processing.filters import local_binary_pattern as lbp from digital_image_processing.filters import median_filter as med from digital_image_processing.filters import sobel_filter as sob from digital_image_processing.resize import resize as rs img = imread(r"digital_image_processing/image_data/lena_small.jpg") gray = cvtColor(img, COLOR_BGR2GRAY) # Test: convert_to_negative() def test_convert_to_negative(): negative_img = cn.convert_to_negative(img) # assert negative_img array for at least one True assert negative_img.any() # Test: change_contrast() def test_change_contrast(): with Image.open("digital_image_processing/image_data/lena_small.jpg") as img: # Work around assertion for response assert str(cc.change_contrast(img, 110)).startswith( " Divide and conquer The points are sorted based on Xco-ords and then based on Yco-ords separately. And by applying divide and conquer approach, minimum distance is obtained recursively. >> Closest points can lie on different sides of partition. This case handled by forming a strip of points whose Xco-ords distance is less than closest_pair_dis from mid-point's Xco-ords. Points sorted based on Yco-ords are used in this step to reduce sorting time. Closest pair distance is found in the strip of points. (closest_in_strip) min(closest_pair_dis, closest_in_strip) would be the final answer. Time complexity: O(n * log n) """ def euclidean_distance_sqr(point1, point2): """ >>> euclidean_distance_sqr([1,2],[2,4]) 5 """ return (point1[0] - point2[0]) ** 2 + (point1[1] - point2[1]) ** 2 def column_based_sort(array, column=0): """ >>> column_based_sort([(5, 1), (4, 2), (3, 0)], 1) [(3, 0), (5, 1), (4, 2)] """ return sorted(array, key=lambda x: x[column]) def dis_between_closest_pair(points, points_counts, min_dis=float("inf")): """ brute force approach to find distance between closest pair points Parameters : points, points_count, min_dis (list(tuple(int, int)), int, int) Returns : min_dis (float): distance between closest pair of points >>> dis_between_closest_pair([[1,2],[2,4],[5,7],[8,9],[11,0]],5) 5 """ for i in range(points_counts - 1): for j in range(i + 1, points_counts): current_dis = euclidean_distance_sqr(points[i], points[j]) min_dis = min(min_dis, current_dis) return min_dis def dis_between_closest_in_strip(points, points_counts, min_dis=float("inf")): """ closest pair of points in strip Parameters : points, points_count, min_dis (list(tuple(int, int)), int, int) Returns : min_dis (float): distance btw closest pair of points in the strip (< min_dis) >>> dis_between_closest_in_strip([[1,2],[2,4],[5,7],[8,9],[11,0]],5) 85 """ for i in range(min(6, points_counts - 1), points_counts): for j in range(max(0, i - 6), i): current_dis = euclidean_distance_sqr(points[i], points[j]) min_dis = min(min_dis, current_dis) return min_dis def closest_pair_of_points_sqr(points_sorted_on_x, points_sorted_on_y, points_counts): """divide and conquer approach Parameters : points, points_count (list(tuple(int, int)), int) Returns : (float): distance btw closest pair of points >>> closest_pair_of_points_sqr([(1, 2), (3, 4)], [(5, 6), (7, 8)], 2) 8 """ # base case if points_counts <= 3: return dis_between_closest_pair(points_sorted_on_x, points_counts) # recursion mid = points_counts // 2 closest_in_left = closest_pair_of_points_sqr( points_sorted_on_x, points_sorted_on_y[:mid], mid ) closest_in_right = closest_pair_of_points_sqr( points_sorted_on_y, points_sorted_on_y[mid:], points_counts - mid ) closest_pair_dis = min(closest_in_left, closest_in_right) """ cross_strip contains the points, whose Xcoords are at a distance(< closest_pair_dis) from mid's Xcoord """ cross_strip = [] for point in points_sorted_on_x: if abs(point[0] - points_sorted_on_x[mid][0]) < closest_pair_dis: cross_strip.append(point) closest_in_strip = dis_between_closest_in_strip( cross_strip, len(cross_strip), closest_pair_dis ) return min(closest_pair_dis, closest_in_strip) def closest_pair_of_points(points, points_counts): """ >>> closest_pair_of_points([(2, 3), (12, 30)], len([(2, 3), (12, 30)])) 28.792360097775937 """ points_sorted_on_x = column_based_sort(points, column=0) points_sorted_on_y = column_based_sort(points, column=1) return ( closest_pair_of_points_sqr( points_sorted_on_x, points_sorted_on_y, points_counts ) ) ** 0.5 if __name__ == "__main__": points = [(2, 3), (12, 30), (40, 50), (5, 1), (12, 10), (3, 4)] print("Distance:", closest_pair_of_points(points, len(points))) ================================================ FILE: divide_and_conquer/convex_hull.py ================================================ """ The convex hull problem is problem of finding all the vertices of convex polygon, P of a set of points in a plane such that all the points are either on the vertices of P or inside P. TH convex hull problem has several applications in geometrical problems, computer graphics and game development. Two algorithms have been implemented for the convex hull problem here. 1. A brute-force algorithm which runs in O(n^3) 2. A divide-and-conquer algorithm which runs in O(n log(n)) There are other several other algorithms for the convex hull problem which have not been implemented here, yet. """ from __future__ import annotations from collections.abc import Iterable class Point: """ Defines a 2-d point for use by all convex-hull algorithms. Parameters ---------- x: an int or a float, the x-coordinate of the 2-d point y: an int or a float, the y-coordinate of the 2-d point Examples -------- >>> Point(1, 2) (1.0, 2.0) >>> Point("1", "2") (1.0, 2.0) >>> Point(1, 2) > Point(0, 1) True >>> Point(1, 1) == Point(1, 1) True >>> Point(-0.5, 1) == Point(0.5, 1) False >>> Point("pi", "e") Traceback (most recent call last): ... ValueError: could not convert string to float: 'pi' """ def __init__(self, x, y): self.x, self.y = float(x), float(y) def __eq__(self, other): return self.x == other.x and self.y == other.y def __ne__(self, other): return not self == other def __gt__(self, other): if self.x > other.x: return True elif self.x == other.x: return self.y > other.y return False def __lt__(self, other): return not self > other def __ge__(self, other): if self.x > other.x: return True elif self.x == other.x: return self.y >= other.y return False def __le__(self, other): if self.x < other.x: return True elif self.x == other.x: return self.y <= other.y return False def __repr__(self): return f"({self.x}, {self.y})" def __hash__(self): return hash(self.x) def _construct_points( list_of_tuples: list[Point] | list[list[float]] | Iterable[list[float]], ) -> list[Point]: """ constructs a list of points from an array-like object of numbers Arguments --------- list_of_tuples: array-like object of type numbers. Acceptable types so far are lists, tuples and sets. Returns -------- points: a list where each item is of type Point. This contains only objects which can be converted into a Point. Examples ------- >>> _construct_points([[1, 1], [2, -1], [0.3, 4]]) [(1.0, 1.0), (2.0, -1.0), (0.3, 4.0)] >>> _construct_points([1, 2]) Ignoring deformed point 1. All points must have at least 2 coordinates. Ignoring deformed point 2. All points must have at least 2 coordinates. [] >>> _construct_points([]) [] >>> _construct_points(None) [] """ points: list[Point] = [] if list_of_tuples: for p in list_of_tuples: if isinstance(p, Point): points.append(p) else: try: points.append(Point(p[0], p[1])) except (IndexError, TypeError): print( f"Ignoring deformed point {p}. All points" " must have at least 2 coordinates." ) return points def _validate_input(points: list[Point] | list[list[float]]) -> list[Point]: """ validates an input instance before a convex-hull algorithms uses it Parameters --------- points: array-like, the 2d points to validate before using with a convex-hull algorithm. The elements of points must be either lists, tuples or Points. Returns ------- points: array_like, an iterable of all well-defined Points constructed passed in. Exception --------- ValueError: if points is empty or None, or if a wrong data structure like a scalar is passed TypeError: if an iterable but non-indexable object (eg. dictionary) is passed. The exception to this a set which we'll convert to a list before using Examples ------- >>> _validate_input([[1, 2]]) [(1.0, 2.0)] >>> _validate_input([(1, 2)]) [(1.0, 2.0)] >>> _validate_input([Point(2, 1), Point(-1, 2)]) [(2.0, 1.0), (-1.0, 2.0)] >>> _validate_input([]) Traceback (most recent call last): ... ValueError: Expecting a list of points but got [] >>> _validate_input(1) Traceback (most recent call last): ... ValueError: Expecting an iterable object but got an non-iterable type 1 """ if not hasattr(points, "__iter__"): msg = f"Expecting an iterable object but got an non-iterable type {points}" raise ValueError(msg) if not points: msg = f"Expecting a list of points but got {points}" raise ValueError(msg) return _construct_points(points) def _det(a: Point, b: Point, c: Point) -> float: """ Computes the sign perpendicular distance of a 2d point c from a line segment ab. The sign indicates the direction of c relative to ab. A Positive value means c is above ab (to the left), while a negative value means c is below ab (to the right). 0 means all three points are on a straight line. As a side note, 0.5 * abs|det| is the area of triangle abc Parameters ---------- a: point, the point on the left end of line segment ab b: point, the point on the right end of line segment ab c: point, the point for which the direction and location is desired. Returns -------- det: float, abs(det) is the distance of c from ab. The sign indicates which side of line segment ab c is. det is computed as (a_xb_y + c_xa_y + b_xc_y) - (a_yb_x + c_ya_x + b_yc_x) Examples ---------- >>> _det(Point(1, 1), Point(1, 2), Point(1, 5)) 0.0 >>> _det(Point(0, 0), Point(10, 0), Point(0, 10)) 100.0 >>> _det(Point(0, 0), Point(10, 0), Point(0, -10)) -100.0 """ det = (a.x * b.y + b.x * c.y + c.x * a.y) - (a.y * b.x + b.y * c.x + c.y * a.x) return det def convex_hull_bf(points: list[Point]) -> list[Point]: """ Constructs the convex hull of a set of 2D points using a brute force algorithm. The algorithm basically considers all combinations of points (i, j) and uses the definition of convexity to determine whether (i, j) is part of the convex hull or not. (i, j) is part of the convex hull if and only iff there are no points on both sides of the line segment connecting the ij, and there is no point k such that k is on either end of the ij. Runtime: O(n^3) - definitely horrible Parameters --------- points: array-like of object of Points, lists or tuples. The set of 2d points for which the convex-hull is needed Returns ------ convex_set: list, the convex-hull of points sorted in non-decreasing order. See Also -------- convex_hull_recursive, Examples --------- >>> convex_hull_bf([[0, 0], [1, 0], [10, 1]]) [(0.0, 0.0), (1.0, 0.0), (10.0, 1.0)] >>> convex_hull_bf([[0, 0], [1, 0], [10, 0]]) [(0.0, 0.0), (10.0, 0.0)] >>> convex_hull_bf([[-1, 1],[-1, -1], [0, 0], [0.5, 0.5], [1, -1], [1, 1], ... [-0.75, 1]]) [(-1.0, -1.0), (-1.0, 1.0), (1.0, -1.0), (1.0, 1.0)] >>> convex_hull_bf([(0, 3), (2, 2), (1, 1), (2, 1), (3, 0), (0, 0), (3, 3), ... (2, -1), (2, -4), (1, -3)]) [(0.0, 0.0), (0.0, 3.0), (1.0, -3.0), (2.0, -4.0), (3.0, 0.0), (3.0, 3.0)] """ points = sorted(_validate_input(points)) n = len(points) convex_set = set() for i in range(n - 1): for j in range(i + 1, n): points_left_of_ij = points_right_of_ij = False ij_part_of_convex_hull = True for k in range(n): if k not in {i, j}: det_k = _det(points[i], points[j], points[k]) if det_k > 0: points_left_of_ij = True elif det_k < 0: points_right_of_ij = True # point[i], point[j], point[k] all lie on a straight line # if point[k] is to the left of point[i] or it's to the # right of point[j], then point[i], point[j] cannot be # part of the convex hull of A elif points[k] < points[i] or points[k] > points[j]: ij_part_of_convex_hull = False break if points_left_of_ij and points_right_of_ij: ij_part_of_convex_hull = False break if ij_part_of_convex_hull: convex_set.update([points[i], points[j]]) return sorted(convex_set) def convex_hull_recursive(points: list[Point]) -> list[Point]: """ Constructs the convex hull of a set of 2D points using a divide-and-conquer strategy The algorithm exploits the geometric properties of the problem by repeatedly partitioning the set of points into smaller hulls, and finding the convex hull of these smaller hulls. The union of the convex hull from smaller hulls is the solution to the convex hull of the larger problem. Parameter --------- points: array-like of object of Points, lists or tuples. The set of 2d points for which the convex-hull is needed Runtime: O(n log n) Returns ------- convex_set: list, the convex-hull of points sorted in non-decreasing order. Examples --------- >>> convex_hull_recursive([[0, 0], [1, 0], [10, 1]]) [(0.0, 0.0), (1.0, 0.0), (10.0, 1.0)] >>> convex_hull_recursive([[0, 0], [1, 0], [10, 0]]) [(0.0, 0.0), (10.0, 0.0)] >>> convex_hull_recursive([[-1, 1],[-1, -1], [0, 0], [0.5, 0.5], [1, -1], [1, 1], ... [-0.75, 1]]) [(-1.0, -1.0), (-1.0, 1.0), (1.0, -1.0), (1.0, 1.0)] >>> convex_hull_recursive([(0, 3), (2, 2), (1, 1), (2, 1), (3, 0), (0, 0), (3, 3), ... (2, -1), (2, -4), (1, -3)]) [(0.0, 0.0), (0.0, 3.0), (1.0, -3.0), (2.0, -4.0), (3.0, 0.0), (3.0, 3.0)] """ points = sorted(_validate_input(points)) n = len(points) # divide all the points into an upper hull and a lower hull # the left most point and the right most point are definitely # members of the convex hull by definition. # use these two anchors to divide all the points into two hulls, # an upper hull and a lower hull. # all points to the left (above) the line joining the extreme points belong to the # upper hull # all points to the right (below) the line joining the extreme points below to the # lower hull # ignore all points on the line joining the extreme points since they cannot be # part of the convex hull left_most_point = points[0] right_most_point = points[n - 1] convex_set = {left_most_point, right_most_point} upper_hull = [] lower_hull = [] for i in range(1, n - 1): det = _det(left_most_point, right_most_point, points[i]) if det > 0: upper_hull.append(points[i]) elif det < 0: lower_hull.append(points[i]) _construct_hull(upper_hull, left_most_point, right_most_point, convex_set) _construct_hull(lower_hull, right_most_point, left_most_point, convex_set) return sorted(convex_set) def _construct_hull( points: list[Point], left: Point, right: Point, convex_set: set[Point] ) -> None: """ Parameters --------- points: list or None, the hull of points from which to choose the next convex-hull point left: Point, the point to the left of line segment joining left and right right: The point to the right of the line segment joining left and right convex_set: set, the current convex-hull. The state of convex-set gets updated by this function Note ---- For the line segment 'ab', 'a' is on the left and 'b' on the right. but the reverse is true for the line segment 'ba'. Returns ------- Nothing, only updates the state of convex-set """ if points: extreme_point = None extreme_point_distance = float("-inf") candidate_points = [] for p in points: det = _det(left, right, p) if det > 0: candidate_points.append(p) if det > extreme_point_distance: extreme_point_distance = det extreme_point = p if extreme_point: _construct_hull(candidate_points, left, extreme_point, convex_set) convex_set.add(extreme_point) _construct_hull(candidate_points, extreme_point, right, convex_set) def convex_hull_melkman(points: list[Point]) -> list[Point]: """ Constructs the convex hull of a set of 2D points using the melkman algorithm. The algorithm works by iteratively inserting points of a simple polygonal chain (meaning that no line segments between two consecutive points cross each other). Sorting the points yields such a polygonal chain. For a detailed description, see http://cgm.cs.mcgill.ca/~athens/cs601/Melkman.html Runtime: O(n log n) - O(n) if points are already sorted in the input Parameters --------- points: array-like of object of Points, lists or tuples. The set of 2d points for which the convex-hull is needed Returns ------ convex_set: list, the convex-hull of points sorted in non-decreasing order. See Also -------- Examples --------- >>> convex_hull_melkman([[0, 0], [1, 0], [10, 1]]) [(0.0, 0.0), (1.0, 0.0), (10.0, 1.0)] >>> convex_hull_melkman([[0, 0], [1, 0], [10, 0]]) [(0.0, 0.0), (10.0, 0.0)] >>> convex_hull_melkman([[-1, 1],[-1, -1], [0, 0], [0.5, 0.5], [1, -1], [1, 1], ... [-0.75, 1]]) [(-1.0, -1.0), (-1.0, 1.0), (1.0, -1.0), (1.0, 1.0)] >>> convex_hull_melkman([(0, 3), (2, 2), (1, 1), (2, 1), (3, 0), (0, 0), (3, 3), ... (2, -1), (2, -4), (1, -3)]) [(0.0, 0.0), (0.0, 3.0), (1.0, -3.0), (2.0, -4.0), (3.0, 0.0), (3.0, 3.0)] """ points = sorted(_validate_input(points)) n = len(points) convex_hull = points[:2] for i in range(2, n): det = _det(convex_hull[1], convex_hull[0], points[i]) if det > 0: convex_hull.insert(0, points[i]) break elif det < 0: convex_hull.append(points[i]) break else: convex_hull[1] = points[i] i += 1 for j in range(i, n): if ( _det(convex_hull[0], convex_hull[-1], points[j]) > 0 and _det(convex_hull[-1], convex_hull[0], points[1]) < 0 ): # The point lies within the convex hull continue convex_hull.insert(0, points[j]) convex_hull.append(points[j]) while _det(convex_hull[0], convex_hull[1], convex_hull[2]) >= 0: del convex_hull[1] while _det(convex_hull[-1], convex_hull[-2], convex_hull[-3]) <= 0: del convex_hull[-2] # `convex_hull` is contains the convex hull in circular order return sorted(convex_hull[1:] if len(convex_hull) > 3 else convex_hull) def main(): points = [ (0, 3), (2, 2), (1, 1), (2, 1), (3, 0), (0, 0), (3, 3), (2, -1), (2, -4), (1, -3), ] # the convex set of points is # [(0, 0), (0, 3), (1, -3), (2, -4), (3, 0), (3, 3)] results_bf = convex_hull_bf(points) results_recursive = convex_hull_recursive(points) assert results_bf == results_recursive results_melkman = convex_hull_melkman(points) assert results_bf == results_melkman print(results_bf) if __name__ == "__main__": main() ================================================ FILE: divide_and_conquer/heaps_algorithm.py ================================================ """ Heap's algorithm returns the list of all permutations possible from a list. It minimizes movement by generating each permutation from the previous one by swapping only two elements. More information: https://en.wikipedia.org/wiki/Heap%27s_algorithm. """ def heaps(arr: list) -> list: """ Pure python implementation of the Heap's algorithm (recursive version), returning all permutations of a list. >>> heaps([]) [()] >>> heaps([0]) [(0,)] >>> heaps([-1, 1]) [(-1, 1), (1, -1)] >>> heaps([1, 2, 3]) [(1, 2, 3), (2, 1, 3), (3, 1, 2), (1, 3, 2), (2, 3, 1), (3, 2, 1)] >>> from itertools import permutations >>> sorted(heaps([1,2,3])) == sorted(permutations([1,2,3])) True >>> all(sorted(heaps(x)) == sorted(permutations(x)) ... for x in ([], [0], [-1, 1], [1, 2, 3])) True """ if len(arr) <= 1: return [tuple(arr)] res = [] def generate(k: int, arr: list): if k == 1: res.append(tuple(arr[:])) return generate(k - 1, arr) for i in range(k - 1): if k % 2 == 0: # k is even arr[i], arr[k - 1] = arr[k - 1], arr[i] else: # k is odd arr[0], arr[k - 1] = arr[k - 1], arr[0] generate(k - 1, arr) generate(len(arr), arr) return res if __name__ == "__main__": user_input = input("Enter numbers separated by a comma:\n").strip() arr = [int(item) for item in user_input.split(",")] print(heaps(arr)) ================================================ FILE: divide_and_conquer/heaps_algorithm_iterative.py ================================================ """ Heap's (iterative) algorithm returns the list of all permutations possible from a list. It minimizes movement by generating each permutation from the previous one by swapping only two elements. More information: https://en.wikipedia.org/wiki/Heap%27s_algorithm. """ def heaps(arr: list) -> list: """ Pure python implementation of the iterative Heap's algorithm, returning all permutations of a list. >>> heaps([]) [()] >>> heaps([0]) [(0,)] >>> heaps([-1, 1]) [(-1, 1), (1, -1)] >>> heaps([1, 2, 3]) [(1, 2, 3), (2, 1, 3), (3, 1, 2), (1, 3, 2), (2, 3, 1), (3, 2, 1)] >>> from itertools import permutations >>> sorted(heaps([1,2,3])) == sorted(permutations([1,2,3])) True >>> all(sorted(heaps(x)) == sorted(permutations(x)) ... for x in ([], [0], [-1, 1], [1, 2, 3])) True """ if len(arr) <= 1: return [tuple(arr)] res = [] def generate(n: int, arr: list): c = [0] * n res.append(tuple(arr)) i = 0 while i < n: if c[i] < i: if i % 2 == 0: arr[0], arr[i] = arr[i], arr[0] else: arr[c[i]], arr[i] = arr[i], arr[c[i]] res.append(tuple(arr)) c[i] += 1 i = 0 else: c[i] = 0 i += 1 generate(len(arr), arr) return res if __name__ == "__main__": user_input = input("Enter numbers separated by a comma:\n").strip() arr = [int(item) for item in user_input.split(",")] print(heaps(arr)) ================================================ FILE: divide_and_conquer/inversions.py ================================================ """ Given an array-like data structure A[1..n], how many pairs (i, j) for all 1 <= i < j <= n such that A[i] > A[j]? These pairs are called inversions. Counting the number of such inversions in an array-like object is the important. Among other things, counting inversions can help us determine how close a given array is to being sorted. In this implementation, I provide two algorithms, a divide-and-conquer algorithm which runs in nlogn and the brute-force n^2 algorithm. """ def count_inversions_bf(arr): """ Counts the number of inversions using a naive brute-force algorithm Parameters ---------- arr: arr: array-like, the list containing the items for which the number of inversions is desired. The elements of `arr` must be comparable. Returns ------- num_inversions: The total number of inversions in `arr` Examples --------- >>> count_inversions_bf([1, 4, 2, 4, 1]) 4 >>> count_inversions_bf([1, 1, 2, 4, 4]) 0 >>> count_inversions_bf([]) 0 """ num_inversions = 0 n = len(arr) for i in range(n - 1): for j in range(i + 1, n): if arr[i] > arr[j]: num_inversions += 1 return num_inversions def count_inversions_recursive(arr): """ Counts the number of inversions using a divide-and-conquer algorithm Parameters ----------- arr: array-like, the list containing the items for which the number of inversions is desired. The elements of `arr` must be comparable. Returns ------- C: a sorted copy of `arr`. num_inversions: int, the total number of inversions in 'arr' Examples -------- >>> count_inversions_recursive([1, 4, 2, 4, 1]) ([1, 1, 2, 4, 4], 4) >>> count_inversions_recursive([1, 1, 2, 4, 4]) ([1, 1, 2, 4, 4], 0) >>> count_inversions_recursive([]) ([], 0) """ if len(arr) <= 1: return arr, 0 mid = len(arr) // 2 p = arr[0:mid] q = arr[mid:] a, inversion_p = count_inversions_recursive(p) b, inversions_q = count_inversions_recursive(q) c, cross_inversions = _count_cross_inversions(a, b) num_inversions = inversion_p + inversions_q + cross_inversions return c, num_inversions def _count_cross_inversions(p, q): """ Counts the inversions across two sorted arrays. And combine the two arrays into one sorted array For all 1<= i<=len(P) and for all 1 <= j <= len(Q), if P[i] > Q[j], then (i, j) is a cross inversion Parameters ---------- P: array-like, sorted in non-decreasing order Q: array-like, sorted in non-decreasing order Returns ------ R: array-like, a sorted array of the elements of `P` and `Q` num_inversion: int, the number of inversions across `P` and `Q` Examples -------- >>> _count_cross_inversions([1, 2, 3], [0, 2, 5]) ([0, 1, 2, 2, 3, 5], 4) >>> _count_cross_inversions([1, 2, 3], [3, 4, 5]) ([1, 2, 3, 3, 4, 5], 0) """ r = [] i = j = num_inversion = 0 while i < len(p) and j < len(q): if p[i] > q[j]: # if P[1] > Q[j], then P[k] > Q[k] for all i < k <= len(P) # These are all inversions. The claim emerges from the # property that P is sorted. num_inversion += len(p) - i r.append(q[j]) j += 1 else: r.append(p[i]) i += 1 if i < len(p): r.extend(p[i:]) else: r.extend(q[j:]) return r, num_inversion def main(): arr_1 = [10, 2, 1, 5, 5, 2, 11] # this arr has 8 inversions: # (10, 2), (10, 1), (10, 5), (10, 5), (10, 2), (2, 1), (5, 2), (5, 2) num_inversions_bf = count_inversions_bf(arr_1) _, num_inversions_recursive = count_inversions_recursive(arr_1) assert num_inversions_bf == num_inversions_recursive == 8 print("number of inversions = ", num_inversions_bf) # testing an array with zero inversion (a sorted arr_1) arr_1.sort() num_inversions_bf = count_inversions_bf(arr_1) _, num_inversions_recursive = count_inversions_recursive(arr_1) assert num_inversions_bf == num_inversions_recursive == 0 print("number of inversions = ", num_inversions_bf) # an empty list should also have zero inversions arr_1 = [] num_inversions_bf = count_inversions_bf(arr_1) _, num_inversions_recursive = count_inversions_recursive(arr_1) assert num_inversions_bf == num_inversions_recursive == 0 print("number of inversions = ", num_inversions_bf) if __name__ == "__main__": main() ================================================ FILE: divide_and_conquer/kth_order_statistic.py ================================================ """ Find the kth smallest element in linear time using divide and conquer. Recall we can do this trivially in O(nlogn) time. Sort the list and access kth element in constant time. This is a divide and conquer algorithm that can find a solution in O(n) time. For more information of this algorithm: https://web.stanford.edu/class/archive/cs/cs161/cs161.1138/lectures/08/Small08.pdf """ from __future__ import annotations from random import choice def random_pivot(lst): """ Choose a random pivot for the list. We can use a more sophisticated algorithm here, such as the median-of-medians algorithm. """ return choice(lst) def kth_number(lst: list[int], k: int) -> int: """ Return the kth smallest number in lst. >>> kth_number([2, 1, 3, 4, 5], 3) 3 >>> kth_number([2, 1, 3, 4, 5], 1) 1 >>> kth_number([2, 1, 3, 4, 5], 5) 5 >>> kth_number([3, 2, 5, 6, 7, 8], 2) 3 >>> kth_number([25, 21, 98, 100, 76, 22, 43, 60, 89, 87], 4) 43 """ # pick a pivot and separate into list based on pivot. pivot = random_pivot(lst) # partition based on pivot # linear time small = [e for e in lst if e < pivot] big = [e for e in lst if e > pivot] # if we get lucky, pivot might be the element we want. # we can easily see this: # small (elements smaller than k) # + pivot (kth element) # + big (elements larger than k) if len(small) == k - 1: return pivot # pivot is in elements bigger than k elif len(small) < k - 1: return kth_number(big, k - len(small) - 1) # pivot is in elements smaller than k else: return kth_number(small, k) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: divide_and_conquer/max_difference_pair.py ================================================ def max_difference(a: list[int]) -> tuple[int, int]: """ We are given an array A[1..n] of integers, n >= 1. We want to find a pair of indices (i, j) such that 1 <= i <= j <= n and A[j] - A[i] is as large as possible. Explanation: https://www.geeksforgeeks.org/maximum-difference-between-two-elements/ >>> max_difference([5, 11, 2, 1, 7, 9, 0, 7]) (1, 9) """ # base case if len(a) == 1: return a[0], a[0] else: # split A into half. first = a[: len(a) // 2] second = a[len(a) // 2 :] # 2 sub problems, 1/2 of original size. small1, big1 = max_difference(first) small2, big2 = max_difference(second) # get min of first and max of second # linear time min_first = min(first) max_second = max(second) # 3 cases, either (small1, big1), # (min_first, max_second), (small2, big2) # constant comparisons if big2 - small2 > max_second - min_first and big2 - small2 > big1 - small1: return small2, big2 elif big1 - small1 > max_second - min_first: return small1, big1 else: return min_first, max_second if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: divide_and_conquer/max_subarray.py ================================================ """ The maximum subarray problem is the task of finding the continuous subarray that has the maximum sum within a given array of numbers. For example, given the array [-2, 1, -3, 4, -1, 2, 1, -5, 4], the contiguous subarray with the maximum sum is [4, -1, 2, 1], which has a sum of 6. This divide-and-conquer algorithm finds the maximum subarray in O(n log n) time. """ from __future__ import annotations import time from collections.abc import Sequence from random import randint from matplotlib import pyplot as plt def max_subarray( arr: Sequence[float], low: int, high: int ) -> tuple[int | None, int | None, float]: """ Solves the maximum subarray problem using divide and conquer. :param arr: the given array of numbers :param low: the start index :param high: the end index :return: the start index of the maximum subarray, the end index of the maximum subarray, and the maximum subarray sum >>> nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4] >>> max_subarray(nums, 0, len(nums) - 1) (3, 6, 6) >>> nums = [2, 8, 9] >>> max_subarray(nums, 0, len(nums) - 1) (0, 2, 19) >>> nums = [0, 0] >>> max_subarray(nums, 0, len(nums) - 1) (0, 0, 0) >>> nums = [-1.0, 0.0, 1.0] >>> max_subarray(nums, 0, len(nums) - 1) (2, 2, 1.0) >>> nums = [-2, -3, -1, -4, -6] >>> max_subarray(nums, 0, len(nums) - 1) (2, 2, -1) >>> max_subarray([], 0, 0) (None, None, 0) """ if not arr: return None, None, 0 if low == high: return low, high, arr[low] mid = (low + high) // 2 left_low, left_high, left_sum = max_subarray(arr, low, mid) right_low, right_high, right_sum = max_subarray(arr, mid + 1, high) cross_left, cross_right, cross_sum = max_cross_sum(arr, low, mid, high) if left_sum >= right_sum and left_sum >= cross_sum: return left_low, left_high, left_sum elif right_sum >= left_sum and right_sum >= cross_sum: return right_low, right_high, right_sum return cross_left, cross_right, cross_sum def max_cross_sum( arr: Sequence[float], low: int, mid: int, high: int ) -> tuple[int, int, float]: left_sum, max_left = float("-inf"), -1 right_sum, max_right = float("-inf"), -1 summ: int | float = 0 for i in range(mid, low - 1, -1): summ += arr[i] if summ > left_sum: left_sum = summ max_left = i summ = 0 for i in range(mid + 1, high + 1): summ += arr[i] if summ > right_sum: right_sum = summ max_right = i return max_left, max_right, (left_sum + right_sum) def time_max_subarray(input_size: int) -> float: arr = [randint(1, input_size) for _ in range(input_size)] start = time.time() max_subarray(arr, 0, input_size - 1) end = time.time() return end - start def plot_runtimes() -> None: input_sizes = [10, 100, 1000, 10000, 50000, 100000, 200000, 300000, 400000, 500000] runtimes = [time_max_subarray(input_size) for input_size in input_sizes] print("No of Inputs\t\tTime Taken") for input_size, runtime in zip(input_sizes, runtimes): print(input_size, "\t\t", runtime) plt.plot(input_sizes, runtimes) plt.xlabel("Number of Inputs") plt.ylabel("Time taken in seconds") plt.show() if __name__ == "__main__": """ A random simulation of this algorithm. """ from doctest import testmod testmod() ================================================ FILE: divide_and_conquer/mergesort.py ================================================ from __future__ import annotations def merge(left_half: list, right_half: list) -> list: """Helper function for mergesort. >>> left_half = [-2] >>> right_half = [-1] >>> merge(left_half, right_half) [-2, -1] >>> left_half = [1,2,3] >>> right_half = [4,5,6] >>> merge(left_half, right_half) [1, 2, 3, 4, 5, 6] >>> left_half = [-2] >>> right_half = [-1] >>> merge(left_half, right_half) [-2, -1] >>> left_half = [12, 15] >>> right_half = [13, 14] >>> merge(left_half, right_half) [12, 13, 14, 15] >>> left_half = [] >>> right_half = [] >>> merge(left_half, right_half) [] """ sorted_array = [None] * (len(right_half) + len(left_half)) pointer1 = 0 # pointer to current index for left Half pointer2 = 0 # pointer to current index for the right Half index = 0 # pointer to current index for the sorted array Half while pointer1 < len(left_half) and pointer2 < len(right_half): if left_half[pointer1] < right_half[pointer2]: sorted_array[index] = left_half[pointer1] pointer1 += 1 index += 1 else: sorted_array[index] = right_half[pointer2] pointer2 += 1 index += 1 while pointer1 < len(left_half): sorted_array[index] = left_half[pointer1] pointer1 += 1 index += 1 while pointer2 < len(right_half): sorted_array[index] = right_half[pointer2] pointer2 += 1 index += 1 return sorted_array def merge_sort(array: list) -> list: """Returns a list of sorted array elements using merge sort. >>> from random import shuffle >>> array = [-2, 3, -10, 11, 99, 100000, 100, -200] >>> shuffle(array) >>> merge_sort(array) [-200, -10, -2, 3, 11, 99, 100, 100000] >>> shuffle(array) >>> merge_sort(array) [-200, -10, -2, 3, 11, 99, 100, 100000] >>> array = [-200] >>> merge_sort(array) [-200] >>> array = [-2, 3, -10, 11, 99, 100000, 100, -200] >>> shuffle(array) >>> sorted(array) == merge_sort(array) True >>> array = [-2] >>> merge_sort(array) [-2] >>> array = [] >>> merge_sort(array) [] >>> array = [10000000, 1, -1111111111, 101111111112, 9000002] >>> sorted(array) == merge_sort(array) True """ if len(array) <= 1: return array # the actual formula to calculate the middle element = left + (right - left) // 2 # this avoids integer overflow in case of large N middle = 0 + (len(array) - 0) // 2 # Split the array into halves till the array length becomes equal to One # merge the arrays of single length returned by mergeSort function and # pass them into the merge arrays function which merges the array left_half = array[:middle] right_half = array[middle:] return merge(merge_sort(left_half), merge_sort(right_half)) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: divide_and_conquer/peak.py ================================================ """ Finding the peak of a unimodal list using divide and conquer. A unimodal array is defined as follows: array is increasing up to index p, then decreasing afterwards. (for p >= 1) An obvious solution can be performed in O(n), to find the maximum of the array. (From Kleinberg and Tardos. Algorithm Design. Addison Wesley 2006: Chapter 5 Solved Exercise 1) """ from __future__ import annotations def peak(lst: list[int]) -> int: """ Return the peak value of `lst`. >>> peak([1, 2, 3, 4, 5, 4, 3, 2, 1]) 5 >>> peak([1, 10, 9, 8, 7, 6, 5, 4]) 10 >>> peak([1, 9, 8, 7]) 9 >>> peak([1, 2, 3, 4, 5, 6, 7, 0]) 7 >>> peak([1, 2, 3, 4, 3, 2, 1, 0, -1, -2]) 4 """ # middle index m = len(lst) // 2 # choose the middle 3 elements three = lst[m - 1 : m + 2] # if middle element is peak if three[1] > three[0] and three[1] > three[2]: return three[1] # if increasing, recurse on right elif three[0] < three[2]: if len(lst[:m]) == 2: m -= 1 return peak(lst[m:]) # decreasing else: if len(lst[:m]) == 2: m += 1 return peak(lst[:m]) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: divide_and_conquer/power.py ================================================ def actual_power(a: int, b: int) -> int: """ Function using divide and conquer to calculate a^b. It only works for integer a,b. :param a: The base of the power operation, an integer. :param b: The exponent of the power operation, a non-negative integer. :return: The result of a^b. Examples: >>> actual_power(3, 2) 9 >>> actual_power(5, 3) 125 >>> actual_power(2, 5) 32 >>> actual_power(7, 0) 1 """ if b == 0: return 1 half = actual_power(a, b // 2) if (b % 2) == 0: return half * half else: return a * half * half def power(a: int, b: int) -> float: """ :param a: The base (integer). :param b: The exponent (integer). :return: The result of a^b, as a float for negative exponents. >>> power(4,6) 4096 >>> power(2,3) 8 >>> power(-2,3) -8 >>> power(2,-3) 0.125 >>> power(-2,-3) -0.125 """ if b < 0: return 1 / actual_power(a, -b) return actual_power(a, b) if __name__ == "__main__": print(power(-2, -3)) # output -0.125 ================================================ FILE: divide_and_conquer/strassen_matrix_multiplication.py ================================================ from __future__ import annotations import math def default_matrix_multiplication(a: list, b: list) -> list: """ Multiplication only for 2x2 matrices """ if len(a) != 2 or len(a[0]) != 2 or len(b) != 2 or len(b[0]) != 2: raise Exception("Matrices are not 2x2") new_matrix = [ [a[0][0] * b[0][0] + a[0][1] * b[1][0], a[0][0] * b[0][1] + a[0][1] * b[1][1]], [a[1][0] * b[0][0] + a[1][1] * b[1][0], a[1][0] * b[0][1] + a[1][1] * b[1][1]], ] return new_matrix def matrix_addition(matrix_a: list, matrix_b: list): return [ [matrix_a[row][col] + matrix_b[row][col] for col in range(len(matrix_a[row]))] for row in range(len(matrix_a)) ] def matrix_subtraction(matrix_a: list, matrix_b: list): return [ [matrix_a[row][col] - matrix_b[row][col] for col in range(len(matrix_a[row]))] for row in range(len(matrix_a)) ] def split_matrix(a: list) -> tuple[list, list, list, list]: """ Given an even length matrix, returns the top_left, top_right, bot_left, bot_right quadrant. >>> split_matrix([[4,3,2,4],[2,3,1,1],[6,5,4,3],[8,4,1,6]]) ([[4, 3], [2, 3]], [[2, 4], [1, 1]], [[6, 5], [8, 4]], [[4, 3], [1, 6]]) >>> split_matrix([ ... [4,3,2,4,4,3,2,4],[2,3,1,1,2,3,1,1],[6,5,4,3,6,5,4,3],[8,4,1,6,8,4,1,6], ... [4,3,2,4,4,3,2,4],[2,3,1,1,2,3,1,1],[6,5,4,3,6,5,4,3],[8,4,1,6,8,4,1,6] ... ]) # doctest: +NORMALIZE_WHITESPACE ([[4, 3, 2, 4], [2, 3, 1, 1], [6, 5, 4, 3], [8, 4, 1, 6]], [[4, 3, 2, 4], [2, 3, 1, 1], [6, 5, 4, 3], [8, 4, 1, 6]], [[4, 3, 2, 4], [2, 3, 1, 1], [6, 5, 4, 3], [8, 4, 1, 6]], [[4, 3, 2, 4], [2, 3, 1, 1], [6, 5, 4, 3], [8, 4, 1, 6]]) """ if len(a) % 2 != 0 or len(a[0]) % 2 != 0: raise Exception("Odd matrices are not supported!") matrix_length = len(a) mid = matrix_length // 2 top_right = [[a[i][j] for j in range(mid, matrix_length)] for i in range(mid)] bot_right = [ [a[i][j] for j in range(mid, matrix_length)] for i in range(mid, matrix_length) ] top_left = [[a[i][j] for j in range(mid)] for i in range(mid)] bot_left = [[a[i][j] for j in range(mid)] for i in range(mid, matrix_length)] return top_left, top_right, bot_left, bot_right def matrix_dimensions(matrix: list) -> tuple[int, int]: return len(matrix), len(matrix[0]) def print_matrix(matrix: list) -> None: print("\n".join(str(line) for line in matrix)) def actual_strassen(matrix_a: list, matrix_b: list) -> list: """ Recursive function to calculate the product of two matrices, using the Strassen Algorithm. It only supports square matrices of any size that is a power of 2. """ if matrix_dimensions(matrix_a) == (2, 2): return default_matrix_multiplication(matrix_a, matrix_b) a, b, c, d = split_matrix(matrix_a) e, f, g, h = split_matrix(matrix_b) t1 = actual_strassen(a, matrix_subtraction(f, h)) t2 = actual_strassen(matrix_addition(a, b), h) t3 = actual_strassen(matrix_addition(c, d), e) t4 = actual_strassen(d, matrix_subtraction(g, e)) t5 = actual_strassen(matrix_addition(a, d), matrix_addition(e, h)) t6 = actual_strassen(matrix_subtraction(b, d), matrix_addition(g, h)) t7 = actual_strassen(matrix_subtraction(a, c), matrix_addition(e, f)) top_left = matrix_addition(matrix_subtraction(matrix_addition(t5, t4), t2), t6) top_right = matrix_addition(t1, t2) bot_left = matrix_addition(t3, t4) bot_right = matrix_subtraction(matrix_subtraction(matrix_addition(t1, t5), t3), t7) # construct the new matrix from our 4 quadrants new_matrix = [] for i in range(len(top_right)): new_matrix.append(top_left[i] + top_right[i]) for i in range(len(bot_right)): new_matrix.append(bot_left[i] + bot_right[i]) return new_matrix def strassen(matrix1: list, matrix2: list) -> list: """ >>> strassen([[2,1,3],[3,4,6],[1,4,2],[7,6,7]], [[4,2,3,4],[2,1,1,1],[8,6,4,2]]) [[34, 23, 19, 15], [68, 46, 37, 28], [28, 18, 15, 12], [96, 62, 55, 48]] >>> strassen([[3,7,5,6,9],[1,5,3,7,8],[1,4,4,5,7]], [[2,4],[5,2],[1,7],[5,5],[7,8]]) [[139, 163], [121, 134], [100, 121]] """ if matrix_dimensions(matrix1)[1] != matrix_dimensions(matrix2)[0]: msg = ( "Unable to multiply these matrices, please check the dimensions.\n" f"Matrix A: {matrix1}\n" f"Matrix B: {matrix2}" ) raise Exception(msg) dimension1 = matrix_dimensions(matrix1) dimension2 = matrix_dimensions(matrix2) if dimension1[0] == dimension1[1] and dimension2[0] == dimension2[1]: return [matrix1, matrix2] maximum = max(*dimension1, *dimension2) maxim = int(math.pow(2, math.ceil(math.log2(maximum)))) new_matrix1 = matrix1 new_matrix2 = matrix2 # Adding zeros to the matrices to convert them both into square matrices of equal # dimensions that are a power of 2 for i in range(maxim): if i < dimension1[0]: for _ in range(dimension1[1], maxim): new_matrix1[i].append(0) else: new_matrix1.append([0] * maxim) if i < dimension2[0]: for _ in range(dimension2[1], maxim): new_matrix2[i].append(0) else: new_matrix2.append([0] * maxim) final_matrix = actual_strassen(new_matrix1, new_matrix2) # Removing the additional zeros for i in range(maxim): if i < dimension1[0]: for _ in range(dimension2[1], maxim): final_matrix[i].pop() else: final_matrix.pop() return final_matrix if __name__ == "__main__": matrix1 = [ [2, 3, 4, 5], [6, 4, 3, 1], [2, 3, 6, 7], [3, 1, 2, 4], [2, 3, 4, 5], [6, 4, 3, 1], [2, 3, 6, 7], [3, 1, 2, 4], [2, 3, 4, 5], [6, 2, 3, 1], ] matrix2 = [[0, 2, 1, 1], [16, 2, 3, 3], [2, 2, 7, 7], [13, 11, 22, 4]] print(strassen(matrix1, matrix2)) ================================================ FILE: docs/__init__.py ================================================ ================================================ FILE: docs/conf.py ================================================ from sphinx_pyproject import SphinxConfig project = SphinxConfig("../pyproject.toml", globalns=globals()).name ================================================ FILE: docs/source/__init__.py ================================================ ================================================ FILE: dynamic_programming/__init__.py ================================================ ================================================ FILE: dynamic_programming/abbreviation.py ================================================ """ https://www.hackerrank.com/challenges/abbr/problem You can perform the following operation on some string, : 1. Capitalize zero or more of 's lowercase letters at some index i (i.e., make them uppercase). 2. Delete all of the remaining lowercase letters in . Example: a=daBcd and b="ABC" daBcd -> capitalize a and c(dABCd) -> remove d (ABC) """ def abbr(a: str, b: str) -> bool: """ >>> abbr("daBcd", "ABC") True >>> abbr("dBcd", "ABC") False """ n = len(a) m = len(b) dp = [[False for _ in range(m + 1)] for _ in range(n + 1)] dp[0][0] = True for i in range(n): for j in range(m + 1): if dp[i][j]: if j < m and a[i].upper() == b[j]: dp[i + 1][j + 1] = True if a[i].islower(): dp[i + 1][j] = True return dp[n][m] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: dynamic_programming/all_construct.py ================================================ """ Program to list all the ways a target string can be constructed from the given list of substrings """ from __future__ import annotations def all_construct(target: str, word_bank: list[str] | None = None) -> list[list[str]]: """ returns the list containing all the possible combinations a string(`target`) can be constructed from the given list of substrings(`word_bank`) >>> all_construct("hello", ["he", "l", "o"]) [['he', 'l', 'l', 'o']] >>> all_construct("purple",["purp","p","ur","le","purpl"]) [['purp', 'le'], ['p', 'ur', 'p', 'le']] """ word_bank = word_bank or [] # create a table table_size: int = len(target) + 1 table: list[list[list[str]]] = [] for _ in range(table_size): table.append([]) # seed value table[0] = [[]] # because empty string has empty combination # iterate through the indices for i in range(table_size): # condition if table[i] != []: for word in word_bank: # slice condition if target[i : i + len(word)] == word: new_combinations: list[list[str]] = [ [word, *way] for way in table[i] ] # adds the word to every combination the current position holds # now,push that combination to the table[i+len(word)] table[i + len(word)] += new_combinations # combinations are in reverse order so reverse for better output for combination in table[len(target)]: combination.reverse() return table[len(target)] if __name__ == "__main__": print(all_construct("jwajalapa", ["jwa", "j", "w", "a", "la", "lapa"])) print(all_construct("rajamati", ["s", "raj", "amat", "raja", "ma", "i", "t"])) print( all_construct( "hexagonosaurus", ["h", "ex", "hex", "ag", "ago", "ru", "auru", "rus", "go", "no", "o", "s"], ) ) ================================================ FILE: dynamic_programming/bitmask.py ================================================ """ This is a Python implementation for questions involving task assignments between people. Here Bitmasking and DP are used for solving this. Question :- We have N tasks and M people. Each person in M can do only certain of these tasks. Also a person can do only one task and a task is performed only by one person. Find the total no of ways in which the tasks can be distributed. """ from collections import defaultdict class AssignmentUsingBitmask: def __init__(self, task_performed, total): self.total_tasks = total # total no of tasks (N) # DP table will have a dimension of (2^M)*N # initially all values are set to -1 self.dp = [ [-1 for i in range(total + 1)] for j in range(2 ** len(task_performed)) ] self.task = defaultdict(list) # stores the list of persons for each task # final_mask is used to check if all persons are included by setting all bits # to 1 self.final_mask = (1 << len(task_performed)) - 1 def count_ways_until(self, mask, task_no): # if mask == self.finalmask all persons are distributed tasks, return 1 if mask == self.final_mask: return 1 # if not everyone gets the task and no more tasks are available, return 0 if task_no > self.total_tasks: return 0 # if case already considered if self.dp[mask][task_no] != -1: return self.dp[mask][task_no] # Number of ways when we don't this task in the arrangement total_ways_until = self.count_ways_until(mask, task_no + 1) # now assign the tasks one by one to all possible persons and recursively # assign for the remaining tasks. if task_no in self.task: for p in self.task[task_no]: # if p is already given a task if mask & (1 << p): continue # assign this task to p and change the mask value. And recursively # assign tasks with the new mask value. total_ways_until += self.count_ways_until(mask | (1 << p), task_no + 1) # save the value. self.dp[mask][task_no] = total_ways_until return self.dp[mask][task_no] def count_no_of_ways(self, task_performed): # Store the list of persons for each task for i in range(len(task_performed)): for j in task_performed[i]: self.task[j].append(i) # call the function to fill the DP table, final answer is stored in dp[0][1] return self.count_ways_until(0, 1) if __name__ == "__main__": total_tasks = 5 # total no of tasks (the value of N) # the list of tasks that can be done by M persons. task_performed = [[1, 3, 4], [1, 2, 5], [3, 4]] print( AssignmentUsingBitmask(task_performed, total_tasks).count_no_of_ways( task_performed ) ) """ For the particular example the tasks can be distributed as (1,2,3), (1,2,4), (1,5,3), (1,5,4), (3,1,4), (3,2,4), (3,5,4), (4,1,3), (4,2,3), (4,5,3) total 10 """ ================================================ FILE: dynamic_programming/catalan_numbers.py ================================================ """ Print all the Catalan numbers from 0 to n, n being the user input. * The Catalan numbers are a sequence of positive integers that * appear in many counting problems in combinatorics [1]. Such * problems include counting [2]: * - The number of Dyck words of length 2n * - The number well-formed expressions with n pairs of parentheses * (e.g., `()()` is valid but `())(` is not) * - The number of different ways n + 1 factors can be completely * parenthesized (e.g., for n = 2, C(n) = 2 and (ab)c and a(bc) * are the two valid ways to parenthesize. * - The number of full binary trees with n + 1 leaves * A Catalan number satisfies the following recurrence relation * which we will use in this algorithm [1]. * C(0) = C(1) = 1 * C(n) = sum(C(i).C(n-i-1)), from i = 0 to n-1 * In addition, the n-th Catalan number can be calculated using * the closed form formula below [1]: * C(n) = (1 / (n + 1)) * (2n choose n) * Sources: * [1] https://brilliant.org/wiki/catalan-numbers/ * [2] https://en.wikipedia.org/wiki/Catalan_number """ def catalan_numbers(upper_limit: int) -> "list[int]": """ Return a list of the Catalan number sequence from 0 through `upper_limit`. >>> catalan_numbers(5) [1, 1, 2, 5, 14, 42] >>> catalan_numbers(2) [1, 1, 2] >>> catalan_numbers(-1) Traceback (most recent call last): ValueError: Limit for the Catalan sequence must be ≥ 0 """ if upper_limit < 0: raise ValueError("Limit for the Catalan sequence must be ≥ 0") catalan_list = [0] * (upper_limit + 1) # Base case: C(0) = C(1) = 1 catalan_list[0] = 1 if upper_limit > 0: catalan_list[1] = 1 # Recurrence relation: C(i) = sum(C(j).C(i-j-1)), from j = 0 to i for i in range(2, upper_limit + 1): for j in range(i): catalan_list[i] += catalan_list[j] * catalan_list[i - j - 1] return catalan_list if __name__ == "__main__": print("\n********* Catalan Numbers Using Dynamic Programming ************\n") print("\n*** Enter -1 at any time to quit ***") print("\nEnter the upper limit (≥ 0) for the Catalan number sequence: ", end="") try: while True: N = int(input().strip()) if N < 0: print("\n********* Goodbye!! ************") break else: print(f"The Catalan numbers from 0 through {N} are:") print(catalan_numbers(N)) print("Try another upper limit for the sequence: ", end="") except (NameError, ValueError): print("\n********* Invalid input, goodbye! ************\n") import doctest doctest.testmod() ================================================ FILE: dynamic_programming/climbing_stairs.py ================================================ #!/usr/bin/env python3 def climb_stairs(number_of_steps: int) -> int: """ LeetCdoe No.70: Climbing Stairs Distinct ways to climb a number_of_steps staircase where each time you can either climb 1 or 2 steps. Args: number_of_steps: number of steps on the staircase Returns: Distinct ways to climb a number_of_steps staircase Raises: AssertionError: number_of_steps not positive integer >>> climb_stairs(3) 3 >>> climb_stairs(1) 1 >>> climb_stairs(-7) # doctest: +ELLIPSIS Traceback (most recent call last): ... AssertionError: number_of_steps needs to be positive integer, your input -7 """ assert isinstance(number_of_steps, int) and number_of_steps > 0, ( f"number_of_steps needs to be positive integer, your input {number_of_steps}" ) if number_of_steps == 1: return 1 previous, current = 1, 1 for _ in range(number_of_steps - 1): current, previous = current + previous, current return current if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: dynamic_programming/combination_sum_iv.py ================================================ """ Question: You are given an array of distinct integers and you have to tell how many different ways of selecting the elements from the array are there such that the sum of chosen elements is equal to the target number tar. Example Input: * N = 3 * target = 5 * array = [1, 2, 5] Output: 9 Approach: The basic idea is to go over recursively to find the way such that the sum of chosen elements is `target`. For every element, we have two choices 1. Include the element in our set of chosen elements. 2. Don't include the element in our set of chosen elements. """ def combination_sum_iv(array: list[int], target: int) -> int: """ Function checks the all possible combinations, and returns the count of possible combination in exponential Time Complexity. >>> combination_sum_iv([1,2,5], 5) 9 """ def count_of_possible_combinations(target: int) -> int: if target < 0: return 0 if target == 0: return 1 return sum(count_of_possible_combinations(target - item) for item in array) return count_of_possible_combinations(target) def combination_sum_iv_dp_array(array: list[int], target: int) -> int: """ Function checks the all possible combinations, and returns the count of possible combination in O(N^2) Time Complexity as we are using Dynamic programming array here. >>> combination_sum_iv_dp_array([1,2,5], 5) 9 """ def count_of_possible_combinations_with_dp_array( target: int, dp_array: list[int] ) -> int: if target < 0: return 0 if target == 0: return 1 if dp_array[target] != -1: return dp_array[target] answer = sum( count_of_possible_combinations_with_dp_array(target - item, dp_array) for item in array ) dp_array[target] = answer return answer dp_array = [-1] * (target + 1) return count_of_possible_combinations_with_dp_array(target, dp_array) def combination_sum_iv_bottom_up(n: int, array: list[int], target: int) -> int: """ Function checks the all possible combinations with using bottom up approach, and returns the count of possible combination in O(N^2) Time Complexity as we are using Dynamic programming array here. >>> combination_sum_iv_bottom_up(3, [1,2,5], 5) 9 """ dp_array = [0] * (target + 1) dp_array[0] = 1 for i in range(1, target + 1): for j in range(n): if i - array[j] >= 0: dp_array[i] += dp_array[i - array[j]] return dp_array[target] if __name__ == "__main__": import doctest doctest.testmod() target = 5 array = [1, 2, 5] print(combination_sum_iv(array, target)) ================================================ FILE: dynamic_programming/edit_distance.py ================================================ """ Author : Turfa Auliarachman Date : October 12, 2016 This is a pure Python implementation of Dynamic Programming solution to the edit distance problem. The problem is : Given two strings A and B. Find the minimum number of operations to string B such that A = B. The permitted operations are removal, insertion, and substitution. """ class EditDistance: """ Use : solver = EditDistance() editDistanceResult = solver.solve(firstString, secondString) """ def __init__(self): self.word1 = "" self.word2 = "" self.dp = [] def __min_dist_top_down_dp(self, m: int, n: int) -> int: if m == -1: return n + 1 elif n == -1: return m + 1 elif self.dp[m][n] > -1: return self.dp[m][n] else: if self.word1[m] == self.word2[n]: self.dp[m][n] = self.__min_dist_top_down_dp(m - 1, n - 1) else: insert = self.__min_dist_top_down_dp(m, n - 1) delete = self.__min_dist_top_down_dp(m - 1, n) replace = self.__min_dist_top_down_dp(m - 1, n - 1) self.dp[m][n] = 1 + min(insert, delete, replace) return self.dp[m][n] def min_dist_top_down(self, word1: str, word2: str) -> int: """ >>> EditDistance().min_dist_top_down("intention", "execution") 5 >>> EditDistance().min_dist_top_down("intention", "") 9 >>> EditDistance().min_dist_top_down("", "") 0 """ self.word1 = word1 self.word2 = word2 self.dp = [[-1 for _ in range(len(word2))] for _ in range(len(word1))] return self.__min_dist_top_down_dp(len(word1) - 1, len(word2) - 1) def min_dist_bottom_up(self, word1: str, word2: str) -> int: """ >>> EditDistance().min_dist_bottom_up("intention", "execution") 5 >>> EditDistance().min_dist_bottom_up("intention", "") 9 >>> EditDistance().min_dist_bottom_up("", "") 0 """ self.word1 = word1 self.word2 = word2 m = len(word1) n = len(word2) self.dp = [[0 for _ in range(n + 1)] for _ in range(m + 1)] for i in range(m + 1): for j in range(n + 1): if i == 0: # first string is empty self.dp[i][j] = j elif j == 0: # second string is empty self.dp[i][j] = i elif word1[i - 1] == word2[j - 1]: # last characters are equal self.dp[i][j] = self.dp[i - 1][j - 1] else: insert = self.dp[i][j - 1] delete = self.dp[i - 1][j] replace = self.dp[i - 1][j - 1] self.dp[i][j] = 1 + min(insert, delete, replace) return self.dp[m][n] if __name__ == "__main__": solver = EditDistance() print("****************** Testing Edit Distance DP Algorithm ******************") print() S1 = input("Enter the first string: ").strip() S2 = input("Enter the second string: ").strip() print() print(f"The minimum edit distance is: {solver.min_dist_top_down(S1, S2)}") print(f"The minimum edit distance is: {solver.min_dist_bottom_up(S1, S2)}") print() print("*************** End of Testing Edit Distance DP Algorithm ***************") ================================================ FILE: dynamic_programming/factorial.py ================================================ # Factorial of a number using memoization from functools import lru_cache @lru_cache def factorial(num: int) -> int: """ >>> factorial(7) 5040 >>> factorial(-1) Traceback (most recent call last): ... ValueError: Number should not be negative. >>> [factorial(i) for i in range(10)] [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880] """ if num < 0: raise ValueError("Number should not be negative.") return 1 if num in (0, 1) else num * factorial(num - 1) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: dynamic_programming/fast_fibonacci.py ================================================ #!/usr/bin/env python3 """ This program calculates the nth Fibonacci number in O(log(n)). It's possible to calculate F(1_000_000) in less than a second. """ from __future__ import annotations import sys def fibonacci(n: int) -> int: """ return F(n) >>> [fibonacci(i) for i in range(13)] [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144] """ if n < 0: raise ValueError("Negative arguments are not supported") return _fib(n)[0] # returns (F(n), F(n-1)) def _fib(n: int) -> tuple[int, int]: if n == 0: # (F(0), F(1)) return (0, 1) # F(2n) = F(n)[2F(n+1) - F(n)] # F(2n+1) = F(n+1)^2+F(n)^2 a, b = _fib(n // 2) c = a * (b * 2 - a) d = a * a + b * b return (d, c + d) if n % 2 else (c, d) if __name__ == "__main__": n = int(sys.argv[1]) print(f"fibonacci({n}) is {fibonacci(n)}") ================================================ FILE: dynamic_programming/fibonacci.py ================================================ """ This is a pure Python implementation of Dynamic Programming solution to the fibonacci sequence problem. """ class Fibonacci: def __init__(self) -> None: self.sequence = [0, 1] def get(self, index: int) -> list: """ Get the Fibonacci number of `index`. If the number does not exist, calculate all missing numbers leading up to the number of `index`. >>> Fibonacci().get(10) [0, 1, 1, 2, 3, 5, 8, 13, 21, 34] >>> Fibonacci().get(5) [0, 1, 1, 2, 3] """ if (difference := index - (len(self.sequence) - 2)) >= 1: for _ in range(difference): self.sequence.append(self.sequence[-1] + self.sequence[-2]) return self.sequence[:index] def main() -> None: print( "Fibonacci Series Using Dynamic Programming\n", "Enter the index of the Fibonacci number you want to calculate ", "in the prompt below. (To exit enter exit or Ctrl-C)\n", sep="", ) fibonacci = Fibonacci() while True: prompt: str = input(">> ") if prompt in {"exit", "quit"}: break try: index: int = int(prompt) except ValueError: print("Enter a number or 'exit'") continue print(fibonacci.get(index)) if __name__ == "__main__": main() ================================================ FILE: dynamic_programming/fizz_buzz.py ================================================ # https://en.wikipedia.org/wiki/Fizz_buzz#Programming def fizz_buzz(number: int, iterations: int) -> str: """ | Plays FizzBuzz. | Prints Fizz if number is a multiple of ``3``. | Prints Buzz if its a multiple of ``5``. | Prints FizzBuzz if its a multiple of both ``3`` and ``5`` or ``15``. | Else Prints The Number Itself. >>> fizz_buzz(1,7) '1 2 Fizz 4 Buzz Fizz 7 ' >>> fizz_buzz(1,0) Traceback (most recent call last): ... ValueError: Iterations must be done more than 0 times to play FizzBuzz >>> fizz_buzz(-5,5) Traceback (most recent call last): ... ValueError: starting number must be and integer and be more than 0 >>> fizz_buzz(10,-5) Traceback (most recent call last): ... ValueError: Iterations must be done more than 0 times to play FizzBuzz >>> fizz_buzz(1.5,5) Traceback (most recent call last): ... ValueError: starting number must be and integer and be more than 0 >>> fizz_buzz(1,5.5) Traceback (most recent call last): ... ValueError: iterations must be defined as integers """ if not isinstance(iterations, int): raise ValueError("iterations must be defined as integers") if not isinstance(number, int) or not number >= 1: raise ValueError( """starting number must be and integer and be more than 0""" ) if not iterations >= 1: raise ValueError("Iterations must be done more than 0 times to play FizzBuzz") out = "" while number <= iterations: if number % 3 == 0: out += "Fizz" if number % 5 == 0: out += "Buzz" if 0 not in (number % 3, number % 5): out += str(number) # print(out) number += 1 out += " " return out if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: dynamic_programming/floyd_warshall.py ================================================ import math class Graph: def __init__(self, n=0): # a graph with Node 0,1,...,N-1 self.n = n self.w = [ [math.inf for j in range(n)] for i in range(n) ] # adjacency matrix for weight self.dp = [ [math.inf for j in range(n)] for i in range(n) ] # dp[i][j] stores minimum distance from i to j def add_edge(self, u, v, w): """ Adds a directed edge from node u to node v with weight w. >>> g = Graph(3) >>> g.add_edge(0, 1, 5) >>> g.dp[0][1] 5 """ self.dp[u][v] = w def floyd_warshall(self): """ Computes the shortest paths between all pairs of nodes using the Floyd-Warshall algorithm. >>> g = Graph(3) >>> g.add_edge(0, 1, 1) >>> g.add_edge(1, 2, 2) >>> g.floyd_warshall() >>> g.show_min(0, 2) 3 >>> g.show_min(2, 0) inf """ for k in range(self.n): for i in range(self.n): for j in range(self.n): self.dp[i][j] = min(self.dp[i][j], self.dp[i][k] + self.dp[k][j]) def show_min(self, u, v): """ Returns the minimum distance from node u to node v. >>> g = Graph(3) >>> g.add_edge(0, 1, 3) >>> g.add_edge(1, 2, 4) >>> g.floyd_warshall() >>> g.show_min(0, 2) 7 >>> g.show_min(1, 0) inf """ return self.dp[u][v] if __name__ == "__main__": import doctest doctest.testmod() # Example usage graph = Graph(5) graph.add_edge(0, 2, 9) graph.add_edge(0, 4, 10) graph.add_edge(1, 3, 5) graph.add_edge(2, 3, 7) graph.add_edge(3, 0, 10) graph.add_edge(3, 1, 2) graph.add_edge(3, 2, 1) graph.add_edge(3, 4, 6) graph.add_edge(4, 1, 3) graph.add_edge(4, 2, 4) graph.add_edge(4, 3, 9) graph.floyd_warshall() print( graph.show_min(1, 4) ) # Should output the minimum distance from node 1 to node 4 print( graph.show_min(0, 3) ) # Should output the minimum distance from node 0 to node 3 ================================================ FILE: dynamic_programming/integer_partition.py ================================================ """ The number of partitions of a number n into at least k parts equals the number of partitions into exactly k parts plus the number of partitions into at least k-1 parts. Subtracting 1 from each part of a partition of n into k parts gives a partition of n-k into k parts. These two facts together are used for this algorithm. * https://en.wikipedia.org/wiki/Partition_(number_theory) * https://en.wikipedia.org/wiki/Partition_function_(number_theory) """ def partition(m: int) -> int: """ >>> partition(5) 7 >>> partition(7) 15 >>> partition(100) 190569292 >>> partition(1_000) 24061467864032622473692149727991 >>> partition(-7) Traceback (most recent call last): ... IndexError: list index out of range >>> partition(0) Traceback (most recent call last): ... IndexError: list assignment index out of range >>> partition(7.8) Traceback (most recent call last): ... TypeError: 'float' object cannot be interpreted as an integer """ memo: list[list[int]] = [[0 for _ in range(m)] for _ in range(m + 1)] for i in range(m + 1): memo[i][0] = 1 for n in range(m + 1): for k in range(1, m): memo[n][k] += memo[n][k - 1] if n - k > 0: memo[n][k] += memo[n - k - 1][k] return memo[m][m - 1] if __name__ == "__main__": import sys if len(sys.argv) == 1: try: n = int(input("Enter a number: ").strip()) print(partition(n)) except ValueError: print("Please enter a number.") else: try: n = int(sys.argv[1]) print(partition(n)) except ValueError: print("Please pass a number.") ================================================ FILE: dynamic_programming/iterating_through_submasks.py ================================================ """ Author : Syed Faizan (3rd Year Student IIIT Pune) github : faizan2700 You are given a bitmask m and you want to efficiently iterate through all of its submasks. The mask s is submask of m if only bits that were included in bitmask are set """ from __future__ import annotations def list_of_submasks(mask: int) -> list[int]: """ Args: mask : number which shows mask ( always integer > 0, zero does not have any submasks ) Returns: all_submasks : the list of submasks of mask (mask s is called submask of mask m if only bits that were included in original mask are set Raises: AssertionError: mask not positive integer >>> list_of_submasks(15) [15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1] >>> list_of_submasks(13) [13, 12, 9, 8, 5, 4, 1] >>> list_of_submasks(-7) # doctest: +ELLIPSIS Traceback (most recent call last): ... AssertionError: mask needs to be positive integer, your input -7 >>> list_of_submasks(0) # doctest: +ELLIPSIS Traceback (most recent call last): ... AssertionError: mask needs to be positive integer, your input 0 """ assert isinstance(mask, int) and mask > 0, ( f"mask needs to be positive integer, your input {mask}" ) """ first submask iterated will be mask itself then operation will be performed to get other submasks till we reach empty submask that is zero ( zero is not included in final submasks list ) """ all_submasks = [] submask = mask while submask: all_submasks.append(submask) submask = (submask - 1) & mask return all_submasks if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: dynamic_programming/k_means_clustering_tensorflow.py ================================================ from random import shuffle import tensorflow as tf from numpy import array def tf_k_means_cluster(vectors, noofclusters): """ K-Means Clustering using TensorFlow. 'vectors' should be a n*k 2-D NumPy array, where n is the number of vectors of dimensionality k. 'noofclusters' should be an integer. """ noofclusters = int(noofclusters) assert noofclusters < len(vectors) # Find out the dimensionality dim = len(vectors[0]) # Will help select random centroids from among the available vectors vector_indices = list(range(len(vectors))) shuffle(vector_indices) # GRAPH OF COMPUTATION # We initialize a new graph and set it as the default during each run # of this algorithm. This ensures that as this function is called # multiple times, the default graph doesn't keep getting crowded with # unused ops and Variables from previous function calls. graph = tf.Graph() with graph.as_default(): # SESSION OF COMPUTATION sess = tf.Session() ##CONSTRUCTING THE ELEMENTS OF COMPUTATION ##First lets ensure we have a Variable vector for each centroid, ##initialized to one of the vectors from the available data points centroids = [ tf.Variable(vectors[vector_indices[i]]) for i in range(noofclusters) ] ##These nodes will assign the centroid Variables the appropriate ##values centroid_value = tf.placeholder("float64", [dim]) cent_assigns = [] for centroid in centroids: cent_assigns.append(tf.assign(centroid, centroid_value)) ##Variables for cluster assignments of individual vectors(initialized ##to 0 at first) assignments = [tf.Variable(0) for i in range(len(vectors))] ##These nodes will assign an assignment Variable the appropriate ##value assignment_value = tf.placeholder("int32") cluster_assigns = [] for assignment in assignments: cluster_assigns.append(tf.assign(assignment, assignment_value)) ##Now lets construct the node that will compute the mean # The placeholder for the input mean_input = tf.placeholder("float", [None, dim]) # The Node/op takes the input and computes a mean along the 0th # dimension, i.e. the list of input vectors mean_op = tf.reduce_mean(mean_input, 0) ##Node for computing Euclidean distances # Placeholders for input v1 = tf.placeholder("float", [dim]) v2 = tf.placeholder("float", [dim]) euclid_dist = tf.sqrt(tf.reduce_sum(tf.pow(tf.sub(v1, v2), 2))) ##This node will figure out which cluster to assign a vector to, ##based on Euclidean distances of the vector from the centroids. # Placeholder for input centroid_distances = tf.placeholder("float", [noofclusters]) cluster_assignment = tf.argmin(centroid_distances, 0) ##INITIALIZING STATE VARIABLES ##This will help initialization of all Variables defined with respect ##to the graph. The Variable-initializer should be defined after ##all the Variables have been constructed, so that each of them ##will be included in the initialization. init_op = tf.initialize_all_variables() # Initialize all variables sess.run(init_op) ##CLUSTERING ITERATIONS # Now perform the Expectation-Maximization steps of K-Means clustering # iterations. To keep things simple, we will only do a set number of # iterations, instead of using a Stopping Criterion. noofiterations = 100 for _ in range(noofiterations): ##EXPECTATION STEP ##Based on the centroid locations till last iteration, compute ##the _expected_ centroid assignments. # Iterate over each vector for vector_n in range(len(vectors)): vect = vectors[vector_n] # Compute Euclidean distance between this vector and each # centroid. Remember that this list cannot be named #'centroid_distances', since that is the input to the # cluster assignment node. distances = [ sess.run(euclid_dist, feed_dict={v1: vect, v2: sess.run(centroid)}) for centroid in centroids ] # Now use the cluster assignment node, with the distances # as the input assignment = sess.run( cluster_assignment, feed_dict={centroid_distances: distances} ) # Now assign the value to the appropriate state variable sess.run( cluster_assigns[vector_n], feed_dict={assignment_value: assignment} ) ##MAXIMIZATION STEP # Based on the expected state computed from the Expectation Step, # compute the locations of the centroids so as to maximize the # overall objective of minimizing within-cluster Sum-of-Squares for cluster_n in range(noofclusters): # Collect all the vectors assigned to this cluster assigned_vects = [ vectors[i] for i in range(len(vectors)) if sess.run(assignments[i]) == cluster_n ] # Compute new centroid location new_location = sess.run( mean_op, feed_dict={mean_input: array(assigned_vects)} ) # Assign value to appropriate variable sess.run( cent_assigns[cluster_n], feed_dict={centroid_value: new_location} ) # Return centroids and assignments centroids = sess.run(centroids) assignments = sess.run(assignments) return centroids, assignments ================================================ FILE: dynamic_programming/knapsack.py ================================================ """ Given weights and values of n items, put these items in a knapsack of capacity W to get the maximum total value in the knapsack. Note that only the integer weights 0-1 knapsack problem is solvable using dynamic programming. """ def mf_knapsack(i, wt, val, j): """ This code involves the concept of memory functions. Here we solve the subproblems which are needed unlike the below example F is a 2D array with ``-1`` s filled up """ global f # a global dp table for knapsack if f[i][j] < 0: if j < wt[i - 1]: val = mf_knapsack(i - 1, wt, val, j) else: val = max( mf_knapsack(i - 1, wt, val, j), mf_knapsack(i - 1, wt, val, j - wt[i - 1]) + val[i - 1], ) f[i][j] = val return f[i][j] def knapsack(w, wt, val, n): dp = [[0] * (w + 1) for _ in range(n + 1)] for i in range(1, n + 1): for w_ in range(1, w + 1): if wt[i - 1] <= w_: dp[i][w_] = max(val[i - 1] + dp[i - 1][w_ - wt[i - 1]], dp[i - 1][w_]) else: dp[i][w_] = dp[i - 1][w_] return dp[n][w_], dp def knapsack_with_example_solution(w: int, wt: list, val: list): """ Solves the integer weights knapsack problem returns one of the several possible optimal subsets. Parameters ---------- * `w`: int, the total maximum weight for the given knapsack problem. * `wt`: list, the vector of weights for all items where ``wt[i]`` is the weight of the ``i``-th item. * `val`: list, the vector of values for all items where ``val[i]`` is the value of the ``i``-th item Returns ------- * `optimal_val`: float, the optimal value for the given knapsack problem * `example_optional_set`: set, the indices of one of the optimal subsets which gave rise to the optimal value. Examples -------- >>> knapsack_with_example_solution(10, [1, 3, 5, 2], [10, 20, 100, 22]) (142, {2, 3, 4}) >>> knapsack_with_example_solution(6, [4, 3, 2, 3], [3, 2, 4, 4]) (8, {3, 4}) >>> knapsack_with_example_solution(6, [4, 3, 2, 3], [3, 2, 4]) Traceback (most recent call last): ... ValueError: The number of weights must be the same as the number of values. But got 4 weights and 3 values """ if not (isinstance(wt, (list, tuple)) and isinstance(val, (list, tuple))): raise ValueError( "Both the weights and values vectors must be either lists or tuples" ) num_items = len(wt) if num_items != len(val): msg = ( "The number of weights must be the same as the number of values.\n" f"But got {num_items} weights and {len(val)} values" ) raise ValueError(msg) for i in range(num_items): if not isinstance(wt[i], int): msg = ( "All weights must be integers but got weight of " f"type {type(wt[i])} at index {i}" ) raise TypeError(msg) optimal_val, dp_table = knapsack(w, wt, val, num_items) example_optional_set: set = set() _construct_solution(dp_table, wt, num_items, w, example_optional_set) return optimal_val, example_optional_set def _construct_solution(dp: list, wt: list, i: int, j: int, optimal_set: set): """ Recursively reconstructs one of the optimal subsets given a filled DP table and the vector of weights Parameters ---------- * `dp`: list of list, the table of a solved integer weight dynamic programming problem * `wt`: list or tuple, the vector of weights of the items * `i`: int, the index of the item under consideration * `j`: int, the current possible maximum weight * `optimal_set`: set, the optimal subset so far. This gets modified by the function. Returns ------- ``None`` """ # for the current item i at a maximum weight j to be part of an optimal subset, # the optimal value at (i, j) must be greater than the optimal value at (i-1, j). # where i - 1 means considering only the previous items at the given maximum weight if i > 0 and j > 0: if dp[i - 1][j] == dp[i][j]: _construct_solution(dp, wt, i - 1, j, optimal_set) else: optimal_set.add(i) _construct_solution(dp, wt, i - 1, j - wt[i - 1], optimal_set) if __name__ == "__main__": """ Adding test case for knapsack """ val = [3, 2, 4, 4] wt = [4, 3, 2, 3] n = 4 w = 6 f = [[0] * (w + 1)] + [[0] + [-1] * (w + 1) for _ in range(n + 1)] optimal_solution, _ = knapsack(w, wt, val, n) print(optimal_solution) print(mf_knapsack(n, wt, val, w)) # switched the n and w # testing the dynamic programming problem with example # the optimal subset for the above example are items 3 and 4 optimal_solution, optimal_subset = knapsack_with_example_solution(w, wt, val) assert optimal_solution == 8 assert optimal_subset == {3, 4} print("optimal_value = ", optimal_solution) print("An optimal subset corresponding to the optimal value", optimal_subset) ================================================ FILE: dynamic_programming/largest_divisible_subset.py ================================================ from __future__ import annotations def largest_divisible_subset(items: list[int]) -> list[int]: """ Algorithm to find the biggest subset in the given array such that for any 2 elements x and y in the subset, either x divides y or y divides x. >>> largest_divisible_subset([1, 16, 7, 8, 4]) [16, 8, 4, 1] >>> largest_divisible_subset([1, 2, 3]) [2, 1] >>> largest_divisible_subset([-1, -2, -3]) [-3] >>> largest_divisible_subset([1, 2, 4, 8]) [8, 4, 2, 1] >>> largest_divisible_subset((1, 2, 4, 8)) [8, 4, 2, 1] >>> largest_divisible_subset([1, 1, 1]) [1, 1, 1] >>> largest_divisible_subset([0, 0, 0]) [0, 0, 0] >>> largest_divisible_subset([-1, -1, -1]) [-1, -1, -1] >>> largest_divisible_subset([]) [] """ # Sort the array in ascending order as the sequence does not matter we only have to # pick up a subset. items = sorted(items) number_of_items = len(items) # Initialize memo with 1s and hash with increasing numbers memo = [1] * number_of_items hash_array = list(range(number_of_items)) # Iterate through the array for i, item in enumerate(items): for prev_index in range(i): if ((items[prev_index] != 0 and item % items[prev_index]) == 0) and ( (1 + memo[prev_index]) > memo[i] ): memo[i] = 1 + memo[prev_index] hash_array[i] = prev_index ans = -1 last_index = -1 # Find the maximum length and its corresponding index for i, memo_item in enumerate(memo): if memo_item > ans: ans = memo_item last_index = i # Reconstruct the divisible subset if last_index == -1: return [] result = [items[last_index]] while hash_array[last_index] != last_index: last_index = hash_array[last_index] result.append(items[last_index]) return result if __name__ == "__main__": from doctest import testmod testmod() items = [1, 16, 7, 8, 4] print( f"The longest divisible subset of {items} is {largest_divisible_subset(items)}." ) ================================================ FILE: dynamic_programming/longest_common_subsequence.py ================================================ """ LCS Problem Statement: Given two sequences, find the length of longest subsequence present in both of them. A subsequence is a sequence that appears in the same relative order, but not necessarily continuous. Example:"abc", "abg" are subsequences of "abcdefgh". """ def longest_common_subsequence(x: str, y: str): """ Finds the longest common subsequence between two strings. Also returns the The subsequence found Parameters ---------- x: str, one of the strings y: str, the other string Returns ------- L[m][n]: int, the length of the longest subsequence. Also equal to len(seq) Seq: str, the subsequence found >>> longest_common_subsequence("programming", "gaming") (6, 'gaming') >>> longest_common_subsequence("physics", "smartphone") (2, 'ph') >>> longest_common_subsequence("computer", "food") (1, 'o') >>> longest_common_subsequence("", "abc") # One string is empty (0, '') >>> longest_common_subsequence("abc", "") # Other string is empty (0, '') >>> longest_common_subsequence("", "") # Both strings are empty (0, '') >>> longest_common_subsequence("abc", "def") # No common subsequence (0, '') >>> longest_common_subsequence("abc", "abc") # Identical strings (3, 'abc') >>> longest_common_subsequence("a", "a") # Single character match (1, 'a') >>> longest_common_subsequence("a", "b") # Single character no match (0, '') >>> longest_common_subsequence("abcdef", "ace") # Interleaved subsequence (3, 'ace') >>> longest_common_subsequence("ABCD", "ACBD") # No repeated characters (3, 'ABD') """ # find the length of strings assert x is not None assert y is not None m = len(x) n = len(y) # declaring the array for storing the dp values dp = [[0] * (n + 1) for _ in range(m + 1)] for i in range(1, m + 1): for j in range(1, n + 1): match = 1 if x[i - 1] == y[j - 1] else 0 dp[i][j] = max(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1] + match) seq = "" i, j = m, n while i > 0 and j > 0: match = 1 if x[i - 1] == y[j - 1] else 0 if dp[i][j] == dp[i - 1][j - 1] + match: if match == 1: seq = x[i - 1] + seq i -= 1 j -= 1 elif dp[i][j] == dp[i - 1][j]: i -= 1 else: j -= 1 return dp[m][n], seq if __name__ == "__main__": a = "AGGTAB" b = "GXTXAYB" expected_ln = 4 expected_subseq = "GTAB" ln, subseq = longest_common_subsequence(a, b) print("len =", ln, ", sub-sequence =", subseq) import doctest doctest.testmod() ================================================ FILE: dynamic_programming/longest_common_substring.py ================================================ """ Longest Common Substring Problem Statement: Given two sequences, find the longest common substring present in both of them. A substring is necessarily continuous. Example: ``abcdef`` and ``xabded`` have two longest common substrings, ``ab`` or ``de``. Therefore, algorithm should return any one of them. """ def longest_common_substring(text1: str, text2: str) -> str: """ Finds the longest common substring between two strings. >>> longest_common_substring("", "") '' >>> longest_common_substring("a","") '' >>> longest_common_substring("", "a") '' >>> longest_common_substring("a", "a") 'a' >>> longest_common_substring("abcdef", "bcd") 'bcd' >>> longest_common_substring("abcdef", "xabded") 'ab' >>> longest_common_substring("GeeksforGeeks", "GeeksQuiz") 'Geeks' >>> longest_common_substring("abcdxyz", "xyzabcd") 'abcd' >>> longest_common_substring("zxabcdezy", "yzabcdezx") 'abcdez' >>> longest_common_substring("OldSite:GeeksforGeeks.org", "NewSite:GeeksQuiz.com") 'Site:Geeks' >>> longest_common_substring(1, 1) Traceback (most recent call last): ... ValueError: longest_common_substring() takes two strings for inputs """ if not (isinstance(text1, str) and isinstance(text2, str)): raise ValueError("longest_common_substring() takes two strings for inputs") if not text1 or not text2: return "" text1_length = len(text1) text2_length = len(text2) dp = [[0] * (text2_length + 1) for _ in range(text1_length + 1)] end_pos = 0 max_length = 0 for i in range(1, text1_length + 1): for j in range(1, text2_length + 1): if text1[i - 1] == text2[j - 1]: dp[i][j] = 1 + dp[i - 1][j - 1] if dp[i][j] > max_length: end_pos = i max_length = dp[i][j] return text1[end_pos - max_length : end_pos] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: dynamic_programming/longest_increasing_subsequence.py ================================================ """ Author : Mehdi ALAOUI This is a pure Python implementation of Dynamic Programming solution to the longest increasing subsequence of a given sequence. The problem is: Given an array, to find the longest and increasing sub-array in that given array and return it. Example: ``[10, 22, 9, 33, 21, 50, 41, 60, 80]`` as input will return ``[10, 22, 33, 41, 60, 80]`` as output """ from __future__ import annotations def longest_subsequence(array: list[int]) -> list[int]: # This function is recursive """ Some examples >>> longest_subsequence([10, 22, 9, 33, 21, 50, 41, 60, 80]) [10, 22, 33, 41, 60, 80] >>> longest_subsequence([4, 8, 7, 5, 1, 12, 2, 3, 9]) [1, 2, 3, 9] >>> longest_subsequence([28, 26, 12, 23, 35, 39]) [12, 23, 35, 39] >>> longest_subsequence([9, 8, 7, 6, 5, 7]) [5, 7] >>> longest_subsequence([1, 1, 1]) [1, 1, 1] >>> longest_subsequence([]) [] """ array_length = len(array) # If the array contains only one element, we return it (it's the stop condition of # recursion) if array_length <= 1: return array # Else pivot = array[0] is_found = False i = 1 longest_subseq: list[int] = [] while not is_found and i < array_length: if array[i] < pivot: is_found = True temp_array = array[i:] temp_array = longest_subsequence(temp_array) if len(temp_array) > len(longest_subseq): longest_subseq = temp_array else: i += 1 temp_array = [element for element in array[1:] if element >= pivot] temp_array = [pivot, *longest_subsequence(temp_array)] if len(temp_array) > len(longest_subseq): return temp_array else: return longest_subseq if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: dynamic_programming/longest_increasing_subsequence_iterative.py ================================================ """ Author : Sanjay Muthu This is a pure Python implementation of Dynamic Programming solution to the longest increasing subsequence of a given sequence. The problem is: Given an array, to find the longest and increasing sub-array in that given array and return it. Example: ``[10, 22, 9, 33, 21, 50, 41, 60, 80]`` as input will return ``[10, 22, 33, 50, 60, 80]`` as output """ from __future__ import annotations import copy def longest_subsequence(array: list[int]) -> list[int]: """ Some examples >>> longest_subsequence([10, 22, 9, 33, 21, 50, 41, 60, 80]) [10, 22, 33, 50, 60, 80] >>> longest_subsequence([4, 8, 7, 5, 1, 12, 2, 3, 9]) [1, 2, 3, 9] >>> longest_subsequence([9, 8, 7, 6, 5, 7]) [7, 7] >>> longest_subsequence([28, 26, 12, 23, 35, 39]) [12, 23, 35, 39] >>> longest_subsequence([1, 1, 1]) [1, 1, 1] >>> longest_subsequence([]) [] """ n = len(array) # The longest increasing subsequence ending at array[i] longest_increasing_subsequence = [] for i in range(n): longest_increasing_subsequence.append([array[i]]) for i in range(1, n): for prev in range(i): # If array[prev] is less than or equal to array[i], then # longest_increasing_subsequence[prev] + array[i] # is a valid increasing subsequence # longest_increasing_subsequence[i] is only set to # longest_increasing_subsequence[prev] + array[i] if the length is longer. if array[prev] <= array[i] and len( longest_increasing_subsequence[prev] ) + 1 > len(longest_increasing_subsequence[i]): longest_increasing_subsequence[i] = copy.copy( longest_increasing_subsequence[prev] ) longest_increasing_subsequence[i].append(array[i]) result: list[int] = [] for i in range(n): if len(longest_increasing_subsequence[i]) > len(result): result = longest_increasing_subsequence[i] return result if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: dynamic_programming/longest_increasing_subsequence_o_nlogn.py ================================================ ############################# # Author: Aravind Kashyap # File: lis.py # comments: This programme outputs the Longest Strictly Increasing Subsequence in # O(NLogN) Where N is the Number of elements in the list ############################# from __future__ import annotations def ceil_index(v, left, right, key): while right - left > 1: middle = (left + right) // 2 if v[middle] >= key: right = middle else: left = middle return right def longest_increasing_subsequence_length(v: list[int]) -> int: """ >>> longest_increasing_subsequence_length([2, 5, 3, 7, 11, 8, 10, 13, 6]) 6 >>> longest_increasing_subsequence_length([]) 0 >>> longest_increasing_subsequence_length([0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, ... 3, 11, 7, 15]) 6 >>> longest_increasing_subsequence_length([5, 4, 3, 2, 1]) 1 """ if len(v) == 0: return 0 tail = [0] * len(v) length = 1 tail[0] = v[0] for i in range(1, len(v)): if v[i] < tail[0]: tail[0] = v[i] elif v[i] > tail[length - 1]: tail[length] = v[i] length += 1 else: tail[ceil_index(tail, -1, length - 1, v[i])] = v[i] return length if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: dynamic_programming/longest_palindromic_subsequence.py ================================================ """ author: Sanket Kittad Given a string s, find the longest palindromic subsequence's length in s. Input: s = "bbbab" Output: 4 Explanation: One possible longest palindromic subsequence is "bbbb". Leetcode link: https://leetcode.com/problems/longest-palindromic-subsequence/description/ """ def longest_palindromic_subsequence(input_string: str) -> int: """ This function returns the longest palindromic subsequence in a string >>> longest_palindromic_subsequence("bbbab") 4 >>> longest_palindromic_subsequence("bbabcbcab") 7 """ n = len(input_string) rev = input_string[::-1] m = len(rev) dp = [[-1] * (m + 1) for i in range(n + 1)] for i in range(n + 1): dp[i][0] = 0 for i in range(m + 1): dp[0][i] = 0 # create and initialise dp array for i in range(1, n + 1): for j in range(1, m + 1): # If characters at i and j are the same # include them in the palindromic subsequence if input_string[i - 1] == rev[j - 1]: dp[i][j] = 1 + dp[i - 1][j - 1] else: dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) return dp[n][m] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: dynamic_programming/matrix_chain_multiplication.py ================================================ """ | Find the minimum number of multiplications needed to multiply chain of matrices. | Reference: https://www.geeksforgeeks.org/matrix-chain-multiplication-dp-8/ The algorithm has interesting real-world applications. Example: 1. Image transformations in Computer Graphics as images are composed of matrix. 2. Solve complex polynomial equations in the field of algebra using least processing power. 3. Calculate overall impact of macroeconomic decisions as economic equations involve a number of variables. 4. Self-driving car navigation can be made more accurate as matrix multiplication can accurately determine position and orientation of obstacles in short time. Python doctests can be run with the following command:: python -m doctest -v matrix_chain_multiply.py Given a sequence ``arr[]`` that represents chain of 2D matrices such that the dimension of the ``i`` th matrix is ``arr[i-1]*arr[i]``. So suppose ``arr = [40, 20, 30, 10, 30]`` means we have ``4`` matrices of dimensions ``40*20``, ``20*30``, ``30*10`` and ``10*30``. ``matrix_chain_multiply()`` returns an integer denoting minimum number of multiplications to multiply the chain. We do not need to perform actual multiplication here. We only need to decide the order in which to perform the multiplication. Hints: 1. Number of multiplications (ie cost) to multiply ``2`` matrices of size ``m*p`` and ``p*n`` is ``m*p*n``. 2. Cost of matrix multiplication is not associative ie ``(M1*M2)*M3 != M1*(M2*M3)`` 3. Matrix multiplication is not commutative. So, ``M1*M2`` does not mean ``M2*M1`` can be done. 4. To determine the required order, we can try different combinations. So, this problem has overlapping sub-problems and can be solved using recursion. We use Dynamic Programming for optimal time complexity. Example input: ``arr = [40, 20, 30, 10, 30]`` output: ``26000`` """ from collections.abc import Iterator from contextlib import contextmanager from functools import cache from sys import maxsize def matrix_chain_multiply(arr: list[int]) -> int: """ Find the minimum number of multiplcations required to multiply the chain of matrices Args: `arr`: The input array of integers. Returns: Minimum number of multiplications needed to multiply the chain Examples: >>> matrix_chain_multiply([1, 2, 3, 4, 3]) 30 >>> matrix_chain_multiply([10]) 0 >>> matrix_chain_multiply([10, 20]) 0 >>> matrix_chain_multiply([19, 2, 19]) 722 >>> matrix_chain_multiply(list(range(1, 100))) 323398 >>> # matrix_chain_multiply(list(range(1, 251))) # 2626798 """ if len(arr) < 2: return 0 # initialising 2D dp matrix n = len(arr) dp = [[maxsize for j in range(n)] for i in range(n)] # we want minimum cost of multiplication of matrices # of dimension (i*k) and (k*j). This cost is arr[i-1]*arr[k]*arr[j]. for i in range(n - 1, 0, -1): for j in range(i, n): if i == j: dp[i][j] = 0 continue for k in range(i, j): dp[i][j] = min( dp[i][j], dp[i][k] + dp[k + 1][j] + arr[i - 1] * arr[k] * arr[j] ) return dp[1][n - 1] def matrix_chain_order(dims: list[int]) -> int: """ Source: https://en.wikipedia.org/wiki/Matrix_chain_multiplication The dynamic programming solution is faster than cached the recursive solution and can handle larger inputs. >>> matrix_chain_order([1, 2, 3, 4, 3]) 30 >>> matrix_chain_order([10]) 0 >>> matrix_chain_order([10, 20]) 0 >>> matrix_chain_order([19, 2, 19]) 722 >>> matrix_chain_order(list(range(1, 100))) 323398 >>> # matrix_chain_order(list(range(1, 251))) # Max before RecursionError is raised # 2626798 """ @cache def a(i: int, j: int) -> int: return min( (a(i, k) + dims[i] * dims[k] * dims[j] + a(k, j) for k in range(i + 1, j)), default=0, ) return a(0, len(dims) - 1) @contextmanager def elapsed_time(msg: str) -> Iterator: # print(f"Starting: {msg}") from time import perf_counter_ns start = perf_counter_ns() yield print(f"Finished: {msg} in {(perf_counter_ns() - start) / 10**9} seconds.") if __name__ == "__main__": import doctest doctest.testmod() with elapsed_time("matrix_chain_order"): print(f"{matrix_chain_order(list(range(1, 251))) = }") with elapsed_time("matrix_chain_multiply"): print(f"{matrix_chain_multiply(list(range(1, 251))) = }") with elapsed_time("matrix_chain_order"): print(f"{matrix_chain_order(list(range(1, 251))) = }") with elapsed_time("matrix_chain_multiply"): print(f"{matrix_chain_multiply(list(range(1, 251))) = }") ================================================ FILE: dynamic_programming/matrix_chain_order.py ================================================ import sys """ Dynamic Programming Implementation of Matrix Chain Multiplication Time Complexity: O(n^3) Space Complexity: O(n^2) Reference: https://en.wikipedia.org/wiki/Matrix_chain_multiplication """ def matrix_chain_order(array: list[int]) -> tuple[list[list[int]], list[list[int]]]: """ >>> matrix_chain_order([10, 30, 5]) ([[0, 0, 0], [0, 0, 1500], [0, 0, 0]], [[0, 0, 0], [0, 0, 1], [0, 0, 0]]) """ n = len(array) matrix = [[0 for _ in range(n)] for _ in range(n)] sol = [[0 for _ in range(n)] for _ in range(n)] for chain_length in range(2, n): for a in range(1, n - chain_length + 1): b = a + chain_length - 1 matrix[a][b] = sys.maxsize for c in range(a, b): cost = ( matrix[a][c] + matrix[c + 1][b] + array[a - 1] * array[c] * array[b] ) if cost < matrix[a][b]: matrix[a][b] = cost sol[a][b] = c return matrix, sol def print_optimal_solution(optimal_solution: list[list[int]], i: int, j: int): """ Print order of matrix with Ai as Matrix. """ if i == j: print("A" + str(i), end=" ") else: print("(", end=" ") print_optimal_solution(optimal_solution, i, optimal_solution[i][j]) print_optimal_solution(optimal_solution, optimal_solution[i][j] + 1, j) print(")", end=" ") def main(): """ Size of matrix created from array [30, 35, 15, 5, 10, 20, 25] will be: 30*35 35*15 15*5 5*10 10*20 20*25 """ array = [30, 35, 15, 5, 10, 20, 25] n = len(array) matrix, optimal_solution = matrix_chain_order(array) print("No. of Operation required: " + str(matrix[1][n - 1])) print_optimal_solution(optimal_solution, 1, n - 1) if __name__ == "__main__": main() ================================================ FILE: dynamic_programming/max_non_adjacent_sum.py ================================================ # Video Explanation: https://www.youtube.com/watch?v=6w60Zi1NtL8&feature=emb_logo from __future__ import annotations def maximum_non_adjacent_sum(nums: list[int]) -> int: """ Find the maximum non-adjacent sum of the integers in the nums input list >>> maximum_non_adjacent_sum([1, 2, 3]) 4 >>> maximum_non_adjacent_sum([1, 5, 3, 7, 2, 2, 6]) 18 >>> maximum_non_adjacent_sum([-1, -5, -3, -7, -2, -2, -6]) 0 >>> maximum_non_adjacent_sum([499, 500, -3, -7, -2, -2, -6]) 500 """ if not nums: return 0 max_including = nums[0] max_excluding = 0 for num in nums[1:]: max_including, max_excluding = ( max_excluding + num, max(max_including, max_excluding), ) return max(max_excluding, max_including) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: dynamic_programming/max_product_subarray.py ================================================ def max_product_subarray(numbers: list[int]) -> int: """ Returns the maximum product that can be obtained by multiplying a contiguous subarray of the given integer list `numbers`. Example: >>> max_product_subarray([2, 3, -2, 4]) 6 >>> max_product_subarray((-2, 0, -1)) 0 >>> max_product_subarray([2, 3, -2, 4, -1]) 48 >>> max_product_subarray([-1]) -1 >>> max_product_subarray([0]) 0 >>> max_product_subarray([]) 0 >>> max_product_subarray("") 0 >>> max_product_subarray(None) 0 >>> max_product_subarray([2, 3, -2, 4.5, -1]) Traceback (most recent call last): ... ValueError: numbers must be an iterable of integers >>> max_product_subarray("ABC") Traceback (most recent call last): ... ValueError: numbers must be an iterable of integers """ if not numbers: return 0 if not isinstance(numbers, (list, tuple)) or not all( isinstance(number, int) for number in numbers ): raise ValueError("numbers must be an iterable of integers") max_till_now = min_till_now = max_prod = numbers[0] for i in range(1, len(numbers)): # update the maximum and minimum subarray products number = numbers[i] if number < 0: max_till_now, min_till_now = min_till_now, max_till_now max_till_now = max(number, max_till_now * number) min_till_now = min(number, min_till_now * number) # update the maximum product found till now max_prod = max(max_prod, max_till_now) return max_prod ================================================ FILE: dynamic_programming/max_subarray_sum.py ================================================ """ The maximum subarray sum problem is the task of finding the maximum sum that can be obtained from a contiguous subarray within a given array of numbers. For example, given the array [-2, 1, -3, 4, -1, 2, 1, -5, 4], the contiguous subarray with the maximum sum is [4, -1, 2, 1], so the maximum subarray sum is 6. Kadane's algorithm is a simple dynamic programming algorithm that solves the maximum subarray sum problem in O(n) time and O(1) space. Reference: https://en.wikipedia.org/wiki/Maximum_subarray_problem """ from collections.abc import Sequence def max_subarray_sum( arr: Sequence[float], allow_empty_subarrays: bool = False ) -> float: """ Solves the maximum subarray sum problem using Kadane's algorithm. :param arr: the given array of numbers :param allow_empty_subarrays: if True, then the algorithm considers empty subarrays >>> max_subarray_sum([2, 8, 9]) 19 >>> max_subarray_sum([0, 0]) 0 >>> max_subarray_sum([-1.0, 0.0, 1.0]) 1.0 >>> max_subarray_sum([1, 2, 3, 4, -2]) 10 >>> max_subarray_sum([-2, 1, -3, 4, -1, 2, 1, -5, 4]) 6 >>> max_subarray_sum([2, 3, -9, 8, -2]) 8 >>> max_subarray_sum([-2, -3, -1, -4, -6]) -1 >>> max_subarray_sum([-2, -3, -1, -4, -6], allow_empty_subarrays=True) 0 >>> max_subarray_sum([]) 0 """ if not arr: return 0 max_sum = 0 if allow_empty_subarrays else float("-inf") curr_sum = 0.0 for num in arr: curr_sum = max(0 if allow_empty_subarrays else num, curr_sum + num) max_sum = max(max_sum, curr_sum) return max_sum if __name__ == "__main__": from doctest import testmod testmod() nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4] print(f"{max_subarray_sum(nums) = }") ================================================ FILE: dynamic_programming/min_distance_up_bottom.py ================================================ """ Author : Alexander Pantyukhin Date : October 14, 2022 This is an implementation of the up-bottom approach to find edit distance. The implementation was tested on Leetcode: https://leetcode.com/problems/edit-distance/ Levinstein distance Dynamic Programming: up -> down. """ import functools def min_distance_up_bottom(word1: str, word2: str) -> int: """ >>> min_distance_up_bottom("intention", "execution") 5 >>> min_distance_up_bottom("intention", "") 9 >>> min_distance_up_bottom("", "") 0 >>> min_distance_up_bottom("zooicoarchaeologist", "zoologist") 10 """ len_word1 = len(word1) len_word2 = len(word2) @functools.cache def min_distance(index1: int, index2: int) -> int: # if first word index overflows - delete all from the second word if index1 >= len_word1: return len_word2 - index2 # if second word index overflows - delete all from the first word if index2 >= len_word2: return len_word1 - index1 diff = int(word1[index1] != word2[index2]) # current letters not identical return min( 1 + min_distance(index1 + 1, index2), 1 + min_distance(index1, index2 + 1), diff + min_distance(index1 + 1, index2 + 1), ) return min_distance(0, 0) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: dynamic_programming/minimum_coin_change.py ================================================ """ You have m types of coins available in infinite quantities where the value of each coins is given in the array S=[S0,... Sm-1] Can you determine number of ways of making change for n units using the given types of coins? https://www.hackerrank.com/challenges/coin-change/problem """ def dp_count(s, n): """ >>> dp_count([1, 2, 3], 4) 4 >>> dp_count([1, 2, 3], 7) 8 >>> dp_count([2, 5, 3, 6], 10) 5 >>> dp_count([10], 99) 0 >>> dp_count([4, 5, 6], 0) 1 >>> dp_count([1, 2, 3], -5) 0 """ if n < 0: return 0 # table[i] represents the number of ways to get to amount i table = [0] * (n + 1) # There is exactly 1 way to get to zero(You pick no coins). table[0] = 1 # Pick all coins one by one and update table[] values # after the index greater than or equal to the value of the # picked coin for coin_val in s: for j in range(coin_val, n + 1): table[j] += table[j - coin_val] return table[n] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: dynamic_programming/minimum_cost_path.py ================================================ # Youtube Explanation: https://www.youtube.com/watch?v=lBRtnuxg-gU from __future__ import annotations def minimum_cost_path(matrix: list[list[int]]) -> int: """ Find the minimum cost traced by all possible paths from top left to bottom right in a given matrix >>> minimum_cost_path([[2, 1], [3, 1], [4, 2]]) 6 >>> minimum_cost_path([[2, 1, 4], [2, 1, 3], [3, 2, 1]]) 7 """ # preprocessing the first row for i in range(1, len(matrix[0])): matrix[0][i] += matrix[0][i - 1] # preprocessing the first column for i in range(1, len(matrix)): matrix[i][0] += matrix[i - 1][0] # updating the path cost for current position for i in range(1, len(matrix)): for j in range(1, len(matrix[0])): matrix[i][j] += min(matrix[i - 1][j], matrix[i][j - 1]) return matrix[-1][-1] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: dynamic_programming/minimum_partition.py ================================================ """ Partition a set into two subsets such that the difference of subset sums is minimum """ def find_min(numbers: list[int]) -> int: """ >>> find_min([1, 2, 3, 4, 5]) 1 >>> find_min([5, 5, 5, 5, 5]) 5 >>> find_min([5, 5, 5, 5]) 0 >>> find_min([3]) 3 >>> find_min([]) 0 >>> find_min([1, 2, 3, 4]) 0 >>> find_min([0, 0, 0, 0]) 0 >>> find_min([-1, -5, 5, 1]) 0 >>> find_min([-1, -5, 5, 1]) 0 >>> find_min([9, 9, 9, 9, 9]) 9 >>> find_min([1, 5, 10, 3]) 1 >>> find_min([-1, 0, 1]) 0 >>> find_min(range(10, 0, -1)) 1 >>> find_min([-1]) Traceback (most recent call last): -- IndexError: list assignment index out of range >>> find_min([0, 0, 0, 1, 2, -4]) Traceback (most recent call last): ... IndexError: list assignment index out of range >>> find_min([-1, -5, -10, -3]) Traceback (most recent call last): ... IndexError: list assignment index out of range """ n = len(numbers) s = sum(numbers) dp = [[False for x in range(s + 1)] for y in range(n + 1)] for i in range(n + 1): dp[i][0] = True for i in range(1, s + 1): dp[0][i] = False for i in range(1, n + 1): for j in range(1, s + 1): dp[i][j] = dp[i - 1][j] if numbers[i - 1] <= j: dp[i][j] = dp[i][j] or dp[i - 1][j - numbers[i - 1]] for j in range(int(s / 2), -1, -1): if dp[n][j] is True: diff = s - 2 * j break return diff if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: dynamic_programming/minimum_size_subarray_sum.py ================================================ import sys def minimum_subarray_sum(target: int, numbers: list[int]) -> int: """ Return the length of the shortest contiguous subarray in a list of numbers whose sum is at least target. Reference: https://stackoverflow.com/questions/8269916 >>> minimum_subarray_sum(7, [2, 3, 1, 2, 4, 3]) 2 >>> minimum_subarray_sum(7, [2, 3, -1, 2, 4, -3]) 4 >>> minimum_subarray_sum(11, [1, 1, 1, 1, 1, 1, 1, 1]) 0 >>> minimum_subarray_sum(10, [1, 2, 3, 4, 5, 6, 7]) 2 >>> minimum_subarray_sum(5, [1, 1, 1, 1, 1, 5]) 1 >>> minimum_subarray_sum(0, []) 0 >>> minimum_subarray_sum(0, [1, 2, 3]) 1 >>> minimum_subarray_sum(10, [10, 20, 30]) 1 >>> minimum_subarray_sum(7, [1, 1, 1, 1, 1, 1, 10]) 1 >>> minimum_subarray_sum(6, []) 0 >>> minimum_subarray_sum(2, [1, 2, 3]) 1 >>> minimum_subarray_sum(-6, []) 0 >>> minimum_subarray_sum(-6, [3, 4, 5]) 1 >>> minimum_subarray_sum(8, None) 0 >>> minimum_subarray_sum(2, "ABC") Traceback (most recent call last): ... ValueError: numbers must be an iterable of integers """ if not numbers: return 0 if target == 0 and target in numbers: return 0 if not isinstance(numbers, (list, tuple)) or not all( isinstance(number, int) for number in numbers ): raise ValueError("numbers must be an iterable of integers") left = right = curr_sum = 0 min_len = sys.maxsize while right < len(numbers): curr_sum += numbers[right] while curr_sum >= target and left <= right: min_len = min(min_len, right - left + 1) curr_sum -= numbers[left] left += 1 right += 1 return 0 if min_len == sys.maxsize else min_len ================================================ FILE: dynamic_programming/minimum_squares_to_represent_a_number.py ================================================ import math import sys def minimum_squares_to_represent_a_number(number: int) -> int: """ Count the number of minimum squares to represent a number >>> minimum_squares_to_represent_a_number(25) 1 >>> minimum_squares_to_represent_a_number(37) 2 >>> minimum_squares_to_represent_a_number(21) 3 >>> minimum_squares_to_represent_a_number(58) 2 >>> minimum_squares_to_represent_a_number(-1) Traceback (most recent call last): ... ValueError: the value of input must not be a negative number >>> minimum_squares_to_represent_a_number(0) 1 >>> minimum_squares_to_represent_a_number(12.34) Traceback (most recent call last): ... ValueError: the value of input must be a natural number """ if number != int(number): raise ValueError("the value of input must be a natural number") if number < 0: raise ValueError("the value of input must not be a negative number") if number == 0: return 1 answers = [-1] * (number + 1) answers[0] = 0 for i in range(1, number + 1): answer = sys.maxsize root = int(math.sqrt(i)) for j in range(1, root + 1): current_answer = 1 + answers[i - (j**2)] answer = min(answer, current_answer) answers[i] = answer return answers[number] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: dynamic_programming/minimum_steps_to_one.py ================================================ """ YouTube Explanation: https://www.youtube.com/watch?v=f2xi3c1S95M Given an integer n, return the minimum steps from n to 1 AVAILABLE STEPS: * Decrement by 1 * if n is divisible by 2, divide by 2 * if n is divisible by 3, divide by 3 Example 1: n = 10 10 -> 9 -> 3 -> 1 Result: 3 steps Example 2: n = 15 15 -> 5 -> 4 -> 2 -> 1 Result: 4 steps Example 3: n = 6 6 -> 2 -> 1 Result: 2 step """ from __future__ import annotations __author__ = "Alexander Joslin" def min_steps_to_one(number: int) -> int: """ Minimum steps to 1 implemented using tabulation. >>> min_steps_to_one(10) 3 >>> min_steps_to_one(15) 4 >>> min_steps_to_one(6) 2 :param number: :return int: """ if number <= 0: msg = f"n must be greater than 0. Got n = {number}" raise ValueError(msg) table = [number + 1] * (number + 1) # starting position table[1] = 0 for i in range(1, number): table[i + 1] = min(table[i + 1], table[i] + 1) # check if out of bounds if i * 2 <= number: table[i * 2] = min(table[i * 2], table[i] + 1) # check if out of bounds if i * 3 <= number: table[i * 3] = min(table[i * 3], table[i] + 1) return table[number] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: dynamic_programming/minimum_tickets_cost.py ================================================ """ Author : Alexander Pantyukhin Date : November 1, 2022 Task: Given a list of days when you need to travel. Each day is integer from 1 to 365. You are able to use tickets for 1 day, 7 days and 30 days. Each ticket has a cost. Find the minimum cost you need to travel every day in the given list of days. Implementation notes: implementation Dynamic Programming up bottom approach. Runtime complexity: O(n) The implementation was tested on the leetcode: https://leetcode.com/problems/minimum-cost-for-tickets/ Minimum Cost For Tickets Dynamic Programming: up -> down. """ import functools def mincost_tickets(days: list[int], costs: list[int]) -> int: """ >>> mincost_tickets([1, 4, 6, 7, 8, 20], [2, 7, 15]) 11 >>> mincost_tickets([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 30, 31], [2, 7, 15]) 17 >>> mincost_tickets([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 30, 31], [2, 90, 150]) 24 >>> mincost_tickets([2], [2, 90, 150]) 2 >>> mincost_tickets([], [2, 90, 150]) 0 >>> mincost_tickets('hello', [2, 90, 150]) Traceback (most recent call last): ... ValueError: The parameter days should be a list of integers >>> mincost_tickets([], 'world') Traceback (most recent call last): ... ValueError: The parameter costs should be a list of three integers >>> mincost_tickets([0.25, 2, 3, 4, 5, 6, 7, 8, 9, 10, 30, 31], [2, 90, 150]) Traceback (most recent call last): ... ValueError: The parameter days should be a list of integers >>> mincost_tickets([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 30, 31], [2, 0.9, 150]) Traceback (most recent call last): ... ValueError: The parameter costs should be a list of three integers >>> mincost_tickets([-1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 30, 31], [2, 90, 150]) Traceback (most recent call last): ... ValueError: All days elements should be greater than 0 >>> mincost_tickets([2, 367], [2, 90, 150]) Traceback (most recent call last): ... ValueError: All days elements should be less than 366 >>> mincost_tickets([2, 3, 4, 5, 6, 7, 8, 9, 10, 30, 31], []) Traceback (most recent call last): ... ValueError: The parameter costs should be a list of three integers >>> mincost_tickets([], []) Traceback (most recent call last): ... ValueError: The parameter costs should be a list of three integers >>> mincost_tickets([2, 3, 4, 5, 6, 7, 8, 9, 10, 30, 31], [1, 2, 3, 4]) Traceback (most recent call last): ... ValueError: The parameter costs should be a list of three integers """ # Validation if not isinstance(days, list) or not all(isinstance(day, int) for day in days): raise ValueError("The parameter days should be a list of integers") if len(costs) != 3 or not all(isinstance(cost, int) for cost in costs): raise ValueError("The parameter costs should be a list of three integers") if len(days) == 0: return 0 if min(days) <= 0: raise ValueError("All days elements should be greater than 0") if max(days) >= 366: raise ValueError("All days elements should be less than 366") days_set = set(days) @functools.cache def dynamic_programming(index: int) -> int: if index > 365: return 0 if index not in days_set: return dynamic_programming(index + 1) return min( costs[0] + dynamic_programming(index + 1), costs[1] + dynamic_programming(index + 7), costs[2] + dynamic_programming(index + 30), ) return dynamic_programming(1) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: dynamic_programming/narcissistic_number.py ================================================ """ Find all narcissistic numbers up to a given limit using dynamic programming. A narcissistic number (also known as an Armstrong number or plus perfect number) is a number that is the sum of its own digits each raised to the power of the number of digits. For example, 153 is a narcissistic number because 153 = 1^3 + 5^3 + 3^3. This implementation uses dynamic programming with memoization to efficiently compute digit powers and find all narcissistic numbers up to a specified limit. The DP optimization caches digit^power calculations. When searching through many numbers, the same digit power calculations occur repeatedly (e.g., 153, 351, 135 all need 1^3, 5^3, 3^3). Memoization avoids these redundant calculations. Examples of narcissistic numbers: Single digit: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 Three digit: 153, 370, 371, 407 Four digit: 1634, 8208, 9474 Five digit: 54748, 92727, 93084 Reference: https://en.wikipedia.org/wiki/Narcissistic_number """ def find_narcissistic_numbers(limit: int) -> list[int]: """ Find all narcissistic numbers up to the given limit using dynamic programming. This function uses memoization to cache digit power calculations, avoiding redundant computations across different numbers with the same digit count. Args: limit: The upper bound for searching narcissistic numbers (exclusive) Returns: list[int]: A sorted list of all narcissistic numbers below the limit Examples: >>> find_narcissistic_numbers(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> find_narcissistic_numbers(160) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 153] >>> find_narcissistic_numbers(400) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371] >>> find_narcissistic_numbers(1000) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407] >>> find_narcissistic_numbers(10000) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407, 1634, 8208, 9474] >>> find_narcissistic_numbers(1) [0] >>> find_narcissistic_numbers(0) [] """ if limit <= 0: return [] narcissistic_nums = [] # Memoization: cache[(power, digit)] = digit^power # This avoids recalculating the same power for different numbers power_cache: dict[tuple[int, int], int] = {} def get_digit_power(digit: int, power: int) -> int: """Get digit^power using memoization (DP optimization).""" if (power, digit) not in power_cache: power_cache[(power, digit)] = digit**power return power_cache[(power, digit)] # Check each number up to the limit for number in range(limit): # Count digits num_digits = len(str(number)) # Calculate sum of powered digits using memoized powers remaining = number digit_sum = 0 while remaining > 0: digit = remaining % 10 digit_sum += get_digit_power(digit, num_digits) remaining //= 10 # Check if narcissistic if digit_sum == number: narcissistic_nums.append(number) return narcissistic_nums if __name__ == "__main__": import doctest doctest.testmod() # Demonstrate the dynamic programming approach print("Finding all narcissistic numbers up to 10000:") print("(Using memoization to cache digit power calculations)") print() narcissistic_numbers = find_narcissistic_numbers(10000) print(f"Found {len(narcissistic_numbers)} narcissistic numbers:") print(narcissistic_numbers) ================================================ FILE: dynamic_programming/optimal_binary_search_tree.py ================================================ #!/usr/bin/env python3 # This Python program implements an optimal binary search tree (abbreviated BST) # building dynamic programming algorithm that delivers O(n^2) performance. # # The goal of the optimal BST problem is to build a low-cost BST for a # given set of nodes, each with its own key and frequency. The frequency # of the node is defined as how many time the node is being searched. # The search cost of binary search tree is given by this formula: # # cost(1, n) = sum{i = 1 to n}((depth(node_i) + 1) * node_i_freq) # # where n is number of nodes in the BST. The characteristic of low-cost # BSTs is having a faster overall search time than other implementations. # The reason for their fast search time is that the nodes with high # frequencies will be placed near the root of the tree while the nodes # with low frequencies will be placed near the leaves of the tree thus # reducing search time in the most frequent instances. import sys from random import randint class Node: """Binary Search Tree Node""" def __init__(self, key, freq): self.key = key self.freq = freq def __str__(self): """ >>> str(Node(1, 2)) 'Node(key=1, freq=2)' """ return f"Node(key={self.key}, freq={self.freq})" def print_binary_search_tree(root, key, i, j, parent, is_left): """ Recursive function to print a BST from a root table. >>> key = [3, 8, 9, 10, 17, 21] >>> root = [[0, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 3], [0, 0, 2, 3, 3, 3], \ [0, 0, 0, 3, 3, 3], [0, 0, 0, 0, 4, 5], [0, 0, 0, 0, 0, 5]] >>> print_binary_search_tree(root, key, 0, 5, -1, False) 8 is the root of the binary search tree. 3 is the left child of key 8. 10 is the right child of key 8. 9 is the left child of key 10. 21 is the right child of key 10. 17 is the left child of key 21. """ if i > j or i < 0 or j > len(root) - 1: return node = root[i][j] if parent == -1: # root does not have a parent print(f"{key[node]} is the root of the binary search tree.") elif is_left: print(f"{key[node]} is the left child of key {parent}.") else: print(f"{key[node]} is the right child of key {parent}.") print_binary_search_tree(root, key, i, node - 1, key[node], True) print_binary_search_tree(root, key, node + 1, j, key[node], False) def find_optimal_binary_search_tree(nodes): """ This function calculates and prints the optimal binary search tree. The dynamic programming algorithm below runs in O(n^2) time. Implemented from CLRS (Introduction to Algorithms) book. https://en.wikipedia.org/wiki/Introduction_to_Algorithms >>> find_optimal_binary_search_tree([Node(12, 8), Node(10, 34), Node(20, 50), \ Node(42, 3), Node(25, 40), Node(37, 30)]) Binary search tree nodes: Node(key=10, freq=34) Node(key=12, freq=8) Node(key=20, freq=50) Node(key=25, freq=40) Node(key=37, freq=30) Node(key=42, freq=3) The cost of optimal BST for given tree nodes is 324. 20 is the root of the binary search tree. 10 is the left child of key 20. 12 is the right child of key 10. 25 is the right child of key 20. 37 is the right child of key 25. 42 is the right child of key 37. """ # Tree nodes must be sorted first, the code below sorts the keys in # increasing order and rearrange its frequencies accordingly. nodes.sort(key=lambda node: node.key) n = len(nodes) keys = [nodes[i].key for i in range(n)] freqs = [nodes[i].freq for i in range(n)] # This 2D array stores the overall tree cost (which's as minimized as possible); # for a single key, cost is equal to frequency of the key. dp = [[freqs[i] if i == j else 0 for j in range(n)] for i in range(n)] # sum[i][j] stores the sum of key frequencies between i and j inclusive in nodes # array total = [[freqs[i] if i == j else 0 for j in range(n)] for i in range(n)] # stores tree roots that will be used later for constructing binary search tree root = [[i if i == j else 0 for j in range(n)] for i in range(n)] for interval_length in range(2, n + 1): for i in range(n - interval_length + 1): j = i + interval_length - 1 dp[i][j] = sys.maxsize # set the value to "infinity" total[i][j] = total[i][j - 1] + freqs[j] # Apply Knuth's optimization # Loop without optimization: for r in range(i, j + 1): for r in range(root[i][j - 1], root[i + 1][j] + 1): # r is a temporal root left = dp[i][r - 1] if r != i else 0 # optimal cost for left subtree right = dp[r + 1][j] if r != j else 0 # optimal cost for right subtree cost = left + total[i][j] + right if dp[i][j] > cost: dp[i][j] = cost root[i][j] = r print("Binary search tree nodes:") for node in nodes: print(node) print(f"\nThe cost of optimal BST for given tree nodes is {dp[0][n - 1]}.") print_binary_search_tree(root, keys, 0, n - 1, -1, False) def main(): # A sample binary search tree nodes = [Node(i, randint(1, 50)) for i in range(10, 0, -1)] find_optimal_binary_search_tree(nodes) if __name__ == "__main__": main() ================================================ FILE: dynamic_programming/palindrome_partitioning.py ================================================ """ Given a string s, partition s such that every substring of the partition is a palindrome. Find the minimum cuts needed for a palindrome partitioning of s. Time Complexity: O(n^2) Space Complexity: O(n^2) For other explanations refer to: https://www.youtube.com/watch?v=_H8V5hJUGd0 """ def find_minimum_partitions(string: str) -> int: """ Returns the minimum cuts needed for a palindrome partitioning of string >>> find_minimum_partitions("aab") 1 >>> find_minimum_partitions("aaa") 0 >>> find_minimum_partitions("ababbbabbababa") 3 """ length = len(string) cut = [0] * length is_palindromic = [[False for i in range(length)] for j in range(length)] for i, c in enumerate(string): mincut = i for j in range(i + 1): if c == string[j] and (i - j < 2 or is_palindromic[j + 1][i - 1]): is_palindromic[j][i] = True mincut = min(mincut, 0 if j == 0 else (cut[j - 1] + 1)) cut[i] = mincut return cut[length - 1] if __name__ == "__main__": s = input("Enter the string: ").strip() ans = find_minimum_partitions(s) print(f"Minimum number of partitions required for the '{s}' is {ans}") ================================================ FILE: dynamic_programming/range_sum_query.py ================================================ """ Author: Sanjay Muthu This is an implementation of the Dynamic Programming solution to the Range Sum Query. The problem statement is: Given an array and q queries, each query stating you to find the sum of elements from l to r (inclusive) Example: arr = [1, 4, 6, 2, 61, 12] queries = 3 l_1 = 2, r_1 = 5 l_2 = 1, r_2 = 5 l_3 = 3, r_3 = 4 as input will return [81, 85, 63] as output 0-indexing: NOTE: 0-indexing means the indexing of the array starts from 0 Example: a = [1, 2, 3, 4, 5, 6] Here, the 0th index of a is 1, the 1st index of a is 2, and so forth Time Complexity: O(N + Q) * O(N) pre-calculation time to calculate the prefix sum array * and O(1) time per each query = O(1 * Q) = O(Q) time Space Complexity: O(N) * O(N) to store the prefix sum Algorithm: So, first we calculate the prefix sum (dp) of the array. The prefix sum of the index i is the sum of all elements indexed from 0 to i (inclusive). The prefix sum of the index i is the prefix sum of index (i - 1) + the current element. So, the state of the dp is dp[i] = dp[i - 1] + a[i]. After we calculate the prefix sum, for each query [l, r] the answer is dp[r] - dp[l - 1] (we need to be careful because l might be 0). For example take this array: [4, 2, 1, 6, 3] The prefix sum calculated for this array would be: [4, 4 + 2, 4 + 2 + 1, 4 + 2 + 1 + 6, 4 + 2 + 1 + 6 + 3] ==> [4, 6, 7, 13, 16] If the query was l = 3, r = 4, the answer would be 6 + 3 = 9 but this would require O(r - l + 1) time ≈ O(N) time If we use prefix sums we can find it in O(1) by using the formula prefix[r] - prefix[l - 1]. This formula works because prefix[r] is the sum of elements from [0, r] and prefix[l - 1] is the sum of elements from [0, l - 1], so if we do prefix[r] - prefix[l - 1] it will be [0, r] - [0, l - 1] = [0, l - 1] + [l, r] - [0, l - 1] = [l, r] """ def prefix_sum(array: list[int], queries: list[tuple[int, int]]) -> list[int]: """ >>> prefix_sum([1, 4, 6, 2, 61, 12], [(2, 5), (1, 5), (3, 4)]) [81, 85, 63] >>> prefix_sum([4, 2, 1, 6, 3], [(3, 4), (1, 3), (0, 2)]) [9, 9, 7] """ # The prefix sum array dp = [0] * len(array) dp[0] = array[0] for i in range(1, len(array)): dp[i] = dp[i - 1] + array[i] # See Algorithm section (Line 44) result = [] for query in queries: left, right = query res = dp[right] if left > 0: res -= dp[left - 1] result.append(res) return result if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: dynamic_programming/regex_match.py ================================================ """ Regex matching check if a text matches pattern or not. Pattern: 1. ``.`` Matches any single character. 2. ``*`` Matches zero or more of the preceding element. More info: https://medium.com/trick-the-interviwer/regular-expression-matching-9972eb74c03 """ def recursive_match(text: str, pattern: str) -> bool: r""" Recursive matching algorithm. | Time complexity: O(2^(\|text\| + \|pattern\|)) | Space complexity: Recursion depth is O(\|text\| + \|pattern\|). :param text: Text to match. :param pattern: Pattern to match. :return: ``True`` if `text` matches `pattern`, ``False`` otherwise. >>> recursive_match('abc', 'a.c') True >>> recursive_match('abc', 'af*.c') True >>> recursive_match('abc', 'a.c*') True >>> recursive_match('abc', 'a.c*d') False >>> recursive_match('aa', '.*') True """ if not pattern: return not text if not text: return pattern[-1] == "*" and recursive_match(text, pattern[:-2]) if text[-1] == pattern[-1] or pattern[-1] == ".": return recursive_match(text[:-1], pattern[:-1]) if pattern[-1] == "*": return recursive_match(text[:-1], pattern) or recursive_match( text, pattern[:-2] ) return False def dp_match(text: str, pattern: str) -> bool: r""" Dynamic programming matching algorithm. | Time complexity: O(\|text\| * \|pattern\|) | Space complexity: O(\|text\| * \|pattern\|) :param text: Text to match. :param pattern: Pattern to match. :return: ``True`` if `text` matches `pattern`, ``False`` otherwise. >>> dp_match('abc', 'a.c') True >>> dp_match('abc', 'af*.c') True >>> dp_match('abc', 'a.c*') True >>> dp_match('abc', 'a.c*d') False >>> dp_match('aa', '.*') True """ m = len(text) n = len(pattern) dp = [[False for _ in range(n + 1)] for _ in range(m + 1)] dp[0][0] = True for j in range(1, n + 1): dp[0][j] = pattern[j - 1] == "*" and dp[0][j - 2] for i in range(1, m + 1): for j in range(1, n + 1): if pattern[j - 1] in {".", text[i - 1]}: dp[i][j] = dp[i - 1][j - 1] elif pattern[j - 1] == "*": dp[i][j] = dp[i][j - 2] if pattern[j - 2] in {".", text[i - 1]}: dp[i][j] |= dp[i - 1][j] else: dp[i][j] = False return dp[m][n] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: dynamic_programming/rod_cutting.py ================================================ """ This module provides two implementations for the rod-cutting problem: 1. A naive recursive implementation which has an exponential runtime 2. Two dynamic programming implementations which have quadratic runtime The rod-cutting problem is the problem of finding the maximum possible revenue obtainable from a rod of length ``n`` given a list of prices for each integral piece of the rod. The maximum revenue can thus be obtained by cutting the rod and selling the pieces separately or not cutting it at all if the price of it is the maximum obtainable. """ def naive_cut_rod_recursive(n: int, prices: list): """ Solves the rod-cutting problem via naively without using the benefit of dynamic programming. The results is the same sub-problems are solved several times leading to an exponential runtime Runtime: O(2^n) Arguments --------- * `n`: int, the length of the rod * `prices`: list, the prices for each piece of rod. ``p[i-i]`` is the price for a rod of length ``i`` Returns ------- The maximum revenue obtainable for a rod of length `n` given the list of prices for each piece. Examples -------- >>> naive_cut_rod_recursive(4, [1, 5, 8, 9]) 10 >>> naive_cut_rod_recursive(10, [1, 5, 8, 9, 10, 17, 17, 20, 24, 30]) 30 """ _enforce_args(n, prices) if n == 0: return 0 max_revue = float("-inf") for i in range(1, n + 1): max_revue = max( max_revue, prices[i - 1] + naive_cut_rod_recursive(n - i, prices) ) return max_revue def top_down_cut_rod(n: int, prices: list): """ Constructs a top-down dynamic programming solution for the rod-cutting problem via memoization. This function serves as a wrapper for ``_top_down_cut_rod_recursive`` Runtime: O(n^2) Arguments --------- * `n`: int, the length of the rod * `prices`: list, the prices for each piece of rod. ``p[i-i]`` is the price for a rod of length ``i`` .. note:: For convenience and because Python's lists using ``0``-indexing, ``length(max_rev) = n + 1``, to accommodate for the revenue obtainable from a rod of length ``0``. Returns ------- The maximum revenue obtainable for a rod of length `n` given the list of prices for each piece. Examples -------- >>> top_down_cut_rod(4, [1, 5, 8, 9]) 10 >>> top_down_cut_rod(10, [1, 5, 8, 9, 10, 17, 17, 20, 24, 30]) 30 """ _enforce_args(n, prices) max_rev = [float("-inf") for _ in range(n + 1)] return _top_down_cut_rod_recursive(n, prices, max_rev) def _top_down_cut_rod_recursive(n: int, prices: list, max_rev: list): """ Constructs a top-down dynamic programming solution for the rod-cutting problem via memoization. Runtime: O(n^2) Arguments --------- * `n`: int, the length of the rod * `prices`: list, the prices for each piece of rod. ``p[i-i]`` is the price for a rod of length ``i`` * `max_rev`: list, the computed maximum revenue for a piece of rod. ``max_rev[i]`` is the maximum revenue obtainable for a rod of length ``i`` Returns ------- The maximum revenue obtainable for a rod of length `n` given the list of prices for each piece. """ if max_rev[n] >= 0: return max_rev[n] elif n == 0: return 0 else: max_revenue = float("-inf") for i in range(1, n + 1): max_revenue = max( max_revenue, prices[i - 1] + _top_down_cut_rod_recursive(n - i, prices, max_rev), ) max_rev[n] = max_revenue return max_rev[n] def bottom_up_cut_rod(n: int, prices: list): """ Constructs a bottom-up dynamic programming solution for the rod-cutting problem Runtime: O(n^2) Arguments --------- * `n`: int, the maximum length of the rod. * `prices`: list, the prices for each piece of rod. ``p[i-i]`` is the price for a rod of length ``i`` Returns ------- The maximum revenue obtainable from cutting a rod of length `n` given the prices for each piece of rod p. Examples -------- >>> bottom_up_cut_rod(4, [1, 5, 8, 9]) 10 >>> bottom_up_cut_rod(10, [1, 5, 8, 9, 10, 17, 17, 20, 24, 30]) 30 """ _enforce_args(n, prices) # length(max_rev) = n + 1, to accommodate for the revenue obtainable from a rod of # length 0. max_rev = [float("-inf") for _ in range(n + 1)] max_rev[0] = 0 for i in range(1, n + 1): max_revenue_i = max_rev[i] for j in range(1, i + 1): max_revenue_i = max(max_revenue_i, prices[j - 1] + max_rev[i - j]) max_rev[i] = max_revenue_i return max_rev[n] def _enforce_args(n: int, prices: list): """ Basic checks on the arguments to the rod-cutting algorithms * `n`: int, the length of the rod * `prices`: list, the price list for each piece of rod. Throws ``ValueError``: if `n` is negative or there are fewer items in the price list than the length of the rod """ if n < 0: msg = f"n must be greater than or equal to 0. Got n = {n}" raise ValueError(msg) if n > len(prices): msg = ( "Each integral piece of rod must have a corresponding price. " f"Got n = {n} but length of prices = {len(prices)}" ) raise ValueError(msg) def main(): prices = [6, 10, 12, 15, 20, 23] n = len(prices) # the best revenue comes from cutting the rod into 6 pieces, each # of length 1 resulting in a revenue of 6 * 6 = 36. expected_max_revenue = 36 max_rev_top_down = top_down_cut_rod(n, prices) max_rev_bottom_up = bottom_up_cut_rod(n, prices) max_rev_naive = naive_cut_rod_recursive(n, prices) assert expected_max_revenue == max_rev_top_down assert max_rev_top_down == max_rev_bottom_up assert max_rev_bottom_up == max_rev_naive if __name__ == "__main__": main() ================================================ FILE: dynamic_programming/smith_waterman.py ================================================ """ https://en.wikipedia.org/wiki/Smith%E2%80%93Waterman_algorithm The Smith-Waterman algorithm is a dynamic programming algorithm used for sequence alignment. It is particularly useful for finding similarities between two sequences, such as DNA or protein sequences. In this implementation, gaps are penalized linearly, meaning that the score is reduced by a fixed amount for each gap introduced in the alignment. However, it's important to note that the Smith-Waterman algorithm supports other gap penalty methods as well. """ def score_function( source_char: str, target_char: str, match: int = 1, mismatch: int = -1, gap: int = -2, ) -> int: """ Calculate the score for a character pair based on whether they match or mismatch. Returns 1 if the characters match, -1 if they mismatch, and -2 if either of the characters is a gap. >>> score_function('A', 'A') 1 >>> score_function('A', 'C') -1 >>> score_function('-', 'A') -2 >>> score_function('A', '-') -2 >>> score_function('-', '-') -2 """ if "-" in (source_char, target_char): return gap return match if source_char == target_char else mismatch def smith_waterman( query: str, subject: str, match: int = 1, mismatch: int = -1, gap: int = -2, ) -> list[list[int]]: """ Perform the Smith-Waterman local sequence alignment algorithm. Returns a 2D list representing the score matrix. Each value in the matrix corresponds to the score of the best local alignment ending at that point. >>> smith_waterman('ACAC', 'CA') [[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 0, 2], [0, 1, 0]] >>> smith_waterman('acac', 'ca') [[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 0, 2], [0, 1, 0]] >>> smith_waterman('ACAC', 'ca') [[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 0, 2], [0, 1, 0]] >>> smith_waterman('acac', 'CA') [[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 0, 2], [0, 1, 0]] >>> smith_waterman('ACAC', '') [[0], [0], [0], [0], [0]] >>> smith_waterman('', 'CA') [[0, 0, 0]] >>> smith_waterman('ACAC', 'CA') [[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 0, 2], [0, 1, 0]] >>> smith_waterman('acac', 'ca') [[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 0, 2], [0, 1, 0]] >>> smith_waterman('ACAC', 'ca') [[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 0, 2], [0, 1, 0]] >>> smith_waterman('acac', 'CA') [[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 0, 2], [0, 1, 0]] >>> smith_waterman('ACAC', '') [[0], [0], [0], [0], [0]] >>> smith_waterman('', 'CA') [[0, 0, 0]] >>> smith_waterman('AGT', 'AGT') [[0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 2, 0], [0, 0, 0, 3]] >>> smith_waterman('AGT', 'GTA') [[0, 0, 0, 0], [0, 0, 0, 1], [0, 1, 0, 0], [0, 0, 2, 0]] >>> smith_waterman('AGT', 'GTC') [[0, 0, 0, 0], [0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 2, 0]] >>> smith_waterman('AGT', 'G') [[0, 0], [0, 0], [0, 1], [0, 0]] >>> smith_waterman('G', 'AGT') [[0, 0, 0, 0], [0, 0, 1, 0]] >>> smith_waterman('AGT', 'AGTCT') [[0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 0, 2, 0, 0, 0], [0, 0, 0, 3, 1, 1]] >>> smith_waterman('AGTCT', 'AGT') [[0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 2, 0], [0, 0, 0, 3], [0, 0, 0, 1], [0, 0, 0, 1]] >>> smith_waterman('AGTCT', 'GTC') [[0, 0, 0, 0], [0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 2, 0], [0, 0, 0, 3], [0, 0, 1, 1]] """ # make both query and subject uppercase query = query.upper() subject = subject.upper() # Initialize score matrix m = len(query) n = len(subject) score = [[0] * (n + 1) for _ in range(m + 1)] kwargs = {"match": match, "mismatch": mismatch, "gap": gap} for i in range(1, m + 1): for j in range(1, n + 1): # Calculate scores for each cell match = score[i - 1][j - 1] + score_function( query[i - 1], subject[j - 1], **kwargs ) delete = score[i - 1][j] + gap insert = score[i][j - 1] + gap # Take maximum score score[i][j] = max(0, match, delete, insert) return score def traceback(score: list[list[int]], query: str, subject: str) -> str: r""" Perform traceback to find the optimal local alignment. Starts from the highest scoring cell in the matrix and traces back recursively until a 0 score is found. Returns the alignment strings. >>> traceback([[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 0, 2], [0, 1, 0]], 'ACAC', 'CA') 'CA\nCA' >>> traceback([[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 0, 2], [0, 1, 0]], 'acac', 'ca') 'CA\nCA' >>> traceback([[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 0, 2], [0, 1, 0]], 'ACAC', 'ca') 'CA\nCA' >>> traceback([[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 0, 2], [0, 1, 0]], 'acac', 'CA') 'CA\nCA' >>> traceback([[0, 0, 0]], 'ACAC', '') '' """ # make both query and subject uppercase query = query.upper() subject = subject.upper() # find the indices of the maximum value in the score matrix max_value = float("-inf") i_max = j_max = 0 for i, row in enumerate(score): for j, value in enumerate(row): if value > max_value: max_value = value i_max, j_max = i, j # Traceback logic to find optimal alignment i = i_max j = j_max align1 = "" align2 = "" gap = score_function("-", "-") # guard against empty query or subject if i == 0 or j == 0: return "" while i > 0 and j > 0: if score[i][j] == score[i - 1][j - 1] + score_function( query[i - 1], subject[j - 1] ): # optimal path is a diagonal take both letters align1 = query[i - 1] + align1 align2 = subject[j - 1] + align2 i -= 1 j -= 1 elif score[i][j] == score[i - 1][j] + gap: # optimal path is a vertical align1 = query[i - 1] + align1 align2 = f"-{align2}" i -= 1 else: # optimal path is a horizontal align1 = f"-{align1}" align2 = subject[j - 1] + align2 j -= 1 return f"{align1}\n{align2}" if __name__ == "__main__": query = "HEAGAWGHEE" subject = "PAWHEAE" score = smith_waterman(query, subject, match=1, mismatch=-1, gap=-2) print(traceback(score, query, subject)) ================================================ FILE: dynamic_programming/subset_generation.py ================================================ def subset_combinations(elements: list[int], n: int) -> list: """ Compute n-element combinations from a given list using dynamic programming. Args: * `elements`: The list of elements from which combinations will be generated. * `n`: The number of elements in each combination. Returns: A list of tuples, each representing a combination of `n` elements. >>> subset_combinations(elements=[10, 20, 30, 40], n=2) [(10, 20), (10, 30), (10, 40), (20, 30), (20, 40), (30, 40)] >>> subset_combinations(elements=[1, 2, 3], n=1) [(1,), (2,), (3,)] >>> subset_combinations(elements=[1, 2, 3], n=3) [(1, 2, 3)] >>> subset_combinations(elements=[42], n=1) [(42,)] >>> subset_combinations(elements=[6, 7, 8, 9], n=4) [(6, 7, 8, 9)] >>> subset_combinations(elements=[10, 20, 30, 40, 50], n=0) [()] >>> subset_combinations(elements=[1, 2, 3, 4], n=2) [(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)] >>> subset_combinations(elements=[1, 'apple', 3.14], n=2) [(1, 'apple'), (1, 3.14), ('apple', 3.14)] >>> subset_combinations(elements=['single'], n=0) [()] >>> subset_combinations(elements=[], n=9) [] >>> from itertools import combinations >>> all(subset_combinations(items, n) == list(combinations(items, n)) ... for items, n in ( ... ([10, 20, 30, 40], 2), ([1, 2, 3], 1), ([1, 2, 3], 3), ([42], 1), ... ([6, 7, 8, 9], 4), ([10, 20, 30, 40, 50], 1), ([1, 2, 3, 4], 2), ... ([1, 'apple', 3.14], 2), (['single'], 0), ([], 9))) True """ r = len(elements) if n > r: return [] dp: list[list[tuple]] = [[] for _ in range(r + 1)] dp[0].append(()) for i in range(1, r + 1): for j in range(i, 0, -1): for prev_combination in dp[j - 1]: dp[j].append((*prev_combination, elements[i - 1])) try: return sorted(dp[n]) except TypeError: return dp[n] if __name__ == "__main__": from doctest import testmod testmod() print(f"{subset_combinations(elements=[10, 20, 30, 40], n=2) = }") ================================================ FILE: dynamic_programming/sum_of_subset.py ================================================ def is_sum_subset(arr: list[int], required_sum: int) -> bool: """ >>> is_sum_subset([2, 4, 6, 8], 5) False >>> is_sum_subset([2, 4, 6, 8], 14) True """ # a subset value says 1 if that subset sum can be formed else 0 # initially no subsets can be formed hence False/0 arr_len = len(arr) subset = [[False] * (required_sum + 1) for _ in range(arr_len + 1)] # for each arr value, a sum of zero(0) can be formed by not taking any element # hence True/1 for i in range(arr_len + 1): subset[i][0] = True # sum is not zero and set is empty then false for i in range(1, required_sum + 1): subset[0][i] = False for i in range(1, arr_len + 1): for j in range(1, required_sum + 1): if arr[i - 1] > j: subset[i][j] = subset[i - 1][j] if arr[i - 1] <= j: subset[i][j] = subset[i - 1][j] or subset[i - 1][j - arr[i - 1]] return subset[arr_len][required_sum] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: dynamic_programming/trapped_water.py ================================================ """ Given an array of non-negative integers representing an elevation map where the width of each bar is 1, this program calculates how much rainwater can be trapped. Example - height = (0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1) Output: 6 This problem can be solved using the concept of "DYNAMIC PROGRAMMING". We calculate the maximum height of bars on the left and right of every bar in array. Then iterate over the width of structure and at each index. The amount of water that will be stored is equal to minimum of maximum height of bars on both sides minus height of bar at current position. """ def trapped_rainwater(heights: tuple[int, ...]) -> int: """ The trapped_rainwater function calculates the total amount of rainwater that can be trapped given an array of bar heights. It uses a dynamic programming approach, determining the maximum height of bars on both sides for each bar, and then computing the trapped water above each bar. The function returns the total trapped water. >>> trapped_rainwater((0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1)) 6 >>> trapped_rainwater((7, 1, 5, 3, 6, 4)) 9 >>> trapped_rainwater((7, 1, 5, 3, 6, -1)) Traceback (most recent call last): ... ValueError: No height can be negative """ if not heights: return 0 if any(h < 0 for h in heights): raise ValueError("No height can be negative") length = len(heights) left_max = [0] * length left_max[0] = heights[0] for i, height in enumerate(heights[1:], start=1): left_max[i] = max(height, left_max[i - 1]) right_max = [0] * length right_max[-1] = heights[-1] for i in range(length - 2, -1, -1): right_max[i] = max(heights[i], right_max[i + 1]) return sum( min(left, right) - height for left, right, height in zip(left_max, right_max, heights) ) if __name__ == "__main__": import doctest doctest.testmod() print(f"{trapped_rainwater((0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1)) = }") print(f"{trapped_rainwater((7, 1, 5, 3, 6, 4)) = }") ================================================ FILE: dynamic_programming/tribonacci.py ================================================ # Tribonacci sequence using Dynamic Programming def tribonacci(num: int) -> list[int]: """ Given a number, return first n Tribonacci Numbers. >>> tribonacci(5) [0, 0, 1, 1, 2] >>> tribonacci(8) [0, 0, 1, 1, 2, 4, 7, 13] """ dp = [0] * num dp[2] = 1 for i in range(3, num): dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3] return dp if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: dynamic_programming/viterbi.py ================================================ from typing import Any def viterbi( observations_space: list, states_space: list, initial_probabilities: dict, transition_probabilities: dict, emission_probabilities: dict, ) -> list: """ Viterbi Algorithm, to find the most likely path of states from the start and the expected output. https://en.wikipedia.org/wiki/Viterbi_algorithm Wikipedia example >>> observations = ["normal", "cold", "dizzy"] >>> states = ["Healthy", "Fever"] >>> start_p = {"Healthy": 0.6, "Fever": 0.4} >>> trans_p = { ... "Healthy": {"Healthy": 0.7, "Fever": 0.3}, ... "Fever": {"Healthy": 0.4, "Fever": 0.6}, ... } >>> emit_p = { ... "Healthy": {"normal": 0.5, "cold": 0.4, "dizzy": 0.1}, ... "Fever": {"normal": 0.1, "cold": 0.3, "dizzy": 0.6}, ... } >>> viterbi(observations, states, start_p, trans_p, emit_p) ['Healthy', 'Healthy', 'Fever'] >>> viterbi((), states, start_p, trans_p, emit_p) Traceback (most recent call last): ... ValueError: There's an empty parameter >>> viterbi(observations, (), start_p, trans_p, emit_p) Traceback (most recent call last): ... ValueError: There's an empty parameter >>> viterbi(observations, states, {}, trans_p, emit_p) Traceback (most recent call last): ... ValueError: There's an empty parameter >>> viterbi(observations, states, start_p, {}, emit_p) Traceback (most recent call last): ... ValueError: There's an empty parameter >>> viterbi(observations, states, start_p, trans_p, {}) Traceback (most recent call last): ... ValueError: There's an empty parameter >>> viterbi("invalid", states, start_p, trans_p, emit_p) Traceback (most recent call last): ... ValueError: observations_space must be a list >>> viterbi(["valid", 123], states, start_p, trans_p, emit_p) Traceback (most recent call last): ... ValueError: observations_space must be a list of strings >>> viterbi(observations, "invalid", start_p, trans_p, emit_p) Traceback (most recent call last): ... ValueError: states_space must be a list >>> viterbi(observations, ["valid", 123], start_p, trans_p, emit_p) Traceback (most recent call last): ... ValueError: states_space must be a list of strings >>> viterbi(observations, states, "invalid", trans_p, emit_p) Traceback (most recent call last): ... ValueError: initial_probabilities must be a dict >>> viterbi(observations, states, {2:2}, trans_p, emit_p) Traceback (most recent call last): ... ValueError: initial_probabilities all keys must be strings >>> viterbi(observations, states, {"a":2}, trans_p, emit_p) Traceback (most recent call last): ... ValueError: initial_probabilities all values must be float >>> viterbi(observations, states, start_p, "invalid", emit_p) Traceback (most recent call last): ... ValueError: transition_probabilities must be a dict >>> viterbi(observations, states, start_p, {"a":2}, emit_p) Traceback (most recent call last): ... ValueError: transition_probabilities all values must be dict >>> viterbi(observations, states, start_p, {2:{2:2}}, emit_p) Traceback (most recent call last): ... ValueError: transition_probabilities all keys must be strings >>> viterbi(observations, states, start_p, {"a":{2:2}}, emit_p) Traceback (most recent call last): ... ValueError: transition_probabilities all keys must be strings >>> viterbi(observations, states, start_p, {"a":{"b":2}}, emit_p) Traceback (most recent call last): ... ValueError: transition_probabilities nested dictionary all values must be float >>> viterbi(observations, states, start_p, trans_p, "invalid") Traceback (most recent call last): ... ValueError: emission_probabilities must be a dict >>> viterbi(observations, states, start_p, trans_p, None) Traceback (most recent call last): ... ValueError: There's an empty parameter """ _validation( observations_space, states_space, initial_probabilities, transition_probabilities, emission_probabilities, ) # Creates data structures and fill initial step probabilities: dict = {} pointers: dict = {} for state in states_space: observation = observations_space[0] probabilities[(state, observation)] = ( initial_probabilities[state] * emission_probabilities[state][observation] ) pointers[(state, observation)] = None # Fills the data structure with the probabilities of # different transitions and pointers to previous states for o in range(1, len(observations_space)): observation = observations_space[o] prior_observation = observations_space[o - 1] for state in states_space: # Calculates the argmax for probability function arg_max = "" max_probability = -1 for k_state in states_space: probability = ( probabilities[(k_state, prior_observation)] * transition_probabilities[k_state][state] * emission_probabilities[state][observation] ) if probability > max_probability: max_probability = probability arg_max = k_state # Update probabilities and pointers dicts probabilities[(state, observation)] = ( probabilities[(arg_max, prior_observation)] * transition_probabilities[arg_max][state] * emission_probabilities[state][observation] ) pointers[(state, observation)] = arg_max # The final observation final_observation = observations_space[len(observations_space) - 1] # argmax for given final observation arg_max = "" max_probability = -1 for k_state in states_space: probability = probabilities[(k_state, final_observation)] if probability > max_probability: max_probability = probability arg_max = k_state last_state = arg_max # Process pointers backwards previous = last_state result = [] for o in range(len(observations_space) - 1, -1, -1): result.append(previous) previous = pointers[previous, observations_space[o]] result.reverse() return result def _validation( observations_space: Any, states_space: Any, initial_probabilities: Any, transition_probabilities: Any, emission_probabilities: Any, ) -> None: """ >>> observations = ["normal", "cold", "dizzy"] >>> states = ["Healthy", "Fever"] >>> start_p = {"Healthy": 0.6, "Fever": 0.4} >>> trans_p = { ... "Healthy": {"Healthy": 0.7, "Fever": 0.3}, ... "Fever": {"Healthy": 0.4, "Fever": 0.6}, ... } >>> emit_p = { ... "Healthy": {"normal": 0.5, "cold": 0.4, "dizzy": 0.1}, ... "Fever": {"normal": 0.1, "cold": 0.3, "dizzy": 0.6}, ... } >>> _validation(observations, states, start_p, trans_p, emit_p) >>> _validation([], states, start_p, trans_p, emit_p) Traceback (most recent call last): ... ValueError: There's an empty parameter """ _validate_not_empty( observations_space, states_space, initial_probabilities, transition_probabilities, emission_probabilities, ) _validate_lists(observations_space, states_space) _validate_dicts( initial_probabilities, transition_probabilities, emission_probabilities ) def _validate_not_empty( observations_space: Any, states_space: Any, initial_probabilities: Any, transition_probabilities: Any, emission_probabilities: Any, ) -> None: """ >>> _validate_not_empty(["a"], ["b"], {"c":0.5}, ... {"d": {"e": 0.6}}, {"f": {"g": 0.7}}) >>> _validate_not_empty(["a"], ["b"], {"c":0.5}, {}, {"f": {"g": 0.7}}) Traceback (most recent call last): ... ValueError: There's an empty parameter >>> _validate_not_empty(["a"], ["b"], None, {"d": {"e": 0.6}}, {"f": {"g": 0.7}}) Traceback (most recent call last): ... ValueError: There's an empty parameter """ if not all( [ observations_space, states_space, initial_probabilities, transition_probabilities, emission_probabilities, ] ): raise ValueError("There's an empty parameter") def _validate_lists(observations_space: Any, states_space: Any) -> None: """ >>> _validate_lists(["a"], ["b"]) >>> _validate_lists(1234, ["b"]) Traceback (most recent call last): ... ValueError: observations_space must be a list >>> _validate_lists(["a"], [3]) Traceback (most recent call last): ... ValueError: states_space must be a list of strings """ _validate_list(observations_space, "observations_space") _validate_list(states_space, "states_space") def _validate_list(_object: Any, var_name: str) -> None: """ >>> _validate_list(["a"], "mock_name") >>> _validate_list("a", "mock_name") Traceback (most recent call last): ... ValueError: mock_name must be a list >>> _validate_list([0.5], "mock_name") Traceback (most recent call last): ... ValueError: mock_name must be a list of strings """ if not isinstance(_object, list): msg = f"{var_name} must be a list" raise ValueError(msg) else: for x in _object: if not isinstance(x, str): msg = f"{var_name} must be a list of strings" raise ValueError(msg) def _validate_dicts( initial_probabilities: Any, transition_probabilities: Any, emission_probabilities: Any, ) -> None: """ >>> _validate_dicts({"c":0.5}, {"d": {"e": 0.6}}, {"f": {"g": 0.7}}) >>> _validate_dicts("invalid", {"d": {"e": 0.6}}, {"f": {"g": 0.7}}) Traceback (most recent call last): ... ValueError: initial_probabilities must be a dict >>> _validate_dicts({"c":0.5}, {2: {"e": 0.6}}, {"f": {"g": 0.7}}) Traceback (most recent call last): ... ValueError: transition_probabilities all keys must be strings >>> _validate_dicts({"c":0.5}, {"d": {"e": 0.6}}, {"f": {2: 0.7}}) Traceback (most recent call last): ... ValueError: emission_probabilities all keys must be strings >>> _validate_dicts({"c":0.5}, {"d": {"e": 0.6}}, {"f": {"g": "h"}}) Traceback (most recent call last): ... ValueError: emission_probabilities nested dictionary all values must be float """ _validate_dict(initial_probabilities, "initial_probabilities", float) _validate_nested_dict(transition_probabilities, "transition_probabilities") _validate_nested_dict(emission_probabilities, "emission_probabilities") def _validate_nested_dict(_object: Any, var_name: str) -> None: """ >>> _validate_nested_dict({"a":{"b": 0.5}}, "mock_name") >>> _validate_nested_dict("invalid", "mock_name") Traceback (most recent call last): ... ValueError: mock_name must be a dict >>> _validate_nested_dict({"a": 8}, "mock_name") Traceback (most recent call last): ... ValueError: mock_name all values must be dict >>> _validate_nested_dict({"a":{2: 0.5}}, "mock_name") Traceback (most recent call last): ... ValueError: mock_name all keys must be strings >>> _validate_nested_dict({"a":{"b": 4}}, "mock_name") Traceback (most recent call last): ... ValueError: mock_name nested dictionary all values must be float """ _validate_dict(_object, var_name, dict) for x in _object.values(): _validate_dict(x, var_name, float, True) def _validate_dict( _object: Any, var_name: str, value_type: type, nested: bool = False ) -> None: """ >>> _validate_dict({"b": 0.5}, "mock_name", float) >>> _validate_dict("invalid", "mock_name", float) Traceback (most recent call last): ... ValueError: mock_name must be a dict >>> _validate_dict({"a": 8}, "mock_name", dict) Traceback (most recent call last): ... ValueError: mock_name all values must be dict >>> _validate_dict({2: 0.5}, "mock_name",float, True) Traceback (most recent call last): ... ValueError: mock_name all keys must be strings >>> _validate_dict({"b": 4}, "mock_name", float,True) Traceback (most recent call last): ... ValueError: mock_name nested dictionary all values must be float """ if not isinstance(_object, dict): msg = f"{var_name} must be a dict" raise ValueError(msg) if not all(isinstance(x, str) for x in _object): msg = f"{var_name} all keys must be strings" raise ValueError(msg) if not all(isinstance(x, value_type) for x in _object.values()): nested_text = "nested dictionary " if nested else "" msg = f"{var_name} {nested_text}all values must be {value_type.__name__}" raise ValueError(msg) if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: dynamic_programming/wildcard_matching.py ================================================ """ Author : ilyas dahhou Date : Oct 7, 2023 Task: Given an input string and a pattern, implement wildcard pattern matching with support for '?' and '*' where: '?' matches any single character. '*' matches any sequence of characters (including the empty sequence). The matching should cover the entire input string (not partial). Runtime complexity: O(m * n) The implementation was tested on the leetcode: https://leetcode.com/problems/wildcard-matching/ """ def is_match(string: str, pattern: str) -> bool: """ >>> is_match("", "") True >>> is_match("aa", "a") False >>> is_match("abc", "abc") True >>> is_match("abc", "*c") True >>> is_match("abc", "a*") True >>> is_match("abc", "*a*") True >>> is_match("abc", "?b?") True >>> is_match("abc", "*?") True >>> is_match("abc", "a*d") False >>> is_match("abc", "a*c?") False >>> is_match('baaabab','*****ba*****ba') False >>> is_match('baaabab','*****ba*****ab') True >>> is_match('aa','*') True """ dp = [[False] * (len(pattern) + 1) for _ in string + "1"] dp[0][0] = True # Fill in the first row for j, char in enumerate(pattern, 1): if char == "*": dp[0][j] = dp[0][j - 1] # Fill in the rest of the DP table for i, s_char in enumerate(string, 1): for j, p_char in enumerate(pattern, 1): if p_char in (s_char, "?"): dp[i][j] = dp[i - 1][j - 1] elif pattern[j - 1] == "*": dp[i][j] = dp[i - 1][j] or dp[i][j - 1] return dp[len(string)][len(pattern)] if __name__ == "__main__": import doctest doctest.testmod() print(f"{is_match('baaabab','*****ba*****ab') = }") ================================================ FILE: dynamic_programming/word_break.py ================================================ """ Author : Alexander Pantyukhin Date : December 12, 2022 Task: Given a string and a list of words, return true if the string can be segmented into a space-separated sequence of one or more words. Note that the same word may be reused multiple times in the segmentation. Implementation notes: Trie + Dynamic programming up -> down. The Trie will be used to store the words. It will be useful for scanning available words for the current position in the string. Leetcode: https://leetcode.com/problems/word-break/description/ Runtime: O(n * n) Space: O(n) """ import functools from typing import Any def word_break(string: str, words: list[str]) -> bool: """ Return True if numbers have opposite signs False otherwise. >>> word_break("applepenapple", ["apple","pen"]) True >>> word_break("catsandog", ["cats","dog","sand","and","cat"]) False >>> word_break("cars", ["car","ca","rs"]) True >>> word_break('abc', []) False >>> word_break(123, ['a']) Traceback (most recent call last): ... ValueError: the string should be not empty string >>> word_break('', ['a']) Traceback (most recent call last): ... ValueError: the string should be not empty string >>> word_break('abc', [123]) Traceback (most recent call last): ... ValueError: the words should be a list of non-empty strings >>> word_break('abc', ['']) Traceback (most recent call last): ... ValueError: the words should be a list of non-empty strings """ # Validation if not isinstance(string, str) or len(string) == 0: raise ValueError("the string should be not empty string") if not isinstance(words, list) or not all( isinstance(item, str) and len(item) > 0 for item in words ): raise ValueError("the words should be a list of non-empty strings") # Build trie trie: dict[str, Any] = {} word_keeper_key = "WORD_KEEPER" for word in words: trie_node = trie for c in word: if c not in trie_node: trie_node[c] = {} trie_node = trie_node[c] trie_node[word_keeper_key] = True len_string = len(string) # Dynamic programming method @functools.cache def is_breakable(index: int) -> bool: """ >>> string = 'a' >>> is_breakable(1) True """ if index == len_string: return True trie_node: Any = trie for i in range(index, len_string): trie_node = trie_node.get(string[i], None) if trie_node is None: return False if trie_node.get(word_keeper_key, False) and is_breakable(i + 1): return True return False return is_breakable(0) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: electronics/__init__.py ================================================ ================================================ FILE: electronics/apparent_power.py ================================================ import cmath import math def apparent_power( voltage: float, current: float, voltage_angle: float, current_angle: float ) -> complex: """ Calculate the apparent power in a single-phase AC circuit. Reference: https://en.wikipedia.org/wiki/AC_power#Apparent_power >>> apparent_power(100, 5, 0, 0) (500+0j) >>> apparent_power(100, 5, 90, 0) (3.061616997868383e-14+500j) >>> apparent_power(100, 5, -45, -60) (-129.40952255126027-482.9629131445341j) >>> apparent_power(200, 10, -30, -90) (-999.9999999999998-1732.0508075688776j) """ # Convert angles from degrees to radians voltage_angle_rad = math.radians(voltage_angle) current_angle_rad = math.radians(current_angle) # Convert voltage and current to rectangular form voltage_rect = cmath.rect(voltage, voltage_angle_rad) current_rect = cmath.rect(current, current_angle_rad) # Calculate apparent power return voltage_rect * current_rect if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: electronics/builtin_voltage.py ================================================ from math import log from scipy.constants import Boltzmann, physical_constants T = 300 # TEMPERATURE (unit = K) def builtin_voltage( donor_conc: float, # donor concentration acceptor_conc: float, # acceptor concentration intrinsic_conc: float, # intrinsic concentration ) -> float: """ This function can calculate the Builtin Voltage of a pn junction diode. This is calculated from the given three values. Examples - >>> builtin_voltage(donor_conc=1e17, acceptor_conc=1e17, intrinsic_conc=1e10) 0.833370010652644 >>> builtin_voltage(donor_conc=0, acceptor_conc=1600, intrinsic_conc=200) Traceback (most recent call last): ... ValueError: Donor concentration should be positive >>> builtin_voltage(donor_conc=1000, acceptor_conc=0, intrinsic_conc=1200) Traceback (most recent call last): ... ValueError: Acceptor concentration should be positive >>> builtin_voltage(donor_conc=1000, acceptor_conc=1000, intrinsic_conc=0) Traceback (most recent call last): ... ValueError: Intrinsic concentration should be positive >>> builtin_voltage(donor_conc=1000, acceptor_conc=3000, intrinsic_conc=2000) Traceback (most recent call last): ... ValueError: Donor concentration should be greater than intrinsic concentration >>> builtin_voltage(donor_conc=3000, acceptor_conc=1000, intrinsic_conc=2000) Traceback (most recent call last): ... ValueError: Acceptor concentration should be greater than intrinsic concentration """ if donor_conc <= 0: raise ValueError("Donor concentration should be positive") elif acceptor_conc <= 0: raise ValueError("Acceptor concentration should be positive") elif intrinsic_conc <= 0: raise ValueError("Intrinsic concentration should be positive") elif donor_conc <= intrinsic_conc: raise ValueError( "Donor concentration should be greater than intrinsic concentration" ) elif acceptor_conc <= intrinsic_conc: raise ValueError( "Acceptor concentration should be greater than intrinsic concentration" ) else: return ( Boltzmann * T * log((donor_conc * acceptor_conc) / intrinsic_conc**2) / physical_constants["electron volt"][0] ) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: electronics/capacitor_equivalence.py ================================================ # https://farside.ph.utexas.edu/teaching/316/lectures/node46.html from __future__ import annotations def capacitor_parallel(capacitors: list[float]) -> float: """ Ceq = C1 + C2 + ... + Cn Calculate the equivalent resistance for any number of capacitors in parallel. >>> capacitor_parallel([5.71389, 12, 3]) 20.71389 >>> capacitor_parallel([5.71389, 12, -3]) Traceback (most recent call last): ... ValueError: Capacitor at index 2 has a negative value! """ sum_c = 0.0 for index, capacitor in enumerate(capacitors): if capacitor < 0: msg = f"Capacitor at index {index} has a negative value!" raise ValueError(msg) sum_c += capacitor return sum_c def capacitor_series(capacitors: list[float]) -> float: """ Ceq = 1/ (1/C1 + 1/C2 + ... + 1/Cn) >>> capacitor_series([5.71389, 12, 3]) 1.6901062252507735 >>> capacitor_series([5.71389, 12, -3]) Traceback (most recent call last): ... ValueError: Capacitor at index 2 has a negative or zero value! >>> capacitor_series([5.71389, 12, 0.000]) Traceback (most recent call last): ... ValueError: Capacitor at index 2 has a negative or zero value! """ first_sum = 0.0 for index, capacitor in enumerate(capacitors): if capacitor <= 0: msg = f"Capacitor at index {index} has a negative or zero value!" raise ValueError(msg) first_sum += 1 / capacitor return 1 / first_sum if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: electronics/carrier_concentration.py ================================================ # https://en.wikipedia.org/wiki/Charge_carrier_density # https://www.pveducation.org/pvcdrom/pn-junctions/equilibrium-carrier-concentration # http://www.ece.utep.edu/courses/ee3329/ee3329/Studyguide/ToC/Fundamentals/Carriers/concentrations.html from __future__ import annotations def carrier_concentration( electron_conc: float, hole_conc: float, intrinsic_conc: float, ) -> tuple: """ This function can calculate any one of the three - 1. Electron Concentration 2, Hole Concentration 3. Intrinsic Concentration given the other two. Examples - >>> carrier_concentration(electron_conc=25, hole_conc=100, intrinsic_conc=0) ('intrinsic_conc', 50.0) >>> carrier_concentration(electron_conc=0, hole_conc=1600, intrinsic_conc=200) ('electron_conc', 25.0) >>> carrier_concentration(electron_conc=1000, hole_conc=0, intrinsic_conc=1200) ('hole_conc', 1440.0) >>> carrier_concentration(electron_conc=1000, hole_conc=400, intrinsic_conc=1200) Traceback (most recent call last): ... ValueError: You cannot supply more or less than 2 values >>> carrier_concentration(electron_conc=-1000, hole_conc=0, intrinsic_conc=1200) Traceback (most recent call last): ... ValueError: Electron concentration cannot be negative in a semiconductor >>> carrier_concentration(electron_conc=0, hole_conc=-400, intrinsic_conc=1200) Traceback (most recent call last): ... ValueError: Hole concentration cannot be negative in a semiconductor >>> carrier_concentration(electron_conc=0, hole_conc=400, intrinsic_conc=-1200) Traceback (most recent call last): ... ValueError: Intrinsic concentration cannot be negative in a semiconductor """ if (electron_conc, hole_conc, intrinsic_conc).count(0) != 1: raise ValueError("You cannot supply more or less than 2 values") elif electron_conc < 0: raise ValueError("Electron concentration cannot be negative in a semiconductor") elif hole_conc < 0: raise ValueError("Hole concentration cannot be negative in a semiconductor") elif intrinsic_conc < 0: raise ValueError( "Intrinsic concentration cannot be negative in a semiconductor" ) elif electron_conc == 0: return ( "electron_conc", intrinsic_conc**2 / hole_conc, ) elif hole_conc == 0: return ( "hole_conc", intrinsic_conc**2 / electron_conc, ) elif intrinsic_conc == 0: return ( "intrinsic_conc", (electron_conc * hole_conc) ** 0.5, ) else: return (-1, -1) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: electronics/charging_capacitor.py ================================================ # source - The ARRL Handbook for Radio Communications # https://en.wikipedia.org/wiki/RC_time_constant """ Description ----------- When a capacitor is connected with a potential source (AC or DC). It starts to charge at a general speed but when a resistor is connected in the circuit with in series to a capacitor then the capacitor charges slowly means it will take more time than usual. while the capacitor is being charged, the voltage is in exponential function with time. 'resistance(ohms) * capacitance(farads)' is called RC-timeconstant which may also be represented as τ (tau). By using this RC-timeconstant we can find the voltage at any time 't' from the initiation of charging a capacitor with the help of the exponential function containing RC. Both at charging and discharging of a capacitor. """ from math import exp # value of exp = 2.718281828459… def charging_capacitor( source_voltage: float, # voltage in volts. resistance: float, # resistance in ohms. capacitance: float, # capacitance in farads. time_sec: float, # time in seconds after charging initiation of capacitor. ) -> float: """ Find capacitor voltage at any nth second after initiating its charging. Examples -------- >>> charging_capacitor(source_voltage=.2,resistance=.9,capacitance=8.4,time_sec=.5) 0.013 >>> charging_capacitor(source_voltage=2.2,resistance=3.5,capacitance=2.4,time_sec=9) 1.446 >>> charging_capacitor(source_voltage=15,resistance=200,capacitance=20,time_sec=2) 0.007 >>> charging_capacitor(20, 2000, 30*pow(10,-5), 4) 19.975 >>> charging_capacitor(source_voltage=0,resistance=10.0,capacitance=.30,time_sec=3) Traceback (most recent call last): ... ValueError: Source voltage must be positive. >>> charging_capacitor(source_voltage=20,resistance=-2000,capacitance=30,time_sec=4) Traceback (most recent call last): ... ValueError: Resistance must be positive. >>> charging_capacitor(source_voltage=30,resistance=1500,capacitance=0,time_sec=4) Traceback (most recent call last): ... ValueError: Capacitance must be positive. """ if source_voltage <= 0: raise ValueError("Source voltage must be positive.") if resistance <= 0: raise ValueError("Resistance must be positive.") if capacitance <= 0: raise ValueError("Capacitance must be positive.") return round(source_voltage * (1 - exp(-time_sec / (resistance * capacitance))), 3) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: electronics/charging_inductor.py ================================================ # source - The ARRL Handbook for Radio Communications # https://en.wikipedia.org/wiki/RL_circuit """ Description ----------- Inductor is a passive electronic device which stores energy but unlike capacitor, it stores energy in its 'magnetic field' or 'magnetostatic field'. When inductor is connected to 'DC' current source nothing happens it just works like a wire because it's real effect cannot be seen while 'DC' is connected, its not even going to store energy. Inductor stores energy only when it is working on 'AC' current. Connecting a inductor in series with a resistor(when R = 0) to a 'AC' potential source, from zero to a finite value causes a sudden voltage to induced in inductor which opposes the current. which results in initially slowly current rise. However it would cease if there is no further changes in current. With resistance zero current will never stop rising. 'Resistance(ohms) / Inductance(henrys)' is known as RL-timeconstant. It also represents as τ (tau). While the charging of a inductor with a resistor results in a exponential function. when inductor is connected across 'AC' potential source. It starts to store the energy in its 'magnetic field'.with the help 'RL-time-constant' we can find current at any time in inductor while it is charging. """ from math import exp # value of exp = 2.718281828459… def charging_inductor( source_voltage: float, # source_voltage should be in volts. resistance: float, # resistance should be in ohms. inductance: float, # inductance should be in henrys. time: float, # time should in seconds. ) -> float: """ Find inductor current at any nth second after initiating its charging. Examples -------- >>> charging_inductor(source_voltage=5.8,resistance=1.5,inductance=2.3,time=2) 2.817 >>> charging_inductor(source_voltage=8,resistance=5,inductance=3,time=2) 1.543 >>> charging_inductor(source_voltage=8,resistance=5*pow(10,2),inductance=3,time=2) 0.016 >>> charging_inductor(source_voltage=-8,resistance=100,inductance=15,time=12) Traceback (most recent call last): ... ValueError: Source voltage must be positive. >>> charging_inductor(source_voltage=80,resistance=-15,inductance=100,time=5) Traceback (most recent call last): ... ValueError: Resistance must be positive. >>> charging_inductor(source_voltage=12,resistance=200,inductance=-20,time=5) Traceback (most recent call last): ... ValueError: Inductance must be positive. >>> charging_inductor(source_voltage=0,resistance=200,inductance=20,time=5) Traceback (most recent call last): ... ValueError: Source voltage must be positive. >>> charging_inductor(source_voltage=10,resistance=0,inductance=20,time=5) Traceback (most recent call last): ... ValueError: Resistance must be positive. >>> charging_inductor(source_voltage=15, resistance=25, inductance=0, time=5) Traceback (most recent call last): ... ValueError: Inductance must be positive. """ if source_voltage <= 0: raise ValueError("Source voltage must be positive.") if resistance <= 0: raise ValueError("Resistance must be positive.") if inductance <= 0: raise ValueError("Inductance must be positive.") return round( source_voltage / resistance * (1 - exp((-time * resistance) / inductance)), 3 ) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: electronics/circular_convolution.py ================================================ # https://en.wikipedia.org/wiki/Circular_convolution """ Circular convolution, also known as cyclic convolution, is a special case of periodic convolution, which is the convolution of two periodic functions that have the same period. Periodic convolution arises, for example, in the context of the discrete-time Fourier transform (DTFT). In particular, the DTFT of the product of two discrete sequences is the periodic convolution of the DTFTs of the individual sequences. And each DTFT is a periodic summation of a continuous Fourier transform function. Source: https://en.wikipedia.org/wiki/Circular_convolution """ import doctest from collections import deque import numpy as np class CircularConvolution: """ This class stores the first and second signal and performs the circular convolution """ def __init__(self) -> None: """ First signal and second signal are stored as 1-D array """ self.first_signal = [2, 1, 2, -1] self.second_signal = [1, 2, 3, 4] def circular_convolution(self) -> list[float]: """ This function performs the circular convolution of the first and second signal using matrix method Usage: >>> convolution = CircularConvolution() >>> convolution.circular_convolution() [10.0, 10.0, 6.0, 14.0] >>> convolution.first_signal = [0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6] >>> convolution.second_signal = [0.1, 0.3, 0.5, 0.7, 0.9, 1.1, 1.3, 1.5] >>> convolution.circular_convolution() [5.2, 6.0, 6.48, 6.64, 6.48, 6.0, 5.2, 4.08] >>> convolution.first_signal = [-1, 1, 2, -2] >>> convolution.second_signal = [0.5, 1, -1, 2, 0.75] >>> convolution.circular_convolution() [6.25, -3.0, 1.5, -2.0, -2.75] >>> convolution.first_signal = [1, -1, 2, 3, -1] >>> convolution.second_signal = [1, 2, 3] >>> convolution.circular_convolution() [8.0, -2.0, 3.0, 4.0, 11.0] """ length_first_signal = len(self.first_signal) length_second_signal = len(self.second_signal) max_length = max(length_first_signal, length_second_signal) # create a zero matrix of max_length x max_length matrix = [[0] * max_length for i in range(max_length)] # fills the smaller signal with zeros to make both signals of same length if length_first_signal < length_second_signal: self.first_signal += [0] * (max_length - length_first_signal) elif length_first_signal > length_second_signal: self.second_signal += [0] * (max_length - length_second_signal) """ Fills the matrix in the following way assuming 'x' is the signal of length 4 [ [x[0], x[3], x[2], x[1]], [x[1], x[0], x[3], x[2]], [x[2], x[1], x[0], x[3]], [x[3], x[2], x[1], x[0]] ] """ for i in range(max_length): rotated_signal = deque(self.second_signal) rotated_signal.rotate(i) for j, item in enumerate(rotated_signal): matrix[i][j] += item # multiply the matrix with the first signal final_signal = np.matmul(np.transpose(matrix), np.transpose(self.first_signal)) # rounding-off to two decimal places return [float(round(i, 2)) for i in final_signal] if __name__ == "__main__": doctest.testmod() ================================================ FILE: electronics/coulombs_law.py ================================================ # https://en.wikipedia.org/wiki/Coulomb%27s_law from __future__ import annotations COULOMBS_CONSTANT = 8.988e9 # units = N * m^s * C^-2 def couloumbs_law( force: float, charge1: float, charge2: float, distance: float ) -> dict[str, float]: """ Apply Coulomb's Law on any three given values. These can be force, charge1, charge2, or distance, and then in a Python dict return name/value pair of the zero value. Coulomb's Law states that the magnitude of the electrostatic force of attraction or repulsion between two point charges is directly proportional to the product of the magnitudes of charges and inversely proportional to the square of the distance between them. Reference ---------- Coulomb (1785) "Premier mémoire sur l'électricité et le magnétisme," Histoire de l'Académie Royale des Sciences, pp. 569-577. Parameters ---------- force : float with units in Newtons charge1 : float with units in Coulombs charge2 : float with units in Coulombs distance : float with units in meters Returns ------- result : dict name/value pair of the zero value >>> couloumbs_law(force=0, charge1=3, charge2=5, distance=2000) {'force': 33705.0} >>> couloumbs_law(force=10, charge1=3, charge2=5, distance=0) {'distance': 116112.01488218177} >>> couloumbs_law(force=10, charge1=0, charge2=5, distance=2000) {'charge1': 0.0008900756564307966} >>> couloumbs_law(force=0, charge1=0, charge2=5, distance=2000) Traceback (most recent call last): ... ValueError: One and only one argument must be 0 >>> couloumbs_law(force=0, charge1=3, charge2=5, distance=-2000) Traceback (most recent call last): ... ValueError: Distance cannot be negative """ charge_product = abs(charge1 * charge2) if (force, charge1, charge2, distance).count(0) != 1: raise ValueError("One and only one argument must be 0") if distance < 0: raise ValueError("Distance cannot be negative") if force == 0: force = COULOMBS_CONSTANT * charge_product / (distance**2) return {"force": force} elif charge1 == 0: charge1 = abs(force) * (distance**2) / (COULOMBS_CONSTANT * charge2) return {"charge1": charge1} elif charge2 == 0: charge2 = abs(force) * (distance**2) / (COULOMBS_CONSTANT * charge1) return {"charge2": charge2} elif distance == 0: distance = (COULOMBS_CONSTANT * charge_product / abs(force)) ** 0.5 return {"distance": distance} raise ValueError("Exactly one argument must be 0") if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: electronics/electric_conductivity.py ================================================ from __future__ import annotations ELECTRON_CHARGE = 1.6021e-19 # units = C def electric_conductivity( conductivity: float, electron_conc: float, mobility: float, ) -> tuple[str, float]: """ This function can calculate any one of the three - 1. Conductivity 2. Electron Concentration 3. Electron Mobility This is calculated from the other two provided values Examples - >>> electric_conductivity(conductivity=25, electron_conc=100, mobility=0) ('mobility', 1.5604519068722301e+18) >>> electric_conductivity(conductivity=0, electron_conc=1600, mobility=200) ('conductivity', 5.12672e-14) >>> electric_conductivity(conductivity=1000, electron_conc=0, mobility=1200) ('electron_conc', 5.201506356240767e+18) >>> electric_conductivity(conductivity=-10, electron_conc=100, mobility=0) Traceback (most recent call last): ... ValueError: Conductivity cannot be negative >>> electric_conductivity(conductivity=50, electron_conc=-10, mobility=0) Traceback (most recent call last): ... ValueError: Electron concentration cannot be negative >>> electric_conductivity(conductivity=50, electron_conc=0, mobility=-10) Traceback (most recent call last): ... ValueError: mobility cannot be negative >>> electric_conductivity(conductivity=50, electron_conc=0, mobility=0) Traceback (most recent call last): ... ValueError: You cannot supply more or less than 2 values >>> electric_conductivity(conductivity=50, electron_conc=200, mobility=300) Traceback (most recent call last): ... ValueError: You cannot supply more or less than 2 values """ if (conductivity, electron_conc, mobility).count(0) != 1: raise ValueError("You cannot supply more or less than 2 values") elif conductivity < 0: raise ValueError("Conductivity cannot be negative") elif electron_conc < 0: raise ValueError("Electron concentration cannot be negative") elif mobility < 0: raise ValueError("mobility cannot be negative") elif conductivity == 0: return ( "conductivity", mobility * electron_conc * ELECTRON_CHARGE, ) elif electron_conc == 0: return ( "electron_conc", conductivity / (mobility * ELECTRON_CHARGE), ) else: return ( "mobility", conductivity / (electron_conc * ELECTRON_CHARGE), ) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: electronics/electric_power.py ================================================ # https://en.m.wikipedia.org/wiki/Electric_power from __future__ import annotations from typing import NamedTuple class Result(NamedTuple): name: str value: float def electric_power(voltage: float, current: float, power: float) -> tuple: """ This function can calculate any one of the three (voltage, current, power), fundamental value of electrical system. examples are below: >>> electric_power(voltage=0, current=2, power=5) Result(name='voltage', value=2.5) >>> electric_power(voltage=2, current=2, power=0) Result(name='power', value=4.0) >>> electric_power(voltage=-2, current=3, power=0) Result(name='power', value=6.0) >>> electric_power(voltage=2, current=4, power=2) Traceback (most recent call last): ... ValueError: Exactly one argument must be 0 >>> electric_power(voltage=0, current=0, power=2) Traceback (most recent call last): ... ValueError: Exactly one argument must be 0 >>> electric_power(voltage=0, current=2, power=-4) Traceback (most recent call last): ... ValueError: Power cannot be negative in any electrical/electronics system >>> electric_power(voltage=2.2, current=2.2, power=0) Result(name='power', value=4.84) >>> electric_power(current=0, power=6, voltage=2) Result(name='current', value=3.0) """ if (voltage, current, power).count(0) != 1: raise ValueError("Exactly one argument must be 0") elif power < 0: raise ValueError( "Power cannot be negative in any electrical/electronics system" ) elif voltage == 0: return Result("voltage", power / current) elif current == 0: return Result("current", power / voltage) elif power == 0: return Result("power", float(round(abs(voltage * current), 2))) else: raise AssertionError if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: electronics/electrical_impedance.py ================================================ """Electrical impedance is the measure of the opposition that a circuit presents to a current when a voltage is applied. Impedance extends the concept of resistance to alternating current (AC) circuits. Source: https://en.wikipedia.org/wiki/Electrical_impedance """ from __future__ import annotations from math import pow, sqrt # noqa: A004 def electrical_impedance( resistance: float, reactance: float, impedance: float ) -> dict[str, float]: """ Apply Electrical Impedance formula, on any two given electrical values, which can be resistance, reactance, and impedance, and then in a Python dict return name/value pair of the zero value. >>> electrical_impedance(3,4,0) {'impedance': 5.0} >>> electrical_impedance(0,4,5) {'resistance': 3.0} >>> electrical_impedance(3,0,5) {'reactance': 4.0} >>> electrical_impedance(3,4,5) Traceback (most recent call last): ... ValueError: One and only one argument must be 0 """ if (resistance, reactance, impedance).count(0) != 1: raise ValueError("One and only one argument must be 0") if resistance == 0: return {"resistance": sqrt(pow(impedance, 2) - pow(reactance, 2))} elif reactance == 0: return {"reactance": sqrt(pow(impedance, 2) - pow(resistance, 2))} elif impedance == 0: return {"impedance": sqrt(pow(resistance, 2) + pow(reactance, 2))} else: raise ValueError("Exactly one argument must be 0") if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: electronics/ic_555_timer.py ================================================ from __future__ import annotations """ Calculate the frequency and/or duty cycle of an astable 555 timer. * https://en.wikipedia.org/wiki/555_timer_IC#Astable These functions take in the value of the external resistances (in ohms) and capacitance (in Microfarad), and calculates the following: ------------------------------------- | Freq = 1.44 /[( R1+ 2 x R2) x C1] | ... in Hz ------------------------------------- where Freq is the frequency, R1 is the first resistance in ohms, R2 is the second resistance in ohms, C1 is the capacitance in Microfarads. ------------------------------------------------ | Duty Cycle = (R1 + R2) / (R1 + 2 x R2) x 100 | ... in % ------------------------------------------------ where R1 is the first resistance in ohms, R2 is the second resistance in ohms. """ def astable_frequency( resistance_1: float, resistance_2: float, capacitance: float ) -> float: """ Usage examples: >>> astable_frequency(resistance_1=45, resistance_2=45, capacitance=7) 1523.8095238095239 >>> astable_frequency(resistance_1=356, resistance_2=234, capacitance=976) 1.7905459175553078 >>> astable_frequency(resistance_1=2, resistance_2=-1, capacitance=2) Traceback (most recent call last): ... ValueError: All values must be positive >>> astable_frequency(resistance_1=45, resistance_2=45, capacitance=0) Traceback (most recent call last): ... ValueError: All values must be positive """ if resistance_1 <= 0 or resistance_2 <= 0 or capacitance <= 0: raise ValueError("All values must be positive") return (1.44 / ((resistance_1 + 2 * resistance_2) * capacitance)) * 10**6 def astable_duty_cycle(resistance_1: float, resistance_2: float) -> float: """ Usage examples: >>> astable_duty_cycle(resistance_1=45, resistance_2=45) 66.66666666666666 >>> astable_duty_cycle(resistance_1=356, resistance_2=234) 71.60194174757282 >>> astable_duty_cycle(resistance_1=2, resistance_2=-1) Traceback (most recent call last): ... ValueError: All values must be positive >>> astable_duty_cycle(resistance_1=0, resistance_2=0) Traceback (most recent call last): ... ValueError: All values must be positive """ if resistance_1 <= 0 or resistance_2 <= 0: raise ValueError("All values must be positive") return (resistance_1 + resistance_2) / (resistance_1 + 2 * resistance_2) * 100 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: electronics/ind_reactance.py ================================================ # https://en.wikipedia.org/wiki/Electrical_reactance#Inductive_reactance from __future__ import annotations from math import pi def ind_reactance( inductance: float, frequency: float, reactance: float ) -> dict[str, float]: """ Calculate inductive reactance, frequency or inductance from two given electrical properties then return name/value pair of the zero value in a Python dict. Parameters ---------- inductance : float with units in Henries frequency : float with units in Hertz reactance : float with units in Ohms >>> ind_reactance(-35e-6, 1e3, 0) Traceback (most recent call last): ... ValueError: Inductance cannot be negative >>> ind_reactance(35e-6, -1e3, 0) Traceback (most recent call last): ... ValueError: Frequency cannot be negative >>> ind_reactance(35e-6, 0, -1) Traceback (most recent call last): ... ValueError: Inductive reactance cannot be negative >>> ind_reactance(0, 10e3, 50) {'inductance': 0.0007957747154594767} >>> ind_reactance(35e-3, 0, 50) {'frequency': 227.36420441699332} >>> ind_reactance(35e-6, 1e3, 0) {'reactance': 0.2199114857512855} """ if (inductance, frequency, reactance).count(0) != 1: raise ValueError("One and only one argument must be 0") if inductance < 0: raise ValueError("Inductance cannot be negative") if frequency < 0: raise ValueError("Frequency cannot be negative") if reactance < 0: raise ValueError("Inductive reactance cannot be negative") if inductance == 0: return {"inductance": reactance / (2 * pi * frequency)} elif frequency == 0: return {"frequency": reactance / (2 * pi * inductance)} elif reactance == 0: return {"reactance": 2 * pi * frequency * inductance} else: raise ValueError("Exactly one argument must be 0") if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: electronics/ohms_law.py ================================================ # https://en.wikipedia.org/wiki/Ohm%27s_law from __future__ import annotations def ohms_law(voltage: float, current: float, resistance: float) -> dict[str, float]: """ Apply Ohm's Law, on any two given electrical values, which can be voltage, current, and resistance, and then in a Python dict return name/value pair of the zero value. >>> ohms_law(voltage=10, resistance=5, current=0) {'current': 2.0} >>> ohms_law(voltage=0, current=0, resistance=10) Traceback (most recent call last): ... ValueError: One and only one argument must be 0 >>> ohms_law(voltage=0, current=1, resistance=-2) Traceback (most recent call last): ... ValueError: Resistance cannot be negative >>> ohms_law(resistance=0, voltage=-10, current=1) {'resistance': -10.0} >>> ohms_law(voltage=0, current=-1.5, resistance=2) {'voltage': -3.0} """ if (voltage, current, resistance).count(0) != 1: raise ValueError("One and only one argument must be 0") if resistance < 0: raise ValueError("Resistance cannot be negative") if voltage == 0: return {"voltage": float(current * resistance)} elif current == 0: return {"current": voltage / resistance} elif resistance == 0: return {"resistance": voltage / current} else: raise ValueError("Exactly one argument must be 0") if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: electronics/real_and_reactive_power.py ================================================ import math def real_power(apparent_power: float, power_factor: float) -> float: """ Calculate real power from apparent power and power factor. Examples: >>> real_power(100, 0.9) 90.0 >>> real_power(0, 0.8) 0.0 >>> real_power(100, -0.9) -90.0 """ if ( not isinstance(power_factor, (int, float)) or power_factor < -1 or power_factor > 1 ): raise ValueError("power_factor must be a valid float value between -1 and 1.") return apparent_power * power_factor def reactive_power(apparent_power: float, power_factor: float) -> float: """ Calculate reactive power from apparent power and power factor. Examples: >>> reactive_power(100, 0.9) 43.58898943540673 >>> reactive_power(0, 0.8) 0.0 >>> reactive_power(100, -0.9) 43.58898943540673 """ if ( not isinstance(power_factor, (int, float)) or power_factor < -1 or power_factor > 1 ): raise ValueError("power_factor must be a valid float value between -1 and 1.") return apparent_power * math.sqrt(1 - power_factor**2) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: electronics/resistor_color_code.py ================================================ """ Title : Calculating the resistance of a n band resistor using the color codes Description : Resistors resist the flow of electrical current.Each one has a value that tells how strongly it resists current flow.This value's unit is the ohm, often noted with the Greek letter omega: Ω. The colored bands on a resistor can tell you everything you need to know about its value and tolerance, as long as you understand how to read them. The order in which the colors are arranged is very important, and each value of resistor has its own unique combination. The color coding for resistors is an international standard that is defined in IEC 60062. The number of bands present in a resistor varies from three to six. These represent significant figures, multiplier, tolerance, reliability, and temperature coefficient Each color used for a type of band has a value assigned to it. It is read from left to right. All resistors will have significant figures and multiplier bands. In a three band resistor first two bands from the left represent significant figures and the third represents the multiplier band. Significant figures - The number of significant figures band in a resistor can vary from two to three. Colors and values associated with significant figure bands - (Black = 0, Brown = 1, Red = 2, Orange = 3, Yellow = 4, Green = 5, Blue = 6, Violet = 7, Grey = 8, White = 9) Multiplier - There will be one multiplier band in a resistor. It is multiplied with the significant figures obtained from previous bands. Colors and values associated with multiplier band - (Black = 100, Brown = 10^1, Red = 10^2, Orange = 10^3, Yellow = 10^4, Green = 10^5, Blue = 10^6, Violet = 10^7, Grey = 10^8, White = 10^9, Gold = 10^-1, Silver = 10^-2) Note that multiplier bands use Gold and Silver which are not used for significant figure bands. Tolerance - The tolerance band is not always present. It can be seen in four band resistors and above. This is a percentage by which the resistor value can vary. Colors and values associated with tolerance band - (Brown = 1%, Red = 2%, Orange = 0.05%, Yellow = 0.02%, Green = 0.5%,Blue = 0.25%, Violet = 0.1%, Grey = 0.01%, Gold = 5%, Silver = 10%) If no color is mentioned then by default tolerance is 20% Note that tolerance band does not use Black and White colors. Temperature Coeffecient - Indicates the change in resistance of the component as a function of ambient temperature in terms of ppm/K. It is present in six band resistors. Colors and values associated with Temperature coeffecient - (Black = 250 ppm/K, Brown = 100 ppm/K, Red = 50 ppm/K, Orange = 15 ppm/K, Yellow = 25 ppm/K, Green = 20 ppm/K, Blue = 10 ppm/K, Violet = 5 ppm/K, Grey = 1 ppm/K) Note that temperature coeffecient band does not use White, Gold, Silver colors. Sources : https://www.calculator.net/resistor-calculator.html https://learn.parallax.com/support/reference/resistor-color-codes https://byjus.com/physics/resistor-colour-codes/ """ valid_colors: list = [ "Black", "Brown", "Red", "Orange", "Yellow", "Green", "Blue", "Violet", "Grey", "White", "Gold", "Silver", ] significant_figures_color_values: dict[str, int] = { "Black": 0, "Brown": 1, "Red": 2, "Orange": 3, "Yellow": 4, "Green": 5, "Blue": 6, "Violet": 7, "Grey": 8, "White": 9, } multiplier_color_values: dict[str, float] = { "Black": 10**0, "Brown": 10**1, "Red": 10**2, "Orange": 10**3, "Yellow": 10**4, "Green": 10**5, "Blue": 10**6, "Violet": 10**7, "Grey": 10**8, "White": 10**9, "Gold": 10**-1, "Silver": 10**-2, } tolerance_color_values: dict[str, float] = { "Brown": 1, "Red": 2, "Orange": 0.05, "Yellow": 0.02, "Green": 0.5, "Blue": 0.25, "Violet": 0.1, "Grey": 0.01, "Gold": 5, "Silver": 10, } temperature_coeffecient_color_values: dict[str, int] = { "Black": 250, "Brown": 100, "Red": 50, "Orange": 15, "Yellow": 25, "Green": 20, "Blue": 10, "Violet": 5, "Grey": 1, } band_types: dict[int, dict[str, int]] = { 3: {"significant": 2, "multiplier": 1}, 4: {"significant": 2, "multiplier": 1, "tolerance": 1}, 5: {"significant": 3, "multiplier": 1, "tolerance": 1}, 6: {"significant": 3, "multiplier": 1, "tolerance": 1, "temp_coeffecient": 1}, } def get_significant_digits(colors: list) -> str: """ Function returns the digit associated with the color. Function takes a list containing colors as input and returns digits as string >>> get_significant_digits(['Black','Blue']) '06' >>> get_significant_digits(['Aqua','Blue']) Traceback (most recent call last): ... ValueError: Aqua is not a valid color for significant figure bands """ digit = "" for color in colors: if color not in significant_figures_color_values: msg = f"{color} is not a valid color for significant figure bands" raise ValueError(msg) digit = digit + str(significant_figures_color_values[color]) return str(digit) def get_multiplier(color: str) -> float: """ Function returns the multiplier value associated with the color. Function takes color as input and returns multiplier value >>> get_multiplier('Gold') 0.1 >>> get_multiplier('Ivory') Traceback (most recent call last): ... ValueError: Ivory is not a valid color for multiplier band """ if color not in multiplier_color_values: msg = f"{color} is not a valid color for multiplier band" raise ValueError(msg) return multiplier_color_values[color] def get_tolerance(color: str) -> float: """ Function returns the tolerance value associated with the color. Function takes color as input and returns tolerance value. >>> get_tolerance('Green') 0.5 >>> get_tolerance('Indigo') Traceback (most recent call last): ... ValueError: Indigo is not a valid color for tolerance band """ if color not in tolerance_color_values: msg = f"{color} is not a valid color for tolerance band" raise ValueError(msg) return tolerance_color_values[color] def get_temperature_coeffecient(color: str) -> int: """ Function returns the temperature coeffecient value associated with the color. Function takes color as input and returns temperature coeffecient value. >>> get_temperature_coeffecient('Yellow') 25 >>> get_temperature_coeffecient('Cyan') Traceback (most recent call last): ... ValueError: Cyan is not a valid color for temperature coeffecient band """ if color not in temperature_coeffecient_color_values: msg = f"{color} is not a valid color for temperature coeffecient band" raise ValueError(msg) return temperature_coeffecient_color_values[color] def get_band_type_count(total_number_of_bands: int, type_of_band: str) -> int: """ Function returns the number of bands of a given type in a resistor with n bands Function takes total_number_of_bands and type_of_band as input and returns number of bands belonging to that type in the given resistor >>> get_band_type_count(3,'significant') 2 >>> get_band_type_count(2,'significant') Traceback (most recent call last): ... ValueError: 2 is not a valid number of bands >>> get_band_type_count(3,'sign') Traceback (most recent call last): ... ValueError: sign is not valid for a 3 band resistor >>> get_band_type_count(3,'tolerance') Traceback (most recent call last): ... ValueError: tolerance is not valid for a 3 band resistor >>> get_band_type_count(5,'temp_coeffecient') Traceback (most recent call last): ... ValueError: temp_coeffecient is not valid for a 5 band resistor """ if total_number_of_bands not in band_types: msg = f"{total_number_of_bands} is not a valid number of bands" raise ValueError(msg) if type_of_band not in band_types[total_number_of_bands]: msg = f"{type_of_band} is not valid for a {total_number_of_bands} band resistor" raise ValueError(msg) return band_types[total_number_of_bands][type_of_band] def check_validity(number_of_bands: int, colors: list) -> bool: """ Function checks if the input provided is valid or not. Function takes number_of_bands and colors as input and returns True if it is valid >>> check_validity(3, ["Black","Blue","Orange"]) True >>> check_validity(4, ["Black","Blue","Orange"]) Traceback (most recent call last): ... ValueError: Expecting 4 colors, provided 3 colors >>> check_validity(3, ["Cyan","Red","Yellow"]) Traceback (most recent call last): ... ValueError: Cyan is not a valid color """ if number_of_bands >= 3 and number_of_bands <= 6: if number_of_bands == len(colors): for color in colors: if color not in valid_colors: msg = f"{color} is not a valid color" raise ValueError(msg) return True else: msg = f"Expecting {number_of_bands} colors, provided {len(colors)} colors" raise ValueError(msg) else: msg = "Invalid number of bands. Resistor bands must be 3 to 6" raise ValueError(msg) def calculate_resistance(number_of_bands: int, color_code_list: list) -> dict: """ Function calculates the total resistance of the resistor using the color codes. Function takes number_of_bands, color_code_list as input and returns resistance >>> calculate_resistance(3, ["Black","Blue","Orange"]) {'resistance': '6000Ω ±20% '} >>> calculate_resistance(4, ["Orange","Green","Blue","Gold"]) {'resistance': '35000000Ω ±5% '} >>> calculate_resistance(5, ["Violet","Brown","Grey","Silver","Green"]) {'resistance': '7.18Ω ±0.5% '} >>> calculate_resistance(6, ["Red","Green","Blue","Yellow","Orange","Grey"]) {'resistance': '2560000Ω ±0.05% 1 ppm/K'} >>> calculate_resistance(0, ["Violet","Brown","Grey","Silver","Green"]) Traceback (most recent call last): ... ValueError: Invalid number of bands. Resistor bands must be 3 to 6 >>> calculate_resistance(4, ["Violet","Brown","Grey","Silver","Green"]) Traceback (most recent call last): ... ValueError: Expecting 4 colors, provided 5 colors >>> calculate_resistance(4, ["Violet","Silver","Brown","Grey"]) Traceback (most recent call last): ... ValueError: Silver is not a valid color for significant figure bands >>> calculate_resistance(4, ["Violet","Blue","Lime","Grey"]) Traceback (most recent call last): ... ValueError: Lime is not a valid color """ is_valid = check_validity(number_of_bands, color_code_list) if is_valid: number_of_significant_bands = get_band_type_count( number_of_bands, "significant" ) significant_colors = color_code_list[:number_of_significant_bands] significant_digits = int(get_significant_digits(significant_colors)) multiplier_color = color_code_list[number_of_significant_bands] multiplier = get_multiplier(multiplier_color) if number_of_bands == 3: tolerance_color = None else: tolerance_color = color_code_list[number_of_significant_bands + 1] tolerance = ( 20 if tolerance_color is None else get_tolerance(str(tolerance_color)) ) if number_of_bands != 6: temperature_coeffecient_color = None else: temperature_coeffecient_color = color_code_list[ number_of_significant_bands + 2 ] temperature_coeffecient = ( 0 if temperature_coeffecient_color is None else get_temperature_coeffecient(str(temperature_coeffecient_color)) ) resisitance = significant_digits * multiplier if temperature_coeffecient == 0: answer = f"{resisitance}Ω ±{tolerance}% " else: answer = f"{resisitance}Ω ±{tolerance}% {temperature_coeffecient} ppm/K" return {"resistance": answer} else: raise ValueError("Input is invalid") if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: electronics/resistor_equivalence.py ================================================ # https://byjus.com/equivalent-resistance-formula/ from __future__ import annotations def resistor_parallel(resistors: list[float]) -> float: """ Req = 1/ (1/R1 + 1/R2 + ... + 1/Rn) >>> resistor_parallel([3.21389, 2, 3]) 0.8737571620498019 >>> resistor_parallel([3.21389, 2, -3]) Traceback (most recent call last): ... ValueError: Resistor at index 2 has a negative or zero value! >>> resistor_parallel([3.21389, 2, 0.000]) Traceback (most recent call last): ... ValueError: Resistor at index 2 has a negative or zero value! """ first_sum = 0.00 for index, resistor in enumerate(resistors): if resistor <= 0: msg = f"Resistor at index {index} has a negative or zero value!" raise ValueError(msg) first_sum += 1 / float(resistor) return 1 / first_sum def resistor_series(resistors: list[float]) -> float: """ Req = R1 + R2 + ... + Rn Calculate the equivalent resistance for any number of resistors in parallel. >>> resistor_series([3.21389, 2, 3]) 8.21389 >>> resistor_series([3.21389, 2, -3]) Traceback (most recent call last): ... ValueError: Resistor at index 2 has a negative value! """ sum_r = 0.00 for index, resistor in enumerate(resistors): sum_r += resistor if resistor < 0: msg = f"Resistor at index {index} has a negative value!" raise ValueError(msg) return sum_r if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: electronics/resonant_frequency.py ================================================ # https://en.wikipedia.org/wiki/LC_circuit """An LC circuit, also called a resonant circuit, tank circuit, or tuned circuit, is an electric circuit consisting of an inductor, represented by the letter L, and a capacitor, represented by the letter C, connected together. The circuit can act as an electrical resonator, an electrical analogue of a tuning fork, storing energy oscillating at the circuit's resonant frequency. Source: https://en.wikipedia.org/wiki/LC_circuit """ from __future__ import annotations from math import pi, sqrt def resonant_frequency(inductance: float, capacitance: float) -> tuple: """ This function can calculate the resonant frequency of LC circuit, for the given value of inductance and capacitnace. Examples are given below: >>> resonant_frequency(inductance=10, capacitance=5) ('Resonant frequency', 0.022507907903927652) >>> resonant_frequency(inductance=0, capacitance=5) Traceback (most recent call last): ... ValueError: Inductance cannot be 0 or negative >>> resonant_frequency(inductance=10, capacitance=0) Traceback (most recent call last): ... ValueError: Capacitance cannot be 0 or negative """ if inductance <= 0: raise ValueError("Inductance cannot be 0 or negative") elif capacitance <= 0: raise ValueError("Capacitance cannot be 0 or negative") else: return ( "Resonant frequency", float(1 / (2 * pi * (sqrt(inductance * capacitance)))), ) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: electronics/wheatstone_bridge.py ================================================ # https://en.wikipedia.org/wiki/Wheatstone_bridge from __future__ import annotations def wheatstone_solver( resistance_1: float, resistance_2: float, resistance_3: float ) -> float: """ This function can calculate the unknown resistance in an wheatstone network, given that the three other resistances in the network are known. The formula to calculate the same is: --------------- |Rx=(R2/R1)*R3| --------------- Usage examples: >>> wheatstone_solver(resistance_1=2, resistance_2=4, resistance_3=5) 10.0 >>> wheatstone_solver(resistance_1=356, resistance_2=234, resistance_3=976) 641.5280898876405 >>> wheatstone_solver(resistance_1=2, resistance_2=-1, resistance_3=2) Traceback (most recent call last): ... ValueError: All resistance values must be positive >>> wheatstone_solver(resistance_1=0, resistance_2=0, resistance_3=2) Traceback (most recent call last): ... ValueError: All resistance values must be positive """ if resistance_1 <= 0 or resistance_2 <= 0 or resistance_3 <= 0: raise ValueError("All resistance values must be positive") else: return float((resistance_2 / resistance_1) * resistance_3) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: file_transfer/__init__.py ================================================ ================================================ FILE: file_transfer/mytext.txt ================================================ Hello This is sample data «küßî» “ЌύБЇ” 😀😉 😋 ================================================ FILE: file_transfer/receive_file.py ================================================ import socket def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) host = socket.gethostname() port = 12312 sock.connect((host, port)) sock.send(b"Hello server!") with open("Received_file", "wb") as out_file: print("File opened") print("Receiving data...") while True: data = sock.recv(1024) if not data: break out_file.write(data) print("Successfully received the file") sock.close() print("Connection closed") if __name__ == "__main__": main() ================================================ FILE: file_transfer/send_file.py ================================================ def send_file(filename: str = "mytext.txt", testing: bool = False) -> None: import socket port = 12312 # Reserve a port for your service. sock = socket.socket() # Create a socket object host = socket.gethostname() # Get local machine name sock.bind((host, port)) # Bind to the port sock.listen(5) # Now wait for client connection. print("Server listening....") while True: conn, addr = sock.accept() # Establish connection with client. print(f"Got connection from {addr}") data = conn.recv(1024) print(f"Server received: {data = }") with open(filename, "rb") as in_file: data = in_file.read(1024) while data: conn.send(data) print(f"Sent {data!r}") data = in_file.read(1024) print("Done sending") conn.close() if testing: # Allow the test to complete break sock.shutdown(1) sock.close() if __name__ == "__main__": send_file() ================================================ FILE: file_transfer/tests/__init__.py ================================================ ================================================ FILE: file_transfer/tests/test_send_file.py ================================================ from unittest.mock import Mock, patch from file_transfer.send_file import send_file @patch("socket.socket") @patch("builtins.open") def test_send_file_running_as_expected(file, sock): # ===== initialization ===== conn = Mock() sock.return_value.accept.return_value = conn, Mock() f = iter([1, None]) file.return_value.__enter__.return_value.read.side_effect = lambda _: next(f) # ===== invoke ===== send_file(filename="mytext.txt", testing=True) # ===== ensurance ===== sock.assert_called_once() sock.return_value.bind.assert_called_once() sock.return_value.listen.assert_called_once() sock.return_value.accept.assert_called_once() conn.recv.assert_called_once() file.return_value.__enter__.assert_called_once() file.return_value.__enter__.return_value.read.assert_called() conn.send.assert_called_once() conn.close.assert_called_once() sock.return_value.shutdown.assert_called_once() sock.return_value.close.assert_called_once() ================================================ FILE: financial/README.md ================================================ # Interest * Compound Interest: "Compound interest is calculated by multiplying the initial principal amount by one plus the annual interest rate raised to the number of compound periods minus one." [Compound Interest](https://www.investopedia.com/) * Simple Interest: "Simple interest paid or received over a certain period is a fixed percentage of the principal amount that was borrowed or lent. " [Simple Interest](https://www.investopedia.com/) ================================================ FILE: financial/__init__.py ================================================ ================================================ FILE: financial/equated_monthly_installments.py ================================================ """ Program to calculate the amortization amount per month, given - Principal borrowed - Rate of interest per annum - Years to repay the loan Wikipedia Reference: https://en.wikipedia.org/wiki/Equated_monthly_installment """ def equated_monthly_installments( principal: float, rate_per_annum: float, years_to_repay: int ) -> float: """ Formula for amortization amount per month: A = p * r * (1 + r)^n / ((1 + r)^n - 1) where p is the principal, r is the rate of interest per month and n is the number of payments >>> equated_monthly_installments(25000, 0.12, 3) 830.3577453212793 >>> equated_monthly_installments(25000, 0.12, 10) 358.67737100646826 >>> equated_monthly_installments(0, 0.12, 3) Traceback (most recent call last): ... Exception: Principal borrowed must be > 0 >>> equated_monthly_installments(25000, -1, 3) Traceback (most recent call last): ... Exception: Rate of interest must be >= 0 >>> equated_monthly_installments(25000, 0.12, 0) Traceback (most recent call last): ... Exception: Years to repay must be an integer > 0 """ if principal <= 0: raise Exception("Principal borrowed must be > 0") if rate_per_annum < 0: raise Exception("Rate of interest must be >= 0") if years_to_repay <= 0 or not isinstance(years_to_repay, int): raise Exception("Years to repay must be an integer > 0") # Yearly rate is divided by 12 to get monthly rate rate_per_month = rate_per_annum / 12 # Years to repay is multiplied by 12 to get number of payments as payment is monthly number_of_payments = years_to_repay * 12 return ( principal * rate_per_month * (1 + rate_per_month) ** number_of_payments / ((1 + rate_per_month) ** number_of_payments - 1) ) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: financial/exponential_moving_average.py ================================================ """ Calculate the exponential moving average (EMA) on the series of stock prices. Wikipedia Reference: https://en.wikipedia.org/wiki/Exponential_smoothing https://www.investopedia.com/terms/e/ema.asp#toc-what-is-an-exponential -moving-average-ema Exponential moving average is used in finance to analyze changes stock prices. EMA is used in conjunction with Simple moving average (SMA), EMA reacts to the changes in the value quicker than SMA, which is one of the advantages of using EMA. """ from collections.abc import Iterator def exponential_moving_average( stock_prices: Iterator[float], window_size: int ) -> Iterator[float]: """ Yields exponential moving averages of the given stock prices. >>> tuple(exponential_moving_average(iter([2, 5, 3, 8.2, 6, 9, 10]), 3)) (2, 3.5, 3.25, 5.725, 5.8625, 7.43125, 8.715625) :param stock_prices: A stream of stock prices :param window_size: The number of stock prices that will trigger a new calculation of the exponential average (window_size > 0) :return: Yields a sequence of exponential moving averages Formula: st = alpha * xt + (1 - alpha) * st_prev Where, st : Exponential moving average at timestamp t xt : stock price in from the stock prices at timestamp t st_prev : Exponential moving average at timestamp t-1 alpha : 2/(1 + window_size) - smoothing factor Exponential moving average (EMA) is a rule of thumb technique for smoothing time series data using an exponential window function. """ if window_size <= 0: raise ValueError("window_size must be > 0") # Calculating smoothing factor alpha = 2 / (1 + window_size) # Exponential average at timestamp t moving_average = 0.0 for i, stock_price in enumerate(stock_prices): if i <= window_size: # Assigning simple moving average till the window_size for the first time # is reached moving_average = (moving_average + stock_price) * 0.5 if i else stock_price else: # Calculating exponential moving average based on current timestamp data # point and previous exponential average value moving_average = (alpha * stock_price) + ((1 - alpha) * moving_average) yield moving_average if __name__ == "__main__": import doctest doctest.testmod() stock_prices = [2.0, 5, 3, 8.2, 6, 9, 10] window_size = 3 result = tuple(exponential_moving_average(iter(stock_prices), window_size)) print(f"{stock_prices = }") print(f"{window_size = }") print(f"{result = }") ================================================ FILE: financial/interest.py ================================================ # https://www.investopedia.com from __future__ import annotations def simple_interest( principal: float, daily_interest_rate: float, days_between_payments: float ) -> float: """ >>> simple_interest(18000.0, 0.06, 3) 3240.0 >>> simple_interest(0.5, 0.06, 3) 0.09 >>> simple_interest(18000.0, 0.01, 10) 1800.0 >>> simple_interest(18000.0, 0.0, 3) 0.0 >>> simple_interest(5500.0, 0.01, 100) 5500.0 >>> simple_interest(10000.0, -0.06, 3) Traceback (most recent call last): ... ValueError: daily_interest_rate must be >= 0 >>> simple_interest(-10000.0, 0.06, 3) Traceback (most recent call last): ... ValueError: principal must be > 0 >>> simple_interest(5500.0, 0.01, -5) Traceback (most recent call last): ... ValueError: days_between_payments must be > 0 """ if days_between_payments <= 0: raise ValueError("days_between_payments must be > 0") if daily_interest_rate < 0: raise ValueError("daily_interest_rate must be >= 0") if principal <= 0: raise ValueError("principal must be > 0") return principal * daily_interest_rate * days_between_payments def compound_interest( principal: float, nominal_annual_interest_rate_percentage: float, number_of_compounding_periods: float, ) -> float: """ >>> compound_interest(10000.0, 0.05, 3) 1576.2500000000014 >>> compound_interest(10000.0, 0.05, 1) 500.00000000000045 >>> compound_interest(0.5, 0.05, 3) 0.07881250000000006 >>> compound_interest(10000.0, 0.06, -4) Traceback (most recent call last): ... ValueError: number_of_compounding_periods must be > 0 >>> compound_interest(10000.0, -3.5, 3.0) Traceback (most recent call last): ... ValueError: nominal_annual_interest_rate_percentage must be >= 0 >>> compound_interest(-5500.0, 0.01, 5) Traceback (most recent call last): ... ValueError: principal must be > 0 """ if number_of_compounding_periods <= 0: raise ValueError("number_of_compounding_periods must be > 0") if nominal_annual_interest_rate_percentage < 0: raise ValueError("nominal_annual_interest_rate_percentage must be >= 0") if principal <= 0: raise ValueError("principal must be > 0") return principal * ( (1 + nominal_annual_interest_rate_percentage) ** number_of_compounding_periods - 1 ) def apr_interest( principal: float, nominal_annual_percentage_rate: float, number_of_years: float, ) -> float: """ >>> apr_interest(10000.0, 0.05, 3) 1618.223072263547 >>> apr_interest(10000.0, 0.05, 1) 512.6749646744732 >>> apr_interest(0.5, 0.05, 3) 0.08091115361317736 >>> apr_interest(10000.0, 0.06, -4) Traceback (most recent call last): ... ValueError: number_of_years must be > 0 >>> apr_interest(10000.0, -3.5, 3.0) Traceback (most recent call last): ... ValueError: nominal_annual_percentage_rate must be >= 0 >>> apr_interest(-5500.0, 0.01, 5) Traceback (most recent call last): ... ValueError: principal must be > 0 """ if number_of_years <= 0: raise ValueError("number_of_years must be > 0") if nominal_annual_percentage_rate < 0: raise ValueError("nominal_annual_percentage_rate must be >= 0") if principal <= 0: raise ValueError("principal must be > 0") return compound_interest( principal, nominal_annual_percentage_rate / 365, number_of_years * 365 ) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: financial/present_value.py ================================================ """ Reference: https://www.investopedia.com/terms/p/presentvalue.asp An algorithm that calculates the present value of a stream of yearly cash flows given... 1. The discount rate (as a decimal, not a percent) 2. An array of cash flows, with the index of the cash flow being the associated year Note: This algorithm assumes that cash flows are paid at the end of the specified year """ def present_value(discount_rate: float, cash_flows: list[float]) -> float: """ >>> present_value(0.13, [10, 20.70, -293, 297]) 4.69 >>> present_value(0.07, [-109129.39, 30923.23, 15098.93, 29734,39]) -42739.63 >>> present_value(0.07, [109129.39, 30923.23, 15098.93, 29734,39]) 175519.15 >>> present_value(-1, [109129.39, 30923.23, 15098.93, 29734,39]) Traceback (most recent call last): ... ValueError: Discount rate cannot be negative >>> present_value(0.03, []) Traceback (most recent call last): ... ValueError: Cash flows list cannot be empty """ if discount_rate < 0: raise ValueError("Discount rate cannot be negative") if not cash_flows: raise ValueError("Cash flows list cannot be empty") present_value = sum( cash_flow / ((1 + discount_rate) ** i) for i, cash_flow in enumerate(cash_flows) ) return round(present_value, ndigits=2) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: financial/price_plus_tax.py ================================================ """ Calculate price plus tax of a good or service given its price and a tax rate. """ def price_plus_tax(price: float, tax_rate: float) -> float: """ >>> price_plus_tax(100, 0.25) 125.0 >>> price_plus_tax(125.50, 0.05) 131.775 """ return price * (1 + tax_rate) if __name__ == "__main__": print(f"{price_plus_tax(100, 0.25) = }") print(f"{price_plus_tax(125.50, 0.05) = }") ================================================ FILE: financial/simple_moving_average.py ================================================ """ The Simple Moving Average (SMA) is a statistical calculation used to analyze data points by creating a constantly updated average price over a specific time period. In finance, SMA is often used in time series analysis to smooth out price data and identify trends. Reference: https://en.wikipedia.org/wiki/Moving_average """ from collections.abc import Sequence def simple_moving_average( data: Sequence[float], window_size: int ) -> list[float | None]: """ Calculate the simple moving average (SMA) for some given time series data. :param data: A list of numerical data points. :param window_size: An integer representing the size of the SMA window. :return: A list of SMA values with the same length as the input data. Examples: >>> sma = simple_moving_average([10, 12, 15, 13, 14, 16, 18, 17, 19, 21], 3) >>> [round(value, 2) if value is not None else None for value in sma] [None, None, 12.33, 13.33, 14.0, 14.33, 16.0, 17.0, 18.0, 19.0] >>> simple_moving_average([10, 12, 15], 5) [None, None, None] >>> simple_moving_average([10, 12, 15, 13, 14, 16, 18, 17, 19, 21], 0) Traceback (most recent call last): ... ValueError: Window size must be a positive integer """ if window_size < 1: raise ValueError("Window size must be a positive integer") sma: list[float | None] = [] for i in range(len(data)): if i < window_size - 1: sma.append(None) # SMA not available for early data points else: window = data[i - window_size + 1 : i + 1] sma_value = sum(window) / window_size sma.append(sma_value) return sma if __name__ == "__main__": import doctest doctest.testmod() # Example data (replace with your own time series data) data = [10, 12, 15, 13, 14, 16, 18, 17, 19, 21] # Specify the window size for the SMA window_size = 3 # Calculate the Simple Moving Average sma_values = simple_moving_average(data, window_size) # Print the SMA values print("Simple Moving Average (SMA) Values:") for i, value in enumerate(sma_values): if value is not None: print(f"Day {i + 1}: {value:.2f}") else: print(f"Day {i + 1}: Not enough data for SMA") ================================================ FILE: financial/straight_line_depreciation.py ================================================ """ In accounting, depreciation refers to the decreases in the value of a fixed asset during the asset's useful life. When an organization purchases a fixed asset, the purchase expenditure is not recognized as an expense immediately. Instead, the decreases in the asset's value are recognized as expenses over the years during which the asset is used. The following methods are widely used for depreciation calculation in accounting: - Straight-line method - Diminishing balance method - Units-of-production method The straight-line method is the simplest and most widely used. This method calculates depreciation by spreading the cost evenly over the asset's useful life. The following formula shows how to calculate the yearly depreciation expense: - annual depreciation expense = (purchase cost of asset - residual value) / useful life of asset(years) Further information on: https://en.wikipedia.org/wiki/Depreciation The function, straight_line_depreciation, returns a list of the depreciation expenses over the given period. """ def straight_line_depreciation( useful_years: int, purchase_value: float, residual_value: float = 0.0, ) -> list[float]: """ Calculate the depreciation expenses over the given period :param useful_years: Number of years the asset will be used :param purchase_value: Purchase expenditure for the asset :param residual_value: Residual value of the asset at the end of its useful life :return: A list of annual depreciation expenses over the asset's useful life >>> straight_line_depreciation(10, 1100.0, 100.0) [100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0] >>> straight_line_depreciation(6, 1250.0, 50.0) [200.0, 200.0, 200.0, 200.0, 200.0, 200.0] >>> straight_line_depreciation(4, 1001.0) [250.25, 250.25, 250.25, 250.25] >>> straight_line_depreciation(11, 380.0, 50.0) [30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0] >>> straight_line_depreciation(1, 4985, 100) [4885.0] """ if not isinstance(useful_years, int): raise TypeError("Useful years must be an integer") if useful_years < 1: raise ValueError("Useful years cannot be less than 1") if not isinstance(purchase_value, (float, int)): raise TypeError("Purchase value must be numeric") if not isinstance(residual_value, (float, int)): raise TypeError("Residual value must be numeric") if purchase_value < 0.0: raise ValueError("Purchase value cannot be less than zero") if purchase_value < residual_value: raise ValueError("Purchase value cannot be less than residual value") # Calculate annual depreciation expense depreciable_cost = purchase_value - residual_value annual_depreciation_expense = depreciable_cost / useful_years # List of annual depreciation expenses list_of_depreciation_expenses = [] accumulated_depreciation_expense = 0.0 for period in range(useful_years): if period != useful_years - 1: accumulated_depreciation_expense += annual_depreciation_expense list_of_depreciation_expenses.append(annual_depreciation_expense) else: depreciation_expense_in_end_year = ( depreciable_cost - accumulated_depreciation_expense ) list_of_depreciation_expenses.append(depreciation_expense_in_end_year) return list_of_depreciation_expenses if __name__ == "__main__": user_input_useful_years = int(input("Please Enter Useful Years:\n > ")) user_input_purchase_value = float(input("Please Enter Purchase Value:\n > ")) user_input_residual_value = float(input("Please Enter Residual Value:\n > ")) print( straight_line_depreciation( user_input_useful_years, user_input_purchase_value, user_input_residual_value, ) ) ================================================ FILE: financial/time_and_half_pay.py ================================================ """ Calculate time and a half pay """ def pay(hours_worked: float, pay_rate: float, hours: float = 40) -> float: """ hours_worked = The total hours worked pay_rate = Amount of money per hour hours = Number of hours that must be worked before you receive time and a half >>> pay(41, 1) 41.5 >>> pay(65, 19) 1472.5 >>> pay(10, 1) 10.0 """ # Check that all input parameters are float or integer assert isinstance(hours_worked, (float, int)), ( "Parameter 'hours_worked' must be of type 'int' or 'float'" ) assert isinstance(pay_rate, (float, int)), ( "Parameter 'pay_rate' must be of type 'int' or 'float'" ) assert isinstance(hours, (float, int)), ( "Parameter 'hours' must be of type 'int' or 'float'" ) normal_pay = hours_worked * pay_rate over_time = max(0, hours_worked - hours) over_time_pay = over_time * pay_rate / 2 return normal_pay + over_time_pay if __name__ == "__main__": # Test import doctest doctest.testmod() ================================================ FILE: fractals/__init__.py ================================================ ================================================ FILE: fractals/julia_sets.py ================================================ """Author Alexandre De Zotti Draws Julia sets of quadratic polynomials and exponential maps. More specifically, this iterates the function a fixed number of times then plots whether the absolute value of the last iterate is greater than a fixed threshold (named "escape radius"). For the exponential map this is not really an escape radius but rather a convenient way to approximate the Julia set with bounded orbits. The examples presented here are: - The Cauliflower Julia set, see e.g. https://en.wikipedia.org/wiki/File:Julia_z2%2B0,25.png - Other examples from https://en.wikipedia.org/wiki/Julia_set - An exponential map Julia set, ambiantly homeomorphic to the examples in https://www.math.univ-toulouse.fr/~cheritat/GalII/galery.html and https://ddd.uab.cat/pub/pubmat/02141493v43n1/02141493v43n1p27.pdf Remark: Some overflow runtime warnings are suppressed. This is because of the way the iteration loop is implemented, using numpy's efficient computations. Overflows and infinites are replaced after each step by a large number. """ import warnings from collections.abc import Callable from typing import Any import matplotlib.pyplot as plt import numpy as np c_cauliflower = 0.25 + 0.0j c_polynomial_1 = -0.4 + 0.6j c_polynomial_2 = -0.1 + 0.651j c_exponential = -2.0 nb_iterations = 56 window_size = 2.0 nb_pixels = 666 def eval_exponential(c_parameter: complex, z_values: np.ndarray) -> np.ndarray: """ Evaluate $e^z + c$. >>> float(eval_exponential(0, 0)) 1.0 >>> bool(abs(eval_exponential(1, np.pi*1.j)) < 1e-15) True >>> bool(abs(eval_exponential(1.j, 0)-1-1.j) < 1e-15) True """ return np.exp(z_values) + c_parameter def eval_quadratic_polynomial(c_parameter: complex, z_values: np.ndarray) -> np.ndarray: """ >>> eval_quadratic_polynomial(0, 2) 4 >>> eval_quadratic_polynomial(-1, 1) 0 >>> round(eval_quadratic_polynomial(1.j, 0).imag) 1 >>> round(eval_quadratic_polynomial(1.j, 0).real) 0 """ return z_values * z_values + c_parameter def prepare_grid(window_size: float, nb_pixels: int) -> np.ndarray: """ Create a grid of complex values of size nb_pixels*nb_pixels with real and imaginary parts ranging from -window_size to window_size (inclusive). Returns a numpy array. >>> prepare_grid(1,3) array([[-1.-1.j, -1.+0.j, -1.+1.j], [ 0.-1.j, 0.+0.j, 0.+1.j], [ 1.-1.j, 1.+0.j, 1.+1.j]]) """ x = np.linspace(-window_size, window_size, nb_pixels) x = x.reshape((nb_pixels, 1)) y = np.linspace(-window_size, window_size, nb_pixels) y = y.reshape((1, nb_pixels)) return x + 1.0j * y def iterate_function( eval_function: Callable[[Any, np.ndarray], np.ndarray], function_params: Any, nb_iterations: int, z_0: np.ndarray, infinity: float | None = None, ) -> np.ndarray: """ Iterate the function "eval_function" exactly nb_iterations times. The first argument of the function is a parameter which is contained in function_params. The variable z_0 is an array that contains the initial values to iterate from. This function returns the final iterates. >>> iterate_function(eval_quadratic_polynomial, 0, 3, np.array([0,1,2])).shape (3,) >>> complex(np.round(iterate_function(eval_quadratic_polynomial, ... 0, ... 3, ... np.array([0,1,2]))[0])) 0j >>> complex(np.round(iterate_function(eval_quadratic_polynomial, ... 0, ... 3, ... np.array([0,1,2]))[1])) (1+0j) >>> complex(np.round(iterate_function(eval_quadratic_polynomial, ... 0, ... 3, ... np.array([0,1,2]))[2])) (256+0j) """ z_n = z_0.astype("complex64") for _ in range(nb_iterations): z_n = eval_function(function_params, z_n) if infinity is not None: np.nan_to_num(z_n, copy=False, nan=infinity) z_n[abs(z_n) == np.inf] = infinity return z_n def show_results( function_label: str, function_params: Any, escape_radius: float, z_final: np.ndarray, ) -> None: """ Plots of whether the absolute value of z_final is greater than the value of escape_radius. Adds the function_label and function_params to the title. >>> show_results('80', 0, 1, np.array([[0,1,.5],[.4,2,1.1],[.2,1,1.3]])) """ abs_z_final = (abs(z_final)).transpose() abs_z_final[:, :] = abs_z_final[::-1, :] plt.matshow(abs_z_final < escape_radius) plt.title(f"Julia set of ${function_label}$, $c={function_params}$") plt.show() def ignore_overflow_warnings() -> None: """ Ignore some overflow and invalid value warnings. >>> ignore_overflow_warnings() """ warnings.filterwarnings( "ignore", category=RuntimeWarning, message="overflow encountered in multiply" ) warnings.filterwarnings( "ignore", category=RuntimeWarning, message="invalid value encountered in multiply", ) warnings.filterwarnings( "ignore", category=RuntimeWarning, message="overflow encountered in absolute" ) warnings.filterwarnings( "ignore", category=RuntimeWarning, message="overflow encountered in exp" ) if __name__ == "__main__": z_0 = prepare_grid(window_size, nb_pixels) ignore_overflow_warnings() # See file header for explanations nb_iterations = 24 escape_radius = 2 * abs(c_cauliflower) + 1 z_final = iterate_function( eval_quadratic_polynomial, c_cauliflower, nb_iterations, z_0, infinity=1.1 * escape_radius, ) show_results("z^2+c", c_cauliflower, escape_radius, z_final) nb_iterations = 64 escape_radius = 2 * abs(c_polynomial_1) + 1 z_final = iterate_function( eval_quadratic_polynomial, c_polynomial_1, nb_iterations, z_0, infinity=1.1 * escape_radius, ) show_results("z^2+c", c_polynomial_1, escape_radius, z_final) nb_iterations = 161 escape_radius = 2 * abs(c_polynomial_2) + 1 z_final = iterate_function( eval_quadratic_polynomial, c_polynomial_2, nb_iterations, z_0, infinity=1.1 * escape_radius, ) show_results("z^2+c", c_polynomial_2, escape_radius, z_final) nb_iterations = 12 escape_radius = 10000.0 z_final = iterate_function( eval_exponential, c_exponential, nb_iterations, z_0 + 2, infinity=1.0e10, ) show_results("e^z+c", c_exponential, escape_radius, z_final) ================================================ FILE: fractals/koch_snowflake.py ================================================ """ Description The Koch snowflake is a fractal curve and one of the earliest fractals to have been described. The Koch snowflake can be built up iteratively, in a sequence of stages. The first stage is an equilateral triangle, and each successive stage is formed by adding outward bends to each side of the previous stage, making smaller equilateral triangles. This can be achieved through the following steps for each line: 1. divide the line segment into three segments of equal length. 2. draw an equilateral triangle that has the middle segment from step 1 as its base and points outward. 3. remove the line segment that is the base of the triangle from step 2. (description adapted from https://en.wikipedia.org/wiki/Koch_snowflake ) (for a more detailed explanation and an implementation in the Processing language, see https://natureofcode.com/book/chapter-8-fractals/ #84-the-koch-curve-and-the-arraylist-technique ) Requirements (pip): - matplotlib - numpy """ from __future__ import annotations import matplotlib.pyplot as plt import numpy as np # initial triangle of Koch snowflake VECTOR_1 = np.array([0, 0]) VECTOR_2 = np.array([0.5, 0.8660254]) VECTOR_3 = np.array([1, 0]) INITIAL_VECTORS = [VECTOR_1, VECTOR_2, VECTOR_3, VECTOR_1] # uncomment for simple Koch curve instead of Koch snowflake # INITIAL_VECTORS = [VECTOR_1, VECTOR_3] def iterate(initial_vectors: list[np.ndarray], steps: int) -> list[np.ndarray]: """ Go through the number of iterations determined by the argument "steps". Be careful with high values (above 5) since the time to calculate increases exponentially. >>> iterate([np.array([0, 0]), np.array([1, 0])], 1) [array([0, 0]), array([0.33333333, 0. ]), array([0.5 , \ 0.28867513]), array([0.66666667, 0. ]), array([1, 0])] """ vectors = initial_vectors for _ in range(steps): vectors = iteration_step(vectors) return vectors def iteration_step(vectors: list[np.ndarray]) -> list[np.ndarray]: """ Loops through each pair of adjacent vectors. Each line between two adjacent vectors is divided into 4 segments by adding 3 additional vectors in-between the original two vectors. The vector in the middle is constructed through a 60 degree rotation so it is bent outwards. >>> iteration_step([np.array([0, 0]), np.array([1, 0])]) [array([0, 0]), array([0.33333333, 0. ]), array([0.5 , \ 0.28867513]), array([0.66666667, 0. ]), array([1, 0])] """ new_vectors = [] for i, start_vector in enumerate(vectors[:-1]): end_vector = vectors[i + 1] new_vectors.append(start_vector) difference_vector = end_vector - start_vector new_vectors.append(start_vector + difference_vector / 3) new_vectors.append( start_vector + difference_vector / 3 + rotate(difference_vector / 3, 60) ) new_vectors.append(start_vector + difference_vector * 2 / 3) new_vectors.append(vectors[-1]) return new_vectors def rotate(vector: np.ndarray, angle_in_degrees: float) -> np.ndarray: """ Standard rotation of a 2D vector with a rotation matrix (see https://en.wikipedia.org/wiki/Rotation_matrix ) >>> rotate(np.array([1, 0]), 60) array([0.5 , 0.8660254]) >>> rotate(np.array([1, 0]), 90) array([6.123234e-17, 1.000000e+00]) """ theta = np.radians(angle_in_degrees) c, s = np.cos(theta), np.sin(theta) rotation_matrix = np.array(((c, -s), (s, c))) return np.dot(rotation_matrix, vector) def plot(vectors: list[np.ndarray]) -> None: """ Utility function to plot the vectors using matplotlib.pyplot No doctest was implemented since this function does not have a return value """ # avoid stretched display of graph axes = plt.gca() axes.set_aspect("equal") # matplotlib.pyplot.plot takes a list of all x-coordinates and a list of all # y-coordinates as inputs, which are constructed from the vector-list using # zip() x_coordinates, y_coordinates = zip(*vectors) plt.plot(x_coordinates, y_coordinates) plt.show() if __name__ == "__main__": import doctest doctest.testmod() processed_vectors = iterate(INITIAL_VECTORS, 5) plot(processed_vectors) ================================================ FILE: fractals/mandelbrot.py ================================================ """ The Mandelbrot set is the set of complex numbers "c" for which the series "z_(n+1) = z_n * z_n + c" does not diverge, i.e. remains bounded. Thus, a complex number "c" is a member of the Mandelbrot set if, when starting with "z_0 = 0" and applying the iteration repeatedly, the absolute value of "z_n" remains bounded for all "n > 0". Complex numbers can be written as "a + b*i": "a" is the real component, usually drawn on the x-axis, and "b*i" is the imaginary component, usually drawn on the y-axis. Most visualizations of the Mandelbrot set use a color-coding to indicate after how many steps in the series the numbers outside the set diverge. Images of the Mandelbrot set exhibit an elaborate and infinitely complicated boundary that reveals progressively ever-finer recursive detail at increasing magnifications, making the boundary of the Mandelbrot set a fractal curve. (description adapted from https://en.wikipedia.org/wiki/Mandelbrot_set ) (see also https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set ) """ import colorsys from PIL import Image def get_distance(x: float, y: float, max_step: int) -> float: """ Return the relative distance (= step/max_step) after which the complex number constituted by this x-y-pair diverges. Members of the Mandelbrot set do not diverge so their distance is 1. >>> get_distance(0, 0, 50) 1.0 >>> get_distance(0.5, 0.5, 50) 0.061224489795918366 >>> get_distance(2, 0, 50) 0.0 """ a = x b = y for step in range(max_step): # noqa: B007 a_new = a * a - b * b + x b = 2 * a * b + y a = a_new # divergence happens for all complex number with an absolute value # greater than 4 if a * a + b * b > 4: break return step / (max_step - 1) def get_black_and_white_rgb(distance: float) -> tuple: """ Black&white color-coding that ignores the relative distance. The Mandelbrot set is black, everything else is white. >>> get_black_and_white_rgb(0) (255, 255, 255) >>> get_black_and_white_rgb(0.5) (255, 255, 255) >>> get_black_and_white_rgb(1) (0, 0, 0) """ if distance == 1: return (0, 0, 0) else: return (255, 255, 255) def get_color_coded_rgb(distance: float) -> tuple: """ Color-coding taking the relative distance into account. The Mandelbrot set is black. >>> get_color_coded_rgb(0) (255, 0, 0) >>> get_color_coded_rgb(0.5) (0, 255, 255) >>> get_color_coded_rgb(1) (0, 0, 0) """ if distance == 1: return (0, 0, 0) else: return tuple(round(i * 255) for i in colorsys.hsv_to_rgb(distance, 1, 1)) def get_image( image_width: int = 800, image_height: int = 600, figure_center_x: float = -0.6, figure_center_y: float = 0, figure_width: float = 3.2, max_step: int = 50, use_distance_color_coding: bool = True, ) -> Image.Image: """ Function to generate the image of the Mandelbrot set. Two types of coordinates are used: image-coordinates that refer to the pixels and figure-coordinates that refer to the complex numbers inside and outside the Mandelbrot set. The figure-coordinates in the arguments of this function determine which section of the Mandelbrot set is viewed. The main area of the Mandelbrot set is roughly between "-1.5 < x < 0.5" and "-1 < y < 1" in the figure-coordinates. Commenting out tests that slow down pytest... # 13.35s call fractals/mandelbrot.py::mandelbrot.get_image # >>> get_image().load()[0,0] (255, 0, 0) # >>> get_image(use_distance_color_coding = False).load()[0,0] (255, 255, 255) """ img = Image.new("RGB", (image_width, image_height)) pixels = img.load() # loop through the image-coordinates for image_x in range(image_width): for image_y in range(image_height): # determine the figure-coordinates based on the image-coordinates figure_height = figure_width / image_width * image_height figure_x = figure_center_x + (image_x / image_width - 0.5) * figure_width figure_y = figure_center_y + (image_y / image_height - 0.5) * figure_height distance = get_distance(figure_x, figure_y, max_step) # color the corresponding pixel based on the selected coloring-function if use_distance_color_coding: pixels[image_x, image_y] = get_color_coded_rgb(distance) else: pixels[image_x, image_y] = get_black_and_white_rgb(distance) return img if __name__ == "__main__": import doctest doctest.testmod() # colored version, full figure img = get_image() # uncomment for colored version, different section, zoomed in # img = get_image(figure_center_x = -0.6, figure_center_y = -0.4, # figure_width = 0.8) # uncomment for black and white version, full figure # img = get_image(use_distance_color_coding = False) # uncomment to save the image # img.save("mandelbrot.png") img.show() ================================================ FILE: fractals/sierpinski_triangle.py ================================================ """ Author Anurag Kumar | anuragkumarak95@gmail.com | git/anuragkumarak95 Simple example of fractal generation using recursion. What is the Sierpiński Triangle? The Sierpiński triangle (sometimes spelled Sierpinski), also called the Sierpiński gasket or Sierpiński sieve, is a fractal attractive fixed set with the overall shape of an equilateral triangle, subdivided recursively into smaller equilateral triangles. Originally constructed as a curve, this is one of the basic examples of self-similar sets—that is, it is a mathematically generated pattern that is reproducible at any magnification or reduction. It is named after the Polish mathematician Wacław Sierpiński, but appeared as a decorative pattern many centuries before the work of Sierpiński. Usage: python sierpinski_triangle.py Credits: The above description is taken from https://en.wikipedia.org/wiki/Sierpi%C5%84ski_triangle This code was written by editing the code from https://www.riannetrujillo.com/blog/python-fractal/ """ import sys import turtle def get_mid(p1: tuple[float, float], p2: tuple[float, float]) -> tuple[float, float]: """ Find the midpoint of two points >>> get_mid((0, 0), (2, 2)) (1.0, 1.0) >>> get_mid((-3, -3), (3, 3)) (0.0, 0.0) >>> get_mid((1, 0), (3, 2)) (2.0, 1.0) >>> get_mid((0, 0), (1, 1)) (0.5, 0.5) >>> get_mid((0, 0), (0, 0)) (0.0, 0.0) """ return (p1[0] + p2[0]) / 2, (p1[1] + p2[1]) / 2 def triangle( vertex1: tuple[float, float], vertex2: tuple[float, float], vertex3: tuple[float, float], depth: int, ) -> None: """ Recursively draw the Sierpinski triangle given the vertices of the triangle and the recursion depth """ my_pen.up() my_pen.goto(vertex1[0], vertex1[1]) my_pen.down() my_pen.goto(vertex2[0], vertex2[1]) my_pen.goto(vertex3[0], vertex3[1]) my_pen.goto(vertex1[0], vertex1[1]) if depth == 0: return triangle(vertex1, get_mid(vertex1, vertex2), get_mid(vertex1, vertex3), depth - 1) triangle(vertex2, get_mid(vertex1, vertex2), get_mid(vertex2, vertex3), depth - 1) triangle(vertex3, get_mid(vertex3, vertex2), get_mid(vertex1, vertex3), depth - 1) if __name__ == "__main__": if len(sys.argv) != 2: raise ValueError( "Correct format for using this script: " "python fractals.py " ) my_pen = turtle.Turtle() my_pen.ht() my_pen.speed(5) my_pen.pencolor("red") vertices = [(-175, -125), (0, 175), (175, -125)] # vertices of triangle triangle(vertices[0], vertices[1], vertices[2], int(sys.argv[1])) turtle.Screen().exitonclick() ================================================ FILE: fractals/vicsek.py ================================================ """Authors Bastien Capiaux & Mehdi Oudghiri The Vicsek fractal algorithm is a recursive algorithm that creates a pattern known as the Vicsek fractal or the Vicsek square. It is based on the concept of self-similarity, where the pattern at each level of recursion resembles the overall pattern. The algorithm involves dividing a square into 9 equal smaller squares, removing the center square, and then repeating this process on the remaining 8 squares. This results in a pattern that exhibits self-similarity and has a square-shaped outline with smaller squares within it. Source: https://en.wikipedia.org/wiki/Vicsek_fractal """ import turtle def draw_cross(x: float, y: float, length: float): """ Draw a cross at the specified position and with the specified length. """ turtle.up() turtle.goto(x - length / 2, y - length / 6) turtle.down() turtle.seth(0) turtle.begin_fill() for _ in range(4): turtle.fd(length / 3) turtle.right(90) turtle.fd(length / 3) turtle.left(90) turtle.fd(length / 3) turtle.left(90) turtle.end_fill() def draw_fractal_recursive(x: float, y: float, length: float, depth: float): """ Recursively draw the Vicsek fractal at the specified position, with the specified length and depth. """ if depth == 0: draw_cross(x, y, length) return draw_fractal_recursive(x, y, length / 3, depth - 1) draw_fractal_recursive(x + length / 3, y, length / 3, depth - 1) draw_fractal_recursive(x - length / 3, y, length / 3, depth - 1) draw_fractal_recursive(x, y + length / 3, length / 3, depth - 1) draw_fractal_recursive(x, y - length / 3, length / 3, depth - 1) def set_color(rgb: str): turtle.color(rgb) def draw_vicsek_fractal(x: float, y: float, length: float, depth: float, color="blue"): """ Draw the Vicsek fractal at the specified position, with the specified length and depth. """ turtle.speed(0) turtle.hideturtle() set_color(color) draw_fractal_recursive(x, y, length, depth) turtle.Screen().update() def main(): draw_vicsek_fractal(0, 0, 800, 4) turtle.done() if __name__ == "__main__": main() ================================================ FILE: fuzzy_logic/__init__.py ================================================ ================================================ FILE: fuzzy_logic/fuzzy_operations.py ================================================ """ By @Shreya123714 https://en.wikipedia.org/wiki/Fuzzy_set """ from __future__ import annotations from dataclasses import dataclass import matplotlib.pyplot as plt import numpy as np @dataclass class FuzzySet: """ A class for representing and manipulating triangular fuzzy sets. Attributes: name: The name or label of the fuzzy set. left_boundary: The left boundary of the fuzzy set. peak: The peak (central) value of the fuzzy set. right_boundary: The right boundary of the fuzzy set. Methods: membership(x): Calculate the membership value of an input 'x' in the fuzzy set. union(other): Calculate the union of this fuzzy set with another fuzzy set. intersection(other): Calculate the intersection of this fuzzy set with another. complement(): Calculate the complement (negation) of this fuzzy set. plot(): Plot the membership function of the fuzzy set. >>> sheru = FuzzySet("Sheru", 0.4, 1, 0.6) >>> sheru FuzzySet(name='Sheru', left_boundary=0.4, peak=1, right_boundary=0.6) >>> str(sheru) 'Sheru: [0.4, 1, 0.6]' >>> siya = FuzzySet("Siya", 0.5, 1, 0.7) >>> siya FuzzySet(name='Siya', left_boundary=0.5, peak=1, right_boundary=0.7) # Complement Operation >>> sheru.complement() FuzzySet(name='¬Sheru', left_boundary=0.4, peak=0.6, right_boundary=0) >>> siya.complement() # doctest: +NORMALIZE_WHITESPACE FuzzySet(name='¬Siya', left_boundary=0.30000000000000004, peak=0.5, right_boundary=0) # Intersection Operation >>> siya.intersection(sheru) FuzzySet(name='Siya ∩ Sheru', left_boundary=0.5, peak=0.6, right_boundary=1.0) # Membership Operation >>> sheru.membership(0.5) 0.16666666666666663 >>> sheru.membership(0.6) 0.0 # Union Operations >>> siya.union(sheru) FuzzySet(name='Siya U Sheru', left_boundary=0.4, peak=0.7, right_boundary=1.0) """ name: str left_boundary: float peak: float right_boundary: float def __str__(self) -> str: """ >>> FuzzySet("fuzzy_set", 0.1, 0.2, 0.3) FuzzySet(name='fuzzy_set', left_boundary=0.1, peak=0.2, right_boundary=0.3) """ return ( f"{self.name}: [{self.left_boundary}, {self.peak}, {self.right_boundary}]" ) def complement(self) -> FuzzySet: """ Calculate the complement (negation) of this fuzzy set. Returns: FuzzySet: A new fuzzy set representing the complement. >>> FuzzySet("fuzzy_set", 0.1, 0.2, 0.3).complement() FuzzySet(name='¬fuzzy_set', left_boundary=0.7, peak=0.9, right_boundary=0.8) """ return FuzzySet( f"¬{self.name}", 1 - self.right_boundary, 1 - self.left_boundary, 1 - self.peak, ) def intersection(self, other) -> FuzzySet: """ Calculate the intersection of this fuzzy set with another fuzzy set. Args: other: Another fuzzy set to intersect with. Returns: A new fuzzy set representing the intersection. >>> FuzzySet("a", 0.1, 0.2, 0.3).intersection(FuzzySet("b", 0.4, 0.5, 0.6)) FuzzySet(name='a ∩ b', left_boundary=0.4, peak=0.3, right_boundary=0.35) """ return FuzzySet( f"{self.name} ∩ {other.name}", max(self.left_boundary, other.left_boundary), min(self.right_boundary, other.right_boundary), (self.peak + other.peak) / 2, ) def membership(self, x: float) -> float: """ Calculate the membership value of an input 'x' in the fuzzy set. Returns: The membership value of 'x' in the fuzzy set. >>> a = FuzzySet("a", 0.1, 0.2, 0.3) >>> a.membership(0.09) 0.0 >>> a.membership(0.1) 0.0 >>> a.membership(0.11) 0.09999999999999995 >>> a.membership(0.4) 0.0 >>> FuzzySet("A", 0, 0.5, 1).membership(0.1) 0.2 >>> FuzzySet("B", 0.2, 0.7, 1).membership(0.6) 0.8 """ if x <= self.left_boundary or x >= self.right_boundary: return 0.0 elif self.left_boundary < x <= self.peak: return (x - self.left_boundary) / (self.peak - self.left_boundary) elif self.peak < x < self.right_boundary: return (self.right_boundary - x) / (self.right_boundary - self.peak) msg = f"Invalid value {x} for fuzzy set {self}" raise ValueError(msg) def union(self, other) -> FuzzySet: """ Calculate the union of this fuzzy set with another fuzzy set. Args: other (FuzzySet): Another fuzzy set to union with. Returns: FuzzySet: A new fuzzy set representing the union. >>> FuzzySet("a", 0.1, 0.2, 0.3).union(FuzzySet("b", 0.4, 0.5, 0.6)) FuzzySet(name='a U b', left_boundary=0.1, peak=0.6, right_boundary=0.35) """ return FuzzySet( f"{self.name} U {other.name}", min(self.left_boundary, other.left_boundary), max(self.right_boundary, other.right_boundary), (self.peak + other.peak) / 2, ) def plot(self): """ Plot the membership function of the fuzzy set. """ x = np.linspace(0, 1, 1000) y = [self.membership(xi) for xi in x] plt.plot(x, y, label=self.name) if __name__ == "__main__": from doctest import testmod testmod() a = FuzzySet("A", 0, 0.5, 1) b = FuzzySet("B", 0.2, 0.7, 1) a.plot() b.plot() plt.xlabel("x") plt.ylabel("Membership") plt.legend() plt.show() union_ab = a.union(b) intersection_ab = a.intersection(b) complement_a = a.complement() union_ab.plot() intersection_ab.plot() complement_a.plot() plt.xlabel("x") plt.ylabel("Membership") plt.legend() plt.show() ================================================ FILE: fuzzy_logic/fuzzy_operations.py.DISABLED.txt ================================================ """ README, Author - Jigyasa Gandhi(mailto:jigsgandhi97@gmail.com) Requirements: - scikit-fuzzy - numpy - matplotlib Python: - 3.5 """ import numpy as np import skfuzzy as fuzz if __name__ == "__main__": # Create universe of discourse in Python using linspace () X = np.linspace(start=0, stop=75, num=75, endpoint=True, retstep=False) # Create two fuzzy sets by defining any membership function # (trapmf(), gbellmf(), gaussmf(), etc). abc1 = [0, 25, 50] abc2 = [25, 50, 75] young = fuzz.membership.trimf(X, abc1) middle_aged = fuzz.membership.trimf(X, abc2) # Compute the different operations using inbuilt functions. one = np.ones(75) zero = np.zeros((75,)) # 1. Union = max(µA(x), µB(x)) union = fuzz.fuzzy_or(X, young, X, middle_aged)[1] # 2. Intersection = min(µA(x), µB(x)) intersection = fuzz.fuzzy_and(X, young, X, middle_aged)[1] # 3. Complement (A) = (1 - min(µA(x))) complement_a = fuzz.fuzzy_not(young) # 4. Difference (A/B) = min(µA(x),(1- µB(x))) difference = fuzz.fuzzy_and(X, young, X, fuzz.fuzzy_not(middle_aged)[1])[1] # 5. Algebraic Sum = [µA(x) + µB(x) – (µA(x) * µB(x))] alg_sum = young + middle_aged - (young * middle_aged) # 6. Algebraic Product = (µA(x) * µB(x)) alg_product = young * middle_aged # 7. Bounded Sum = min[1,(µA(x), µB(x))] bdd_sum = fuzz.fuzzy_and(X, one, X, young + middle_aged)[1] # 8. Bounded difference = min[0,(µA(x), µB(x))] bdd_difference = fuzz.fuzzy_or(X, zero, X, young - middle_aged)[1] # max-min composition # max-product composition # Plot each set A, set B and each operation result using plot() and subplot(). from matplotlib import pyplot as plt plt.figure() plt.subplot(4, 3, 1) plt.plot(X, young) plt.title("Young") plt.grid(True) plt.subplot(4, 3, 2) plt.plot(X, middle_aged) plt.title("Middle aged") plt.grid(True) plt.subplot(4, 3, 3) plt.plot(X, union) plt.title("union") plt.grid(True) plt.subplot(4, 3, 4) plt.plot(X, intersection) plt.title("intersection") plt.grid(True) plt.subplot(4, 3, 5) plt.plot(X, complement_a) plt.title("complement_a") plt.grid(True) plt.subplot(4, 3, 6) plt.plot(X, difference) plt.title("difference a/b") plt.grid(True) plt.subplot(4, 3, 7) plt.plot(X, alg_sum) plt.title("alg_sum") plt.grid(True) plt.subplot(4, 3, 8) plt.plot(X, alg_product) plt.title("alg_product") plt.grid(True) plt.subplot(4, 3, 9) plt.plot(X, bdd_sum) plt.title("bdd_sum") plt.grid(True) plt.subplot(4, 3, 10) plt.plot(X, bdd_difference) plt.title("bdd_difference") plt.grid(True) plt.subplots_adjust(hspace=0.5) plt.show() ================================================ FILE: genetic_algorithm/__init__.py ================================================ ================================================ FILE: genetic_algorithm/basic_string.py ================================================ """ Simple multithreaded algorithm to show how the 4 phases of a genetic algorithm works (Evaluation, Selection, Crossover and Mutation) https://en.wikipedia.org/wiki/Genetic_algorithm Author: D4rkia """ from __future__ import annotations import random # Maximum size of the population. Bigger could be faster but is more memory expensive. N_POPULATION = 200 # Number of elements selected in every generation of evolution. The selection takes # place from best to worst of that generation and must be smaller than N_POPULATION. N_SELECTED = 50 # Probability that an element of a generation can mutate, changing one of its genes. # This will guarantee that all genes will be used during evolution. MUTATION_PROBABILITY = 0.4 # Just a seed to improve randomness required by the algorithm. random.seed(random.randint(0, 1000)) def evaluate(item: str, main_target: str) -> tuple[str, float]: """ Evaluate how similar the item is with the target by just counting each char in the right position >>> evaluate("Helxo Worlx", "Hello World") ('Helxo Worlx', 9.0) """ score = len([g for position, g in enumerate(item) if g == main_target[position]]) return (item, float(score)) def crossover(parent_1: str, parent_2: str) -> tuple[str, str]: """ Slice and combine two strings at a random point. >>> random.seed(42) >>> crossover("123456", "abcdef") ('12345f', 'abcde6') """ random_slice = random.randint(0, len(parent_1) - 1) child_1 = parent_1[:random_slice] + parent_2[random_slice:] child_2 = parent_2[:random_slice] + parent_1[random_slice:] return (child_1, child_2) def mutate(child: str, genes: list[str]) -> str: """ Mutate a random gene of a child with another one from the list. >>> random.seed(123) >>> mutate("123456", list("ABCDEF")) '12345A' """ child_list = list(child) if random.uniform(0, 1) < MUTATION_PROBABILITY: child_list[random.randint(0, len(child)) - 1] = random.choice(genes) return "".join(child_list) # Select, crossover and mutate a new population. def select( parent_1: tuple[str, float], population_score: list[tuple[str, float]], genes: list[str], ) -> list[str]: """ Select the second parent and generate new population >>> random.seed(42) >>> parent_1 = ("123456", 8.0) >>> population_score = [("abcdef", 4.0), ("ghijkl", 5.0), ("mnopqr", 7.0)] >>> genes = list("ABCDEF") >>> child_n = int(min(parent_1[1] + 1, 10)) >>> population = [] >>> for _ in range(child_n): ... parent_2 = population_score[random.randrange(len(population_score))][0] ... child_1, child_2 = crossover(parent_1[0], parent_2) ... population.extend((mutate(child_1, genes), mutate(child_2, genes))) >>> len(population) == (int(parent_1[1]) + 1) * 2 True """ pop = [] # Generate more children proportionally to the fitness score. child_n = int(parent_1[1] * 100) + 1 child_n = 10 if child_n >= 10 else child_n for _ in range(child_n): parent_2 = population_score[random.randint(0, N_SELECTED)][0] child_1, child_2 = crossover(parent_1[0], parent_2) # Append new string to the population list. pop.append(mutate(child_1, genes)) pop.append(mutate(child_2, genes)) return pop def basic(target: str, genes: list[str], debug: bool = True) -> tuple[int, int, str]: """ Verify that the target contains no genes besides the ones inside genes variable. >>> from string import ascii_lowercase >>> basic("doctest", ascii_lowercase, debug=False)[2] 'doctest' >>> genes = list(ascii_lowercase) >>> genes.remove("e") >>> basic("test", genes) Traceback (most recent call last): ... ValueError: ['e'] is not in genes list, evolution cannot converge >>> genes.remove("s") >>> basic("test", genes) Traceback (most recent call last): ... ValueError: ['e', 's'] is not in genes list, evolution cannot converge >>> genes.remove("t") >>> basic("test", genes) Traceback (most recent call last): ... ValueError: ['e', 's', 't'] is not in genes list, evolution cannot converge """ # Verify if N_POPULATION is bigger than N_SELECTED if N_POPULATION < N_SELECTED: msg = f"{N_POPULATION} must be bigger than {N_SELECTED}" raise ValueError(msg) # Verify that the target contains no genes besides the ones inside genes variable. not_in_genes_list = sorted({c for c in target if c not in genes}) if not_in_genes_list: msg = f"{not_in_genes_list} is not in genes list, evolution cannot converge" raise ValueError(msg) # Generate random starting population. population = [] for _ in range(N_POPULATION): population.append("".join([random.choice(genes) for i in range(len(target))])) # Just some logs to know what the algorithms is doing. generation, total_population = 0, 0 # This loop will end when we find a perfect match for our target. while True: generation += 1 total_population += len(population) # Random population created. Now it's time to evaluate. # (Option 1) Adding a bit of concurrency can make everything faster, # # import concurrent.futures # population_score: list[tuple[str, float]] = [] # with concurrent.futures.ThreadPoolExecutor( # max_workers=NUM_WORKERS) as executor: # futures = {executor.submit(evaluate, item, target) for item in population} # concurrent.futures.wait(futures) # population_score = [item.result() for item in futures] # # but with a simple algorithm like this, it will probably be slower. # (Option 2) We just need to call evaluate for every item inside the population. population_score = [evaluate(item, target) for item in population] # Check if there is a matching evolution. population_score = sorted(population_score, key=lambda x: x[1], reverse=True) if population_score[0][0] == target: return (generation, total_population, population_score[0][0]) # Print the best result every 10 generation. # Just to know that the algorithm is working. if debug and generation % 10 == 0: print( f"\nGeneration: {generation}" f"\nTotal Population:{total_population}" f"\nBest score: {population_score[0][1]}" f"\nBest string: {population_score[0][0]}" ) # Flush the old population, keeping some of the best evolutions. # Keeping this avoid regression of evolution. population_best = population[: int(N_POPULATION / 3)] population.clear() population.extend(population_best) # Normalize population score to be between 0 and 1. population_score = [ (item, score / len(target)) for item, score in population_score ] # This is selection for i in range(N_SELECTED): population.extend(select(population_score[int(i)], population_score, genes)) # Check if the population has already reached the maximum value and if so, # break the cycle. If this check is disabled, the algorithm will take # forever to compute large strings, but will also calculate small strings in # a far fewer generations. if len(population) > N_POPULATION: break if __name__ == "__main__": target_str = ( "This is a genetic algorithm to evaluate, combine, evolve, and mutate a string!" ) genes_list = list( " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklm" "nopqrstuvwxyz.,;!?+-*#@^'èéòà€ù=)(&%$£/\\" ) generation, population, target = basic(target_str, genes_list) print( f"\nGeneration: {generation}\nTotal Population: {population}\nTarget: {target}" ) ================================================ FILE: geodesy/__init__.py ================================================ ================================================ FILE: geodesy/haversine_distance.py ================================================ from math import asin, atan, cos, radians, sin, sqrt, tan AXIS_A = 6378137.0 AXIS_B = 6356752.314245 RADIUS = 6378137 def haversine_distance(lat1: float, lon1: float, lat2: float, lon2: float) -> float: """ Calculate great circle distance between two points in a sphere, given longitudes and latitudes https://en.wikipedia.org/wiki/Haversine_formula We know that the globe is "sort of" spherical, so a path between two points isn't exactly a straight line. We need to account for the Earth's curvature when calculating distance from point A to B. This effect is negligible for small distances but adds up as distance increases. The Haversine method treats the earth as a sphere which allows us to "project" the two points A and B onto the surface of that sphere and approximate the spherical distance between them. Since the Earth is not a perfect sphere, other methods which model the Earth's ellipsoidal nature are more accurate but a quick and modifiable computation like Haversine can be handy for shorter range distances. Args: * `lat1`, `lon1`: latitude and longitude of coordinate 1 * `lat2`, `lon2`: latitude and longitude of coordinate 2 Returns: geographical distance between two points in metres >>> from collections import namedtuple >>> point_2d = namedtuple("point_2d", "lat lon") >>> SAN_FRANCISCO = point_2d(37.774856, -122.424227) >>> YOSEMITE = point_2d(37.864742, -119.537521) >>> f"{haversine_distance(*SAN_FRANCISCO, *YOSEMITE):0,.0f} meters" '254,352 meters' """ # CONSTANTS per WGS84 https://en.wikipedia.org/wiki/World_Geodetic_System # Distance in metres(m) # Equation parameters # Equation https://en.wikipedia.org/wiki/Haversine_formula#Formulation flattening = (AXIS_A - AXIS_B) / AXIS_A phi_1 = atan((1 - flattening) * tan(radians(lat1))) phi_2 = atan((1 - flattening) * tan(radians(lat2))) lambda_1 = radians(lon1) lambda_2 = radians(lon2) # Equation sin_sq_phi = sin((phi_2 - phi_1) / 2) sin_sq_lambda = sin((lambda_2 - lambda_1) / 2) # Square both values sin_sq_phi *= sin_sq_phi sin_sq_lambda *= sin_sq_lambda h_value = sqrt(sin_sq_phi + (cos(phi_1) * cos(phi_2) * sin_sq_lambda)) return 2 * RADIUS * asin(h_value) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: geodesy/lamberts_ellipsoidal_distance.py ================================================ from math import atan, cos, radians, sin, tan from .haversine_distance import haversine_distance AXIS_A = 6378137.0 AXIS_B = 6356752.314245 EQUATORIAL_RADIUS = 6378137 def lamberts_ellipsoidal_distance( lat1: float, lon1: float, lat2: float, lon2: float ) -> float: """ Calculate the shortest distance along the surface of an ellipsoid between two points on the surface of earth given longitudes and latitudes https://en.wikipedia.org/wiki/Geographical_distance#Lambert's_formula_for_long_lines NOTE: This algorithm uses geodesy/haversine_distance.py to compute central angle, sigma Representing the earth as an ellipsoid allows us to approximate distances between points on the surface much better than a sphere. Ellipsoidal formulas treat the Earth as an oblate ellipsoid which means accounting for the flattening that happens at the North and South poles. Lambert's formulae provide accuracy on the order of 10 meteres over thousands of kilometeres. Other methods can provide millimeter-level accuracy but this is a simpler method to calculate long range distances without increasing computational intensity. Args: lat1, lon1: latitude and longitude of coordinate 1 lat2, lon2: latitude and longitude of coordinate 2 Returns: geographical distance between two points in metres >>> lamberts_ellipsoidal_distance(100, 0, 0, 0) Traceback (most recent call last): ... ValueError: Latitude must be between -90 and 90 degrees >>> lamberts_ellipsoidal_distance(0, 0, -100, 0) Traceback (most recent call last): ... ValueError: Latitude must be between -90 and 90 degrees >>> lamberts_ellipsoidal_distance(0, 200, 0, 0) Traceback (most recent call last): ... ValueError: Longitude must be between -180 and 180 degrees >>> lamberts_ellipsoidal_distance(0, 0, 0, -200) Traceback (most recent call last): ... ValueError: Longitude must be between -180 and 180 degrees >>> from collections import namedtuple >>> point_2d = namedtuple("point_2d", "lat lon") >>> SAN_FRANCISCO = point_2d(37.774856, -122.424227) >>> YOSEMITE = point_2d(37.864742, -119.537521) >>> NEW_YORK = point_2d(40.713019, -74.012647) >>> VENICE = point_2d(45.443012, 12.313071) >>> f"{lamberts_ellipsoidal_distance(*SAN_FRANCISCO, *YOSEMITE):0,.0f} meters" '254,351 meters' >>> f"{lamberts_ellipsoidal_distance(*SAN_FRANCISCO, *NEW_YORK):0,.0f} meters" '4,138,992 meters' >>> f"{lamberts_ellipsoidal_distance(*SAN_FRANCISCO, *VENICE):0,.0f} meters" '9,737,326 meters' """ # Validate latitude values if not -90 <= lat1 <= 90 or not -90 <= lat2 <= 90: raise ValueError("Latitude must be between -90 and 90 degrees") # Validate longitude values if not -180 <= lon1 <= 180 or not -180 <= lon2 <= 180: raise ValueError("Longitude must be between -180 and 180 degrees") # CONSTANTS per WGS84 https://en.wikipedia.org/wiki/World_Geodetic_System # Distance in metres(m) # Equation Parameters # https://en.wikipedia.org/wiki/Geographical_distance#Lambert's_formula_for_long_lines flattening = (AXIS_A - AXIS_B) / AXIS_A # Parametric latitudes # https://en.wikipedia.org/wiki/Latitude#Parametric_(or_reduced)_latitude b_lat1 = atan((1 - flattening) * tan(radians(lat1))) b_lat2 = atan((1 - flattening) * tan(radians(lat2))) # Compute central angle between two points # using haversine theta. sigma = haversine_distance / equatorial radius sigma = haversine_distance(lat1, lon1, lat2, lon2) / EQUATORIAL_RADIUS # Intermediate P and Q values p_value = (b_lat1 + b_lat2) / 2 q_value = (b_lat2 - b_lat1) / 2 # Intermediate X value # X = (sigma - sin(sigma)) * sin^2Pcos^2Q / cos^2(sigma/2) x_numerator = (sin(p_value) ** 2) * (cos(q_value) ** 2) x_demonimator = cos(sigma / 2) ** 2 x_value = (sigma - sin(sigma)) * (x_numerator / x_demonimator) # Intermediate Y value # Y = (sigma + sin(sigma)) * cos^2Psin^2Q / sin^2(sigma/2) y_numerator = (cos(p_value) ** 2) * (sin(q_value) ** 2) y_denominator = sin(sigma / 2) ** 2 y_value = (sigma + sin(sigma)) * (y_numerator / y_denominator) return EQUATORIAL_RADIUS * (sigma - ((flattening / 2) * (x_value + y_value))) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: geometry/__init__.py ================================================ ================================================ FILE: geometry/geometry.py ================================================ from __future__ import annotations import math from dataclasses import dataclass, field from types import NoneType from typing import Self # Building block classes @dataclass class Angle: """ An Angle in degrees (unit of measurement) >>> Angle() Angle(degrees=90) >>> Angle(45.5) Angle(degrees=45.5) >>> Angle(-1) Traceback (most recent call last): ... TypeError: degrees must be a numeric value between 0 and 360. >>> Angle(361) Traceback (most recent call last): ... TypeError: degrees must be a numeric value between 0 and 360. """ degrees: float = 90 def __post_init__(self) -> None: if not isinstance(self.degrees, (int, float)) or not 0 <= self.degrees <= 360: raise TypeError("degrees must be a numeric value between 0 and 360.") @dataclass class Side: """ A side of a two dimensional Shape such as Polygon, etc. adjacent_sides: a list of sides which are adjacent to the current side angle: the angle in degrees between each adjacent side length: the length of the current side in meters >>> Side(5) Side(length=5, angle=Angle(degrees=90), next_side=None) >>> Side(5, Angle(45.6)) Side(length=5, angle=Angle(degrees=45.6), next_side=None) >>> Side(5, Angle(45.6), Side(1, Angle(2))) # doctest: +ELLIPSIS Side(length=5, angle=Angle(degrees=45.6), next_side=Side(length=1, angle=Angle(d... >>> Side(-1) Traceback (most recent call last): ... TypeError: length must be a positive numeric value. >>> Side(5, None) Traceback (most recent call last): ... TypeError: angle must be an Angle object. >>> Side(5, Angle(90), "Invalid next_side") Traceback (most recent call last): ... TypeError: next_side must be a Side or None. """ length: float angle: Angle = field(default_factory=Angle) next_side: Side | None = None def __post_init__(self) -> None: if not isinstance(self.length, (int, float)) or self.length <= 0: raise TypeError("length must be a positive numeric value.") if not isinstance(self.angle, Angle): raise TypeError("angle must be an Angle object.") if not isinstance(self.next_side, (Side, NoneType)): raise TypeError("next_side must be a Side or None.") @dataclass class Ellipse: """ A geometric Ellipse on a 2D surface >>> Ellipse(5, 10) Ellipse(major_radius=5, minor_radius=10) >>> Ellipse(5, 10) is Ellipse(5, 10) False >>> Ellipse(5, 10) == Ellipse(5, 10) True """ major_radius: float minor_radius: float @property def area(self) -> float: """ >>> Ellipse(5, 10).area 157.07963267948966 """ return math.pi * self.major_radius * self.minor_radius @property def perimeter(self) -> float: """ >>> Ellipse(5, 10).perimeter 47.12388980384689 """ return math.pi * (self.major_radius + self.minor_radius) class Circle(Ellipse): """ A geometric Circle on a 2D surface >>> Circle(5) Circle(radius=5) >>> Circle(5) is Circle(5) False >>> Circle(5) == Circle(5) True >>> Circle(5).area 78.53981633974483 >>> Circle(5).perimeter 31.41592653589793 """ def __init__(self, radius: float) -> None: super().__init__(radius, radius) self.radius = radius def __repr__(self) -> str: return f"Circle(radius={self.radius})" @property def diameter(self) -> float: """ >>> Circle(5).diameter 10 """ return self.radius * 2 def max_parts(self, num_cuts: float) -> float: """ Return the maximum number of parts that circle can be divided into if cut 'num_cuts' times. >>> circle = Circle(5) >>> circle.max_parts(0) 1.0 >>> circle.max_parts(7) 29.0 >>> circle.max_parts(54) 1486.0 >>> circle.max_parts(22.5) 265.375 >>> circle.max_parts(-222) Traceback (most recent call last): ... TypeError: num_cuts must be a positive numeric value. >>> circle.max_parts("-222") Traceback (most recent call last): ... TypeError: num_cuts must be a positive numeric value. """ if not isinstance(num_cuts, (int, float)) or num_cuts < 0: raise TypeError("num_cuts must be a positive numeric value.") return (num_cuts + 2 + num_cuts**2) * 0.5 @dataclass class Polygon: """ An abstract class which represents Polygon on a 2D surface. >>> Polygon() Polygon(sides=[]) >>> polygon = Polygon() >>> polygon.add_side(Side(5)).get_side(0) Side(length=5, angle=Angle(degrees=90), next_side=None) >>> polygon.get_side(1) Traceback (most recent call last): ... IndexError: list index out of range >>> polygon.set_side(0, Side(10)).get_side(0) Side(length=10, angle=Angle(degrees=90), next_side=None) >>> polygon.set_side(1, Side(10)) Traceback (most recent call last): ... IndexError: list assignment index out of range """ sides: list[Side] = field(default_factory=list) def add_side(self, side: Side) -> Self: """ >>> Polygon().add_side(Side(5)) Polygon(sides=[Side(length=5, angle=Angle(degrees=90), next_side=None)]) """ self.sides.append(side) return self def get_side(self, index: int) -> Side: """ >>> Polygon().get_side(0) Traceback (most recent call last): ... IndexError: list index out of range >>> Polygon().add_side(Side(5)).get_side(-1) Side(length=5, angle=Angle(degrees=90), next_side=None) """ return self.sides[index] def set_side(self, index: int, side: Side) -> Self: """ >>> Polygon().set_side(0, Side(5)) Traceback (most recent call last): ... IndexError: list assignment index out of range >>> Polygon().add_side(Side(5)).set_side(0, Side(10)) Polygon(sides=[Side(length=10, angle=Angle(degrees=90), next_side=None)]) """ self.sides[index] = side return self class Rectangle(Polygon): """ A geometric rectangle on a 2D surface. >>> rectangle_one = Rectangle(5, 10) >>> rectangle_one.perimeter() 30 >>> rectangle_one.area() 50 >>> Rectangle(-5, 10) Traceback (most recent call last): ... TypeError: length must be a positive numeric value. """ def __init__(self, short_side_length: float, long_side_length: float) -> None: super().__init__() self.short_side_length = short_side_length self.long_side_length = long_side_length self.post_init() def post_init(self) -> None: """ >>> Rectangle(5, 10) # doctest: +NORMALIZE_WHITESPACE Rectangle(sides=[Side(length=5, angle=Angle(degrees=90), next_side=None), Side(length=10, angle=Angle(degrees=90), next_side=None)]) """ self.short_side = Side(self.short_side_length) self.long_side = Side(self.long_side_length) super().add_side(self.short_side) super().add_side(self.long_side) def perimeter(self) -> float: return (self.short_side.length + self.long_side.length) * 2 def area(self) -> float: return self.short_side.length * self.long_side.length @dataclass class Square(Rectangle): """ a structure which represents a geometrical square on a 2D surface >>> square_one = Square(5) >>> square_one.perimeter() 20 >>> square_one.area() 25 """ def __init__(self, side_length: float) -> None: super().__init__(side_length, side_length) def perimeter(self) -> float: return super().perimeter() def area(self) -> float: return super().area() if __name__ == "__main__": __import__("doctest").testmod() ================================================ FILE: geometry/graham_scan.py ================================================ """ Graham Scan algorithm for finding the convex hull of a set of points. The Graham scan is a method of computing the convex hull of a finite set of points in the plane with time complexity O(n log n). It is named after Ronald Graham, who published the original algorithm in 1972. The algorithm finds all vertices of the convex hull ordered along its boundary. It uses a stack to efficiently identify and remove points that would create non-convex angles. References: - https://en.wikipedia.org/wiki/Graham_scan - Graham, R.L. (1972). "An Efficient Algorithm for Determining the Convex Hull of a Finite Planar Set" """ from __future__ import annotations from collections.abc import Sequence from dataclasses import dataclass from typing import TypeVar T = TypeVar("T", bound="Point") @dataclass class Point: """ A point in 2D space. >>> Point(0, 0) Point(x=0.0, y=0.0) >>> Point(1.5, 2.5) Point(x=1.5, y=2.5) """ x: float y: float def __init__(self, x_coordinate: float, y_coordinate: float) -> None: """ Initialize a 2D point. Args: x_coordinate: The x-coordinate (horizontal position) of the point y_coordinate: The y-coordinate (vertical position) of the point """ self.x = float(x_coordinate) self.y = float(y_coordinate) def __eq__(self, other: object) -> bool: """ Check if two points are equal. >>> Point(1, 2) == Point(1, 2) True >>> Point(1, 2) == Point(2, 1) False """ if not isinstance(other, Point): return NotImplemented return self.x == other.x and self.y == other.y def __lt__(self, other: Point) -> bool: """ Compare two points for sorting (bottom-most, then left-most). >>> Point(1, 2) < Point(1, 3) True >>> Point(1, 2) < Point(2, 2) True >>> Point(2, 2) < Point(1, 2) False """ if self.y == other.y: return self.x < other.x return self.y < other.y def euclidean_distance(self, other: Point) -> float: """ Calculate Euclidean distance between two points. >>> Point(0, 0).euclidean_distance(Point(3, 4)) 5.0 >>> Point(1, 1).euclidean_distance(Point(4, 5)) 5.0 """ return ((self.x - other.x) ** 2 + (self.y - other.y) ** 2) ** 0.5 def consecutive_orientation(self, point_a: Point, point_b: Point) -> float: """ Calculate the cross product of vectors (self -> point_a) and (point_a -> point_b). Returns: - Positive value: counter-clockwise turn - Negative value: clockwise turn - Zero: collinear points >>> Point(0, 0).consecutive_orientation(Point(1, 0), Point(1, 1)) 1.0 >>> Point(0, 0).consecutive_orientation(Point(1, 0), Point(1, -1)) -1.0 >>> Point(0, 0).consecutive_orientation(Point(1, 0), Point(2, 0)) 0.0 """ return (point_a.x - self.x) * (point_b.y - point_a.y) - (point_a.y - self.y) * ( point_b.x - point_a.x ) def graham_scan(points: Sequence[Point]) -> list[Point]: """ Find the convex hull of a set of points using the Graham scan algorithm. The algorithm works as follows: 1. Find the bottom-most point (or left-most in case of tie) 2. Sort all other points by polar angle with respect to the bottom-most point 3. Process points in order, maintaining a stack of hull candidates 4. Remove points that would create a clockwise turn Args: points: A sequence of Point objects Returns: A list of Point objects representing the convex hull in counter-clockwise order. Returns an empty list if there are fewer than 3 distinct points or if all points are collinear. Time Complexity: O(n log n) due to sorting Space Complexity: O(n) for the output hull >>> graham_scan([]) [] >>> graham_scan([Point(0, 0)]) [] >>> graham_scan([Point(0, 0), Point(1, 1)]) [] >>> hull = graham_scan([Point(0, 0), Point(1, 0), Point(0.5, 1)]) >>> len(hull) 3 >>> Point(0, 0) in hull and Point(1, 0) in hull and Point(0.5, 1) in hull True """ if len(points) <= 2: return [] # Find the bottom-most point (left-most in case of tie) min_point = min(points) # Remove the min_point from the list points_list = [p for p in points if p != min_point] if not points_list: # Edge case where all points are the same return [] def polar_angle_key(point: Point) -> tuple[float, float, float]: """ Key function for sorting points by polar angle relative to min_point. Points are sorted counter-clockwise. When two points have the same angle, the farther point comes first (we'll remove duplicates later). """ # We use a dummy third point (min_point itself) to calculate relative angles # Instead, we'll compute the angle between points dx = point.x - min_point.x dy = point.y - min_point.y # Use atan2 for angle, but we can also use cross product for comparison # For sorting, we compare orientations between consecutive points distance = min_point.euclidean_distance(point) return (dx, dy, -distance) # Negative distance to sort farther points first # Sort by polar angle using a comparison based on cross product def compare_points(point_a: Point, point_b: Point) -> int: """Compare two points by polar angle relative to min_point.""" orientation = min_point.consecutive_orientation(point_a, point_b) if orientation < 0.0: return 1 # point_a comes after point_b (clockwise) elif orientation > 0.0: return -1 # point_a comes before point_b (counter-clockwise) else: # Collinear: farther point should come first dist_a = min_point.euclidean_distance(point_a) dist_b = min_point.euclidean_distance(point_b) if dist_b < dist_a: return -1 elif dist_b > dist_a: return 1 else: return 0 from functools import cmp_to_key points_list.sort(key=cmp_to_key(compare_points)) # Build the convex hull convex_hull: list[Point] = [min_point, points_list[0]] for point in points_list[1:]: # Skip consecutive points with the same angle (collinear with min_point) if min_point.consecutive_orientation(point, convex_hull[-1]) == 0.0: continue # Remove points that create a clockwise turn (or are collinear) while len(convex_hull) >= 2: orientation = convex_hull[-2].consecutive_orientation( convex_hull[-1], point ) if orientation <= 0.0: convex_hull.pop() else: break convex_hull.append(point) # Need at least 3 points for a valid convex hull if len(convex_hull) <= 2: return [] return convex_hull if __name__ == "__main__": import doctest doctest.testmod() # Example usage points = [ Point(0, 0), Point(1, 0), Point(2, 0), Point(2, 1), Point(2, 2), Point(1, 2), Point(0, 2), Point(0, 1), Point(1, 1), # Interior point ] hull = graham_scan(points) print("Convex hull vertices:") for point in hull: print(f" ({point.x}, {point.y})") ================================================ FILE: geometry/jarvis_march.py ================================================ """ Jarvis March (Gift Wrapping) algorithm for finding the convex hull of a set of points. The convex hull is the smallest convex polygon that contains all the points. Time Complexity: O(n*h) where n is the number of points and h is the number of hull points. Space Complexity: O(h) where h is the number of hull points. USAGE: -> Import this file into your project. -> Use the jarvis_march() function to find the convex hull of a set of points. -> Parameters: -> points: A list of Point objects representing 2D coordinates REFERENCES: -> Wikipedia reference: https://en.wikipedia.org/wiki/Gift_wrapping_algorithm -> GeeksforGeeks: https://www.geeksforgeeks.org/convex-hull-set-1-jarviss-algorithm-or-wrapping/ """ from __future__ import annotations class Point: """Represents a 2D point with x and y coordinates.""" def __init__(self, x_coordinate: float, y_coordinate: float) -> None: self.x = x_coordinate self.y = y_coordinate def __eq__(self, other: object) -> bool: if not isinstance(other, Point): return NotImplemented return self.x == other.x and self.y == other.y def __repr__(self) -> str: return f"Point({self.x}, {self.y})" def __hash__(self) -> int: return hash((self.x, self.y)) def _cross_product(origin: Point, point_a: Point, point_b: Point) -> float: """ Calculate the cross product of vectors OA and OB. Returns: > 0: Counter-clockwise turn (left turn) = 0: Collinear < 0: Clockwise turn (right turn) """ return (point_a.x - origin.x) * (point_b.y - origin.y) - (point_a.y - origin.y) * ( point_b.x - origin.x ) def _is_point_on_segment(p1: Point, p2: Point, point: Point) -> bool: """Check if a point lies on the line segment between p1 and p2.""" # Check if point is collinear with segment endpoints cross = (point.y - p1.y) * (p2.x - p1.x) - (point.x - p1.x) * (p2.y - p1.y) if abs(cross) > 1e-9: return False # Check if point is within the bounding box of the segment return min(p1.x, p2.x) <= point.x <= max(p1.x, p2.x) and min( p1.y, p2.y ) <= point.y <= max(p1.y, p2.y) def _find_leftmost_point(points: list[Point]) -> int: """Find index of leftmost point (and bottom-most in case of tie).""" left_idx = 0 for i in range(1, len(points)): if points[i].x < points[left_idx].x or ( points[i].x == points[left_idx].x and points[i].y < points[left_idx].y ): left_idx = i return left_idx def _find_next_hull_point(points: list[Point], current_idx: int) -> int: """Find the next point on the convex hull.""" next_idx = (current_idx + 1) % len(points) # Ensure next_idx is not the same as current_idx while next_idx == current_idx: next_idx = (next_idx + 1) % len(points) for i in range(len(points)): if i == current_idx: continue cross = _cross_product(points[current_idx], points[i], points[next_idx]) if cross > 0: next_idx = i return next_idx def _is_valid_polygon(hull: list[Point]) -> bool: """Check if hull forms a valid polygon (has at least one non-collinear turn).""" for i in range(len(hull)): p1 = hull[i] p2 = hull[(i + 1) % len(hull)] p3 = hull[(i + 2) % len(hull)] if abs(_cross_product(p1, p2, p3)) > 1e-9: return True return False def _add_point_to_hull(hull: list[Point], point: Point) -> None: """Add a point to hull, removing collinear intermediate points.""" last = len(hull) - 1 if len(hull) > 1 and _is_point_on_segment(hull[last - 1], hull[last], point): hull[last] = Point(point.x, point.y) else: hull.append(Point(point.x, point.y)) def jarvis_march(points: list[Point]) -> list[Point]: """ Find the convex hull of a set of points using the Jarvis March algorithm. The algorithm starts with the leftmost point and wraps around the set of points, selecting the most counter-clockwise point at each step. Args: points: List of Point objects representing 2D coordinates Returns: List of Points that form the convex hull in counter-clockwise order. Returns empty list if there are fewer than 3 non-collinear points. """ if len(points) <= 2: return [] # Remove duplicate points to avoid infinite loops unique_points = list(set(points)) if len(unique_points) <= 2: return [] convex_hull: list[Point] = [] # Find the leftmost point left_point_idx = _find_leftmost_point(unique_points) convex_hull.append( Point(unique_points[left_point_idx].x, unique_points[left_point_idx].y) ) current_idx = left_point_idx while True: # Find the next counter-clockwise point next_idx = _find_next_hull_point(unique_points, current_idx) if next_idx == left_point_idx: break if next_idx == current_idx: break current_idx = next_idx _add_point_to_hull(convex_hull, unique_points[current_idx]) # Check for degenerate cases if len(convex_hull) <= 2: return [] # Check if last point is collinear with first and second-to-last last = len(convex_hull) - 1 if _is_point_on_segment(convex_hull[last - 1], convex_hull[last], convex_hull[0]): convex_hull.pop() if len(convex_hull) == 2: return [] # Verify the hull forms a valid polygon if not _is_valid_polygon(convex_hull): return [] return convex_hull if __name__ == "__main__": # Example usage points = [Point(0, 0), Point(1, 1), Point(0, 1), Point(1, 0), Point(0.5, 0.5)] hull = jarvis_march(points) print(f"Convex hull: {hull}") ================================================ FILE: geometry/tests/__init__.py ================================================ ================================================ FILE: geometry/tests/test_graham_scan.py ================================================ """ Tests for the Graham scan convex hull algorithm. """ from geometry.graham_scan import Point, graham_scan def test_empty_points() -> None: """Test with no points.""" assert graham_scan([]) == [] def test_single_point() -> None: """Test with a single point.""" assert graham_scan([Point(0, 0)]) == [] def test_two_points() -> None: """Test with two points.""" assert graham_scan([Point(0, 0), Point(1, 1)]) == [] def test_duplicate_points() -> None: """Test with all duplicate points.""" p = Point(0, 0) points = [p, Point(0, 0), Point(0, 0), Point(0, 0), Point(0, 0)] assert graham_scan(points) == [] def test_collinear_points() -> None: """Test with all points on the same line.""" points = [ Point(1, 0), Point(2, 0), Point(3, 0), Point(4, 0), Point(5, 0), ] assert graham_scan(points) == [] def test_triangle() -> None: """Test with a triangle (3 points).""" p1 = Point(1, 1) p2 = Point(2, 1) p3 = Point(1.5, 2) points = [p1, p2, p3] hull = graham_scan(points) assert len(hull) == 3 assert p1 in hull assert p2 in hull assert p3 in hull def test_rectangle() -> None: """Test with a rectangle (4 points).""" p1 = Point(1, 1) p2 = Point(2, 1) p3 = Point(2, 2) p4 = Point(1, 2) points = [p1, p2, p3, p4] hull = graham_scan(points) assert len(hull) == 4 assert all(p in hull for p in points) def test_triangle_with_interior_points() -> None: """Test triangle with points inside.""" p1 = Point(1, 1) p2 = Point(2, 1) p3 = Point(1.5, 2) p4 = Point(1.5, 1.5) # Interior p5 = Point(1.2, 1.3) # Interior p6 = Point(1.8, 1.2) # Interior p7 = Point(1.5, 1.9) # Interior hull_points = [p1, p2, p3] interior_points = [p4, p5, p6, p7] all_points = hull_points + interior_points hull = graham_scan(all_points) # All hull points should be in the result for p in hull_points: assert p in hull # No interior points should be in the result for p in interior_points: assert p not in hull def test_rectangle_with_interior_points() -> None: """Test rectangle with points inside.""" p1 = Point(1, 1) p2 = Point(2, 1) p3 = Point(2, 2) p4 = Point(1, 2) p5 = Point(1.5, 1.5) # Interior p6 = Point(1.2, 1.3) # Interior p7 = Point(1.8, 1.2) # Interior p8 = Point(1.9, 1.7) # Interior p9 = Point(1.4, 1.9) # Interior hull_points = [p1, p2, p3, p4] interior_points = [p5, p6, p7, p8, p9] all_points = hull_points + interior_points hull = graham_scan(all_points) # All hull points should be in the result for p in hull_points: assert p in hull # No interior points should be in the result for p in interior_points: assert p not in hull def test_star_shape() -> None: """Test with a star shape where only tips are on the convex hull.""" # Tips of the star (on convex hull) p1 = Point(-5, 6) p2 = Point(-11, 0) p3 = Point(-9, -8) p4 = Point(4, 4) p5 = Point(6, -7) # Interior points (not on convex hull) p6 = Point(-7, -2) p7 = Point(-2, -4) p8 = Point(0, 1) p9 = Point(1, 0) p10 = Point(-6, 1) hull_points = [p1, p2, p3, p4, p5] interior_points = [p6, p7, p8, p9, p10] all_points = hull_points + interior_points hull = graham_scan(all_points) # All hull points should be in the result for p in hull_points: assert p in hull # No interior points should be in the result for p in interior_points: assert p not in hull def test_rectangle_with_collinear_points() -> None: """Test rectangle with points on the edges (collinear with vertices).""" p1 = Point(1, 1) p2 = Point(2, 1) p3 = Point(2, 2) p4 = Point(1, 2) p5 = Point(1.5, 1) # On edge p1-p2 p6 = Point(1, 1.5) # On edge p1-p4 p7 = Point(2, 1.5) # On edge p2-p3 p8 = Point(1.5, 2) # On edge p3-p4 hull_points = [p1, p2, p3, p4] edge_points = [p5, p6, p7, p8] all_points = hull_points + edge_points hull = graham_scan(all_points) # All corner points should be in the result for p in hull_points: assert p in hull # Edge points should not be in the result (only corners) for p in edge_points: assert p not in hull def test_point_equality() -> None: """Test Point equality.""" p1 = Point(1, 2) p2 = Point(1, 2) p3 = Point(2, 1) assert p1 == p2 assert p1 != p3 def test_point_comparison() -> None: """Test Point comparison for sorting.""" p1 = Point(1, 2) p2 = Point(1, 3) p3 = Point(2, 2) assert p1 < p2 # Lower y value assert p1 < p3 # Same y, lower x assert not p2 < p1 def test_euclidean_distance() -> None: """Test Euclidean distance calculation.""" p1 = Point(0, 0) p2 = Point(3, 4) assert p1.euclidean_distance(p2) == 5.0 def test_consecutive_orientation() -> None: """Test orientation calculation.""" p1 = Point(0, 0) p2 = Point(1, 0) p3_ccw = Point(1, 1) # Counter-clockwise p3_cw = Point(1, -1) # Clockwise p3_collinear = Point(2, 0) # Collinear assert p1.consecutive_orientation(p2, p3_ccw) > 0 # Counter-clockwise assert p1.consecutive_orientation(p2, p3_cw) < 0 # Clockwise assert p1.consecutive_orientation(p2, p3_collinear) == 0 # Collinear def test_large_hull() -> None: """Test with a larger set of points.""" # Create a circle of points import math points = [] for i in range(20): angle = 2 * math.pi * i / 20 x = math.cos(angle) y = math.sin(angle) points.append(Point(x, y)) # Add some interior points points.append(Point(0, 0)) points.append(Point(0.5, 0.5)) points.append(Point(-0.3, 0.2)) hull = graham_scan(points) # The hull should contain the circle points but not the interior points assert len(hull) >= 3 assert Point(0, 0) not in hull assert Point(0.5, 0.5) not in hull assert Point(-0.3, 0.2) not in hull def test_random_order() -> None: """Test that point order doesn't affect the result.""" p1 = Point(0, 0) p2 = Point(4, 0) p3 = Point(4, 3) p4 = Point(0, 3) p5 = Point(2, 1.5) # Interior # Try different orderings order1 = [p1, p2, p3, p4, p5] order2 = [p5, p4, p3, p2, p1] order3 = [p3, p5, p1, p4, p2] hull1 = graham_scan(order1) hull2 = graham_scan(order2) hull3 = graham_scan(order3) # All should have the same points (though possibly in different order) assert len(hull1) == len(hull2) == len(hull3) == 4 assert {(p.x, p.y) for p in hull1} == {(p.x, p.y) for p in hull2} assert {(p.x, p.y) for p in hull2} == {(p.x, p.y) for p in hull3} ================================================ FILE: geometry/tests/test_jarvis_march.py ================================================ """ Unit tests for Jarvis March (Gift Wrapping) algorithm. """ from geometry.jarvis_march import Point, jarvis_march class TestPoint: """Tests for the Point class.""" def test_point_creation(self) -> None: """Test Point initialization.""" p = Point(1.0, 2.0) assert p.x == 1.0 assert p.y == 2.0 def test_point_equality(self) -> None: """Test Point equality comparison.""" p1 = Point(1.0, 2.0) p2 = Point(1.0, 2.0) p3 = Point(2.0, 1.0) assert p1 == p2 assert p1 != p3 def test_point_repr(self) -> None: """Test Point string representation.""" p = Point(1.5, 2.5) assert repr(p) == "Point(1.5, 2.5)" def test_point_hash(self) -> None: """Test Point hashing.""" p1 = Point(1.0, 2.0) p2 = Point(1.0, 2.0) assert hash(p1) == hash(p2) class TestJarvisMarch: """Tests for the jarvis_march function.""" def test_triangle(self) -> None: """Test convex hull of a triangle.""" p1, p2, p3 = Point(1, 1), Point(2, 1), Point(1.5, 2) hull = jarvis_march([p1, p2, p3]) assert len(hull) == 3 assert all(p in hull for p in [p1, p2, p3]) def test_collinear_points(self) -> None: """Test that collinear points return empty hull.""" points = [Point(i, 0) for i in range(5)] hull = jarvis_march(points) assert hull == [] def test_rectangle_with_interior_point(self) -> None: """Test rectangle with interior point - interior point excluded.""" p1, p2 = Point(1, 1), Point(2, 1) p3, p4 = Point(2, 2), Point(1, 2) p5 = Point(1.5, 1.5) hull = jarvis_march([p1, p2, p3, p4, p5]) assert len(hull) == 4 assert p5 not in hull def test_star_shape(self) -> None: """Test star shape - only tips are in hull.""" tips = [ Point(-5, 6), Point(-11, 0), Point(-9, -8), Point(4, 4), Point(6, -7), ] interior = [Point(-7, -2), Point(-2, -4), Point(0, 1)] hull = jarvis_march(tips + interior) assert len(hull) == 5 assert all(p in hull for p in tips) assert not any(p in hull for p in interior) def test_empty_list(self) -> None: """Test empty list returns empty hull.""" assert jarvis_march([]) == [] def test_single_point(self) -> None: """Test single point returns empty hull.""" assert jarvis_march([Point(0, 0)]) == [] def test_two_points(self) -> None: """Test two points return empty hull.""" assert jarvis_march([Point(0, 0), Point(1, 1)]) == [] def test_square(self) -> None: """Test convex hull of a square.""" p1, p2 = Point(0, 0), Point(1, 0) p3, p4 = Point(1, 1), Point(0, 1) hull = jarvis_march([p1, p2, p3, p4]) assert len(hull) == 4 assert all(p in hull for p in [p1, p2, p3, p4]) def test_duplicate_points(self) -> None: """Test handling of duplicate points.""" p1, p2, p3 = Point(0, 0), Point(1, 0), Point(0, 1) points = [p1, p2, p3, p1, p2] # Include duplicates hull = jarvis_march(points) assert len(hull) == 3 def test_pentagon(self) -> None: """Test convex hull of a pentagon.""" points = [ Point(0, 1), Point(1, 2), Point(2, 1), Point(1.5, 0), Point(0.5, 0), ] hull = jarvis_march(points) assert len(hull) == 5 assert all(p in hull for p in points) ================================================ FILE: graphics/__init__.py ================================================ ================================================ FILE: graphics/bezier_curve.py ================================================ # https://en.wikipedia.org/wiki/B%C3%A9zier_curve # https://www.tutorialspoint.com/computer_graphics/computer_graphics_curves.htm from __future__ import annotations from scipy.special import comb class BezierCurve: """ Bezier curve is a weighted sum of a set of control points. Generate Bezier curves from a given set of control points. This implementation works only for 2d coordinates in the xy plane. """ def __init__(self, list_of_points: list[tuple[float, float]]): """ list_of_points: Control points in the xy plane on which to interpolate. These points control the behavior (shape) of the Bezier curve. """ self.list_of_points = list_of_points # Degree determines the flexibility of the curve. # Degree = 1 will produce a straight line. self.degree = len(list_of_points) - 1 def basis_function(self, t: float) -> list[float]: """ The basis function determines the weight of each control point at time t. t: time value between 0 and 1 inclusive at which to evaluate the basis of the curve. returns the x, y values of basis function at time t >>> curve = BezierCurve([(1,1), (1,2)]) >>> [float(x) for x in curve.basis_function(0)] [1.0, 0.0] >>> [float(x) for x in curve.basis_function(1)] [0.0, 1.0] """ assert 0 <= t <= 1, "Time t must be between 0 and 1." output_values: list[float] = [] for i in range(len(self.list_of_points)): # basis function for each i output_values.append( comb(self.degree, i) * ((1 - t) ** (self.degree - i)) * (t**i) ) # the basis must sum up to 1 for it to produce a valid Bezier curve. assert round(sum(output_values), 5) == 1 return output_values def bezier_curve_function(self, t: float) -> tuple[float, float]: """ The function to produce the values of the Bezier curve at time t. t: the value of time t at which to evaluate the Bezier function Returns the x, y coordinates of the Bezier curve at time t. The first point in the curve is when t = 0. The last point in the curve is when t = 1. >>> curve = BezierCurve([(1,1), (1,2)]) >>> tuple(float(x) for x in curve.bezier_curve_function(0)) (1.0, 1.0) >>> tuple(float(x) for x in curve.bezier_curve_function(1)) (1.0, 2.0) """ assert 0 <= t <= 1, "Time t must be between 0 and 1." basis_function = self.basis_function(t) x = 0.0 y = 0.0 for i in range(len(self.list_of_points)): # For all points, sum up the product of i-th basis function and i-th point. x += basis_function[i] * self.list_of_points[i][0] y += basis_function[i] * self.list_of_points[i][1] return (x, y) def plot_curve(self, step_size: float = 0.01): """ Plots the Bezier curve using matplotlib plotting capabilities. step_size: defines the step(s) at which to evaluate the Bezier curve. The smaller the step size, the finer the curve produced. """ from matplotlib import pyplot as plt to_plot_x: list[float] = [] # x coordinates of points to plot to_plot_y: list[float] = [] # y coordinates of points to plot t = 0.0 while t <= 1: value = self.bezier_curve_function(t) to_plot_x.append(value[0]) to_plot_y.append(value[1]) t += step_size x = [i[0] for i in self.list_of_points] y = [i[1] for i in self.list_of_points] plt.plot( to_plot_x, to_plot_y, color="blue", label="Curve of Degree " + str(self.degree), ) plt.scatter(x, y, color="red", label="Control Points") plt.legend() plt.show() if __name__ == "__main__": import doctest doctest.testmod() BezierCurve([(1, 2), (3, 5)]).plot_curve() # degree 1 BezierCurve([(0, 0), (5, 5), (5, 0)]).plot_curve() # degree 2 BezierCurve([(0, 0), (5, 5), (5, 0), (2.5, -2.5)]).plot_curve() # degree 3 ================================================ FILE: graphics/butterfly_pattern.py ================================================ def butterfly_pattern(n: int) -> str: """ Creates a butterfly pattern of size n and returns it as a string. >>> print(butterfly_pattern(3)) * * ** ** ***** ** ** * * >>> print(butterfly_pattern(5)) * * ** ** *** *** **** **** ********* **** **** *** *** ** ** * * """ result = [] # Upper part for i in range(1, n): left_stars = "*" * i spaces = " " * (2 * (n - i) - 1) right_stars = "*" * i result.append(left_stars + spaces + right_stars) # Middle part result.append("*" * (2 * n - 1)) # Lower part for i in range(n - 1, 0, -1): left_stars = "*" * i spaces = " " * (2 * (n - i) - 1) right_stars = "*" * i result.append(left_stars + spaces + right_stars) return "\n".join(result) if __name__ == "__main__": n = int(input("Enter the size of the butterfly pattern: ")) print(butterfly_pattern(n)) ================================================ FILE: graphics/digital_differential_analyzer_line.py ================================================ import matplotlib.pyplot as plt def digital_differential_analyzer_line( p1: tuple[int, int], p2: tuple[int, int] ) -> list[tuple[int, int]]: """ Draws a line between two points using the DDA algorithm. Args: - p1: Coordinates of the starting point. - p2: Coordinates of the ending point. Returns: - List of coordinate points that form the line. >>> digital_differential_analyzer_line((1, 1), (4, 4)) [(2, 2), (3, 3), (4, 4)] """ x1, y1 = p1 x2, y2 = p2 dx = x2 - x1 dy = y2 - y1 steps = max(abs(dx), abs(dy)) x_increment = dx / float(steps) y_increment = dy / float(steps) coordinates = [] x: float = x1 y: float = y1 for _ in range(steps): x += x_increment y += y_increment coordinates.append((round(x), round(y))) return coordinates if __name__ == "__main__": import doctest doctest.testmod() x1 = int(input("Enter the x-coordinate of the starting point: ")) y1 = int(input("Enter the y-coordinate of the starting point: ")) x2 = int(input("Enter the x-coordinate of the ending point: ")) y2 = int(input("Enter the y-coordinate of the ending point: ")) coordinates = digital_differential_analyzer_line((x1, y1), (x2, y2)) x_points, y_points = zip(*coordinates) plt.plot(x_points, y_points, marker="o") plt.title("Digital Differential Analyzer Line Drawing Algorithm") plt.xlabel("X-axis") plt.ylabel("Y-axis") plt.grid() plt.show() ================================================ FILE: graphics/vector3_for_2d_rendering.py ================================================ """ render 3d points for 2d surfaces. """ from __future__ import annotations import math __version__ = "2020.9.26" __author__ = "xcodz-dot, cclaus, dhruvmanila" def convert_to_2d( x: float, y: float, z: float, scale: float, distance: float ) -> tuple[float, float]: """ Converts 3d point to a 2d drawable point >>> convert_to_2d(1.0, 2.0, 3.0, 10.0, 10.0) (7.6923076923076925, 15.384615384615385) >>> convert_to_2d(1, 2, 3, 10, 10) (7.6923076923076925, 15.384615384615385) >>> convert_to_2d("1", 2, 3, 10, 10) # '1' is str Traceback (most recent call last): ... TypeError: Input values must either be float or int: ['1', 2, 3, 10, 10] """ if not all(isinstance(val, (float, int)) for val in locals().values()): msg = f"Input values must either be float or int: {list(locals().values())}" raise TypeError(msg) projected_x = ((x * distance) / (z + distance)) * scale projected_y = ((y * distance) / (z + distance)) * scale return projected_x, projected_y def rotate( x: float, y: float, z: float, axis: str, angle: float ) -> tuple[float, float, float]: """ rotate a point around a certain axis with a certain angle angle can be any integer between 1, 360 and axis can be any one of 'x', 'y', 'z' >>> rotate(1.0, 2.0, 3.0, 'y', 90.0) (3.130524675073759, 2.0, 0.4470070007889556) >>> rotate(1, 2, 3, "z", 180) (0.999736015495891, -2.0001319704760485, 3) >>> rotate('1', 2, 3, "z", 90.0) # '1' is str Traceback (most recent call last): ... TypeError: Input values except axis must either be float or int: ['1', 2, 3, 90.0] >>> rotate(1, 2, 3, "n", 90) # 'n' is not a valid axis Traceback (most recent call last): ... ValueError: not a valid axis, choose one of 'x', 'y', 'z' >>> rotate(1, 2, 3, "x", -90) (1, -2.5049096187183877, -2.5933429780983657) >>> rotate(1, 2, 3, "x", 450) # 450 wrap around to 90 (1, 3.5776792428178217, -0.44744970165427644) """ if not isinstance(axis, str): raise TypeError("Axis must be a str") input_variables = locals() del input_variables["axis"] if not all(isinstance(val, (float, int)) for val in input_variables.values()): msg = ( "Input values except axis must either be float or int: " f"{list(input_variables.values())}" ) raise TypeError(msg) angle = (angle % 360) / 450 * 180 / math.pi if axis == "z": new_x = x * math.cos(angle) - y * math.sin(angle) new_y = y * math.cos(angle) + x * math.sin(angle) new_z = z elif axis == "x": new_y = y * math.cos(angle) - z * math.sin(angle) new_z = z * math.cos(angle) + y * math.sin(angle) new_x = x elif axis == "y": new_x = x * math.cos(angle) - z * math.sin(angle) new_z = z * math.cos(angle) + x * math.sin(angle) new_y = y else: raise ValueError("not a valid axis, choose one of 'x', 'y', 'z'") return new_x, new_y, new_z if __name__ == "__main__": import doctest doctest.testmod() print(f"{convert_to_2d(1.0, 2.0, 3.0, 10.0, 10.0) = }") print(f"{rotate(1.0, 2.0, 3.0, 'y', 90.0) = }") ================================================ FILE: graphs/__init__.py ================================================ ================================================ FILE: graphs/a_star.py ================================================ from __future__ import annotations DIRECTIONS = [ [-1, 0], # left [0, -1], # down [1, 0], # right [0, 1], # up ] # function to search the path def search( grid: list[list[int]], init: list[int], goal: list[int], cost: int, heuristic: list[list[int]], ) -> tuple[list[list[int]], list[list[int]]]: """ Search for a path on a grid avoiding obstacles. >>> grid = [[0, 1, 0, 0, 0, 0], ... [0, 1, 0, 0, 0, 0], ... [0, 1, 0, 0, 0, 0], ... [0, 1, 0, 0, 1, 0], ... [0, 0, 0, 0, 1, 0]] >>> init = [0, 0] >>> goal = [len(grid) - 1, len(grid[0]) - 1] >>> cost = 1 >>> heuristic = [[0] * len(grid[0]) for _ in range(len(grid))] >>> heuristic = [[0 for row in range(len(grid[0]))] for col in range(len(grid))] >>> for i in range(len(grid)): ... for j in range(len(grid[0])): ... heuristic[i][j] = abs(i - goal[0]) + abs(j - goal[1]) ... if grid[i][j] == 1: ... heuristic[i][j] = 99 >>> path, action = search(grid, init, goal, cost, heuristic) >>> path # doctest: +NORMALIZE_WHITESPACE [[0, 0], [1, 0], [2, 0], [3, 0], [4, 0], [4, 1], [4, 2], [4, 3], [3, 3], [2, 3], [2, 4], [2, 5], [3, 5], [4, 5]] >>> action # doctest: +NORMALIZE_WHITESPACE [[0, 0, 0, 0, 0, 0], [2, 0, 0, 0, 0, 0], [2, 0, 0, 0, 3, 3], [2, 0, 0, 0, 0, 2], [2, 3, 3, 3, 0, 2]] """ closed = [ [0 for col in range(len(grid[0]))] for row in range(len(grid)) ] # the reference grid closed[init[0]][init[1]] = 1 action = [ [0 for col in range(len(grid[0]))] for row in range(len(grid)) ] # the action grid x = init[0] y = init[1] g = 0 f = g + heuristic[x][y] # cost from starting cell to destination cell cell = [[f, g, x, y]] found = False # flag that is set when search is complete resign = False # flag set if we can't find expand while not found and not resign: if len(cell) == 0: raise ValueError("Algorithm is unable to find solution") else: # to choose the least costliest action so as to move closer to the goal cell.sort() cell.reverse() next_cell = cell.pop() x = next_cell[2] y = next_cell[3] g = next_cell[1] if x == goal[0] and y == goal[1]: found = True else: for i in range(len(DIRECTIONS)): # to try out different valid actions x2 = x + DIRECTIONS[i][0] y2 = y + DIRECTIONS[i][1] if ( x2 >= 0 and x2 < len(grid) and y2 >= 0 and y2 < len(grid[0]) and closed[x2][y2] == 0 and grid[x2][y2] == 0 ): g2 = g + cost f2 = g2 + heuristic[x2][y2] cell.append([f2, g2, x2, y2]) closed[x2][y2] = 1 action[x2][y2] = i invpath = [] x = goal[0] y = goal[1] invpath.append([x, y]) # we get the reverse path from here while x != init[0] or y != init[1]: x2 = x - DIRECTIONS[action[x][y]][0] y2 = y - DIRECTIONS[action[x][y]][1] x = x2 y = y2 invpath.append([x, y]) path = [] for i in range(len(invpath)): path.append(invpath[len(invpath) - 1 - i]) return path, action if __name__ == "__main__": grid = [ [0, 1, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], # 0 are free path whereas 1's are obstacles [0, 1, 0, 0, 0, 0], [0, 1, 0, 0, 1, 0], [0, 0, 0, 0, 1, 0], ] init = [0, 0] # all coordinates are given in format [y,x] goal = [len(grid) - 1, len(grid[0]) - 1] cost = 1 # the cost map which pushes the path closer to the goal heuristic = [[0 for row in range(len(grid[0]))] for col in range(len(grid))] for i in range(len(grid)): for j in range(len(grid[0])): heuristic[i][j] = abs(i - goal[0]) + abs(j - goal[1]) if grid[i][j] == 1: # added extra penalty in the heuristic map heuristic[i][j] = 99 path, action = search(grid, init, goal, cost, heuristic) print("ACTION MAP") for i in range(len(action)): print(action[i]) for i in range(len(path)): print(path[i]) ================================================ FILE: graphs/ant_colony_optimization_algorithms.py ================================================ """ Use an ant colony optimization algorithm to solve the travelling salesman problem (TSP) which asks the following question: "Given a list of cities and the distances between each pair of cities, what is the shortest possible route that visits each city exactly once and returns to the origin city?" https://en.wikipedia.org/wiki/Ant_colony_optimization_algorithms https://en.wikipedia.org/wiki/Travelling_salesman_problem Author: Clark """ import copy import random cities = { 0: [0, 0], 1: [0, 5], 2: [3, 8], 3: [8, 10], 4: [12, 8], 5: [12, 4], 6: [8, 0], 7: [6, 2], } def main( cities: dict[int, list[int]], ants_num: int, iterations_num: int, pheromone_evaporation: float, alpha: float, beta: float, q: float, # Pheromone system parameters Q, which is a constant ) -> tuple[list[int], float]: """ Ant colony algorithm main function >>> main(cities=cities, ants_num=10, iterations_num=20, ... pheromone_evaporation=0.7, alpha=1.0, beta=5.0, q=10) ([0, 1, 2, 3, 4, 5, 6, 7, 0], 37.909778143828696) >>> main(cities={0: [0, 0], 1: [2, 2]}, ants_num=5, iterations_num=5, ... pheromone_evaporation=0.7, alpha=1.0, beta=5.0, q=10) ([0, 1, 0], 5.656854249492381) >>> main(cities={0: [0, 0], 1: [2, 2], 4: [4, 4]}, ants_num=5, iterations_num=5, ... pheromone_evaporation=0.7, alpha=1.0, beta=5.0, q=10) Traceback (most recent call last): ... IndexError: list index out of range >>> main(cities={}, ants_num=5, iterations_num=5, ... pheromone_evaporation=0.7, alpha=1.0, beta=5.0, q=10) Traceback (most recent call last): ... StopIteration >>> main(cities={0: [0, 0], 1: [2, 2]}, ants_num=0, iterations_num=5, ... pheromone_evaporation=0.7, alpha=1.0, beta=5.0, q=10) ([], inf) >>> main(cities={0: [0, 0], 1: [2, 2]}, ants_num=5, iterations_num=0, ... pheromone_evaporation=0.7, alpha=1.0, beta=5.0, q=10) ([], inf) >>> main(cities={0: [0, 0], 1: [2, 2]}, ants_num=5, iterations_num=5, ... pheromone_evaporation=1, alpha=1.0, beta=5.0, q=10) ([0, 1, 0], 5.656854249492381) >>> main(cities={0: [0, 0], 1: [2, 2]}, ants_num=5, iterations_num=5, ... pheromone_evaporation=0, alpha=1.0, beta=5.0, q=10) ([0, 1, 0], 5.656854249492381) """ # Initialize the pheromone matrix cities_num = len(cities) pheromone = [[1.0] * cities_num] * cities_num best_path: list[int] = [] best_distance = float("inf") for _ in range(iterations_num): ants_route = [] for _ in range(ants_num): unvisited_cities = copy.deepcopy(cities) current_city = {next(iter(cities.keys())): next(iter(cities.values()))} del unvisited_cities[next(iter(current_city.keys()))] ant_route = [next(iter(current_city.keys()))] while unvisited_cities: current_city, unvisited_cities = city_select( pheromone, current_city, unvisited_cities, alpha, beta ) ant_route.append(next(iter(current_city.keys()))) ant_route.append(0) ants_route.append(ant_route) pheromone, best_path, best_distance = pheromone_update( pheromone, cities, pheromone_evaporation, ants_route, q, best_path, best_distance, ) return best_path, best_distance def distance(city1: list[int], city2: list[int]) -> float: """ Calculate the distance between two coordinate points >>> distance([0, 0], [3, 4] ) 5.0 >>> distance([0, 0], [-3, 4] ) 5.0 >>> distance([0, 0], [-3, -4] ) 5.0 """ return (((city1[0] - city2[0]) ** 2) + ((city1[1] - city2[1]) ** 2)) ** 0.5 def pheromone_update( pheromone: list[list[float]], cities: dict[int, list[int]], pheromone_evaporation: float, ants_route: list[list[int]], q: float, # Pheromone system parameters Q, which is a constant best_path: list[int], best_distance: float, ) -> tuple[list[list[float]], list[int], float]: """ Update pheromones on the route and update the best route >>> >>> pheromone_update(pheromone=[[1.0, 1.0], [1.0, 1.0]], ... cities={0: [0,0], 1: [2,2]}, pheromone_evaporation=0.7, ... ants_route=[[0, 1, 0]], q=10, best_path=[], ... best_distance=float("inf")) ([[0.7, 4.235533905932737], [4.235533905932737, 0.7]], [0, 1, 0], 5.656854249492381) >>> pheromone_update(pheromone=[], ... cities={0: [0,0], 1: [2,2]}, pheromone_evaporation=0.7, ... ants_route=[[0, 1, 0]], q=10, best_path=[], ... best_distance=float("inf")) Traceback (most recent call last): ... IndexError: list index out of range >>> pheromone_update(pheromone=[[1.0, 1.0], [1.0, 1.0]], ... cities={}, pheromone_evaporation=0.7, ... ants_route=[[0, 1, 0]], q=10, best_path=[], ... best_distance=float("inf")) Traceback (most recent call last): ... KeyError: 0 """ for a in range(len(cities)): # Update the volatilization of pheromone on all routes for b in range(len(cities)): pheromone[a][b] *= pheromone_evaporation for ant_route in ants_route: total_distance = 0.0 for i in range(len(ant_route) - 1): # Calculate total distance total_distance += distance(cities[ant_route[i]], cities[ant_route[i + 1]]) delta_pheromone = q / total_distance for i in range(len(ant_route) - 1): # Update pheromones pheromone[ant_route[i]][ant_route[i + 1]] += delta_pheromone pheromone[ant_route[i + 1]][ant_route[i]] = pheromone[ant_route[i]][ ant_route[i + 1] ] if total_distance < best_distance: best_path = ant_route best_distance = total_distance return pheromone, best_path, best_distance def city_select( pheromone: list[list[float]], current_city: dict[int, list[int]], unvisited_cities: dict[int, list[int]], alpha: float, beta: float, ) -> tuple[dict[int, list[int]], dict[int, list[int]]]: """ Choose the next city for ants >>> city_select(pheromone=[[1.0, 1.0], [1.0, 1.0]], current_city={0: [0, 0]}, ... unvisited_cities={1: [2, 2]}, alpha=1.0, beta=5.0) ({1: [2, 2]}, {}) >>> city_select(pheromone=[], current_city={0: [0,0]}, ... unvisited_cities={1: [2, 2]}, alpha=1.0, beta=5.0) Traceback (most recent call last): ... IndexError: list index out of range >>> city_select(pheromone=[[1.0, 1.0], [1.0, 1.0]], current_city={}, ... unvisited_cities={1: [2, 2]}, alpha=1.0, beta=5.0) Traceback (most recent call last): ... StopIteration >>> city_select(pheromone=[[1.0, 1.0], [1.0, 1.0]], current_city={0: [0, 0]}, ... unvisited_cities={}, alpha=1.0, beta=5.0) Traceback (most recent call last): ... IndexError: list index out of range """ probabilities = [] for city, value in unvisited_cities.items(): city_distance = distance(value, next(iter(current_city.values()))) probability = (pheromone[city][next(iter(current_city.keys()))] ** alpha) * ( (1 / city_distance) ** beta ) probabilities.append(probability) chosen_city_i = random.choices( list(unvisited_cities.keys()), weights=probabilities )[0] chosen_city = {chosen_city_i: unvisited_cities[chosen_city_i]} del unvisited_cities[next(iter(chosen_city.keys()))] return chosen_city, unvisited_cities if __name__ == "__main__": best_path, best_distance = main( cities=cities, ants_num=10, iterations_num=20, pheromone_evaporation=0.7, alpha=1.0, beta=5.0, q=10, ) print(f"{best_path = }") print(f"{best_distance = }") ================================================ FILE: graphs/articulation_points.py ================================================ # Finding Articulation Points in Undirected Graph def compute_ap(graph): n = len(graph) out_edge_count = 0 low = [0] * n visited = [False] * n is_art = [False] * n def dfs(root, at, parent, out_edge_count): if parent == root: out_edge_count += 1 visited[at] = True low[at] = at for to in graph[at]: if to == parent: pass elif not visited[to]: out_edge_count = dfs(root, to, at, out_edge_count) low[at] = min(low[at], low[to]) # AP found via bridge if at < low[to]: is_art[at] = True # AP found via cycle if at == low[to]: is_art[at] = True else: low[at] = min(low[at], to) return out_edge_count for i in range(n): if not visited[i]: out_edge_count = 0 out_edge_count = dfs(i, i, -1, out_edge_count) is_art[i] = out_edge_count > 1 for x in range(len(is_art)): if is_art[x] is True: print(x) # Adjacency list of graph graph = { 0: [1, 2], 1: [0, 2], 2: [0, 1, 3, 5], 3: [2, 4], 4: [3], 5: [2, 6, 8], 6: [5, 7], 7: [6, 8], 8: [5, 7], } compute_ap(graph) ================================================ FILE: graphs/basic_graphs.py ================================================ from collections import deque def _input(message): return input(message).strip().split(" ") def initialize_unweighted_directed_graph( node_count: int, edge_count: int ) -> dict[int, list[int]]: graph: dict[int, list[int]] = {} for i in range(node_count): graph[i + 1] = [] for e in range(edge_count): x, y = (int(i) for i in _input(f"Edge {e + 1}: ")) graph[x].append(y) return graph def initialize_unweighted_undirected_graph( node_count: int, edge_count: int ) -> dict[int, list[int]]: graph: dict[int, list[int]] = {} for i in range(node_count): graph[i + 1] = [] for e in range(edge_count): x, y = (int(i) for i in _input(f"Edge {e + 1}: ")) graph[x].append(y) graph[y].append(x) return graph def initialize_weighted_undirected_graph( node_count: int, edge_count: int ) -> dict[int, list[tuple[int, int]]]: graph: dict[int, list[tuple[int, int]]] = {} for i in range(node_count): graph[i + 1] = [] for e in range(edge_count): x, y, w = (int(i) for i in _input(f"Edge {e + 1}: ")) graph[x].append((y, w)) graph[y].append((x, w)) return graph if __name__ == "__main__": n, m = (int(i) for i in _input("Number of nodes and edges: ")) graph_choice = int( _input( "Press 1 or 2 or 3 \n" "1. Unweighted directed \n" "2. Unweighted undirected \n" "3. Weighted undirected \n" )[0] ) g = { 1: initialize_unweighted_directed_graph, 2: initialize_unweighted_undirected_graph, 3: initialize_weighted_undirected_graph, }[graph_choice](n, m) """ -------------------------------------------------------------------------------- Depth First Search. Args : G - Dictionary of edges s - Starting Node Vars : vis - Set of visited nodes S - Traversal Stack -------------------------------------------------------------------------------- """ def dfs(g, s): """ >>> dfs({1: [2, 3], 2: [4, 5], 3: [], 4: [], 5: []}, 1) 1 2 4 5 3 """ vis, _s = {s}, [s] print(s) while _s: flag = 0 for i in g[_s[-1]]: if i not in vis: _s.append(i) vis.add(i) flag = 1 print(i) break if not flag: _s.pop() """ -------------------------------------------------------------------------------- Breadth First Search. Args : G - Dictionary of edges s - Starting Node Vars : vis - Set of visited nodes Q - Traversal Stack -------------------------------------------------------------------------------- """ def bfs(g, s): """ >>> bfs({1: [2, 3], 2: [4, 5], 3: [6, 7], 4: [], 5: [8], 6: [], 7: [], 8: []}, 1) 1 2 3 4 5 6 7 8 """ vis, q = {s}, deque([s]) print(s) while q: u = q.popleft() for v in g[u]: if v not in vis: vis.add(v) q.append(v) print(v) """ -------------------------------------------------------------------------------- Dijkstra's shortest path Algorithm Args : G - Dictionary of edges s - Starting Node Vars : dist - Dictionary storing shortest distance from s to every other node known - Set of knows nodes path - Preceding node in path -------------------------------------------------------------------------------- """ def dijk(g, s): """ dijk({1: [(2, 7), (3, 9), (6, 14)], 2: [(1, 7), (3, 10), (4, 15)], 3: [(1, 9), (2, 10), (4, 11), (6, 2)], 4: [(2, 15), (3, 11), (5, 6)], 5: [(4, 6), (6, 9)], 6: [(1, 14), (3, 2), (5, 9)]}, 1) 7 9 11 20 20 """ dist, known, path = {s: 0}, set(), {s: 0} while True: if len(known) == len(g) - 1: break mini = 100000 for key, value in dist: if key not in known and value < mini: mini = value u = key known.add(u) for v in g[u]: if v[0] not in known and dist[u] + v[1] < dist.get(v[0], 100000): dist[v[0]] = dist[u] + v[1] path[v[0]] = u for key, value in dist.items(): if key != s: print(value) """ -------------------------------------------------------------------------------- Topological Sort -------------------------------------------------------------------------------- """ def topo(g, ind=None, q=None): if q is None: q = [1] if ind is None: ind = [0] * (len(g) + 1) # SInce oth Index is ignored for u in g: for v in g[u]: ind[v] += 1 q = deque() for i in g: if ind[i] == 0: q.append(i) if len(q) == 0: return v = q.popleft() print(v) for w in g[v]: ind[w] -= 1 if ind[w] == 0: q.append(w) topo(g, ind, q) """ -------------------------------------------------------------------------------- Reading an Adjacency matrix -------------------------------------------------------------------------------- """ def adjm(): r""" Reading an Adjacency matrix Parameters: None Returns: tuple: A tuple containing a list of edges and number of edges Example: >>> # Simulate user input for 3 nodes >>> input_data = "4\n0 1 0 1\n1 0 1 0\n0 1 0 1\n1 0 1 0\n" >>> import sys,io >>> original_input = sys.stdin >>> sys.stdin = io.StringIO(input_data) # Redirect stdin for testing >>> adjm() ([(0, 1, 0, 1), (1, 0, 1, 0), (0, 1, 0, 1), (1, 0, 1, 0)], 4) >>> sys.stdin = original_input # Restore original stdin """ n = int(input().strip()) a = [] for _ in range(n): a.append(tuple(map(int, input().strip().split()))) return a, n """ -------------------------------------------------------------------------------- Floyd Warshall's algorithm Args : G - Dictionary of edges s - Starting Node Vars : dist - Dictionary storing shortest distance from s to every other node known - Set of knows nodes path - Preceding node in path -------------------------------------------------------------------------------- """ def floy(a_and_n): (a, n) = a_and_n dist = list(a) path = [[0] * n for i in range(n)] for k in range(n): for i in range(n): for j in range(n): if dist[i][j] > dist[i][k] + dist[k][j]: dist[i][j] = dist[i][k] + dist[k][j] path[i][k] = k print(dist) """ -------------------------------------------------------------------------------- Prim's MST Algorithm Args : G - Dictionary of edges s - Starting Node Vars : dist - Dictionary storing shortest distance from s to nearest node known - Set of knows nodes path - Preceding node in path -------------------------------------------------------------------------------- """ def prim(g, s): dist, known, path = {s: 0}, set(), {s: 0} while True: if len(known) == len(g) - 1: break mini = 100000 for key, value in dist.items(): if key not in known and value < mini: mini = value u = key known.add(u) for v in g[u]: if v[0] not in known and v[1] < dist.get(v[0], 100000): dist[v[0]] = v[1] path[v[0]] = u return dist """ -------------------------------------------------------------------------------- Accepting Edge list Vars : n - Number of nodes m - Number of edges Returns : l - Edge list n - Number of Nodes -------------------------------------------------------------------------------- """ def edglist(): r""" Get the edges and number of edges from the user Parameters: None Returns: tuple: A tuple containing a list of edges and number of edges Example: >>> # Simulate user input for 3 edges and 4 vertices: (1, 2), (2, 3), (3, 4) >>> input_data = "4 3\n1 2\n2 3\n3 4\n" >>> import sys,io >>> original_input = sys.stdin >>> sys.stdin = io.StringIO(input_data) # Redirect stdin for testing >>> edglist() ([(1, 2), (2, 3), (3, 4)], 4) >>> sys.stdin = original_input # Restore original stdin """ n, m = tuple(map(int, input().split(" "))) edges = [] for _ in range(m): edges.append(tuple(map(int, input().split(" ")))) return edges, n """ -------------------------------------------------------------------------------- Kruskal's MST Algorithm Args : E - Edge list n - Number of Nodes Vars : s - Set of all nodes as unique disjoint sets (initially) -------------------------------------------------------------------------------- """ def krusk(e_and_n): """ Sort edges on the basis of distance """ (e, n) = e_and_n e.sort(reverse=True, key=lambda x: x[2]) s = [{i} for i in range(1, n + 1)] while True: if len(s) == 1: break print(s) x = e.pop() for i in range(len(s)): if x[0] in s[i]: break for j in range(len(s)): if x[1] in s[j]: if i == j: break s[j].update(s[i]) s.pop(i) break def find_isolated_nodes(graph): """ Find the isolated node in the graph Parameters: graph (dict): A dictionary representing a graph. Returns: list: A list of isolated nodes. Examples: >>> graph1 = {1: [2, 3], 2: [1, 3], 3: [1, 2], 4: []} >>> find_isolated_nodes(graph1) [4] >>> graph2 = {'A': ['B', 'C'], 'B': ['A'], 'C': ['A'], 'D': []} >>> find_isolated_nodes(graph2) ['D'] >>> graph3 = {'X': [], 'Y': [], 'Z': []} >>> find_isolated_nodes(graph3) ['X', 'Y', 'Z'] >>> graph4 = {1: [2, 3], 2: [1, 3], 3: [1, 2]} >>> find_isolated_nodes(graph4) [] >>> graph5 = {} >>> find_isolated_nodes(graph5) [] """ isolated = [] for node in graph: if not graph[node]: isolated.append(node) return isolated ================================================ FILE: graphs/bellman_ford.py ================================================ from __future__ import annotations def print_distance(distance: list[float], src): print(f"Vertex\tShortest Distance from vertex {src}") for i, d in enumerate(distance): print(f"{i}\t\t{d}") def check_negative_cycle( graph: list[dict[str, int]], distance: list[float], edge_count: int ): for j in range(edge_count): u, v, w = (graph[j][k] for k in ["src", "dst", "weight"]) if distance[u] != float("inf") and distance[u] + w < distance[v]: return True return False def bellman_ford( graph: list[dict[str, int]], vertex_count: int, edge_count: int, src: int ) -> list[float]: """ Returns shortest paths from a vertex src to all other vertices. >>> edges = [(2, 1, -10), (3, 2, 3), (0, 3, 5), (0, 1, 4)] >>> g = [{"src": s, "dst": d, "weight": w} for s, d, w in edges] >>> bellman_ford(g, 4, 4, 0) [0.0, -2.0, 8.0, 5.0] >>> g = [{"src": s, "dst": d, "weight": w} for s, d, w in edges + [(1, 3, 5)]] >>> bellman_ford(g, 4, 5, 0) Traceback (most recent call last): ... Exception: Negative cycle found """ distance = [float("inf")] * vertex_count distance[src] = 0.0 for _ in range(vertex_count - 1): for j in range(edge_count): u, v, w = (graph[j][k] for k in ["src", "dst", "weight"]) if distance[u] != float("inf") and distance[u] + w < distance[v]: distance[v] = distance[u] + w negative_cycle_exists = check_negative_cycle(graph, distance, edge_count) if negative_cycle_exists: raise Exception("Negative cycle found") return distance if __name__ == "__main__": import doctest doctest.testmod() V = int(input("Enter number of vertices: ").strip()) E = int(input("Enter number of edges: ").strip()) graph: list[dict[str, int]] = [{} for _ in range(E)] for i in range(E): print("Edge ", i + 1) src, dest, weight = ( int(x) for x in input("Enter source, destination, weight: ").strip().split(" ") ) graph[i] = {"src": src, "dst": dest, "weight": weight} source = int(input("\nEnter shortest path source:").strip()) shortest_distance = bellman_ford(graph, V, E, source) print_distance(shortest_distance, 0) ================================================ FILE: graphs/bi_directional_dijkstra.py ================================================ """ Bi-directional Dijkstra's algorithm. A bi-directional approach is an efficient and less time consuming optimization for Dijkstra's searching algorithm Reference: shorturl.at/exHM7 """ # Author: Swayam Singh (https://github.com/practice404) from queue import PriorityQueue from typing import Any import numpy as np def pass_and_relaxation( graph: dict, v: str, visited_forward: set, visited_backward: set, cst_fwd: dict, cst_bwd: dict, queue: PriorityQueue, parent: dict, shortest_distance: float, ) -> float: for nxt, d in graph[v]: if nxt in visited_forward: continue old_cost_f = cst_fwd.get(nxt, np.inf) new_cost_f = cst_fwd[v] + d if new_cost_f < old_cost_f: queue.put((new_cost_f, nxt)) cst_fwd[nxt] = new_cost_f parent[nxt] = v if ( nxt in visited_backward and cst_fwd[v] + d + cst_bwd[nxt] < shortest_distance ): shortest_distance = cst_fwd[v] + d + cst_bwd[nxt] return shortest_distance def bidirectional_dij( source: str, destination: str, graph_forward: dict, graph_backward: dict ) -> int: """ Bi-directional Dijkstra's algorithm. Returns: shortest_path_distance (int): length of the shortest path. Warnings: If the destination is not reachable, function returns -1 >>> bidirectional_dij("E", "F", graph_fwd, graph_bwd) 3 """ shortest_path_distance = -1 visited_forward = set() visited_backward = set() cst_fwd = {source: 0} cst_bwd = {destination: 0} parent_forward = {source: None} parent_backward = {destination: None} queue_forward: PriorityQueue[Any] = PriorityQueue() queue_backward: PriorityQueue[Any] = PriorityQueue() shortest_distance = np.inf queue_forward.put((0, source)) queue_backward.put((0, destination)) if source == destination: return 0 while not queue_forward.empty() and not queue_backward.empty(): _, v_fwd = queue_forward.get() visited_forward.add(v_fwd) _, v_bwd = queue_backward.get() visited_backward.add(v_bwd) shortest_distance = pass_and_relaxation( graph_forward, v_fwd, visited_forward, visited_backward, cst_fwd, cst_bwd, queue_forward, parent_forward, shortest_distance, ) shortest_distance = pass_and_relaxation( graph_backward, v_bwd, visited_backward, visited_forward, cst_bwd, cst_fwd, queue_backward, parent_backward, shortest_distance, ) if cst_fwd[v_fwd] + cst_bwd[v_bwd] >= shortest_distance: break if shortest_distance != np.inf: shortest_path_distance = shortest_distance return shortest_path_distance graph_fwd = { "B": [["C", 1]], "C": [["D", 1]], "D": [["F", 1]], "E": [["B", 1], ["G", 2]], "F": [], "G": [["F", 1]], } graph_bwd = { "B": [["E", 1]], "C": [["B", 1]], "D": [["C", 1]], "F": [["D", 1], ["G", 1]], "E": [[None, np.inf]], "G": [["E", 2]], } if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: graphs/bidirectional_a_star.py ================================================ """ https://en.wikipedia.org/wiki/Bidirectional_search """ from __future__ import annotations import time from math import sqrt # 1 for manhattan, 0 for euclidean HEURISTIC = 0 grid = [ [0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0], # 0 are free path whereas 1's are obstacles [0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0], [1, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0], ] delta = [[-1, 0], [0, -1], [1, 0], [0, 1]] # up, left, down, right TPosition = tuple[int, int] class Node: """ >>> k = Node(0, 0, 4, 3, 0, None) >>> k.calculate_heuristic() 5.0 >>> n = Node(1, 4, 3, 4, 2, None) >>> n.calculate_heuristic() 2.0 >>> l = [k, n] >>> n == l[0] False >>> l.sort() >>> n == l[0] True """ def __init__( self, pos_x: int, pos_y: int, goal_x: int, goal_y: int, g_cost: int, parent: Node | None, ) -> None: self.pos_x = pos_x self.pos_y = pos_y self.pos = (pos_y, pos_x) self.goal_x = goal_x self.goal_y = goal_y self.g_cost = g_cost self.parent = parent self.h_cost = self.calculate_heuristic() self.f_cost = self.g_cost + self.h_cost def calculate_heuristic(self) -> float: """ Heuristic for the A* """ dy = self.pos_x - self.goal_x dx = self.pos_y - self.goal_y if HEURISTIC == 1: return abs(dx) + abs(dy) else: return sqrt(dy**2 + dx**2) def __lt__(self, other: Node) -> bool: return self.f_cost < other.f_cost class AStar: """ >>> astar = AStar((0, 0), (len(grid) - 1, len(grid[0]) - 1)) >>> (astar.start.pos_y + delta[3][0], astar.start.pos_x + delta[3][1]) (0, 1) >>> [x.pos for x in astar.get_successors(astar.start)] [(1, 0), (0, 1)] >>> (astar.start.pos_y + delta[2][0], astar.start.pos_x + delta[2][1]) (1, 0) >>> astar.retrace_path(astar.start) [(0, 0)] >>> astar.search() # doctest: +NORMALIZE_WHITESPACE [(0, 0), (1, 0), (2, 0), (2, 1), (2, 2), (2, 3), (3, 3), (4, 3), (4, 4), (5, 4), (5, 5), (6, 5), (6, 6)] """ def __init__(self, start: TPosition, goal: TPosition): self.start = Node(start[1], start[0], goal[1], goal[0], 0, None) self.target = Node(goal[1], goal[0], goal[1], goal[0], 99999, None) self.open_nodes = [self.start] self.closed_nodes: list[Node] = [] self.reached = False def search(self) -> list[TPosition]: while self.open_nodes: # Open Nodes are sorted using __lt__ self.open_nodes.sort() current_node = self.open_nodes.pop(0) if current_node.pos == self.target.pos: return self.retrace_path(current_node) self.closed_nodes.append(current_node) successors = self.get_successors(current_node) for child_node in successors: if child_node in self.closed_nodes: continue if child_node not in self.open_nodes: self.open_nodes.append(child_node) else: # retrieve the best current path better_node = self.open_nodes.pop(self.open_nodes.index(child_node)) if child_node.g_cost < better_node.g_cost: self.open_nodes.append(child_node) else: self.open_nodes.append(better_node) return [self.start.pos] def get_successors(self, parent: Node) -> list[Node]: """ Returns a list of successors (both in the grid and free spaces) """ successors = [] for action in delta: pos_x = parent.pos_x + action[1] pos_y = parent.pos_y + action[0] if not (0 <= pos_x <= len(grid[0]) - 1 and 0 <= pos_y <= len(grid) - 1): continue if grid[pos_y][pos_x] != 0: continue successors.append( Node( pos_x, pos_y, self.target.pos_y, self.target.pos_x, parent.g_cost + 1, parent, ) ) return successors def retrace_path(self, node: Node | None) -> list[TPosition]: """ Retrace the path from parents to parents until start node """ current_node = node path = [] while current_node is not None: path.append((current_node.pos_y, current_node.pos_x)) current_node = current_node.parent path.reverse() return path class BidirectionalAStar: """ >>> bd_astar = BidirectionalAStar((0, 0), (len(grid) - 1, len(grid[0]) - 1)) >>> bd_astar.fwd_astar.start.pos == bd_astar.bwd_astar.target.pos True >>> bd_astar.retrace_bidirectional_path(bd_astar.fwd_astar.start, ... bd_astar.bwd_astar.start) [(0, 0)] >>> bd_astar.search() # doctest: +NORMALIZE_WHITESPACE [(0, 0), (0, 1), (0, 2), (1, 2), (1, 3), (2, 3), (2, 4), (2, 5), (3, 5), (4, 5), (5, 5), (5, 6), (6, 6)] """ def __init__(self, start: TPosition, goal: TPosition) -> None: self.fwd_astar = AStar(start, goal) self.bwd_astar = AStar(goal, start) self.reached = False def search(self) -> list[TPosition]: while self.fwd_astar.open_nodes or self.bwd_astar.open_nodes: self.fwd_astar.open_nodes.sort() self.bwd_astar.open_nodes.sort() current_fwd_node = self.fwd_astar.open_nodes.pop(0) current_bwd_node = self.bwd_astar.open_nodes.pop(0) if current_bwd_node.pos == current_fwd_node.pos: return self.retrace_bidirectional_path( current_fwd_node, current_bwd_node ) self.fwd_astar.closed_nodes.append(current_fwd_node) self.bwd_astar.closed_nodes.append(current_bwd_node) self.fwd_astar.target = current_bwd_node self.bwd_astar.target = current_fwd_node successors = { self.fwd_astar: self.fwd_astar.get_successors(current_fwd_node), self.bwd_astar: self.bwd_astar.get_successors(current_bwd_node), } for astar in [self.fwd_astar, self.bwd_astar]: for child_node in successors[astar]: if child_node in astar.closed_nodes: continue if child_node not in astar.open_nodes: astar.open_nodes.append(child_node) else: # retrieve the best current path better_node = astar.open_nodes.pop( astar.open_nodes.index(child_node) ) if child_node.g_cost < better_node.g_cost: astar.open_nodes.append(child_node) else: astar.open_nodes.append(better_node) return [self.fwd_astar.start.pos] def retrace_bidirectional_path( self, fwd_node: Node, bwd_node: Node ) -> list[TPosition]: fwd_path = self.fwd_astar.retrace_path(fwd_node) bwd_path = self.bwd_astar.retrace_path(bwd_node) bwd_path.pop() bwd_path.reverse() path = fwd_path + bwd_path return path if __name__ == "__main__": # all coordinates are given in format [y,x] init = (0, 0) goal = (len(grid) - 1, len(grid[0]) - 1) for elem in grid: print(elem) start_time = time.time() a_star = AStar(init, goal) path = a_star.search() end_time = time.time() - start_time print(f"AStar execution time = {end_time:f} seconds") bd_start_time = time.time() bidir_astar = BidirectionalAStar(init, goal) bd_end_time = time.time() - bd_start_time print(f"BidirectionalAStar execution time = {bd_end_time:f} seconds") ================================================ FILE: graphs/bidirectional_breadth_first_search.py ================================================ """ https://en.wikipedia.org/wiki/Bidirectional_search """ from __future__ import annotations import time Path = list[tuple[int, int]] grid = [ [0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0], # 0 are free path whereas 1's are obstacles [0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0], [1, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0], ] delta = [[-1, 0], [0, -1], [1, 0], [0, 1]] # up, left, down, right class Node: def __init__( self, pos_x: int, pos_y: int, goal_x: int, goal_y: int, parent: Node | None ): self.pos_x = pos_x self.pos_y = pos_y self.pos = (pos_y, pos_x) self.goal_x = goal_x self.goal_y = goal_y self.parent = parent class BreadthFirstSearch: """ # Comment out slow pytests... # 9.15s call graphs/bidirectional_breadth_first_search.py:: \ # graphs.bidirectional_breadth_first_search.BreadthFirstSearch # >>> bfs = BreadthFirstSearch((0, 0), (len(grid) - 1, len(grid[0]) - 1)) # >>> (bfs.start.pos_y + delta[3][0], bfs.start.pos_x + delta[3][1]) (0, 1) # >>> [x.pos for x in bfs.get_successors(bfs.start)] [(1, 0), (0, 1)] # >>> (bfs.start.pos_y + delta[2][0], bfs.start.pos_x + delta[2][1]) (1, 0) # >>> bfs.retrace_path(bfs.start) [(0, 0)] # >>> bfs.search() # doctest: +NORMALIZE_WHITESPACE [(0, 0), (1, 0), (2, 0), (3, 0), (3, 1), (4, 1), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (6, 5), (6, 6)] """ def __init__(self, start: tuple[int, int], goal: tuple[int, int]): self.start = Node(start[1], start[0], goal[1], goal[0], None) self.target = Node(goal[1], goal[0], goal[1], goal[0], None) self.node_queue = [self.start] self.reached = False def search(self) -> Path | None: while self.node_queue: current_node = self.node_queue.pop(0) if current_node.pos == self.target.pos: self.reached = True return self.retrace_path(current_node) successors = self.get_successors(current_node) for node in successors: self.node_queue.append(node) if not self.reached: return [self.start.pos] return None def get_successors(self, parent: Node) -> list[Node]: """ Returns a list of successors (both in the grid and free spaces) """ successors = [] for action in delta: pos_x = parent.pos_x + action[1] pos_y = parent.pos_y + action[0] if not (0 <= pos_x <= len(grid[0]) - 1 and 0 <= pos_y <= len(grid) - 1): continue if grid[pos_y][pos_x] != 0: continue successors.append( Node(pos_x, pos_y, self.target.pos_y, self.target.pos_x, parent) ) return successors def retrace_path(self, node: Node | None) -> Path: """ Retrace the path from parents to parents until start node """ current_node = node path = [] while current_node is not None: path.append((current_node.pos_y, current_node.pos_x)) current_node = current_node.parent path.reverse() return path class BidirectionalBreadthFirstSearch: """ >>> bd_bfs = BidirectionalBreadthFirstSearch((0, 0), (len(grid) - 1, ... len(grid[0]) - 1)) >>> bd_bfs.fwd_bfs.start.pos == bd_bfs.bwd_bfs.target.pos True >>> bd_bfs.retrace_bidirectional_path(bd_bfs.fwd_bfs.start, ... bd_bfs.bwd_bfs.start) [(0, 0)] >>> bd_bfs.search() # doctest: +NORMALIZE_WHITESPACE [(0, 0), (0, 1), (0, 2), (1, 2), (2, 2), (2, 3), (2, 4), (3, 4), (3, 5), (3, 6), (4, 6), (5, 6), (6, 6)] """ def __init__(self, start, goal): self.fwd_bfs = BreadthFirstSearch(start, goal) self.bwd_bfs = BreadthFirstSearch(goal, start) self.reached = False def search(self) -> Path | None: while self.fwd_bfs.node_queue or self.bwd_bfs.node_queue: current_fwd_node = self.fwd_bfs.node_queue.pop(0) current_bwd_node = self.bwd_bfs.node_queue.pop(0) if current_bwd_node.pos == current_fwd_node.pos: self.reached = True return self.retrace_bidirectional_path( current_fwd_node, current_bwd_node ) self.fwd_bfs.target = current_bwd_node self.bwd_bfs.target = current_fwd_node successors = { self.fwd_bfs: self.fwd_bfs.get_successors(current_fwd_node), self.bwd_bfs: self.bwd_bfs.get_successors(current_bwd_node), } for bfs in [self.fwd_bfs, self.bwd_bfs]: for node in successors[bfs]: bfs.node_queue.append(node) if not self.reached: return [self.fwd_bfs.start.pos] return None def retrace_bidirectional_path(self, fwd_node: Node, bwd_node: Node) -> Path: fwd_path = self.fwd_bfs.retrace_path(fwd_node) bwd_path = self.bwd_bfs.retrace_path(bwd_node) bwd_path.pop() bwd_path.reverse() path = fwd_path + bwd_path return path if __name__ == "__main__": # all coordinates are given in format [y,x] import doctest doctest.testmod() init = (0, 0) goal = (len(grid) - 1, len(grid[0]) - 1) for elem in grid: print(elem) start_bfs_time = time.time() bfs = BreadthFirstSearch(init, goal) path = bfs.search() bfs_time = time.time() - start_bfs_time print("Unidirectional BFS computation time : ", bfs_time) start_bd_bfs_time = time.time() bd_bfs = BidirectionalBreadthFirstSearch(init, goal) bd_path = bd_bfs.search() bd_bfs_time = time.time() - start_bd_bfs_time print("Bidirectional BFS computation time : ", bd_bfs_time) ================================================ FILE: graphs/bidirectional_search.py ================================================ """ Bidirectional Search Algorithm. This algorithm searches from both the source and target nodes simultaneously, meeting somewhere in the middle. This approach can significantly reduce the search space compared to a traditional one-directional search. Time Complexity: O(b^(d/2)) where b is the branching factor and d is the depth Space Complexity: O(b^(d/2)) https://en.wikipedia.org/wiki/Bidirectional_search """ from collections import deque def expand_search( graph: dict[int, list[int]], queue: deque[int], parents: dict[int, int | None], opposite_direction_parents: dict[int, int | None], ) -> int | None: if not queue: return None current = queue.popleft() for neighbor in graph[current]: if neighbor in parents: continue parents[neighbor] = current queue.append(neighbor) # Check if this creates an intersection if neighbor in opposite_direction_parents: return neighbor return None def construct_path(current: int | None, parents: dict[int, int | None]) -> list[int]: path: list[int] = [] while current is not None: path.append(current) current = parents[current] return path def bidirectional_search( graph: dict[int, list[int]], start: int, goal: int ) -> list[int] | None: """ Perform bidirectional search on a graph to find the shortest path. Args: graph: A dictionary where keys are nodes and values are lists of adjacent nodes start: The starting node goal: The target node Returns: A list representing the path from start to goal, or None if no path exists Examples: >>> graph = { ... 0: [1, 2], ... 1: [0, 3, 4], ... 2: [0, 5, 6], ... 3: [1, 7], ... 4: [1, 8], ... 5: [2, 9], ... 6: [2, 10], ... 7: [3, 11], ... 8: [4, 11], ... 9: [5, 11], ... 10: [6, 11], ... 11: [7, 8, 9, 10], ... } >>> bidirectional_search(graph=graph, start=0, goal=11) [0, 1, 3, 7, 11] >>> bidirectional_search(graph=graph, start=5, goal=5) [5] >>> disconnected_graph = { ... 0: [1, 2], ... 1: [0], ... 2: [0], ... 3: [4], ... 4: [3], ... } >>> bidirectional_search(graph=disconnected_graph, start=0, goal=3) is None True """ if start == goal: return [start] # Check if start and goal are in the graph if start not in graph or goal not in graph: return None # Initialize forward and backward search dictionaries # Each maps a node to its parent in the search forward_parents: dict[int, int | None] = {start: None} backward_parents: dict[int, int | None] = {goal: None} # Initialize forward and backward search queues forward_queue = deque([start]) backward_queue = deque([goal]) # Intersection node (where the two searches meet) intersection = None # Continue until both queues are empty or an intersection is found while forward_queue and backward_queue and intersection is None: # Expand forward search intersection = expand_search( graph=graph, queue=forward_queue, parents=forward_parents, opposite_direction_parents=backward_parents, ) # If no intersection found, expand backward search if intersection is not None: break intersection = expand_search( graph=graph, queue=backward_queue, parents=backward_parents, opposite_direction_parents=forward_parents, ) # If no intersection found, there's no path if intersection is None: return None # Construct path from start to intersection forward_path: list[int] = construct_path( current=intersection, parents=forward_parents ) forward_path.reverse() # Construct path from intersection to goal backward_path: list[int] = construct_path( current=backward_parents[intersection], parents=backward_parents ) # Return the complete path return forward_path + backward_path def main() -> None: """ Run example of bidirectional search algorithm. Examples: >>> main() # doctest: +NORMALIZE_WHITESPACE Path from 0 to 11: [0, 1, 3, 7, 11] Path from 5 to 5: [5] Path from 0 to 3: None """ # Example graph represented as an adjacency list example_graph = { 0: [1, 2], 1: [0, 3, 4], 2: [0, 5, 6], 3: [1, 7], 4: [1, 8], 5: [2, 9], 6: [2, 10], 7: [3, 11], 8: [4, 11], 9: [5, 11], 10: [6, 11], 11: [7, 8, 9, 10], } # Test case 1: Path exists start, goal = 0, 11 path = bidirectional_search(graph=example_graph, start=start, goal=goal) print(f"Path from {start} to {goal}: {path}") # Test case 2: Start and goal are the same start, goal = 5, 5 path = bidirectional_search(graph=example_graph, start=start, goal=goal) print(f"Path from {start} to {goal}: {path}") # Test case 3: No path exists (disconnected graph) disconnected_graph = { 0: [1, 2], 1: [0], 2: [0], 3: [4], 4: [3], } start, goal = 0, 3 path = bidirectional_search(graph=disconnected_graph, start=start, goal=goal) print(f"Path from {start} to {goal}: {path}") if __name__ == "__main__": main() ================================================ FILE: graphs/boruvka.py ================================================ """Borůvka's algorithm. Determines the minimum spanning tree (MST) of a graph using the Borůvka's algorithm. Borůvka's algorithm is a greedy algorithm for finding a minimum spanning tree in a connected graph, or a minimum spanning forest if a graph that is not connected. The time complexity of this algorithm is O(ELogV), where E represents the number of edges, while V represents the number of nodes. O(number_of_edges Log number_of_nodes) The space complexity of this algorithm is O(V + E), since we have to keep a couple of lists whose sizes are equal to the number of nodes, as well as keep all the edges of a graph inside of the data structure itself. Borůvka's algorithm gives us pretty much the same result as other MST Algorithms - they all find the minimum spanning tree, and the time complexity is approximately the same. One advantage that Borůvka's algorithm has compared to the alternatives is that it doesn't need to presort the edges or maintain a priority queue in order to find the minimum spanning tree. Even though that doesn't help its complexity, since it still passes the edges logE times, it is a bit simpler to code. Details: https://en.wikipedia.org/wiki/Bor%C5%AFvka%27s_algorithm """ from __future__ import annotations from typing import Any class Graph: def __init__(self, num_of_nodes: int) -> None: """ Arguments: num_of_nodes - the number of nodes in the graph Attributes: m_num_of_nodes - the number of nodes in the graph. m_edges - the list of edges. m_component - the dictionary which stores the index of the component which a node belongs to. """ self.m_num_of_nodes = num_of_nodes self.m_edges: list[list[int]] = [] self.m_component: dict[int, int] = {} def add_edge(self, u_node: int, v_node: int, weight: int) -> None: """Adds an edge in the format [first, second, edge weight] to graph.""" self.m_edges.append([u_node, v_node, weight]) def find_component(self, u_node: int) -> int: """Propagates a new component throughout a given component.""" if self.m_component[u_node] == u_node: return u_node return self.find_component(self.m_component[u_node]) def set_component(self, u_node: int) -> None: """Finds the component index of a given node""" if self.m_component[u_node] != u_node: for k in self.m_component: self.m_component[k] = self.find_component(k) def union(self, component_size: list[int], u_node: int, v_node: int) -> None: """Union finds the roots of components for two nodes, compares the components in terms of size, and attaches the smaller one to the larger one to form single component""" if component_size[u_node] <= component_size[v_node]: self.m_component[u_node] = v_node component_size[v_node] += component_size[u_node] self.set_component(u_node) elif component_size[u_node] >= component_size[v_node]: self.m_component[v_node] = self.find_component(u_node) component_size[u_node] += component_size[v_node] self.set_component(v_node) def boruvka(self) -> None: """Performs Borůvka's algorithm to find MST.""" # Initialize additional lists required to algorithm. component_size = [] mst_weight = 0 minimum_weight_edge: list[Any] = [-1] * self.m_num_of_nodes # A list of components (initialized to all of the nodes) for node in range(self.m_num_of_nodes): self.m_component.update({node: node}) component_size.append(1) num_of_components = self.m_num_of_nodes while num_of_components > 1: for edge in self.m_edges: u, v, w = edge u_component = self.m_component[u] v_component = self.m_component[v] if u_component != v_component: """If the current minimum weight edge of component u doesn't exist (is -1), or if it's greater than the edge we're observing right now, we will assign the value of the edge we're observing to it. If the current minimum weight edge of component v doesn't exist (is -1), or if it's greater than the edge we're observing right now, we will assign the value of the edge we're observing to it""" for component in (u_component, v_component): if ( minimum_weight_edge[component] == -1 or minimum_weight_edge[component][2] > w ): minimum_weight_edge[component] = [u, v, w] for edge in minimum_weight_edge: if isinstance(edge, list): u, v, w = edge u_component = self.m_component[u] v_component = self.m_component[v] if u_component != v_component: mst_weight += w self.union(component_size, u_component, v_component) print(f"Added edge [{u} - {v}]\nAdded weight: {w}\n") num_of_components -= 1 minimum_weight_edge = [-1] * self.m_num_of_nodes print(f"The total weight of the minimal spanning tree is: {mst_weight}") def test_vector() -> None: """ >>> g = Graph(8) >>> for u_v_w in ((0, 1, 10), (0, 2, 6), (0, 3, 5), (1, 3, 15), (2, 3, 4), ... (3, 4, 8), (4, 5, 10), (4, 6, 6), (4, 7, 5), (5, 7, 15), (6, 7, 4)): ... g.add_edge(*u_v_w) >>> g.boruvka() Added edge [0 - 3] Added weight: 5 Added edge [0 - 1] Added weight: 10 Added edge [2 - 3] Added weight: 4 Added edge [4 - 7] Added weight: 5 Added edge [4 - 5] Added weight: 10 Added edge [6 - 7] Added weight: 4 Added edge [3 - 4] Added weight: 8 The total weight of the minimal spanning tree is: 46 """ if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: graphs/breadth_first_search.py ================================================ #!/usr/bin/python """Author: OMKAR PATHAK""" from __future__ import annotations from queue import Queue class Graph: def __init__(self) -> None: self.vertices: dict[int, list[int]] = {} def print_graph(self) -> None: """ prints adjacency list representation of graaph >>> g = Graph() >>> g.print_graph() >>> g.add_edge(0, 1) >>> g.print_graph() 0 : 1 """ for i in self.vertices: print(i, " : ", " -> ".join([str(j) for j in self.vertices[i]])) def add_edge(self, from_vertex: int, to_vertex: int) -> None: """ adding the edge between two vertices >>> g = Graph() >>> g.print_graph() >>> g.add_edge(0, 1) >>> g.print_graph() 0 : 1 """ if from_vertex in self.vertices: self.vertices[from_vertex].append(to_vertex) else: self.vertices[from_vertex] = [to_vertex] def bfs(self, start_vertex: int) -> set[int]: """ >>> g = Graph() >>> g.add_edge(0, 1) >>> g.add_edge(0, 1) >>> g.add_edge(0, 2) >>> g.add_edge(1, 2) >>> g.add_edge(2, 0) >>> g.add_edge(2, 3) >>> g.add_edge(3, 3) >>> sorted(g.bfs(2)) [0, 1, 2, 3] """ # initialize set for storing already visited vertices visited = set() # create a first in first out queue to store all the vertices for BFS queue: Queue = Queue() # mark the source node as visited and enqueue it visited.add(start_vertex) queue.put(start_vertex) while not queue.empty(): vertex = queue.get() # loop through all adjacent vertex and enqueue it if not yet visited for adjacent_vertex in self.vertices[vertex]: if adjacent_vertex not in visited: queue.put(adjacent_vertex) visited.add(adjacent_vertex) return visited if __name__ == "__main__": from doctest import testmod testmod(verbose=True) g = Graph() g.add_edge(0, 1) g.add_edge(0, 2) g.add_edge(1, 2) g.add_edge(2, 0) g.add_edge(2, 3) g.add_edge(3, 3) g.print_graph() # 0 : 1 -> 2 # 1 : 2 # 2 : 0 -> 3 # 3 : 3 assert sorted(g.bfs(2)) == [0, 1, 2, 3] ================================================ FILE: graphs/breadth_first_search_2.py ================================================ """ https://en.wikipedia.org/wiki/Breadth-first_search pseudo-code: breadth_first_search(graph G, start vertex s): // all nodes initially unexplored mark s as explored let Q = queue data structure, initialized with s while Q is non-empty: remove the first node of Q, call it v for each edge(v, w): // for w in graph[v] if w unexplored: mark w as explored add w to Q (at the end) """ from __future__ import annotations from collections import deque from queue import Queue from timeit import timeit G = { "A": ["B", "C"], "B": ["A", "D", "E"], "C": ["A", "F"], "D": ["B"], "E": ["B", "F"], "F": ["C", "E"], } def breadth_first_search(graph: dict, start: str) -> list[str]: """ Implementation of breadth first search using queue.Queue. >>> ''.join(breadth_first_search(G, 'A')) 'ABCDEF' """ explored = {start} result = [start] queue: Queue = Queue() queue.put(start) while not queue.empty(): v = queue.get() for w in graph[v]: if w not in explored: explored.add(w) result.append(w) queue.put(w) return result def breadth_first_search_with_deque(graph: dict, start: str) -> list[str]: """ Implementation of breadth first search using collection.queue. >>> ''.join(breadth_first_search_with_deque(G, 'A')) 'ABCDEF' """ visited = {start} result = [start] queue = deque([start]) while queue: v = queue.popleft() for child in graph[v]: if child not in visited: visited.add(child) result.append(child) queue.append(child) return result def benchmark_function(name: str) -> None: setup = f"from __main__ import G, {name}" number = 10000 res = timeit(f"{name}(G, 'A')", setup=setup, number=number) print(f"{name:<35} finished {number} runs in {res:.5f} seconds") if __name__ == "__main__": import doctest doctest.testmod() benchmark_function("breadth_first_search") benchmark_function("breadth_first_search_with_deque") # breadth_first_search finished 10000 runs in 0.20999 seconds # breadth_first_search_with_deque finished 10000 runs in 0.01421 seconds ================================================ FILE: graphs/breadth_first_search_shortest_path.py ================================================ """Breath First Search (BFS) can be used when finding the shortest path from a given source node to a target node in an unweighted graph. """ from __future__ import annotations graph = { "A": ["B", "C", "E"], "B": ["A", "D", "E"], "C": ["A", "F", "G"], "D": ["B"], "E": ["A", "B", "D"], "F": ["C"], "G": ["C"], } class Graph: def __init__(self, graph: dict[str, list[str]], source_vertex: str) -> None: """ Graph is implemented as dictionary of adjacency lists. Also, Source vertex have to be defined upon initialization. """ self.graph = graph # mapping node to its parent in resulting breadth first tree self.parent: dict[str, str | None] = {} self.source_vertex = source_vertex def breath_first_search(self) -> None: """ This function is a helper for running breath first search on this graph. >>> g = Graph(graph, "G") >>> g.breath_first_search() >>> g.parent {'G': None, 'C': 'G', 'A': 'C', 'F': 'C', 'B': 'A', 'E': 'A', 'D': 'B'} """ visited = {self.source_vertex} self.parent[self.source_vertex] = None queue = [self.source_vertex] # first in first out queue while queue: vertex = queue.pop(0) for adjacent_vertex in self.graph[vertex]: if adjacent_vertex not in visited: visited.add(adjacent_vertex) self.parent[adjacent_vertex] = vertex queue.append(adjacent_vertex) def shortest_path(self, target_vertex: str) -> str: """ This shortest path function returns a string, describing the result: 1.) No path is found. The string is a human readable message to indicate this. 2.) The shortest path is found. The string is in the form `v1(->v2->v3->...->vn)`, where v1 is the source vertex and vn is the target vertex, if it exists separately. >>> g = Graph(graph, "G") >>> g.breath_first_search() Case 1 - No path is found. >>> g.shortest_path("Foo") Traceback (most recent call last): ... ValueError: No path from vertex: G to vertex: Foo Case 2 - The path is found. >>> g.shortest_path("D") 'G->C->A->B->D' >>> g.shortest_path("G") 'G' """ if target_vertex == self.source_vertex: return self.source_vertex target_vertex_parent = self.parent.get(target_vertex) if target_vertex_parent is None: msg = ( f"No path from vertex: {self.source_vertex} to vertex: {target_vertex}" ) raise ValueError(msg) return self.shortest_path(target_vertex_parent) + f"->{target_vertex}" if __name__ == "__main__": g = Graph(graph, "G") g.breath_first_search() print(g.shortest_path("D")) print(g.shortest_path("G")) print(g.shortest_path("Foo")) ================================================ FILE: graphs/breadth_first_search_shortest_path_2.py ================================================ """Breadth-first search the shortest path implementations. doctest: python -m doctest -v breadth_first_search_shortest_path_2.py Manual test: python breadth_first_search_shortest_path_2.py """ from collections import deque demo_graph = { "A": ["B", "C", "E"], "B": ["A", "D", "E"], "C": ["A", "F", "G"], "D": ["B"], "E": ["A", "B", "D"], "F": ["C"], "G": ["C"], } def bfs_shortest_path(graph: dict, start, goal) -> list[str]: """Find the shortest path between `start` and `goal` nodes. Args: graph (dict): node/list of neighboring nodes key/value pairs. start: start node. goal: target node. Returns: Shortest path between `start` and `goal` nodes as a string of nodes. 'Not found' string if no path found. Example: >>> bfs_shortest_path(demo_graph, "G", "D") ['G', 'C', 'A', 'B', 'D'] >>> bfs_shortest_path(demo_graph, "G", "G") ['G'] >>> bfs_shortest_path(demo_graph, "G", "Unknown") [] """ # keep track of explored nodes explored = set() # keep track of all the paths to be checked queue = deque([[start]]) # return path if start is goal if start == goal: return [start] # keeps looping until all possible paths have been checked while queue: # pop the first path from the queue path = queue.popleft() # get the last node from the path node = path[-1] if node not in explored: neighbours = graph[node] # go through all neighbour nodes, construct a new path and # push it into the queue for neighbour in neighbours: new_path = list(path) new_path.append(neighbour) queue.append(new_path) # return path if neighbour is goal if neighbour == goal: return new_path # mark node as explored explored.add(node) # in case there's no path between the 2 nodes return [] def bfs_shortest_path_distance(graph: dict, start, target) -> int: """Find the shortest path distance between `start` and `target` nodes. Args: graph: node/list of neighboring nodes key/value pairs. start: node to start search from. target: node to search for. Returns: Number of edges in the shortest path between `start` and `target` nodes. -1 if no path exists. Example: >>> bfs_shortest_path_distance(demo_graph, "G", "D") 4 >>> bfs_shortest_path_distance(demo_graph, "A", "A") 0 >>> bfs_shortest_path_distance(demo_graph, "A", "Unknown") -1 """ if not graph or start not in graph or target not in graph: return -1 if start == target: return 0 queue = deque([start]) visited = set(start) # Keep tab on distances from `start` node. dist = {start: 0, target: -1} while queue: node = queue.popleft() if node == target: dist[target] = ( dist[node] if dist[target] == -1 else min(dist[target], dist[node]) ) for adjacent in graph[node]: if adjacent not in visited: visited.add(adjacent) queue.append(adjacent) dist[adjacent] = dist[node] + 1 return dist[target] if __name__ == "__main__": print(bfs_shortest_path(demo_graph, "G", "D")) # returns ['G', 'C', 'A', 'B', 'D'] print(bfs_shortest_path_distance(demo_graph, "G", "D")) # returns 4 ================================================ FILE: graphs/breadth_first_search_zero_one_shortest_path.py ================================================ """ Finding the shortest path in 0-1-graph in O(E + V) which is faster than dijkstra. 0-1-graph is the weighted graph with the weights equal to 0 or 1. Link: https://codeforces.com/blog/entry/22276 """ from __future__ import annotations from collections import deque from collections.abc import Iterator from dataclasses import dataclass @dataclass class Edge: """Weighted directed graph edge.""" destination_vertex: int weight: int class AdjacencyList: """Graph adjacency list.""" def __init__(self, size: int): self._graph: list[list[Edge]] = [[] for _ in range(size)] self._size = size def __getitem__(self, vertex: int) -> Iterator[Edge]: """Get all the vertices adjacent to the given one.""" return iter(self._graph[vertex]) @property def size(self): return self._size def add_edge(self, from_vertex: int, to_vertex: int, weight: int): """ >>> g = AdjacencyList(2) >>> g.add_edge(0, 1, 0) >>> g.add_edge(1, 0, 1) >>> list(g[0]) [Edge(destination_vertex=1, weight=0)] >>> list(g[1]) [Edge(destination_vertex=0, weight=1)] >>> g.add_edge(0, 1, 2) Traceback (most recent call last): ... ValueError: Edge weight must be either 0 or 1. >>> g.add_edge(0, 2, 1) Traceback (most recent call last): ... ValueError: Vertex indexes must be in [0; size). """ if weight not in (0, 1): raise ValueError("Edge weight must be either 0 or 1.") if to_vertex < 0 or to_vertex >= self.size: raise ValueError("Vertex indexes must be in [0; size).") self._graph[from_vertex].append(Edge(to_vertex, weight)) def get_shortest_path(self, start_vertex: int, finish_vertex: int) -> int | None: """ Return the shortest distance from start_vertex to finish_vertex in 0-1-graph. 1 1 1 0--------->3 6--------7>------->8 | ^ ^ ^ |1 | | | |0 v 0| |0 1| 9-------->10 | | | ^ 1 v | | |0 1--------->2<-------4------->5 0 1 1 >>> g = AdjacencyList(11) >>> g.add_edge(0, 1, 0) >>> g.add_edge(0, 3, 1) >>> g.add_edge(1, 2, 0) >>> g.add_edge(2, 3, 0) >>> g.add_edge(4, 2, 1) >>> g.add_edge(4, 5, 1) >>> g.add_edge(4, 6, 1) >>> g.add_edge(5, 9, 0) >>> g.add_edge(6, 7, 1) >>> g.add_edge(7, 8, 1) >>> g.add_edge(8, 10, 1) >>> g.add_edge(9, 7, 0) >>> g.add_edge(9, 10, 1) >>> g.add_edge(1, 2, 2) Traceback (most recent call last): ... ValueError: Edge weight must be either 0 or 1. >>> g.get_shortest_path(0, 3) 0 >>> g.get_shortest_path(0, 4) Traceback (most recent call last): ... ValueError: No path from start_vertex to finish_vertex. >>> g.get_shortest_path(4, 10) 2 >>> g.get_shortest_path(4, 8) 2 >>> g.get_shortest_path(0, 1) 0 >>> g.get_shortest_path(1, 0) Traceback (most recent call last): ... ValueError: No path from start_vertex to finish_vertex. """ queue = deque([start_vertex]) distances: list[int | None] = [None] * self.size distances[start_vertex] = 0 while queue: current_vertex = queue.popleft() current_distance = distances[current_vertex] if current_distance is None: continue for edge in self[current_vertex]: new_distance = current_distance + edge.weight dest_vertex_distance = distances[edge.destination_vertex] if ( isinstance(dest_vertex_distance, int) and new_distance >= dest_vertex_distance ): continue distances[edge.destination_vertex] = new_distance if edge.weight == 0: queue.appendleft(edge.destination_vertex) else: queue.append(edge.destination_vertex) if distances[finish_vertex] is None: raise ValueError("No path from start_vertex to finish_vertex.") return distances[finish_vertex] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: graphs/check_bipatrite.py ================================================ from collections import defaultdict, deque def is_bipartite_dfs(graph: dict[int, list[int]]) -> bool: """ Check if a graph is bipartite using depth-first search (DFS). Args: `graph`: Adjacency list representing the graph. Returns: ``True`` if bipartite, ``False`` otherwise. Checks if the graph can be divided into two sets of vertices, such that no two vertices within the same set are connected by an edge. Examples: >>> is_bipartite_dfs({0: [1, 2], 1: [0, 3], 2: [0, 4]}) True >>> is_bipartite_dfs({0: [1, 2], 1: [0, 3], 2: [0, 1]}) False >>> is_bipartite_dfs({}) True >>> is_bipartite_dfs({0: [1, 3], 1: [0, 2], 2: [1, 3], 3: [0, 2]}) True >>> is_bipartite_dfs({0: [1, 2, 3], 1: [0, 2], 2: [0, 1, 3], 3: [0, 2]}) False >>> is_bipartite_dfs({0: [4], 1: [], 2: [4], 3: [4], 4: [0, 2, 3]}) True >>> is_bipartite_dfs({0: [1, 3], 1: [0, 2], 2: [1, 3], 3: [0, 2], 4: [0]}) False >>> is_bipartite_dfs({7: [1, 3], 1: [0, 2], 2: [1, 3], 3: [0, 2], 4: [0]}) False >>> # FIXME: This test should fails with KeyError: 4. >>> is_bipartite_dfs({0: [1, 3], 1: [0, 2], 2: [1, 3], 3: [0, 2], 9: [0]}) False >>> is_bipartite_dfs({0: [-1, 3], 1: [0, -2]}) False >>> is_bipartite_dfs({-1: [0, 2], 0: [-1, 1], 1: [0, 2], 2: [-1, 1]}) True >>> is_bipartite_dfs({0.9: [1, 3], 1: [0, 2], 2: [1, 3], 3: [0, 2]}) True >>> # FIXME: This test should fails with >>> # TypeError: list indices must be integers or... >>> is_bipartite_dfs({0: [1.0, 3.0], 1.0: [0, 2.0], 2.0: [1.0, 3.0], 3.0: [0, 2.0]}) True >>> is_bipartite_dfs({"a": [1, 3], "b": [0, 2], "c": [1, 3], "d": [0, 2]}) True >>> is_bipartite_dfs({0: ["b", "d"], 1: ["a", "c"], 2: ["b", "d"], 3: ["a", "c"]}) True """ def depth_first_search(node: int, color: int) -> bool: """ Perform Depth-First Search (DFS) on the graph starting from a node. Args: node: The current node being visited. color: The color assigned to the current node. Returns: True if the graph is bipartite starting from the current node, False otherwise. """ if visited[node] == -1: visited[node] = color if node not in graph: return True for neighbor in graph[node]: if not depth_first_search(neighbor, 1 - color): return False return visited[node] == color visited: defaultdict[int, int] = defaultdict(lambda: -1) for node in graph: if visited[node] == -1 and not depth_first_search(node, 0): return False return True def is_bipartite_bfs(graph: dict[int, list[int]]) -> bool: """ Check if a graph is bipartite using a breadth-first search (BFS). Args: `graph`: Adjacency list representing the graph. Returns: ``True`` if bipartite, ``False`` otherwise. Check if the graph can be divided into two sets of vertices, such that no two vertices within the same set are connected by an edge. Examples: >>> is_bipartite_bfs({0: [1, 2], 1: [0, 3], 2: [0, 4]}) True >>> is_bipartite_bfs({0: [1, 2], 1: [0, 2], 2: [0, 1]}) False >>> is_bipartite_bfs({}) True >>> is_bipartite_bfs({0: [1, 3], 1: [0, 2], 2: [1, 3], 3: [0, 2]}) True >>> is_bipartite_bfs({0: [1, 2, 3], 1: [0, 2], 2: [0, 1, 3], 3: [0, 2]}) False >>> is_bipartite_bfs({0: [4], 1: [], 2: [4], 3: [4], 4: [0, 2, 3]}) True >>> is_bipartite_bfs({0: [1, 3], 1: [0, 2], 2: [1, 3], 3: [0, 2], 4: [0]}) False >>> is_bipartite_bfs({7: [1, 3], 1: [0, 2], 2: [1, 3], 3: [0, 2], 4: [0]}) False >>> # FIXME: This test should fails with KeyError: 4. >>> is_bipartite_bfs({0: [1, 3], 1: [0, 2], 2: [1, 3], 3: [0, 2], 9: [0]}) False >>> is_bipartite_bfs({0: [-1, 3], 1: [0, -2]}) False >>> is_bipartite_bfs({-1: [0, 2], 0: [-1, 1], 1: [0, 2], 2: [-1, 1]}) True >>> is_bipartite_bfs({0.9: [1, 3], 1: [0, 2], 2: [1, 3], 3: [0, 2]}) True >>> # FIXME: This test should fails with >>> # TypeError: list indices must be integers or... >>> is_bipartite_bfs({0: [1.0, 3.0], 1.0: [0, 2.0], 2.0: [1.0, 3.0], 3.0: [0, 2.0]}) True >>> is_bipartite_bfs({"a": [1, 3], "b": [0, 2], "c": [1, 3], "d": [0, 2]}) True >>> is_bipartite_bfs({0: ["b", "d"], 1: ["a", "c"], 2: ["b", "d"], 3: ["a", "c"]}) True """ visited: defaultdict[int, int] = defaultdict(lambda: -1) for node in graph: if visited[node] == -1: queue: deque[int] = deque() queue.append(node) visited[node] = 0 while queue: curr_node = queue.popleft() if curr_node not in graph: continue for neighbor in graph[curr_node]: if visited[neighbor] == -1: visited[neighbor] = 1 - visited[curr_node] queue.append(neighbor) elif visited[neighbor] == visited[curr_node]: return False return True if __name__ == "__main__": import doctest result = doctest.testmod() if result.failed: print(f"{result.failed} test(s) failed.") else: print("All tests passed!") ================================================ FILE: graphs/check_cycle.py ================================================ """ Program to check if a cycle is present in a given graph """ def check_cycle(graph: dict) -> bool: """ Returns True if graph is cyclic else False >>> check_cycle(graph={0:[], 1:[0, 3], 2:[0, 4], 3:[5], 4:[5], 5:[]}) False >>> check_cycle(graph={0:[1, 2], 1:[2], 2:[0, 3], 3:[3]}) True """ # Keep track of visited nodes visited: set[int] = set() # To detect a back edge, keep track of vertices currently in the recursion stack rec_stk: set[int] = set() return any( node not in visited and depth_first_search(graph, node, visited, rec_stk) for node in graph ) def depth_first_search(graph: dict, vertex: int, visited: set, rec_stk: set) -> bool: """ Recur for all neighbours. If any neighbour is visited and in rec_stk then graph is cyclic. >>> graph = {0:[], 1:[0, 3], 2:[0, 4], 3:[5], 4:[5], 5:[]} >>> vertex, visited, rec_stk = 0, set(), set() >>> depth_first_search(graph, vertex, visited, rec_stk) False """ # Mark current node as visited and add to recursion stack visited.add(vertex) rec_stk.add(vertex) for node in graph[vertex]: if node not in visited: if depth_first_search(graph, node, visited, rec_stk): return True elif node in rec_stk: return True # The node needs to be removed from recursion stack before function ends rec_stk.remove(vertex) return False if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: graphs/connected_components.py ================================================ """ https://en.wikipedia.org/wiki/Component_(graph_theory) Finding connected components in graph """ test_graph_1 = {0: [1, 2], 1: [0, 3], 2: [0], 3: [1], 4: [5, 6], 5: [4, 6], 6: [4, 5]} test_graph_2 = {0: [1, 2, 3], 1: [0, 3], 2: [0], 3: [0, 1], 4: [], 5: []} def dfs(graph: dict, vert: int, visited: list) -> list: """ Use depth first search to find all vertices being in the same component as initial vertex >>> dfs(test_graph_1, 0, 5 * [False]) [0, 1, 3, 2] >>> dfs(test_graph_2, 0, 6 * [False]) [0, 1, 3, 2] """ visited[vert] = True connected_verts = [] for neighbour in graph[vert]: if not visited[neighbour]: connected_verts += dfs(graph, neighbour, visited) return [vert, *connected_verts] def connected_components(graph: dict) -> list: """ This function takes graph as a parameter and then returns the list of connected components >>> connected_components(test_graph_1) [[0, 1, 3, 2], [4, 5, 6]] >>> connected_components(test_graph_2) [[0, 1, 3, 2], [4], [5]] """ graph_size = len(graph) visited = graph_size * [False] components_list = [] for i in range(graph_size): if not visited[i]: i_connected = dfs(graph, i, visited) components_list.append(i_connected) return components_list if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: graphs/deep_clone_graph.py ================================================ """ LeetCode 133. Clone Graph https://leetcode.com/problems/clone-graph/ Given a reference of a node in a connected undirected graph. Return a deep copy (clone) of the graph. Each node in the graph contains a value (int) and a list (List[Node]) of its neighbors. """ from dataclasses import dataclass @dataclass class Node: value: int = 0 neighbors: list["Node"] | None = None def __post_init__(self) -> None: """ >>> Node(3).neighbors [] """ self.neighbors = self.neighbors or [] def __hash__(self) -> int: """ >>> hash(Node(3)) != 0 True """ return id(self) def clone_graph(node: Node | None) -> Node | None: """ This function returns a clone of a connected undirected graph. >>> clone_graph(Node(1)) Node(value=1, neighbors=[]) >>> clone_graph(Node(1, [Node(2)])) Node(value=1, neighbors=[Node(value=2, neighbors=[])]) >>> clone_graph(None) is None True """ if not node: return None originals_to_clones = {} # map nodes to clones stack = [node] while stack: original = stack.pop() if original in originals_to_clones: continue originals_to_clones[original] = Node(original.value) stack.extend(original.neighbors or []) for original, clone in originals_to_clones.items(): for neighbor in original.neighbors or []: cloned_neighbor = originals_to_clones[neighbor] if not clone.neighbors: clone.neighbors = [] clone.neighbors.append(cloned_neighbor) return originals_to_clones[node] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: graphs/depth_first_search.py ================================================ """Non recursive implementation of a DFS algorithm.""" from __future__ import annotations def depth_first_search(graph: dict, start: str) -> set[str]: """Depth First Search on Graph :param graph: directed graph in dictionary format :param start: starting vertex as a string :returns: the trace of the search >>> input_G = { "A": ["B", "C", "D"], "B": ["A", "D", "E"], ... "C": ["A", "F"], "D": ["B", "D"], "E": ["B", "F"], ... "F": ["C", "E", "G"], "G": ["F"] } >>> output_G = list({'A', 'B', 'C', 'D', 'E', 'F', 'G'}) >>> all(x in output_G for x in list(depth_first_search(input_G, "A"))) True >>> all(x in output_G for x in list(depth_first_search(input_G, "G"))) True """ explored, stack = set(start), [start] while stack: v = stack.pop() explored.add(v) # Differences from BFS: # 1) pop last element instead of first one # 2) add adjacent elements to stack without exploring them for adj in reversed(graph[v]): if adj not in explored: stack.append(adj) return explored G = { "A": ["B", "C", "D"], "B": ["A", "D", "E"], "C": ["A", "F"], "D": ["B", "D"], "E": ["B", "F"], "F": ["C", "E", "G"], "G": ["F"], } if __name__ == "__main__": import doctest doctest.testmod() print(depth_first_search(G, "A")) ================================================ FILE: graphs/depth_first_search_2.py ================================================ #!/usr/bin/python """Author: OMKAR PATHAK""" class Graph: def __init__(self): self.vertex = {} # for printing the Graph vertices def print_graph(self) -> None: """ Print the graph vertices. Example: >>> g = Graph() >>> g.add_edge(0, 1) >>> g.add_edge(0, 2) >>> g.add_edge(1, 2) >>> g.add_edge(2, 0) >>> g.add_edge(2, 3) >>> g.add_edge(3, 3) >>> g.print_graph() {0: [1, 2], 1: [2], 2: [0, 3], 3: [3]} 0 -> 1 -> 2 1 -> 2 2 -> 0 -> 3 3 -> 3 """ print(self.vertex) for i in self.vertex: print(i, " -> ", " -> ".join([str(j) for j in self.vertex[i]])) # for adding the edge between two vertices def add_edge(self, from_vertex: int, to_vertex: int) -> None: """ Add an edge between two vertices. :param from_vertex: The source vertex. :param to_vertex: The destination vertex. Example: >>> g = Graph() >>> g.add_edge(0, 1) >>> g.add_edge(0, 2) >>> g.print_graph() {0: [1, 2]} 0 -> 1 -> 2 """ # check if vertex is already present, if from_vertex in self.vertex: self.vertex[from_vertex].append(to_vertex) else: # else make a new vertex self.vertex[from_vertex] = [to_vertex] def dfs(self) -> None: """ Perform depth-first search (DFS) traversal on the graph and print the visited vertices. Example: >>> g = Graph() >>> g.add_edge(0, 1) >>> g.add_edge(0, 2) >>> g.add_edge(1, 2) >>> g.add_edge(2, 0) >>> g.add_edge(2, 3) >>> g.add_edge(3, 3) >>> g.dfs() 0 1 2 3 """ # visited array for storing already visited nodes visited = [False] * len(self.vertex) # call the recursive helper function for i in range(len(self.vertex)): if not visited[i]: self.dfs_recursive(i, visited) def dfs_recursive(self, start_vertex: int, visited: list) -> None: """ Perform a recursive depth-first search (DFS) traversal on the graph. :param start_vertex: The starting vertex for the traversal. :param visited: A list to track visited vertices. Example: >>> g = Graph() >>> g.add_edge(0, 1) >>> g.add_edge(0, 2) >>> g.add_edge(1, 2) >>> g.add_edge(2, 0) >>> g.add_edge(2, 3) >>> g.add_edge(3, 3) >>> visited = [False] * len(g.vertex) >>> g.dfs_recursive(0, visited) 0 1 2 3 """ # mark start vertex as visited visited[start_vertex] = True print(start_vertex, end="") # Recur for all the vertices that are adjacent to this node for i in self.vertex: if not visited[i]: print(" ", end="") self.dfs_recursive(i, visited) if __name__ == "__main__": import doctest doctest.testmod() g = Graph() g.add_edge(0, 1) g.add_edge(0, 2) g.add_edge(1, 2) g.add_edge(2, 0) g.add_edge(2, 3) g.add_edge(3, 3) g.print_graph() print("DFS:") g.dfs() ================================================ FILE: graphs/dijkstra.py ================================================ """ pseudo-code DIJKSTRA(graph G, start vertex s, destination vertex d): //all nodes initially unexplored 1 - let H = min heap data structure, initialized with 0 and s [here 0 indicates the distance from start vertex s] 2 - while H is non-empty: 3 - remove the first node and cost of H, call it U and cost 4 - if U has been previously explored: 5 - go to the while loop, line 2 //Once a node is explored there is no need to make it again 6 - mark U as explored 7 - if U is d: 8 - return cost // total cost from start to destination vertex 9 - for each edge(U, V): c=cost of edge(U,V) // for V in graph[U] 10 - if V explored: 11 - go to next V in line 9 12 - total_cost = cost + c 13 - add (total_cost,V) to H You can think at cost as a distance where Dijkstra finds the shortest distance between vertices s and v in a graph G. The use of a min heap as H guarantees that if a vertex has already been explored there will be no other path with shortest distance, that happens because heapq.heappop will always return the next vertex with the shortest distance, considering that the heap stores not only the distance between previous vertex and current vertex but the entire distance between each vertex that makes up the path from start vertex to target vertex. """ import heapq def dijkstra(graph, start, end): """Return the cost of the shortest path between vertices start and end. >>> dijkstra(G, "E", "C") 6 >>> dijkstra(G2, "E", "F") 3 >>> dijkstra(G3, "E", "F") 3 """ heap = [(0, start)] # cost from start node,end node visited = set() while heap: (cost, u) = heapq.heappop(heap) if u in visited: continue visited.add(u) if u == end: return cost for v, c in graph[u]: if v in visited: continue next_item = cost + c heapq.heappush(heap, (next_item, v)) return -1 G = { "A": [["B", 2], ["C", 5]], "B": [["A", 2], ["D", 3], ["E", 1], ["F", 1]], "C": [["A", 5], ["F", 3]], "D": [["B", 3]], "E": [["B", 4], ["F", 3]], "F": [["C", 3], ["E", 3]], } r""" Layout of G2: E -- 1 --> B -- 1 --> C -- 1 --> D -- 1 --> F \ /\ \ || ----------------- 3 -------------------- """ G2 = { "B": [["C", 1]], "C": [["D", 1]], "D": [["F", 1]], "E": [["B", 1], ["F", 3]], "F": [], } r""" Layout of G3: E -- 1 --> B -- 1 --> C -- 1 --> D -- 1 --> F \ /\ \ || -------- 2 ---------> G ------- 1 ------ """ G3 = { "B": [["C", 1]], "C": [["D", 1]], "D": [["F", 1]], "E": [["B", 1], ["G", 2]], "F": [], "G": [["F", 1]], } short_distance = dijkstra(G, "E", "C") print(short_distance) # E -- 3 --> F -- 3 --> C == 6 short_distance = dijkstra(G2, "E", "F") print(short_distance) # E -- 3 --> F == 3 short_distance = dijkstra(G3, "E", "F") print(short_distance) # E -- 2 --> G -- 1 --> F == 3 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: graphs/dijkstra_2.py ================================================ def print_dist(dist, v): print("\nVertex Distance") for i in range(v): if dist[i] != float("inf"): print(i, "\t", int(dist[i]), end="\t") else: print(i, "\t", "INF", end="\t") print() def min_dist(mdist, vset, v): min_val = float("inf") min_ind = -1 for i in range(v): if (not vset[i]) and mdist[i] < min_val: min_ind = i min_val = mdist[i] return min_ind def dijkstra(graph, v, src): mdist = [float("inf") for _ in range(v)] vset = [False for _ in range(v)] mdist[src] = 0.0 for _ in range(v - 1): u = min_dist(mdist, vset, v) vset[u] = True for i in range(v): if ( (not vset[i]) and graph[u][i] != float("inf") and mdist[u] + graph[u][i] < mdist[i] ): mdist[i] = mdist[u] + graph[u][i] print_dist(mdist, i) if __name__ == "__main__": V = int(input("Enter number of vertices: ").strip()) E = int(input("Enter number of edges: ").strip()) graph = [[float("inf") for i in range(V)] for j in range(V)] for i in range(V): graph[i][i] = 0.0 for i in range(E): print("\nEdge ", i + 1) src = int(input("Enter source:").strip()) dst = int(input("Enter destination:").strip()) weight = float(input("Enter weight:").strip()) graph[src][dst] = weight gsrc = int(input("\nEnter shortest path source:").strip()) dijkstra(graph, V, gsrc) ================================================ FILE: graphs/dijkstra_algorithm.py ================================================ # Title: Dijkstra's Algorithm for finding single source shortest path from scratch # Author: Shubham Malik # References: https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm import math import sys # For storing the vertex set to retrieve node with the lowest distance class PriorityQueue: # Based on Min Heap def __init__(self): """ Priority queue class constructor method. Examples: >>> priority_queue_test = PriorityQueue() >>> priority_queue_test.cur_size 0 >>> priority_queue_test.array [] >>> priority_queue_test.pos {} """ self.cur_size = 0 self.array = [] self.pos = {} # To store the pos of node in array def is_empty(self): """ Conditional boolean method to determine if the priority queue is empty or not. Examples: >>> priority_queue_test = PriorityQueue() >>> priority_queue_test.is_empty() True >>> priority_queue_test.insert((2, 'A')) >>> priority_queue_test.is_empty() False """ return self.cur_size == 0 def min_heapify(self, idx): """ Sorts the queue array so that the minimum element is root. Examples: >>> priority_queue_test = PriorityQueue() >>> priority_queue_test.cur_size = 3 >>> priority_queue_test.pos = {'A': 0, 'B': 1, 'C': 2} >>> priority_queue_test.array = [(5, 'A'), (10, 'B'), (15, 'C')] >>> priority_queue_test.min_heapify(0) >>> priority_queue_test.array [(5, 'A'), (10, 'B'), (15, 'C')] >>> priority_queue_test.array = [(10, 'A'), (5, 'B'), (15, 'C')] >>> priority_queue_test.min_heapify(0) >>> priority_queue_test.array [(5, 'B'), (10, 'A'), (15, 'C')] >>> priority_queue_test.array = [(10, 'A'), (15, 'B'), (5, 'C')] >>> priority_queue_test.min_heapify(0) >>> priority_queue_test.array [(5, 'C'), (15, 'B'), (10, 'A')] >>> priority_queue_test.array = [(10, 'A'), (5, 'B')] >>> priority_queue_test.cur_size = len(priority_queue_test.array) >>> priority_queue_test.pos = {'A': 0, 'B': 1} >>> priority_queue_test.min_heapify(0) >>> priority_queue_test.array [(5, 'B'), (10, 'A')] """ lc = self.left(idx) rc = self.right(idx) if lc < self.cur_size and self.array[lc][0] < self.array[idx][0]: smallest = lc else: smallest = idx if rc < self.cur_size and self.array[rc][0] < self.array[smallest][0]: smallest = rc if smallest != idx: self.swap(idx, smallest) self.min_heapify(smallest) def insert(self, tup): """ Inserts a node into the Priority Queue. Examples: >>> priority_queue_test = PriorityQueue() >>> priority_queue_test.insert((10, 'A')) >>> priority_queue_test.array [(10, 'A')] >>> priority_queue_test.insert((15, 'B')) >>> priority_queue_test.array [(10, 'A'), (15, 'B')] >>> priority_queue_test.insert((5, 'C')) >>> priority_queue_test.array [(5, 'C'), (10, 'A'), (15, 'B')] """ self.pos[tup[1]] = self.cur_size self.cur_size += 1 self.array.append((sys.maxsize, tup[1])) self.decrease_key((sys.maxsize, tup[1]), tup[0]) def extract_min(self): """ Removes and returns the min element at top of priority queue. Examples: >>> priority_queue_test = PriorityQueue() >>> priority_queue_test.array = [(10, 'A'), (15, 'B')] >>> priority_queue_test.cur_size = len(priority_queue_test.array) >>> priority_queue_test.pos = {'A': 0, 'B': 1} >>> priority_queue_test.insert((5, 'C')) >>> priority_queue_test.extract_min() 'C' >>> priority_queue_test.array[0] (10, 'A') """ min_node = self.array[0][1] self.array[0] = self.array[self.cur_size - 1] self.cur_size -= 1 self.min_heapify(0) del self.pos[min_node] return min_node def left(self, i): """ Returns the index of left child Examples: >>> priority_queue_test = PriorityQueue() >>> priority_queue_test.left(0) 1 >>> priority_queue_test.left(1) 3 """ return 2 * i + 1 def right(self, i): """ Returns the index of right child Examples: >>> priority_queue_test = PriorityQueue() >>> priority_queue_test.right(0) 2 >>> priority_queue_test.right(1) 4 """ return 2 * i + 2 def par(self, i): """ Returns the index of parent Examples: >>> priority_queue_test = PriorityQueue() >>> priority_queue_test.par(1) 0 >>> priority_queue_test.par(2) 1 >>> priority_queue_test.par(4) 2 """ return math.floor(i / 2) def swap(self, i, j): """ Swaps array elements at indices i and j, update the pos{} Examples: >>> priority_queue_test = PriorityQueue() >>> priority_queue_test.array = [(10, 'A'), (15, 'B')] >>> priority_queue_test.cur_size = len(priority_queue_test.array) >>> priority_queue_test.pos = {'A': 0, 'B': 1} >>> priority_queue_test.swap(0, 1) >>> priority_queue_test.array [(15, 'B'), (10, 'A')] >>> priority_queue_test.pos {'A': 1, 'B': 0} """ self.pos[self.array[i][1]] = j self.pos[self.array[j][1]] = i temp = self.array[i] self.array[i] = self.array[j] self.array[j] = temp def decrease_key(self, tup, new_d): """ Decrease the key value for a given tuple, assuming the new_d is at most old_d. Examples: >>> priority_queue_test = PriorityQueue() >>> priority_queue_test.array = [(10, 'A'), (15, 'B')] >>> priority_queue_test.cur_size = len(priority_queue_test.array) >>> priority_queue_test.pos = {'A': 0, 'B': 1} >>> priority_queue_test.decrease_key((10, 'A'), 5) >>> priority_queue_test.array [(5, 'A'), (15, 'B')] """ idx = self.pos[tup[1]] # assuming the new_d is at most old_d self.array[idx] = (new_d, tup[1]) while idx > 0 and self.array[self.par(idx)][0] > self.array[idx][0]: self.swap(idx, self.par(idx)) idx = self.par(idx) class Graph: def __init__(self, num): """ Graph class constructor Examples: >>> graph_test = Graph(1) >>> graph_test.num_nodes 1 >>> graph_test.dist [0] >>> graph_test.par [-1] >>> graph_test.adjList {} """ self.adjList = {} # To store graph: u -> (v,w) self.num_nodes = num # Number of nodes in graph # To store the distance from source vertex self.dist = [0] * self.num_nodes self.par = [-1] * self.num_nodes # To store the path def add_edge(self, u, v, w): """ Add edge going from node u to v and v to u with weight w: u (w)-> v, v (w) -> u Examples: >>> graph_test = Graph(1) >>> graph_test.add_edge(1, 2, 1) >>> graph_test.add_edge(2, 3, 2) >>> graph_test.adjList {1: [(2, 1)], 2: [(1, 1), (3, 2)], 3: [(2, 2)]} """ # Check if u already in graph if u in self.adjList: self.adjList[u].append((v, w)) else: self.adjList[u] = [(v, w)] # Assuming undirected graph if v in self.adjList: self.adjList[v].append((u, w)) else: self.adjList[v] = [(u, w)] def show_graph(self): """ Show the graph: u -> v(w) Examples: >>> graph_test = Graph(1) >>> graph_test.add_edge(1, 2, 1) >>> graph_test.show_graph() 1 -> 2(1) 2 -> 1(1) >>> graph_test.add_edge(2, 3, 2) >>> graph_test.show_graph() 1 -> 2(1) 2 -> 1(1) -> 3(2) 3 -> 2(2) """ for u in self.adjList: print(u, "->", " -> ".join(str(f"{v}({w})") for v, w in self.adjList[u])) def dijkstra(self, src): """ Dijkstra algorithm Examples: >>> graph_test = Graph(3) >>> graph_test.add_edge(0, 1, 2) >>> graph_test.add_edge(1, 2, 2) >>> graph_test.dijkstra(0) Distance from node: 0 Node 0 has distance: 0 Node 1 has distance: 2 Node 2 has distance: 4 >>> graph_test.dist [0, 2, 4] >>> graph_test = Graph(2) >>> graph_test.add_edge(0, 1, 2) >>> graph_test.dijkstra(0) Distance from node: 0 Node 0 has distance: 0 Node 1 has distance: 2 >>> graph_test.dist [0, 2] >>> graph_test = Graph(3) >>> graph_test.add_edge(0, 1, 2) >>> graph_test.dijkstra(0) Distance from node: 0 Node 0 has distance: 0 Node 1 has distance: 2 Node 2 has distance: 0 >>> graph_test.dist [0, 2, 0] >>> graph_test = Graph(3) >>> graph_test.add_edge(0, 1, 2) >>> graph_test.add_edge(1, 2, 2) >>> graph_test.add_edge(0, 2, 1) >>> graph_test.dijkstra(0) Distance from node: 0 Node 0 has distance: 0 Node 1 has distance: 2 Node 2 has distance: 1 >>> graph_test.dist [0, 2, 1] >>> graph_test = Graph(4) >>> graph_test.add_edge(0, 1, 4) >>> graph_test.add_edge(1, 2, 2) >>> graph_test.add_edge(2, 3, 1) >>> graph_test.add_edge(0, 2, 3) >>> graph_test.dijkstra(0) Distance from node: 0 Node 0 has distance: 0 Node 1 has distance: 4 Node 2 has distance: 3 Node 3 has distance: 4 >>> graph_test.dist [0, 4, 3, 4] >>> graph_test = Graph(4) >>> graph_test.add_edge(0, 1, 4) >>> graph_test.add_edge(1, 2, 2) >>> graph_test.add_edge(2, 3, 1) >>> graph_test.add_edge(0, 2, 7) >>> graph_test.dijkstra(0) Distance from node: 0 Node 0 has distance: 0 Node 1 has distance: 4 Node 2 has distance: 6 Node 3 has distance: 7 >>> graph_test.dist [0, 4, 6, 7] """ # Flush old junk values in par[] self.par = [-1] * self.num_nodes # src is the source node self.dist[src] = 0 q = PriorityQueue() q.insert((0, src)) # (dist from src, node) for u in self.adjList: if u != src: self.dist[u] = sys.maxsize # Infinity self.par[u] = -1 while not q.is_empty(): u = q.extract_min() # Returns node with the min dist from source # Update the distance of all the neighbours of u and # if their prev dist was INFINITY then push them in Q for v, w in self.adjList[u]: new_dist = self.dist[u] + w if self.dist[v] > new_dist: if self.dist[v] == sys.maxsize: q.insert((new_dist, v)) else: q.decrease_key((self.dist[v], v), new_dist) self.dist[v] = new_dist self.par[v] = u # Show the shortest distances from src self.show_distances(src) def show_distances(self, src): """ Show the distances from src to all other nodes in a graph Examples: >>> graph_test = Graph(1) >>> graph_test.show_distances(0) Distance from node: 0 Node 0 has distance: 0 """ print(f"Distance from node: {src}") for u in range(self.num_nodes): print(f"Node {u} has distance: {self.dist[u]}") def show_path(self, src, dest): """ Shows the shortest path from src to dest. WARNING: Use it *after* calling dijkstra. Examples: >>> graph_test = Graph(4) >>> graph_test.add_edge(0, 1, 1) >>> graph_test.add_edge(1, 2, 2) >>> graph_test.add_edge(2, 3, 3) >>> graph_test.dijkstra(0) Distance from node: 0 Node 0 has distance: 0 Node 1 has distance: 1 Node 2 has distance: 3 Node 3 has distance: 6 >>> graph_test.show_path(0, 3) # doctest: +NORMALIZE_WHITESPACE ----Path to reach 3 from 0---- 0 -> 1 -> 2 -> 3 Total cost of path: 6 """ path = [] cost = 0 temp = dest # Backtracking from dest to src while self.par[temp] != -1: path.append(temp) if temp != src: for v, w in self.adjList[temp]: if v == self.par[temp]: cost += w break temp = self.par[temp] path.append(src) path.reverse() print(f"----Path to reach {dest} from {src}----") for u in path: print(f"{u}", end=" ") if u != dest: print("-> ", end="") print("\nTotal cost of path: ", cost) if __name__ == "__main__": from doctest import testmod testmod() graph = Graph(9) graph.add_edge(0, 1, 4) graph.add_edge(0, 7, 8) graph.add_edge(1, 2, 8) graph.add_edge(1, 7, 11) graph.add_edge(2, 3, 7) graph.add_edge(2, 8, 2) graph.add_edge(2, 5, 4) graph.add_edge(3, 4, 9) graph.add_edge(3, 5, 14) graph.add_edge(4, 5, 10) graph.add_edge(5, 6, 2) graph.add_edge(6, 7, 1) graph.add_edge(6, 8, 6) graph.add_edge(7, 8, 7) graph.show_graph() graph.dijkstra(0) graph.show_path(0, 4) # OUTPUT # 0 -> 1(4) -> 7(8) # 1 -> 0(4) -> 2(8) -> 7(11) # 7 -> 0(8) -> 1(11) -> 6(1) -> 8(7) # 2 -> 1(8) -> 3(7) -> 8(2) -> 5(4) # 3 -> 2(7) -> 4(9) -> 5(14) # 8 -> 2(2) -> 6(6) -> 7(7) # 5 -> 2(4) -> 3(14) -> 4(10) -> 6(2) # 4 -> 3(9) -> 5(10) # 6 -> 5(2) -> 7(1) -> 8(6) # Distance from node: 0 # Node 0 has distance: 0 # Node 1 has distance: 4 # Node 2 has distance: 12 # Node 3 has distance: 19 # Node 4 has distance: 21 # Node 5 has distance: 11 # Node 6 has distance: 9 # Node 7 has distance: 8 # Node 8 has distance: 14 # ----Path to reach 4 from 0---- # 0 -> 7 -> 6 -> 5 -> 4 # Total cost of path: 21 ================================================ FILE: graphs/dijkstra_alternate.py ================================================ from __future__ import annotations class Graph: def __init__(self, vertices: int) -> None: """ >>> graph = Graph(2) >>> graph.vertices 2 >>> len(graph.graph) 2 >>> len(graph.graph[0]) 2 """ self.vertices = vertices self.graph = [[0] * vertices for _ in range(vertices)] def print_solution(self, distances_from_source: list[int]) -> None: """ >>> Graph(0).print_solution([]) # doctest: +NORMALIZE_WHITESPACE Vertex Distance from Source """ print("Vertex \t Distance from Source") for vertex in range(self.vertices): print(vertex, "\t\t", distances_from_source[vertex]) def minimum_distance( self, distances_from_source: list[int], visited: list[bool] ) -> int: """ A utility function to find the vertex with minimum distance value, from the set of vertices not yet included in shortest path tree. >>> Graph(3).minimum_distance([1, 2, 3], [False, False, True]) 0 """ # Initialize minimum distance for next node minimum = 1e7 min_index = 0 # Search not nearest vertex not in the shortest path tree for vertex in range(self.vertices): if distances_from_source[vertex] < minimum and visited[vertex] is False: minimum = distances_from_source[vertex] min_index = vertex return min_index def dijkstra(self, source: int) -> None: """ Function that implements Dijkstra's single source shortest path algorithm for a graph represented using adjacency matrix representation. >>> Graph(4).dijkstra(1) # doctest: +NORMALIZE_WHITESPACE Vertex Distance from Source 0 10000000 1 0 2 10000000 3 10000000 """ distances = [int(1e7)] * self.vertices # distances from the source distances[source] = 0 visited = [False] * self.vertices for _ in range(self.vertices): u = self.minimum_distance(distances, visited) visited[u] = True # Update dist value of the adjacent vertices # of the picked vertex only if the current # distance is greater than new distance and # the vertex in not in the shortest path tree for v in range(self.vertices): if ( self.graph[u][v] > 0 and visited[v] is False and distances[v] > distances[u] + self.graph[u][v] ): distances[v] = distances[u] + self.graph[u][v] self.print_solution(distances) if __name__ == "__main__": graph = Graph(9) graph.graph = [ [0, 4, 0, 0, 0, 0, 0, 8, 0], [4, 0, 8, 0, 0, 0, 0, 11, 0], [0, 8, 0, 7, 0, 4, 0, 0, 2], [0, 0, 7, 0, 9, 14, 0, 0, 0], [0, 0, 0, 9, 0, 10, 0, 0, 0], [0, 0, 4, 14, 10, 0, 2, 0, 0], [0, 0, 0, 0, 0, 2, 0, 1, 6], [8, 11, 0, 0, 0, 0, 1, 0, 7], [0, 0, 2, 0, 0, 0, 6, 7, 0], ] graph.dijkstra(0) ================================================ FILE: graphs/dijkstra_binary_grid.py ================================================ """ This script implements the Dijkstra algorithm on a binary grid. The grid consists of 0s and 1s, where 1 represents a walkable node and 0 represents an obstacle. The algorithm finds the shortest path from a start node to a destination node. Diagonal movement can be allowed or disallowed. """ from heapq import heappop, heappush import numpy as np def dijkstra( grid: np.ndarray, source: tuple[int, int], destination: tuple[int, int], allow_diagonal: bool, ) -> tuple[float | int, list[tuple[int, int]]]: """ Implements Dijkstra's algorithm on a binary grid. Args: grid (np.ndarray): A 2D numpy array representing the grid. 1 represents a walkable node and 0 represents an obstacle. source (Tuple[int, int]): A tuple representing the start node. destination (Tuple[int, int]): A tuple representing the destination node. allow_diagonal (bool): A boolean determining whether diagonal movements are allowed. Returns: Tuple[Union[float, int], List[Tuple[int, int]]]: The shortest distance from the start node to the destination node and the shortest path as a list of nodes. >>> dijkstra(np.array([[1, 1, 1], [0, 1, 0], [0, 1, 1]]), (0, 0), (2, 2), False) (4.0, [(0, 0), (0, 1), (1, 1), (2, 1), (2, 2)]) >>> dijkstra(np.array([[1, 1, 1], [0, 1, 0], [0, 1, 1]]), (0, 0), (2, 2), True) (2.0, [(0, 0), (1, 1), (2, 2)]) >>> dijkstra(np.array([[1, 1, 1], [0, 0, 1], [0, 1, 1]]), (0, 0), (2, 2), False) (4.0, [(0, 0), (0, 1), (0, 2), (1, 2), (2, 2)]) """ rows, cols = grid.shape dx = [-1, 1, 0, 0] dy = [0, 0, -1, 1] if allow_diagonal: dx += [-1, -1, 1, 1] dy += [-1, 1, -1, 1] queue, visited = [(0, source)], set() matrix = np.full((rows, cols), np.inf) matrix[source] = 0 predecessors = np.empty((rows, cols), dtype=object) predecessors[source] = None while queue: (dist, (x, y)) = heappop(queue) if (x, y) in visited: continue visited.add((x, y)) if (x, y) == destination: path = [] while (x, y) != source: path.append((x, y)) x, y = predecessors[x, y] path.append(source) # add the source manually path.reverse() return float(matrix[destination]), path for i in range(len(dx)): nx, ny = x + dx[i], y + dy[i] if 0 <= nx < rows and 0 <= ny < cols: next_node = grid[nx][ny] if next_node == 1 and matrix[nx, ny] > dist + 1: heappush(queue, (dist + 1, (nx, ny))) matrix[nx, ny] = dist + 1 predecessors[nx, ny] = (x, y) return np.inf, [] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: graphs/dinic.py ================================================ INF = float("inf") class Dinic: def __init__(self, n): self.lvl = [0] * n self.ptr = [0] * n self.q = [0] * n self.adj = [[] for _ in range(n)] """ Here we will add our edges containing with the following parameters: vertex closest to source, vertex closest to sink and flow capacity through that edge ... """ def add_edge(self, a, b, c, rcap=0): self.adj[a].append([b, len(self.adj[b]), c, 0]) self.adj[b].append([a, len(self.adj[a]) - 1, rcap, 0]) # This is a sample depth first search to be used at max_flow def depth_first_search(self, vertex, sink, flow): if vertex == sink or not flow: return flow for i in range(self.ptr[vertex], len(self.adj[vertex])): e = self.adj[vertex][i] if self.lvl[e[0]] == self.lvl[vertex] + 1: p = self.depth_first_search(e[0], sink, min(flow, e[2] - e[3])) if p: self.adj[vertex][i][3] += p self.adj[e[0]][e[1]][3] -= p return p self.ptr[vertex] = self.ptr[vertex] + 1 return 0 # Here we calculate the flow that reaches the sink def max_flow(self, source, sink): flow, self.q[0] = 0, source for l in range(31): # l = 30 maybe faster for random data # noqa: E741 while True: self.lvl, self.ptr = [0] * len(self.q), [0] * len(self.q) qi, qe, self.lvl[source] = 0, 1, 1 while qi < qe and not self.lvl[sink]: v = self.q[qi] qi += 1 for e in self.adj[v]: if not self.lvl[e[0]] and (e[2] - e[3]) >> (30 - l): self.q[qe] = e[0] qe += 1 self.lvl[e[0]] = self.lvl[v] + 1 p = self.depth_first_search(source, sink, INF) while p: flow += p p = self.depth_first_search(source, sink, INF) if not self.lvl[sink]: break return flow # Example to use """ Will be a bipartite graph, than it has the vertices near the source(4) and the vertices near the sink(4) """ # Here we make a graphs with 10 vertex(source and sink includes) graph = Dinic(10) source = 0 sink = 9 """ Now we add the vertices next to the font in the font with 1 capacity in this edge (source -> source vertices) """ for vertex in range(1, 5): graph.add_edge(source, vertex, 1) """ We will do the same thing for the vertices near the sink, but from vertex to sink (sink vertices -> sink) """ for vertex in range(5, 9): graph.add_edge(vertex, sink, 1) """ Finally we add the verices near the sink to the vertices near the source. (source vertices -> sink vertices) """ for vertex in range(1, 5): graph.add_edge(vertex, vertex + 4, 1) # Now we can know that is the maximum flow(source -> sink) print(graph.max_flow(source, sink)) ================================================ FILE: graphs/directed_and_undirected_weighted_graph.py ================================================ from collections import deque from math import floor from random import random from time import time # the default weight is 1 if not assigned but all the implementation is weighted class DirectedGraph: def __init__(self): self.graph = {} # adding vertices and edges # adding the weight is optional # handles repetition def add_pair(self, u, v, w=1): if self.graph.get(u): if self.graph[u].count([w, v]) == 0: self.graph[u].append([w, v]) else: self.graph[u] = [[w, v]] if not self.graph.get(v): self.graph[v] = [] def all_nodes(self): return list(self.graph) # handles if the input does not exist def remove_pair(self, u, v): if self.graph.get(u): for _ in self.graph[u]: if _[1] == v: self.graph[u].remove(_) # if no destination is meant the default value is -1 def dfs(self, s=-2, d=-1): if s == d: return [] stack = [] visited = [] if s == -2: s = next(iter(self.graph)) stack.append(s) visited.append(s) ss = s while True: # check if there is any non isolated nodes if len(self.graph[s]) != 0: ss = s for node in self.graph[s]: if visited.count(node[1]) < 1: if node[1] == d: visited.append(d) return visited else: stack.append(node[1]) visited.append(node[1]) ss = node[1] break # check if all the children are visited if s == ss: stack.pop() if len(stack) != 0: s = stack[len(stack) - 1] else: s = ss # check if se have reached the starting point if len(stack) == 0: return visited # c is the count of nodes you want and if you leave it or pass -1 to the function # the count will be random from 10 to 10000 def fill_graph_randomly(self, c=-1): if c == -1: c = floor(random() * 10000) + 10 for i in range(c): # every vertex has max 100 edges for _ in range(floor(random() * 102) + 1): n = floor(random() * c) + 1 if n != i: self.add_pair(i, n, 1) def bfs(self, s=-2): d = deque() visited = [] if s == -2: s = next(iter(self.graph)) d.append(s) visited.append(s) while d: s = d.popleft() if len(self.graph[s]) != 0: for node in self.graph[s]: if visited.count(node[1]) < 1: d.append(node[1]) visited.append(node[1]) return visited def in_degree(self, u): count = 0 for x in self.graph: for y in self.graph[x]: if y[1] == u: count += 1 return count def out_degree(self, u): return len(self.graph[u]) def topological_sort(self, s=-2): stack = [] visited = [] if s == -2: s = next(iter(self.graph)) stack.append(s) visited.append(s) ss = s sorted_nodes = [] while True: # check if there is any non isolated nodes if len(self.graph[s]) != 0: ss = s for node in self.graph[s]: if visited.count(node[1]) < 1: stack.append(node[1]) visited.append(node[1]) ss = node[1] break # check if all the children are visited if s == ss: sorted_nodes.append(stack.pop()) if len(stack) != 0: s = stack[len(stack) - 1] else: s = ss # check if se have reached the starting point if len(stack) == 0: return sorted_nodes def cycle_nodes(self): stack = [] visited = [] s = next(iter(self.graph)) stack.append(s) visited.append(s) parent = -2 indirect_parents = [] ss = s on_the_way_back = False anticipating_nodes = set() while True: # check if there is any non isolated nodes if len(self.graph[s]) != 0: ss = s for node in self.graph[s]: if ( visited.count(node[1]) > 0 and node[1] != parent and indirect_parents.count(node[1]) > 0 and not on_the_way_back ): len_stack = len(stack) - 1 while len_stack >= 0: if stack[len_stack] == node[1]: anticipating_nodes.add(node[1]) break else: anticipating_nodes.add(stack[len_stack]) len_stack -= 1 if visited.count(node[1]) < 1: stack.append(node[1]) visited.append(node[1]) ss = node[1] break # check if all the children are visited if s == ss: stack.pop() on_the_way_back = True if len(stack) != 0: s = stack[len(stack) - 1] else: on_the_way_back = False indirect_parents.append(parent) parent = s s = ss # check if se have reached the starting point if len(stack) == 0: return list(anticipating_nodes) def has_cycle(self): stack = [] visited = [] s = next(iter(self.graph)) stack.append(s) visited.append(s) parent = -2 indirect_parents = [] ss = s on_the_way_back = False anticipating_nodes = set() while True: # check if there is any non isolated nodes if len(self.graph[s]) != 0: ss = s for node in self.graph[s]: if ( visited.count(node[1]) > 0 and node[1] != parent and indirect_parents.count(node[1]) > 0 and not on_the_way_back ): len_stack_minus_one = len(stack) - 1 while len_stack_minus_one >= 0: if stack[len_stack_minus_one] == node[1]: anticipating_nodes.add(node[1]) break else: return True if visited.count(node[1]) < 1: stack.append(node[1]) visited.append(node[1]) ss = node[1] break # check if all the children are visited if s == ss: stack.pop() on_the_way_back = True if len(stack) != 0: s = stack[len(stack) - 1] else: on_the_way_back = False indirect_parents.append(parent) parent = s s = ss # check if se have reached the starting point if len(stack) == 0: return False def dfs_time(self, s=-2, e=-1): begin = time() self.dfs(s, e) end = time() return end - begin def bfs_time(self, s=-2): begin = time() self.bfs(s) end = time() return end - begin class Graph: def __init__(self): self.graph = {} # adding vertices and edges # adding the weight is optional # handles repetition def add_pair(self, u, v, w=1): # check if the u exists if self.graph.get(u): # if there already is a edge if self.graph[u].count([w, v]) == 0: self.graph[u].append([w, v]) else: # if u does not exist self.graph[u] = [[w, v]] # add the other way if self.graph.get(v): # if there already is a edge if self.graph[v].count([w, u]) == 0: self.graph[v].append([w, u]) else: # if u does not exist self.graph[v] = [[w, u]] # handles if the input does not exist def remove_pair(self, u, v): if self.graph.get(u): for _ in self.graph[u]: if _[1] == v: self.graph[u].remove(_) # the other way round if self.graph.get(v): for _ in self.graph[v]: if _[1] == u: self.graph[v].remove(_) # if no destination is meant the default value is -1 def dfs(self, s=-2, d=-1): if s == d: return [] stack = [] visited = [] if s == -2: s = next(iter(self.graph)) stack.append(s) visited.append(s) ss = s while True: # check if there is any non isolated nodes if len(self.graph[s]) != 0: ss = s for node in self.graph[s]: if visited.count(node[1]) < 1: if node[1] == d: visited.append(d) return visited else: stack.append(node[1]) visited.append(node[1]) ss = node[1] break # check if all the children are visited if s == ss: stack.pop() if len(stack) != 0: s = stack[len(stack) - 1] else: s = ss # check if se have reached the starting point if len(stack) == 0: return visited # c is the count of nodes you want and if you leave it or pass -1 to the function # the count will be random from 10 to 10000 def fill_graph_randomly(self, c=-1): if c == -1: c = floor(random() * 10000) + 10 for i in range(c): # every vertex has max 100 edges for _ in range(floor(random() * 102) + 1): n = floor(random() * c) + 1 if n != i: self.add_pair(i, n, 1) def bfs(self, s=-2): d = deque() visited = [] if s == -2: s = next(iter(self.graph)) d.append(s) visited.append(s) while d: s = d.popleft() if len(self.graph[s]) != 0: for node in self.graph[s]: if visited.count(node[1]) < 1: d.append(node[1]) visited.append(node[1]) return visited def degree(self, u): return len(self.graph[u]) def cycle_nodes(self): stack = [] visited = [] s = next(iter(self.graph)) stack.append(s) visited.append(s) parent = -2 indirect_parents = [] ss = s on_the_way_back = False anticipating_nodes = set() while True: # check if there is any non isolated nodes if len(self.graph[s]) != 0: ss = s for node in self.graph[s]: if ( visited.count(node[1]) > 0 and node[1] != parent and indirect_parents.count(node[1]) > 0 and not on_the_way_back ): len_stack = len(stack) - 1 while len_stack >= 0: if stack[len_stack] == node[1]: anticipating_nodes.add(node[1]) break else: anticipating_nodes.add(stack[len_stack]) len_stack -= 1 if visited.count(node[1]) < 1: stack.append(node[1]) visited.append(node[1]) ss = node[1] break # check if all the children are visited if s == ss: stack.pop() on_the_way_back = True if len(stack) != 0: s = stack[len(stack) - 1] else: on_the_way_back = False indirect_parents.append(parent) parent = s s = ss # check if se have reached the starting point if len(stack) == 0: return list(anticipating_nodes) def has_cycle(self): stack = [] visited = [] s = next(iter(self.graph)) stack.append(s) visited.append(s) parent = -2 indirect_parents = [] ss = s on_the_way_back = False anticipating_nodes = set() while True: # check if there is any non isolated nodes if len(self.graph[s]) != 0: ss = s for node in self.graph[s]: if ( visited.count(node[1]) > 0 and node[1] != parent and indirect_parents.count(node[1]) > 0 and not on_the_way_back ): len_stack_minus_one = len(stack) - 1 while len_stack_minus_one >= 0: if stack[len_stack_minus_one] == node[1]: anticipating_nodes.add(node[1]) break else: return True if visited.count(node[1]) < 1: stack.append(node[1]) visited.append(node[1]) ss = node[1] break # check if all the children are visited if s == ss: stack.pop() on_the_way_back = True if len(stack) != 0: s = stack[len(stack) - 1] else: on_the_way_back = False indirect_parents.append(parent) parent = s s = ss # check if se have reached the starting point if len(stack) == 0: return False def all_nodes(self): return list(self.graph) def dfs_time(self, s=-2, e=-1): begin = time() self.dfs(s, e) end = time() return end - begin def bfs_time(self, s=-2): begin = time() self.bfs(s) end = time() return end - begin ================================================ FILE: graphs/edmonds_karp_multiple_source_and_sink.py ================================================ class FlowNetwork: def __init__(self, graph, sources, sinks): self.source_index = None self.sink_index = None self.graph = graph self._normalize_graph(sources, sinks) self.vertices_count = len(graph) self.maximum_flow_algorithm = None # make only one source and one sink def _normalize_graph(self, sources, sinks): if sources is int: sources = [sources] if sinks is int: sinks = [sinks] if len(sources) == 0 or len(sinks) == 0: return self.source_index = sources[0] self.sink_index = sinks[0] # make fake vertex if there are more # than one source or sink if len(sources) > 1 or len(sinks) > 1: max_input_flow = 0 for i in sources: max_input_flow += sum(self.graph[i]) size = len(self.graph) + 1 for room in self.graph: room.insert(0, 0) self.graph.insert(0, [0] * size) for i in sources: self.graph[0][i + 1] = max_input_flow self.source_index = 0 size = len(self.graph) + 1 for room in self.graph: room.append(0) self.graph.append([0] * size) for i in sinks: self.graph[i + 1][size - 1] = max_input_flow self.sink_index = size - 1 def find_maximum_flow(self): if self.maximum_flow_algorithm is None: raise Exception("You need to set maximum flow algorithm before.") if self.source_index is None or self.sink_index is None: return 0 self.maximum_flow_algorithm.execute() return self.maximum_flow_algorithm.getMaximumFlow() def set_maximum_flow_algorithm(self, algorithm): self.maximum_flow_algorithm = algorithm(self) class FlowNetworkAlgorithmExecutor: def __init__(self, flow_network): self.flow_network = flow_network self.verticies_count = flow_network.verticesCount self.source_index = flow_network.sourceIndex self.sink_index = flow_network.sinkIndex # it's just a reference, so you shouldn't change # it in your algorithms, use deep copy before doing that self.graph = flow_network.graph self.executed = False def execute(self): if not self.executed: self._algorithm() self.executed = True # You should override it def _algorithm(self): pass class MaximumFlowAlgorithmExecutor(FlowNetworkAlgorithmExecutor): def __init__(self, flow_network): super().__init__(flow_network) # use this to save your result self.maximum_flow = -1 def get_maximum_flow(self): if not self.executed: raise Exception("You should execute algorithm before using its result!") return self.maximum_flow class PushRelabelExecutor(MaximumFlowAlgorithmExecutor): def __init__(self, flow_network): super().__init__(flow_network) self.preflow = [[0] * self.verticies_count for i in range(self.verticies_count)] self.heights = [0] * self.verticies_count self.excesses = [0] * self.verticies_count def _algorithm(self): self.heights[self.source_index] = self.verticies_count # push some substance to graph for nextvertex_index, bandwidth in enumerate(self.graph[self.source_index]): self.preflow[self.source_index][nextvertex_index] += bandwidth self.preflow[nextvertex_index][self.source_index] -= bandwidth self.excesses[nextvertex_index] += bandwidth # Relabel-to-front selection rule vertices_list = [ i for i in range(self.verticies_count) if i not in {self.source_index, self.sink_index} ] # move through list i = 0 while i < len(vertices_list): vertex_index = vertices_list[i] previous_height = self.heights[vertex_index] self.process_vertex(vertex_index) if self.heights[vertex_index] > previous_height: # if it was relabeled, swap elements # and start from 0 index vertices_list.insert(0, vertices_list.pop(i)) i = 0 else: i += 1 self.maximum_flow = sum(self.preflow[self.source_index]) def process_vertex(self, vertex_index): while self.excesses[vertex_index] > 0: for neighbour_index in range(self.verticies_count): # if it's neighbour and current vertex is higher if ( self.graph[vertex_index][neighbour_index] - self.preflow[vertex_index][neighbour_index] > 0 and self.heights[vertex_index] > self.heights[neighbour_index] ): self.push(vertex_index, neighbour_index) self.relabel(vertex_index) def push(self, from_index, to_index): preflow_delta = min( self.excesses[from_index], self.graph[from_index][to_index] - self.preflow[from_index][to_index], ) self.preflow[from_index][to_index] += preflow_delta self.preflow[to_index][from_index] -= preflow_delta self.excesses[from_index] -= preflow_delta self.excesses[to_index] += preflow_delta def relabel(self, vertex_index): min_height = None for to_index in range(self.verticies_count): if ( self.graph[vertex_index][to_index] - self.preflow[vertex_index][to_index] > 0 ) and (min_height is None or self.heights[to_index] < min_height): min_height = self.heights[to_index] if min_height is not None: self.heights[vertex_index] = min_height + 1 if __name__ == "__main__": entrances = [0] exits = [3] # graph = [ # [0, 0, 4, 6, 0, 0], # [0, 0, 5, 2, 0, 0], # [0, 0, 0, 0, 4, 4], # [0, 0, 0, 0, 6, 6], # [0, 0, 0, 0, 0, 0], # [0, 0, 0, 0, 0, 0], # ] graph = [[0, 7, 0, 0], [0, 0, 6, 0], [0, 0, 0, 8], [9, 0, 0, 0]] # prepare our network flow_network = FlowNetwork(graph, entrances, exits) # set algorithm flow_network.set_maximum_flow_algorithm(PushRelabelExecutor) # and calculate maximum_flow = flow_network.find_maximum_flow() print(f"maximum flow is {maximum_flow}") ================================================ FILE: graphs/eulerian_path_and_circuit_for_undirected_graph.py ================================================ # Eulerian Path is a path in graph that visits every edge exactly once. # Eulerian Circuit is an Eulerian Path which starts and ends on the same # vertex. # time complexity is O(V+E) # space complexity is O(VE) # using dfs for finding eulerian path traversal def dfs(u, graph, visited_edge, path=None): path = (path or []) + [u] for v in graph[u]: if visited_edge[u][v] is False: visited_edge[u][v], visited_edge[v][u] = True, True path = dfs(v, graph, visited_edge, path) return path # for checking in graph has euler path or circuit def check_circuit_or_path(graph, max_node): odd_degree_nodes = 0 odd_node = -1 for i in range(max_node): if i not in graph: continue if len(graph[i]) % 2 == 1: odd_degree_nodes += 1 odd_node = i if odd_degree_nodes == 0: return 1, odd_node if odd_degree_nodes == 2: return 2, odd_node return 3, odd_node def check_euler(graph, max_node): visited_edge = [[False for _ in range(max_node + 1)] for _ in range(max_node + 1)] check, odd_node = check_circuit_or_path(graph, max_node) if check == 3: print("graph is not Eulerian") print("no path") return start_node = 1 if check == 2: start_node = odd_node print("graph has a Euler path") if check == 1: print("graph has a Euler cycle") path = dfs(start_node, graph, visited_edge) print(path) def main(): g1 = {1: [2, 3, 4], 2: [1, 3], 3: [1, 2], 4: [1, 5], 5: [4]} g2 = {1: [2, 3, 4, 5], 2: [1, 3], 3: [1, 2], 4: [1, 5], 5: [1, 4]} g3 = {1: [2, 3, 4], 2: [1, 3, 4], 3: [1, 2], 4: [1, 2, 5], 5: [4]} g4 = {1: [2, 3], 2: [1, 3], 3: [1, 2]} g5 = { 1: [], 2: [], # all degree is zero } max_node = 10 check_euler(g1, max_node) check_euler(g2, max_node) check_euler(g3, max_node) check_euler(g4, max_node) check_euler(g5, max_node) if __name__ == "__main__": main() ================================================ FILE: graphs/even_tree.py ================================================ """ You are given a tree(a simple connected graph with no cycles). The tree has N nodes numbered from 1 to N and is rooted at node 1. Find the maximum number of edges you can remove from the tree to get a forest such that each connected component of the forest contains an even number of nodes. Constraints 2 <= 2 <= 100 Note: The tree input will be such that it can always be decomposed into components containing an even number of nodes. """ # pylint: disable=invalid-name from collections import defaultdict def dfs(start: int) -> int: """DFS traversal""" # pylint: disable=redefined-outer-name ret = 1 visited[start] = True for v in tree[start]: if v not in visited: ret += dfs(v) if ret % 2 == 0: cuts.append(start) return ret def even_tree(): """ 2 1 3 1 4 3 5 2 6 1 7 2 8 6 9 8 10 8 On removing edges (1,3) and (1,6), we can get the desired result 2. """ dfs(1) if __name__ == "__main__": n, m = 10, 9 tree = defaultdict(list) visited: dict[int, bool] = {} cuts: list[int] = [] count = 0 edges = [(2, 1), (3, 1), (4, 3), (5, 2), (6, 1), (7, 2), (8, 6), (9, 8), (10, 8)] for u, v in edges: tree[u].append(v) tree[v].append(u) even_tree() print(len(cuts) - 1) ================================================ FILE: graphs/finding_bridges.py ================================================ """ An edge is a bridge if, after removing it count of connected components in graph will be increased by one. Bridges represent vulnerabilities in a connected network and are useful for designing reliable networks. For example, in a wired computer network, an articulation point indicates the critical computers and a bridge indicates the critical wires or connections. For more details, refer this article: https://www.geeksforgeeks.org/bridge-in-a-graph/ """ def __get_demo_graph(index): return [ { 0: [1, 2], 1: [0, 2], 2: [0, 1, 3, 5], 3: [2, 4], 4: [3], 5: [2, 6, 8], 6: [5, 7], 7: [6, 8], 8: [5, 7], }, { 0: [6], 1: [9], 2: [4, 5], 3: [4], 4: [2, 3], 5: [2], 6: [0, 7], 7: [6], 8: [], 9: [1], }, { 0: [4], 1: [6], 2: [], 3: [5, 6, 7], 4: [0, 6], 5: [3, 8, 9], 6: [1, 3, 4, 7], 7: [3, 6, 8, 9], 8: [5, 7], 9: [5, 7], }, { 0: [1, 3], 1: [0, 2, 4], 2: [1, 3, 4], 3: [0, 2, 4], 4: [1, 2, 3], }, ][index] def compute_bridges(graph: dict[int, list[int]]) -> list[tuple[int, int]]: """ Return the list of undirected graph bridges [(a1, b1), ..., (ak, bk)]; ai <= bi >>> compute_bridges(__get_demo_graph(0)) [(3, 4), (2, 3), (2, 5)] >>> compute_bridges(__get_demo_graph(1)) [(6, 7), (0, 6), (1, 9), (3, 4), (2, 4), (2, 5)] >>> compute_bridges(__get_demo_graph(2)) [(1, 6), (4, 6), (0, 4)] >>> compute_bridges(__get_demo_graph(3)) [] >>> compute_bridges({}) [] """ id_ = 0 n = len(graph) # No of vertices in graph low = [0] * n visited = [False] * n def dfs(at, parent, bridges, id_): visited[at] = True low[at] = id_ id_ += 1 for to in graph[at]: if to == parent: pass elif not visited[to]: dfs(to, at, bridges, id_) low[at] = min(low[at], low[to]) if id_ <= low[to]: bridges.append((at, to) if at < to else (to, at)) else: # This edge is a back edge and cannot be a bridge low[at] = min(low[at], low[to]) bridges: list[tuple[int, int]] = [] for i in range(n): if not visited[i]: dfs(i, -1, bridges, id_) return bridges if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: graphs/frequent_pattern_graph_miner.py ================================================ """ FP-GraphMiner - A Fast Frequent Pattern Mining Algorithm for Network Graphs A novel Frequent Pattern Graph Mining algorithm, FP-GraphMiner, that compactly represents a set of network graphs as a Frequent Pattern Graph (or FP-Graph). This graph can be used to efficiently mine frequent subgraphs including maximal frequent subgraphs and maximum common subgraphs. URL: https://www.researchgate.net/publication/235255851 """ # fmt: off edge_array = [ ['ab-e1', 'ac-e3', 'ad-e5', 'bc-e4', 'bd-e2', 'be-e6', 'bh-e12', 'cd-e2', 'ce-e4', 'de-e1', 'df-e8', 'dg-e5', 'dh-e10', 'ef-e3', 'eg-e2', 'fg-e6', 'gh-e6', 'hi-e3'], ['ab-e1', 'ac-e3', 'ad-e5', 'bc-e4', 'bd-e2', 'be-e6', 'cd-e2', 'de-e1', 'df-e8', 'ef-e3', 'eg-e2', 'fg-e6'], ['ab-e1', 'ac-e3', 'bc-e4', 'bd-e2', 'de-e1', 'df-e8', 'dg-e5', 'ef-e3', 'eg-e2', 'eh-e12', 'fg-e6', 'fh-e10', 'gh-e6'], ['ab-e1', 'ac-e3', 'bc-e4', 'bd-e2', 'bh-e12', 'cd-e2', 'df-e8', 'dh-e10'], ['ab-e1', 'ac-e3', 'ad-e5', 'bc-e4', 'bd-e2', 'cd-e2', 'ce-e4', 'de-e1', 'df-e8', 'dg-e5', 'ef-e3', 'eg-e2', 'fg-e6'] ] # fmt: on def get_distinct_edge(edge_array): """ Return Distinct edges from edge array of multiple graphs >>> sorted(get_distinct_edge(edge_array)) ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'] """ distinct_edge = set() for row in edge_array: for item in row: distinct_edge.add(item[0]) return list(distinct_edge) def get_bitcode(edge_array, distinct_edge): """ Return bitcode of distinct_edge """ bitcode = ["0"] * len(edge_array) for i, row in enumerate(edge_array): for item in row: if distinct_edge in item[0]: bitcode[i] = "1" break return "".join(bitcode) def get_frequency_table(edge_array): """ Returns Frequency Table """ distinct_edge = get_distinct_edge(edge_array) frequency_table = {} for item in distinct_edge: bit = get_bitcode(edge_array, item) # print('bit',bit) # bt=''.join(bit) s = bit.count("1") frequency_table[item] = [s, bit] # Store [Distinct edge, WT(Bitcode), Bitcode] in descending order sorted_frequency_table = [ [k, v[0], v[1]] for k, v in sorted(frequency_table.items(), key=lambda v: v[1][0], reverse=True) ] return sorted_frequency_table def get_nodes(frequency_table): """ Returns nodes format nodes={bitcode:edges that represent the bitcode} >>> get_nodes([['ab', 5, '11111'], ['ac', 5, '11111'], ['df', 5, '11111'], ... ['bd', 5, '11111'], ['bc', 5, '11111']]) {'11111': ['ab', 'ac', 'df', 'bd', 'bc']} """ nodes = {} for _, item in enumerate(frequency_table): nodes.setdefault(item[2], []).append(item[0]) return nodes def get_cluster(nodes): """ Returns cluster format cluster:{WT(bitcode):nodes with same WT} """ cluster = {} for key, value in nodes.items(): cluster.setdefault(key.count("1"), {})[key] = value return cluster def get_support(cluster): """ Returns support >>> get_support({5: {'11111': ['ab', 'ac', 'df', 'bd', 'bc']}, ... 4: {'11101': ['ef', 'eg', 'de', 'fg'], '11011': ['cd']}, ... 3: {'11001': ['ad'], '10101': ['dg']}, ... 2: {'10010': ['dh', 'bh'], '11000': ['be'], '10100': ['gh'], ... '10001': ['ce']}, ... 1: {'00100': ['fh', 'eh'], '10000': ['hi']}}) [100.0, 80.0, 60.0, 40.0, 20.0] """ return [i * 100 / len(cluster) for i in cluster] def print_all() -> None: print("\nNodes\n") for key, value in nodes.items(): print(key, value) print("\nSupport\n") print(support) print("\n Cluster \n") for key, value in sorted(cluster.items(), reverse=True): print(key, value) print("\n Graph\n") for key, value in graph.items(): print(key, value) print("\n Edge List of Frequent subgraphs \n") for edge_list in freq_subgraph_edge_list: print(edge_list) def create_edge(nodes, graph, cluster, c1): """ create edge between the nodes """ for i in cluster[c1]: count = 0 c2 = c1 + 1 while c2 < max(cluster.keys()): for j in cluster[c2]: """ creates edge only if the condition satisfies """ if int(i, 2) & int(j, 2) == int(i, 2): if tuple(nodes[i]) in graph: graph[tuple(nodes[i])].append(nodes[j]) else: graph[tuple(nodes[i])] = [nodes[j]] count += 1 if count == 0: c2 = c2 + 1 else: break def construct_graph(cluster, nodes): x = cluster[max(cluster.keys())] cluster[max(cluster.keys()) + 1] = "Header" graph = {} for i in x: if (["Header"],) in graph: graph[(["Header"],)].append(x[i]) else: graph[(["Header"],)] = [x[i]] for i in x: graph[(x[i],)] = [["Header"]] i = 1 while i < max(cluster) - 1: create_edge(nodes, graph, cluster, i) i = i + 1 return graph def my_dfs(graph, start, end, path=None): """ find different DFS walk from given node to Header node """ path = (path or []) + [start] if start == end: paths.append(path) for node in graph[start]: if tuple(node) not in path: my_dfs(graph, tuple(node), end, path) def find_freq_subgraph_given_support(s, cluster, graph): """ find edges of multiple frequent subgraphs """ k = int(s / 100 * (len(cluster) - 1)) for i in cluster[k]: my_dfs(graph, tuple(cluster[k][i]), (["Header"],)) def freq_subgraphs_edge_list(paths): """ returns Edge list for frequent subgraphs """ freq_sub_el = [] for edges in paths: el = [] for j in range(len(edges) - 1): temp = list(edges[j]) for e in temp: edge = (e[0], e[1]) el.append(edge) freq_sub_el.append(el) return freq_sub_el def preprocess(edge_array): """ Preprocess the edge array >>> preprocess([['ab-e1', 'ac-e3', 'ad-e5', 'bc-e4', 'bd-e2', 'be-e6', 'bh-e12', ... 'cd-e2', 'ce-e4', 'de-e1', 'df-e8', 'dg-e5', 'dh-e10', 'ef-e3', ... 'eg-e2', 'fg-e6', 'gh-e6', 'hi-e3']]) """ for i in range(len(edge_array)): for j in range(len(edge_array[i])): t = edge_array[i][j].split("-") edge_array[i][j] = t if __name__ == "__main__": preprocess(edge_array) frequency_table = get_frequency_table(edge_array) nodes = get_nodes(frequency_table) cluster = get_cluster(nodes) support = get_support(cluster) graph = construct_graph(cluster, nodes) find_freq_subgraph_given_support(60, cluster, graph) paths: list = [] freq_subgraph_edge_list = freq_subgraphs_edge_list(paths) print_all() ================================================ FILE: graphs/g_topological_sort.py ================================================ # Author: Phyllipe Bezerra (https://github.com/pmba) clothes = { 0: "underwear", 1: "pants", 2: "belt", 3: "suit", 4: "shoe", 5: "socks", 6: "shirt", 7: "tie", 8: "watch", } graph = [[1, 4], [2, 4], [3], [], [], [4], [2, 7], [3], []] visited = [0 for x in range(len(graph))] stack = [] def print_stack(stack, clothes): order = 1 while stack: current_clothing = stack.pop() print(order, clothes[current_clothing]) order += 1 def depth_first_search(u, visited, graph): visited[u] = 1 for v in graph[u]: if not visited[v]: depth_first_search(v, visited, graph) stack.append(u) def topological_sort(graph, visited): for v in range(len(graph)): if not visited[v]: depth_first_search(v, visited, graph) if __name__ == "__main__": topological_sort(graph, visited) print(stack) print_stack(stack, clothes) ================================================ FILE: graphs/gale_shapley_bigraph.py ================================================ from __future__ import annotations def stable_matching( donor_pref: list[list[int]], recipient_pref: list[list[int]] ) -> list[int]: """ Finds the stable match in any bipartite graph, i.e a pairing where no 2 objects prefer each other over their partner. The function accepts the preferences of oegan donors and recipients (where both are assigned numbers from 0 to n-1) and returns a list where the index position corresponds to the donor and value at the index is the organ recipient. To better understand the algorithm, see also: https://github.com/akashvshroff/Gale_Shapley_Stable_Matching (README). https://www.youtube.com/watch?v=Qcv1IqHWAzg&t=13s (Numberphile YouTube). >>> donor_pref = [[0, 1, 3, 2], [0, 2, 3, 1], [1, 0, 2, 3], [0, 3, 1, 2]] >>> recipient_pref = [[3, 1, 2, 0], [3, 1, 0, 2], [0, 3, 1, 2], [1, 0, 3, 2]] >>> stable_matching(donor_pref, recipient_pref) [1, 2, 3, 0] """ assert len(donor_pref) == len(recipient_pref) n = len(donor_pref) unmatched_donors = list(range(n)) donor_record = [-1] * n # who the donor has donated to rec_record = [-1] * n # who the recipient has received from num_donations = [0] * n while unmatched_donors: donor = unmatched_donors[0] donor_preference = donor_pref[donor] recipient = donor_preference[num_donations[donor]] num_donations[donor] += 1 rec_preference = recipient_pref[recipient] prev_donor = rec_record[recipient] if prev_donor != -1: if rec_preference.index(prev_donor) > rec_preference.index(donor): rec_record[recipient] = donor donor_record[donor] = recipient unmatched_donors.append(prev_donor) unmatched_donors.remove(donor) else: rec_record[recipient] = donor donor_record[donor] = recipient unmatched_donors.remove(donor) return donor_record ================================================ FILE: graphs/graph_adjacency_list.py ================================================ #!/usr/bin/env python3 """ Author: Vikram Nithyanandam Description: The following implementation is a robust unweighted Graph data structure implemented using an adjacency list. This vertices and edges of this graph can be effectively initialized and modified while storing your chosen generic value in each vertex. Adjacency List: https://en.wikipedia.org/wiki/Adjacency_list Potential Future Ideas: - Add a flag to set edge weights on and set edge weights - Make edge weights and vertex values customizable to store whatever the client wants - Support multigraph functionality if the client wants it """ from __future__ import annotations import random import unittest from pprint import pformat from typing import TypeVar import pytest T = TypeVar("T") class GraphAdjacencyList[T]: def __init__( self, vertices: list[T], edges: list[list[T]], directed: bool = True ) -> None: """ Parameters: - vertices: (list[T]) The list of vertex names the client wants to pass in. Default is empty. - edges: (list[list[T]]) The list of edges the client wants to pass in. Each edge is a 2-element list. Default is empty. - directed: (bool) Indicates if graph is directed or undirected. Default is True. """ self.adj_list: dict[T, list[T]] = {} # dictionary of lists of T self.directed = directed # Falsey checks edges = edges or [] vertices = vertices or [] for vertex in vertices: self.add_vertex(vertex) for edge in edges: if len(edge) != 2: msg = f"Invalid input: {edge} is the wrong length." raise ValueError(msg) self.add_edge(edge[0], edge[1]) def add_vertex(self, vertex: T) -> None: """ Adds a vertex to the graph. If the given vertex already exists, a ValueError will be thrown. >>> g = GraphAdjacencyList(vertices=[], edges=[], directed=False) >>> g.add_vertex("A") >>> g.adj_list {'A': []} >>> g.add_vertex("A") Traceback (most recent call last): ... ValueError: Incorrect input: A is already in the graph. """ if self.contains_vertex(vertex): msg = f"Incorrect input: {vertex} is already in the graph." raise ValueError(msg) self.adj_list[vertex] = [] def add_edge(self, source_vertex: T, destination_vertex: T) -> None: """ Creates an edge from source vertex to destination vertex. If any given vertex doesn't exist or the edge already exists, a ValueError will be thrown. """ if not ( self.contains_vertex(source_vertex) and self.contains_vertex(destination_vertex) ): msg = ( f"Incorrect input: Either {source_vertex} or " f"{destination_vertex} does not exist" ) raise ValueError(msg) if self.contains_edge(source_vertex, destination_vertex): msg = ( "Incorrect input: The edge already exists between " f"{source_vertex} and {destination_vertex}" ) raise ValueError(msg) # add the destination vertex to the list associated with the source vertex # and vice versa if not directed self.adj_list[source_vertex].append(destination_vertex) if not self.directed: self.adj_list[destination_vertex].append(source_vertex) def remove_vertex(self, vertex: T) -> None: """ Removes the given vertex from the graph and deletes all incoming and outgoing edges from the given vertex as well. If the given vertex does not exist, a ValueError will be thrown. """ if not self.contains_vertex(vertex): msg = f"Incorrect input: {vertex} does not exist in this graph." raise ValueError(msg) if not self.directed: # If not directed, find all neighboring vertices and delete all references # of edges connecting to the given vertex for neighbor in self.adj_list[vertex]: self.adj_list[neighbor].remove(vertex) else: # If directed, search all neighbors of all vertices and delete all # references of edges connecting to the given vertex for edge_list in self.adj_list.values(): if vertex in edge_list: edge_list.remove(vertex) # Finally, delete the given vertex and all of its outgoing edge references self.adj_list.pop(vertex) def remove_edge(self, source_vertex: T, destination_vertex: T) -> None: """ Removes the edge between the two vertices. If any given vertex doesn't exist or the edge does not exist, a ValueError will be thrown. """ if not ( self.contains_vertex(source_vertex) and self.contains_vertex(destination_vertex) ): msg = ( f"Incorrect input: Either {source_vertex} or " f"{destination_vertex} does not exist" ) raise ValueError(msg) if not self.contains_edge(source_vertex, destination_vertex): msg = ( "Incorrect input: The edge does NOT exist between " f"{source_vertex} and {destination_vertex}" ) raise ValueError(msg) # remove the destination vertex from the list associated with the source # vertex and vice versa if not directed self.adj_list[source_vertex].remove(destination_vertex) if not self.directed: self.adj_list[destination_vertex].remove(source_vertex) def contains_vertex(self, vertex: T) -> bool: """ Returns True if the graph contains the vertex, False otherwise. """ return vertex in self.adj_list def contains_edge(self, source_vertex: T, destination_vertex: T) -> bool: """ Returns True if the graph contains the edge from the source_vertex to the destination_vertex, False otherwise. If any given vertex doesn't exist, a ValueError will be thrown. """ if not ( self.contains_vertex(source_vertex) and self.contains_vertex(destination_vertex) ): msg = ( f"Incorrect input: Either {source_vertex} " f"or {destination_vertex} does not exist." ) raise ValueError(msg) return destination_vertex in self.adj_list[source_vertex] def clear_graph(self) -> None: """ Clears all vertices and edges. """ self.adj_list = {} def __repr__(self) -> str: return pformat(self.adj_list) class TestGraphAdjacencyList(unittest.TestCase): def __assert_graph_edge_exists_check( self, undirected_graph: GraphAdjacencyList, directed_graph: GraphAdjacencyList, edge: list[int], ) -> None: assert undirected_graph.contains_edge(edge[0], edge[1]) assert undirected_graph.contains_edge(edge[1], edge[0]) assert directed_graph.contains_edge(edge[0], edge[1]) def __assert_graph_edge_does_not_exist_check( self, undirected_graph: GraphAdjacencyList, directed_graph: GraphAdjacencyList, edge: list[int], ) -> None: assert not undirected_graph.contains_edge(edge[0], edge[1]) assert not undirected_graph.contains_edge(edge[1], edge[0]) assert not directed_graph.contains_edge(edge[0], edge[1]) def __assert_graph_vertex_exists_check( self, undirected_graph: GraphAdjacencyList, directed_graph: GraphAdjacencyList, vertex: int, ) -> None: assert undirected_graph.contains_vertex(vertex) assert directed_graph.contains_vertex(vertex) def __assert_graph_vertex_does_not_exist_check( self, undirected_graph: GraphAdjacencyList, directed_graph: GraphAdjacencyList, vertex: int, ) -> None: assert not undirected_graph.contains_vertex(vertex) assert not directed_graph.contains_vertex(vertex) def __generate_random_edges( self, vertices: list[int], edge_pick_count: int ) -> list[list[int]]: assert edge_pick_count <= len(vertices) random_source_vertices: list[int] = random.sample( vertices[0 : int(len(vertices) / 2)], edge_pick_count ) random_destination_vertices: list[int] = random.sample( vertices[int(len(vertices) / 2) :], edge_pick_count ) random_edges: list[list[int]] = [] for source in random_source_vertices: for dest in random_destination_vertices: random_edges.append([source, dest]) return random_edges def __generate_graphs( self, vertex_count: int, min_val: int, max_val: int, edge_pick_count: int ) -> tuple[GraphAdjacencyList, GraphAdjacencyList, list[int], list[list[int]]]: if max_val - min_val + 1 < vertex_count: raise ValueError( "Will result in duplicate vertices. Either increase range " "between min_val and max_val or decrease vertex count." ) # generate graph input random_vertices: list[int] = random.sample( range(min_val, max_val + 1), vertex_count ) random_edges: list[list[int]] = self.__generate_random_edges( random_vertices, edge_pick_count ) # build graphs undirected_graph = GraphAdjacencyList( vertices=random_vertices, edges=random_edges, directed=False ) directed_graph = GraphAdjacencyList( vertices=random_vertices, edges=random_edges, directed=True ) return undirected_graph, directed_graph, random_vertices, random_edges def test_init_check(self) -> None: ( undirected_graph, directed_graph, random_vertices, random_edges, ) = self.__generate_graphs(20, 0, 100, 4) # test graph initialization with vertices and edges for num in random_vertices: self.__assert_graph_vertex_exists_check( undirected_graph, directed_graph, num ) for edge in random_edges: self.__assert_graph_edge_exists_check( undirected_graph, directed_graph, edge ) assert not undirected_graph.directed assert directed_graph.directed def test_contains_vertex(self) -> None: random_vertices: list[int] = random.sample(range(101), 20) # Build graphs WITHOUT edges undirected_graph = GraphAdjacencyList( vertices=random_vertices, edges=[], directed=False ) directed_graph = GraphAdjacencyList( vertices=random_vertices, edges=[], directed=True ) # Test contains_vertex for num in range(101): assert (num in random_vertices) == undirected_graph.contains_vertex(num) assert (num in random_vertices) == directed_graph.contains_vertex(num) def test_add_vertices(self) -> None: random_vertices: list[int] = random.sample(range(101), 20) # build empty graphs undirected_graph: GraphAdjacencyList = GraphAdjacencyList( vertices=[], edges=[], directed=False ) directed_graph: GraphAdjacencyList = GraphAdjacencyList( vertices=[], edges=[], directed=True ) # run add_vertex for num in random_vertices: undirected_graph.add_vertex(num) for num in random_vertices: directed_graph.add_vertex(num) # test add_vertex worked for num in random_vertices: self.__assert_graph_vertex_exists_check( undirected_graph, directed_graph, num ) def test_remove_vertices(self) -> None: random_vertices: list[int] = random.sample(range(101), 20) # build graphs WITHOUT edges undirected_graph = GraphAdjacencyList( vertices=random_vertices, edges=[], directed=False ) directed_graph = GraphAdjacencyList( vertices=random_vertices, edges=[], directed=True ) # test remove_vertex worked for num in random_vertices: self.__assert_graph_vertex_exists_check( undirected_graph, directed_graph, num ) undirected_graph.remove_vertex(num) directed_graph.remove_vertex(num) self.__assert_graph_vertex_does_not_exist_check( undirected_graph, directed_graph, num ) def test_add_and_remove_vertices_repeatedly(self) -> None: random_vertices1: list[int] = random.sample(range(51), 20) random_vertices2: list[int] = random.sample(range(51, 101), 20) # build graphs WITHOUT edges undirected_graph = GraphAdjacencyList( vertices=random_vertices1, edges=[], directed=False ) directed_graph = GraphAdjacencyList( vertices=random_vertices1, edges=[], directed=True ) # test adding and removing vertices for i, _ in enumerate(random_vertices1): undirected_graph.add_vertex(random_vertices2[i]) directed_graph.add_vertex(random_vertices2[i]) self.__assert_graph_vertex_exists_check( undirected_graph, directed_graph, random_vertices2[i] ) undirected_graph.remove_vertex(random_vertices1[i]) directed_graph.remove_vertex(random_vertices1[i]) self.__assert_graph_vertex_does_not_exist_check( undirected_graph, directed_graph, random_vertices1[i] ) # remove all vertices for i, _ in enumerate(random_vertices1): undirected_graph.remove_vertex(random_vertices2[i]) directed_graph.remove_vertex(random_vertices2[i]) self.__assert_graph_vertex_does_not_exist_check( undirected_graph, directed_graph, random_vertices2[i] ) def test_contains_edge(self) -> None: # generate graphs and graph input vertex_count = 20 ( undirected_graph, directed_graph, random_vertices, random_edges, ) = self.__generate_graphs(vertex_count, 0, 100, 4) # generate all possible edges for testing all_possible_edges: list[list[int]] = [] for i in range(vertex_count - 1): for j in range(i + 1, vertex_count): all_possible_edges.append([random_vertices[i], random_vertices[j]]) all_possible_edges.append([random_vertices[j], random_vertices[i]]) # test contains_edge function for edge in all_possible_edges: if edge in random_edges: self.__assert_graph_edge_exists_check( undirected_graph, directed_graph, edge ) elif [edge[1], edge[0]] in random_edges: # since this edge exists for undirected but the reverse # may not exist for directed self.__assert_graph_edge_exists_check( undirected_graph, directed_graph, [edge[1], edge[0]] ) else: self.__assert_graph_edge_does_not_exist_check( undirected_graph, directed_graph, edge ) def test_add_edge(self) -> None: # generate graph input random_vertices: list[int] = random.sample(range(101), 15) random_edges: list[list[int]] = self.__generate_random_edges(random_vertices, 4) # build graphs WITHOUT edges undirected_graph = GraphAdjacencyList( vertices=random_vertices, edges=[], directed=False ) directed_graph = GraphAdjacencyList( vertices=random_vertices, edges=[], directed=True ) # run and test add_edge for edge in random_edges: undirected_graph.add_edge(edge[0], edge[1]) directed_graph.add_edge(edge[0], edge[1]) self.__assert_graph_edge_exists_check( undirected_graph, directed_graph, edge ) def test_remove_edge(self) -> None: # generate graph input and graphs ( undirected_graph, directed_graph, _random_vertices, random_edges, ) = self.__generate_graphs(20, 0, 100, 4) # run and test remove_edge for edge in random_edges: self.__assert_graph_edge_exists_check( undirected_graph, directed_graph, edge ) undirected_graph.remove_edge(edge[0], edge[1]) directed_graph.remove_edge(edge[0], edge[1]) self.__assert_graph_edge_does_not_exist_check( undirected_graph, directed_graph, edge ) def test_add_and_remove_edges_repeatedly(self) -> None: ( undirected_graph, directed_graph, random_vertices, random_edges, ) = self.__generate_graphs(20, 0, 100, 4) # make some more edge options! more_random_edges: list[list[int]] = [] while len(more_random_edges) != len(random_edges): edges: list[list[int]] = self.__generate_random_edges(random_vertices, 4) for edge in edges: if len(more_random_edges) == len(random_edges): break elif edge not in more_random_edges and edge not in random_edges: more_random_edges.append(edge) for i, _ in enumerate(random_edges): undirected_graph.add_edge(more_random_edges[i][0], more_random_edges[i][1]) directed_graph.add_edge(more_random_edges[i][0], more_random_edges[i][1]) self.__assert_graph_edge_exists_check( undirected_graph, directed_graph, more_random_edges[i] ) undirected_graph.remove_edge(random_edges[i][0], random_edges[i][1]) directed_graph.remove_edge(random_edges[i][0], random_edges[i][1]) self.__assert_graph_edge_does_not_exist_check( undirected_graph, directed_graph, random_edges[i] ) def test_add_vertex_exception_check(self) -> None: ( undirected_graph, directed_graph, random_vertices, _random_edges, ) = self.__generate_graphs(20, 0, 100, 4) for vertex in random_vertices: with pytest.raises(ValueError): undirected_graph.add_vertex(vertex) with pytest.raises(ValueError): directed_graph.add_vertex(vertex) def test_remove_vertex_exception_check(self) -> None: ( undirected_graph, directed_graph, random_vertices, _random_edges, ) = self.__generate_graphs(20, 0, 100, 4) for i in range(101): if i not in random_vertices: with pytest.raises(ValueError): undirected_graph.remove_vertex(i) with pytest.raises(ValueError): directed_graph.remove_vertex(i) def test_add_edge_exception_check(self) -> None: ( undirected_graph, directed_graph, _random_vertices, random_edges, ) = self.__generate_graphs(20, 0, 100, 4) for edge in random_edges: with pytest.raises(ValueError): undirected_graph.add_edge(edge[0], edge[1]) with pytest.raises(ValueError): directed_graph.add_edge(edge[0], edge[1]) def test_remove_edge_exception_check(self) -> None: ( undirected_graph, directed_graph, random_vertices, random_edges, ) = self.__generate_graphs(20, 0, 100, 4) more_random_edges: list[list[int]] = [] while len(more_random_edges) != len(random_edges): edges: list[list[int]] = self.__generate_random_edges(random_vertices, 4) for edge in edges: if len(more_random_edges) == len(random_edges): break elif edge not in more_random_edges and edge not in random_edges: more_random_edges.append(edge) for edge in more_random_edges: with pytest.raises(ValueError): undirected_graph.remove_edge(edge[0], edge[1]) with pytest.raises(ValueError): directed_graph.remove_edge(edge[0], edge[1]) def test_contains_edge_exception_check(self) -> None: ( undirected_graph, directed_graph, random_vertices, _random_edges, ) = self.__generate_graphs(20, 0, 100, 4) for vertex in random_vertices: with pytest.raises(ValueError): undirected_graph.contains_edge(vertex, 102) with pytest.raises(ValueError): directed_graph.contains_edge(vertex, 102) with pytest.raises(ValueError): undirected_graph.contains_edge(103, 102) with pytest.raises(ValueError): directed_graph.contains_edge(103, 102) if __name__ == "__main__": unittest.main() ================================================ FILE: graphs/graph_adjacency_matrix.py ================================================ #!/usr/bin/env python3 """ Author: Vikram Nithyanandam Description: The following implementation is a robust unweighted Graph data structure implemented using an adjacency matrix. This vertices and edges of this graph can be effectively initialized and modified while storing your chosen generic value in each vertex. Adjacency Matrix: https://mathworld.wolfram.com/AdjacencyMatrix.html Potential Future Ideas: - Add a flag to set edge weights on and set edge weights - Make edge weights and vertex values customizable to store whatever the client wants - Support multigraph functionality if the client wants it """ from __future__ import annotations import random import unittest from pprint import pformat from typing import TypeVar import pytest T = TypeVar("T") class GraphAdjacencyMatrix[T]: def __init__( self, vertices: list[T], edges: list[list[T]], directed: bool = True ) -> None: """ Parameters: - vertices: (list[T]) The list of vertex names the client wants to pass in. Default is empty. - edges: (list[list[T]]) The list of edges the client wants to pass in. Each edge is a 2-element list. Default is empty. - directed: (bool) Indicates if graph is directed or undirected. Default is True. """ self.directed = directed self.vertex_to_index: dict[T, int] = {} self.adj_matrix: list[list[int]] = [] # Falsey checks edges = edges or [] vertices = vertices or [] for vertex in vertices: self.add_vertex(vertex) for edge in edges: if len(edge) != 2: msg = f"Invalid input: {edge} must have length 2." raise ValueError(msg) self.add_edge(edge[0], edge[1]) def add_edge(self, source_vertex: T, destination_vertex: T) -> None: """ Creates an edge from source vertex to destination vertex. If any given vertex doesn't exist or the edge already exists, a ValueError will be thrown. """ if not ( self.contains_vertex(source_vertex) and self.contains_vertex(destination_vertex) ): msg = ( f"Incorrect input: Either {source_vertex} or " f"{destination_vertex} does not exist" ) raise ValueError(msg) if self.contains_edge(source_vertex, destination_vertex): msg = ( "Incorrect input: The edge already exists between " f"{source_vertex} and {destination_vertex}" ) raise ValueError(msg) # Get the indices of the corresponding vertices and set their edge value to 1. u: int = self.vertex_to_index[source_vertex] v: int = self.vertex_to_index[destination_vertex] self.adj_matrix[u][v] = 1 if not self.directed: self.adj_matrix[v][u] = 1 def remove_edge(self, source_vertex: T, destination_vertex: T) -> None: """ Removes the edge between the two vertices. If any given vertex doesn't exist or the edge does not exist, a ValueError will be thrown. """ if not ( self.contains_vertex(source_vertex) and self.contains_vertex(destination_vertex) ): msg = ( f"Incorrect input: Either {source_vertex} or " f"{destination_vertex} does not exist" ) raise ValueError(msg) if not self.contains_edge(source_vertex, destination_vertex): msg = ( "Incorrect input: The edge does NOT exist between " f"{source_vertex} and {destination_vertex}" ) raise ValueError(msg) # Get the indices of the corresponding vertices and set their edge value to 0. u: int = self.vertex_to_index[source_vertex] v: int = self.vertex_to_index[destination_vertex] self.adj_matrix[u][v] = 0 if not self.directed: self.adj_matrix[v][u] = 0 def add_vertex(self, vertex: T) -> None: """ Adds a vertex to the graph. If the given vertex already exists, a ValueError will be thrown. """ if self.contains_vertex(vertex): msg = f"Incorrect input: {vertex} already exists in this graph." raise ValueError(msg) # build column for vertex for row in self.adj_matrix: row.append(0) # build row for vertex and update other data structures self.adj_matrix.append([0] * (len(self.adj_matrix) + 1)) self.vertex_to_index[vertex] = len(self.adj_matrix) - 1 def remove_vertex(self, vertex: T) -> None: """ Removes the given vertex from the graph and deletes all incoming and outgoing edges from the given vertex as well. If the given vertex does not exist, a ValueError will be thrown. """ if not self.contains_vertex(vertex): msg = f"Incorrect input: {vertex} does not exist in this graph." raise ValueError(msg) # first slide up the rows by deleting the row corresponding to # the vertex being deleted. start_index = self.vertex_to_index[vertex] self.adj_matrix.pop(start_index) # next, slide the columns to the left by deleting the values in # the column corresponding to the vertex being deleted for lst in self.adj_matrix: lst.pop(start_index) # final clean up self.vertex_to_index.pop(vertex) # decrement indices for vertices shifted by the deleted vertex in the adj matrix for inner_vertex in self.vertex_to_index: if self.vertex_to_index[inner_vertex] >= start_index: self.vertex_to_index[inner_vertex] = ( self.vertex_to_index[inner_vertex] - 1 ) def contains_vertex(self, vertex: T) -> bool: """ Returns True if the graph contains the vertex, False otherwise. """ return vertex in self.vertex_to_index def contains_edge(self, source_vertex: T, destination_vertex: T) -> bool: """ Returns True if the graph contains the edge from the source_vertex to the destination_vertex, False otherwise. If any given vertex doesn't exist, a ValueError will be thrown. """ if not ( self.contains_vertex(source_vertex) and self.contains_vertex(destination_vertex) ): msg = ( f"Incorrect input: Either {source_vertex} " f"or {destination_vertex} does not exist." ) raise ValueError(msg) u = self.vertex_to_index[source_vertex] v = self.vertex_to_index[destination_vertex] return self.adj_matrix[u][v] == 1 def clear_graph(self) -> None: """ Clears all vertices and edges. """ self.vertex_to_index = {} self.adj_matrix = [] def __repr__(self) -> str: first = "Adj Matrix:\n" + pformat(self.adj_matrix) second = "\nVertex to index mapping:\n" + pformat(self.vertex_to_index) return first + second class TestGraphMatrix(unittest.TestCase): def __assert_graph_edge_exists_check( self, undirected_graph: GraphAdjacencyMatrix, directed_graph: GraphAdjacencyMatrix, edge: list[int], ) -> None: assert undirected_graph.contains_edge(edge[0], edge[1]) assert undirected_graph.contains_edge(edge[1], edge[0]) assert directed_graph.contains_edge(edge[0], edge[1]) def __assert_graph_edge_does_not_exist_check( self, undirected_graph: GraphAdjacencyMatrix, directed_graph: GraphAdjacencyMatrix, edge: list[int], ) -> None: assert not undirected_graph.contains_edge(edge[0], edge[1]) assert not undirected_graph.contains_edge(edge[1], edge[0]) assert not directed_graph.contains_edge(edge[0], edge[1]) def __assert_graph_vertex_exists_check( self, undirected_graph: GraphAdjacencyMatrix, directed_graph: GraphAdjacencyMatrix, vertex: int, ) -> None: assert undirected_graph.contains_vertex(vertex) assert directed_graph.contains_vertex(vertex) def __assert_graph_vertex_does_not_exist_check( self, undirected_graph: GraphAdjacencyMatrix, directed_graph: GraphAdjacencyMatrix, vertex: int, ) -> None: assert not undirected_graph.contains_vertex(vertex) assert not directed_graph.contains_vertex(vertex) def __generate_random_edges( self, vertices: list[int], edge_pick_count: int ) -> list[list[int]]: assert edge_pick_count <= len(vertices) random_source_vertices: list[int] = random.sample( vertices[0 : int(len(vertices) / 2)], edge_pick_count ) random_destination_vertices: list[int] = random.sample( vertices[int(len(vertices) / 2) :], edge_pick_count ) random_edges: list[list[int]] = [] for source in random_source_vertices: for dest in random_destination_vertices: random_edges.append([source, dest]) return random_edges def __generate_graphs( self, vertex_count: int, min_val: int, max_val: int, edge_pick_count: int ) -> tuple[GraphAdjacencyMatrix, GraphAdjacencyMatrix, list[int], list[list[int]]]: if max_val - min_val + 1 < vertex_count: raise ValueError( "Will result in duplicate vertices. Either increase " "range between min_val and max_val or decrease vertex count" ) # generate graph input random_vertices: list[int] = random.sample( range(min_val, max_val + 1), vertex_count ) random_edges: list[list[int]] = self.__generate_random_edges( random_vertices, edge_pick_count ) # build graphs undirected_graph = GraphAdjacencyMatrix( vertices=random_vertices, edges=random_edges, directed=False ) directed_graph = GraphAdjacencyMatrix( vertices=random_vertices, edges=random_edges, directed=True ) return undirected_graph, directed_graph, random_vertices, random_edges def test_init_check(self) -> None: ( undirected_graph, directed_graph, random_vertices, random_edges, ) = self.__generate_graphs(20, 0, 100, 4) # test graph initialization with vertices and edges for num in random_vertices: self.__assert_graph_vertex_exists_check( undirected_graph, directed_graph, num ) for edge in random_edges: self.__assert_graph_edge_exists_check( undirected_graph, directed_graph, edge ) assert not undirected_graph.directed assert directed_graph.directed def test_contains_vertex(self) -> None: random_vertices: list[int] = random.sample(range(101), 20) # Build graphs WITHOUT edges undirected_graph = GraphAdjacencyMatrix( vertices=random_vertices, edges=[], directed=False ) directed_graph = GraphAdjacencyMatrix( vertices=random_vertices, edges=[], directed=True ) # Test contains_vertex for num in range(101): assert (num in random_vertices) == undirected_graph.contains_vertex(num) assert (num in random_vertices) == directed_graph.contains_vertex(num) def test_add_vertices(self) -> None: random_vertices: list[int] = random.sample(range(101), 20) # build empty graphs undirected_graph: GraphAdjacencyMatrix = GraphAdjacencyMatrix( vertices=[], edges=[], directed=False ) directed_graph: GraphAdjacencyMatrix = GraphAdjacencyMatrix( vertices=[], edges=[], directed=True ) # run add_vertex for num in random_vertices: undirected_graph.add_vertex(num) for num in random_vertices: directed_graph.add_vertex(num) # test add_vertex worked for num in random_vertices: self.__assert_graph_vertex_exists_check( undirected_graph, directed_graph, num ) def test_remove_vertices(self) -> None: random_vertices: list[int] = random.sample(range(101), 20) # build graphs WITHOUT edges undirected_graph = GraphAdjacencyMatrix( vertices=random_vertices, edges=[], directed=False ) directed_graph = GraphAdjacencyMatrix( vertices=random_vertices, edges=[], directed=True ) # test remove_vertex worked for num in random_vertices: self.__assert_graph_vertex_exists_check( undirected_graph, directed_graph, num ) undirected_graph.remove_vertex(num) directed_graph.remove_vertex(num) self.__assert_graph_vertex_does_not_exist_check( undirected_graph, directed_graph, num ) def test_add_and_remove_vertices_repeatedly(self) -> None: random_vertices1: list[int] = random.sample(range(51), 20) random_vertices2: list[int] = random.sample(range(51, 101), 20) # build graphs WITHOUT edges undirected_graph = GraphAdjacencyMatrix( vertices=random_vertices1, edges=[], directed=False ) directed_graph = GraphAdjacencyMatrix( vertices=random_vertices1, edges=[], directed=True ) # test adding and removing vertices for i, _ in enumerate(random_vertices1): undirected_graph.add_vertex(random_vertices2[i]) directed_graph.add_vertex(random_vertices2[i]) self.__assert_graph_vertex_exists_check( undirected_graph, directed_graph, random_vertices2[i] ) undirected_graph.remove_vertex(random_vertices1[i]) directed_graph.remove_vertex(random_vertices1[i]) self.__assert_graph_vertex_does_not_exist_check( undirected_graph, directed_graph, random_vertices1[i] ) # remove all vertices for i, _ in enumerate(random_vertices1): undirected_graph.remove_vertex(random_vertices2[i]) directed_graph.remove_vertex(random_vertices2[i]) self.__assert_graph_vertex_does_not_exist_check( undirected_graph, directed_graph, random_vertices2[i] ) def test_contains_edge(self) -> None: # generate graphs and graph input vertex_count = 20 ( undirected_graph, directed_graph, random_vertices, random_edges, ) = self.__generate_graphs(vertex_count, 0, 100, 4) # generate all possible edges for testing all_possible_edges: list[list[int]] = [] for i in range(vertex_count - 1): for j in range(i + 1, vertex_count): all_possible_edges.append([random_vertices[i], random_vertices[j]]) all_possible_edges.append([random_vertices[j], random_vertices[i]]) # test contains_edge function for edge in all_possible_edges: if edge in random_edges: self.__assert_graph_edge_exists_check( undirected_graph, directed_graph, edge ) elif [edge[1], edge[0]] in random_edges: # since this edge exists for undirected but the reverse may # not exist for directed self.__assert_graph_edge_exists_check( undirected_graph, directed_graph, [edge[1], edge[0]] ) else: self.__assert_graph_edge_does_not_exist_check( undirected_graph, directed_graph, edge ) def test_add_edge(self) -> None: # generate graph input random_vertices: list[int] = random.sample(range(101), 15) random_edges: list[list[int]] = self.__generate_random_edges(random_vertices, 4) # build graphs WITHOUT edges undirected_graph = GraphAdjacencyMatrix( vertices=random_vertices, edges=[], directed=False ) directed_graph = GraphAdjacencyMatrix( vertices=random_vertices, edges=[], directed=True ) # run and test add_edge for edge in random_edges: undirected_graph.add_edge(edge[0], edge[1]) directed_graph.add_edge(edge[0], edge[1]) self.__assert_graph_edge_exists_check( undirected_graph, directed_graph, edge ) def test_remove_edge(self) -> None: # generate graph input and graphs ( undirected_graph, directed_graph, _random_vertices, random_edges, ) = self.__generate_graphs(20, 0, 100, 4) # run and test remove_edge for edge in random_edges: self.__assert_graph_edge_exists_check( undirected_graph, directed_graph, edge ) undirected_graph.remove_edge(edge[0], edge[1]) directed_graph.remove_edge(edge[0], edge[1]) self.__assert_graph_edge_does_not_exist_check( undirected_graph, directed_graph, edge ) def test_add_and_remove_edges_repeatedly(self) -> None: ( undirected_graph, directed_graph, random_vertices, random_edges, ) = self.__generate_graphs(20, 0, 100, 4) # make some more edge options! more_random_edges: list[list[int]] = [] while len(more_random_edges) != len(random_edges): edges: list[list[int]] = self.__generate_random_edges(random_vertices, 4) for edge in edges: if len(more_random_edges) == len(random_edges): break elif edge not in more_random_edges and edge not in random_edges: more_random_edges.append(edge) for i, _ in enumerate(random_edges): undirected_graph.add_edge(more_random_edges[i][0], more_random_edges[i][1]) directed_graph.add_edge(more_random_edges[i][0], more_random_edges[i][1]) self.__assert_graph_edge_exists_check( undirected_graph, directed_graph, more_random_edges[i] ) undirected_graph.remove_edge(random_edges[i][0], random_edges[i][1]) directed_graph.remove_edge(random_edges[i][0], random_edges[i][1]) self.__assert_graph_edge_does_not_exist_check( undirected_graph, directed_graph, random_edges[i] ) def test_add_vertex_exception_check(self) -> None: ( undirected_graph, directed_graph, random_vertices, _random_edges, ) = self.__generate_graphs(20, 0, 100, 4) for vertex in random_vertices: with pytest.raises(ValueError): undirected_graph.add_vertex(vertex) with pytest.raises(ValueError): directed_graph.add_vertex(vertex) def test_remove_vertex_exception_check(self) -> None: ( undirected_graph, directed_graph, random_vertices, _random_edges, ) = self.__generate_graphs(20, 0, 100, 4) for i in range(101): if i not in random_vertices: with pytest.raises(ValueError): undirected_graph.remove_vertex(i) with pytest.raises(ValueError): directed_graph.remove_vertex(i) def test_add_edge_exception_check(self) -> None: ( undirected_graph, directed_graph, _random_vertices, random_edges, ) = self.__generate_graphs(20, 0, 100, 4) for edge in random_edges: with pytest.raises(ValueError): undirected_graph.add_edge(edge[0], edge[1]) with pytest.raises(ValueError): directed_graph.add_edge(edge[0], edge[1]) def test_remove_edge_exception_check(self) -> None: ( undirected_graph, directed_graph, random_vertices, random_edges, ) = self.__generate_graphs(20, 0, 100, 4) more_random_edges: list[list[int]] = [] while len(more_random_edges) != len(random_edges): edges: list[list[int]] = self.__generate_random_edges(random_vertices, 4) for edge in edges: if len(more_random_edges) == len(random_edges): break elif edge not in more_random_edges and edge not in random_edges: more_random_edges.append(edge) for edge in more_random_edges: with pytest.raises(ValueError): undirected_graph.remove_edge(edge[0], edge[1]) with pytest.raises(ValueError): directed_graph.remove_edge(edge[0], edge[1]) def test_contains_edge_exception_check(self) -> None: ( undirected_graph, directed_graph, random_vertices, _random_edges, ) = self.__generate_graphs(20, 0, 100, 4) for vertex in random_vertices: with pytest.raises(ValueError): undirected_graph.contains_edge(vertex, 102) with pytest.raises(ValueError): directed_graph.contains_edge(vertex, 102) with pytest.raises(ValueError): undirected_graph.contains_edge(103, 102) with pytest.raises(ValueError): directed_graph.contains_edge(103, 102) if __name__ == "__main__": unittest.main() ================================================ FILE: graphs/graph_list.py ================================================ #!/usr/bin/env python3 # Author: OMKAR PATHAK, Nwachukwu Chidiebere # Use a Python dictionary to construct the graph. from __future__ import annotations from pprint import pformat from typing import TypeVar T = TypeVar("T") class GraphAdjacencyList[T]: """ Adjacency List type Graph Data Structure that accounts for directed and undirected Graphs. Initialize graph object indicating whether it's directed or undirected. Directed graph example: >>> d_graph = GraphAdjacencyList() >>> print(d_graph) {} >>> d_graph.add_edge(0, 1) {0: [1], 1: []} >>> d_graph.add_edge(1, 2).add_edge(1, 4).add_edge(1, 5) {0: [1], 1: [2, 4, 5], 2: [], 4: [], 5: []} >>> d_graph.add_edge(2, 0).add_edge(2, 6).add_edge(2, 7) {0: [1], 1: [2, 4, 5], 2: [0, 6, 7], 4: [], 5: [], 6: [], 7: []} >>> d_graph {0: [1], 1: [2, 4, 5], 2: [0, 6, 7], 4: [], 5: [], 6: [], 7: []} >>> print(repr(d_graph)) {0: [1], 1: [2, 4, 5], 2: [0, 6, 7], 4: [], 5: [], 6: [], 7: []} Undirected graph example: >>> u_graph = GraphAdjacencyList(directed=False) >>> u_graph.add_edge(0, 1) {0: [1], 1: [0]} >>> u_graph.add_edge(1, 2).add_edge(1, 4).add_edge(1, 5) {0: [1], 1: [0, 2, 4, 5], 2: [1], 4: [1], 5: [1]} >>> u_graph.add_edge(2, 0).add_edge(2, 6).add_edge(2, 7) {0: [1, 2], 1: [0, 2, 4, 5], 2: [1, 0, 6, 7], 4: [1], 5: [1], 6: [2], 7: [2]} >>> u_graph.add_edge(4, 5) {0: [1, 2], 1: [0, 2, 4, 5], 2: [1, 0, 6, 7], 4: [1, 5], 5: [1, 4], 6: [2], 7: [2]} >>> print(u_graph) {0: [1, 2], 1: [0, 2, 4, 5], 2: [1, 0, 6, 7], 4: [1, 5], 5: [1, 4], 6: [2], 7: [2]} >>> print(repr(u_graph)) {0: [1, 2], 1: [0, 2, 4, 5], 2: [1, 0, 6, 7], 4: [1, 5], 5: [1, 4], 6: [2], 7: [2]} >>> char_graph = GraphAdjacencyList(directed=False) >>> char_graph.add_edge('a', 'b') {'a': ['b'], 'b': ['a']} >>> char_graph.add_edge('b', 'c').add_edge('b', 'e').add_edge('b', 'f') {'a': ['b'], 'b': ['a', 'c', 'e', 'f'], 'c': ['b'], 'e': ['b'], 'f': ['b']} >>> char_graph {'a': ['b'], 'b': ['a', 'c', 'e', 'f'], 'c': ['b'], 'e': ['b'], 'f': ['b']} """ def __init__(self, directed: bool = True) -> None: """ Parameters: directed: (bool) Indicates if graph is directed or undirected. Default is True. """ self.adj_list: dict[T, list[T]] = {} # dictionary of lists self.directed = directed def add_edge( self, source_vertex: T, destination_vertex: T ) -> GraphAdjacencyList[T]: """ Connects vertices together. Creates and Edge from source vertex to destination vertex. Vertices will be created if not found in graph """ if not self.directed: # For undirected graphs # if both source vertex and destination vertex are both present in the # adjacency list, add destination vertex to source vertex list of adjacent # vertices and add source vertex to destination vertex list of adjacent # vertices. if source_vertex in self.adj_list and destination_vertex in self.adj_list: self.adj_list[source_vertex].append(destination_vertex) self.adj_list[destination_vertex].append(source_vertex) # if only source vertex is present in adjacency list, add destination vertex # to source vertex list of adjacent vertices, then create a new vertex with # destination vertex as key and assign a list containing the source vertex # as it's first adjacent vertex. elif source_vertex in self.adj_list: self.adj_list[source_vertex].append(destination_vertex) self.adj_list[destination_vertex] = [source_vertex] # if only destination vertex is present in adjacency list, add source vertex # to destination vertex list of adjacent vertices, then create a new vertex # with source vertex as key and assign a list containing the source vertex # as it's first adjacent vertex. elif destination_vertex in self.adj_list: self.adj_list[destination_vertex].append(source_vertex) self.adj_list[source_vertex] = [destination_vertex] # if both source vertex and destination vertex are not present in adjacency # list, create a new vertex with source vertex as key and assign a list # containing the destination vertex as it's first adjacent vertex also # create a new vertex with destination vertex as key and assign a list # containing the source vertex as it's first adjacent vertex. else: self.adj_list[source_vertex] = [destination_vertex] self.adj_list[destination_vertex] = [source_vertex] # For directed graphs # if both source vertex and destination vertex are present in adjacency # list, add destination vertex to source vertex list of adjacent vertices. elif source_vertex in self.adj_list and destination_vertex in self.adj_list: self.adj_list[source_vertex].append(destination_vertex) # if only source vertex is present in adjacency list, add destination # vertex to source vertex list of adjacent vertices and create a new vertex # with destination vertex as key, which has no adjacent vertex elif source_vertex in self.adj_list: self.adj_list[source_vertex].append(destination_vertex) self.adj_list[destination_vertex] = [] # if only destination vertex is present in adjacency list, create a new # vertex with source vertex as key and assign a list containing destination # vertex as first adjacent vertex elif destination_vertex in self.adj_list: self.adj_list[source_vertex] = [destination_vertex] # if both source vertex and destination vertex are not present in adjacency # list, create a new vertex with source vertex as key and a list containing # destination vertex as it's first adjacent vertex. Then create a new vertex # with destination vertex as key, which has no adjacent vertex else: self.adj_list[source_vertex] = [destination_vertex] self.adj_list[destination_vertex] = [] return self def __repr__(self) -> str: return pformat(self.adj_list) ================================================ FILE: graphs/graphs_floyd_warshall.py ================================================ # floyd_warshall.py """ The problem is to find the shortest distance between all pairs of vertices in a weighted directed graph that can have negative edge weights. """ def _print_dist(dist, v): print("\nThe shortest path matrix using Floyd Warshall algorithm\n") for i in range(v): for j in range(v): if dist[i][j] != float("inf"): print(int(dist[i][j]), end="\t") else: print("INF", end="\t") print() def floyd_warshall(graph, v): """ :param graph: 2D array calculated from weight[edge[i, j]] :type graph: List[List[float]] :param v: number of vertices :type v: int :return: shortest distance between all vertex pairs distance[u][v] will contain the shortest distance from vertex u to v. 1. For all edges from v to n, distance[i][j] = weight(edge(i, j)). 3. The algorithm then performs distance[i][j] = min(distance[i][j], distance[i][k] + distance[k][j]) for each possible pair i, j of vertices. 4. The above is repeated for each vertex k in the graph. 5. Whenever distance[i][j] is given a new minimum value, next vertex[i][j] is updated to the next vertex[i][k]. """ dist = [[float("inf") for _ in range(v)] for _ in range(v)] for i in range(v): for j in range(v): dist[i][j] = graph[i][j] # check vertex k against all other vertices (i, j) for k in range(v): # looping through rows of graph array for i in range(v): # looping through columns of graph array for j in range(v): if ( dist[i][k] != float("inf") and dist[k][j] != float("inf") and dist[i][k] + dist[k][j] < dist[i][j] ): dist[i][j] = dist[i][k] + dist[k][j] _print_dist(dist, v) return dist, v if __name__ == "__main__": v = int(input("Enter number of vertices: ")) e = int(input("Enter number of edges: ")) graph = [[float("inf") for i in range(v)] for j in range(v)] for i in range(v): graph[i][i] = 0.0 # src and dst are indices that must be within the array size graph[e][v] # failure to follow this will result in an error for i in range(e): print("\nEdge ", i + 1) src = int(input("Enter source:")) dst = int(input("Enter destination:")) weight = float(input("Enter weight:")) graph[src][dst] = weight floyd_warshall(graph, v) # Example Input # Enter number of vertices: 3 # Enter number of edges: 2 # # generated graph from vertex and edge inputs # [[inf, inf, inf], [inf, inf, inf], [inf, inf, inf]] # [[0.0, inf, inf], [inf, 0.0, inf], [inf, inf, 0.0]] # specify source, destination and weight for edge #1 # Edge 1 # Enter source:1 # Enter destination:2 # Enter weight:2 # specify source, destination and weight for edge #2 # Edge 2 # Enter source:2 # Enter destination:1 # Enter weight:1 # # Expected Output from the vertice, edge and src, dst, weight inputs!! # 0 INF INF # INF 0 2 # INF 1 0 ================================================ FILE: graphs/greedy_best_first.py ================================================ """ https://en.wikipedia.org/wiki/Best-first_search#Greedy_BFS """ from __future__ import annotations Path = list[tuple[int, int]] # 0's are free path whereas 1's are obstacles TEST_GRIDS = [ [ [0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0], [1, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0], ], [ [0, 0, 0, 1, 1, 0, 0], [0, 0, 0, 0, 1, 0, 1], [0, 0, 0, 1, 1, 0, 0], [0, 1, 0, 0, 1, 0, 0], [1, 0, 0, 1, 1, 0, 1], [0, 0, 0, 0, 0, 0, 0], ], [ [0, 0, 1, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 1], [1, 0, 0, 1, 1], [0, 0, 0, 0, 0], ], ] delta = ([-1, 0], [0, -1], [1, 0], [0, 1]) # up, left, down, right class Node: """ >>> k = Node(0, 0, 4, 5, 0, None) >>> k.calculate_heuristic() 9 >>> n = Node(1, 4, 3, 4, 2, None) >>> n.calculate_heuristic() 2 >>> l = [k, n] >>> n == l[0] False >>> l.sort() >>> n == l[0] True """ def __init__( self, pos_x: int, pos_y: int, goal_x: int, goal_y: int, g_cost: float, parent: Node | None, ): self.pos_x = pos_x self.pos_y = pos_y self.pos = (pos_y, pos_x) self.goal_x = goal_x self.goal_y = goal_y self.g_cost = g_cost self.parent = parent self.f_cost = self.calculate_heuristic() def calculate_heuristic(self) -> float: """ The heuristic here is the Manhattan Distance Could elaborate to offer more than one choice """ dx = abs(self.pos_x - self.goal_x) dy = abs(self.pos_y - self.goal_y) return dx + dy def __lt__(self, other) -> bool: return self.f_cost < other.f_cost def __eq__(self, other) -> bool: return self.pos == other.pos class GreedyBestFirst: """ >>> grid = TEST_GRIDS[2] >>> gbf = GreedyBestFirst(grid, (0, 0), (len(grid) - 1, len(grid[0]) - 1)) >>> [x.pos for x in gbf.get_successors(gbf.start)] [(1, 0), (0, 1)] >>> (gbf.start.pos_y + delta[3][0], gbf.start.pos_x + delta[3][1]) (0, 1) >>> (gbf.start.pos_y + delta[2][0], gbf.start.pos_x + delta[2][1]) (1, 0) >>> gbf.retrace_path(gbf.start) [(0, 0)] >>> gbf.search() # doctest: +NORMALIZE_WHITESPACE [(0, 0), (1, 0), (2, 0), (2, 1), (3, 1), (4, 1), (4, 2), (4, 3), (4, 4)] """ def __init__( self, grid: list[list[int]], start: tuple[int, int], goal: tuple[int, int] ): self.grid = grid self.start = Node(start[1], start[0], goal[1], goal[0], 0, None) self.target = Node(goal[1], goal[0], goal[1], goal[0], 99999, None) self.open_nodes = [self.start] self.closed_nodes: list[Node] = [] self.reached = False def search(self) -> Path | None: """ Search for the path, if a path is not found, only the starting position is returned """ while self.open_nodes: # Open Nodes are sorted using __lt__ self.open_nodes.sort() current_node = self.open_nodes.pop(0) if current_node.pos == self.target.pos: self.reached = True return self.retrace_path(current_node) self.closed_nodes.append(current_node) successors = self.get_successors(current_node) for child_node in successors: if child_node in self.closed_nodes: continue if child_node not in self.open_nodes: self.open_nodes.append(child_node) if not self.reached: return [self.start.pos] return None def get_successors(self, parent: Node) -> list[Node]: """ Returns a list of successors (both in the grid and free spaces) """ return [ Node( pos_x, pos_y, self.target.pos_x, self.target.pos_y, parent.g_cost + 1, parent, ) for action in delta if ( 0 <= (pos_x := parent.pos_x + action[1]) < len(self.grid[0]) and 0 <= (pos_y := parent.pos_y + action[0]) < len(self.grid) and self.grid[pos_y][pos_x] == 0 ) ] def retrace_path(self, node: Node | None) -> Path: """ Retrace the path from parents to parents until start node """ current_node = node path = [] while current_node is not None: path.append((current_node.pos_y, current_node.pos_x)) current_node = current_node.parent path.reverse() return path if __name__ == "__main__": for idx, grid in enumerate(TEST_GRIDS): print(f"==grid-{idx + 1}==") init = (0, 0) goal = (len(grid) - 1, len(grid[0]) - 1) for elem in grid: print(elem) print("------") greedy_bf = GreedyBestFirst(grid, init, goal) path = greedy_bf.search() if path: for pos_x, pos_y in path: grid[pos_x][pos_y] = 2 for elem in grid: print(elem) ================================================ FILE: graphs/greedy_min_vertex_cover.py ================================================ """ * Author: Manuel Di Lullo (https://github.com/manueldilullo) * Description: Approximization algorithm for minimum vertex cover problem. Greedy Approach. Uses graphs represented with an adjacency list URL: https://mathworld.wolfram.com/MinimumVertexCover.html URL: https://cs.stackexchange.com/questions/129017/greedy-algorithm-for-vertex-cover """ import heapq def greedy_min_vertex_cover(graph: dict) -> set[int]: """ Greedy APX Algorithm for min Vertex Cover @input: graph (graph stored in an adjacency list where each vertex is represented with an integer) @example: >>> graph = {0: [1, 3], 1: [0, 3], 2: [0, 3, 4], 3: [0, 1, 2], 4: [2, 3]} >>> greedy_min_vertex_cover(graph) {0, 1, 2, 4} """ # queue used to store nodes and their rank queue: list[list] = [] # for each node and his adjacency list add them and the rank of the node to queue # using heapq module the queue will be filled like a Priority Queue # heapq works with a min priority queue, so I used -1*len(v) to build it for key, value in graph.items(): # O(log(n)) heapq.heappush(queue, [-1 * len(value), (key, value)]) # chosen_vertices = set of chosen vertices chosen_vertices = set() # while queue isn't empty and there are still edges # (queue[0][0] is the rank of the node with max rank) while queue and queue[0][0] != 0: # extract vertex with max rank from queue and add it to chosen_vertices argmax = heapq.heappop(queue)[1][0] chosen_vertices.add(argmax) # Remove all arcs adjacent to argmax for elem in queue: # if v haven't adjacent node, skip if elem[0] == 0: continue # if argmax is reachable from elem # remove argmax from elem's adjacent list and update his rank if argmax in elem[1][1]: index = elem[1][1].index(argmax) del elem[1][1][index] elem[0] += 1 # re-order the queue heapq.heapify(queue) return chosen_vertices if __name__ == "__main__": import doctest doctest.testmod() graph = {0: [1, 3], 1: [0, 3], 2: [0, 3, 4], 3: [0, 1, 2], 4: [2, 3]} print(f"Minimum vertex cover:\n{greedy_min_vertex_cover(graph)}") ================================================ FILE: graphs/kahns_algorithm_long.py ================================================ # Finding longest distance in Directed Acyclic Graph using KahnsAlgorithm def longest_distance(graph): indegree = [0] * len(graph) queue = [] long_dist = [1] * len(graph) for values in graph.values(): for i in values: indegree[i] += 1 for i in range(len(indegree)): if indegree[i] == 0: queue.append(i) while queue: vertex = queue.pop(0) for x in graph[vertex]: indegree[x] -= 1 long_dist[x] = max(long_dist[x], long_dist[vertex] + 1) if indegree[x] == 0: queue.append(x) print(max(long_dist)) # Adjacency list of Graph graph = {0: [2, 3, 4], 1: [2, 7], 2: [5], 3: [5, 7], 4: [7], 5: [6], 6: [7], 7: []} longest_distance(graph) ================================================ FILE: graphs/kahns_algorithm_topo.py ================================================ def topological_sort(graph: dict[int, list[int]]) -> list[int] | None: """ Perform topological sorting of a Directed Acyclic Graph (DAG) using Kahn's Algorithm via Breadth-First Search (BFS). Topological sorting is a linear ordering of vertices in a graph such that for every directed edge u → v, vertex u comes before vertex v in the ordering. Parameters: graph: Adjacency list representing the directed graph where keys are vertices, and values are lists of adjacent vertices. Returns: The topologically sorted order of vertices if the graph is a DAG. Returns None if the graph contains a cycle. Example: >>> graph = {0: [1, 2], 1: [3], 2: [3], 3: [4, 5], 4: [], 5: []} >>> topological_sort(graph) [0, 1, 2, 3, 4, 5] >>> graph_with_cycle = {0: [1], 1: [2], 2: [0]} >>> topological_sort(graph_with_cycle) """ indegree = [0] * len(graph) queue = [] topo_order = [] processed_vertices_count = 0 # Calculate the indegree of each vertex for values in graph.values(): for i in values: indegree[i] += 1 # Add all vertices with 0 indegree to the queue for i in range(len(indegree)): if indegree[i] == 0: queue.append(i) # Perform BFS while queue: vertex = queue.pop(0) processed_vertices_count += 1 topo_order.append(vertex) # Traverse neighbors for neighbor in graph[vertex]: indegree[neighbor] -= 1 if indegree[neighbor] == 0: queue.append(neighbor) if processed_vertices_count != len(graph): return None # no topological ordering exists due to cycle return topo_order # valid topological ordering if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: graphs/karger.py ================================================ """ An implementation of Karger's Algorithm for partitioning a graph. """ from __future__ import annotations import random # Adjacency list representation of this graph: # https://en.wikipedia.org/wiki/File:Single_run_of_Karger%E2%80%99s_Mincut_algorithm.svg TEST_GRAPH = { "1": ["2", "3", "4", "5"], "2": ["1", "3", "4", "5"], "3": ["1", "2", "4", "5", "10"], "4": ["1", "2", "3", "5", "6"], "5": ["1", "2", "3", "4", "7"], "6": ["7", "8", "9", "10", "4"], "7": ["6", "8", "9", "10", "5"], "8": ["6", "7", "9", "10"], "9": ["6", "7", "8", "10"], "10": ["6", "7", "8", "9", "3"], } def partition_graph(graph: dict[str, list[str]]) -> set[tuple[str, str]]: """ Partitions a graph using Karger's Algorithm. Implemented from pseudocode found here: https://en.wikipedia.org/wiki/Karger%27s_algorithm. This function involves random choices, meaning it will not give consistent outputs. Args: graph: A dictionary containing adacency lists for the graph. Nodes must be strings. Returns: The cutset of the cut found by Karger's Algorithm. >>> graph = {'0':['1'], '1':['0']} >>> partition_graph(graph) {('0', '1')} """ # Dict that maps contracted nodes to a list of all the nodes it "contains." contracted_nodes = {node: {node} for node in graph} graph_copy = {node: graph[node][:] for node in graph} while len(graph_copy) > 2: # Choose a random edge. u = random.choice(list(graph_copy.keys())) v = random.choice(graph_copy[u]) # Contract edge (u, v) to new node uv uv = u + v uv_neighbors = list(set(graph_copy[u] + graph_copy[v])) uv_neighbors.remove(u) uv_neighbors.remove(v) graph_copy[uv] = uv_neighbors for neighbor in uv_neighbors: graph_copy[neighbor].append(uv) contracted_nodes[uv] = set(contracted_nodes[u].union(contracted_nodes[v])) # Remove nodes u and v. del graph_copy[u] del graph_copy[v] for neighbor in uv_neighbors: if u in graph_copy[neighbor]: graph_copy[neighbor].remove(u) if v in graph_copy[neighbor]: graph_copy[neighbor].remove(v) # Find cutset. groups = [contracted_nodes[node] for node in graph_copy] return { (node, neighbor) for node in groups[0] for neighbor in graph[node] if neighbor in groups[1] } if __name__ == "__main__": print(partition_graph(TEST_GRAPH)) ================================================ FILE: graphs/lanczos_eigenvectors.py ================================================ """ Lanczos Method for Finding Eigenvalues and Eigenvectors of a Graph. This module demonstrates the Lanczos method to approximate the largest eigenvalues and corresponding eigenvectors of a symmetric matrix represented as a graph's adjacency list. The method efficiently handles large, sparse matrices by converting the graph to a tridiagonal matrix, whose eigenvalues and eigenvectors are then computed. Key Functions: - `find_lanczos_eigenvectors`: Computes the k largest eigenvalues and vectors. - `lanczos_iteration`: Constructs the tridiagonal matrix and orthonormal basis vectors. - `multiply_matrix_vector`: Multiplies an adjacency list graph with a vector. Complexity: - Time: O(k * n), where k is the number of eigenvalues and n is the matrix size. - Space: O(n), due to sparse representation and tridiagonal matrix structure. Further Reading: - Lanczos Algorithm: https://en.wikipedia.org/wiki/Lanczos_algorithm - Eigenvector Centrality: https://en.wikipedia.org/wiki/Eigenvector_centrality Example Usage: Given a graph represented by an adjacency list, the `find_lanczos_eigenvectors` function returns the largest eigenvalues and eigenvectors. This can be used to analyze graph centrality. """ import numpy as np def validate_adjacency_list(graph: list[list[int | None]]) -> None: """Validates the adjacency list format for the graph. Args: graph: A list of lists where each sublist contains the neighbors of a node. Raises: ValueError: If the graph is not a list of lists, or if any node has invalid neighbors (e.g., out-of-range or non-integer values). >>> validate_adjacency_list([[1, 2], [0], [0, 1]]) >>> validate_adjacency_list([[]]) # No neighbors, valid case >>> validate_adjacency_list([[1], [2], [-1]]) # Invalid neighbor Traceback (most recent call last): ... ValueError: Invalid neighbor -1 in node 2 adjacency list. """ if not isinstance(graph, list): raise ValueError("Graph should be a list of lists.") for node_index, neighbors in enumerate(graph): if not isinstance(neighbors, list): no_neighbors_message: str = ( f"Node {node_index} should have a list of neighbors." ) raise ValueError(no_neighbors_message) for neighbor_index in neighbors: if ( not isinstance(neighbor_index, int) or neighbor_index < 0 or neighbor_index >= len(graph) ): invalid_neighbor_message: str = ( f"Invalid neighbor {neighbor_index} in node {node_index} " f"adjacency list." ) raise ValueError(invalid_neighbor_message) def lanczos_iteration( graph: list[list[int | None]], num_eigenvectors: int ) -> tuple[np.ndarray, np.ndarray]: """Constructs the tridiagonal matrix and orthonormal basis vectors using the Lanczos method. Args: graph: The graph represented as a list of adjacency lists. num_eigenvectors: The number of largest eigenvalues and eigenvectors to approximate. Returns: A tuple containing: - tridiagonal_matrix: A (num_eigenvectors x num_eigenvectors) symmetric matrix. - orthonormal_basis: A (num_nodes x num_eigenvectors) matrix of orthonormal basis vectors. Raises: ValueError: If num_eigenvectors is less than 1 or greater than the number of nodes. >>> graph = [[1, 2], [0, 2], [0, 1]] >>> T, Q = lanczos_iteration(graph, 2) >>> T.shape == (2, 2) and Q.shape == (3, 2) True """ num_nodes: int = len(graph) if not (1 <= num_eigenvectors <= num_nodes): raise ValueError( "Number of eigenvectors must be between 1 and the number of " "nodes in the graph." ) orthonormal_basis: np.ndarray = np.zeros((num_nodes, num_eigenvectors)) tridiagonal_matrix: np.ndarray = np.zeros((num_eigenvectors, num_eigenvectors)) rng = np.random.default_rng() initial_vector: np.ndarray = rng.random(num_nodes) initial_vector /= np.sqrt(np.dot(initial_vector, initial_vector)) orthonormal_basis[:, 0] = initial_vector prev_beta: float = 0.0 for iter_index in range(num_eigenvectors): result_vector: np.ndarray = multiply_matrix_vector( graph, orthonormal_basis[:, iter_index] ) if iter_index > 0: result_vector -= prev_beta * orthonormal_basis[:, iter_index - 1] alpha_value: float = np.dot(orthonormal_basis[:, iter_index], result_vector) result_vector -= alpha_value * orthonormal_basis[:, iter_index] prev_beta = np.sqrt(np.dot(result_vector, result_vector)) if iter_index < num_eigenvectors - 1 and prev_beta > 1e-10: orthonormal_basis[:, iter_index + 1] = result_vector / prev_beta tridiagonal_matrix[iter_index, iter_index] = alpha_value if iter_index < num_eigenvectors - 1: tridiagonal_matrix[iter_index, iter_index + 1] = prev_beta tridiagonal_matrix[iter_index + 1, iter_index] = prev_beta return tridiagonal_matrix, orthonormal_basis def multiply_matrix_vector( graph: list[list[int | None]], vector: np.ndarray ) -> np.ndarray: """Performs multiplication of a graph's adjacency list representation with a vector. Args: graph: The adjacency list of the graph. vector: A 1D numpy array representing the vector to multiply. Returns: A numpy array representing the product of the adjacency list and the vector. Raises: ValueError: If the vector's length does not match the number of nodes in the graph. >>> multiply_matrix_vector([[1, 2], [0, 2], [0, 1]], np.array([1, 1, 1])) array([2., 2., 2.]) >>> multiply_matrix_vector([[1, 2], [0, 2], [0, 1]], np.array([0, 1, 0])) array([1., 0., 1.]) """ num_nodes: int = len(graph) if vector.shape[0] != num_nodes: raise ValueError("Vector length must match the number of nodes in the graph.") result: np.ndarray = np.zeros(num_nodes) for node_index, neighbors in enumerate(graph): for neighbor_index in neighbors: result[node_index] += vector[neighbor_index] return result def find_lanczos_eigenvectors( graph: list[list[int | None]], num_eigenvectors: int ) -> tuple[np.ndarray, np.ndarray]: """Computes the largest eigenvalues and their corresponding eigenvectors using the Lanczos method. Args: graph: The graph as a list of adjacency lists. num_eigenvectors: Number of largest eigenvalues and eigenvectors to compute. Returns: A tuple containing: - eigenvalues: 1D array of the largest eigenvalues in descending order. - eigenvectors: 2D array where each column is an eigenvector corresponding to an eigenvalue. Raises: ValueError: If the graph format is invalid or num_eigenvectors is out of bounds. >>> eigenvalues, eigenvectors = find_lanczos_eigenvectors( ... [[1, 2], [0, 2], [0, 1]], 2 ... ) >>> len(eigenvalues) == 2 and eigenvectors.shape[1] == 2 True """ validate_adjacency_list(graph) tridiagonal_matrix, orthonormal_basis = lanczos_iteration(graph, num_eigenvectors) eigenvalues, eigenvectors = np.linalg.eigh(tridiagonal_matrix) return eigenvalues[::-1], np.dot(orthonormal_basis, eigenvectors[:, ::-1]) def main() -> None: """ Main driver function for testing the implementation with doctests. """ import doctest doctest.testmod() if __name__ == "__main__": main() ================================================ FILE: graphs/markov_chain.py ================================================ from __future__ import annotations from collections import Counter from random import random class MarkovChainGraphUndirectedUnweighted: """ Undirected Unweighted Graph for running Markov Chain Algorithm """ def __init__(self): self.connections = {} def add_node(self, node: str) -> None: self.connections[node] = {} def add_transition_probability( self, node1: str, node2: str, probability: float ) -> None: if node1 not in self.connections: self.add_node(node1) if node2 not in self.connections: self.add_node(node2) self.connections[node1][node2] = probability def get_nodes(self) -> list[str]: return list(self.connections) def transition(self, node: str) -> str: current_probability = 0 random_value = random() for dest in self.connections[node]: current_probability += self.connections[node][dest] if current_probability > random_value: return dest return "" def get_transitions( start: str, transitions: list[tuple[str, str, float]], steps: int ) -> dict[str, int]: """ Running Markov Chain algorithm and calculating the number of times each node is visited >>> transitions = [ ... ('a', 'a', 0.9), ... ('a', 'b', 0.075), ... ('a', 'c', 0.025), ... ('b', 'a', 0.15), ... ('b', 'b', 0.8), ... ('b', 'c', 0.05), ... ('c', 'a', 0.25), ... ('c', 'b', 0.25), ... ('c', 'c', 0.5) ... ] >>> result = get_transitions('a', transitions, 5000) >>> result['a'] > result['b'] > result['c'] True """ graph = MarkovChainGraphUndirectedUnweighted() for node1, node2, probability in transitions: graph.add_transition_probability(node1, node2, probability) visited = Counter(graph.get_nodes()) node = start for _ in range(steps): node = graph.transition(node) visited[node] += 1 return visited if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: graphs/matching_min_vertex_cover.py ================================================ """ * Author: Manuel Di Lullo (https://github.com/manueldilullo) * Description: Approximization algorithm for minimum vertex cover problem. Matching Approach. Uses graphs represented with an adjacency list URL: https://mathworld.wolfram.com/MinimumVertexCover.html URL: https://www.princeton.edu/~aaa/Public/Teaching/ORF523/ORF523_Lec6.pdf """ def matching_min_vertex_cover(graph: dict) -> set: """ APX Algorithm for min Vertex Cover using Matching Approach @input: graph (graph stored in an adjacency list where each vertex is represented as an integer) @example: >>> graph = {0: [1, 3], 1: [0, 3], 2: [0, 3, 4], 3: [0, 1, 2], 4: [2, 3]} >>> matching_min_vertex_cover(graph) {0, 1, 2, 4} """ # chosen_vertices = set of chosen vertices chosen_vertices = set() # edges = list of graph's edges edges = get_edges(graph) # While there are still elements in edges list, take an arbitrary edge # (from_node, to_node) and add his extremity to chosen_vertices and then # remove all arcs adjacent to the from_node and to_node while edges: from_node, to_node = edges.pop() chosen_vertices.add(from_node) chosen_vertices.add(to_node) for edge in edges.copy(): if from_node in edge or to_node in edge: edges.discard(edge) return chosen_vertices def get_edges(graph: dict) -> set: """ Return a set of couples that represents all of the edges. @input: graph (graph stored in an adjacency list where each vertex is represented as an integer) @example: >>> graph = {0: [1, 3], 1: [0, 3], 2: [0, 3], 3: [0, 1, 2]} >>> get_edges(graph) {(0, 1), (3, 1), (0, 3), (2, 0), (3, 0), (2, 3), (1, 0), (3, 2), (1, 3)} """ edges = set() for from_node, to_nodes in graph.items(): for to_node in to_nodes: edges.add((from_node, to_node)) return edges if __name__ == "__main__": import doctest doctest.testmod() # graph = {0: [1, 3], 1: [0, 3], 2: [0, 3, 4], 3: [0, 1, 2], 4: [2, 3]} # print(f"Matching vertex cover:\n{matching_min_vertex_cover(graph)}") ================================================ FILE: graphs/minimum_path_sum.py ================================================ def min_path_sum(grid: list) -> int: """ Find the path from top left to bottom right of array of numbers with the lowest possible sum and return the sum along this path. >>> min_path_sum([ ... [1, 3, 1], ... [1, 5, 1], ... [4, 2, 1], ... ]) 7 >>> min_path_sum([ ... [1, 0, 5, 6, 7], ... [8, 9, 0, 4, 2], ... [4, 4, 4, 5, 1], ... [9, 6, 3, 1, 0], ... [8, 4, 3, 2, 7], ... ]) 20 >>> min_path_sum(None) Traceback (most recent call last): ... TypeError: The grid does not contain the appropriate information >>> min_path_sum([[]]) Traceback (most recent call last): ... TypeError: The grid does not contain the appropriate information """ if not grid or not grid[0]: raise TypeError("The grid does not contain the appropriate information") for cell_n in range(1, len(grid[0])): grid[0][cell_n] += grid[0][cell_n - 1] row_above = grid[0] for row_n in range(1, len(grid)): current_row = grid[row_n] grid[row_n] = fill_row(current_row, row_above) row_above = grid[row_n] return grid[-1][-1] def fill_row(current_row: list, row_above: list) -> list: """ >>> fill_row([2, 2, 2], [1, 2, 3]) [3, 4, 5] """ current_row[0] += row_above[0] for cell_n in range(1, len(current_row)): current_row[cell_n] += min(current_row[cell_n - 1], row_above[cell_n]) return current_row if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: graphs/minimum_spanning_tree_boruvka.py ================================================ class Graph: """ Data structure to store graphs (based on adjacency lists) """ def __init__(self): self.num_vertices = 0 self.num_edges = 0 self.adjacency = {} def add_vertex(self, vertex): """ Adds a vertex to the graph """ if vertex not in self.adjacency: self.adjacency[vertex] = {} self.num_vertices += 1 def add_edge(self, head, tail, weight): """ Adds an edge to the graph """ self.add_vertex(head) self.add_vertex(tail) if head == tail: return self.adjacency[head][tail] = weight self.adjacency[tail][head] = weight def distinct_weight(self): """ For Boruvks's algorithm the weights should be distinct Converts the weights to be distinct """ edges = self.get_edges() for edge in edges: head, tail, weight = edge edges.remove((tail, head, weight)) for i in range(len(edges)): edges[i] = list(edges[i]) edges.sort(key=lambda e: e[2]) for i in range(len(edges) - 1): if edges[i][2] >= edges[i + 1][2]: edges[i + 1][2] = edges[i][2] + 1 for edge in edges: head, tail, weight = edge self.adjacency[head][tail] = weight self.adjacency[tail][head] = weight def __str__(self): """ Returns string representation of the graph """ string = "" for tail in self.adjacency: for head in self.adjacency[tail]: weight = self.adjacency[head][tail] string += f"{head} -> {tail} == {weight}\n" return string.rstrip("\n") def get_edges(self): """ Returna all edges in the graph """ output = [] for tail in self.adjacency: for head in self.adjacency[tail]: output.append((tail, head, self.adjacency[head][tail])) return output def get_vertices(self): """ Returns all vertices in the graph """ return self.adjacency.keys() @staticmethod def build(vertices=None, edges=None): """ Builds a graph from the given set of vertices and edges """ g = Graph() if vertices is None: vertices = [] if edges is None: edge = [] for vertex in vertices: g.add_vertex(vertex) for edge in edges: g.add_edge(*edge) return g class UnionFind: """ Disjoint set Union and Find for Boruvka's algorithm """ def __init__(self): self.parent = {} self.rank = {} def __len__(self): return len(self.parent) def make_set(self, item): if item in self.parent: return self.find(item) self.parent[item] = item self.rank[item] = 0 return item def find(self, item): if item not in self.parent: return self.make_set(item) if item != self.parent[item]: self.parent[item] = self.find(self.parent[item]) return self.parent[item] def union(self, item1, item2): root1 = self.find(item1) root2 = self.find(item2) if root1 == root2: return root1 if self.rank[root1] > self.rank[root2]: self.parent[root2] = root1 return root1 if self.rank[root1] < self.rank[root2]: self.parent[root1] = root2 return root2 if self.rank[root1] == self.rank[root2]: self.rank[root1] += 1 self.parent[root2] = root1 return root1 return None @staticmethod def boruvka_mst(graph): """ Implementation of Boruvka's algorithm >>> g = Graph() >>> g = Graph.build([0, 1, 2, 3], [[0, 1, 1], [0, 2, 1],[2, 3, 1]]) >>> g.distinct_weight() >>> bg = Graph.boruvka_mst(g) >>> print(bg) 1 -> 0 == 1 2 -> 0 == 2 0 -> 1 == 1 0 -> 2 == 2 3 -> 2 == 3 2 -> 3 == 3 """ num_components = graph.num_vertices union_find = Graph.UnionFind() mst_edges = [] while num_components > 1: cheap_edge = {} for vertex in graph.get_vertices(): cheap_edge[vertex] = -1 edges = graph.get_edges() for edge in edges: head, tail, weight = edge edges.remove((tail, head, weight)) for edge in edges: head, tail, weight = edge set1 = union_find.find(head) set2 = union_find.find(tail) if set1 != set2: if cheap_edge[set1] == -1 or cheap_edge[set1][2] > weight: cheap_edge[set1] = [head, tail, weight] if cheap_edge[set2] == -1 or cheap_edge[set2][2] > weight: cheap_edge[set2] = [head, tail, weight] for head_tail_weight in cheap_edge.values(): if head_tail_weight != -1: head, tail, weight = head_tail_weight if union_find.find(head) != union_find.find(tail): union_find.union(head, tail) mst_edges.append(head_tail_weight) num_components = num_components - 1 mst = Graph.build(edges=mst_edges) return mst ================================================ FILE: graphs/minimum_spanning_tree_kruskal.py ================================================ def kruskal( num_nodes: int, edges: list[tuple[int, int, int]] ) -> list[tuple[int, int, int]]: """ >>> kruskal(4, [(0, 1, 3), (1, 2, 5), (2, 3, 1)]) [(2, 3, 1), (0, 1, 3), (1, 2, 5)] >>> kruskal(4, [(0, 1, 3), (1, 2, 5), (2, 3, 1), (0, 2, 1), (0, 3, 2)]) [(2, 3, 1), (0, 2, 1), (0, 1, 3)] >>> kruskal(4, [(0, 1, 3), (1, 2, 5), (2, 3, 1), (0, 2, 1), (0, 3, 2), ... (2, 1, 1)]) [(2, 3, 1), (0, 2, 1), (2, 1, 1)] """ edges = sorted(edges, key=lambda edge: edge[2]) parent = list(range(num_nodes)) def find_parent(i): if i != parent[i]: parent[i] = find_parent(parent[i]) return parent[i] minimum_spanning_tree_cost = 0 minimum_spanning_tree = [] for edge in edges: parent_a = find_parent(edge[0]) parent_b = find_parent(edge[1]) if parent_a != parent_b: minimum_spanning_tree_cost += edge[2] minimum_spanning_tree.append(edge) parent[parent_a] = parent_b return minimum_spanning_tree if __name__ == "__main__": # pragma: no cover num_nodes, num_edges = list(map(int, input().strip().split())) edges = [] for _ in range(num_edges): node1, node2, cost = (int(x) for x in input().strip().split()) edges.append((node1, node2, cost)) kruskal(num_nodes, edges) ================================================ FILE: graphs/minimum_spanning_tree_kruskal2.py ================================================ from __future__ import annotations from typing import TypeVar T = TypeVar("T") class DisjointSetTreeNode[T]: # Disjoint Set Node to store the parent and rank def __init__(self, data: T) -> None: self.data = data self.parent = self self.rank = 0 class DisjointSetTree[T]: # Disjoint Set DataStructure def __init__(self) -> None: # map from node name to the node object self.map: dict[T, DisjointSetTreeNode[T]] = {} def make_set(self, data: T) -> None: # create a new set with x as its member self.map[data] = DisjointSetTreeNode(data) def find_set(self, data: T) -> DisjointSetTreeNode[T]: # find the set x belongs to (with path-compression) elem_ref = self.map[data] if elem_ref != elem_ref.parent: elem_ref.parent = self.find_set(elem_ref.parent.data) return elem_ref.parent def link( self, node1: DisjointSetTreeNode[T], node2: DisjointSetTreeNode[T] ) -> None: # helper function for union operation if node1.rank > node2.rank: node2.parent = node1 else: node1.parent = node2 if node1.rank == node2.rank: node2.rank += 1 def union(self, data1: T, data2: T) -> None: # merge 2 disjoint sets self.link(self.find_set(data1), self.find_set(data2)) class GraphUndirectedWeighted[T]: def __init__(self) -> None: # connections: map from the node to the neighbouring nodes (with weights) self.connections: dict[T, dict[T, int]] = {} def add_node(self, node: T) -> None: # add a node ONLY if its not present in the graph if node not in self.connections: self.connections[node] = {} def add_edge(self, node1: T, node2: T, weight: int) -> None: # add an edge with the given weight self.add_node(node1) self.add_node(node2) self.connections[node1][node2] = weight self.connections[node2][node1] = weight def kruskal(self) -> GraphUndirectedWeighted[T]: # Kruskal's Algorithm to generate a Minimum Spanning Tree (MST) of a graph """ Details: https://en.wikipedia.org/wiki/Kruskal%27s_algorithm Example: >>> g1 = GraphUndirectedWeighted[int]() >>> g1.add_edge(1, 2, 1) >>> g1.add_edge(2, 3, 2) >>> g1.add_edge(3, 4, 1) >>> g1.add_edge(3, 5, 100) # Removed in MST >>> g1.add_edge(4, 5, 5) >>> assert 5 in g1.connections[3] >>> mst = g1.kruskal() >>> assert 5 not in mst.connections[3] >>> g2 = GraphUndirectedWeighted[str]() >>> g2.add_edge('A', 'B', 1) >>> g2.add_edge('B', 'C', 2) >>> g2.add_edge('C', 'D', 1) >>> g2.add_edge('C', 'E', 100) # Removed in MST >>> g2.add_edge('D', 'E', 5) >>> assert 'E' in g2.connections["C"] >>> mst = g2.kruskal() >>> assert 'E' not in mst.connections['C'] """ # getting the edges in ascending order of weights edges = [] seen = set() for start in self.connections: for end in self.connections[start]: if (start, end) not in seen: seen.add((end, start)) edges.append((start, end, self.connections[start][end])) edges.sort(key=lambda x: x[2]) # creating the disjoint set disjoint_set = DisjointSetTree[T]() for node in self.connections: disjoint_set.make_set(node) # MST generation num_edges = 0 index = 0 graph = GraphUndirectedWeighted[T]() while num_edges < len(self.connections) - 1: u, v, w = edges[index] index += 1 parent_u = disjoint_set.find_set(u) parent_v = disjoint_set.find_set(v) if parent_u != parent_v: num_edges += 1 graph.add_edge(u, v, w) disjoint_set.union(u, v) return graph ================================================ FILE: graphs/minimum_spanning_tree_prims.py ================================================ import sys from collections import defaultdict class Heap: def __init__(self): self.node_position = [] def get_position(self, vertex): return self.node_position[vertex] def set_position(self, vertex, pos): self.node_position[vertex] = pos def top_to_bottom(self, heap, start, size, positions): if start > size // 2 - 1: return else: if 2 * start + 2 >= size: # noqa: SIM114 smallest_child = 2 * start + 1 elif heap[2 * start + 1] < heap[2 * start + 2]: smallest_child = 2 * start + 1 else: smallest_child = 2 * start + 2 if heap[smallest_child] < heap[start]: temp, temp1 = heap[smallest_child], positions[smallest_child] heap[smallest_child], positions[smallest_child] = ( heap[start], positions[start], ) heap[start], positions[start] = temp, temp1 temp = self.get_position(positions[smallest_child]) self.set_position( positions[smallest_child], self.get_position(positions[start]) ) self.set_position(positions[start], temp) self.top_to_bottom(heap, smallest_child, size, positions) # Update function if value of any node in min-heap decreases def bottom_to_top(self, val, index, heap, position): temp = position[index] while index != 0: parent = int((index - 2) / 2) if index % 2 == 0 else int((index - 1) / 2) if val < heap[parent]: heap[index] = heap[parent] position[index] = position[parent] self.set_position(position[parent], index) else: heap[index] = val position[index] = temp self.set_position(temp, index) break index = parent else: heap[0] = val position[0] = temp self.set_position(temp, 0) def heapify(self, heap, positions): start = len(heap) // 2 - 1 for i in range(start, -1, -1): self.top_to_bottom(heap, i, len(heap), positions) def delete_minimum(self, heap, positions): temp = positions[0] heap[0] = sys.maxsize self.top_to_bottom(heap, 0, len(heap), positions) return temp def prisms_algorithm(adjacency_list): """ >>> adjacency_list = {0: [[1, 1], [3, 3]], ... 1: [[0, 1], [2, 6], [3, 5], [4, 1]], ... 2: [[1, 6], [4, 5], [5, 2]], ... 3: [[0, 3], [1, 5], [4, 1]], ... 4: [[1, 1], [2, 5], [3, 1], [5, 4]], ... 5: [[2, 2], [4, 4]]} >>> prisms_algorithm(adjacency_list) [(0, 1), (1, 4), (4, 3), (4, 5), (5, 2)] """ heap = Heap() visited = [0] * len(adjacency_list) nbr_tv = [-1] * len(adjacency_list) # Neighboring Tree Vertex of selected vertex # Minimum Distance of explored vertex with neighboring vertex of partial tree # formed in graph distance_tv = [] # Heap of Distance of vertices from their neighboring vertex positions = [] for vertex in range(len(adjacency_list)): distance_tv.append(sys.maxsize) positions.append(vertex) heap.node_position.append(vertex) tree_edges = [] visited[0] = 1 distance_tv[0] = sys.maxsize for neighbor, distance in adjacency_list[0]: nbr_tv[neighbor] = 0 distance_tv[neighbor] = distance heap.heapify(distance_tv, positions) for _ in range(1, len(adjacency_list)): vertex = heap.delete_minimum(distance_tv, positions) if visited[vertex] == 0: tree_edges.append((nbr_tv[vertex], vertex)) visited[vertex] = 1 for neighbor, distance in adjacency_list[vertex]: if ( visited[neighbor] == 0 and distance < distance_tv[heap.get_position(neighbor)] ): distance_tv[heap.get_position(neighbor)] = distance heap.bottom_to_top( distance, heap.get_position(neighbor), distance_tv, positions ) nbr_tv[neighbor] = vertex return tree_edges if __name__ == "__main__": # pragma: no cover # < --------- Prims Algorithm --------- > edges_number = int(input("Enter number of edges: ").strip()) adjacency_list = defaultdict(list) for _ in range(edges_number): edge = [int(x) for x in input().strip().split()] adjacency_list[edge[0]].append([edge[1], edge[2]]) adjacency_list[edge[1]].append([edge[0], edge[2]]) print(prisms_algorithm(adjacency_list)) ================================================ FILE: graphs/minimum_spanning_tree_prims2.py ================================================ """ Prim's (also known as Jarník's) algorithm is a greedy algorithm that finds a minimum spanning tree for a weighted undirected graph. This means it finds a subset of the edges that forms a tree that includes every vertex, where the total weight of all the edges in the tree is minimized. The algorithm operates by building this tree one vertex at a time, from an arbitrary starting vertex, at each step adding the cheapest possible connection from the tree to another vertex. """ from __future__ import annotations from sys import maxsize from typing import TypeVar T = TypeVar("T") def get_parent_position(position: int) -> int: """ heap helper function get the position of the parent of the current node >>> get_parent_position(1) 0 >>> get_parent_position(2) 0 """ return (position - 1) // 2 def get_child_left_position(position: int) -> int: """ heap helper function get the position of the left child of the current node >>> get_child_left_position(0) 1 """ return (2 * position) + 1 def get_child_right_position(position: int) -> int: """ heap helper function get the position of the right child of the current node >>> get_child_right_position(0) 2 """ return (2 * position) + 2 class MinPriorityQueue[T]: """ Minimum Priority Queue Class Functions: is_empty: function to check if the priority queue is empty push: function to add an element with given priority to the queue extract_min: function to remove and return the element with lowest weight (highest priority) update_key: function to update the weight of the given key _bubble_up: helper function to place a node at the proper position (upward movement) _bubble_down: helper function to place a node at the proper position (downward movement) _swap_nodes: helper function to swap the nodes at the given positions >>> queue = MinPriorityQueue() >>> queue.push(1, 1000) >>> queue.push(2, 100) >>> queue.push(3, 4000) >>> queue.push(4, 3000) >>> queue.extract_min() 2 >>> queue.update_key(4, 50) >>> queue.extract_min() 4 >>> queue.extract_min() 1 >>> queue.extract_min() 3 """ def __init__(self) -> None: self.heap: list[tuple[T, int]] = [] self.position_map: dict[T, int] = {} self.elements: int = 0 def __len__(self) -> int: return self.elements def __repr__(self) -> str: return str(self.heap) def is_empty(self) -> bool: # Check if the priority queue is empty return self.elements == 0 def push(self, elem: T, weight: int) -> None: # Add an element with given priority to the queue self.heap.append((elem, weight)) self.position_map[elem] = self.elements self.elements += 1 self._bubble_up(elem) def extract_min(self) -> T: # Remove and return the element with lowest weight (highest priority) if self.elements > 1: self._swap_nodes(0, self.elements - 1) elem, _ = self.heap.pop() del self.position_map[elem] self.elements -= 1 if self.elements > 0: bubble_down_elem, _ = self.heap[0] self._bubble_down(bubble_down_elem) return elem def update_key(self, elem: T, weight: int) -> None: # Update the weight of the given key position = self.position_map[elem] self.heap[position] = (elem, weight) if position > 0: parent_position = get_parent_position(position) _, parent_weight = self.heap[parent_position] if parent_weight > weight: self._bubble_up(elem) else: self._bubble_down(elem) else: self._bubble_down(elem) def _bubble_up(self, elem: T) -> None: # Place a node at the proper position (upward movement) [to be used internally # only] curr_pos = self.position_map[elem] if curr_pos == 0: return None parent_position = get_parent_position(curr_pos) _, weight = self.heap[curr_pos] _, parent_weight = self.heap[parent_position] if parent_weight > weight: self._swap_nodes(parent_position, curr_pos) return self._bubble_up(elem) return None def _bubble_down(self, elem: T) -> None: # Place a node at the proper position (downward movement) [to be used # internally only] curr_pos = self.position_map[elem] _, weight = self.heap[curr_pos] child_left_position = get_child_left_position(curr_pos) child_right_position = get_child_right_position(curr_pos) if child_left_position < self.elements and child_right_position < self.elements: _, child_left_weight = self.heap[child_left_position] _, child_right_weight = self.heap[child_right_position] if child_right_weight < child_left_weight and child_right_weight < weight: self._swap_nodes(child_right_position, curr_pos) return self._bubble_down(elem) if child_left_position < self.elements: _, child_left_weight = self.heap[child_left_position] if child_left_weight < weight: self._swap_nodes(child_left_position, curr_pos) return self._bubble_down(elem) else: return None if child_right_position < self.elements: _, child_right_weight = self.heap[child_right_position] if child_right_weight < weight: self._swap_nodes(child_right_position, curr_pos) return self._bubble_down(elem) return None def _swap_nodes(self, node1_pos: int, node2_pos: int) -> None: # Swap the nodes at the given positions node1_elem = self.heap[node1_pos][0] node2_elem = self.heap[node2_pos][0] self.heap[node1_pos], self.heap[node2_pos] = ( self.heap[node2_pos], self.heap[node1_pos], ) self.position_map[node1_elem] = node2_pos self.position_map[node2_elem] = node1_pos class GraphUndirectedWeighted[T]: """ Graph Undirected Weighted Class Functions: add_node: function to add a node in the graph add_edge: function to add an edge between 2 nodes in the graph """ def __init__(self) -> None: self.connections: dict[T, dict[T, int]] = {} self.nodes: int = 0 def __repr__(self) -> str: return str(self.connections) def __len__(self) -> int: return self.nodes def add_node(self, node: T) -> None: # Add a node in the graph if it is not in the graph if node not in self.connections: self.connections[node] = {} self.nodes += 1 def add_edge(self, node1: T, node2: T, weight: int) -> None: # Add an edge between 2 nodes in the graph self.add_node(node1) self.add_node(node2) self.connections[node1][node2] = weight self.connections[node2][node1] = weight def prims_algo[T]( graph: GraphUndirectedWeighted[T], ) -> tuple[dict[T, int], dict[T, T | None]]: """ >>> graph = GraphUndirectedWeighted() >>> graph.add_edge("a", "b", 3) >>> graph.add_edge("b", "c", 10) >>> graph.add_edge("c", "d", 5) >>> graph.add_edge("a", "c", 15) >>> graph.add_edge("b", "d", 100) >>> dist, parent = prims_algo(graph) >>> abs(dist["a"] - dist["b"]) 3 >>> abs(dist["d"] - dist["b"]) 15 >>> abs(dist["a"] - dist["c"]) 13 """ # prim's algorithm for minimum spanning tree dist: dict[T, int] = dict.fromkeys(graph.connections, maxsize) parent: dict[T, T | None] = dict.fromkeys(graph.connections) priority_queue: MinPriorityQueue[T] = MinPriorityQueue() for node, weight in dist.items(): priority_queue.push(node, weight) if priority_queue.is_empty(): return dist, parent # initialization node = priority_queue.extract_min() dist[node] = 0 for neighbour in graph.connections[node]: if dist[neighbour] > dist[node] + graph.connections[node][neighbour]: dist[neighbour] = dist[node] + graph.connections[node][neighbour] priority_queue.update_key(neighbour, dist[neighbour]) parent[neighbour] = node # running prim's algorithm while not priority_queue.is_empty(): node = priority_queue.extract_min() for neighbour in graph.connections[node]: if dist[neighbour] > dist[node] + graph.connections[node][neighbour]: dist[neighbour] = dist[node] + graph.connections[node][neighbour] priority_queue.update_key(neighbour, dist[neighbour]) parent[neighbour] = node return dist, parent ================================================ FILE: graphs/multi_heuristic_astar.py ================================================ import heapq import sys import numpy as np TPos = tuple[int, int] class PriorityQueue: def __init__(self): self.elements = [] self.set = set() def minkey(self): if not self.empty(): return self.elements[0][0] else: return float("inf") def empty(self): return len(self.elements) == 0 def put(self, item, priority): if item not in self.set: heapq.heappush(self.elements, (priority, item)) self.set.add(item) else: # update # print("update", item) temp = [] (pri, x) = heapq.heappop(self.elements) while x != item: temp.append((pri, x)) (pri, x) = heapq.heappop(self.elements) temp.append((priority, item)) for pro, xxx in temp: heapq.heappush(self.elements, (pro, xxx)) def remove_element(self, item): if item in self.set: self.set.remove(item) temp = [] (pro, x) = heapq.heappop(self.elements) while x != item: temp.append((pro, x)) (pro, x) = heapq.heappop(self.elements) for prito, yyy in temp: heapq.heappush(self.elements, (prito, yyy)) def top_show(self): return self.elements[0][1] def get(self): (priority, item) = heapq.heappop(self.elements) self.set.remove(item) return (priority, item) def consistent_heuristic(p: TPos, goal: TPos): # euclidean distance a = np.array(p) b = np.array(goal) return np.linalg.norm(a - b) def heuristic_2(p: TPos, goal: TPos): # integer division by time variable return consistent_heuristic(p, goal) // t def heuristic_1(p: TPos, goal: TPos): # manhattan distance return abs(p[0] - goal[0]) + abs(p[1] - goal[1]) def key(start: TPos, i: int, goal: TPos, g_function: dict[TPos, float]): ans = g_function[start] + W1 * heuristics[i](start, goal) return ans def do_something(back_pointer, goal, start): grid = np.char.chararray((n, n)) for i in range(n): for j in range(n): grid[i][j] = "*" for i in range(n): for j in range(n): if (j, (n - 1) - i) in blocks: grid[i][j] = "#" grid[0][(n - 1)] = "-" x = back_pointer[goal] while x != start: (x_c, y_c) = x # print(x) grid[(n - 1) - y_c][x_c] = "-" x = back_pointer[x] grid[(n - 1)][0] = "-" for i in range(n): for j in range(n): if (i, j) == (0, n - 1): print(grid[i][j], end=" ") print("<-- End position", end=" ") else: print(grid[i][j], end=" ") print() print("^") print("Start position") print() print("# is an obstacle") print("- is the path taken by algorithm") print("PATH TAKEN BY THE ALGORITHM IS:-") x = back_pointer[goal] while x != start: print(x, end=" ") x = back_pointer[x] print(x) sys.exit() def valid(p: TPos): if p[0] < 0 or p[0] > n - 1: return False return not (p[1] < 0 or p[1] > n - 1) def expand_state( s, j, visited, g_function, close_list_anchor, close_list_inad, open_list, back_pointer, ): for itera in range(n_heuristic): open_list[itera].remove_element(s) # print("s", s) # print("j", j) (x, y) = s left = (x - 1, y) right = (x + 1, y) up = (x, y + 1) down = (x, y - 1) for neighbours in [left, right, up, down]: if neighbours not in blocks: if valid(neighbours) and neighbours not in visited: # print("neighbour", neighbours) visited.add(neighbours) back_pointer[neighbours] = -1 g_function[neighbours] = float("inf") if valid(neighbours) and g_function[neighbours] > g_function[s] + 1: g_function[neighbours] = g_function[s] + 1 back_pointer[neighbours] = s if neighbours not in close_list_anchor: open_list[0].put(neighbours, key(neighbours, 0, goal, g_function)) if neighbours not in close_list_inad: for var in range(1, n_heuristic): if key(neighbours, var, goal, g_function) <= W2 * key( neighbours, 0, goal, g_function ): open_list[j].put( neighbours, key(neighbours, var, goal, g_function) ) def make_common_ground(): some_list = [] for x in range(1, 5): for y in range(1, 6): some_list.append((x, y)) for x in range(15, 20): some_list.append((x, 17)) for x in range(10, 19): for y in range(1, 15): some_list.append((x, y)) # L block for x in range(1, 4): for y in range(12, 19): some_list.append((x, y)) for x in range(3, 13): for y in range(16, 19): some_list.append((x, y)) return some_list heuristics = {0: consistent_heuristic, 1: heuristic_1, 2: heuristic_2} blocks_blk = [ (0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1), (10, 1), (11, 1), (12, 1), (13, 1), (14, 1), (15, 1), (16, 1), (17, 1), (18, 1), (19, 1), ] blocks_all = make_common_ground() blocks = blocks_blk # hyper parameters W1 = 1 W2 = 1 n = 20 n_heuristic = 3 # one consistent and two other inconsistent # start and end destination start = (0, 0) goal = (n - 1, n - 1) t = 1 def multi_a_star(start: TPos, goal: TPos, n_heuristic: int): g_function = {start: 0, goal: float("inf")} back_pointer = {start: -1, goal: -1} open_list = [] visited = set() for i in range(n_heuristic): open_list.append(PriorityQueue()) open_list[i].put(start, key(start, i, goal, g_function)) close_list_anchor: list[int] = [] close_list_inad: list[int] = [] while open_list[0].minkey() < float("inf"): for i in range(1, n_heuristic): # print(open_list[0].minkey(), open_list[i].minkey()) if open_list[i].minkey() <= W2 * open_list[0].minkey(): global t t += 1 if g_function[goal] <= open_list[i].minkey(): if g_function[goal] < float("inf"): do_something(back_pointer, goal, start) else: _, get_s = open_list[i].top_show() visited.add(get_s) expand_state( get_s, i, visited, g_function, close_list_anchor, close_list_inad, open_list, back_pointer, ) close_list_inad.append(get_s) elif g_function[goal] <= open_list[0].minkey(): if g_function[goal] < float("inf"): do_something(back_pointer, goal, start) else: get_s = open_list[0].top_show() visited.add(get_s) expand_state( get_s, 0, visited, g_function, close_list_anchor, close_list_inad, open_list, back_pointer, ) close_list_anchor.append(get_s) print("No path found to goal") print() for i in range(n - 1, -1, -1): for j in range(n): if (j, i) in blocks: print("#", end=" ") elif (j, i) in back_pointer: if (j, i) == (n - 1, n - 1): print("*", end=" ") else: print("-", end=" ") else: print("*", end=" ") if (j, i) == (n - 1, n - 1): print("<-- End position", end=" ") print() print("^") print("Start position") print() print("# is an obstacle") print("- is the path taken by algorithm") if __name__ == "__main__": multi_a_star(start, goal, n_heuristic) ================================================ FILE: graphs/page_rank.py ================================================ """ Author: https://github.com/bhushan-borole """ """ The input graph for the algorithm is: A B C A 0 1 1 B 0 0 1 C 1 0 0 """ graph = [[0, 1, 1], [0, 0, 1], [1, 0, 0]] class Node: def __init__(self, name): self.name = name self.inbound = [] self.outbound = [] def add_inbound(self, node): self.inbound.append(node) def add_outbound(self, node): self.outbound.append(node) def __repr__(self): return f"" def page_rank(nodes, limit=3, d=0.85): ranks = {} for node in nodes: ranks[node.name] = 1 outbounds = {} for node in nodes: outbounds[node.name] = len(node.outbound) for i in range(limit): print(f"======= Iteration {i + 1} =======") for _, node in enumerate(nodes): ranks[node.name] = (1 - d) + d * sum( ranks[ib] / outbounds[ib] for ib in node.inbound ) print(ranks) def main(): names = list(input("Enter Names of the Nodes: ").split()) nodes = [Node(name) for name in names] for ri, row in enumerate(graph): for ci, col in enumerate(row): if col == 1: nodes[ci].add_inbound(names[ri]) nodes[ri].add_outbound(names[ci]) print("======= Nodes =======") for node in nodes: print(node) page_rank(nodes) if __name__ == "__main__": main() ================================================ FILE: graphs/prim.py ================================================ """Prim's Algorithm. Determines the minimum spanning tree(MST) of a graph using the Prim's Algorithm. Details: https://en.wikipedia.org/wiki/Prim%27s_algorithm """ import heapq as hq import math from collections.abc import Iterator class Vertex: """Class Vertex.""" def __init__(self, id_): """ Arguments: id - input an id to identify the vertex Attributes: neighbors - a list of the vertices it is linked to edges - a dict to store the edges's weight """ self.id = str(id_) self.key = None self.pi = None self.neighbors = [] self.edges = {} # {vertex:distance} def __lt__(self, other): """Comparison rule to < operator.""" return self.key < other.key def __repr__(self): """Return the vertex id.""" return self.id def add_neighbor(self, vertex): """Add a pointer to a vertex at neighbor's list.""" self.neighbors.append(vertex) def add_edge(self, vertex, weight): """Destination vertex and weight.""" self.edges[vertex.id] = weight def connect(graph, a, b, edge): # add the neighbors: graph[a - 1].add_neighbor(graph[b - 1]) graph[b - 1].add_neighbor(graph[a - 1]) # add the edges: graph[a - 1].add_edge(graph[b - 1], edge) graph[b - 1].add_edge(graph[a - 1], edge) def prim(graph: list, root: Vertex) -> list: """Prim's Algorithm. Runtime: O(mn) with `m` edges and `n` vertices Return: List with the edges of a Minimum Spanning Tree Usage: prim(graph, graph[0]) """ a = [] for u in graph: u.key = math.inf u.pi = None root.key = 0 q = graph[:] while q: u = min(q) q.remove(u) for v in u.neighbors: if (v in q) and (u.edges[v.id] < v.key): v.pi = u v.key = u.edges[v.id] for i in range(1, len(graph)): a.append((int(graph[i].id) + 1, int(graph[i].pi.id) + 1)) return a def prim_heap(graph: list, root: Vertex) -> Iterator[tuple]: """Prim's Algorithm with min heap. Runtime: O((m + n)log n) with `m` edges and `n` vertices Yield: Edges of a Minimum Spanning Tree Usage: prim(graph, graph[0]) """ for u in graph: u.key = math.inf u.pi = None root.key = 0 h = list(graph) hq.heapify(h) while h: u = hq.heappop(h) for v in u.neighbors: if (v in h) and (u.edges[v.id] < v.key): v.pi = u v.key = u.edges[v.id] hq.heapify(h) for i in range(1, len(graph)): yield (int(graph[i].id) + 1, int(graph[i].pi.id) + 1) def test_vector() -> None: """ # Creates a list to store x vertices. >>> x = 5 >>> G = [Vertex(n) for n in range(x)] >>> connect(G, 1, 2, 15) >>> connect(G, 1, 3, 12) >>> connect(G, 2, 4, 13) >>> connect(G, 2, 5, 5) >>> connect(G, 3, 2, 6) >>> connect(G, 3, 4, 6) >>> connect(G, 0, 0, 0) # Generate the minimum spanning tree: >>> G_heap = G[:] >>> MST = prim(G, G[0]) >>> MST_heap = prim_heap(G, G[0]) >>> for i in MST: ... print(i) (2, 3) (3, 1) (4, 3) (5, 2) >>> for i in MST_heap: ... print(i) (2, 3) (3, 1) (4, 3) (5, 2) """ if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: graphs/random_graph_generator.py ================================================ """ * Author: Manuel Di Lullo (https://github.com/manueldilullo) * Description: Random graphs generator. Uses graphs represented with an adjacency list. URL: https://en.wikipedia.org/wiki/Random_graph """ import random def random_graph( vertices_number: int, probability: float, directed: bool = False ) -> dict: """ Generate a random graph @input: vertices_number (number of vertices), probability (probability that a generic edge (u,v) exists), directed (if True: graph will be a directed graph, otherwise it will be an undirected graph) @examples: >>> random.seed(1) >>> random_graph(4, 0.5) {0: [1], 1: [0, 2, 3], 2: [1, 3], 3: [1, 2]} >>> random.seed(1) >>> random_graph(4, 0.5, True) {0: [1], 1: [2, 3], 2: [3], 3: []} """ graph: dict = {i: [] for i in range(vertices_number)} # if probability is greater or equal than 1, then generate a complete graph if probability >= 1: return complete_graph(vertices_number) # if probability is lower or equal than 0, then return a graph without edges if probability <= 0: return graph # for each couple of nodes, add an edge from u to v # if the number randomly generated is greater than probability probability for i in range(vertices_number): for j in range(i + 1, vertices_number): if random.random() < probability: graph[i].append(j) if not directed: # if the graph is undirected, add an edge in from j to i, either graph[j].append(i) return graph def complete_graph(vertices_number: int) -> dict: """ Generate a complete graph with vertices_number vertices. @input: vertices_number (number of vertices), directed (False if the graph is undirected, True otherwise) @example: >>> complete_graph(3) {0: [1, 2], 1: [0, 2], 2: [0, 1]} """ return { i: [j for j in range(vertices_number) if i != j] for i in range(vertices_number) } if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: graphs/scc_kosaraju.py ================================================ from __future__ import annotations def dfs(u): global graph, reversed_graph, scc, component, visit, stack if visit[u]: return visit[u] = True for v in graph[u]: dfs(v) stack.append(u) def dfs2(u): global graph, reversed_graph, scc, component, visit, stack if visit[u]: return visit[u] = True component.append(u) for v in reversed_graph[u]: dfs2(v) def kosaraju(): global graph, reversed_graph, scc, component, visit, stack for i in range(n): dfs(i) visit = [False] * n for i in stack[::-1]: if visit[i]: continue component = [] dfs2(i) scc.append(component) return scc if __name__ == "__main__": # n - no of nodes, m - no of edges n, m = list(map(int, input().strip().split())) graph: list[list[int]] = [[] for _ in range(n)] # graph reversed_graph: list[list[int]] = [[] for i in range(n)] # reversed graph # input graph data (edges) for _ in range(m): u, v = list(map(int, input().strip().split())) graph[u].append(v) reversed_graph[v].append(u) stack: list[int] = [] visit: list[bool] = [False] * n scc: list[int] = [] component: list[int] = [] print(kosaraju()) ================================================ FILE: graphs/strongly_connected_components.py ================================================ """ https://en.wikipedia.org/wiki/Strongly_connected_component Finding strongly connected components in directed graph """ test_graph_1 = {0: [2, 3], 1: [0], 2: [1], 3: [4], 4: []} test_graph_2 = {0: [1, 2, 3], 1: [2], 2: [0], 3: [4], 4: [5], 5: [3]} def topology_sort( graph: dict[int, list[int]], vert: int, visited: list[bool] ) -> list[int]: """ Use depth first search to sort graph At this time graph is the same as input >>> topology_sort(test_graph_1, 0, 5 * [False]) [1, 2, 4, 3, 0] >>> topology_sort(test_graph_2, 0, 6 * [False]) [2, 1, 5, 4, 3, 0] """ visited[vert] = True order = [] for neighbour in graph[vert]: if not visited[neighbour]: order += topology_sort(graph, neighbour, visited) order.append(vert) return order def find_components( reversed_graph: dict[int, list[int]], vert: int, visited: list[bool] ) -> list[int]: """ Use depth first search to find strongly connected vertices. Now graph is reversed >>> find_components({0: [1], 1: [2], 2: [0]}, 0, 5 * [False]) [0, 1, 2] >>> find_components({0: [2], 1: [0], 2: [0, 1]}, 0, 6 * [False]) [0, 2, 1] """ visited[vert] = True component = [vert] for neighbour in reversed_graph[vert]: if not visited[neighbour]: component += find_components(reversed_graph, neighbour, visited) return component def strongly_connected_components(graph: dict[int, list[int]]) -> list[list[int]]: """ This function takes graph as a parameter and then returns the list of strongly connected components >>> strongly_connected_components(test_graph_1) [[0, 1, 2], [3], [4]] >>> strongly_connected_components(test_graph_2) [[0, 2, 1], [3, 5, 4]] """ visited = len(graph) * [False] reversed_graph: dict[int, list[int]] = {vert: [] for vert in range(len(graph))} for vert, neighbours in graph.items(): for neighbour in neighbours: reversed_graph[neighbour].append(vert) order = [] for i, was_visited in enumerate(visited): if not was_visited: order += topology_sort(graph, i, visited) components_list = [] visited = len(graph) * [False] for i in range(len(graph)): vert = order[len(graph) - i - 1] if not visited[vert]: component = find_components(reversed_graph, vert, visited) components_list.append(component) return components_list ================================================ FILE: graphs/tarjans_scc.py ================================================ from collections import deque def tarjan(g: list[list[int]]) -> list[list[int]]: """ Tarjan's algo for finding strongly connected components in a directed graph Uses two main attributes of each node to track reachability, the index of that node within a component(index), and the lowest index reachable from that node(lowlink). We then perform a dfs of the each component making sure to update these parameters for each node and saving the nodes we visit on the way. If ever we find that the lowest reachable node from a current node is equal to the index of the current node then it must be the root of a strongly connected component and so we save it and it's equireachable vertices as a strongly connected component. Complexity: strong_connect() is called at most once for each node and has a complexity of O(|E|) as it is DFS. Therefore this has complexity O(|V| + |E|) for a graph G = (V, E) >>> tarjan([[2, 3, 4], [2, 3, 4], [0, 1, 3], [0, 1, 2], [1]]) [[4, 3, 1, 2, 0]] >>> tarjan([[], [], [], []]) [[0], [1], [2], [3]] >>> a = [0, 1, 2, 3, 4, 5, 4] >>> b = [1, 0, 3, 2, 5, 4, 0] >>> n = 7 >>> sorted(tarjan(create_graph(n, list(zip(a, b))))) == sorted( ... tarjan(create_graph(n, list(zip(a[::-1], b[::-1]))))) True >>> a = [0, 1, 2, 3, 4, 5, 6] >>> b = [0, 1, 2, 3, 4, 5, 6] >>> sorted(tarjan(create_graph(n, list(zip(a, b))))) [[0], [1], [2], [3], [4], [5], [6]] """ n = len(g) stack: deque[int] = deque() on_stack = [False for _ in range(n)] index_of = [-1 for _ in range(n)] lowlink_of = index_of[:] def strong_connect(v: int, index: int, components: list[list[int]]) -> int: index_of[v] = index # the number when this node is seen lowlink_of[v] = index # lowest rank node reachable from here index += 1 stack.append(v) on_stack[v] = True for w in g[v]: if index_of[w] == -1: index = strong_connect(w, index, components) lowlink_of[v] = ( lowlink_of[w] if lowlink_of[w] < lowlink_of[v] else lowlink_of[v] ) elif on_stack[w]: lowlink_of[v] = ( lowlink_of[w] if lowlink_of[w] < lowlink_of[v] else lowlink_of[v] ) if lowlink_of[v] == index_of[v]: component = [] w = stack.pop() on_stack[w] = False component.append(w) while w != v: w = stack.pop() on_stack[w] = False component.append(w) components.append(component) return index components: list[list[int]] = [] for v in range(n): if index_of[v] == -1: strong_connect(v, 0, components) return components def create_graph(n: int, edges: list[tuple[int, int]]) -> list[list[int]]: """ >>> n = 7 >>> source = [0, 0, 1, 2, 3, 3, 4, 4, 6] >>> target = [1, 3, 2, 0, 1, 4, 5, 6, 5] >>> edges = list(zip(source, target)) >>> create_graph(n, edges) [[1, 3], [2], [0], [1, 4], [5, 6], [], [5]] """ g: list[list[int]] = [[] for _ in range(n)] for u, v in edges: g[u].append(v) return g if __name__ == "__main__": # Test n_vertices = 7 source = [0, 0, 1, 2, 3, 3, 4, 4, 6] target = [1, 3, 2, 0, 1, 4, 5, 6, 5] edges = list(zip(source, target)) g = create_graph(n_vertices, edges) assert tarjan(g) == [[5], [6], [4], [3, 2, 1, 0]] ================================================ FILE: graphs/tests/__init__.py ================================================ ================================================ FILE: graphs/tests/test_min_spanning_tree_kruskal.py ================================================ from graphs.minimum_spanning_tree_kruskal import kruskal def test_kruskal_successful_result(): num_nodes = 9 edges = [ [0, 1, 4], [0, 7, 8], [1, 2, 8], [7, 8, 7], [7, 6, 1], [2, 8, 2], [8, 6, 6], [2, 3, 7], [2, 5, 4], [6, 5, 2], [3, 5, 14], [3, 4, 9], [5, 4, 10], [1, 7, 11], ] result = kruskal(num_nodes, edges) expected = [ [7, 6, 1], [2, 8, 2], [6, 5, 2], [0, 1, 4], [2, 5, 4], [2, 3, 7], [0, 7, 8], [3, 4, 9], ] assert sorted(expected) == sorted(result) ================================================ FILE: graphs/tests/test_min_spanning_tree_prim.py ================================================ from collections import defaultdict from graphs.minimum_spanning_tree_prims import prisms_algorithm as mst def test_prim_successful_result(): num_nodes, num_edges = 9, 14 # noqa: F841 edges = [ [0, 1, 4], [0, 7, 8], [1, 2, 8], [7, 8, 7], [7, 6, 1], [2, 8, 2], [8, 6, 6], [2, 3, 7], [2, 5, 4], [6, 5, 2], [3, 5, 14], [3, 4, 9], [5, 4, 10], [1, 7, 11], ] adjacency = defaultdict(list) for node1, node2, cost in edges: adjacency[node1].append([node2, cost]) adjacency[node2].append([node1, cost]) result = mst(adjacency) expected = [ [7, 6, 1], [2, 8, 2], [6, 5, 2], [0, 1, 4], [2, 5, 4], [2, 3, 7], [0, 7, 8], [3, 4, 9], ] for answer in expected: edge = tuple(answer[:2]) reverse = tuple(edge[::-1]) assert edge in result or reverse in result ================================================ FILE: greedy_methods/__init__.py ================================================ ================================================ FILE: greedy_methods/best_time_to_buy_and_sell_stock.py ================================================ """ Given a list of stock prices calculate the maximum profit that can be made from a single buy and sell of one share of stock. We only allowed to complete one buy transaction and one sell transaction but must buy before we sell. Example : prices = [7, 1, 5, 3, 6, 4] max_profit will return 5 - which is by buying at price 1 and selling at price 6. This problem can be solved using the concept of "GREEDY ALGORITHM". We iterate over the price array once, keeping track of the lowest price point (buy) and the maximum profit we can get at each point. The greedy choice at each point is to either buy at the current price if it's less than our current buying price, or sell at the current price if the profit is more than our current maximum profit. """ def max_profit(prices: list[int]) -> int: """ >>> max_profit([7, 1, 5, 3, 6, 4]) 5 >>> max_profit([7, 6, 4, 3, 1]) 0 """ if not prices: return 0 min_price = prices[0] max_profit: int = 0 for price in prices: min_price = min(price, min_price) max_profit = max(price - min_price, max_profit) return max_profit if __name__ == "__main__": import doctest doctest.testmod() print(max_profit([7, 1, 5, 3, 6, 4])) ================================================ FILE: greedy_methods/fractional_cover_problem.py ================================================ # https://en.wikipedia.org/wiki/Set_cover_problem from dataclasses import dataclass from operator import attrgetter @dataclass class Item: weight: int value: int @property def ratio(self) -> float: """ Return the value-to-weight ratio for the item. Returns: float: The value-to-weight ratio for the item. Examples: >>> Item(10, 65).ratio 6.5 >>> Item(20, 100).ratio 5.0 >>> Item(30, 120).ratio 4.0 """ return self.value / self.weight def fractional_cover(items: list[Item], capacity: int) -> float: """ Solve the Fractional Cover Problem. Args: items: A list of items, where each item has weight and value attributes. capacity: The maximum weight capacity of the knapsack. Returns: The maximum value that can be obtained by selecting fractions of items to cover the knapsack's capacity. Raises: ValueError: If capacity is negative. Examples: >>> fractional_cover((Item(10, 60), Item(20, 100), Item(30, 120)), capacity=50) 240.0 >>> fractional_cover([Item(20, 100), Item(30, 120), Item(10, 60)], capacity=25) 135.0 >>> fractional_cover([Item(10, 60), Item(20, 100), Item(30, 120)], capacity=60) 280.0 >>> fractional_cover(items=[Item(5, 30), Item(10, 60), Item(15, 90)], capacity=30) 180.0 >>> fractional_cover(items=[], capacity=50) 0.0 >>> fractional_cover(items=[Item(10, 60)], capacity=5) 30.0 >>> fractional_cover(items=[Item(10, 60)], capacity=1) 6.0 >>> fractional_cover(items=[Item(10, 60)], capacity=0) 0.0 >>> fractional_cover(items=[Item(10, 60)], capacity=-1) Traceback (most recent call last): ... ValueError: Capacity cannot be negative """ if capacity < 0: raise ValueError("Capacity cannot be negative") total_value = 0.0 remaining_capacity = capacity # Sort the items by their value-to-weight ratio in descending order for item in sorted(items, key=attrgetter("ratio"), reverse=True): if remaining_capacity == 0: break weight_taken = min(item.weight, remaining_capacity) total_value += weight_taken * item.ratio remaining_capacity -= weight_taken return total_value if __name__ == "__main__": import doctest if result := doctest.testmod().failed: print(f"{result} test(s) failed") else: print("All tests passed") ================================================ FILE: greedy_methods/fractional_knapsack.py ================================================ from bisect import bisect from itertools import accumulate def frac_knapsack(vl, wt, w, n): """ >>> frac_knapsack([60, 100, 120], [10, 20, 30], 50, 3) 240.0 >>> frac_knapsack([10, 40, 30, 50], [5, 4, 6, 3], 10, 4) 105.0 >>> frac_knapsack([10, 40, 30, 50], [5, 4, 6, 3], 8, 4) 95.0 >>> frac_knapsack([10, 40, 30, 50], [5, 4, 6], 8, 4) 60.0 >>> frac_knapsack([10, 40, 30], [5, 4, 6, 3], 8, 4) 60.0 >>> frac_knapsack([10, 40, 30, 50], [5, 4, 6, 3], 0, 4) 0 >>> frac_knapsack([10, 40, 30, 50], [5, 4, 6, 3], 8, 0) 95.0 >>> frac_knapsack([10, 40, 30, 50], [5, 4, 6, 3], -8, 4) 0 >>> frac_knapsack([10, 40, 30, 50], [5, 4, 6, 3], 8, -4) 95.0 >>> frac_knapsack([10, 40, 30, 50], [5, 4, 6, 3], 800, 4) 130 >>> frac_knapsack([10, 40, 30, 50], [5, 4, 6, 3], 8, 400) 95.0 >>> frac_knapsack("ABCD", [5, 4, 6, 3], 8, 400) Traceback (most recent call last): ... TypeError: unsupported operand type(s) for /: 'str' and 'int' """ r = sorted(zip(vl, wt), key=lambda x: x[0] / x[1], reverse=True) vl, wt = [i[0] for i in r], [i[1] for i in r] acc = list(accumulate(wt)) k = bisect(acc, w) return ( 0 if k == 0 else sum(vl[:k]) + (w - acc[k - 1]) * (vl[k]) / (wt[k]) if k != n else sum(vl[:k]) ) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: greedy_methods/fractional_knapsack_2.py ================================================ # https://en.wikipedia.org/wiki/Continuous_knapsack_problem # https://www.guru99.com/fractional-knapsack-problem-greedy.html # https://medium.com/walkinthecode/greedy-algorithm-fractional-knapsack-problem-9aba1daecc93 from __future__ import annotations def fractional_knapsack( value: list[int], weight: list[int], capacity: int ) -> tuple[float, list[float]]: """ >>> value = [1, 3, 5, 7, 9] >>> weight = [0.9, 0.7, 0.5, 0.3, 0.1] >>> fractional_knapsack(value, weight, 5) (25, [1, 1, 1, 1, 1]) >>> fractional_knapsack(value, weight, 15) (25, [1, 1, 1, 1, 1]) >>> fractional_knapsack(value, weight, 25) (25, [1, 1, 1, 1, 1]) >>> fractional_knapsack(value, weight, 26) (25, [1, 1, 1, 1, 1]) >>> fractional_knapsack(value, weight, -1) (-90.0, [0, 0, 0, 0, -10.0]) >>> fractional_knapsack([1, 3, 5, 7], weight, 30) (16, [1, 1, 1, 1]) >>> fractional_knapsack(value, [0.9, 0.7, 0.5, 0.3, 0.1], 30) (25, [1, 1, 1, 1, 1]) >>> fractional_knapsack([], [], 30) (0, []) """ index = list(range(len(value))) ratio = [v / w for v, w in zip(value, weight)] index.sort(key=lambda i: ratio[i], reverse=True) max_value: float = 0 fractions: list[float] = [0] * len(value) for i in index: if weight[i] <= capacity: fractions[i] = 1 max_value += value[i] capacity -= weight[i] else: fractions[i] = capacity / weight[i] max_value += value[i] * capacity / weight[i] break return max_value, fractions if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: greedy_methods/gas_station.py ================================================ """ Task: There are n gas stations along a circular route, where the amount of gas at the ith station is gas_quantities[i]. You have a car with an unlimited gas tank and it costs costs[i] of gas to travel from the ith station to its next (i + 1)th station. You begin the journey with an empty tank at one of the gas stations. Given two integer arrays gas_quantities and costs, return the starting gas station's index if you can travel around the circuit once in the clockwise direction otherwise, return -1. If there exists a solution, it is guaranteed to be unique Reference: https://leetcode.com/problems/gas-station/description Implementation notes: First, check whether the total gas is enough to complete the journey. If not, return -1. However, if there is enough gas, it is guaranteed that there is a valid starting index to reach the end of the journey. Greedily calculate the net gain (gas_quantity - cost) at each station. If the net gain ever goes below 0 while iterating through the stations, start checking from the next station. """ from dataclasses import dataclass @dataclass class GasStation: gas_quantity: int cost: int def get_gas_stations( gas_quantities: list[int], costs: list[int] ) -> tuple[GasStation, ...]: """ This function returns a tuple of gas stations. Args: gas_quantities: Amount of gas available at each station costs: The cost of gas required to move from one station to the next Returns: A tuple of gas stations >>> gas_stations = get_gas_stations([1, 2, 3, 4, 5], [3, 4, 5, 1, 2]) >>> len(gas_stations) 5 >>> gas_stations[0] GasStation(gas_quantity=1, cost=3) >>> gas_stations[-1] GasStation(gas_quantity=5, cost=2) """ return tuple( GasStation(quantity, cost) for quantity, cost in zip(gas_quantities, costs) ) def can_complete_journey(gas_stations: tuple[GasStation, ...]) -> int: """ This function returns the index from which to start the journey in order to reach the end. Args: gas_quantities [list]: Amount of gas available at each station cost [list]: The cost of gas required to move from one station to the next Returns: start [int]: start index needed to complete the journey Examples: >>> can_complete_journey(get_gas_stations([1, 2, 3, 4, 5], [3, 4, 5, 1, 2])) 3 >>> can_complete_journey(get_gas_stations([2, 3, 4], [3, 4, 3])) -1 """ total_gas = sum(gas_station.gas_quantity for gas_station in gas_stations) total_cost = sum(gas_station.cost for gas_station in gas_stations) if total_gas < total_cost: return -1 start = 0 net = 0 for i, gas_station in enumerate(gas_stations): net += gas_station.gas_quantity - gas_station.cost if net < 0: start = i + 1 net = 0 return start if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: greedy_methods/minimum_coin_change.py ================================================ """ Test cases: Do you want to enter your denominations ? (Y/N) :N Enter the change you want to make in Indian Currency: 987 Following is minimal change for 987 : 500 100 100 100 100 50 20 10 5 2 Do you want to enter your denominations ? (Y/N) :Y Enter number of denomination:10 1 5 10 20 50 100 200 500 1000 2000 Enter the change you want to make: 18745 Following is minimal change for 18745 : 2000 2000 2000 2000 2000 2000 2000 2000 2000 500 200 20 20 5 Do you want to enter your denominations ? (Y/N) :N Enter the change you want to make: 0 The total value cannot be zero or negative. Do you want to enter your denominations ? (Y/N) :N Enter the change you want to make: -98 The total value cannot be zero or negative. Do you want to enter your denominations ? (Y/N) :Y Enter number of denomination:5 1 5 100 500 1000 Enter the change you want to make: 456 Following is minimal change for 456 : 100 100 100 100 5 5 5 5 5 5 5 5 5 5 5 1 """ def find_minimum_change(denominations: list[int], value: str) -> list[int]: """ Find the minimum change from the given denominations and value >>> find_minimum_change([1, 5, 10, 20, 50, 100, 200, 500, 1000,2000], 18745) [2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 500, 200, 20, 20, 5] >>> find_minimum_change([1, 2, 5, 10, 20, 50, 100, 500, 2000], 987) [500, 100, 100, 100, 100, 50, 20, 10, 5, 2] >>> find_minimum_change([1, 2, 5, 10, 20, 50, 100, 500, 2000], 0) [] >>> find_minimum_change([1, 2, 5, 10, 20, 50, 100, 500, 2000], -98) [] >>> find_minimum_change([1, 5, 100, 500, 1000], 456) [100, 100, 100, 100, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1] """ total_value = int(value) # Initialize Result answer = [] # Traverse through all denomination for denomination in reversed(denominations): # Find denominations while int(total_value) >= int(denomination): total_value -= int(denomination) answer.append(denomination) # Append the "answers" array return answer # Driver Code if __name__ == "__main__": denominations = [] value = "0" if ( input("Do you want to enter your denominations ? (yY/n): ").strip().lower() == "y" ): n = int(input("Enter the number of denominations you want to add: ").strip()) for i in range(n): denominations.append(int(input(f"Denomination {i}: ").strip())) value = input("Enter the change you want to make in Indian Currency: ").strip() else: # All denominations of Indian Currency if user does not enter denominations = [1, 2, 5, 10, 20, 50, 100, 500, 2000] value = input("Enter the change you want to make: ").strip() if int(value) == 0 or int(value) < 0: print("The total value cannot be zero or negative.") else: print(f"Following is minimal change for {value}: ") answer = find_minimum_change(denominations, value) # Print result for i in range(len(answer)): print(answer[i], end=" ") ================================================ FILE: greedy_methods/minimum_waiting_time.py ================================================ """ Calculate the minimum waiting time using a greedy algorithm. reference: https://www.youtube.com/watch?v=Sf3eiO12eJs For doctests run following command: python -m doctest -v minimum_waiting_time.py The minimum_waiting_time function uses a greedy algorithm to calculate the minimum time for queries to complete. It sorts the list in non-decreasing order, calculates the waiting time for each query by multiplying its position in the list with the sum of all remaining query times, and returns the total waiting time. A doctest ensures that the function produces the correct output. """ def minimum_waiting_time(queries: list[int]) -> int: """ This function takes a list of query times and returns the minimum waiting time for all queries to be completed. Args: queries: A list of queries measured in picoseconds Returns: total_waiting_time: Minimum waiting time measured in picoseconds Examples: >>> minimum_waiting_time([3, 2, 1, 2, 6]) 17 >>> minimum_waiting_time([3, 2, 1]) 4 >>> minimum_waiting_time([1, 2, 3, 4]) 10 >>> minimum_waiting_time([5, 5, 5, 5]) 30 >>> minimum_waiting_time([]) 0 """ n = len(queries) if n in (0, 1): return 0 return sum(query * (n - i - 1) for i, query in enumerate(sorted(queries))) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: greedy_methods/optimal_merge_pattern.py ================================================ """ This is a pure Python implementation of the greedy-merge-sort algorithm reference: https://www.geeksforgeeks.org/optimal-file-merge-patterns/ For doctests run following command: python3 -m doctest -v greedy_merge_sort.py Objective Merge a set of sorted files of different length into a single sorted file. We need to find an optimal solution, where the resultant file will be generated in minimum time. Approach If the number of sorted files are given, there are many ways to merge them into a single sorted file. This merge can be performed pair wise. To merge a m-record file and a n-record file requires possibly m+n record moves the optimal choice being, merge the two smallest files together at each step (greedy approach). """ def optimal_merge_pattern(files: list) -> float: """Function to merge all the files with optimum cost Args: files [list]: A list of sizes of different files to be merged Returns: optimal_merge_cost [int]: Optimal cost to merge all those files Examples: >>> optimal_merge_pattern([2, 3, 4]) 14 >>> optimal_merge_pattern([5, 10, 20, 30, 30]) 205 >>> optimal_merge_pattern([8, 8, 8, 8, 8]) 96 """ optimal_merge_cost = 0 while len(files) > 1: temp = 0 # Consider two files with minimum cost to be merged for _ in range(2): min_index = files.index(min(files)) temp += files[min_index] files.pop(min_index) files.append(temp) optimal_merge_cost += temp return optimal_merge_cost if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: greedy_methods/smallest_range.py ================================================ """ smallest_range function takes a list of sorted integer lists and finds the smallest range that includes at least one number from each list, using a min heap for efficiency. """ from heapq import heappop, heappush from sys import maxsize def smallest_range(nums: list[list[int]]) -> list[int]: """ Find the smallest range from each list in nums. Uses min heap for efficiency. The range includes at least one number from each list. Args: `nums`: List of k sorted integer lists. Returns: list: Smallest range as a two-element list. Examples: >>> smallest_range([[4, 10, 15, 24, 26], [0, 9, 12, 20], [5, 18, 22, 30]]) [20, 24] >>> smallest_range([[1, 2, 3], [1, 2, 3], [1, 2, 3]]) [1, 1] >>> smallest_range(((1, 2, 3), (1, 2, 3), (1, 2, 3))) [1, 1] >>> smallest_range(((-3, -2, -1), (0, 0, 0), (1, 2, 3))) [-1, 1] >>> smallest_range([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) [3, 7] >>> smallest_range([[0, 0, 0], [0, 0, 0], [0, 0, 0]]) [0, 0] >>> smallest_range([[], [], []]) Traceback (most recent call last): ... IndexError: list index out of range """ min_heap: list[tuple[int, int, int]] = [] current_max = -maxsize - 1 for i, items in enumerate(nums): heappush(min_heap, (items[0], i, 0)) current_max = max(current_max, items[0]) # Initialize smallest_range with large integer values smallest_range = [-maxsize - 1, maxsize] while min_heap: current_min, list_index, element_index = heappop(min_heap) if current_max - current_min < smallest_range[1] - smallest_range[0]: smallest_range = [current_min, current_max] if element_index == len(nums[list_index]) - 1: break next_element = nums[list_index][element_index + 1] heappush(min_heap, (next_element, list_index, element_index + 1)) current_max = max(current_max, next_element) return smallest_range if __name__ == "__main__": from doctest import testmod testmod() print(f"{smallest_range([[1, 2, 3], [1, 2, 3], [1, 2, 3]])}") # Output: [1, 1] ================================================ FILE: hashes/README.md ================================================ # Hashes Hashing is the process of mapping any amount of data to a specified size using an algorithm. This is known as a hash value (or, if you're feeling fancy, a hash code, hash sums, or even a hash digest). Hashing is a one-way function, whereas encryption is a two-way function. While it is functionally conceivable to reverse-hash stuff, the required computing power makes it impractical. Hashing is a one-way street. Unlike encryption, which is intended to protect data in transit, hashing is intended to authenticate that a file or piece of data has not been altered—that it is authentic. In other words, it functions as a checksum. ## Common hashing algorithms ### MD5 This is one of the first algorithms that has gained widespread acceptance. MD5 is hashing algorithm made by Ray Rivest that is known to suffer vulnerabilities. It was created in 1992 as the successor to MD4. Currently MD6 is in the works, but as of 2009 Rivest had removed it from NIST consideration for SHA-3. ### SHA SHA stands for Security Hashing Algorithm and it’s probably best known as the hashing algorithm used in most SSL/TLS cipher suites. A cipher suite is a collection of ciphers and algorithms that are used for SSL/TLS connections. SHA handles the hashing aspects. SHA-1, as we mentioned earlier, is now deprecated. SHA-2 is now mandatory. SHA-2 is sometimes known as SHA-256, though variants with longer bit lengths are also available. ### SHA256 SHA 256 is a member of the SHA 2 algorithm family, under which SHA stands for Secure Hash Algorithm. It was a collaborative effort between both the NSA and NIST to implement a successor to the SHA 1 family, which was beginning to lose potency against brute force attacks. It was published in 2001. The importance of the 256 in the name refers to the final hash digest value, i.e. the hash value will remain 256 bits regardless of the size of the plaintext/cleartext. Other algorithms in the SHA family are similar to SHA 256 in some ways. ### Luhn The Luhn algorithm, also renowned as the modulus 10 or mod 10 algorithm, is a straightforward checksum formula used to validate a wide range of identification numbers, including credit card numbers, IMEI numbers, and Canadian Social Insurance Numbers. A community of mathematicians developed the LUHN formula in the late 1960s. Companies offering credit cards quickly followed suit. Since the algorithm is in the public interest, anyone can use it. The algorithm is used by most credit cards and many government identification numbers as a simple method of differentiating valid figures from mistyped or otherwise incorrect numbers. It was created to guard against unintentional errors, not malicious attacks. ================================================ FILE: hashes/__init__.py ================================================ ================================================ FILE: hashes/adler32.py ================================================ """ Adler-32 is a checksum algorithm which was invented by Mark Adler in 1995. Compared to a cyclic redundancy check of the same length, it trades reliability for speed (preferring the latter). Adler-32 is more reliable than Fletcher-16, and slightly less reliable than Fletcher-32.[2] source: https://en.wikipedia.org/wiki/Adler-32 """ MOD_ADLER = 65521 def adler32(plain_text: str) -> int: """ Function implements adler-32 hash. Iterates and evaluates a new value for each character >>> adler32('Algorithms') 363791387 >>> adler32('go adler em all') 708642122 """ a = 1 b = 0 for plain_chr in plain_text: a = (a + ord(plain_chr)) % MOD_ADLER b = (b + a) % MOD_ADLER return (b << 16) | a ================================================ FILE: hashes/chaos_machine.py ================================================ """example of simple chaos machine""" # Chaos Machine (K, t, m) K = [0.33, 0.44, 0.55, 0.44, 0.33] t = 3 m = 5 # Buffer Space (with Parameters Space) buffer_space: list[float] = [] params_space: list[float] = [] # Machine Time machine_time = 0 def push(seed): global buffer_space, params_space, machine_time, K, m, t # Choosing Dynamical Systems (All) for key, value in enumerate(buffer_space): # Evolution Parameter e = float(seed / value) # Control Theory: Orbit Change value = (buffer_space[(key + 1) % m] + e) % 1 # Control Theory: Trajectory Change r = (params_space[key] + e) % 1 + 3 # Modification (Transition Function) - Jumps buffer_space[key] = round(float(r * value * (1 - value)), 10) params_space[key] = r # Saving to Parameters Space # Logistic Map assert max(buffer_space) < 1 assert max(params_space) < 4 # Machine Time machine_time += 1 def pull(): global buffer_space, params_space, machine_time, K, m, t # PRNG (Xorshift by George Marsaglia) def xorshift(x, y): x ^= y >> 13 y ^= x << 17 x ^= y >> 5 return x # Choosing Dynamical Systems (Increment) key = machine_time % m # Evolution (Time Length) for _ in range(t): # Variables (Position + Parameters) r = params_space[key] value = buffer_space[key] # Modification (Transition Function) - Flow buffer_space[key] = round(float(r * value * (1 - value)), 10) params_space[key] = (machine_time * 0.01 + r * 1.01) % 1 + 3 # Choosing Chaotic Data x = int(buffer_space[(key + 2) % m] * (10**10)) y = int(buffer_space[(key - 2) % m] * (10**10)) # Machine Time machine_time += 1 return xorshift(x, y) % 0xFFFFFFFF def reset(): global buffer_space, params_space, machine_time, K, m, t buffer_space = K params_space = [0] * m machine_time = 0 if __name__ == "__main__": # Initialization reset() # Pushing Data (Input) import random message = random.sample(range(0xFFFFFFFF), 100) for chunk in message: push(chunk) # for controlling inp = "" # Pulling Data (Output) while inp in ("e", "E"): print(f"{format(pull(), '#04x')}") print(buffer_space) print(params_space) inp = input("(e)exit? ").strip() ================================================ FILE: hashes/djb2.py ================================================ """ This algorithm (k=33) was first reported by Dan Bernstein many years ago in comp.lang.c Another version of this algorithm (now favored by Bernstein) uses xor: hash(i) = hash(i - 1) * 33 ^ str[i]; First Magic constant 33: It has never been adequately explained. It's magic because it works better than many other constants, prime or not. Second Magic Constant 5381: 1. odd number 2. prime number 3. deficient number 4. 001/010/100/000/101 b source: http://www.cse.yorku.ca/~oz/hash.html """ def djb2(s: str) -> int: """ Implementation of djb2 hash algorithm that is popular because of it's magic constants. >>> djb2('Algorithms') 3782405311 >>> djb2('scramble bits') 1609059040 """ hash_value = 5381 for x in s: hash_value = ((hash_value << 5) + hash_value) + ord(x) return hash_value & 0xFFFFFFFF ================================================ FILE: hashes/elf.py ================================================ def elf_hash(data: str) -> int: """ Implementation of ElfHash Algorithm, a variant of PJW hash function. >>> elf_hash('lorem ipsum') 253956621 """ hash_ = x = 0 for letter in data: hash_ = (hash_ << 4) + ord(letter) x = hash_ & 0xF0000000 if x != 0: hash_ ^= x >> 24 hash_ &= ~x return hash_ if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: hashes/enigma_machine.py ================================================ alphabets = [chr(i) for i in range(32, 126)] gear_one = list(range(len(alphabets))) gear_two = list(range(len(alphabets))) gear_three = list(range(len(alphabets))) reflector = list(reversed(range(len(alphabets)))) code = [] gear_one_pos = gear_two_pos = gear_three_pos = 0 def rotator(): global gear_one_pos global gear_two_pos global gear_three_pos i = gear_one[0] gear_one.append(i) del gear_one[0] gear_one_pos += 1 if gear_one_pos % len(alphabets) == 0: i = gear_two[0] gear_two.append(i) del gear_two[0] gear_two_pos += 1 if gear_two_pos % len(alphabets) == 0: i = gear_three[0] gear_three.append(i) del gear_three[0] gear_three_pos += 1 def engine(input_character): target = alphabets.index(input_character) target = gear_one[target] target = gear_two[target] target = gear_three[target] target = reflector[target] target = gear_three.index(target) target = gear_two.index(target) target = gear_one.index(target) code.append(alphabets[target]) rotator() if __name__ == "__main__": decode = list(input("Type your message:\n")) while True: try: token = int(input("Please set token:(must be only digits)\n")) break except Exception as error: print(error) for _ in range(token): rotator() for j in decode: engine(j) print("\n" + "".join(code)) print( f"\nYour Token is {token} please write it down.\nIf you want to decode " "this message again you should input same digits as token!" ) ================================================ FILE: hashes/fletcher16.py ================================================ """ The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John G. Fletcher (1934-2012) at Lawrence Livermore Labs in the late 1970s.[1] The objective of the Fletcher checksum was to provide error-detection properties approaching those of a cyclic redundancy check but with the lower computational effort associated with summation techniques. Source: https://en.wikipedia.org/wiki/Fletcher%27s_checksum """ def fletcher16(text: str) -> int: """ Loop through every character in the data and add to two sums. >>> fletcher16('hello world') 6752 >>> fletcher16('onethousandfourhundredthirtyfour') 28347 >>> fletcher16('The quick brown fox jumps over the lazy dog.') 5655 """ data = bytes(text, "ascii") sum1 = 0 sum2 = 0 for character in data: sum1 = (sum1 + character) % 255 sum2 = (sum1 + sum2) % 255 return (sum2 << 8) | sum1 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: hashes/hamming_code.py ================================================ # Author: João Gustavo A. Amorim & Gabriel Kunz # Author email: joaogustavoamorim@gmail.com and gabriel-kunz@uergs.edu.br # Coding date: apr 2019 # Black: True """ * This code implement the Hamming code: https://en.wikipedia.org/wiki/Hamming_code - In telecommunication, Hamming codes are a family of linear error-correcting codes. Hamming codes can detect up to two-bit errors or correct one-bit errors without detection of uncorrected errors. By contrast, the simple parity code cannot correct errors, and can detect only an odd number of bits in error. Hamming codes are perfect codes, that is, they achieve the highest possible rate for codes with their block length and minimum distance of three. * the implemented code consists of: * a function responsible for encoding the message (emitterConverter) * return the encoded message * a function responsible for decoding the message (receptorConverter) * return the decoded message and a ack of data integrity * how to use: to be used you must declare how many parity bits (sizePari) you want to include in the message. it is desired (for test purposes) to select a bit to be set as an error. This serves to check whether the code is working correctly. Lastly, the variable of the message/word that must be desired to be encoded (text). * how this work: declaration of variables (sizePari, be, text) converts the message/word (text) to binary using the text_to_bits function encodes the message using the rules of hamming encoding decodes the message using the rules of hamming encoding print the original message, the encoded message and the decoded message forces an error in the coded text variable decodes the message that was forced the error print the original message, the encoded message, the bit changed message and the decoded message """ # Imports import numpy as np # Functions of binary conversion-------------------------------------- def text_to_bits(text, encoding="utf-8", errors="surrogatepass"): """ >>> text_to_bits("msg") '011011010111001101100111' """ bits = bin(int.from_bytes(text.encode(encoding, errors), "big"))[2:] return bits.zfill(8 * ((len(bits) + 7) // 8)) def text_from_bits(bits, encoding="utf-8", errors="surrogatepass"): """ >>> text_from_bits('011011010111001101100111') 'msg' """ n = int(bits, 2) return n.to_bytes((n.bit_length() + 7) // 8, "big").decode(encoding, errors) or "\0" # Functions of hamming code------------------------------------------- def emitter_converter(size_par, data): """ :param size_par: how many parity bits the message must have :param data: information bits :return: message to be transmitted by unreliable medium - bits of information merged with parity bits >>> emitter_converter(4, "101010111111") ['1', '1', '1', '1', '0', '1', '0', '0', '1', '0', '1', '1', '1', '1', '1', '1'] >>> emitter_converter(5, "101010111111") Traceback (most recent call last): ... ValueError: size of parity don't match with size of data """ if size_par + len(data) <= 2**size_par - (len(data) - 1): raise ValueError("size of parity don't match with size of data") data_out = [] parity = [] bin_pos = [bin(x)[2:] for x in range(1, size_par + len(data) + 1)] # sorted information data for the size of the output data data_ord = [] # data position template + parity data_out_gab = [] # parity bit counter qtd_bp = 0 # counter position of data bits cont_data = 0 for x in range(1, size_par + len(data) + 1): # Performs a template of bit positions - who should be given, # and who should be parity if qtd_bp < size_par: if (np.log(x) / np.log(2)).is_integer(): data_out_gab.append("P") qtd_bp = qtd_bp + 1 else: data_out_gab.append("D") else: data_out_gab.append("D") # Sorts the data to the new output size if data_out_gab[-1] == "D": data_ord.append(data[cont_data]) cont_data += 1 else: data_ord.append(None) # Calculates parity qtd_bp = 0 # parity bit counter for bp in range(1, size_par + 1): # Bit counter one for a given parity cont_bo = 0 # counter to control the loop reading for cont_loop, x in enumerate(data_ord): if x is not None: try: aux = (bin_pos[cont_loop])[-1 * (bp)] except IndexError: aux = "0" if aux == "1" and x == "1": cont_bo += 1 parity.append(cont_bo % 2) qtd_bp += 1 # Mount the message cont_bp = 0 # parity bit counter for x in range(size_par + len(data)): if data_ord[x] is None: data_out.append(str(parity[cont_bp])) cont_bp += 1 else: data_out.append(data_ord[x]) return data_out def receptor_converter(size_par, data): """ >>> receptor_converter(4, "1111010010111111") (['1', '0', '1', '0', '1', '0', '1', '1', '1', '1', '1', '1'], True) """ # data position template + parity data_out_gab = [] # Parity bit counter qtd_bp = 0 # Counter p data bit reading cont_data = 0 # list of parity received parity_received = [] data_output = [] for i, item in enumerate(data, 1): # Performs a template of bit positions - who should be given, # and who should be parity if qtd_bp < size_par and (np.log(i) / np.log(2)).is_integer(): data_out_gab.append("P") qtd_bp = qtd_bp + 1 else: data_out_gab.append("D") # Sorts the data to the new output size if data_out_gab[-1] == "D": data_output.append(item) else: parity_received.append(item) # -----------calculates the parity with the data data_out = [] parity = [] bin_pos = [bin(x)[2:] for x in range(1, size_par + len(data_output) + 1)] # sorted information data for the size of the output data data_ord = [] # Data position feedback + parity data_out_gab = [] # Parity bit counter qtd_bp = 0 # Counter p data bit reading cont_data = 0 for x in range(1, size_par + len(data_output) + 1): # Performs a template position of bits - who should be given, # and who should be parity if qtd_bp < size_par and (np.log(x) / np.log(2)).is_integer(): data_out_gab.append("P") qtd_bp = qtd_bp + 1 else: data_out_gab.append("D") # Sorts the data to the new output size if data_out_gab[-1] == "D": data_ord.append(data_output[cont_data]) cont_data += 1 else: data_ord.append(None) # Calculates parity qtd_bp = 0 # parity bit counter for bp in range(1, size_par + 1): # Bit counter one for a certain parity cont_bo = 0 for cont_loop, x in enumerate(data_ord): if x is not None: try: aux = (bin_pos[cont_loop])[-1 * (bp)] except IndexError: aux = "0" if aux == "1" and x == "1": cont_bo += 1 parity.append(str(cont_bo % 2)) qtd_bp += 1 # Mount the message cont_bp = 0 # Parity bit counter for x in range(size_par + len(data_output)): if data_ord[x] is None: data_out.append(str(parity[cont_bp])) cont_bp += 1 else: data_out.append(data_ord[x]) ack = parity_received == parity return data_output, ack # --------------------------------------------------------------------- """ # Example how to use # number of parity bits sizePari = 4 # location of the bit that will be forced an error be = 2 # Message/word to be encoded and decoded with hamming # text = input("Enter the word to be read: ") text = "Message01" # Convert the message to binary binaryText = text_to_bits(text) # Prints the binary of the string print("Text input in binary is '" + binaryText + "'") # total transmitted bits totalBits = len(binaryText) + sizePari print("Size of data is " + str(totalBits)) print("\n --Message exchange--") print("Data to send ------------> " + binaryText) dataOut = emitterConverter(sizePari, binaryText) print("Data converted ----------> " + "".join(dataOut)) dataReceiv, ack = receptorConverter(sizePari, dataOut) print( "Data receive ------------> " + "".join(dataReceiv) + "\t\t -- Data integrity: " + str(ack) ) print("\n --Force error--") print("Data to send ------------> " + binaryText) dataOut = emitterConverter(sizePari, binaryText) print("Data converted ----------> " + "".join(dataOut)) # forces error dataOut[-be] = "1" * (dataOut[-be] == "0") + "0" * (dataOut[-be] == "1") print("Data after transmission -> " + "".join(dataOut)) dataReceiv, ack = receptorConverter(sizePari, dataOut) print( "Data receive ------------> " + "".join(dataReceiv) + "\t\t -- Data integrity: " + str(ack) ) """ ================================================ FILE: hashes/luhn.py ================================================ """Luhn Algorithm""" from __future__ import annotations def is_luhn(string: str) -> bool: """ Perform Luhn validation on an input string Algorithm: * Double every other digit starting from 2nd last digit. * Subtract 9 if number is greater than 9. * Sum the numbers * >>> test_cases = (79927398710, 79927398711, 79927398712, 79927398713, ... 79927398714, 79927398715, 79927398716, 79927398717, 79927398718, ... 79927398719) >>> [is_luhn(str(test_case)) for test_case in test_cases] [False, False, False, True, False, False, False, False, False, False] """ check_digit: int _vector: list[str] = list(string) __vector, check_digit = _vector[:-1], int(_vector[-1]) vector: list[int] = [int(digit) for digit in __vector] vector.reverse() for i, digit in enumerate(vector): if i & 1 == 0: doubled: int = digit * 2 if doubled > 9: doubled -= 9 check_digit += doubled else: check_digit += digit return check_digit % 10 == 0 if __name__ == "__main__": import doctest doctest.testmod() assert is_luhn("79927398713") assert not is_luhn("79927398714") ================================================ FILE: hashes/md5.py ================================================ """ The MD5 algorithm is a hash function that's commonly used as a checksum to detect data corruption. The algorithm works by processing a given message in blocks of 512 bits, padding the message as needed. It uses the blocks to operate a 128-bit state and performs a total of 64 such operations. Note that all values are little-endian, so inputs are converted as needed. Although MD5 was used as a cryptographic hash function in the past, it's since been cracked, so it shouldn't be used for security purposes. For more info, see https://en.wikipedia.org/wiki/MD5 """ from collections.abc import Generator from math import sin def to_little_endian(string_32: bytes) -> bytes: """ Converts the given string to little-endian in groups of 8 chars. Arguments: string_32 {[string]} -- [32-char string] Raises: ValueError -- [input is not 32 char] Returns: 32-char little-endian string >>> to_little_endian(b'1234567890abcdfghijklmnopqrstuvw') b'pqrstuvwhijklmno90abcdfg12345678' >>> to_little_endian(b'1234567890') Traceback (most recent call last): ... ValueError: Input must be of length 32 """ if len(string_32) != 32: raise ValueError("Input must be of length 32") little_endian = b"" for i in [3, 2, 1, 0]: little_endian += string_32[8 * i : 8 * i + 8] return little_endian def reformat_hex(i: int) -> bytes: """ Converts the given non-negative integer to hex string. Example: Suppose the input is the following: i = 1234 The input is 0x000004d2 in hex, so the little-endian hex string is "d2040000". Arguments: i {[int]} -- [integer] Raises: ValueError -- [input is negative] Returns: 8-char little-endian hex string >>> reformat_hex(1234) b'd2040000' >>> reformat_hex(666) b'9a020000' >>> reformat_hex(0) b'00000000' >>> reformat_hex(1234567890) b'd2029649' >>> reformat_hex(1234567890987654321) b'b11c6cb1' >>> reformat_hex(-1) Traceback (most recent call last): ... ValueError: Input must be non-negative """ if i < 0: raise ValueError("Input must be non-negative") hex_rep = format(i, "08x")[-8:] little_endian_hex = b"" for j in [3, 2, 1, 0]: little_endian_hex += hex_rep[2 * j : 2 * j + 2].encode("utf-8") return little_endian_hex def preprocess(message: bytes) -> bytes: """ Preprocesses the message string: - Convert message to bit string - Pad bit string to a multiple of 512 chars: - Append a 1 - Append 0's until length = 448 (mod 512) - Append length of original message (64 chars) Example: Suppose the input is the following: message = "a" The message bit string is "01100001", which is 8 bits long. Thus, the bit string needs 439 bits of padding so that (bit_string + "1" + padding) = 448 (mod 512). The message length is "000010000...0" in 64-bit little-endian binary. The combined bit string is then 512 bits long. Arguments: message {[string]} -- [message string] Returns: processed bit string padded to a multiple of 512 chars >>> preprocess(b"a") == (b"01100001" + b"1" + ... (b"0" * 439) + b"00001000" + (b"0" * 56)) True >>> preprocess(b"") == b"1" + (b"0" * 447) + (b"0" * 64) True """ bit_string = b"" for char in message: bit_string += format(char, "08b").encode("utf-8") start_len = format(len(bit_string), "064b").encode("utf-8") # Pad bit_string to a multiple of 512 chars bit_string += b"1" while len(bit_string) % 512 != 448: bit_string += b"0" bit_string += to_little_endian(start_len[32:]) + to_little_endian(start_len[:32]) return bit_string def get_block_words(bit_string: bytes) -> Generator[list[int]]: """ Splits bit string into blocks of 512 chars and yields each block as a list of 32-bit words Example: Suppose the input is the following: bit_string = "000000000...0" + # 0x00 (32 bits, padded to the right) "000000010...0" + # 0x01 (32 bits, padded to the right) "000000100...0" + # 0x02 (32 bits, padded to the right) "000000110...0" + # 0x03 (32 bits, padded to the right) ... "000011110...0" # 0x0a (32 bits, padded to the right) Then len(bit_string) == 512, so there'll be 1 block. The block is split into 32-bit words, and each word is converted to little endian. The first word is interpreted as 0 in decimal, the second word is interpreted as 1 in decimal, etc. Thus, block_words == [[0, 1, 2, 3, ..., 15]]. Arguments: bit_string {[string]} -- [bit string with multiple of 512 as length] Raises: ValueError -- [length of bit string isn't multiple of 512] Yields: a list of 16 32-bit words >>> test_string = ("".join(format(n << 24, "032b") for n in range(16)) ... .encode("utf-8")) >>> list(get_block_words(test_string)) [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]] >>> list(get_block_words(test_string * 4)) == [list(range(16))] * 4 True >>> list(get_block_words(b"1" * 512)) == [[4294967295] * 16] True >>> list(get_block_words(b"")) [] >>> list(get_block_words(b"1111")) Traceback (most recent call last): ... ValueError: Input must have length that's a multiple of 512 """ if len(bit_string) % 512 != 0: raise ValueError("Input must have length that's a multiple of 512") for pos in range(0, len(bit_string), 512): block = bit_string[pos : pos + 512] block_words = [] for i in range(0, 512, 32): block_words.append(int(to_little_endian(block[i : i + 32]), 2)) yield block_words def not_32(i: int) -> int: """ Perform bitwise NOT on given int. Arguments: i {[int]} -- [given int] Raises: ValueError -- [input is negative] Returns: Result of bitwise NOT on i >>> not_32(34) 4294967261 >>> not_32(1234) 4294966061 >>> not_32(4294966061) 1234 >>> not_32(0) 4294967295 >>> not_32(1) 4294967294 >>> not_32(-1) Traceback (most recent call last): ... ValueError: Input must be non-negative """ if i < 0: raise ValueError("Input must be non-negative") i_str = format(i, "032b") new_str = "" for c in i_str: new_str += "1" if c == "0" else "0" return int(new_str, 2) def sum_32(a: int, b: int) -> int: """ Add two numbers as 32-bit ints. Arguments: a {[int]} -- [first given int] b {[int]} -- [second given int] Returns: (a + b) as an unsigned 32-bit int >>> sum_32(1, 1) 2 >>> sum_32(2, 3) 5 >>> sum_32(0, 0) 0 >>> sum_32(-1, -1) 4294967294 >>> sum_32(4294967295, 1) 0 """ return (a + b) % 2**32 def left_rotate_32(i: int, shift: int) -> int: """ Rotate the bits of a given int left by a given amount. Arguments: i {[int]} -- [given int] shift {[int]} -- [shift amount] Raises: ValueError -- [either given int or shift is negative] Returns: `i` rotated to the left by `shift` bits >>> left_rotate_32(1234, 1) 2468 >>> left_rotate_32(1111, 4) 17776 >>> left_rotate_32(2147483648, 1) 1 >>> left_rotate_32(2147483648, 3) 4 >>> left_rotate_32(4294967295, 4) 4294967295 >>> left_rotate_32(1234, 0) 1234 >>> left_rotate_32(0, 0) 0 >>> left_rotate_32(-1, 0) Traceback (most recent call last): ... ValueError: Input must be non-negative >>> left_rotate_32(0, -1) Traceback (most recent call last): ... ValueError: Shift must be non-negative """ if i < 0: raise ValueError("Input must be non-negative") if shift < 0: raise ValueError("Shift must be non-negative") return ((i << shift) ^ (i >> (32 - shift))) % 2**32 def md5_me(message: bytes) -> bytes: """ Returns the 32-char MD5 hash of a given message. Reference: https://en.wikipedia.org/wiki/MD5#Algorithm Arguments: message {[string]} -- [message] Returns: 32-char MD5 hash string >>> md5_me(b"") b'd41d8cd98f00b204e9800998ecf8427e' >>> md5_me(b"The quick brown fox jumps over the lazy dog") b'9e107d9d372bb6826bd81d3542a419d6' >>> md5_me(b"The quick brown fox jumps over the lazy dog.") b'e4d909c290d0fb1ca068ffaddf22cbd0' >>> import hashlib >>> from string import ascii_letters >>> msgs = [b"", ascii_letters.encode("utf-8"), "Üñîçø∂é".encode("utf-8"), ... b"The quick brown fox jumps over the lazy dog."] >>> all(md5_me(msg) == hashlib.md5(msg).hexdigest().encode("utf-8") for msg in msgs) True """ # Convert to bit string, add padding and append message length bit_string = preprocess(message) added_consts = [int(2**32 * abs(sin(i + 1))) for i in range(64)] # Starting states a0 = 0x67452301 b0 = 0xEFCDAB89 c0 = 0x98BADCFE d0 = 0x10325476 shift_amounts = [ 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, ] # Process bit string in chunks, each with 16 32-char words for block_words in get_block_words(bit_string): a = a0 b = b0 c = c0 d = d0 # Hash current chunk for i in range(64): if i <= 15: # f = (b & c) | (not_32(b) & d) # Alternate definition for f f = d ^ (b & (c ^ d)) g = i elif i <= 31: # f = (d & b) | (not_32(d) & c) # Alternate definition for f f = c ^ (d & (b ^ c)) g = (5 * i + 1) % 16 elif i <= 47: f = b ^ c ^ d g = (3 * i + 5) % 16 else: f = c ^ (b | not_32(d)) g = (7 * i) % 16 f = (f + a + added_consts[i] + block_words[g]) % 2**32 a = d d = c c = b b = sum_32(b, left_rotate_32(f, shift_amounts[i])) # Add hashed chunk to running total a0 = sum_32(a0, a) b0 = sum_32(b0, b) c0 = sum_32(c0, c) d0 = sum_32(d0, d) digest = reformat_hex(a0) + reformat_hex(b0) + reformat_hex(c0) + reformat_hex(d0) return digest if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: hashes/sdbm.py ================================================ """ This algorithm was created for sdbm (a public-domain reimplementation of ndbm) database library. It was found to do well in scrambling bits, causing better distribution of the keys and fewer splits. It also happens to be a good general hashing function with good distribution. The actual function (pseudo code) is: for i in i..len(str): hash(i) = hash(i - 1) * 65599 + str[i]; What is included below is the faster version used in gawk. [there is even a faster, duff-device version] The magic constant 65599 was picked out of thin air while experimenting with different constants. It turns out to be a prime. This is one of the algorithms used in berkeley db (see sleepycat) and elsewhere. source: http://www.cse.yorku.ca/~oz/hash.html """ def sdbm(plain_text: str) -> int: """ Function implements sdbm hash, easy to use, great for bits scrambling. iterates over each character in the given string and applies function to each of them. >>> sdbm('Algorithms') 1462174910723540325254304520539387479031000036 >>> sdbm('scramble bits') 730247649148944819640658295400555317318720608290373040936089 """ hash_value = 0 for plain_chr in plain_text: hash_value = ( ord(plain_chr) + (hash_value << 6) + (hash_value << 16) - hash_value ) return hash_value ================================================ FILE: hashes/sha1.py ================================================ """ Implementation of the SHA1 hash function and gives utilities to find hash of string or hash of text from a file. Also contains a Test class to verify that the generated hash matches what is returned by the hashlib library Usage: python sha1.py --string "Hello World!!" python sha1.py --file "hello_world.txt" When run without any arguments, it prints the hash of the string "Hello World!! Welcome to Cryptography" SHA1 hash or SHA1 sum of a string is a cryptographic function, which means it is easy to calculate forwards but extremely difficult to calculate backwards. What this means is you can easily calculate the hash of a string, but it is extremely difficult to know the original string if you have its hash. This property is useful for communicating securely, send encrypted messages and is very useful in payment systems, blockchain and cryptocurrency etc. The algorithm as described in the reference: First we start with a message. The message is padded and the length of the message is added to the end. It is then split into blocks of 512 bits or 64 bytes. The blocks are then processed one at a time. Each block must be expanded and compressed. The value after each compression is added to a 160-bit buffer called the current hash state. After the last block is processed, the current hash state is returned as the final hash. Reference: https://deadhacker.com/2006/02/21/sha-1-illustrated/ """ import argparse import hashlib # hashlib is only used inside the Test class import struct class SHA1Hash: """ Class to contain the entire pipeline for SHA1 hashing algorithm >>> SHA1Hash(bytes('Allan', 'utf-8')).final_hash() '872af2d8ac3d8695387e7c804bf0e02c18df9e6e' """ def __init__(self, data): """ Initiates the variables data and h. h is a list of 5 8-digit hexadecimal numbers corresponding to (1732584193, 4023233417, 2562383102, 271733878, 3285377520) respectively. We will start with this as a message digest. 0x is how you write hexadecimal numbers in Python """ self.data = data self.h = [0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0] @staticmethod def rotate(n, b): """ Static method to be used inside other methods. Left rotates n by b. >>> SHA1Hash('').rotate(12,2) 48 """ return ((n << b) | (n >> (32 - b))) & 0xFFFFFFFF def padding(self): """ Pads the input message with zeros so that padded_data has 64 bytes or 512 bits """ padding = b"\x80" + b"\x00" * (63 - (len(self.data) + 8) % 64) padded_data = self.data + padding + struct.pack(">Q", 8 * len(self.data)) return padded_data def split_blocks(self): """ Returns a list of bytestrings each of length 64 """ return [ self.padded_data[i : i + 64] for i in range(0, len(self.padded_data), 64) ] # @staticmethod def expand_block(self, block): """ Takes a bytestring-block of length 64, unpacks it to a list of integers and returns a list of 80 integers after some bit operations """ w = list(struct.unpack(">16L", block)) + [0] * 64 for i in range(16, 80): w[i] = self.rotate((w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]), 1) return w def final_hash(self): """ Calls all the other methods to process the input. Pads the data, then splits into blocks and then does a series of operations for each block (including expansion). For each block, the variable h that was initialized is copied to a,b,c,d,e and these 5 variables a,b,c,d,e undergo several changes. After all the blocks are processed, these 5 variables are pairwise added to h ie a to h[0], b to h[1] and so on. This h becomes our final hash which is returned. """ self.padded_data = self.padding() self.blocks = self.split_blocks() for block in self.blocks: expanded_block = self.expand_block(block) a, b, c, d, e = self.h for i in range(80): if 0 <= i < 20: f = (b & c) | ((~b) & d) k = 0x5A827999 elif 20 <= i < 40: f = b ^ c ^ d k = 0x6ED9EBA1 elif 40 <= i < 60: f = (b & c) | (b & d) | (c & d) k = 0x8F1BBCDC elif 60 <= i < 80: f = b ^ c ^ d k = 0xCA62C1D6 a, b, c, d, e = ( self.rotate(a, 5) + f + e + k + expanded_block[i] & 0xFFFFFFFF, a, self.rotate(b, 30), c, d, ) self.h = ( self.h[0] + a & 0xFFFFFFFF, self.h[1] + b & 0xFFFFFFFF, self.h[2] + c & 0xFFFFFFFF, self.h[3] + d & 0xFFFFFFFF, self.h[4] + e & 0xFFFFFFFF, ) return ("{:08x}" * 5).format(*self.h) def test_sha1_hash(): msg = b"Test String" assert SHA1Hash(msg).final_hash() == hashlib.sha1(msg).hexdigest() # noqa: S324 def main(): """ Provides option 'string' or 'file' to take input and prints the calculated SHA1 hash. unittest.main() has been commented out because we probably don't want to run the test each time. """ # unittest.main() parser = argparse.ArgumentParser(description="Process some strings or files") parser.add_argument( "--string", dest="input_string", default="Hello World!! Welcome to Cryptography", help="Hash the string", ) parser.add_argument("--file", dest="input_file", help="Hash contents of a file") args = parser.parse_args() input_string = args.input_string # In any case hash input should be a bytestring if args.input_file: with open(args.input_file, "rb") as f: hash_input = f.read() else: hash_input = bytes(input_string, "utf-8") print(SHA1Hash(hash_input).final_hash()) if __name__ == "__main__": main() import doctest doctest.testmod() ================================================ FILE: hashes/sha256.py ================================================ # Author: M. Yathurshan # Black Formatter: True """ Implementation of SHA256 Hash function in a Python class and provides utilities to find hash of string or hash of text from a file. Usage: python sha256.py --string "Hello World!!" python sha256.py --file "hello_world.txt" When run without any arguments, it prints the hash of the string "Hello World!! Welcome to Cryptography" References: https://qvault.io/cryptography/how-sha-2-works-step-by-step-sha-256/ https://en.wikipedia.org/wiki/SHA-2 """ import argparse import struct import unittest class SHA256: """ Class to contain the entire pipeline for SHA1 Hashing Algorithm >>> SHA256(b'Python').hash '18885f27b5af9012df19e496460f9294d5ab76128824c6f993787004f6d9a7db' >>> SHA256(b'hello world').hash 'b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9' """ def __init__(self, data: bytes) -> None: self.data = data # Initialize hash values self.hashes = [ 0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19, ] # Initialize round constants self.round_constants = [ 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2, ] self.preprocessed_data = self.preprocessing(self.data) self.final_hash() @staticmethod def preprocessing(data: bytes) -> bytes: padding = b"\x80" + (b"\x00" * (63 - (len(data) + 8) % 64)) big_endian_integer = struct.pack(">Q", (len(data) * 8)) return data + padding + big_endian_integer def final_hash(self) -> None: # Convert into blocks of 64 bytes self.blocks = [ self.preprocessed_data[x : x + 64] for x in range(0, len(self.preprocessed_data), 64) ] for block in self.blocks: # Convert the given block into a list of 4 byte integers words = list(struct.unpack(">16L", block)) # add 48 0-ed integers words += [0] * 48 a, b, c, d, e, f, g, h = self.hashes for index in range(64): if index > 15: # modify the zero-ed indexes at the end of the array s0 = ( self.ror(words[index - 15], 7) ^ self.ror(words[index - 15], 18) ^ (words[index - 15] >> 3) ) s1 = ( self.ror(words[index - 2], 17) ^ self.ror(words[index - 2], 19) ^ (words[index - 2] >> 10) ) words[index] = ( words[index - 16] + s0 + words[index - 7] + s1 ) % 0x100000000 # Compression s1 = self.ror(e, 6) ^ self.ror(e, 11) ^ self.ror(e, 25) ch = (e & f) ^ ((~e & (0xFFFFFFFF)) & g) temp1 = ( h + s1 + ch + self.round_constants[index] + words[index] ) % 0x100000000 s0 = self.ror(a, 2) ^ self.ror(a, 13) ^ self.ror(a, 22) maj = (a & b) ^ (a & c) ^ (b & c) temp2 = (s0 + maj) % 0x100000000 h, g, f, e, d, c, b, a = ( g, f, e, ((d + temp1) % 0x100000000), c, b, a, ((temp1 + temp2) % 0x100000000), ) mutated_hash_values = [a, b, c, d, e, f, g, h] # Modify final values self.hashes = [ ((element + mutated_hash_values[index]) % 0x100000000) for index, element in enumerate(self.hashes) ] self.hash = "".join([hex(value)[2:].zfill(8) for value in self.hashes]) def ror(self, value: int, rotations: int) -> int: """ Right rotate a given unsigned number by a certain amount of rotations """ return 0xFFFFFFFF & (value << (32 - rotations)) | (value >> rotations) class SHA256HashTest(unittest.TestCase): """ Test class for the SHA256 class. Inherits the TestCase class from unittest """ def test_match_hashes(self) -> None: import hashlib msg = bytes("Test String", "utf-8") assert SHA256(msg).hash == hashlib.sha256(msg).hexdigest() def main() -> None: """ Provides option 'string' or 'file' to take input and prints the calculated SHA-256 hash """ # unittest.main() import doctest doctest.testmod() parser = argparse.ArgumentParser() parser.add_argument( "-s", "--string", dest="input_string", default="Hello World!! Welcome to Cryptography", help="Hash the string", ) parser.add_argument( "-f", "--file", dest="input_file", help="Hash contents of a file" ) args = parser.parse_args() input_string = args.input_string # hash input should be a bytestring if args.input_file: with open(args.input_file, "rb") as f: hash_input = f.read() else: hash_input = bytes(input_string, "utf-8") print(SHA256(hash_input).hash) if __name__ == "__main__": main() ================================================ FILE: index.md ================================================ # TheAlgorithms/Python ```{toctree} :maxdepth: 2 :caption: index.md CONTRIBUTING.md README.md LICENSE.md ``` ================================================ FILE: knapsack/README.md ================================================ # A recursive implementation of 0-N Knapsack Problem This overview is taken from: https://en.wikipedia.org/wiki/Knapsack_problem --- ## Overview The knapsack problem is a problem in combinatorial optimization: Given a set of items, each with a weight and a value, determine the number of each item to include in a collection so that the total weight is less than or equal to a given limit and the total value is as large as possible. It derives its name from the problem faced by someone who is constrained by a fixed-size knapsack and must fill it with the most valuable items. The problem often arises in resource allocation where the decision makers have to choose from a set of non-divisible projects or tasks under a fixed budget or time constraint, respectively. The knapsack problem has been studied for more than a century, with early works dating as far back as 1897 The name "knapsack problem" dates back to the early works of mathematician Tobias Dantzig (1884–1956), and refers to the commonplace problem of packing the most valuable or useful items without overloading the luggage. --- ## Documentation This module uses docstrings to enable the use of Python's in-built `help(...)` function. For instance, try `help(Vector)`, `help(unit_basis_vector)`, and `help(CLASSNAME.METHODNAME)`. --- ## Usage Import the module `knapsack.py` from the **.** directory into your project. --- ## Tests `.` contains Python unit tests which can be run with `python3 -m unittest -v`. ================================================ FILE: knapsack/__init__.py ================================================ ================================================ FILE: knapsack/greedy_knapsack.py ================================================ # To get an insight into Greedy Algorithm through the Knapsack problem """ A shopkeeper has bags of wheat that each have different weights and different profits. eg. profit 5 8 7 1 12 3 4 weight 2 7 1 6 4 2 5 max_weight 100 Constraints: max_weight > 0 profit[i] >= 0 weight[i] >= 0 Calculate the maximum profit that the shopkeeper can make given maxmum weight that can be carried. """ def calc_profit(profit: list, weight: list, max_weight: int) -> int: """ Function description is as follows- :param profit: Take a list of profits :param weight: Take a list of weight if bags corresponding to the profits :param max_weight: Maximum weight that could be carried :return: Maximum expected gain >>> calc_profit([1, 2, 3], [3, 4, 5], 15) 6 >>> calc_profit([10, 9 , 8], [3 ,4 , 5], 25) 27 """ if len(profit) != len(weight): raise ValueError("The length of profit and weight must be same.") if max_weight <= 0: raise ValueError("max_weight must greater than zero.") if any(p < 0 for p in profit): raise ValueError("Profit can not be negative.") if any(w < 0 for w in weight): raise ValueError("Weight can not be negative.") # List created to store profit gained for the 1kg in case of each weight # respectively. Calculate and append profit/weight for each element. profit_by_weight = [p / w for p, w in zip(profit, weight)] # Creating a copy of the list and sorting profit/weight in ascending order sorted_profit_by_weight = sorted(profit_by_weight) # declaring useful variables length = len(sorted_profit_by_weight) limit = 0 gain = 0 i = 0 # loop till the total weight do not reach max limit e.g. 15 kg and till i= weight[index]: limit += weight[index] # Adding profit gained for the given weight 1 === # weight[index]/weight[index] gain += 1 * profit[index] else: # Since the weight encountered is greater than limit, therefore take the # required number of remaining kgs and calculate profit for it. # weight remaining / weight[index] gain += (max_weight - limit) / weight[index] * profit[index] break i += 1 return gain if __name__ == "__main__": print( "Input profits, weights, and then max_weight (all positive ints) separated by " "spaces." ) profit = [int(x) for x in input("Input profits separated by spaces: ").split()] weight = [int(x) for x in input("Input weights separated by spaces: ").split()] max_weight = int(input("Max weight allowed: ")) # Function Call calc_profit(profit, weight, max_weight) ================================================ FILE: knapsack/knapsack.py ================================================ """A recursive implementation of 0-N Knapsack Problem https://en.wikipedia.org/wiki/Knapsack_problem """ from __future__ import annotations from functools import lru_cache def knapsack( capacity: int, weights: list[int], values: list[int], counter: int, allow_repetition=False, ) -> int: """ Returns the maximum value that can be put in a knapsack of a capacity cap, whereby each weight w has a specific value val with option to allow repetitive selection of items >>> cap = 50 >>> val = [60, 100, 120] >>> w = [10, 20, 30] >>> c = len(val) >>> knapsack(cap, w, val, c) 220 Given the repetition is NOT allowed, the result is 220 cause the values of 100 and 120 got the weight of 50 which is the limit of the capacity. >>> knapsack(cap, w, val, c, True) 300 Given the repetition is allowed, the result is 300 cause the values of 60*5 (pick 5 times) got the weight of 10*5 which is the limit of the capacity. """ @lru_cache def knapsack_recur(capacity: int, counter: int) -> int: # Base Case if counter == 0 or capacity == 0: return 0 # If weight of the nth item is more than Knapsack of capacity, # then this item cannot be included in the optimal solution, # else return the maximum of two cases: # (1) nth item included only once (0-1), if allow_repetition is False # nth item included one or more times (0-N), if allow_repetition is True # (2) not included if weights[counter - 1] > capacity: return knapsack_recur(capacity, counter - 1) else: left_capacity = capacity - weights[counter - 1] new_value_included = values[counter - 1] + knapsack_recur( left_capacity, counter - 1 if not allow_repetition else counter ) without_new_value = knapsack_recur(capacity, counter - 1) return max(new_value_included, without_new_value) return knapsack_recur(capacity, counter) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: knapsack/recursive_approach_knapsack.py ================================================ # To get an insight into naive recursive way to solve the Knapsack problem """ A shopkeeper has bags of wheat that each have different weights and different profits. eg. no_of_items 4 profit 5 4 8 6 weight 1 2 4 5 max_weight 5 Constraints: max_weight > 0 profit[i] >= 0 weight[i] >= 0 Calculate the maximum profit that the shopkeeper can make given maxmum weight that can be carried. """ def knapsack( weights: list, values: list, number_of_items: int, max_weight: int, index: int ) -> int: """ Function description is as follows- :param weights: Take a list of weights :param values: Take a list of profits corresponding to the weights :param number_of_items: number of items available to pick from :param max_weight: Maximum weight that could be carried :param index: the element we are looking at :return: Maximum expected gain >>> knapsack([1, 2, 4, 5], [5, 4, 8, 6], 4, 5, 0) 13 >>> knapsack([3 ,4 , 5], [10, 9 , 8], 3, 25, 0) 27 """ if index == number_of_items: return 0 ans1 = 0 ans2 = 0 ans1 = knapsack(weights, values, number_of_items, max_weight, index + 1) if weights[index] <= max_weight: ans2 = values[index] + knapsack( weights, values, number_of_items, max_weight - weights[index], index + 1 ) return max(ans1, ans2) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: knapsack/tests/__init__.py ================================================ ================================================ FILE: knapsack/tests/test_greedy_knapsack.py ================================================ import unittest import pytest from knapsack import greedy_knapsack as kp class TestClass(unittest.TestCase): """ Test cases for knapsack """ def test_sorted(self): """ kp.calc_profit takes the required argument (profit, weight, max_weight) and returns whether the answer matches to the expected ones """ profit = [10, 20, 30, 40, 50, 60] weight = [2, 4, 6, 8, 10, 12] max_weight = 100 assert kp.calc_profit(profit, weight, max_weight) == 210 def test_negative_max_weight(self): """ Returns ValueError for any negative max_weight value :return: ValueError """ # profit = [10, 20, 30, 40, 50, 60] # weight = [2, 4, 6, 8, 10, 12] # max_weight = -15 pytest.raises(ValueError, match=r"max_weight must greater than zero.") def test_negative_profit_value(self): """ Returns ValueError for any negative profit value in the list :return: ValueError """ # profit = [10, -20, 30, 40, 50, 60] # weight = [2, 4, 6, 8, 10, 12] # max_weight = 15 pytest.raises(ValueError, match=r"Weight can not be negative.") def test_negative_weight_value(self): """ Returns ValueError for any negative weight value in the list :return: ValueError """ # profit = [10, 20, 30, 40, 50, 60] # weight = [2, -4, 6, -8, 10, 12] # max_weight = 15 pytest.raises(ValueError, match=r"Profit can not be negative.") def test_null_max_weight(self): """ Returns ValueError for any zero max_weight value :return: ValueError """ # profit = [10, 20, 30, 40, 50, 60] # weight = [2, 4, 6, 8, 10, 12] # max_weight = null pytest.raises(ValueError, match=r"max_weight must greater than zero.") def test_unequal_list_length(self): """ Returns IndexError if length of lists (profit and weight) are unequal. :return: IndexError """ # profit = [10, 20, 30, 40, 50] # weight = [2, 4, 6, 8, 10, 12] # max_weight = 100 pytest.raises( IndexError, match=r"The length of profit and weight must be same." ) if __name__ == "__main__": unittest.main() ================================================ FILE: knapsack/tests/test_knapsack.py ================================================ """ Created on Fri Oct 16 09:31:07 2020 @author: Dr. Tobias Schröder @license: MIT-license This file contains the test-suite for the knapsack problem. """ import unittest from knapsack import knapsack as k class Test(unittest.TestCase): def test_base_case(self): """ test for the base case """ cap = 0 val = [0] w = [0] c = len(val) assert k.knapsack(cap, w, val, c) == 0 val = [60] w = [10] c = len(val) assert k.knapsack(cap, w, val, c) == 0 def test_easy_case(self): """ test for the easy case """ cap = 3 val = [1, 2, 3] w = [3, 2, 1] c = len(val) assert k.knapsack(cap, w, val, c) == 5 def test_knapsack(self): """ test for the knapsack """ cap = 50 val = [60, 100, 120] w = [10, 20, 30] c = len(val) assert k.knapsack(cap, w, val, c) == 220 def test_knapsack_repetition(self): """ test for the knapsack repetition """ cap = 50 val = [60, 100, 120] w = [10, 20, 30] c = len(val) assert k.knapsack(cap, w, val, c, True) == 300 if __name__ == "__main__": unittest.main() ================================================ FILE: linear_algebra/README.md ================================================ # Linear algebra library for Python This module contains classes and functions for doing linear algebra. --- ## Overview ### class Vector - - This class represents a vector of arbitrary size and related operations. **Overview of the methods:** - constructor(components) : init the vector - set(components) : changes the vector components. - \_\_str\_\_() : toString method - component(i): gets the i-th component (0-indexed) - \_\_len\_\_() : gets the size / length of the vector (number of components) - euclidean_length() : returns the eulidean length of the vector - operator + : vector addition - operator - : vector subtraction - operator * : scalar multiplication and dot product - copy() : copies this vector and returns it - change_component(pos,value) : changes the specified component - function zero_vector(dimension) - returns a zero vector of 'dimension' - function unit_basis_vector(dimension, pos) - returns a unit basis vector with a one at index 'pos' (0-indexed) - function axpy(scalar, vector1, vector2) - computes the axpy operation - function random_vector(N, a, b) - returns a random vector of size N, with random integer components between 'a' and 'b' inclusive ### class Matrix - - This class represents a matrix of arbitrary size and operations on it. **Overview of the methods:** - \_\_str\_\_() : returns a string representation - operator * : implements the matrix vector multiplication implements the matrix-scalar multiplication. - change_component(x, y, value) : changes the specified component. - component(x, y) : returns the specified component. - width() : returns the width of the matrix - height() : returns the height of the matrix - determinant() : returns the determinant of the matrix if it is square - operator + : implements the matrix-addition. - operator - : implements the matrix-subtraction - function square_zero_matrix(N) - returns a square zero-matrix of dimension NxN - function random_matrix(W, H, a, b) - returns a random matrix WxH with integer components between 'a' and 'b' inclusive --- ## Documentation This module uses docstrings to enable the use of Python's in-built `help(...)` function. For instance, try `help(Vector)`, `help(unit_basis_vector)`, and `help(CLASSNAME.METHODNAME)`. --- ## Usage Import the module `lib.py` from the **src** directory into your project. Alternatively, you can directly use the Python bytecode file `lib.pyc`. --- ## Tests `src/tests.py` contains Python unit tests which can be run with `python3 -m unittest -v`. ================================================ FILE: linear_algebra/__init__.py ================================================ ================================================ FILE: linear_algebra/gaussian_elimination.py ================================================ """ | Gaussian elimination method for solving a system of linear equations. | Gaussian elimination - https://en.wikipedia.org/wiki/Gaussian_elimination """ import numpy as np from numpy import float64 from numpy.typing import NDArray def retroactive_resolution( coefficients: NDArray[float64], vector: NDArray[float64] ) -> NDArray[float64]: """ This function performs a retroactive linear system resolution for triangular matrix Examples: 1. * 2x1 + 2x2 - 1x3 = 5 * 0x1 - 2x2 - 1x3 = -7 * 0x1 + 0x2 + 5x3 = 15 2. * 2x1 + 2x2 = -1 * 0x1 - 2x2 = -1 >>> gaussian_elimination([[2, 2, -1], [0, -2, -1], [0, 0, 5]], [[5], [-7], [15]]) array([[2.], [2.], [3.]]) >>> gaussian_elimination([[2, 2], [0, -2]], [[-1], [-1]]) array([[-1. ], [ 0.5]]) """ rows, _columns = np.shape(coefficients) x: NDArray[float64] = np.zeros((rows, 1), dtype=float) for row in reversed(range(rows)): total = np.dot(coefficients[row, row + 1 :], x[row + 1 :]) x[row, 0] = (vector[row][0] - total[0]) / coefficients[row, row] return x def gaussian_elimination( coefficients: NDArray[float64], vector: NDArray[float64] ) -> NDArray[float64]: """ This function performs Gaussian elimination method Examples: 1. * 1x1 - 4x2 - 2x3 = -2 * 5x1 + 2x2 - 2x3 = -3 * 1x1 - 1x2 + 0x3 = 4 2. * 1x1 + 2x2 = 5 * 5x1 + 2x2 = 5 >>> gaussian_elimination([[1, -4, -2], [5, 2, -2], [1, -1, 0]], [[-2], [-3], [4]]) array([[ 2.3 ], [-1.7 ], [ 5.55]]) >>> gaussian_elimination([[1, 2], [5, 2]], [[5], [5]]) array([[0. ], [2.5]]) """ # coefficients must to be a square matrix so we need to check first rows, columns = np.shape(coefficients) if rows != columns: return np.array((), dtype=float) # augmented matrix augmented_mat: NDArray[float64] = np.concatenate((coefficients, vector), axis=1) augmented_mat = augmented_mat.astype("float64") # scale the matrix leaving it triangular for row in range(rows - 1): pivot = augmented_mat[row, row] for col in range(row + 1, columns): factor = augmented_mat[col, row] / pivot augmented_mat[col, :] -= factor * augmented_mat[row, :] x = retroactive_resolution( augmented_mat[:, 0:columns], augmented_mat[:, columns : columns + 1] ) return x if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: linear_algebra/jacobi_iteration_method.py ================================================ """ Jacobi Iteration Method - https://en.wikipedia.org/wiki/Jacobi_method """ from __future__ import annotations import numpy as np from numpy import float64 from numpy.typing import NDArray # Method to find solution of system of linear equations def jacobi_iteration_method( coefficient_matrix: NDArray[float64], constant_matrix: NDArray[float64], init_val: list[float], iterations: int, ) -> list[float]: """ Jacobi Iteration Method: An iterative algorithm to determine the solutions of strictly diagonally dominant system of linear equations 4x1 + x2 + x3 = 2 x1 + 5x2 + 2x3 = -6 x1 + 2x2 + 4x3 = -4 x_init = [0.5, -0.5 , -0.5] Examples: >>> coefficient = np.array([[4, 1, 1], [1, 5, 2], [1, 2, 4]]) >>> constant = np.array([[2], [-6], [-4]]) >>> init_val = [0.5, -0.5, -0.5] >>> iterations = 3 >>> jacobi_iteration_method(coefficient, constant, init_val, iterations) [0.909375, -1.14375, -0.7484375] >>> coefficient = np.array([[4, 1, 1], [1, 5, 2]]) >>> constant = np.array([[2], [-6], [-4]]) >>> init_val = [0.5, -0.5, -0.5] >>> iterations = 3 >>> jacobi_iteration_method(coefficient, constant, init_val, iterations) Traceback (most recent call last): ... ValueError: Coefficient matrix dimensions must be nxn but received 2x3 >>> coefficient = np.array([[4, 1, 1], [1, 5, 2], [1, 2, 4]]) >>> constant = np.array([[2], [-6]]) >>> init_val = [0.5, -0.5, -0.5] >>> iterations = 3 >>> jacobi_iteration_method( ... coefficient, constant, init_val, iterations ... ) # doctest: +NORMALIZE_WHITESPACE Traceback (most recent call last): ... ValueError: Coefficient and constant matrices dimensions must be nxn and nx1 but received 3x3 and 2x1 >>> coefficient = np.array([[4, 1, 1], [1, 5, 2], [1, 2, 4]]) >>> constant = np.array([[2], [-6], [-4]]) >>> init_val = [0.5, -0.5] >>> iterations = 3 >>> jacobi_iteration_method( ... coefficient, constant, init_val, iterations ... ) # doctest: +NORMALIZE_WHITESPACE Traceback (most recent call last): ... ValueError: Number of initial values must be equal to number of rows in coefficient matrix but received 2 and 3 >>> coefficient = np.array([[4, 1, 1], [1, 5, 2], [1, 2, 4]]) >>> constant = np.array([[2], [-6], [-4]]) >>> init_val = [0.5, -0.5, -0.5] >>> iterations = 0 >>> jacobi_iteration_method(coefficient, constant, init_val, iterations) Traceback (most recent call last): ... ValueError: Iterations must be at least 1 """ rows1, cols1 = coefficient_matrix.shape rows2, cols2 = constant_matrix.shape if rows1 != cols1: msg = f"Coefficient matrix dimensions must be nxn but received {rows1}x{cols1}" raise ValueError(msg) if cols2 != 1: msg = f"Constant matrix must be nx1 but received {rows2}x{cols2}" raise ValueError(msg) if rows1 != rows2: msg = ( "Coefficient and constant matrices dimensions must be nxn and nx1 but " f"received {rows1}x{cols1} and {rows2}x{cols2}" ) raise ValueError(msg) if len(init_val) != rows1: msg = ( "Number of initial values must be equal to number of rows in coefficient " f"matrix but received {len(init_val)} and {rows1}" ) raise ValueError(msg) if iterations <= 0: raise ValueError("Iterations must be at least 1") table: NDArray[float64] = np.concatenate( (coefficient_matrix, constant_matrix), axis=1 ) rows, _cols = table.shape strictly_diagonally_dominant(table) """ # Iterates the whole matrix for given number of times for _ in range(iterations): new_val = [] for row in range(rows): temp = 0 for col in range(cols): if col == row: denom = table[row][col] elif col == cols - 1: val = table[row][col] else: temp += (-1) * table[row][col] * init_val[col] temp = (temp + val) / denom new_val.append(temp) init_val = new_val """ # denominator - a list of values along the diagonal denominator = np.diag(coefficient_matrix) # val_last - values of the last column of the table array val_last = table[:, -1] # masks - boolean mask of all strings without diagonal # elements array coefficient_matrix masks = ~np.eye(coefficient_matrix.shape[0], dtype=bool) # no_diagonals - coefficient_matrix array values without diagonal elements no_diagonals = coefficient_matrix[masks].reshape(-1, rows - 1) # Here we get 'i_col' - these are the column numbers, for each row # without diagonal elements, except for the last column. _i_row, i_col = np.where(masks) ind = i_col.reshape(-1, rows - 1) #'i_col' is converted to a two-dimensional list 'ind', which will be # used to make selections from 'init_val' ('arr' array see below). # Iterates the whole matrix for given number of times for _ in range(iterations): arr = np.take(init_val, ind) sum_product_rows = np.sum((-1) * no_diagonals * arr, axis=1) new_val = (sum_product_rows + val_last) / denominator init_val = new_val return new_val.tolist() # Checks if the given matrix is strictly diagonally dominant def strictly_diagonally_dominant(table: NDArray[float64]) -> bool: """ >>> table = np.array([[4, 1, 1, 2], [1, 5, 2, -6], [1, 2, 4, -4]]) >>> strictly_diagonally_dominant(table) True >>> table = np.array([[4, 1, 1, 2], [1, 5, 2, -6], [1, 2, 3, -4]]) >>> strictly_diagonally_dominant(table) Traceback (most recent call last): ... ValueError: Coefficient matrix is not strictly diagonally dominant """ rows, cols = table.shape is_diagonally_dominant = True for i in range(rows): total = 0 for j in range(cols - 1): if i == j: continue else: total += table[i][j] if table[i][i] <= total: raise ValueError("Coefficient matrix is not strictly diagonally dominant") return is_diagonally_dominant # Test Cases if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: linear_algebra/lu_decomposition.py ================================================ """ Lower-upper (LU) decomposition factors a matrix as a product of a lower triangular matrix and an upper triangular matrix. A square matrix has an LU decomposition under the following conditions: - If the matrix is invertible, then it has an LU decomposition if and only if all of its leading principal minors are non-zero (see https://en.wikipedia.org/wiki/Minor_(linear_algebra) for an explanation of leading principal minors of a matrix). - If the matrix is singular (i.e., not invertible) and it has a rank of k (i.e., it has k linearly independent columns), then it has an LU decomposition if its first k leading principal minors are non-zero. This algorithm will simply attempt to perform LU decomposition on any square matrix and raise an error if no such decomposition exists. Reference: https://en.wikipedia.org/wiki/LU_decomposition """ from __future__ import annotations import numpy as np def lower_upper_decomposition(table: np.ndarray) -> tuple[np.ndarray, np.ndarray]: """ Perform LU decomposition on a given matrix and raises an error if the matrix isn't square or if no such decomposition exists >>> matrix = np.array([[2, -2, 1], [0, 1, 2], [5, 3, 1]]) >>> lower_mat, upper_mat = lower_upper_decomposition(matrix) >>> lower_mat array([[1. , 0. , 0. ], [0. , 1. , 0. ], [2.5, 8. , 1. ]]) >>> upper_mat array([[ 2. , -2. , 1. ], [ 0. , 1. , 2. ], [ 0. , 0. , -17.5]]) >>> matrix = np.array([[4, 3], [6, 3]]) >>> lower_mat, upper_mat = lower_upper_decomposition(matrix) >>> lower_mat array([[1. , 0. ], [1.5, 1. ]]) >>> upper_mat array([[ 4. , 3. ], [ 0. , -1.5]]) >>> # Matrix is not square >>> matrix = np.array([[2, -2, 1], [0, 1, 2]]) >>> lower_mat, upper_mat = lower_upper_decomposition(matrix) Traceback (most recent call last): ... ValueError: 'table' has to be of square shaped array but got a 2x3 array: [[ 2 -2 1] [ 0 1 2]] >>> # Matrix is invertible, but its first leading principal minor is 0 >>> matrix = np.array([[0, 1], [1, 0]]) >>> lower_mat, upper_mat = lower_upper_decomposition(matrix) Traceback (most recent call last): ... ArithmeticError: No LU decomposition exists >>> # Matrix is singular, but its first leading principal minor is 1 >>> matrix = np.array([[1, 0], [1, 0]]) >>> lower_mat, upper_mat = lower_upper_decomposition(matrix) >>> lower_mat array([[1., 0.], [1., 1.]]) >>> upper_mat array([[1., 0.], [0., 0.]]) >>> # Matrix is singular, but its first leading principal minor is 0 >>> matrix = np.array([[0, 1], [0, 1]]) >>> lower_mat, upper_mat = lower_upper_decomposition(matrix) Traceback (most recent call last): ... ArithmeticError: No LU decomposition exists """ # Ensure that table is a square array rows, columns = np.shape(table) if rows != columns: msg = ( "'table' has to be of square shaped array but got a " f"{rows}x{columns} array:\n{table}" ) raise ValueError(msg) lower = np.zeros((rows, columns)) upper = np.zeros((rows, columns)) # in 'total', the necessary data is extracted through slices # and the sum of the products is obtained. for i in range(columns): for j in range(i): total = np.sum(lower[i, :i] * upper[:i, j]) if upper[j][j] == 0: raise ArithmeticError("No LU decomposition exists") lower[i][j] = (table[i][j] - total) / upper[j][j] lower[i][i] = 1 for j in range(i, columns): total = np.sum(lower[i, :i] * upper[:i, j]) upper[i][j] = table[i][j] - total return lower, upper if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: linear_algebra/matrix_inversion.py ================================================ import numpy as np def invert_matrix(matrix: list[list[float]]) -> list[list[float]]: """ Returns the inverse of a square matrix using NumPy. Parameters: matrix (list[list[float]]): A square matrix. Returns: list[list[float]]: Inverted matrix if invertible, else raises error. >>> invert_matrix([[4.0, 7.0], [2.0, 6.0]]) [[0.6000000000000001, -0.7000000000000001], [-0.2, 0.4]] >>> invert_matrix([[1.0, 2.0], [0.0, 0.0]]) Traceback (most recent call last): ... ValueError: Matrix is not invertible """ np_matrix = np.array(matrix) try: inv_matrix = np.linalg.inv(np_matrix) except np.linalg.LinAlgError: raise ValueError("Matrix is not invertible") return inv_matrix.tolist() if __name__ == "__main__": mat = [[4.0, 7.0], [2.0, 6.0]] print("Original Matrix:") print(mat) print("Inverted Matrix:") print(invert_matrix(mat)) ================================================ FILE: linear_algebra/src/__init__.py ================================================ ================================================ FILE: linear_algebra/src/conjugate_gradient.py ================================================ """ Resources: - https://en.wikipedia.org/wiki/Conjugate_gradient_method - https://en.wikipedia.org/wiki/Definite_symmetric_matrix """ from typing import Any import numpy as np def _is_matrix_spd(matrix: np.ndarray) -> bool: """ Returns True if input matrix is symmetric positive definite. Returns False otherwise. For a matrix to be SPD, all eigenvalues must be positive. >>> import numpy as np >>> matrix = np.array([ ... [4.12401784, -5.01453636, -0.63865857], ... [-5.01453636, 12.33347422, -3.40493586], ... [-0.63865857, -3.40493586, 5.78591885]]) >>> _is_matrix_spd(matrix) True >>> matrix = np.array([ ... [0.34634879, 1.96165514, 2.18277744], ... [0.74074469, -1.19648894, -1.34223498], ... [-0.7687067 , 0.06018373, -1.16315631]]) >>> _is_matrix_spd(matrix) False """ # Ensure matrix is square. assert np.shape(matrix)[0] == np.shape(matrix)[1] # If matrix not symmetric, exit right away. if np.allclose(matrix, matrix.T) is False: return False # Get eigenvalues and eignevectors for a symmetric matrix. eigen_values, _ = np.linalg.eigh(matrix) # Check sign of all eigenvalues. # np.all returns a value of type np.bool_ return bool(np.all(eigen_values > 0)) def _create_spd_matrix(dimension: int) -> Any: """ Returns a symmetric positive definite matrix given a dimension. Input: dimension gives the square matrix dimension. Output: spd_matrix is an diminesion x dimensions symmetric positive definite (SPD) matrix. >>> import numpy as np >>> dimension = 3 >>> spd_matrix = _create_spd_matrix(dimension) >>> _is_matrix_spd(spd_matrix) True """ rng = np.random.default_rng() random_matrix = rng.normal(size=(dimension, dimension)) spd_matrix = np.dot(random_matrix, random_matrix.T) assert _is_matrix_spd(spd_matrix) return spd_matrix def conjugate_gradient( spd_matrix: np.ndarray, load_vector: np.ndarray, max_iterations: int = 1000, tol: float = 1e-8, ) -> Any: """ Returns solution to the linear system np.dot(spd_matrix, x) = b. Input: spd_matrix is an NxN Symmetric Positive Definite (SPD) matrix. load_vector is an Nx1 vector. Output: x is an Nx1 vector that is the solution vector. >>> import numpy as np >>> spd_matrix = np.array([ ... [8.73256573, -5.02034289, -2.68709226], ... [-5.02034289, 3.78188322, 0.91980451], ... [-2.68709226, 0.91980451, 1.94746467]]) >>> b = np.array([ ... [-5.80872761], ... [ 3.23807431], ... [ 1.95381422]]) >>> conjugate_gradient(spd_matrix, b) array([[-0.63114139], [-0.01561498], [ 0.13979294]]) """ # Ensure proper dimensionality. assert np.shape(spd_matrix)[0] == np.shape(spd_matrix)[1] assert np.shape(load_vector)[0] == np.shape(spd_matrix)[0] assert _is_matrix_spd(spd_matrix) # Initialize solution guess, residual, search direction. x0 = np.zeros((np.shape(load_vector)[0], 1)) r0 = np.copy(load_vector) p0 = np.copy(r0) # Set initial errors in solution guess and residual. error_residual = 1e9 error_x_solution = 1e9 error = 1e9 # Set iteration counter to threshold number of iterations. iterations = 0 while error > tol: # Save this value so we only calculate the matrix-vector product once. w = np.dot(spd_matrix, p0) # The main algorithm. # Update search direction magnitude. alpha = np.dot(r0.T, r0) / np.dot(p0.T, w) # Update solution guess. x = x0 + alpha * p0 # Calculate new residual. r = r0 - alpha * w # Calculate new Krylov subspace scale. beta = np.dot(r.T, r) / np.dot(r0.T, r0) # Calculate new A conjuage search direction. p = r + beta * p0 # Calculate errors. error_residual = np.linalg.norm(r - r0) error_x_solution = np.linalg.norm(x - x0) error = np.maximum(error_residual, error_x_solution) # Update variables. x0 = np.copy(x) r0 = np.copy(r) p0 = np.copy(p) # Update number of iterations. iterations += 1 if iterations > max_iterations: break return x def test_conjugate_gradient() -> None: """ >>> test_conjugate_gradient() # self running tests """ # Create linear system with SPD matrix and known solution x_true. dimension = 3 spd_matrix = _create_spd_matrix(dimension) rng = np.random.default_rng() x_true = rng.normal(size=(dimension, 1)) b = np.dot(spd_matrix, x_true) # Numpy solution. x_numpy = np.linalg.solve(spd_matrix, b) # Our implementation. x_conjugate_gradient = conjugate_gradient(spd_matrix, b) # Ensure both solutions are close to x_true (and therefore one another). assert np.linalg.norm(x_numpy - x_true) <= 1e-6 assert np.linalg.norm(x_conjugate_gradient - x_true) <= 1e-6 if __name__ == "__main__": import doctest doctest.testmod() test_conjugate_gradient() ================================================ FILE: linear_algebra/src/gaussian_elimination_pivoting.py ================================================ import numpy as np def solve_linear_system(matrix: np.ndarray) -> np.ndarray: """ Solve a linear system of equations using Gaussian elimination with partial pivoting Args: - `matrix`: Coefficient matrix with the last column representing the constants. Returns: - Solution vector. Raises: - ``ValueError``: If the matrix is not correct (i.e., singular). https://courses.engr.illinois.edu/cs357/su2013/lect.htm Lecture 7 Example: >>> A = np.array([[2, 1, -1], [-3, -1, 2], [-2, 1, 2]], dtype=float) >>> B = np.array([8, -11, -3], dtype=float) >>> solution = solve_linear_system(np.column_stack((A, B))) >>> np.allclose(solution, np.array([2., 3., -1.])) True >>> solve_linear_system(np.array([[0, 0, 0]], dtype=float)) Traceback (most recent call last): ... ValueError: Matrix is not square >>> solve_linear_system(np.array([[0, 0, 0], [0, 0, 0]], dtype=float)) Traceback (most recent call last): ... ValueError: Matrix is singular """ ab = np.copy(matrix) num_of_rows = ab.shape[0] num_of_columns = ab.shape[1] - 1 x_lst: list[float] = [] if num_of_rows != num_of_columns: raise ValueError("Matrix is not square") for column_num in range(num_of_rows): # Lead element search for i in range(column_num, num_of_columns): if abs(ab[i][column_num]) > abs(ab[column_num][column_num]): ab[[column_num, i]] = ab[[i, column_num]] # Upper triangular matrix if abs(ab[column_num, column_num]) < 1e-8: raise ValueError("Matrix is singular") if column_num != 0: for i in range(column_num, num_of_rows): ab[i, :] -= ( ab[i, column_num - 1] / ab[column_num - 1, column_num - 1] * ab[column_num - 1, :] ) # Find x vector (Back Substitution) for column_num in range(num_of_rows - 1, -1, -1): x = ab[column_num, -1] / ab[column_num, column_num] x_lst.insert(0, x) for i in range(column_num - 1, -1, -1): ab[i, -1] -= ab[i, column_num] * x # Return the solution vector return np.asarray(x_lst) if __name__ == "__main__": from doctest import testmod testmod() example_matrix = np.array( [ [5.0, -5.0, -3.0, 4.0, -11.0], [1.0, -4.0, 6.0, -4.0, -10.0], [-2.0, -5.0, 4.0, -5.0, -12.0], [-3.0, -3.0, 5.0, -5.0, 8.0], ], dtype=float, ) print(f"Matrix:\n{example_matrix}") print(f"{solve_linear_system(example_matrix) = }") ================================================ FILE: linear_algebra/src/lib.py ================================================ """ Created on Mon Feb 26 14:29:11 2018 @author: Christian Bender @license: MIT-license This module contains some useful classes and functions for dealing with linear algebra in python. Overview: - class Vector - function zero_vector(dimension) - function unit_basis_vector(dimension, pos) - function axpy(scalar, vector1, vector2) - function random_vector(N, a, b) - class Matrix - function square_zero_matrix(N) - function random_matrix(W, H, a, b) """ from __future__ import annotations import math import random from collections.abc import Collection from typing import overload class Vector: """ This class represents a vector of arbitrary size. You need to give the vector components. Overview of the methods: __init__(components: Collection[float] | None): init the vector __len__(): gets the size of the vector (number of components) __str__(): returns a string representation __add__(other: Vector): vector addition __sub__(other: Vector): vector subtraction __mul__(other: float): scalar multiplication __mul__(other: Vector): dot product copy(): copies this vector and returns it component(i): gets the i-th component (0-indexed) change_component(pos: int, value: float): changes specified component euclidean_length(): returns the euclidean length of the vector angle(other: Vector, deg: bool): returns the angle between two vectors """ def __init__(self, components: Collection[float] | None = None) -> None: """ input: components or nothing simple constructor for init the vector """ if components is None: components = [] self.__components = list(components) def __len__(self) -> int: """ returns the size of the vector """ return len(self.__components) def __str__(self) -> str: """ returns a string representation of the vector """ return "(" + ",".join(map(str, self.__components)) + ")" def __add__(self, other: Vector) -> Vector: """ input: other vector assumes: other vector has the same size returns a new vector that represents the sum. """ size = len(self) if size == len(other): result = [self.__components[i] + other.component(i) for i in range(size)] return Vector(result) else: raise Exception("must have the same size") def __sub__(self, other: Vector) -> Vector: """ input: other vector assumes: other vector has the same size returns a new vector that represents the difference. """ size = len(self) if size == len(other): result = [self.__components[i] - other.component(i) for i in range(size)] return Vector(result) else: # error case raise Exception("must have the same size") def __eq__(self, other: object) -> bool: """ performs the comparison between two vectors """ if not isinstance(other, Vector): return NotImplemented if len(self) != len(other): return False return all(self.component(i) == other.component(i) for i in range(len(self))) @overload def __mul__(self, other: float) -> Vector: ... @overload def __mul__(self, other: Vector) -> float: ... def __mul__(self, other: float | Vector) -> float | Vector: """ mul implements the scalar multiplication and the dot-product """ if isinstance(other, (float, int)): ans = [c * other for c in self.__components] return Vector(ans) elif isinstance(other, Vector) and len(self) == len(other): size = len(self) prods = [self.__components[i] * other.component(i) for i in range(size)] return sum(prods) else: # error case raise Exception("invalid operand!") def copy(self) -> Vector: """ copies this vector and returns it. """ return Vector(self.__components) def component(self, i: int) -> float: """ input: index (0-indexed) output: the i-th component of the vector. """ if isinstance(i, int) and -len(self.__components) <= i < len(self.__components): return self.__components[i] else: raise Exception("index out of range") def change_component(self, pos: int, value: float) -> None: """ input: an index (pos) and a value changes the specified component (pos) with the 'value' """ # precondition assert -len(self.__components) <= pos < len(self.__components) self.__components[pos] = value def euclidean_length(self) -> float: """ returns the euclidean length of the vector >>> Vector([2, 3, 4]).euclidean_length() 5.385164807134504 >>> Vector([1]).euclidean_length() 1.0 >>> Vector([0, -1, -2, -3, 4, 5, 6]).euclidean_length() 9.539392014169456 >>> Vector([]).euclidean_length() Traceback (most recent call last): ... Exception: Vector is empty """ if len(self.__components) == 0: raise Exception("Vector is empty") squares = [c**2 for c in self.__components] return math.sqrt(sum(squares)) def angle(self, other: Vector, deg: bool = False) -> float: """ find angle between two Vector (self, Vector) >>> Vector([3, 4, -1]).angle(Vector([2, -1, 1])) 1.4906464636572374 >>> Vector([3, 4, -1]).angle(Vector([2, -1, 1]), deg = True) 85.40775111366095 >>> Vector([3, 4, -1]).angle(Vector([2, -1])) Traceback (most recent call last): ... Exception: invalid operand! """ num = self * other den = self.euclidean_length() * other.euclidean_length() if deg: return math.degrees(math.acos(num / den)) else: return math.acos(num / den) def zero_vector(dimension: int) -> Vector: """ returns a zero-vector of size 'dimension' """ # precondition assert isinstance(dimension, int) return Vector([0] * dimension) def unit_basis_vector(dimension: int, pos: int) -> Vector: """ returns a unit basis vector with a One at index 'pos' (indexing at 0) """ # precondition assert isinstance(dimension, int) assert isinstance(pos, int) ans = [0] * dimension ans[pos] = 1 return Vector(ans) def axpy(scalar: float, x: Vector, y: Vector) -> Vector: """ input: a 'scalar' and two vectors 'x' and 'y' output: a vector computes the axpy operation """ # precondition assert isinstance(x, Vector) assert isinstance(y, Vector) assert isinstance(scalar, (int, float)) return x * scalar + y def random_vector(n: int, a: int, b: int) -> Vector: """ input: size (N) of the vector. random range (a,b) output: returns a random vector of size N, with random integer components between 'a' and 'b'. """ random.seed(None) ans = [random.randint(a, b) for _ in range(n)] return Vector(ans) class Matrix: """ class: Matrix This class represents an arbitrary matrix. Overview of the methods: __init__(): __str__(): returns a string representation __add__(other: Matrix): matrix addition __sub__(other: Matrix): matrix subtraction __mul__(other: float): scalar multiplication __mul__(other: Vector): vector multiplication height() : returns height width() : returns width component(x: int, y: int): returns specified component change_component(x: int, y: int, value: float): changes specified component minor(x: int, y: int): returns minor along (x, y) cofactor(x: int, y: int): returns cofactor along (x, y) determinant() : returns determinant """ def __init__(self, matrix: list[list[float]], w: int, h: int) -> None: """ simple constructor for initializing the matrix with components. """ self.__matrix = matrix self.__width = w self.__height = h def __str__(self) -> str: """ returns a string representation of this matrix. """ ans = "" for i in range(self.__height): ans += "|" for j in range(self.__width): if j < self.__width - 1: ans += str(self.__matrix[i][j]) + "," else: ans += str(self.__matrix[i][j]) + "|\n" return ans def __add__(self, other: Matrix) -> Matrix: """ implements matrix addition. """ if self.__width == other.width() and self.__height == other.height(): matrix = [] for i in range(self.__height): row = [ self.__matrix[i][j] + other.component(i, j) for j in range(self.__width) ] matrix.append(row) return Matrix(matrix, self.__width, self.__height) else: raise Exception("matrix must have the same dimension!") def __sub__(self, other: Matrix) -> Matrix: """ implements matrix subtraction. """ if self.__width == other.width() and self.__height == other.height(): matrix = [] for i in range(self.__height): row = [ self.__matrix[i][j] - other.component(i, j) for j in range(self.__width) ] matrix.append(row) return Matrix(matrix, self.__width, self.__height) else: raise Exception("matrices must have the same dimension!") @overload def __mul__(self, other: float) -> Matrix: ... @overload def __mul__(self, other: Vector) -> Vector: ... def __mul__(self, other: float | Vector) -> Vector | Matrix: """ implements the matrix-vector multiplication. implements the matrix-scalar multiplication """ if isinstance(other, Vector): # matrix-vector if len(other) == self.__width: ans = zero_vector(self.__height) for i in range(self.__height): prods = [ self.__matrix[i][j] * other.component(j) for j in range(self.__width) ] ans.change_component(i, sum(prods)) return ans else: raise Exception( "vector must have the same size as the " "number of columns of the matrix!" ) elif isinstance(other, (int, float)): # matrix-scalar matrix = [ [self.__matrix[i][j] * other for j in range(self.__width)] for i in range(self.__height) ] return Matrix(matrix, self.__width, self.__height) return None def height(self) -> int: """ getter for the height """ return self.__height def width(self) -> int: """ getter for the width """ return self.__width def component(self, x: int, y: int) -> float: """ returns the specified (x,y) component """ if 0 <= x < self.__height and 0 <= y < self.__width: return self.__matrix[x][y] else: raise Exception("change_component: indices out of bounds") def change_component(self, x: int, y: int, value: float) -> None: """ changes the x-y component of this matrix """ if 0 <= x < self.__height and 0 <= y < self.__width: self.__matrix[x][y] = value else: raise Exception("change_component: indices out of bounds") def minor(self, x: int, y: int) -> float: """ returns the minor along (x, y) """ if self.__height != self.__width: raise Exception("Matrix is not square") minor = self.__matrix[:x] + self.__matrix[x + 1 :] for i in range(len(minor)): minor[i] = minor[i][:y] + minor[i][y + 1 :] return Matrix(minor, self.__width - 1, self.__height - 1).determinant() def cofactor(self, x: int, y: int) -> float: """ returns the cofactor (signed minor) along (x, y) """ if self.__height != self.__width: raise Exception("Matrix is not square") if 0 <= x < self.__height and 0 <= y < self.__width: return (-1) ** (x + y) * self.minor(x, y) else: raise Exception("Indices out of bounds") def determinant(self) -> float: """ returns the determinant of an nxn matrix using Laplace expansion """ if self.__height != self.__width: raise Exception("Matrix is not square") if self.__height < 1: raise Exception("Matrix has no element") elif self.__height == 1: return self.__matrix[0][0] elif self.__height == 2: return ( self.__matrix[0][0] * self.__matrix[1][1] - self.__matrix[0][1] * self.__matrix[1][0] ) else: cofactor_prods = [ self.__matrix[0][y] * self.cofactor(0, y) for y in range(self.__width) ] return sum(cofactor_prods) def square_zero_matrix(n: int) -> Matrix: """ returns a square zero-matrix of dimension NxN """ ans: list[list[float]] = [[0] * n for _ in range(n)] return Matrix(ans, n, n) def random_matrix(width: int, height: int, a: int, b: int) -> Matrix: """ returns a random matrix WxH with integer components between 'a' and 'b' """ random.seed(None) matrix: list[list[float]] = [ [random.randint(a, b) for _ in range(width)] for _ in range(height) ] return Matrix(matrix, width, height) ================================================ FILE: linear_algebra/src/polynom_for_points.py ================================================ def points_to_polynomial(coordinates: list[list[int]]) -> str: """ coordinates is a two dimensional matrix: [[x, y], [x, y], ...] number of points you want to use >>> points_to_polynomial([]) Traceback (most recent call last): ... ValueError: The program cannot work out a fitting polynomial. >>> points_to_polynomial([[]]) Traceback (most recent call last): ... ValueError: The program cannot work out a fitting polynomial. >>> points_to_polynomial([[1, 0], [2, 0], [3, 0]]) 'f(x)=x^2*0.0+x^1*-0.0+x^0*0.0' >>> points_to_polynomial([[1, 1], [2, 1], [3, 1]]) 'f(x)=x^2*0.0+x^1*-0.0+x^0*1.0' >>> points_to_polynomial([[1, 3], [2, 3], [3, 3]]) 'f(x)=x^2*0.0+x^1*-0.0+x^0*3.0' >>> points_to_polynomial([[1, 1], [2, 2], [3, 3]]) 'f(x)=x^2*0.0+x^1*1.0+x^0*0.0' >>> points_to_polynomial([[1, 1], [2, 4], [3, 9]]) 'f(x)=x^2*1.0+x^1*-0.0+x^0*0.0' >>> points_to_polynomial([[1, 3], [2, 6], [3, 11]]) 'f(x)=x^2*1.0+x^1*-0.0+x^0*2.0' >>> points_to_polynomial([[1, -3], [2, -6], [3, -11]]) 'f(x)=x^2*-1.0+x^1*-0.0+x^0*-2.0' >>> points_to_polynomial([[1, 5], [2, 2], [3, 9]]) 'f(x)=x^2*5.0+x^1*-18.0+x^0*18.0' >>> points_to_polynomial([[1, 1], [1, 2], [1, 3]]) 'x=1' >>> points_to_polynomial([[1, 1], [2, 2], [2, 2]]) Traceback (most recent call last): ... ValueError: The program cannot work out a fitting polynomial. """ if len(coordinates) == 0 or not all(len(pair) == 2 for pair in coordinates): raise ValueError("The program cannot work out a fitting polynomial.") if len({tuple(pair) for pair in coordinates}) != len(coordinates): raise ValueError("The program cannot work out a fitting polynomial.") set_x = {x for x, _ in coordinates} if len(set_x) == 1: return f"x={coordinates[0][0]}" if len(set_x) != len(coordinates): raise ValueError("The program cannot work out a fitting polynomial.") x = len(coordinates) # put the x and x to the power values in a matrix matrix: list[list[float]] = [ [ coordinates[count_of_line][0] ** (x - (count_in_line + 1)) for count_in_line in range(x) ] for count_of_line in range(x) ] # put the y values into a vector vector: list[float] = [coordinates[count_of_line][1] for count_of_line in range(x)] for count in range(x): for number in range(x): if count == number: continue fraction = matrix[number][count] / matrix[count][count] for counting_columns, item in enumerate(matrix[count]): # manipulating all the values in the matrix matrix[number][counting_columns] -= item * fraction # manipulating the values in the vector vector[number] -= vector[count] * fraction # make solutions solution: list[str] = [ str(vector[count] / matrix[count][count]) for count in range(x) ] solved = "f(x)=" for count in range(x): remove_e: list[str] = solution[count].split("E") if len(remove_e) > 1: solution[count] = f"{remove_e[0]}*10^{remove_e[1]}" solved += f"x^{x - (count + 1)}*{solution[count]}" if count + 1 != x: solved += "+" return solved if __name__ == "__main__": print(points_to_polynomial([])) print(points_to_polynomial([[]])) print(points_to_polynomial([[1, 0], [2, 0], [3, 0]])) print(points_to_polynomial([[1, 1], [2, 1], [3, 1]])) print(points_to_polynomial([[1, 3], [2, 3], [3, 3]])) print(points_to_polynomial([[1, 1], [2, 2], [3, 3]])) print(points_to_polynomial([[1, 1], [2, 4], [3, 9]])) print(points_to_polynomial([[1, 3], [2, 6], [3, 11]])) print(points_to_polynomial([[1, -3], [2, -6], [3, -11]])) print(points_to_polynomial([[1, 5], [2, 2], [3, 9]])) ================================================ FILE: linear_algebra/src/power_iteration.py ================================================ import numpy as np def power_iteration( input_matrix: np.ndarray, vector: np.ndarray, error_tol: float = 1e-12, max_iterations: int = 100, ) -> tuple[float, np.ndarray]: """ Power Iteration. Find the largest eigenvalue and corresponding eigenvector of matrix input_matrix given a random vector in the same space. Will work so long as vector has component of largest eigenvector. input_matrix must be either real or Hermitian. Input input_matrix: input matrix whose largest eigenvalue we will find. Numpy array. np.shape(input_matrix) == (N,N). vector: random initial vector in same space as matrix. Numpy array. np.shape(vector) == (N,) or (N,1) Output largest_eigenvalue: largest eigenvalue of the matrix input_matrix. Float. Scalar. largest_eigenvector: eigenvector corresponding to largest_eigenvalue. Numpy array. np.shape(largest_eigenvector) == (N,) or (N,1). >>> import numpy as np >>> input_matrix = np.array([ ... [41, 4, 20], ... [ 4, 26, 30], ... [20, 30, 50] ... ]) >>> vector = np.array([41,4,20]) >>> power_iteration(input_matrix,vector) (79.66086378788381, array([0.44472726, 0.46209842, 0.76725662])) """ # Ensure matrix is square. assert np.shape(input_matrix)[0] == np.shape(input_matrix)[1] # Ensure proper dimensionality. assert np.shape(input_matrix)[0] == np.shape(vector)[0] # Ensure inputs are either both complex or both real assert np.iscomplexobj(input_matrix) == np.iscomplexobj(vector) is_complex = np.iscomplexobj(input_matrix) if is_complex: # Ensure complex input_matrix is Hermitian assert np.array_equal(input_matrix, input_matrix.conj().T) # Set convergence to False. Will define convergence when we exceed max_iterations # or when we have small changes from one iteration to next. convergence = False lambda_previous = 0 iterations = 0 error = 1e12 while not convergence: # Multiple matrix by the vector. w = np.dot(input_matrix, vector) # Normalize the resulting output vector. vector = w / np.linalg.norm(w) # Find rayleigh quotient # (faster than usual b/c we know vector is normalized already) vector_h = vector.conj().T if is_complex else vector.T lambda_ = np.dot(vector_h, np.dot(input_matrix, vector)) # Check convergence. error = np.abs(lambda_ - lambda_previous) / lambda_ iterations += 1 if error <= error_tol or iterations >= max_iterations: convergence = True lambda_previous = lambda_ if is_complex: lambda_ = np.real(lambda_) return float(lambda_), vector def test_power_iteration() -> None: """ >>> test_power_iteration() # self running tests """ real_input_matrix = np.array([[41, 4, 20], [4, 26, 30], [20, 30, 50]]) real_vector = np.array([41, 4, 20]) complex_input_matrix = real_input_matrix.astype(np.complex128) imag_matrix = np.triu(1j * complex_input_matrix, 1) complex_input_matrix += imag_matrix complex_input_matrix += -1 * imag_matrix.T complex_vector = np.array([41, 4, 20]).astype(np.complex128) for problem_type in ["real", "complex"]: if problem_type == "real": input_matrix = real_input_matrix vector = real_vector elif problem_type == "complex": input_matrix = complex_input_matrix vector = complex_vector # Our implementation. eigen_value, eigen_vector = power_iteration(input_matrix, vector) # Numpy implementation. # Get eigenvalues and eigenvectors using built-in numpy # eigh (eigh used for symmetric or hermetian matrices). eigen_values, eigen_vectors = np.linalg.eigh(input_matrix) # Last eigenvalue is the maximum one. eigen_value_max = eigen_values[-1] # Last column in this matrix is eigenvector corresponding to largest eigenvalue. eigen_vector_max = eigen_vectors[:, -1] # Check our implementation and numpy gives close answers. assert np.abs(eigen_value - eigen_value_max) <= 1e-6 # Take absolute values element wise of each eigenvector. # as they are only unique to a minus sign. assert np.linalg.norm(np.abs(eigen_vector) - np.abs(eigen_vector_max)) <= 1e-6 if __name__ == "__main__": import doctest doctest.testmod() test_power_iteration() ================================================ FILE: linear_algebra/src/rank_of_matrix.py ================================================ """ Calculate the rank of a matrix. See: https://en.wikipedia.org/wiki/Rank_(linear_algebra) """ def rank_of_matrix(matrix: list[list[int | float]]) -> int: """ Finds the rank of a matrix. Args: `matrix`: The matrix as a list of lists. Returns: The rank of the matrix. Example: >>> matrix1 = [[1, 2, 3], ... [4, 5, 6], ... [7, 8, 9]] >>> rank_of_matrix(matrix1) 2 >>> matrix2 = [[1, 0, 0], ... [0, 1, 0], ... [0, 0, 0]] >>> rank_of_matrix(matrix2) 2 >>> matrix3 = [[1, 2, 3, 4], ... [5, 6, 7, 8], ... [9, 10, 11, 12]] >>> rank_of_matrix(matrix3) 2 >>> rank_of_matrix([[2,3,-1,-1], ... [1,-1,-2,4], ... [3,1,3,-2], ... [6,3,0,-7]]) 4 >>> rank_of_matrix([[2,1,-3,-6], ... [3,-3,1,2], ... [1,1,1,2]]) 3 >>> rank_of_matrix([[2,-1,0], ... [1,3,4], ... [4,1,-3]]) 3 >>> rank_of_matrix([[3,2,1], ... [-6,-4,-2]]) 1 >>> rank_of_matrix([[],[]]) 0 >>> rank_of_matrix([[1]]) 1 >>> rank_of_matrix([[]]) 0 """ rows = len(matrix) columns = len(matrix[0]) rank = min(rows, columns) for row in range(rank): # Check if diagonal element is not zero if matrix[row][row] != 0: # Eliminate all the elements below the diagonal for col in range(row + 1, rows): multiplier = matrix[col][row] / matrix[row][row] for i in range(row, columns): matrix[col][i] -= multiplier * matrix[row][i] else: # Find a non-zero diagonal element to swap rows reduce = True for i in range(row + 1, rows): if matrix[i][row] != 0: matrix[row], matrix[i] = matrix[i], matrix[row] reduce = False break if reduce: rank -= 1 for i in range(rows): matrix[i][row] = matrix[i][rank] # Reduce the row pointer by one to stay on the same row row -= 1 return rank if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: linear_algebra/src/rayleigh_quotient.py ================================================ """ https://en.wikipedia.org/wiki/Rayleigh_quotient """ from typing import Any import numpy as np def is_hermitian(matrix: np.ndarray) -> bool: """ Checks if a matrix is Hermitian. >>> import numpy as np >>> A = np.array([ ... [2, 2+1j, 4], ... [2-1j, 3, 1j], ... [4, -1j, 1]]) >>> is_hermitian(A) True >>> A = np.array([ ... [2, 2+1j, 4+1j], ... [2-1j, 3, 1j], ... [4, -1j, 1]]) >>> is_hermitian(A) False """ return np.array_equal(matrix, matrix.conjugate().T) def rayleigh_quotient(a: np.ndarray, v: np.ndarray) -> Any: """ Returns the Rayleigh quotient of a Hermitian matrix A and vector v. >>> import numpy as np >>> A = np.array([ ... [1, 2, 4], ... [2, 3, -1], ... [4, -1, 1] ... ]) >>> v = np.array([ ... [1], ... [2], ... [3] ... ]) >>> rayleigh_quotient(A, v) array([[3.]]) """ v_star = v.conjugate().T v_star_dot = v_star.dot(a) assert isinstance(v_star_dot, np.ndarray) return (v_star_dot.dot(v)) / (v_star.dot(v)) def tests() -> None: a = np.array([[2, 2 + 1j, 4], [2 - 1j, 3, 1j], [4, -1j, 1]]) v = np.array([[1], [2], [3]]) assert is_hermitian(a), f"{a} is not hermitian." print(rayleigh_quotient(a, v)) a = np.array([[1, 2, 4], [2, 3, -1], [4, -1, 1]]) assert is_hermitian(a), f"{a} is not hermitian." assert rayleigh_quotient(a, v) == float(3) if __name__ == "__main__": import doctest doctest.testmod() tests() ================================================ FILE: linear_algebra/src/schur_complement.py ================================================ import unittest import numpy as np import pytest def schur_complement( mat_a: np.ndarray, mat_b: np.ndarray, mat_c: np.ndarray, pseudo_inv: np.ndarray | None = None, ) -> np.ndarray: """ Schur complement of a symmetric matrix X given as a 2x2 block matrix consisting of matrices `A`, `B` and `C`. Matrix `A` must be quadratic and non-singular. In case `A` is singular, a pseudo-inverse may be provided using the `pseudo_inv` argument. | Link to Wiki: https://en.wikipedia.org/wiki/Schur_complement | See also Convex Optimization - Boyd and Vandenberghe, A.5.5 >>> import numpy as np >>> a = np.array([[1, 2], [2, 1]]) >>> b = np.array([[0, 3], [3, 0]]) >>> c = np.array([[2, 1], [6, 3]]) >>> schur_complement(a, b, c) array([[ 5., -5.], [ 0., 6.]]) """ shape_a = np.shape(mat_a) shape_b = np.shape(mat_b) shape_c = np.shape(mat_c) if shape_a[0] != shape_b[0]: msg = ( "Expected the same number of rows for A and B. " f"Instead found A of size {shape_a} and B of size {shape_b}" ) raise ValueError(msg) if shape_b[1] != shape_c[1]: msg = ( "Expected the same number of columns for B and C. " f"Instead found B of size {shape_b} and C of size {shape_c}" ) raise ValueError(msg) a_inv = pseudo_inv if a_inv is None: try: a_inv = np.linalg.inv(mat_a) except np.linalg.LinAlgError: raise ValueError( "Input matrix A is not invertible. Cannot compute Schur complement." ) return mat_c - mat_b.T @ a_inv @ mat_b class TestSchurComplement(unittest.TestCase): def test_schur_complement(self) -> None: a = np.array([[1, 2, 1], [2, 1, 2], [3, 2, 4]]) b = np.array([[0, 3], [3, 0], [2, 3]]) c = np.array([[2, 1], [6, 3]]) s = schur_complement(a, b, c) input_matrix = np.block([[a, b], [b.T, c]]) det_x = np.linalg.det(input_matrix) det_a = np.linalg.det(a) det_s = np.linalg.det(s) assert np.is_close(det_x, det_a * det_s) def test_improper_a_b_dimensions(self) -> None: a = np.array([[1, 2, 1], [2, 1, 2], [3, 2, 4]]) b = np.array([[0, 3], [3, 0], [2, 3]]) c = np.array([[2, 1], [6, 3]]) with pytest.raises(ValueError): schur_complement(a, b, c) def test_improper_b_c_dimensions(self) -> None: a = np.array([[1, 2, 1], [2, 1, 2], [3, 2, 4]]) b = np.array([[0, 3], [3, 0], [2, 3]]) c = np.array([[2, 1, 3], [6, 3, 5]]) with pytest.raises(ValueError): schur_complement(a, b, c) if __name__ == "__main__": import doctest doctest.testmod() unittest.main() ================================================ FILE: linear_algebra/src/test_linear_algebra.py ================================================ """ Created on Mon Feb 26 15:40:07 2018 @author: Christian Bender @license: MIT-license This file contains the test-suite for the linear algebra library. """ import unittest import pytest from .lib import ( Matrix, Vector, axpy, square_zero_matrix, unit_basis_vector, zero_vector, ) class Test(unittest.TestCase): def test_component(self) -> None: """ test for method component() """ x = Vector([1, 2, 3]) assert x.component(0) == 1 assert x.component(2) == 3 _ = Vector() def test_str(self) -> None: """ test for method toString() """ x = Vector([0, 0, 0, 0, 0, 1]) assert str(x) == "(0,0,0,0,0,1)" def test_size(self) -> None: """ test for method size() """ x = Vector([1, 2, 3, 4]) assert len(x) == 4 def test_euclidean_length(self) -> None: """ test for method euclidean_length() """ x = Vector([1, 2]) y = Vector([1, 2, 3, 4, 5]) z = Vector([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) w = Vector([1, -1, 1, -1, 2, -3, 4, -5]) assert x.euclidean_length() == pytest.approx(2.236, abs=1e-3) assert y.euclidean_length() == pytest.approx(7.416, abs=1e-3) assert z.euclidean_length() == 0 assert w.euclidean_length() == pytest.approx(7.616, abs=1e-3) def test_add(self) -> None: """ test for + operator """ x = Vector([1, 2, 3]) y = Vector([1, 1, 1]) assert (x + y).component(0) == 2 assert (x + y).component(1) == 3 assert (x + y).component(2) == 4 def test_sub(self) -> None: """ test for - operator """ x = Vector([1, 2, 3]) y = Vector([1, 1, 1]) assert (x - y).component(0) == 0 assert (x - y).component(1) == 1 assert (x - y).component(2) == 2 def test_mul(self) -> None: """ test for * operator """ x = Vector([1, 2, 3]) a = Vector([2, -1, 4]) # for test of dot product b = Vector([1, -2, -1]) assert str(x * 3.0) == "(3.0,6.0,9.0)" assert a * b == 0 def test_zero_vector(self) -> None: """ test for global function zero_vector() """ assert str(zero_vector(10)).count("0") == 10 def test_unit_basis_vector(self) -> None: """ test for global function unit_basis_vector() """ assert str(unit_basis_vector(3, 1)) == "(0,1,0)" def test_axpy(self) -> None: """ test for global function axpy() (operation) """ x = Vector([1, 2, 3]) y = Vector([1, 0, 1]) assert str(axpy(2, x, y)) == "(3,4,7)" def test_copy(self) -> None: """ test for method copy() """ x = Vector([1, 0, 0, 0, 0, 0]) y = x.copy() assert str(x) == str(y) def test_change_component(self) -> None: """ test for method change_component() """ x = Vector([1, 0, 0]) x.change_component(0, 0) x.change_component(1, 1) assert str(x) == "(0,1,0)" def test_str_matrix(self) -> None: """ test for Matrix method str() """ a = Matrix([[1, 2, 3], [2, 4, 5], [6, 7, 8]], 3, 3) assert str(a) == "|1,2,3|\n|2,4,5|\n|6,7,8|\n" def test_minor(self) -> None: """ test for Matrix method minor() """ a = Matrix([[1, 2, 3], [2, 4, 5], [6, 7, 8]], 3, 3) minors = [[-3, -14, -10], [-5, -10, -5], [-2, -1, 0]] for x in range(a.height()): for y in range(a.width()): assert minors[x][y] == a.minor(x, y) def test_cofactor(self) -> None: """ test for Matrix method cofactor() """ a = Matrix([[1, 2, 3], [2, 4, 5], [6, 7, 8]], 3, 3) cofactors = [[-3, 14, -10], [5, -10, 5], [-2, 1, 0]] for x in range(a.height()): for y in range(a.width()): assert cofactors[x][y] == a.cofactor(x, y) def test_determinant(self) -> None: """ test for Matrix method determinant() """ a = Matrix([[1, 2, 3], [2, 4, 5], [6, 7, 8]], 3, 3) assert a.determinant() == -5 def test__mul__matrix(self) -> None: """ test for Matrix * operator """ a = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]], 3, 3) x = Vector([1, 2, 3]) assert str(a * x) == "(14,32,50)" assert str(a * 2) == "|2,4,6|\n|8,10,12|\n|14,16,18|\n" def test_change_component_matrix(self) -> None: """ test for Matrix method change_component() """ a = Matrix([[1, 2, 3], [2, 4, 5], [6, 7, 8]], 3, 3) a.change_component(0, 2, 5) assert str(a) == "|1,2,5|\n|2,4,5|\n|6,7,8|\n" def test_component_matrix(self) -> None: """ test for Matrix method component() """ a = Matrix([[1, 2, 3], [2, 4, 5], [6, 7, 8]], 3, 3) assert a.component(2, 1) == 7, "0.01" def test__add__matrix(self) -> None: """ test for Matrix + operator """ a = Matrix([[1, 2, 3], [2, 4, 5], [6, 7, 8]], 3, 3) b = Matrix([[1, 2, 7], [2, 4, 5], [6, 7, 10]], 3, 3) assert str(a + b) == "|2,4,10|\n|4,8,10|\n|12,14,18|\n" def test__sub__matrix(self) -> None: """ test for Matrix - operator """ a = Matrix([[1, 2, 3], [2, 4, 5], [6, 7, 8]], 3, 3) b = Matrix([[1, 2, 7], [2, 4, 5], [6, 7, 10]], 3, 3) assert str(a - b) == "|0,0,-4|\n|0,0,0|\n|0,0,-2|\n" def test_square_zero_matrix(self) -> None: """ test for global function square_zero_matrix() """ assert str(square_zero_matrix(5)) == ( "|0,0,0,0,0|\n|0,0,0,0,0|\n|0,0,0,0,0|\n|0,0,0,0,0|\n|0,0,0,0,0|\n" ) if __name__ == "__main__": unittest.main() ================================================ FILE: linear_algebra/src/transformations_2d.py ================================================ """ 2D Transformations are regularly used in Linear Algebra. I have added the codes for reflection, projection, scaling and rotation 2D matrices. .. code-block:: python scaling(5) = [[5.0, 0.0], [0.0, 5.0]] rotation(45) = [[0.5253219888177297, -0.8509035245341184], [0.8509035245341184, 0.5253219888177297]] projection(45) = [[0.27596319193541496, 0.446998331800279], [0.446998331800279, 0.7240368080645851]] reflection(45) = [[0.05064397763545947, 0.893996663600558], [0.893996663600558, 0.7018070490682369]] """ from math import cos, sin def scaling(scaling_factor: float) -> list[list[float]]: """ >>> scaling(5) [[5.0, 0.0], [0.0, 5.0]] """ scaling_factor = float(scaling_factor) return [[scaling_factor * int(x == y) for x in range(2)] for y in range(2)] def rotation(angle: float) -> list[list[float]]: """ >>> rotation(45) # doctest: +NORMALIZE_WHITESPACE [[0.5253219888177297, -0.8509035245341184], [0.8509035245341184, 0.5253219888177297]] """ c, s = cos(angle), sin(angle) return [[c, -s], [s, c]] def projection(angle: float) -> list[list[float]]: """ >>> projection(45) # doctest: +NORMALIZE_WHITESPACE [[0.27596319193541496, 0.446998331800279], [0.446998331800279, 0.7240368080645851]] """ c, s = cos(angle), sin(angle) cs = c * s return [[c * c, cs], [cs, s * s]] def reflection(angle: float) -> list[list[float]]: """ >>> reflection(45) # doctest: +NORMALIZE_WHITESPACE [[0.05064397763545947, 0.893996663600558], [0.893996663600558, 0.7018070490682369]] """ c, s = cos(angle), sin(angle) cs = c * s return [[2 * c - 1, 2 * cs], [2 * cs, 2 * s - 1]] print(f" {scaling(5) = }") print(f" {rotation(45) = }") print(f"{projection(45) = }") print(f"{reflection(45) = }") ================================================ FILE: linear_programming/__init__.py ================================================ ================================================ FILE: linear_programming/simplex.py ================================================ """ Python implementation of the simplex algorithm for solving linear programs in tabular form with - `>=`, `<=`, and `=` constraints and - each variable `x1, x2, ...>= 0`. See https://gist.github.com/imengus/f9619a568f7da5bc74eaf20169a24d98 for how to convert linear programs to simplex tableaus, and the steps taken in the simplex algorithm. Resources: https://en.wikipedia.org/wiki/Simplex_algorithm https://tinyurl.com/simplex4beginners """ from typing import Any import numpy as np class Tableau: """Operate on simplex tableaus >>> Tableau(np.array([[-1,-1,0,0,1],[1,3,1,0,4],[3,1,0,1,4]]), 2, 2) Traceback (most recent call last): ... TypeError: Tableau must have type float64 >>> Tableau(np.array([[-1,-1,0,0,-1],[1,3,1,0,4],[3,1,0,1,4.]]), 2, 2) Traceback (most recent call last): ... ValueError: RHS must be > 0 >>> Tableau(np.array([[-1,-1,0,0,1],[1,3,1,0,4],[3,1,0,1,4.]]), -2, 2) Traceback (most recent call last): ... ValueError: number of (artificial) variables must be a natural number """ # Max iteration number to prevent cycling maxiter = 100 def __init__( self, tableau: np.ndarray, n_vars: int, n_artificial_vars: int ) -> None: if tableau.dtype != "float64": raise TypeError("Tableau must have type float64") # Check if RHS is negative if not (tableau[:, -1] >= 0).all(): raise ValueError("RHS must be > 0") if n_vars < 2 or n_artificial_vars < 0: raise ValueError( "number of (artificial) variables must be a natural number" ) self.tableau = tableau self.n_rows, n_cols = tableau.shape # Number of decision variables x1, x2, x3... self.n_vars, self.n_artificial_vars = n_vars, n_artificial_vars # 2 if there are >= or == constraints (nonstandard), 1 otherwise (std) self.n_stages = (self.n_artificial_vars > 0) + 1 # Number of slack variables added to make inequalities into equalities self.n_slack = n_cols - self.n_vars - self.n_artificial_vars - 1 # Objectives for each stage self.objectives = ["max"] # In two stage simplex, first minimise then maximise if self.n_artificial_vars: self.objectives.append("min") self.col_titles = self.generate_col_titles() # Index of current pivot row and column self.row_idx = None self.col_idx = None # Does objective row only contain (non)-negative values? self.stop_iter = False def generate_col_titles(self) -> list[str]: """Generate column titles for tableau of specific dimensions >>> Tableau(np.array([[-1,-1,0,0,1],[1,3,1,0,4],[3,1,0,1,4.]]), ... 2, 0).generate_col_titles() ['x1', 'x2', 's1', 's2', 'RHS'] >>> Tableau(np.array([[-1,-1,0,0,1],[1,3,1,0,4],[3,1,0,1,4.]]), ... 2, 2).generate_col_titles() ['x1', 'x2', 'RHS'] """ args = (self.n_vars, self.n_slack) # decision | slack string_starts = ["x", "s"] titles = [] for i in range(2): for j in range(args[i]): titles.append(string_starts[i] + str(j + 1)) titles.append("RHS") return titles def find_pivot(self) -> tuple[Any, Any]: """Finds the pivot row and column. >>> tuple(int(x) for x in Tableau(np.array([[-2,1,0,0,0], [3,1,1,0,6], ... [1,2,0,1,7.]]), 2, 0).find_pivot()) (1, 0) """ objective = self.objectives[-1] # Find entries of highest magnitude in objective rows sign = (objective == "min") - (objective == "max") col_idx = np.argmax(sign * self.tableau[0, :-1]) # Choice is only valid if below 0 for maximise, and above for minimise if sign * self.tableau[0, col_idx] <= 0: self.stop_iter = True return 0, 0 # Pivot row is chosen as having the lowest quotient when elements of # the pivot column divide the right-hand side # Slice excluding the objective rows s = slice(self.n_stages, self.n_rows) # RHS dividend = self.tableau[s, -1] # Elements of pivot column within slice divisor = self.tableau[s, col_idx] # Array filled with nans nans = np.full(self.n_rows - self.n_stages, np.nan) # If element in pivot column is greater than zero, return # quotient or nan otherwise quotients = np.divide(dividend, divisor, out=nans, where=divisor > 0) # Arg of minimum quotient excluding the nan values. n_stages is added # to compensate for earlier exclusion of objective columns row_idx = np.nanargmin(quotients) + self.n_stages return row_idx, col_idx def pivot(self, row_idx: int, col_idx: int) -> np.ndarray: """Pivots on value on the intersection of pivot row and column. >>> Tableau(np.array([[-2,-3,0,0,0],[1,3,1,0,4],[3,1,0,1,4.]]), ... 2, 2).pivot(1, 0).tolist() ... # doctest: +NORMALIZE_WHITESPACE [[0.0, 3.0, 2.0, 0.0, 8.0], [1.0, 3.0, 1.0, 0.0, 4.0], [0.0, -8.0, -3.0, 1.0, -8.0]] """ # Avoid changes to original tableau piv_row = self.tableau[row_idx].copy() piv_val = piv_row[col_idx] # Entry becomes 1 piv_row *= 1 / piv_val # Variable in pivot column becomes basic, ie the only non-zero entry for idx, coeff in enumerate(self.tableau[:, col_idx]): self.tableau[idx] += -coeff * piv_row self.tableau[row_idx] = piv_row return self.tableau def change_stage(self) -> np.ndarray: """Exits first phase of the two-stage method by deleting artificial rows and columns, or completes the algorithm if exiting the standard case. >>> Tableau(np.array([ ... [3, 3, -1, -1, 0, 0, 4], ... [2, 1, 0, 0, 0, 0, 0.], ... [1, 2, -1, 0, 1, 0, 2], ... [2, 1, 0, -1, 0, 1, 2] ... ]), 2, 2).change_stage().tolist() ... # doctest: +NORMALIZE_WHITESPACE [[2.0, 1.0, 0.0, 0.0, 0.0], [1.0, 2.0, -1.0, 0.0, 2.0], [2.0, 1.0, 0.0, -1.0, 2.0]] """ # Objective of original objective row remains self.objectives.pop() if not self.objectives: return self.tableau # Slice containing ids for artificial columns s = slice(-self.n_artificial_vars - 1, -1) # Delete the artificial variable columns self.tableau = np.delete(self.tableau, s, axis=1) # Delete the objective row of the first stage self.tableau = np.delete(self.tableau, 0, axis=0) self.n_stages = 1 self.n_rows -= 1 self.n_artificial_vars = 0 self.stop_iter = False return self.tableau def run_simplex(self) -> dict[Any, Any]: """Operate on tableau until objective function cannot be improved further. # Standard linear program: Max: x1 + x2 ST: x1 + 3x2 <= 4 3x1 + x2 <= 4 >>> {key: float(value) for key, value in Tableau(np.array([[-1,-1,0,0,0], ... [1,3,1,0,4],[3,1,0,1,4.]]), 2, 0).run_simplex().items()} {'P': 2.0, 'x1': 1.0, 'x2': 1.0} # Standard linear program with 3 variables: Max: 3x1 + x2 + 3x3 ST: 2x1 + x2 + x3 ≤ 2 x1 + 2x2 + 3x3 ≤ 5 2x1 + 2x2 + x3 ≤ 6 >>> {key: float(value) for key, value in Tableau(np.array([ ... [-3,-1,-3,0,0,0,0], ... [2,1,1,1,0,0,2], ... [1,2,3,0,1,0,5], ... [2,2,1,0,0,1,6.] ... ]),3,0).run_simplex().items()} # doctest: +ELLIPSIS {'P': 5.4, 'x1': 0.199..., 'x3': 1.6} # Optimal tableau input: >>> {key: float(value) for key, value in Tableau(np.array([ ... [0, 0, 0.25, 0.25, 2], ... [0, 1, 0.375, -0.125, 1], ... [1, 0, -0.125, 0.375, 1] ... ]), 2, 0).run_simplex().items()} {'P': 2.0, 'x1': 1.0, 'x2': 1.0} # Non-standard: >= constraints Max: 2x1 + 3x2 + x3 ST: x1 + x2 + x3 <= 40 2x1 + x2 - x3 >= 10 - x2 + x3 >= 10 >>> {key: float(value) for key, value in Tableau(np.array([ ... [2, 0, 0, 0, -1, -1, 0, 0, 20], ... [-2, -3, -1, 0, 0, 0, 0, 0, 0], ... [1, 1, 1, 1, 0, 0, 0, 0, 40], ... [2, 1, -1, 0, -1, 0, 1, 0, 10], ... [0, -1, 1, 0, 0, -1, 0, 1, 10.] ... ]), 3, 2).run_simplex().items()} {'P': 70.0, 'x1': 10.0, 'x2': 10.0, 'x3': 20.0} # Non standard: minimisation and equalities Min: x1 + x2 ST: 2x1 + x2 = 12 6x1 + 5x2 = 40 >>> {key: float(value) for key, value in Tableau(np.array([ ... [8, 6, 0, 0, 52], ... [1, 1, 0, 0, 0], ... [2, 1, 1, 0, 12], ... [6, 5, 0, 1, 40.], ... ]), 2, 2).run_simplex().items()} {'P': 7.0, 'x1': 5.0, 'x2': 2.0} # Pivot on slack variables Max: 8x1 + 6x2 ST: x1 + 3x2 <= 33 4x1 + 2x2 <= 48 2x1 + 4x2 <= 48 x1 + x2 >= 10 x1 >= 2 >>> {key: float(value) for key, value in Tableau(np.array([ ... [2, 1, 0, 0, 0, -1, -1, 0, 0, 12.0], ... [-8, -6, 0, 0, 0, 0, 0, 0, 0, 0.0], ... [1, 3, 1, 0, 0, 0, 0, 0, 0, 33.0], ... [4, 2, 0, 1, 0, 0, 0, 0, 0, 60.0], ... [2, 4, 0, 0, 1, 0, 0, 0, 0, 48.0], ... [1, 1, 0, 0, 0, -1, 0, 1, 0, 10.0], ... [1, 0, 0, 0, 0, 0, -1, 0, 1, 2.0] ... ]), 2, 2).run_simplex().items()} # doctest: +ELLIPSIS {'P': 132.0, 'x1': 12.000... 'x2': 5.999...} """ # Stop simplex algorithm from cycling. for _ in range(Tableau.maxiter): # Completion of each stage removes an objective. If both stages # are complete, then no objectives are left if not self.objectives: # Find the values of each variable at optimal solution return self.interpret_tableau() row_idx, col_idx = self.find_pivot() # If there are no more negative values in objective row if self.stop_iter: # Delete artificial variable columns and rows. Update attributes self.tableau = self.change_stage() else: self.tableau = self.pivot(row_idx, col_idx) return {} def interpret_tableau(self) -> dict[str, float]: """Given the final tableau, add the corresponding values of the basic decision variables to the `output_dict` >>> {key: float(value) for key, value in Tableau(np.array([ ... [0,0,0.875,0.375,5], ... [0,1,0.375,-0.125,1], ... [1,0,-0.125,0.375,1] ... ]),2, 0).interpret_tableau().items()} {'P': 5.0, 'x1': 1.0, 'x2': 1.0} """ # P = RHS of final tableau output_dict = {"P": abs(self.tableau[0, -1])} for i in range(self.n_vars): # Gives indices of nonzero entries in the ith column nonzero = np.nonzero(self.tableau[:, i]) n_nonzero = len(nonzero[0]) # First entry in the nonzero indices nonzero_rowidx = nonzero[0][0] nonzero_val = self.tableau[nonzero_rowidx, i] # If there is only one nonzero value in column, which is one if n_nonzero == 1 and nonzero_val == 1: rhs_val = self.tableau[nonzero_rowidx, -1] output_dict[self.col_titles[i]] = rhs_val return output_dict if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: machine_learning/__init__.py ================================================ ================================================ FILE: machine_learning/apriori_algorithm.py ================================================ """ Apriori Algorithm is a Association rule mining technique, also known as market basket analysis, aims to discover interesting relationships or associations among a set of items in a transactional or relational database. For example, Apriori Algorithm states: "If a customer buys item A and item B, then they are likely to buy item C." This rule suggests a relationship between items A, B, and C, indicating that customers who purchased A and B are more likely to also purchase item C. WIKI: https://en.wikipedia.org/wiki/Apriori_algorithm Examples: https://www.kaggle.com/code/earthian/apriori-association-rules-mining """ from collections import Counter from itertools import combinations def load_data() -> list[list[str]]: """ Returns a sample transaction dataset. >>> load_data() [['milk'], ['milk', 'butter'], ['milk', 'bread'], ['milk', 'bread', 'chips']] """ return [["milk"], ["milk", "butter"], ["milk", "bread"], ["milk", "bread", "chips"]] def prune(itemset: list, candidates: list, length: int) -> list: """ Prune candidate itemsets that are not frequent. The goal of pruning is to filter out candidate itemsets that are not frequent. This is done by checking if all the (k-1) subsets of a candidate itemset are present in the frequent itemsets of the previous iteration (valid subsequences of the frequent itemsets from the previous iteration). Prunes candidate itemsets that are not frequent. >>> itemset = ['X', 'Y', 'Z'] >>> candidates = [['X', 'Y'], ['X', 'Z'], ['Y', 'Z']] >>> prune(itemset, candidates, 2) [['X', 'Y'], ['X', 'Z'], ['Y', 'Z']] >>> itemset = ['1', '2', '3', '4'] >>> candidates = ['1', '2', '4'] >>> prune(itemset, candidates, 3) [] """ itemset_counter = Counter(tuple(item) for item in itemset) pruned = [] for candidate in candidates: is_subsequence = True for item in candidate: item_tuple = tuple(item) if ( item_tuple not in itemset_counter or itemset_counter[item_tuple] < length - 1 ): is_subsequence = False break if is_subsequence: pruned.append(candidate) return pruned def apriori(data: list[list[str]], min_support: int) -> list[tuple[list[str], int]]: """ Returns a list of frequent itemsets and their support counts. >>> data = [['A', 'B', 'C'], ['A', 'B'], ['A', 'C'], ['A', 'D'], ['B', 'C']] >>> apriori(data, 2) [(['A', 'B'], 1), (['A', 'C'], 2), (['B', 'C'], 2)] >>> data = [['1', '2', '3'], ['1', '2'], ['1', '3'], ['1', '4'], ['2', '3']] >>> apriori(data, 3) [] """ itemset = [list(transaction) for transaction in data] frequent_itemsets = [] length = 1 while itemset: # Count itemset support counts = [0] * len(itemset) for transaction in data: for j, candidate in enumerate(itemset): if all(item in transaction for item in candidate): counts[j] += 1 # Prune infrequent itemsets itemset = [item for i, item in enumerate(itemset) if counts[i] >= min_support] # Append frequent itemsets (as a list to maintain order) for i, item in enumerate(itemset): frequent_itemsets.append((sorted(item), counts[i])) length += 1 itemset = prune(itemset, list(combinations(itemset, length)), length) return frequent_itemsets if __name__ == "__main__": """ Apriori algorithm for finding frequent itemsets. Args: data: A list of transactions, where each transaction is a list of items. min_support: The minimum support threshold for frequent itemsets. Returns: A list of frequent itemsets along with their support counts. """ import doctest doctest.testmod() # user-defined threshold or minimum support level frequent_itemsets = apriori(data=load_data(), min_support=2) print("\n".join(f"{itemset}: {support}" for itemset, support in frequent_itemsets)) ================================================ FILE: machine_learning/astar.py ================================================ """ The A* algorithm combines features of uniform-cost search and pure heuristic search to efficiently compute optimal solutions. The A* algorithm is a best-first search algorithm in which the cost associated with a node is f(n) = g(n) + h(n), where g(n) is the cost of the path from the initial state to node n and h(n) is the heuristic estimate or the cost or a path from node n to a goal. The A* algorithm introduces a heuristic into a regular graph-searching algorithm, essentially planning ahead at each step so a more optimal decision is made. For this reason, A* is known as an algorithm with brains. https://en.wikipedia.org/wiki/A*_search_algorithm """ import numpy as np class Cell: """ Class cell represents a cell in the world which have the properties: position: represented by tuple of x and y coordinates initially set to (0,0). parent: Contains the parent cell object visited before we arrived at this cell. g, h, f: Parameters used when calling our heuristic function. """ def __init__(self): self.position = (0, 0) self.parent = None self.g = 0 self.h = 0 self.f = 0 """ Overrides equals method because otherwise cell assign will give wrong results. """ def __eq__(self, cell): return self.position == cell.position def showcell(self): print(self.position) class Gridworld: """ Gridworld class represents the external world here a grid M*M matrix. world_size: create a numpy array with the given world_size default is 5. """ def __init__(self, world_size=(5, 5)): self.w = np.zeros(world_size) self.world_x_limit = world_size[0] self.world_y_limit = world_size[1] def show(self): print(self.w) def get_neighbours(self, cell): """ Return the neighbours of cell """ neughbour_cord = [ (-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1), ] current_x = cell.position[0] current_y = cell.position[1] neighbours = [] for n in neughbour_cord: x = current_x + n[0] y = current_y + n[1] if 0 <= x < self.world_x_limit and 0 <= y < self.world_y_limit: c = Cell() c.position = (x, y) c.parent = cell neighbours.append(c) return neighbours def astar(world, start, goal): """ Implementation of a start algorithm. world : Object of the world object. start : Object of the cell as start position. stop : Object of the cell as goal position. >>> p = Gridworld() >>> start = Cell() >>> start.position = (0,0) >>> goal = Cell() >>> goal.position = (4,4) >>> astar(p, start, goal) [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)] """ _open = [] _closed = [] _open.append(start) while _open: min_f = np.argmin([n.f for n in _open]) current = _open[min_f] _closed.append(_open.pop(min_f)) if current == goal: break for n in world.get_neighbours(current): for c in _closed: if c == n: continue n.g = current.g + 1 x1, y1 = n.position x2, y2 = goal.position n.h = (y2 - y1) ** 2 + (x2 - x1) ** 2 n.f = n.h + n.g for c in _open: if c == n and c.f < n.f: continue _open.append(n) path = [] while current.parent is not None: path.append(current.position) current = current.parent path.append(current.position) return path[::-1] if __name__ == "__main__": world = Gridworld() # Start position and goal start = Cell() start.position = (0, 0) goal = Cell() goal.position = (4, 4) print(f"path from {start.position} to {goal.position}") s = astar(world, start, goal) # Just for visual reasons. for i in s: world.w[i] = 1 print(world.w) ================================================ FILE: machine_learning/automatic_differentiation.py ================================================ """ Demonstration of the Automatic Differentiation (Reverse mode). Reference: https://en.wikipedia.org/wiki/Automatic_differentiation Author: Poojan Smart Email: smrtpoojan@gmail.com """ from __future__ import annotations from collections import defaultdict from enum import Enum from types import TracebackType from typing import Any import numpy as np from typing_extensions import Self # noqa: UP035 class OpType(Enum): """ Class represents list of supported operations on Variable for gradient calculation. """ ADD = 0 SUB = 1 MUL = 2 DIV = 3 MATMUL = 4 POWER = 5 NOOP = 6 class Variable: """ Class represents n-dimensional object which is used to wrap numpy array on which operations will be performed and the gradient will be calculated. Examples: >>> Variable(5.0) Variable(5.0) >>> Variable([5.0, 2.9]) Variable([5. 2.9]) >>> Variable([5.0, 2.9]) + Variable([1.0, 5.5]) Variable([6. 8.4]) >>> Variable([[8.0, 10.0]]) Variable([[ 8. 10.]]) """ def __init__(self, value: Any) -> None: self.value = np.array(value) # pointers to the operations to which the Variable is input self.param_to: list[Operation] = [] # pointer to the operation of which the Variable is output of self.result_of: Operation = Operation(OpType.NOOP) def __repr__(self) -> str: return f"Variable({self.value})" def to_ndarray(self) -> np.ndarray: return self.value def __add__(self, other: Variable) -> Variable: result = Variable(self.value + other.value) with GradientTracker() as tracker: # if tracker is enabled, computation graph will be updated if tracker.enabled: tracker.append(OpType.ADD, params=[self, other], output=result) return result def __sub__(self, other: Variable) -> Variable: result = Variable(self.value - other.value) with GradientTracker() as tracker: # if tracker is enabled, computation graph will be updated if tracker.enabled: tracker.append(OpType.SUB, params=[self, other], output=result) return result def __mul__(self, other: Variable) -> Variable: result = Variable(self.value * other.value) with GradientTracker() as tracker: # if tracker is enabled, computation graph will be updated if tracker.enabled: tracker.append(OpType.MUL, params=[self, other], output=result) return result def __truediv__(self, other: Variable) -> Variable: result = Variable(self.value / other.value) with GradientTracker() as tracker: # if tracker is enabled, computation graph will be updated if tracker.enabled: tracker.append(OpType.DIV, params=[self, other], output=result) return result def __matmul__(self, other: Variable) -> Variable: result = Variable(self.value @ other.value) with GradientTracker() as tracker: # if tracker is enabled, computation graph will be updated if tracker.enabled: tracker.append(OpType.MATMUL, params=[self, other], output=result) return result def __pow__(self, power: int) -> Variable: result = Variable(self.value**power) with GradientTracker() as tracker: # if tracker is enabled, computation graph will be updated if tracker.enabled: tracker.append( OpType.POWER, params=[self], output=result, other_params={"power": power}, ) return result def add_param_to(self, param_to: Operation) -> None: self.param_to.append(param_to) def add_result_of(self, result_of: Operation) -> None: self.result_of = result_of class Operation: """ Class represents operation between single or two Variable objects. Operation objects contains type of operation, pointers to input Variable objects and pointer to resulting Variable from the operation. """ def __init__( self, op_type: OpType, other_params: dict | None = None, ) -> None: self.op_type = op_type self.other_params = {} if other_params is None else other_params def add_params(self, params: list[Variable]) -> None: self.params = params def add_output(self, output: Variable) -> None: self.output = output def __eq__(self, value) -> bool: return self.op_type == value if isinstance(value, OpType) else False class GradientTracker: """ Class contains methods to compute partial derivatives of Variable based on the computation graph. Examples: >>> with GradientTracker() as tracker: ... a = Variable([2.0, 5.0]) ... b = Variable([1.0, 2.0]) ... m = Variable([1.0, 2.0]) ... c = a + b ... d = a * b ... e = c / d >>> tracker.gradient(e, a) array([-0.25, -0.04]) >>> tracker.gradient(e, b) array([-1. , -0.25]) >>> tracker.gradient(e, m) is None True >>> with GradientTracker() as tracker: ... a = Variable([[2.0, 5.0]]) ... b = Variable([[1.0], [2.0]]) ... c = a @ b >>> tracker.gradient(c, a) array([[1., 2.]]) >>> tracker.gradient(c, b) array([[2.], [5.]]) >>> with GradientTracker() as tracker: ... a = Variable([[2.0, 5.0]]) ... b = a ** 3 >>> tracker.gradient(b, a) array([[12., 75.]]) """ instance = None def __new__(cls) -> Self: """ Executes at the creation of class object and returns if object is already created. This class follows singleton design pattern. """ if cls.instance is None: cls.instance = super().__new__(cls) return cls.instance def __init__(self) -> None: self.enabled = False def __enter__(self) -> Self: self.enabled = True return self def __exit__( self, exc_type: type[BaseException] | None, exc: BaseException | None, traceback: TracebackType | None, ) -> None: self.enabled = False def append( self, op_type: OpType, params: list[Variable], output: Variable, other_params: dict | None = None, ) -> None: """ Adds Operation object to the related Variable objects for creating computational graph for calculating gradients. Args: op_type: Operation type params: Input parameters to the operation output: Output variable of the operation """ operation = Operation(op_type, other_params=other_params) param_nodes = [] for param in params: param.add_param_to(operation) param_nodes.append(param) output.add_result_of(operation) operation.add_params(param_nodes) operation.add_output(output) def gradient(self, target: Variable, source: Variable) -> np.ndarray | None: """ Reverse accumulation of partial derivatives to calculate gradients of target variable with respect to source variable. Args: target: target variable for which gradients are calculated. source: source variable with respect to which the gradients are calculated. Returns: Gradient of the source variable with respect to the target variable """ # partial derivatives with respect to target partial_deriv = defaultdict(lambda: 0) partial_deriv[target] = np.ones_like(target.to_ndarray()) # iterating through each operations in the computation graph operation_queue = [target.result_of] while len(operation_queue) > 0: operation = operation_queue.pop() for param in operation.params: # as per the chain rule, multiplying partial derivatives # of variables with respect to the target dparam_doutput = self.derivative(param, operation) dparam_dtarget = dparam_doutput * partial_deriv[operation.output] partial_deriv[param] += dparam_dtarget if param.result_of and param.result_of != OpType.NOOP: operation_queue.append(param.result_of) return partial_deriv.get(source) def derivative(self, param: Variable, operation: Operation) -> np.ndarray: """ Compute the derivative of given operation/function Args: param: variable to be differentiated operation: function performed on the input variable Returns: Derivative of input variable with respect to the output of the operation """ params = operation.params if operation == OpType.ADD: return np.ones_like(params[0].to_ndarray(), dtype=np.float64) if operation == OpType.SUB: if params[0] == param: return np.ones_like(params[0].to_ndarray(), dtype=np.float64) return -np.ones_like(params[1].to_ndarray(), dtype=np.float64) if operation == OpType.MUL: return ( params[1].to_ndarray().T if params[0] == param else params[0].to_ndarray().T ) if operation == OpType.DIV: if params[0] == param: return 1 / params[1].to_ndarray() return -params[0].to_ndarray() / (params[1].to_ndarray() ** 2) if operation == OpType.MATMUL: return ( params[1].to_ndarray().T if params[0] == param else params[0].to_ndarray().T ) if operation == OpType.POWER: power = operation.other_params["power"] return power * (params[0].to_ndarray() ** (power - 1)) err_msg = f"invalid operation type: {operation.op_type}" raise ValueError(err_msg) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: machine_learning/data_transformations.py ================================================ """ Normalization. Wikipedia: https://en.wikipedia.org/wiki/Normalization Normalization is the process of converting numerical data to a standard range of values. This range is typically between [0, 1] or [-1, 1]. The equation for normalization is x_norm = (x - x_min)/(x_max - x_min) where x_norm is the normalized value, x is the value, x_min is the minimum value within the column or list of data, and x_max is the maximum value within the column or list of data. Normalization is used to speed up the training of data and put all of the data on a similar scale. This is useful because variance in the range of values of a dataset can heavily impact optimization (particularly Gradient Descent). Standardization Wikipedia: https://en.wikipedia.org/wiki/Standardization Standardization is the process of converting numerical data to a normally distributed range of values. This range will have a mean of 0 and standard deviation of 1. This is also known as z-score normalization. The equation for standardization is x_std = (x - mu)/(sigma) where mu is the mean of the column or list of values and sigma is the standard deviation of the column or list of values. Choosing between Normalization & Standardization is more of an art of a science, but it is often recommended to run experiments with both to see which performs better. Additionally, a few rules of thumb are: 1. gaussian (normal) distributions work better with standardization 2. non-gaussian (non-normal) distributions work better with normalization 3. If a column or list of values has extreme values / outliers, use standardization """ from statistics import mean, stdev def normalization(data: list, ndigits: int = 3) -> list: """ Return a normalized list of values. @params: data, a list of values to normalize @returns: a list of normalized values (rounded to ndigits decimal places) @examples: >>> normalization([2, 7, 10, 20, 30, 50]) [0.0, 0.104, 0.167, 0.375, 0.583, 1.0] >>> normalization([5, 10, 15, 20, 25]) [0.0, 0.25, 0.5, 0.75, 1.0] """ # variables for calculation x_min = min(data) x_max = max(data) # normalize data return [round((x - x_min) / (x_max - x_min), ndigits) for x in data] def standardization(data: list, ndigits: int = 3) -> list: """ Return a standardized list of values. @params: data, a list of values to standardize @returns: a list of standardized values (rounded to ndigits decimal places) @examples: >>> standardization([2, 7, 10, 20, 30, 50]) [-0.999, -0.719, -0.551, 0.009, 0.57, 1.69] >>> standardization([5, 10, 15, 20, 25]) [-1.265, -0.632, 0.0, 0.632, 1.265] """ # variables for calculation mu = mean(data) sigma = stdev(data) # standardize data return [round((x - mu) / (sigma), ndigits) for x in data] ================================================ FILE: machine_learning/decision_tree.py ================================================ """ Implementation of a basic regression decision tree. Input data set: The input data set must be 1-dimensional with continuous labels. Output: The decision tree maps a real number input to a real number output. """ import numpy as np class DecisionTree: def __init__(self, depth=5, min_leaf_size=5): self.depth = depth self.decision_boundary = 0 self.left = None self.right = None self.min_leaf_size = min_leaf_size self.prediction = None def mean_squared_error(self, labels, prediction): """ mean_squared_error: @param labels: a one-dimensional numpy array @param prediction: a floating point value return value: mean_squared_error calculates the error if prediction is used to estimate the labels >>> tester = DecisionTree() >>> test_labels = np.array([1,2,3,4,5,6,7,8,9,10]) >>> test_prediction = float(6) >>> bool(tester.mean_squared_error(test_labels, test_prediction) == ( ... TestDecisionTree.helper_mean_squared_error_test(test_labels, ... test_prediction))) True >>> test_labels = np.array([1,2,3]) >>> test_prediction = float(2) >>> bool(tester.mean_squared_error(test_labels, test_prediction) == ( ... TestDecisionTree.helper_mean_squared_error_test(test_labels, ... test_prediction))) True """ if labels.ndim != 1: print("Error: Input labels must be one dimensional") return np.mean((labels - prediction) ** 2) def train(self, x, y): """ train: @param x: a one-dimensional numpy array @param y: a one-dimensional numpy array. The contents of y are the labels for the corresponding X values train() does not have a return value Examples: 1. Try to train when x & y are of same length & 1 dimensions (No errors) >>> dt = DecisionTree() >>> dt.train(np.array([10,20,30,40,50]),np.array([0,0,0,1,1])) 2. Try to train when x is 2 dimensions >>> dt = DecisionTree() >>> dt.train(np.array([[1,2,3,4,5],[1,2,3,4,5]]),np.array([0,0,0,1,1])) Traceback (most recent call last): ... ValueError: Input data set must be one-dimensional 3. Try to train when x and y are not of the same length >>> dt = DecisionTree() >>> dt.train(np.array([1,2,3,4,5]),np.array([[0,0,0,1,1],[0,0,0,1,1]])) Traceback (most recent call last): ... ValueError: x and y have different lengths 4. Try to train when x & y are of the same length but different dimensions >>> dt = DecisionTree() >>> dt.train(np.array([1,2,3,4,5]),np.array([[1],[2],[3],[4],[5]])) Traceback (most recent call last): ... ValueError: Data set labels must be one-dimensional This section is to check that the inputs conform to our dimensionality constraints """ if x.ndim != 1: raise ValueError("Input data set must be one-dimensional") if len(x) != len(y): raise ValueError("x and y have different lengths") if y.ndim != 1: raise ValueError("Data set labels must be one-dimensional") if len(x) < 2 * self.min_leaf_size: self.prediction = np.mean(y) return if self.depth == 1: self.prediction = np.mean(y) return best_split = 0 min_error = self.mean_squared_error(x, np.mean(y)) * 2 """ loop over all possible splits for the decision tree. find the best split. if no split exists that is less than 2 * error for the entire array then the data set is not split and the average for the entire array is used as the predictor """ for i in range(len(x)): if len(x[:i]) < self.min_leaf_size: # noqa: SIM114 continue elif len(x[i:]) < self.min_leaf_size: continue else: error_left = self.mean_squared_error(x[:i], np.mean(y[:i])) error_right = self.mean_squared_error(x[i:], np.mean(y[i:])) error = error_left + error_right if error < min_error: best_split = i min_error = error if best_split != 0: left_x = x[:best_split] left_y = y[:best_split] right_x = x[best_split:] right_y = y[best_split:] self.decision_boundary = x[best_split] self.left = DecisionTree( depth=self.depth - 1, min_leaf_size=self.min_leaf_size ) self.right = DecisionTree( depth=self.depth - 1, min_leaf_size=self.min_leaf_size ) self.left.train(left_x, left_y) self.right.train(right_x, right_y) else: self.prediction = np.mean(y) return def predict(self, x): """ predict: @param x: a floating point value to predict the label of the prediction function works by recursively calling the predict function of the appropriate subtrees based on the tree's decision boundary """ if self.prediction is not None: return self.prediction elif self.left is not None and self.right is not None: if x >= self.decision_boundary: return self.right.predict(x) else: return self.left.predict(x) else: raise ValueError("Decision tree not yet trained") class TestDecisionTree: """Decision Tres test class""" @staticmethod def helper_mean_squared_error_test(labels, prediction): """ helper_mean_squared_error_test: @param labels: a one dimensional numpy array @param prediction: a floating point value return value: helper_mean_squared_error_test calculates the mean squared error """ squared_error_sum = float(0) for label in labels: squared_error_sum += (label - prediction) ** 2 return float(squared_error_sum / labels.size) def main(): """ In this demonstration we're generating a sample data set from the sin function in numpy. We then train a decision tree on the data set and use the decision tree to predict the label of 10 different test values. Then the mean squared error over this test is displayed. """ x = np.arange(-1.0, 1.0, 0.005) y = np.sin(x) tree = DecisionTree(depth=10, min_leaf_size=10) tree.train(x, y) rng = np.random.default_rng() test_cases = (rng.random(10) * 2) - 1 predictions = np.array([tree.predict(x) for x in test_cases]) avg_error = np.mean((predictions - test_cases) ** 2) print("Test values: " + str(test_cases)) print("Predictions: " + str(predictions)) print("Average error: " + str(avg_error)) if __name__ == "__main__": main() import doctest doctest.testmod(name="mean_squared_error", verbose=True) ================================================ FILE: machine_learning/dimensionality_reduction.py ================================================ # Copyright (c) 2023 Diego Gasco (diego.gasco99@gmail.com), Diegomangasco on GitHub """ Requirements: - numpy version 1.21 - scipy version 1.3.3 Notes: - Each column of the features matrix corresponds to a class item """ import logging import numpy as np import pytest from scipy.linalg import eigh logging.basicConfig(level=logging.INFO, format="%(message)s") def column_reshape(input_array: np.ndarray) -> np.ndarray: """Function to reshape a row Numpy array into a column Numpy array >>> input_array = np.array([1, 2, 3]) >>> column_reshape(input_array) array([[1], [2], [3]]) """ return input_array.reshape((input_array.size, 1)) def covariance_within_classes( features: np.ndarray, labels: np.ndarray, classes: int ) -> np.ndarray: """Function to compute the covariance matrix inside each class. >>> features = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) >>> labels = np.array([0, 1, 0]) >>> covariance_within_classes(features, labels, 2) array([[0.66666667, 0.66666667, 0.66666667], [0.66666667, 0.66666667, 0.66666667], [0.66666667, 0.66666667, 0.66666667]]) """ covariance_sum = np.nan for i in range(classes): data = features[:, labels == i] data_mean = data.mean(1) # Centralize the data of class i centered_data = data - column_reshape(data_mean) if i > 0: # If covariance_sum is not None covariance_sum += np.dot(centered_data, centered_data.T) else: # If covariance_sum is np.nan (i.e. first loop) covariance_sum = np.dot(centered_data, centered_data.T) return covariance_sum / features.shape[1] def covariance_between_classes( features: np.ndarray, labels: np.ndarray, classes: int ) -> np.ndarray: """Function to compute the covariance matrix between multiple classes >>> features = np.array([[9, 2, 3], [4, 3, 6], [1, 8, 9]]) >>> labels = np.array([0, 1, 0]) >>> covariance_between_classes(features, labels, 2) array([[ 3.55555556, 1.77777778, -2.66666667], [ 1.77777778, 0.88888889, -1.33333333], [-2.66666667, -1.33333333, 2. ]]) """ general_data_mean = features.mean(1) covariance_sum = np.nan for i in range(classes): data = features[:, labels == i] device_data = data.shape[1] data_mean = data.mean(1) if i > 0: # If covariance_sum is not None covariance_sum += device_data * np.dot( column_reshape(data_mean) - column_reshape(general_data_mean), (column_reshape(data_mean) - column_reshape(general_data_mean)).T, ) else: # If covariance_sum is np.nan (i.e. first loop) covariance_sum = device_data * np.dot( column_reshape(data_mean) - column_reshape(general_data_mean), (column_reshape(data_mean) - column_reshape(general_data_mean)).T, ) return covariance_sum / features.shape[1] def principal_component_analysis(features: np.ndarray, dimensions: int) -> np.ndarray: """ Principal Component Analysis. For more details, see: https://en.wikipedia.org/wiki/Principal_component_analysis. Parameters: * features: the features extracted from the dataset * dimensions: to filter the projected data for the desired dimension >>> test_principal_component_analysis() """ # Check if the features have been loaded if features.any(): data_mean = features.mean(1) # Center the dataset centered_data = features - np.reshape(data_mean, (data_mean.size, 1)) covariance_matrix = np.dot(centered_data, centered_data.T) / features.shape[1] _, eigenvectors = np.linalg.eigh(covariance_matrix) # Take all the columns in the reverse order (-1), and then takes only the first filtered_eigenvectors = eigenvectors[:, ::-1][:, 0:dimensions] # Project the database on the new space projected_data = np.dot(filtered_eigenvectors.T, features) logging.info("Principal Component Analysis computed") return projected_data else: logging.basicConfig(level=logging.ERROR, format="%(message)s", force=True) logging.error("Dataset empty") raise AssertionError def linear_discriminant_analysis( features: np.ndarray, labels: np.ndarray, classes: int, dimensions: int ) -> np.ndarray: """ Linear Discriminant Analysis. For more details, see: https://en.wikipedia.org/wiki/Linear_discriminant_analysis. Parameters: * features: the features extracted from the dataset * labels: the class labels of the features * classes: the number of classes present in the dataset * dimensions: to filter the projected data for the desired dimension >>> test_linear_discriminant_analysis() """ # Check if the dimension desired is less than the number of classes assert classes > dimensions # Check if features have been already loaded if features.any: _, eigenvectors = eigh( covariance_between_classes(features, labels, classes), covariance_within_classes(features, labels, classes), ) filtered_eigenvectors = eigenvectors[:, ::-1][:, :dimensions] svd_matrix, _, _ = np.linalg.svd(filtered_eigenvectors) filtered_svd_matrix = svd_matrix[:, 0:dimensions] projected_data = np.dot(filtered_svd_matrix.T, features) logging.info("Linear Discriminant Analysis computed") return projected_data else: logging.basicConfig(level=logging.ERROR, format="%(message)s", force=True) logging.error("Dataset empty") raise AssertionError def test_linear_discriminant_analysis() -> None: # Create dummy dataset with 2 classes and 3 features features = np.array([[1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7]]) labels = np.array([0, 0, 0, 1, 1]) classes = 2 dimensions = 2 # Assert that the function raises an AssertionError if dimensions > classes with pytest.raises(AssertionError) as error_info: # noqa: PT012 projected_data = linear_discriminant_analysis( features, labels, classes, dimensions ) if isinstance(projected_data, np.ndarray): raise AssertionError( "Did not raise AssertionError for dimensions > classes" ) assert error_info.type is AssertionError def test_principal_component_analysis() -> None: features = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) dimensions = 2 expected_output = np.array([[6.92820323, 8.66025404, 10.39230485], [3.0, 3.0, 3.0]]) with pytest.raises(AssertionError) as error_info: # noqa: PT012 output = principal_component_analysis(features, dimensions) if not np.allclose(expected_output, output): raise AssertionError assert error_info.type is AssertionError if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: machine_learning/forecasting/__init__.py ================================================ ================================================ FILE: machine_learning/forecasting/ex_data.csv ================================================ total_users,total_events,days 18231,0.0,1 22621,1.0,2 15675,0.0,3 23583,1.0,4 68351,5.0,5 34338,3.0,6 19238,0.0,0 24192,0.0,1 70349,0.0,2 103510,0.0,3 128355,1.0,4 148484,6.0,5 153489,3.0,6 162667,1.0,0 311430,3.0,1 435663,7.0,2 273526,0.0,3 628588,2.0,4 454989,13.0,5 539040,3.0,6 52974,1.0,0 103451,2.0,1 810020,5.0,2 580982,3.0,3 216515,0.0,4 134694,10.0,5 93563,1.0,6 55432,1.0,0 169634,1.0,1 254908,4.0,2 315285,3.0,3 191764,0.0,4 514284,7.0,5 181214,4.0,6 78459,2.0,0 161620,3.0,1 245610,4.0,2 326722,5.0,3 214578,0.0,4 312365,5.0,5 232454,4.0,6 178368,1.0,0 97152,1.0,1 222813,4.0,2 285852,4.0,3 192149,1.0,4 142241,1.0,5 173011,2.0,6 56488,3.0,0 89572,2.0,1 356082,2.0,2 172799,0.0,3 142300,1.0,4 78432,2.0,5 539023,9.0,6 62389,1.0,0 70247,1.0,1 89229,0.0,2 94583,1.0,3 102455,0.0,4 129270,0.0,5 311409,1.0,6 1837026,0.0,0 361824,0.0,1 111379,2.0,2 76337,2.0,3 96747,0.0,4 92058,0.0,5 81929,2.0,6 143423,0.0,0 82939,0.0,1 74403,1.0,2 68234,0.0,3 94556,1.0,4 80311,0.0,5 75283,3.0,6 77724,0.0,0 49229,2.0,1 65708,2.0,2 273864,1.0,3 1711281,0.0,4 1900253,5.0,5 343071,1.0,6 1551326,0.0,0 56636,1.0,1 272782,2.0,2 1785678,0.0,3 241866,0.0,4 461904,0.0,5 2191901,2.0,6 102925,0.0,0 242778,1.0,1 298608,0.0,2 322458,10.0,3 216027,9.0,4 916052,12.0,5 193278,12.0,6 263207,8.0,0 672948,10.0,1 281909,1.0,2 384562,1.0,3 1027375,2.0,4 828905,9.0,5 624188,22.0,6 392218,8.0,0 292581,10.0,1 299869,12.0,2 769455,20.0,3 316443,8.0,4 1212864,24.0,5 1397338,28.0,6 223249,8.0,0 191264,14.0,1 ================================================ FILE: machine_learning/forecasting/run.py ================================================ """ this is code for forecasting but I modified it and used it for safety checker of data for ex: you have an online shop and for some reason some data are missing (the amount of data that u expected are not supposed to be) then we can use it *ps : 1. ofc we can use normal statistic method but in this case the data is quite absurd and only a little^^ 2. ofc u can use this and modified it for forecasting purpose for the next 3 months sales or something, u can just adjust it for ur own purpose """ from warnings import simplefilter import numpy as np import pandas as pd from sklearn.preprocessing import Normalizer from sklearn.svm import SVR from statsmodels.tsa.statespace.sarimax import SARIMAX def linear_regression_prediction( train_dt: list, train_usr: list, train_mtch: list, test_dt: list, test_mtch: list ) -> float: """ First method: linear regression input : training data (date, total_user, total_event) in list of float output : list of total user prediction in float >>> n = linear_regression_prediction([2,3,4,5], [5,3,4,6], [3,1,2,4], [2,1], [2,2]) >>> bool(abs(n - 5.0) < 1e-6) # Checking precision because of floating point errors True """ x = np.array([[1, item, train_mtch[i]] for i, item in enumerate(train_dt)]) y = np.array(train_usr) beta = np.dot(np.dot(np.linalg.inv(np.dot(x.transpose(), x)), x.transpose()), y) return abs(beta[0] + test_dt[0] * beta[1] + test_mtch[0] + beta[2]) def sarimax_predictor(train_user: list, train_match: list, test_match: list) -> float: """ second method: Sarimax sarimax is a statistic method which using previous input and learn its pattern to predict future data input : training data (total_user, with exog data = total_event) in list of float output : list of total user prediction in float >>> sarimax_predictor([4,2,6,8], [3,1,2,4], [2]) 6.6666671111109626 """ # Suppress the User Warning raised by SARIMAX due to insufficient observations simplefilter("ignore", UserWarning) order = (1, 2, 1) seasonal_order = (1, 1, 1, 7) model = SARIMAX( train_user, exog=train_match, order=order, seasonal_order=seasonal_order ) model_fit = model.fit(disp=False, maxiter=600, method="nm") result = model_fit.predict(1, len(test_match), exog=[test_match]) return float(result[0]) def support_vector_regressor(x_train: list, x_test: list, train_user: list) -> float: """ Third method: Support vector regressor svr is quite the same with svm(support vector machine) it uses the same principles as the SVM for classification, with only a few minor differences and the only different is that it suits better for regression purpose input : training data (date, total_user, total_event) in list of float where x = list of set (date and total event) output : list of total user prediction in float >>> support_vector_regressor([[5,2],[1,5],[6,2]], [[3,2]], [2,1,4]) 1.634932078116079 """ regressor = SVR(kernel="rbf", C=1, gamma=0.1, epsilon=0.1) regressor.fit(x_train, train_user) y_pred = regressor.predict(x_test) return float(y_pred[0]) def interquartile_range_checker(train_user: list) -> float: """ Optional method: interquatile range input : list of total user in float output : low limit of input in float this method can be used to check whether some data is outlier or not >>> interquartile_range_checker([1,2,3,4,5,6,7,8,9,10]) 2.8 """ train_user.sort() q1 = np.percentile(train_user, 25) q3 = np.percentile(train_user, 75) iqr = q3 - q1 low_lim = q1 - (iqr * 0.1) return float(low_lim) def data_safety_checker(list_vote: list, actual_result: float) -> bool: """ Used to review all the votes (list result prediction) and compare it to the actual result. input : list of predictions output : print whether it's safe or not >>> data_safety_checker([2, 3, 4], 5.0) False """ safe = 0 not_safe = 0 if not isinstance(actual_result, float): raise TypeError("Actual result should be float. Value passed is a list") for i in list_vote: if i > actual_result: safe = not_safe + 1 elif abs(abs(i) - abs(actual_result)) <= 0.1: safe += 1 else: not_safe += 1 return safe > not_safe if __name__ == "__main__": """ data column = total user in a day, how much online event held in one day, what day is that(sunday-saturday) """ data_input_df = pd.read_csv("ex_data.csv") # start normalization normalize_df = Normalizer().fit_transform(data_input_df.values) # split data total_date = normalize_df[:, 2].tolist() total_user = normalize_df[:, 0].tolist() total_match = normalize_df[:, 1].tolist() # for svr (input variable = total date and total match) x = normalize_df[:, [1, 2]].tolist() x_train = x[: len(x) - 1] x_test = x[len(x) - 1 :] # for linear regression & sarimax train_date = total_date[: len(total_date) - 1] train_user = total_user[: len(total_user) - 1] train_match = total_match[: len(total_match) - 1] test_date = total_date[len(total_date) - 1 :] test_user = total_user[len(total_user) - 1 :] test_match = total_match[len(total_match) - 1 :] # voting system with forecasting res_vote = [ linear_regression_prediction( train_date, train_user, train_match, test_date, test_match ), sarimax_predictor(train_user, train_match, test_match), support_vector_regressor(x_train, x_test, train_user), ] # check the safety of today's data not_str = "" if data_safety_checker(res_vote, test_user[0]) else "not " print(f"Today's data is {not_str}safe.") ================================================ FILE: machine_learning/frequent_pattern_growth.py ================================================ """ The Frequent Pattern Growth algorithm (FP-Growth) is a widely used data mining technique for discovering frequent itemsets in large transaction databases. It overcomes some of the limitations of traditional methods such as Apriori by efficiently constructing the FP-Tree WIKI: https://athena.ecs.csus.edu/~mei/associationcw/FpGrowth.html Examples: https://www.javatpoint.com/fp-growth-algorithm-in-data-mining """ from __future__ import annotations from dataclasses import dataclass, field @dataclass class TreeNode: """ A node in a Frequent Pattern tree. Args: name: The name of this node. num_occur: The number of occurrences of the node. parent_node: The parent node. Example: >>> parent = TreeNode("Parent", 1, None) >>> child = TreeNode("Child", 2, parent) >>> child.name 'Child' >>> child.count 2 """ name: str count: int parent: TreeNode | None = None children: dict[str, TreeNode] = field(default_factory=dict) node_link: TreeNode | None = None def __repr__(self) -> str: return f"TreeNode({self.name!r}, {self.count!r}, {self.parent!r})" def inc(self, num_occur: int) -> None: self.count += num_occur def disp(self, ind: int = 1) -> None: print(f"{' ' * ind} {self.name} {self.count}") for child in self.children.values(): child.disp(ind + 1) def create_tree(data_set: list, min_sup: int = 1) -> tuple[TreeNode, dict]: """ Create Frequent Pattern tree Args: data_set: A list of transactions, where each transaction is a list of items. min_sup: The minimum support threshold. Items with support less than this will be pruned. Default is 1. Returns: The root of the FP-Tree. header_table: The header table dictionary with item information. Example: >>> data_set = [ ... ['A', 'B', 'C'], ... ['A', 'C'], ... ['A', 'B', 'E'], ... ['A', 'B', 'C', 'E'], ... ['B', 'E'] ... ] >>> min_sup = 2 >>> fp_tree, header_table = create_tree(data_set, min_sup) >>> fp_tree TreeNode('Null Set', 1, None) >>> len(header_table) 4 >>> header_table["A"] [[4, None], TreeNode('A', 4, TreeNode('Null Set', 1, None))] >>> header_table["E"][1] # doctest: +NORMALIZE_WHITESPACE TreeNode('E', 1, TreeNode('B', 3, TreeNode('A', 4, TreeNode('Null Set', 1, None)))) >>> sorted(header_table) ['A', 'B', 'C', 'E'] >>> fp_tree.name 'Null Set' >>> sorted(fp_tree.children) ['A', 'B'] >>> fp_tree.children['A'].name 'A' >>> sorted(fp_tree.children['A'].children) ['B', 'C'] """ header_table: dict = {} for trans in data_set: for item in trans: header_table[item] = header_table.get(item, [0, None]) header_table[item][0] += 1 for k in list(header_table): if header_table[k][0] < min_sup: del header_table[k] if not (freq_item_set := set(header_table)): return TreeNode("Null Set", 1, None), {} for key, value in header_table.items(): header_table[key] = [value, None] fp_tree = TreeNode("Null Set", 1, None) # Parent is None for the root node for tran_set in data_set: local_d = { item: header_table[item][0] for item in tran_set if item in freq_item_set } if local_d: sorted_items = sorted( local_d.items(), key=lambda item_info: item_info[1], reverse=True ) ordered_items = [item[0] for item in sorted_items] update_tree(ordered_items, fp_tree, header_table, 1) return fp_tree, header_table def update_tree(items: list, in_tree: TreeNode, header_table: dict, count: int) -> None: """ Update the FP-Tree with a transaction. Args: items: List of items in the transaction. in_tree: The current node in the FP-Tree. header_table: The header table dictionary with item information. count: The count of the transaction. Example: >>> data_set = [ ... ['A', 'B', 'C'], ... ['A', 'C'], ... ['A', 'B', 'E'], ... ['A', 'B', 'C', 'E'], ... ['B', 'E'] ... ] >>> min_sup = 2 >>> fp_tree, header_table = create_tree(data_set, min_sup) >>> fp_tree TreeNode('Null Set', 1, None) >>> transaction = ['A', 'B', 'E'] >>> update_tree(transaction, fp_tree, header_table, 1) >>> fp_tree TreeNode('Null Set', 1, None) >>> fp_tree.children['A'].children['B'].children['E'].children {} >>> fp_tree.children['A'].children['B'].children['E'].count 2 >>> header_table['E'][1].name 'E' """ if items[0] in in_tree.children: in_tree.children[items[0]].inc(count) else: in_tree.children[items[0]] = TreeNode(items[0], count, in_tree) if header_table[items[0]][1] is None: header_table[items[0]][1] = in_tree.children[items[0]] else: update_header(header_table[items[0]][1], in_tree.children[items[0]]) if len(items) > 1: update_tree(items[1:], in_tree.children[items[0]], header_table, count) def update_header(node_to_test: TreeNode, target_node: TreeNode) -> TreeNode: """ Update the header table with a node link. Args: node_to_test: The node to be updated in the header table. target_node: The node to link to. Example: >>> data_set = [ ... ['A', 'B', 'C'], ... ['A', 'C'], ... ['A', 'B', 'E'], ... ['A', 'B', 'C', 'E'], ... ['B', 'E'] ... ] >>> min_sup = 2 >>> fp_tree, header_table = create_tree(data_set, min_sup) >>> fp_tree TreeNode('Null Set', 1, None) >>> node1 = TreeNode("A", 3, None) >>> node2 = TreeNode("B", 4, None) >>> node1 TreeNode('A', 3, None) >>> node1 = update_header(node1, node2) >>> node1 TreeNode('A', 3, None) >>> node1.node_link TreeNode('B', 4, None) >>> node2.node_link is None True """ while node_to_test.node_link is not None: node_to_test = node_to_test.node_link if node_to_test.node_link is None: node_to_test.node_link = target_node # Return the updated node return node_to_test def ascend_tree(leaf_node: TreeNode, prefix_path: list[str]) -> None: """ Ascend the FP-Tree from a leaf node to its root, adding item names to the prefix path. Args: leaf_node: The leaf node to start ascending from. prefix_path: A list to store the item as they are ascended. Example: >>> data_set = [ ... ['A', 'B', 'C'], ... ['A', 'C'], ... ['A', 'B', 'E'], ... ['A', 'B', 'C', 'E'], ... ['B', 'E'] ... ] >>> min_sup = 2 >>> fp_tree, header_table = create_tree(data_set, min_sup) >>> path = [] >>> ascend_tree(fp_tree.children['A'], path) >>> path # ascending from a leaf node 'A' ['A'] """ if leaf_node.parent is not None: prefix_path.append(leaf_node.name) ascend_tree(leaf_node.parent, prefix_path) def find_prefix_path(base_pat: frozenset, tree_node: TreeNode | None) -> dict: # noqa: ARG001 """ Find the conditional pattern base for a given base pattern. Args: base_pat: The base pattern for which to find the conditional pattern base. tree_node: The node in the FP-Tree. Example: >>> data_set = [ ... ['A', 'B', 'C'], ... ['A', 'C'], ... ['A', 'B', 'E'], ... ['A', 'B', 'C', 'E'], ... ['B', 'E'] ... ] >>> min_sup = 2 >>> fp_tree, header_table = create_tree(data_set, min_sup) >>> fp_tree TreeNode('Null Set', 1, None) >>> len(header_table) 4 >>> base_pattern = frozenset(['A']) >>> sorted(find_prefix_path(base_pattern, fp_tree.children['A'])) [] """ cond_pats: dict = {} while tree_node is not None: prefix_path: list = [] ascend_tree(tree_node, prefix_path) if len(prefix_path) > 1: cond_pats[frozenset(prefix_path[1:])] = tree_node.count tree_node = tree_node.node_link return cond_pats def mine_tree( in_tree: TreeNode, # noqa: ARG001 header_table: dict, min_sup: int, pre_fix: set, freq_item_list: list, ) -> None: """ Mine the FP-Tree recursively to discover frequent itemsets. Args: in_tree: The FP-Tree to mine. header_table: The header table dictionary with item information. min_sup: The minimum support threshold. pre_fix: A set of items as a prefix for the itemsets being mined. freq_item_list: A list to store the frequent itemsets. Example: >>> data_set = [ ... ['A', 'B', 'C'], ... ['A', 'C'], ... ['A', 'B', 'E'], ... ['A', 'B', 'C', 'E'], ... ['B', 'E'] ... ] >>> min_sup = 2 >>> fp_tree, header_table = create_tree(data_set, min_sup) >>> fp_tree TreeNode('Null Set', 1, None) >>> frequent_itemsets = [] >>> mine_tree(fp_tree, header_table, min_sup, set([]), frequent_itemsets) >>> expe_itm = [{'C'}, {'C', 'A'}, {'E'}, {'A', 'E'}, {'E', 'B'}, {'A'}, {'B'}] >>> all(expected in frequent_itemsets for expected in expe_itm) True """ sorted_items = sorted(header_table.items(), key=lambda item_info: item_info[1][0]) big_l = [item[0] for item in sorted_items] for base_pat in big_l: new_freq_set = pre_fix.copy() new_freq_set.add(base_pat) freq_item_list.append(new_freq_set) cond_patt_bases = find_prefix_path(base_pat, header_table[base_pat][1]) my_cond_tree, my_head = create_tree(list(cond_patt_bases), min_sup) if my_head is not None: # Pass header_table[base_pat][1] as node_to_test to update_header header_table[base_pat][1] = update_header( header_table[base_pat][1], my_cond_tree ) mine_tree(my_cond_tree, my_head, min_sup, new_freq_set, freq_item_list) if __name__ == "__main__": from doctest import testmod testmod() data_set: list[frozenset] = [ frozenset(["bread", "milk", "cheese"]), frozenset(["bread", "milk"]), frozenset(["bread", "diapers"]), frozenset(["bread", "milk", "diapers"]), frozenset(["milk", "diapers"]), frozenset(["milk", "cheese"]), frozenset(["diapers", "cheese"]), frozenset(["bread", "milk", "cheese", "diapers"]), ] print(f"{len(data_set) = }") fp_tree, header_table = create_tree(data_set, min_sup=3) print(f"{fp_tree = }") print(f"{len(header_table) = }") freq_items: list = [] mine_tree(fp_tree, header_table, 3, set(), freq_items) print(f"{freq_items = }") ================================================ FILE: machine_learning/gaussian_naive_bayes.py.broken.txt ================================================ # Gaussian Naive Bayes Example import time from matplotlib import pyplot as plt from sklearn.datasets import load_iris from sklearn.metrics import accuracy_score, plot_confusion_matrix from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB def main(): """ Gaussian Naive Bayes Example using sklearn function. Iris type dataset is used to demonstrate algorithm. """ # Load Iris dataset iris = load_iris() # Split dataset into train and test data x = iris["data"] # features y = iris["target"] x_train, x_test, y_train, y_test = train_test_split( x, y, test_size=0.3, random_state=1 ) # Gaussian Naive Bayes nb_model = GaussianNB() time.sleep(2.9) model_fit = nb_model.fit(x_train, y_train) y_pred = model_fit.predict(x_test) # Predictions on the test set # Display Confusion Matrix plot_confusion_matrix( nb_model, x_test, y_test, display_labels=iris["target_names"], cmap="Blues", # although, Greys_r has a better contrast... normalize="true", ) plt.title("Normalized Confusion Matrix - IRIS Dataset") plt.show() time.sleep(1.8) final_accuracy = 100 * accuracy_score(y_true=y_test, y_pred=y_pred) print(f"The overall accuracy of the model is: {round(final_accuracy, 2)}%") if __name__ == "__main__": main() ================================================ FILE: machine_learning/gradient_boosting_classifier.py ================================================ import numpy as np from sklearn.datasets import load_iris from sklearn.metrics import accuracy_score from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeRegressor class GradientBoostingClassifier: def __init__(self, n_estimators: int = 100, learning_rate: float = 0.1) -> None: """ Initialize a GradientBoostingClassifier. Parameters: - n_estimators (int): The number of weak learners to train. - learning_rate (float): The learning rate for updating the model. Attributes: - n_estimators (int): The number of weak learners. - learning_rate (float): The learning rate. - models (list): A list to store the trained weak learners. """ self.n_estimators = n_estimators self.learning_rate = learning_rate self.models: list[tuple[DecisionTreeRegressor, float]] = [] def fit(self, features: np.ndarray, target: np.ndarray) -> None: """ Fit the GradientBoostingClassifier to the training data. Parameters: - features (np.ndarray): The training features. - target (np.ndarray): The target values. Returns: None >>> import numpy as np >>> from sklearn.datasets import load_iris >>> clf = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1) >>> iris = load_iris() >>> X, y = iris.data, iris.target >>> clf.fit(X, y) >>> # Check if the model is trained >>> len(clf.models) == 100 True """ for _ in range(self.n_estimators): # Calculate the pseudo-residuals residuals = -self.gradient(target, self.predict(features)) # Fit a weak learner (e.g., decision tree) to the residuals model = DecisionTreeRegressor(max_depth=1) model.fit(features, residuals) # Update the model by adding the weak learner with a learning rate self.models.append((model, self.learning_rate)) def predict(self, features: np.ndarray) -> np.ndarray: """ Make predictions on input data. Parameters: - features (np.ndarray): The input data for making predictions. Returns: - np.ndarray: An array of binary predictions (-1 or 1). >>> import numpy as np >>> from sklearn.datasets import load_iris >>> clf = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1) >>> iris = load_iris() >>> X, y = iris.data, iris.target >>> clf.fit(X, y) >>> y_pred = clf.predict(X) >>> # Check if the predictions have the correct shape >>> y_pred.shape == y.shape True """ # Initialize predictions with zeros predictions = np.zeros(features.shape[0]) for model, learning_rate in self.models: predictions += learning_rate * model.predict(features) return np.sign(predictions) # Convert to binary predictions (-1 or 1) def gradient(self, target: np.ndarray, y_pred: np.ndarray) -> np.ndarray: """ Calculate the negative gradient (pseudo-residuals) for logistic loss. Parameters: - target (np.ndarray): The target values. - y_pred (np.ndarray): The predicted values. Returns: - np.ndarray: An array of pseudo-residuals. >>> import numpy as np >>> clf = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1) >>> target = np.array([0, 1, 0, 1]) >>> y_pred = np.array([0.2, 0.8, 0.3, 0.7]) >>> residuals = clf.gradient(target, y_pred) >>> # Check if residuals have the correct shape >>> residuals.shape == target.shape True """ return -target / (1 + np.exp(target * y_pred)) if __name__ == "__main__": iris = load_iris() X, y = iris.data, iris.target X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) clf = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1) clf.fit(X_train, y_train) y_pred = clf.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print(f"Accuracy: {accuracy:.2f}") ================================================ FILE: machine_learning/gradient_boosting_regressor.py.broken.txt ================================================ """Implementation of GradientBoostingRegressor in sklearn using the boston dataset which is very popular for regression problem to predict house price. """ import matplotlib.pyplot as plt import pandas as pd from sklearn.datasets import load_boston from sklearn.ensemble import GradientBoostingRegressor from sklearn.metrics import mean_squared_error, r2_score from sklearn.model_selection import train_test_split def main(): # loading the dataset from the sklearn df = load_boston() print(df.keys()) # now let construct a data frame df_boston = pd.DataFrame(df.data, columns=df.feature_names) # let add the target to the dataframe df_boston["Price"] = df.target # print the first five rows using the head function print(df_boston.head()) # Summary statistics print(df_boston.describe().T) # Feature selection x = df_boston.iloc[:, :-1] y = df_boston.iloc[:, -1] # target variable # split the data with 75% train and 25% test sets. x_train, x_test, y_train, y_test = train_test_split( x, y, random_state=0, test_size=0.25 ) model = GradientBoostingRegressor( n_estimators=500, max_depth=5, min_samples_split=4, learning_rate=0.01 ) # training the model model.fit(x_train, y_train) # to see how good the model fit the data training_score = model.score(x_train, y_train).round(3) test_score = model.score(x_test, y_test).round(3) print("Training score of GradientBoosting is :", training_score) print("The test score of GradientBoosting is :", test_score) # Let us evaluation the model by finding the errors y_pred = model.predict(x_test) # The mean squared error print(f"Mean squared error: {mean_squared_error(y_test, y_pred):.2f}") # Explained variance score: 1 is perfect prediction print(f"Test Variance score: {r2_score(y_test, y_pred):.2f}") # So let's run the model against the test data fig, ax = plt.subplots() ax.scatter(y_test, y_pred, edgecolors=(0, 0, 0)) ax.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], "k--", lw=4) ax.set_xlabel("Actual") ax.set_ylabel("Predicted") ax.set_title("Truth vs Predicted") # this show function will display the plotting plt.show() if __name__ == "__main__": main() ================================================ FILE: machine_learning/gradient_descent.py ================================================ """ Implementation of gradient descent algorithm for minimizing cost of a linear hypothesis function. """ import numpy as np # List of input, output pairs train_data = ( ((5, 2, 3), 15), ((6, 5, 9), 25), ((11, 12, 13), 41), ((1, 1, 1), 8), ((11, 12, 13), 41), ) test_data = (((515, 22, 13), 555), ((61, 35, 49), 150)) parameter_vector = [2, 4, 1, 5] m = len(train_data) LEARNING_RATE = 0.009 def _error(example_no, data_set="train"): """ :param data_set: train data or test data :param example_no: example number whose error has to be checked :return: error in example pointed by example number. """ return calculate_hypothesis_value(example_no, data_set) - output( example_no, data_set ) def _hypothesis_value(data_input_tuple): """ Calculates hypothesis function value for a given input :param data_input_tuple: Input tuple of a particular example :return: Value of hypothesis function at that point. Note that there is an 'biased input' whose value is fixed as 1. It is not explicitly mentioned in input data.. But, ML hypothesis functions use it. So, we have to take care of it separately. Line 36 takes care of it. """ hyp_val = 0 for i in range(len(parameter_vector) - 1): hyp_val += data_input_tuple[i] * parameter_vector[i + 1] hyp_val += parameter_vector[0] return hyp_val def output(example_no, data_set): """ :param data_set: test data or train data :param example_no: example whose output is to be fetched :return: output for that example """ if data_set == "train": return train_data[example_no][1] elif data_set == "test": return test_data[example_no][1] return None def calculate_hypothesis_value(example_no, data_set): """ Calculates hypothesis value for a given example :param data_set: test data or train_data :param example_no: example whose hypothesis value is to be calculated :return: hypothesis value for that example """ if data_set == "train": return _hypothesis_value(train_data[example_no][0]) elif data_set == "test": return _hypothesis_value(test_data[example_no][0]) return None def summation_of_cost_derivative(index, end=m): """ Calculates the sum of cost function derivative :param index: index wrt derivative is being calculated :param end: value where summation ends, default is m, number of examples :return: Returns the summation of cost derivative Note: If index is -1, this means we are calculating summation wrt to biased parameter. """ summation_value = 0 for i in range(end): if index == -1: summation_value += _error(i) else: summation_value += _error(i) * train_data[i][0][index] return summation_value def get_cost_derivative(index): """ :param index: index of the parameter vector wrt to derivative is to be calculated :return: derivative wrt to that index Note: If index is -1, this means we are calculating summation wrt to biased parameter. """ cost_derivative_value = summation_of_cost_derivative(index, m) / m return cost_derivative_value def run_gradient_descent(): global parameter_vector # Tune these values to set a tolerance value for predicted output absolute_error_limit = 0.000002 relative_error_limit = 0 j = 0 while True: j += 1 temp_parameter_vector = [0, 0, 0, 0] for i in range(len(parameter_vector)): cost_derivative = get_cost_derivative(i - 1) temp_parameter_vector[i] = ( parameter_vector[i] - LEARNING_RATE * cost_derivative ) if np.allclose( parameter_vector, temp_parameter_vector, atol=absolute_error_limit, rtol=relative_error_limit, ): break parameter_vector = temp_parameter_vector print(("Number of iterations:", j)) def test_gradient_descent(): for i in range(len(test_data)): print(("Actual output value:", output(i, "test"))) print(("Hypothesis output:", calculate_hypothesis_value(i, "test"))) if __name__ == "__main__": run_gradient_descent() print("\nTesting gradient descent for a linear hypothesis function.\n") test_gradient_descent() ================================================ FILE: machine_learning/k_means_clust.py ================================================ """README, Author - Anurag Kumar(mailto:anuragkumarak95@gmail.com) Requirements: - sklearn - numpy - matplotlib Python: - 3.5 Inputs: - X , a 2D numpy array of features. - k , number of clusters to create. - initial_centroids , initial centroid values generated by utility function(mentioned in usage). - maxiter , maximum number of iterations to process. - heterogeneity , empty list that will be filled with heterogeneity values if passed to kmeans func. Usage: 1. define 'k' value, 'X' features array and 'heterogeneity' empty list 2. create initial_centroids, initial_centroids = get_initial_centroids( X, k, seed=0 # seed value for initial centroid generation, # None for randomness(default=None) ) 3. find centroids and clusters using kmeans function. centroids, cluster_assignment = kmeans( X, k, initial_centroids, maxiter=400, record_heterogeneity=heterogeneity, verbose=True # whether to print logs in console or not.(default=False) ) 4. Plot the loss function and heterogeneity values for every iteration saved in heterogeneity list. plot_heterogeneity( heterogeneity, k ) 5. Plot the labeled 3D data points with centroids. plot_kmeans( X, centroids, cluster_assignment ) 6. Transfers Dataframe into excel format it must have feature called 'Clust' with k means clustering numbers in it. """ import warnings import numpy as np import pandas as pd from matplotlib import pyplot as plt from sklearn.metrics import pairwise_distances warnings.filterwarnings("ignore") TAG = "K-MEANS-CLUST/ " def get_initial_centroids(data, k, seed=None): """Randomly choose k data points as initial centroids""" # useful for obtaining consistent results rng = np.random.default_rng(seed) n = data.shape[0] # number of data points # Pick K indices from range [0, N). rand_indices = rng.integers(0, n, k) # Keep centroids as dense format, as many entries will be nonzero due to averaging. # As long as at least one document in a cluster contains a word, # it will carry a nonzero weight in the TF-IDF vector of the centroid. centroids = data[rand_indices, :] return centroids def centroid_pairwise_dist(x, centroids): return pairwise_distances(x, centroids, metric="euclidean") def assign_clusters(data, centroids): # Compute distances between each data point and the set of centroids: # Fill in the blank (RHS only) distances_from_centroids = centroid_pairwise_dist(data, centroids) # Compute cluster assignments for each data point: # Fill in the blank (RHS only) cluster_assignment = np.argmin(distances_from_centroids, axis=1) return cluster_assignment def revise_centroids(data, k, cluster_assignment): new_centroids = [] for i in range(k): # Select all data points that belong to cluster i. Fill in the blank (RHS only) member_data_points = data[cluster_assignment == i] # Compute the mean of the data points. Fill in the blank (RHS only) centroid = member_data_points.mean(axis=0) new_centroids.append(centroid) new_centroids = np.array(new_centroids) return new_centroids def compute_heterogeneity(data, k, centroids, cluster_assignment): heterogeneity = 0.0 for i in range(k): # Select all data points that belong to cluster i. Fill in the blank (RHS only) member_data_points = data[cluster_assignment == i, :] if member_data_points.shape[0] > 0: # check if i-th cluster is non-empty # Compute distances from centroid to data points (RHS only) distances = pairwise_distances( member_data_points, [centroids[i]], metric="euclidean" ) squared_distances = distances**2 heterogeneity += np.sum(squared_distances) return heterogeneity def plot_heterogeneity(heterogeneity, k): plt.figure(figsize=(7, 4)) plt.plot(heterogeneity, linewidth=4) plt.xlabel("# Iterations") plt.ylabel("Heterogeneity") plt.title(f"Heterogeneity of clustering over time, K={k:d}") plt.rcParams.update({"font.size": 16}) plt.show() def plot_kmeans(data, centroids, cluster_assignment): ax = plt.axes(projection="3d") ax.scatter(data[:, 0], data[:, 1], data[:, 2], c=cluster_assignment, cmap="viridis") ax.scatter( centroids[:, 0], centroids[:, 1], centroids[:, 2], c="red", s=100, marker="x" ) ax.set_xlabel("X") ax.set_ylabel("Y") ax.set_zlabel("Z") ax.set_title("3D K-Means Clustering Visualization") plt.show() def kmeans( data, k, initial_centroids, maxiter=500, record_heterogeneity=None, verbose=False ): """Runs k-means on given data and initial set of centroids. maxiter: maximum number of iterations to run.(default=500) record_heterogeneity: (optional) a list, to store the history of heterogeneity as function of iterations if None, do not store the history. verbose: if True, print how many data points changed their cluster labels in each iteration""" centroids = initial_centroids[:] prev_cluster_assignment = None for itr in range(maxiter): if verbose: print(itr, end="") # 1. Make cluster assignments using nearest centroids cluster_assignment = assign_clusters(data, centroids) # 2. Compute a new centroid for each of the k clusters, averaging all data # points assigned to that cluster. centroids = revise_centroids(data, k, cluster_assignment) # Check for convergence: if none of the assignments changed, stop if ( prev_cluster_assignment is not None and (prev_cluster_assignment == cluster_assignment).all() ): break # Print number of new assignments if prev_cluster_assignment is not None: num_changed = np.sum(prev_cluster_assignment != cluster_assignment) if verbose: print( f" {num_changed:5d} elements changed their cluster assignment." ) # Record heterogeneity convergence metric if record_heterogeneity is not None: # YOUR CODE HERE score = compute_heterogeneity(data, k, centroids, cluster_assignment) record_heterogeneity.append(score) prev_cluster_assignment = cluster_assignment[:] return centroids, cluster_assignment # Mock test below if False: # change to true to run this test case. from sklearn import datasets as ds dataset = ds.load_iris() k = 3 heterogeneity = [] initial_centroids = get_initial_centroids(dataset["data"], k, seed=0) centroids, cluster_assignment = kmeans( dataset["data"], k, initial_centroids, maxiter=400, record_heterogeneity=heterogeneity, verbose=True, ) plot_heterogeneity(heterogeneity, k) plot_kmeans(dataset["data"], centroids, cluster_assignment) def report_generator( predicted: pd.DataFrame, clustering_variables: np.ndarray, fill_missing_report=None ) -> pd.DataFrame: """ Generate a clustering report given these two arguments: predicted - dataframe with predicted cluster column fill_missing_report - dictionary of rules on how we are going to fill in missing values for final generated report (not included in modelling); >>> predicted = pd.DataFrame() >>> predicted['numbers'] = [1, 2, 3] >>> predicted['col1'] = [0.5, 2.5, 4.5] >>> predicted['col2'] = [100, 200, 300] >>> predicted['col3'] = [10, 20, 30] >>> predicted['Cluster'] = [1, 1, 2] >>> report_generator(predicted, ['col1', 'col2'], 0) Features Type Mark 1 2 0 # of Customers ClusterSize False 2.000000 1.000000 1 % of Customers ClusterProportion False 0.666667 0.333333 2 col1 mean_with_zeros True 1.500000 4.500000 3 col2 mean_with_zeros True 150.000000 300.000000 4 numbers mean_with_zeros False 1.500000 3.000000 .. ... ... ... ... ... 99 dummy 5% False 1.000000 1.000000 100 dummy 95% False 1.000000 1.000000 101 dummy stdev False 0.000000 NaN 102 dummy mode False 1.000000 1.000000 103 dummy median False 1.000000 1.000000 [104 rows x 5 columns] """ # Fill missing values with given rules if fill_missing_report: predicted = predicted.fillna(value=fill_missing_report) predicted["dummy"] = 1 numeric_cols = predicted.select_dtypes(np.number).columns report = ( predicted.groupby(["Cluster"])[ # construct report dataframe numeric_cols ] # group by cluster number .agg( [ ("sum", "sum"), ("mean_with_zeros", lambda x: np.mean(np.nan_to_num(x))), ("mean_without_zeros", lambda x: x.replace(0, np.nan).mean()), ( "mean_25-75", lambda x: np.mean( np.nan_to_num( sorted(x)[ round(len(x) * 25 / 100) : round(len(x) * 75 / 100) ] ) ), ), ("mean_with_na", "mean"), ("min", lambda x: x.min()), ("5%", lambda x: x.quantile(0.05)), ("25%", lambda x: x.quantile(0.25)), ("50%", lambda x: x.quantile(0.50)), ("75%", lambda x: x.quantile(0.75)), ("95%", lambda x: x.quantile(0.95)), ("max", lambda x: x.max()), ("count", lambda x: x.count()), ("stdev", lambda x: x.std()), ("mode", lambda x: x.mode()[0]), ("median", lambda x: x.median()), ("# > 0", lambda x: (x > 0).sum()), ] ) .T.reset_index() .rename(index=str, columns={"level_0": "Features", "level_1": "Type"}) ) # rename columns # calculate the size of cluster(count of clientID's) # avoid SettingWithCopyWarning clustersize = report[ (report["Features"] == "dummy") & (report["Type"] == "count") ].copy() # rename created predicted cluster to match report column names clustersize.Type = "ClusterSize" clustersize.Features = "# of Customers" # calculating the proportion of cluster clusterproportion = pd.DataFrame( clustersize.iloc[:, 2:].to_numpy() / clustersize.iloc[:, 2:].to_numpy().sum() ) # rename created predicted cluster to match report column names clusterproportion["Type"] = "% of Customers" clusterproportion["Features"] = "ClusterProportion" cols = clusterproportion.columns.tolist() cols = cols[-2:] + cols[:-2] clusterproportion = clusterproportion[cols] # rearrange columns to match report clusterproportion.columns = report.columns # generating dataframe with count of nan values a = pd.DataFrame( abs( report[report["Type"] == "count"].iloc[:, 2:].to_numpy() - clustersize.iloc[:, 2:].to_numpy() ) ) a["Features"] = 0 a["Type"] = "# of nan" # filling values in order to match report a.Features = report[report["Type"] == "count"].Features.tolist() cols = a.columns.tolist() cols = cols[-2:] + cols[:-2] a = a[cols] # rearrange columns to match report a.columns = report.columns # rename columns to match report # drop count values except for cluster size report = report.drop(report[report.Type == "count"].index) # concat report with cluster size and nan values report = pd.concat([report, a, clustersize, clusterproportion], axis=0) report["Mark"] = report["Features"].isin(clustering_variables) cols = report.columns.tolist() cols = cols[0:2] + cols[-1:] + cols[2:-1] report = report[cols] sorter1 = { "ClusterSize": 9, "ClusterProportion": 8, "mean_with_zeros": 7, "mean_with_na": 6, "max": 5, "50%": 4, "min": 3, "25%": 2, "75%": 1, "# of nan": 0, "# > 0": -1, "sum_with_na": -2, } report = ( report.assign( Sorter1=lambda x: x.Type.map(sorter1), Sorter2=lambda x: list(reversed(range(len(x)))), ) .sort_values(["Sorter1", "Mark", "Sorter2"], ascending=False) .drop(["Sorter1", "Sorter2"], axis=1) ) report.columns.name = "" report = report.reset_index() report = report.drop(columns=["index"]) return report if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: machine_learning/k_nearest_neighbours.py ================================================ """ k-Nearest Neighbours (kNN) is a simple non-parametric supervised learning algorithm used for classification. Given some labelled training data, a given point is classified using its k nearest neighbours according to some distance metric. The most commonly occurring label among the neighbours becomes the label of the given point. In effect, the label of the given point is decided by a majority vote. This implementation uses the commonly used Euclidean distance metric, but other distance metrics can also be used. Reference: https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm """ from collections import Counter from heapq import nsmallest import numpy as np from sklearn import datasets from sklearn.model_selection import train_test_split class KNN: def __init__( self, train_data: np.ndarray[float], train_target: np.ndarray[int], class_labels: list[str], ) -> None: """ Create a kNN classifier using the given training data and class labels """ self.data = zip(train_data, train_target) self.labels = class_labels @staticmethod def _euclidean_distance(a: np.ndarray[float], b: np.ndarray[float]) -> float: """ Calculate the Euclidean distance between two points >>> KNN._euclidean_distance(np.array([0, 0]), np.array([3, 4])) 5.0 >>> KNN._euclidean_distance(np.array([1, 2, 3]), np.array([1, 8, 11])) 10.0 """ return float(np.linalg.norm(a - b)) def classify(self, pred_point: np.ndarray[float], k: int = 5) -> str: """ Classify a given point using the kNN algorithm >>> train_X = np.array( ... [[0, 0], [1, 0], [0, 1], [0.5, 0.5], [3, 3], [2, 3], [3, 2]] ... ) >>> train_y = np.array([0, 0, 0, 0, 1, 1, 1]) >>> classes = ['A', 'B'] >>> knn = KNN(train_X, train_y, classes) >>> point = np.array([1.2, 1.2]) >>> knn.classify(point) 'A' """ # Distances of all points from the point to be classified distances = ( (self._euclidean_distance(data_point[0], pred_point), data_point[1]) for data_point in self.data ) # Choosing k points with the shortest distances votes = (i[1] for i in nsmallest(k, distances)) # Most commonly occurring class is the one into which the point is classified result = Counter(votes).most_common(1)[0][0] return self.labels[result] if __name__ == "__main__": import doctest doctest.testmod() iris = datasets.load_iris() X = np.array(iris["data"]) y = np.array(iris["target"]) iris_classes = iris["target_names"] X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) iris_point = np.array([4.4, 3.1, 1.3, 1.4]) classifier = KNN(X_train, y_train, iris_classes) print(classifier.classify(iris_point, k=3)) ================================================ FILE: machine_learning/linear_discriminant_analysis.py ================================================ """ Linear Discriminant Analysis Assumptions About Data : 1. The input variables has a gaussian distribution. 2. The variance calculated for each input variables by class grouping is the same. 3. The mix of classes in your training set is representative of the problem. Learning The Model : The LDA model requires the estimation of statistics from the training data : 1. Mean of each input value for each class. 2. Probability of an instance belong to each class. 3. Covariance for the input data for each class Calculate the class means : mean(x) = 1/n ( for i = 1 to i = n --> sum(xi)) Calculate the class probabilities : P(y = 0) = count(y = 0) / (count(y = 0) + count(y = 1)) P(y = 1) = count(y = 1) / (count(y = 0) + count(y = 1)) Calculate the variance : We can calculate the variance for dataset in two steps : 1. Calculate the squared difference for each input variable from the group mean. 2. Calculate the mean of the squared difference. ------------------------------------------------ Squared_Difference = (x - mean(k)) ** 2 Variance = (1 / (count(x) - count(classes))) * (for i = 1 to i = n --> sum(Squared_Difference(xi))) Making Predictions : discriminant(x) = x * (mean / variance) - ((mean ** 2) / (2 * variance)) + Ln(probability) --------------------------------------------------------------------------- After calculating the discriminant value for each class, the class with the largest discriminant value is taken as the prediction. Author: @EverLookNeverSee """ from collections.abc import Callable from math import log from os import name, system from random import gauss, seed # Make a training dataset drawn from a gaussian distribution def gaussian_distribution(mean: float, std_dev: float, instance_count: int) -> list: """ Generate gaussian distribution instances based-on given mean and standard deviation :param mean: mean value of class :param std_dev: value of standard deviation entered by usr or default value of it :param instance_count: instance number of class :return: a list containing generated values based-on given mean, std_dev and instance_count >>> gaussian_distribution(5.0, 1.0, 20) # doctest: +NORMALIZE_WHITESPACE [6.288184753155463, 6.4494456086997705, 5.066335808938262, 4.235456349028368, 3.9078267848958586, 5.031334516831717, 3.977896829989127, 3.56317055489747, 5.199311976483754, 5.133374604658605, 5.546468300338232, 4.086029056264687, 5.005005283626573, 4.935258239627312, 3.494170998739258, 5.537997178661033, 5.320711100998849, 7.3891120432406865, 5.202969177309964, 4.855297691835079] """ seed(1) return [gauss(mean, std_dev) for _ in range(instance_count)] # Make corresponding Y flags to detecting classes def y_generator(class_count: int, instance_count: list) -> list: """ Generate y values for corresponding classes :param class_count: Number of classes(data groupings) in dataset :param instance_count: number of instances in class :return: corresponding values for data groupings in dataset >>> y_generator(1, [10]) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] >>> y_generator(2, [5, 10]) [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] >>> y_generator(4, [10, 5, 15, 20]) # doctest: +NORMALIZE_WHITESPACE [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] """ return [k for k in range(class_count) for _ in range(instance_count[k])] # Calculate the class means def calculate_mean(instance_count: int, items: list) -> float: """ Calculate given class mean :param instance_count: Number of instances in class :param items: items that related to specific class(data grouping) :return: calculated actual mean of considered class >>> items = gaussian_distribution(5.0, 1.0, 20) >>> calculate_mean(len(items), items) 5.011267842911003 """ # the sum of all items divided by number of instances return sum(items) / instance_count # Calculate the class probabilities def calculate_probabilities(instance_count: int, total_count: int) -> float: """ Calculate the probability that a given instance will belong to which class :param instance_count: number of instances in class :param total_count: the number of all instances :return: value of probability for considered class >>> calculate_probabilities(20, 60) 0.3333333333333333 >>> calculate_probabilities(30, 100) 0.3 """ # number of instances in specific class divided by number of all instances return instance_count / total_count # Calculate the variance def calculate_variance(items: list, means: list, total_count: int) -> float: """ Calculate the variance :param items: a list containing all items(gaussian distribution of all classes) :param means: a list containing real mean values of each class :param total_count: the number of all instances :return: calculated variance for considered dataset >>> items = gaussian_distribution(5.0, 1.0, 20) >>> means = [5.011267842911003] >>> total_count = 20 >>> calculate_variance([items], means, total_count) 0.9618530973487491 """ squared_diff = [] # An empty list to store all squared differences # iterate over number of elements in items for i in range(len(items)): # for loop iterates over number of elements in inner layer of items for j in range(len(items[i])): # appending squared differences to 'squared_diff' list squared_diff.append((items[i][j] - means[i]) ** 2) # one divided by (the number of all instances - number of classes) multiplied by # sum of all squared differences n_classes = len(means) # Number of classes in dataset return 1 / (total_count - n_classes) * sum(squared_diff) # Making predictions def predict_y_values( x_items: list, means: list, variance: float, probabilities: list ) -> list: """This function predicts new indexes(groups for our data) :param x_items: a list containing all items(gaussian distribution of all classes) :param means: a list containing real mean values of each class :param variance: calculated value of variance by calculate_variance function :param probabilities: a list containing all probabilities of classes :return: a list containing predicted Y values >>> x_items = [[6.288184753155463, 6.4494456086997705, 5.066335808938262, ... 4.235456349028368, 3.9078267848958586, 5.031334516831717, ... 3.977896829989127, 3.56317055489747, 5.199311976483754, ... 5.133374604658605, 5.546468300338232, 4.086029056264687, ... 5.005005283626573, 4.935258239627312, 3.494170998739258, ... 5.537997178661033, 5.320711100998849, 7.3891120432406865, ... 5.202969177309964, 4.855297691835079], [11.288184753155463, ... 11.44944560869977, 10.066335808938263, 9.235456349028368, ... 8.907826784895859, 10.031334516831716, 8.977896829989128, ... 8.56317055489747, 10.199311976483754, 10.133374604658606, ... 10.546468300338232, 9.086029056264687, 10.005005283626572, ... 9.935258239627313, 8.494170998739259, 10.537997178661033, ... 10.320711100998848, 12.389112043240686, 10.202969177309964, ... 9.85529769183508], [16.288184753155463, 16.449445608699772, ... 15.066335808938263, 14.235456349028368, 13.907826784895859, ... 15.031334516831716, 13.977896829989128, 13.56317055489747, ... 15.199311976483754, 15.133374604658606, 15.546468300338232, ... 14.086029056264687, 15.005005283626572, 14.935258239627313, ... 13.494170998739259, 15.537997178661033, 15.320711100998848, ... 17.389112043240686, 15.202969177309964, 14.85529769183508]] >>> means = [5.011267842911003, 10.011267842911003, 15.011267842911002] >>> variance = 0.9618530973487494 >>> probabilities = [0.3333333333333333, 0.3333333333333333, 0.3333333333333333] >>> predict_y_values(x_items, means, variance, ... probabilities) # doctest: +NORMALIZE_WHITESPACE [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] """ # An empty list to store generated discriminant values of all items in dataset for # each class results = [] # for loop iterates over number of elements in list for i in range(len(x_items)): # for loop iterates over number of inner items of each element for j in range(len(x_items[i])): temp = [] # to store all discriminant values of each item as a list # for loop iterates over number of classes we have in our dataset for k in range(len(x_items)): # appending values of discriminants for each class to 'temp' list temp.append( x_items[i][j] * (means[k] / variance) - (means[k] ** 2 / (2 * variance)) + log(probabilities[k]) ) # appending discriminant values of each item to 'results' list results.append(temp) return [result.index(max(result)) for result in results] # Calculating Accuracy def accuracy(actual_y: list, predicted_y: list) -> float: """ Calculate the value of accuracy based-on predictions :param actual_y:a list containing initial Y values generated by 'y_generator' function :param predicted_y: a list containing predicted Y values generated by 'predict_y_values' function :return: percentage of accuracy >>> actual_y = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, ... 1, 1 ,1 ,1 ,1 ,1 ,1] >>> predicted_y = [0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, ... 0, 0, 1, 1, 1, 0, 1, 1, 1] >>> accuracy(actual_y, predicted_y) 50.0 >>> actual_y = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, ... 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] >>> predicted_y = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, ... 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] >>> accuracy(actual_y, predicted_y) 100.0 """ # iterate over one element of each list at a time (zip mode) # prediction is correct if actual Y value equals to predicted Y value correct = sum(1 for i, j in zip(actual_y, predicted_y) if i == j) # percentage of accuracy equals to number of correct predictions divided by number # of all data and multiplied by 100 return (correct / len(actual_y)) * 100 def valid_input[num]( input_type: Callable[[object], num], # Usually float or int input_msg: str, err_msg: str, condition: Callable[[num], bool] = lambda _: True, default: str | None = None, ) -> num: """ Ask for user value and validate that it fulfill a condition. :input_type: user input expected type of value :input_msg: message to show user in the screen :err_msg: message to show in the screen in case of error :condition: function that represents the condition that user input is valid. :default: Default value in case the user does not type anything :return: user's input """ while True: try: user_input = input_type(input(input_msg).strip() or default) if condition(user_input): return user_input else: print(f"{user_input}: {err_msg}") continue except ValueError: print( f"{user_input}: Incorrect input type, expected {input_type.__name__!r}" ) # Main Function def main(): """This function starts execution phase""" while True: print(" Linear Discriminant Analysis ".center(50, "*")) print("*" * 50, "\n") print("First of all we should specify the number of classes that") print("we want to generate as training dataset") # Trying to get number of classes n_classes = valid_input( input_type=int, condition=lambda x: x > 0, input_msg="Enter the number of classes (Data Groupings): ", err_msg="Number of classes should be positive!", ) print("-" * 100) # Trying to get the value of standard deviation std_dev = valid_input( input_type=float, condition=lambda x: x >= 0, input_msg=( "Enter the value of standard deviation" "(Default value is 1.0 for all classes): " ), err_msg="Standard deviation should not be negative!", default="1.0", ) print("-" * 100) # Trying to get number of instances in classes and theirs means to generate # dataset counts = [] # An empty list to store instance counts of classes in dataset for i in range(n_classes): user_count = valid_input( input_type=int, condition=lambda x: x > 0, input_msg=(f"Enter The number of instances for class_{i + 1}: "), err_msg="Number of instances should be positive!", ) counts.append(user_count) print("-" * 100) # An empty list to store values of user-entered means of classes user_means = [] for a in range(n_classes): user_mean = valid_input( input_type=float, input_msg=(f"Enter the value of mean for class_{a + 1}: "), err_msg="This is an invalid value.", ) user_means.append(user_mean) print("-" * 100) print("Standard deviation: ", std_dev) # print out the number of instances in classes in separated line for i, count in enumerate(counts, 1): print(f"Number of instances in class_{i} is: {count}") print("-" * 100) # print out mean values of classes separated line for i, user_mean in enumerate(user_means, 1): print(f"Mean of class_{i} is: {user_mean}") print("-" * 100) # Generating training dataset drawn from gaussian distribution x = [ gaussian_distribution(user_means[j], std_dev, counts[j]) for j in range(n_classes) ] print("Generated Normal Distribution: \n", x) print("-" * 100) # Generating Ys to detecting corresponding classes y = y_generator(n_classes, counts) print("Generated Corresponding Ys: \n", y) print("-" * 100) # Calculating the value of actual mean for each class actual_means = [calculate_mean(counts[k], x[k]) for k in range(n_classes)] # for loop iterates over number of elements in 'actual_means' list and print # out them in separated line for i, actual_mean in enumerate(actual_means, 1): print(f"Actual(Real) mean of class_{i} is: {actual_mean}") print("-" * 100) # Calculating the value of probabilities for each class probabilities = [ calculate_probabilities(counts[i], sum(counts)) for i in range(n_classes) ] # for loop iterates over number of elements in 'probabilities' list and print # out them in separated line for i, probability in enumerate(probabilities, 1): print(f"Probability of class_{i} is: {probability}") print("-" * 100) # Calculating the values of variance for each class variance = calculate_variance(x, actual_means, sum(counts)) print("Variance: ", variance) print("-" * 100) # Predicting Y values # storing predicted Y values in 'pre_indexes' variable pre_indexes = predict_y_values(x, actual_means, variance, probabilities) print("-" * 100) # Calculating Accuracy of the model print(f"Accuracy: {accuracy(y, pre_indexes)}") print("-" * 100) print(" DONE ".center(100, "+")) if input("Press any key to restart or 'q' for quit: ").strip().lower() == "q": print("\n" + "GoodBye!".center(100, "-") + "\n") break system("cls" if name == "nt" else "clear") # noqa: S605 if __name__ == "__main__": main() ================================================ FILE: machine_learning/linear_regression.py ================================================ """ Linear regression is the most basic type of regression commonly used for predictive analysis. The idea is pretty simple: we have a dataset and we have features associated with it. Features should be chosen very cautiously as they determine how much our model will be able to make future predictions. We try to set the weight of these features, over many iterations, so that they best fit our dataset. In this particular code, I had used a CSGO dataset (ADR vs Rating). We try to best fit a line through dataset and estimate the parameters. """ # /// script # requires-python = ">=3.13" # dependencies = [ # "httpx", # "numpy", # ] # /// import httpx import numpy as np def collect_dataset(): """Collect dataset of CSGO The dataset contains ADR vs Rating of a Player :return : dataset obtained from the link, as matrix """ response = httpx.get( "https://raw.githubusercontent.com/yashLadha/The_Math_of_Intelligence/" "master/Week1/ADRvsRating.csv", timeout=10, ) lines = response.text.splitlines() data = [] for item in lines: item = item.split(",") data.append(item) data.pop(0) # This is for removing the labels from the list dataset = np.matrix(data) return dataset def run_steep_gradient_descent(data_x, data_y, len_data, alpha, theta): """Run steep gradient descent and updates the Feature vector accordingly_ :param data_x : contains the dataset :param data_y : contains the output associated with each data-entry :param len_data : length of the data_ :param alpha : Learning rate of the model :param theta : Feature vector (weight's for our model) ;param return : Updated Feature's, using curr_features - alpha_ * gradient(w.r.t. feature) >>> import numpy as np >>> data_x = np.array([[1, 2], [3, 4]]) >>> data_y = np.array([5, 6]) >>> len_data = len(data_x) >>> alpha = 0.01 >>> theta = np.array([0.1, 0.2]) >>> run_steep_gradient_descent(data_x, data_y, len_data, alpha, theta) array([0.196, 0.343]) """ n = len_data prod = np.dot(theta, data_x.transpose()) prod -= data_y.transpose() sum_grad = np.dot(prod, data_x) theta = theta - (alpha / n) * sum_grad return theta def sum_of_square_error(data_x, data_y, len_data, theta): """Return sum of square error for error calculation :param data_x : contains our dataset :param data_y : contains the output (result vector) :param len_data : len of the dataset :param theta : contains the feature vector :return : sum of square error computed from given feature's Example: >>> vc_x = np.array([[1.1], [2.1], [3.1]]) >>> vc_y = np.array([1.2, 2.2, 3.2]) >>> round(sum_of_square_error(vc_x, vc_y, 3, np.array([1])),3) np.float64(0.005) """ prod = np.dot(theta, data_x.transpose()) prod -= data_y.transpose() sum_elem = np.sum(np.square(prod)) error = sum_elem / (2 * len_data) return error def run_linear_regression(data_x, data_y): """Implement Linear regression over the dataset :param data_x : contains our dataset :param data_y : contains the output (result vector) :return : feature for line of best fit (Feature vector) """ iterations = 100000 alpha = 0.0001550 no_features = data_x.shape[1] len_data = data_x.shape[0] - 1 theta = np.zeros((1, no_features)) for i in range(iterations): theta = run_steep_gradient_descent(data_x, data_y, len_data, alpha, theta) error = sum_of_square_error(data_x, data_y, len_data, theta) print(f"At Iteration {i + 1} - Error is {error:.5f}") return theta def mean_absolute_error(predicted_y, original_y): """Return sum of square error for error calculation :param predicted_y : contains the output of prediction (result vector) :param original_y : contains values of expected outcome :return : mean absolute error computed from given feature's >>> predicted_y = [3, -0.5, 2, 7] >>> original_y = [2.5, 0.0, 2, 8] >>> mean_absolute_error(predicted_y, original_y) 0.5 """ total = sum(abs(y - predicted_y[i]) for i, y in enumerate(original_y)) return total / len(original_y) def main(): """Driver function""" data = collect_dataset() len_data = data.shape[0] data_x = np.c_[np.ones(len_data), data[:, :-1]].astype(float) data_y = data[:, -1].astype(float) theta = run_linear_regression(data_x, data_y) len_result = theta.shape[1] print("Resultant Feature vector : ") for i in range(len_result): print(f"{theta[0, i]:.5f}") if __name__ == "__main__": import doctest doctest.testmod() main() ================================================ FILE: machine_learning/local_weighted_learning/README.md ================================================ # Locally Weighted Linear Regression It is a non-parametric ML algorithm that does not learn on a fixed set of parameters such as **linear regression**. \ So, here comes a question of what is *linear regression*? \ **Linear regression** is a supervised learning algorithm used for computing linear relationships between input (X) and output (Y). \ ### Terminology Involved number_of_features(i) = Number of features involved. \ number_of_training_examples(m) = Number of training examples. \ output_sequence(y) = Output Sequence. \ $\theta$ $^T$ x = predicted point. \ J($\theta$) = COst function of point. The steps involved in ordinary linear regression are: Training phase: Compute \theta to minimize the cost. \ J($\theta$) = $\sum_{i=1}^m$ (($\theta$)$^T$ $x^i$ - $y^i$)$^2$ Predict output: for given query point x, \ return: ($\theta$)$^T$ x Linear Regression This training phase is possible when data points are linear, but there again comes a question can we predict non-linear relationship between x and y ? as shown below Non-linear Data

So, here comes the role of non-parametric algorithm which doesn't compute predictions based on fixed set of params. Rather parameters $\theta$ are computed individually for each query point/data point x.

While Computing $\theta$ , a higher preference is given to points in the vicinity of x than points farther from x. Cost Function J($\theta$) = $\sum_{i=1}^m$ $w^i$ (($\theta$)$^T$ $x^i$ - $y^i$)$^2$ $w^i$ is non-negative weight associated to training point $x^i$. \ $w^i$ is large fr $x^i$'s lying closer to query point $x_i$. \ $w^i$ is small for $x^i$'s lying farther to query point $x_i$. A Typical weight can be computed using \ $w^i$ = $\exp$(-$\frac{(x^i-x)(x^i-x)^T}{2\tau^2}$) Where $\tau$ is the bandwidth parameter that controls $w^i$ distance from x. Let's look at a example : Suppose, we had a query point x=5.0 and training points $x^1$=4.9 and $x^2$=5.0 than we can calculate weights as : $w^i$ = $\exp$(-$\frac{(x^i-x)(x^i-x)^T}{2\tau^2}$) with $\tau$=0.5 $w^1$ = $\exp$(-$\frac{(4.9-5)^2}{2(0.5)^2}$) = 0.9802 $w^2$ = $\exp$(-$\frac{(3-5)^2}{2(0.5)^2}$) = 0.000335 So, J($\theta$) = 0.9802*($\theta$ $^T$ $x^1$ - $y^1$) + 0.000335*($\theta$ $^T$ $x^2$ - $y^2$) So, here by we can conclude that the weight fall exponentially as the distance between x & $x^i$ increases and So, does the contribution of error in prediction for $x^i$ to the cost. Steps involved in LWL are : \ Compute \theta to minimize the cost. J($\theta$) = $\sum_{i=1}^m$ $w^i$ (($\theta$)$^T$ $x^i$ - $y^i$)$^2$ \ Predict Output: for given query point x, \ return : $\theta$ $^T$ x LWL ================================================ FILE: machine_learning/local_weighted_learning/__init__.py ================================================ ================================================ FILE: machine_learning/local_weighted_learning/local_weighted_learning.py ================================================ """ Locally weighted linear regression, also called local regression, is a type of non-parametric linear regression that prioritizes data closest to a given prediction point. The algorithm estimates the vector of model coefficients β using weighted least squares regression: β = (XᵀWX)⁻¹(XᵀWy), where X is the design matrix, y is the response vector, and W is the diagonal weight matrix. This implementation calculates wᵢ, the weight of the ith training sample, using the Gaussian weight: wᵢ = exp(-‖xᵢ - x‖²/(2τ²)), where xᵢ is the ith training sample, x is the prediction point, τ is the "bandwidth", and ‖x‖ is the Euclidean norm (also called the 2-norm or the L² norm). The bandwidth τ controls how quickly the weight of a training sample decreases as its distance from the prediction point increases. One can think of the Gaussian weight as a bell curve centered around the prediction point: a training sample is weighted lower if it's farther from the center, and τ controls the spread of the bell curve. Other types of locally weighted regression such as locally estimated scatterplot smoothing (LOESS) typically use different weight functions. References: - https://en.wikipedia.org/wiki/Local_regression - https://en.wikipedia.org/wiki/Weighted_least_squares - https://cs229.stanford.edu/notes2022fall/main_notes.pdf """ import matplotlib.pyplot as plt import numpy as np def weight_matrix(point: np.ndarray, x_train: np.ndarray, tau: float) -> np.ndarray: """ Calculate the weight of every point in the training data around a given prediction point Args: point: x-value at which the prediction is being made x_train: ndarray of x-values for training tau: bandwidth value, controls how quickly the weight of training values decreases as the distance from the prediction point increases Returns: m x m weight matrix around the prediction point, where m is the size of the training set >>> weight_matrix( ... np.array([1., 1.]), ... np.array([[16.99, 10.34], [21.01,23.68], [24.59,25.69]]), ... 0.6 ... ) array([[1.43807972e-207, 0.00000000e+000, 0.00000000e+000], [0.00000000e+000, 0.00000000e+000, 0.00000000e+000], [0.00000000e+000, 0.00000000e+000, 0.00000000e+000]]) """ m = len(x_train) # Number of training samples weights = np.eye(m) # Initialize weights as identity matrix for j in range(m): diff = point - x_train[j] weights[j, j] = np.exp(diff @ diff.T / (-2.0 * tau**2)) return weights def local_weight( point: np.ndarray, x_train: np.ndarray, y_train: np.ndarray, tau: float ) -> np.ndarray: """ Calculate the local weights at a given prediction point using the weight matrix for that point Args: point: x-value at which the prediction is being made x_train: ndarray of x-values for training y_train: ndarray of y-values for training tau: bandwidth value, controls how quickly the weight of training values decreases as the distance from the prediction point increases Returns: ndarray of local weights >>> local_weight( ... np.array([1., 1.]), ... np.array([[16.99, 10.34], [21.01,23.68], [24.59,25.69]]), ... np.array([[1.01, 1.66, 3.5]]), ... 0.6 ... ) array([[0.00873174], [0.08272556]]) """ weight_mat = weight_matrix(point, x_train, tau) weight = np.linalg.inv(x_train.T @ weight_mat @ x_train) @ ( x_train.T @ weight_mat @ y_train.T ) return weight def local_weight_regression( x_train: np.ndarray, y_train: np.ndarray, tau: float ) -> np.ndarray: """ Calculate predictions for each point in the training data Args: x_train: ndarray of x-values for training y_train: ndarray of y-values for training tau: bandwidth value, controls how quickly the weight of training values decreases as the distance from the prediction point increases Returns: ndarray of predictions >>> local_weight_regression( ... np.array([[16.99, 10.34], [21.01, 23.68], [24.59, 25.69]]), ... np.array([[1.01, 1.66, 3.5]]), ... 0.6 ... ) array([1.07173261, 1.65970737, 3.50160179]) """ y_pred = np.zeros(len(x_train)) # Initialize array of predictions for i, item in enumerate(x_train): y_pred[i] = np.dot(item, local_weight(item, x_train, y_train, tau)).item() return y_pred def load_data( dataset_name: str, x_name: str, y_name: str ) -> tuple[np.ndarray, np.ndarray, np.ndarray]: """ Load data from seaborn and split it into x and y points >>> pass # No doctests, function is for demo purposes only """ import seaborn as sns data = sns.load_dataset(dataset_name) x_data = np.array(data[x_name]) y_data = np.array(data[y_name]) one = np.ones(len(y_data)) # pairing elements of one and x_data x_train = np.column_stack((one, x_data)) return x_train, x_data, y_data def plot_preds( x_train: np.ndarray, preds: np.ndarray, x_data: np.ndarray, y_data: np.ndarray, x_name: str, y_name: str, ) -> None: """ Plot predictions and display the graph >>> pass # No doctests, function is for demo purposes only """ x_train_sorted = np.sort(x_train, axis=0) plt.scatter(x_data, y_data, color="blue") plt.plot( x_train_sorted[:, 1], preds[x_train[:, 1].argsort(0)], color="yellow", linewidth=5, ) plt.title("Local Weighted Regression") plt.xlabel(x_name) plt.ylabel(y_name) plt.show() if __name__ == "__main__": import doctest doctest.testmod() # Demo with a dataset from the seaborn module training_data_x, total_bill, tip = load_data("tips", "total_bill", "tip") predictions = local_weight_regression(training_data_x, tip, 5) plot_preds(training_data_x, predictions, total_bill, tip, "total_bill", "tip") ================================================ FILE: machine_learning/logistic_regression.py ================================================ #!/usr/bin/python # Logistic Regression from scratch # In[62]: # In[63]: # importing all the required libraries """ Implementing logistic regression for classification problem Helpful resources: Coursera ML course https://medium.com/@martinpella/logistic-regression-from-scratch-in-python-124c5636b8ac """ import numpy as np from matplotlib import pyplot as plt from sklearn import datasets # get_ipython().run_line_magic('matplotlib', 'inline') # In[67]: # sigmoid function or logistic function is used as a hypothesis function in # classification problems def sigmoid_function(z: float | np.ndarray) -> float | np.ndarray: """ Also known as Logistic Function. 1 f(x) = ------- 1 + e⁻ˣ The sigmoid function approaches a value of 1 as its input 'x' becomes increasing positive. Opposite for negative values. Reference: https://en.wikipedia.org/wiki/Sigmoid_function @param z: input to the function @returns: returns value in the range 0 to 1 Examples: >>> float(sigmoid_function(4)) 0.9820137900379085 >>> sigmoid_function(np.array([-3, 3])) array([0.04742587, 0.95257413]) >>> sigmoid_function(np.array([-3, 3, 1])) array([0.04742587, 0.95257413, 0.73105858]) >>> sigmoid_function(np.array([-0.01, -2, -1.9])) array([0.49750002, 0.11920292, 0.13010847]) >>> sigmoid_function(np.array([-1.3, 5.3, 12])) array([0.21416502, 0.9950332 , 0.99999386]) >>> sigmoid_function(np.array([0.01, 0.02, 4.1])) array([0.50249998, 0.50499983, 0.9836975 ]) >>> sigmoid_function(np.array([0.8])) array([0.68997448]) """ return 1 / (1 + np.exp(-z)) def cost_function(h: np.ndarray, y: np.ndarray) -> float: """ Cost function quantifies the error between predicted and expected values. The cost function used in Logistic Regression is called Log Loss or Cross Entropy Function. J(θ) = (1/m) * Σ [ -y * log(hθ(x)) - (1 - y) * log(1 - hθ(x)) ] Where: - J(θ) is the cost that we want to minimize during training - m is the number of training examples - Σ represents the summation over all training examples - y is the actual binary label (0 or 1) for a given example - hθ(x) is the predicted probability that x belongs to the positive class @param h: the output of sigmoid function. It is the estimated probability that the input example 'x' belongs to the positive class @param y: the actual binary label associated with input example 'x' Examples: >>> estimations = sigmoid_function(np.array([0.3, -4.3, 8.1])) >>> cost_function(h=estimations,y=np.array([1, 0, 1])) 0.18937868932131605 >>> estimations = sigmoid_function(np.array([4, 3, 1])) >>> cost_function(h=estimations,y=np.array([1, 0, 0])) 1.459999655669926 >>> estimations = sigmoid_function(np.array([4, -3, -1])) >>> cost_function(h=estimations,y=np.array([1,0,0])) 0.1266663223365915 >>> estimations = sigmoid_function(0) >>> cost_function(h=estimations,y=np.array([1])) 0.6931471805599453 References: - https://en.wikipedia.org/wiki/Logistic_regression """ return float((-y * np.log(h) - (1 - y) * np.log(1 - h)).mean()) def log_likelihood(x, y, weights): scores = np.dot(x, weights) return np.sum(y * scores - np.log(1 + np.exp(scores))) # here alpha is the learning rate, X is the feature matrix,y is the target matrix def logistic_reg(alpha, x, y, max_iterations=70000): theta = np.zeros(x.shape[1]) for iterations in range(max_iterations): z = np.dot(x, theta) h = sigmoid_function(z) gradient = np.dot(x.T, h - y) / y.size theta = theta - alpha * gradient # updating the weights z = np.dot(x, theta) h = sigmoid_function(z) j = cost_function(h, y) if iterations % 100 == 0: print(f"loss: {j} \t") # printing the loss after every 100 iterations return theta # In[68]: if __name__ == "__main__": import doctest doctest.testmod() iris = datasets.load_iris() x = iris.data[:, :2] y = (iris.target != 0) * 1 alpha = 0.1 theta = logistic_reg(alpha, x, y, max_iterations=70000) print("theta: ", theta) # printing the theta i.e our weights vector def predict_prob(x): return sigmoid_function( np.dot(x, theta) ) # predicting the value of probability from the logistic regression algorithm plt.figure(figsize=(10, 6)) plt.scatter(x[y == 0][:, 0], x[y == 0][:, 1], color="b", label="0") plt.scatter(x[y == 1][:, 0], x[y == 1][:, 1], color="r", label="1") (x1_min, x1_max) = (x[:, 0].min(), x[:, 0].max()) (x2_min, x2_max) = (x[:, 1].min(), x[:, 1].max()) (xx1, xx2) = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max)) grid = np.c_[xx1.ravel(), xx2.ravel()] probs = predict_prob(grid).reshape(xx1.shape) plt.contour(xx1, xx2, probs, [0.5], linewidths=1, colors="black") plt.legend() plt.show() ================================================ FILE: machine_learning/loss_functions.py ================================================ import numpy as np def binary_cross_entropy( y_true: np.ndarray, y_pred: np.ndarray, epsilon: float = 1e-15 ) -> float: """ Calculate the mean binary cross-entropy (BCE) loss between true labels and predicted probabilities. BCE loss quantifies dissimilarity between true labels (0 or 1) and predicted probabilities. It's widely used in binary classification tasks. BCE = -Σ(y_true * ln(y_pred) + (1 - y_true) * ln(1 - y_pred)) Reference: https://en.wikipedia.org/wiki/Cross_entropy Parameters: - y_true: True binary labels (0 or 1) - y_pred: Predicted probabilities for class 1 - epsilon: Small constant to avoid numerical instability >>> true_labels = np.array([0, 1, 1, 0, 1]) >>> predicted_probs = np.array([0.2, 0.7, 0.9, 0.3, 0.8]) >>> float(binary_cross_entropy(true_labels, predicted_probs)) 0.2529995012327421 >>> true_labels = np.array([0, 1, 1, 0, 1]) >>> predicted_probs = np.array([0.3, 0.8, 0.9, 0.2]) >>> binary_cross_entropy(true_labels, predicted_probs) Traceback (most recent call last): ... ValueError: Input arrays must have the same length. """ if len(y_true) != len(y_pred): raise ValueError("Input arrays must have the same length.") y_pred = np.clip(y_pred, epsilon, 1 - epsilon) # Clip predictions to avoid log(0) bce_loss = -(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred)) return np.mean(bce_loss) def binary_focal_cross_entropy( y_true: np.ndarray, y_pred: np.ndarray, gamma: float = 2.0, alpha: float = 0.25, epsilon: float = 1e-15, ) -> float: """ Calculate the mean binary focal cross-entropy (BFCE) loss between true labels and predicted probabilities. BFCE loss quantifies dissimilarity between true labels (0 or 1) and predicted probabilities. It's a variation of binary cross-entropy that addresses class imbalance by focusing on hard examples. BCFE = -Σ(alpha * (1 - y_pred)**gamma * y_true * log(y_pred) + (1 - alpha) * y_pred**gamma * (1 - y_true) * log(1 - y_pred)) Reference: [Lin et al., 2018](https://arxiv.org/pdf/1708.02002.pdf) Parameters: - y_true: True binary labels (0 or 1). - y_pred: Predicted probabilities for class 1. - gamma: Focusing parameter for modulating the loss (default: 2.0). - alpha: Weighting factor for class 1 (default: 0.25). - epsilon: Small constant to avoid numerical instability. >>> true_labels = np.array([0, 1, 1, 0, 1]) >>> predicted_probs = np.array([0.2, 0.7, 0.9, 0.3, 0.8]) >>> float(binary_focal_cross_entropy(true_labels, predicted_probs)) 0.008257977659239775 >>> true_labels = np.array([0, 1, 1, 0, 1]) >>> predicted_probs = np.array([0.3, 0.8, 0.9, 0.2]) >>> binary_focal_cross_entropy(true_labels, predicted_probs) Traceback (most recent call last): ... ValueError: Input arrays must have the same length. """ if len(y_true) != len(y_pred): raise ValueError("Input arrays must have the same length.") # Clip predicted probabilities to avoid log(0) y_pred = np.clip(y_pred, epsilon, 1 - epsilon) bcfe_loss = -( alpha * (1 - y_pred) ** gamma * y_true * np.log(y_pred) + (1 - alpha) * y_pred**gamma * (1 - y_true) * np.log(1 - y_pred) ) return np.mean(bcfe_loss) def categorical_cross_entropy( y_true: np.ndarray, y_pred: np.ndarray, epsilon: float = 1e-15 ) -> float: """ Calculate categorical cross-entropy (CCE) loss between true class labels and predicted class probabilities. CCE = -Σ(y_true * ln(y_pred)) Reference: https://en.wikipedia.org/wiki/Cross_entropy Parameters: - y_true: True class labels (one-hot encoded) - y_pred: Predicted class probabilities - epsilon: Small constant to avoid numerical instability >>> true_labels = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) >>> pred_probs = np.array([[0.9, 0.1, 0.0], [0.2, 0.7, 0.1], [0.0, 0.1, 0.9]]) >>> float(categorical_cross_entropy(true_labels, pred_probs)) 0.567395975254385 >>> true_labels = np.array([[1, 0], [0, 1]]) >>> pred_probs = np.array([[0.9, 0.1, 0.0], [0.2, 0.7, 0.1]]) >>> categorical_cross_entropy(true_labels, pred_probs) Traceback (most recent call last): ... ValueError: Input arrays must have the same shape. >>> true_labels = np.array([[2, 0, 1], [1, 0, 0]]) >>> pred_probs = np.array([[0.9, 0.1, 0.0], [0.2, 0.7, 0.1]]) >>> categorical_cross_entropy(true_labels, pred_probs) Traceback (most recent call last): ... ValueError: y_true must be one-hot encoded. >>> true_labels = np.array([[1, 0, 1], [1, 0, 0]]) >>> pred_probs = np.array([[0.9, 0.1, 0.0], [0.2, 0.7, 0.1]]) >>> categorical_cross_entropy(true_labels, pred_probs) Traceback (most recent call last): ... ValueError: y_true must be one-hot encoded. >>> true_labels = np.array([[1, 0, 0], [0, 1, 0]]) >>> pred_probs = np.array([[0.9, 0.1, 0.1], [0.2, 0.7, 0.1]]) >>> categorical_cross_entropy(true_labels, pred_probs) Traceback (most recent call last): ... ValueError: Predicted probabilities must sum to approximately 1. """ if y_true.shape != y_pred.shape: raise ValueError("Input arrays must have the same shape.") if np.any((y_true != 0) & (y_true != 1)) or np.any(y_true.sum(axis=1) != 1): raise ValueError("y_true must be one-hot encoded.") if not np.all(np.isclose(np.sum(y_pred, axis=1), 1, rtol=epsilon, atol=epsilon)): raise ValueError("Predicted probabilities must sum to approximately 1.") y_pred = np.clip(y_pred, epsilon, 1) # Clip predictions to avoid log(0) return -np.sum(y_true * np.log(y_pred)) def categorical_focal_cross_entropy( y_true: np.ndarray, y_pred: np.ndarray, alpha: np.ndarray = None, gamma: float = 2.0, epsilon: float = 1e-15, ) -> float: """ Calculate the mean categorical focal cross-entropy (CFCE) loss between true labels and predicted probabilities for multi-class classification. CFCE loss is a generalization of binary focal cross-entropy for multi-class classification. It addresses class imbalance by focusing on hard examples. CFCE = -Σ alpha * (1 - y_pred)**gamma * y_true * log(y_pred) Reference: [Lin et al., 2018](https://arxiv.org/pdf/1708.02002.pdf) Parameters: - y_true: True labels in one-hot encoded form. - y_pred: Predicted probabilities for each class. - alpha: Array of weighting factors for each class. - gamma: Focusing parameter for modulating the loss (default: 2.0). - epsilon: Small constant to avoid numerical instability. Returns: - The mean categorical focal cross-entropy loss. >>> true_labels = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) >>> pred_probs = np.array([[0.9, 0.1, 0.0], [0.2, 0.7, 0.1], [0.0, 0.1, 0.9]]) >>> alpha = np.array([0.6, 0.2, 0.7]) >>> float(categorical_focal_cross_entropy(true_labels, pred_probs, alpha)) 0.0025966118981496423 >>> true_labels = np.array([[0, 1, 0], [0, 0, 1]]) >>> pred_probs = np.array([[0.05, 0.95, 0], [0.1, 0.8, 0.1]]) >>> alpha = np.array([0.25, 0.25, 0.25]) >>> float(categorical_focal_cross_entropy(true_labels, pred_probs, alpha)) 0.23315276982014324 >>> true_labels = np.array([[1, 0], [0, 1]]) >>> pred_probs = np.array([[0.9, 0.1, 0.0], [0.2, 0.7, 0.1]]) >>> categorical_cross_entropy(true_labels, pred_probs) Traceback (most recent call last): ... ValueError: Input arrays must have the same shape. >>> true_labels = np.array([[2, 0, 1], [1, 0, 0]]) >>> pred_probs = np.array([[0.9, 0.1, 0.0], [0.2, 0.7, 0.1]]) >>> categorical_focal_cross_entropy(true_labels, pred_probs) Traceback (most recent call last): ... ValueError: y_true must be one-hot encoded. >>> true_labels = np.array([[1, 0, 1], [1, 0, 0]]) >>> pred_probs = np.array([[0.9, 0.1, 0.0], [0.2, 0.7, 0.1]]) >>> categorical_focal_cross_entropy(true_labels, pred_probs) Traceback (most recent call last): ... ValueError: y_true must be one-hot encoded. >>> true_labels = np.array([[1, 0, 0], [0, 1, 0]]) >>> pred_probs = np.array([[0.9, 0.1, 0.1], [0.2, 0.7, 0.1]]) >>> categorical_focal_cross_entropy(true_labels, pred_probs) Traceback (most recent call last): ... ValueError: Predicted probabilities must sum to approximately 1. >>> true_labels = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) >>> pred_probs = np.array([[0.9, 0.1, 0.0], [0.2, 0.7, 0.1], [0.0, 0.1, 0.9]]) >>> alpha = np.array([0.6, 0.2]) >>> categorical_focal_cross_entropy(true_labels, pred_probs, alpha) Traceback (most recent call last): ... ValueError: Length of alpha must match the number of classes. """ if y_true.shape != y_pred.shape: raise ValueError("Shape of y_true and y_pred must be the same.") if alpha is None: alpha = np.ones(y_true.shape[1]) if np.any((y_true != 0) & (y_true != 1)) or np.any(y_true.sum(axis=1) != 1): raise ValueError("y_true must be one-hot encoded.") if len(alpha) != y_true.shape[1]: raise ValueError("Length of alpha must match the number of classes.") if not np.all(np.isclose(np.sum(y_pred, axis=1), 1, rtol=epsilon, atol=epsilon)): raise ValueError("Predicted probabilities must sum to approximately 1.") # Clip predicted probabilities to avoid log(0) y_pred = np.clip(y_pred, epsilon, 1 - epsilon) # Calculate loss for each class and sum across classes cfce_loss = -np.sum( alpha * np.power(1 - y_pred, gamma) * y_true * np.log(y_pred), axis=1 ) return np.mean(cfce_loss) def hinge_loss(y_true: np.ndarray, y_pred: np.ndarray) -> float: """ Calculate the mean hinge loss for between true labels and predicted probabilities for training support vector machines (SVMs). Hinge loss = max(0, 1 - true * pred) Reference: https://en.wikipedia.org/wiki/Hinge_loss Args: - y_true: actual values (ground truth) encoded as -1 or 1 - y_pred: predicted values >>> true_labels = np.array([-1, 1, 1, -1, 1]) >>> pred = np.array([-4, -0.3, 0.7, 5, 10]) >>> float(hinge_loss(true_labels, pred)) 1.52 >>> true_labels = np.array([-1, 1, 1, -1, 1, 1]) >>> pred = np.array([-4, -0.3, 0.7, 5, 10]) >>> hinge_loss(true_labels, pred) Traceback (most recent call last): ... ValueError: Length of predicted and actual array must be same. >>> true_labels = np.array([-1, 1, 10, -1, 1]) >>> pred = np.array([-4, -0.3, 0.7, 5, 10]) >>> hinge_loss(true_labels, pred) Traceback (most recent call last): ... ValueError: y_true can have values -1 or 1 only. """ if len(y_true) != len(y_pred): raise ValueError("Length of predicted and actual array must be same.") if np.any((y_true != -1) & (y_true != 1)): raise ValueError("y_true can have values -1 or 1 only.") hinge_losses = np.maximum(0, 1.0 - (y_true * y_pred)) return np.mean(hinge_losses) def huber_loss(y_true: np.ndarray, y_pred: np.ndarray, delta: float) -> float: """ Calculate the mean Huber loss between the given ground truth and predicted values. The Huber loss describes the penalty incurred by an estimation procedure, and it serves as a measure of accuracy for regression models. Huber loss = 0.5 * (y_true - y_pred)^2 if |y_true - y_pred| <= delta delta * |y_true - y_pred| - 0.5 * delta^2 otherwise Reference: https://en.wikipedia.org/wiki/Huber_loss Parameters: - y_true: The true values (ground truth) - y_pred: The predicted values >>> true_values = np.array([0.9, 10.0, 2.0, 1.0, 5.2]) >>> predicted_values = np.array([0.8, 2.1, 2.9, 4.2, 5.2]) >>> bool(np.isclose(huber_loss(true_values, predicted_values, 1.0), 2.102)) True >>> true_labels = np.array([11.0, 21.0, 3.32, 4.0, 5.0]) >>> predicted_probs = np.array([8.3, 20.8, 2.9, 11.2, 5.0]) >>> bool(np.isclose(huber_loss(true_labels, predicted_probs, 1.0), 1.80164)) True >>> true_labels = np.array([11.0, 21.0, 3.32, 4.0]) >>> predicted_probs = np.array([8.3, 20.8, 2.9, 11.2, 5.0]) >>> huber_loss(true_labels, predicted_probs, 1.0) Traceback (most recent call last): ... ValueError: Input arrays must have the same length. """ if len(y_true) != len(y_pred): raise ValueError("Input arrays must have the same length.") huber_mse = 0.5 * (y_true - y_pred) ** 2 huber_mae = delta * (np.abs(y_true - y_pred) - 0.5 * delta) return np.where(np.abs(y_true - y_pred) <= delta, huber_mse, huber_mae).mean() def mean_squared_error(y_true: np.ndarray, y_pred: np.ndarray) -> float: """ Calculate the mean squared error (MSE) between ground truth and predicted values. MSE measures the squared difference between true values and predicted values, and it serves as a measure of accuracy for regression models. MSE = (1/n) * Σ(y_true - y_pred)^2 Reference: https://en.wikipedia.org/wiki/Mean_squared_error Parameters: - y_true: The true values (ground truth) - y_pred: The predicted values >>> true_values = np.array([1.0, 2.0, 3.0, 4.0, 5.0]) >>> predicted_values = np.array([0.8, 2.1, 2.9, 4.2, 5.2]) >>> bool(np.isclose(mean_squared_error(true_values, predicted_values), 0.028)) True >>> true_labels = np.array([1.0, 2.0, 3.0, 4.0, 5.0]) >>> predicted_probs = np.array([0.3, 0.8, 0.9, 0.2]) >>> mean_squared_error(true_labels, predicted_probs) Traceback (most recent call last): ... ValueError: Input arrays must have the same length. """ if len(y_true) != len(y_pred): raise ValueError("Input arrays must have the same length.") squared_errors = (y_true - y_pred) ** 2 return np.mean(squared_errors) def mean_absolute_error(y_true: np.ndarray, y_pred: np.ndarray) -> float: """ Calculates the Mean Absolute Error (MAE) between ground truth (observed) and predicted values. MAE measures the absolute difference between true values and predicted values. Equation: MAE = (1/n) * Σ(abs(y_true - y_pred)) Reference: https://en.wikipedia.org/wiki/Mean_absolute_error Parameters: - y_true: The true values (ground truth) - y_pred: The predicted values >>> true_values = np.array([1.0, 2.0, 3.0, 4.0, 5.0]) >>> predicted_values = np.array([0.8, 2.1, 2.9, 4.2, 5.2]) >>> bool(np.isclose(mean_absolute_error(true_values, predicted_values), 0.16)) True >>> true_values = np.array([1.0, 2.0, 3.0, 4.0, 5.0]) >>> predicted_values = np.array([0.8, 2.1, 2.9, 4.2, 5.2]) >>> bool(np.isclose(mean_absolute_error(true_values, predicted_values), 2.16)) False >>> true_labels = np.array([1.0, 2.0, 3.0, 4.0, 5.0]) >>> predicted_probs = np.array([0.3, 0.8, 0.9, 5.2]) >>> mean_absolute_error(true_labels, predicted_probs) Traceback (most recent call last): ... ValueError: Input arrays must have the same length. """ if len(y_true) != len(y_pred): raise ValueError("Input arrays must have the same length.") return np.mean(abs(y_true - y_pred)) def mean_squared_logarithmic_error(y_true: np.ndarray, y_pred: np.ndarray) -> float: """ Calculate the mean squared logarithmic error (MSLE) between ground truth and predicted values. MSLE measures the squared logarithmic difference between true values and predicted values for regression models. It's particularly useful for dealing with skewed or large-value data, and it's often used when the relative differences between predicted and true values are more important than absolute differences. MSLE = (1/n) * Σ(log(1 + y_true) - log(1 + y_pred))^2 Reference: https://insideaiml.com/blog/MeanSquared-Logarithmic-Error-Loss-1035 Parameters: - y_true: The true values (ground truth) - y_pred: The predicted values >>> true_values = np.array([1.0, 2.0, 3.0, 4.0, 5.0]) >>> predicted_values = np.array([0.8, 2.1, 2.9, 4.2, 5.2]) >>> float(mean_squared_logarithmic_error(true_values, predicted_values)) 0.0030860877925181344 >>> true_labels = np.array([1.0, 2.0, 3.0, 4.0, 5.0]) >>> predicted_probs = np.array([0.3, 0.8, 0.9, 0.2]) >>> mean_squared_logarithmic_error(true_labels, predicted_probs) Traceback (most recent call last): ... ValueError: Input arrays must have the same length. """ if len(y_true) != len(y_pred): raise ValueError("Input arrays must have the same length.") squared_logarithmic_errors = (np.log1p(y_true) - np.log1p(y_pred)) ** 2 return np.mean(squared_logarithmic_errors) def mean_absolute_percentage_error( y_true: np.ndarray, y_pred: np.ndarray, epsilon: float = 1e-15 ) -> float: """ Calculate the Mean Absolute Percentage Error between y_true and y_pred. Mean Absolute Percentage Error calculates the average of the absolute percentage differences between the predicted and true values. Formula = (Σ|y_true[i]-Y_pred[i]/y_true[i]|)/n Source: https://stephenallwright.com/good-mape-score/ Parameters: y_true (np.ndarray): Numpy array containing true/target values. y_pred (np.ndarray): Numpy array containing predicted values. Returns: float: The Mean Absolute Percentage error between y_true and y_pred. Examples: >>> y_true = np.array([10, 20, 30, 40]) >>> y_pred = np.array([12, 18, 33, 45]) >>> float(mean_absolute_percentage_error(y_true, y_pred)) 0.13125 >>> y_true = np.array([1, 2, 3, 4]) >>> y_pred = np.array([2, 3, 4, 5]) >>> float(mean_absolute_percentage_error(y_true, y_pred)) 0.5208333333333333 >>> y_true = np.array([34, 37, 44, 47, 48, 48, 46, 43, 32, 27, 26, 24]) >>> y_pred = np.array([37, 40, 46, 44, 46, 50, 45, 44, 34, 30, 22, 23]) >>> float(mean_absolute_percentage_error(y_true, y_pred)) 0.064671076436071 """ if len(y_true) != len(y_pred): raise ValueError("The length of the two arrays should be the same.") y_true = np.where(y_true == 0, epsilon, y_true) absolute_percentage_diff = np.abs((y_true - y_pred) / y_true) return np.mean(absolute_percentage_diff) def perplexity_loss( y_true: np.ndarray, y_pred: np.ndarray, epsilon: float = 1e-7 ) -> float: """ Calculate the perplexity for the y_true and y_pred. Compute the Perplexity which useful in predicting language model accuracy in Natural Language Processing (NLP.) Perplexity is measure of how certain the model in its predictions. Perplexity Loss = exp(-1/N (Σ ln(p(x))) Reference: https://en.wikipedia.org/wiki/Perplexity Args: y_true: Actual label encoded sentences of shape (batch_size, sentence_length) y_pred: Predicted sentences of shape (batch_size, sentence_length, vocab_size) epsilon: Small floating point number to avoid getting inf for log(0) Returns: Perplexity loss between y_true and y_pred. >>> y_true = np.array([[1, 4], [2, 3]]) >>> y_pred = np.array( ... [[[0.28, 0.19, 0.21 , 0.15, 0.15], ... [0.24, 0.19, 0.09, 0.18, 0.27]], ... [[0.03, 0.26, 0.21, 0.18, 0.30], ... [0.28, 0.10, 0.33, 0.15, 0.12]]] ... ) >>> float(perplexity_loss(y_true, y_pred)) 5.0247347775367945 >>> y_true = np.array([[1, 4], [2, 3]]) >>> y_pred = np.array( ... [[[0.28, 0.19, 0.21 , 0.15, 0.15], ... [0.24, 0.19, 0.09, 0.18, 0.27], ... [0.30, 0.10, 0.20, 0.15, 0.25]], ... [[0.03, 0.26, 0.21, 0.18, 0.30], ... [0.28, 0.10, 0.33, 0.15, 0.12], ... [0.30, 0.10, 0.20, 0.15, 0.25]],] ... ) >>> perplexity_loss(y_true, y_pred) Traceback (most recent call last): ... ValueError: Sentence length of y_true and y_pred must be equal. >>> y_true = np.array([[1, 4], [2, 11]]) >>> y_pred = np.array( ... [[[0.28, 0.19, 0.21 , 0.15, 0.15], ... [0.24, 0.19, 0.09, 0.18, 0.27]], ... [[0.03, 0.26, 0.21, 0.18, 0.30], ... [0.28, 0.10, 0.33, 0.15, 0.12]]] ... ) >>> perplexity_loss(y_true, y_pred) Traceback (most recent call last): ... ValueError: Label value must not be greater than vocabulary size. >>> y_true = np.array([[1, 4]]) >>> y_pred = np.array( ... [[[0.28, 0.19, 0.21 , 0.15, 0.15], ... [0.24, 0.19, 0.09, 0.18, 0.27]], ... [[0.03, 0.26, 0.21, 0.18, 0.30], ... [0.28, 0.10, 0.33, 0.15, 0.12]]] ... ) >>> perplexity_loss(y_true, y_pred) Traceback (most recent call last): ... ValueError: Batch size of y_true and y_pred must be equal. """ vocab_size = y_pred.shape[2] if y_true.shape[0] != y_pred.shape[0]: raise ValueError("Batch size of y_true and y_pred must be equal.") if y_true.shape[1] != y_pred.shape[1]: raise ValueError("Sentence length of y_true and y_pred must be equal.") if np.max(y_true) > vocab_size: raise ValueError("Label value must not be greater than vocabulary size.") # Matrix to select prediction value only for true class filter_matrix = np.array( [[list(np.eye(vocab_size)[word]) for word in sentence] for sentence in y_true] ) # Getting the matrix containing prediction for only true class true_class_pred = np.sum(y_pred * filter_matrix, axis=2).clip(epsilon, 1) # Calculating perplexity for each sentence perp_losses = np.exp(np.negative(np.mean(np.log(true_class_pred), axis=1))) return np.mean(perp_losses) def smooth_l1_loss(y_true: np.ndarray, y_pred: np.ndarray, beta: float = 1.0) -> float: """ Calculate the Smooth L1 Loss between y_true and y_pred. The Smooth L1 Loss is less sensitive to outliers than the L2 Loss and is often used in regression problems, such as object detection. Smooth L1 Loss = 0.5 * (x - y)^2 / beta, if |x - y| < beta |x - y| - 0.5 * beta, otherwise Reference: https://pytorch.org/docs/stable/generated/torch.nn.SmoothL1Loss.html Args: y_true: Array of true values. y_pred: Array of predicted values. beta: Specifies the threshold at which to change between L1 and L2 loss. Returns: The calculated Smooth L1 Loss between y_true and y_pred. Raises: ValueError: If the length of the two arrays is not the same. >>> y_true = np.array([3, 5, 2, 7]) >>> y_pred = np.array([2.9, 4.8, 2.1, 7.2]) >>> float(smooth_l1_loss(y_true, y_pred, 1.0)) 0.012500000000000022 >>> y_true = np.array([2, 4, 6]) >>> y_pred = np.array([1, 5, 7]) >>> float(smooth_l1_loss(y_true, y_pred, 1.0)) 0.5 >>> y_true = np.array([1, 3, 5, 7]) >>> y_pred = np.array([1, 3, 5, 7]) >>> float(smooth_l1_loss(y_true, y_pred, 1.0)) 0.0 >>> y_true = np.array([1, 3, 5]) >>> y_pred = np.array([1, 3, 5, 7]) >>> smooth_l1_loss(y_true, y_pred, 1.0) Traceback (most recent call last): ... ValueError: The length of the two arrays should be the same. """ if len(y_true) != len(y_pred): raise ValueError("The length of the two arrays should be the same.") diff = np.abs(y_true - y_pred) loss = np.where(diff < beta, 0.5 * diff**2 / beta, diff - 0.5 * beta) return np.mean(loss) def kullback_leibler_divergence(y_true: np.ndarray, y_pred: np.ndarray) -> float: """ Calculate the Kullback-Leibler divergence (KL divergence) loss between true labels and predicted probabilities. KL divergence loss quantifies dissimilarity between true labels and predicted probabilities. It's often used in training generative models. KL = Σ(y_true * ln(y_true / y_pred)) Reference: https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence Parameters: - y_true: True class probabilities - y_pred: Predicted class probabilities >>> true_labels = np.array([0.2, 0.3, 0.5]) >>> predicted_probs = np.array([0.3, 0.3, 0.4]) >>> float(kullback_leibler_divergence(true_labels, predicted_probs)) 0.030478754035472025 >>> true_labels = np.array([0.2, 0.3, 0.5]) >>> predicted_probs = np.array([0.3, 0.3, 0.4, 0.5]) >>> kullback_leibler_divergence(true_labels, predicted_probs) Traceback (most recent call last): ... ValueError: Input arrays must have the same length. """ if len(y_true) != len(y_pred): raise ValueError("Input arrays must have the same length.") kl_loss = y_true * np.log(y_true / y_pred) return np.sum(kl_loss) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: machine_learning/lstm/__init__.py ================================================ ================================================ FILE: machine_learning/lstm/lstm_prediction.py ================================================ """ Create a Long Short Term Memory (LSTM) network model An LSTM is a type of Recurrent Neural Network (RNN) as discussed at: * https://colah.github.io/posts/2015-08-Understanding-LSTMs * https://en.wikipedia.org/wiki/Long_short-term_memory """ import numpy as np import pandas as pd from keras.layers import LSTM, Dense from keras.models import Sequential from sklearn.preprocessing import MinMaxScaler if __name__ == "__main__": """ First part of building a model is to get the data and prepare it for our model. You can use any dataset for stock prediction make sure you set the price column on line number 21. Here we use a dataset which have the price on 3rd column. """ sample_data = pd.read_csv("sample_data.csv", header=None) len_data = sample_data.shape[:1][0] # If you're using some other dataset input the target column actual_data = sample_data.iloc[:, 1:2] actual_data = actual_data.to_numpy().reshape(len_data, 1) actual_data = MinMaxScaler().fit_transform(actual_data) look_back = 10 forward_days = 5 periods = 20 division = len_data - periods * look_back train_data = actual_data[:division] test_data = actual_data[division - look_back :] train_x, train_y = [], [] test_x, test_y = [], [] for i in range(len(train_data) - forward_days - look_back + 1): train_x.append(train_data[i : i + look_back]) train_y.append(train_data[i + look_back : i + look_back + forward_days]) for i in range(len(test_data) - forward_days - look_back + 1): test_x.append(test_data[i : i + look_back]) test_y.append(test_data[i + look_back : i + look_back + forward_days]) x_train = np.array(train_x) x_test = np.array(test_x) y_train = np.array([list(i.ravel()) for i in train_y]) y_test = np.array([list(i.ravel()) for i in test_y]) model = Sequential() model.add(LSTM(128, input_shape=(look_back, 1), return_sequences=True)) model.add(LSTM(64, input_shape=(128, 1))) model.add(Dense(forward_days)) model.compile(loss="mean_squared_error", optimizer="adam") history = model.fit( x_train, y_train, epochs=150, verbose=1, shuffle=True, batch_size=4 ) pred = model.predict(x_test) ================================================ FILE: machine_learning/lstm/sample_data.csv ================================================ 04/24/2020, 1279.31, 1640394, 1261.17, 1280.4, 1249.45 04/23/2020, 1276.31, 1566203, 1271.55, 1293.31, 1265.67 04/22/2020, 1263.21, 2093140, 1245.54, 1285.6133, 1242 04/21/2020, 1216.34, 2153003, 1247, 1254.27, 1209.71 04/20/2020, 1266.61, 1695488, 1271, 1281.6, 1261.37 04/17/2020, 1283.25, 1949042, 1284.85, 1294.43, 1271.23 04/16/2020, 1263.47, 2518099, 1274.1, 1279, 1242.62 04/15/2020, 1262.47, 1671703, 1245.61, 1280.46, 1240.4 04/14/2020, 1269.23, 2470353, 1245.09, 1282.07, 1236.93 04/13/2020, 1217.56, 1739828, 1209.18, 1220.51, 1187.5984 04/09/2020, 1211.45, 2175421, 1224.08, 1225.57, 1196.7351 04/08/2020, 1210.28, 1975135, 1206.5, 1219.07, 1188.16 04/07/2020, 1186.51, 2387329, 1221, 1225, 1182.23 04/06/2020, 1186.92, 2664723, 1138, 1194.66, 1130.94 04/03/2020, 1097.88, 2313400, 1119.015, 1123.54, 1079.81 04/02/2020, 1120.84, 1964881, 1098.26, 1126.86, 1096.4 04/01/2020, 1105.62, 2344173, 1122, 1129.69, 1097.45 03/31/2020, 1162.81, 2487983, 1147.3, 1175.31, 1138.14 03/30/2020, 1146.82, 2574061, 1125.04, 1151.63, 1096.48 03/27/2020, 1110.71, 3208495, 1125.67, 1150.6702, 1105.91 03/26/2020, 1161.75, 3573755, 1111.8, 1169.97, 1093.53 03/25/2020, 1102.49, 4081528, 1126.47, 1148.9, 1086.01 03/24/2020, 1134.46, 3344450, 1103.77, 1135, 1090.62 03/23/2020, 1056.62, 4044137, 1061.32, 1071.32, 1013.5361 03/20/2020, 1072.32, 3601750, 1135.72, 1143.99, 1065.49 03/19/2020, 1115.29, 3651106, 1093.05, 1157.9699, 1060.1075 03/18/2020, 1096.8, 4233435, 1056.51, 1106.5, 1037.28 03/17/2020, 1119.8, 3861489, 1093.11, 1130.86, 1056.01 03/16/2020, 1084.33, 4252365, 1096, 1152.2665, 1074.44 03/13/2020, 1219.73, 3700125, 1179, 1219.76, 1117.1432 03/12/2020, 1114.91, 4226748, 1126, 1193.87, 1113.3 03/11/2020, 1215.41, 2611229, 1249.7, 1260.96, 1196.07 03/10/2020, 1280.39, 2611373, 1260, 1281.15, 1218.77 03/09/2020, 1215.56, 3365365, 1205.3, 1254.7599, 1200 03/06/2020, 1298.41, 2660628, 1277.06, 1306.22, 1261.05 03/05/2020, 1319.04, 2561288, 1350.2, 1358.91, 1305.1 03/04/2020, 1386.52, 1913315, 1359.23, 1388.09, 1343.11 03/03/2020, 1341.39, 2402326, 1399.42, 1410.15, 1332 03/02/2020, 1389.11, 2431468, 1351.61, 1390.87, 1326.815 02/28/2020, 1339.33, 3790618, 1277.5, 1341.14, 1271 02/27/2020, 1318.09, 2978300, 1362.06, 1371.7037, 1317.17 02/26/2020, 1393.18, 2204037, 1396.14, 1415.7, 1379 02/25/2020, 1388.45, 2478278, 1433, 1438.14, 1382.4 02/24/2020, 1421.59, 2867053, 1426.11, 1436.97, 1411.39 02/21/2020, 1485.11, 1732273, 1508.03, 1512.215, 1480.44 02/20/2020, 1518.15, 1096552, 1522, 1529.64, 1506.82 02/19/2020, 1526.69, 949268, 1525.07, 1532.1063, 1521.4 02/18/2020, 1519.67, 1121140, 1515, 1531.63, 1512.59 02/14/2020, 1520.74, 1197836, 1515.6, 1520.74, 1507.34 02/13/2020, 1514.66, 929730, 1512.69, 1527.18, 1504.6 02/12/2020, 1518.27, 1167565, 1514.48, 1520.695, 1508.11 02/11/2020, 1508.79, 1344633, 1511.81, 1529.63, 1505.6378 02/10/2020, 1508.68, 1419876, 1474.32, 1509.5, 1474.32 02/07/2020, 1479.23, 1172270, 1467.3, 1485.84, 1466.35 02/06/2020, 1476.23, 1679384, 1450.33, 1481.9997, 1449.57 02/05/2020, 1448.23, 1986157, 1462.42, 1463.84, 1430.56 02/04/2020, 1447.07, 3932954, 1457.07, 1469.5, 1426.3 02/03/2020, 1485.94, 3055216, 1462, 1490, 1458.99 01/31/2020, 1434.23, 2417214, 1468.9, 1470.13, 1428.53 01/30/2020, 1455.84, 1339421, 1439.96, 1457.28, 1436.4 01/29/2020, 1458.63, 1078667, 1458.8, 1465.43, 1446.74 01/28/2020, 1452.56, 1577422, 1443, 1456, 1432.47 01/27/2020, 1433.9, 1755201, 1431, 1438.07, 1421.2 01/24/2020, 1466.71, 1784644, 1493.59, 1495.495, 1465.25 01/23/2020, 1486.65, 1351354, 1487.64, 1495.52, 1482.1 01/22/2020, 1485.95, 1610846, 1491, 1503.2143, 1484.93 01/21/2020, 1484.4, 2036780, 1479.12, 1491.85, 1471.2 01/17/2020, 1480.39, 2396215, 1462.91, 1481.2954, 1458.22 01/16/2020, 1451.7, 1173688, 1447.44, 1451.99, 1440.92 01/15/2020, 1439.2, 1282685, 1430.21, 1441.395, 1430.21 01/14/2020, 1430.88, 1560453, 1439.01, 1441.8, 1428.37 01/13/2020, 1439.23, 1653482, 1436.13, 1440.52, 1426.02 01/10/2020, 1429.73, 1821566, 1427.56, 1434.9292, 1418.35 01/09/2020, 1419.83, 1502664, 1420.57, 1427.33, 1410.27 01/08/2020, 1404.32, 1529177, 1392.08, 1411.58, 1390.84 01/07/2020, 1393.34, 1511693, 1397.94, 1402.99, 1390.38 01/06/2020, 1394.21, 1733149, 1350, 1396.5, 1350 01/03/2020, 1360.66, 1187006, 1347.86, 1372.5, 1345.5436 01/02/2020, 1367.37, 1406731, 1341.55, 1368.14, 1341.55 12/31/2019, 1337.02, 962468, 1330.11, 1338, 1329.085 12/30/2019, 1336.14, 1051323, 1350, 1353, 1334.02 12/27/2019, 1351.89, 1038718, 1362.99, 1364.53, 1349.31 12/26/2019, 1360.4, 667754, 1346.17, 1361.3269, 1344.47 12/24/2019, 1343.56, 347518, 1348.5, 1350.26, 1342.78 12/23/2019, 1348.84, 883200, 1355.87, 1359.7999, 1346.51 12/20/2019, 1349.59, 3316905, 1363.35, 1363.64, 1349 12/19/2019, 1356.04, 1470112, 1351.82, 1358.1, 1348.985 12/18/2019, 1352.62, 1657069, 1356.6, 1360.47, 1351 12/17/2019, 1355.12, 1855259, 1362.89, 1365, 1351.3231 12/16/2019, 1361.17, 1397451, 1356.5, 1364.68, 1352.67 12/13/2019, 1347.83, 1550028, 1347.95, 1353.0931, 1343.87 12/12/2019, 1350.27, 1281722, 1345.94, 1355.775, 1340.5 12/11/2019, 1345.02, 850796, 1350.84, 1351.2, 1342.67 12/10/2019, 1344.66, 1094653, 1341.5, 1349.975, 1336.04 12/09/2019, 1343.56, 1355795, 1338.04, 1359.45, 1337.84 12/06/2019, 1340.62, 1315510, 1333.44, 1344, 1333.44 12/05/2019, 1328.13, 1212818, 1328, 1329.3579, 1316.44 12/04/2019, 1320.54, 1538110, 1307.01, 1325.8, 1304.87 12/03/2019, 1295.28, 1268647, 1279.57, 1298.461, 1279 12/02/2019, 1289.92, 1511851, 1301, 1305.83, 1281 11/29/2019, 1304.96, 586981, 1307.12, 1310.205, 1303.97 11/27/2019, 1312.99, 996329, 1315, 1318.36, 1309.63 11/26/2019, 1313.55, 1069795, 1309.86, 1314.8, 1305.09 11/25/2019, 1306.69, 1036487, 1299.18, 1311.31, 1298.13 11/22/2019, 1295.34, 1386506, 1305.62, 1308.73, 1291.41 11/21/2019, 1301.35, 995499, 1301.48, 1312.59, 1293 11/20/2019, 1303.05, 1309835, 1311.74, 1315, 1291.15 11/19/2019, 1315.46, 1269372, 1327.7, 1327.7, 1312.8 11/18/2019, 1320.7, 1488083, 1332.22, 1335.5288, 1317.5 11/15/2019, 1334.87, 1782955, 1318.94, 1334.88, 1314.2796 11/14/2019, 1311.46, 1194305, 1297.5, 1317, 1295.65 11/13/2019, 1298, 853861, 1294.07, 1304.3, 1293.51 11/12/2019, 1298.8, 1085859, 1300, 1310, 1295.77 11/11/2019, 1299.19, 1012429, 1303.18, 1306.425, 1297.41 11/08/2019, 1311.37, 1251916, 1305.28, 1318, 1304.365 11/07/2019, 1308.86, 2029970, 1294.28, 1323.74, 1294.245 11/06/2019, 1291.8, 1152977, 1289.46, 1293.73, 1282.5 11/05/2019, 1292.03, 1282711, 1292.89, 1298.93, 1291.2289 11/04/2019, 1291.37, 1500964, 1276.45, 1294.13, 1276.355 11/01/2019, 1273.74, 1670072, 1265, 1274.62, 1260.5 10/31/2019, 1260.11, 1455651, 1261.28, 1267.67, 1250.8428 10/30/2019, 1261.29, 1408851, 1252.97, 1269.36, 1252 10/29/2019, 1262.62, 1886380, 1276.23, 1281.59, 1257.2119 10/28/2019, 1290, 2613237, 1275.45, 1299.31, 1272.54 10/25/2019, 1265.13, 1213051, 1251.03, 1269.6, 1250.01 10/24/2019, 1260.99, 1039868, 1260.9, 1264, 1253.715 10/23/2019, 1259.13, 928595, 1242.36, 1259.89, 1242.36 10/22/2019, 1242.8, 1047851, 1247.85, 1250.6, 1241.38 10/21/2019, 1246.15, 1038042, 1252.26, 1254.6287, 1240.6 10/18/2019, 1245.49, 1352839, 1253.46, 1258.89, 1241.08 10/17/2019, 1253.07, 980510, 1250.93, 1263.325, 1249.94 10/16/2019, 1243.64, 1168174, 1241.17, 1254.74, 1238.45 10/15/2019, 1243.01, 1395259, 1220.4, 1247.33, 1220.4 10/14/2019, 1217.14, 882039, 1212.34, 1226.33, 1211.76 10/11/2019, 1215.45, 1277144, 1222.21, 1228.39, 1213.74 10/10/2019, 1208.67, 932531, 1198.58, 1215, 1197.34 10/09/2019, 1202.31, 876632, 1199.35, 1208.35, 1197.63 10/08/2019, 1189.13, 1141784, 1197.59, 1206.08, 1189.01 10/07/2019, 1207.68, 867149, 1204.4, 1218.2036, 1203.75 10/04/2019, 1209, 1183264, 1191.89, 1211.44, 1189.17 10/03/2019, 1187.83, 1663656, 1180, 1189.06, 1162.43 10/02/2019, 1176.63, 1639237, 1196.98, 1196.99, 1171.29 10/01/2019, 1205.1, 1358279, 1219, 1231.23, 1203.58 09/30/2019, 1219, 1419676, 1220.97, 1226, 1212.3 09/27/2019, 1225.09, 1354432, 1243.01, 1244.02, 1214.45 09/26/2019, 1241.39, 1561882, 1241.96, 1245, 1232.268 09/25/2019, 1246.52, 1593875, 1215.82, 1248.3, 1210.09 09/24/2019, 1218.76, 1591786, 1240, 1246.74, 1210.68 09/23/2019, 1234.03, 1075253, 1226, 1239.09, 1224.17 09/20/2019, 1229.93, 2337269, 1233.12, 1243.32, 1223.08 09/19/2019, 1238.71, 1000155, 1232.06, 1244.44, 1232.02 09/18/2019, 1232.41, 1144333, 1227.51, 1235.61, 1216.53 09/17/2019, 1229.15, 958112, 1230.4, 1235, 1223.69 09/16/2019, 1231.3, 1053299, 1229.52, 1239.56, 1225.61 09/13/2019, 1239.56, 1301350, 1231.35, 1240.88, 1227.01 09/12/2019, 1234.25, 1725908, 1224.3, 1241.86, 1223.02 09/11/2019, 1220.17, 1307033, 1203.41, 1222.6, 1202.2 09/10/2019, 1206, 1260115, 1195.15, 1210, 1194.58 09/09/2019, 1204.41, 1471880, 1204, 1220, 1192.62 09/06/2019, 1204.93, 1072143, 1208.13, 1212.015, 1202.5222 09/05/2019, 1211.38, 1408601, 1191.53, 1213.04, 1191.53 09/04/2019, 1181.41, 1068968, 1176.71, 1183.48, 1171 09/03/2019, 1168.39, 1480420, 1177.03, 1186.89, 1163.2 08/30/2019, 1188.1, 1129959, 1198.5, 1198.5, 1183.8026 08/29/2019, 1192.85, 1088858, 1181.12, 1196.06, 1181.12 08/28/2019, 1171.02, 802243, 1161.71, 1176.4199, 1157.3 08/27/2019, 1167.84, 1077452, 1180.53, 1182.4, 1161.45 08/26/2019, 1168.89, 1226441, 1157.26, 1169.47, 1152.96 08/23/2019, 1151.29, 1688271, 1181.99, 1194.08, 1147.75 08/22/2019, 1189.53, 947906, 1194.07, 1198.0115, 1178.58 08/21/2019, 1191.25, 741053, 1193.15, 1199, 1187.43 08/20/2019, 1182.69, 915605, 1195.25, 1196.06, 1182.11 08/19/2019, 1198.45, 1232517, 1190.09, 1206.99, 1190.09 08/16/2019, 1177.6, 1349436, 1179.55, 1182.72, 1171.81 08/15/2019, 1167.26, 1224739, 1163.5, 1175.84, 1162.11 08/14/2019, 1164.29, 1578668, 1176.31, 1182.3, 1160.54 08/13/2019, 1197.27, 1318009, 1171.46, 1204.78, 1171.46 08/12/2019, 1174.71, 1003187, 1179.21, 1184.96, 1167.6723 08/09/2019, 1188.01, 1065658, 1197.99, 1203.88, 1183.603 08/08/2019, 1204.8, 1467997, 1182.83, 1205.01, 1173.02 08/07/2019, 1173.99, 1444324, 1156, 1178.4451, 1149.6239 08/06/2019, 1169.95, 1709374, 1163.31, 1179.96, 1160 08/05/2019, 1152.32, 2597455, 1170.04, 1175.24, 1140.14 08/02/2019, 1193.99, 1645067, 1200.74, 1206.9, 1188.94 08/01/2019, 1209.01, 1698510, 1214.03, 1234.11, 1205.72 07/31/2019, 1216.68, 1725454, 1223, 1234, 1207.7635 07/30/2019, 1225.14, 1453263, 1225.41, 1234.87, 1223.3 07/29/2019, 1239.41, 2223731, 1241.05, 1247.37, 1228.23 07/26/2019, 1250.41, 4805752, 1224.04, 1265.5499, 1224 07/25/2019, 1132.12, 2209823, 1137.82, 1141.7, 1120.92 07/24/2019, 1137.81, 1590101, 1131.9, 1144, 1126.99 07/23/2019, 1146.21, 1093688, 1144, 1146.9, 1131.8 07/22/2019, 1138.07, 1301846, 1133.45, 1139.25, 1124.24 07/19/2019, 1130.1, 1647245, 1148.19, 1151.14, 1129.62 07/18/2019, 1146.33, 1291281, 1141.74, 1147.605, 1132.73 07/17/2019, 1146.35, 1170047, 1150.97, 1158.36, 1145.77 07/16/2019, 1153.58, 1238807, 1146, 1158.58, 1145 07/15/2019, 1150.34, 903780, 1146.86, 1150.82, 1139.4 07/12/2019, 1144.9, 863973, 1143.99, 1147.34, 1138.78 07/11/2019, 1144.21, 1195569, 1143.25, 1153.07, 1139.58 07/10/2019, 1140.48, 1209466, 1131.22, 1142.05, 1130.97 07/09/2019, 1124.83, 1330370, 1111.8, 1128.025, 1107.17 07/08/2019, 1116.35, 1236419, 1125.17, 1125.98, 1111.21 07/05/2019, 1131.59, 1264540, 1117.8, 1132.88, 1116.14 07/03/2019, 1121.58, 767011, 1117.41, 1126.76, 1113.86 07/02/2019, 1111.25, 991755, 1102.24, 1111.77, 1098.17 07/01/2019, 1097.95, 1438504, 1098, 1107.58, 1093.703 06/28/2019, 1080.91, 1693450, 1076.39, 1081, 1073.37 06/27/2019, 1076.01, 1004477, 1084, 1087.1, 1075.29 06/26/2019, 1079.8, 1810869, 1086.5, 1092.97, 1072.24 06/25/2019, 1086.35, 1546913, 1112.66, 1114.35, 1083.8 06/24/2019, 1115.52, 1395696, 1119.61, 1122, 1111.01 06/21/2019, 1121.88, 1947591, 1109.24, 1124.11, 1108.08 06/20/2019, 1111.42, 1262011, 1119.99, 1120.12, 1104.74 06/19/2019, 1102.33, 1339218, 1105.6, 1107, 1093.48 06/18/2019, 1103.6, 1386684, 1109.69, 1116.39, 1098.99 06/17/2019, 1092.5, 941602, 1086.28, 1099.18, 1086.28 06/14/2019, 1085.35, 1111643, 1086.42, 1092.69, 1080.1721 06/13/2019, 1088.77, 1058000, 1083.64, 1094.17, 1080.15 06/12/2019, 1077.03, 1061255, 1078, 1080.93, 1067.54 06/11/2019, 1078.72, 1437063, 1093.98, 1101.99, 1077.6025 06/10/2019, 1080.38, 1464248, 1072.98, 1092.66, 1072.3216 06/07/2019, 1066.04, 1802370, 1050.63, 1070.92, 1048.4 06/06/2019, 1044.34, 1703244, 1044.99, 1047.49, 1033.7 06/05/2019, 1042.22, 2168439, 1051.54, 1053.55, 1030.49 06/04/2019, 1053.05, 2833483, 1042.9, 1056.05, 1033.69 06/03/2019, 1036.23, 5130576, 1065.5, 1065.5, 1025 05/31/2019, 1103.63, 1508203, 1101.29, 1109.6, 1100.18 05/30/2019, 1117.95, 951873, 1115.54, 1123.13, 1112.12 05/29/2019, 1116.46, 1538212, 1127.52, 1129.1, 1108.2201 05/28/2019, 1134.15, 1365166, 1134, 1151.5871, 1133.12 05/24/2019, 1133.47, 1112341, 1147.36, 1149.765, 1131.66 05/23/2019, 1140.77, 1199300, 1140.5, 1145.9725, 1129.224 05/22/2019, 1151.42, 914839, 1146.75, 1158.52, 1145.89 05/21/2019, 1149.63, 1160158, 1148.49, 1152.7077, 1137.94 05/20/2019, 1138.85, 1353292, 1144.5, 1146.7967, 1131.4425 05/17/2019, 1162.3, 1208623, 1168.47, 1180.15, 1160.01 05/16/2019, 1178.98, 1531404, 1164.51, 1188.16, 1162.84 05/15/2019, 1164.21, 2289302, 1117.87, 1171.33, 1116.6657 05/14/2019, 1120.44, 1836604, 1137.21, 1140.42, 1119.55 05/13/2019, 1132.03, 1860648, 1141.96, 1147.94, 1122.11 05/10/2019, 1164.27, 1314546, 1163.59, 1172.6, 1142.5 05/09/2019, 1162.38, 1185973, 1159.03, 1169.66, 1150.85 05/08/2019, 1166.27, 1309514, 1172.01, 1180.4243, 1165.74 05/07/2019, 1174.1, 1551368, 1180.47, 1190.44, 1161.04 05/06/2019, 1189.39, 1563943, 1166.26, 1190.85, 1166.26 05/03/2019, 1185.4, 1980653, 1173.65, 1186.8, 1169 05/02/2019, 1162.61, 1944817, 1167.76, 1174.1895, 1155.0018 05/01/2019, 1168.08, 2642983, 1188.05, 1188.05, 1167.18 04/30/2019, 1188.48, 6194691, 1185, 1192.81, 1175 04/29/2019, 1287.58, 2412788, 1274, 1289.27, 1266.2949 04/26/2019, 1272.18, 1228276, 1269, 1273.07, 1260.32 04/25/2019, 1263.45, 1099614, 1264.77, 1267.4083, 1252.03 04/24/2019, 1256, 1015006, 1264.12, 1268.01, 1255 04/23/2019, 1264.55, 1271195, 1250.69, 1269, 1246.38 04/22/2019, 1248.84, 806577, 1235.99, 1249.09, 1228.31 04/18/2019, 1236.37, 1315676, 1239.18, 1242, 1234.61 04/17/2019, 1236.34, 1211866, 1233, 1240.56, 1227.82 04/16/2019, 1227.13, 855258, 1225, 1230.82, 1220.12 04/15/2019, 1221.1, 1187353, 1218, 1224.2, 1209.1101 04/12/2019, 1217.87, 926799, 1210, 1218.35, 1208.11 04/11/2019, 1204.62, 709417, 1203.96, 1207.96, 1200.13 04/10/2019, 1202.16, 724524, 1200.68, 1203.785, 1196.435 04/09/2019, 1197.25, 865416, 1196, 1202.29, 1193.08 04/08/2019, 1203.84, 859969, 1207.89, 1208.69, 1199.86 04/05/2019, 1207.15, 900950, 1214.99, 1216.22, 1205.03 04/04/2019, 1215, 949962, 1205.94, 1215.67, 1204.13 04/03/2019, 1205.92, 1014195, 1207.48, 1216.3, 1200.5 04/02/2019, 1200.49, 800820, 1195.32, 1201.35, 1185.71 04/01/2019, 1194.43, 1188235, 1184.1, 1196.66, 1182 03/29/2019, 1173.31, 1269573, 1174.9, 1178.99, 1162.88 03/28/2019, 1168.49, 966843, 1171.54, 1171.565, 1159.4312 03/27/2019, 1173.02, 1362217, 1185.5, 1187.559, 1159.37 03/26/2019, 1184.62, 1894639, 1198.53, 1202.83, 1176.72 03/25/2019, 1193, 1493841, 1196.93, 1206.3975, 1187.04 03/22/2019, 1205.5, 1668910, 1226.32, 1230, 1202.825 03/21/2019, 1231.54, 1195899, 1216, 1231.79, 1213.15 03/20/2019, 1223.97, 2089367, 1197.35, 1227.14, 1196.17 03/19/2019, 1198.85, 1404863, 1188.81, 1200, 1185.87 03/18/2019, 1184.26, 1212506, 1183.3, 1190, 1177.4211 03/15/2019, 1184.46, 2457597, 1193.38, 1196.57, 1182.61 03/14/2019, 1185.55, 1150950, 1194.51, 1197.88, 1184.48 03/13/2019, 1193.32, 1434816, 1200.645, 1200.93, 1191.94 03/12/2019, 1193.2, 2012306, 1178.26, 1200, 1178.26 03/11/2019, 1175.76, 1569332, 1144.45, 1176.19, 1144.45 03/08/2019, 1142.32, 1212271, 1126.73, 1147.08, 1123.3 03/07/2019, 1143.3, 1166076, 1155.72, 1156.755, 1134.91 03/06/2019, 1157.86, 1094100, 1162.49, 1167.5658, 1155.49 03/05/2019, 1162.03, 1422357, 1150.06, 1169.61, 1146.195 03/04/2019, 1147.8, 1444774, 1146.99, 1158.2804, 1130.69 03/01/2019, 1140.99, 1447454, 1124.9, 1142.97, 1124.75 02/28/2019, 1119.92, 1541068, 1111.3, 1127.65, 1111.01 02/27/2019, 1116.05, 968362, 1106.95, 1117.98, 1101 02/26/2019, 1115.13, 1469761, 1105.75, 1119.51, 1099.92 02/25/2019, 1109.4, 1395281, 1116, 1118.54, 1107.27 02/22/2019, 1110.37, 1048361, 1100.9, 1111.24, 1095.6 02/21/2019, 1096.97, 1414744, 1110.84, 1111.94, 1092.52 02/20/2019, 1113.8, 1080144, 1119.99, 1123.41, 1105.28 02/19/2019, 1118.56, 1046315, 1110, 1121.89, 1110 02/15/2019, 1113.65, 1442461, 1130.08, 1131.67, 1110.65 02/14/2019, 1121.67, 941678, 1118.05, 1128.23, 1110.445 02/13/2019, 1120.16, 1048630, 1124.99, 1134.73, 1118.5 02/12/2019, 1121.37, 1608658, 1106.8, 1125.295, 1105.85 02/11/2019, 1095.01, 1063825, 1096.95, 1105.945, 1092.86 02/08/2019, 1095.06, 1072031, 1087, 1098.91, 1086.55 02/07/2019, 1098.71, 2040615, 1104.16, 1104.84, 1086 02/06/2019, 1115.23, 2101674, 1139.57, 1147, 1112.77 02/05/2019, 1145.99, 3529974, 1124.84, 1146.85, 1117.248 02/04/2019, 1132.8, 2518184, 1112.66, 1132.8, 1109.02 02/01/2019, 1110.75, 1455609, 1112.4, 1125, 1104.89 01/31/2019, 1116.37, 1531463, 1103, 1117.33, 1095.41 01/30/2019, 1089.06, 1241760, 1068.43, 1091, 1066.85 01/29/2019, 1060.62, 1006731, 1072.68, 1075.15, 1055.8647 01/28/2019, 1070.08, 1277745, 1080.11, 1083, 1063.8 01/25/2019, 1090.99, 1114785, 1085, 1094, 1081.82 01/24/2019, 1073.9, 1317718, 1076.48, 1079.475, 1060.7 01/23/2019, 1075.57, 956526, 1077.35, 1084.93, 1059.75 01/22/2019, 1070.52, 1607398, 1088, 1091.51, 1063.47 01/18/2019, 1098.26, 1933754, 1100, 1108.352, 1090.9 01/17/2019, 1089.9, 1223674, 1079.47, 1091.8, 1073.5 01/16/2019, 1080.97, 1320530, 1080, 1092.375, 1079.34 01/15/2019, 1077.15, 1452238, 1050.17, 1080.05, 1047.34 01/14/2019, 1044.69, 1127417, 1046.92, 1051.53, 1041.255 01/11/2019, 1057.19, 1512651, 1063.18, 1063.775, 1048.48 01/10/2019, 1070.33, 1444976, 1067.66, 1071.15, 1057.71 01/09/2019, 1074.66, 1198369, 1081.65, 1082.63, 1066.4 01/08/2019, 1076.28, 1748371, 1076.11, 1084.56, 1060.53 01/07/2019, 1068.39, 1978077, 1071.5, 1073.9999, 1054.76 01/04/2019, 1070.71, 2080144, 1032.59, 1070.84, 1027.4179 01/03/2019, 1016.06, 1829379, 1041, 1056.98, 1014.07 01/02/2019, 1045.85, 1516681, 1016.57, 1052.32, 1015.71 12/31/2018, 1035.61, 1492541, 1050.96, 1052.7, 1023.59 12/28/2018, 1037.08, 1399218, 1049.62, 1055.56, 1033.1 12/27/2018, 1043.88, 2102069, 1017.15, 1043.89, 997 12/26/2018, 1039.46, 2337212, 989.01, 1040, 983 12/24/2018, 976.22, 1590328, 973.9, 1003.54, 970.11 12/21/2018, 979.54, 4560424, 1015.3, 1024.02, 973.69 12/20/2018, 1009.41, 2659047, 1018.13, 1034.22, 996.36 12/19/2018, 1023.01, 2419322, 1033.99, 1062, 1008.05 12/18/2018, 1028.71, 2101854, 1026.09, 1049.48, 1021.44 12/17/2018, 1016.53, 2337631, 1037.51, 1053.15, 1007.9 12/14/2018, 1042.1, 1685802, 1049.98, 1062.6, 1040.79 12/13/2018, 1061.9, 1329198, 1068.07, 1079.7597, 1053.93 12/12/2018, 1063.68, 1523276, 1068, 1081.65, 1062.79 12/11/2018, 1051.75, 1354751, 1056.49, 1060.6, 1039.84 12/10/2018, 1039.55, 1793465, 1035.05, 1048.45, 1023.29 12/07/2018, 1036.58, 2098526, 1060.01, 1075.26, 1028.5 12/06/2018, 1068.73, 2758098, 1034.26, 1071.2, 1030.7701 12/04/2018, 1050.82, 2278200, 1103.12, 1104.42, 1049.98 12/03/2018, 1106.43, 1900355, 1123.14, 1124.65, 1103.6645 11/30/2018, 1094.43, 2554416, 1089.07, 1095.57, 1077.88 11/29/2018, 1088.3, 1403540, 1076.08, 1094.245, 1076 11/28/2018, 1086.23, 2399374, 1048.76, 1086.84, 1035.76 11/27/2018, 1044.41, 1801334, 1041, 1057.58, 1038.49 11/26/2018, 1048.62, 1846430, 1038.35, 1049.31, 1033.91 11/23/2018, 1023.88, 691462, 1030, 1037.59, 1022.3992 11/21/2018, 1037.61, 1531676, 1036.76, 1048.56, 1033.47 11/20/2018, 1025.76, 2447254, 1000, 1031.74, 996.02 11/19/2018, 1020, 1837207, 1057.2, 1060.79, 1016.2601 11/16/2018, 1061.49, 1641232, 1059.41, 1067, 1048.98 11/15/2018, 1064.71, 1819132, 1044.71, 1071.85, 1031.78 11/14/2018, 1043.66, 1561656, 1050, 1054.5643, 1031 11/13/2018, 1036.05, 1496534, 1043.29, 1056.605, 1031.15 11/12/2018, 1038.63, 1429319, 1061.39, 1062.12, 1031 11/09/2018, 1066.15, 1343154, 1073.99, 1075.56, 1053.11 11/08/2018, 1082.4, 1463022, 1091.38, 1093.27, 1072.2048 11/07/2018, 1093.39, 2057155, 1069, 1095.46, 1065.9 11/06/2018, 1055.81, 1225197, 1039.48, 1064.345, 1038.07 11/05/2018, 1040.09, 2436742, 1055, 1058.47, 1021.24 11/02/2018, 1057.79, 1829295, 1073.73, 1082.975, 1054.61 11/01/2018, 1070, 1456222, 1075.8, 1083.975, 1062.46 10/31/2018, 1076.77, 2528584, 1059.81, 1091.94, 1057 10/30/2018, 1036.21, 3209126, 1008.46, 1037.49, 1000.75 10/29/2018, 1020.08, 3873644, 1082.47, 1097.04, 995.83 10/26/2018, 1071.47, 4185201, 1037.03, 1106.53, 1034.09 10/25/2018, 1095.57, 2511884, 1071.79, 1110.98, 1069.55 10/24/2018, 1050.71, 1910060, 1104.25, 1106.12, 1048.74 10/23/2018, 1103.69, 1847798, 1080.89, 1107.89, 1070 10/22/2018, 1101.16, 1494285, 1103.06, 1112.23, 1091 10/19/2018, 1096.46, 1264605, 1093.37, 1110.36, 1087.75 10/18/2018, 1087.97, 2056606, 1121.84, 1121.84, 1077.09 10/17/2018, 1115.69, 1397613, 1126.46, 1128.99, 1102.19 10/16/2018, 1121.28, 1845491, 1104.59, 1124.22, 1102.5 10/15/2018, 1092.25, 1343231, 1108.91, 1113.4464, 1089 10/12/2018, 1110.08, 2029872, 1108, 1115, 1086.402 10/11/2018, 1079.32, 2939514, 1072.94, 1106.4, 1068.27 10/10/2018, 1081.22, 2574985, 1131.08, 1132.17, 1081.13 10/09/2018, 1138.82, 1308706, 1146.15, 1154.35, 1137.572 10/08/2018, 1148.97, 1877142, 1150.11, 1168, 1127.3636 10/05/2018, 1157.35, 1184245, 1167.5, 1173.4999, 1145.12 10/04/2018, 1168.19, 2151762, 1195.33, 1197.51, 1155.576 10/03/2018, 1202.95, 1207280, 1205, 1206.41, 1193.83 10/02/2018, 1200.11, 1655602, 1190.96, 1209.96, 1186.63 10/01/2018, 1195.31, 1345250, 1199.89, 1209.9, 1190.3 09/28/2018, 1193.47, 1306822, 1191.87, 1195.41, 1184.5 09/27/2018, 1194.64, 1244278, 1186.73, 1202.1, 1183.63 09/26/2018, 1180.49, 1346434, 1185.15, 1194.23, 1174.765 09/25/2018, 1184.65, 937577, 1176.15, 1186.88, 1168 09/24/2018, 1173.37, 1218532, 1157.17, 1178, 1146.91 09/21/2018, 1166.09, 4363929, 1192, 1192.21, 1166.04 09/20/2018, 1186.87, 1209855, 1179.99, 1189.89, 1173.36 09/19/2018, 1171.09, 1185321, 1164.98, 1173.21, 1154.58 09/18/2018, 1161.22, 1184407, 1157.09, 1176.08, 1157.09 09/17/2018, 1156.05, 1279147, 1170.14, 1177.24, 1154.03 09/14/2018, 1172.53, 934300, 1179.1, 1180.425, 1168.3295 09/13/2018, 1175.33, 1402005, 1170.74, 1178.61, 1162.85 09/12/2018, 1162.82, 1291304, 1172.72, 1178.61, 1158.36 09/11/2018, 1177.36, 1209171, 1161.63, 1178.68, 1156.24 09/10/2018, 1164.64, 1115259, 1172.19, 1174.54, 1160.11 09/07/2018, 1164.83, 1401034, 1158.67, 1175.26, 1157.215 09/06/2018, 1171.44, 1886690, 1186.3, 1186.3, 1152 09/05/2018, 1186.48, 2043732, 1193.8, 1199.0096, 1162 09/04/2018, 1197, 1800509, 1204.27, 1212.99, 1192.5 08/31/2018, 1218.19, 1812366, 1234.98, 1238.66, 1211.2854 08/30/2018, 1239.12, 1320261, 1244.23, 1253.635, 1232.59 08/29/2018, 1249.3, 1295939, 1237.45, 1250.66, 1236.3588 08/28/2018, 1231.15, 1296532, 1241.29, 1242.545, 1228.69 08/27/2018, 1241.82, 1154962, 1227.6, 1243.09, 1225.716 08/24/2018, 1220.65, 946529, 1208.82, 1221.65, 1206.3588 08/23/2018, 1205.38, 988509, 1207.14, 1221.28, 1204.24 08/22/2018, 1207.33, 881463, 1200, 1211.84, 1199 08/21/2018, 1201.62, 1187884, 1208, 1217.26, 1200.3537 08/20/2018, 1207.77, 864462, 1205.02, 1211, 1194.6264 08/17/2018, 1200.96, 1381724, 1202.03, 1209.02, 1188.24 08/16/2018, 1206.49, 1319985, 1224.73, 1225.9999, 1202.55 08/15/2018, 1214.38, 1815642, 1229.26, 1235.24, 1209.51 08/14/2018, 1242.1, 1342534, 1235.19, 1245.8695, 1225.11 08/13/2018, 1235.01, 957153, 1236.98, 1249.2728, 1233.6405 08/10/2018, 1237.61, 1107323, 1243, 1245.695, 1232 08/09/2018, 1249.1, 805227, 1249.9, 1255.542, 1246.01 08/08/2018, 1245.61, 1369650, 1240.47, 1256.5, 1238.0083 08/07/2018, 1242.22, 1493073, 1237, 1251.17, 1236.17 08/06/2018, 1224.77, 1080923, 1225, 1226.0876, 1215.7965 08/03/2018, 1223.71, 1072524, 1229.62, 1230, 1215.06 08/02/2018, 1226.15, 1520488, 1205.9, 1229.88, 1204.79 08/01/2018, 1220.01, 1567142, 1228, 1233.47, 1210.21 07/31/2018, 1217.26, 1632823, 1220.01, 1227.5877, 1205.6 07/30/2018, 1219.74, 1822782, 1228.01, 1234.916, 1211.47 07/27/2018, 1238.5, 2115802, 1271, 1273.89, 1231 07/26/2018, 1268.33, 2334881, 1251, 1269.7707, 1249.02 07/25/2018, 1263.7, 2115890, 1239.13, 1265.86, 1239.13 07/24/2018, 1248.08, 3303268, 1262.59, 1266, 1235.56 07/23/2018, 1205.5, 2584034, 1181.01, 1206.49, 1181 07/20/2018, 1184.91, 1246898, 1186.96, 1196.86, 1184.22 07/19/2018, 1186.96, 1256113, 1191, 1200, 1183.32 07/18/2018, 1195.88, 1391232, 1196.56, 1204.5, 1190.34 07/17/2018, 1198.8, 1585091, 1172.22, 1203.04, 1170.6 07/16/2018, 1183.86, 1049560, 1189.39, 1191, 1179.28 07/13/2018, 1188.82, 1221687, 1185, 1195.4173, 1180 07/12/2018, 1183.48, 1251083, 1159.89, 1184.41, 1155.935 07/11/2018, 1153.9, 1094301, 1144.59, 1164.29, 1141.0003 07/10/2018, 1152.84, 789249, 1156.98, 1159.59, 1149.59 07/09/2018, 1154.05, 906073, 1148.48, 1154.67, 1143.42 07/06/2018, 1140.17, 966155, 1123.58, 1140.93, 1120.7371 07/05/2018, 1124.27, 1060752, 1110.53, 1127.5, 1108.48 07/03/2018, 1102.89, 679034, 1135.82, 1135.82, 1100.02 07/02/2018, 1127.46, 1188616, 1099, 1128, 1093.8 06/29/2018, 1115.65, 1275979, 1120, 1128.2265, 1115 06/28/2018, 1114.22, 1072438, 1102.09, 1122.31, 1096.01 06/27/2018, 1103.98, 1287698, 1121.34, 1131.8362, 1103.62 06/26/2018, 1118.46, 1559791, 1128, 1133.21, 1116.6589 06/25/2018, 1124.81, 2155276, 1143.6, 1143.91, 1112.78 06/22/2018, 1155.48, 1310164, 1159.14, 1162.4965, 1147.26 06/21/2018, 1157.66, 1232352, 1174.85, 1177.295, 1152.232 06/20/2018, 1169.84, 1648248, 1175.31, 1186.2856, 1169.16 06/19/2018, 1168.06, 1616125, 1158.5, 1171.27, 1154.01 06/18/2018, 1173.46, 1400641, 1143.65, 1174.31, 1143.59 06/15/2018, 1152.26, 2119134, 1148.86, 1153.42, 1143.485 06/14/2018, 1152.12, 1350085, 1143.85, 1155.47, 1140.64 06/13/2018, 1134.79, 1490017, 1141.12, 1146.5, 1133.38 06/12/2018, 1139.32, 899231, 1131.07, 1139.79, 1130.735 06/11/2018, 1129.99, 1071114, 1118.6, 1137.26, 1118.6 06/08/2018, 1120.87, 1289859, 1118.18, 1126.67, 1112.15 06/07/2018, 1123.86, 1519860, 1131.32, 1135.82, 1116.52 06/06/2018, 1136.88, 1697489, 1142.17, 1143, 1125.7429 06/05/2018, 1139.66, 1538169, 1140.99, 1145.738, 1133.19 06/04/2018, 1139.29, 1881046, 1122.33, 1141.89, 1122.005 06/01/2018, 1119.5, 2416755, 1099.35, 1120, 1098.5 05/31/2018, 1084.99, 3085325, 1067.56, 1097.19, 1067.56 05/30/2018, 1067.8, 1129958, 1063.03, 1069.21, 1056.83 05/29/2018, 1060.32, 1858676, 1064.89, 1073.37, 1055.22 05/25/2018, 1075.66, 878903, 1079.02, 1082.56, 1073.775 05/24/2018, 1079.24, 757752, 1079, 1080.47, 1066.15 05/23/2018, 1079.69, 1057712, 1065.13, 1080.78, 1061.71 05/22/2018, 1069.73, 1088700, 1083.56, 1086.59, 1066.69 05/21/2018, 1079.58, 1012258, 1074.06, 1088, 1073.65 05/18/2018, 1066.36, 1496448, 1061.86, 1069.94, 1060.68 05/17/2018, 1078.59, 1031190, 1079.89, 1086.87, 1073.5 05/16/2018, 1081.77, 989819, 1077.31, 1089.27, 1076.26 05/15/2018, 1079.23, 1494306, 1090, 1090.05, 1073.47 05/14/2018, 1100.2, 1450140, 1100, 1110.75, 1099.11 05/11/2018, 1098.26, 1253205, 1093.6, 1101.3295, 1090.91 05/10/2018, 1097.57, 1441456, 1086.03, 1100.44, 1085.64 05/09/2018, 1082.76, 2032319, 1058.1, 1085.44, 1056.365 05/08/2018, 1053.91, 1217260, 1058.54, 1060.55, 1047.145 05/07/2018, 1054.79, 1464008, 1049.23, 1061.68, 1047.1 05/04/2018, 1048.21, 1936797, 1016.9, 1048.51, 1016.9 05/03/2018, 1023.72, 1813623, 1019, 1029.675, 1006.29 05/02/2018, 1024.38, 1534094, 1028.1, 1040.389, 1022.87 05/01/2018, 1037.31, 1427171, 1013.66, 1038.47, 1008.21 04/30/2018, 1017.33, 1664084, 1030.01, 1037, 1016.85 04/27/2018, 1030.05, 1617452, 1046, 1049.5, 1025.59 04/26/2018, 1040.04, 1984448, 1029.51, 1047.98, 1018.19 04/25/2018, 1021.18, 2225495, 1025.52, 1032.49, 1015.31 04/24/2018, 1019.98, 4750851, 1052, 1057, 1010.59 04/23/2018, 1067.45, 2278846, 1077.86, 1082.72, 1060.7 04/20/2018, 1072.96, 1887698, 1082, 1092.35, 1069.57 04/19/2018, 1087.7, 1741907, 1069.4, 1094.165, 1068.18 04/18/2018, 1072.08, 1336678, 1077.43, 1077.43, 1066.225 04/17/2018, 1074.16, 2311903, 1051.37, 1077.88, 1048.26 04/16/2018, 1037.98, 1194144, 1037, 1043.24, 1026.74 04/13/2018, 1029.27, 1175754, 1040.88, 1046.42, 1022.98 04/12/2018, 1032.51, 1357599, 1025.04, 1040.69, 1021.4347 04/11/2018, 1019.97, 1476133, 1027.99, 1031.3641, 1015.87 04/10/2018, 1031.64, 1983510, 1026.44, 1036.28, 1011.34 04/09/2018, 1015.45, 1738682, 1016.8, 1039.6, 1014.08 04/06/2018, 1007.04, 1740896, 1020, 1031.42, 1003.03 04/05/2018, 1027.81, 1345681, 1041.33, 1042.79, 1020.1311 04/04/2018, 1025.14, 2464418, 993.41, 1028.7175, 993 04/03/2018, 1013.41, 2271858, 1013.91, 1020.99, 994.07 04/02/2018, 1006.47, 2679214, 1022.82, 1034.8, 990.37 03/29/2018, 1031.79, 2714402, 1011.63, 1043, 1002.9 03/28/2018, 1004.56, 3345046, 998, 1024.23, 980.64 03/27/2018, 1005.1, 3081612, 1063, 1064.8393, 996.92 03/26/2018, 1053.21, 2593808, 1046, 1055.63, 1008.4 03/23/2018, 1021.57, 2147097, 1047.03, 1063.36, 1021.22 03/22/2018, 1049.08, 2584639, 1081.88, 1082.9, 1045.91 03/21/2018, 1090.88, 1878294, 1092.74, 1106.2999, 1085.15 03/20/2018, 1097.71, 1802209, 1099, 1105.2, 1083.46 03/19/2018, 1099.82, 2355186, 1120.01, 1121.99, 1089.01 03/16/2018, 1135.73, 2614871, 1154.14, 1155.88, 1131.96 03/15/2018, 1149.58, 1397767, 1149.96, 1161.08, 1134.54 03/14/2018, 1149.49, 1290638, 1145.21, 1158.59, 1141.44 03/13/2018, 1138.17, 1874176, 1170, 1176.76, 1133.33 03/12/2018, 1164.5, 2106548, 1163.85, 1177.05, 1157.42 03/09/2018, 1160.04, 2121425, 1136, 1160.8, 1132.4606 03/08/2018, 1126, 1393529, 1115.32, 1127.6, 1112.8 03/07/2018, 1109.64, 1277439, 1089.19, 1112.22, 1085.4823 03/06/2018, 1095.06, 1497087, 1099.22, 1101.85, 1089.775 03/05/2018, 1090.93, 1141932, 1075.14, 1097.1, 1069.0001 03/02/2018, 1078.92, 2271394, 1053.08, 1081.9986, 1048.115 03/01/2018, 1069.52, 2511872, 1107.87, 1110.12, 1067.001 02/28/2018, 1104.73, 1873737, 1123.03, 1127.53, 1103.24 02/27/2018, 1118.29, 1772866, 1141.24, 1144.04, 1118 02/26/2018, 1143.75, 1514920, 1127.8, 1143.96, 1126.695 02/23/2018, 1126.79, 1190432, 1112.64, 1127.28, 1104.7135 02/22/2018, 1106.63, 1309536, 1116.19, 1122.82, 1102.59 02/21/2018, 1111.34, 1507152, 1106.47, 1133.97, 1106.33 02/20/2018, 1102.46, 1389491, 1090.57, 1113.95, 1088.52 02/16/2018, 1094.8, 1680283, 1088.41, 1104.67, 1088.3134 02/15/2018, 1089.52, 1785552, 1079.07, 1091.4794, 1064.34 02/14/2018, 1069.7, 1547665, 1048.95, 1071.72, 1046.75 02/13/2018, 1052.1, 1213800, 1045, 1058.37, 1044.0872 02/12/2018, 1051.94, 2054002, 1048, 1061.5, 1040.928 02/09/2018, 1037.78, 3503970, 1017.25, 1043.97, 992.56 02/08/2018, 1001.52, 2809890, 1055.41, 1058.62, 1000.66 02/07/2018, 1048.58, 2353003, 1081.54, 1081.78, 1048.26 02/06/2018, 1080.6, 3432313, 1027.18, 1081.71, 1023.1367 02/05/2018, 1055.8, 3769453, 1090.6, 1110, 1052.03 02/02/2018, 1111.9, 4837979, 1122, 1123.07, 1107.2779 02/01/2018, 1167.7, 2380221, 1162.61, 1174, 1157.52 01/31/2018, 1169.94, 1523820, 1170.57, 1173, 1159.13 01/30/2018, 1163.69, 1541771, 1167.83, 1176.52, 1163.52 01/29/2018, 1175.58, 1337324, 1176.48, 1186.89, 1171.98 01/26/2018, 1175.84, 1981173, 1175.08, 1175.84, 1158.11 01/25/2018, 1170.37, 1461518, 1172.53, 1175.94, 1162.76 01/24/2018, 1164.24, 1382904, 1177.33, 1179.86, 1161.05 01/23/2018, 1169.97, 1309862, 1159.85, 1171.6266, 1158.75 01/22/2018, 1155.81, 1616120, 1137.49, 1159.88, 1135.1101 01/19/2018, 1137.51, 1390118, 1131.83, 1137.86, 1128.3 01/18/2018, 1129.79, 1194943, 1131.41, 1132.51, 1117.5 01/17/2018, 1131.98, 1200476, 1126.22, 1132.6, 1117.01 01/16/2018, 1121.76, 1566662, 1132.51, 1139.91, 1117.8316 01/12/2018, 1122.26, 1718491, 1102.41, 1124.29, 1101.15 01/11/2018, 1105.52, 977727, 1106.3, 1106.525, 1099.59 01/10/2018, 1102.61, 1042273, 1097.1, 1104.6, 1096.11 01/09/2018, 1106.26, 900089, 1109.4, 1110.57, 1101.2307 01/08/2018, 1106.94, 1046767, 1102.23, 1111.27, 1101.62 01/05/2018, 1102.23, 1279990, 1094, 1104.25, 1092 01/04/2018, 1086.4, 1002945, 1088, 1093.5699, 1084.0017 01/03/2018, 1082.48, 1429757, 1064.31, 1086.29, 1063.21 01/02/2018, 1065, 1236401, 1048.34, 1066.94, 1045.23 12/29/2017, 1046.4, 886845, 1046.72, 1049.7, 1044.9 12/28/2017, 1048.14, 833011, 1051.6, 1054.75, 1044.77 12/27/2017, 1049.37, 1271780, 1057.39, 1058.37, 1048.05 12/26/2017, 1056.74, 761097, 1058.07, 1060.12, 1050.2 12/22/2017, 1060.12, 755089, 1061.11, 1064.2, 1059.44 12/21/2017, 1063.63, 986548, 1064.95, 1069.33, 1061.7938 12/20/2017, 1064.95, 1268285, 1071.78, 1073.38, 1061.52 12/19/2017, 1070.68, 1307894, 1075.2, 1076.84, 1063.55 12/18/2017, 1077.14, 1552016, 1066.08, 1078.49, 1062 12/15/2017, 1064.19, 3275091, 1054.61, 1067.62, 1049.5 12/14/2017, 1049.15, 1558684, 1045, 1058.5, 1043.11 12/13/2017, 1040.61, 1220364, 1046.12, 1046.665, 1038.38 12/12/2017, 1040.48, 1279511, 1039.63, 1050.31, 1033.6897 12/11/2017, 1041.1, 1190527, 1035.5, 1043.8, 1032.0504 12/08/2017, 1037.05, 1288419, 1037.49, 1042.05, 1032.5222 12/07/2017, 1030.93, 1458145, 1020.43, 1034.24, 1018.071 12/06/2017, 1018.38, 1258496, 1001.5, 1024.97, 1001.14 12/05/2017, 1005.15, 2066247, 995.94, 1020.61, 988.28 12/04/2017, 998.68, 1906058, 1012.66, 1016.1, 995.57 12/01/2017, 1010.17, 1908962, 1015.8, 1022.4897, 1002.02 11/30/2017, 1021.41, 1723003, 1022.37, 1028.4899, 1015 11/29/2017, 1021.66, 2442974, 1042.68, 1044.08, 1015.65 11/28/2017, 1047.41, 1421027, 1055.09, 1062.375, 1040 11/27/2017, 1054.21, 1307471, 1040, 1055.46, 1038.44 11/24/2017, 1040.61, 536996, 1035.87, 1043.178, 1035 11/22/2017, 1035.96, 746351, 1035, 1039.706, 1031.43 11/21/2017, 1034.49, 1096161, 1023.31, 1035.11, 1022.655 11/20/2017, 1018.38, 898389, 1020.26, 1022.61, 1017.5 11/17/2017, 1019.09, 1366936, 1034.01, 1034.42, 1017.75 11/16/2017, 1032.5, 1129424, 1022.52, 1035.92, 1022.52 11/15/2017, 1020.91, 847932, 1019.21, 1024.09, 1015.42 11/14/2017, 1026, 958708, 1022.59, 1026.81, 1014.15 11/13/2017, 1025.75, 885565, 1023.42, 1031.58, 1022.57 11/10/2017, 1028.07, 720674, 1026.46, 1030.76, 1025.28 11/09/2017, 1031.26, 1244701, 1033.99, 1033.99, 1019.6656 11/08/2017, 1039.85, 1088395, 1030.52, 1043.522, 1028.45 11/07/2017, 1033.33, 1112123, 1027.27, 1033.97, 1025.13 11/06/2017, 1025.9, 1124757, 1028.99, 1034.87, 1025 11/03/2017, 1032.48, 1075134, 1022.11, 1032.65, 1020.31 11/02/2017, 1025.58, 1048584, 1021.76, 1028.09, 1013.01 11/01/2017, 1025.5, 1371619, 1017.21, 1029.67, 1016.95 10/31/2017, 1016.64, 1331265, 1015.22, 1024, 1010.42 10/30/2017, 1017.11, 2083490, 1014, 1024.97, 1007.5 10/27/2017, 1019.27, 5165922, 1009.19, 1048.39, 1008.2 10/26/2017, 972.56, 2027218, 980, 987.6, 972.2 10/25/2017, 973.33, 1210368, 968.37, 976.09, 960.5201 10/24/2017, 970.54, 1206074, 970, 972.23, 961 10/23/2017, 968.45, 1471544, 989.52, 989.52, 966.12 10/20/2017, 988.2, 1176177, 989.44, 991, 984.58 10/19/2017, 984.45, 1312706, 986, 988.88, 978.39 10/18/2017, 992.81, 1057285, 991.77, 996.72, 986.9747 10/17/2017, 992.18, 1290152, 990.29, 996.44, 988.59 10/16/2017, 992, 910246, 992.1, 993.9065, 984 10/13/2017, 989.68, 1169584, 992, 997.21, 989 10/12/2017, 987.83, 1278357, 987.45, 994.12, 985 10/11/2017, 989.25, 1692843, 973.72, 990.71, 972.25 10/10/2017, 972.6, 968113, 980, 981.57, 966.0801 10/09/2017, 977, 890620, 980, 985.425, 976.11 10/06/2017, 978.89, 1146207, 966.7, 979.46, 963.36 10/05/2017, 969.96, 1210427, 955.49, 970.91, 955.18 10/04/2017, 951.68, 951766, 957, 960.39, 950.69 10/03/2017, 957.79, 888303, 954, 958, 949.14 10/02/2017, 953.27, 1282850, 959.98, 962.54, 947.84 09/29/2017, 959.11, 1576365, 952, 959.7864, 951.51 09/28/2017, 949.5, 997036, 941.36, 950.69, 940.55 09/27/2017, 944.49, 2237538, 927.74, 949.9, 927.74 09/26/2017, 924.86, 1666749, 923.72, 930.82, 921.14 09/25/2017, 920.97, 1855742, 925.45, 926.4, 909.7 09/22/2017, 928.53, 1052170, 927.75, 934.73, 926.48 09/21/2017, 932.45, 1227059, 933, 936.53, 923.83 09/20/2017, 931.58, 1535626, 922.98, 933.88, 922 09/19/2017, 921.81, 912967, 917.42, 922.4199, 912.55 09/18/2017, 915, 1300759, 920.01, 922.08, 910.6 09/15/2017, 920.29, 2499466, 924.66, 926.49, 916.36 09/14/2017, 925.11, 1395497, 931.25, 932.77, 924 09/13/2017, 935.09, 1101145, 930.66, 937.25, 929.86 09/12/2017, 932.07, 1133638, 932.59, 933.48, 923.861 09/11/2017, 929.08, 1266020, 934.25, 938.38, 926.92 09/08/2017, 926.5, 997699, 936.49, 936.99, 924.88 09/07/2017, 935.95, 1211472, 931.73, 936.41, 923.62 09/06/2017, 927.81, 1526209, 930.15, 930.915, 919.27 09/05/2017, 928.45, 1346791, 933.08, 937, 921.96 09/01/2017, 937.34, 943657, 941.13, 942.48, 935.15 08/31/2017, 939.33, 1566888, 931.76, 941.98, 931.76 08/30/2017, 929.57, 1300616, 920.05, 930.819, 919.65 08/29/2017, 921.29, 1181391, 905.1, 923.33, 905 08/28/2017, 913.81, 1085014, 916, 919.245, 911.87 08/25/2017, 915.89, 1052764, 923.49, 925.555, 915.5 08/24/2017, 921.28, 1266191, 928.66, 930.84, 915.5 08/23/2017, 927, 1088575, 921.93, 929.93, 919.36 08/22/2017, 924.69, 1166320, 912.72, 925.86, 911.4751 08/21/2017, 906.66, 942328, 910, 913, 903.4 08/18/2017, 910.67, 1341990, 910.31, 915.275, 907.1543 08/17/2017, 910.98, 1241782, 925.78, 926.86, 910.98 08/16/2017, 926.96, 1005261, 925.29, 932.7, 923.445 08/15/2017, 922.22, 882479, 924.23, 926.5499, 919.82 08/14/2017, 922.67, 1063404, 922.53, 924.668, 918.19 08/11/2017, 914.39, 1205652, 907.97, 917.78, 905.58 08/10/2017, 907.24, 1755521, 917.55, 919.26, 906.13 08/09/2017, 922.9, 1191332, 920.61, 925.98, 917.2501 08/08/2017, 926.79, 1057351, 927.09, 935.814, 925.6095 08/07/2017, 929.36, 1031710, 929.06, 931.7, 926.5 08/04/2017, 927.96, 1081814, 926.75, 930.3068, 923.03 08/03/2017, 923.65, 1201519, 930.34, 932.24, 922.24 08/02/2017, 930.39, 1822272, 928.61, 932.6, 916.68 08/01/2017, 930.83, 1234612, 932.38, 937.447, 929.26 07/31/2017, 930.5, 1964748, 941.89, 943.59, 926.04 07/28/2017, 941.53, 1802343, 929.4, 943.83, 927.5 07/27/2017, 934.09, 3128819, 951.78, 951.78, 920 07/26/2017, 947.8, 2069349, 954.68, 955, 942.2788 07/25/2017, 950.7, 4656609, 953.81, 959.7, 945.4 07/24/2017, 980.34, 3205374, 972.22, 986.2, 970.77 07/21/2017, 972.92, 1697190, 962.25, 973.23, 960.15 07/20/2017, 968.15, 1620636, 975, 975.9, 961.51 07/19/2017, 970.89, 1221155, 967.84, 973.04, 964.03 07/18/2017, 965.4, 1152741, 953, 968.04, 950.6 07/17/2017, 953.42, 1164141, 957, 960.74, 949.2407 07/14/2017, 955.99, 1052855, 952, 956.91, 948.005 07/13/2017, 947.16, 1294674, 946.29, 954.45, 943.01 07/12/2017, 943.83, 1517168, 938.68, 946.3, 934.47 07/11/2017, 930.09, 1112417, 929.54, 931.43, 922 07/10/2017, 928.8, 1190237, 921.77, 930.38, 919.59 07/07/2017, 918.59, 1590456, 908.85, 921.54, 908.85 07/06/2017, 906.69, 1424290, 904.12, 914.9444, 899.7 07/05/2017, 911.71, 1813309, 901.76, 914.51, 898.5 07/03/2017, 898.7, 1710373, 912.18, 913.94, 894.79 06/30/2017, 908.73, 2086340, 926.05, 926.05, 908.31 06/29/2017, 917.79, 3287991, 929.92, 931.26, 910.62 06/28/2017, 940.49, 2719213, 929, 942.75, 916 06/27/2017, 927.33, 2566047, 942.46, 948.29, 926.85 06/26/2017, 952.27, 1596664, 969.9, 973.31, 950.79 06/23/2017, 965.59, 1527513, 956.83, 966, 954.2 06/22/2017, 957.09, 941639, 958.7, 960.72, 954.55 06/21/2017, 959.45, 1201971, 953.64, 960.1, 950.76 06/20/2017, 950.63, 1125520, 957.52, 961.62, 950.01 06/19/2017, 957.37, 1520715, 949.96, 959.99, 949.05 06/16/2017, 939.78, 3061794, 940, 942.04, 931.595 06/15/2017, 942.31, 2065271, 933.97, 943.339, 924.44 06/14/2017, 950.76, 1487378, 959.92, 961.15, 942.25 06/13/2017, 953.4, 2012980, 951.91, 959.98, 944.09 06/12/2017, 942.9, 3762434, 939.56, 949.355, 915.2328 06/09/2017, 949.83, 3305545, 984.5, 984.5, 935.63 06/08/2017, 983.41, 1477151, 982.35, 984.57, 977.2 06/07/2017, 981.08, 1447172, 979.65, 984.15, 975.77 06/06/2017, 976.57, 1814323, 983.16, 988.25, 975.14 06/05/2017, 983.68, 1251903, 976.55, 986.91, 975.1 06/02/2017, 975.6, 1750723, 969.46, 975.88, 966 06/01/2017, 966.95, 1408958, 968.95, 971.5, 960.01 05/31/2017, 964.86, 2447176, 975.02, 979.27, 960.18 05/30/2017, 975.88, 1466288, 970.31, 976.2, 969.49 05/26/2017, 971.47, 1251425, 969.7, 974.98, 965.03 05/25/2017, 969.54, 1659422, 957.33, 972.629, 955.47 05/24/2017, 954.96, 1031408, 952.98, 955.09, 949.5 05/23/2017, 948.82, 1269438, 947.92, 951.4666, 942.575 05/22/2017, 941.86, 1118456, 935, 941.8828, 935 05/19/2017, 934.01, 1389848, 931.47, 937.755, 931 05/18/2017, 930.24, 1596058, 921, 933.17, 918.75 05/17/2017, 919.62, 2357922, 935.67, 939.3325, 918.14 05/16/2017, 943, 968288, 940, 943.11, 937.58 05/15/2017, 937.08, 1104595, 932.95, 938.25, 929.34 05/12/2017, 932.22, 1050377, 931.53, 933.44, 927.85 05/11/2017, 930.6, 834997, 925.32, 932.53, 923.0301 05/10/2017, 928.78, 1173887, 931.98, 932, 925.16 05/09/2017, 932.17, 1581236, 936.95, 937.5, 929.53 05/08/2017, 934.3, 1328885, 926.12, 936.925, 925.26 05/05/2017, 927.13, 1910317, 933.54, 934.9, 925.2 05/04/2017, 931.66, 1421938, 926.07, 935.93, 924.59 05/03/2017, 927.04, 1497565, 914.86, 928.1, 912.5426 05/02/2017, 916.44, 1543696, 909.62, 920.77, 909.4526 05/01/2017, 912.57, 2114629, 901.94, 915.68, 901.45 04/28/2017, 905.96, 3223850, 910.66, 916.85, 905.77 04/27/2017, 874.25, 2009509, 873.6, 875.4, 870.38 04/26/2017, 871.73, 1233724, 874.23, 876.05, 867.7481 04/25/2017, 872.3, 1670095, 865, 875, 862.81 04/24/2017, 862.76, 1371722, 851.2, 863.45, 849.86 04/21/2017, 843.19, 1323364, 842.88, 843.88, 840.6 04/20/2017, 841.65, 957994, 841.44, 845.2, 839.32 04/19/2017, 838.21, 954324, 839.79, 842.22, 836.29 04/18/2017, 836.82, 835433, 834.22, 838.93, 832.71 04/17/2017, 837.17, 894540, 825.01, 837.75, 824.47 04/13/2017, 823.56, 1118221, 822.14, 826.38, 821.44 04/12/2017, 824.32, 900059, 821.93, 826.66, 821.02 04/11/2017, 823.35, 1078951, 824.71, 827.4267, 817.0201 04/10/2017, 824.73, 978825, 825.39, 829.35, 823.77 04/07/2017, 824.67, 1056692, 827.96, 828.485, 820.5127 04/06/2017, 827.88, 1254235, 832.4, 836.39, 826.46 04/05/2017, 831.41, 1553163, 835.51, 842.45, 830.72 04/04/2017, 834.57, 1044455, 831.36, 835.18, 829.0363 04/03/2017, 838.55, 1670349, 829.22, 840.85, 829.22 03/31/2017, 829.56, 1401756, 828.97, 831.64, 827.39 03/30/2017, 831.5, 1055263, 833.5, 833.68, 829 03/29/2017, 831.41, 1785006, 825, 832.765, 822.3801 03/28/2017, 820.92, 1620532, 820.41, 825.99, 814.027 03/27/2017, 819.51, 1894735, 806.95, 821.63, 803.37 03/24/2017, 814.43, 1980415, 820.08, 821.93, 808.89 03/23/2017, 817.58, 3485390, 821, 822.57, 812.257 03/22/2017, 829.59, 1399409, 831.91, 835.55, 827.1801 03/21/2017, 830.46, 2461375, 851.4, 853.5, 829.02 03/20/2017, 848.4, 1217560, 850.01, 850.22, 845.15 03/17/2017, 852.12, 1712397, 851.61, 853.4, 847.11 03/16/2017, 848.78, 977384, 849.03, 850.85, 846.13 03/15/2017, 847.2, 1381328, 847.59, 848.63, 840.77 03/14/2017, 845.62, 779920, 843.64, 847.24, 840.8 03/13/2017, 845.54, 1149928, 844, 848.685, 843.25 03/10/2017, 843.25, 1702731, 843.28, 844.91, 839.5 03/09/2017, 838.68, 1261393, 836, 842, 834.21 03/08/2017, 835.37, 988900, 833.51, 838.15, 831.79 03/07/2017, 831.91, 1037573, 827.4, 833.41, 826.52 03/06/2017, 827.78, 1108799, 826.95, 828.88, 822.4 03/03/2017, 829.08, 890640, 830.56, 831.36, 825.751 03/02/2017, 830.63, 937824, 833.85, 834.51, 829.64 03/01/2017, 835.24, 1495934, 828.85, 836.255, 827.26 02/28/2017, 823.21, 2258695, 825.61, 828.54, 820.2 02/27/2017, 829.28, 1101120, 824.55, 830.5, 824 02/24/2017, 828.64, 1392039, 827.73, 829, 824.2 02/23/2017, 831.33, 1471342, 830.12, 832.46, 822.88 02/22/2017, 830.76, 983058, 828.66, 833.25, 828.64 02/21/2017, 831.66, 1259841, 828.66, 833.45, 828.35 02/17/2017, 828.07, 1602549, 823.02, 828.07, 821.655 02/16/2017, 824.16, 1285919, 819.93, 824.4, 818.98 02/15/2017, 818.98, 1311316, 819.36, 823, 818.47 02/14/2017, 820.45, 1054472, 819, 823, 816 02/13/2017, 819.24, 1205835, 816, 820.959, 815.49 02/10/2017, 813.67, 1134701, 811.7, 815.25, 809.78 02/09/2017, 809.56, 990260, 809.51, 810.66, 804.54 02/08/2017, 808.38, 1155892, 807, 811.84, 803.1903 02/07/2017, 806.97, 1240257, 803.99, 810.5, 801.78 02/06/2017, 801.34, 1182882, 799.7, 801.67, 795.2501 02/03/2017, 801.49, 1461217, 802.99, 806, 800.37 02/02/2017, 798.53, 1530827, 793.8, 802.7, 792 02/01/2017, 795.695, 2027708, 799.68, 801.19, 791.19 01/31/2017, 796.79, 2153957, 796.86, 801.25, 790.52 01/30/2017, 802.32, 3243568, 814.66, 815.84, 799.8 01/27/2017, 823.31, 2964989, 834.71, 841.95, 820.44 01/26/2017, 832.15, 2944642, 837.81, 838, 827.01 01/25/2017, 835.67, 1612854, 829.62, 835.77, 825.06 01/24/2017, 823.87, 1472228, 822.3, 825.9, 817.821 01/23/2017, 819.31, 1962506, 807.25, 820.87, 803.74 01/20/2017, 805.02, 1668638, 806.91, 806.91, 801.69 01/19/2017, 802.175, 917085, 805.12, 809.48, 801.8 01/18/2017, 806.07, 1293893, 805.81, 806.205, 800.99 01/17/2017, 804.61, 1361935, 807.08, 807.14, 800.37 01/13/2017, 807.88, 1098154, 807.48, 811.2244, 806.69 01/12/2017, 806.36, 1352872, 807.14, 807.39, 799.17 01/11/2017, 807.91, 1065360, 805, 808.15, 801.37 01/10/2017, 804.79, 1176637, 807.86, 809.1299, 803.51 01/09/2017, 806.65, 1274318, 806.4, 809.9664, 802.83 01/06/2017, 806.15, 1639246, 795.26, 807.9, 792.2041 01/05/2017, 794.02, 1334028, 786.08, 794.48, 785.02 01/04/2017, 786.9, 1071198, 788.36, 791.34, 783.16 01/03/2017, 786.14, 1657291, 778.81, 789.63, 775.8 12/30/2016, 771.82, 1769809, 782.75, 782.78, 770.41 12/29/2016, 782.79, 743808, 783.33, 785.93, 778.92 12/28/2016, 785.05, 1142148, 793.7, 794.23, 783.2 12/27/2016, 791.55, 789151, 790.68, 797.86, 787.657 12/23/2016, 789.91, 623682, 790.9, 792.74, 787.28 12/22/2016, 791.26, 972147, 792.36, 793.32, 788.58 12/21/2016, 794.56, 1208770, 795.84, 796.6757, 787.1 12/20/2016, 796.42, 950345, 796.76, 798.65, 793.27 12/19/2016, 794.2, 1231966, 790.22, 797.66, 786.27 12/16/2016, 790.8, 2435100, 800.4, 800.8558, 790.29 12/15/2016, 797.85, 1623709, 797.34, 803, 792.92 12/14/2016, 797.07, 1700875, 797.4, 804, 794.01 12/13/2016, 796.1, 2122735, 793.9, 804.3799, 793.34 12/12/2016, 789.27, 2102288, 785.04, 791.25, 784.3554 12/09/2016, 789.29, 1821146, 780, 789.43, 779.021 12/08/2016, 776.42, 1487517, 772.48, 778.18, 767.23 12/07/2016, 771.19, 1757710, 761, 771.36, 755.8 12/06/2016, 759.11, 1690365, 764.73, 768.83, 757.34 12/05/2016, 762.52, 1393566, 757.71, 763.9, 752.9 12/02/2016, 750.5, 1452181, 744.59, 754, 743.1 12/01/2016, 747.92, 3017001, 757.44, 759.85, 737.0245 11/30/2016, 758.04, 2386628, 770.07, 772.99, 754.83 11/29/2016, 770.84, 1616427, 771.53, 778.5, 768.24 11/28/2016, 768.24, 2177039, 760, 779.53, 759.8 11/25/2016, 761.68, 587421, 764.26, 765, 760.52 11/23/2016, 760.99, 1477501, 767.73, 768.2825, 755.25 11/22/2016, 768.27, 1592372, 772.63, 776.96, 767 11/21/2016, 769.2, 1324431, 762.61, 769.7, 760.6 11/18/2016, 760.54, 1528555, 771.37, 775, 760 11/17/2016, 771.23, 1298484, 766.92, 772.7, 764.23 11/16/2016, 764.48, 1468196, 755.2, 766.36, 750.51 11/15/2016, 758.49, 2375056, 746.97, 764.4162, 746.97 11/14/2016, 736.08, 3644965, 755.6, 757.85, 727.54 11/11/2016, 754.02, 2421889, 756.54, 760.78, 750.38 11/10/2016, 762.56, 4733916, 791.17, 791.17, 752.18 11/09/2016, 785.31, 2603860, 779.94, 791.2265, 771.67 11/08/2016, 790.51, 1361472, 783.4, 795.633, 780.19 11/07/2016, 782.52, 1574426, 774.5, 785.19, 772.55 11/04/2016, 762.02, 2131948, 750.66, 770.36, 750.5611 11/03/2016, 762.13, 1933937, 767.25, 769.95, 759.03 11/02/2016, 768.7, 1905814, 778.2, 781.65, 763.4496 11/01/2016, 783.61, 2404898, 782.89, 789.49, 775.54 10/31/2016, 784.54, 2420892, 795.47, 796.86, 784 10/28/2016, 795.37, 4261912, 808.35, 815.49, 793.59 10/27/2016, 795.35, 2723097, 801, 803.49, 791.5 10/26/2016, 799.07, 1645403, 806.34, 806.98, 796.32 10/25/2016, 807.67, 1575020, 816.68, 816.68, 805.14 10/24/2016, 813.11, 1693162, 804.9, 815.18, 804.82 10/21/2016, 799.37, 1262042, 795, 799.5, 794 10/20/2016, 796.97, 1755546, 803.3, 803.97, 796.03 10/19/2016, 801.56, 1762990, 798.86, 804.63, 797.635 10/18/2016, 795.26, 2046338, 787.85, 801.61, 785.565 10/17/2016, 779.96, 1091524, 779.8, 785.85, 777.5 10/14/2016, 778.53, 851512, 781.65, 783.95, 776 10/13/2016, 778.19, 1360619, 781.22, 781.22, 773 10/12/2016, 786.14, 935138, 783.76, 788.13, 782.06 10/11/2016, 783.07, 1371461, 786.66, 792.28, 780.58 10/10/2016, 785.94, 1161410, 777.71, 789.38, 775.87 10/07/2016, 775.08, 932444, 779.66, 779.66, 770.75 10/06/2016, 776.86, 1066910, 779, 780.48, 775.54 10/05/2016, 776.47, 1457661, 779.31, 782.07, 775.65 10/04/2016, 776.43, 1198361, 776.03, 778.71, 772.89 10/03/2016, 772.56, 1276614, 774.25, 776.065, 769.5 09/30/2016, 777.29, 1583293, 776.33, 780.94, 774.09 09/29/2016, 775.01, 1310252, 781.44, 785.8, 774.232 09/28/2016, 781.56, 1108249, 777.85, 781.81, 774.97 09/27/2016, 783.01, 1152760, 775.5, 785.9899, 774.308 09/26/2016, 774.21, 1531788, 782.74, 782.74, 773.07 09/23/2016, 786.9, 1411439, 786.59, 788.93, 784.15 09/22/2016, 787.21, 1483899, 780, 789.85, 778.44 09/21/2016, 776.22, 1166290, 772.66, 777.16, 768.301 09/20/2016, 771.41, 975434, 769, 773.33, 768.53 09/19/2016, 765.7, 1171969, 772.42, 774, 764.4406 09/16/2016, 768.88, 2047036, 769.75, 769.75, 764.66 09/15/2016, 771.76, 1344945, 762.89, 773.8, 759.96 09/14/2016, 762.49, 1093723, 759.61, 767.68, 759.11 09/13/2016, 759.69, 1394158, 764.48, 766.2195, 755.8 09/12/2016, 769.02, 1310493, 755.13, 770.29, 754.0001 09/09/2016, 759.66, 1879903, 770.1, 773.245, 759.66 09/08/2016, 775.32, 1268663, 778.59, 780.35, 773.58 09/07/2016, 780.35, 893874, 780, 782.73, 776.2 09/06/2016, 780.08, 1441864, 773.45, 782, 771 09/02/2016, 771.46, 1070725, 773.01, 773.9199, 768.41 09/01/2016, 768.78, 925019, 769.25, 771.02, 764.3 08/31/2016, 767.05, 1247937, 767.01, 769.09, 765.38 08/30/2016, 769.09, 1129932, 769.33, 774.466, 766.84 08/29/2016, 772.15, 847537, 768.74, 774.99, 766.615 08/26/2016, 769.54, 1164713, 769, 776.0799, 765.85 08/25/2016, 769.41, 926856, 767, 771.89, 763.1846 08/24/2016, 769.64, 1071569, 770.58, 774.5, 767.07 08/23/2016, 772.08, 925356, 775.48, 776.44, 771.785 08/22/2016, 772.15, 950417, 773.27, 774.54, 770.0502 08/19/2016, 775.42, 860899, 775, 777.1, 773.13 08/18/2016, 777.5, 718882, 780.01, 782.86, 777 08/17/2016, 779.91, 921666, 777.32, 780.81, 773.53 08/16/2016, 777.14, 1027836, 780.3, 780.98, 773.444 08/15/2016, 782.44, 938183, 783.75, 787.49, 780.11 08/12/2016, 783.22, 739761, 781.5, 783.395, 780.4 08/11/2016, 784.85, 971742, 785, 789.75, 782.97 08/10/2016, 784.68, 784559, 783.75, 786.8123, 782.778 08/09/2016, 784.26, 1318457, 781.1, 788.94, 780.57 08/08/2016, 781.76, 1106693, 782, 782.63, 778.091 08/05/2016, 782.22, 1799478, 773.78, 783.04, 772.34 08/04/2016, 771.61, 1139972, 772.22, 774.07, 768.795 08/03/2016, 773.18, 1283186, 767.18, 773.21, 766.82 08/02/2016, 771.07, 1782822, 768.69, 775.84, 767.85 08/01/2016, 772.88, 2697699, 761.09, 780.43, 761.09 07/29/2016, 768.79, 3830103, 772.71, 778.55, 766.77 07/28/2016, 745.91, 3473040, 747.04, 748.65, 739.3 07/27/2016, 741.77, 1509133, 738.28, 744.46, 737 07/26/2016, 738.42, 1182993, 739.04, 741.69, 734.27 07/25/2016, 739.77, 1031643, 740.67, 742.61, 737.5 07/22/2016, 742.74, 1256741, 741.86, 743.24, 736.56 07/21/2016, 738.63, 1022229, 740.36, 741.69, 735.831 07/20/2016, 741.19, 1283931, 737.33, 742.13, 737.1 07/19/2016, 736.96, 1225467, 729.89, 736.99, 729 07/18/2016, 733.78, 1284740, 722.71, 736.13, 721.19 07/15/2016, 719.85, 1277514, 725.73, 725.74, 719.055 07/14/2016, 720.95, 949456, 721.58, 722.21, 718.03 07/13/2016, 716.98, 933352, 723.62, 724, 716.85 07/12/2016, 720.64, 1336112, 719.12, 722.94, 715.91 07/11/2016, 715.09, 1107039, 708.05, 716.51, 707.24 07/08/2016, 705.63, 1573909, 699.5, 705.71, 696.435 07/07/2016, 695.36, 1303661, 698.08, 698.2, 688.215 07/06/2016, 697.77, 1411080, 689.98, 701.68, 689.09 07/05/2016, 694.49, 1462879, 696.06, 696.94, 688.88 07/01/2016, 699.21, 1344387, 692.2, 700.65, 692.1301 06/30/2016, 692.1, 1597298, 685.47, 692.32, 683.65 06/29/2016, 684.11, 1931436, 683, 687.4292, 681.41 06/28/2016, 680.04, 2169704, 678.97, 680.33, 673 06/27/2016, 668.26, 2632011, 671, 672.3, 663.284 06/24/2016, 675.22, 4442943, 675.17, 689.4, 673.45 06/23/2016, 701.87, 2166183, 697.45, 701.95, 687 06/22/2016, 697.46, 1182161, 699.06, 700.86, 693.0819 06/21/2016, 695.94, 1464836, 698.4, 702.77, 692.01 06/20/2016, 693.71, 2080645, 698.77, 702.48, 693.41 06/17/2016, 691.72, 3397720, 708.65, 708.82, 688.4515 06/16/2016, 710.36, 1981657, 714.91, 716.65, 703.26 06/15/2016, 718.92, 1213386, 719, 722.98, 717.31 06/14/2016, 718.27, 1303808, 716.48, 722.47, 713.12 06/13/2016, 718.36, 1255199, 716.51, 725.44, 716.51 06/10/2016, 719.41, 1213989, 719.47, 725.89, 716.43 06/09/2016, 728.58, 987635, 722.87, 729.54, 722.3361 06/08/2016, 728.28, 1583325, 723.96, 728.57, 720.58 06/07/2016, 716.65, 1336348, 719.84, 721.98, 716.55 06/06/2016, 716.55, 1565955, 724.91, 724.91, 714.61 06/03/2016, 722.34, 1225924, 729.27, 729.49, 720.56 06/02/2016, 730.4, 1340664, 732.5, 733.02, 724.17 06/01/2016, 734.15, 1251468, 734.53, 737.21, 730.66 05/31/2016, 735.72, 2128358, 731.74, 739.73, 731.26 05/27/2016, 732.66, 1974425, 724.01, 733.936, 724 05/26/2016, 724.12, 1573635, 722.87, 728.33, 720.28 05/25/2016, 725.27, 1629790, 720.76, 727.51, 719.7047 05/24/2016, 720.09, 1926828, 706.86, 720.97, 706.86 05/23/2016, 704.24, 1326386, 706.53, 711.4781, 704.18 05/20/2016, 709.74, 1825830, 701.62, 714.58, 700.52 05/19/2016, 700.32, 1668887, 702.36, 706, 696.8 05/18/2016, 706.63, 1765632, 703.67, 711.6, 700.63 05/17/2016, 706.23, 1999883, 715.99, 721.52, 704.11 05/16/2016, 716.49, 1316719, 709.13, 718.48, 705.65 05/13/2016, 710.83, 1307559, 711.93, 716.6619, 709.26 05/12/2016, 713.31, 1361170, 717.06, 719.25, 709 05/11/2016, 715.29, 1690862, 723.41, 724.48, 712.8 05/10/2016, 723.18, 1568621, 716.75, 723.5, 715.72 05/09/2016, 712.9, 1509892, 712, 718.71, 710 05/06/2016, 711.12, 1828508, 698.38, 711.86, 698.1067 05/05/2016, 701.43, 1680220, 697.7, 702.3199, 695.72 05/04/2016, 695.7, 1692757, 690.49, 699.75, 689.01 05/03/2016, 692.36, 1541297, 696.87, 697.84, 692 05/02/2016, 698.21, 1645013, 697.63, 700.64, 691 04/29/2016, 693.01, 2486584, 690.7, 697.62, 689 04/28/2016, 691.02, 2859790, 708.26, 714.17, 689.55 04/27/2016, 705.84, 3094905, 707.29, 708.98, 692.3651 04/26/2016, 708.14, 2739133, 725.42, 725.766, 703.0264 04/25/2016, 723.15, 1956956, 716.1, 723.93, 715.59 04/22/2016, 718.77, 5949699, 726.3, 736.12, 713.61 04/21/2016, 759.14, 2995094, 755.38, 760.45, 749.55 04/20/2016, 752.67, 1526776, 758, 758.1315, 750.01 04/19/2016, 753.93, 2027962, 769.51, 769.9, 749.33 04/18/2016, 766.61, 1557199, 760.46, 768.05, 757.3 04/15/2016, 759, 1807062, 753.98, 761, 752.6938 04/14/2016, 753.2, 1134056, 754.01, 757.31, 752.705 04/13/2016, 751.72, 1707397, 749.16, 754.38, 744.261 04/12/2016, 743.09, 1349780, 738, 743.83, 731.01 04/11/2016, 736.1, 1218789, 743.02, 745, 736.05 04/08/2016, 739.15, 1289869, 743.97, 745.45, 735.55 04/07/2016, 740.28, 1452369, 745.37, 746.9999, 736.28 04/06/2016, 745.69, 1052171, 735.77, 746.24, 735.56 04/05/2016, 737.8, 1130817, 738, 742.8, 735.37 04/04/2016, 745.29, 1134214, 750.06, 752.8, 742.43 04/01/2016, 749.91, 1576240, 738.6, 750.34, 737 03/31/2016, 744.95, 1718638, 749.25, 750.85, 740.94 03/30/2016, 750.53, 1782278, 750.1, 757.88, 748.74 03/29/2016, 744.77, 1902254, 734.59, 747.25, 728.76 03/28/2016, 733.53, 1300817, 736.79, 738.99, 732.5 03/24/2016, 735.3, 1570474, 732.01, 737.747, 731 03/23/2016, 738.06, 1431130, 742.36, 745.7199, 736.15 03/22/2016, 740.75, 1269263, 737.46, 745, 737.46 03/21/2016, 742.09, 1835963, 736.5, 742.5, 733.5157 03/18/2016, 737.6, 2982194, 741.86, 742, 731.83 03/17/2016, 737.78, 1859562, 736.45, 743.07, 736 03/16/2016, 736.09, 1621412, 726.37, 737.47, 724.51 03/15/2016, 728.33, 1720790, 726.92, 732.29, 724.77 03/14/2016, 730.49, 1717002, 726.81, 735.5, 725.15 03/11/2016, 726.82, 1968164, 720, 726.92, 717.125 03/10/2016, 712.82, 2830630, 708.12, 716.44, 703.36 03/09/2016, 705.24, 1419661, 698.47, 705.68, 694 03/08/2016, 693.97, 2075305, 688.59, 703.79, 685.34 03/07/2016, 695.16, 2986064, 706.9, 708.0912, 686.9 03/04/2016, 710.89, 1971379, 714.99, 716.49, 706.02 03/03/2016, 712.42, 1956958, 718.68, 719.45, 706.02 03/02/2016, 718.85, 1629501, 719, 720, 712 03/01/2016, 718.81, 2148608, 703.62, 718.81, 699.77 02/29/2016, 697.77, 2478214, 700.32, 710.89, 697.68 02/26/2016, 705.07, 2241785, 708.58, 713.43, 700.86 02/25/2016, 705.75, 1640430, 700.01, 705.98, 690.585 02/24/2016, 699.56, 1961258, 688.92, 700, 680.78 02/23/2016, 695.85, 2006572, 701.45, 708.4, 693.58 02/22/2016, 706.46, 1949046, 707.45, 713.24, 702.51 02/19/2016, 700.91, 1585152, 695.03, 703.0805, 694.05 02/18/2016, 697.35, 1880306, 710, 712.35, 696.03 02/17/2016, 708.4, 2490021, 699, 709.75, 691.38 02/16/2016, 691, 2517324, 692.98, 698, 685.05 02/12/2016, 682.4, 2138937, 690.26, 693.75, 678.6 02/11/2016, 683.11, 3021587, 675, 689.35, 668.8675 02/10/2016, 684.12, 2629130, 686.86, 701.31, 682.13 02/09/2016, 678.11, 3605792, 672.32, 699.9, 668.77 02/08/2016, 682.74, 4241416, 667.85, 684.03, 663.06 02/05/2016, 683.57, 5098357, 703.87, 703.99, 680.15 02/04/2016, 708.01, 5157988, 722.81, 727, 701.86 02/03/2016, 726.95, 6166731, 770.22, 774.5, 720.5 02/02/2016, 764.65, 6340548, 784.5, 789.8699, 764.65 02/01/2016, 752, 5065235, 750.46, 757.86, 743.27 01/29/2016, 742.95, 3464432, 731.53, 744.9899, 726.8 01/28/2016, 730.96, 2664956, 722.22, 733.69, 712.35 01/27/2016, 699.99, 2175913, 713.67, 718.235, 694.39 01/26/2016, 713.04, 1329141, 713.85, 718.28, 706.48 01/25/2016, 711.67, 1709777, 723.58, 729.68, 710.01 01/22/2016, 725.25, 2009951, 723.6, 728.13, 720.121 01/21/2016, 706.59, 2411079, 702.18, 719.19, 694.46 01/20/2016, 698.45, 3441642, 688.61, 706.85, 673.26 01/19/2016, 701.79, 2264747, 703.3, 709.98, 693.4101 01/15/2016, 694.45, 3604137, 692.29, 706.74, 685.37 01/14/2016, 714.72, 2225495, 705.38, 721.925, 689.1 01/13/2016, 700.56, 2497086, 730.85, 734.74, 698.61 01/12/2016, 726.07, 2010026, 721.68, 728.75, 717.3165 01/11/2016, 716.03, 2089495, 716.61, 718.855, 703.54 01/08/2016, 714.47, 2449420, 731.45, 733.23, 713 01/07/2016, 726.39, 2960578, 730.31, 738.5, 719.06 01/06/2016, 743.62, 1943685, 730, 747.18, 728.92 01/05/2016, 742.58, 1949386, 746.45, 752, 738.64 01/04/2016, 741.84, 3271348, 743, 744.06, 731.2577 12/31/2015, 758.88, 1500129, 769.5, 769.5, 758.34 12/30/2015, 771, 1293514, 776.6, 777.6, 766.9 12/29/2015, 776.6, 1764044, 766.69, 779.98, 766.43 12/28/2015, 762.51, 1515574, 752.92, 762.99, 749.52 12/24/2015, 748.4, 527223, 749.55, 751.35, 746.62 12/23/2015, 750.31, 1566723, 753.47, 754.21, 744 12/22/2015, 750, 1365420, 751.65, 754.85, 745.53 12/21/2015, 747.77, 1524535, 746.13, 750, 740 12/18/2015, 739.31, 3140906, 746.51, 754.13, 738.15 12/17/2015, 749.43, 1551087, 762.42, 762.68, 749 12/16/2015, 758.09, 1986319, 750, 760.59, 739.435 12/15/2015, 743.4, 2661199, 753, 758.08, 743.01 12/14/2015, 747.77, 2417778, 741.79, 748.73, 724.17 12/11/2015, 738.87, 2223284, 741.16, 745.71, 736.75 12/10/2015, 749.46, 1988035, 752.85, 755.85, 743.83 12/09/2015, 751.61, 2697978, 759.17, 764.23, 737.001 12/08/2015, 762.37, 1829004, 757.89, 764.8, 754.2 12/07/2015, 763.25, 1811336, 767.77, 768.73, 755.09 12/04/2015, 766.81, 2756194, 753.1, 768.49, 750 12/03/2015, 752.54, 2589641, 766.01, 768.995, 745.63 12/02/2015, 762.38, 2196721, 768.9, 775.955, 758.96 12/01/2015, 767.04, 2131827, 747.11, 768.95, 746.7 11/30/2015, 742.6, 2045584, 748.81, 754.93, 741.27 11/27/2015, 750.26, 838528, 748.46, 753.41, 747.49 11/25/2015, 748.15, 1122224, 748.14, 752, 746.06 11/24/2015, 748.28, 2333700, 752, 755.279, 737.63 11/23/2015, 755.98, 1414640, 757.45, 762.7075, 751.82 11/20/2015, 756.6, 2212934, 746.53, 757.92, 743 11/19/2015, 738.41, 1327265, 738.74, 742, 737.43 11/18/2015, 740, 1683978, 727.58, 741.41, 727 11/17/2015, 725.3, 1507449, 729.29, 731.845, 723.027 11/16/2015, 728.96, 1904395, 715.6, 729.49, 711.33 11/13/2015, 717, 2072392, 729.17, 731.15, 716.73 11/12/2015, 731.23, 1836567, 731, 737.8, 728.645 11/11/2015, 735.4, 1366611, 732.46, 741, 730.23 11/10/2015, 728.32, 1606499, 724.4, 730.59, 718.5001 11/09/2015, 724.89, 2068920, 730.2, 734.71, 719.43 11/06/2015, 733.76, 1510586, 731.5, 735.41, 727.01 11/05/2015, 731.25, 1861100, 729.47, 739.48, 729.47 11/04/2015, 728.11, 1705745, 722, 733.1, 721.9 11/03/2015, 722.16, 1565355, 718.86, 724.65, 714.72 11/02/2015, 721.11, 1885155, 711.06, 721.62, 705.85 10/30/2015, 710.81, 1907732, 715.73, 718, 710.05 10/29/2015, 716.92, 1455508, 710.5, 718.26, 710.01 10/28/2015, 712.95, 2178841, 707.33, 712.98, 703.08 10/27/2015, 708.49, 2232183, 707.38, 713.62, 704.55 10/26/2015, 712.78, 2709292, 701.55, 719.15, 701.26 10/23/2015, 702, 6651909, 727.5, 730, 701.5 10/22/2015, 651.79, 3994360, 646.7, 657.8, 644.01 10/21/2015, 642.61, 1792869, 654.15, 655.87, 641.73 10/20/2015, 650.28, 2498077, 664.04, 664.7197, 644.195 10/19/2015, 666.1, 1465691, 661.18, 666.82, 659.58 10/16/2015, 662.2, 1610712, 664.11, 664.97, 657.2 10/15/2015, 661.74, 1832832, 654.66, 663.13, 654.46 10/14/2015, 651.16, 1413798, 653.21, 659.39, 648.85 10/13/2015, 652.3, 1806003, 643.15, 657.8125, 643.15 10/12/2015, 646.67, 1275565, 642.09, 648.5, 639.01 10/09/2015, 643.61, 1648656, 640, 645.99, 635.318 10/08/2015, 639.16, 2181990, 641.36, 644.45, 625.56 10/07/2015, 642.36, 2092536, 649.24, 650.609, 632.15 10/06/2015, 645.44, 2235078, 638.84, 649.25, 636.5295 10/05/2015, 641.47, 1802263, 632, 643.01, 627 10/02/2015, 626.91, 2681241, 607.2, 627.34, 603.13 10/01/2015, 611.29, 1866223, 608.37, 612.09, 599.85 09/30/2015, 608.42, 2412754, 603.28, 608.76, 600.73 09/29/2015, 594.97, 2310065, 597.28, 605, 590.22 09/28/2015, 594.89, 3118693, 610.34, 614.605, 589.38 09/25/2015, 611.97, 2173134, 629.77, 629.77, 611 09/24/2015, 625.8, 2238097, 616.64, 627.32, 612.4 09/23/2015, 622.36, 1470633, 622.05, 628.93, 620 09/22/2015, 622.69, 2561551, 627, 627.55, 615.43 09/21/2015, 635.44, 1786543, 634.4, 636.49, 625.94 09/18/2015, 629.25, 5123314, 636.79, 640, 627.02 09/17/2015, 642.9, 2259404, 637.79, 650.9, 635.02 09/16/2015, 635.98, 1276250, 635.47, 637.95, 632.32 09/15/2015, 635.14, 2082426, 626.7, 638.7, 623.78 09/14/2015, 623.24, 1701618, 625.7, 625.86, 619.43 09/11/2015, 625.77, 1372803, 619.75, 625.78, 617.42 09/10/2015, 621.35, 1903334, 613.1, 624.16, 611.43 09/09/2015, 612.72, 1699686, 621.22, 626.52, 609.6 09/08/2015, 614.66, 2277487, 612.49, 616.31, 604.12 09/04/2015, 600.7, 2087028, 600, 603.47, 595.25 09/03/2015, 606.25, 1757851, 617, 619.71, 602.8213 09/02/2015, 614.34, 2573982, 605.59, 614.34, 599.71 09/01/2015, 597.79, 3699844, 602.36, 612.86, 594.1 08/31/2015, 618.25, 2172168, 627.54, 635.8, 617.68 08/28/2015, 630.38, 1975818, 632.82, 636.88, 624.56 08/27/2015, 637.61, 3485906, 639.4, 643.59, 622 08/26/2015, 628.62, 4187276, 610.35, 631.71, 599.05 08/25/2015, 582.06, 3521916, 614.91, 617.45, 581.11 08/24/2015, 589.61, 5727282, 573, 614, 565.05 08/21/2015, 612.48, 4261666, 639.78, 640.05, 612.33 08/20/2015, 646.83, 2854028, 655.46, 662.99, 642.9 08/19/2015, 660.9, 2132265, 656.6, 667, 654.19 08/18/2015, 656.13, 1455664, 661.9, 664, 653.46 08/17/2015, 660.87, 1050553, 656.8, 661.38, 651.24 08/14/2015, 657.12, 1071333, 655.01, 659.855, 652.66 08/13/2015, 656.45, 1807182, 659.323, 664.5, 651.661 08/12/2015, 659.56, 2938651, 663.08, 665, 652.29 08/11/2015, 660.78, 5016425, 669.2, 674.9, 654.27 08/10/2015, 633.73, 1653836, 639.48, 643.44, 631.249 08/07/2015, 635.3, 1403441, 640.23, 642.68, 629.71 08/06/2015, 642.68, 1572150, 645, 645.379, 632.25 08/05/2015, 643.78, 2331720, 634.33, 647.86, 633.16 08/04/2015, 629.25, 1486858, 628.42, 634.81, 627.16 08/03/2015, 631.21, 1301439, 625.34, 633.0556, 625.34 07/31/2015, 625.61, 1705286, 631.38, 632.91, 625.5 07/30/2015, 632.59, 1472286, 630, 635.22, 622.05 07/29/2015, 631.93, 1573146, 628.8, 633.36, 622.65 07/28/2015, 628, 1713684, 632.83, 632.83, 623.31 07/27/2015, 627.26, 2673801, 621, 634.3, 620.5 07/24/2015, 623.56, 3622089, 647, 648.17, 622.52 07/23/2015, 644.28, 3014035, 661.27, 663.63, 641 07/22/2015, 662.1, 3707818, 660.89, 678.64, 659 07/21/2015, 662.3, 3363342, 655.21, 673, 654.3 07/20/2015, 663.02, 5857092, 659.24, 668.88, 653.01 07/17/2015, 672.93, 11153500, 649, 674.468, 645 07/16/2015, 579.85, 4559712, 565.12, 580.68, 565 07/15/2015, 560.22, 1782264, 560.13, 566.5029, 556.79 07/14/2015, 561.1, 3231284, 546.76, 565.8487, 546.71 07/13/2015, 546.55, 2204610, 532.88, 547.11, 532.4001 07/10/2015, 530.13, 1954951, 526.29, 532.56, 525.55 07/09/2015, 520.68, 1840155, 523.12, 523.77, 520.35 07/08/2015, 516.83, 1293372, 521.05, 522.734, 516.11 07/07/2015, 525.02, 1595672, 523.13, 526.18, 515.18 07/06/2015, 522.86, 1278587, 519.5, 525.25, 519 07/02/2015, 523.4, 1235773, 521.08, 524.65, 521.08 07/01/2015, 521.84, 1961197, 524.73, 525.69, 518.2305 06/30/2015, 520.51, 2234284, 526.02, 526.25, 520.5 06/29/2015, 521.52, 1935361, 525.01, 528.61, 520.54 06/26/2015, 531.69, 2108629, 537.26, 537.76, 531.35 06/25/2015, 535.23, 1332412, 538.87, 540.9, 535.23 06/24/2015, 537.84, 1286576, 540, 540, 535.66 06/23/2015, 540.48, 1196115, 539.64, 541.499, 535.25 06/22/2015, 538.19, 1243535, 539.59, 543.74, 537.53 06/19/2015, 536.69, 1890916, 537.21, 538.25, 533.01 06/18/2015, 536.73, 1832450, 531, 538.15, 530.79 06/17/2015, 529.26, 1269113, 529.37, 530.98, 525.1 06/16/2015, 528.15, 1071728, 528.4, 529.6399, 525.56 06/15/2015, 527.2, 1632675, 528, 528.3, 524 06/12/2015, 532.33, 955489, 531.6, 533.12, 530.16 06/11/2015, 534.61, 1208632, 538.425, 538.98, 533.02 06/10/2015, 536.69, 1813775, 529.36, 538.36, 529.35 06/09/2015, 526.69, 1454172, 527.56, 529.2, 523.01 06/08/2015, 526.83, 1523960, 533.31, 534.12, 526.24 06/05/2015, 533.33, 1375008, 536.35, 537.2, 532.52 06/04/2015, 536.7, 1346044, 537.76, 540.59, 534.32 06/03/2015, 540.31, 1716836, 539.91, 543.5, 537.11 06/02/2015, 539.18, 1936721, 532.93, 543, 531.33 06/01/2015, 533.99, 1900257, 536.79, 536.79, 529.76 05/29/2015, 532.11, 2590445, 537.37, 538.63, 531.45 05/28/2015, 539.78, 1029764, 538.01, 540.61, 536.25 05/27/2015, 539.79, 1524783, 532.8, 540.55, 531.71 05/26/2015, 532.32, 2404462, 538.12, 539, 529.88 05/22/2015, 540.11, 1175065, 540.15, 544.19, 539.51 05/21/2015, 542.51, 1461431, 537.95, 543.8399, 535.98 05/20/2015, 539.27, 1430565, 538.49, 542.92, 532.972 05/19/2015, 537.36, 1964037, 533.98, 540.66, 533.04 05/18/2015, 532.3, 2001117, 532.01, 534.82, 528.85 05/15/2015, 533.85, 1965088, 539.18, 539.2743, 530.38 05/14/2015, 538.4, 1401005, 533.77, 539, 532.41 05/13/2015, 529.62, 1253005, 530.56, 534.3215, 528.655 05/12/2015, 529.04, 1633180, 531.6, 533.2089, 525.26 05/11/2015, 535.7, 904465, 538.37, 541.98, 535.4 05/08/2015, 538.22, 1527181, 536.65, 541.15, 536 05/07/2015, 530.7, 1543986, 523.99, 533.46, 521.75 05/06/2015, 524.22, 1566865, 531.24, 532.38, 521.085 05/05/2015, 530.8, 1380519, 538.21, 539.74, 530.3906 05/04/2015, 540.78, 1303830, 538.53, 544.07, 535.06 05/01/2015, 537.9, 1758085, 538.43, 539.54, 532.1 04/30/2015, 537.34, 2080834, 547.87, 548.59, 535.05 04/29/2015, 549.08, 1696886, 550.47, 553.68, 546.905 04/28/2015, 553.68, 1490735, 554.64, 556.02, 550.366 04/27/2015, 555.37, 2390696, 563.39, 565.95, 553.2001 ================================================ FILE: machine_learning/mfcc.py ================================================ """ Mel Frequency Cepstral Coefficients (MFCC) Calculation MFCC is an algorithm widely used in audio and speech processing to represent the short-term power spectrum of a sound signal in a more compact and discriminative way. It is particularly popular in speech and audio processing tasks such as speech recognition and speaker identification. How Mel Frequency Cepstral Coefficients are Calculated: 1. Preprocessing: - Load an audio signal and normalize it to ensure that the values fall within a specific range (e.g., between -1 and 1). - Frame the audio signal into overlapping, fixed-length segments, typically using a technique like windowing to reduce spectral leakage. 2. Fourier Transform: - Apply a Fast Fourier Transform (FFT) to each audio frame to convert it from the time domain to the frequency domain. This results in a representation of the audio frame as a sequence of frequency components. 3. Power Spectrum: - Calculate the power spectrum by taking the squared magnitude of each frequency component obtained from the FFT. This step measures the energy distribution across different frequency bands. 4. Mel Filterbank: - Apply a set of triangular filterbanks spaced in the Mel frequency scale to the power spectrum. These filters mimic the human auditory system's frequency response. Each filterbank sums the power spectrum values within its band. 5. Logarithmic Compression: - Take the logarithm (typically base 10) of the filterbank values to compress the dynamic range. This step mimics the logarithmic response of the human ear to sound intensity. 6. Discrete Cosine Transform (DCT): - Apply the Discrete Cosine Transform to the log filterbank energies to obtain the MFCC coefficients. This transformation helps decorrelate the filterbank energies and captures the most important features of the audio signal. 7. Feature Extraction: - Select a subset of the DCT coefficients to form the feature vector. Often, the first few coefficients (e.g., 12-13) are used for most applications. References: - Mel-Frequency Cepstral Coefficients (MFCCs): https://en.wikipedia.org/wiki/Mel-frequency_cepstrum - Speech and Language Processing by Daniel Jurafsky & James H. Martin: https://web.stanford.edu/~jurafsky/slp3/ - Mel Frequency Cepstral Coefficient (MFCC) tutorial http://practicalcryptography.com/miscellaneous/machine-learning /guide-mel-frequency-cepstral-coefficients-mfccs/ Author: Amir Lavasani """ import logging import numpy as np import scipy.fftpack as fft from scipy.signal import get_window logging.basicConfig(filename=f"{__file__}.log", level=logging.INFO) def mfcc( audio: np.ndarray, sample_rate: int, ftt_size: int = 1024, hop_length: int = 20, mel_filter_num: int = 10, dct_filter_num: int = 40, ) -> np.ndarray: """ Calculate Mel Frequency Cepstral Coefficients (MFCCs) from an audio signal. Args: audio: The input audio signal. sample_rate: The sample rate of the audio signal (in Hz). ftt_size: The size of the FFT window (default is 1024). hop_length: The hop length for frame creation (default is 20ms). mel_filter_num: The number of Mel filters (default is 10). dct_filter_num: The number of DCT filters (default is 40). Returns: A matrix of MFCCs for the input audio. Raises: ValueError: If the input audio is empty. Example: >>> sample_rate = 44100 # Sample rate of 44.1 kHz >>> duration = 2.0 # Duration of 1 second >>> t = np.linspace(0, duration, int(sample_rate * duration), endpoint=False) >>> audio = 0.5 * np.sin(2 * np.pi * 440.0 * t) # Generate a 440 Hz sine wave >>> mfccs = mfcc(audio, sample_rate) >>> mfccs.shape (40, 101) """ logging.info(f"Sample rate: {sample_rate}Hz") logging.info(f"Audio duration: {len(audio) / sample_rate}s") logging.info(f"Audio min: {np.min(audio)}") logging.info(f"Audio max: {np.max(audio)}") # normalize audio audio_normalized = normalize(audio) logging.info(f"Normalized audio min: {np.min(audio_normalized)}") logging.info(f"Normalized audio max: {np.max(audio_normalized)}") # frame audio into audio_framed = audio_frames( audio_normalized, sample_rate, ftt_size=ftt_size, hop_length=hop_length ) logging.info(f"Framed audio shape: {audio_framed.shape}") logging.info(f"First frame: {audio_framed[0]}") # convert to frequency domain # For simplicity we will choose the Hanning window. window = get_window("hann", ftt_size, fftbins=True) audio_windowed = audio_framed * window logging.info(f"Windowed audio shape: {audio_windowed.shape}") logging.info(f"First frame: {audio_windowed[0]}") audio_fft = calculate_fft(audio_windowed, ftt_size) logging.info(f"fft audio shape: {audio_fft.shape}") logging.info(f"First frame: {audio_fft[0]}") audio_power = calculate_signal_power(audio_fft) logging.info(f"power audio shape: {audio_power.shape}") logging.info(f"First frame: {audio_power[0]}") filters = mel_spaced_filterbank(sample_rate, mel_filter_num, ftt_size) logging.info(f"filters shape: {filters.shape}") audio_filtered = np.dot(filters, np.transpose(audio_power)) audio_log = 10.0 * np.log10(audio_filtered) logging.info(f"audio_log shape: {audio_log.shape}") dct_filters = discrete_cosine_transform(dct_filter_num, mel_filter_num) cepstral_coefficents = np.dot(dct_filters, audio_log) logging.info(f"cepstral_coefficents shape: {cepstral_coefficents.shape}") return cepstral_coefficents def normalize(audio: np.ndarray) -> np.ndarray: """ Normalize an audio signal by scaling it to have values between -1 and 1. Args: audio: The input audio signal. Returns: The normalized audio signal. Examples: >>> audio = np.array([1, 2, 3, 4, 5]) >>> normalized_audio = normalize(audio) >>> float(np.max(normalized_audio)) 1.0 >>> float(np.min(normalized_audio)) 0.2 """ # Divide the entire audio signal by the maximum absolute value return audio / np.max(np.abs(audio)) def audio_frames( audio: np.ndarray, sample_rate: int, hop_length: int = 20, ftt_size: int = 1024, ) -> np.ndarray: """ Split an audio signal into overlapping frames. Args: audio: The input audio signal. sample_rate: The sample rate of the audio signal. hop_length: The length of the hopping (default is 20ms). ftt_size: The size of the FFT window (default is 1024). Returns: An array of overlapping frames. Examples: >>> audio = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]*1000) >>> sample_rate = 8000 >>> frames = audio_frames(audio, sample_rate, hop_length=10, ftt_size=512) >>> frames.shape (126, 512) """ hop_size = np.round(sample_rate * hop_length / 1000).astype(int) # Pad the audio signal to handle edge cases audio = np.pad(audio, int(ftt_size / 2), mode="reflect") # Calculate the number of frames frame_count = int((len(audio) - ftt_size) / hop_size) + 1 # Initialize an array to store the frames frames = np.zeros((frame_count, ftt_size)) # Split the audio signal into frames for n in range(frame_count): frames[n] = audio[n * hop_size : n * hop_size + ftt_size] return frames def calculate_fft(audio_windowed: np.ndarray, ftt_size: int = 1024) -> np.ndarray: """ Calculate the Fast Fourier Transform (FFT) of windowed audio data. Args: audio_windowed: The windowed audio signal. ftt_size: The size of the FFT (default is 1024). Returns: The FFT of the audio data. Examples: >>> audio_windowed = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]) >>> audio_fft = calculate_fft(audio_windowed, ftt_size=4) >>> bool(np.allclose(audio_fft[0], np.array([6.0+0.j, -1.5+0.8660254j, ... -1.5-0.8660254j]))) True """ # Transpose the audio data to have time in rows and channels in columns audio_transposed = np.transpose(audio_windowed) # Initialize an array to store the FFT results audio_fft = np.empty( (int(1 + ftt_size // 2), audio_transposed.shape[1]), dtype=np.complex64, order="F", ) # Compute FFT for each channel for n in range(audio_fft.shape[1]): audio_fft[:, n] = fft.fft(audio_transposed[:, n], axis=0)[: audio_fft.shape[0]] # Transpose the FFT results back to the original shape return np.transpose(audio_fft) def calculate_signal_power(audio_fft: np.ndarray) -> np.ndarray: """ Calculate the power of the audio signal from its FFT. Args: audio_fft: The FFT of the audio signal. Returns: The power of the audio signal. Examples: >>> audio_fft = np.array([1+2j, 2+3j, 3+4j, 4+5j]) >>> power = calculate_signal_power(audio_fft) >>> np.allclose(power, np.array([5, 13, 25, 41])) True """ # Calculate the power by squaring the absolute values of the FFT coefficients return np.square(np.abs(audio_fft)) def freq_to_mel(freq: float) -> float: """ Convert a frequency in Hertz to the mel scale. Args: freq: The frequency in Hertz. Returns: The frequency in mel scale. Examples: >>> float(round(freq_to_mel(1000), 2)) 999.99 """ # Use the formula to convert frequency to the mel scale return 2595.0 * np.log10(1.0 + freq / 700.0) def mel_to_freq(mels: float) -> float: """ Convert a frequency in the mel scale to Hertz. Args: mels: The frequency in mel scale. Returns: The frequency in Hertz. Examples: >>> round(mel_to_freq(999.99), 2) 1000.01 """ # Use the formula to convert mel scale to frequency return 700.0 * (10.0 ** (mels / 2595.0) - 1.0) def mel_spaced_filterbank( sample_rate: int, mel_filter_num: int = 10, ftt_size: int = 1024 ) -> np.ndarray: """ Create a Mel-spaced filter bank for audio processing. Args: sample_rate: The sample rate of the audio. mel_filter_num: The number of mel filters (default is 10). ftt_size: The size of the FFT (default is 1024). Returns: Mel-spaced filter bank. Examples: >>> float(round(mel_spaced_filterbank(8000, 10, 1024)[0][1], 10)) 0.0004603981 """ freq_min = 0 freq_high = sample_rate // 2 logging.info(f"Minimum frequency: {freq_min}") logging.info(f"Maximum frequency: {freq_high}") # Calculate filter points and mel frequencies filter_points, mel_freqs = get_filter_points( sample_rate, freq_min, freq_high, mel_filter_num, ftt_size, ) filters = get_filters(filter_points, ftt_size) # normalize filters # taken from the librosa library enorm = 2.0 / (mel_freqs[2 : mel_filter_num + 2] - mel_freqs[:mel_filter_num]) return filters * enorm[:, np.newaxis] def get_filters(filter_points: np.ndarray, ftt_size: int) -> np.ndarray: """ Generate filters for audio processing. Args: filter_points: A list of filter points. ftt_size: The size of the FFT. Returns: A matrix of filters. Examples: >>> get_filters(np.array([0, 20, 51, 95, 161, 256], dtype=int), 512).shape (4, 257) """ num_filters = len(filter_points) - 2 filters = np.zeros((num_filters, int(ftt_size / 2) + 1)) for n in range(num_filters): start = filter_points[n] mid = filter_points[n + 1] end = filter_points[n + 2] # Linearly increase values from 0 to 1 filters[n, start:mid] = np.linspace(0, 1, mid - start) # Linearly decrease values from 1 to 0 filters[n, mid:end] = np.linspace(1, 0, end - mid) return filters def get_filter_points( sample_rate: int, freq_min: int, freq_high: int, mel_filter_num: int = 10, ftt_size: int = 1024, ) -> tuple[np.ndarray, np.ndarray]: """ Calculate the filter points and frequencies for mel frequency filters. Args: sample_rate: The sample rate of the audio. freq_min: The minimum frequency in Hertz. freq_high: The maximum frequency in Hertz. mel_filter_num: The number of mel filters (default is 10). ftt_size: The size of the FFT (default is 1024). Returns: Filter points and corresponding frequencies. Examples: >>> filter_points = get_filter_points(8000, 0, 4000, mel_filter_num=4, ftt_size=512) >>> filter_points[0] array([ 0, 20, 51, 95, 161, 256]) >>> filter_points[1] array([ 0. , 324.46707094, 799.33254207, 1494.30973963, 2511.42581671, 4000. ]) """ # Convert minimum and maximum frequencies to mel scale fmin_mel = freq_to_mel(freq_min) fmax_mel = freq_to_mel(freq_high) logging.info(f"MEL min: {fmin_mel}") logging.info(f"MEL max: {fmax_mel}") # Generate equally spaced mel frequencies mels = np.linspace(fmin_mel, fmax_mel, num=mel_filter_num + 2) # Convert mel frequencies back to Hertz freqs = mel_to_freq(mels) # Calculate filter points as integer values filter_points = np.floor((ftt_size + 1) / sample_rate * freqs).astype(int) return filter_points, freqs def discrete_cosine_transform(dct_filter_num: int, filter_num: int) -> np.ndarray: """ Compute the Discrete Cosine Transform (DCT) basis matrix. Args: dct_filter_num: The number of DCT filters to generate. filter_num: The number of the fbank filters. Returns: The DCT basis matrix. Examples: >>> float(round(discrete_cosine_transform(3, 5)[0][0], 5)) 0.44721 """ basis = np.empty((dct_filter_num, filter_num)) basis[0, :] = 1.0 / np.sqrt(filter_num) samples = np.arange(1, 2 * filter_num, 2) * np.pi / (2.0 * filter_num) for i in range(1, dct_filter_num): basis[i, :] = np.cos(i * samples) * np.sqrt(2.0 / filter_num) return basis def example(wav_file_path: str = "./path-to-file/sample.wav") -> np.ndarray: """ Example function to calculate Mel Frequency Cepstral Coefficients (MFCCs) from an audio file. Args: wav_file_path: The path to the WAV audio file. Returns: np.ndarray: The computed MFCCs for the audio. """ from scipy.io import wavfile # Load the audio from the WAV file sample_rate, audio = wavfile.read(wav_file_path) # Calculate MFCCs return mfcc(audio, sample_rate) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: machine_learning/multilayer_perceptron_classifier.py ================================================ from sklearn.neural_network import MLPClassifier X = [[0.0, 0.0], [1.0, 1.0], [1.0, 0.0], [0.0, 1.0]] y = [0, 1, 0, 0] clf = MLPClassifier( solver="lbfgs", alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1 ) clf.fit(X, y) test = [[0.0, 0.0], [0.0, 1.0], [1.0, 1.0]] Y = clf.predict(test) def wrapper(y): """ >>> [int(x) for x in wrapper(Y)] [0, 0, 1] """ return list(y) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: machine_learning/polynomial_regression.py ================================================ """ Polynomial regression is a type of regression analysis that models the relationship between a predictor x and the response y as an mth-degree polynomial: y = β₀ + β₁x + β₂x² + ... + βₘxᵐ + ε By treating x, x², ..., xᵐ as distinct variables, we see that polynomial regression is a special case of multiple linear regression. Therefore, we can use ordinary least squares (OLS) estimation to estimate the vector of model parameters β = (β₀, β₁, β₂, ..., βₘ) for polynomial regression: β = (XᵀX)⁻¹Xᵀy = X⁺y where X is the design matrix, y is the response vector, and X⁺ denotes the Moore-Penrose pseudoinverse of X. In the case of polynomial regression, the design matrix is |1 x₁ x₁² ⋯ x₁ᵐ| X = |1 x₂ x₂² ⋯ x₂ᵐ| |⋮ ⋮ ⋮ ⋱ ⋮ | |1 xₙ xₙ² ⋯ xₙᵐ| In OLS estimation, inverting XᵀX to compute X⁺ can be very numerically unstable. This implementation sidesteps this need to invert XᵀX by computing X⁺ using singular value decomposition (SVD): β = VΣ⁺Uᵀy where UΣVᵀ is an SVD of X. References: - https://en.wikipedia.org/wiki/Polynomial_regression - https://en.wikipedia.org/wiki/Moore%E2%80%93Penrose_inverse - https://en.wikipedia.org/wiki/Numerical_methods_for_linear_least_squares - https://en.wikipedia.org/wiki/Singular_value_decomposition """ import matplotlib.pyplot as plt import numpy as np class PolynomialRegression: __slots__ = "degree", "params" def __init__(self, degree: int) -> None: """ @raises ValueError: if the polynomial degree is negative """ if degree < 0: raise ValueError("Polynomial degree must be non-negative") self.degree = degree self.params = None @staticmethod def _design_matrix(data: np.ndarray, degree: int) -> np.ndarray: """ Constructs a polynomial regression design matrix for the given input data. For input data x = (x₁, x₂, ..., xₙ) and polynomial degree m, the design matrix is the Vandermonde matrix |1 x₁ x₁² ⋯ x₁ᵐ| X = |1 x₂ x₂² ⋯ x₂ᵐ| |⋮ ⋮ ⋮ ⋱ ⋮ | |1 xₙ xₙ² ⋯ xₙᵐ| Reference: https://en.wikipedia.org/wiki/Vandermonde_matrix @param data: the input predictor values x, either for model fitting or for prediction @param degree: the polynomial degree m @returns: the Vandermonde matrix X (see above) @raises ValueError: if input data is not N x 1 >>> x = np.array([0, 1, 2]) >>> PolynomialRegression._design_matrix(x, degree=0) array([[1], [1], [1]]) >>> PolynomialRegression._design_matrix(x, degree=1) array([[1, 0], [1, 1], [1, 2]]) >>> PolynomialRegression._design_matrix(x, degree=2) array([[1, 0, 0], [1, 1, 1], [1, 2, 4]]) >>> PolynomialRegression._design_matrix(x, degree=3) array([[1, 0, 0, 0], [1, 1, 1, 1], [1, 2, 4, 8]]) >>> PolynomialRegression._design_matrix(np.array([[0, 0], [0 , 0]]), degree=3) Traceback (most recent call last): ... ValueError: Data must have dimensions N x 1 """ _rows, *remaining = data.shape if remaining: raise ValueError("Data must have dimensions N x 1") return np.vander(data, N=degree + 1, increasing=True) def fit(self, x_train: np.ndarray, y_train: np.ndarray) -> None: """ Computes the polynomial regression model parameters using ordinary least squares (OLS) estimation: β = (XᵀX)⁻¹Xᵀy = X⁺y where X⁺ denotes the Moore-Penrose pseudoinverse of the design matrix X. This function computes X⁺ using singular value decomposition (SVD). References: - https://en.wikipedia.org/wiki/Moore%E2%80%93Penrose_inverse - https://en.wikipedia.org/wiki/Singular_value_decomposition - https://en.wikipedia.org/wiki/Multicollinearity @param x_train: the predictor values x for model fitting @param y_train: the response values y for model fitting @raises ArithmeticError: if X isn't full rank, then XᵀX is singular and β doesn't exist >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) >>> y = x**3 - 2 * x**2 + 3 * x - 5 >>> poly_reg = PolynomialRegression(degree=3) >>> poly_reg.fit(x, y) >>> poly_reg.params array([-5., 3., -2., 1.]) >>> poly_reg = PolynomialRegression(degree=20) >>> poly_reg.fit(x, y) Traceback (most recent call last): ... ArithmeticError: Design matrix is not full rank, can't compute coefficients Make sure errors don't grow too large: >>> coefs = np.array([-250, 50, -2, 36, 20, -12, 10, 2, -1, -15, 1]) >>> y = PolynomialRegression._design_matrix(x, len(coefs) - 1) @ coefs >>> poly_reg = PolynomialRegression(degree=len(coefs) - 1) >>> poly_reg.fit(x, y) >>> np.allclose(poly_reg.params, coefs, atol=10e-3) True """ X = PolynomialRegression._design_matrix(x_train, self.degree) # noqa: N806 _, cols = X.shape if np.linalg.matrix_rank(X) < cols: raise ArithmeticError( "Design matrix is not full rank, can't compute coefficients" ) # np.linalg.pinv() computes the Moore-Penrose pseudoinverse using SVD self.params = np.linalg.pinv(X) @ y_train def predict(self, data: np.ndarray) -> np.ndarray: """ Computes the predicted response values y for the given input data by constructing the design matrix X and evaluating y = Xβ. @param data: the predictor values x for prediction @returns: the predicted response values y = Xβ @raises ArithmeticError: if this function is called before the model parameters are fit >>> x = np.array([0, 1, 2, 3, 4]) >>> y = x**3 - 2 * x**2 + 3 * x - 5 >>> poly_reg = PolynomialRegression(degree=3) >>> poly_reg.fit(x, y) >>> poly_reg.predict(np.array([-1])) array([-11.]) >>> poly_reg.predict(np.array([-2])) array([-27.]) >>> poly_reg.predict(np.array([6])) array([157.]) >>> PolynomialRegression(degree=3).predict(x) Traceback (most recent call last): ... ArithmeticError: Predictor hasn't been fit yet """ if self.params is None: raise ArithmeticError("Predictor hasn't been fit yet") return PolynomialRegression._design_matrix(data, self.degree) @ self.params def main() -> None: """ Fit a polynomial regression model to predict fuel efficiency using seaborn's mpg dataset >>> pass # Placeholder, function is only for demo purposes """ import seaborn as sns mpg_data = sns.load_dataset("mpg") poly_reg = PolynomialRegression(degree=2) poly_reg.fit(mpg_data.weight, mpg_data.mpg) weight_sorted = np.sort(mpg_data.weight) predictions = poly_reg.predict(weight_sorted) plt.scatter(mpg_data.weight, mpg_data.mpg, color="gray", alpha=0.5) plt.plot(weight_sorted, predictions, color="red", linewidth=3) plt.title("Predicting Fuel Efficiency Using Polynomial Regression") plt.xlabel("Weight (lbs)") plt.ylabel("Fuel Efficiency (mpg)") plt.show() if __name__ == "__main__": import doctest doctest.testmod() main() ================================================ FILE: machine_learning/principle_component_analysis.py ================================================ """ Principal Component Analysis (PCA) is a dimensionality reduction technique used in machine learning. It transforms high-dimensional data into a lower-dimensional representation while retaining as much variance as possible. This implementation follows best practices, including: - Standardizing the dataset. - Computing principal components using Singular Value Decomposition (SVD). - Returning transformed data and explained variance ratio. """ import doctest import numpy as np from sklearn.datasets import load_iris from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler def collect_dataset() -> tuple[np.ndarray, np.ndarray]: """ Collects the dataset (Iris dataset) and returns feature matrix and target values. :return: Tuple containing feature matrix (X) and target labels (y) Example: >>> X, y = collect_dataset() >>> X.shape (150, 4) >>> y.shape (150,) """ data = load_iris() return np.array(data.data), np.array(data.target) def apply_pca(data_x: np.ndarray, n_components: int) -> tuple[np.ndarray, np.ndarray]: """ Applies Principal Component Analysis (PCA) to reduce dimensionality. :param data_x: Original dataset (features) :param n_components: Number of principal components to retain :return: Tuple containing transformed dataset and explained variance ratio Example: >>> X, _ = collect_dataset() >>> transformed_X, variance = apply_pca(X, 2) >>> transformed_X.shape (150, 2) >>> len(variance) == 2 True """ # Standardizing the dataset scaler = StandardScaler() data_x_scaled = scaler.fit_transform(data_x) # Applying PCA pca = PCA(n_components=n_components) principal_components = pca.fit_transform(data_x_scaled) return principal_components, pca.explained_variance_ratio_ def main() -> None: """ Driver function to execute PCA and display results. """ data_x, _data_y = collect_dataset() # Number of principal components to retain n_components = 2 # Apply PCA transformed_data, variance_ratio = apply_pca(data_x, n_components) print("Transformed Dataset (First 5 rows):") print(transformed_data[:5]) print("\nExplained Variance Ratio:") print(variance_ratio) if __name__ == "__main__": doctest.testmod() main() ================================================ FILE: machine_learning/random_forest_classifier.py.broken.txt ================================================ # Random Forest Classifier Example from matplotlib import pyplot as plt from sklearn.datasets import load_iris from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import plot_confusion_matrix from sklearn.model_selection import train_test_split def main(): """ Random Forest Classifier Example using sklearn function. Iris type dataset is used to demonstrate algorithm. """ # Load Iris dataset iris = load_iris() # Split dataset into train and test data x = iris["data"] # features y = iris["target"] x_train, x_test, y_train, y_test = train_test_split( x, y, test_size=0.3, random_state=1 ) # Random Forest Classifier rand_for = RandomForestClassifier(random_state=42, n_estimators=100) rand_for.fit(x_train, y_train) # Display Confusion Matrix of Classifier plot_confusion_matrix( rand_for, x_test, y_test, display_labels=iris["target_names"], cmap="Blues", normalize="true", ) plt.title("Normalized Confusion Matrix - IRIS Dataset") plt.show() if __name__ == "__main__": main() ================================================ FILE: machine_learning/random_forest_regressor.py.broken.txt ================================================ # Random Forest Regressor Example from sklearn.datasets import load_boston from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_absolute_error, mean_squared_error from sklearn.model_selection import train_test_split def main(): """ Random Forest Regressor Example using sklearn function. Boston house price dataset is used to demonstrate the algorithm. """ # Load Boston house price dataset boston = load_boston() print(boston.keys()) # Split dataset into train and test data x = boston["data"] # features y = boston["target"] x_train, x_test, y_train, y_test = train_test_split( x, y, test_size=0.3, random_state=1 ) # Random Forest Regressor rand_for = RandomForestRegressor(random_state=42, n_estimators=300) rand_for.fit(x_train, y_train) # Predict target for test data predictions = rand_for.predict(x_test) predictions = predictions.reshape(len(predictions), 1) # Error printing print(f"Mean Absolute Error:\t {mean_absolute_error(y_test, predictions)}") print(f"Mean Square Error :\t {mean_squared_error(y_test, predictions)}") if __name__ == "__main__": main() ================================================ FILE: machine_learning/scoring_functions.py ================================================ import numpy as np """ Here I implemented the scoring functions. MAE, MSE, RMSE, RMSLE are included. Those are used for calculating differences between predicted values and actual values. Metrics are slightly differentiated. Sometimes squared, rooted, even log is used. Using log and roots can be perceived as tools for penalizing big errors. However, using appropriate metrics depends on the situations, and types of data """ # Mean Absolute Error def mae(predict, actual): """ Examples(rounded for precision): >>> actual = [1,2,3];predict = [1,4,3] >>> float(np.around(mae(predict,actual),decimals = 2)) 0.67 >>> actual = [1,1,1];predict = [1,1,1] >>> float(mae(predict,actual)) 0.0 """ predict = np.array(predict) actual = np.array(actual) difference = abs(predict - actual) score = difference.mean() return score # Mean Squared Error def mse(predict, actual): """ Examples(rounded for precision): >>> actual = [1,2,3];predict = [1,4,3] >>> float(np.around(mse(predict,actual),decimals = 2)) 1.33 >>> actual = [1,1,1];predict = [1,1,1] >>> float(mse(predict,actual)) 0.0 """ predict = np.array(predict) actual = np.array(actual) difference = predict - actual square_diff = np.square(difference) score = square_diff.mean() return score # Root Mean Squared Error def rmse(predict, actual): """ Examples(rounded for precision): >>> actual = [1,2,3];predict = [1,4,3] >>> float(np.around(rmse(predict,actual),decimals = 2)) 1.15 >>> actual = [1,1,1];predict = [1,1,1] >>> float(rmse(predict,actual)) 0.0 """ predict = np.array(predict) actual = np.array(actual) difference = predict - actual square_diff = np.square(difference) mean_square_diff = square_diff.mean() score = np.sqrt(mean_square_diff) return score # Root Mean Square Logarithmic Error def rmsle(predict, actual): """ Examples(rounded for precision): >>> float(np.around(rmsle(predict=[10, 2, 30], actual=[10, 10, 30]), decimals=2)) 0.75 >>> float(rmsle(predict=[1, 1, 1], actual=[1, 1, 1])) 0.0 """ predict = np.array(predict) actual = np.array(actual) log_predict = np.log(predict + 1) log_actual = np.log(actual + 1) difference = log_predict - log_actual square_diff = np.square(difference) mean_square_diff = square_diff.mean() score = np.sqrt(mean_square_diff) return score # Mean Bias Deviation def mbd(predict, actual): """ This value is Negative, if the model underpredicts, positive, if it overpredicts. Example(rounded for precision): Here the model overpredicts >>> actual = [1,2,3];predict = [2,3,4] >>> float(np.around(mbd(predict,actual),decimals = 2)) 50.0 Here the model underpredicts >>> actual = [1,2,3];predict = [0,1,1] >>> float(np.around(mbd(predict,actual),decimals = 2)) -66.67 """ predict = np.array(predict) actual = np.array(actual) difference = predict - actual numerator = np.sum(difference) / len(predict) denumerator = np.sum(actual) / len(predict) # print(numerator, denumerator) score = float(numerator) / denumerator * 100 return score def manual_accuracy(predict, actual): return np.mean(np.array(actual) == np.array(predict)) ================================================ FILE: machine_learning/self_organizing_map.py ================================================ """ https://en.wikipedia.org/wiki/Self-organizing_map """ import math class SelfOrganizingMap: def get_winner(self, weights: list[list[float]], sample: list[int]) -> int: """ Compute the winning vector by Euclidean distance >>> SelfOrganizingMap().get_winner([[1, 2, 3], [4, 5, 6]], [1, 2, 3]) 1 """ d0 = 0.0 d1 = 0.0 for i in range(len(sample)): d0 += math.pow((sample[i] - weights[0][i]), 2) d1 += math.pow((sample[i] - weights[1][i]), 2) return 0 if d0 > d1 else 1 return 0 def update( self, weights: list[list[int | float]], sample: list[int], j: int, alpha: float ) -> list[list[int | float]]: """ Update the winning vector. >>> SelfOrganizingMap().update([[1, 2, 3], [4, 5, 6]], [1, 2, 3], 1, 0.1) [[1, 2, 3], [3.7, 4.7, 6]] """ for i in range(len(weights)): weights[j][i] += alpha * (sample[i] - weights[j][i]) return weights # Driver code def main() -> None: # Training Examples ( m, n ) training_samples = [[1, 1, 0, 0], [0, 0, 0, 1], [1, 0, 0, 0], [0, 0, 1, 1]] # weight initialization ( n, C ) weights = [[0.2, 0.6, 0.5, 0.9], [0.8, 0.4, 0.7, 0.3]] # training self_organizing_map = SelfOrganizingMap() epochs = 3 alpha = 0.5 for _ in range(epochs): for j in range(len(training_samples)): # training sample sample = training_samples[j] # Compute the winning vector winner = self_organizing_map.get_winner(weights, sample) # Update the winning vector weights = self_organizing_map.update(weights, sample, winner, alpha) # classify test sample sample = [0, 0, 0, 1] winner = self_organizing_map.get_winner(weights, sample) # results print(f"Clusters that the test sample belongs to : {winner}") print(f"Weights that have been trained : {weights}") # running the main() function if __name__ == "__main__": main() ================================================ FILE: machine_learning/sequential_minimum_optimization.py ================================================ """ Sequential minimal optimization (SMO) for support vector machines (SVM) Sequential minimal optimization (SMO) is an algorithm for solving the quadratic programming (QP) problem that arises during the training of SVMs. It was invented by John Platt in 1998. Input: 0: type: numpy.ndarray. 1: first column of ndarray must be tags of samples, must be 1 or -1. 2: rows of ndarray represent samples. Usage: Command: python3 sequential_minimum_optimization.py Code: from sequential_minimum_optimization import SmoSVM, Kernel kernel = Kernel(kernel='poly', degree=3., coef0=1., gamma=0.5) init_alphas = np.zeros(train.shape[0]) SVM = SmoSVM(train=train, alpha_list=init_alphas, kernel_func=kernel, cost=0.4, b=0.0, tolerance=0.001) SVM.fit() predict = SVM.predict(test_samples) Reference: https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/smo-book.pdf https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr-98-14.pdf """ import os import sys import urllib.request import numpy as np import pandas as pd from matplotlib import pyplot as plt from sklearn.datasets import make_blobs, make_circles from sklearn.preprocessing import StandardScaler CANCER_DATASET_URL = ( "https://archive.ics.uci.edu/ml/machine-learning-databases/" "breast-cancer-wisconsin/wdbc.data" ) class SmoSVM: def __init__( self, train, kernel_func, alpha_list=None, cost=0.4, b=0.0, tolerance=0.001, auto_norm=True, ): self._init = True self._auto_norm = auto_norm self._c = np.float64(cost) self._b = np.float64(b) self._tol = np.float64(tolerance) if tolerance > 0.0001 else np.float64(0.001) self.tags = train[:, 0] self.samples = self._norm(train[:, 1:]) if self._auto_norm else train[:, 1:] self.alphas = alpha_list if alpha_list is not None else np.zeros(train.shape[0]) self.Kernel = kernel_func self._eps = 0.001 self._all_samples = list(range(self.length)) self._K_matrix = self._calculate_k_matrix() self._error = np.zeros(self.length) self._unbound = [] self.choose_alpha = self._choose_alphas() # Calculate alphas using SMO algorithm def fit(self): k = self._k state = None while True: # 1: Find alpha1, alpha2 try: i1, i2 = self.choose_alpha.send(state) state = None except StopIteration: print("Optimization done!\nEvery sample satisfy the KKT condition!") break # 2: calculate new alpha2 and new alpha1 y1, y2 = self.tags[i1], self.tags[i2] a1, a2 = self.alphas[i1].copy(), self.alphas[i2].copy() e1, e2 = self._e(i1), self._e(i2) args = (i1, i2, a1, a2, e1, e2, y1, y2) a1_new, a2_new = self._get_new_alpha(*args) if not a1_new and not a2_new: state = False continue self.alphas[i1], self.alphas[i2] = a1_new, a2_new # 3: update threshold(b) b1_new = np.float64( -e1 - y1 * k(i1, i1) * (a1_new - a1) - y2 * k(i2, i1) * (a2_new - a2) + self._b ) b2_new = np.float64( -e2 - y2 * k(i2, i2) * (a2_new - a2) - y1 * k(i1, i2) * (a1_new - a1) + self._b ) if 0.0 < a1_new < self._c: b = b1_new if 0.0 < a2_new < self._c: b = b2_new if not (np.float64(0) < a2_new < self._c) and not ( np.float64(0) < a1_new < self._c ): b = (b1_new + b2_new) / 2.0 b_old = self._b self._b = b # 4: update error, here we only calculate the error for non-bound samples self._unbound = [i for i in self._all_samples if self._is_unbound(i)] for s in self.unbound: if s in (i1, i2): continue self._error[s] += ( y1 * (a1_new - a1) * k(i1, s) + y2 * (a2_new - a2) * k(i2, s) + (self._b - b_old) ) # if i1 or i2 is non-bound, update their error value to zero if self._is_unbound(i1): self._error[i1] = 0 if self._is_unbound(i2): self._error[i2] = 0 # Predict test samples def predict(self, test_samples, classify=True): if test_samples.shape[1] > self.samples.shape[1]: raise ValueError( "Test samples' feature length does not equal to that of train samples" ) if self._auto_norm: test_samples = self._norm(test_samples) results = [] for test_sample in test_samples: result = self._predict(test_sample) if classify: results.append(1 if result > 0 else -1) else: results.append(result) return np.array(results) # Check if alpha violates the KKT condition def _check_obey_kkt(self, index): alphas = self.alphas tol = self._tol r = self._e(index) * self.tags[index] c = self._c return (r < -tol and alphas[index] < c) or (r > tol and alphas[index] > 0.0) # Get value calculated from kernel function def _k(self, i1, i2): # for test samples, use kernel function if isinstance(i2, np.ndarray): return self.Kernel(self.samples[i1], i2) # for training samples, kernel values have been saved in matrix else: return self._K_matrix[i1, i2] # Get error for sample def _e(self, index): """ Two cases: 1: Sample[index] is non-bound, fetch error from list: _error 2: sample[index] is bound, use predicted value minus true value: g(xi) - yi """ # get from error data if self._is_unbound(index): return self._error[index] # get by g(xi) - yi else: gx = np.dot(self.alphas * self.tags, self._K_matrix[:, index]) + self._b yi = self.tags[index] return gx - yi # Calculate kernel matrix of all possible i1, i2, saving time def _calculate_k_matrix(self): k_matrix = np.zeros([self.length, self.length]) for i in self._all_samples: for j in self._all_samples: k_matrix[i, j] = np.float64( self.Kernel(self.samples[i, :], self.samples[j, :]) ) return k_matrix # Predict tag for test sample def _predict(self, sample): k = self._k predicted_value = ( np.sum( [ self.alphas[i1] * self.tags[i1] * k(i1, sample) for i1 in self._all_samples ] ) + self._b ) return predicted_value # Choose alpha1 and alpha2 def _choose_alphas(self): loci = yield from self._choose_a1() if not loci: return None return loci def _choose_a1(self): """ Choose first alpha Steps: 1: First loop over all samples 2: Second loop over all non-bound samples until no non-bound samples violate the KKT condition. 3: Repeat these two processes until no samples violate the KKT condition after the first loop. """ while True: all_not_obey = True # all sample print("Scanning all samples!") for i1 in [i for i in self._all_samples if self._check_obey_kkt(i)]: all_not_obey = False yield from self._choose_a2(i1) # non-bound sample print("Scanning non-bound samples!") while True: not_obey = True for i1 in [ i for i in self._all_samples if self._check_obey_kkt(i) and self._is_unbound(i) ]: not_obey = False yield from self._choose_a2(i1) if not_obey: print("All non-bound samples satisfy the KKT condition!") break if all_not_obey: print("All samples satisfy the KKT condition!") break return False def _choose_a2(self, i1): """ Choose the second alpha using a heuristic algorithm Steps: 1: Choose alpha2 that maximizes the step size (|E1 - E2|). 2: Start in a random point, loop over all non-bound samples till alpha1 and alpha2 are optimized. 3: Start in a random point, loop over all samples till alpha1 and alpha2 are optimized. """ self._unbound = [i for i in self._all_samples if self._is_unbound(i)] if len(self.unbound) > 0: tmp_error = self._error.copy().tolist() tmp_error_dict = { index: value for index, value in enumerate(tmp_error) if self._is_unbound(index) } if self._e(i1) >= 0: i2 = min(tmp_error_dict, key=lambda index: tmp_error_dict[index]) else: i2 = max(tmp_error_dict, key=lambda index: tmp_error_dict[index]) cmd = yield i1, i2 if cmd is None: return rng = np.random.default_rng() for i2 in np.roll(self.unbound, rng.choice(self.length)): cmd = yield i1, i2 if cmd is None: return for i2 in np.roll(self._all_samples, rng.choice(self.length)): cmd = yield i1, i2 if cmd is None: return # Get the new alpha2 and new alpha1 def _get_new_alpha(self, i1, i2, a1, a2, e1, e2, y1, y2): k = self._k if i1 == i2: return None, None # calculate L and H which bound the new alpha2 s = y1 * y2 if s == -1: l, h = max(0.0, a2 - a1), min(self._c, self._c + a2 - a1) # noqa: E741 else: l, h = max(0.0, a2 + a1 - self._c), min(self._c, a2 + a1) # noqa: E741 if l == h: return None, None # calculate eta k11 = k(i1, i1) k22 = k(i2, i2) k12 = k(i1, i2) # select the new alpha2 which could achieve the minimal objectives if (eta := k11 + k22 - 2.0 * k12) > 0.0: a2_new_unc = a2 + (y2 * (e1 - e2)) / eta # a2_new has a boundary if a2_new_unc >= h: a2_new = h elif a2_new_unc <= l: a2_new = l else: a2_new = a2_new_unc else: b = self._b l1 = a1 + s * (a2 - l) h1 = a1 + s * (a2 - h) # Method 1 f1 = y1 * (e1 + b) - a1 * k(i1, i1) - s * a2 * k(i1, i2) f2 = y2 * (e2 + b) - a2 * k(i2, i2) - s * a1 * k(i1, i2) ol = ( l1 * f1 + l * f2 + 1 / 2 * l1**2 * k(i1, i1) + 1 / 2 * l**2 * k(i2, i2) + s * l * l1 * k(i1, i2) ) oh = ( h1 * f1 + h * f2 + 1 / 2 * h1**2 * k(i1, i1) + 1 / 2 * h**2 * k(i2, i2) + s * h * h1 * k(i1, i2) ) """ Method 2: Use objective function to check which alpha2_new could achieve the minimal objectives """ if ol < (oh - self._eps): a2_new = l elif ol > oh + self._eps: a2_new = h else: a2_new = a2 # a1_new has a boundary too a1_new = a1 + s * (a2 - a2_new) if a1_new < 0: a2_new += s * a1_new a1_new = 0 if a1_new > self._c: a2_new += s * (a1_new - self._c) a1_new = self._c return a1_new, a2_new # Normalize data using min-max method def _norm(self, data): if self._init: self._min = np.min(data, axis=0) self._max = np.max(data, axis=0) self._init = False return (data - self._min) / (self._max - self._min) else: return (data - self._min) / (self._max - self._min) def _is_unbound(self, index): return bool(0.0 < self.alphas[index] < self._c) def _is_support(self, index): return bool(self.alphas[index] > 0) @property def unbound(self): return self._unbound @property def support(self): return [i for i in range(self.length) if self._is_support(i)] @property def length(self): return self.samples.shape[0] class Kernel: def __init__(self, kernel, degree=1.0, coef0=0.0, gamma=1.0): self.degree = np.float64(degree) self.coef0 = np.float64(coef0) self.gamma = np.float64(gamma) self._kernel_name = kernel self._kernel = self._get_kernel(kernel_name=kernel) self._check() def _polynomial(self, v1, v2): return (self.gamma * np.inner(v1, v2) + self.coef0) ** self.degree def _linear(self, v1, v2): return np.inner(v1, v2) + self.coef0 def _rbf(self, v1, v2): return np.exp(-1 * (self.gamma * np.linalg.norm(v1 - v2) ** 2)) def _check(self): if self._kernel == self._rbf and self.gamma < 0: raise ValueError("gamma value must be non-negative") def _get_kernel(self, kernel_name): maps = {"linear": self._linear, "poly": self._polynomial, "rbf": self._rbf} return maps[kernel_name] def __call__(self, v1, v2): return self._kernel(v1, v2) def __repr__(self): return self._kernel_name def count_time(func): def call_func(*args, **kwargs): import time start_time = time.time() func(*args, **kwargs) end_time = time.time() print(f"SMO algorithm cost {end_time - start_time} seconds") return call_func @count_time def test_cancer_data(): print("Hello!\nStart test SVM using the SMO algorithm!") # 0: download dataset and load into pandas' dataframe if not os.path.exists(r"cancer_data.csv"): request = urllib.request.Request( # noqa: S310 CANCER_DATASET_URL, headers={"User-Agent": "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)"}, ) response = urllib.request.urlopen(request) # noqa: S310 content = response.read().decode("utf-8") with open(r"cancer_data.csv", "w") as f: f.write(content) data = pd.read_csv( "cancer_data.csv", header=None, dtype={0: str}, # Assuming the first column contains string data ) # 1: pre-processing data del data[data.columns.tolist()[0]] data = data.dropna(axis=0) data = data.replace({"M": np.float64(1), "B": np.float64(-1)}) samples = np.array(data)[:, :] # 2: dividing data into train_data data and test_data data train_data, test_data = samples[:328, :], samples[328:, :] test_tags, test_samples = test_data[:, 0], test_data[:, 1:] # 3: choose kernel function, and set initial alphas to zero (optional) my_kernel = Kernel(kernel="rbf", degree=5, coef0=1, gamma=0.5) al = np.zeros(train_data.shape[0]) # 4: calculating best alphas using SMO algorithm and predict test_data samples mysvm = SmoSVM( train=train_data, kernel_func=my_kernel, alpha_list=al, cost=0.4, b=0.0, tolerance=0.001, ) mysvm.fit() predict = mysvm.predict(test_samples) # 5: check accuracy score = 0 test_num = test_tags.shape[0] for i in range(test_tags.shape[0]): if test_tags[i] == predict[i]: score += 1 print(f"\nAll: {test_num}\nCorrect: {score}\nIncorrect: {test_num - score}") print(f"Rough Accuracy: {score / test_tags.shape[0]}") def test_demonstration(): # change stdout print("\nStarting plot, please wait!") sys.stdout = open(os.devnull, "w") ax1 = plt.subplot2grid((2, 2), (0, 0)) ax2 = plt.subplot2grid((2, 2), (0, 1)) ax3 = plt.subplot2grid((2, 2), (1, 0)) ax4 = plt.subplot2grid((2, 2), (1, 1)) ax1.set_title("Linear SVM, cost = 0.1") test_linear_kernel(ax1, cost=0.1) ax2.set_title("Linear SVM, cost = 500") test_linear_kernel(ax2, cost=500) ax3.set_title("RBF kernel SVM, cost = 0.1") test_rbf_kernel(ax3, cost=0.1) ax4.set_title("RBF kernel SVM, cost = 500") test_rbf_kernel(ax4, cost=500) sys.stdout = sys.__stdout__ print("Plot done!") def test_linear_kernel(ax, cost): train_x, train_y = make_blobs( n_samples=500, centers=2, n_features=2, random_state=1 ) train_y[train_y == 0] = -1 scaler = StandardScaler() train_x_scaled = scaler.fit_transform(train_x, train_y) train_data = np.hstack((train_y.reshape(500, 1), train_x_scaled)) my_kernel = Kernel(kernel="linear", degree=5, coef0=1, gamma=0.5) mysvm = SmoSVM( train=train_data, kernel_func=my_kernel, cost=cost, tolerance=0.001, auto_norm=False, ) mysvm.fit() plot_partition_boundary(mysvm, train_data, ax=ax) def test_rbf_kernel(ax, cost): train_x, train_y = make_circles( n_samples=500, noise=0.1, factor=0.1, random_state=1 ) train_y[train_y == 0] = -1 scaler = StandardScaler() train_x_scaled = scaler.fit_transform(train_x, train_y) train_data = np.hstack((train_y.reshape(500, 1), train_x_scaled)) my_kernel = Kernel(kernel="rbf", degree=5, coef0=1, gamma=0.5) mysvm = SmoSVM( train=train_data, kernel_func=my_kernel, cost=cost, tolerance=0.001, auto_norm=False, ) mysvm.fit() plot_partition_boundary(mysvm, train_data, ax=ax) def plot_partition_boundary( model, train_data, ax, resolution=100, colors=("b", "k", "r") ): """ We cannot get the optimal w of our kernel SVM model, which is different from a linear SVM. For this reason, we generate randomly distributed points with high density, and predicted values of these points are calculated using our trained model. Then we could use this predicted values to draw contour map, and this contour map represents the SVM's partition boundary. """ train_data_x = train_data[:, 1] train_data_y = train_data[:, 2] train_data_tags = train_data[:, 0] xrange = np.linspace(train_data_x.min(), train_data_x.max(), resolution) yrange = np.linspace(train_data_y.min(), train_data_y.max(), resolution) test_samples = np.array([(x, y) for x in xrange for y in yrange]).reshape( resolution * resolution, 2 ) test_tags = model.predict(test_samples, classify=False) grid = test_tags.reshape((len(xrange), len(yrange))) # Plot contour map which represents the partition boundary ax.contour( xrange, yrange, np.asmatrix(grid).T, levels=(-1, 0, 1), linestyles=("--", "-", "--"), linewidths=(1, 1, 1), colors=colors, ) # Plot all train samples ax.scatter( train_data_x, train_data_y, c=train_data_tags, cmap=plt.cm.Dark2, lw=0, alpha=0.5, ) # Plot support vectors support = model.support ax.scatter( train_data_x[support], train_data_y[support], c=train_data_tags[support], cmap=plt.cm.Dark2, ) if __name__ == "__main__": test_cancer_data() test_demonstration() plt.show() ================================================ FILE: machine_learning/similarity_search.py ================================================ """ Similarity Search : https://en.wikipedia.org/wiki/Similarity_search Similarity search is a search algorithm for finding the nearest vector from vectors, used in natural language processing. In this algorithm, it calculates distance with euclidean distance and returns a list containing two data for each vector: 1. the nearest vector 2. distance between the vector and the nearest vector (float) """ from __future__ import annotations import math import numpy as np from numpy.linalg import norm def euclidean(input_a: np.ndarray, input_b: np.ndarray) -> float: """ Calculates euclidean distance between two data. :param input_a: ndarray of first vector. :param input_b: ndarray of second vector. :return: Euclidean distance of input_a and input_b. By using math.sqrt(), result will be float. >>> euclidean(np.array([0]), np.array([1])) 1.0 >>> euclidean(np.array([0, 1]), np.array([1, 1])) 1.0 >>> euclidean(np.array([0, 0, 0]), np.array([0, 0, 1])) 1.0 """ return math.sqrt(sum(pow(a - b, 2) for a, b in zip(input_a, input_b))) def similarity_search( dataset: np.ndarray, value_array: np.ndarray ) -> list[list[list[float] | float]]: """ :param dataset: Set containing the vectors. Should be ndarray. :param value_array: vector/vectors we want to know the nearest vector from dataset. :return: Result will be a list containing 1. the nearest vector 2. distance from the vector >>> dataset = np.array([[0], [1], [2]]) >>> value_array = np.array([[0]]) >>> similarity_search(dataset, value_array) [[[0], 0.0]] >>> dataset = np.array([[0, 0], [1, 1], [2, 2]]) >>> value_array = np.array([[0, 1]]) >>> similarity_search(dataset, value_array) [[[0, 0], 1.0]] >>> dataset = np.array([[0, 0, 0], [1, 1, 1], [2, 2, 2]]) >>> value_array = np.array([[0, 0, 1]]) >>> similarity_search(dataset, value_array) [[[0, 0, 0], 1.0]] >>> dataset = np.array([[0, 0, 0], [1, 1, 1], [2, 2, 2]]) >>> value_array = np.array([[0, 0, 0], [0, 0, 1]]) >>> similarity_search(dataset, value_array) [[[0, 0, 0], 0.0], [[0, 0, 0], 1.0]] These are the errors that might occur: 1. If dimensions are different. For example, dataset has 2d array and value_array has 1d array: >>> dataset = np.array([[1]]) >>> value_array = np.array([1]) >>> similarity_search(dataset, value_array) Traceback (most recent call last): ... ValueError: Wrong input data's dimensions... dataset : 2, value_array : 1 2. If data's shapes are different. For example, dataset has shape of (3, 2) and value_array has (2, 3). We are expecting same shapes of two arrays, so it is wrong. >>> dataset = np.array([[0, 0], [1, 1], [2, 2]]) >>> value_array = np.array([[0, 0, 0], [0, 0, 1]]) >>> similarity_search(dataset, value_array) Traceback (most recent call last): ... ValueError: Wrong input data's shape... dataset : 2, value_array : 3 3. If data types are different. When trying to compare, we are expecting same types so they should be same. If not, it'll come up with errors. >>> dataset = np.array([[0, 0], [1, 1], [2, 2]], dtype=np.float32) >>> value_array = np.array([[0, 0], [0, 1]], dtype=np.int32) >>> similarity_search(dataset, value_array) # doctest: +NORMALIZE_WHITESPACE Traceback (most recent call last): ... TypeError: Input data have different datatype... dataset : float32, value_array : int32 """ if dataset.ndim != value_array.ndim: msg = ( "Wrong input data's dimensions... " f"dataset : {dataset.ndim}, value_array : {value_array.ndim}" ) raise ValueError(msg) try: if dataset.shape[1] != value_array.shape[1]: msg = ( "Wrong input data's shape... " f"dataset : {dataset.shape[1]}, value_array : {value_array.shape[1]}" ) raise ValueError(msg) except IndexError: if dataset.ndim != value_array.ndim: raise TypeError("Wrong shape") if dataset.dtype != value_array.dtype: msg = ( "Input data have different datatype... " f"dataset : {dataset.dtype}, value_array : {value_array.dtype}" ) raise TypeError(msg) answer = [] for value in value_array: dist = euclidean(value, dataset[0]) vector = dataset[0].tolist() for dataset_value in dataset[1:]: temp_dist = euclidean(value, dataset_value) if dist > temp_dist: dist = temp_dist vector = dataset_value.tolist() answer.append([vector, dist]) return answer def cosine_similarity(input_a: np.ndarray, input_b: np.ndarray) -> float: """ Calculates cosine similarity between two data. :param input_a: ndarray of first vector. :param input_b: ndarray of second vector. :return: Cosine similarity of input_a and input_b. By using math.sqrt(), result will be float. >>> cosine_similarity(np.array([1]), np.array([1])) 1.0 >>> cosine_similarity(np.array([1, 2]), np.array([6, 32])) 0.9615239476408232 """ return float(np.dot(input_a, input_b) / (norm(input_a) * norm(input_b))) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: machine_learning/support_vector_machines.py ================================================ import numpy as np from numpy import ndarray from scipy.optimize import Bounds, LinearConstraint, minimize def norm_squared(vector: ndarray) -> float: """ Return the squared second norm of vector norm_squared(v) = sum(x * x for x in v) Args: vector (ndarray): input vector Returns: float: squared second norm of vector >>> int(norm_squared([1, 2])) 5 >>> int(norm_squared(np.asarray([1, 2]))) 5 >>> int(norm_squared([0, 0])) 0 """ return np.dot(vector, vector) class SVC: """ Support Vector Classifier Args: kernel (str): kernel to use. Default: linear Possible choices: - linear regularization: constraint for soft margin (data not linearly separable) Default: unbound >>> SVC(kernel="asdf") Traceback (most recent call last): ... ValueError: Unknown kernel: asdf >>> SVC(kernel="rbf") Traceback (most recent call last): ... ValueError: rbf kernel requires gamma >>> SVC(kernel="rbf", gamma=-1) Traceback (most recent call last): ... ValueError: gamma must be > 0 """ def __init__( self, *, regularization: float = np.inf, kernel: str = "linear", gamma: float = 0.0, ) -> None: self.regularization = regularization self.gamma = gamma if kernel == "linear": self.kernel = self.__linear elif kernel == "rbf": if self.gamma == 0: raise ValueError("rbf kernel requires gamma") if not isinstance(self.gamma, (float, int)): raise ValueError("gamma must be float or int") if not self.gamma > 0: raise ValueError("gamma must be > 0") self.kernel = self.__rbf # in the future, there could be a default value like in sklearn # sklear: def_gamma = 1/(n_features * X.var()) (wiki) # previously it was 1/(n_features) else: msg = f"Unknown kernel: {kernel}" raise ValueError(msg) # kernels def __linear(self, vector1: ndarray, vector2: ndarray) -> float: """Linear kernel (as if no kernel used at all)""" return np.dot(vector1, vector2) def __rbf(self, vector1: ndarray, vector2: ndarray) -> float: """ RBF: Radial Basis Function Kernel Note: for more information see: https://en.wikipedia.org/wiki/Radial_basis_function_kernel Args: vector1 (ndarray): first vector vector2 (ndarray): second vector) Returns: float: exp(-(gamma * norm_squared(vector1 - vector2))) """ return np.exp(-(self.gamma * norm_squared(vector1 - vector2))) def fit(self, observations: list[ndarray], classes: ndarray) -> None: """ Fits the SVC with a set of observations. Args: observations (list[ndarray]): list of observations classes (ndarray): classification of each observation (in {1, -1}) """ self.observations = observations self.classes = classes # using Wolfe's Dual to calculate w. # Primal problem: minimize 1/2*norm_squared(w) # constraint: yn(w . xn + b) >= 1 # # With l a vector # Dual problem: maximize sum_n(ln) - # 1/2 * sum_n(sum_m(ln*lm*yn*ym*xn . xm)) # constraint: self.C >= ln >= 0 # and sum_n(ln*yn) = 0 # Then we get w using w = sum_n(ln*yn*xn) # At the end we can get b ~= mean(yn - w . xn) # # Since we use kernels, we only need l_star to calculate b # and to classify observations (n,) = np.shape(classes) def to_minimize(candidate: ndarray) -> float: """ Opposite of the function to maximize Args: candidate (ndarray): candidate array to test Return: float: Wolfe's Dual result to minimize """ s = 0 (n,) = np.shape(candidate) for i in range(n): for j in range(n): s += ( candidate[i] * candidate[j] * classes[i] * classes[j] * self.kernel(observations[i], observations[j]) ) return 1 / 2 * s - sum(candidate) ly_contraint = LinearConstraint(classes, 0, 0) l_bounds = Bounds(0, self.regularization) l_star = minimize( to_minimize, np.ones(n), bounds=l_bounds, constraints=[ly_contraint] ).x self.optimum = l_star # calculating mean offset of separation plane to points s = 0 for i in range(n): for j in range(n): s += classes[i] - classes[i] * self.optimum[i] * self.kernel( observations[i], observations[j] ) self.offset = s / n def predict(self, observation: ndarray) -> int: """ Get the expected class of an observation Args: observation (Vector): observation Returns: int {1, -1}: expected class >>> xs = [ ... np.asarray([0, 1]), np.asarray([0, 2]), ... np.asarray([1, 1]), np.asarray([1, 2]) ... ] >>> y = np.asarray([1, 1, -1, -1]) >>> s = SVC() >>> s.fit(xs, y) >>> s.predict(np.asarray([0, 1])) 1 >>> s.predict(np.asarray([1, 1])) -1 >>> s.predict(np.asarray([2, 2])) -1 """ s = sum( self.optimum[n] * self.classes[n] * self.kernel(self.observations[n], observation) for n in range(len(self.classes)) ) return 1 if s + self.offset >= 0 else -1 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: machine_learning/t_stochastic_neighbour_embedding.py ================================================ """ t-distributed stochastic neighbor embedding (t-SNE) For more details, see: https://en.wikipedia.org/wiki/T-distributed_stochastic_neighbor_embedding """ import doctest import numpy as np from numpy import ndarray from sklearn.datasets import load_iris def collect_dataset() -> tuple[ndarray, ndarray]: """ Load the Iris dataset and return features and labels. Returns: tuple[ndarray, ndarray]: Feature matrix and target labels. >>> features, targets = collect_dataset() >>> features.shape (150, 4) >>> targets.shape (150,) """ iris_dataset = load_iris() return np.array(iris_dataset.data), np.array(iris_dataset.target) def compute_pairwise_affinities(data_matrix: ndarray, sigma: float = 1.0) -> ndarray: """ Compute high-dimensional affinities (P matrix) using a Gaussian kernel. Args: data_matrix: Input data of shape (n_samples, n_features). sigma: Gaussian kernel bandwidth. Returns: ndarray: Symmetrized probability matrix. >>> x = np.array([[0.0, 0.0], [1.0, 0.0]]) >>> probabilities = compute_pairwise_affinities(x) >>> float(round(probabilities[0, 1], 3)) 0.25 """ n_samples = data_matrix.shape[0] squared_sum = np.sum(np.square(data_matrix), axis=1) squared_distance = np.add( np.add(-2 * np.dot(data_matrix, data_matrix.T), squared_sum).T, squared_sum ) affinity_matrix = np.exp(-squared_distance / (2 * sigma**2)) np.fill_diagonal(affinity_matrix, 0) affinity_matrix /= np.sum(affinity_matrix) return (affinity_matrix + affinity_matrix.T) / (2 * n_samples) def compute_low_dim_affinities(embedding_matrix: ndarray) -> tuple[ndarray, ndarray]: """ Compute low-dimensional affinities (Q matrix) using a Student-t distribution. Args: embedding_matrix: Low-dimensional embedding of shape (n_samples, n_components). Returns: tuple[ndarray, ndarray]: (Q probability matrix, numerator matrix). >>> y = np.array([[0.0, 0.0], [1.0, 0.0]]) >>> q_matrix, numerators = compute_low_dim_affinities(y) >>> q_matrix.shape (2, 2) """ squared_sum = np.sum(np.square(embedding_matrix), axis=1) numerator_matrix = 1 / ( 1 + np.add( np.add(-2 * np.dot(embedding_matrix, embedding_matrix.T), squared_sum).T, squared_sum, ) ) np.fill_diagonal(numerator_matrix, 0) q_matrix = numerator_matrix / np.sum(numerator_matrix) return q_matrix, numerator_matrix def apply_tsne( data_matrix: ndarray, n_components: int = 2, learning_rate: float = 200.0, n_iter: int = 500, ) -> ndarray: """ Apply t-SNE for dimensionality reduction. Args: data_matrix: Original dataset (features). n_components: Target dimension (2D or 3D). learning_rate: Step size for gradient descent. n_iter: Number of iterations. Returns: ndarray: Low-dimensional embedding of the data. >>> features, _ = collect_dataset() >>> embedding = apply_tsne(features, n_components=2, n_iter=50) >>> embedding.shape (150, 2) """ if n_components < 1 or n_iter < 1: raise ValueError("n_components and n_iter must be >= 1") n_samples = data_matrix.shape[0] rng = np.random.default_rng() embedding = rng.standard_normal((n_samples, n_components)) * 1e-4 high_dim_affinities = compute_pairwise_affinities(data_matrix) high_dim_affinities = np.maximum(high_dim_affinities, 1e-12) embedding_increment = np.zeros_like(embedding) momentum = 0.5 for iteration in range(n_iter): low_dim_affinities, numerator_matrix = compute_low_dim_affinities(embedding) low_dim_affinities = np.maximum(low_dim_affinities, 1e-12) affinity_diff = high_dim_affinities - low_dim_affinities gradient = 4 * ( np.dot((affinity_diff * numerator_matrix), embedding) - np.multiply( np.sum(affinity_diff * numerator_matrix, axis=1)[:, np.newaxis], embedding, ) ) embedding_increment = momentum * embedding_increment - learning_rate * gradient embedding += embedding_increment if iteration == int(n_iter / 4): momentum = 0.8 return embedding def main() -> None: """ Run t-SNE on the Iris dataset and display the first 5 embeddings. >>> main() # doctest: +ELLIPSIS t-SNE embedding (first 5 points): [[... """ features, _labels = collect_dataset() embedding = apply_tsne(features, n_components=2, n_iter=300) if not isinstance(embedding, np.ndarray): raise TypeError("t-SNE embedding must be an ndarray") print("t-SNE embedding (first 5 points):") print(embedding[:5]) # Optional visualization (Ruff/mypy compliant) # import matplotlib.pyplot as plt # plt.scatter(embedding[:, 0], embedding[:, 1], c=labels, cmap="viridis") # plt.title("t-SNE Visualization of the Iris Dataset") # plt.xlabel("Dimension 1") # plt.ylabel("Dimension 2") # plt.show() if __name__ == "__main__": doctest.testmod() main() ================================================ FILE: machine_learning/word_frequency_functions.py ================================================ import string from math import log10 """ tf-idf Wikipedia: https://en.wikipedia.org/wiki/Tf%E2%80%93idf tf-idf and other word frequency algorithms are often used as a weighting factor in information retrieval and text mining. 83% of text-based recommender systems use tf-idf for term weighting. In Layman's terms, tf-idf is a statistic intended to reflect how important a word is to a document in a corpus (a collection of documents) Here I've implemented several word frequency algorithms that are commonly used in information retrieval: Term Frequency, Document Frequency, and TF-IDF (Term-Frequency*Inverse-Document-Frequency) are included. Term Frequency is a statistical function that returns a number representing how frequently an expression occurs in a document. This indicates how significant a particular term is in a given document. Document Frequency is a statistical function that returns an integer representing the number of documents in a corpus that a term occurs in (where the max number returned would be the number of documents in the corpus). Inverse Document Frequency is mathematically written as log10(N/df), where N is the number of documents in your corpus and df is the Document Frequency. If df is 0, a ZeroDivisionError will be thrown. Term-Frequency*Inverse-Document-Frequency is a measure of the originality of a term. It is mathematically written as tf*log10(N/df). It compares the number of times a term appears in a document with the number of documents the term appears in. If df is 0, a ZeroDivisionError will be thrown. """ def term_frequency(term: str, document: str) -> int: """ Return the number of times a term occurs within a given document. @params: term, the term to search a document for, and document, the document to search within @returns: an integer representing the number of times a term is found within the document @examples: >>> term_frequency("to", "To be, or not to be") 2 """ # strip all punctuation and newlines and replace it with '' document_without_punctuation = document.translate( str.maketrans("", "", string.punctuation) ).replace("\n", "") tokenize_document = document_without_punctuation.split(" ") # word tokenization return len([word for word in tokenize_document if word.lower() == term.lower()]) def document_frequency(term: str, corpus: str) -> tuple[int, int]: """ Calculate the number of documents in a corpus that contain a given term @params : term, the term to search each document for, and corpus, a collection of documents. Each document should be separated by a newline. @returns : the number of documents in the corpus that contain the term you are searching for and the number of documents in the corpus @examples : >>> document_frequency("first", "This is the first document in the corpus.\\nThIs\ is the second document in the corpus.\\nTHIS is \ the third document in the corpus.") (1, 3) """ corpus_without_punctuation = corpus.lower().translate( str.maketrans("", "", string.punctuation) ) # strip all punctuation and replace it with '' docs = corpus_without_punctuation.split("\n") term = term.lower() return (len([doc for doc in docs if term in doc]), len(docs)) def inverse_document_frequency(df: int, n: int, smoothing=False) -> float: """ Return an integer denoting the importance of a word. This measure of importance is calculated by log10(N/df), where N is the number of documents and df is the Document Frequency. @params : df, the Document Frequency, N, the number of documents in the corpus and smoothing, if True return the idf-smooth @returns : log10(N/df) or 1+log10(N/1+df) @examples : >>> inverse_document_frequency(3, 0) Traceback (most recent call last): ... ValueError: log10(0) is undefined. >>> inverse_document_frequency(1, 3) 0.477 >>> inverse_document_frequency(0, 3) Traceback (most recent call last): ... ZeroDivisionError: df must be > 0 >>> inverse_document_frequency(0, 3,True) 1.477 """ if smoothing: if n == 0: raise ValueError("log10(0) is undefined.") return round(1 + log10(n / (1 + df)), 3) if df == 0: raise ZeroDivisionError("df must be > 0") elif n == 0: raise ValueError("log10(0) is undefined.") return round(log10(n / df), 3) def tf_idf(tf: int, idf: int) -> float: """ Combine the term frequency and inverse document frequency functions to calculate the originality of a term. This 'originality' is calculated by multiplying the term frequency and the inverse document frequency : tf-idf = TF * IDF @params : tf, the term frequency, and idf, the inverse document frequency @examples : >>> tf_idf(2, 0.477) 0.954 """ return round(tf * idf, 3) ================================================ FILE: machine_learning/xgboost_classifier.py ================================================ # XGBoost Classifier Example import numpy as np from matplotlib import pyplot as plt from sklearn.datasets import load_iris from sklearn.metrics import ConfusionMatrixDisplay from sklearn.model_selection import train_test_split from xgboost import XGBClassifier def data_handling(data: dict) -> tuple: # Split dataset into features and target # data is features """ >>> data_handling(({'data':'[5.1, 3.5, 1.4, 0.2]','target':([0])})) ('[5.1, 3.5, 1.4, 0.2]', [0]) >>> data_handling( ... {'data': '[4.9, 3.0, 1.4, 0.2], [4.7, 3.2, 1.3, 0.2]', 'target': ([0, 0])} ... ) ('[4.9, 3.0, 1.4, 0.2], [4.7, 3.2, 1.3, 0.2]', [0, 0]) """ return (data["data"], data["target"]) def xgboost(features: np.ndarray, target: np.ndarray) -> XGBClassifier: """ # THIS TEST IS BROKEN!! >>> xgboost(np.array([[5.1, 3.6, 1.4, 0.2]]), np.array([0])) XGBClassifier(base_score=0.5, booster='gbtree', callbacks=None, colsample_bylevel=1, colsample_bynode=1, colsample_bytree=1, early_stopping_rounds=None, enable_categorical=False, eval_metric=None, gamma=0, gpu_id=-1, grow_policy='depthwise', importance_type=None, interaction_constraints='', learning_rate=0.300000012, max_bin=256, max_cat_to_onehot=4, max_delta_step=0, max_depth=6, max_leaves=0, min_child_weight=1, missing=nan, monotone_constraints='()', n_estimators=100, n_jobs=0, num_parallel_tree=1, predictor='auto', random_state=0, reg_alpha=0, reg_lambda=1, ...) """ classifier = XGBClassifier() classifier.fit(features, target) return classifier def main() -> None: """ Url for the algorithm: https://xgboost.readthedocs.io/en/stable/ Iris type dataset is used to demonstrate algorithm. """ # Load Iris dataset iris = load_iris() features, targets = data_handling(iris) x_train, x_test, y_train, y_test = train_test_split( features, targets, test_size=0.25 ) names = iris["target_names"] # Create an XGBoost Classifier from the training data xgboost_classifier = xgboost(x_train, y_train) # Display the confusion matrix of the classifier with both training and test sets ConfusionMatrixDisplay.from_estimator( xgboost_classifier, x_test, y_test, display_labels=names, cmap="Blues", normalize="true", ) plt.title("Normalized Confusion Matrix - IRIS Dataset") plt.show() if __name__ == "__main__": import doctest doctest.testmod(verbose=True) main() ================================================ FILE: machine_learning/xgboost_regressor.py ================================================ # XGBoost Regressor Example import numpy as np from sklearn.datasets import fetch_california_housing from sklearn.metrics import mean_absolute_error, mean_squared_error from sklearn.model_selection import train_test_split from xgboost import XGBRegressor def data_handling(data: dict) -> tuple: # Split dataset into features and target. Data is features. """ >>> data_handling(( ... {'data':'[ 8.3252 41. 6.9841269 1.02380952 322. 2.55555556 37.88 -122.23 ]' ... ,'target':([4.526])})) ('[ 8.3252 41. 6.9841269 1.02380952 322. 2.55555556 37.88 -122.23 ]', [4.526]) """ return (data["data"], data["target"]) def xgboost( features: np.ndarray, target: np.ndarray, test_features: np.ndarray ) -> np.ndarray: """ >>> xgboost(np.array([[ 2.3571 , 52. , 6.00813008, 1.06775068, ... 907. , 2.45799458, 40.58 , -124.26]]),np.array([1.114]), ... np.array([[1.97840000e+00, 3.70000000e+01, 4.98858447e+00, 1.03881279e+00, ... 1.14300000e+03, 2.60958904e+00, 3.67800000e+01, -1.19780000e+02]])) array([[1.1139996]], dtype=float32) """ xgb = XGBRegressor( verbosity=0, random_state=42, tree_method="exact", base_score=0.5 ) xgb.fit(features, target) # Predict target for test data predictions = xgb.predict(test_features) predictions = predictions.reshape(len(predictions), 1) return predictions def main() -> None: """ The URL for this algorithm https://xgboost.readthedocs.io/en/stable/ California house price dataset is used to demonstrate the algorithm. Expected error values: Mean Absolute Error: 0.30957163379906033 Mean Square Error: 0.22611560196662744 """ # Load California house price dataset california = fetch_california_housing() data, target = data_handling(california) x_train, x_test, y_train, y_test = train_test_split( data, target, test_size=0.25, random_state=1 ) predictions = xgboost(x_train, y_train, x_test) # Error printing print(f"Mean Absolute Error: {mean_absolute_error(y_test, predictions)}") print(f"Mean Square Error: {mean_squared_error(y_test, predictions)}") if __name__ == "__main__": import doctest doctest.testmod(verbose=True) main() ================================================ FILE: maths/__init__.py ================================================ ================================================ FILE: maths/abs.py ================================================ """Absolute Value.""" def abs_val(num: float) -> float: """ Find the absolute value of a number. >>> abs_val(-5.1) 5.1 >>> abs_val(-5) == abs_val(5) True >>> abs_val(0) 0 """ return -num if num < 0 else num def abs_min(x: list[int]) -> int: """ >>> abs_min([0,5,1,11]) 0 >>> abs_min([3,-10,-2]) -2 >>> abs_min([]) Traceback (most recent call last): ... ValueError: abs_min() arg is an empty sequence """ if len(x) == 0: raise ValueError("abs_min() arg is an empty sequence") j = x[0] for i in x: if abs_val(i) < abs_val(j): j = i return j def abs_max(x: list[int]) -> int: """ >>> abs_max([0,5,1,11]) 11 >>> abs_max([3,-10,-2]) -10 >>> abs_max([]) Traceback (most recent call last): ... ValueError: abs_max() arg is an empty sequence """ if len(x) == 0: raise ValueError("abs_max() arg is an empty sequence") j = x[0] for i in x: if abs(i) > abs(j): j = i return j def abs_max_sort(x: list[int]) -> int: """ >>> abs_max_sort([0,5,1,11]) 11 >>> abs_max_sort([3,-10,-2]) -10 >>> abs_max_sort([]) Traceback (most recent call last): ... ValueError: abs_max_sort() arg is an empty sequence """ if len(x) == 0: raise ValueError("abs_max_sort() arg is an empty sequence") return sorted(x, key=abs)[-1] def test_abs_val(): """ >>> test_abs_val() """ assert abs_val(0) == 0 assert abs_val(34) == 34 assert abs_val(-100000000000) == 100000000000 a = [-3, -1, 2, -11] assert abs_max(a) == -11 assert abs_max_sort(a) == -11 assert abs_min(a) == -1 if __name__ == "__main__": import doctest doctest.testmod() test_abs_val() print(abs_val(-34)) # --> 34 ================================================ FILE: maths/addition_without_arithmetic.py ================================================ """ Illustrate how to add the integer without arithmetic operation Author: suraj Kumar Time Complexity: 1 https://en.wikipedia.org/wiki/Bitwise_operation """ def add(first: int, second: int) -> int: """ Implementation of addition of integer Examples: >>> add(3, 5) 8 >>> add(13, 5) 18 >>> add(-7, 2) -5 >>> add(0, -7) -7 >>> add(-321, 0) -321 """ while second != 0: c = first & second first ^= second second = c << 1 return first if __name__ == "__main__": import doctest doctest.testmod() first = int(input("Enter the first number: ").strip()) second = int(input("Enter the second number: ").strip()) print(f"{add(first, second) = }") ================================================ FILE: maths/aliquot_sum.py ================================================ def aliquot_sum(input_num: int) -> int: """ Finds the aliquot sum of an input integer, where the aliquot sum of a number n is defined as the sum of all natural numbers less than n that divide n evenly. For example, the aliquot sum of 15 is 1 + 3 + 5 = 9. This is a simple O(n) implementation. @param input_num: a positive integer whose aliquot sum is to be found @return: the aliquot sum of input_num, if input_num is positive. Otherwise, raise a ValueError Wikipedia Explanation: https://en.wikipedia.org/wiki/Aliquot_sum >>> aliquot_sum(15) 9 >>> aliquot_sum(6) 6 >>> aliquot_sum(-1) Traceback (most recent call last): ... ValueError: Input must be positive >>> aliquot_sum(0) Traceback (most recent call last): ... ValueError: Input must be positive >>> aliquot_sum(1.6) Traceback (most recent call last): ... ValueError: Input must be an integer >>> aliquot_sum(12) 16 >>> aliquot_sum(1) 0 >>> aliquot_sum(19) 1 """ if not isinstance(input_num, int): raise ValueError("Input must be an integer") if input_num <= 0: raise ValueError("Input must be positive") return sum( divisor for divisor in range(1, input_num // 2 + 1) if input_num % divisor == 0 ) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/allocation_number.py ================================================ """ In a multi-threaded download, this algorithm could be used to provide each worker thread with a block of non-overlapping bytes to download. For example: for i in allocation_list: requests.get(url,headers={'Range':f'bytes={i}'}) """ from __future__ import annotations def allocation_num(number_of_bytes: int, partitions: int) -> list[str]: """ Divide a number of bytes into x partitions. :param number_of_bytes: the total of bytes. :param partitions: the number of partition need to be allocated. :return: list of bytes to be assigned to each worker thread >>> allocation_num(16647, 4) ['1-4161', '4162-8322', '8323-12483', '12484-16647'] >>> allocation_num(50000, 5) ['1-10000', '10001-20000', '20001-30000', '30001-40000', '40001-50000'] >>> allocation_num(888, 999) Traceback (most recent call last): ... ValueError: partitions can not > number_of_bytes! >>> allocation_num(888, -4) Traceback (most recent call last): ... ValueError: partitions must be a positive number! """ if partitions <= 0: raise ValueError("partitions must be a positive number!") if partitions > number_of_bytes: raise ValueError("partitions can not > number_of_bytes!") bytes_per_partition = number_of_bytes // partitions allocation_list = [] for i in range(partitions): start_bytes = i * bytes_per_partition + 1 end_bytes = ( number_of_bytes if i == partitions - 1 else (i + 1) * bytes_per_partition ) allocation_list.append(f"{start_bytes}-{end_bytes}") return allocation_list if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/arc_length.py ================================================ from math import pi def arc_length(angle: int, radius: int) -> float: """ >>> arc_length(45, 5) 3.9269908169872414 >>> arc_length(120, 15) 31.415926535897928 >>> arc_length(90, 10) 15.707963267948966 """ return 2 * pi * radius * (angle / 360) if __name__ == "__main__": print(arc_length(90, 10)) ================================================ FILE: maths/area.py ================================================ """ Find the area of various geometric shapes Wikipedia reference: https://en.wikipedia.org/wiki/Area """ from math import pi, sqrt, tan def surface_area_cube(side_length: float) -> float: """ Calculate the Surface Area of a Cube. >>> surface_area_cube(1) 6 >>> surface_area_cube(1.6) 15.360000000000003 >>> surface_area_cube(0) 0 >>> surface_area_cube(3) 54 >>> surface_area_cube(-1) Traceback (most recent call last): ... ValueError: surface_area_cube() only accepts non-negative values """ if side_length < 0: raise ValueError("surface_area_cube() only accepts non-negative values") return 6 * side_length**2 def surface_area_cuboid(length: float, breadth: float, height: float) -> float: """ Calculate the Surface Area of a Cuboid. >>> surface_area_cuboid(1, 2, 3) 22 >>> surface_area_cuboid(0, 0, 0) 0 >>> surface_area_cuboid(1.6, 2.6, 3.6) 38.56 >>> surface_area_cuboid(-1, 2, 3) Traceback (most recent call last): ... ValueError: surface_area_cuboid() only accepts non-negative values >>> surface_area_cuboid(1, -2, 3) Traceback (most recent call last): ... ValueError: surface_area_cuboid() only accepts non-negative values >>> surface_area_cuboid(1, 2, -3) Traceback (most recent call last): ... ValueError: surface_area_cuboid() only accepts non-negative values """ if length < 0 or breadth < 0 or height < 0: raise ValueError("surface_area_cuboid() only accepts non-negative values") return 2 * ((length * breadth) + (breadth * height) + (length * height)) def surface_area_sphere(radius: float) -> float: """ Calculate the Surface Area of a Sphere. Wikipedia reference: https://en.wikipedia.org/wiki/Sphere Formula: 4 * pi * r^2 >>> surface_area_sphere(5) 314.1592653589793 >>> surface_area_sphere(1) 12.566370614359172 >>> surface_area_sphere(1.6) 32.169908772759484 >>> surface_area_sphere(0) 0.0 >>> surface_area_sphere(-1) Traceback (most recent call last): ... ValueError: surface_area_sphere() only accepts non-negative values """ if radius < 0: raise ValueError("surface_area_sphere() only accepts non-negative values") return 4 * pi * radius**2 def surface_area_hemisphere(radius: float) -> float: """ Calculate the Surface Area of a Hemisphere. Formula: 3 * pi * r^2 >>> surface_area_hemisphere(5) 235.61944901923448 >>> surface_area_hemisphere(1) 9.42477796076938 >>> surface_area_hemisphere(0) 0.0 >>> surface_area_hemisphere(1.1) 11.40398133253095 >>> surface_area_hemisphere(-1) Traceback (most recent call last): ... ValueError: surface_area_hemisphere() only accepts non-negative values """ if radius < 0: raise ValueError("surface_area_hemisphere() only accepts non-negative values") return 3 * pi * radius**2 def surface_area_cone(radius: float, height: float) -> float: """ Calculate the Surface Area of a Cone. Wikipedia reference: https://en.wikipedia.org/wiki/Cone Formula: pi * r * (r + (h ** 2 + r ** 2) ** 0.5) >>> surface_area_cone(10, 24) 1130.9733552923256 >>> surface_area_cone(6, 8) 301.59289474462014 >>> surface_area_cone(1.6, 2.6) 23.387862992395807 >>> surface_area_cone(0, 0) 0.0 >>> surface_area_cone(-1, -2) Traceback (most recent call last): ... ValueError: surface_area_cone() only accepts non-negative values >>> surface_area_cone(1, -2) Traceback (most recent call last): ... ValueError: surface_area_cone() only accepts non-negative values >>> surface_area_cone(-1, 2) Traceback (most recent call last): ... ValueError: surface_area_cone() only accepts non-negative values """ if radius < 0 or height < 0: raise ValueError("surface_area_cone() only accepts non-negative values") return pi * radius * (radius + (height**2 + radius**2) ** 0.5) def surface_area_conical_frustum( radius_1: float, radius_2: float, height: float ) -> float: """ Calculate the Surface Area of a Conical Frustum. >>> surface_area_conical_frustum(1, 2, 3) 45.511728065337266 >>> surface_area_conical_frustum(4, 5, 6) 300.7913575056268 >>> surface_area_conical_frustum(0, 0, 0) 0.0 >>> surface_area_conical_frustum(1.6, 2.6, 3.6) 78.57907060751548 >>> surface_area_conical_frustum(-1, 2, 3) Traceback (most recent call last): ... ValueError: surface_area_conical_frustum() only accepts non-negative values >>> surface_area_conical_frustum(1, -2, 3) Traceback (most recent call last): ... ValueError: surface_area_conical_frustum() only accepts non-negative values >>> surface_area_conical_frustum(1, 2, -3) Traceback (most recent call last): ... ValueError: surface_area_conical_frustum() only accepts non-negative values """ if radius_1 < 0 or radius_2 < 0 or height < 0: raise ValueError( "surface_area_conical_frustum() only accepts non-negative values" ) slant_height = (height**2 + (radius_1 - radius_2) ** 2) ** 0.5 return pi * ((slant_height * (radius_1 + radius_2)) + radius_1**2 + radius_2**2) def surface_area_cylinder(radius: float, height: float) -> float: """ Calculate the Surface Area of a Cylinder. Wikipedia reference: https://en.wikipedia.org/wiki/Cylinder Formula: 2 * pi * r * (h + r) >>> surface_area_cylinder(7, 10) 747.6990515543707 >>> surface_area_cylinder(1.6, 2.6) 42.22300526424682 >>> surface_area_cylinder(0, 0) 0.0 >>> surface_area_cylinder(6, 8) 527.7875658030853 >>> surface_area_cylinder(-1, -2) Traceback (most recent call last): ... ValueError: surface_area_cylinder() only accepts non-negative values >>> surface_area_cylinder(1, -2) Traceback (most recent call last): ... ValueError: surface_area_cylinder() only accepts non-negative values >>> surface_area_cylinder(-1, 2) Traceback (most recent call last): ... ValueError: surface_area_cylinder() only accepts non-negative values """ if radius < 0 or height < 0: raise ValueError("surface_area_cylinder() only accepts non-negative values") return 2 * pi * radius * (height + radius) def surface_area_torus(torus_radius: float, tube_radius: float) -> float: """Calculate the Area of a Torus. Wikipedia reference: https://en.wikipedia.org/wiki/Torus :return 4pi^2 * torus_radius * tube_radius >>> surface_area_torus(1, 1) 39.47841760435743 >>> surface_area_torus(4, 3) 473.7410112522892 >>> surface_area_torus(3, 4) Traceback (most recent call last): ... ValueError: surface_area_torus() does not support spindle or self intersecting tori >>> surface_area_torus(1.6, 1.6) 101.06474906715503 >>> surface_area_torus(0, 0) 0.0 >>> surface_area_torus(-1, 1) Traceback (most recent call last): ... ValueError: surface_area_torus() only accepts non-negative values >>> surface_area_torus(1, -1) Traceback (most recent call last): ... ValueError: surface_area_torus() only accepts non-negative values """ if torus_radius < 0 or tube_radius < 0: raise ValueError("surface_area_torus() only accepts non-negative values") if torus_radius < tube_radius: raise ValueError( "surface_area_torus() does not support spindle or self intersecting tori" ) return 4 * pow(pi, 2) * torus_radius * tube_radius def area_rectangle(length: float, width: float) -> float: """ Calculate the area of a rectangle. >>> area_rectangle(10, 20) 200 >>> area_rectangle(1.6, 2.6) 4.16 >>> area_rectangle(0, 0) 0 >>> area_rectangle(-1, -2) Traceback (most recent call last): ... ValueError: area_rectangle() only accepts non-negative values >>> area_rectangle(1, -2) Traceback (most recent call last): ... ValueError: area_rectangle() only accepts non-negative values >>> area_rectangle(-1, 2) Traceback (most recent call last): ... ValueError: area_rectangle() only accepts non-negative values """ if length < 0 or width < 0: raise ValueError("area_rectangle() only accepts non-negative values") return length * width def area_square(side_length: float) -> float: """ Calculate the area of a square. >>> area_square(10) 100 >>> area_square(0) 0 >>> area_square(1.6) 2.5600000000000005 >>> area_square(-1) Traceback (most recent call last): ... ValueError: area_square() only accepts non-negative values """ if side_length < 0: raise ValueError("area_square() only accepts non-negative values") return side_length**2 def area_triangle(base: float, height: float) -> float: """ Calculate the area of a triangle given the base and height. >>> area_triangle(10, 10) 50.0 >>> area_triangle(1.6, 2.6) 2.08 >>> area_triangle(0, 0) 0.0 >>> area_triangle(-1, -2) Traceback (most recent call last): ... ValueError: area_triangle() only accepts non-negative values >>> area_triangle(1, -2) Traceback (most recent call last): ... ValueError: area_triangle() only accepts non-negative values >>> area_triangle(-1, 2) Traceback (most recent call last): ... ValueError: area_triangle() only accepts non-negative values """ if base < 0 or height < 0: raise ValueError("area_triangle() only accepts non-negative values") return (base * height) / 2 def area_triangle_three_sides(side1: float, side2: float, side3: float) -> float: """ Calculate area of triangle when the length of 3 sides are known. This function uses Heron's formula: https://en.wikipedia.org/wiki/Heron%27s_formula >>> area_triangle_three_sides(5, 12, 13) 30.0 >>> area_triangle_three_sides(10, 11, 12) 51.521233486786784 >>> area_triangle_three_sides(0, 0, 0) 0.0 >>> area_triangle_three_sides(1.6, 2.6, 3.6) 1.8703742940919619 >>> area_triangle_three_sides(-1, -2, -1) Traceback (most recent call last): ... ValueError: area_triangle_three_sides() only accepts non-negative values >>> area_triangle_three_sides(1, -2, 1) Traceback (most recent call last): ... ValueError: area_triangle_three_sides() only accepts non-negative values >>> area_triangle_three_sides(2, 4, 7) Traceback (most recent call last): ... ValueError: Given three sides do not form a triangle >>> area_triangle_three_sides(2, 7, 4) Traceback (most recent call last): ... ValueError: Given three sides do not form a triangle >>> area_triangle_three_sides(7, 2, 4) Traceback (most recent call last): ... ValueError: Given three sides do not form a triangle """ if side1 < 0 or side2 < 0 or side3 < 0: raise ValueError("area_triangle_three_sides() only accepts non-negative values") elif side1 + side2 < side3 or side1 + side3 < side2 or side2 + side3 < side1: raise ValueError("Given three sides do not form a triangle") semi_perimeter = (side1 + side2 + side3) / 2 area = sqrt( semi_perimeter * (semi_perimeter - side1) * (semi_perimeter - side2) * (semi_perimeter - side3) ) return area def area_parallelogram(base: float, height: float) -> float: """ Calculate the area of a parallelogram. >>> area_parallelogram(10, 20) 200 >>> area_parallelogram(1.6, 2.6) 4.16 >>> area_parallelogram(0, 0) 0 >>> area_parallelogram(-1, -2) Traceback (most recent call last): ... ValueError: area_parallelogram() only accepts non-negative values >>> area_parallelogram(1, -2) Traceback (most recent call last): ... ValueError: area_parallelogram() only accepts non-negative values >>> area_parallelogram(-1, 2) Traceback (most recent call last): ... ValueError: area_parallelogram() only accepts non-negative values """ if base < 0 or height < 0: raise ValueError("area_parallelogram() only accepts non-negative values") return base * height def area_trapezium(base1: float, base2: float, height: float) -> float: """ Calculate the area of a trapezium. >>> area_trapezium(10, 20, 30) 450.0 >>> area_trapezium(1.6, 2.6, 3.6) 7.5600000000000005 >>> area_trapezium(0, 0, 0) 0.0 >>> area_trapezium(-1, -2, -3) Traceback (most recent call last): ... ValueError: area_trapezium() only accepts non-negative values >>> area_trapezium(-1, 2, 3) Traceback (most recent call last): ... ValueError: area_trapezium() only accepts non-negative values >>> area_trapezium(1, -2, 3) Traceback (most recent call last): ... ValueError: area_trapezium() only accepts non-negative values >>> area_trapezium(1, 2, -3) Traceback (most recent call last): ... ValueError: area_trapezium() only accepts non-negative values >>> area_trapezium(-1, -2, 3) Traceback (most recent call last): ... ValueError: area_trapezium() only accepts non-negative values >>> area_trapezium(1, -2, -3) Traceback (most recent call last): ... ValueError: area_trapezium() only accepts non-negative values >>> area_trapezium(-1, 2, -3) Traceback (most recent call last): ... ValueError: area_trapezium() only accepts non-negative values """ if base1 < 0 or base2 < 0 or height < 0: raise ValueError("area_trapezium() only accepts non-negative values") return 1 / 2 * (base1 + base2) * height def area_circle(radius: float) -> float: """ Calculate the area of a circle. >>> area_circle(20) 1256.6370614359173 >>> area_circle(1.6) 8.042477193189871 >>> area_circle(0) 0.0 >>> area_circle(-1) Traceback (most recent call last): ... ValueError: area_circle() only accepts non-negative values """ if radius < 0: raise ValueError("area_circle() only accepts non-negative values") return pi * radius**2 def area_ellipse(radius_x: float, radius_y: float) -> float: """ Calculate the area of a ellipse. >>> area_ellipse(10, 10) 314.1592653589793 >>> area_ellipse(10, 20) 628.3185307179587 >>> area_ellipse(0, 0) 0.0 >>> area_ellipse(1.6, 2.6) 13.06902543893354 >>> area_ellipse(-10, 20) Traceback (most recent call last): ... ValueError: area_ellipse() only accepts non-negative values >>> area_ellipse(10, -20) Traceback (most recent call last): ... ValueError: area_ellipse() only accepts non-negative values >>> area_ellipse(-10, -20) Traceback (most recent call last): ... ValueError: area_ellipse() only accepts non-negative values """ if radius_x < 0 or radius_y < 0: raise ValueError("area_ellipse() only accepts non-negative values") return pi * radius_x * radius_y def area_rhombus(diagonal_1: float, diagonal_2: float) -> float: """ Calculate the area of a rhombus. >>> area_rhombus(10, 20) 100.0 >>> area_rhombus(1.6, 2.6) 2.08 >>> area_rhombus(0, 0) 0.0 >>> area_rhombus(-1, -2) Traceback (most recent call last): ... ValueError: area_rhombus() only accepts non-negative values >>> area_rhombus(1, -2) Traceback (most recent call last): ... ValueError: area_rhombus() only accepts non-negative values >>> area_rhombus(-1, 2) Traceback (most recent call last): ... ValueError: area_rhombus() only accepts non-negative values """ if diagonal_1 < 0 or diagonal_2 < 0: raise ValueError("area_rhombus() only accepts non-negative values") return 1 / 2 * diagonal_1 * diagonal_2 def area_reg_polygon(sides: int, length: float) -> float: """ Calculate the area of a regular polygon. Wikipedia reference: https://en.wikipedia.org/wiki/Polygon#Regular_polygons Formula: (n*s^2*cot(pi/n))/4 >>> area_reg_polygon(3, 10) 43.301270189221945 >>> area_reg_polygon(4, 10) 100.00000000000001 >>> area_reg_polygon(0, 0) Traceback (most recent call last): ... ValueError: area_reg_polygon() only accepts integers greater than or equal to \ three as number of sides >>> area_reg_polygon(-1, -2) Traceback (most recent call last): ... ValueError: area_reg_polygon() only accepts integers greater than or equal to \ three as number of sides >>> area_reg_polygon(5, -2) Traceback (most recent call last): ... ValueError: area_reg_polygon() only accepts non-negative values as \ length of a side >>> area_reg_polygon(-1, 2) Traceback (most recent call last): ... ValueError: area_reg_polygon() only accepts integers greater than or equal to \ three as number of sides """ if not isinstance(sides, int) or sides < 3: raise ValueError( "area_reg_polygon() only accepts integers greater than or \ equal to three as number of sides" ) elif length < 0: raise ValueError( "area_reg_polygon() only accepts non-negative values as \ length of a side" ) return (sides * length**2) / (4 * tan(pi / sides)) if __name__ == "__main__": import doctest doctest.testmod(verbose=True) # verbose so we can see methods missing tests print("[DEMO] Areas of various geometric shapes: \n") print(f"Rectangle: {area_rectangle(10, 20) = }") print(f"Square: {area_square(10) = }") print(f"Triangle: {area_triangle(10, 10) = }") print(f"Triangle: {area_triangle_three_sides(5, 12, 13) = }") print(f"Parallelogram: {area_parallelogram(10, 20) = }") print(f"Rhombus: {area_rhombus(10, 20) = }") print(f"Trapezium: {area_trapezium(10, 20, 30) = }") print(f"Circle: {area_circle(20) = }") print(f"Ellipse: {area_ellipse(10, 20) = }") print("\nSurface Areas of various geometric shapes: \n") print(f"Cube: {surface_area_cube(20) = }") print(f"Cuboid: {surface_area_cuboid(10, 20, 30) = }") print(f"Sphere: {surface_area_sphere(20) = }") print(f"Hemisphere: {surface_area_hemisphere(20) = }") print(f"Cone: {surface_area_cone(10, 20) = }") print(f"Conical Frustum: {surface_area_conical_frustum(10, 20, 30) = }") print(f"Cylinder: {surface_area_cylinder(10, 20) = }") print(f"Torus: {surface_area_torus(20, 10) = }") print(f"Equilateral Triangle: {area_reg_polygon(3, 10) = }") print(f"Square: {area_reg_polygon(4, 10) = }") print(f"Reqular Pentagon: {area_reg_polygon(5, 10) = }") ================================================ FILE: maths/area_under_curve.py ================================================ """ Approximates the area under the curve using the trapezoidal rule """ from __future__ import annotations from collections.abc import Callable def trapezoidal_area( fnc: Callable[[float], float], x_start: float, x_end: float, steps: int = 100, ) -> float: """ Treats curve as a collection of linear lines and sums the area of the trapezium shape they form :param fnc: a function which defines a curve :param x_start: left end point to indicate the start of line segment :param x_end: right end point to indicate end of line segment :param steps: an accuracy gauge; more steps increases the accuracy :return: a float representing the length of the curve >>> def f(x): ... return 5 >>> f"{trapezoidal_area(f, 12.0, 14.0, 1000):.3f}" '10.000' >>> def f(x): ... return 9*x**2 >>> f"{trapezoidal_area(f, -4.0, 0, 10000):.4f}" '192.0000' >>> f"{trapezoidal_area(f, -4.0, 4.0, 10000):.4f}" '384.0000' """ x1 = x_start fx1 = fnc(x_start) area = 0.0 for _ in range(steps): # Approximates small segments of curve as linear and solve # for trapezoidal area x2 = (x_end - x_start) / steps + x1 fx2 = fnc(x2) area += abs(fx2 + fx1) * (x2 - x1) / 2 # Increment step x1 = x2 fx1 = fx2 return area if __name__ == "__main__": def f(x): return x**3 + x**2 print("f(x) = x^3 + x^2") print("The area between the curve, x = -5, x = 5 and the x axis is:") i = 10 while i <= 100000: print(f"with {i} steps: {trapezoidal_area(f, -5, 5, i)}") i *= 10 ================================================ FILE: maths/average_absolute_deviation.py ================================================ def average_absolute_deviation(nums: list[int]) -> float: """ Return the average absolute deviation of a list of numbers. Wiki: https://en.wikipedia.org/wiki/Average_absolute_deviation >>> average_absolute_deviation([0]) 0.0 >>> average_absolute_deviation([4, 1, 3, 2]) 1.0 >>> average_absolute_deviation([2, 70, 6, 50, 20, 8, 4, 0]) 20.0 >>> average_absolute_deviation([-20, 0, 30, 15]) 16.25 >>> average_absolute_deviation([]) Traceback (most recent call last): ... ValueError: List is empty """ if not nums: # Makes sure that the list is not empty raise ValueError("List is empty") average = sum(nums) / len(nums) # Calculate the average return sum(abs(x - average) for x in nums) / len(nums) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/average_mean.py ================================================ from __future__ import annotations def mean(nums: list) -> float: """ Find mean of a list of numbers. Wiki: https://en.wikipedia.org/wiki/Mean >>> mean([3, 6, 9, 12, 15, 18, 21]) 12.0 >>> mean([5, 10, 15, 20, 25, 30, 35]) 20.0 >>> mean([1, 2, 3, 4, 5, 6, 7, 8]) 4.5 >>> mean([]) Traceback (most recent call last): ... ValueError: List is empty """ if not nums: raise ValueError("List is empty") return sum(nums) / len(nums) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/average_median.py ================================================ from __future__ import annotations def median(nums: list) -> int | float: """ Find median of a list of numbers. Wiki: https://en.wikipedia.org/wiki/Median >>> median([0]) 0 >>> median([4, 1, 3, 2]) 2.5 >>> median([2, 70, 6, 50, 20, 8, 4]) 8 Args: nums: List of nums Returns: Median. """ # The sorted function returns list[SupportsRichComparisonT@sorted] # which does not support `+` sorted_list: list[int] = sorted(nums) length = len(sorted_list) mid_index = length >> 1 return ( (sorted_list[mid_index] + sorted_list[mid_index - 1]) / 2 if length % 2 == 0 else sorted_list[mid_index] ) def main(): import doctest doctest.testmod() if __name__ == "__main__": main() ================================================ FILE: maths/average_mode.py ================================================ from typing import Any def mode(input_list: list) -> list[Any]: """This function returns the mode(Mode as in the measures of central tendency) of the input data. The input list may contain any Datastructure or any Datatype. >>> mode([2, 3, 4, 5, 3, 4, 2, 5, 2, 2, 4, 2, 2, 2]) [2] >>> mode([3, 4, 5, 3, 4, 2, 5, 2, 2, 4, 4, 2, 2, 2]) [2] >>> mode([3, 4, 5, 3, 4, 2, 5, 2, 2, 4, 4, 4, 2, 2, 4, 2]) [2, 4] >>> mode(["x", "y", "y", "z"]) ['y'] >>> mode(["x", "x" , "y", "y", "z"]) ['x', 'y'] """ if not input_list: return [] result = [input_list.count(value) for value in input_list] y = max(result) # Gets the maximum count in the input list. # Gets values of modes return sorted({input_list[i] for i, value in enumerate(result) if value == y}) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/bailey_borwein_plouffe.py ================================================ def bailey_borwein_plouffe(digit_position: int, precision: int = 1000) -> str: """ Implement a popular pi-digit-extraction algorithm known as the Bailey-Borwein-Plouffe (BBP) formula to calculate the nth hex digit of pi. Wikipedia page: https://en.wikipedia.org/wiki/Bailey%E2%80%93Borwein%E2%80%93Plouffe_formula @param digit_position: a positive integer representing the position of the digit to extract. The digit immediately after the decimal point is located at position 1. @param precision: number of terms in the second summation to calculate. A higher number reduces the chance of an error but increases the runtime. @return: a hexadecimal digit representing the digit at the nth position in pi's decimal expansion. >>> "".join(bailey_borwein_plouffe(i) for i in range(1, 11)) '243f6a8885' >>> bailey_borwein_plouffe(5, 10000) '6' >>> bailey_borwein_plouffe(-10) Traceback (most recent call last): ... ValueError: Digit position must be a positive integer >>> bailey_borwein_plouffe(0) Traceback (most recent call last): ... ValueError: Digit position must be a positive integer >>> bailey_borwein_plouffe(1.7) Traceback (most recent call last): ... ValueError: Digit position must be a positive integer >>> bailey_borwein_plouffe(2, -10) Traceback (most recent call last): ... ValueError: Precision must be a nonnegative integer >>> bailey_borwein_plouffe(2, 1.6) Traceback (most recent call last): ... ValueError: Precision must be a nonnegative integer """ if (not isinstance(digit_position, int)) or (digit_position <= 0): raise ValueError("Digit position must be a positive integer") elif (not isinstance(precision, int)) or (precision < 0): raise ValueError("Precision must be a nonnegative integer") # compute an approximation of (16 ** (n - 1)) * pi whose fractional part is mostly # accurate sum_result = ( 4 * _subsum(digit_position, 1, precision) - 2 * _subsum(digit_position, 4, precision) - _subsum(digit_position, 5, precision) - _subsum(digit_position, 6, precision) ) # return the first hex digit of the fractional part of the result return hex(int((sum_result % 1) * 16))[2:] def _subsum( digit_pos_to_extract: int, denominator_addend: int, precision: int ) -> float: # only care about first digit of fractional part; don't need decimal """ Private helper function to implement the summation functionality. @param digit_pos_to_extract: digit position to extract @param denominator_addend: added to denominator of fractions in the formula @param precision: same as precision in main function @return: floating-point number whose integer part is not important """ total = 0.0 for sum_index in range(digit_pos_to_extract + precision): denominator = 8 * sum_index + denominator_addend if sum_index < digit_pos_to_extract: # if the exponential term is an integer and we mod it by the denominator # before dividing, only the integer part of the sum will change; # the fractional part will not exponential_term = pow( 16, digit_pos_to_extract - 1 - sum_index, denominator ) else: exponential_term = pow(16, digit_pos_to_extract - 1 - sum_index) total += exponential_term / denominator return total if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/base_neg2_conversion.py ================================================ def decimal_to_negative_base_2(num: int) -> int: """ This function returns the number negative base 2 of the decimal number of the input data. Args: int: The decimal number to convert. Returns: int: The negative base 2 number. Examples: >>> decimal_to_negative_base_2(0) 0 >>> decimal_to_negative_base_2(-19) 111101 >>> decimal_to_negative_base_2(4) 100 >>> decimal_to_negative_base_2(7) 11011 """ if num == 0: return 0 ans = "" while num != 0: num, rem = divmod(num, -2) if rem < 0: rem += 2 num += 1 ans = str(rem) + ans return int(ans) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/basic_maths.py ================================================ """Implementation of Basic Math in Python.""" import math def prime_factors(n: int) -> list: """Find Prime Factors. >>> prime_factors(100) [2, 2, 5, 5] >>> prime_factors(0) Traceback (most recent call last): ... ValueError: Only positive integers have prime factors >>> prime_factors(-10) Traceback (most recent call last): ... ValueError: Only positive integers have prime factors """ if n <= 0: raise ValueError("Only positive integers have prime factors") pf = [] while n % 2 == 0: pf.append(2) n = int(n / 2) for i in range(3, int(math.sqrt(n)) + 1, 2): while n % i == 0: pf.append(i) n = int(n / i) if n > 2: pf.append(n) return pf def number_of_divisors(n: int) -> int: """Calculate Number of Divisors of an Integer. >>> number_of_divisors(100) 9 >>> number_of_divisors(0) Traceback (most recent call last): ... ValueError: Only positive numbers are accepted >>> number_of_divisors(-10) Traceback (most recent call last): ... ValueError: Only positive numbers are accepted """ if n <= 0: raise ValueError("Only positive numbers are accepted") div = 1 temp = 1 while n % 2 == 0: temp += 1 n = int(n / 2) div *= temp for i in range(3, int(math.sqrt(n)) + 1, 2): temp = 1 while n % i == 0: temp += 1 n = int(n / i) div *= temp if n > 1: div *= 2 return div def sum_of_divisors(n: int) -> int: """Calculate Sum of Divisors. >>> sum_of_divisors(100) 217 >>> sum_of_divisors(0) Traceback (most recent call last): ... ValueError: Only positive numbers are accepted >>> sum_of_divisors(-10) Traceback (most recent call last): ... ValueError: Only positive numbers are accepted """ if n <= 0: raise ValueError("Only positive numbers are accepted") s = 1 temp = 1 while n % 2 == 0: temp += 1 n = int(n / 2) if temp > 1: s *= (2**temp - 1) / (2 - 1) for i in range(3, int(math.sqrt(n)) + 1, 2): temp = 1 while n % i == 0: temp += 1 n = int(n / i) if temp > 1: s *= (i**temp - 1) / (i - 1) return int(s) def euler_phi(n: int) -> int: """Calculate Euler's Phi Function. >>> euler_phi(100) 40 >>> euler_phi(0) Traceback (most recent call last): ... ValueError: Only positive numbers are accepted >>> euler_phi(-10) Traceback (most recent call last): ... ValueError: Only positive numbers are accepted """ if n <= 0: raise ValueError("Only positive numbers are accepted") s = n for x in set(prime_factors(n)): s *= (x - 1) / x return int(s) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/binary_exponentiation.py ================================================ """ Binary Exponentiation This is a method to find a^b in O(log b) time complexity and is one of the most commonly used methods of exponentiation. The method is also useful for modular exponentiation, when the solution to (a^b) % c is required. To calculate a^b: - If b is even, then a^b = (a * a)^(b / 2) - If b is odd, then a^b = a * a^(b - 1) Repeat until b = 1 or b = 0 For modular exponentiation, we use the fact that (a * b) % c = ((a % c) * (b % c)) % c """ def binary_exp_recursive(base: float, exponent: int) -> float: """ Computes a^b recursively, where a is the base and b is the exponent >>> binary_exp_recursive(3, 5) 243 >>> binary_exp_recursive(11, 13) 34522712143931 >>> binary_exp_recursive(-1, 3) -1 >>> binary_exp_recursive(0, 5) 0 >>> binary_exp_recursive(3, 1) 3 >>> binary_exp_recursive(3, 0) 1 >>> binary_exp_recursive(1.5, 4) 5.0625 >>> binary_exp_recursive(3, -1) Traceback (most recent call last): ... ValueError: Exponent must be a non-negative integer """ if exponent < 0: raise ValueError("Exponent must be a non-negative integer") if exponent == 0: return 1 if exponent % 2 == 1: return binary_exp_recursive(base, exponent - 1) * base b = binary_exp_recursive(base, exponent // 2) return b * b def binary_exp_iterative(base: float, exponent: int) -> float: """ Computes a^b iteratively, where a is the base and b is the exponent >>> binary_exp_iterative(3, 5) 243 >>> binary_exp_iterative(11, 13) 34522712143931 >>> binary_exp_iterative(-1, 3) -1 >>> binary_exp_iterative(0, 5) 0 >>> binary_exp_iterative(3, 1) 3 >>> binary_exp_iterative(3, 0) 1 >>> binary_exp_iterative(1.5, 4) 5.0625 >>> binary_exp_iterative(3, -1) Traceback (most recent call last): ... ValueError: Exponent must be a non-negative integer """ if exponent < 0: raise ValueError("Exponent must be a non-negative integer") res: int | float = 1 while exponent > 0: if exponent & 1: res *= base base *= base exponent >>= 1 return res def binary_exp_mod_recursive(base: float, exponent: int, modulus: int) -> float: """ Computes a^b % c recursively, where a is the base, b is the exponent, and c is the modulus >>> binary_exp_mod_recursive(3, 4, 5) 1 >>> binary_exp_mod_recursive(11, 13, 7) 4 >>> binary_exp_mod_recursive(1.5, 4, 3) 2.0625 >>> binary_exp_mod_recursive(7, -1, 10) Traceback (most recent call last): ... ValueError: Exponent must be a non-negative integer >>> binary_exp_mod_recursive(7, 13, 0) Traceback (most recent call last): ... ValueError: Modulus must be a positive integer """ if exponent < 0: raise ValueError("Exponent must be a non-negative integer") if modulus <= 0: raise ValueError("Modulus must be a positive integer") if exponent == 0: return 1 if exponent % 2 == 1: return (binary_exp_mod_recursive(base, exponent - 1, modulus) * base) % modulus r = binary_exp_mod_recursive(base, exponent // 2, modulus) return (r * r) % modulus def binary_exp_mod_iterative(base: float, exponent: int, modulus: int) -> float: """ Computes a^b % c iteratively, where a is the base, b is the exponent, and c is the modulus >>> binary_exp_mod_iterative(3, 4, 5) 1 >>> binary_exp_mod_iterative(11, 13, 7) 4 >>> binary_exp_mod_iterative(1.5, 4, 3) 2.0625 >>> binary_exp_mod_iterative(7, -1, 10) Traceback (most recent call last): ... ValueError: Exponent must be a non-negative integer >>> binary_exp_mod_iterative(7, 13, 0) Traceback (most recent call last): ... ValueError: Modulus must be a positive integer """ if exponent < 0: raise ValueError("Exponent must be a non-negative integer") if modulus <= 0: raise ValueError("Modulus must be a positive integer") res: int | float = 1 while exponent > 0: if exponent & 1: res = ((res % modulus) * (base % modulus)) % modulus base *= base exponent >>= 1 return res if __name__ == "__main__": from timeit import timeit a = 1269380576 b = 374 c = 34 runs = 100_000 print( timeit( f"binary_exp_recursive({a}, {b})", setup="from __main__ import binary_exp_recursive", number=runs, ) ) print( timeit( f"binary_exp_iterative({a}, {b})", setup="from __main__ import binary_exp_iterative", number=runs, ) ) print( timeit( f"binary_exp_mod_recursive({a}, {b}, {c})", setup="from __main__ import binary_exp_mod_recursive", number=runs, ) ) print( timeit( f"binary_exp_mod_iterative({a}, {b}, {c})", setup="from __main__ import binary_exp_mod_iterative", number=runs, ) ) ================================================ FILE: maths/binary_multiplication.py ================================================ """ Binary Multiplication This is a method to find a*b in a time complexity of O(log b) This is one of the most commonly used methods of finding result of multiplication. Also useful in cases where solution to (a*b)%c is required, where a,b,c can be numbers over the computers calculation limits. Done using iteration, can also be done using recursion Let's say you need to calculate a * b RULE 1 : a * b = (a+a) * (b/2) ---- example : 4 * 4 = (4+4) * (4/2) = 8 * 2 RULE 2 : IF b is odd, then ---- a * b = a + (a * (b - 1)), where (b - 1) is even. Once b is even, repeat the process to get a * b Repeat the process until b = 1 or b = 0, because a*1 = a and a*0 = 0 As far as the modulo is concerned, the fact : (a+b) % c = ((a%c) + (b%c)) % c Now apply RULE 1 or 2, whichever is required. @author chinmoy159 """ def binary_multiply(a: int, b: int) -> int: """ Multiply 'a' and 'b' using bitwise multiplication. Parameters: a (int): The first number. b (int): The second number. Returns: int: a * b Examples: >>> binary_multiply(2, 3) 6 >>> binary_multiply(5, 0) 0 >>> binary_multiply(3, 4) 12 >>> binary_multiply(10, 5) 50 >>> binary_multiply(0, 5) 0 >>> binary_multiply(2, 1) 2 >>> binary_multiply(1, 10) 10 """ res = 0 while b > 0: if b & 1: res += a a += a b >>= 1 return res def binary_mod_multiply(a: int, b: int, modulus: int) -> int: """ Calculate (a * b) % c using binary multiplication and modular arithmetic. Parameters: a (int): The first number. b (int): The second number. modulus (int): The modulus. Returns: int: (a * b) % modulus. Examples: >>> binary_mod_multiply(2, 3, 5) 1 >>> binary_mod_multiply(5, 0, 7) 0 >>> binary_mod_multiply(3, 4, 6) 0 >>> binary_mod_multiply(10, 5, 13) 11 >>> binary_mod_multiply(2, 1, 5) 2 >>> binary_mod_multiply(1, 10, 3) 1 """ res = 0 while b > 0: if b & 1: res = ((res % modulus) + (a % modulus)) % modulus a += a b >>= 1 return res if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/binomial_coefficient.py ================================================ def binomial_coefficient(n: int, r: int) -> int: """ Find binomial coefficient using Pascal's triangle. Calculate C(n, r) using Pascal's triangle. :param n: The total number of items. :param r: The number of items to choose. :return: The binomial coefficient C(n, r). >>> binomial_coefficient(10, 5) 252 >>> binomial_coefficient(10, 0) 1 >>> binomial_coefficient(0, 10) 1 >>> binomial_coefficient(10, 10) 1 >>> binomial_coefficient(5, 2) 10 >>> binomial_coefficient(5, 6) 0 >>> binomial_coefficient(3, 5) 0 >>> binomial_coefficient(-2, 3) Traceback (most recent call last): ... ValueError: n and r must be non-negative integers >>> binomial_coefficient(5, -1) Traceback (most recent call last): ... ValueError: n and r must be non-negative integers >>> binomial_coefficient(10.1, 5) Traceback (most recent call last): ... TypeError: 'float' object cannot be interpreted as an integer >>> binomial_coefficient(10, 5.1) Traceback (most recent call last): ... TypeError: 'float' object cannot be interpreted as an integer """ if n < 0 or r < 0: raise ValueError("n and r must be non-negative integers") if 0 in (n, r): return 1 c = [0 for i in range(r + 1)] # nc0 = 1 c[0] = 1 for i in range(1, n + 1): # to compute current row from previous row. j = min(i, r) while j > 0: c[j] += c[j - 1] j -= 1 return c[r] if __name__ == "__main__": from doctest import testmod testmod() print(binomial_coefficient(n=10, r=5)) ================================================ FILE: maths/binomial_distribution.py ================================================ """For more information about the Binomial Distribution - https://en.wikipedia.org/wiki/Binomial_distribution""" from math import factorial def binomial_distribution(successes: int, trials: int, prob: float) -> float: """ Return probability of k successes out of n tries, with p probability for one success The function uses the factorial function in order to calculate the binomial coefficient >>> binomial_distribution(3, 5, 0.7) 0.30870000000000003 >>> binomial_distribution (2, 4, 0.5) 0.375 """ if successes > trials: raise ValueError("""successes must be lower or equal to trials""") if trials < 0 or successes < 0: raise ValueError("the function is defined for non-negative integers") if not isinstance(successes, int) or not isinstance(trials, int): raise ValueError("the function is defined for non-negative integers") if not 0 < prob < 1: raise ValueError("prob has to be in range of 1 - 0") probability = (prob**successes) * ((1 - prob) ** (trials - successes)) # Calculate the binomial coefficient: n! / k!(n-k)! coefficient = float(factorial(trials)) coefficient /= factorial(successes) * factorial(trials - successes) return probability * coefficient if __name__ == "__main__": from doctest import testmod testmod() print("Probability of 2 successes out of 4 trails") print("with probability of 0.75 is:", end=" ") print(binomial_distribution(2, 4, 0.75)) ================================================ FILE: maths/ceil.py ================================================ """ https://en.wikipedia.org/wiki/Floor_and_ceiling_functions """ def ceil(x: float) -> int: """ Return the ceiling of x as an Integral. :param x: the number :return: the smallest integer >= x. >>> import math >>> all(ceil(n) == math.ceil(n) for n ... in (1, -1, 0, -0, 1.1, -1.1, 1.0, -1.0, 1_000_000_000)) True """ return int(x) if x - int(x) <= 0 else int(x) + 1 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/chebyshev_distance.py ================================================ def chebyshev_distance(point_a: list[float], point_b: list[float]) -> float: """ This function calculates the Chebyshev distance (also known as the Chessboard distance) between two n-dimensional points represented as lists. https://en.wikipedia.org/wiki/Chebyshev_distance >>> chebyshev_distance([1.0, 1.0], [2.0, 2.0]) 1.0 >>> chebyshev_distance([1.0, 1.0, 9.0], [2.0, 2.0, -5.2]) 14.2 >>> chebyshev_distance([1.0], [2.0, 2.0]) Traceback (most recent call last): ... ValueError: Both points must have the same dimension. """ if len(point_a) != len(point_b): raise ValueError("Both points must have the same dimension.") return max(abs(a - b) for a, b in zip(point_a, point_b)) ================================================ FILE: maths/check_polygon.py ================================================ from __future__ import annotations def check_polygon(nums: list[float]) -> bool: """ Takes list of possible side lengths and determines whether a two-dimensional polygon with such side lengths can exist. Returns a boolean value for the < comparison of the largest side length with sum of the rest. Wiki: https://en.wikipedia.org/wiki/Triangle_inequality >>> check_polygon([6, 10, 5]) True >>> check_polygon([3, 7, 13, 2]) False >>> check_polygon([1, 4.3, 5.2, 12.2]) False >>> nums = [3, 7, 13, 2] >>> _ = check_polygon(nums) # Run function, do not show answer in output >>> nums # Check numbers are not reordered [3, 7, 13, 2] >>> check_polygon([]) Traceback (most recent call last): ... ValueError: Monogons and Digons are not polygons in the Euclidean space >>> check_polygon([-2, 5, 6]) Traceback (most recent call last): ... ValueError: All values must be greater than 0 """ if len(nums) < 2: raise ValueError("Monogons and Digons are not polygons in the Euclidean space") if any(i <= 0 for i in nums): raise ValueError("All values must be greater than 0") copy_nums = nums.copy() copy_nums.sort() return copy_nums[-1] < sum(copy_nums[:-1]) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/chinese_remainder_theorem.py ================================================ """ Chinese Remainder Theorem: GCD ( Greatest Common Divisor ) or HCF ( Highest Common Factor ) If GCD(a,b) = 1, then for any remainder ra modulo a and any remainder rb modulo b there exists integer n, such that n = ra (mod a) and n = ra(mod b). If n1 and n2 are two such integers, then n1=n2(mod ab) Algorithm : 1. Use extended euclid algorithm to find x,y such that a*x + b*y = 1 2. Take n = ra*by + rb*ax """ from __future__ import annotations # Extended Euclid def extended_euclid(a: int, b: int) -> tuple[int, int]: """ >>> extended_euclid(10, 6) (-1, 2) >>> extended_euclid(7, 5) (-2, 3) """ if b == 0: return (1, 0) (x, y) = extended_euclid(b, a % b) k = a // b return (y, x - k * y) # Uses ExtendedEuclid to find inverses def chinese_remainder_theorem(n1: int, r1: int, n2: int, r2: int) -> int: """ >>> chinese_remainder_theorem(5,1,7,3) 31 Explanation : 31 is the smallest number such that (i) When we divide it by 5, we get remainder 1 (ii) When we divide it by 7, we get remainder 3 >>> chinese_remainder_theorem(6,1,4,3) 14 """ (x, y) = extended_euclid(n1, n2) m = n1 * n2 n = r2 * x * n1 + r1 * y * n2 return (n % m + m) % m # ----------SAME SOLUTION USING InvertModulo instead ExtendedEuclid---------------- # This function find the inverses of a i.e., a^(-1) def invert_modulo(a: int, n: int) -> int: """ >>> invert_modulo(2, 5) 3 >>> invert_modulo(8,7) 1 """ (b, _x) = extended_euclid(a, n) if b < 0: b = (b % n + n) % n return b # Same a above using InvertingModulo def chinese_remainder_theorem2(n1: int, r1: int, n2: int, r2: int) -> int: """ >>> chinese_remainder_theorem2(5,1,7,3) 31 >>> chinese_remainder_theorem2(6,1,4,3) 14 """ x, y = invert_modulo(n1, n2), invert_modulo(n2, n1) m = n1 * n2 n = r2 * x * n1 + r1 * y * n2 return (n % m + m) % m if __name__ == "__main__": from doctest import testmod testmod(name="chinese_remainder_theorem", verbose=True) testmod(name="chinese_remainder_theorem2", verbose=True) testmod(name="invert_modulo", verbose=True) testmod(name="extended_euclid", verbose=True) ================================================ FILE: maths/chudnovsky_algorithm.py ================================================ from decimal import Decimal, getcontext from math import ceil, factorial def pi(precision: int) -> str: """ The Chudnovsky algorithm is a fast method for calculating the digits of PI, based on Ramanujan's PI formulae. https://en.wikipedia.org/wiki/Chudnovsky_algorithm PI = constant_term / ((multinomial_term * linear_term) / exponential_term) where constant_term = 426880 * sqrt(10005) The linear_term and the exponential_term can be defined iteratively as follows: L_k+1 = L_k + 545140134 where L_0 = 13591409 X_k+1 = X_k * -262537412640768000 where X_0 = 1 The multinomial_term is defined as follows: 6k! / ((3k)! * (k!) ^ 3) where k is the k_th iteration. This algorithm correctly calculates around 14 digits of PI per iteration >>> pi(10) '3.14159265' >>> pi(100) '3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706' >>> pi('hello') Traceback (most recent call last): ... TypeError: Undefined for non-integers >>> pi(-1) Traceback (most recent call last): ... ValueError: Undefined for non-natural numbers """ if not isinstance(precision, int): raise TypeError("Undefined for non-integers") elif precision < 1: raise ValueError("Undefined for non-natural numbers") getcontext().prec = precision num_iterations = ceil(precision / 14) constant_term = 426880 * Decimal(10005).sqrt() exponential_term = 1 linear_term = 13591409 partial_sum = Decimal(linear_term) for k in range(1, num_iterations): multinomial_term = factorial(6 * k) // (factorial(3 * k) * factorial(k) ** 3) linear_term += 545140134 exponential_term *= -262537412640768000 partial_sum += Decimal(multinomial_term * linear_term) / exponential_term return str(constant_term / partial_sum)[:-1] if __name__ == "__main__": n = 50 print(f"The first {n} digits of pi is: {pi(n)}") ================================================ FILE: maths/collatz_sequence.py ================================================ """ The Collatz conjecture is a famous unsolved problem in mathematics. Given a starting positive integer, define the following sequence: - If the current term n is even, then the next term is n/2. - If the current term n is odd, then the next term is 3n + 1. The conjecture claims that this sequence will always reach 1 for any starting number. Other names for this problem include the 3n + 1 problem, the Ulam conjecture, Kakutani's problem, the Thwaites conjecture, Hasse's algorithm, the Syracuse problem, and the hailstone sequence. Reference: https://en.wikipedia.org/wiki/Collatz_conjecture """ from __future__ import annotations from collections.abc import Generator def collatz_sequence(n: int) -> Generator[int]: """ Generate the Collatz sequence starting at n. >>> tuple(collatz_sequence(2.1)) Traceback (most recent call last): ... Exception: Sequence only defined for positive integers >>> tuple(collatz_sequence(0)) Traceback (most recent call last): ... Exception: Sequence only defined for positive integers >>> tuple(collatz_sequence(4)) (4, 2, 1) >>> tuple(collatz_sequence(11)) (11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1) >>> tuple(collatz_sequence(31)) # doctest: +NORMALIZE_WHITESPACE (31, 94, 47, 142, 71, 214, 107, 322, 161, 484, 242, 121, 364, 182, 91, 274, 137, 412, 206, 103, 310, 155, 466, 233, 700, 350, 175, 526, 263, 790, 395, 1186, 593, 1780, 890, 445, 1336, 668, 334, 167, 502, 251, 754, 377, 1132, 566, 283, 850, 425, 1276, 638, 319, 958, 479, 1438, 719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644, 1822, 911, 2734, 1367, 4102, 2051, 6154, 3077, 9232, 4616, 2308, 1154, 577, 1732, 866, 433, 1300, 650, 325, 976, 488, 244, 122, 61, 184, 92, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1) >>> tuple(collatz_sequence(43)) # doctest: +NORMALIZE_WHITESPACE (43, 130, 65, 196, 98, 49, 148, 74, 37, 112, 56, 28, 14, 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1) """ if not isinstance(n, int) or n < 1: raise Exception("Sequence only defined for positive integers") yield n while n != 1: if n % 2 == 0: n //= 2 else: n = 3 * n + 1 yield n def main(): n = int(input("Your number: ")) sequence = tuple(collatz_sequence(n)) print(sequence) print(f"Collatz sequence from {n} took {len(sequence)} steps.") if __name__ == "__main__": main() ================================================ FILE: maths/combinations.py ================================================ """ https://en.wikipedia.org/wiki/Combination """ def combinations(n: int, k: int) -> int: """ Returns the number of different combinations of k length which can be made from n values, where n >= k. Examples: >>> combinations(10,5) 252 >>> combinations(6,3) 20 >>> combinations(20,5) 15504 >>> combinations(52, 5) 2598960 >>> combinations(0, 0) 1 >>> combinations(-4, -5) ... Traceback (most recent call last): ValueError: Please enter positive integers for n and k where n >= k """ # If either of the conditions are true, the function is being asked # to calculate a factorial of a negative number, which is not possible if n < k or k < 0: raise ValueError("Please enter positive integers for n and k where n >= k") res = 1 for i in range(k): res *= n - i res //= i + 1 return res if __name__ == "__main__": print( "The number of five-card hands possible from a standard", f"fifty-two card deck is: {combinations(52, 5)}\n", ) print( "If a class of 40 students must be arranged into groups of", f"4 for group projects, there are {combinations(40, 4)} ways", "to arrange them.\n", ) print( "If 10 teams are competing in a Formula One race, there", f"are {combinations(10, 3)} ways that first, second and", "third place can be awarded.", ) ================================================ FILE: maths/continued_fraction.py ================================================ """ Finding the continuous fraction for a rational number using python https://en.wikipedia.org/wiki/Continued_fraction """ from fractions import Fraction from math import floor def continued_fraction(num: Fraction) -> list[int]: """ :param num: Fraction of the number whose continued fractions to be found. Use Fraction(str(number)) for more accurate results due to float inaccuracies. :return: The continued fraction of rational number. It is the all commas in the (n + 1)-tuple notation. >>> continued_fraction(Fraction(2)) [2] >>> continued_fraction(Fraction("3.245")) [3, 4, 12, 4] >>> continued_fraction(Fraction("2.25")) [2, 4] >>> continued_fraction(1/Fraction("2.25")) [0, 2, 4] >>> continued_fraction(Fraction("415/93")) [4, 2, 6, 7] >>> continued_fraction(Fraction(0)) [0] >>> continued_fraction(Fraction(0.75)) [0, 1, 3] >>> continued_fraction(Fraction("-2.25")) # -2.25 = -3 + 0.75 [-3, 1, 3] """ numerator, denominator = num.as_integer_ratio() continued_fraction_list: list[int] = [] while True: integer_part = floor(numerator / denominator) continued_fraction_list.append(integer_part) numerator -= integer_part * denominator if numerator == 0: break numerator, denominator = denominator, numerator return continued_fraction_list if __name__ == "__main__": import doctest doctest.testmod() print("Continued Fraction of 0.84375 is: ", continued_fraction(Fraction("0.84375"))) ================================================ FILE: maths/decimal_isolate.py ================================================ """ Isolate the Decimal part of a Number https://stackoverflow.com/questions/3886402/how-to-get-numbers-after-decimal-point """ def decimal_isolate(number: float, digit_amount: int) -> float: """ Isolates the decimal part of a number. If digitAmount > 0 round to that decimal place, else print the entire decimal. >>> decimal_isolate(1.53, 0) 0.53 >>> decimal_isolate(35.345, 1) 0.3 >>> decimal_isolate(35.345, 2) 0.34 >>> decimal_isolate(35.345, 3) 0.345 >>> decimal_isolate(-14.789, 3) -0.789 >>> decimal_isolate(0, 2) 0 >>> decimal_isolate(-14.123, 1) -0.1 >>> decimal_isolate(-14.123, 2) -0.12 >>> decimal_isolate(-14.123, 3) -0.123 """ if digit_amount > 0: return round(number - int(number), digit_amount) return number - int(number) if __name__ == "__main__": print(decimal_isolate(1.53, 0)) print(decimal_isolate(35.345, 1)) print(decimal_isolate(35.345, 2)) print(decimal_isolate(35.345, 3)) print(decimal_isolate(-14.789, 3)) print(decimal_isolate(0, 2)) print(decimal_isolate(-14.123, 1)) print(decimal_isolate(-14.123, 2)) print(decimal_isolate(-14.123, 3)) ================================================ FILE: maths/decimal_to_fraction.py ================================================ def decimal_to_fraction(decimal: float | str) -> tuple[int, int]: """ Return a decimal number in its simplest fraction form >>> decimal_to_fraction(2) (2, 1) >>> decimal_to_fraction(89.) (89, 1) >>> decimal_to_fraction("67") (67, 1) >>> decimal_to_fraction("45.0") (45, 1) >>> decimal_to_fraction(1.5) (3, 2) >>> decimal_to_fraction("6.25") (25, 4) >>> decimal_to_fraction("78td") Traceback (most recent call last): ValueError: Please enter a valid number >>> decimal_to_fraction(0) (0, 1) >>> decimal_to_fraction(-2.5) (-5, 2) >>> decimal_to_fraction(0.125) (1, 8) >>> decimal_to_fraction(1000000.25) (4000001, 4) >>> decimal_to_fraction(1.3333) (13333, 10000) >>> decimal_to_fraction("1.23e2") (123, 1) >>> decimal_to_fraction("0.500") (1, 2) """ try: decimal = float(decimal) except ValueError: raise ValueError("Please enter a valid number") fractional_part = decimal - int(decimal) if fractional_part == 0: return int(decimal), 1 else: number_of_frac_digits = len(str(decimal).split(".")[1]) numerator = int(decimal * (10**number_of_frac_digits)) denominator = 10**number_of_frac_digits divisor, dividend = denominator, numerator while True: remainder = dividend % divisor if remainder == 0: break dividend, divisor = divisor, remainder numerator, denominator = numerator // divisor, denominator // divisor return numerator, denominator if __name__ == "__main__": print(f"{decimal_to_fraction(2) = }") print(f"{decimal_to_fraction(89.0) = }") print(f"{decimal_to_fraction('67') = }") print(f"{decimal_to_fraction('45.0') = }") print(f"{decimal_to_fraction(1.5) = }") print(f"{decimal_to_fraction('6.25') = }") print(f"{decimal_to_fraction('78td') = }") ================================================ FILE: maths/dodecahedron.py ================================================ # dodecahedron.py """ A regular dodecahedron is a three-dimensional figure made up of 12 pentagon faces having the same equal size. """ def dodecahedron_surface_area(edge: float) -> float: """ Calculates the surface area of a regular dodecahedron a = 3 * ((25 + 10 * (5** (1 / 2))) ** (1 / 2 )) * (e**2) where: a --> is the area of the dodecahedron e --> is the length of the edge reference-->"Dodecahedron" Study.com :param edge: length of the edge of the dodecahedron :type edge: float :return: the surface area of the dodecahedron as a float Tests: >>> dodecahedron_surface_area(5) 516.1432201766901 >>> dodecahedron_surface_area(10) 2064.5728807067603 >>> dodecahedron_surface_area(-1) Traceback (most recent call last): ... ValueError: Length must be a positive. """ if edge <= 0 or not isinstance(edge, int): raise ValueError("Length must be a positive.") return 3 * ((25 + 10 * (5 ** (1 / 2))) ** (1 / 2)) * (edge**2) def dodecahedron_volume(edge: float) -> float: """ Calculates the volume of a regular dodecahedron v = ((15 + (7 * (5** (1 / 2)))) / 4) * (e**3) where: v --> is the volume of the dodecahedron e --> is the length of the edge reference-->"Dodecahedron" Study.com :param edge: length of the edge of the dodecahedron :type edge: float :return: the volume of the dodecahedron as a float Tests: >>> dodecahedron_volume(5) 957.8898700780791 >>> dodecahedron_volume(10) 7663.118960624633 >>> dodecahedron_volume(-1) Traceback (most recent call last): ... ValueError: Length must be a positive. """ if edge <= 0 or not isinstance(edge, int): raise ValueError("Length must be a positive.") return ((15 + (7 * (5 ** (1 / 2)))) / 4) * (edge**3) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/double_factorial.py ================================================ def double_factorial_recursive(n: int) -> int: """ Compute double factorial using recursive method. Recursion can be costly for large numbers. To learn about the theory behind this algorithm: https://en.wikipedia.org/wiki/Double_factorial >>> from math import prod >>> all(double_factorial_recursive(i) == prod(range(i, 0, -2)) for i in range(20)) True >>> double_factorial_recursive(0.1) Traceback (most recent call last): ... ValueError: double_factorial_recursive() only accepts integral values >>> double_factorial_recursive(-1) Traceback (most recent call last): ... ValueError: double_factorial_recursive() not defined for negative values """ if not isinstance(n, int): raise ValueError("double_factorial_recursive() only accepts integral values") if n < 0: raise ValueError("double_factorial_recursive() not defined for negative values") return 1 if n <= 1 else n * double_factorial_recursive(n - 2) def double_factorial_iterative(num: int) -> int: """ Compute double factorial using iterative method. To learn about the theory behind this algorithm: https://en.wikipedia.org/wiki/Double_factorial >>> from math import prod >>> all(double_factorial_iterative(i) == prod(range(i, 0, -2)) for i in range(20)) True >>> double_factorial_iterative(0.1) Traceback (most recent call last): ... ValueError: double_factorial_iterative() only accepts integral values >>> double_factorial_iterative(-1) Traceback (most recent call last): ... ValueError: double_factorial_iterative() not defined for negative values """ if not isinstance(num, int): raise ValueError("double_factorial_iterative() only accepts integral values") if num < 0: raise ValueError("double_factorial_iterative() not defined for negative values") value = 1 for i in range(num, 0, -2): value *= i return value if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/dual_number_automatic_differentiation.py ================================================ from math import factorial """ https://en.wikipedia.org/wiki/Automatic_differentiation#Automatic_differentiation_using_dual_numbers https://blog.jliszka.org/2013/10/24/exact-numeric-nth-derivatives.html Note this only works for basic functions, f(x) where the power of x is positive. """ class Dual: def __init__(self, real, rank): self.real = real if isinstance(rank, int): self.duals = [1] * rank else: self.duals = rank def __repr__(self): s = "+".join(f"{dual}E{n}" for n, dual in enumerate(self.duals, 1)) return f"{self.real}+{s}" def reduce(self): cur = self.duals.copy() while cur[-1] == 0: cur.pop(-1) return Dual(self.real, cur) def __add__(self, other): if not isinstance(other, Dual): return Dual(self.real + other, self.duals) s_dual = self.duals.copy() o_dual = other.duals.copy() if len(s_dual) > len(o_dual): o_dual.extend([1] * (len(s_dual) - len(o_dual))) elif len(s_dual) < len(o_dual): s_dual.extend([1] * (len(o_dual) - len(s_dual))) new_duals = [] for i in range(len(s_dual)): new_duals.append(s_dual[i] + o_dual[i]) return Dual(self.real + other.real, new_duals) __radd__ = __add__ def __sub__(self, other): return self + other * -1 def __mul__(self, other): if not isinstance(other, Dual): new_duals = [] for i in self.duals: new_duals.append(i * other) return Dual(self.real * other, new_duals) new_duals = [0] * (len(self.duals) + len(other.duals) + 1) for i, item in enumerate(self.duals): for j, jtem in enumerate(other.duals): new_duals[i + j + 1] += item * jtem for k in range(len(self.duals)): new_duals[k] += self.duals[k] * other.real for index in range(len(other.duals)): new_duals[index] += other.duals[index] * self.real return Dual(self.real * other.real, new_duals) __rmul__ = __mul__ def __truediv__(self, other): if not isinstance(other, Dual): new_duals = [] for i in self.duals: new_duals.append(i / other) return Dual(self.real / other, new_duals) raise ValueError def __floordiv__(self, other): if not isinstance(other, Dual): new_duals = [] for i in self.duals: new_duals.append(i // other) return Dual(self.real // other, new_duals) raise ValueError def __pow__(self, n): if n < 0 or isinstance(n, float): raise ValueError("power must be a positive integer") if n == 0: return 1 if n == 1: return self x = self for _ in range(n - 1): x *= self return x def differentiate(func, position, order): """ >>> differentiate(lambda x: x**2, 2, 2) 2 >>> differentiate(lambda x: x**2 * x**4, 9, 2) 196830 >>> differentiate(lambda y: 0.5 * (y + 3) ** 6, 3.5, 4) 7605.0 >>> differentiate(lambda y: y ** 2, 4, 3) 0 >>> differentiate(8, 8, 8) Traceback (most recent call last): ... ValueError: differentiate() requires a function as input for func >>> differentiate(lambda x: x **2, "", 1) Traceback (most recent call last): ... ValueError: differentiate() requires a float as input for position >>> differentiate(lambda x: x**2, 3, "") Traceback (most recent call last): ... ValueError: differentiate() requires an int as input for order """ if not callable(func): raise ValueError("differentiate() requires a function as input for func") if not isinstance(position, (float, int)): raise ValueError("differentiate() requires a float as input for position") if not isinstance(order, int): raise ValueError("differentiate() requires an int as input for order") d = Dual(position, 1) result = func(d) if order == 0: return result.real return result.duals[order - 1] * factorial(order) if __name__ == "__main__": import doctest doctest.testmod() def f(y): return y**2 * y**4 print(differentiate(f, 9, 2)) ================================================ FILE: maths/entropy.py ================================================ #!/usr/bin/env python3 """ Implementation of entropy of information https://en.wikipedia.org/wiki/Entropy_(information_theory) """ from __future__ import annotations import math from collections import Counter from string import ascii_lowercase def calculate_prob(text: str) -> None: """ This method takes path and two dict as argument and than calculates entropy of them. :param dict: :param dict: :return: Prints 1) Entropy of information based on 1 alphabet 2) Entropy of information based on couples of 2 alphabet 3) print Entropy of H(X n|Xn-1) Text from random books. Also, random quotes. >>> text = ("Behind Winston's back the voice " ... "from the telescreen was still " ... "babbling and the overfulfilment") >>> calculate_prob(text) 4.0 6.0 2.0 >>> text = ("The Ministry of Truth—Minitrue, in Newspeak [Newspeak was the official" ... "face in elegant lettering, the three") >>> calculate_prob(text) 4.0 5.0 1.0 >>> text = ("Had repulsive dashwoods suspicion sincerity but advantage now him. " ... "Remark easily garret nor nay. Civil those mrs enjoy shy fat merry. " ... "You greatest jointure saw horrible. He private he on be imagine " ... "suppose. Fertile beloved evident through no service elderly is. Blind " ... "there if every no so at. Own neglected you preferred way sincerity " ... "delivered his attempted. To of message cottage windows do besides " ... "against uncivil. Delightful unreserved impossible few estimating " ... "men favourable see entreaties. She propriety immediate was improving. " ... "He or entrance humoured likewise moderate. Much nor game son say " ... "feel. Fat make met can must form into gate. Me we offending prevailed " ... "discovery.") >>> calculate_prob(text) 4.0 7.0 3.0 """ single_char_strings, two_char_strings = analyze_text(text) my_alphas = list(" " + ascii_lowercase) # what is our total sum of probabilities. all_sum = sum(single_char_strings.values()) # one length string my_fir_sum = 0 # for each alpha we go in our dict and if it is in it we calculate entropy for ch in my_alphas: if ch in single_char_strings: my_str = single_char_strings[ch] prob = my_str / all_sum my_fir_sum += prob * math.log2(prob) # entropy formula. # print entropy print(f"{round(-1 * my_fir_sum):.1f}") # two len string all_sum = sum(two_char_strings.values()) my_sec_sum = 0 # for each alpha (two in size) calculate entropy. for ch0 in my_alphas: for ch1 in my_alphas: sequence = ch0 + ch1 if sequence in two_char_strings: my_str = two_char_strings[sequence] prob = int(my_str) / all_sum my_sec_sum += prob * math.log2(prob) # print second entropy print(f"{round(-1 * my_sec_sum):.1f}") # print the difference between them print(f"{round((-1 * my_sec_sum) - (-1 * my_fir_sum)):.1f}") def analyze_text(text: str) -> tuple[dict, dict]: """ Convert text input into two dicts of counts. The first dictionary stores the frequency of single character strings. The second dictionary stores the frequency of two character strings. """ single_char_strings = Counter() # type: ignore[var-annotated] two_char_strings = Counter() # type: ignore[var-annotated] single_char_strings[text[-1]] += 1 # first case when we have space at start. two_char_strings[" " + text[0]] += 1 for i in range(len(text) - 1): single_char_strings[text[i]] += 1 two_char_strings[text[i : i + 2]] += 1 return single_char_strings, two_char_strings def main(): import doctest doctest.testmod() # text = ( # "Had repulsive dashwoods suspicion sincerity but advantage now him. Remark " # "easily garret nor nay. Civil those mrs enjoy shy fat merry. You greatest " # "jointure saw horrible. He private he on be imagine suppose. Fertile " # "beloved evident through no service elderly is. Blind there if every no so " # "at. Own neglected you preferred way sincerity delivered his attempted. To " # "of message cottage windows do besides against uncivil. Delightful " # "unreserved impossible few estimating men favourable see entreaties. She " # "propriety immediate was improving. He or entrance humoured likewise " # "moderate. Much nor game son say feel. Fat make met can must form into " # "gate. Me we offending prevailed discovery. " # ) # calculate_prob(text) if __name__ == "__main__": main() ================================================ FILE: maths/euclidean_distance.py ================================================ from __future__ import annotations import typing from collections.abc import Iterable import numpy as np Vector = typing.Union[Iterable[float], Iterable[int], np.ndarray] # noqa: UP007 VectorOut = typing.Union[np.float64, int, float] # noqa: UP007 def euclidean_distance(vector_1: Vector, vector_2: Vector) -> VectorOut: """ Calculate the distance between the two endpoints of two vectors. A vector is defined as a list, tuple, or numpy 1D array. >>> float(euclidean_distance((0, 0), (2, 2))) 2.8284271247461903 >>> float(euclidean_distance(np.array([0, 0, 0]), np.array([2, 2, 2]))) 3.4641016151377544 >>> float(euclidean_distance(np.array([1, 2, 3, 4]), np.array([5, 6, 7, 8]))) 8.0 >>> float(euclidean_distance([1, 2, 3, 4], [5, 6, 7, 8])) 8.0 """ return np.sqrt(np.sum((np.asarray(vector_1) - np.asarray(vector_2)) ** 2)) def euclidean_distance_no_np(vector_1: Vector, vector_2: Vector) -> VectorOut: """ Calculate the distance between the two endpoints of two vectors without numpy. A vector is defined as a list, tuple, or numpy 1D array. >>> euclidean_distance_no_np((0, 0), (2, 2)) 2.8284271247461903 >>> euclidean_distance_no_np([1, 2, 3, 4], [5, 6, 7, 8]) 8.0 """ return sum((v1 - v2) ** 2 for v1, v2 in zip(vector_1, vector_2)) ** (1 / 2) if __name__ == "__main__": def benchmark() -> None: """ Benchmarks """ from timeit import timeit print("Without Numpy") print( timeit( "euclidean_distance_no_np([1, 2, 3], [4, 5, 6])", number=10000, globals=globals(), ) ) print("With Numpy") print( timeit( "euclidean_distance([1, 2, 3], [4, 5, 6])", number=10000, globals=globals(), ) ) benchmark() ================================================ FILE: maths/euler_method.py ================================================ from collections.abc import Callable import numpy as np def explicit_euler( ode_func: Callable, y0: float, x0: float, step_size: float, x_end: float ) -> np.ndarray: """Calculate numeric solution at each step to an ODE using Euler's Method For reference to Euler's method refer to https://en.wikipedia.org/wiki/Euler_method. Args: ode_func (Callable): The ordinary differential equation as a function of x and y. y0 (float): The initial value for y. x0 (float): The initial value for x. step_size (float): The increment value for x. x_end (float): The final value of x to be calculated. Returns: np.ndarray: Solution of y for every step in x. >>> # the exact solution is math.exp(x) >>> def f(x, y): ... return y >>> y0 = 1 >>> y = explicit_euler(f, y0, 0.0, 0.01, 5) >>> float(y[-1]) 144.77277243257308 """ n = int(np.ceil((x_end - x0) / step_size)) y = np.zeros((n + 1,)) y[0] = y0 x = x0 for k in range(n): y[k + 1] = y[k] + step_size * ode_func(x, y[k]) x += step_size return y if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/euler_modified.py ================================================ from collections.abc import Callable import numpy as np def euler_modified( ode_func: Callable, y0: float, x0: float, step_size: float, x_end: float ) -> np.ndarray: """ Calculate solution at each step to an ODE using Euler's Modified Method The Euler Method is straightforward to implement, but can't give accurate solutions. So, some changes were proposed to improve accuracy. https://en.wikipedia.org/wiki/Euler_method Arguments: ode_func -- The ode as a function of x and y y0 -- the initial value for y x0 -- the initial value for x stepsize -- the increment value for x x_end -- the end value for x >>> # the exact solution is math.exp(x) >>> def f1(x, y): ... return -2*x*(y**2) >>> y = euler_modified(f1, 1.0, 0.0, 0.2, 1.0) >>> float(y[-1]) 0.503338255442106 >>> import math >>> def f2(x, y): ... return -2*y + (x**3)*math.exp(-2*x) >>> y = euler_modified(f2, 1.0, 0.0, 0.1, 0.3) >>> float(y[-1]) 0.5525976431951775 """ n = int(np.ceil((x_end - x0) / step_size)) y = np.zeros((n + 1,)) y[0] = y0 x = x0 for k in range(n): y_get = y[k] + step_size * ode_func(x, y[k]) y[k + 1] = y[k] + ( (step_size / 2) * (ode_func(x, y[k]) + ode_func(x + step_size, y_get)) ) x += step_size return y if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/eulers_totient.py ================================================ # Eulers Totient function finds the number of relative primes of a number n from 1 to n def totient(n: int) -> list: """ >>> n = 10 >>> totient_calculation = totient(n) >>> for i in range(1, n): ... print(f"{i} has {totient_calculation[i]} relative primes.") 1 has 0 relative primes. 2 has 1 relative primes. 3 has 2 relative primes. 4 has 2 relative primes. 5 has 4 relative primes. 6 has 2 relative primes. 7 has 6 relative primes. 8 has 4 relative primes. 9 has 6 relative primes. """ is_prime = [True for i in range(n + 1)] totients = [i - 1 for i in range(n + 1)] primes = [] for i in range(2, n + 1): if is_prime[i]: primes.append(i) for j in range(len(primes)): if i * primes[j] >= n: break is_prime[i * primes[j]] = False if i % primes[j] == 0: totients[i * primes[j]] = totients[i] * primes[j] break totients[i * primes[j]] = totients[i] * (primes[j] - 1) return totients if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/extended_euclidean_algorithm.py ================================================ """ Extended Euclidean Algorithm. Finds 2 numbers a and b such that it satisfies the equation am + bn = gcd(m, n) (a.k.a Bezout's Identity) https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm """ # @Author: S. Sharma # @Date: 2019-02-25T12:08:53-06:00 # @Email: silentcat@protonmail.com # @Last modified by: pikulet # @Last modified time: 2020-10-02 from __future__ import annotations import sys def extended_euclidean_algorithm(a: int, b: int) -> tuple[int, int]: """ Extended Euclidean Algorithm. Finds 2 numbers a and b such that it satisfies the equation am + bn = gcd(m, n) (a.k.a Bezout's Identity) >>> extended_euclidean_algorithm(1, 24) (1, 0) >>> extended_euclidean_algorithm(8, 14) (2, -1) >>> extended_euclidean_algorithm(240, 46) (-9, 47) >>> extended_euclidean_algorithm(1, -4) (1, 0) >>> extended_euclidean_algorithm(-2, -4) (-1, 0) >>> extended_euclidean_algorithm(0, -4) (0, -1) >>> extended_euclidean_algorithm(2, 0) (1, 0) """ # base cases if abs(a) == 1: return a, 0 elif abs(b) == 1: return 0, b old_remainder, remainder = a, b old_coeff_a, coeff_a = 1, 0 old_coeff_b, coeff_b = 0, 1 while remainder != 0: quotient = old_remainder // remainder old_remainder, remainder = remainder, old_remainder - quotient * remainder old_coeff_a, coeff_a = coeff_a, old_coeff_a - quotient * coeff_a old_coeff_b, coeff_b = coeff_b, old_coeff_b - quotient * coeff_b # sign correction for negative numbers if a < 0: old_coeff_a = -old_coeff_a if b < 0: old_coeff_b = -old_coeff_b return old_coeff_a, old_coeff_b def main(): """Call Extended Euclidean Algorithm.""" if len(sys.argv) < 3: print("2 integer arguments required") return 1 a = int(sys.argv[1]) b = int(sys.argv[2]) print(extended_euclidean_algorithm(a, b)) return 0 if __name__ == "__main__": raise SystemExit(main()) ================================================ FILE: maths/factorial.py ================================================ """ Factorial of a positive integer -- https://en.wikipedia.org/wiki/Factorial """ def factorial(number: int) -> int: """ Calculate the factorial of specified number (n!). >>> import math >>> all(factorial(i) == math.factorial(i) for i in range(20)) True >>> factorial(0.1) Traceback (most recent call last): ... ValueError: factorial() only accepts integral values >>> factorial(-1) Traceback (most recent call last): ... ValueError: factorial() not defined for negative values >>> factorial(1) 1 >>> factorial(6) 720 >>> factorial(0) 1 """ if number != int(number): raise ValueError("factorial() only accepts integral values") if number < 0: raise ValueError("factorial() not defined for negative values") value = 1 for i in range(1, number + 1): value *= i return value def factorial_recursive(n: int) -> int: """ Calculate the factorial of a positive integer https://en.wikipedia.org/wiki/Factorial >>> import math >>> all(factorial_recursive(i) == math.factorial(i) for i in range(20)) True >>> factorial_recursive(0.1) Traceback (most recent call last): ... ValueError: factorial_recursive() only accepts integral values >>> factorial_recursive(-1) Traceback (most recent call last): ... ValueError: factorial_recursive() not defined for negative values """ if not isinstance(n, int): raise ValueError("factorial_recursive() only accepts integral values") if n < 0: raise ValueError("factorial_recursive() not defined for negative values") return 1 if n in {0, 1} else n * factorial_recursive(n - 1) if __name__ == "__main__": import doctest doctest.testmod() n = int(input("Enter a positive integer: ").strip() or 0) print(f"factorial{n} is {factorial(n)}") ================================================ FILE: maths/factors.py ================================================ from doctest import testmod from math import sqrt def factors_of_a_number(num: int) -> list: """ >>> factors_of_a_number(1) [1] >>> factors_of_a_number(5) [1, 5] >>> factors_of_a_number(24) [1, 2, 3, 4, 6, 8, 12, 24] >>> factors_of_a_number(-24) [] """ facs: list[int] = [] if num < 1: return facs facs.append(1) if num == 1: return facs facs.append(num) for i in range(2, int(sqrt(num)) + 1): if num % i == 0: # If i is a factor of num facs.append(i) d = num // i # num//i is the other factor of num if d != i: # If d and i are distinct facs.append(d) # we have found another factor facs.sort() return facs if __name__ == "__main__": testmod(name="factors_of_a_number", verbose=True) ================================================ FILE: maths/fast_inverse_sqrt.py ================================================ """ Fast inverse square root (1/sqrt(x)) using the Quake III algorithm. Reference: https://en.wikipedia.org/wiki/Fast_inverse_square_root Accuracy: https://en.wikipedia.org/wiki/Fast_inverse_square_root#Accuracy """ import struct def fast_inverse_sqrt(number: float) -> float: """ Compute the fast inverse square root of a floating-point number using the famous Quake III algorithm. :param float number: Input number for which to calculate the inverse square root. :return float: The fast inverse square root of the input number. Example: >>> fast_inverse_sqrt(10) 0.3156857923527257 >>> fast_inverse_sqrt(4) 0.49915357479239103 >>> fast_inverse_sqrt(4.1) 0.4932849504615651 >>> fast_inverse_sqrt(0) Traceback (most recent call last): ... ValueError: Input must be a positive number. >>> fast_inverse_sqrt(-1) Traceback (most recent call last): ... ValueError: Input must be a positive number. >>> from math import isclose, sqrt >>> all(isclose(fast_inverse_sqrt(i), 1 / sqrt(i), rel_tol=0.00132) ... for i in range(50, 60)) True """ if number <= 0: raise ValueError("Input must be a positive number.") i = struct.unpack(">i", struct.pack(">f", number))[0] i = 0x5F3759DF - (i >> 1) y = struct.unpack(">f", struct.pack(">i", i))[0] return y * (1.5 - 0.5 * number * y * y) if __name__ == "__main__": from doctest import testmod testmod() # https://en.wikipedia.org/wiki/Fast_inverse_square_root#Accuracy from math import sqrt for i in range(5, 101, 5): print(f"{i:>3}: {(1 / sqrt(i)) - fast_inverse_sqrt(i):.5f}") ================================================ FILE: maths/fermat_little_theorem.py ================================================ # Python program to show the usage of Fermat's little theorem in a division # According to Fermat's little theorem, (a / b) mod p always equals # a * (b ^ (p - 2)) mod p # Here we assume that p is a prime number, b divides a, and p doesn't divide b # Wikipedia reference: https://en.wikipedia.org/wiki/Fermat%27s_little_theorem def binary_exponentiation(a: int, n: float, mod: int) -> int: if n == 0: return 1 elif n % 2 == 1: return (binary_exponentiation(a, n - 1, mod) * a) % mod else: b = binary_exponentiation(a, n / 2, mod) return (b * b) % mod # a prime number p = 701 a = 1000000000 b = 10 # using binary exponentiation function, O(log(p)): print((a / b) % p == (a * binary_exponentiation(b, p - 2, p)) % p) # using Python operators: print((a / b) % p == (a * b ** (p - 2)) % p) ================================================ FILE: maths/fibonacci.py ================================================ """ Calculates the Fibonacci sequence using iteration, recursion, memoization, and a simplified form of Binet's formula NOTE 1: the iterative, recursive, memoization functions are more accurate than the Binet's formula function because the Binet formula function uses floats NOTE 2: the Binet's formula function is much more limited in the size of inputs that it can handle due to the size limitations of Python floats NOTE 3: the matrix function is the fastest and most memory efficient for large n See benchmark numbers in __main__ for performance comparisons/ https://en.wikipedia.org/wiki/Fibonacci_number for more information """ import functools from collections.abc import Iterator from math import sqrt from time import time import numpy as np from numpy import ndarray def time_func(func, *args, **kwargs): """ Times the execution of a function with parameters """ start = time() output = func(*args, **kwargs) end = time() if int(end - start) > 0: print(f"{func.__name__} runtime: {(end - start):0.4f} s") else: print(f"{func.__name__} runtime: {(end - start) * 1000:0.4f} ms") return output def fib_iterative_yield(n: int) -> Iterator[int]: """ Calculates the first n (1-indexed) Fibonacci numbers using iteration with yield >>> list(fib_iterative_yield(0)) [0] >>> tuple(fib_iterative_yield(1)) (0, 1) >>> tuple(fib_iterative_yield(5)) (0, 1, 1, 2, 3, 5) >>> tuple(fib_iterative_yield(10)) (0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55) >>> tuple(fib_iterative_yield(-1)) Traceback (most recent call last): ... ValueError: n is negative """ if n < 0: raise ValueError("n is negative") a, b = 0, 1 yield a for _ in range(n): yield b a, b = b, a + b def fib_iterative(n: int) -> list[int]: """ Calculates the first n (0-indexed) Fibonacci numbers using iteration >>> fib_iterative(0) [0] >>> fib_iterative(1) [0, 1] >>> fib_iterative(5) [0, 1, 1, 2, 3, 5] >>> fib_iterative(10) [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55] >>> fib_iterative(-1) Traceback (most recent call last): ... ValueError: n is negative """ if n < 0: raise ValueError("n is negative") if n == 0: return [0] fib = [0, 1] for _ in range(n - 1): fib.append(fib[-1] + fib[-2]) return fib def fib_recursive(n: int) -> list[int]: """ Calculates the first n (0-indexed) Fibonacci numbers using recursion >>> fib_recursive(0) [0] >>> fib_recursive(1) [0, 1] >>> fib_recursive(5) [0, 1, 1, 2, 3, 5] >>> fib_recursive(10) [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55] >>> fib_recursive(-1) Traceback (most recent call last): ... ValueError: n is negative """ def fib_recursive_term(i: int) -> int: """ Calculates the i-th (0-indexed) Fibonacci number using recursion >>> fib_recursive_term(0) 0 >>> fib_recursive_term(1) 1 >>> fib_recursive_term(5) 5 >>> fib_recursive_term(10) 55 >>> fib_recursive_term(-1) Traceback (most recent call last): ... ValueError: n is negative """ if i < 0: raise ValueError("n is negative") if i < 2: return i return fib_recursive_term(i - 1) + fib_recursive_term(i - 2) if n < 0: raise ValueError("n is negative") return [fib_recursive_term(i) for i in range(n + 1)] def fib_recursive_cached(n: int) -> list[int]: """ Calculates the first n (0-indexed) Fibonacci numbers using recursion >>> fib_recursive_cached(0) [0] >>> fib_recursive_cached(1) [0, 1] >>> fib_recursive_cached(5) [0, 1, 1, 2, 3, 5] >>> fib_recursive_cached(10) [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55] >>> fib_recursive_cached(-1) Traceback (most recent call last): ... ValueError: n is negative """ @functools.cache def fib_recursive_term(i: int) -> int: """ Calculates the i-th (0-indexed) Fibonacci number using recursion """ if i < 0: raise ValueError("n is negative") if i < 2: return i return fib_recursive_term(i - 1) + fib_recursive_term(i - 2) if n < 0: raise ValueError("n is negative") return [fib_recursive_term(i) for i in range(n + 1)] def fib_memoization(n: int) -> list[int]: """ Calculates the first n (0-indexed) Fibonacci numbers using memoization >>> fib_memoization(0) [0] >>> fib_memoization(1) [0, 1] >>> fib_memoization(5) [0, 1, 1, 2, 3, 5] >>> fib_memoization(10) [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55] >>> fib_memoization(-1) Traceback (most recent call last): ... ValueError: n is negative """ if n < 0: raise ValueError("n is negative") # Cache must be outside recursive function # other it will reset every time it calls itself. cache: dict[int, int] = {0: 0, 1: 1, 2: 1} # Prefilled cache def rec_fn_memoized(num: int) -> int: if num in cache: return cache[num] value = rec_fn_memoized(num - 1) + rec_fn_memoized(num - 2) cache[num] = value return value return [rec_fn_memoized(i) for i in range(n + 1)] def fib_binet(n: int) -> list[int]: """ Calculates the first n (0-indexed) Fibonacci numbers using a simplified form of Binet's formula: https://en.m.wikipedia.org/wiki/Fibonacci_number#Computation_by_rounding NOTE 1: this function diverges from fib_iterative at around n = 71, likely due to compounding floating-point arithmetic errors NOTE 2: this function doesn't accept n >= 1475 because it overflows thereafter due to the size limitations of Python floats >>> fib_binet(0) [0] >>> fib_binet(1) [0, 1] >>> fib_binet(5) [0, 1, 1, 2, 3, 5] >>> fib_binet(10) [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55] >>> fib_binet(-1) Traceback (most recent call last): ... ValueError: n is negative >>> fib_binet(1475) Traceback (most recent call last): ... ValueError: n is too large """ if n < 0: raise ValueError("n is negative") if n >= 1475: raise ValueError("n is too large") sqrt_5 = sqrt(5) phi = (1 + sqrt_5) / 2 return [round(phi**i / sqrt_5) for i in range(n + 1)] def matrix_pow_np(m: ndarray, power: int) -> ndarray: """ Raises a matrix to the power of 'power' using binary exponentiation. Args: m: Matrix as a numpy array. power: The power to which the matrix is to be raised. Returns: The matrix raised to the power. Raises: ValueError: If power is negative. >>> m = np.array([[1, 1], [1, 0]], dtype=int) >>> matrix_pow_np(m, 0) # Identity matrix when raised to the power of 0 array([[1, 0], [0, 1]]) >>> matrix_pow_np(m, 1) # Same matrix when raised to the power of 1 array([[1, 1], [1, 0]]) >>> matrix_pow_np(m, 5) array([[8, 5], [5, 3]]) >>> matrix_pow_np(m, -1) Traceback (most recent call last): ... ValueError: power is negative """ result = np.array([[1, 0], [0, 1]], dtype=int) # Identity Matrix base = m if power < 0: # Negative power is not allowed raise ValueError("power is negative") while power: if power % 2 == 1: result = np.dot(result, base) base = np.dot(base, base) power //= 2 return result def fib_matrix_np(n: int) -> int: """ Calculates the n-th Fibonacci number using matrix exponentiation. https://www.nayuki.io/page/fast-fibonacci-algorithms#:~:text= Summary:%20The%20two%20fast%20Fibonacci%20algorithms%20are%20matrix Args: n: Fibonacci sequence index Returns: The n-th Fibonacci number. Raises: ValueError: If n is negative. >>> fib_matrix_np(0) 0 >>> fib_matrix_np(1) 1 >>> fib_matrix_np(5) 5 >>> fib_matrix_np(10) 55 >>> fib_matrix_np(-1) Traceback (most recent call last): ... ValueError: n is negative """ if n < 0: raise ValueError("n is negative") if n == 0: return 0 m = np.array([[1, 1], [1, 0]], dtype=int) result = matrix_pow_np(m, n - 1) return int(result[0, 0]) if __name__ == "__main__": from doctest import testmod testmod() # Time on an M1 MacBook Pro -- Fastest to slowest num = 30 time_func(fib_iterative_yield, num) # 0.0012 ms time_func(fib_iterative, num) # 0.0031 ms time_func(fib_binet, num) # 0.0062 ms time_func(fib_memoization, num) # 0.0100 ms time_func(fib_recursive_cached, num) # 0.0153 ms time_func(fib_recursive, num) # 257.0910 ms time_func(fib_matrix_np, num) # 0.0000 ms ================================================ FILE: maths/find_max.py ================================================ from __future__ import annotations def find_max_iterative(nums: list[int | float]) -> int | float: """ >>> for nums in ([3, 2, 1], [-3, -2, -1], [3, -3, 0], [3.0, 3.1, 2.9]): ... find_max_iterative(nums) == max(nums) True True True True >>> find_max_iterative([2, 4, 9, 7, 19, 94, 5]) 94 >>> find_max_iterative([]) Traceback (most recent call last): ... ValueError: find_max_iterative() arg is an empty sequence """ if len(nums) == 0: raise ValueError("find_max_iterative() arg is an empty sequence") max_num = nums[0] for x in nums: if x > max_num: # noqa: PLR1730 max_num = x return max_num # Divide and Conquer algorithm def find_max_recursive(nums: list[int | float], left: int, right: int) -> int | float: """ find max value in list :param nums: contains elements :param left: index of first element :param right: index of last element :return: max in nums >>> for nums in ([3, 2, 1], [-3, -2, -1], [3, -3, 0], [3.0, 3.1, 2.9]): ... find_max_recursive(nums, 0, len(nums) - 1) == max(nums) True True True True >>> nums = [1, 3, 5, 7, 9, 2, 4, 6, 8, 10] >>> find_max_recursive(nums, 0, len(nums) - 1) == max(nums) True >>> find_max_recursive([], 0, 0) Traceback (most recent call last): ... ValueError: find_max_recursive() arg is an empty sequence >>> find_max_recursive(nums, 0, len(nums)) == max(nums) Traceback (most recent call last): ... IndexError: list index out of range >>> find_max_recursive(nums, -len(nums), -1) == max(nums) True >>> find_max_recursive(nums, -len(nums) - 1, -1) == max(nums) Traceback (most recent call last): ... IndexError: list index out of range """ if len(nums) == 0: raise ValueError("find_max_recursive() arg is an empty sequence") if ( left >= len(nums) or left < -len(nums) or right >= len(nums) or right < -len(nums) ): raise IndexError("list index out of range") if left == right: return nums[left] mid = (left + right) >> 1 # the middle left_max = find_max_recursive(nums, left, mid) # find max in range[left, mid] right_max = find_max_recursive( nums, mid + 1, right ) # find max in range[mid + 1, right] return left_max if left_max >= right_max else right_max if __name__ == "__main__": import doctest doctest.testmod(verbose=True) ================================================ FILE: maths/find_min.py ================================================ from __future__ import annotations def find_min_iterative(nums: list[int | float]) -> int | float: """ Find Minimum Number in a List :param nums: contains elements :return: min number in list >>> for nums in ([3, 2, 1], [-3, -2, -1], [3, -3, 0], [3.0, 3.1, 2.9]): ... find_min_iterative(nums) == min(nums) True True True True >>> find_min_iterative([0, 1, 2, 3, 4, 5, -3, 24, -56]) -56 >>> find_min_iterative([]) Traceback (most recent call last): ... ValueError: find_min_iterative() arg is an empty sequence """ if len(nums) == 0: raise ValueError("find_min_iterative() arg is an empty sequence") min_num = nums[0] for num in nums: min_num = min(min_num, num) return min_num # Divide and Conquer algorithm def find_min_recursive(nums: list[int | float], left: int, right: int) -> int | float: """ find min value in list :param nums: contains elements :param left: index of first element :param right: index of last element :return: min in nums >>> for nums in ([3, 2, 1], [-3, -2, -1], [3, -3, 0], [3.0, 3.1, 2.9]): ... find_min_recursive(nums, 0, len(nums) - 1) == min(nums) True True True True >>> nums = [1, 3, 5, 7, 9, 2, 4, 6, 8, 10] >>> find_min_recursive(nums, 0, len(nums) - 1) == min(nums) True >>> find_min_recursive([], 0, 0) Traceback (most recent call last): ... ValueError: find_min_recursive() arg is an empty sequence >>> find_min_recursive(nums, 0, len(nums)) == min(nums) Traceback (most recent call last): ... IndexError: list index out of range >>> find_min_recursive(nums, -len(nums), -1) == min(nums) True >>> find_min_recursive(nums, -len(nums) - 1, -1) == min(nums) Traceback (most recent call last): ... IndexError: list index out of range """ if len(nums) == 0: raise ValueError("find_min_recursive() arg is an empty sequence") if ( left >= len(nums) or left < -len(nums) or right >= len(nums) or right < -len(nums) ): raise IndexError("list index out of range") if left == right: return nums[left] mid = (left + right) >> 1 # the middle left_min = find_min_recursive(nums, left, mid) # find min in range[left, mid] right_min = find_min_recursive( nums, mid + 1, right ) # find min in range[mid + 1, right] return left_min if left_min <= right_min else right_min if __name__ == "__main__": import doctest doctest.testmod(verbose=True) ================================================ FILE: maths/floor.py ================================================ """ https://en.wikipedia.org/wiki/Floor_and_ceiling_functions """ def floor(x: float) -> int: """ Return the floor of x as an Integral. :param x: the number :return: the largest integer <= x. >>> import math >>> all(floor(n) == math.floor(n) for n ... in (1, -1, 0, -0, 1.1, -1.1, 1.0, -1.0, 1_000_000_000)) True """ return int(x) if x - int(x) >= 0 else int(x) - 1 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/gamma.py ================================================ """ Gamma function is a very useful tool in math and physics. It helps calculating complex integral in a convenient way. for more info: https://en.wikipedia.org/wiki/Gamma_function In mathematics, the gamma function is one commonly used extension of the factorial function to complex numbers. The gamma function is defined for all complex numbers except the non-positive integers Python's Standard Library math.gamma() function overflows around gamma(171.624). """ import math from numpy import inf from scipy.integrate import quad def gamma_iterative(num: float) -> float: """ Calculates the value of Gamma function of num where num is either an integer (1, 2, 3..) or a half-integer (0.5, 1.5, 2.5 ...). >>> gamma_iterative(-1) Traceback (most recent call last): ... ValueError: math domain error >>> gamma_iterative(0) Traceback (most recent call last): ... ValueError: math domain error >>> gamma_iterative(9) 40320.0 >>> from math import gamma as math_gamma >>> all(.99999999 < gamma_iterative(i) / math_gamma(i) <= 1.000000001 ... for i in range(1, 50)) True >>> gamma_iterative(-1)/math_gamma(-1) <= 1.000000001 Traceback (most recent call last): ... ValueError: math domain error >>> gamma_iterative(3.3) - math_gamma(3.3) <= 0.00000001 True """ if num <= 0: raise ValueError("math domain error") return quad(integrand, 0, inf, args=(num))[0] def integrand(x: float, z: float) -> float: return math.pow(x, z - 1) * math.exp(-x) def gamma_recursive(num: float) -> float: """ Calculates the value of Gamma function of num where num is either an integer (1, 2, 3..) or a half-integer (0.5, 1.5, 2.5 ...). Implemented using recursion Examples: >>> from math import isclose, gamma as math_gamma >>> gamma_recursive(0.5) 1.7724538509055159 >>> gamma_recursive(1) 1.0 >>> gamma_recursive(2) 1.0 >>> gamma_recursive(3.5) 3.3233509704478426 >>> gamma_recursive(171.5) 9.483367566824795e+307 >>> all(isclose(gamma_recursive(num), math_gamma(num)) ... for num in (0.5, 2, 3.5, 171.5)) True >>> gamma_recursive(0) Traceback (most recent call last): ... ValueError: math domain error >>> gamma_recursive(-1.1) Traceback (most recent call last): ... ValueError: math domain error >>> gamma_recursive(-4) Traceback (most recent call last): ... ValueError: math domain error >>> gamma_recursive(172) Traceback (most recent call last): ... OverflowError: math range error >>> gamma_recursive(1.1) Traceback (most recent call last): ... NotImplementedError: num must be an integer or a half-integer """ if num <= 0: raise ValueError("math domain error") if num > 171.5: raise OverflowError("math range error") elif num - int(num) not in (0, 0.5): raise NotImplementedError("num must be an integer or a half-integer") elif num == 0.5: return math.sqrt(math.pi) else: return 1.0 if num == 1 else (num - 1) * gamma_recursive(num - 1) if __name__ == "__main__": from doctest import testmod testmod() num = 1.0 while num: num = float(input("Gamma of: ")) print(f"gamma_iterative({num}) = {gamma_iterative(num)}") print(f"gamma_recursive({num}) = {gamma_recursive(num)}") print("\nEnter 0 to exit...") ================================================ FILE: maths/gaussian.py ================================================ """ Reference: https://en.wikipedia.org/wiki/Gaussian_function """ from numpy import exp, pi, sqrt def gaussian(x, mu: float = 0.0, sigma: float = 1.0) -> float: """ >>> float(gaussian(1)) 0.24197072451914337 >>> float(gaussian(24)) 3.342714441794458e-126 >>> float(gaussian(1, 4, 2)) 0.06475879783294587 >>> float(gaussian(1, 5, 3)) 0.05467002489199788 Supports NumPy Arrays Use numpy.meshgrid with this to generate gaussian blur on images. >>> import numpy as np >>> x = np.arange(15) >>> gaussian(x) array([3.98942280e-01, 2.41970725e-01, 5.39909665e-02, 4.43184841e-03, 1.33830226e-04, 1.48671951e-06, 6.07588285e-09, 9.13472041e-12, 5.05227108e-15, 1.02797736e-18, 7.69459863e-23, 2.11881925e-27, 2.14638374e-32, 7.99882776e-38, 1.09660656e-43]) >>> float(gaussian(15)) 5.530709549844416e-50 >>> gaussian([1,2, 'string']) Traceback (most recent call last): ... TypeError: unsupported operand type(s) for -: 'list' and 'float' >>> gaussian('hello world') Traceback (most recent call last): ... TypeError: unsupported operand type(s) for -: 'str' and 'float' >>> gaussian(10**234) # doctest: +IGNORE_EXCEPTION_DETAIL Traceback (most recent call last): ... OverflowError: (34, 'Result too large') >>> float(gaussian(10**-326)) 0.3989422804014327 >>> float(gaussian(2523, mu=234234, sigma=3425)) 0.0 """ return 1 / sqrt(2 * pi * sigma**2) * exp(-((x - mu) ** 2) / (2 * sigma**2)) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/gcd_of_n_numbers.py ================================================ """ Gcd of N Numbers Reference: https://en.wikipedia.org/wiki/Greatest_common_divisor """ from collections import Counter def get_factors( number: int, factors: Counter | None = None, factor: int = 2 ) -> Counter: """ this is a recursive function for get all factors of number >>> get_factors(45) Counter({3: 2, 5: 1}) >>> get_factors(2520) Counter({2: 3, 3: 2, 5: 1, 7: 1}) >>> get_factors(23) Counter({23: 1}) >>> get_factors(0) Traceback (most recent call last): ... TypeError: number must be integer and greater than zero >>> get_factors(-1) Traceback (most recent call last): ... TypeError: number must be integer and greater than zero >>> get_factors(1.5) Traceback (most recent call last): ... TypeError: number must be integer and greater than zero factor can be all numbers from 2 to number that we check if number % factor == 0 if it is equal to zero, we check again with number // factor else we increase factor by one """ match number: case int(number) if number == 1: return Counter({1: 1}) case int(num) if number > 0: number = num case _: raise TypeError("number must be integer and greater than zero") factors = factors or Counter() if number == factor: # break condition # all numbers are factors of itself factors[factor] += 1 return factors if number % factor > 0: # if it is greater than zero # so it is not a factor of number and we check next number return get_factors(number, factors, factor + 1) factors[factor] += 1 # else we update factors (that is Counter(dict-like) type) and check again return get_factors(number // factor, factors, factor) def get_greatest_common_divisor(*numbers: int) -> int: """ get gcd of n numbers: >>> get_greatest_common_divisor(18, 45) 9 >>> get_greatest_common_divisor(23, 37) 1 >>> get_greatest_common_divisor(2520, 8350) 10 >>> get_greatest_common_divisor(-10, 20) Traceback (most recent call last): ... Exception: numbers must be integer and greater than zero >>> get_greatest_common_divisor(1.5, 2) Traceback (most recent call last): ... Exception: numbers must be integer and greater than zero >>> get_greatest_common_divisor(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 1 >>> get_greatest_common_divisor("1", 2, 3, 4, 5, 6, 7, 8, 9, 10) Traceback (most recent call last): ... Exception: numbers must be integer and greater than zero """ # we just need factors, not numbers itself try: same_factors, *factors = map(get_factors, numbers) except TypeError as e: raise Exception("numbers must be integer and greater than zero") from e for factor in factors: same_factors &= factor # get common factor between all # `&` return common elements with smaller value (for Counter type) # now, same_factors is something like {2: 2, 3: 4} that means 2 * 2 * 3 * 3 * 3 * 3 mult = 1 # power each factor and multiply # for {2: 2, 3: 4}, it is [4, 81] and then 324 for m in [factor**power for factor, power in same_factors.items()]: mult *= m return mult if __name__ == "__main__": print(get_greatest_common_divisor(18, 45)) # 9 ================================================ FILE: maths/geometric_mean.py ================================================ """ The Geometric Mean of n numbers is defined as the n-th root of the product of those numbers. It is used to measure the central tendency of the numbers. https://en.wikipedia.org/wiki/Geometric_mean """ def compute_geometric_mean(*args: int) -> float: """ Return the geometric mean of the argument numbers. >>> compute_geometric_mean(2,8) 4.0 >>> compute_geometric_mean('a', 4) Traceback (most recent call last): ... TypeError: Not a Number >>> compute_geometric_mean(5, 125) 25.0 >>> compute_geometric_mean(1, 0) 0.0 >>> compute_geometric_mean(1, 5, 25, 5) 5.0 >>> compute_geometric_mean(2, -2) Traceback (most recent call last): ... ArithmeticError: Cannot Compute Geometric Mean for these numbers. >>> compute_geometric_mean(-5, 25, 1) -5.0 """ product = 1 for number in args: if not isinstance(number, int) and not isinstance(number, float): raise TypeError("Not a Number") product *= number # Cannot calculate the even root for negative product. # Frequently they are restricted to being positive. if product < 0 and len(args) % 2 == 0: raise ArithmeticError("Cannot Compute Geometric Mean for these numbers.") mean = abs(product) ** (1 / len(args)) # Since python calculates complex roots for negative products with odd roots. if product < 0: mean = -mean # Since it does floating point arithmetic, it gives 64**(1/3) as 3.99999996 possible_mean = float(round(mean)) # To check if the rounded number is actually the mean. if possible_mean ** len(args) == product: mean = possible_mean return mean if __name__ == "__main__": from doctest import testmod testmod(name="compute_geometric_mean") print(compute_geometric_mean(-3, -27)) ================================================ FILE: maths/germain_primes.py ================================================ """ A Sophie Germain prime is any prime p, where 2p + 1 is also prime. The second number, 2p + 1 is called a safe prime. Examples of Germain primes include: 2, 3, 5, 11, 23 Their corresponding safe primes: 5, 7, 11, 23, 47 https://en.wikipedia.org/wiki/Safe_and_Sophie_Germain_primes """ from maths.prime_check import is_prime def is_germain_prime(number: int) -> bool: """Checks if input number and 2*number + 1 are prime. >>> is_germain_prime(3) True >>> is_germain_prime(11) True >>> is_germain_prime(4) False >>> is_germain_prime(23) True >>> is_germain_prime(13) False >>> is_germain_prime(20) False >>> is_germain_prime('abc') Traceback (most recent call last): ... TypeError: Input value must be a positive integer. Input value: abc """ if not isinstance(number, int) or number < 1: msg = f"Input value must be a positive integer. Input value: {number}" raise TypeError(msg) return is_prime(number) and is_prime(2 * number + 1) def is_safe_prime(number: int) -> bool: """Checks if input number and (number - 1)/2 are prime. The smallest safe prime is 5, with the Germain prime is 2. >>> is_safe_prime(5) True >>> is_safe_prime(11) True >>> is_safe_prime(1) False >>> is_safe_prime(2) False >>> is_safe_prime(3) False >>> is_safe_prime(47) True >>> is_safe_prime('abc') Traceback (most recent call last): ... TypeError: Input value must be a positive integer. Input value: abc """ if not isinstance(number, int) or number < 1: msg = f"Input value must be a positive integer. Input value: {number}" raise TypeError(msg) return (number - 1) % 2 == 0 and is_prime(number) and is_prime((number - 1) // 2) if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: maths/greatest_common_divisor.py ================================================ """ Greatest Common Divisor. Wikipedia reference: https://en.wikipedia.org/wiki/Greatest_common_divisor gcd(a, b) = gcd(a, -b) = gcd(-a, b) = gcd(-a, -b) by definition of divisibility """ def greatest_common_divisor(a: int, b: int) -> int: """ Calculate Greatest Common Divisor (GCD). >>> greatest_common_divisor(24, 40) 8 >>> greatest_common_divisor(1, 1) 1 >>> greatest_common_divisor(1, 800) 1 >>> greatest_common_divisor(11, 37) 1 >>> greatest_common_divisor(3, 5) 1 >>> greatest_common_divisor(16, 4) 4 >>> greatest_common_divisor(-3, 9) 3 >>> greatest_common_divisor(9, -3) 3 >>> greatest_common_divisor(3, -9) 3 >>> greatest_common_divisor(-3, -9) 3 >>> greatest_common_divisor(0, 0) 0 """ return abs(b) if a == 0 else greatest_common_divisor(b % a, a) def gcd_by_iterative(x: int, y: int) -> int: """ Below method is more memory efficient because it does not create additional stack frames for recursive functions calls (as done in the above method). >>> gcd_by_iterative(24, 40) 8 >>> greatest_common_divisor(24, 40) == gcd_by_iterative(24, 40) True >>> gcd_by_iterative(-3, -9) 3 >>> gcd_by_iterative(3, -9) 3 >>> gcd_by_iterative(1, -800) 1 >>> gcd_by_iterative(11, 37) 1 >>> gcd_by_iterative(0, 0) 0 """ while y: # --> when y=0 then loop will terminate and return x as final GCD. x, y = y, x % y return abs(x) def main(): """ Call Greatest Common Divisor function. """ try: nums = input("Enter two integers separated by comma (,): ").split(",") num_1 = int(nums[0]) num_2 = int(nums[1]) print( f"greatest_common_divisor({num_1}, {num_2}) = " f"{greatest_common_divisor(num_1, num_2)}" ) print(f"By iterative gcd({num_1}, {num_2}) = {gcd_by_iterative(num_1, num_2)}") except (IndexError, UnboundLocalError, ValueError): print("Wrong input") if __name__ == "__main__": main() ================================================ FILE: maths/hardy_ramanujanalgo.py ================================================ # This theorem states that the number of prime factors of n # will be approximately log(log(n)) for most natural numbers n import math def exact_prime_factor_count(n: int) -> int: """ >>> exact_prime_factor_count(51242183) 3 """ count = 0 if n % 2 == 0: count += 1 while n % 2 == 0: n = int(n / 2) # the n input value must be odd so that # we can skip one element (ie i += 2) i = 3 while i <= int(math.sqrt(n)): if n % i == 0: count += 1 while n % i == 0: n = int(n / i) i = i + 2 # this condition checks the prime # number n is greater than 2 if n > 2: count += 1 return count if __name__ == "__main__": n = 51242183 print(f"The number of distinct prime factors is/are {exact_prime_factor_count(n)}") print(f"The value of log(log(n)) is {math.log(math.log(n)):.4f}") """ The number of distinct prime factors is/are 3 The value of log(log(n)) is 2.8765 """ ================================================ FILE: maths/images/__init__.py ================================================ ================================================ FILE: maths/integer_square_root.py ================================================ """ Integer Square Root Algorithm -- An efficient method to calculate the square root of a non-negative integer 'num' rounded down to the nearest integer. It uses a binary search approach to find the integer square root without using any built-in exponent functions or operators. * https://en.wikipedia.org/wiki/Integer_square_root * https://docs.python.org/3/library/math.html#math.isqrt Note: - This algorithm is designed for non-negative integers only. - The result is rounded down to the nearest integer. - The algorithm has a time complexity of O(log(x)). - Original algorithm idea based on binary search. """ def integer_square_root(num: int) -> int: """ Returns the integer square root of a non-negative integer num. Args: num: A non-negative integer. Returns: The integer square root of num. Raises: ValueError: If num is not an integer or is negative. >>> [integer_square_root(i) for i in range(18)] [0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4] >>> integer_square_root(625) 25 >>> integer_square_root(2_147_483_647) 46340 >>> from math import isqrt >>> all(integer_square_root(i) == isqrt(i) for i in range(20)) True >>> integer_square_root(-1) Traceback (most recent call last): ... ValueError: num must be non-negative integer >>> integer_square_root(1.5) Traceback (most recent call last): ... ValueError: num must be non-negative integer >>> integer_square_root("0") Traceback (most recent call last): ... ValueError: num must be non-negative integer """ if not isinstance(num, int) or num < 0: raise ValueError("num must be non-negative integer") if num < 2: return num left_bound = 0 right_bound = num // 2 while left_bound <= right_bound: mid = left_bound + (right_bound - left_bound) // 2 mid_squared = mid * mid if mid_squared == num: return mid if mid_squared < num: left_bound = mid + 1 else: right_bound = mid - 1 return right_bound if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/interquartile_range.py ================================================ """ An implementation of interquartile range (IQR) which is a measure of statistical dispersion, which is the spread of the data. The function takes the list of numeric values as input and returns the IQR. Script inspired by this Wikipedia article: https://en.wikipedia.org/wiki/Interquartile_range """ from __future__ import annotations def find_median(nums: list[int | float]) -> float: """ This is the implementation of the median. :param nums: The list of numeric nums :return: Median of the list >>> find_median(nums=([1, 2, 2, 3, 4])) 2 >>> find_median(nums=([1, 2, 2, 3, 4, 4])) 2.5 >>> find_median(nums=([-1, 2, 0, 3, 4, -4])) 1.5 >>> find_median(nums=([1.1, 2.2, 2, 3.3, 4.4, 4])) 2.65 """ div, mod = divmod(len(nums), 2) if mod: return nums[div] return (nums[div] + nums[(div) - 1]) / 2 def interquartile_range(nums: list[int | float]) -> float: """ Return the interquartile range for a list of numeric values. :param nums: The list of numeric values. :return: interquartile range >>> interquartile_range(nums=[4, 1, 2, 3, 2]) 2.0 >>> interquartile_range(nums = [-2, -7, -10, 9, 8, 4, -67, 45]) 17.0 >>> interquartile_range(nums = [-2.1, -7.1, -10.1, 9.1, 8.1, 4.1, -67.1, 45.1]) 17.2 >>> interquartile_range(nums = [0, 0, 0, 0, 0]) 0.0 >>> interquartile_range(nums=[]) Traceback (most recent call last): ... ValueError: The list is empty. Provide a non-empty list. """ if not nums: raise ValueError("The list is empty. Provide a non-empty list.") nums.sort() length = len(nums) div, mod = divmod(length, 2) q1 = find_median(nums[:div]) half_length = sum((div, mod)) q3 = find_median(nums[half_length:length]) return q3 - q1 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/is_int_palindrome.py ================================================ def is_int_palindrome(num: int) -> bool: """ Returns whether `num` is a palindrome or not (see for reference https://en.wikipedia.org/wiki/Palindromic_number). >>> is_int_palindrome(-121) False >>> is_int_palindrome(0) True >>> is_int_palindrome(10) False >>> is_int_palindrome(11) True >>> is_int_palindrome(101) True >>> is_int_palindrome(120) False """ if num < 0: return False num_copy: int = num rev_num: int = 0 while num > 0: rev_num = rev_num * 10 + (num % 10) num //= 10 return num_copy == rev_num if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/is_ip_v4_address_valid.py ================================================ """ wiki: https://en.wikipedia.org/wiki/IPv4 Is IP v4 address valid? A valid IP address must be four octets in the form of A.B.C.D, where A, B, C and D are numbers from 0-255 for example: 192.168.23.1, 172.255.255.255 are valid IP address 192.168.256.0, 256.192.3.121 are invalid IP address """ def is_ip_v4_address_valid(ip: str) -> bool: """ print "Valid IP address" If IP is valid. or print "Invalid IP address" If IP is invalid. >>> is_ip_v4_address_valid("192.168.0.23") True >>> is_ip_v4_address_valid("192.256.15.8") False >>> is_ip_v4_address_valid("172.100.0.8") True >>> is_ip_v4_address_valid("255.256.0.256") False >>> is_ip_v4_address_valid("1.2.33333333.4") False >>> is_ip_v4_address_valid("1.2.-3.4") False >>> is_ip_v4_address_valid("1.2.3") False >>> is_ip_v4_address_valid("1.2.3.4.5") False >>> is_ip_v4_address_valid("1.2.A.4") False >>> is_ip_v4_address_valid("0.0.0.0") True >>> is_ip_v4_address_valid("1.2.3.") False >>> is_ip_v4_address_valid("1.2.3.05") False """ octets = ip.split(".") if len(octets) != 4: return False for octet in octets: if not octet.isdigit(): return False number = int(octet) if len(str(number)) != len(octet): return False if not 0 <= number <= 255: return False return True if __name__ == "__main__": ip = input().strip() valid_or_invalid = "valid" if is_ip_v4_address_valid(ip) else "invalid" print(f"{ip} is a {valid_or_invalid} IPv4 address.") ================================================ FILE: maths/is_square_free.py ================================================ """ References: wikipedia:square free number psf/black : True ruff : True """ from __future__ import annotations def is_square_free(factors: list[int]) -> bool: """ # doctest: +NORMALIZE_WHITESPACE This functions takes a list of prime factors as input. returns True if the factors are square free. >>> is_square_free([1, 1, 2, 3, 4]) False These are wrong but should return some value it simply checks for repetition in the numbers. >>> is_square_free([1, 3, 4, 'sd', 0.0]) True >>> is_square_free([1, 0.5, 2, 0.0]) True >>> is_square_free([1, 2, 2, 5]) False >>> is_square_free('asd') True >>> is_square_free(24) Traceback (most recent call last): ... TypeError: 'int' object is not iterable """ return len(set(factors)) == len(factors) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/jaccard_similarity.py ================================================ """ The Jaccard similarity coefficient is a commonly used indicator of the similarity between two sets. Let U be a set and A and B be subsets of U, then the Jaccard index/similarity is defined to be the ratio of the number of elements of their intersection and the number of elements of their union. Inspired from Wikipedia and the book Mining of Massive Datasets [MMDS 2nd Edition, Chapter 3] https://en.wikipedia.org/wiki/Jaccard_index https://mmds.org Jaccard similarity is widely used with MinHashing. """ def jaccard_similarity( set_a: set[str] | list[str] | tuple[str], set_b: set[str] | list[str] | tuple[str], alternative_union=False, ): """ Finds the jaccard similarity between two sets. Essentially, its intersection over union. The alternative way to calculate this is to take union as sum of the number of items in the two sets. This will lead to jaccard similarity of a set with itself be 1/2 instead of 1. [MMDS 2nd Edition, Page 77] Parameters: :set_a (set,list,tuple): A non-empty set/list :set_b (set,list,tuple): A non-empty set/list :alternativeUnion (boolean): If True, use sum of number of items as union Output: (float) The jaccard similarity between the two sets. Examples: >>> set_a = {'a', 'b', 'c', 'd', 'e'} >>> set_b = {'c', 'd', 'e', 'f', 'h', 'i'} >>> jaccard_similarity(set_a, set_b) 0.375 >>> jaccard_similarity(set_a, set_a) 1.0 >>> jaccard_similarity(set_a, set_a, True) 0.5 >>> set_a = ['a', 'b', 'c', 'd', 'e'] >>> set_b = ('c', 'd', 'e', 'f', 'h', 'i') >>> jaccard_similarity(set_a, set_b) 0.375 >>> set_a = ('c', 'd', 'e', 'f', 'h', 'i') >>> set_b = ['a', 'b', 'c', 'd', 'e'] >>> jaccard_similarity(set_a, set_b) 0.375 >>> set_a = ('c', 'd', 'e', 'f', 'h', 'i') >>> set_b = ['a', 'b', 'c', 'd'] >>> jaccard_similarity(set_a, set_b, True) 0.2 >>> set_a = {'a', 'b'} >>> set_b = ['c', 'd'] >>> jaccard_similarity(set_a, set_b) Traceback (most recent call last): ... ValueError: Set a and b must either both be sets or be either a list or a tuple. """ if isinstance(set_a, set) and isinstance(set_b, set): intersection_length = len(set_a.intersection(set_b)) if alternative_union: union_length = len(set_a) + len(set_b) else: union_length = len(set_a.union(set_b)) return intersection_length / union_length elif isinstance(set_a, (list, tuple)) and isinstance(set_b, (list, tuple)): intersection = [element for element in set_a if element in set_b] if alternative_union: return len(intersection) / (len(set_a) + len(set_b)) else: # Cast set_a to list because tuples cannot be mutated union = list(set_a) + [element for element in set_b if element not in set_a] return len(intersection) / len(union) raise ValueError( "Set a and b must either both be sets or be either a list or a tuple." ) if __name__ == "__main__": set_a = {"a", "b", "c", "d", "e"} set_b = {"c", "d", "e", "f", "h", "i"} print(jaccard_similarity(set_a, set_b)) ================================================ FILE: maths/joint_probability_distribution.py ================================================ """ Calculate joint probability distribution https://en.wikipedia.org/wiki/Joint_probability_distribution """ def joint_probability_distribution( x_values: list[int], y_values: list[int], x_probabilities: list[float], y_probabilities: list[float], ) -> dict: """ >>> joint_distribution = joint_probability_distribution( ... [1, 2], [-2, 5, 8], [0.7, 0.3], [0.3, 0.5, 0.2] ... ) >>> from math import isclose >>> isclose(joint_distribution.pop((1, 8)), 0.14) True >>> joint_distribution {(1, -2): 0.21, (1, 5): 0.35, (2, -2): 0.09, (2, 5): 0.15, (2, 8): 0.06} """ return { (x, y): x_prob * y_prob for x, x_prob in zip(x_values, x_probabilities) for y, y_prob in zip(y_values, y_probabilities) } # Function to calculate the expectation (mean) def expectation(values: list, probabilities: list) -> float: """ >>> from math import isclose >>> isclose(expectation([1, 2], [0.7, 0.3]), 1.3) True """ return sum(x * p for x, p in zip(values, probabilities)) # Function to calculate the variance def variance(values: list[int], probabilities: list[float]) -> float: """ >>> from math import isclose >>> isclose(variance([1,2],[0.7,0.3]), 0.21) True """ mean = expectation(values, probabilities) return sum((x - mean) ** 2 * p for x, p in zip(values, probabilities)) # Function to calculate the covariance def covariance( x_values: list[int], y_values: list[int], x_probabilities: list[float], y_probabilities: list[float], ) -> float: """ >>> covariance([1, 2], [-2, 5, 8], [0.7, 0.3], [0.3, 0.5, 0.2]) -2.7755575615628914e-17 """ mean_x = expectation(x_values, x_probabilities) mean_y = expectation(y_values, y_probabilities) return sum( (x - mean_x) * (y - mean_y) * px * py for x, px in zip(x_values, x_probabilities) for y, py in zip(y_values, y_probabilities) ) # Function to calculate the standard deviation def standard_deviation(variance: float) -> float: """ >>> standard_deviation(0.21) 0.458257569495584 """ return variance**0.5 if __name__ == "__main__": from doctest import testmod testmod() # Input values for X and Y x_vals = input("Enter values of X separated by spaces: ").split() y_vals = input("Enter values of Y separated by spaces: ").split() # Convert input values to integers x_values = [int(x) for x in x_vals] y_values = [int(y) for y in y_vals] # Input probabilities for X and Y x_probs = input("Enter probabilities for X separated by spaces: ").split() y_probs = input("Enter probabilities for Y separated by spaces: ").split() assert len(x_values) == len(x_probs) assert len(y_values) == len(y_probs) # Convert input probabilities to floats x_probabilities = [float(p) for p in x_probs] y_probabilities = [float(p) for p in y_probs] # Calculate the joint probability distribution jpd = joint_probability_distribution( x_values, y_values, x_probabilities, y_probabilities ) # Print the joint probability distribution print( "\n".join( f"P(X={x}, Y={y}) = {probability}" for (x, y), probability in jpd.items() ) ) mean_xy = expectation( [x * y for x in x_values for y in y_values], [px * py for px in x_probabilities for py in y_probabilities], ) print(f"x mean: {expectation(x_values, x_probabilities) = }") print(f"y mean: {expectation(y_values, y_probabilities) = }") print(f"xy mean: {mean_xy}") print(f"x: {variance(x_values, x_probabilities) = }") print(f"y: {variance(y_values, y_probabilities) = }") print(f"{covariance(x_values, y_values, x_probabilities, y_probabilities) = }") print(f"x: {standard_deviation(variance(x_values, x_probabilities)) = }") print(f"y: {standard_deviation(variance(y_values, y_probabilities)) = }") ================================================ FILE: maths/josephus_problem.py ================================================ """ The Josephus problem is a famous theoretical problem related to a certain counting-out game. This module provides functions to solve the Josephus problem for num_people and a step_size. The Josephus problem is defined as follows: - num_people are standing in a circle. - Starting with a specified person, you count around the circle, skipping a fixed number of people (step_size). - The person at which you stop counting is eliminated from the circle. - The counting continues until only one person remains. For more information about the Josephus problem, refer to: https://en.wikipedia.org/wiki/Josephus_problem """ def josephus_recursive(num_people: int, step_size: int) -> int: """ Solve the Josephus problem for num_people and a step_size recursively. Args: num_people: A positive integer representing the number of people. step_size: A positive integer representing the step size for elimination. Returns: The position of the last person remaining. Raises: ValueError: If num_people or step_size is not a positive integer. Examples: >>> josephus_recursive(7, 3) 3 >>> josephus_recursive(10, 2) 4 >>> josephus_recursive(0, 2) Traceback (most recent call last): ... ValueError: num_people or step_size is not a positive integer. >>> josephus_recursive(1.9, 2) Traceback (most recent call last): ... ValueError: num_people or step_size is not a positive integer. >>> josephus_recursive(-2, 2) Traceback (most recent call last): ... ValueError: num_people or step_size is not a positive integer. >>> josephus_recursive(7, 0) Traceback (most recent call last): ... ValueError: num_people or step_size is not a positive integer. >>> josephus_recursive(7, -2) Traceback (most recent call last): ... ValueError: num_people or step_size is not a positive integer. >>> josephus_recursive(1_000, 0.01) Traceback (most recent call last): ... ValueError: num_people or step_size is not a positive integer. >>> josephus_recursive("cat", "dog") Traceback (most recent call last): ... ValueError: num_people or step_size is not a positive integer. """ if ( not isinstance(num_people, int) or not isinstance(step_size, int) or num_people <= 0 or step_size <= 0 ): raise ValueError("num_people or step_size is not a positive integer.") if num_people == 1: return 0 return (josephus_recursive(num_people - 1, step_size) + step_size) % num_people def find_winner(num_people: int, step_size: int) -> int: """ Find the winner of the Josephus problem for num_people and a step_size. Args: num_people (int): Number of people. step_size (int): Step size for elimination. Returns: int: The position of the last person remaining (1-based index). Examples: >>> find_winner(7, 3) 4 >>> find_winner(10, 2) 5 """ return josephus_recursive(num_people, step_size) + 1 def josephus_iterative(num_people: int, step_size: int) -> int: """ Solve the Josephus problem for num_people and a step_size iteratively. Args: num_people (int): The number of people in the circle. step_size (int): The number of steps to take before eliminating someone. Returns: int: The position of the last person standing. Examples: >>> josephus_iterative(5, 2) 3 >>> josephus_iterative(7, 3) 4 """ circle = list(range(1, num_people + 1)) current = 0 while len(circle) > 1: current = (current + step_size - 1) % len(circle) circle.pop(current) return circle[0] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/juggler_sequence.py ================================================ """ == Juggler Sequence == Juggler sequence start with any positive integer n. The next term is obtained as follows: If n term is even, the next term is floor value of square root of n . If n is odd, the next term is floor value of 3 time the square root of n. https://en.wikipedia.org/wiki/Juggler_sequence """ # Author : Akshay Dubey (https://github.com/itsAkshayDubey) import math def juggler_sequence(number: int) -> list[int]: """ >>> juggler_sequence(0) Traceback (most recent call last): ... ValueError: Input value of [number=0] must be a positive integer >>> juggler_sequence(1) [1] >>> juggler_sequence(2) [2, 1] >>> juggler_sequence(3) [3, 5, 11, 36, 6, 2, 1] >>> juggler_sequence(5) [5, 11, 36, 6, 2, 1] >>> juggler_sequence(10) [10, 3, 5, 11, 36, 6, 2, 1] >>> juggler_sequence(25) [25, 125, 1397, 52214, 228, 15, 58, 7, 18, 4, 2, 1] >>> juggler_sequence(6.0) Traceback (most recent call last): ... TypeError: Input value of [number=6.0] must be an integer >>> juggler_sequence(-1) Traceback (most recent call last): ... ValueError: Input value of [number=-1] must be a positive integer """ if not isinstance(number, int): msg = f"Input value of [number={number}] must be an integer" raise TypeError(msg) if number < 1: msg = f"Input value of [number={number}] must be a positive integer" raise ValueError(msg) sequence = [number] while number != 1: if number % 2 == 0: number = math.floor(math.sqrt(number)) else: number = math.floor( math.sqrt(number) * math.sqrt(number) * math.sqrt(number) ) sequence.append(number) return sequence if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/karatsuba.py ================================================ """Multiply two numbers using Karatsuba algorithm""" def karatsuba(a: int, b: int) -> int: """ >>> karatsuba(15463, 23489) == 15463 * 23489 True >>> karatsuba(3, 9) == 3 * 9 True """ if len(str(a)) == 1 or len(str(b)) == 1: return a * b m1 = max(len(str(a)), len(str(b))) m2 = m1 // 2 a1, a2 = divmod(a, 10**m2) b1, b2 = divmod(b, 10**m2) x = karatsuba(a2, b2) y = karatsuba((a1 + a2), (b1 + b2)) z = karatsuba(a1, b1) return (z * 10 ** (2 * m2)) + ((y - z - x) * 10 ** (m2)) + (x) def main(): print(karatsuba(15463, 23489)) if __name__ == "__main__": main() ================================================ FILE: maths/kth_lexicographic_permutation.py ================================================ def kth_permutation(k, n): """ Finds k'th lexicographic permutation (in increasing order) of 0,1,2,...n-1 in O(n^2) time. Examples: First permutation is always 0,1,2,...n >>> kth_permutation(0,5) [0, 1, 2, 3, 4] The order of permutation of 0,1,2,3 is [0,1,2,3], [0,1,3,2], [0,2,1,3], [0,2,3,1], [0,3,1,2], [0,3,2,1], [1,0,2,3], [1,0,3,2], [1,2,0,3], [1,2,3,0], [1,3,0,2] >>> kth_permutation(10,4) [1, 3, 0, 2] """ # Factorails from 1! to (n-1)! factorials = [1] for i in range(2, n): factorials.append(factorials[-1] * i) assert 0 <= k < factorials[-1] * n, "k out of bounds" permutation = [] elements = list(range(n)) # Find permutation while factorials: factorial = factorials.pop() number, k = divmod(k, factorial) permutation.append(elements[number]) elements.remove(elements[number]) permutation.append(elements[0]) return permutation if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/largest_of_very_large_numbers.py ================================================ # Author: Abhijeeth S import math def res(x, y): """ Reduces large number to a more manageable number >>> res(5, 7) 4.892790030352132 >>> res(0, 5) 0 >>> res(3, 0) 1 >>> res(-1, 5) Traceback (most recent call last): ... ValueError: expected a positive input """ if 0 not in (x, y): # We use the relation x^y = y*log10(x), where 10 is the base. return y * math.log10(x) elif x == 0: # 0 raised to any number is 0 return 0 elif y == 0: return 1 # any number raised to 0 is 1 raise AssertionError("This should never happen") if __name__ == "__main__": # Main function # Read two numbers from input and typecast them to int using map function. # Here x is the base and y is the power. prompt = "Enter the base and the power separated by a comma: " x1, y1 = map(int, input(prompt).split(",")) x2, y2 = map(int, input(prompt).split(",")) # We find the log of each number, using the function res(), which takes two # arguments. res1 = res(x1, y1) res2 = res(x2, y2) # We check for the largest number if res1 > res2: print("Largest number is", x1, "^", y1) elif res2 > res1: print("Largest number is", x2, "^", y2) else: print("Both are equal") ================================================ FILE: maths/least_common_multiple.py ================================================ import unittest from timeit import timeit from maths.greatest_common_divisor import greatest_common_divisor def least_common_multiple_slow(first_num: int, second_num: int) -> int: """ Find the least common multiple of two numbers. Learn more: https://en.wikipedia.org/wiki/Least_common_multiple >>> least_common_multiple_slow(5, 2) 10 >>> least_common_multiple_slow(12, 76) 228 """ max_num = first_num if first_num >= second_num else second_num common_mult = max_num while (common_mult % first_num > 0) or (common_mult % second_num > 0): common_mult += max_num return common_mult def least_common_multiple_fast(first_num: int, second_num: int) -> int: """ Find the least common multiple of two numbers. https://en.wikipedia.org/wiki/Least_common_multiple#Using_the_greatest_common_divisor >>> least_common_multiple_fast(5,2) 10 >>> least_common_multiple_fast(12,76) 228 """ return first_num // greatest_common_divisor(first_num, second_num) * second_num def benchmark(): setup = ( "from __main__ import least_common_multiple_slow, least_common_multiple_fast" ) print( "least_common_multiple_slow():", timeit("least_common_multiple_slow(1000, 999)", setup=setup), ) print( "least_common_multiple_fast():", timeit("least_common_multiple_fast(1000, 999)", setup=setup), ) class TestLeastCommonMultiple(unittest.TestCase): test_inputs = ( (10, 20), (13, 15), (4, 31), (10, 42), (43, 34), (5, 12), (12, 25), (10, 25), (6, 9), ) expected_results = (20, 195, 124, 210, 1462, 60, 300, 50, 18) def test_lcm_function(self): for i, (first_num, second_num) in enumerate(self.test_inputs): slow_result = least_common_multiple_slow(first_num, second_num) fast_result = least_common_multiple_fast(first_num, second_num) with self.subTest(i=i): assert slow_result == self.expected_results[i] assert fast_result == self.expected_results[i] if __name__ == "__main__": benchmark() unittest.main() ================================================ FILE: maths/line_length.py ================================================ from __future__ import annotations import math from collections.abc import Callable def line_length( fnc: Callable[[float], float], x_start: float, x_end: float, steps: int = 100, ) -> float: """ Approximates the arc length of a line segment by treating the curve as a sequence of linear lines and summing their lengths :param fnc: a function which defines a curve :param x_start: left end point to indicate the start of line segment :param x_end: right end point to indicate end of line segment :param steps: an accuracy gauge; more steps increases accuracy :return: a float representing the length of the curve >>> def f(x): ... return x >>> f"{line_length(f, 0, 1, 10):.6f}" '1.414214' >>> def f(x): ... return 1 >>> f"{line_length(f, -5.5, 4.5):.6f}" '10.000000' >>> def f(x): ... return math.sin(5 * x) + math.cos(10 * x) + x * x/10 >>> f"{line_length(f, 0.0, 10.0, 10000):.6f}" '69.534930' """ x1 = x_start fx1 = fnc(x_start) length = 0.0 for _ in range(steps): # Approximates curve as a sequence of linear lines and sums their length x2 = (x_end - x_start) / steps + x1 fx2 = fnc(x2) length += math.hypot(x2 - x1, fx2 - fx1) # Increment step x1 = x2 fx1 = fx2 return length if __name__ == "__main__": def f(x): return math.sin(10 * x) print("f(x) = sin(10 * x)") print("The length of the curve from x = -10 to x = 10 is:") i = 10 while i <= 100000: print(f"With {i} steps: {line_length(f, -10, 10, i)}") i *= 10 ================================================ FILE: maths/liouville_lambda.py ================================================ """ == Liouville Lambda Function == The Liouville Lambda function, denoted by λ(n) and λ(n) is 1 if n is the product of an even number of prime numbers, and -1 if it is the product of an odd number of primes. https://en.wikipedia.org/wiki/Liouville_function """ # Author : Akshay Dubey (https://github.com/itsAkshayDubey) from maths.prime_factors import prime_factors def liouville_lambda(number: int) -> int: """ This functions takes an integer number as input. returns 1 if n has even number of prime factors and -1 otherwise. >>> liouville_lambda(10) 1 >>> liouville_lambda(11) -1 >>> liouville_lambda(0) Traceback (most recent call last): ... ValueError: Input must be a positive integer >>> liouville_lambda(-1) Traceback (most recent call last): ... ValueError: Input must be a positive integer >>> liouville_lambda(11.0) Traceback (most recent call last): ... TypeError: Input value of [number=11.0] must be an integer """ if not isinstance(number, int): msg = f"Input value of [number={number}] must be an integer" raise TypeError(msg) if number < 1: raise ValueError("Input must be a positive integer") return -1 if len(prime_factors(number)) % 2 else 1 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/lucas_lehmer_primality_test.py ================================================ """ In mathematics, the Lucas-Lehmer test (LLT) is a primality test for Mersenne numbers. https://en.wikipedia.org/wiki/Lucas%E2%80%93Lehmer_primality_test A Mersenne number is a number that is one less than a power of two. That is M_p = 2^p - 1 https://en.wikipedia.org/wiki/Mersenne_prime The Lucas-Lehmer test is the primality test used by the Great Internet Mersenne Prime Search (GIMPS) to locate large primes. """ # Primality test 2^p - 1 # Return true if 2^p - 1 is prime def lucas_lehmer_test(p: int) -> bool: """ >>> lucas_lehmer_test(p=7) True >>> lucas_lehmer_test(p=11) False # M_11 = 2^11 - 1 = 2047 = 23 * 89 """ if p < 2: raise ValueError("p should not be less than 2!") elif p == 2: return True s = 4 m = (1 << p) - 1 for _ in range(p - 2): s = ((s * s) - 2) % m return s == 0 if __name__ == "__main__": print(lucas_lehmer_test(7)) print(lucas_lehmer_test(11)) ================================================ FILE: maths/lucas_series.py ================================================ """ https://en.wikipedia.org/wiki/Lucas_number """ def recursive_lucas_number(n_th_number: int) -> int: """ Returns the nth lucas number >>> recursive_lucas_number(1) 1 >>> recursive_lucas_number(20) 15127 >>> recursive_lucas_number(0) 2 >>> recursive_lucas_number(25) 167761 >>> recursive_lucas_number(-1.5) Traceback (most recent call last): ... TypeError: recursive_lucas_number accepts only integer arguments. """ if not isinstance(n_th_number, int): raise TypeError("recursive_lucas_number accepts only integer arguments.") if n_th_number == 0: return 2 if n_th_number == 1: return 1 return recursive_lucas_number(n_th_number - 1) + recursive_lucas_number( n_th_number - 2 ) def dynamic_lucas_number(n_th_number: int) -> int: """ Returns the nth lucas number >>> dynamic_lucas_number(1) 1 >>> dynamic_lucas_number(20) 15127 >>> dynamic_lucas_number(0) 2 >>> dynamic_lucas_number(25) 167761 >>> dynamic_lucas_number(-1.5) Traceback (most recent call last): ... TypeError: dynamic_lucas_number accepts only integer arguments. """ if not isinstance(n_th_number, int): raise TypeError("dynamic_lucas_number accepts only integer arguments.") a, b = 2, 1 for _ in range(n_th_number): a, b = b, a + b return a if __name__ == "__main__": from doctest import testmod testmod() n = int(input("Enter the number of terms in lucas series:\n").strip()) print("Using recursive function to calculate lucas series:") print(" ".join(str(recursive_lucas_number(i)) for i in range(n))) print("\nUsing dynamic function to calculate lucas series:") print(" ".join(str(dynamic_lucas_number(i)) for i in range(n))) ================================================ FILE: maths/maclaurin_series.py ================================================ """ https://en.wikipedia.org/wiki/Taylor_series#Trigonometric_functions """ from math import factorial, pi def maclaurin_sin(theta: float, accuracy: int = 30) -> float: """ Finds the maclaurin approximation of sin :param theta: the angle to which sin is found :param accuracy: the degree of accuracy wanted minimum :return: the value of sine in radians >>> from math import isclose, sin >>> all(isclose(maclaurin_sin(x, 50), sin(x)) for x in range(-25, 25)) True >>> maclaurin_sin(10) -0.5440211108893691 >>> maclaurin_sin(-10) 0.5440211108893704 >>> maclaurin_sin(10, 15) -0.544021110889369 >>> maclaurin_sin(-10, 15) 0.5440211108893704 >>> maclaurin_sin("10") Traceback (most recent call last): ... ValueError: maclaurin_sin() requires either an int or float for theta >>> maclaurin_sin(10, -30) Traceback (most recent call last): ... ValueError: maclaurin_sin() requires a positive int for accuracy >>> maclaurin_sin(10, 30.5) Traceback (most recent call last): ... ValueError: maclaurin_sin() requires a positive int for accuracy >>> maclaurin_sin(10, "30") Traceback (most recent call last): ... ValueError: maclaurin_sin() requires a positive int for accuracy """ if not isinstance(theta, (int, float)): raise ValueError("maclaurin_sin() requires either an int or float for theta") if not isinstance(accuracy, int) or accuracy <= 0: raise ValueError("maclaurin_sin() requires a positive int for accuracy") theta = float(theta) div = theta // (2 * pi) theta -= 2 * div * pi return sum( (-1) ** r * theta ** (2 * r + 1) / factorial(2 * r + 1) for r in range(accuracy) ) def maclaurin_cos(theta: float, accuracy: int = 30) -> float: """ Finds the maclaurin approximation of cos :param theta: the angle to which cos is found :param accuracy: the degree of accuracy wanted :return: the value of cosine in radians >>> from math import isclose, cos >>> all(isclose(maclaurin_cos(x, 50), cos(x)) for x in range(-25, 25)) True >>> maclaurin_cos(5) 0.2836621854632268 >>> maclaurin_cos(-5) 0.2836621854632265 >>> maclaurin_cos(10, 15) -0.8390715290764524 >>> maclaurin_cos(-10, 15) -0.8390715290764521 >>> maclaurin_cos("10") Traceback (most recent call last): ... ValueError: maclaurin_cos() requires either an int or float for theta >>> maclaurin_cos(10, -30) Traceback (most recent call last): ... ValueError: maclaurin_cos() requires a positive int for accuracy >>> maclaurin_cos(10, 30.5) Traceback (most recent call last): ... ValueError: maclaurin_cos() requires a positive int for accuracy >>> maclaurin_cos(10, "30") Traceback (most recent call last): ... ValueError: maclaurin_cos() requires a positive int for accuracy """ if not isinstance(theta, (int, float)): raise ValueError("maclaurin_cos() requires either an int or float for theta") if not isinstance(accuracy, int) or accuracy <= 0: raise ValueError("maclaurin_cos() requires a positive int for accuracy") theta = float(theta) div = theta // (2 * pi) theta -= 2 * div * pi return sum((-1) ** r * theta ** (2 * r) / factorial(2 * r) for r in range(accuracy)) if __name__ == "__main__": import doctest doctest.testmod() print(maclaurin_sin(10)) print(maclaurin_sin(-10)) print(maclaurin_sin(10, 15)) print(maclaurin_sin(-10, 15)) print(maclaurin_cos(5)) print(maclaurin_cos(-5)) print(maclaurin_cos(10, 15)) print(maclaurin_cos(-10, 15)) ================================================ FILE: maths/manhattan_distance.py ================================================ def manhattan_distance(point_a: list, point_b: list) -> float: """ Expectts two list of numbers representing two points in the same n-dimensional space https://en.wikipedia.org/wiki/Taxicab_geometry >>> manhattan_distance([1,1], [2,2]) 2.0 >>> manhattan_distance([1.5,1.5], [2,2]) 1.0 >>> manhattan_distance([1.5,1.5], [2.5,2]) 1.5 >>> manhattan_distance([-3, -3, -3], [0, 0, 0]) 9.0 >>> manhattan_distance([1,1], None) Traceback (most recent call last): ... ValueError: Missing an input >>> manhattan_distance([1,1], [2, 2, 2]) Traceback (most recent call last): ... ValueError: Both points must be in the same n-dimensional space >>> manhattan_distance([1,"one"], [2, 2, 2]) Traceback (most recent call last): ... TypeError: Expected a list of numbers as input, found str >>> manhattan_distance(1, [2, 2, 2]) Traceback (most recent call last): ... TypeError: Expected a list of numbers as input, found int >>> manhattan_distance([1,1], "not_a_list") Traceback (most recent call last): ... TypeError: Expected a list of numbers as input, found str """ _validate_point(point_a) _validate_point(point_b) if len(point_a) != len(point_b): raise ValueError("Both points must be in the same n-dimensional space") return float(sum(abs(a - b) for a, b in zip(point_a, point_b))) def _validate_point(point: list[float]) -> None: """ >>> _validate_point(None) Traceback (most recent call last): ... ValueError: Missing an input >>> _validate_point([1,"one"]) Traceback (most recent call last): ... TypeError: Expected a list of numbers as input, found str >>> _validate_point(1) Traceback (most recent call last): ... TypeError: Expected a list of numbers as input, found int >>> _validate_point("not_a_list") Traceback (most recent call last): ... TypeError: Expected a list of numbers as input, found str """ if point: if isinstance(point, list): for item in point: if not isinstance(item, (int, float)): msg = ( "Expected a list of numbers as input, found " f"{type(item).__name__}" ) raise TypeError(msg) else: msg = f"Expected a list of numbers as input, found {type(point).__name__}" raise TypeError(msg) else: raise ValueError("Missing an input") def manhattan_distance_one_liner(point_a: list, point_b: list) -> float: """ Version with one liner >>> manhattan_distance_one_liner([1,1], [2,2]) 2.0 >>> manhattan_distance_one_liner([1.5,1.5], [2,2]) 1.0 >>> manhattan_distance_one_liner([1.5,1.5], [2.5,2]) 1.5 >>> manhattan_distance_one_liner([-3, -3, -3], [0, 0, 0]) 9.0 >>> manhattan_distance_one_liner([1,1], None) Traceback (most recent call last): ... ValueError: Missing an input >>> manhattan_distance_one_liner([1,1], [2, 2, 2]) Traceback (most recent call last): ... ValueError: Both points must be in the same n-dimensional space >>> manhattan_distance_one_liner([1,"one"], [2, 2, 2]) Traceback (most recent call last): ... TypeError: Expected a list of numbers as input, found str >>> manhattan_distance_one_liner(1, [2, 2, 2]) Traceback (most recent call last): ... TypeError: Expected a list of numbers as input, found int >>> manhattan_distance_one_liner([1,1], "not_a_list") Traceback (most recent call last): ... TypeError: Expected a list of numbers as input, found str """ _validate_point(point_a) _validate_point(point_b) if len(point_a) != len(point_b): raise ValueError("Both points must be in the same n-dimensional space") return float(sum(abs(x - y) for x, y in zip(point_a, point_b))) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/matrix_exponentiation.py ================================================ """Matrix Exponentiation""" import timeit """ Matrix Exponentiation is a technique to solve linear recurrences in logarithmic time. You read more about it here: https://zobayer.blogspot.com/2010/11/matrix-exponentiation.html https://www.hackerearth.com/practice/notes/matrix-exponentiation-1/ """ class Matrix: def __init__(self, arg: list[list] | int) -> None: if isinstance(arg, list): # Initializes a matrix identical to the one provided. self.t = arg self.n = len(arg) else: # Initializes a square matrix of the given size and set values to zero. self.n = arg self.t = [[0 for _ in range(self.n)] for _ in range(self.n)] def __mul__(self, b: Matrix) -> Matrix: matrix = Matrix(self.n) for i in range(self.n): for j in range(self.n): for k in range(self.n): matrix.t[i][j] += self.t[i][k] * b.t[k][j] return matrix def modular_exponentiation(a: Matrix, b: int) -> Matrix: matrix = Matrix([[1, 0], [0, 1]]) while b > 0: if b & 1: matrix *= a a *= a b >>= 1 return matrix def fibonacci_with_matrix_exponentiation(n: int, f1: int, f2: int) -> int: """ Returns the nth number of the Fibonacci sequence that starts with f1 and f2 Uses the matrix exponentiation >>> fibonacci_with_matrix_exponentiation(1, 5, 6) 5 >>> fibonacci_with_matrix_exponentiation(2, 10, 11) 11 >>> fibonacci_with_matrix_exponentiation(13, 0, 1) 144 >>> fibonacci_with_matrix_exponentiation(10, 5, 9) 411 >>> fibonacci_with_matrix_exponentiation(9, 2, 3) 89 """ # Trivial Cases if n == 1: return f1 elif n == 2: return f2 matrix = Matrix([[1, 1], [1, 0]]) matrix = modular_exponentiation(matrix, n - 2) return f2 * matrix.t[0][0] + f1 * matrix.t[0][1] def simple_fibonacci(n: int, f1: int, f2: int) -> int: """ Returns the nth number of the Fibonacci sequence that starts with f1 and f2 Uses the definition >>> simple_fibonacci(1, 5, 6) 5 >>> simple_fibonacci(2, 10, 11) 11 >>> simple_fibonacci(13, 0, 1) 144 >>> simple_fibonacci(10, 5, 9) 411 >>> simple_fibonacci(9, 2, 3) 89 """ # Trivial Cases if n == 1: return f1 elif n == 2: return f2 n -= 2 while n > 0: f2, f1 = f1 + f2, f2 n -= 1 return f2 def matrix_exponentiation_time() -> float: setup = """ from random import randint from __main__ import fibonacci_with_matrix_exponentiation """ code = "fibonacci_with_matrix_exponentiation(randint(1,70000), 1, 1)" exec_time = timeit.timeit(setup=setup, stmt=code, number=100) print("With matrix exponentiation the average execution time is ", exec_time / 100) return exec_time def simple_fibonacci_time() -> float: setup = """ from random import randint from __main__ import simple_fibonacci """ code = "simple_fibonacci(randint(1,70000), 1, 1)" exec_time = timeit.timeit(setup=setup, stmt=code, number=100) print( "Without matrix exponentiation the average execution time is ", exec_time / 100 ) return exec_time def main() -> None: matrix_exponentiation_time() simple_fibonacci_time() if __name__ == "__main__": main() ================================================ FILE: maths/max_sum_sliding_window.py ================================================ """ Given an array of integer elements and an integer 'k', we are required to find the maximum sum of 'k' consecutive elements in the array. Instead of using a nested for loop, in a Brute force approach we will use a technique called 'Window sliding technique' where the nested loops can be converted to a single loop to reduce time complexity. """ from __future__ import annotations def max_sum_in_array(array: list[int], k: int) -> int: """ Returns the maximum sum of k consecutive elements >>> arr = [1, 4, 2, 10, 2, 3, 1, 0, 20] >>> k = 4 >>> max_sum_in_array(arr, k) 24 >>> k = 10 >>> max_sum_in_array(arr,k) Traceback (most recent call last): ... ValueError: Invalid Input >>> arr = [1, 4, 2, 10, 2, 13, 1, 0, 2] >>> k = 4 >>> max_sum_in_array(arr, k) 27 """ if len(array) < k or k < 0: raise ValueError("Invalid Input") max_sum = current_sum = sum(array[:k]) for i in range(len(array) - k): current_sum = current_sum - array[i] + array[i + k] max_sum = max(max_sum, current_sum) return max_sum if __name__ == "__main__": from doctest import testmod from random import randint testmod() array = [randint(-1000, 1000) for i in range(100)] k = randint(0, 110) print( f"The maximum sum of {k} consecutive elements is {max_sum_in_array(array, k)}" ) ================================================ FILE: maths/minkowski_distance.py ================================================ def minkowski_distance( point_a: list[float], point_b: list[float], order: int, ) -> float: """ This function calculates the Minkowski distance for a given order between two n-dimensional points represented as lists. For the case of order = 1, the Minkowski distance degenerates to the Manhattan distance. For order = 2, the usual Euclidean distance is obtained. https://en.wikipedia.org/wiki/Minkowski_distance Note: due to floating point calculation errors the output of this function may be inaccurate. >>> minkowski_distance([1.0, 1.0], [2.0, 2.0], 1) 2.0 >>> minkowski_distance([1.0, 2.0, 3.0, 4.0], [5.0, 6.0, 7.0, 8.0], 2) 8.0 >>> import numpy as np >>> bool(np.isclose(5.0, minkowski_distance([5.0], [0.0], 3))) True >>> minkowski_distance([1.0], [2.0], -1) Traceback (most recent call last): ... ValueError: The order must be greater than or equal to 1. >>> minkowski_distance([1.0], [1.0, 2.0], 1) Traceback (most recent call last): ... ValueError: Both points must have the same dimension. """ if order < 1: raise ValueError("The order must be greater than or equal to 1.") if len(point_a) != len(point_b): raise ValueError("Both points must have the same dimension.") return sum(abs(a - b) ** order for a, b in zip(point_a, point_b)) ** (1 / order) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/mobius_function.py ================================================ """ References: https://en.wikipedia.org/wiki/M%C3%B6bius_function References: wikipedia:square free number psf/black : True ruff : True """ from maths.is_square_free import is_square_free from maths.prime_factors import prime_factors def mobius(n: int) -> int: """ Mobius function >>> mobius(24) 0 >>> mobius(-1) 1 >>> mobius('asd') Traceback (most recent call last): ... TypeError: '<=' not supported between instances of 'int' and 'str' >>> mobius(10**400) 0 >>> mobius(10**-400) 1 >>> mobius(-1424) 1 >>> mobius([1, '2', 2.0]) Traceback (most recent call last): ... TypeError: '<=' not supported between instances of 'int' and 'list' """ factors = prime_factors(n) if is_square_free(factors): return -1 if len(factors) % 2 else 1 return 0 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/modular_division.py ================================================ from __future__ import annotations def modular_division(a: int, b: int, n: int) -> int: """ Modular Division : An efficient algorithm for dividing b by a modulo n. GCD ( Greatest Common Divisor ) or HCF ( Highest Common Factor ) Given three integers a, b, and n, such that gcd(a,n)=1 and n>1, the algorithm should return an integer x such that 0≤x≤n-1, and b/a=x(modn) (that is, b=ax(modn)). Theorem: a has a multiplicative inverse modulo n iff gcd(a,n) = 1 This find x = b*a^(-1) mod n Uses ExtendedEuclid to find the inverse of a >>> modular_division(4,8,5) 2 >>> modular_division(3,8,5) 1 >>> modular_division(4, 11, 5) 4 """ if n <= 1: raise ValueError("Modulus n must be greater than 1") if a <= 0: raise ValueError("Divisor a must be a positive integer") if greatest_common_divisor(a, n) != 1: raise ValueError("a and n must be coprime (gcd(a, n) = 1)") (_d, _t, s) = extended_gcd(n, a) # Implemented below x = (b * s) % n return x def invert_modulo(a: int, n: int) -> int: """ This function find the inverses of a i.e., a^(-1) >>> invert_modulo(2, 5) 3 >>> invert_modulo(8,7) 1 """ (b, _x) = extended_euclid(a, n) # Implemented below if b < 0: b = (b % n + n) % n return b # ------------------ Finding Modular division using invert_modulo ------------------- def modular_division2(a: int, b: int, n: int) -> int: """ This function used the above inversion of a to find x = (b*a^(-1))mod n >>> modular_division2(4,8,5) 2 >>> modular_division2(3,8,5) 1 >>> modular_division2(4, 11, 5) 4 """ s = invert_modulo(a, n) x = (b * s) % n return x def extended_gcd(a: int, b: int) -> tuple[int, int, int]: """ Extended Euclid's Algorithm : If d divides a and b and d = a*x + b*y for integers x and y, then d = gcd(a,b) >>> extended_gcd(10, 6) (2, -1, 2) >>> extended_gcd(7, 5) (1, -2, 3) ** extended_gcd function is used when d = gcd(a,b) is required in output """ assert a >= 0 assert b >= 0 if b == 0: d, x, y = a, 1, 0 else: (d, p, q) = extended_gcd(b, a % b) x = q y = p - q * (a // b) assert a % d == 0 assert b % d == 0 assert d == a * x + b * y return (d, x, y) def extended_euclid(a: int, b: int) -> tuple[int, int]: """ Extended Euclid >>> extended_euclid(10, 6) (-1, 2) >>> extended_euclid(7, 5) (-2, 3) """ if b == 0: return (1, 0) (x, y) = extended_euclid(b, a % b) k = a // b return (y, x - k * y) def greatest_common_divisor(a: int, b: int) -> int: """ Euclid's Lemma : d divides a and b, if and only if d divides a-b and b Euclid's Algorithm >>> greatest_common_divisor(7,5) 1 Note : In number theory, two integers a and b are said to be relatively prime, mutually prime, or co-prime if the only positive integer (factor) that divides both of them is 1 i.e., gcd(a,b) = 1. >>> greatest_common_divisor(121, 11) 11 """ if a < b: a, b = b, a while a % b != 0: a, b = b, a % b return b if __name__ == "__main__": from doctest import testmod testmod(name="modular_division", verbose=True) testmod(name="modular_division2", verbose=True) testmod(name="invert_modulo", verbose=True) testmod(name="extended_gcd", verbose=True) testmod(name="extended_euclid", verbose=True) testmod(name="greatest_common_divisor", verbose=True) ================================================ FILE: maths/modular_exponential.py ================================================ """ Modular Exponential. Modular exponentiation is a type of exponentiation performed over a modulus. For more explanation, please check https://en.wikipedia.org/wiki/Modular_exponentiation """ """Calculate Modular Exponential.""" def modular_exponential(base: int, power: int, mod: int): """ >>> modular_exponential(5, 0, 10) 1 >>> modular_exponential(2, 8, 7) 4 >>> modular_exponential(3, -2, 9) -1 """ if power < 0: return -1 base %= mod result = 1 while power > 0: if power & 1: result = (result * base) % mod power = power >> 1 base = (base * base) % mod return result def main(): """Call Modular Exponential Function.""" print(modular_exponential(3, 200, 13)) if __name__ == "__main__": import doctest doctest.testmod() main() ================================================ FILE: maths/monte_carlo.py ================================================ """ @author: MatteoRaso """ from collections.abc import Callable from math import pi, sqrt from random import uniform from statistics import mean def pi_estimator(iterations: int) -> None: """ An implementation of the Monte Carlo method used to find pi. 1. Draw a 2x2 square centred at (0,0). 2. Inscribe a circle within the square. 3. For each iteration, place a dot anywhere in the square. a. Record the number of dots within the circle. 4. After all the dots are placed, divide the dots in the circle by the total. 5. Multiply this value by 4 to get your estimate of pi. 6. Print the estimated and numpy value of pi """ # A local function to see if a dot lands in the circle. def is_in_circle(x: float, y: float) -> bool: distance_from_centre = sqrt((x**2) + (y**2)) # Our circle has a radius of 1, so a distance # greater than 1 would land outside the circle. return distance_from_centre <= 1 # The proportion of guesses that landed in the circle proportion = mean( int(is_in_circle(uniform(-1.0, 1.0), uniform(-1.0, 1.0))) for _ in range(iterations) ) # The ratio of the area for circle to square is pi/4. pi_estimate = proportion * 4 print(f"The estimated value of pi is {pi_estimate}") print(f"The numpy value of pi is {pi}") print(f"The total error is {abs(pi - pi_estimate)}") def area_under_curve_estimator( iterations: int, function_to_integrate: Callable[[float], float], min_value: float = 0.0, max_value: float = 1.0, ) -> float: """ An implementation of the Monte Carlo method to find area under a single variable non-negative real-valued continuous function, say f(x), where x lies within a continuous bounded interval, say [min_value, max_value], where min_value and max_value are finite numbers 1. Let x be a uniformly distributed random variable between min_value to max_value 2. Expected value of f(x) = (integrate f(x) from min_value to max_value)/(max_value - min_value) 3. Finding expected value of f(x): a. Repeatedly draw x from uniform distribution b. Evaluate f(x) at each of the drawn x values c. Expected value = average of the function evaluations 4. Estimated value of integral = Expected value * (max_value - min_value) 5. Returns estimated value """ return mean( function_to_integrate(uniform(min_value, max_value)) for _ in range(iterations) ) * (max_value - min_value) def area_under_line_estimator_check( iterations: int, min_value: float = 0.0, max_value: float = 1.0 ) -> None: """ Checks estimation error for area_under_curve_estimator function for f(x) = x where x lies within min_value to max_value 1. Calls "area_under_curve_estimator" function 2. Compares with the expected value 3. Prints estimated, expected and error value """ def identity_function(x: float) -> float: """ Represents identity function >>> [function_to_integrate(x) for x in [-2.0, -1.0, 0.0, 1.0, 2.0]] [-2.0, -1.0, 0.0, 1.0, 2.0] """ return x estimated_value = area_under_curve_estimator( iterations, identity_function, min_value, max_value ) expected_value = (max_value * max_value - min_value * min_value) / 2 print("******************") print(f"Estimating area under y=x where x varies from {min_value} to {max_value}") print(f"Estimated value is {estimated_value}") print(f"Expected value is {expected_value}") print(f"Total error is {abs(estimated_value - expected_value)}") print("******************") def pi_estimator_using_area_under_curve(iterations: int) -> None: """ Area under curve y = sqrt(4 - x^2) where x lies in 0 to 2 is equal to pi """ def function_to_integrate(x: float) -> float: """ Represents semi-circle with radius 2 >>> [function_to_integrate(x) for x in [-2.0, 0.0, 2.0]] [0.0, 2.0, 0.0] """ return sqrt(4.0 - x * x) estimated_value = area_under_curve_estimator( iterations, function_to_integrate, 0.0, 2.0 ) print("******************") print("Estimating pi using area_under_curve_estimator") print(f"Estimated value is {estimated_value}") print(f"Expected value is {pi}") print(f"Total error is {abs(estimated_value - pi)}") print("******************") if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/monte_carlo_dice.py ================================================ from __future__ import annotations import random class Dice: NUM_SIDES = 6 def __init__(self): """Initialize a six sided dice""" self.sides = list(range(1, Dice.NUM_SIDES + 1)) def roll(self): return random.choice(self.sides) def throw_dice(num_throws: int, num_dice: int = 2) -> list[float]: """ Return probability list of all possible sums when throwing dice. >>> random.seed(0) >>> throw_dice(10, 1) [10.0, 0.0, 30.0, 50.0, 10.0, 0.0] >>> throw_dice(100, 1) [19.0, 17.0, 17.0, 11.0, 23.0, 13.0] >>> throw_dice(1000, 1) [18.8, 15.5, 16.3, 17.6, 14.2, 17.6] >>> throw_dice(10000, 1) [16.35, 16.89, 16.93, 16.6, 16.52, 16.71] >>> throw_dice(10000, 2) [2.74, 5.6, 7.99, 11.26, 13.92, 16.7, 14.44, 10.63, 8.05, 5.92, 2.75] """ dices = [Dice() for i in range(num_dice)] count_of_sum = [0] * (len(dices) * Dice.NUM_SIDES + 1) for _ in range(num_throws): count_of_sum[sum(dice.roll() for dice in dices)] += 1 probability = [round((count * 100) / num_throws, 2) for count in count_of_sum] return probability[num_dice:] # remove probability of sums that never appear if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/number_of_digits.py ================================================ import math from timeit import timeit def num_digits(n: int) -> int: """ Find the number of digits in a number. >>> num_digits(12345) 5 >>> num_digits(123) 3 >>> num_digits(0) 1 >>> num_digits(-1) 1 >>> num_digits(-123456) 6 >>> num_digits('123') # Raises a TypeError for non-integer input Traceback (most recent call last): ... TypeError: Input must be an integer """ if not isinstance(n, int): raise TypeError("Input must be an integer") digits = 0 n = abs(n) while True: n = n // 10 digits += 1 if n == 0: break return digits def num_digits_fast(n: int) -> int: """ Find the number of digits in a number. abs() is used as logarithm for negative numbers is not defined. >>> num_digits_fast(12345) 5 >>> num_digits_fast(123) 3 >>> num_digits_fast(0) 1 >>> num_digits_fast(-1) 1 >>> num_digits_fast(-123456) 6 >>> num_digits('123') # Raises a TypeError for non-integer input Traceback (most recent call last): ... TypeError: Input must be an integer """ if not isinstance(n, int): raise TypeError("Input must be an integer") return 1 if n == 0 else math.floor(math.log(abs(n), 10) + 1) def num_digits_faster(n: int) -> int: """ Find the number of digits in a number. abs() is used for negative numbers >>> num_digits_faster(12345) 5 >>> num_digits_faster(123) 3 >>> num_digits_faster(0) 1 >>> num_digits_faster(-1) 1 >>> num_digits_faster(-123456) 6 >>> num_digits('123') # Raises a TypeError for non-integer input Traceback (most recent call last): ... TypeError: Input must be an integer """ if not isinstance(n, int): raise TypeError("Input must be an integer") return len(str(abs(n))) def benchmark() -> None: """ Benchmark multiple functions, with three different length int values. """ from collections.abc import Callable def benchmark_a_function(func: Callable, value: int) -> None: call = f"{func.__name__}({value})" timing = timeit(f"__main__.{call}", setup="import __main__") print(f"{call}: {func(value)} -- {timing} seconds") for value in (262144, 1125899906842624, 1267650600228229401496703205376): for func in (num_digits, num_digits_fast, num_digits_faster): benchmark_a_function(func, value) print() if __name__ == "__main__": import doctest doctest.testmod() benchmark() ================================================ FILE: maths/numerical_analysis/__init__.py ================================================ ================================================ FILE: maths/numerical_analysis/adams_bashforth.py ================================================ """ Use the Adams-Bashforth methods to solve Ordinary Differential Equations. https://en.wikipedia.org/wiki/Linear_multistep_method Author : Ravi Kumar """ from collections.abc import Callable from dataclasses import dataclass import numpy as np @dataclass class AdamsBashforth: """ args: func: An ordinary differential equation (ODE) as function of x and y. x_initials: List containing initial required values of x. y_initials: List containing initial required values of y. step_size: The increment value of x. x_final: The final value of x. Returns: Solution of y at each nodal point >>> def f(x, y): ... return x + y >>> AdamsBashforth(f, [0, 0.2, 0.4], [0, 0.2, 1], 0.2, 1) # doctest: +ELLIPSIS AdamsBashforth(func=..., x_initials=[0, 0.2, 0.4], y_initials=[0, 0.2, 1], step...) >>> AdamsBashforth(f, [0, 0.2, 1], [0, 0, 0.04], 0.2, 1).step_2() Traceback (most recent call last): ... ValueError: The final value of x must be greater than the initial values of x. >>> AdamsBashforth(f, [0, 0.2, 0.3], [0, 0, 0.04], 0.2, 1).step_3() Traceback (most recent call last): ... ValueError: x-values must be equally spaced according to step size. >>> AdamsBashforth(f,[0,0.2,0.4,0.6,0.8],[0,0,0.04,0.128,0.307],-0.2,1).step_5() Traceback (most recent call last): ... ValueError: Step size must be positive. """ func: Callable[[float, float], float] x_initials: list[float] y_initials: list[float] step_size: float x_final: float def __post_init__(self) -> None: if self.x_initials[-1] >= self.x_final: raise ValueError( "The final value of x must be greater than the initial values of x." ) if self.step_size <= 0: raise ValueError("Step size must be positive.") if not all( round(x1 - x0, 10) == self.step_size for x0, x1 in zip(self.x_initials, self.x_initials[1:]) ): raise ValueError("x-values must be equally spaced according to step size.") def step_2(self) -> np.ndarray: """ >>> def f(x, y): ... return x >>> AdamsBashforth(f, [0, 0.2], [0, 0], 0.2, 1).step_2() array([0. , 0. , 0.06, 0.16, 0.3 , 0.48]) >>> AdamsBashforth(f, [0, 0.2, 0.4], [0, 0, 0.04], 0.2, 1).step_2() Traceback (most recent call last): ... ValueError: Insufficient initial points information. """ if len(self.x_initials) != 2 or len(self.y_initials) != 2: raise ValueError("Insufficient initial points information.") x_0, x_1 = self.x_initials[:2] y_0, y_1 = self.y_initials[:2] n = int((self.x_final - x_1) / self.step_size) y = np.zeros(n + 2) y[0] = y_0 y[1] = y_1 for i in range(n): y[i + 2] = y[i + 1] + (self.step_size / 2) * ( 3 * self.func(x_1, y[i + 1]) - self.func(x_0, y[i]) ) x_0 = x_1 x_1 += self.step_size return y def step_3(self) -> np.ndarray: """ >>> def f(x, y): ... return x + y >>> y = AdamsBashforth(f, [0, 0.2, 0.4], [0, 0, 0.04], 0.2, 1).step_3() >>> float(y[3]) 0.15533333333333332 >>> AdamsBashforth(f, [0, 0.2], [0, 0], 0.2, 1).step_3() Traceback (most recent call last): ... ValueError: Insufficient initial points information. """ if len(self.x_initials) != 3 or len(self.y_initials) != 3: raise ValueError("Insufficient initial points information.") x_0, x_1, x_2 = self.x_initials[:3] y_0, y_1, y_2 = self.y_initials[:3] n = int((self.x_final - x_2) / self.step_size) y = np.zeros(n + 4) y[0] = y_0 y[1] = y_1 y[2] = y_2 for i in range(n + 1): y[i + 3] = y[i + 2] + (self.step_size / 12) * ( 23 * self.func(x_2, y[i + 2]) - 16 * self.func(x_1, y[i + 1]) + 5 * self.func(x_0, y[i]) ) x_0 = x_1 x_1 = x_2 x_2 += self.step_size return y def step_4(self) -> np.ndarray: """ >>> def f(x,y): ... return x + y >>> y = AdamsBashforth( ... f, [0, 0.2, 0.4, 0.6], [0, 0, 0.04, 0.128], 0.2, 1).step_4() >>> float(y[4]) 0.30699999999999994 >>> float(y[5]) 0.5771083333333333 >>> AdamsBashforth(f, [0, 0.2, 0.4], [0, 0, 0.04], 0.2, 1).step_4() Traceback (most recent call last): ... ValueError: Insufficient initial points information. """ if len(self.x_initials) != 4 or len(self.y_initials) != 4: raise ValueError("Insufficient initial points information.") x_0, x_1, x_2, x_3 = self.x_initials[:4] y_0, y_1, y_2, y_3 = self.y_initials[:4] n = int((self.x_final - x_3) / self.step_size) y = np.zeros(n + 4) y[0] = y_0 y[1] = y_1 y[2] = y_2 y[3] = y_3 for i in range(n): y[i + 4] = y[i + 3] + (self.step_size / 24) * ( 55 * self.func(x_3, y[i + 3]) - 59 * self.func(x_2, y[i + 2]) + 37 * self.func(x_1, y[i + 1]) - 9 * self.func(x_0, y[i]) ) x_0 = x_1 x_1 = x_2 x_2 = x_3 x_3 += self.step_size return y def step_5(self) -> np.ndarray: """ >>> def f(x,y): ... return x + y >>> y = AdamsBashforth( ... f, [0, 0.2, 0.4, 0.6, 0.8], [0, 0.02140, 0.02140, 0.22211, 0.42536], ... 0.2, 1).step_5() >>> float(y[-1]) 0.05436839444444452 >>> AdamsBashforth(f, [0, 0.2, 0.4], [0, 0, 0.04], 0.2, 1).step_5() Traceback (most recent call last): ... ValueError: Insufficient initial points information. """ if len(self.x_initials) != 5 or len(self.y_initials) != 5: raise ValueError("Insufficient initial points information.") x_0, x_1, x_2, x_3, x_4 = self.x_initials[:5] y_0, y_1, y_2, y_3, y_4 = self.y_initials[:5] n = int((self.x_final - x_4) / self.step_size) y = np.zeros(n + 6) y[0] = y_0 y[1] = y_1 y[2] = y_2 y[3] = y_3 y[4] = y_4 for i in range(n + 1): y[i + 5] = y[i + 4] + (self.step_size / 720) * ( 1901 * self.func(x_4, y[i + 4]) - 2774 * self.func(x_3, y[i + 3]) - 2616 * self.func(x_2, y[i + 2]) - 1274 * self.func(x_1, y[i + 1]) + 251 * self.func(x_0, y[i]) ) x_0 = x_1 x_1 = x_2 x_2 = x_3 x_3 = x_4 x_4 += self.step_size return y if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/numerical_analysis/bisection.py ================================================ from collections.abc import Callable def bisection(function: Callable[[float], float], a: float, b: float) -> float: """ finds where function becomes 0 in [a,b] using bolzano >>> bisection(lambda x: x ** 3 - 1, -5, 5) 1.0000000149011612 >>> bisection(lambda x: x ** 3 - 1, 2, 1000) Traceback (most recent call last): ... ValueError: could not find root in given interval. >>> bisection(lambda x: x ** 2 - 4 * x + 3, 0, 2) 1.0 >>> bisection(lambda x: x ** 2 - 4 * x + 3, 2, 4) 3.0 >>> bisection(lambda x: x ** 2 - 4 * x + 3, 4, 1000) Traceback (most recent call last): ... ValueError: could not find root in given interval. """ start: float = a end: float = b if function(a) == 0: # one of the a or b is a root for the function return a elif function(b) == 0: return b elif ( function(a) * function(b) > 0 ): # if none of these are root and they are both positive or negative, # then this algorithm can't find the root raise ValueError("could not find root in given interval.") else: mid: float = start + (end - start) / 2.0 while abs(start - mid) > 10**-7: # until precisely equals to 10^-7 if function(mid) == 0: return mid elif function(mid) * function(start) < 0: end = mid else: start = mid mid = start + (end - start) / 2.0 return mid def f(x: float) -> float: return x**3 - 2 * x - 5 if __name__ == "__main__": print(bisection(f, 1, 1000)) import doctest doctest.testmod() ================================================ FILE: maths/numerical_analysis/bisection_2.py ================================================ """ Given a function on floating number f(x) and two floating numbers `a` and `b` such that f(a) * f(b) < 0 and f(x) is continuous in [a, b]. Here f(x) represents algebraic or transcendental equation. Find root of function in interval [a, b] (Or find a value of x such that f(x) is 0) https://en.wikipedia.org/wiki/Bisection_method """ def equation(x: float) -> float: """ >>> equation(5) -15 >>> equation(0) 10 >>> equation(-5) -15 >>> equation(0.1) 9.99 >>> equation(-0.1) 9.99 """ return 10 - x * x def bisection(a: float, b: float) -> float: """ >>> bisection(-2, 5) 3.1611328125 >>> bisection(0, 6) 3.158203125 >>> bisection(2, 3) Traceback (most recent call last): ... ValueError: Wrong space! """ # Bolzano theory in order to find if there is a root between a and b if equation(a) * equation(b) >= 0: raise ValueError("Wrong space!") c = a while (b - a) >= 0.01: # Find middle point c = (a + b) / 2 # Check if middle point is root if equation(c) == 0.0: break # Decide the side to repeat the steps if equation(c) * equation(a) < 0: b = c else: a = c return c if __name__ == "__main__": import doctest doctest.testmod() print(bisection(-2, 5)) print(bisection(0, 6)) ================================================ FILE: maths/numerical_analysis/integration_by_simpson_approx.py ================================================ """ Author : Syed Faizan ( 3rd Year IIIT Pune ) Github : faizan2700 Purpose : You have one function f(x) which takes float integer and returns float you have to integrate the function in limits a to b. The approximation proposed by Thomas Simpson in 1743 is one way to calculate integration. ( read article : https://cp-algorithms.com/num_methods/simpson-integration.html ) simpson_integration() takes function,lower_limit=a,upper_limit=b,precision and returns the integration of function in given limit. """ # constants # the more the number of steps the more accurate N_STEPS = 1000 def f(x: float) -> float: return x * x """ Summary of Simpson Approximation : By simpsons integration : 1. integration of fxdx with limit a to b is = f(x0) + 4 * f(x1) + 2 * f(x2) + 4 * f(x3) + 2 * f(x4)..... + f(xn) where x0 = a xi = a + i * h xn = b """ def simpson_integration(function, a: float, b: float, precision: int = 4) -> float: """ Args: function : the function which's integration is desired a : the lower limit of integration b : upper limit of integration precision : precision of the result,error required default is 4 Returns: result : the value of the approximated integration of function in range a to b Raises: AssertionError: function is not callable AssertionError: a is not float or integer AssertionError: function should return float or integer AssertionError: b is not float or integer AssertionError: precision is not positive integer >>> simpson_integration(lambda x : x*x,1,2,3) 2.333 >>> simpson_integration(lambda x : x*x,'wrong_input',2,3) Traceback (most recent call last): ... AssertionError: a should be float or integer your input : wrong_input >>> simpson_integration(lambda x : x*x,1,'wrong_input',3) Traceback (most recent call last): ... AssertionError: b should be float or integer your input : wrong_input >>> simpson_integration(lambda x : x*x,1,2,'wrong_input') Traceback (most recent call last): ... AssertionError: precision should be positive integer your input : wrong_input >>> simpson_integration('wrong_input',2,3,4) Traceback (most recent call last): ... AssertionError: the function(object) passed should be callable your input : ... >>> simpson_integration(lambda x : x*x,3.45,3.2,1) -2.8 >>> simpson_integration(lambda x : x*x,3.45,3.2,0) Traceback (most recent call last): ... AssertionError: precision should be positive integer your input : 0 >>> simpson_integration(lambda x : x*x,3.45,3.2,-1) Traceback (most recent call last): ... AssertionError: precision should be positive integer your input : -1 """ assert callable(function), ( f"the function(object) passed should be callable your input : {function}" ) assert isinstance(a, (float, int)), f"a should be float or integer your input : {a}" assert isinstance(function(a), (float, int)), ( "the function should return integer or float return type of your function, " f"{type(a)}" ) assert isinstance(b, (float, int)), f"b should be float or integer your input : {b}" assert isinstance(precision, int) and precision > 0, ( f"precision should be positive integer your input : {precision}" ) # just applying the formula of simpson for approximate integration written in # mentioned article in first comment of this file and above this function h = (b - a) / N_STEPS result = function(a) + function(b) for i in range(1, N_STEPS): a1 = a + h * i result += function(a1) * (4 if i % 2 else 2) result *= h / 3 return round(result, precision) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/numerical_analysis/intersection.py ================================================ import math from collections.abc import Callable def intersection(function: Callable[[float], float], x0: float, x1: float) -> float: """ function is the f we want to find its root x0 and x1 are two random starting points >>> intersection(lambda x: x ** 3 - 1, -5, 5) 0.9999999999954654 >>> intersection(lambda x: x ** 3 - 1, 5, 5) Traceback (most recent call last): ... ZeroDivisionError: float division by zero, could not find root >>> intersection(lambda x: x ** 3 - 1, 100, 200) 1.0000000000003888 >>> intersection(lambda x: x ** 2 - 4 * x + 3, 0, 2) 0.9999999998088019 >>> intersection(lambda x: x ** 2 - 4 * x + 3, 2, 4) 2.9999999998088023 >>> intersection(lambda x: x ** 2 - 4 * x + 3, 4, 1000) 3.0000000001786042 >>> intersection(math.sin, -math.pi, math.pi) 0.0 >>> intersection(math.cos, -math.pi, math.pi) Traceback (most recent call last): ... ZeroDivisionError: float division by zero, could not find root """ x_n: float = x0 x_n1: float = x1 while True: if x_n == x_n1 or function(x_n1) == function(x_n): raise ZeroDivisionError("float division by zero, could not find root") x_n2: float = x_n1 - ( function(x_n1) / ((function(x_n1) - function(x_n)) / (x_n1 - x_n)) ) if abs(x_n2 - x_n1) < 10**-5: return x_n2 x_n = x_n1 x_n1 = x_n2 def f(x: float) -> float: """ function is f(x) = x^3 - 2x - 5 >>> f(2) -1.0 """ return math.pow(x, 3) - (2 * x) - 5 if __name__ == "__main__": print(intersection(f, 3, 3.5)) ================================================ FILE: maths/numerical_analysis/nevilles_method.py ================================================ """ Python program to show how to interpolate and evaluate a polynomial using Neville's method. Neville's method evaluates a polynomial that passes through a given set of x and y points for a particular x value (x0) using the Newton polynomial form. Reference: https://rpubs.com/aaronsc32/nevilles-method-polynomial-interpolation """ def neville_interpolate(x_points: list, y_points: list, x0: int) -> list: """ Interpolate and evaluate a polynomial using Neville's method. Arguments: x_points, y_points: Iterables of x and corresponding y points through which the polynomial passes. x0: The value of x to evaluate the polynomial for. Return Value: A list of the approximated value and the Neville iterations table respectively. >>> import pprint >>> neville_interpolate((1,2,3,4,6), (6,7,8,9,11), 5)[0] 10.0 >>> pprint.pprint(neville_interpolate((1,2,3,4,6), (6,7,8,9,11), 99)[1]) [[0, 6, 0, 0, 0], [0, 7, 0, 0, 0], [0, 8, 104.0, 0, 0], [0, 9, 104.0, 104.0, 0], [0, 11, 104.0, 104.0, 104.0]] >>> neville_interpolate((1,2,3,4,6), (6,7,8,9,11), 99)[0] 104.0 >>> neville_interpolate((1,2,3,4,6), (6,7,8,9,11), '') Traceback (most recent call last): ... TypeError: unsupported operand type(s) for -: 'str' and 'int' """ n = len(x_points) q = [[0] * n for i in range(n)] for i in range(n): q[i][1] = y_points[i] for i in range(2, n): for j in range(i, n): q[j][i] = ( (x0 - x_points[j - i + 1]) * q[j][i - 1] - (x0 - x_points[j]) * q[j - 1][i - 1] ) / (x_points[j] - x_points[j - i + 1]) return [q[n - 1][n - 1], q] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/numerical_analysis/newton_forward_interpolation.py ================================================ # https://www.geeksforgeeks.org/newton-forward-backward-interpolation/ from __future__ import annotations import math # for calculating u value def ucal(u: float, p: int) -> float: """ >>> ucal(1, 2) 0 >>> ucal(1.1, 2) 0.11000000000000011 >>> ucal(1.2, 2) 0.23999999999999994 """ temp = u for i in range(1, p): temp = temp * (u - i) return temp def main() -> None: n = int(input("enter the numbers of values: ")) y: list[list[float]] = [] for _ in range(n): y.append([]) for i in range(n): for j in range(n): y[i].append(j) y[i][j] = 0 print("enter the values of parameters in a list: ") x = list(map(int, input().split())) print("enter the values of corresponding parameters: ") for i in range(n): y[i][0] = float(input()) value = int(input("enter the value to interpolate: ")) u = (value - x[0]) / (x[1] - x[0]) # for calculating forward difference table for i in range(1, n): for j in range(n - i): y[j][i] = y[j + 1][i - 1] - y[j][i - 1] summ = y[0][0] for i in range(1, n): summ += (ucal(u, i) * y[0][i]) / math.factorial(i) print(f"the value at {value} is {summ}") if __name__ == "__main__": main() ================================================ FILE: maths/numerical_analysis/newton_raphson.py ================================================ """ The Newton-Raphson method (aka the Newton method) is a root-finding algorithm that approximates a root of a given real-valued function f(x). It is an iterative method given by the formula x_{n + 1} = x_n + f(x_n) / f'(x_n) with the precision of the approximation increasing as the number of iterations increase. Reference: https://en.wikipedia.org/wiki/Newton%27s_method """ from collections.abc import Callable RealFunc = Callable[[float], float] def calc_derivative(f: RealFunc, x: float, delta_x: float = 1e-3) -> float: """ Approximate the derivative of a function f(x) at a point x using the finite difference method >>> import math >>> tolerance = 1e-5 >>> derivative = calc_derivative(lambda x: x**2, 2) >>> math.isclose(derivative, 4, abs_tol=tolerance) True >>> derivative = calc_derivative(math.sin, 0) >>> math.isclose(derivative, 1, abs_tol=tolerance) True """ return (f(x + delta_x / 2) - f(x - delta_x / 2)) / delta_x def newton_raphson( f: RealFunc, x0: float = 0, max_iter: int = 100, step: float = 1e-6, max_error: float = 1e-6, log_steps: bool = False, ) -> tuple[float, float, list[float]]: """ Find a root of the given function f using the Newton-Raphson method. :param f: A real-valued single-variable function :param x0: Initial guess :param max_iter: Maximum number of iterations :param step: Step size of x, used to approximate f'(x) :param max_error: Maximum approximation error :param log_steps: bool denoting whether to log intermediate steps :return: A tuple containing the approximation, the error, and the intermediate steps. If log_steps is False, then an empty list is returned for the third element of the tuple. :raises ZeroDivisionError: The derivative approaches 0. :raises ArithmeticError: No solution exists, or the solution isn't found before the iteration limit is reached. >>> import math >>> tolerance = 1e-15 >>> root, *_ = newton_raphson(lambda x: x**2 - 5*x + 2, 0.4, max_error=tolerance) >>> math.isclose(root, (5 - math.sqrt(17)) / 2, abs_tol=tolerance) True >>> root, *_ = newton_raphson(lambda x: math.log(x) - 1, 2, max_error=tolerance) >>> math.isclose(root, math.e, abs_tol=tolerance) True >>> root, *_ = newton_raphson(math.sin, 1, max_error=tolerance) >>> math.isclose(root, 0, abs_tol=tolerance) True >>> newton_raphson(math.cos, 0) Traceback (most recent call last): ... ZeroDivisionError: No converging solution found, zero derivative >>> newton_raphson(lambda x: x**2 + 1, 2) Traceback (most recent call last): ... ArithmeticError: No converging solution found, iteration limit reached """ def f_derivative(x: float) -> float: return calc_derivative(f, x, step) a = x0 # Set initial guess steps = [] for _ in range(max_iter): if log_steps: # Log intermediate steps steps.append(a) error = abs(f(a)) if error < max_error: return a, error, steps if f_derivative(a) == 0: raise ZeroDivisionError("No converging solution found, zero derivative") a -= f(a) / f_derivative(a) # Calculate next estimate raise ArithmeticError("No converging solution found, iteration limit reached") if __name__ == "__main__": import doctest from math import exp, tanh doctest.testmod() def func(x: float) -> float: return tanh(x) ** 2 - exp(3 * x) solution, err, steps = newton_raphson( func, x0=10, max_iter=100, step=1e-6, log_steps=True ) print(f"{solution=}, {err=}") print("\n".join(str(x) for x in steps)) ================================================ FILE: maths/numerical_analysis/numerical_integration.py ================================================ """ Approximates the area under the curve using the trapezoidal rule """ from __future__ import annotations from collections.abc import Callable def trapezoidal_area( fnc: Callable[[float], float], x_start: float, x_end: float, steps: int = 100, ) -> float: """ Treats curve as a collection of linear lines and sums the area of the trapezium shape they form :param fnc: a function which defines a curve :param x_start: left end point to indicate the start of line segment :param x_end: right end point to indicate end of line segment :param steps: an accuracy gauge; more steps increases the accuracy :return: a float representing the length of the curve >>> def f(x): ... return 5 >>> '%.3f' % trapezoidal_area(f, 12.0, 14.0, 1000) '10.000' >>> def f(x): ... return 9*x**2 >>> '%.4f' % trapezoidal_area(f, -4.0, 0, 10000) '192.0000' >>> '%.4f' % trapezoidal_area(f, -4.0, 4.0, 10000) '384.0000' """ x1 = x_start fx1 = fnc(x_start) area = 0.0 for _ in range(steps): # Approximates small segments of curve as linear and solve # for trapezoidal area x2 = (x_end - x_start) / steps + x1 fx2 = fnc(x2) area += abs(fx2 + fx1) * (x2 - x1) / 2 # Increment step x1 = x2 fx1 = fx2 return area if __name__ == "__main__": def f(x): return x**3 print("f(x) = x^3") print("The area between the curve, x = -10, x = 10 and the x axis is:") i = 10 while i <= 100000: area = trapezoidal_area(f, -5, 5, i) print(f"with {i} steps: {area}") i *= 10 ================================================ FILE: maths/numerical_analysis/proper_fractions.py ================================================ from math import gcd def proper_fractions(denominator: int) -> list[str]: """ this algorithm returns a list of proper fractions, in the range between 0 and 1, which can be formed with the given denominator https://en.wikipedia.org/wiki/Fraction#Proper_and_improper_fractions >>> proper_fractions(10) ['1/10', '3/10', '7/10', '9/10'] >>> proper_fractions(5) ['1/5', '2/5', '3/5', '4/5'] >>> proper_fractions(-15) Traceback (most recent call last): ... ValueError: The Denominator Cannot be less than 0 >>> proper_fractions(0) [] >>> proper_fractions(1.2) Traceback (most recent call last): ... ValueError: The Denominator must be an integer """ if denominator < 0: raise ValueError("The Denominator Cannot be less than 0") elif isinstance(denominator, float): raise ValueError("The Denominator must be an integer") return [ f"{numerator}/{denominator}" for numerator in range(1, denominator) if gcd(numerator, denominator) == 1 ] if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: maths/numerical_analysis/runge_kutta.py ================================================ import numpy as np def runge_kutta(f, y0, x0, h, x_end): """ Calculate the numeric solution at each step to the ODE f(x, y) using RK4 https://en.wikipedia.org/wiki/Runge-Kutta_methods Arguments: f -- The ode as a function of x and y y0 -- the initial value for y x0 -- the initial value for x h -- the stepsize x_end -- the end value for x >>> # the exact solution is math.exp(x) >>> def f(x, y): ... return y >>> y0 = 1 >>> y = runge_kutta(f, y0, 0.0, 0.01, 5) >>> float(y[-1]) 148.41315904125113 """ n = int(np.ceil((x_end - x0) / h)) y = np.zeros((n + 1,)) y[0] = y0 x = x0 for k in range(n): k1 = f(x, y[k]) k2 = f(x + 0.5 * h, y[k] + 0.5 * h * k1) k3 = f(x + 0.5 * h, y[k] + 0.5 * h * k2) k4 = f(x + h, y[k] + h * k3) y[k + 1] = y[k] + (1 / 6) * h * (k1 + 2 * k2 + 2 * k3 + k4) x += h return y if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/numerical_analysis/runge_kutta_fehlberg_45.py ================================================ """ Use the Runge-Kutta-Fehlberg method to solve Ordinary Differential Equations. """ from collections.abc import Callable import numpy as np def runge_kutta_fehlberg_45( func: Callable, x_initial: float, y_initial: float, step_size: float, x_final: float, ) -> np.ndarray: """ Solve an Ordinary Differential Equations using Runge-Kutta-Fehlberg Method (rkf45) of order 5. https://en.wikipedia.org/wiki/Runge%E2%80%93Kutta%E2%80%93Fehlberg_method args: func: An ordinary differential equation (ODE) as function of x and y. x_initial: The initial value of x. y_initial: The initial value of y. step_size: The increment value of x. x_final: The final value of x. Returns: Solution of y at each nodal point # exact value of y[1] is tan(0.2) = 0.2027100937470787 >>> def f(x, y): ... return 1 + y**2 >>> y = runge_kutta_fehlberg_45(f, 0, 0, 0.2, 1) >>> float(y[1]) 0.2027100937470787 >>> def f(x,y): ... return x >>> y = runge_kutta_fehlberg_45(f, -1, 0, 0.2, 0) >>> float(y[1]) -0.18000000000000002 >>> y = runge_kutta_fehlberg_45(5, 0, 0, 0.1, 1) Traceback (most recent call last): ... TypeError: 'int' object is not callable >>> def f(x, y): ... return x + y >>> y = runge_kutta_fehlberg_45(f, 0, 0, 0.2, -1) Traceback (most recent call last): ... ValueError: The final value of x must be greater than initial value of x. >>> def f(x, y): ... return x >>> y = runge_kutta_fehlberg_45(f, -1, 0, -0.2, 0) Traceback (most recent call last): ... ValueError: Step size must be positive. """ if x_initial >= x_final: raise ValueError( "The final value of x must be greater than initial value of x." ) if step_size <= 0: raise ValueError("Step size must be positive.") n = int((x_final - x_initial) / step_size) y = np.zeros( (n + 1), ) x = np.zeros(n + 1) y[0] = y_initial x[0] = x_initial for i in range(n): k1 = step_size * func(x[i], y[i]) k2 = step_size * func(x[i] + step_size / 4, y[i] + k1 / 4) k3 = step_size * func( x[i] + (3 / 8) * step_size, y[i] + (3 / 32) * k1 + (9 / 32) * k2 ) k4 = step_size * func( x[i] + (12 / 13) * step_size, y[i] + (1932 / 2197) * k1 - (7200 / 2197) * k2 + (7296 / 2197) * k3, ) k5 = step_size * func( x[i] + step_size, y[i] + (439 / 216) * k1 - 8 * k2 + (3680 / 513) * k3 - (845 / 4104) * k4, ) k6 = step_size * func( x[i] + step_size / 2, y[i] - (8 / 27) * k1 + 2 * k2 - (3544 / 2565) * k3 + (1859 / 4104) * k4 - (11 / 40) * k5, ) y[i + 1] = ( y[i] + (16 / 135) * k1 + (6656 / 12825) * k3 + (28561 / 56430) * k4 - (9 / 50) * k5 + (2 / 55) * k6 ) x[i + 1] = step_size + x[i] return y if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/numerical_analysis/runge_kutta_gills.py ================================================ """ Use the Runge-Kutta-Gill's method of order 4 to solve Ordinary Differential Equations. https://www.geeksforgeeks.org/gills-4th-order-method-to-solve-differential-equations/ Author : Ravi Kumar """ from collections.abc import Callable from math import sqrt import numpy as np def runge_kutta_gills( func: Callable[[float, float], float], x_initial: float, y_initial: float, step_size: float, x_final: float, ) -> np.ndarray: """ Solve an Ordinary Differential Equations using Runge-Kutta-Gills Method of order 4. args: func: An ordinary differential equation (ODE) as function of x and y. x_initial: The initial value of x. y_initial: The initial value of y. step_size: The increment value of x. x_final: The final value of x. Returns: Solution of y at each nodal point >>> def f(x, y): ... return (x-y)/2 >>> y = runge_kutta_gills(f, 0, 3, 0.2, 5) >>> float(y[-1]) 3.4104259225717537 >>> def f(x,y): ... return x >>> y = runge_kutta_gills(f, -1, 0, 0.2, 0) >>> y array([ 0. , -0.18, -0.32, -0.42, -0.48, -0.5 ]) >>> def f(x, y): ... return x + y >>> y = runge_kutta_gills(f, 0, 0, 0.2, -1) Traceback (most recent call last): ... ValueError: The final value of x must be greater than initial value of x. >>> def f(x, y): ... return x >>> y = runge_kutta_gills(f, -1, 0, -0.2, 0) Traceback (most recent call last): ... ValueError: Step size must be positive. """ if x_initial >= x_final: raise ValueError( "The final value of x must be greater than initial value of x." ) if step_size <= 0: raise ValueError("Step size must be positive.") n = int((x_final - x_initial) / step_size) y = np.zeros(n + 1) y[0] = y_initial for i in range(n): k1 = step_size * func(x_initial, y[i]) k2 = step_size * func(x_initial + step_size / 2, y[i] + k1 / 2) k3 = step_size * func( x_initial + step_size / 2, y[i] + (-0.5 + 1 / sqrt(2)) * k1 + (1 - 1 / sqrt(2)) * k2, ) k4 = step_size * func( x_initial + step_size, y[i] - (1 / sqrt(2)) * k2 + (1 + 1 / sqrt(2)) * k3 ) y[i + 1] = y[i] + (k1 + (2 - sqrt(2)) * k2 + (2 + sqrt(2)) * k3 + k4) / 6 x_initial += step_size return y if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/numerical_analysis/secant_method.py ================================================ """ Implementing Secant method in Python Author: dimgrichr """ from math import exp def f(x: float) -> float: """ >>> f(5) 39.98652410600183 """ return 8 * x - 2 * exp(-x) def secant_method(lower_bound: float, upper_bound: float, repeats: int) -> float: """ >>> secant_method(1, 3, 2) 0.2139409276214589 """ x0 = lower_bound x1 = upper_bound for _ in range(repeats): x0, x1 = x1, x1 - (f(x1) * (x1 - x0)) / (f(x1) - f(x0)) return x1 if __name__ == "__main__": print(f"Example: {secant_method(1, 3, 2)}") ================================================ FILE: maths/numerical_analysis/simpson_rule.py ================================================ """ Numerical integration or quadrature for a smooth function f with known values at x_i This method is the classical approach of summing 'Equally Spaced Abscissas' method 2: "Simpson Rule" """ def method_2(boundary: list[int], steps: int) -> float: # "Simpson Rule" # int(f) = delta_x/2 * (b-a)/3*(f1 + 4f2 + 2f_3 + ... + fn) """ Calculate the definite integral of a function using Simpson's Rule. :param boundary: A list containing the lower and upper bounds of integration. :param steps: The number of steps or resolution for the integration. :return: The approximate integral value. >>> round(method_2([0, 2, 4], 10), 10) 2.6666666667 >>> round(method_2([2, 0], 10), 10) -0.2666666667 >>> round(method_2([-2, -1], 10), 10) 2.172 >>> round(method_2([0, 1], 10), 10) 0.3333333333 >>> round(method_2([0, 2], 10), 10) 2.6666666667 >>> round(method_2([0, 2], 100), 10) 2.5621226667 >>> round(method_2([0, 1], 1000), 10) 0.3320026653 >>> round(method_2([0, 2], 0), 10) Traceback (most recent call last): ... ZeroDivisionError: Number of steps must be greater than zero >>> round(method_2([0, 2], -10), 10) Traceback (most recent call last): ... ZeroDivisionError: Number of steps must be greater than zero """ if steps <= 0: raise ZeroDivisionError("Number of steps must be greater than zero") h = (boundary[1] - boundary[0]) / steps a = boundary[0] b = boundary[1] x_i = make_points(a, b, h) y = 0.0 y += (h / 3.0) * f(a) cnt = 2 for i in x_i: y += (h / 3) * (4 - 2 * (cnt % 2)) * f(i) cnt += 1 y += (h / 3.0) * f(b) return y def make_points(a, b, h): x = a + h while x < (b - h): yield x x = x + h def f(x): # enter your function here y = (x - 0) * (x - 0) return y def main(): a = 0.0 # Lower bound of integration b = 1.0 # Upper bound of integration steps = 10.0 # number of steps or resolution boundary = [a, b] # boundary of integration y = method_2(boundary, steps) print(f"y = {y}") if __name__ == "__main__": import doctest doctest.testmod() main() ================================================ FILE: maths/numerical_analysis/square_root.py ================================================ import math def fx(x: float, a: float) -> float: return math.pow(x, 2) - a def fx_derivative(x: float) -> float: return 2 * x def get_initial_point(a: float) -> float: start = 2.0 while start <= a: start = math.pow(start, 2) return start def square_root_iterative( a: float, max_iter: int = 9999, tolerance: float = 1e-14 ) -> float: """ Square root approximated using Newton's method. https://en.wikipedia.org/wiki/Newton%27s_method >>> all(abs(square_root_iterative(i) - math.sqrt(i)) <= 1e-14 for i in range(500)) True >>> square_root_iterative(-1) Traceback (most recent call last): ... ValueError: math domain error >>> square_root_iterative(4) 2.0 >>> square_root_iterative(3.2) 1.788854381999832 >>> square_root_iterative(140) 11.832159566199232 """ if a < 0: raise ValueError("math domain error") value = get_initial_point(a) for _ in range(max_iter): prev_value = value value = value - fx(value, a) / fx_derivative(value) if abs(prev_value - value) < tolerance: return value return value if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: maths/numerical_analysis/weierstrass_method.py ================================================ from collections.abc import Callable import numpy as np def weierstrass_method( polynomial: Callable[[np.ndarray], np.ndarray], degree: int, roots: np.ndarray | None = None, max_iter: int = 100, ) -> np.ndarray: """ Approximates all complex roots of a polynomial using the Weierstrass (Durand-Kerner) method. Args: polynomial: A function that takes a NumPy array of complex numbers and returns the polynomial values at those points. degree: Degree of the polynomial (number of roots to find). Must be ≥ 1. roots: Optional initial guess as a NumPy array of complex numbers. Must have length equal to 'degree'. If None, perturbed complex roots of unity are used. max_iter: Number of iterations to perform (default: 100). Returns: np.ndarray: Array of approximated complex roots. Raises: ValueError: If degree < 1, or if initial roots length doesn't match the degree. Note: - Root updates are clipped to prevent numerical overflow. Example: >>> import numpy as np >>> def check(poly, degree, expected): ... roots = weierstrass_method(poly, degree) ... return np.allclose(np.sort(roots), np.sort(expected)) >>> check( ... lambda x: x**2 - 1, ... 2, ... np.array([-1, 1])) True >>> check( ... lambda x: x**3 - 4.5*x**2 + 5.75*x - 1.875, ... 3, ... np.array([1.5, 0.5, 2.5]) ... ) True See Also: https://en.wikipedia.org/wiki/Durand%E2%80%93Kerner_method """ if degree < 1: raise ValueError("Degree of the polynomial must be at least 1.") if roots is None: # Use perturbed complex roots of unity as initial guesses rng = np.random.default_rng() roots = np.array( [ np.exp(2j * np.pi * i / degree) * (1 + 1e-3 * rng.random()) for i in range(degree) ], dtype=np.complex128, ) else: roots = np.asarray(roots, dtype=np.complex128) if roots.shape[0] != degree: raise ValueError( "Length of initial roots must match the degree of the polynomial." ) for _ in range(max_iter): # Construct the product denominator for each root denominator = np.array([root - roots for root in roots], dtype=np.complex128) np.fill_diagonal(denominator, 1.0) # Avoid zero in diagonal denominator = np.prod(denominator, axis=1) # Evaluate polynomial at each root numerator = polynomial(roots).astype(np.complex128) # Compute update and clip to prevent overflow delta = numerator / denominator delta = np.clip(delta, -1e10, 1e10) roots -= delta return roots if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/odd_sieve.py ================================================ from itertools import compress, repeat from math import ceil, sqrt def odd_sieve(num: int) -> list[int]: """ Returns the prime numbers < `num`. The prime numbers are calculated using an odd sieve implementation of the Sieve of Eratosthenes algorithm (see for reference https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes). >>> odd_sieve(2) [] >>> odd_sieve(3) [2] >>> odd_sieve(10) [2, 3, 5, 7] >>> odd_sieve(20) [2, 3, 5, 7, 11, 13, 17, 19] """ if num <= 2: return [] if num == 3: return [2] # Odd sieve for numbers in range [3, num - 1] sieve = bytearray(b"\x01") * ((num >> 1) - 1) for i in range(3, int(sqrt(num)) + 1, 2): if sieve[(i >> 1) - 1]: i_squared = i**2 sieve[(i_squared >> 1) - 1 :: i] = repeat( 0, ceil((num - i_squared) / (i << 1)) ) return [2, *list(compress(range(3, num, 2), sieve))] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/perfect_cube.py ================================================ def perfect_cube(n: int) -> bool: """ Check if a number is a perfect cube or not. >>> perfect_cube(27) True >>> perfect_cube(4) False """ val = n ** (1 / 3) return (val * val * val) == n def perfect_cube_binary_search(n: int) -> bool: """ Check if a number is a perfect cube or not using binary search. Time complexity : O(Log(n)) Space complexity: O(1) >>> perfect_cube_binary_search(27) True >>> perfect_cube_binary_search(64) True >>> perfect_cube_binary_search(4) False >>> perfect_cube_binary_search("a") Traceback (most recent call last): ... TypeError: perfect_cube_binary_search() only accepts integers >>> perfect_cube_binary_search(0.1) Traceback (most recent call last): ... TypeError: perfect_cube_binary_search() only accepts integers """ if not isinstance(n, int): raise TypeError("perfect_cube_binary_search() only accepts integers") if n < 0: n = -n left = 0 right = n while left <= right: mid = left + (right - left) // 2 if mid * mid * mid == n: return True elif mid * mid * mid < n: left = mid + 1 else: right = mid - 1 return False if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/perfect_number.py ================================================ """ == Perfect Number == In number theory, a perfect number is a positive integer that is equal to the sum of its positive divisors, excluding the number itself. For example: 6 ==> divisors[1, 2, 3, 6] Excluding 6, the sum(divisors) is 1 + 2 + 3 = 6 So, 6 is a Perfect Number Other examples of Perfect Numbers: 28, 486, ... https://en.wikipedia.org/wiki/Perfect_number """ def perfect(number: int) -> bool: """ Check if a number is a perfect number. A perfect number is a positive integer that is equal to the sum of its proper divisors (excluding itself). Args: number: The number to be checked. Returns: True if the number is a perfect number otherwise, False. Start from 1 because dividing by 0 will raise ZeroDivisionError. A number at most can be divisible by the half of the number except the number itself. For example, 6 is at most can be divisible by 3 except by 6 itself. Examples: >>> perfect(27) False >>> perfect(28) True >>> perfect(29) False >>> perfect(6) True >>> perfect(12) False >>> perfect(496) True >>> perfect(8128) True >>> perfect(0) False >>> perfect(-1) False >>> perfect(33550336) # Large perfect number True >>> perfect(33550337) # Just above a large perfect number False >>> perfect(1) # Edge case: 1 is not a perfect number False >>> perfect("123") # String representation of a number Traceback (most recent call last): ... ValueError: number must be an integer >>> perfect(12.34) Traceback (most recent call last): ... ValueError: number must be an integer >>> perfect("Hello") Traceback (most recent call last): ... ValueError: number must be an integer """ if not isinstance(number, int): raise ValueError("number must be an integer") if number <= 0: return False return sum(i for i in range(1, number // 2 + 1) if number % i == 0) == number if __name__ == "__main__": from doctest import testmod testmod() print("Program to check whether a number is a Perfect number or not...") try: number = int(input("Enter a positive integer: ").strip()) except ValueError: msg = "number must be an integer" raise ValueError(msg) print(f"{number} is {'' if perfect(number) else 'not '}a Perfect Number.") ================================================ FILE: maths/perfect_square.py ================================================ import math def perfect_square(num: int) -> bool: """ Check if a number is perfect square number or not :param num: the number to be checked :return: True if number is square number, otherwise False >>> perfect_square(9) True >>> perfect_square(16) True >>> perfect_square(1) True >>> perfect_square(0) True >>> perfect_square(10) False """ return math.sqrt(num) * math.sqrt(num) == num def perfect_square_binary_search(n: int) -> bool: """ Check if a number is perfect square using binary search. Time complexity : O(Log(n)) Space complexity: O(1) >>> perfect_square_binary_search(9) True >>> perfect_square_binary_search(16) True >>> perfect_square_binary_search(1) True >>> perfect_square_binary_search(0) True >>> perfect_square_binary_search(10) False >>> perfect_square_binary_search(-1) False >>> perfect_square_binary_search(1.1) False >>> perfect_square_binary_search("a") Traceback (most recent call last): ... TypeError: '<=' not supported between instances of 'int' and 'str' >>> perfect_square_binary_search(None) Traceback (most recent call last): ... TypeError: '<=' not supported between instances of 'int' and 'NoneType' >>> perfect_square_binary_search([]) Traceback (most recent call last): ... TypeError: '<=' not supported between instances of 'int' and 'list' """ left = 0 right = n while left <= right: mid = (left + right) // 2 if mid**2 == n: return True elif mid**2 > n: right = mid - 1 else: left = mid + 1 return False if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/persistence.py ================================================ def multiplicative_persistence(num: int) -> int: """ Return the persistence of a given number. https://en.wikipedia.org/wiki/Persistence_of_a_number >>> multiplicative_persistence(217) 2 >>> multiplicative_persistence(-1) Traceback (most recent call last): ... ValueError: multiplicative_persistence() does not accept negative values >>> multiplicative_persistence("long number") Traceback (most recent call last): ... ValueError: multiplicative_persistence() only accepts integral values """ if not isinstance(num, int): raise ValueError("multiplicative_persistence() only accepts integral values") if num < 0: raise ValueError("multiplicative_persistence() does not accept negative values") steps = 0 num_string = str(num) while len(num_string) != 1: numbers = [int(i) for i in num_string] total = 1 for i in range(len(numbers)): total *= numbers[i] num_string = str(total) steps += 1 return steps def additive_persistence(num: int) -> int: """ Return the persistence of a given number. https://en.wikipedia.org/wiki/Persistence_of_a_number >>> additive_persistence(199) 3 >>> additive_persistence(-1) Traceback (most recent call last): ... ValueError: additive_persistence() does not accept negative values >>> additive_persistence("long number") Traceback (most recent call last): ... ValueError: additive_persistence() only accepts integral values """ if not isinstance(num, int): raise ValueError("additive_persistence() only accepts integral values") if num < 0: raise ValueError("additive_persistence() does not accept negative values") steps = 0 num_string = str(num) while len(num_string) != 1: numbers = [int(i) for i in num_string] total = 0 for i in range(len(numbers)): total += numbers[i] num_string = str(total) steps += 1 return steps if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/pi_generator.py ================================================ def calculate_pi(limit: int) -> str: """ https://en.wikipedia.org/wiki/Leibniz_formula_for_%CF%80 Leibniz Formula for Pi The Leibniz formula is the special case arctan(1) = pi / 4. Leibniz's formula converges extremely slowly: it exhibits sublinear convergence. Convergence (https://en.wikipedia.org/wiki/Leibniz_formula_for_%CF%80#Convergence) We cannot try to prove against an interrupted, uncompleted generation. https://en.wikipedia.org/wiki/Leibniz_formula_for_%CF%80#Unusual_behaviour The errors can in fact be predicted, but those calculations also approach infinity for accuracy. Our output will be a string so that we can definitely store all digits. >>> import math >>> float(calculate_pi(15)) == math.pi True Since we cannot predict errors or interrupt any infinite alternating series generation since they approach infinity, or interrupt any alternating series, we'll need math.isclose() >>> math.isclose(float(calculate_pi(50)), math.pi) True >>> math.isclose(float(calculate_pi(100)), math.pi) True Since math.pi contains only 16 digits, here are some tests with known values: >>> calculate_pi(50) '3.14159265358979323846264338327950288419716939937510' >>> calculate_pi(80) '3.14159265358979323846264338327950288419716939937510582097494459230781640628620899' """ # Variables used for the iteration process q = 1 r = 0 t = 1 k = 1 n = 3 m = 3 decimal = limit counter = 0 result = "" # We can't compare against anything if we make a generator, # so we'll stick with plain return logic while counter != decimal + 1: if 4 * q + r - t < n * t: result += str(n) if counter == 0: result += "." if decimal == counter: break counter += 1 nr = 10 * (r - n * t) n = ((10 * (3 * q + r)) // t) - 10 * n q *= 10 r = nr else: nr = (2 * q + r) * m nn = (q * (7 * k) + 2 + (r * m)) // (t * m) q *= k t *= m m += 2 k += 1 n = nn r = nr return result def main() -> None: print(f"{calculate_pi(50) = }") import doctest doctest.testmod() if __name__ == "__main__": main() ================================================ FILE: maths/pi_monte_carlo_estimation.py ================================================ import random class Point: def __init__(self, x: float, y: float) -> None: self.x = x self.y = y def is_in_unit_circle(self) -> bool: """ True, if the point lies in the unit circle False, otherwise """ return (self.x**2 + self.y**2) <= 1 @classmethod def random_unit_square(cls): """ Generates a point randomly drawn from the unit square [0, 1) x [0, 1). """ return cls(x=random.random(), y=random.random()) def estimate_pi(number_of_simulations: int) -> float: """ Generates an estimate of the mathematical constant PI. See https://en.wikipedia.org/wiki/Monte_Carlo_method#Overview The estimate is generated by Monte Carlo simulations. Let U be uniformly drawn from the unit square [0, 1) x [0, 1). The probability that U lies in the unit circle is: P[U in unit circle] = 1/4 PI and therefore PI = 4 * P[U in unit circle] We can get an estimate of the probability P[U in unit circle]. See https://en.wikipedia.org/wiki/Empirical_probability by: 1. Draw a point uniformly from the unit square. 2. Repeat the first step n times and count the number of points in the unit circle, which is called m. 3. An estimate of P[U in unit circle] is m/n """ if number_of_simulations < 1: raise ValueError("At least one simulation is necessary to estimate PI.") number_in_unit_circle = 0 for _ in range(number_of_simulations): random_point = Point.random_unit_square() if random_point.is_in_unit_circle(): number_in_unit_circle += 1 return 4 * number_in_unit_circle / number_of_simulations if __name__ == "__main__": # import doctest # doctest.testmod() from math import pi prompt = "Please enter the desired number of Monte Carlo simulations: " my_pi = estimate_pi(int(input(prompt).strip())) print(f"An estimate of PI is {my_pi} with an error of {abs(my_pi - pi)}") ================================================ FILE: maths/points_are_collinear_3d.py ================================================ """ Check if three points are collinear in 3D. In short, the idea is that we are able to create a triangle using three points, and the area of that triangle can determine if the three points are collinear or not. First, we create two vectors with the same initial point from the three points, then we will calculate the cross-product of them. The length of the cross vector is numerically equal to the area of a parallelogram. Finally, the area of the triangle is equal to half of the area of the parallelogram. Since we are only differentiating between zero and anything else, we can get rid of the square root when calculating the length of the vector, and also the division by two at the end. From a second perspective, if the two vectors are parallel and overlapping, we can't get a nonzero perpendicular vector, since there will be an infinite number of orthogonal vectors. To simplify the solution we will not calculate the length, but we will decide directly from the vector whether it is equal to (0, 0, 0) or not. Read More: https://math.stackexchange.com/a/1951650 """ Vector3d = tuple[float, float, float] Point3d = tuple[float, float, float] def create_vector(end_point1: Point3d, end_point2: Point3d) -> Vector3d: """ Pass two points to get the vector from them in the form (x, y, z). >>> create_vector((0, 0, 0), (1, 1, 1)) (1, 1, 1) >>> create_vector((45, 70, 24), (47, 32, 1)) (2, -38, -23) >>> create_vector((-14, -1, -8), (-7, 6, 4)) (7, 7, 12) """ x = end_point2[0] - end_point1[0] y = end_point2[1] - end_point1[1] z = end_point2[2] - end_point1[2] return (x, y, z) def get_3d_vectors_cross(ab: Vector3d, ac: Vector3d) -> Vector3d: """ Get the cross of the two vectors AB and AC. I used determinant of 2x2 to get the determinant of the 3x3 matrix in the process. Read More: https://en.wikipedia.org/wiki/Cross_product https://en.wikipedia.org/wiki/Determinant >>> get_3d_vectors_cross((3, 4, 7), (4, 9, 2)) (-55, 22, 11) >>> get_3d_vectors_cross((1, 1, 1), (1, 1, 1)) (0, 0, 0) >>> get_3d_vectors_cross((-4, 3, 0), (3, -9, -12)) (-36, -48, 27) >>> get_3d_vectors_cross((17.67, 4.7, 6.78), (-9.5, 4.78, -19.33)) (-123.2594, 277.15110000000004, 129.11260000000001) """ x = ab[1] * ac[2] - ab[2] * ac[1] # *i y = (ab[0] * ac[2] - ab[2] * ac[0]) * -1 # *j z = ab[0] * ac[1] - ab[1] * ac[0] # *k return (x, y, z) def is_zero_vector(vector: Vector3d, accuracy: int) -> bool: """ Check if vector is equal to (0, 0, 0) or not. Since the algorithm is very accurate, we will never get a zero vector, so we need to round the vector axis, because we want a result that is either True or False. In other applications, we can return a float that represents the collinearity ratio. >>> is_zero_vector((0, 0, 0), accuracy=10) True >>> is_zero_vector((15, 74, 32), accuracy=10) False >>> is_zero_vector((-15, -74, -32), accuracy=10) False """ return tuple(round(x, accuracy) for x in vector) == (0, 0, 0) def are_collinear(a: Point3d, b: Point3d, c: Point3d, accuracy: int = 10) -> bool: """ Check if three points are collinear or not. 1- Create two vectors AB and AC. 2- Get the cross vector of the two vectors. 3- Calculate the length of the cross vector. 4- If the length is zero then the points are collinear, else they are not. The use of the accuracy parameter is explained in is_zero_vector docstring. >>> are_collinear((4.802293498137402, 3.536233125455244, 0), ... (-2.186788107953106, -9.24561398001649, 7.141509524846482), ... (1.530169574640268, -2.447927606600034, 3.343487096469054)) True >>> are_collinear((-6, -2, 6), ... (6.200213806439997, -4.930157614926678, -4.482371908289856), ... (-4.085171149525941, -2.459889509029438, 4.354787180795383)) True >>> are_collinear((2.399001826862445, -2.452009976680793, 4.464656666157666), ... (-3.682816335934376, 5.753788986533145, 9.490993909044244), ... (1.962903518985307, 3.741415730125627, 7)) False >>> are_collinear((1.875375340689544, -7.268426006071538, 7.358196269835993), ... (-3.546599383667157, -4.630005261513976, 3.208784032924246), ... (-2.564606140206386, 3.937845170672183, 7)) False """ ab = create_vector(a, b) ac = create_vector(a, c) return is_zero_vector(get_3d_vectors_cross(ab, ac), accuracy) ================================================ FILE: maths/pollard_rho.py ================================================ from __future__ import annotations from math import gcd def pollard_rho( num: int, seed: int = 2, step: int = 1, attempts: int = 3, ) -> int | None: """ Use Pollard's Rho algorithm to return a nontrivial factor of ``num``. The returned factor may be composite and require further factorization. If the algorithm will return None if it fails to find a factor within the specified number of attempts or within the specified number of steps. If ``num`` is prime, this algorithm is guaranteed to return None. https://en.wikipedia.org/wiki/Pollard%27s_rho_algorithm >>> pollard_rho(18446744073709551617) 274177 >>> pollard_rho(97546105601219326301) 9876543191 >>> pollard_rho(100) 2 >>> pollard_rho(17) >>> pollard_rho(17**3) 17 >>> pollard_rho(17**3, attempts=1) >>> pollard_rho(3*5*7) 21 >>> pollard_rho(1) Traceback (most recent call last): ... ValueError: The input value cannot be less than 2 """ # A value less than 2 can cause an infinite loop in the algorithm. if num < 2: raise ValueError("The input value cannot be less than 2") # Because of the relationship between ``f(f(x))`` and ``f(x)``, this # algorithm struggles to find factors that are divisible by two. # As a workaround, we specifically check for two and even inputs. # See: https://math.stackexchange.com/a/2856214/165820 if num > 2 and num % 2 == 0: return 2 # Pollard's Rho algorithm requires a function that returns pseudorandom # values between 0 <= X < ``num``. It doesn't need to be random in the # sense that the output value is cryptographically secure or difficult # to calculate, it only needs to be random in the sense that all output # values should be equally likely to appear. # For this reason, Pollard suggested using ``f(x) = (x**2 - 1) % num`` # However, the success of Pollard's algorithm isn't guaranteed and is # determined in part by the initial seed and the chosen random function. # To make retries easier, we will instead use ``f(x) = (x**2 + C) % num`` # where ``C`` is a value that we can modify between each attempt. def rand_fn(value: int, step: int, modulus: int) -> int: """ Returns a pseudorandom value modulo ``modulus`` based on the input ``value`` and attempt-specific ``step`` size. >>> rand_fn(0, 0, 0) Traceback (most recent call last): ... ZeroDivisionError: integer division or modulo by zero >>> rand_fn(1, 2, 3) 0 >>> rand_fn(0, 10, 7) 3 >>> rand_fn(1234, 1, 17) 16 """ return (pow(value, 2) + step) % modulus for _ in range(attempts): # These track the position within the cycle detection logic. tortoise = seed hare = seed while True: # At each iteration, the tortoise moves one step and the hare moves two. tortoise = rand_fn(tortoise, step, num) hare = rand_fn(hare, step, num) hare = rand_fn(hare, step, num) # At some point both the tortoise and the hare will enter a cycle whose # length ``p`` is a divisor of ``num``. Once in that cycle, at some point # the tortoise and hare will end up on the same value modulo ``p``. # We can detect when this happens because the position difference between # the tortoise and the hare will share a common divisor with ``num``. divisor = gcd(hare - tortoise, num) if divisor == 1: # No common divisor yet, just keep searching. continue # We found a common divisor! elif divisor == num: # Unfortunately, the divisor is ``num`` itself and is useless. break else: # The divisor is a nontrivial factor of ``num``! return divisor # If we made it here, then this attempt failed. # We need to pick a new starting seed for the tortoise and hare # in addition to a new step value for the random function. # To keep this example implementation deterministic, the # new values will be generated based on currently available # values instead of using something like ``random.randint``. # We can use the hare's position as the new seed. # This is actually what Richard Brent's the "optimized" variant does. seed = hare # The new step value for the random function can just be incremented. # At first the results will be similar to what the old function would # have produced, but the value will quickly diverge after a bit. step += 1 # We haven't found a divisor within the requested number of attempts. # We were unlucky or ``num`` itself is actually prime. return None if __name__ == "__main__": import argparse parser = argparse.ArgumentParser() parser.add_argument( "num", type=int, help="The value to find a divisor of", ) parser.add_argument( "--attempts", type=int, default=3, help="The number of attempts before giving up", ) args = parser.parse_args() divisor = pollard_rho(args.num, attempts=args.attempts) if divisor is None: print(f"{args.num} is probably prime") else: quotient = args.num // divisor print(f"{args.num} = {divisor} * {quotient}") ================================================ FILE: maths/polynomial_evaluation.py ================================================ from collections.abc import Sequence def evaluate_poly(poly: Sequence[float], x: float) -> float: """Evaluate a polynomial f(x) at specified point x and return the value. Arguments: poly -- the coefficients of a polynomial as an iterable in order of ascending degree x -- the point at which to evaluate the polynomial >>> evaluate_poly((0.0, 0.0, 5.0, 9.3, 7.0), 10.0) 79800.0 """ return sum(c * (x**i) for i, c in enumerate(poly)) def horner(poly: Sequence[float], x: float) -> float: """Evaluate a polynomial at specified point using Horner's method. In terms of computational complexity, Horner's method is an efficient method of evaluating a polynomial. It avoids the use of expensive exponentiation, and instead uses only multiplication and addition to evaluate the polynomial in O(n), where n is the degree of the polynomial. https://en.wikipedia.org/wiki/Horner's_method Arguments: poly -- the coefficients of a polynomial as an iterable in order of ascending degree x -- the point at which to evaluate the polynomial >>> horner((0.0, 0.0, 5.0, 9.3, 7.0), 10.0) 79800.0 """ result = 0.0 for coeff in reversed(poly): result = result * x + coeff return result if __name__ == "__main__": """ Example: >>> poly = (0.0, 0.0, 5.0, 9.3, 7.0) # f(x) = 7.0x^4 + 9.3x^3 + 5.0x^2 >>> x = -13.0 >>> # f(-13) = 7.0(-13)^4 + 9.3(-13)^3 + 5.0(-13)^2 = 180339.9 >>> evaluate_poly(poly, x) 180339.9 """ poly = (0.0, 0.0, 5.0, 9.3, 7.0) x = 10.0 print(evaluate_poly(poly, x)) print(horner(poly, x)) ================================================ FILE: maths/polynomials/__init__.py ================================================ ================================================ FILE: maths/polynomials/single_indeterminate_operations.py ================================================ """ This module implements a single indeterminate polynomials class with some basic operations Reference: https://en.wikipedia.org/wiki/Polynomial """ from __future__ import annotations from collections.abc import MutableSequence class Polynomial: def __init__(self, degree: int, coefficients: MutableSequence[float]) -> None: """ The coefficients should be in order of degree, from smallest to largest. >>> p = Polynomial(2, [1, 2, 3]) >>> p = Polynomial(2, [1, 2, 3, 4]) Traceback (most recent call last): ... ValueError: The number of coefficients should be equal to the degree + 1. """ if len(coefficients) != degree + 1: raise ValueError( "The number of coefficients should be equal to the degree + 1." ) self.coefficients: list[float] = list(coefficients) self.degree = degree def __add__(self, polynomial_2: Polynomial) -> Polynomial: """ Polynomial addition >>> p = Polynomial(2, [1, 2, 3]) >>> q = Polynomial(2, [1, 2, 3]) >>> p + q 6x^2 + 4x + 2 """ if self.degree > polynomial_2.degree: coefficients = self.coefficients[:] for i in range(polynomial_2.degree + 1): coefficients[i] += polynomial_2.coefficients[i] return Polynomial(self.degree, coefficients) else: coefficients = polynomial_2.coefficients[:] for i in range(self.degree + 1): coefficients[i] += self.coefficients[i] return Polynomial(polynomial_2.degree, coefficients) def __sub__(self, polynomial_2: Polynomial) -> Polynomial: """ Polynomial subtraction >>> p = Polynomial(2, [1, 2, 4]) >>> q = Polynomial(2, [1, 2, 3]) >>> p - q 1x^2 """ return self + polynomial_2 * Polynomial(0, [-1]) def __neg__(self) -> Polynomial: """ Polynomial negation >>> p = Polynomial(2, [1, 2, 3]) >>> -p - 3x^2 - 2x - 1 """ return Polynomial(self.degree, [-c for c in self.coefficients]) def __mul__(self, polynomial_2: Polynomial) -> Polynomial: """ Polynomial multiplication >>> p = Polynomial(2, [1, 2, 3]) >>> q = Polynomial(2, [1, 2, 3]) >>> p * q 9x^4 + 12x^3 + 10x^2 + 4x + 1 """ coefficients: list[float] = [0] * (self.degree + polynomial_2.degree + 1) for i in range(self.degree + 1): for j in range(polynomial_2.degree + 1): coefficients[i + j] += ( self.coefficients[i] * polynomial_2.coefficients[j] ) return Polynomial(self.degree + polynomial_2.degree, coefficients) def evaluate(self, substitution: float) -> float: """ Evaluates the polynomial at x. >>> p = Polynomial(2, [1, 2, 3]) >>> p.evaluate(2) 17 """ result: int | float = 0 for i in range(self.degree + 1): result += self.coefficients[i] * (substitution**i) return result def __str__(self) -> str: """ >>> p = Polynomial(2, [1, 2, 3]) >>> print(p) 3x^2 + 2x + 1 """ polynomial = "" for i in range(self.degree, -1, -1): if self.coefficients[i] == 0: continue elif self.coefficients[i] > 0: if polynomial: polynomial += " + " else: polynomial += " - " if i == 0: polynomial += str(abs(self.coefficients[i])) elif i == 1: polynomial += str(abs(self.coefficients[i])) + "x" else: polynomial += str(abs(self.coefficients[i])) + "x^" + str(i) return polynomial def __repr__(self) -> str: """ >>> p = Polynomial(2, [1, 2, 3]) >>> p 3x^2 + 2x + 1 """ return self.__str__() def derivative(self) -> Polynomial: """ Returns the derivative of the polynomial. >>> p = Polynomial(2, [1, 2, 3]) >>> p.derivative() 6x + 2 """ coefficients: list[float] = [0] * self.degree for i in range(self.degree): coefficients[i] = self.coefficients[i + 1] * (i + 1) return Polynomial(self.degree - 1, coefficients) def integral(self, constant: float = 0) -> Polynomial: """ Returns the integral of the polynomial. >>> p = Polynomial(2, [1, 2, 3]) >>> p.integral() 1.0x^3 + 1.0x^2 + 1.0x """ coefficients: list[float] = [0] * (self.degree + 2) coefficients[0] = constant for i in range(self.degree + 1): coefficients[i + 1] = self.coefficients[i] / (i + 1) return Polynomial(self.degree + 1, coefficients) def __eq__(self, polynomial_2: object) -> bool: """ Checks if two polynomials are equal. >>> p = Polynomial(2, [1, 2, 3]) >>> q = Polynomial(2, [1, 2, 3]) >>> p == q True """ if not isinstance(polynomial_2, Polynomial): return False if self.degree != polynomial_2.degree: return False for i in range(self.degree + 1): if self.coefficients[i] != polynomial_2.coefficients[i]: return False return True def __ne__(self, polynomial_2: object) -> bool: """ Checks if two polynomials are not equal. >>> p = Polynomial(2, [1, 2, 3]) >>> q = Polynomial(2, [1, 2, 3]) >>> p != q False """ return not self.__eq__(polynomial_2) ================================================ FILE: maths/power_using_recursion.py ================================================ """ == Raise base to the power of exponent using recursion == Input --> Enter the base: 3 Enter the exponent: 4 Output --> 3 to the power of 4 is 81 Input --> Enter the base: 2 Enter the exponent: 0 Output --> 2 to the power of 0 is 1 """ def power(base: int, exponent: int) -> float: """ Calculate the power of a base raised to an exponent. >>> power(3, 4) 81 >>> power(2, 0) 1 >>> all(power(base, exponent) == pow(base, exponent) ... for base in range(-10, 10) for exponent in range(10)) True >>> power('a', 1) 'a' >>> power('a', 2) Traceback (most recent call last): ... TypeError: can't multiply sequence by non-int of type 'str' >>> power('a', 'b') Traceback (most recent call last): ... TypeError: unsupported operand type(s) for -: 'str' and 'int' >>> power(2, -1) Traceback (most recent call last): ... RecursionError: maximum recursion depth exceeded >>> power(0, 0) 1 >>> power(0, 1) 0 >>> power(5,6) 15625 >>> power(23, 12) 21914624432020321 """ return base * power(base, (exponent - 1)) if exponent else 1 if __name__ == "__main__": from doctest import testmod testmod() print("Raise base to the power of exponent using recursion...") base = int(input("Enter the base: ").strip()) exponent = int(input("Enter the exponent: ").strip()) result = power(base, abs(exponent)) if exponent < 0: # power() does not properly deal w/ negative exponents result = 1 / result print(f"{base} to the power of {exponent} is {result}") ================================================ FILE: maths/prime_check.py ================================================ """Prime Check.""" import math import unittest import pytest def is_prime(number: int) -> bool: """Checks to see if a number is a prime in O(sqrt(n)). A number is prime if it has exactly two factors: 1 and itself. >>> is_prime(0) False >>> is_prime(1) False >>> is_prime(2) True >>> is_prime(3) True >>> is_prime(27) False >>> is_prime(87) False >>> is_prime(563) True >>> is_prime(2999) True >>> is_prime(67483) False >>> is_prime(16.1) Traceback (most recent call last): ... ValueError: is_prime() only accepts positive integers >>> is_prime(-4) Traceback (most recent call last): ... ValueError: is_prime() only accepts positive integers """ # precondition if not isinstance(number, int) or not number >= 0: raise ValueError("is_prime() only accepts positive integers") if 1 < number < 4: # 2 and 3 are primes return True elif number < 2 or number % 2 == 0 or number % 3 == 0: # Negatives, 0, 1, all even numbers, all multiples of 3 are not primes return False # All primes number are in format of 6k +/- 1 for i in range(5, int(math.sqrt(number) + 1), 6): if number % i == 0 or number % (i + 2) == 0: return False return True class Test(unittest.TestCase): def test_primes(self): assert is_prime(2) assert is_prime(3) assert is_prime(5) assert is_prime(7) assert is_prime(11) assert is_prime(13) assert is_prime(17) assert is_prime(19) assert is_prime(23) assert is_prime(29) def test_not_primes(self): with pytest.raises(ValueError): is_prime(-19) assert not is_prime(0), ( "Zero doesn't have any positive factors, primes must have exactly two." ) assert not is_prime(1), ( "One only has 1 positive factor, primes must have exactly two." ) assert not is_prime(2 * 2) assert not is_prime(2 * 3) assert not is_prime(3 * 3) assert not is_prime(3 * 5) assert not is_prime(3 * 5 * 7) if __name__ == "__main__": unittest.main() ================================================ FILE: maths/prime_factors.py ================================================ """ python/black : True """ from __future__ import annotations def prime_factors(n: int) -> list[int]: """ Returns prime factors of n as a list. >>> prime_factors(0) [] >>> prime_factors(100) [2, 2, 5, 5] >>> prime_factors(2560) [2, 2, 2, 2, 2, 2, 2, 2, 2, 5] >>> prime_factors(10**-2) [] >>> prime_factors(0.02) [] >>> x = prime_factors(10**241) # doctest: +NORMALIZE_WHITESPACE >>> x == [2]*241 + [5]*241 True >>> prime_factors(10**-354) [] >>> prime_factors('hello') Traceback (most recent call last): ... TypeError: '<=' not supported between instances of 'int' and 'str' >>> prime_factors([1,2,'hello']) Traceback (most recent call last): ... TypeError: '<=' not supported between instances of 'int' and 'list' """ i = 2 factors = [] while i * i <= n: if n % i: i += 1 else: n //= i factors.append(i) if n > 1: factors.append(n) return factors def unique_prime_factors(n: int) -> list[int]: """ Returns unique prime factors of n as a list. >>> unique_prime_factors(0) [] >>> unique_prime_factors(100) [2, 5] >>> unique_prime_factors(2560) [2, 5] >>> unique_prime_factors(10**-2) [] >>> unique_prime_factors(0.02) [] >>> unique_prime_factors(10**241) [2, 5] >>> unique_prime_factors(10**-354) [] >>> unique_prime_factors('hello') Traceback (most recent call last): ... TypeError: '<=' not supported between instances of 'int' and 'str' >>> unique_prime_factors([1,2,'hello']) Traceback (most recent call last): ... TypeError: '<=' not supported between instances of 'int' and 'list' """ i = 2 factors = [] while i * i <= n: if not n % i: while not n % i: n //= i factors.append(i) i += 1 if n > 1: factors.append(n) return factors if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/prime_numbers.py ================================================ import math from collections.abc import Generator def slow_primes(max_n: int) -> Generator[int]: """ Return a list of all primes numbers up to max. >>> list(slow_primes(0)) [] >>> list(slow_primes(-1)) [] >>> list(slow_primes(-10)) [] >>> list(slow_primes(25)) [2, 3, 5, 7, 11, 13, 17, 19, 23] >>> list(slow_primes(11)) [2, 3, 5, 7, 11] >>> list(slow_primes(33)) [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31] >>> list(slow_primes(1000))[-1] 997 """ numbers: Generator = (i for i in range(1, (max_n + 1))) for i in (n for n in numbers if n > 1): for j in range(2, i): if (i % j) == 0: break else: yield i def primes(max_n: int) -> Generator[int]: """ Return a list of all primes numbers up to max. >>> list(primes(0)) [] >>> list(primes(-1)) [] >>> list(primes(-10)) [] >>> list(primes(25)) [2, 3, 5, 7, 11, 13, 17, 19, 23] >>> list(primes(11)) [2, 3, 5, 7, 11] >>> list(primes(33)) [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31] >>> list(primes(1000))[-1] 997 """ numbers: Generator = (i for i in range(1, (max_n + 1))) for i in (n for n in numbers if n > 1): # only need to check for factors up to sqrt(i) bound = int(math.sqrt(i)) + 1 for j in range(2, bound): if (i % j) == 0: break else: yield i def fast_primes(max_n: int) -> Generator[int]: """ Return a list of all primes numbers up to max. >>> list(fast_primes(0)) [] >>> list(fast_primes(-1)) [] >>> list(fast_primes(-10)) [] >>> list(fast_primes(25)) [2, 3, 5, 7, 11, 13, 17, 19, 23] >>> list(fast_primes(11)) [2, 3, 5, 7, 11] >>> list(fast_primes(33)) [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31] >>> list(fast_primes(1000))[-1] 997 """ numbers: Generator = (i for i in range(1, (max_n + 1), 2)) # It's useless to test even numbers as they will not be prime if max_n > 2: yield 2 # Because 2 will not be tested, it's necessary to yield it now for i in (n for n in numbers if n > 1): bound = int(math.sqrt(i)) + 1 for j in range(3, bound, 2): # As we removed the even numbers, we don't need them now if (i % j) == 0: break else: yield i def benchmark(): """ Let's benchmark our functions side-by-side... """ from timeit import timeit setup = "from __main__ import slow_primes, primes, fast_primes" print(timeit("slow_primes(1_000_000_000_000)", setup=setup, number=1_000_000)) print(timeit("primes(1_000_000_000_000)", setup=setup, number=1_000_000)) print(timeit("fast_primes(1_000_000_000_000)", setup=setup, number=1_000_000)) if __name__ == "__main__": number = int(input("Calculate primes up to:\n>> ").strip()) for ret in primes(number): print(ret) benchmark() ================================================ FILE: maths/prime_sieve_eratosthenes.py ================================================ """ Sieve of Eratosthenes Input: n = 10 Output: 2 3 5 7 Input: n = 20 Output: 2 3 5 7 11 13 17 19 you can read in detail about this at https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes """ def prime_sieve_eratosthenes(num: int) -> list[int]: """ Print the prime numbers up to n >>> prime_sieve_eratosthenes(10) [2, 3, 5, 7] >>> prime_sieve_eratosthenes(20) [2, 3, 5, 7, 11, 13, 17, 19] >>> prime_sieve_eratosthenes(2) [2] >>> prime_sieve_eratosthenes(1) [] >>> prime_sieve_eratosthenes(-1) Traceback (most recent call last): ... ValueError: Input must be a positive integer """ if num <= 0: raise ValueError("Input must be a positive integer") primes = [True] * (num + 1) p = 2 while p * p <= num: if primes[p]: for i in range(p * p, num + 1, p): primes[i] = False p += 1 return [prime for prime in range(2, num + 1) if primes[prime]] if __name__ == "__main__": import doctest doctest.testmod() user_num = int(input("Enter a positive integer: ").strip()) print(prime_sieve_eratosthenes(user_num)) ================================================ FILE: maths/primelib.py ================================================ """ Created on Thu Oct 5 16:44:23 2017 @author: Christian Bender This Python library contains some useful functions to deal with prime numbers and whole numbers. Overview: is_prime(number) sieve_er(N) get_prime_numbers(N) prime_factorization(number) greatest_prime_factor(number) smallest_prime_factor(number) get_prime(n) get_primes_between(pNumber1, pNumber2) ---- is_even(number) is_odd(number) kg_v(number1, number2) // least common multiple get_divisors(number) // all divisors of 'number' inclusive 1, number is_perfect_number(number) NEW-FUNCTIONS simplify_fraction(numerator, denominator) factorial (n) // n! fib (n) // calculate the n-th fibonacci term. ----- goldbach(number) // Goldbach's assumption """ from math import sqrt from maths.greatest_common_divisor import gcd_by_iterative def is_prime(number: int) -> bool: """ input: positive integer 'number' returns true if 'number' is prime otherwise false. >>> is_prime(3) True >>> is_prime(10) False >>> is_prime(97) True >>> is_prime(9991) False >>> is_prime(-1) Traceback (most recent call last): ... AssertionError: 'number' must been an int and positive >>> is_prime("test") Traceback (most recent call last): ... AssertionError: 'number' must been an int and positive """ # precondition assert isinstance(number, int) and (number >= 0), ( "'number' must been an int and positive" ) status = True # 0 and 1 are none primes. if number <= 1: status = False for divisor in range(2, round(sqrt(number)) + 1): # if 'number' divisible by 'divisor' then sets 'status' # of false and break up the loop. if number % divisor == 0: status = False break # precondition assert isinstance(status, bool), "'status' must been from type bool" return status # ------------------------------------------ def sieve_er(n): """ input: positive integer 'N' > 2 returns a list of prime numbers from 2 up to N. This function implements the algorithm called sieve of erathostenes. >>> sieve_er(8) [2, 3, 5, 7] >>> sieve_er(-1) Traceback (most recent call last): ... AssertionError: 'N' must been an int and > 2 >>> sieve_er("test") Traceback (most recent call last): ... AssertionError: 'N' must been an int and > 2 """ # precondition assert isinstance(n, int) and (n > 2), "'N' must been an int and > 2" # beginList: contains all natural numbers from 2 up to N begin_list = list(range(2, n + 1)) ans = [] # this list will be returns. # actual sieve of erathostenes for i in range(len(begin_list)): for j in range(i + 1, len(begin_list)): if (begin_list[i] != 0) and (begin_list[j] % begin_list[i] == 0): begin_list[j] = 0 # filters actual prime numbers. ans = [x for x in begin_list if x != 0] # precondition assert isinstance(ans, list), "'ans' must been from type list" return ans # -------------------------------- def get_prime_numbers(n): """ input: positive integer 'N' > 2 returns a list of prime numbers from 2 up to N (inclusive) This function is more efficient as function 'sieveEr(...)' >>> get_prime_numbers(8) [2, 3, 5, 7] >>> get_prime_numbers(-1) Traceback (most recent call last): ... AssertionError: 'N' must been an int and > 2 >>> get_prime_numbers("test") Traceback (most recent call last): ... AssertionError: 'N' must been an int and > 2 """ # precondition assert isinstance(n, int) and (n > 2), "'N' must been an int and > 2" ans = [] # iterates over all numbers between 2 up to N+1 # if a number is prime then appends to list 'ans' for number in range(2, n + 1): if is_prime(number): ans.append(number) # precondition assert isinstance(ans, list), "'ans' must been from type list" return ans # ----------------------------------------- def prime_factorization(number): """ input: positive integer 'number' returns a list of the prime number factors of 'number' >>> prime_factorization(0) [0] >>> prime_factorization(8) [2, 2, 2] >>> prime_factorization(287) [7, 41] >>> prime_factorization(-1) Traceback (most recent call last): ... AssertionError: 'number' must been an int and >= 0 >>> prime_factorization("test") Traceback (most recent call last): ... AssertionError: 'number' must been an int and >= 0 """ # precondition assert isinstance(number, int) and number >= 0, "'number' must been an int and >= 0" ans = [] # this list will be returns of the function. # potential prime number factors. factor = 2 quotient = number if number in {0, 1}: ans.append(number) # if 'number' not prime then builds the prime factorization of 'number' elif not is_prime(number): while quotient != 1: if is_prime(factor) and (quotient % factor == 0): ans.append(factor) quotient /= factor else: factor += 1 else: ans.append(number) # precondition assert isinstance(ans, list), "'ans' must been from type list" return ans # ----------------------------------------- def greatest_prime_factor(number): """ input: positive integer 'number' >= 0 returns the greatest prime number factor of 'number' >>> greatest_prime_factor(0) 0 >>> greatest_prime_factor(8) 2 >>> greatest_prime_factor(287) 41 >>> greatest_prime_factor(-1) Traceback (most recent call last): ... AssertionError: 'number' must been an int and >= 0 >>> greatest_prime_factor("test") Traceback (most recent call last): ... AssertionError: 'number' must been an int and >= 0 """ # precondition assert isinstance(number, int) and (number >= 0), ( "'number' must been an int and >= 0" ) ans = 0 # prime factorization of 'number' prime_factors = prime_factorization(number) ans = max(prime_factors) # precondition assert isinstance(ans, int), "'ans' must been from type int" return ans # ---------------------------------------------- def smallest_prime_factor(number): """ input: integer 'number' >= 0 returns the smallest prime number factor of 'number' >>> smallest_prime_factor(0) 0 >>> smallest_prime_factor(8) 2 >>> smallest_prime_factor(287) 7 >>> smallest_prime_factor(-1) Traceback (most recent call last): ... AssertionError: 'number' must been an int and >= 0 >>> smallest_prime_factor("test") Traceback (most recent call last): ... AssertionError: 'number' must been an int and >= 0 """ # precondition assert isinstance(number, int) and (number >= 0), ( "'number' must been an int and >= 0" ) ans = 0 # prime factorization of 'number' prime_factors = prime_factorization(number) ans = min(prime_factors) # precondition assert isinstance(ans, int), "'ans' must been from type int" return ans # ---------------------- def is_even(number): """ input: integer 'number' returns true if 'number' is even, otherwise false. >>> is_even(0) True >>> is_even(8) True >>> is_even(287) False >>> is_even(-1) False >>> is_even("test") Traceback (most recent call last): ... AssertionError: 'number' must been an int """ # precondition assert isinstance(number, int), "'number' must been an int" assert isinstance(number % 2 == 0, bool), "compare must been from type bool" return number % 2 == 0 # ------------------------ def is_odd(number): """ input: integer 'number' returns true if 'number' is odd, otherwise false. >>> is_odd(0) False >>> is_odd(8) False >>> is_odd(287) True >>> is_odd(-1) True >>> is_odd("test") Traceback (most recent call last): ... AssertionError: 'number' must been an int """ # precondition assert isinstance(number, int), "'number' must been an int" assert isinstance(number % 2 != 0, bool), "compare must been from type bool" return number % 2 != 0 # ------------------------ def goldbach(number): """ Goldbach's assumption input: a even positive integer 'number' > 2 returns a list of two prime numbers whose sum is equal to 'number' >>> goldbach(8) [3, 5] >>> goldbach(824) [3, 821] >>> goldbach(0) Traceback (most recent call last): ... AssertionError: 'number' must been an int, even and > 2 >>> goldbach(-1) Traceback (most recent call last): ... AssertionError: 'number' must been an int, even and > 2 >>> goldbach("test") Traceback (most recent call last): ... AssertionError: 'number' must been an int, even and > 2 """ # precondition assert isinstance(number, int) and (number > 2) and is_even(number), ( "'number' must been an int, even and > 2" ) ans = [] # this list will returned # creates a list of prime numbers between 2 up to 'number' prime_numbers = get_prime_numbers(number) len_pn = len(prime_numbers) # run variable for while-loops. i = 0 j = None # exit variable. for break up the loops loop = True while i < len_pn and loop: j = i + 1 while j < len_pn and loop: if prime_numbers[i] + prime_numbers[j] == number: loop = False ans.append(prime_numbers[i]) ans.append(prime_numbers[j]) j += 1 i += 1 # precondition assert ( isinstance(ans, list) and (len(ans) == 2) and (ans[0] + ans[1] == number) and is_prime(ans[0]) and is_prime(ans[1]) ), "'ans' must contains two primes. And sum of elements must been eq 'number'" return ans # ---------------------------------------------- def kg_v(number1, number2): """ Least common multiple input: two positive integer 'number1' and 'number2' returns the least common multiple of 'number1' and 'number2' >>> kg_v(8,10) 40 >>> kg_v(824,67) 55208 >>> kg_v(1, 10) 10 >>> kg_v(0) Traceback (most recent call last): ... TypeError: kg_v() missing 1 required positional argument: 'number2' >>> kg_v(10,-1) Traceback (most recent call last): ... AssertionError: 'number1' and 'number2' must been positive integer. >>> kg_v("test","test2") Traceback (most recent call last): ... AssertionError: 'number1' and 'number2' must been positive integer. """ # precondition assert ( isinstance(number1, int) and isinstance(number2, int) and (number1 >= 1) and (number2 >= 1) ), "'number1' and 'number2' must been positive integer." ans = 1 # actual answer that will be return. # for kgV (x,1) if number1 > 1 and number2 > 1: # builds the prime factorization of 'number1' and 'number2' prime_fac_1 = prime_factorization(number1) prime_fac_2 = prime_factorization(number2) elif number1 == 1 or number2 == 1: prime_fac_1 = [] prime_fac_2 = [] ans = max(number1, number2) count1 = 0 count2 = 0 done = [] # captured numbers int both 'primeFac1' and 'primeFac2' # iterates through primeFac1 for n in prime_fac_1: if n not in done: if n in prime_fac_2: count1 = prime_fac_1.count(n) count2 = prime_fac_2.count(n) for _ in range(max(count1, count2)): ans *= n else: count1 = prime_fac_1.count(n) for _ in range(count1): ans *= n done.append(n) # iterates through primeFac2 for n in prime_fac_2: if n not in done: count2 = prime_fac_2.count(n) for _ in range(count2): ans *= n done.append(n) # precondition assert isinstance(ans, int) and (ans >= 0), ( "'ans' must been from type int and positive" ) return ans # ---------------------------------- def get_prime(n): """ Gets the n-th prime number. input: positive integer 'n' >= 0 returns the n-th prime number, beginning at index 0 >>> get_prime(0) 2 >>> get_prime(8) 23 >>> get_prime(824) 6337 >>> get_prime(-1) Traceback (most recent call last): ... AssertionError: 'number' must been a positive int >>> get_prime("test") Traceback (most recent call last): ... AssertionError: 'number' must been a positive int """ # precondition assert isinstance(n, int) and (n >= 0), "'number' must been a positive int" index = 0 ans = 2 # this variable holds the answer while index < n: index += 1 ans += 1 # counts to the next number # if ans not prime then # runs to the next prime number. while not is_prime(ans): ans += 1 # precondition assert isinstance(ans, int) and is_prime(ans), ( "'ans' must been a prime number and from type int" ) return ans # --------------------------------------------------- def get_primes_between(p_number_1, p_number_2): """ input: prime numbers 'pNumber1' and 'pNumber2' pNumber1 < pNumber2 returns a list of all prime numbers between 'pNumber1' (exclusive) and 'pNumber2' (exclusive) >>> get_primes_between(3, 67) [5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61] >>> get_primes_between(0) Traceback (most recent call last): ... TypeError: get_primes_between() missing 1 required positional argument: 'p_number_2' >>> get_primes_between(0, 1) Traceback (most recent call last): ... AssertionError: The arguments must been prime numbers and 'pNumber1' < 'pNumber2' >>> get_primes_between(-1, 3) Traceback (most recent call last): ... AssertionError: 'number' must been an int and positive >>> get_primes_between("test","test") Traceback (most recent call last): ... AssertionError: 'number' must been an int and positive """ # precondition assert ( is_prime(p_number_1) and is_prime(p_number_2) and (p_number_1 < p_number_2) ), "The arguments must been prime numbers and 'pNumber1' < 'pNumber2'" number = p_number_1 + 1 # jump to the next number ans = [] # this list will be returns. # if number is not prime then # fetch the next prime number. while not is_prime(number): number += 1 while number < p_number_2: ans.append(number) number += 1 # fetch the next prime number. while not is_prime(number): number += 1 # precondition assert ( isinstance(ans, list) and ans[0] != p_number_1 and ans[len(ans) - 1] != p_number_2 ), "'ans' must been a list without the arguments" # 'ans' contains not 'pNumber1' and 'pNumber2' ! return ans # ---------------------------------------------------- def get_divisors(n): """ input: positive integer 'n' >= 1 returns all divisors of n (inclusive 1 and 'n') >>> get_divisors(8) [1, 2, 4, 8] >>> get_divisors(824) [1, 2, 4, 8, 103, 206, 412, 824] >>> get_divisors(-1) Traceback (most recent call last): ... AssertionError: 'n' must been int and >= 1 >>> get_divisors("test") Traceback (most recent call last): ... AssertionError: 'n' must been int and >= 1 """ # precondition assert isinstance(n, int) and (n >= 1), "'n' must been int and >= 1" ans = [] # will be returned. for divisor in range(1, n + 1): if n % divisor == 0: ans.append(divisor) # precondition assert ans[0] == 1 and ans[len(ans) - 1] == n, "Error in function getDivisiors(...)" return ans # ---------------------------------------------------- def is_perfect_number(number): """ input: positive integer 'number' > 1 returns true if 'number' is a perfect number otherwise false. >>> is_perfect_number(28) True >>> is_perfect_number(824) False >>> is_perfect_number(-1) Traceback (most recent call last): ... AssertionError: 'number' must been an int and >= 1 >>> is_perfect_number("test") Traceback (most recent call last): ... AssertionError: 'number' must been an int and >= 1 """ # precondition assert isinstance(number, int) and (number > 1), ( "'number' must been an int and >= 1" ) divisors = get_divisors(number) # precondition assert ( isinstance(divisors, list) and (divisors[0] == 1) and (divisors[len(divisors) - 1] == number) ), "Error in help-function getDivisiors(...)" # summed all divisors up to 'number' (exclusive), hence [:-1] return sum(divisors[:-1]) == number # ------------------------------------------------------------ def simplify_fraction(numerator, denominator): """ input: two integer 'numerator' and 'denominator' assumes: 'denominator' != 0 returns: a tuple with simplify numerator and denominator. >>> simplify_fraction(10, 20) (1, 2) >>> simplify_fraction(10, -1) (10, -1) >>> simplify_fraction("test","test") Traceback (most recent call last): ... AssertionError: The arguments must been from type int and 'denominator' != 0 """ # precondition assert ( isinstance(numerator, int) and isinstance(denominator, int) and (denominator != 0) ), "The arguments must been from type int and 'denominator' != 0" # build the greatest common divisor of numerator and denominator. gcd_of_fraction = gcd_by_iterative(abs(numerator), abs(denominator)) # precondition assert ( isinstance(gcd_of_fraction, int) and (numerator % gcd_of_fraction == 0) and (denominator % gcd_of_fraction == 0) ), "Error in function gcd_by_iterative(...,...)" return (numerator // gcd_of_fraction, denominator // gcd_of_fraction) # ----------------------------------------------------------------- def factorial(n): """ input: positive integer 'n' returns the factorial of 'n' (n!) >>> factorial(0) 1 >>> factorial(20) 2432902008176640000 >>> factorial(-1) Traceback (most recent call last): ... AssertionError: 'n' must been a int and >= 0 >>> factorial("test") Traceback (most recent call last): ... AssertionError: 'n' must been a int and >= 0 """ # precondition assert isinstance(n, int) and (n >= 0), "'n' must been a int and >= 0" ans = 1 # this will be return. for factor in range(1, n + 1): ans *= factor return ans # ------------------------------------------------------------------- def fib(n: int) -> int: """ input: positive integer 'n' returns the n-th fibonacci term , indexing by 0 >>> fib(0) 1 >>> fib(5) 8 >>> fib(20) 10946 >>> fib(99) 354224848179261915075 >>> fib(-1) Traceback (most recent call last): ... AssertionError: 'n' must been an int and >= 0 >>> fib("test") Traceback (most recent call last): ... AssertionError: 'n' must been an int and >= 0 """ # precondition assert isinstance(n, int) and (n >= 0), "'n' must been an int and >= 0" tmp = 0 fib1 = 1 ans = 1 # this will be return for _ in range(n - 1): tmp = ans ans += fib1 fib1 = tmp return ans if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/print_multiplication_table.py ================================================ def multiplication_table(number: int, number_of_terms: int) -> str: """ Prints the multiplication table of a given number till the given number of terms >>> print(multiplication_table(3, 5)) 3 * 1 = 3 3 * 2 = 6 3 * 3 = 9 3 * 4 = 12 3 * 5 = 15 >>> print(multiplication_table(-4, 6)) -4 * 1 = -4 -4 * 2 = -8 -4 * 3 = -12 -4 * 4 = -16 -4 * 5 = -20 -4 * 6 = -24 """ return "\n".join( f"{number} * {i} = {number * i}" for i in range(1, number_of_terms + 1) ) if __name__ == "__main__": print(multiplication_table(number=5, number_of_terms=10)) ================================================ FILE: maths/pythagoras.py ================================================ """Uses Pythagoras theorem to calculate the distance between two points in space.""" import math class Point: def __init__(self, x, y, z): self.x = x self.y = y self.z = z def __repr__(self) -> str: return f"Point({self.x}, {self.y}, {self.z})" def distance(a: Point, b: Point) -> float: """ >>> point1 = Point(2, -1, 7) >>> point2 = Point(1, -3, 5) >>> print(f"Distance from {point1} to {point2} is {distance(point1, point2)}") Distance from Point(2, -1, 7) to Point(1, -3, 5) is 3.0 """ return math.sqrt(abs((b.x - a.x) ** 2 + (b.y - a.y) ** 2 + (b.z - a.z) ** 2)) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/qr_decomposition.py ================================================ import numpy as np def qr_householder(a: np.ndarray): """Return a QR-decomposition of the matrix A using Householder reflection. The QR-decomposition decomposes the matrix A of shape (m, n) into an orthogonal matrix Q of shape (m, m) and an upper triangular matrix R of shape (m, n). Note that the matrix A does not have to be square. This method of decomposing A uses the Householder reflection, which is numerically stable and of complexity O(n^3). https://en.wikipedia.org/wiki/QR_decomposition#Using_Householder_reflections Arguments: A -- a numpy.ndarray of shape (m, n) Note: several optimizations can be made for numeric efficiency, but this is intended to demonstrate how it would be represented in a mathematics textbook. In cases where efficiency is particularly important, an optimized version from BLAS should be used. >>> A = np.array([[12, -51, 4], [6, 167, -68], [-4, 24, -41]], dtype=float) >>> Q, R = qr_householder(A) >>> # check that the decomposition is correct >>> np.allclose(Q@R, A) True >>> # check that Q is orthogonal >>> np.allclose(Q@Q.T, np.eye(A.shape[0])) True >>> np.allclose(Q.T@Q, np.eye(A.shape[0])) True >>> # check that R is upper triangular >>> np.allclose(np.triu(R), R) True """ m, n = a.shape t = min(m, n) q = np.eye(m) r = a.copy() for k in range(t - 1): # select a column of modified matrix A': x = r[k:, [k]] # construct first basis vector e1 = np.zeros_like(x) e1[0] = 1.0 # determine scaling factor alpha = np.linalg.norm(x) # construct vector v for Householder reflection v = x + np.sign(x[0]) * alpha * e1 v /= np.linalg.norm(v) # construct the Householder matrix q_k = np.eye(m - k) - 2.0 * v @ v.T # pad with ones and zeros as necessary q_k = np.block([[np.eye(k), np.zeros((k, m - k))], [np.zeros((m - k, k)), q_k]]) q = q @ q_k.T r = q_k @ r return q, r if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/quadratic_equations_complex_numbers.py ================================================ from __future__ import annotations from cmath import sqrt def quadratic_roots(a: int, b: int, c: int) -> tuple[complex, complex]: """ Given the numerical coefficients a, b and c, calculates the roots for any quadratic equation of the form ax^2 + bx + c >>> quadratic_roots(a=1, b=3, c=-4) (1.0, -4.0) >>> quadratic_roots(5, 6, 1) (-0.2, -1.0) >>> quadratic_roots(1, -6, 25) ((3+4j), (3-4j)) """ if a == 0: raise ValueError("Coefficient 'a' must not be zero.") delta = b * b - 4 * a * c root_1 = (-b + sqrt(delta)) / (2 * a) root_2 = (-b - sqrt(delta)) / (2 * a) return ( root_1.real if not root_1.imag else root_1, root_2.real if not root_2.imag else root_2, ) def main(): solution1, solution2 = quadratic_roots(a=5, b=6, c=1) print(f"The solutions are: {solution1} and {solution2}") if __name__ == "__main__": main() ================================================ FILE: maths/radians.py ================================================ from math import pi def radians(degree: float) -> float: """ Converts the given angle from degrees to radians https://en.wikipedia.org/wiki/Radian >>> radians(180) 3.141592653589793 >>> radians(92) 1.6057029118347832 >>> radians(274) 4.782202150464463 >>> radians(109.82) 1.9167205845401725 >>> from math import radians as math_radians >>> all(abs(radians(i) - math_radians(i)) <= 1e-8 for i in range(-2, 361)) True """ return degree / (180 / pi) if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: maths/radix2_fft.py ================================================ """ Fast Polynomial Multiplication using radix-2 fast Fourier Transform. """ import mpmath # for roots of unity import numpy as np class FFT: """ Fast Polynomial Multiplication using radix-2 fast Fourier Transform. Reference: https://en.wikipedia.org/wiki/Cooley%E2%80%93Tukey_FFT_algorithm#The_radix-2_DIT_case For polynomials of degree m and n the algorithms has complexity O(n*logn + m*logm) The main part of the algorithm is split in two parts: 1) __DFT: We compute the discrete fourier transform (DFT) of A and B using a bottom-up dynamic approach - 2) __multiply: Once we obtain the DFT of A*B, we can similarly invert it to obtain A*B The class FFT takes two polynomials A and B with complex coefficients as arguments; The two polynomials should be represented as a sequence of coefficients starting from the free term. Thus, for instance x + 2*x^3 could be represented as [0,1,0,2] or (0,1,0,2). The constructor adds some zeros at the end so that the polynomials have the same length which is a power of 2 at least the length of their product. Example: Create two polynomials as sequences >>> A = [0, 1, 0, 2] # x+2x^3 >>> B = (2, 3, 4, 0) # 2+3x+4x^2 Create an FFT object with them >>> x = FFT(A, B) Print product >>> x.product # 2x + 3x^2 + 8x^3 + 6x^4 + 8x^5 [(-0-0j), (2+0j), (3-0j), (8-0j), (6+0j), (8+0j)] __str__ test >>> print(x) A = 0*x^0 + 1*x^1 + 0*x^2 + 2*x^3 B = 2*x^0 + 3*x^1 + 4*x^2 A*B = (-0-0j)*x^0 + (2+0j)*x^1 + (3-0j)*x^2 + (8-0j)*x^3 + (6+0j)*x^4 + (8+0j)*x^5 """ def __init__(self, poly_a=None, poly_b=None): # Input as list self.polyA = list(poly_a or [0])[:] self.polyB = list(poly_b or [0])[:] # Remove leading zero coefficients while self.polyA[-1] == 0: self.polyA.pop() self.len_A = len(self.polyA) while self.polyB[-1] == 0: self.polyB.pop() self.len_B = len(self.polyB) # Add 0 to make lengths equal a power of 2 self.c_max_length = int( 2 ** np.ceil(np.log2(len(self.polyA) + len(self.polyB) - 1)) ) while len(self.polyA) < self.c_max_length: self.polyA.append(0) while len(self.polyB) < self.c_max_length: self.polyB.append(0) # A complex root used for the fourier transform self.root = complex(mpmath.root(x=1, n=self.c_max_length, k=1)) # The product self.product = self.__multiply() # Discrete fourier transform of A and B def __dft(self, which): dft = [[x] for x in self.polyA] if which == "A" else [[x] for x in self.polyB] # Corner case if len(dft) <= 1: return dft[0] next_ncol = self.c_max_length // 2 while next_ncol > 0: new_dft = [[] for i in range(next_ncol)] root = self.root**next_ncol # First half of next step current_root = 1 for j in range(self.c_max_length // (next_ncol * 2)): for i in range(next_ncol): new_dft[i].append(dft[i][j] + current_root * dft[i + next_ncol][j]) current_root *= root # Second half of next step current_root = 1 for j in range(self.c_max_length // (next_ncol * 2)): for i in range(next_ncol): new_dft[i].append(dft[i][j] - current_root * dft[i + next_ncol][j]) current_root *= root # Update dft = new_dft next_ncol = next_ncol // 2 return dft[0] # multiply the DFTs of A and B and find A*B def __multiply(self): dft_a = self.__dft("A") dft_b = self.__dft("B") inverce_c = [[dft_a[i] * dft_b[i] for i in range(self.c_max_length)]] del dft_a del dft_b # Corner Case if len(inverce_c[0]) <= 1: return inverce_c[0] # Inverse DFT next_ncol = 2 while next_ncol <= self.c_max_length: new_inverse_c = [[] for i in range(next_ncol)] root = self.root ** (next_ncol // 2) current_root = 1 # First half of next step for j in range(self.c_max_length // next_ncol): for i in range(next_ncol // 2): # Even positions new_inverse_c[i].append( ( inverce_c[i][j] + inverce_c[i][j + self.c_max_length // next_ncol] ) / 2 ) # Odd positions new_inverse_c[i + next_ncol // 2].append( ( inverce_c[i][j] - inverce_c[i][j + self.c_max_length // next_ncol] ) / (2 * current_root) ) current_root *= root # Update inverce_c = new_inverse_c next_ncol *= 2 # Unpack inverce_c = [ complex(round(x[0].real, 8), round(x[0].imag, 8)) for x in inverce_c ] # Remove leading 0's while inverce_c[-1] == 0: inverce_c.pop() return inverce_c # Overwrite __str__ for print(); Shows A, B and A*B def __str__(self): a = "A = " + " + ".join( f"{coef}*x^{i}" for i, coef in enumerate(self.polyA[: self.len_A]) ) b = "B = " + " + ".join( f"{coef}*x^{i}" for i, coef in enumerate(self.polyB[: self.len_B]) ) c = "A*B = " + " + ".join( f"{coef}*x^{i}" for i, coef in enumerate(self.product) ) return f"{a}\n{b}\n{c}" # Unit tests if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/remove_digit.py ================================================ def remove_digit(num: int) -> int: """ returns the biggest possible result that can be achieved by removing one digit from the given number >>> remove_digit(152) 52 >>> remove_digit(6385) 685 >>> remove_digit(-11) 1 >>> remove_digit(2222222) 222222 >>> remove_digit("2222222") Traceback (most recent call last): TypeError: only integers accepted as input >>> remove_digit("string input") Traceback (most recent call last): TypeError: only integers accepted as input """ if not isinstance(num, int): raise TypeError("only integers accepted as input") else: num_str = str(abs(num)) num_transpositions = [list(num_str) for char in range(len(num_str))] for index in range(len(num_str)): num_transpositions[index].pop(index) return max( int("".join(list(transposition))) for transposition in num_transpositions ) if __name__ == "__main__": __import__("doctest").testmod() ================================================ FILE: maths/segmented_sieve.py ================================================ """Segmented Sieve.""" import math def sieve(n: int) -> list[int]: """ Segmented Sieve. Examples: >>> sieve(8) [2, 3, 5, 7] >>> sieve(27) [2, 3, 5, 7, 11, 13, 17, 19, 23] >>> sieve(0) Traceback (most recent call last): ... ValueError: Number 0 must instead be a positive integer >>> sieve(-1) Traceback (most recent call last): ... ValueError: Number -1 must instead be a positive integer >>> sieve(22.2) Traceback (most recent call last): ... ValueError: Number 22.2 must instead be a positive integer """ if n <= 0 or isinstance(n, float): msg = f"Number {n} must instead be a positive integer" raise ValueError(msg) in_prime = [] start = 2 end = int(math.sqrt(n)) # Size of every segment temp = [True] * (end + 1) prime = [] while start <= end: if temp[start] is True: in_prime.append(start) for i in range(start * start, end + 1, start): temp[i] = False start += 1 prime += in_prime low = end + 1 high = min(2 * end, n) while low <= n: temp = [True] * (high - low + 1) for each in in_prime: t = math.floor(low / each) * each if t < low: t += each for j in range(t, high + 1, each): temp[j - low] = False for j in range(len(temp)): if temp[j] is True: prime.append(j + low) low = high + 1 high = min(high + end, n) return prime if __name__ == "__main__": import doctest doctest.testmod() print(f"{sieve(10**6) = }") ================================================ FILE: maths/series/__init__.py ================================================ ================================================ FILE: maths/series/arithmetic.py ================================================ """ Arithmetic mean Reference: https://en.wikipedia.org/wiki/Arithmetic_mean Arithmetic series Reference: https://en.wikipedia.org/wiki/Arithmetic_series (The URL above will redirect you to arithmetic progression) """ def is_arithmetic_series(series: list) -> bool: """ checking whether the input series is arithmetic series or not >>> is_arithmetic_series([2, 4, 6]) True >>> is_arithmetic_series([3, 6, 12, 24]) False >>> is_arithmetic_series([1, 2, 3]) True >>> is_arithmetic_series(4) Traceback (most recent call last): ... ValueError: Input series is not valid, valid series - [2, 4, 6] >>> is_arithmetic_series([]) Traceback (most recent call last): ... ValueError: Input list must be a non empty list """ if not isinstance(series, list): raise ValueError("Input series is not valid, valid series - [2, 4, 6]") if len(series) == 0: raise ValueError("Input list must be a non empty list") if len(series) == 1: return True common_diff = series[1] - series[0] for index in range(len(series) - 1): if series[index + 1] - series[index] != common_diff: return False return True def arithmetic_mean(series: list) -> float: """ return the arithmetic mean of series >>> arithmetic_mean([2, 4, 6]) 4.0 >>> arithmetic_mean([3, 6, 9, 12]) 7.5 >>> arithmetic_mean(4) Traceback (most recent call last): ... ValueError: Input series is not valid, valid series - [2, 4, 6] >>> arithmetic_mean([4, 8, 1]) 4.333333333333333 >>> arithmetic_mean([1, 2, 3]) 2.0 >>> arithmetic_mean([]) Traceback (most recent call last): ... ValueError: Input list must be a non empty list """ if not isinstance(series, list): raise ValueError("Input series is not valid, valid series - [2, 4, 6]") if len(series) == 0: raise ValueError("Input list must be a non empty list") answer = 0 for val in series: answer += val return answer / len(series) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/series/geometric.py ================================================ """ Geometric Mean Reference : https://en.wikipedia.org/wiki/Geometric_mean Geometric series Reference: https://en.wikipedia.org/wiki/Geometric_series """ def is_geometric_series(series: list) -> bool: """ checking whether the input series is geometric series or not >>> is_geometric_series([2, 4, 8]) True >>> is_geometric_series([3, 6, 12, 24]) True >>> is_geometric_series([1, 2, 3]) False >>> is_geometric_series([0, 0, 3]) False >>> is_geometric_series([]) Traceback (most recent call last): ... ValueError: Input list must be a non empty list >>> is_geometric_series(4) Traceback (most recent call last): ... ValueError: Input series is not valid, valid series - [2, 4, 8] """ if not isinstance(series, list): raise ValueError("Input series is not valid, valid series - [2, 4, 8]") if len(series) == 0: raise ValueError("Input list must be a non empty list") if len(series) == 1: return True try: common_ratio = series[1] / series[0] for index in range(len(series) - 1): if series[index + 1] / series[index] != common_ratio: return False except ZeroDivisionError: return False return True def geometric_mean(series: list) -> float: """ return the geometric mean of series >>> geometric_mean([2, 4, 8]) 3.9999999999999996 >>> geometric_mean([3, 6, 12, 24]) 8.48528137423857 >>> geometric_mean([4, 8, 16]) 7.999999999999999 >>> geometric_mean(4) Traceback (most recent call last): ... ValueError: Input series is not valid, valid series - [2, 4, 8] >>> geometric_mean([1, 2, 3]) 1.8171205928321397 >>> geometric_mean([0, 2, 3]) 0.0 >>> geometric_mean([]) Traceback (most recent call last): ... ValueError: Input list must be a non empty list """ if not isinstance(series, list): raise ValueError("Input series is not valid, valid series - [2, 4, 8]") if len(series) == 0: raise ValueError("Input list must be a non empty list") answer = 1 for value in series: answer *= value return pow(answer, 1 / len(series)) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/series/geometric_series.py ================================================ """ This is a pure Python implementation of the Geometric Series algorithm https://en.wikipedia.org/wiki/Geometric_series Run the doctests with the following command: python3 -m doctest -v geometric_series.py or python -m doctest -v geometric_series.py For manual testing run: python3 geometric_series.py """ from __future__ import annotations def geometric_series( nth_term: float, start_term_a: float, common_ratio_r: float, ) -> list[float]: """ Pure Python implementation of Geometric Series algorithm :param nth_term: The last term (nth term of Geometric Series) :param start_term_a : The first term of Geometric Series :param common_ratio_r : The common ratio between all the terms :return: The Geometric Series starting from first term a and multiple of common ration with first term with increase in power till last term (nth term) Examples: >>> geometric_series(4, 2, 2) [2, 4.0, 8.0, 16.0] >>> geometric_series(4.0, 2.0, 2.0) [2.0, 4.0, 8.0, 16.0] >>> geometric_series(4.1, 2.1, 2.1) [2.1, 4.41, 9.261000000000001, 19.448100000000004] >>> geometric_series(4, 2, -2) [2, -4.0, 8.0, -16.0] >>> geometric_series(4, -2, 2) [-2, -4.0, -8.0, -16.0] >>> geometric_series(-4, 2, 2) [] >>> geometric_series(0, 100, 500) [] >>> geometric_series(1, 1, 1) [1] >>> geometric_series(0, 0, 0) [] """ if not all((nth_term, start_term_a, common_ratio_r)): return [] series: list[float] = [] power = 1 multiple = common_ratio_r for _ in range(int(nth_term)): if not series: series.append(start_term_a) else: power += 1 series.append(float(start_term_a * multiple)) multiple = pow(float(common_ratio_r), power) return series if __name__ == "__main__": import doctest doctest.testmod() nth_term = float(input("Enter the last number (n term) of the Geometric Series")) start_term_a = float(input("Enter the starting term (a) of the Geometric Series")) common_ratio_r = float( input("Enter the common ratio between two terms (r) of the Geometric Series") ) print("Formula of Geometric Series => a + ar + ar^2 ... +ar^n") print(geometric_series(nth_term, start_term_a, common_ratio_r)) ================================================ FILE: maths/series/harmonic.py ================================================ """ Harmonic mean Reference: https://en.wikipedia.org/wiki/Harmonic_mean Harmonic series Reference: https://en.wikipedia.org/wiki/Harmonic_series(mathematics) """ def is_harmonic_series(series: list) -> bool: """ checking whether the input series is arithmetic series or not >>> is_harmonic_series([ 1, 2/3, 1/2, 2/5, 1/3]) True >>> is_harmonic_series([ 1, 2/3, 2/5, 1/3]) False >>> is_harmonic_series([1, 2, 3]) False >>> is_harmonic_series([1/2, 1/3, 1/4]) True >>> is_harmonic_series([2/5, 2/10, 2/15, 2/20, 2/25]) True >>> is_harmonic_series(4) Traceback (most recent call last): ... ValueError: Input series is not valid, valid series - [1, 2/3, 2] >>> is_harmonic_series([]) Traceback (most recent call last): ... ValueError: Input list must be a non empty list >>> is_harmonic_series([0]) Traceback (most recent call last): ... ValueError: Input series cannot have 0 as an element >>> is_harmonic_series([1,2,0,6]) Traceback (most recent call last): ... ValueError: Input series cannot have 0 as an element """ if not isinstance(series, list): raise ValueError("Input series is not valid, valid series - [1, 2/3, 2]") if len(series) == 0: raise ValueError("Input list must be a non empty list") if len(series) == 1 and series[0] != 0: return True rec_series = [] series_len = len(series) for i in range(series_len): if series[i] == 0: raise ValueError("Input series cannot have 0 as an element") rec_series.append(1 / series[i]) common_diff = rec_series[1] - rec_series[0] for index in range(2, series_len): if rec_series[index] - rec_series[index - 1] != common_diff: return False return True def harmonic_mean(series: list) -> float: """ return the harmonic mean of series >>> harmonic_mean([1, 4, 4]) 2.0 >>> harmonic_mean([3, 6, 9, 12]) 5.759999999999999 >>> harmonic_mean(4) Traceback (most recent call last): ... ValueError: Input series is not valid, valid series - [2, 4, 6] >>> harmonic_mean([1, 2, 3]) 1.6363636363636365 >>> harmonic_mean([]) Traceback (most recent call last): ... ValueError: Input list must be a non empty list """ if not isinstance(series, list): raise ValueError("Input series is not valid, valid series - [2, 4, 6]") if len(series) == 0: raise ValueError("Input list must be a non empty list") answer = 0 for val in series: answer += 1 / val return len(series) / answer if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/series/harmonic_series.py ================================================ """ This is a pure Python implementation of the Harmonic Series algorithm https://en.wikipedia.org/wiki/Harmonic_series_(mathematics) For doctests run following command: python -m doctest -v harmonic_series.py or python3 -m doctest -v harmonic_series.py For manual testing run: python3 harmonic_series.py """ def harmonic_series(n_term: str) -> list: """Pure Python implementation of Harmonic Series algorithm :param n_term: The last (nth) term of Harmonic Series :return: The Harmonic Series starting from 1 to last (nth) term Examples: >>> harmonic_series(5) ['1', '1/2', '1/3', '1/4', '1/5'] >>> harmonic_series(5.0) ['1', '1/2', '1/3', '1/4', '1/5'] >>> harmonic_series(5.1) ['1', '1/2', '1/3', '1/4', '1/5'] >>> harmonic_series(-5) [] >>> harmonic_series(0) [] >>> harmonic_series(1) ['1'] """ if n_term == "": return [] series: list = [] for temp in range(int(n_term)): series.append(f"1/{temp + 1}" if series else "1") return series if __name__ == "__main__": nth_term = input("Enter the last number (nth term) of the Harmonic Series") print("Formula of Harmonic Series => 1+1/2+1/3 ..... 1/n") print(harmonic_series(nth_term)) ================================================ FILE: maths/series/hexagonal_numbers.py ================================================ """ A hexagonal number sequence is a sequence of figurate numbers where the nth hexagonal number hₙ is the number of distinct dots in a pattern of dots consisting of the outlines of regular hexagons with sides up to n dots, when the hexagons are overlaid so that they share one vertex. Calculates the hexagonal numbers sequence with a formula hₙ = n(2n-1) where: hₙ --> is nth element of the sequence n --> is the number of element in the sequence reference-->"Hexagonal number" Wikipedia """ def hexagonal_numbers(length: int) -> list[int]: """ :param len: max number of elements :type len: int :return: Hexagonal numbers as a list Tests: >>> hexagonal_numbers(10) [0, 1, 6, 15, 28, 45, 66, 91, 120, 153] >>> hexagonal_numbers(5) [0, 1, 6, 15, 28] >>> hexagonal_numbers(0) Traceback (most recent call last): ... ValueError: Length must be a positive integer. """ if length <= 0 or not isinstance(length, int): raise ValueError("Length must be a positive integer.") return [n * (2 * n - 1) for n in range(length)] if __name__ == "__main__": print(hexagonal_numbers(length=5)) print(hexagonal_numbers(length=10)) ================================================ FILE: maths/series/p_series.py ================================================ """ This is a pure Python implementation of the P-Series algorithm https://en.wikipedia.org/wiki/Harmonic_series_(mathematics)#P-series For doctests run following command: python -m doctest -v p_series.py or python3 -m doctest -v p_series.py For manual testing run: python3 p_series.py """ from __future__ import annotations def p_series(nth_term: float | str, power: float | str) -> list[str]: """ Pure Python implementation of P-Series algorithm :return: The P-Series starting from 1 to last (nth) term Examples: >>> p_series(5, 2) ['1', '1 / 4', '1 / 9', '1 / 16', '1 / 25'] >>> p_series(-5, 2) [] >>> p_series(5, -2) ['1', '1 / 0.25', '1 / 0.1111111111111111', '1 / 0.0625', '1 / 0.04'] >>> p_series("", 1000) [''] >>> p_series(0, 0) [] >>> p_series(1, 1) ['1'] """ if nth_term == "": return [""] nth_term = int(nth_term) power = int(power) series: list[str] = [] for temp in range(int(nth_term)): series.append(f"1 / {pow(temp + 1, int(power))}" if series else "1") return series if __name__ == "__main__": import doctest doctest.testmod() nth_term = int(input("Enter the last number (nth term) of the P-Series")) power = int(input("Enter the power for P-Series")) print("Formula of P-Series => 1+1/2^p+1/3^p ..... 1/n^p") print(p_series(nth_term, power)) ================================================ FILE: maths/sieve_of_eratosthenes.py ================================================ """ Sieve of Eratosthones The sieve of Eratosthenes is an algorithm used to find prime numbers, less than or equal to a given value. Illustration: https://upload.wikimedia.org/wikipedia/commons/b/b9/Sieve_of_Eratosthenes_animation.gif Reference: https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes doctest provider: Bruno Simas Hadlich (https://github.com/brunohadlich) Also thanks to Dmitry (https://github.com/LizardWizzard) for finding the problem """ from __future__ import annotations import math def prime_sieve(num: int) -> list[int]: """ Returns a list with all prime numbers up to n. >>> prime_sieve(50) [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47] >>> prime_sieve(25) [2, 3, 5, 7, 11, 13, 17, 19, 23] >>> prime_sieve(10) [2, 3, 5, 7] >>> prime_sieve(9) [2, 3, 5, 7] >>> prime_sieve(2) [2] >>> prime_sieve(1) [] """ if num <= 0: msg = f"{num}: Invalid input, please enter a positive integer." raise ValueError(msg) sieve = [True] * (num + 1) prime = [] start = 2 end = int(math.sqrt(num)) while start <= end: # If start is a prime if sieve[start] is True: prime.append(start) # Set multiples of start be False for i in range(start * start, num + 1, start): if sieve[i] is True: sieve[i] = False start += 1 for j in range(end + 1, num + 1): if sieve[j] is True: prime.append(j) return prime if __name__ == "__main__": print(prime_sieve(int(input("Enter a positive integer: ").strip()))) ================================================ FILE: maths/sigmoid.py ================================================ """ This script demonstrates the implementation of the Sigmoid function. The function takes a vector of K real numbers as input and then 1 / (1 + exp(-x)). After through Sigmoid, the element of the vector mostly 0 between 1. or 1 between -1. Script inspired from its corresponding Wikipedia article https://en.wikipedia.org/wiki/Sigmoid_function """ import numpy as np def sigmoid(vector: np.ndarray) -> np.ndarray: """ Implements the sigmoid function Parameters: vector (np.array): A numpy array of shape (1,n) consisting of real values Returns: sigmoid_vec (np.array): The input numpy array, after applying sigmoid. Examples: >>> sigmoid(np.array([-1.0, 1.0, 2.0])) array([0.26894142, 0.73105858, 0.88079708]) >>> sigmoid(np.array([0.0])) array([0.5]) """ return 1 / (1 + np.exp(-vector)) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/signum.py ================================================ """ Signum function -- https://en.wikipedia.org/wiki/Sign_function """ def signum(num: float) -> int: """ Applies signum function on the number Custom test cases: >>> signum(-10) -1 >>> signum(10) 1 >>> signum(0) 0 >>> signum(-20.5) -1 >>> signum(20.5) 1 >>> signum(-1e-6) -1 >>> signum(1e-6) 1 >>> signum("Hello") Traceback (most recent call last): ... TypeError: '<' not supported between instances of 'str' and 'int' >>> signum([]) Traceback (most recent call last): ... TypeError: '<' not supported between instances of 'list' and 'int' """ if num < 0: return -1 return 1 if num else 0 def test_signum() -> None: """ Tests the signum function >>> test_signum() """ assert signum(5) == 1 assert signum(-5) == -1 assert signum(0) == 0 assert signum(10.5) == 1 assert signum(-10.5) == -1 assert signum(1e-6) == 1 assert signum(-1e-6) == -1 assert signum(123456789) == 1 assert signum(-123456789) == -1 if __name__ == "__main__": print(signum(12)) print(signum(-12)) print(signum(0)) ================================================ FILE: maths/simultaneous_linear_equation_solver.py ================================================ """ https://en.wikipedia.org/wiki/Augmented_matrix This algorithm solves simultaneous linear equations of the form λa + λb + λc + λd + ... = y as [λ, λ, λ, λ, ..., y] Where λ & y are individual coefficients, the no. of equations = no. of coefficients - 1 Note in order to work there must exist 1 equation where all instances of λ and y != 0 """ def simplify(current_set: list[list]) -> list[list]: """ >>> simplify([[1, 2, 3], [4, 5, 6]]) [[1.0, 2.0, 3.0], [0.0, 0.75, 1.5]] >>> simplify([[5, 2, 5], [5, 1, 10]]) [[1.0, 0.4, 1.0], [0.0, 0.2, -1.0]] """ # Divide each row by magnitude of first term --> creates 'unit' matrix duplicate_set = current_set.copy() for row_index, row in enumerate(duplicate_set): magnitude = row[0] for column_index, column in enumerate(row): if magnitude == 0: current_set[row_index][column_index] = column continue current_set[row_index][column_index] = column / magnitude # Subtract to cancel term first_row = current_set[0] final_set = [first_row] current_set = current_set[1::] for row in current_set: temp_row = [] # If first term is 0, it is already in form we want, so we preserve it if row[0] == 0: final_set.append(row) continue for column_index in range(len(row)): temp_row.append(first_row[column_index] - row[column_index]) final_set.append(temp_row) # Create next recursion iteration set if len(final_set[0]) != 3: current_first_row = final_set[0] current_first_column = [] next_iteration = [] for row in final_set[1::]: current_first_column.append(row[0]) next_iteration.append(row[1::]) resultant = simplify(next_iteration) for i in range(len(resultant)): resultant[i].insert(0, current_first_column[i]) resultant.insert(0, current_first_row) final_set = resultant return final_set def solve_simultaneous(equations: list[list]) -> list: """ >>> solve_simultaneous([[1, 2, 3],[4, 5, 6]]) [-1.0, 2.0] >>> solve_simultaneous([[0, -3, 1, 7],[3, 2, -1, 11],[5, 1, -2, 12]]) [6.4, 1.2, 10.6] >>> solve_simultaneous([]) Traceback (most recent call last): ... IndexError: solve_simultaneous() requires n lists of length n+1 >>> solve_simultaneous([[1, 2, 3],[1, 2]]) Traceback (most recent call last): ... IndexError: solve_simultaneous() requires n lists of length n+1 >>> solve_simultaneous([[1, 2, 3],["a", 7, 8]]) Traceback (most recent call last): ... ValueError: solve_simultaneous() requires lists of integers >>> solve_simultaneous([[0, 2, 3],[4, 0, 6]]) Traceback (most recent call last): ... ValueError: solve_simultaneous() requires at least 1 full equation """ if len(equations) == 0: raise IndexError("solve_simultaneous() requires n lists of length n+1") _length = len(equations) + 1 if any(len(item) != _length for item in equations): raise IndexError("solve_simultaneous() requires n lists of length n+1") for row in equations: if any(not isinstance(column, (int, float)) for column in row): raise ValueError("solve_simultaneous() requires lists of integers") if len(equations) == 1: return [equations[0][-1] / equations[0][0]] data_set = equations.copy() if any(0 in row for row in data_set): temp_data = data_set.copy() full_row = [] for row_index, row in enumerate(temp_data): if 0 not in row: full_row = data_set.pop(row_index) break if not full_row: raise ValueError("solve_simultaneous() requires at least 1 full equation") data_set.insert(0, full_row) useable_form = data_set.copy() simplified = simplify(useable_form) simplified = simplified[::-1] solutions: list = [] for row in simplified: current_solution = row[-1] if not solutions: if row[-2] == 0: solutions.append(0) continue solutions.append(current_solution / row[-2]) continue temp_row = row.copy()[: len(row) - 1 :] while temp_row[0] == 0: temp_row.pop(0) if len(temp_row) == 0: solutions.append(0) continue temp_row = temp_row[1::] temp_row = temp_row[::-1] for column_index, column in enumerate(temp_row): current_solution -= column * solutions[column_index] solutions.append(current_solution) final = [] for item in solutions: final.append(float(round(item, 5))) return final[::-1] if __name__ == "__main__": import doctest doctest.testmod() eq = [ [2, 1, 1, 1, 1, 4], [1, 2, 1, 1, 1, 5], [1, 1, 2, 1, 1, 6], [1, 1, 1, 2, 1, 7], [1, 1, 1, 1, 2, 8], ] print(solve_simultaneous(eq)) print(solve_simultaneous([[4, 2]])) ================================================ FILE: maths/sin.py ================================================ """ Calculate sin function. It's not a perfect function so I am rounding the result to 10 decimal places by default. Formula: sin(x) = x - x^3/3! + x^5/5! - x^7/7! + ... Where: x = angle in randians. Source: https://www.homeschoolmath.net/teaching/sine_calculator.php """ from math import factorial, radians def sin( angle_in_degrees: float, accuracy: int = 18, rounded_values_count: int = 10 ) -> float: """ Implement sin function. >>> sin(0.0) 0.0 >>> sin(90.0) 1.0 >>> sin(180.0) 0.0 >>> sin(270.0) -1.0 >>> sin(0.68) 0.0118679603 >>> sin(1.97) 0.0343762121 >>> sin(64.0) 0.8987940463 >>> sin(9999.0) -0.9876883406 >>> sin(-689.0) 0.5150380749 >>> sin(89.7) 0.9999862922 """ # Simplify the angle to be between 360 and -360 degrees. angle_in_degrees = angle_in_degrees - ((angle_in_degrees // 360.0) * 360.0) # Converting from degrees to radians angle_in_radians = radians(angle_in_degrees) result = angle_in_radians a = 3 b = -1 for _ in range(accuracy): result += (b * (angle_in_radians**a)) / factorial(a) b = -b # One positive term and the next will be negative and so on... a += 2 # Increased by 2 for every term. return round(result, rounded_values_count) if __name__ == "__main__": __import__("doctest").testmod() ================================================ FILE: maths/sock_merchant.py ================================================ from collections import Counter def sock_merchant(colors: list[int]) -> int: """ >>> sock_merchant([10, 20, 20, 10, 10, 30, 50, 10, 20]) 3 >>> sock_merchant([1, 1, 3, 3]) 2 """ return sum(socks_by_color // 2 for socks_by_color in Counter(colors).values()) if __name__ == "__main__": import doctest doctest.testmod() colors = [int(x) for x in input("Enter socks by color :").rstrip().split()] print(f"sock_merchant({colors}) = {sock_merchant(colors)}") ================================================ FILE: maths/softmax.py ================================================ """ This script demonstrates the implementation of the Softmax function. Its a function that takes as input a vector of K real numbers, and normalizes it into a probability distribution consisting of K probabilities proportional to the exponentials of the input numbers. After softmax, the elements of the vector always sum up to 1. Script inspired from its corresponding Wikipedia article https://en.wikipedia.org/wiki/Softmax_function """ import numpy as np def softmax(vector): """ Implements the softmax function Parameters: vector (np.array,list,tuple): A numpy array of shape (1,n) consisting of real values or a similar list,tuple Returns: softmax_vec (np.array): The input numpy array after applying softmax. The softmax vector adds up to one. We need to ceil to mitigate for precision >>> float(np.ceil(np.sum(softmax([1,2,3,4])))) 1.0 >>> vec = np.array([5,5]) >>> softmax(vec) array([0.5, 0.5]) >>> softmax([0]) array([1.]) """ # Calculate e^x for each x in your vector where e is Euler's # number (approximately 2.718) exponent_vector = np.exp(vector) # Add up the all the exponentials sum_of_exponents = np.sum(exponent_vector) # Divide every exponent by the sum of all exponents softmax_vector = exponent_vector / sum_of_exponents return softmax_vector if __name__ == "__main__": print(softmax((0,))) ================================================ FILE: maths/solovay_strassen_primality_test.py ================================================ """ This script implements the Solovay-Strassen Primality test. This probabilistic primality test is based on Euler's criterion. It is similar to the Fermat test but uses quadratic residues. It can quickly identify composite numbers but may occasionally classify composite numbers as prime. More details and concepts about this can be found on: https://en.wikipedia.org/wiki/Solovay%E2%80%93Strassen_primality_test """ import random def jacobi_symbol(random_a: int, number: int) -> int: """ Calculate the Jacobi symbol. The Jacobi symbol is a generalization of the Legendre symbol, which can be used to simplify computations involving quadratic residues. The Jacobi symbol is used in primality tests, like the Solovay-Strassen test, because it helps determine if an integer is a quadratic residue modulo a given modulus, providing valuable information about the number's potential primality or compositeness. Parameters: random_a: A randomly chosen integer from 2 to n-2 (inclusive) number: The number that is tested for primality Returns: jacobi_symbol: The Jacobi symbol is a mathematical function used to determine whether an integer is a quadratic residue modulo another integer (usually prime) or not. >>> jacobi_symbol(2, 13) -1 >>> jacobi_symbol(5, 19) 1 >>> jacobi_symbol(7, 14) 0 """ if random_a in (0, 1): return random_a random_a %= number t = 1 while random_a != 0: while random_a % 2 == 0: random_a //= 2 r = number % 8 if r in (3, 5): t = -t random_a, number = number, random_a if random_a % 4 == number % 4 == 3: t = -t random_a %= number return t if number == 1 else 0 def solovay_strassen(number: int, iterations: int) -> bool: """ Check whether the input number is prime or not using the Solovay-Strassen Primality test Parameters: number: The number that is tested for primality iterations: The number of times that the test is run which effects the accuracy Returns: result: True if number is probably prime and false if not >>> random.seed(10) >>> solovay_strassen(13, 5) True >>> solovay_strassen(9, 10) False >>> solovay_strassen(17, 15) True """ if number <= 1: return False if number <= 3: return True for _ in range(iterations): a = random.randint(2, number - 2) x = jacobi_symbol(a, number) y = pow(a, (number - 1) // 2, number) if x == 0 or y != x % number: return False return True if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/spearman_rank_correlation_coefficient.py ================================================ from collections.abc import Sequence def assign_ranks(data: Sequence[float]) -> list[int]: """ Assigns ranks to elements in the array. :param data: List of floats. :return: List of ints representing the ranks. Example: >>> assign_ranks([3.2, 1.5, 4.0, 2.7, 5.1]) [3, 1, 4, 2, 5] >>> assign_ranks([10.5, 8.1, 12.4, 9.3, 11.0]) [3, 1, 5, 2, 4] """ ranked_data = sorted((value, index) for index, value in enumerate(data)) ranks = [0] * len(data) for position, (_, index) in enumerate(ranked_data): ranks[index] = position + 1 return ranks def calculate_spearman_rank_correlation( variable_1: Sequence[float], variable_2: Sequence[float] ) -> float: """ Calculates Spearman's rank correlation coefficient. :param variable_1: List of floats representing the first variable. :param variable_2: List of floats representing the second variable. :return: Spearman's rank correlation coefficient. Example Usage: >>> x = [1, 2, 3, 4, 5] >>> y = [5, 4, 3, 2, 1] >>> calculate_spearman_rank_correlation(x, y) -1.0 >>> x = [1, 2, 3, 4, 5] >>> y = [2, 4, 6, 8, 10] >>> calculate_spearman_rank_correlation(x, y) 1.0 >>> x = [1, 2, 3, 4, 5] >>> y = [5, 1, 2, 9, 5] >>> calculate_spearman_rank_correlation(x, y) 0.6 """ n = len(variable_1) rank_var1 = assign_ranks(variable_1) rank_var2 = assign_ranks(variable_2) # Calculate differences of ranks d = [rx - ry for rx, ry in zip(rank_var1, rank_var2)] # Calculate the sum of squared differences d_squared = sum(di**2 for di in d) # Calculate the Spearman's rank correlation coefficient rho = 1 - (6 * d_squared) / (n * (n**2 - 1)) return rho if __name__ == "__main__": import doctest doctest.testmod() # Example usage: print( f"{calculate_spearman_rank_correlation([1, 2, 3, 4, 5], [2, 4, 6, 8, 10]) = }" ) print(f"{calculate_spearman_rank_correlation([1, 2, 3, 4, 5], [5, 4, 3, 2, 1]) = }") print(f"{calculate_spearman_rank_correlation([1, 2, 3, 4, 5], [5, 1, 2, 9, 5]) = }") ================================================ FILE: maths/special_numbers/__init__.py ================================================ ================================================ FILE: maths/special_numbers/armstrong_numbers.py ================================================ """ An Armstrong number is equal to the sum of its own digits each raised to the power of the number of digits. For example, 370 is an Armstrong number because 3*3*3 + 7*7*7 + 0*0*0 = 370. Armstrong numbers are also called Narcissistic numbers and Pluperfect numbers. On-Line Encyclopedia of Integer Sequences entry: https://oeis.org/A005188 """ PASSING = (1, 153, 370, 371, 1634, 24678051, 115132219018763992565095597973971522401) FAILING: tuple = (-153, -1, 0, 1.2, 200, "A", [], {}, None) def armstrong_number(n: int) -> bool: """ Return True if n is an Armstrong number or False if it is not. >>> all(armstrong_number(n) for n in PASSING) True >>> any(armstrong_number(n) for n in FAILING) False """ if not isinstance(n, int) or n < 1: return False # Initialization of sum and number of digits. total = 0 number_of_digits = 0 temp = n # Calculation of digits of the number number_of_digits = len(str(n)) # Dividing number into separate digits and find Armstrong number temp = n while temp > 0: rem = temp % 10 total += rem**number_of_digits temp //= 10 return n == total def pluperfect_number(n: int) -> bool: """Return True if n is a pluperfect number or False if it is not >>> all(pluperfect_number(n) for n in PASSING) True >>> any(pluperfect_number(n) for n in FAILING) False """ if not isinstance(n, int) or n < 1: return False # Init a "histogram" of the digits digit_histogram = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] digit_total = 0 total = 0 temp = n while temp > 0: temp, rem = divmod(temp, 10) digit_histogram[rem] += 1 digit_total += 1 for cnt, i in zip(digit_histogram, range(len(digit_histogram))): total += cnt * i**digit_total return n == total def narcissistic_number(n: int) -> bool: """Return True if n is a narcissistic number or False if it is not. >>> all(narcissistic_number(n) for n in PASSING) True >>> any(narcissistic_number(n) for n in FAILING) False """ if not isinstance(n, int) or n < 1: return False expo = len(str(n)) # the power that all digits will be raised to # check if sum of each digit multiplied expo times is equal to number return n == sum(int(i) ** expo for i in str(n)) def main(): """ Request that user input an integer and tell them if it is Armstrong number. """ num = int(input("Enter an integer to see if it is an Armstrong number: ").strip()) print(f"{num} is {'' if armstrong_number(num) else 'not '}an Armstrong number.") print(f"{num} is {'' if narcissistic_number(num) else 'not '}an Armstrong number.") print(f"{num} is {'' if pluperfect_number(num) else 'not '}an Armstrong number.") if __name__ == "__main__": import doctest doctest.testmod() main() ================================================ FILE: maths/special_numbers/automorphic_number.py ================================================ """ == Automorphic Numbers == A number n is said to be a Automorphic number if the square of n "ends" in the same digits as n itself. Examples of Automorphic Numbers: 0, 1, 5, 6, 25, 76, 376, 625, 9376, 90625, ... https://en.wikipedia.org/wiki/Automorphic_number """ # Author : Akshay Dubey (https://github.com/itsAkshayDubey) # Time Complexity : O(log10n) def is_automorphic_number(number: int) -> bool: """ # doctest: +NORMALIZE_WHITESPACE This functions takes an integer number as input. returns True if the number is automorphic. >>> is_automorphic_number(-1) False >>> is_automorphic_number(0) True >>> is_automorphic_number(5) True >>> is_automorphic_number(6) True >>> is_automorphic_number(7) False >>> is_automorphic_number(25) True >>> is_automorphic_number(259918212890625) True >>> is_automorphic_number(259918212890636) False >>> is_automorphic_number(740081787109376) True >>> is_automorphic_number(5.0) Traceback (most recent call last): ... TypeError: Input value of [number=5.0] must be an integer """ if not isinstance(number, int): msg = f"Input value of [number={number}] must be an integer" raise TypeError(msg) if number < 0: return False number_square = number * number while number > 0: if number % 10 != number_square % 10: return False number //= 10 number_square //= 10 return True if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/special_numbers/bell_numbers.py ================================================ """ Bell numbers represent the number of ways to partition a set into non-empty subsets. This module provides functions to calculate Bell numbers for sets of integers. In other words, the first (n + 1) Bell numbers. For more information about Bell numbers, refer to: https://en.wikipedia.org/wiki/Bell_number """ def bell_numbers(max_set_length: int) -> list[int]: """ Calculate Bell numbers for the sets of lengths from 0 to max_set_length. In other words, calculate first (max_set_length + 1) Bell numbers. Args: max_set_length (int): The maximum length of the sets for which Bell numbers are calculated. Returns: list: A list of Bell numbers for sets of lengths from 0 to max_set_length. Examples: >>> bell_numbers(-2) Traceback (most recent call last): ... ValueError: max_set_length must be non-negative >>> bell_numbers(0) [1] >>> bell_numbers(1) [1, 1] >>> bell_numbers(5) [1, 1, 2, 5, 15, 52] """ if max_set_length < 0: raise ValueError("max_set_length must be non-negative") bell = [0] * (max_set_length + 1) bell[0] = 1 for i in range(1, max_set_length + 1): for j in range(i): bell[i] += _binomial_coefficient(i - 1, j) * bell[j] return bell def _binomial_coefficient(total_elements: int, elements_to_choose: int) -> int: """ Calculate the binomial coefficient C(total_elements, elements_to_choose) Args: total_elements (int): The total number of elements. elements_to_choose (int): The number of elements to choose. Returns: int: The binomial coefficient C(total_elements, elements_to_choose). Examples: >>> _binomial_coefficient(5, 2) 10 >>> _binomial_coefficient(6, 3) 20 """ if elements_to_choose in {0, total_elements}: return 1 elements_to_choose = min(elements_to_choose, total_elements - elements_to_choose) coefficient = 1 for i in range(elements_to_choose): coefficient *= total_elements - i coefficient //= i + 1 return coefficient if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/special_numbers/carmichael_number.py ================================================ """ == Carmichael Numbers == A number n is said to be a Carmichael number if it satisfies the following modular arithmetic condition: power(b, n-1) MOD n = 1, for all b ranging from 1 to n such that b and n are relatively prime, i.e, gcd(b, n) = 1 Examples of Carmichael Numbers: 561, 1105, ... https://en.wikipedia.org/wiki/Carmichael_number """ from maths.greatest_common_divisor import greatest_common_divisor def power(x: int, y: int, mod: int) -> int: """ Examples: >>> power(2, 15, 3) 2 >>> power(5, 1, 30) 5 """ if y == 0: return 1 temp = power(x, y // 2, mod) % mod temp = (temp * temp) % mod if y % 2 == 1: temp = (temp * x) % mod return temp def is_carmichael_number(n: int) -> bool: """ Examples: >>> is_carmichael_number(4) False >>> is_carmichael_number(561) True >>> is_carmichael_number(562) False >>> is_carmichael_number(900) False >>> is_carmichael_number(1105) True >>> is_carmichael_number(8911) True >>> is_carmichael_number(5.1) Traceback (most recent call last): ... ValueError: Number 5.1 must instead be a positive integer >>> is_carmichael_number(-7) Traceback (most recent call last): ... ValueError: Number -7 must instead be a positive integer >>> is_carmichael_number(0) Traceback (most recent call last): ... ValueError: Number 0 must instead be a positive integer """ if n <= 0 or not isinstance(n, int): msg = f"Number {n} must instead be a positive integer" raise ValueError(msg) return all( power(b, n - 1, n) == 1 for b in range(2, n) if greatest_common_divisor(b, n) == 1 ) if __name__ == "__main__": import doctest doctest.testmod() number = int(input("Enter number: ").strip()) if is_carmichael_number(number): print(f"{number} is a Carmichael Number.") else: print(f"{number} is not a Carmichael Number.") ================================================ FILE: maths/special_numbers/catalan_number.py ================================================ """ Calculate the nth Catalan number Source: https://en.wikipedia.org/wiki/Catalan_number """ def catalan(number: int) -> int: """ :param number: nth catalan number to calculate :return: the nth catalan number Note: A catalan number is only defined for positive integers >>> catalan(5) 14 >>> catalan(0) Traceback (most recent call last): ... ValueError: Input value of [number=0] must be > 0 >>> catalan(-1) Traceback (most recent call last): ... ValueError: Input value of [number=-1] must be > 0 >>> catalan(5.0) Traceback (most recent call last): ... TypeError: Input value of [number=5.0] must be an integer """ if not isinstance(number, int): msg = f"Input value of [number={number}] must be an integer" raise TypeError(msg) if number < 1: msg = f"Input value of [number={number}] must be > 0" raise ValueError(msg) current_number = 1 for i in range(1, number): current_number *= 4 * i - 2 current_number //= i + 1 return current_number if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/special_numbers/hamming_numbers.py ================================================ """ A Hamming number is a positive integer of the form 2^i*3^j*5^k, for some non-negative integers i, j, and k. They are often referred to as regular numbers. More info at: https://en.wikipedia.org/wiki/Regular_number. """ def hamming(n_element: int) -> list: """ This function creates an ordered list of n length as requested, and afterwards returns the last value of the list. It must be given a positive integer. :param n_element: The number of elements on the list :return: The nth element of the list >>> hamming(-5) Traceback (most recent call last): ... ValueError: n_element should be a positive number >>> hamming(5) [1, 2, 3, 4, 5] >>> hamming(10) [1, 2, 3, 4, 5, 6, 8, 9, 10, 12] >>> hamming(15) [1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24] """ n_element = int(n_element) if n_element < 1: my_error = ValueError("n_element should be a positive number") raise my_error hamming_list = [1] i, j, k = (0, 0, 0) index = 1 while index < n_element: while hamming_list[i] * 2 <= hamming_list[-1]: i += 1 while hamming_list[j] * 3 <= hamming_list[-1]: j += 1 while hamming_list[k] * 5 <= hamming_list[-1]: k += 1 hamming_list.append( min(hamming_list[i] * 2, hamming_list[j] * 3, hamming_list[k] * 5) ) index += 1 return hamming_list if __name__ == "__main__": n = input("Enter the last number (nth term) of the Hamming Number Series: ") print("Formula of Hamming Number Series => 2^i * 3^j * 5^k") hamming_numbers = hamming(int(n)) print("-----------------------------------------------------") print(f"The list with nth numbers is: {hamming_numbers}") print("-----------------------------------------------------") ================================================ FILE: maths/special_numbers/happy_number.py ================================================ def is_happy_number(number: int) -> bool: """ A happy number is a number which eventually reaches 1 when replaced by the sum of the square of each digit. :param number: The number to check for happiness. :return: True if the number is a happy number, False otherwise. >>> is_happy_number(19) True >>> is_happy_number(2) False >>> is_happy_number(23) True >>> is_happy_number(1) True >>> is_happy_number(0) Traceback (most recent call last): ... ValueError: number=0 must be a positive integer >>> is_happy_number(-19) Traceback (most recent call last): ... ValueError: number=-19 must be a positive integer >>> is_happy_number(19.1) Traceback (most recent call last): ... ValueError: number=19.1 must be a positive integer >>> is_happy_number("happy") Traceback (most recent call last): ... ValueError: number='happy' must be a positive integer """ if not isinstance(number, int) or number <= 0: msg = f"{number=} must be a positive integer" raise ValueError(msg) seen = set() while number != 1 and number not in seen: seen.add(number) number = sum(int(digit) ** 2 for digit in str(number)) return number == 1 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/special_numbers/harshad_numbers.py ================================================ """ A harshad number (or more specifically an n-harshad number) is a number that's divisible by the sum of its digits in some given base n. Reference: https://en.wikipedia.org/wiki/Harshad_number """ def int_to_base(number: int, base: int) -> str: """ Convert a given positive decimal integer to base 'base'. Where 'base' ranges from 2 to 36. Examples: >>> int_to_base(0, 21) '0' >>> int_to_base(23, 2) '10111' >>> int_to_base(58, 5) '213' >>> int_to_base(167, 16) 'A7' >>> # bases below 2 and beyond 36 will error >>> int_to_base(98, 1) Traceback (most recent call last): ... ValueError: 'base' must be between 2 and 36 inclusive >>> int_to_base(98, 37) Traceback (most recent call last): ... ValueError: 'base' must be between 2 and 36 inclusive >>> int_to_base(-99, 16) Traceback (most recent call last): ... ValueError: number must be a positive integer """ if base < 2 or base > 36: raise ValueError("'base' must be between 2 and 36 inclusive") digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" result = "" if number < 0: raise ValueError("number must be a positive integer") while number > 0: number, remainder = divmod(number, base) result = digits[remainder] + result if result == "": result = "0" return result def sum_of_digits(num: int, base: int) -> str: """ Calculate the sum of digit values in a positive integer converted to the given 'base'. Where 'base' ranges from 2 to 36. Examples: >>> sum_of_digits(103, 12) '13' >>> sum_of_digits(1275, 4) '30' >>> sum_of_digits(6645, 2) '1001' >>> # bases below 2 and beyond 36 will error >>> sum_of_digits(543, 1) Traceback (most recent call last): ... ValueError: 'base' must be between 2 and 36 inclusive >>> sum_of_digits(543, 37) Traceback (most recent call last): ... ValueError: 'base' must be between 2 and 36 inclusive """ if base < 2 or base > 36: raise ValueError("'base' must be between 2 and 36 inclusive") num_str = int_to_base(num, base) res = sum(int(char, base) for char in num_str) res_str = int_to_base(res, base) return res_str def harshad_numbers_in_base(limit: int, base: int) -> list[str]: """ Finds all Harshad numbers smaller than num in base 'base'. Where 'base' ranges from 2 to 36. Examples: >>> harshad_numbers_in_base(15, 2) ['1', '10', '100', '110', '1000', '1010', '1100'] >>> harshad_numbers_in_base(12, 34) ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B'] >>> harshad_numbers_in_base(12, 4) ['1', '2', '3', '10', '12', '20', '21'] >>> # bases below 2 and beyond 36 will error >>> harshad_numbers_in_base(234, 37) Traceback (most recent call last): ... ValueError: 'base' must be between 2 and 36 inclusive >>> harshad_numbers_in_base(234, 1) Traceback (most recent call last): ... ValueError: 'base' must be between 2 and 36 inclusive >>> harshad_numbers_in_base(-12, 6) [] """ if base < 2 or base > 36: raise ValueError("'base' must be between 2 and 36 inclusive") if limit < 0: return [] numbers = [ int_to_base(i, base) for i in range(1, limit) if i % int(sum_of_digits(i, base), base) == 0 ] return numbers def is_harshad_number_in_base(num: int, base: int) -> bool: """ Determines whether n in base 'base' is a harshad number. Where 'base' ranges from 2 to 36. Examples: >>> is_harshad_number_in_base(18, 10) True >>> is_harshad_number_in_base(21, 10) True >>> is_harshad_number_in_base(-21, 5) False >>> # bases below 2 and beyond 36 will error >>> is_harshad_number_in_base(45, 37) Traceback (most recent call last): ... ValueError: 'base' must be between 2 and 36 inclusive >>> is_harshad_number_in_base(45, 1) Traceback (most recent call last): ... ValueError: 'base' must be between 2 and 36 inclusive """ if base < 2 or base > 36: raise ValueError("'base' must be between 2 and 36 inclusive") if num < 0: return False n = int_to_base(num, base) d = sum_of_digits(num, base) return int(n, base) % int(d, base) == 0 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/special_numbers/hexagonal_number.py ================================================ """ == Hexagonal Number == The nth hexagonal number hn is the number of distinct dots in a pattern of dots consisting of the outlines of regular hexagons with sides up to n dots, when the hexagons are overlaid so that they share one vertex. https://en.wikipedia.org/wiki/Hexagonal_number """ # Author : Akshay Dubey (https://github.com/itsAkshayDubey) def hexagonal(number: int) -> int: """ :param number: nth hexagonal number to calculate :return: the nth hexagonal number Note: A hexagonal number is only defined for positive integers >>> hexagonal(4) 28 >>> hexagonal(11) 231 >>> hexagonal(22) 946 >>> hexagonal(0) Traceback (most recent call last): ... ValueError: Input must be a positive integer >>> hexagonal(-1) Traceback (most recent call last): ... ValueError: Input must be a positive integer >>> hexagonal(11.0) Traceback (most recent call last): ... TypeError: Input value of [number=11.0] must be an integer """ if not isinstance(number, int): msg = f"Input value of [number={number}] must be an integer" raise TypeError(msg) if number < 1: raise ValueError("Input must be a positive integer") return number * (2 * number - 1) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/special_numbers/krishnamurthy_number.py ================================================ """ == Krishnamurthy Number == It is also known as Peterson Number A Krishnamurthy Number is a number whose sum of the factorial of the digits equals to the original number itself. For example: 145 = 1! + 4! + 5! So, 145 is a Krishnamurthy Number """ def factorial(digit: int) -> int: """ >>> factorial(3) 6 >>> factorial(0) 1 >>> factorial(5) 120 """ return 1 if digit in (0, 1) else (digit * factorial(digit - 1)) def krishnamurthy(number: int) -> bool: """ >>> krishnamurthy(145) True >>> krishnamurthy(240) False >>> krishnamurthy(1) True """ fact_sum = 0 duplicate = number while duplicate > 0: duplicate, digit = divmod(duplicate, 10) fact_sum += factorial(digit) return fact_sum == number if __name__ == "__main__": print("Program to check whether a number is a Krisnamurthy Number or not.") number = int(input("Enter number: ").strip()) print( f"{number} is {'' if krishnamurthy(number) else 'not '}a Krishnamurthy Number." ) ================================================ FILE: maths/special_numbers/perfect_number.py ================================================ """ == Perfect Number == In number theory, a perfect number is a positive integer that is equal to the sum of its positive divisors, excluding the number itself. For example: 6 ==> divisors[1, 2, 3, 6] Excluding 6, the sum(divisors) is 1 + 2 + 3 = 6 So, 6 is a Perfect Number Other examples of Perfect Numbers: 28, 486, ... https://en.wikipedia.org/wiki/Perfect_number """ def perfect(number: int) -> bool: """ Check if a number is a perfect number. A perfect number is a positive integer that is equal to the sum of its proper divisors (excluding itself). Args: number: The number to be checked. Returns: True if the number is a perfect number, False otherwise. Start from 1 because dividing by 0 will raise ZeroDivisionError. A number at most can be divisible by the half of the number except the number itself. For example, 6 is at most can be divisible by 3 except by 6 itself. Examples: >>> perfect(27) False >>> perfect(28) True >>> perfect(29) False >>> perfect(6) True >>> perfect(12) False >>> perfect(496) True >>> perfect(8128) True >>> perfect(0) False >>> perfect(-1) False >>> perfect(12.34) Traceback (most recent call last): ... ValueError: number must be an integer >>> perfect("Hello") Traceback (most recent call last): ... ValueError: number must be an integer """ if not isinstance(number, int): raise ValueError("number must be an integer") if number <= 0: return False return sum(i for i in range(1, number // 2 + 1) if number % i == 0) == number if __name__ == "__main__": from doctest import testmod testmod() print("Program to check whether a number is a Perfect number or not...") try: number = int(input("Enter a positive integer: ").strip()) except ValueError: msg = "number must be an integer" print(msg) raise ValueError(msg) print(f"{number} is {'' if perfect(number) else 'not '}a Perfect Number.") ================================================ FILE: maths/special_numbers/polygonal_numbers.py ================================================ def polygonal_num(num: int, sides: int) -> int: """ Returns the `num`th `sides`-gonal number. It is assumed that `num` >= 0 and `sides` >= 3 (see for reference https://en.wikipedia.org/wiki/Polygonal_number). >>> polygonal_num(0, 3) 0 >>> polygonal_num(3, 3) 6 >>> polygonal_num(5, 4) 25 >>> polygonal_num(2, 5) 5 >>> polygonal_num(-1, 0) Traceback (most recent call last): ... ValueError: Invalid input: num must be >= 0 and sides must be >= 3. >>> polygonal_num(0, 2) Traceback (most recent call last): ... ValueError: Invalid input: num must be >= 0 and sides must be >= 3. """ if num < 0 or sides < 3: raise ValueError("Invalid input: num must be >= 0 and sides must be >= 3.") return ((sides - 2) * num**2 - (sides - 4) * num) // 2 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/special_numbers/pronic_number.py ================================================ """ == Pronic Number == A number n is said to be a Proic number if there exists an integer m such that n = m * (m + 1) Examples of Proic Numbers: 0, 2, 6, 12, 20, 30, 42, 56, 72, 90, 110 ... https://en.wikipedia.org/wiki/Pronic_number """ # Author : Akshay Dubey (https://github.com/itsAkshayDubey) def is_pronic(number: int) -> bool: """ # doctest: +NORMALIZE_WHITESPACE This functions takes an integer number as input. returns True if the number is pronic. >>> is_pronic(-1) False >>> is_pronic(0) True >>> is_pronic(2) True >>> is_pronic(5) False >>> is_pronic(6) True >>> is_pronic(8) False >>> is_pronic(30) True >>> is_pronic(32) False >>> is_pronic(2147441940) True >>> is_pronic(9223372033963249500) True >>> is_pronic(6.0) Traceback (most recent call last): ... TypeError: Input value of [number=6.0] must be an integer """ if not isinstance(number, int): msg = f"Input value of [number={number}] must be an integer" raise TypeError(msg) if number < 0 or number % 2 == 1: return False number_sqrt = int(number**0.5) return number == number_sqrt * (number_sqrt + 1) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/special_numbers/proth_number.py ================================================ """ Calculate the nth Proth number Source: https://handwiki.org/wiki/Proth_number """ import math def proth(number: int) -> int: """ :param number: nth number to calculate in the sequence :return: the nth number in Proth number Note: indexing starts at 1 i.e. proth(1) gives the first Proth number of 3 >>> proth(6) 25 >>> proth(0) Traceback (most recent call last): ... ValueError: Input value of [number=0] must be > 0 >>> proth(-1) Traceback (most recent call last): ... ValueError: Input value of [number=-1] must be > 0 >>> proth(6.0) Traceback (most recent call last): ... TypeError: Input value of [number=6.0] must be an integer """ if not isinstance(number, int): msg = f"Input value of [number={number}] must be an integer" raise TypeError(msg) if number < 1: msg = f"Input value of [number={number}] must be > 0" raise ValueError(msg) elif number == 1: return 3 elif number == 2: return 5 else: """ +1 for binary starting at 0 i.e. 2^0, 2^1, etc. +1 to start the sequence at the 3rd Proth number Hence, we have a +2 in the below statement """ block_index = int(math.log(number // 3, 2)) + 2 proth_list = [3, 5] proth_index = 2 increment = 3 for block in range(1, block_index): for _ in range(increment): proth_list.append(2 ** (block + 1) + proth_list[proth_index - 1]) proth_index += 1 increment *= 2 return proth_list[number - 1] def is_proth_number(number: int) -> bool: """ :param number: positive integer number :return: true if number is a Proth number, false otherwise >>> is_proth_number(1) False >>> is_proth_number(2) False >>> is_proth_number(3) True >>> is_proth_number(4) False >>> is_proth_number(5) True >>> is_proth_number(34) False >>> is_proth_number(-1) Traceback (most recent call last): ... ValueError: Input value of [number=-1] must be > 0 >>> is_proth_number(6.0) Traceback (most recent call last): ... TypeError: Input value of [number=6.0] must be an integer """ if not isinstance(number, int): message = f"Input value of [{number=}] must be an integer" raise TypeError(message) if number <= 0: message = f"Input value of [{number=}] must be > 0" raise ValueError(message) if number == 1: return False number -= 1 n = 0 while number % 2 == 0: n += 1 number //= 2 return number < 2**n if __name__ == "__main__": import doctest doctest.testmod() for number in range(11): value = 0 try: value = proth(number) except ValueError: print(f"ValueError: there is no {number}th Proth number") continue print(f"The {number}th Proth number: {value}") for number in [1, 2, 3, 4, 5, 9, 13, 49, 57, 193, 241, 163, 201]: if is_proth_number(number): print(f"{number} is a Proth number") else: print(f"{number} is not a Proth number") ================================================ FILE: maths/special_numbers/triangular_numbers.py ================================================ """ A triangular number or triangle number counts objects arranged in an equilateral triangle. This module provides a function to generate n'th triangular number. For more information about triangular numbers, refer to: https://en.wikipedia.org/wiki/Triangular_number """ def triangular_number(position: int) -> int: """ Generate the triangular number at the specified position. Args: position (int): The position of the triangular number to generate. Returns: int: The triangular number at the specified position. Raises: ValueError: If `position` is negative. Examples: >>> triangular_number(1) 1 >>> triangular_number(3) 6 >>> triangular_number(-1) Traceback (most recent call last): ... ValueError: param `position` must be non-negative """ if position < 0: raise ValueError("param `position` must be non-negative") return position * (position + 1) // 2 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/special_numbers/ugly_numbers.py ================================================ """ Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, … shows the first 11 ugly numbers. By convention, 1 is included. Given an integer n, we have to find the nth ugly number. For more details, refer this article https://www.geeksforgeeks.org/ugly-numbers/ """ def ugly_numbers(n: int) -> int: """ Returns the nth ugly number. >>> ugly_numbers(100) 1536 >>> ugly_numbers(0) 1 >>> ugly_numbers(20) 36 >>> ugly_numbers(-5) 1 >>> ugly_numbers(-5.5) Traceback (most recent call last): ... TypeError: 'float' object cannot be interpreted as an integer """ ugly_nums = [1] i2, i3, i5 = 0, 0, 0 next_2 = ugly_nums[i2] * 2 next_3 = ugly_nums[i3] * 3 next_5 = ugly_nums[i5] * 5 for _ in range(1, n): next_num = min(next_2, next_3, next_5) ugly_nums.append(next_num) if next_num == next_2: i2 += 1 next_2 = ugly_nums[i2] * 2 if next_num == next_3: i3 += 1 next_3 = ugly_nums[i3] * 3 if next_num == next_5: i5 += 1 next_5 = ugly_nums[i5] * 5 return ugly_nums[-1] if __name__ == "__main__": from doctest import testmod testmod(verbose=True) print(f"{ugly_numbers(200) = }") ================================================ FILE: maths/special_numbers/weird_number.py ================================================ """ https://en.wikipedia.org/wiki/Weird_number Fun fact: The set of weird numbers has positive asymptotic density. """ from math import sqrt def factors(number: int) -> list[int]: """ >>> factors(12) [1, 2, 3, 4, 6] >>> factors(1) [1] >>> factors(100) [1, 2, 4, 5, 10, 20, 25, 50] # >>> factors(-12) # [1, 2, 3, 4, 6] """ values = [1] for i in range(2, int(sqrt(number)) + 1, 1): if number % i == 0: values.append(i) if int(number // i) != i: values.append(int(number // i)) return sorted(values) def abundant(n: int) -> bool: """ >>> abundant(0) True >>> abundant(1) False >>> abundant(12) True >>> abundant(13) False >>> abundant(20) True # >>> abundant(-12) # True """ return sum(factors(n)) > n def semi_perfect(number: int) -> bool: """ >>> semi_perfect(0) True >>> semi_perfect(1) True >>> semi_perfect(12) True >>> semi_perfect(13) False # >>> semi_perfect(-12) # True """ values = factors(number) r = len(values) subset = [[0 for i in range(number + 1)] for j in range(r + 1)] for i in range(r + 1): subset[i][0] = True for i in range(1, number + 1): subset[0][i] = False for i in range(1, r + 1): for j in range(1, number + 1): if j < values[i - 1]: subset[i][j] = subset[i - 1][j] else: subset[i][j] = subset[i - 1][j] or subset[i - 1][j - values[i - 1]] return subset[r][number] != 0 def weird(number: int) -> bool: """ >>> weird(0) False >>> weird(70) True >>> weird(77) False """ return abundant(number) and not semi_perfect(number) if __name__ == "__main__": import doctest doctest.testmod(verbose=True) for number in (69, 70, 71): print(f"{number} is {'' if weird(number) else 'not '}weird.") ================================================ FILE: maths/sum_of_arithmetic_series.py ================================================ # DarkCoder def sum_of_series(first_term: int, common_diff: int, num_of_terms: int) -> float: """ Find the sum of n terms in an arithmetic progression. >>> sum_of_series(1, 1, 10) 55.0 >>> sum_of_series(1, 10, 100) 49600.0 """ total = (num_of_terms / 2) * (2 * first_term + (num_of_terms - 1) * common_diff) # formula for sum of series return total def main(): print(sum_of_series(1, 1, 10)) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/sum_of_digits.py ================================================ def sum_of_digits(n: int) -> int: """ Find the sum of digits of a number. >>> sum_of_digits(12345) 15 >>> sum_of_digits(123) 6 >>> sum_of_digits(-123) 6 >>> sum_of_digits(0) 0 """ n = abs(n) res = 0 while n > 0: res += n % 10 n //= 10 return res def sum_of_digits_recursion(n: int) -> int: """ Find the sum of digits of a number using recursion >>> sum_of_digits_recursion(12345) 15 >>> sum_of_digits_recursion(123) 6 >>> sum_of_digits_recursion(-123) 6 >>> sum_of_digits_recursion(0) 0 """ n = abs(n) return n if n < 10 else n % 10 + sum_of_digits(n // 10) def sum_of_digits_compact(n: int) -> int: """ Find the sum of digits of a number >>> sum_of_digits_compact(12345) 15 >>> sum_of_digits_compact(123) 6 >>> sum_of_digits_compact(-123) 6 >>> sum_of_digits_compact(0) 0 """ return sum(int(c) for c in str(abs(n))) def benchmark() -> None: """ Benchmark multiple functions, with three different length int values. """ from collections.abc import Callable from timeit import timeit def benchmark_a_function(func: Callable, value: int) -> None: call = f"{func.__name__}({value})" timing = timeit(f"__main__.{call}", setup="import __main__") print(f"{call:56} = {func(value)} -- {timing:.4f} seconds") for value in (262144, 1125899906842624, 1267650600228229401496703205376): for func in (sum_of_digits, sum_of_digits_recursion, sum_of_digits_compact): benchmark_a_function(func, value) print() if __name__ == "__main__": import doctest doctest.testmod() benchmark() ================================================ FILE: maths/sum_of_geometric_progression.py ================================================ def sum_of_geometric_progression( first_term: int, common_ratio: int, num_of_terms: int ) -> float: """ " Return the sum of n terms in a geometric progression. >>> sum_of_geometric_progression(1, 2, 10) 1023.0 >>> sum_of_geometric_progression(1, 10, 5) 11111.0 >>> sum_of_geometric_progression(0, 2, 10) 0.0 >>> sum_of_geometric_progression(1, 0, 10) 1.0 >>> sum_of_geometric_progression(1, 2, 0) -0.0 >>> sum_of_geometric_progression(-1, 2, 10) -1023.0 >>> sum_of_geometric_progression(1, -2, 10) -341.0 >>> sum_of_geometric_progression(1, 2, -10) -0.9990234375 """ if common_ratio == 1: # Formula for sum if common ratio is 1 return num_of_terms * first_term # Formula for finding sum of n terms of a GeometricProgression return (first_term / (1 - common_ratio)) * (1 - common_ratio**num_of_terms) ================================================ FILE: maths/sum_of_harmonic_series.py ================================================ def sum_of_harmonic_progression( first_term: float, common_difference: float, number_of_terms: int ) -> float: """ https://en.wikipedia.org/wiki/Harmonic_progression_(mathematics) Find the sum of n terms in an harmonic progression. The calculation starts with the first_term and loops adding the common difference of Arithmetic Progression by which the given Harmonic Progression is linked. >>> sum_of_harmonic_progression(1 / 2, 2, 2) 0.75 >>> sum_of_harmonic_progression(1 / 5, 5, 5) 0.45666666666666667 """ arithmetic_progression = [1 / first_term] first_term = 1 / first_term for _ in range(number_of_terms - 1): first_term += common_difference arithmetic_progression.append(first_term) harmonic_series = [1 / step for step in arithmetic_progression] return sum(harmonic_series) if __name__ == "__main__": import doctest doctest.testmod() print(sum_of_harmonic_progression(1 / 2, 2, 2)) ================================================ FILE: maths/sumset.py ================================================ """ Calculates the SumSet of two sets of numbers (A and B) Source: https://en.wikipedia.org/wiki/Sumset """ def sumset(set_a: set, set_b: set) -> set: """ :param first set: a set of numbers :param second set: a set of numbers :return: the nth number in Sylvester's sequence >>> sumset({1, 2, 3}, {4, 5, 6}) {5, 6, 7, 8, 9} >>> sumset({1, 2, 3}, {4, 5, 6, 7}) {5, 6, 7, 8, 9, 10} >>> sumset({1, 2, 3, 4}, 3) Traceback (most recent call last): ... AssertionError: The input value of [set_b=3] is not a set """ assert isinstance(set_a, set), f"The input value of [set_a={set_a}] is not a set" assert isinstance(set_b, set), f"The input value of [set_b={set_b}] is not a set" return {a + b for a in set_a for b in set_b} if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: maths/sylvester_sequence.py ================================================ """ Calculates the nth number in Sylvester's sequence Source: https://en.wikipedia.org/wiki/Sylvester%27s_sequence """ def sylvester(number: int) -> int: """ :param number: nth number to calculate in the sequence :return: the nth number in Sylvester's sequence >>> sylvester(8) 113423713055421844361000443 >>> sylvester(-1) Traceback (most recent call last): ... ValueError: The input value of [n=-1] has to be > 0 >>> sylvester(8.0) Traceback (most recent call last): ... AssertionError: The input value of [n=8.0] is not an integer """ assert isinstance(number, int), f"The input value of [n={number}] is not an integer" if number == 1: return 2 elif number < 1: msg = f"The input value of [n={number}] has to be > 0" raise ValueError(msg) else: num = sylvester(number - 1) lower = num - 1 upper = num return lower * upper + 1 if __name__ == "__main__": print(f"The 8th number in Sylvester's sequence: {sylvester(8)}") ================================================ FILE: maths/tanh.py ================================================ """ This script demonstrates the implementation of the tangent hyperbolic or tanh function. The function takes a vector of K real numbers as input and then (e^x - e^(-x))/(e^x + e^(-x)). After through tanh, the element of the vector mostly -1 between 1. Script inspired from its corresponding Wikipedia article https://en.wikipedia.org/wiki/Activation_function """ import numpy as np def tangent_hyperbolic(vector: np.ndarray) -> np.ndarray: """ Implements the tanh function Parameters: vector: np.ndarray Returns: tanh (np.array): The input numpy array after applying tanh. mathematically (e^x - e^(-x))/(e^x + e^(-x)) can be written as (2/(1+e^(-2x))-1 Examples: >>> tangent_hyperbolic(np.array([1,5,6,-0.67])) array([ 0.76159416, 0.9999092 , 0.99998771, -0.58497988]) >>> tangent_hyperbolic(np.array([8,10,2,-0.98,13])) array([ 0.99999977, 1. , 0.96402758, -0.7530659 , 1. ]) """ return (2 / (1 + np.exp(-2 * vector))) - 1 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/test_factorial.py ================================================ # /// script # requires-python = ">=3.13" # dependencies = [ # "pytest", # ] # /// import pytest from maths.factorial import factorial, factorial_recursive @pytest.mark.parametrize("function", [factorial, factorial_recursive]) def test_zero(function): assert function(0) == 1 @pytest.mark.parametrize("function", [factorial, factorial_recursive]) def test_positive_integers(function): assert function(1) == 1 assert function(5) == 120 assert function(7) == 5040 @pytest.mark.parametrize("function", [factorial, factorial_recursive]) def test_large_number(function): assert function(10) == 3628800 @pytest.mark.parametrize("function", [factorial, factorial_recursive]) def test_negative_number(function): with pytest.raises(ValueError): function(-3) @pytest.mark.parametrize("function", [factorial, factorial_recursive]) def test_float_number(function): with pytest.raises(ValueError): function(1.5) if __name__ == "__main__": pytest.main(["-v", __file__]) ================================================ FILE: maths/test_prime_check.py ================================================ """ Minimalist file that allows pytest to find and run the Test unittest. For details, see: https://doc.pytest.org/en/latest/goodpractices.html#conventions-for-python-test-discovery """ from .prime_check import Test Test() ================================================ FILE: maths/three_sum.py ================================================ """ https://en.wikipedia.org/wiki/3SUM """ def three_sum(nums: list[int]) -> list[list[int]]: """ Find all unique triplets in a sorted array of integers that sum up to zero. Args: nums: A sorted list of integers. Returns: A list of lists containing unique triplets that sum up to zero. >>> three_sum([-1, 0, 1, 2, -1, -4]) [[-1, -1, 2], [-1, 0, 1]] >>> three_sum([1, 2, 3, 4]) [] """ nums.sort() ans = [] for i in range(len(nums) - 2): if i == 0 or (nums[i] != nums[i - 1]): low, high, c = i + 1, len(nums) - 1, 0 - nums[i] while low < high: if nums[low] + nums[high] == c: ans.append([nums[i], nums[low], nums[high]]) while low < high and nums[low] == nums[low + 1]: low += 1 while low < high and nums[high] == nums[high - 1]: high -= 1 low += 1 high -= 1 elif nums[low] + nums[high] < c: low += 1 else: high -= 1 return ans if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/trapezoidal_rule.py ================================================ """ Numerical integration or quadrature for a smooth function f with known values at x_i """ def trapezoidal_rule(boundary, steps): """ Implements the extended trapezoidal rule for numerical integration. The function f(x) is provided below. :param boundary: List containing the lower and upper bounds of integration [a, b] :param steps: The number of steps (intervals) used in the approximation :return: The numerical approximation of the integral >>> abs(trapezoidal_rule([0, 1], 10) - 0.33333) < 0.01 True >>> abs(trapezoidal_rule([0, 1], 100) - 0.33333) < 0.01 True >>> abs(trapezoidal_rule([0, 2], 1000) - 2.66667) < 0.01 True >>> abs(trapezoidal_rule([1, 2], 1000) - 2.33333) < 0.01 True """ h = (boundary[1] - boundary[0]) / steps a = boundary[0] b = boundary[1] x_i = make_points(a, b, h) y = 0.0 y += (h / 2.0) * f(a) for i in x_i: y += h * f(i) y += (h / 2.0) * f(b) return y def make_points(a, b, h): """ Generates points between a and b with step size h for trapezoidal integration. :param a: The lower bound of integration :param b: The upper bound of integration :param h: The step size :yield: The next x-value in the range (a, b) >>> list(make_points(0, 1, 0.1)) # doctest: +NORMALIZE_WHITESPACE [0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, \ 0.8999999999999999] >>> list(make_points(0, 10, 2.5)) [2.5, 5.0, 7.5] >>> list(make_points(0, 10, 2)) [2, 4, 6, 8] >>> list(make_points(1, 21, 5)) [6, 11, 16] >>> list(make_points(1, 5, 2)) [3] >>> list(make_points(1, 4, 3)) [] """ x = a + h while x <= (b - h): yield x x += h def f(x): """ This is the function to integrate, f(x) = (x - 0)^2 = x^2. :param x: The input value :return: The value of f(x) >>> f(0) 0 >>> f(1) 1 >>> f(0.5) 0.25 """ return x**2 def main(): """ Main function to test the trapezoidal rule. :a: Lower bound of integration :b: Upper bound of integration :steps: define number of steps or resolution :boundary: define boundary of integration >>> main() y = 0.3349999999999999 """ a = 0.0 b = 1.0 steps = 10.0 boundary = [a, b] y = trapezoidal_rule(boundary, steps) print(f"y = {y}") if __name__ == "__main__": import doctest doctest.testmod() main() ================================================ FILE: maths/triplet_sum.py ================================================ """ Given an array of integers and another integer target, we are required to find a triplet from the array such that it's sum is equal to the target. """ from __future__ import annotations from itertools import permutations from random import randint from timeit import repeat def make_dataset() -> tuple[list[int], int]: arr = [randint(-1000, 1000) for i in range(10)] r = randint(-5000, 5000) return (arr, r) dataset = make_dataset() def triplet_sum1(arr: list[int], target: int) -> tuple[int, ...]: """ Returns a triplet in the array with sum equal to target, else (0, 0, 0). >>> triplet_sum1([13, 29, 7, 23, 5], 35) (5, 7, 23) >>> triplet_sum1([37, 9, 19, 50, 44], 65) (9, 19, 37) >>> arr = [6, 47, 27, 1, 15] >>> target = 11 >>> triplet_sum1(arr, target) (0, 0, 0) """ for triplet in permutations(arr, 3): if sum(triplet) == target: return tuple(sorted(triplet)) return (0, 0, 0) def triplet_sum2(arr: list[int], target: int) -> tuple[int, int, int]: """ Returns a triplet in the array with sum equal to target, else (0, 0, 0). >>> triplet_sum2([13, 29, 7, 23, 5], 35) (5, 7, 23) >>> triplet_sum2([37, 9, 19, 50, 44], 65) (9, 19, 37) >>> arr = [6, 47, 27, 1, 15] >>> target = 11 >>> triplet_sum2(arr, target) (0, 0, 0) """ arr.sort() n = len(arr) for i in range(n - 1): left, right = i + 1, n - 1 while left < right: if arr[i] + arr[left] + arr[right] == target: return (arr[i], arr[left], arr[right]) elif arr[i] + arr[left] + arr[right] < target: left += 1 elif arr[i] + arr[left] + arr[right] > target: right -= 1 return (0, 0, 0) def solution_times() -> tuple[float, float]: setup_code = """ from __main__ import dataset, triplet_sum1, triplet_sum2 """ test_code1 = """ triplet_sum1(*dataset) """ test_code2 = """ triplet_sum2(*dataset) """ times1 = repeat(setup=setup_code, stmt=test_code1, repeat=5, number=10000) times2 = repeat(setup=setup_code, stmt=test_code2, repeat=5, number=10000) return (min(times1), min(times2)) if __name__ == "__main__": from doctest import testmod testmod() times = solution_times() print(f"The time for naive implementation is {times[0]}.") print(f"The time for optimized implementation is {times[1]}.") ================================================ FILE: maths/twin_prime.py ================================================ """ == Twin Prime == A number n+2 is said to be a Twin prime of number n if both n and n+2 are prime. Examples of Twin pairs: (3, 5), (5, 7), (11, 13), (17, 19), (29, 31), (41, 43), ... https://en.wikipedia.org/wiki/Twin_prime """ # Author : Akshay Dubey (https://github.com/itsAkshayDubey) from maths.prime_check import is_prime def twin_prime(number: int) -> int: """ # doctest: +NORMALIZE_WHITESPACE This functions takes an integer number as input. returns n+2 if n and n+2 are prime numbers and -1 otherwise. >>> twin_prime(3) 5 >>> twin_prime(4) -1 >>> twin_prime(5) 7 >>> twin_prime(17) 19 >>> twin_prime(0) -1 >>> twin_prime(6.0) Traceback (most recent call last): ... TypeError: Input value of [number=6.0] must be an integer """ if not isinstance(number, int): msg = f"Input value of [number={number}] must be an integer" raise TypeError(msg) if is_prime(number) and is_prime(number + 2): return number + 2 else: return -1 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: maths/two_pointer.py ================================================ """ Given a sorted array of integers, return indices of the two numbers such that they add up to a specific target using the two pointers technique. You may assume that each input would have exactly one solution, and you may not use the same element twice. This is an alternative solution of the two-sum problem, which uses a map to solve the problem. Hence can not solve the issue if there is a constraint not use the same index twice. [1] Example: Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1]. [1]: https://github.com/TheAlgorithms/Python/blob/master/other/two_sum.py """ from __future__ import annotations def two_pointer(nums: list[int], target: int) -> list[int]: """ >>> two_pointer([2, 7, 11, 15], 9) [0, 1] >>> two_pointer([2, 7, 11, 15], 17) [0, 3] >>> two_pointer([2, 7, 11, 15], 18) [1, 2] >>> two_pointer([2, 7, 11, 15], 26) [2, 3] >>> two_pointer([1, 3, 3], 6) [1, 2] >>> two_pointer([2, 7, 11, 15], 8) [] >>> two_pointer([3 * i for i in range(10)], 19) [] >>> two_pointer([1, 2, 3], 6) [] """ i = 0 j = len(nums) - 1 while i < j: if nums[i] + nums[j] == target: return [i, j] elif nums[i] + nums[j] < target: i = i + 1 else: j = j - 1 return [] if __name__ == "__main__": import doctest doctest.testmod() print(f"{two_pointer([2, 7, 11, 15], 9) = }") ================================================ FILE: maths/two_sum.py ================================================ """ Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the same element twice. Example: Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1]. """ from __future__ import annotations def two_sum(nums: list[int], target: int) -> list[int]: """ >>> two_sum([2, 7, 11, 15], 9) [0, 1] >>> two_sum([15, 2, 11, 7], 13) [1, 2] >>> two_sum([2, 7, 11, 15], 17) [0, 3] >>> two_sum([7, 15, 11, 2], 18) [0, 2] >>> two_sum([2, 7, 11, 15], 26) [2, 3] >>> two_sum([2, 7, 11, 15], 8) [] >>> two_sum([3 * i for i in range(10)], 19) [] """ chk_map: dict[int, int] = {} for index, val in enumerate(nums): compl = target - val if compl in chk_map: return [chk_map[compl], index] chk_map[val] = index return [] if __name__ == "__main__": import doctest doctest.testmod() print(f"{two_sum([2, 7, 11, 15], 9) = }") ================================================ FILE: maths/volume.py ================================================ """ Find the volume of various shapes. * https://en.wikipedia.org/wiki/Volume * https://en.wikipedia.org/wiki/Spherical_cap """ from __future__ import annotations from math import pi, pow # noqa: A004 def vol_cube(side_length: float) -> float: """ Calculate the Volume of a Cube. >>> vol_cube(1) 1.0 >>> vol_cube(3) 27.0 >>> vol_cube(0) 0.0 >>> vol_cube(1.6) 4.096000000000001 >>> vol_cube(-1) Traceback (most recent call last): ... ValueError: vol_cube() only accepts non-negative values """ if side_length < 0: raise ValueError("vol_cube() only accepts non-negative values") return pow(side_length, 3) def vol_spherical_cap(height: float, radius: float) -> float: """ Calculate the volume of the spherical cap. >>> vol_spherical_cap(1, 2) 5.235987755982988 >>> vol_spherical_cap(1.6, 2.6) 16.621119532592402 >>> vol_spherical_cap(0, 0) 0.0 >>> vol_spherical_cap(-1, 2) Traceback (most recent call last): ... ValueError: vol_spherical_cap() only accepts non-negative values >>> vol_spherical_cap(1, -2) Traceback (most recent call last): ... ValueError: vol_spherical_cap() only accepts non-negative values """ if height < 0 or radius < 0: raise ValueError("vol_spherical_cap() only accepts non-negative values") # Volume is 1/3 pi * height squared * (3 * radius - height) return 1 / 3 * pi * pow(height, 2) * (3 * radius - height) def vol_spheres_intersect( radius_1: float, radius_2: float, centers_distance: float ) -> float: r""" Calculate the volume of the intersection of two spheres. The intersection is composed by two spherical caps and therefore its volume is the sum of the volumes of the spherical caps. First, it calculates the heights :math:`(h_1, h_2)` of the spherical caps, then the two volumes and it returns the sum. The height formulas are .. math:: h_1 = \frac{(radius_1 - radius_2 + centers\_distance) \cdot (radius_1 + radius_2 - centers\_distance)} {2 \cdot centers\_distance} h_2 = \frac{(radius_2 - radius_1 + centers\_distance) \cdot (radius_2 + radius_1 - centers\_distance)} {2 \cdot centers\_distance} if `centers_distance` is 0 then it returns the volume of the smallers sphere :return: ``vol_spherical_cap`` (:math:`h_1`, :math:`radius_2`) + ``vol_spherical_cap`` (:math:`h_2`, :math:`radius_1`) >>> vol_spheres_intersect(2, 2, 1) 21.205750411731103 >>> vol_spheres_intersect(2.6, 2.6, 1.6) 40.71504079052372 >>> vol_spheres_intersect(0, 0, 0) 0.0 >>> vol_spheres_intersect(-2, 2, 1) Traceback (most recent call last): ... ValueError: vol_spheres_intersect() only accepts non-negative values >>> vol_spheres_intersect(2, -2, 1) Traceback (most recent call last): ... ValueError: vol_spheres_intersect() only accepts non-negative values >>> vol_spheres_intersect(2, 2, -1) Traceback (most recent call last): ... ValueError: vol_spheres_intersect() only accepts non-negative values """ if radius_1 < 0 or radius_2 < 0 or centers_distance < 0: raise ValueError("vol_spheres_intersect() only accepts non-negative values") if centers_distance == 0: return vol_sphere(min(radius_1, radius_2)) h1 = ( (radius_1 - radius_2 + centers_distance) * (radius_1 + radius_2 - centers_distance) / (2 * centers_distance) ) h2 = ( (radius_2 - radius_1 + centers_distance) * (radius_2 + radius_1 - centers_distance) / (2 * centers_distance) ) return vol_spherical_cap(h1, radius_2) + vol_spherical_cap(h2, radius_1) def vol_spheres_union( radius_1: float, radius_2: float, centers_distance: float ) -> float: r""" Calculate the volume of the union of two spheres that possibly intersect. It is the sum of sphere :math:`A` and sphere :math:`B` minus their intersection. First, it calculates the volumes :math:`(v_1, v_2)` of the spheres, then the volume of the intersection :math:`i` and it returns the sum :math:`v_1 + v_2 - i`. If `centers_distance` is 0 then it returns the volume of the larger sphere :return: ``vol_sphere`` (:math:`radius_1`) + ``vol_sphere`` (:math:`radius_2`) - ``vol_spheres_intersect`` (:math:`radius_1`, :math:`radius_2`, :math:`centers\_distance`) >>> vol_spheres_union(2, 2, 1) 45.814892864851146 >>> vol_spheres_union(1.56, 2.2, 1.4) 48.77802773671288 >>> vol_spheres_union(0, 2, 1) Traceback (most recent call last): ... ValueError: vol_spheres_union() only accepts non-negative values, non-zero radius >>> vol_spheres_union('1.56', '2.2', '1.4') Traceback (most recent call last): ... TypeError: '<=' not supported between instances of 'str' and 'int' >>> vol_spheres_union(1, None, 1) Traceback (most recent call last): ... TypeError: '<=' not supported between instances of 'NoneType' and 'int' """ if radius_1 <= 0 or radius_2 <= 0 or centers_distance < 0: raise ValueError( "vol_spheres_union() only accepts non-negative values, non-zero radius" ) if centers_distance == 0: return vol_sphere(max(radius_1, radius_2)) return ( vol_sphere(radius_1) + vol_sphere(radius_2) - vol_spheres_intersect(radius_1, radius_2, centers_distance) ) def vol_cuboid(width: float, height: float, length: float) -> float: """ Calculate the Volume of a Cuboid. :return: multiple of `width`, `length` and `height` >>> vol_cuboid(1, 1, 1) 1.0 >>> vol_cuboid(1, 2, 3) 6.0 >>> vol_cuboid(1.6, 2.6, 3.6) 14.976 >>> vol_cuboid(0, 0, 0) 0.0 >>> vol_cuboid(-1, 2, 3) Traceback (most recent call last): ... ValueError: vol_cuboid() only accepts non-negative values >>> vol_cuboid(1, -2, 3) Traceback (most recent call last): ... ValueError: vol_cuboid() only accepts non-negative values >>> vol_cuboid(1, 2, -3) Traceback (most recent call last): ... ValueError: vol_cuboid() only accepts non-negative values """ if width < 0 or height < 0 or length < 0: raise ValueError("vol_cuboid() only accepts non-negative values") return float(width * height * length) def vol_cone(area_of_base: float, height: float) -> float: r""" | Calculate the Volume of a Cone. | Wikipedia reference: https://en.wikipedia.org/wiki/Cone :return: :math:`\frac{1}{3} \cdot area\_of\_base \cdot height` >>> vol_cone(10, 3) 10.0 >>> vol_cone(1, 1) 0.3333333333333333 >>> vol_cone(1.6, 1.6) 0.8533333333333335 >>> vol_cone(0, 0) 0.0 >>> vol_cone(-1, 1) Traceback (most recent call last): ... ValueError: vol_cone() only accepts non-negative values >>> vol_cone(1, -1) Traceback (most recent call last): ... ValueError: vol_cone() only accepts non-negative values """ if height < 0 or area_of_base < 0: raise ValueError("vol_cone() only accepts non-negative values") return area_of_base * height / 3.0 def vol_right_circ_cone(radius: float, height: float) -> float: r""" | Calculate the Volume of a Right Circular Cone. | Wikipedia reference: https://en.wikipedia.org/wiki/Cone :return: :math:`\frac{1}{3} \cdot \pi \cdot radius^2 \cdot height` >>> vol_right_circ_cone(2, 3) 12.566370614359172 >>> vol_right_circ_cone(0, 0) 0.0 >>> vol_right_circ_cone(1.6, 1.6) 4.289321169701265 >>> vol_right_circ_cone(-1, 1) Traceback (most recent call last): ... ValueError: vol_right_circ_cone() only accepts non-negative values >>> vol_right_circ_cone(1, -1) Traceback (most recent call last): ... ValueError: vol_right_circ_cone() only accepts non-negative values """ if height < 0 or radius < 0: raise ValueError("vol_right_circ_cone() only accepts non-negative values") return pi * pow(radius, 2) * height / 3.0 def vol_prism(area_of_base: float, height: float) -> float: r""" | Calculate the Volume of a Prism. | Wikipedia reference: https://en.wikipedia.org/wiki/Prism_(geometry) :return: :math:`V = B \cdot h` >>> vol_prism(10, 2) 20.0 >>> vol_prism(11, 1) 11.0 >>> vol_prism(1.6, 1.6) 2.5600000000000005 >>> vol_prism(0, 0) 0.0 >>> vol_prism(-1, 1) Traceback (most recent call last): ... ValueError: vol_prism() only accepts non-negative values >>> vol_prism(1, -1) Traceback (most recent call last): ... ValueError: vol_prism() only accepts non-negative values """ if height < 0 or area_of_base < 0: raise ValueError("vol_prism() only accepts non-negative values") return float(area_of_base * height) def vol_pyramid(area_of_base: float, height: float) -> float: r""" | Calculate the Volume of a Pyramid. | Wikipedia reference: https://en.wikipedia.org/wiki/Pyramid_(geometry) :return: :math:`\frac{1}{3} \cdot B \cdot h` >>> vol_pyramid(10, 3) 10.0 >>> vol_pyramid(1.5, 3) 1.5 >>> vol_pyramid(1.6, 1.6) 0.8533333333333335 >>> vol_pyramid(0, 0) 0.0 >>> vol_pyramid(-1, 1) Traceback (most recent call last): ... ValueError: vol_pyramid() only accepts non-negative values >>> vol_pyramid(1, -1) Traceback (most recent call last): ... ValueError: vol_pyramid() only accepts non-negative values """ if height < 0 or area_of_base < 0: raise ValueError("vol_pyramid() only accepts non-negative values") return area_of_base * height / 3.0 def vol_sphere(radius: float) -> float: r""" | Calculate the Volume of a Sphere. | Wikipedia reference: https://en.wikipedia.org/wiki/Sphere :return: :math:`\frac{4}{3} \cdot \pi \cdot r^3` >>> vol_sphere(5) 523.5987755982989 >>> vol_sphere(1) 4.1887902047863905 >>> vol_sphere(1.6) 17.15728467880506 >>> vol_sphere(0) 0.0 >>> vol_sphere(-1) Traceback (most recent call last): ... ValueError: vol_sphere() only accepts non-negative values """ if radius < 0: raise ValueError("vol_sphere() only accepts non-negative values") # Volume is 4/3 * pi * radius cubed return 4 / 3 * pi * pow(radius, 3) def vol_hemisphere(radius: float) -> float: r""" | Calculate the volume of a hemisphere | Wikipedia reference: https://en.wikipedia.org/wiki/Hemisphere | Other references: https://www.cuemath.com/geometry/hemisphere :return: :math:`\frac{2}{3} \cdot \pi \cdot radius^3` >>> vol_hemisphere(1) 2.0943951023931953 >>> vol_hemisphere(7) 718.377520120866 >>> vol_hemisphere(1.6) 8.57864233940253 >>> vol_hemisphere(0) 0.0 >>> vol_hemisphere(-1) Traceback (most recent call last): ... ValueError: vol_hemisphere() only accepts non-negative values """ if radius < 0: raise ValueError("vol_hemisphere() only accepts non-negative values") # Volume is radius cubed * pi * 2/3 return pow(radius, 3) * pi * 2 / 3 def vol_circular_cylinder(radius: float, height: float) -> float: r""" | Calculate the Volume of a Circular Cylinder. | Wikipedia reference: https://en.wikipedia.org/wiki/Cylinder :return: :math:`\pi \cdot radius^2 \cdot height` >>> vol_circular_cylinder(1, 1) 3.141592653589793 >>> vol_circular_cylinder(4, 3) 150.79644737231007 >>> vol_circular_cylinder(1.6, 1.6) 12.867963509103795 >>> vol_circular_cylinder(0, 0) 0.0 >>> vol_circular_cylinder(-1, 1) Traceback (most recent call last): ... ValueError: vol_circular_cylinder() only accepts non-negative values >>> vol_circular_cylinder(1, -1) Traceback (most recent call last): ... ValueError: vol_circular_cylinder() only accepts non-negative values """ if height < 0 or radius < 0: raise ValueError("vol_circular_cylinder() only accepts non-negative values") # Volume is radius squared * height * pi return pow(radius, 2) * height * pi def vol_hollow_circular_cylinder( inner_radius: float, outer_radius: float, height: float ) -> float: """ Calculate the Volume of a Hollow Circular Cylinder. >>> vol_hollow_circular_cylinder(1, 2, 3) 28.274333882308138 >>> vol_hollow_circular_cylinder(1.6, 2.6, 3.6) 47.50088092227767 >>> vol_hollow_circular_cylinder(-1, 2, 3) Traceback (most recent call last): ... ValueError: vol_hollow_circular_cylinder() only accepts non-negative values >>> vol_hollow_circular_cylinder(1, -2, 3) Traceback (most recent call last): ... ValueError: vol_hollow_circular_cylinder() only accepts non-negative values >>> vol_hollow_circular_cylinder(1, 2, -3) Traceback (most recent call last): ... ValueError: vol_hollow_circular_cylinder() only accepts non-negative values >>> vol_hollow_circular_cylinder(2, 1, 3) Traceback (most recent call last): ... ValueError: outer_radius must be greater than inner_radius >>> vol_hollow_circular_cylinder(0, 0, 0) Traceback (most recent call last): ... ValueError: outer_radius must be greater than inner_radius """ # Volume - (outer_radius squared - inner_radius squared) * pi * height if inner_radius < 0 or outer_radius < 0 or height < 0: raise ValueError( "vol_hollow_circular_cylinder() only accepts non-negative values" ) if outer_radius <= inner_radius: raise ValueError("outer_radius must be greater than inner_radius") return pi * (pow(outer_radius, 2) - pow(inner_radius, 2)) * height def vol_conical_frustum(height: float, radius_1: float, radius_2: float) -> float: """ | Calculate the Volume of a Conical Frustum. | Wikipedia reference: https://en.wikipedia.org/wiki/Frustum >>> vol_conical_frustum(45, 7, 28) 48490.482608158454 >>> vol_conical_frustum(1, 1, 2) 7.330382858376184 >>> vol_conical_frustum(1.6, 2.6, 3.6) 48.7240076620753 >>> vol_conical_frustum(0, 0, 0) 0.0 >>> vol_conical_frustum(-2, 2, 1) Traceback (most recent call last): ... ValueError: vol_conical_frustum() only accepts non-negative values >>> vol_conical_frustum(2, -2, 1) Traceback (most recent call last): ... ValueError: vol_conical_frustum() only accepts non-negative values >>> vol_conical_frustum(2, 2, -1) Traceback (most recent call last): ... ValueError: vol_conical_frustum() only accepts non-negative values """ # Volume is 1/3 * pi * height * # (radius_1 squared + radius_2 squared + radius_1 * radius_2) if radius_1 < 0 or radius_2 < 0 or height < 0: raise ValueError("vol_conical_frustum() only accepts non-negative values") return ( 1 / 3 * pi * height * (pow(radius_1, 2) + pow(radius_2, 2) + radius_1 * radius_2) ) def vol_torus(torus_radius: float, tube_radius: float) -> float: r""" | Calculate the Volume of a Torus. | Wikipedia reference: https://en.wikipedia.org/wiki/Torus :return: :math:`2 \pi^2 \cdot torus\_radius \cdot tube\_radius^2` >>> vol_torus(1, 1) 19.739208802178716 >>> vol_torus(4, 3) 710.6115168784338 >>> vol_torus(3, 4) 947.4820225045784 >>> vol_torus(1.6, 1.6) 80.85179925372404 >>> vol_torus(0, 0) 0.0 >>> vol_torus(-1, 1) Traceback (most recent call last): ... ValueError: vol_torus() only accepts non-negative values >>> vol_torus(1, -1) Traceback (most recent call last): ... ValueError: vol_torus() only accepts non-negative values """ if torus_radius < 0 or tube_radius < 0: raise ValueError("vol_torus() only accepts non-negative values") return 2 * pow(pi, 2) * torus_radius * pow(tube_radius, 2) def vol_icosahedron(tri_side: float) -> float: """ | Calculate the Volume of an Icosahedron. | Wikipedia reference: https://en.wikipedia.org/wiki/Regular_icosahedron >>> from math import isclose >>> isclose(vol_icosahedron(2.5), 34.088984228514256) True >>> isclose(vol_icosahedron(10), 2181.694990624912374) True >>> isclose(vol_icosahedron(5), 272.711873828114047) True >>> isclose(vol_icosahedron(3.49), 92.740688412033628) True >>> vol_icosahedron(0) 0.0 >>> vol_icosahedron(-1) Traceback (most recent call last): ... ValueError: vol_icosahedron() only accepts non-negative values >>> vol_icosahedron(-0.2) Traceback (most recent call last): ... ValueError: vol_icosahedron() only accepts non-negative values """ if tri_side < 0: raise ValueError("vol_icosahedron() only accepts non-negative values") return tri_side**3 * (3 + 5**0.5) * 5 / 12 def main(): """Print the Results of Various Volume Calculations.""" print("Volumes:") print(f"Cube: {vol_cube(2) = }") # = 8 print(f"Cuboid: {vol_cuboid(2, 2, 2) = }") # = 8 print(f"Cone: {vol_cone(2, 2) = }") # ~= 1.33 print(f"Right Circular Cone: {vol_right_circ_cone(2, 2) = }") # ~= 8.38 print(f"Prism: {vol_prism(2, 2) = }") # = 4 print(f"Pyramid: {vol_pyramid(2, 2) = }") # ~= 1.33 print(f"Sphere: {vol_sphere(2) = }") # ~= 33.5 print(f"Hemisphere: {vol_hemisphere(2) = }") # ~= 16.75 print(f"Circular Cylinder: {vol_circular_cylinder(2, 2) = }") # ~= 25.1 print(f"Torus: {vol_torus(2, 2) = }") # ~= 157.9 print(f"Conical Frustum: {vol_conical_frustum(2, 2, 4) = }") # ~= 58.6 print(f"Spherical cap: {vol_spherical_cap(1, 2) = }") # ~= 5.24 print(f"Spheres intersection: {vol_spheres_intersect(2, 2, 1) = }") # ~= 21.21 print(f"Spheres union: {vol_spheres_union(2, 2, 1) = }") # ~= 45.81 print( f"Hollow Circular Cylinder: {vol_hollow_circular_cylinder(1, 2, 3) = }" ) # ~= 28.3 print(f"Icosahedron: {vol_icosahedron(2.5) = }") # ~=34.09 if __name__ == "__main__": main() ================================================ FILE: maths/zellers_congruence.py ================================================ import argparse import datetime def zeller(date_input: str) -> str: """ | Zellers Congruence Algorithm | Find the day of the week for nearly any Gregorian or Julian calendar date >>> zeller('01-31-2010') 'Your date 01-31-2010, is a Sunday!' Validate out of range month: >>> zeller('13-31-2010') Traceback (most recent call last): ... ValueError: Month must be between 1 - 12 >>> zeller('.2-31-2010') Traceback (most recent call last): ... ValueError: invalid literal for int() with base 10: '.2' Validate out of range date: >>> zeller('01-33-2010') Traceback (most recent call last): ... ValueError: Date must be between 1 - 31 >>> zeller('01-.4-2010') Traceback (most recent call last): ... ValueError: invalid literal for int() with base 10: '.4' Validate second separator: >>> zeller('01-31*2010') Traceback (most recent call last): ... ValueError: Date separator must be '-' or '/' Validate first separator: >>> zeller('01^31-2010') Traceback (most recent call last): ... ValueError: Date separator must be '-' or '/' Validate out of range year: >>> zeller('01-31-8999') Traceback (most recent call last): ... ValueError: Year out of range. There has to be some sort of limit...right? Test null input: >>> zeller() Traceback (most recent call last): ... TypeError: zeller() missing 1 required positional argument: 'date_input' Test length of `date_input`: >>> zeller('') Traceback (most recent call last): ... ValueError: Must be 10 characters long >>> zeller('01-31-19082939') Traceback (most recent call last): ... ValueError: Must be 10 characters long""" # Days of the week for response days = { "0": "Sunday", "1": "Monday", "2": "Tuesday", "3": "Wednesday", "4": "Thursday", "5": "Friday", "6": "Saturday", } convert_datetime_days = {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 0} # Validate if not 0 < len(date_input) < 11: raise ValueError("Must be 10 characters long") # Get month m: int = int(date_input[0] + date_input[1]) # Validate if not 0 < m < 13: raise ValueError("Month must be between 1 - 12") sep_1: str = date_input[2] # Validate if sep_1 not in ["-", "/"]: raise ValueError("Date separator must be '-' or '/'") # Get day d: int = int(date_input[3] + date_input[4]) # Validate if not 0 < d < 32: raise ValueError("Date must be between 1 - 31") # Get second separator sep_2: str = date_input[5] # Validate if sep_2 not in ["-", "/"]: raise ValueError("Date separator must be '-' or '/'") # Get year y: int = int(date_input[6] + date_input[7] + date_input[8] + date_input[9]) # Arbitrary year range if not 45 < y < 8500: raise ValueError( "Year out of range. There has to be some sort of limit...right?" ) # Get datetime obj for validation dt_ck = datetime.date(int(y), int(m), int(d)) # Start math if m <= 2: y = y - 1 m = m + 12 # maths var c: int = int(str(y)[:2]) k: int = int(str(y)[2:]) t: int = int(2.6 * m - 5.39) u: int = int(c / 4) v: int = int(k / 4) x: int = int(d + k) z: int = int(t + u + v + x) w: int = int(z - (2 * c)) f: int = round(w % 7) # End math # Validate math if f != convert_datetime_days[dt_ck.weekday()]: raise AssertionError("The date was evaluated incorrectly. Contact developer.") # Response response: str = f"Your date {date_input}, is a {days[str(f)]}!" return response if __name__ == "__main__": import doctest doctest.testmod() parser = argparse.ArgumentParser( description=( "Find out what day of the week nearly any date is or was. Enter " "date as a string in the mm-dd-yyyy or mm/dd/yyyy format" ) ) parser.add_argument( "date_input", type=str, help="Date as a string (mm-dd-yyyy or mm/dd/yyyy)" ) args = parser.parse_args() zeller(args.date_input) ================================================ FILE: matrix/__init__.py ================================================ ================================================ FILE: matrix/binary_search_matrix.py ================================================ def binary_search(array: list, lower_bound: int, upper_bound: int, value: int) -> int: """ This function carries out Binary search on a 1d array and return -1 if it do not exist array: A 1d sorted array value : the value meant to be searched >>> matrix = [1, 4, 7, 11, 15] >>> binary_search(matrix, 0, len(matrix) - 1, 1) 0 >>> binary_search(matrix, 0, len(matrix) - 1, 23) -1 """ r = int((lower_bound + upper_bound) // 2) if array[r] == value: return r if lower_bound >= upper_bound: return -1 if array[r] < value: return binary_search(array, r + 1, upper_bound, value) else: return binary_search(array, lower_bound, r - 1, value) def mat_bin_search(value: int, matrix: list) -> list: """ This function loops over a 2d matrix and calls binarySearch on the selected 1d array and returns [-1, -1] is it do not exist value : value meant to be searched matrix = a sorted 2d matrix >>> matrix = [[1, 4, 7, 11, 15], ... [2, 5, 8, 12, 19], ... [3, 6, 9, 16, 22], ... [10, 13, 14, 17, 24], ... [18, 21, 23, 26, 30]] >>> target = 1 >>> mat_bin_search(target, matrix) [0, 0] >>> target = 34 >>> mat_bin_search(target, matrix) [-1, -1] """ index = 0 if matrix[index][0] == value: return [index, 0] while index < len(matrix) and matrix[index][0] < value: r = binary_search(matrix[index], 0, len(matrix[index]) - 1, value) if r != -1: return [index, r] index += 1 return [-1, -1] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: matrix/count_islands_in_matrix.py ================================================ # An island in matrix is a group of linked areas, all having the same value. # This code counts number of islands in a given matrix, with including diagonal # connections. class Matrix: # Public class to implement a graph def __init__(self, row: int, col: int, graph: list[list[bool]]) -> None: self.ROW = row self.COL = col self.graph = graph def is_safe(self, i: int, j: int, visited: list[list[bool]]) -> bool: return ( 0 <= i < self.ROW and 0 <= j < self.COL and not visited[i][j] and self.graph[i][j] ) def diffs(self, i: int, j: int, visited: list[list[bool]]) -> None: # Checking all 8 elements surrounding nth element row_nbr = [-1, -1, -1, 0, 0, 1, 1, 1] # Coordinate order col_nbr = [-1, 0, 1, -1, 1, -1, 0, 1] visited[i][j] = True # Make those cells visited for k in range(8): if self.is_safe(i + row_nbr[k], j + col_nbr[k], visited): self.diffs(i + row_nbr[k], j + col_nbr[k], visited) def count_islands(self) -> int: # And finally, count all islands. visited = [[False for j in range(self.COL)] for i in range(self.ROW)] count = 0 for i in range(self.ROW): for j in range(self.COL): if visited[i][j] is False and self.graph[i][j] == 1: self.diffs(i, j, visited) count += 1 return count ================================================ FILE: matrix/count_negative_numbers_in_sorted_matrix.py ================================================ """ Given an matrix of numbers in which all rows and all columns are sorted in decreasing order, return the number of negative numbers in grid. Reference: https://leetcode.com/problems/count-negative-numbers-in-a-sorted-matrix """ def generate_large_matrix() -> list[list[int]]: """ >>> generate_large_matrix() # doctest: +ELLIPSIS [[1000, ..., -999], [999, ..., -1001], ..., [2, ..., -1998]] """ return [list(range(1000 - i, -1000 - i, -1)) for i in range(1000)] grid = generate_large_matrix() test_grids = ( [[4, 3, 2, -1], [3, 2, 1, -1], [1, 1, -1, -2], [-1, -1, -2, -3]], [[3, 2], [1, 0]], [[7, 7, 6]], [[7, 7, 6], [-1, -2, -3]], grid, ) def validate_grid(grid: list[list[int]]) -> None: """ Validate that the rows and columns of the grid is sorted in decreasing order. >>> for grid in test_grids: ... validate_grid(grid) """ assert all(row == sorted(row, reverse=True) for row in grid) assert all(list(col) == sorted(col, reverse=True) for col in zip(*grid)) def find_negative_index(array: list[int]) -> int: """ Find the smallest negative index >>> find_negative_index([0,0,0,0]) 4 >>> find_negative_index([4,3,2,-1]) 3 >>> find_negative_index([1,0,-1,-10]) 2 >>> find_negative_index([0,0,0,-1]) 3 >>> find_negative_index([11,8,7,-3,-5,-9]) 3 >>> find_negative_index([-1,-1,-2,-3]) 0 >>> find_negative_index([5,1,0]) 3 >>> find_negative_index([-5,-5,-5]) 0 >>> find_negative_index([0]) 1 >>> find_negative_index([]) 0 """ left = 0 right = len(array) - 1 # Edge cases such as no values or all numbers are negative. if not array or array[0] < 0: return 0 while right + 1 > left: mid = (left + right) // 2 num = array[mid] # Num must be negative and the index must be greater than or equal to 0. if num < 0 and array[mid - 1] >= 0: return mid if num >= 0: left = mid + 1 else: right = mid - 1 # No negative numbers so return the last index of the array + 1 which is the length. return len(array) def count_negatives_binary_search(grid: list[list[int]]) -> int: """ An O(m logn) solution that uses binary search in order to find the boundary between positive and negative numbers >>> [count_negatives_binary_search(grid) for grid in test_grids] [8, 0, 0, 3, 1498500] """ total = 0 bound = len(grid[0]) for i in range(len(grid)): bound = find_negative_index(grid[i][:bound]) total += bound return (len(grid) * len(grid[0])) - total def count_negatives_brute_force(grid: list[list[int]]) -> int: """ This solution is O(n^2) because it iterates through every column and row. >>> [count_negatives_brute_force(grid) for grid in test_grids] [8, 0, 0, 3, 1498500] """ return len([number for row in grid for number in row if number < 0]) def count_negatives_brute_force_with_break(grid: list[list[int]]) -> int: """ Similar to the brute force solution above but uses break in order to reduce the number of iterations. >>> [count_negatives_brute_force_with_break(grid) for grid in test_grids] [8, 0, 0, 3, 1498500] """ total = 0 for row in grid: for i, number in enumerate(row): if number < 0: total += len(row) - i break return total def benchmark() -> None: """Benchmark our functions next to each other""" from timeit import timeit print("Running benchmarks") setup = ( "from __main__ import count_negatives_binary_search, " "count_negatives_brute_force, count_negatives_brute_force_with_break, grid" ) for func in ( "count_negatives_binary_search", # took 0.7727 seconds "count_negatives_brute_force_with_break", # took 4.6505 seconds "count_negatives_brute_force", # took 12.8160 seconds ): time = timeit(f"{func}(grid=grid)", setup=setup, number=500) print(f"{func}() took {time:0.4f} seconds") if __name__ == "__main__": import doctest doctest.testmod() benchmark() ================================================ FILE: matrix/count_paths.py ================================================ """ Given a grid, where you start from the top left position [0, 0], you want to find how many paths you can take to get to the bottom right position. start here -> 0 0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 <- finish here how many 'distinct' paths can you take to get to the finish? Using a recursive depth-first search algorithm below, you are able to find the number of distinct unique paths (count). '*' will demonstrate a path In the example above, there are two distinct paths: 1. 2. * * * 0 * * * * 1 1 * 0 1 1 * * 0 0 * 1 0 0 * 1 0 1 * * 0 1 * * """ def depth_first_search(grid: list[list[int]], row: int, col: int, visit: set) -> int: """ Recursive Backtracking Depth First Search Algorithm Starting from top left of a matrix, count the number of paths that can reach the bottom right of a matrix. 1 represents a block (inaccessible) 0 represents a valid space (accessible) 0 0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 >>> grid = [[0, 0, 0, 0], [1, 1, 0, 0], [0, 0, 0, 1], [0, 1, 0, 0]] >>> depth_first_search(grid, 0, 0, set()) 2 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0 0 0 0 0 0 >>> grid = [[0, 0, 0, 0, 0], [0, 1, 1, 1, 0], [0, 1, 1, 1, 0], [0, 0, 0, 0, 0]] >>> depth_first_search(grid, 0, 0, set()) 2 """ row_length, col_length = len(grid), len(grid[0]) if ( min(row, col) < 0 or row == row_length or col == col_length or (row, col) in visit or grid[row][col] == 1 ): return 0 if row == row_length - 1 and col == col_length - 1: return 1 visit.add((row, col)) count = 0 count += depth_first_search(grid, row + 1, col, visit) count += depth_first_search(grid, row - 1, col, visit) count += depth_first_search(grid, row, col + 1, visit) count += depth_first_search(grid, row, col - 1, visit) visit.remove((row, col)) return count if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: matrix/cramers_rule_2x2.py ================================================ # https://www.chilimath.com/lessons/advanced-algebra/cramers-rule-with-two-variables # https://en.wikipedia.org/wiki/Cramer%27s_rule def cramers_rule_2x2(equation1: list[int], equation2: list[int]) -> tuple[float, float]: """ Solves the system of linear equation in 2 variables. :param: equation1: list of 3 numbers :param: equation2: list of 3 numbers :return: String of result input format : [a1, b1, d1], [a2, b2, d2] determinant = [[a1, b1], [a2, b2]] determinant_x = [[d1, b1], [d2, b2]] determinant_y = [[a1, d1], [a2, d2]] >>> cramers_rule_2x2([2, 3, 0], [5, 1, 0]) (0.0, 0.0) >>> cramers_rule_2x2([0, 4, 50], [2, 0, 26]) (13.0, 12.5) >>> cramers_rule_2x2([11, 2, 30], [1, 0, 4]) (4.0, -7.0) >>> cramers_rule_2x2([4, 7, 1], [1, 2, 0]) (2.0, -1.0) >>> cramers_rule_2x2([1, 2, 3], [2, 4, 6]) Traceback (most recent call last): ... ValueError: Infinite solutions. (Consistent system) >>> cramers_rule_2x2([1, 2, 3], [2, 4, 7]) Traceback (most recent call last): ... ValueError: No solution. (Inconsistent system) >>> cramers_rule_2x2([1, 2, 3], [11, 22]) Traceback (most recent call last): ... ValueError: Please enter a valid equation. >>> cramers_rule_2x2([0, 1, 6], [0, 0, 3]) Traceback (most recent call last): ... ValueError: No solution. (Inconsistent system) >>> cramers_rule_2x2([0, 0, 6], [0, 0, 3]) Traceback (most recent call last): ... ValueError: Both a & b of two equations can't be zero. >>> cramers_rule_2x2([1, 2, 3], [1, 2, 3]) Traceback (most recent call last): ... ValueError: Infinite solutions. (Consistent system) >>> cramers_rule_2x2([0, 4, 50], [0, 3, 99]) Traceback (most recent call last): ... ValueError: No solution. (Inconsistent system) """ # Check if the input is valid if not len(equation1) == len(equation2) == 3: raise ValueError("Please enter a valid equation.") if equation1[0] == equation1[1] == equation2[0] == equation2[1] == 0: raise ValueError("Both a & b of two equations can't be zero.") # Extract the coefficients a1, b1, c1 = equation1 a2, b2, c2 = equation2 # Calculate the determinants of the matrices determinant = a1 * b2 - a2 * b1 determinant_x = c1 * b2 - c2 * b1 determinant_y = a1 * c2 - a2 * c1 # Check if the system of linear equations has a solution (using Cramer's rule) if determinant == 0: if determinant_x == determinant_y == 0: raise ValueError("Infinite solutions. (Consistent system)") else: raise ValueError("No solution. (Inconsistent system)") elif determinant_x == determinant_y == 0: # Trivial solution (Inconsistent system) return (0.0, 0.0) else: x = determinant_x / determinant y = determinant_y / determinant # Non-Trivial Solution (Consistent system) return (x, y) ================================================ FILE: matrix/inverse_of_matrix.py ================================================ from __future__ import annotations from decimal import Decimal from numpy import array def inverse_of_matrix(matrix: list[list[float]]) -> list[list[float]]: """ A matrix multiplied with its inverse gives the identity matrix. This function finds the inverse of a 2x2 and 3x3 matrix. If the determinant of a matrix is 0, its inverse does not exist. Sources for fixing inaccurate float arithmetic: https://stackoverflow.com/questions/6563058/how-do-i-use-accurate-float-arithmetic-in-python https://docs.python.org/3/library/decimal.html Doctests for 2x2 >>> inverse_of_matrix([[2, 5], [2, 0]]) [[0.0, 0.5], [0.2, -0.2]] >>> inverse_of_matrix([[2.5, 5], [1, 2]]) Traceback (most recent call last): ... ValueError: This matrix has no inverse. >>> inverse_of_matrix([[12, -16], [-9, 0]]) [[0.0, -0.1111111111111111], [-0.0625, -0.08333333333333333]] >>> inverse_of_matrix([[12, 3], [16, 8]]) [[0.16666666666666666, -0.0625], [-0.3333333333333333, 0.25]] >>> inverse_of_matrix([[10, 5], [3, 2.5]]) [[0.25, -0.5], [-0.3, 1.0]] Doctests for 3x3 >>> inverse_of_matrix([[2, 5, 7], [2, 0, 1], [1, 2, 3]]) [[2.0, 5.0, -4.0], [1.0, 1.0, -1.0], [-5.0, -12.0, 10.0]] >>> inverse_of_matrix([[1, 2, 2], [1, 2, 2], [3, 2, -1]]) Traceback (most recent call last): ... ValueError: This matrix has no inverse. >>> inverse_of_matrix([[],[]]) Traceback (most recent call last): ... ValueError: Please provide a matrix of size 2x2 or 3x3. >>> inverse_of_matrix([[1, 2], [3, 4], [5, 6]]) Traceback (most recent call last): ... ValueError: Please provide a matrix of size 2x2 or 3x3. >>> inverse_of_matrix([[1, 2, 1], [0,3, 4]]) Traceback (most recent call last): ... ValueError: Please provide a matrix of size 2x2 or 3x3. >>> inverse_of_matrix([[1, 2, 3], [7, 8, 9], [7, 8, 9]]) Traceback (most recent call last): ... ValueError: This matrix has no inverse. >>> inverse_of_matrix([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]] """ d = Decimal # Check if the provided matrix has 2 rows and 2 columns # since this implementation only works for 2x2 matrices if len(matrix) == 2 and len(matrix[0]) == 2 and len(matrix[1]) == 2: # Calculate the determinant of the matrix determinant = float( d(matrix[0][0]) * d(matrix[1][1]) - d(matrix[1][0]) * d(matrix[0][1]) ) if determinant == 0: raise ValueError("This matrix has no inverse.") # Creates a copy of the matrix with swapped positions of the elements swapped_matrix = [[0.0, 0.0], [0.0, 0.0]] swapped_matrix[0][0], swapped_matrix[1][1] = matrix[1][1], matrix[0][0] swapped_matrix[1][0], swapped_matrix[0][1] = -matrix[1][0], -matrix[0][1] # Calculate the inverse of the matrix return [ [(float(d(n)) / determinant) or 0.0 for n in row] for row in swapped_matrix ] elif ( len(matrix) == 3 and len(matrix[0]) == 3 and len(matrix[1]) == 3 and len(matrix[2]) == 3 ): # Calculate the determinant of the matrix using Sarrus rule determinant = float( ( (d(matrix[0][0]) * d(matrix[1][1]) * d(matrix[2][2])) + (d(matrix[0][1]) * d(matrix[1][2]) * d(matrix[2][0])) + (d(matrix[0][2]) * d(matrix[1][0]) * d(matrix[2][1])) ) - ( (d(matrix[0][2]) * d(matrix[1][1]) * d(matrix[2][0])) + (d(matrix[0][1]) * d(matrix[1][0]) * d(matrix[2][2])) + (d(matrix[0][0]) * d(matrix[1][2]) * d(matrix[2][1])) ) ) if determinant == 0: raise ValueError("This matrix has no inverse.") # Creating cofactor matrix cofactor_matrix = [ [d(0.0), d(0.0), d(0.0)], [d(0.0), d(0.0), d(0.0)], [d(0.0), d(0.0), d(0.0)], ] cofactor_matrix[0][0] = (d(matrix[1][1]) * d(matrix[2][2])) - ( d(matrix[1][2]) * d(matrix[2][1]) ) cofactor_matrix[0][1] = -( (d(matrix[1][0]) * d(matrix[2][2])) - (d(matrix[1][2]) * d(matrix[2][0])) ) cofactor_matrix[0][2] = (d(matrix[1][0]) * d(matrix[2][1])) - ( d(matrix[1][1]) * d(matrix[2][0]) ) cofactor_matrix[1][0] = -( (d(matrix[0][1]) * d(matrix[2][2])) - (d(matrix[0][2]) * d(matrix[2][1])) ) cofactor_matrix[1][1] = (d(matrix[0][0]) * d(matrix[2][2])) - ( d(matrix[0][2]) * d(matrix[2][0]) ) cofactor_matrix[1][2] = -( (d(matrix[0][0]) * d(matrix[2][1])) - (d(matrix[0][1]) * d(matrix[2][0])) ) cofactor_matrix[2][0] = (d(matrix[0][1]) * d(matrix[1][2])) - ( d(matrix[0][2]) * d(matrix[1][1]) ) cofactor_matrix[2][1] = -( (d(matrix[0][0]) * d(matrix[1][2])) - (d(matrix[0][2]) * d(matrix[1][0])) ) cofactor_matrix[2][2] = (d(matrix[0][0]) * d(matrix[1][1])) - ( d(matrix[0][1]) * d(matrix[1][0]) ) # Transpose the cofactor matrix (Adjoint matrix) adjoint_matrix = array(cofactor_matrix) for i in range(3): for j in range(3): adjoint_matrix[i][j] = cofactor_matrix[j][i] # Inverse of the matrix using the formula (1/determinant) * adjoint matrix inverse_matrix = array(cofactor_matrix) for i in range(3): for j in range(3): inverse_matrix[i][j] /= d(determinant) # Calculate the inverse of the matrix return [[float(d(n)) or 0.0 for n in row] for row in inverse_matrix] raise ValueError("Please provide a matrix of size 2x2 or 3x3.") ================================================ FILE: matrix/largest_square_area_in_matrix.py ================================================ """ Question: Given a binary matrix mat of size n * m, find out the maximum size square sub-matrix with all 1s. --- Example 1: Input: n = 2, m = 2 mat = [[1, 1], [1, 1]] Output: 2 Explanation: The maximum size of the square sub-matrix is 2. The matrix itself is the maximum sized sub-matrix in this case. --- Example 2 Input: n = 2, m = 2 mat = [[0, 0], [0, 0]] Output: 0 Explanation: There is no 1 in the matrix. Approach: We initialize another matrix (dp) with the same dimensions as the original one initialized with all 0's. dp_array(i,j) represents the side length of the maximum square whose bottom right corner is the cell with index (i,j) in the original matrix. Starting from index (0,0), for every 1 found in the original matrix, we update the value of the current element as dp_array(i,j)=dp_array(dp(i-1,j),dp_array(i-1,j-1),dp_array(i,j-1)) + 1. """ def largest_square_area_in_matrix_top_down_approch( rows: int, cols: int, mat: list[list[int]] ) -> int: """ Function updates the largest_square_area[0], if recursive call found square with maximum area. We aren't using dp_array here, so the time complexity would be exponential. >>> largest_square_area_in_matrix_top_down_approch(2, 2, [[1,1], [1,1]]) 2 >>> largest_square_area_in_matrix_top_down_approch(2, 2, [[0,0], [0,0]]) 0 """ def update_area_of_max_square(row: int, col: int) -> int: # BASE CASE if row >= rows or col >= cols: return 0 right = update_area_of_max_square(row, col + 1) diagonal = update_area_of_max_square(row + 1, col + 1) down = update_area_of_max_square(row + 1, col) if mat[row][col]: sub_problem_sol = 1 + min([right, diagonal, down]) largest_square_area[0] = max(largest_square_area[0], sub_problem_sol) return sub_problem_sol else: return 0 largest_square_area = [0] update_area_of_max_square(0, 0) return largest_square_area[0] def largest_square_area_in_matrix_top_down_approch_with_dp( rows: int, cols: int, mat: list[list[int]] ) -> int: """ Function updates the largest_square_area[0], if recursive call found square with maximum area. We are using dp_array here, so the time complexity would be O(N^2). >>> largest_square_area_in_matrix_top_down_approch_with_dp(2, 2, [[1,1], [1,1]]) 2 >>> largest_square_area_in_matrix_top_down_approch_with_dp(2, 2, [[0,0], [0,0]]) 0 """ def update_area_of_max_square_using_dp_array( row: int, col: int, dp_array: list[list[int]] ) -> int: if row >= rows or col >= cols: return 0 if dp_array[row][col] != -1: return dp_array[row][col] right = update_area_of_max_square_using_dp_array(row, col + 1, dp_array) diagonal = update_area_of_max_square_using_dp_array(row + 1, col + 1, dp_array) down = update_area_of_max_square_using_dp_array(row + 1, col, dp_array) if mat[row][col]: sub_problem_sol = 1 + min([right, diagonal, down]) largest_square_area[0] = max(largest_square_area[0], sub_problem_sol) dp_array[row][col] = sub_problem_sol return sub_problem_sol else: return 0 largest_square_area = [0] dp_array = [[-1] * cols for _ in range(rows)] update_area_of_max_square_using_dp_array(0, 0, dp_array) return largest_square_area[0] def largest_square_area_in_matrix_bottom_up( rows: int, cols: int, mat: list[list[int]] ) -> int: """ Function updates the largest_square_area, using bottom up approach. >>> largest_square_area_in_matrix_bottom_up(2, 2, [[1,1], [1,1]]) 2 >>> largest_square_area_in_matrix_bottom_up(2, 2, [[0,0], [0,0]]) 0 """ dp_array = [[0] * (cols + 1) for _ in range(rows + 1)] largest_square_area = 0 for row in range(rows - 1, -1, -1): for col in range(cols - 1, -1, -1): right = dp_array[row][col + 1] diagonal = dp_array[row + 1][col + 1] bottom = dp_array[row + 1][col] if mat[row][col] == 1: dp_array[row][col] = 1 + min(right, diagonal, bottom) largest_square_area = max(dp_array[row][col], largest_square_area) else: dp_array[row][col] = 0 return largest_square_area def largest_square_area_in_matrix_bottom_up_space_optimization( rows: int, cols: int, mat: list[list[int]] ) -> int: """ Function updates the largest_square_area, using bottom up approach. with space optimization. >>> largest_square_area_in_matrix_bottom_up_space_optimization(2, 2, [[1,1], [1,1]]) 2 >>> largest_square_area_in_matrix_bottom_up_space_optimization(2, 2, [[0,0], [0,0]]) 0 """ current_row = [0] * (cols + 1) next_row = [0] * (cols + 1) largest_square_area = 0 for row in range(rows - 1, -1, -1): for col in range(cols - 1, -1, -1): right = current_row[col + 1] diagonal = next_row[col + 1] bottom = next_row[col] if mat[row][col] == 1: current_row[col] = 1 + min(right, diagonal, bottom) largest_square_area = max(current_row[col], largest_square_area) else: current_row[col] = 0 next_row = current_row return largest_square_area if __name__ == "__main__": import doctest doctest.testmod() print(largest_square_area_in_matrix_bottom_up(2, 2, [[1, 1], [1, 1]])) ================================================ FILE: matrix/matrix_based_game.py ================================================ """ Matrix-Based Game Script ========================= This script implements a matrix-based game where players interact with a grid of elements. The primary goals are to: - Identify connected elements of the same type from a selected position. - Remove those elements, adjust the matrix by simulating gravity, and reorganize empty columns. - Calculate and display the score based on the number of elements removed in each move. Functions: ----------- 1. `find_repeat`: Finds all connected elements of the same type. 2. `increment_score`: Calculates the score for a given move. 3. `move_x`: Simulates gravity in a column. 4. `move_y`: Reorganizes the matrix by shifting columns leftward when a column becomes empty. 5. `play`: Executes a single move, updating the matrix and returning the score. Input Format: -------------- 1. Matrix size (`lines`): Integer specifying the size of the matrix (N x N). 2. Matrix content (`matrix`): Rows of the matrix, each consisting of characters. 3. Number of moves (`movs`): Integer indicating the number of moves. 4. List of moves (`movements`): A comma-separated string of coordinates for each move. (0,0) position starts from first left column to last right, and below row to up row Example Input: --------------- 4 RRBG RBBG YYGG XYGG 2 0 1,1 1 Example (0,0) = X Output: -------- The script outputs the total score after processing all moves. Usage: ------- Run the script and provide the required inputs as prompted. """ def validate_matrix_size(size: int) -> None: """ >>> validate_matrix_size(-1) Traceback (most recent call last): ... ValueError: Matrix size must be a positive integer. """ if not isinstance(size, int) or size <= 0: raise ValueError("Matrix size must be a positive integer.") def validate_matrix_content(matrix: list[str], size: int) -> None: """ Validates that the number of elements in the matrix matches the given size. >>> validate_matrix_content(['aaaa', 'aaaa', 'aaaa', 'aaaa'], 3) Traceback (most recent call last): ... ValueError: The matrix dont match with size. >>> validate_matrix_content(['aa%', 'aaa', 'aaa'], 3) Traceback (most recent call last): ... ValueError: Matrix rows can only contain letters and numbers. >>> validate_matrix_content(['aaa', 'aaa', 'aaaa'], 3) Traceback (most recent call last): ... ValueError: Each row in the matrix must have exactly 3 characters. """ print(matrix) if len(matrix) != size: raise ValueError("The matrix dont match with size.") for row in matrix: if len(row) != size: msg = f"Each row in the matrix must have exactly {size} characters." raise ValueError(msg) if not all(char.isalnum() for char in row): raise ValueError("Matrix rows can only contain letters and numbers.") def validate_moves(moves: list[tuple[int, int]], size: int) -> None: """ >>> validate_moves([(1, 2), (-1, 0)], 3) Traceback (most recent call last): ... ValueError: Move is out of bounds for a matrix. """ for move in moves: x, y = move if not (0 <= x < size and 0 <= y < size): raise ValueError("Move is out of bounds for a matrix.") def parse_moves(input_str: str) -> list[tuple[int, int]]: """ >>> parse_moves("0 1, 1 1") [(0, 1), (1, 1)] >>> parse_moves("0 1, 1 1, 2") Traceback (most recent call last): ... ValueError: Each move must have exactly two numbers. >>> parse_moves("0 1, 1 1, 2 4 5 6") Traceback (most recent call last): ... ValueError: Each move must have exactly two numbers. """ moves = [] for pair in input_str.split(","): parts = pair.strip().split() if len(parts) != 2: raise ValueError("Each move must have exactly two numbers.") x, y = map(int, parts) moves.append((x, y)) return moves def find_repeat( matrix_g: list[list[str]], row: int, column: int, size: int ) -> set[tuple[int, int]]: """ Finds all connected elements of the same type from a given position. >>> find_repeat([['A', 'B', 'A'], ['A', 'B', 'A'], ['A', 'A', 'A']], 0, 0, 3) {(1, 2), (2, 1), (0, 0), (2, 0), (0, 2), (2, 2), (1, 0)} >>> find_repeat([['-', '-', '-'], ['-', '-', '-'], ['-', '-', '-']], 1, 1, 3) set() """ column = size - 1 - column visited = set() repeated = set() if (color := matrix_g[column][row]) != "-": def dfs(row_n: int, column_n: int) -> None: if row_n < 0 or row_n >= size or column_n < 0 or column_n >= size: return if (row_n, column_n) in visited: return visited.add((row_n, column_n)) if matrix_g[row_n][column_n] == color: repeated.add((row_n, column_n)) dfs(row_n - 1, column_n) dfs(row_n + 1, column_n) dfs(row_n, column_n - 1) dfs(row_n, column_n + 1) dfs(column, row) return repeated def increment_score(count: int) -> int: """ Calculates the score for a move based on the number of elements removed. >>> increment_score(3) 6 >>> increment_score(0) 0 """ return int(count * (count + 1) / 2) def move_x(matrix_g: list[list[str]], column: int, size: int) -> list[list[str]]: """ Simulates gravity in a specific column. >>> move_x([['-', 'A'], ['-', '-'], ['-', 'C']], 1, 2) [['-', '-'], ['-', 'A'], ['-', 'C']] """ new_list = [] for row in range(size): if matrix_g[row][column] != "-": new_list.append(matrix_g[row][column]) else: new_list.insert(0, matrix_g[row][column]) for row in range(size): matrix_g[row][column] = new_list[row] return matrix_g def move_y(matrix_g: list[list[str]], size: int) -> list[list[str]]: """ Shifts all columns leftward when an entire column becomes empty. >>> move_y([['-', 'A'], ['-', '-'], ['-', 'C']], 2) [['A', '-'], ['-', '-'], ['-', 'C']] """ empty_columns = [] for column in range(size - 1, -1, -1): if all(matrix_g[row][column] == "-" for row in range(size)): empty_columns.append(column) for column in empty_columns: for col in range(column + 1, size): for row in range(size): matrix_g[row][col - 1] = matrix_g[row][col] for row in range(size): matrix_g[row][-1] = "-" return matrix_g def play( matrix_g: list[list[str]], pos_x: int, pos_y: int, size: int ) -> tuple[list[list[str]], int]: """ Processes a single move, updating the matrix and calculating the score. >>> play([['R', 'G'], ['R', 'G']], 0, 0, 2) ([['G', '-'], ['G', '-']], 3) """ same_colors = find_repeat(matrix_g, pos_x, pos_y, size) if len(same_colors) != 0: for pos in same_colors: matrix_g[pos[0]][pos[1]] = "-" for column in range(size): matrix_g = move_x(matrix_g, column, size) matrix_g = move_y(matrix_g, size) return (matrix_g, increment_score(len(same_colors))) def process_game(size: int, matrix: list[str], moves: list[tuple[int, int]]) -> int: """Processes the game logic for the given matrix and moves. Args: size (int): Size of the game board. matrix (List[str]): Initial game matrix. moves (List[Tuple[int, int]]): List of moves as (x, y) coordinates. Returns: int: The total score obtained. >>> process_game(3, ['aaa', 'bbb', 'ccc'], [(0, 0)]) 6 """ game_matrix = [list(row) for row in matrix] total_score = 0 for move in moves: pos_x, pos_y = move game_matrix, score = play(game_matrix, pos_x, pos_y, size) total_score += score return total_score if __name__ == "__main__": import doctest doctest.testmod(verbose=True) try: size = int(input("Enter the size of the matrix: ")) validate_matrix_size(size) print(f"Enter the {size} rows of the matrix:") matrix = [input(f"Row {i + 1}: ") for i in range(size)] validate_matrix_content(matrix, size) moves_input = input("Enter the moves (e.g., '0 0, 1 1'): ") moves = parse_moves(moves_input) validate_moves(moves, size) score = process_game(size, matrix, moves) print(f"Total score: {score}") except ValueError as e: print(f"{e}") ================================================ FILE: matrix/matrix_class.py ================================================ # An OOP approach to representing and manipulating matrices from __future__ import annotations class Matrix: """ Matrix object generated from a 2D array where each element is an array representing a row. Rows can contain type int or float. Common operations and information available. >>> rows = [ ... [1, 2, 3], ... [4, 5, 6], ... [7, 8, 9] ... ] >>> matrix = Matrix(rows) >>> print(matrix) [[1. 2. 3.] [4. 5. 6.] [7. 8. 9.]] Matrix rows and columns are available as 2D arrays >>> matrix.rows [[1, 2, 3], [4, 5, 6], [7, 8, 9]] >>> matrix.columns() [[1, 4, 7], [2, 5, 8], [3, 6, 9]] Order is returned as a tuple >>> matrix.order (3, 3) Squareness and invertability are represented as bool >>> matrix.is_square True >>> matrix.is_invertable() False Identity, Minors, Cofactors and Adjugate are returned as Matrices. Inverse can be a Matrix or Nonetype >>> print(matrix.identity()) [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]] >>> print(matrix.minors()) [[-3. -6. -3.] [-6. -12. -6.] [-3. -6. -3.]] >>> print(matrix.cofactors()) [[-3. 6. -3.] [6. -12. 6.] [-3. 6. -3.]] >>> # won't be apparent due to the nature of the cofactor matrix >>> print(matrix.adjugate()) [[-3. 6. -3.] [6. -12. 6.] [-3. 6. -3.]] >>> matrix.inverse() Traceback (most recent call last): ... TypeError: Only matrices with a non-zero determinant have an inverse Determinant is an int, float, or Nonetype >>> matrix.determinant() 0 Negation, scalar multiplication, addition, subtraction, multiplication and exponentiation are available and all return a Matrix >>> print(-matrix) [[-1. -2. -3.] [-4. -5. -6.] [-7. -8. -9.]] >>> matrix2 = matrix * 3 >>> print(matrix2) [[3. 6. 9.] [12. 15. 18.] [21. 24. 27.]] >>> print(matrix + matrix2) [[4. 8. 12.] [16. 20. 24.] [28. 32. 36.]] >>> print(matrix - matrix2) [[-2. -4. -6.] [-8. -10. -12.] [-14. -16. -18.]] >>> print(matrix ** 3) [[468. 576. 684.] [1062. 1305. 1548.] [1656. 2034. 2412.]] Matrices can also be modified >>> matrix.add_row([10, 11, 12]) >>> print(matrix) [[1. 2. 3.] [4. 5. 6.] [7. 8. 9.] [10. 11. 12.]] >>> matrix2.add_column([8, 16, 32]) >>> print(matrix2) [[3. 6. 9. 8.] [12. 15. 18. 16.] [21. 24. 27. 32.]] >>> print(matrix * matrix2) [[90. 108. 126. 136.] [198. 243. 288. 304.] [306. 378. 450. 472.] [414. 513. 612. 640.]] """ def __init__(self, rows: list[list[int]]): error = TypeError( "Matrices must be formed from a list of zero or more lists containing at " "least one and the same number of values, each of which must be of type " "int or float." ) if len(rows) != 0: cols = len(rows[0]) if cols == 0: raise error for row in rows: if len(row) != cols: raise error for value in row: if not isinstance(value, (int, float)): raise error self.rows = rows else: self.rows = [] # MATRIX INFORMATION def columns(self) -> list[list[int]]: return [[row[i] for row in self.rows] for i in range(len(self.rows[0]))] @property def num_rows(self) -> int: return len(self.rows) @property def num_columns(self) -> int: return len(self.rows[0]) @property def order(self) -> tuple[int, int]: return self.num_rows, self.num_columns @property def is_square(self) -> bool: return self.order[0] == self.order[1] def identity(self) -> Matrix: values = [ [0 if column_num != row_num else 1 for column_num in range(self.num_rows)] for row_num in range(self.num_rows) ] return Matrix(values) def determinant(self) -> int: if not self.is_square: return 0 if self.order == (0, 0): return 1 if self.order == (1, 1): return int(self.rows[0][0]) if self.order == (2, 2): return int( (self.rows[0][0] * self.rows[1][1]) - (self.rows[0][1] * self.rows[1][0]) ) else: return sum( self.rows[0][column] * self.cofactors().rows[0][column] for column in range(self.num_columns) ) def is_invertable(self) -> bool: return bool(self.determinant()) def get_minor(self, row: int, column: int) -> int: values = [ [ self.rows[other_row][other_column] for other_column in range(self.num_columns) if other_column != column ] for other_row in range(self.num_rows) if other_row != row ] return Matrix(values).determinant() def get_cofactor(self, row: int, column: int) -> int: if (row + column) % 2 == 0: return self.get_minor(row, column) return -1 * self.get_minor(row, column) def minors(self) -> Matrix: return Matrix( [ [self.get_minor(row, column) for column in range(self.num_columns)] for row in range(self.num_rows) ] ) def cofactors(self) -> Matrix: return Matrix( [ [ self.minors().rows[row][column] if (row + column) % 2 == 0 else self.minors().rows[row][column] * -1 for column in range(self.minors().num_columns) ] for row in range(self.minors().num_rows) ] ) def adjugate(self) -> Matrix: values = [ [self.cofactors().rows[column][row] for column in range(self.num_columns)] for row in range(self.num_rows) ] return Matrix(values) def inverse(self) -> Matrix: determinant = self.determinant() if not determinant: raise TypeError("Only matrices with a non-zero determinant have an inverse") return self.adjugate() * (1 / determinant) def __repr__(self) -> str: return str(self.rows) def __str__(self) -> str: if self.num_rows == 0: return "[]" if self.num_rows == 1: return "[[" + ". ".join(str(self.rows[0])) + "]]" return ( "[" + "\n ".join( [ "[" + ". ".join([str(value) for value in row]) + ".]" for row in self.rows ] ) + "]" ) # MATRIX MANIPULATION def add_row(self, row: list[int], position: int | None = None) -> None: type_error = TypeError("Row must be a list containing all ints and/or floats") if not isinstance(row, list): raise type_error for value in row: if not isinstance(value, (int, float)): raise type_error if len(row) != self.num_columns: raise ValueError( "Row must be equal in length to the other rows in the matrix" ) if position is None: self.rows.append(row) else: self.rows = [*self.rows[0:position], row, *self.rows[position:]] def add_column(self, column: list[int], position: int | None = None) -> None: type_error = TypeError( "Column must be a list containing all ints and/or floats" ) if not isinstance(column, list): raise type_error for value in column: if not isinstance(value, (int, float)): raise type_error if len(column) != self.num_rows: raise ValueError( "Column must be equal in length to the other columns in the matrix" ) if position is None: self.rows = [self.rows[i] + [column[i]] for i in range(self.num_rows)] else: self.rows = [ [*self.rows[i][0:position], column[i], *self.rows[i][position:]] for i in range(self.num_rows) ] # MATRIX OPERATIONS def __eq__(self, other: object) -> bool: if not isinstance(other, Matrix): return NotImplemented return self.rows == other.rows def __ne__(self, other: object) -> bool: return not self == other def __neg__(self) -> Matrix: return self * -1 def __add__(self, other: Matrix) -> Matrix: if self.order != other.order: raise ValueError("Addition requires matrices of the same order") return Matrix( [ [self.rows[i][j] + other.rows[i][j] for j in range(self.num_columns)] for i in range(self.num_rows) ] ) def __sub__(self, other: Matrix) -> Matrix: if self.order != other.order: raise ValueError("Subtraction requires matrices of the same order") return Matrix( [ [self.rows[i][j] - other.rows[i][j] for j in range(self.num_columns)] for i in range(self.num_rows) ] ) def __mul__(self, other: Matrix | float) -> Matrix: if isinstance(other, (int, float)): return Matrix( [[int(element * other) for element in row] for row in self.rows] ) elif isinstance(other, Matrix): if self.num_columns != other.num_rows: raise ValueError( "The number of columns in the first matrix must " "be equal to the number of rows in the second" ) return Matrix( [ [Matrix.dot_product(row, column) for column in other.columns()] for row in self.rows ] ) else: raise TypeError( "A Matrix can only be multiplied by an int, float, or another matrix" ) def __pow__(self, other: int) -> Matrix: if not isinstance(other, int): raise TypeError("A Matrix can only be raised to the power of an int") if not self.is_square: raise ValueError("Only square matrices can be raised to a power") if other == 0: return self.identity() if other < 0: if self.is_invertable(): return self.inverse() ** (-other) raise ValueError( "Only invertable matrices can be raised to a negative power" ) result = self for _ in range(other - 1): result *= self return result @classmethod def dot_product(cls, row: list[int], column: list[int]) -> int: return sum(row[i] * column[i] for i in range(len(row))) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: matrix/matrix_equalization.py ================================================ from sys import maxsize def array_equalization(vector: list[int], step_size: int) -> int: """ This algorithm equalizes all elements of the input vector to a common value, by making the minimal number of "updates" under the constraint of a step size (step_size). >>> array_equalization([1, 1, 6, 2, 4, 6, 5, 1, 7, 2, 2, 1, 7, 2, 2], 4) 4 >>> array_equalization([22, 81, 88, 71, 22, 81, 632, 81, 81, 22, 92], 2) 5 >>> array_equalization([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 5) 0 >>> array_equalization([22, 22, 22, 33, 33, 33], 2) 2 >>> array_equalization([1, 2, 3], 0) Traceback (most recent call last): ValueError: Step size must be positive and non-zero. >>> array_equalization([1, 2, 3], -1) Traceback (most recent call last): ValueError: Step size must be positive and non-zero. >>> array_equalization([1, 2, 3], 0.5) Traceback (most recent call last): ValueError: Step size must be an integer. >>> array_equalization([1, 2, 3], maxsize) 1 """ if step_size <= 0: raise ValueError("Step size must be positive and non-zero.") if not isinstance(step_size, int): raise ValueError("Step size must be an integer.") unique_elements = set(vector) min_updates = maxsize for element in unique_elements: elem_index = 0 updates = 0 while elem_index < len(vector): if vector[elem_index] != element: updates += 1 elem_index += step_size else: elem_index += 1 min_updates = min(min_updates, updates) return min_updates if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: matrix/matrix_multiplication_recursion.py ================================================ # @Author : ojas-wani # @File : matrix_multiplication_recursion.py # @Date : 10/06/2023 """ Perform matrix multiplication using a recursive algorithm. https://en.wikipedia.org/wiki/Matrix_multiplication """ # type Matrix = list[list[int]] # psf/black currenttly fails on this line Matrix = list[list[int]] matrix_1_to_4 = [ [1, 2], [3, 4], ] matrix_5_to_8 = [ [5, 6], [7, 8], ] matrix_5_to_9_high = [ [5, 6], [7, 8], [9], ] matrix_5_to_9_wide = [ [5, 6], [7, 8, 9], ] matrix_count_up = [ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16], ] matrix_unordered = [ [5, 8, 1, 2], [6, 7, 3, 0], [4, 5, 9, 1], [2, 6, 10, 14], ] matrices = ( matrix_1_to_4, matrix_5_to_8, matrix_5_to_9_high, matrix_5_to_9_wide, matrix_count_up, matrix_unordered, ) def is_square(matrix: Matrix) -> bool: """ >>> is_square([]) True >>> is_square(matrix_1_to_4) True >>> is_square(matrix_5_to_9_high) False """ len_matrix = len(matrix) return all(len(row) == len_matrix for row in matrix) def matrix_multiply(matrix_a: Matrix, matrix_b: Matrix) -> Matrix: """ >>> matrix_multiply(matrix_1_to_4, matrix_5_to_8) [[19, 22], [43, 50]] """ return [ [sum(a * b for a, b in zip(row, col)) for col in zip(*matrix_b)] for row in matrix_a ] def matrix_multiply_recursive(matrix_a: Matrix, matrix_b: Matrix) -> Matrix: """ :param matrix_a: A square Matrix. :param matrix_b: Another square Matrix with the same dimensions as matrix_a. :return: Result of matrix_a * matrix_b. :raises ValueError: If the matrices cannot be multiplied. >>> matrix_multiply_recursive([], []) [] >>> matrix_multiply_recursive(matrix_1_to_4, matrix_5_to_8) [[19, 22], [43, 50]] >>> matrix_multiply_recursive(matrix_count_up, matrix_unordered) [[37, 61, 74, 61], [105, 165, 166, 129], [173, 269, 258, 197], [241, 373, 350, 265]] >>> matrix_multiply_recursive(matrix_1_to_4, matrix_5_to_9_wide) Traceback (most recent call last): ... ValueError: Invalid matrix dimensions >>> matrix_multiply_recursive(matrix_1_to_4, matrix_5_to_9_high) Traceback (most recent call last): ... ValueError: Invalid matrix dimensions >>> matrix_multiply_recursive(matrix_1_to_4, matrix_count_up) Traceback (most recent call last): ... ValueError: Invalid matrix dimensions """ if not matrix_a or not matrix_b: return [] if not all( (len(matrix_a) == len(matrix_b), is_square(matrix_a), is_square(matrix_b)) ): raise ValueError("Invalid matrix dimensions") # Initialize the result matrix with zeros result = [[0] * len(matrix_b[0]) for _ in range(len(matrix_a))] # Recursive multiplication of matrices def multiply( i_loop: int, j_loop: int, k_loop: int, matrix_a: Matrix, matrix_b: Matrix, result: Matrix, ) -> None: """ :param matrix_a: A square Matrix. :param matrix_b: Another square Matrix with the same dimensions as matrix_a. :param result: Result matrix :param i: Index used for iteration during multiplication. :param j: Index used for iteration during multiplication. :param k: Index used for iteration during multiplication. >>> 0 > 1 # Doctests in inner functions are never run True """ if i_loop >= len(matrix_a): return if j_loop >= len(matrix_b[0]): return multiply(i_loop + 1, 0, 0, matrix_a, matrix_b, result) if k_loop >= len(matrix_b): return multiply(i_loop, j_loop + 1, 0, matrix_a, matrix_b, result) result[i_loop][j_loop] += matrix_a[i_loop][k_loop] * matrix_b[k_loop][j_loop] return multiply(i_loop, j_loop, k_loop + 1, matrix_a, matrix_b, result) # Perform the recursive matrix multiplication multiply(0, 0, 0, matrix_a, matrix_b, result) return result if __name__ == "__main__": from doctest import testmod failure_count, test_count = testmod() if not failure_count: matrix_a = matrices[0] for matrix_b in matrices[1:]: print("Multiplying:") for row in matrix_a: print(row) print("By:") for row in matrix_b: print(row) print("Result:") try: result = matrix_multiply_recursive(matrix_a, matrix_b) for row in result: print(row) assert result == matrix_multiply(matrix_a, matrix_b) except ValueError as e: print(f"{e!r}") print() matrix_a = matrix_b print("Benchmark:") from functools import partial from timeit import timeit mytimeit = partial(timeit, globals=globals(), number=100_000) for func in ("matrix_multiply", "matrix_multiply_recursive"): print(f"{func:>25}(): {mytimeit(f'{func}(matrix_count_up, matrix_unordered)')}") ================================================ FILE: matrix/matrix_operation.py ================================================ """ Functions for 2D matrix operations """ from __future__ import annotations from typing import Any def add(*matrix_s: list[list[int]]) -> list[list[int]]: """ >>> add([[1,2],[3,4]],[[2,3],[4,5]]) [[3, 5], [7, 9]] >>> add([[1.2,2.4],[3,4]],[[2,3],[4,5]]) [[3.2, 5.4], [7, 9]] >>> add([[1, 2], [4, 5]], [[3, 7], [3, 4]], [[3, 5], [5, 7]]) [[7, 14], [12, 16]] >>> add([3], [4, 5]) Traceback (most recent call last): ... TypeError: Expected a matrix, got int/list instead """ if all(_check_not_integer(m) for m in matrix_s): for i in matrix_s[1:]: _verify_matrix_sizes(matrix_s[0], i) return [[sum(t) for t in zip(*m)] for m in zip(*matrix_s)] raise TypeError("Expected a matrix, got int/list instead") def subtract(matrix_a: list[list[int]], matrix_b: list[list[int]]) -> list[list[int]]: """ >>> subtract([[1,2],[3,4]],[[2,3],[4,5]]) [[-1, -1], [-1, -1]] >>> subtract([[1,2.5],[3,4]],[[2,3],[4,5.5]]) [[-1, -0.5], [-1, -1.5]] >>> subtract([3], [4, 5]) Traceback (most recent call last): ... TypeError: Expected a matrix, got int/list instead """ if ( _check_not_integer(matrix_a) and _check_not_integer(matrix_b) and _verify_matrix_sizes(matrix_a, matrix_b) ): return [[i - j for i, j in zip(*m)] for m in zip(matrix_a, matrix_b)] raise TypeError("Expected a matrix, got int/list instead") def scalar_multiply(matrix: list[list[int]], n: float) -> list[list[float]]: """ >>> scalar_multiply([[1,2],[3,4]],5) [[5, 10], [15, 20]] >>> scalar_multiply([[1.4,2.3],[3,4]],5) [[7.0, 11.5], [15, 20]] """ return [[x * n for x in row] for row in matrix] def multiply(matrix_a: list[list[int]], matrix_b: list[list[int]]) -> list[list[int]]: """ >>> multiply([[1,2],[3,4]],[[5,5],[7,5]]) [[19, 15], [43, 35]] >>> multiply([[1,2.5],[3,4.5]],[[5,5],[7,5]]) [[22.5, 17.5], [46.5, 37.5]] >>> multiply([[1, 2, 3]], [[2], [3], [4]]) [[20]] """ if _check_not_integer(matrix_a) and _check_not_integer(matrix_b): rows, cols = _verify_matrix_sizes(matrix_a, matrix_b) if cols[0] != rows[1]: msg = ( "Cannot multiply matrix of dimensions " f"({rows[0]},{cols[0]}) and ({rows[1]},{cols[1]})" ) raise ValueError(msg) return [ [sum(m * n for m, n in zip(i, j)) for j in zip(*matrix_b)] for i in matrix_a ] def identity(n: int) -> list[list[int]]: """ :param n: dimension for nxn matrix :type n: int :return: Identity matrix of shape [n, n] >>> identity(3) [[1, 0, 0], [0, 1, 0], [0, 0, 1]] """ n = int(n) return [[int(row == column) for column in range(n)] for row in range(n)] def transpose( matrix: list[list[int]], return_map: bool = True ) -> list[list[int]] | map[list[int]]: """ >>> transpose([[1,2],[3,4]]) # doctest: +ELLIPSIS >> transpose([[1,2],[3,4]], return_map=False) [[1, 3], [2, 4]] >>> transpose([1, [2, 3]]) Traceback (most recent call last): ... TypeError: Expected a matrix, got int/list instead """ if _check_not_integer(matrix): if return_map: return map(list, zip(*matrix)) else: return list(map(list, zip(*matrix))) raise TypeError("Expected a matrix, got int/list instead") def minor(matrix: list[list[int]], row: int, column: int) -> list[list[int]]: """ >>> minor([[1, 2], [3, 4]], 1, 1) [[1]] """ minor = matrix[:row] + matrix[row + 1 :] return [row[:column] + row[column + 1 :] for row in minor] def determinant(matrix: list[list[int]]) -> Any: """ >>> determinant([[1, 2], [3, 4]]) -2 >>> determinant([[1.5, 2.5], [3, 4]]) -1.5 """ if len(matrix) == 1: return matrix[0][0] return sum( x * determinant(minor(matrix, 0, i)) * (-1) ** i for i, x in enumerate(matrix[0]) ) def inverse(matrix: list[list[int]]) -> list[list[float]] | None: """ >>> inverse([[1, 2], [3, 4]]) [[-2.0, 1.0], [1.5, -0.5]] >>> inverse([[1, 1], [1, 1]]) """ # https://stackoverflow.com/questions/20047519/python-doctests-test-for-none det = determinant(matrix) if det == 0: return None matrix_minor = [ [determinant(minor(matrix, i, j)) for j in range(len(matrix))] for i in range(len(matrix)) ] cofactors = [ [x * (-1) ** (row + col) for col, x in enumerate(matrix_minor[row])] for row in range(len(matrix)) ] adjugate = list(transpose(cofactors)) return scalar_multiply(adjugate, 1 / det) def _check_not_integer(matrix: list[list[int]]) -> bool: return not isinstance(matrix, int) and not isinstance(matrix[0], int) def _shape(matrix: list[list[int]]) -> tuple[int, int]: return len(matrix), len(matrix[0]) def _verify_matrix_sizes( matrix_a: list[list[int]], matrix_b: list[list[int]] ) -> tuple[tuple[int, int], tuple[int, int]]: shape = _shape(matrix_a) + _shape(matrix_b) if shape[0] != shape[3] or shape[1] != shape[2]: msg = ( "operands could not be broadcast together with shape " f"({shape[0], shape[1]}), ({shape[2], shape[3]})" ) raise ValueError(msg) return (shape[0], shape[2]), (shape[1], shape[3]) def main() -> None: matrix_a = [[12, 10], [3, 9]] matrix_b = [[3, 4], [7, 4]] matrix_c = [[11, 12, 13, 14], [21, 22, 23, 24], [31, 32, 33, 34], [41, 42, 43, 44]] matrix_d = [[3, 0, 2], [2, 0, -2], [0, 1, 1]] print(f"Add Operation, {add(matrix_a, matrix_b) = } \n") print(f"Multiply Operation, {multiply(matrix_a, matrix_b) = } \n") print(f"Identity: {identity(5)}\n") print(f"Minor of {matrix_c} = {minor(matrix_c, 1, 2)} \n") print(f"Determinant of {matrix_b} = {determinant(matrix_b)} \n") print(f"Inverse of {matrix_d} = {inverse(matrix_d)}\n") if __name__ == "__main__": import doctest doctest.testmod() main() ================================================ FILE: matrix/max_area_of_island.py ================================================ """ Given an two dimensional binary matrix grid. An island is a group of 1's (representing land) connected 4-directionally (horizontal or vertical.) You may assume all four edges of the grid are surrounded by water. The area of an island is the number of cells with a value 1 in the island. Return the maximum area of an island in a grid. If there is no island, return 0. """ matrix = [ [0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0], [0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0], [0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0], ] def is_safe(row: int, col: int, rows: int, cols: int) -> bool: """ Checking whether coordinate (row, col) is valid or not. >>> is_safe(0, 0, 5, 5) True >>> is_safe(-1,-1, 5, 5) False """ return 0 <= row < rows and 0 <= col < cols def depth_first_search(row: int, col: int, seen: set, mat: list[list[int]]) -> int: """ Returns the current area of the island >>> depth_first_search(0, 0, set(), matrix) 0 """ rows = len(mat) cols = len(mat[0]) if is_safe(row, col, rows, cols) and (row, col) not in seen and mat[row][col] == 1: seen.add((row, col)) return ( 1 + depth_first_search(row + 1, col, seen, mat) + depth_first_search(row - 1, col, seen, mat) + depth_first_search(row, col + 1, seen, mat) + depth_first_search(row, col - 1, seen, mat) ) else: return 0 def find_max_area(mat: list[list[int]]) -> int: """ Finds the area of all islands and returns the maximum area. >>> find_max_area(matrix) 6 """ seen: set = set() max_area = 0 for row, line in enumerate(mat): for col, item in enumerate(line): if item == 1 and (row, col) not in seen: # Maximizing the area max_area = max(max_area, depth_first_search(row, col, seen, mat)) return max_area if __name__ == "__main__": import doctest print(find_max_area(matrix)) # Output -> 6 """ Explanation: We are allowed to move in four directions (horizontal or vertical) so the possible in a matrix if we are at x and y position the possible moving are Directions are [(x, y+1), (x, y-1), (x+1, y), (x-1, y)] but we need to take care of boundary cases as well which are x and y can not be smaller than 0 and greater than the number of rows and columns respectively. Visualization mat = [ [0,0,A,0,0,0,0,B,0,0,0,0,0], [0,0,0,0,0,0,0,B,B,B,0,0,0], [0,C,C,0,D,0,0,0,0,0,0,0,0], [0,C,0,0,D,D,0,0,E,0,E,0,0], [0,C,0,0,D,D,0,0,E,E,E,0,0], [0,0,0,0,0,0,0,0,0,0,E,0,0], [0,0,0,0,0,0,0,F,F,F,0,0,0], [0,0,0,0,0,0,0,F,F,0,0,0,0] ] For visualization, I have defined the connected island with letters by observation, we can see that A island is of area 1 B island is of area 4 C island is of area 4 D island is of area 5 E island is of area 6 and F island is of area 5 it has 6 unique islands of mentioned areas and the maximum of all of them is 6 so we return 6. """ doctest.testmod() ================================================ FILE: matrix/median_matrix.py ================================================ """ https://en.wikipedia.org/wiki/Median """ def median(matrix: list[list[int]]) -> int: """ Calculate the median of a sorted matrix. Args: matrix: A 2D matrix of integers. Returns: The median value of the matrix. Examples: >>> matrix = [[1, 3, 5], [2, 6, 9], [3, 6, 9]] >>> median(matrix) 5 >>> matrix = [[1, 2, 3], [4, 5, 6]] >>> median(matrix) 3 """ # Flatten the matrix into a sorted 1D list linear = sorted(num for row in matrix for num in row) # Calculate the middle index mid = (len(linear) - 1) // 2 # Return the median return linear[mid] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: matrix/nth_fibonacci_using_matrix_exponentiation.py ================================================ """ Implementation of finding nth fibonacci number using matrix exponentiation. Time Complexity is about O(log(n)*8), where 8 is the complexity of matrix multiplication of size 2 by 2. And on the other hand complexity of bruteforce solution is O(n). As we know f[n] = f[n-1] + f[n-1] Converting to matrix, [f(n),f(n-1)] = [[1,1],[1,0]] * [f(n-1),f(n-2)] -> [f(n),f(n-1)] = [[1,1],[1,0]]^2 * [f(n-2),f(n-3)] ... ... -> [f(n),f(n-1)] = [[1,1],[1,0]]^(n-1) * [f(1),f(0)] So we just need the n times multiplication of the matrix [1,1],[1,0]]. We can decrease the n times multiplication by following the divide and conquer approach. """ def multiply(matrix_a: list[list[int]], matrix_b: list[list[int]]) -> list[list[int]]: matrix_c = [] n = len(matrix_a) for i in range(n): list_1 = [] for j in range(n): val = 0 for k in range(n): val = val + matrix_a[i][k] * matrix_b[k][j] list_1.append(val) matrix_c.append(list_1) return matrix_c def identity(n: int) -> list[list[int]]: return [[int(row == column) for column in range(n)] for row in range(n)] def nth_fibonacci_matrix(n: int) -> int: """ >>> nth_fibonacci_matrix(100) 354224848179261915075 >>> nth_fibonacci_matrix(-100) -100 """ if n <= 1: return n res_matrix = identity(2) fibonacci_matrix = [[1, 1], [1, 0]] n = n - 1 while n > 0: if n % 2 == 1: res_matrix = multiply(res_matrix, fibonacci_matrix) fibonacci_matrix = multiply(fibonacci_matrix, fibonacci_matrix) n = int(n / 2) return res_matrix[0][0] def nth_fibonacci_bruteforce(n: int) -> int: """ >>> nth_fibonacci_bruteforce(100) 354224848179261915075 >>> nth_fibonacci_bruteforce(-100) -100 """ if n <= 1: return n fib0 = 0 fib1 = 1 for _ in range(2, n + 1): fib0, fib1 = fib1, fib0 + fib1 return fib1 def main() -> None: for ordinal in "0th 1st 2nd 3rd 10th 100th 1000th".split(): n = int("".join(c for c in ordinal if c in "0123456789")) # 1000th --> 1000 print( f"{ordinal} fibonacci number using matrix exponentiation is " f"{nth_fibonacci_matrix(n)} and using bruteforce is " f"{nth_fibonacci_bruteforce(n)}\n" ) # from timeit import timeit # print(timeit("nth_fibonacci_matrix(1000000)", # "from main import nth_fibonacci_matrix", number=5)) # print(timeit("nth_fibonacci_bruteforce(1000000)", # "from main import nth_fibonacci_bruteforce", number=5)) # 2.3342058970001744 # 57.256506615000035 if __name__ == "__main__": import doctest doctest.testmod() main() ================================================ FILE: matrix/pascal_triangle.py ================================================ """ This implementation demonstrates how to generate the elements of a Pascal's triangle. The element havingva row index of r and column index of c can be derivedvas follows: triangle[r][c] = triangle[r-1][c-1]+triangle[r-1][c] A Pascal's triangle is a triangular array containing binomial coefficients. https://en.wikipedia.org/wiki/Pascal%27s_triangle """ def print_pascal_triangle(num_rows: int) -> None: """ Print Pascal's triangle for different number of rows >>> print_pascal_triangle(5) 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 """ triangle = generate_pascal_triangle(num_rows) for row_idx in range(num_rows): # Print left spaces for _ in range(num_rows - row_idx - 1): print(end=" ") # Print row values for col_idx in range(row_idx + 1): if col_idx != row_idx: print(triangle[row_idx][col_idx], end=" ") else: print(triangle[row_idx][col_idx], end="") print() def generate_pascal_triangle(num_rows: int) -> list[list[int]]: """ Create Pascal's triangle for different number of rows >>> generate_pascal_triangle(0) [] >>> generate_pascal_triangle(1) [[1]] >>> generate_pascal_triangle(2) [[1], [1, 1]] >>> generate_pascal_triangle(3) [[1], [1, 1], [1, 2, 1]] >>> generate_pascal_triangle(4) [[1], [1, 1], [1, 2, 1], [1, 3, 3, 1]] >>> generate_pascal_triangle(5) [[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1]] >>> generate_pascal_triangle(-5) Traceback (most recent call last): ... ValueError: The input value of 'num_rows' should be greater than or equal to 0 >>> generate_pascal_triangle(7.89) Traceback (most recent call last): ... TypeError: The input value of 'num_rows' should be 'int' """ if not isinstance(num_rows, int): raise TypeError("The input value of 'num_rows' should be 'int'") if num_rows == 0: return [] elif num_rows < 0: raise ValueError( "The input value of 'num_rows' should be greater than or equal to 0" ) triangle: list[list[int]] = [] for current_row_idx in range(num_rows): current_row = populate_current_row(triangle, current_row_idx) triangle.append(current_row) return triangle def populate_current_row(triangle: list[list[int]], current_row_idx: int) -> list[int]: """ >>> triangle = [[1]] >>> populate_current_row(triangle, 1) [1, 1] """ current_row = [-1] * (current_row_idx + 1) # first and last elements of current row are equal to 1 current_row[0], current_row[-1] = 1, 1 for current_col_idx in range(1, current_row_idx): calculate_current_element( triangle, current_row, current_row_idx, current_col_idx ) return current_row def calculate_current_element( triangle: list[list[int]], current_row: list[int], current_row_idx: int, current_col_idx: int, ) -> None: """ >>> triangle = [[1], [1, 1]] >>> current_row = [1, -1, 1] >>> calculate_current_element(triangle, current_row, 2, 1) >>> current_row [1, 2, 1] """ above_to_left_elt = triangle[current_row_idx - 1][current_col_idx - 1] above_to_right_elt = triangle[current_row_idx - 1][current_col_idx] current_row[current_col_idx] = above_to_left_elt + above_to_right_elt def generate_pascal_triangle_optimized(num_rows: int) -> list[list[int]]: """ This function returns a matrix representing the corresponding pascal's triangle according to the given input of number of rows of Pascal's triangle to be generated. It reduces the operations done to generate a row by half by eliminating redundant calculations. :param num_rows: Integer specifying the number of rows in the Pascal's triangle :return: 2-D List (matrix) representing the Pascal's triangle Return the Pascal's triangle of given rows >>> generate_pascal_triangle_optimized(3) [[1], [1, 1], [1, 2, 1]] >>> generate_pascal_triangle_optimized(1) [[1]] >>> generate_pascal_triangle_optimized(0) [] >>> generate_pascal_triangle_optimized(-5) Traceback (most recent call last): ... ValueError: The input value of 'num_rows' should be greater than or equal to 0 >>> generate_pascal_triangle_optimized(7.89) Traceback (most recent call last): ... TypeError: The input value of 'num_rows' should be 'int' """ if not isinstance(num_rows, int): raise TypeError("The input value of 'num_rows' should be 'int'") if num_rows == 0: return [] elif num_rows < 0: raise ValueError( "The input value of 'num_rows' should be greater than or equal to 0" ) result: list[list[int]] = [[1]] for row_index in range(1, num_rows): temp_row = [0] + result[-1] + [0] row_length = row_index + 1 # Calculate the number of distinct elements in a row distinct_elements = sum(divmod(row_length, 2)) row_first_half = [ temp_row[i - 1] + temp_row[i] for i in range(1, distinct_elements + 1) ] row_second_half = row_first_half[: (row_index + 1) // 2] row_second_half.reverse() row = row_first_half + row_second_half result.append(row) return result def benchmark() -> None: """ Benchmark multiple functions, with three different length int values. """ from collections.abc import Callable from timeit import timeit def benchmark_a_function(func: Callable, value: int) -> None: call = f"{func.__name__}({value})" timing = timeit(f"__main__.{call}", setup="import __main__") # print(f"{call:38} = {func(value)} -- {timing:.4f} seconds") print(f"{call:38} -- {timing:.4f} seconds") for value in range(15): # (1, 7, 14): for func in (generate_pascal_triangle, generate_pascal_triangle_optimized): benchmark_a_function(func, value) print() if __name__ == "__main__": import doctest doctest.testmod() benchmark() ================================================ FILE: matrix/rotate_matrix.py ================================================ """ In this problem, we want to rotate the matrix elements by 90, 180, 270 (counterclockwise) Discussion in stackoverflow: https://stackoverflow.com/questions/42519/how-do-you-rotate-a-two-dimensional-array """ from __future__ import annotations def make_matrix(row_size: int = 4) -> list[list[int]]: """ >>> make_matrix() [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]] >>> make_matrix(1) [[1]] >>> make_matrix(-2) [[1, 2], [3, 4]] >>> make_matrix(3) [[1, 2, 3], [4, 5, 6], [7, 8, 9]] >>> make_matrix() == make_matrix(4) True """ row_size = abs(row_size) or 4 return [[1 + x + y * row_size for x in range(row_size)] for y in range(row_size)] def rotate_90(matrix: list[list[int]]) -> list[list[int]]: """ >>> rotate_90(make_matrix()) [[4, 8, 12, 16], [3, 7, 11, 15], [2, 6, 10, 14], [1, 5, 9, 13]] >>> rotate_90(make_matrix()) == transpose(reverse_column(make_matrix())) True """ return reverse_row(transpose(matrix)) # OR.. transpose(reverse_column(matrix)) def rotate_180(matrix: list[list[int]]) -> list[list[int]]: """ >>> rotate_180(make_matrix()) [[16, 15, 14, 13], [12, 11, 10, 9], [8, 7, 6, 5], [4, 3, 2, 1]] >>> rotate_180(make_matrix()) == reverse_column(reverse_row(make_matrix())) True """ return reverse_row(reverse_column(matrix)) # OR.. reverse_column(reverse_row(matrix)) def rotate_270(matrix: list[list[int]]) -> list[list[int]]: """ >>> rotate_270(make_matrix()) [[13, 9, 5, 1], [14, 10, 6, 2], [15, 11, 7, 3], [16, 12, 8, 4]] >>> rotate_270(make_matrix()) == transpose(reverse_row(make_matrix())) True """ return reverse_column(transpose(matrix)) # OR.. transpose(reverse_row(matrix)) def transpose(matrix: list[list[int]]) -> list[list[int]]: matrix[:] = [list(x) for x in zip(*matrix)] return matrix def reverse_row(matrix: list[list[int]]) -> list[list[int]]: matrix[:] = matrix[::-1] return matrix def reverse_column(matrix: list[list[int]]) -> list[list[int]]: matrix[:] = [x[::-1] for x in matrix] return matrix def print_matrix(matrix: list[list[int]]) -> None: for i in matrix: print(*i) if __name__ == "__main__": matrix = make_matrix() print("\norigin:\n") print_matrix(matrix) print("\nrotate 90 counterclockwise:\n") print_matrix(rotate_90(matrix)) matrix = make_matrix() print("\norigin:\n") print_matrix(matrix) print("\nrotate 180:\n") print_matrix(rotate_180(matrix)) matrix = make_matrix() print("\norigin:\n") print_matrix(matrix) print("\nrotate 270 counterclockwise:\n") print_matrix(rotate_270(matrix)) ================================================ FILE: matrix/searching_in_sorted_matrix.py ================================================ from __future__ import annotations def search_in_a_sorted_matrix(mat: list[list[int]], m: int, n: int, key: float) -> None: """ >>> search_in_a_sorted_matrix( ... [[2, 5, 7], [4, 8, 13], [9, 11, 15], [12, 17, 20]], 3, 3, 5) Key 5 found at row- 1 column- 2 >>> search_in_a_sorted_matrix( ... [[2, 5, 7], [4, 8, 13], [9, 11, 15], [12, 17, 20]], 3, 3, 21) Key 21 not found >>> search_in_a_sorted_matrix( ... [[2.1, 5, 7], [4, 8, 13], [9, 11, 15], [12, 17, 20]], 3, 3, 2.1) Key 2.1 found at row- 1 column- 1 >>> search_in_a_sorted_matrix( ... [[2.1, 5, 7], [4, 8, 13], [9, 11, 15], [12, 17, 20]], 3, 3, 2.2) Key 2.2 not found """ i, j = m - 1, 0 while i >= 0 and j < n: if key == mat[i][j]: print(f"Key {key} found at row- {i + 1} column- {j + 1}") return if key < mat[i][j]: i -= 1 else: j += 1 print(f"Key {key} not found") def main() -> None: mat = [[2, 5, 7], [4, 8, 13], [9, 11, 15], [12, 17, 20]] x = int(input("Enter the element to be searched:")) print(mat) search_in_a_sorted_matrix(mat, len(mat), len(mat[0]), x) if __name__ == "__main__": import doctest doctest.testmod() main() ================================================ FILE: matrix/sherman_morrison.py ================================================ from __future__ import annotations from typing import Any class Matrix: """ Matrix structure. """ def __init__(self, row: int, column: int, default_value: float = 0) -> None: """ Initialize matrix with given size and default value. Example: >>> a = Matrix(2, 3, 1) >>> a Matrix consist of 2 rows and 3 columns [1, 1, 1] [1, 1, 1] """ self.row, self.column = row, column self.array = [[default_value for _ in range(column)] for _ in range(row)] def __str__(self) -> str: """ Return string representation of this matrix. """ # Prefix s = f"Matrix consist of {self.row} rows and {self.column} columns\n" # Make string identifier max_element_length = 0 for row_vector in self.array: for obj in row_vector: max_element_length = max(max_element_length, len(str(obj))) string_format_identifier = f"%{max_element_length}s" # Make string and return def single_line(row_vector: list[float]) -> str: nonlocal string_format_identifier line = "[" line += ", ".join(string_format_identifier % (obj,) for obj in row_vector) line += "]" return line s += "\n".join(single_line(row_vector) for row_vector in self.array) return s def __repr__(self) -> str: return str(self) def validate_indices(self, loc: tuple[int, int]) -> bool: """ Check if given indices are valid to pick element from matrix. Example: >>> a = Matrix(2, 6, 0) >>> a.validate_indices((2, 7)) False >>> a.validate_indices((0, 0)) True """ if not (isinstance(loc, (list, tuple)) and len(loc) == 2): # noqa: SIM114 return False elif not (0 <= loc[0] < self.row and 0 <= loc[1] < self.column): return False else: return True def __getitem__(self, loc: tuple[int, int]) -> Any: """ Return array[row][column] where loc = (row, column). Example: >>> a = Matrix(3, 2, 7) >>> a[1, 0] 7 """ assert self.validate_indices(loc) return self.array[loc[0]][loc[1]] def __setitem__(self, loc: tuple[int, int], value: float) -> None: """ Set array[row][column] = value where loc = (row, column). Example: >>> a = Matrix(2, 3, 1) >>> a[1, 2] = 51 >>> a Matrix consist of 2 rows and 3 columns [ 1, 1, 1] [ 1, 1, 51] """ assert self.validate_indices(loc) self.array[loc[0]][loc[1]] = value def __add__(self, another: Matrix) -> Matrix: """ Return self + another. Example: >>> a = Matrix(2, 1, -4) >>> b = Matrix(2, 1, 3) >>> a+b Matrix consist of 2 rows and 1 columns [-1] [-1] """ # Validation assert isinstance(another, Matrix) assert self.row == another.row assert self.column == another.column # Add result = Matrix(self.row, self.column) for r in range(self.row): for c in range(self.column): result[r, c] = self[r, c] + another[r, c] return result def __neg__(self) -> Matrix: """ Return -self. Example: >>> a = Matrix(2, 2, 3) >>> a[0, 1] = a[1, 0] = -2 >>> -a Matrix consist of 2 rows and 2 columns [-3, 2] [ 2, -3] """ result = Matrix(self.row, self.column) for r in range(self.row): for c in range(self.column): result[r, c] = -self[r, c] return result def __sub__(self, another: Matrix) -> Matrix: return self + (-another) def __mul__(self, another: float | Matrix) -> Matrix: """ Return self * another. Example: >>> a = Matrix(2, 3, 1) >>> a[0,2] = a[1,2] = 3 >>> a * -2 Matrix consist of 2 rows and 3 columns [-2, -2, -6] [-2, -2, -6] """ if isinstance(another, (int, float)): # Scalar multiplication result = Matrix(self.row, self.column) for r in range(self.row): for c in range(self.column): result[r, c] = self[r, c] * another return result elif isinstance(another, Matrix): # Matrix multiplication assert self.column == another.row result = Matrix(self.row, another.column) for r in range(self.row): for c in range(another.column): for i in range(self.column): result[r, c] += self[r, i] * another[i, c] return result else: msg = f"Unsupported type given for another ({type(another)})" raise TypeError(msg) def transpose(self) -> Matrix: """ Return self^T. Example: >>> a = Matrix(2, 3) >>> for r in range(2): ... for c in range(3): ... a[r,c] = r*c ... >>> a.transpose() Matrix consist of 3 rows and 2 columns [0, 0] [0, 1] [0, 2] """ result = Matrix(self.column, self.row) for r in range(self.row): for c in range(self.column): result[c, r] = self[r, c] return result def sherman_morrison(self, u: Matrix, v: Matrix) -> Any: """ Apply Sherman-Morrison formula in O(n^2). To learn this formula, please look this: https://en.wikipedia.org/wiki/Sherman%E2%80%93Morrison_formula This method returns (A + uv^T)^(-1) where A^(-1) is self. Returns None if it's impossible to calculate. Warning: This method doesn't check if self is invertible. Make sure self is invertible before execute this method. Example: >>> ainv = Matrix(3, 3, 0) >>> for i in range(3): ainv[i,i] = 1 ... >>> u = Matrix(3, 1, 0) >>> u[0,0], u[1,0], u[2,0] = 1, 2, -3 >>> v = Matrix(3, 1, 0) >>> v[0,0], v[1,0], v[2,0] = 4, -2, 5 >>> ainv.sherman_morrison(u, v) Matrix consist of 3 rows and 3 columns [ 1.2857142857142856, -0.14285714285714285, 0.3571428571428571] [ 0.5714285714285714, 0.7142857142857143, 0.7142857142857142] [ -0.8571428571428571, 0.42857142857142855, -0.0714285714285714] """ # Size validation assert isinstance(u, Matrix) assert isinstance(v, Matrix) assert self.row == self.column == u.row == v.row # u, v should be column vector assert u.column == v.column == 1 # u, v should be column vector # Calculate v_t = v.transpose() numerator_factor = (v_t * self * u)[0, 0] + 1 if numerator_factor == 0: return None # It's not invertible return self - ((self * u) * (v_t * self) * (1.0 / numerator_factor)) # Testing if __name__ == "__main__": def test1() -> None: # a^(-1) ainv = Matrix(3, 3, 0) for i in range(3): ainv[i, i] = 1 print(f"a^(-1) is {ainv}") # u, v u = Matrix(3, 1, 0) u[0, 0], u[1, 0], u[2, 0] = 1, 2, -3 v = Matrix(3, 1, 0) v[0, 0], v[1, 0], v[2, 0] = 4, -2, 5 print(f"u is {u}") print(f"v is {v}") print(f"uv^T is {u * v.transpose()}") # Sherman Morrison print(f"(a + uv^T)^(-1) is {ainv.sherman_morrison(u, v)}") def test2() -> None: import doctest doctest.testmod() test2() ================================================ FILE: matrix/spiral_print.py ================================================ """ This program print the matrix in spiral form. This problem has been solved through recursive way. Matrix must satisfy below conditions i) matrix should be only one or two dimensional ii) number of column of all rows should be equal """ def check_matrix(matrix: list[list[int]]) -> bool: # must be matrix = [list(row) for row in matrix] if matrix and isinstance(matrix, list): if isinstance(matrix[0], list): prev_len = 0 for row in matrix: if prev_len == 0: prev_len = len(row) result = True else: result = prev_len == len(row) else: result = True else: result = False return result def spiral_print_clockwise(a: list[list[int]]) -> None: """ >>> spiral_print_clockwise([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]) 1 2 3 4 8 12 11 10 9 5 6 7 """ if check_matrix(a) and len(a) > 0: a = [list(row) for row in a] mat_row = len(a) if isinstance(a[0], list): mat_col = len(a[0]) else: for dat in a: print(dat) return # horizotal printing increasing for i in range(mat_col): print(a[0][i]) # vertical printing down for i in range(1, mat_row): print(a[i][mat_col - 1]) # horizotal printing decreasing if mat_row > 1: for i in range(mat_col - 2, -1, -1): print(a[mat_row - 1][i]) # vertical printing up for i in range(mat_row - 2, 0, -1): print(a[i][0]) remain_mat = [row[1 : mat_col - 1] for row in a[1 : mat_row - 1]] if len(remain_mat) > 0: spiral_print_clockwise(remain_mat) else: return else: print("Not a valid matrix") return # Other Easy to understand Approach def spiral_traversal(matrix: list[list]) -> list[int]: """ >>> spiral_traversal([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]) [1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7] Example: matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]] Algorithm: Step 1. first pop the 0 index list. (which is [1,2,3,4] and concatenate the output of [step 2]) Step 2. Now perform matrix's Transpose operation (Change rows to column and vice versa) and reverse the resultant matrix. Step 3. Pass the output of [2nd step], to same recursive function till base case hits. Dry Run: Stage 1. [1, 2, 3, 4] + spiral_traversal([ [8, 12], [7, 11], [6, 10], [5, 9]] ]) Stage 2. [1, 2, 3, 4, 8, 12] + spiral_traversal([ [11, 10, 9], [7, 6, 5] ]) Stage 3. [1, 2, 3, 4, 8, 12, 11, 10, 9] + spiral_traversal([ [5], [6], [7] ]) Stage 4. [1, 2, 3, 4, 8, 12, 11, 10, 9, 5] + spiral_traversal([ [5], [6], [7] ]) Stage 5. [1, 2, 3, 4, 8, 12, 11, 10, 9, 5] + spiral_traversal([[6, 7]]) Stage 6. [1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7] + spiral_traversal([]) """ if matrix: return list(matrix.pop(0)) + spiral_traversal( [list(row) for row in zip(*matrix)][::-1] ) else: return [] # driver code if __name__ == "__main__": import doctest doctest.testmod() a = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]] spiral_print_clockwise(a) ================================================ FILE: matrix/tests/__init__.py ================================================ ================================================ FILE: matrix/tests/pytest.ini ================================================ [pytest] markers = mat_ops: tests for matrix operations ================================================ FILE: matrix/tests/test_matrix_operation.py ================================================ """ Testing here assumes that numpy and linalg is ALWAYS correct!!!! If running from PyCharm you can place the following line in "Additional Arguments" for the pytest run configuration -vv -m mat_ops -p no:cacheprovider """ import logging # standard libraries import sys import numpy as np import pytest # Custom/local libraries from matrix import matrix_operation as matop mat_a = [[12, 10], [3, 9]] mat_b = [[3, 4], [7, 4]] mat_c = [[3, 0, 2], [2, 0, -2], [0, 1, 1]] mat_d = [[3, 0, -2], [2, 0, 2], [0, 1, 1]] mat_e = [[3, 0, 2], [2, 0, -2], [0, 1, 1], [2, 0, -2]] mat_f = [1] mat_h = [2] logger = logging.getLogger() logger.level = logging.DEBUG stream_handler = logging.StreamHandler(sys.stdout) logger.addHandler(stream_handler) @pytest.mark.mat_ops @pytest.mark.parametrize( ("mat1", "mat2"), [(mat_a, mat_b), (mat_c, mat_d), (mat_d, mat_e), (mat_f, mat_h)] ) def test_addition(mat1, mat2): if (np.array(mat1)).shape < (2, 2) or (np.array(mat2)).shape < (2, 2): logger.info(f"\n\t{test_addition.__name__} returned integer") with pytest.raises(TypeError): matop.add(mat1, mat2) elif (np.array(mat1)).shape == (np.array(mat2)).shape: logger.info(f"\n\t{test_addition.__name__} with same matrix dims") act = (np.array(mat1) + np.array(mat2)).tolist() theo = matop.add(mat1, mat2) assert theo == act else: logger.info(f"\n\t{test_addition.__name__} with different matrix dims") with pytest.raises(ValueError): matop.add(mat1, mat2) @pytest.mark.mat_ops @pytest.mark.parametrize( ("mat1", "mat2"), [(mat_a, mat_b), (mat_c, mat_d), (mat_d, mat_e), (mat_f, mat_h)] ) def test_subtraction(mat1, mat2): if (np.array(mat1)).shape < (2, 2) or (np.array(mat2)).shape < (2, 2): logger.info(f"\n\t{test_subtraction.__name__} returned integer") with pytest.raises(TypeError): matop.subtract(mat1, mat2) elif (np.array(mat1)).shape == (np.array(mat2)).shape: logger.info(f"\n\t{test_subtraction.__name__} with same matrix dims") act = (np.array(mat1) - np.array(mat2)).tolist() theo = matop.subtract(mat1, mat2) assert theo == act else: logger.info(f"\n\t{test_subtraction.__name__} with different matrix dims") with pytest.raises(ValueError): assert matop.subtract(mat1, mat2) @pytest.mark.mat_ops @pytest.mark.parametrize( ("mat1", "mat2"), [(mat_a, mat_b), (mat_c, mat_d), (mat_d, mat_e), (mat_f, mat_h)] ) def test_multiplication(mat1, mat2): if (np.array(mat1)).shape < (2, 2) or (np.array(mat2)).shape < (2, 2): logger.info(f"\n\t{test_multiplication.__name__} returned integer") with pytest.raises(TypeError): matop.add(mat1, mat2) elif (np.array(mat1)).shape == (np.array(mat2)).shape: logger.info(f"\n\t{test_multiplication.__name__} meets dim requirements") act = (np.matmul(mat1, mat2)).tolist() theo = matop.multiply(mat1, mat2) assert theo == act else: logger.info( f"\n\t{test_multiplication.__name__} does not meet dim requirements" ) with pytest.raises(ValueError): assert matop.subtract(mat1, mat2) @pytest.mark.mat_ops def test_scalar_multiply(): act = (3.5 * np.array(mat_a)).tolist() theo = matop.scalar_multiply(mat_a, 3.5) assert theo == act @pytest.mark.mat_ops def test_identity(): act = (np.identity(5)).tolist() theo = matop.identity(5) assert theo == act @pytest.mark.mat_ops @pytest.mark.parametrize("mat", [mat_a, mat_b, mat_c, mat_d, mat_e, mat_f]) def test_transpose(mat): if (np.array(mat)).shape < (2, 2): logger.info(f"\n\t{test_transpose.__name__} returned integer") with pytest.raises(TypeError): matop.transpose(mat) else: act = (np.transpose(mat)).tolist() theo = matop.transpose(mat, return_map=False) assert theo == act ================================================ FILE: matrix/validate_sudoku_board.py ================================================ """ LeetCode 36. Valid Sudoku https://leetcode.com/problems/valid-sudoku/ https://en.wikipedia.org/wiki/Sudoku Determine if a 9 x 9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules: - Each row must contain the digits 1-9 without repetition. - Each column must contain the digits 1-9 without repetition. - Each of the nine 3 x 3 sub-boxes of the grid must contain the digits 1-9 without repetition. Note: A Sudoku board (partially filled) could be valid but is not necessarily solvable. Only the filled cells need to be validated according to the mentioned rules. """ from collections import defaultdict NUM_SQUARES = 9 EMPTY_CELL = "." def is_valid_sudoku_board(sudoku_board: list[list[str]]) -> bool: """ This function validates (but does not solve) a sudoku board. The board may be valid but unsolvable. >>> is_valid_sudoku_board([ ... ["5","3",".",".","7",".",".",".","."] ... ,["6",".",".","1","9","5",".",".","."] ... ,[".","9","8",".",".",".",".","6","."] ... ,["8",".",".",".","6",".",".",".","3"] ... ,["4",".",".","8",".","3",".",".","1"] ... ,["7",".",".",".","2",".",".",".","6"] ... ,[".","6",".",".",".",".","2","8","."] ... ,[".",".",".","4","1","9",".",".","5"] ... ,[".",".",".",".","8",".",".","7","9"] ... ]) True >>> is_valid_sudoku_board([ ... ["8","3",".",".","7",".",".",".","."] ... ,["6",".",".","1","9","5",".",".","."] ... ,[".","9","8",".",".",".",".","6","."] ... ,["8",".",".",".","6",".",".",".","3"] ... ,["4",".",".","8",".","3",".",".","1"] ... ,["7",".",".",".","2",".",".",".","6"] ... ,[".","6",".",".",".",".","2","8","."] ... ,[".",".",".","4","1","9",".",".","5"] ... ,[".",".",".",".","8",".",".","7","9"] ... ]) False >>> is_valid_sudoku_board([ ... ["1","2","3","4","5","6","7","8","9"] ... ,["4","5","6","7","8","9","1","2","3"] ... ,["7","8","9","1","2","3","4","5","6"] ... ,[".",".",".",".",".",".",".",".","."] ... ,[".",".",".",".",".",".",".",".","."] ... ,[".",".",".",".",".",".",".",".","."] ... ,[".",".",".",".",".",".",".",".","."] ... ,[".",".",".",".",".",".",".",".","."] ... ,[".",".",".",".",".",".",".",".","."] ... ]) True >>> is_valid_sudoku_board([ ... ["1","2","3",".",".",".",".",".","."] ... ,["4","5","6",".",".",".",".",".","."] ... ,["7","8","9",".",".",".",".",".","."] ... ,[".",".",".","4","5","6",".",".","."] ... ,[".",".",".","7","8","9",".",".","."] ... ,[".",".",".","1","2","3",".",".","."] ... ,[".",".",".",".",".",".","7","8","9"] ... ,[".",".",".",".",".",".","1","2","3"] ... ,[".",".",".",".",".",".","4","5","6"] ... ]) True >>> is_valid_sudoku_board([ ... ["1","2","3",".",".",".","5","6","4"] ... ,["4","5","6",".",".",".","8","9","7"] ... ,["7","8","9",".",".",".","2","3","1"] ... ,[".",".",".","4","5","6",".",".","."] ... ,[".",".",".","7","8","9",".",".","."] ... ,[".",".",".","1","2","3",".",".","."] ... ,["3","1","2",".",".",".","7","8","9"] ... ,["6","4","5",".",".",".","1","2","3"] ... ,["9","7","8",".",".",".","4","5","6"] ... ]) True >>> is_valid_sudoku_board([ ... ["1","2","3","4","5","6","7","8","9"] ... ,["2",".",".",".",".",".",".",".","8"] ... ,["3",".",".",".",".",".",".",".","7"] ... ,["4",".",".",".",".",".",".",".","6"] ... ,["5",".",".",".",".",".",".",".","5"] ... ,["6",".",".",".",".",".",".",".","4"] ... ,["7",".",".",".",".",".",".",".","3"] ... ,["8",".",".",".",".",".",".",".","2"] ... ,["9","8","7","6","5","4","3","2","1"] ... ]) False >>> is_valid_sudoku_board([ ... ["1","2","3","8","9","7","5","6","4"] ... ,["4","5","6","2","3","1","8","9","7"] ... ,["7","8","9","5","6","4","2","3","1"] ... ,["2","3","1","4","5","6","9","7","8"] ... ,["5","6","4","7","8","9","3","1","2"] ... ,["8","9","7","1","2","3","6","4","5"] ... ,["3","1","2","6","4","5","7","8","9"] ... ,["6","4","5","9","7","8","1","2","3"] ... ,["9","7","8","3","1","2","4","5","6"] ... ]) True >>> is_valid_sudoku_board([["1", "2", "3", "4", "5", "6", "7", "8", "9"]]) Traceback (most recent call last): ... ValueError: Sudoku boards must be 9x9 squares. >>> is_valid_sudoku_board( ... [["1"], ["2"], ["3"], ["4"], ["5"], ["6"], ["7"], ["8"], ["9"]] ... ) Traceback (most recent call last): ... ValueError: Sudoku boards must be 9x9 squares. """ if len(sudoku_board) != NUM_SQUARES or ( any(len(row) != NUM_SQUARES for row in sudoku_board) ): error_message = f"Sudoku boards must be {NUM_SQUARES}x{NUM_SQUARES} squares." raise ValueError(error_message) row_values: defaultdict[int, set[str]] = defaultdict(set) col_values: defaultdict[int, set[str]] = defaultdict(set) box_values: defaultdict[tuple[int, int], set[str]] = defaultdict(set) for row in range(NUM_SQUARES): for col in range(NUM_SQUARES): value = sudoku_board[row][col] if value == EMPTY_CELL: continue box = (row // 3, col // 3) if ( value in row_values[row] or value in col_values[col] or value in box_values[box] ): return False row_values[row].add(value) col_values[col].add(value) box_values[box].add(value) return True if __name__ == "__main__": from doctest import testmod from timeit import timeit testmod() print(timeit("is_valid_sudoku_board(valid_board)", globals=globals())) print(timeit("is_valid_sudoku_board(invalid_board)", globals=globals())) ================================================ FILE: networking_flow/__init__.py ================================================ ================================================ FILE: networking_flow/ford_fulkerson.py ================================================ """ Ford-Fulkerson Algorithm for Maximum Flow Problem * https://en.wikipedia.org/wiki/Ford%E2%80%93Fulkerson_algorithm Description: (1) Start with initial flow as 0 (2) Choose the augmenting path from source to sink and add the path to flow """ graph = [ [0, 16, 13, 0, 0, 0], [0, 0, 10, 12, 0, 0], [0, 4, 0, 0, 14, 0], [0, 0, 9, 0, 0, 20], [0, 0, 0, 7, 0, 4], [0, 0, 0, 0, 0, 0], ] def breadth_first_search(graph: list, source: int, sink: int, parents: list) -> bool: """ This function returns True if there is a node that has not iterated. Args: graph: Adjacency matrix of graph source: Source sink: Sink parents: Parent list Returns: True if there is a node that has not iterated. >>> breadth_first_search(graph, 0, 5, [-1, -1, -1, -1, -1, -1]) True >>> breadth_first_search(graph, 0, 6, [-1, -1, -1, -1, -1, -1]) Traceback (most recent call last): ... IndexError: list index out of range """ visited = [False] * len(graph) # Mark all nodes as not visited queue = [] # breadth-first search queue # Source node queue.append(source) visited[source] = True while queue: u = queue.pop(0) # Pop the front node # Traverse all adjacent nodes of u for ind, node in enumerate(graph[u]): if visited[ind] is False and node > 0: queue.append(ind) visited[ind] = True parents[ind] = u return visited[sink] def ford_fulkerson(graph: list, source: int, sink: int) -> int: """ This function returns the maximum flow from source to sink in the given graph. CAUTION: This function changes the given graph. Args: graph: Adjacency matrix of graph source: Source sink: Sink Returns: Maximum flow >>> test_graph = [ ... [0, 16, 13, 0, 0, 0], ... [0, 0, 10, 12, 0, 0], ... [0, 4, 0, 0, 14, 0], ... [0, 0, 9, 0, 0, 20], ... [0, 0, 0, 7, 0, 4], ... [0, 0, 0, 0, 0, 0], ... ] >>> ford_fulkerson(test_graph, 0, 5) 23 """ # This array is filled by breadth-first search and to store path parent = [-1] * (len(graph)) max_flow = 0 # While there is a path from source to sink while breadth_first_search(graph, source, sink, parent): path_flow = int(1e9) # Infinite value s = sink while s != source: # Find the minimum value in the selected path path_flow = min(path_flow, graph[parent[s]][s]) s = parent[s] max_flow += path_flow v = sink while v != source: u = parent[v] graph[u][v] -= path_flow graph[v][u] += path_flow v = parent[v] return max_flow if __name__ == "__main__": from doctest import testmod testmod() print(f"{ford_fulkerson(graph, source=0, sink=5) = }") ================================================ FILE: networking_flow/minimum_cut.py ================================================ # Minimum cut on Ford_Fulkerson algorithm. test_graph = [ [0, 16, 13, 0, 0, 0], [0, 0, 10, 12, 0, 0], [0, 4, 0, 0, 14, 0], [0, 0, 9, 0, 0, 20], [0, 0, 0, 7, 0, 4], [0, 0, 0, 0, 0, 0], ] def bfs(graph, s, t, parent): # Return True if there is node that has not iterated. visited = [False] * len(graph) queue = [s] visited[s] = True while queue: u = queue.pop(0) for ind in range(len(graph[u])): if visited[ind] is False and graph[u][ind] > 0: queue.append(ind) visited[ind] = True parent[ind] = u return visited[t] def mincut(graph, source, sink): """This array is filled by BFS and to store path >>> mincut(test_graph, source=0, sink=5) [(1, 3), (4, 3), (4, 5)] """ parent = [-1] * (len(graph)) max_flow = 0 res = [] temp = [i[:] for i in graph] # Record original cut, copy. while bfs(graph, source, sink, parent): path_flow = float("Inf") s = sink while s != source: # Find the minimum value in select path path_flow = min(path_flow, graph[parent[s]][s]) s = parent[s] max_flow += path_flow v = sink while v != source: u = parent[v] graph[u][v] -= path_flow graph[v][u] += path_flow v = parent[v] for i in range(len(graph)): for j in range(len(graph[0])): if graph[i][j] == 0 and temp[i][j] > 0: res.append((i, j)) return res if __name__ == "__main__": print(mincut(test_graph, source=0, sink=5)) ================================================ FILE: neural_network/__init__.py ================================================ ================================================ FILE: neural_network/activation_functions/__init__.py ================================================ ================================================ FILE: neural_network/activation_functions/binary_step.py ================================================ """ This script demonstrates the implementation of the Binary Step function. It's an activation function in which the neuron is activated if the input is positive or 0, else it is deactivated It's a simple activation function which is mentioned in this wikipedia article: https://en.wikipedia.org/wiki/Activation_function """ import numpy as np def binary_step(vector: np.ndarray) -> np.ndarray: """ Implements the binary step function Parameters: vector (ndarray): A vector that consists of numeric values Returns: vector (ndarray): Input vector after applying binary step function >>> vector = np.array([-1.2, 0, 2, 1.45, -3.7, 0.3]) >>> binary_step(vector) array([0, 1, 1, 1, 0, 1]) """ return np.where(vector >= 0, 1, 0) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: neural_network/activation_functions/exponential_linear_unit.py ================================================ """ Implements the Exponential Linear Unit or ELU function. The function takes a vector of K real numbers and a real number alpha as input and then applies the ELU function to each element of the vector. Script inspired from its corresponding Wikipedia article https://en.wikipedia.org/wiki/Rectifier_(neural_networks) """ import numpy as np def exponential_linear_unit(vector: np.ndarray, alpha: float) -> np.ndarray: """ Implements the ELU activation function. Parameters: vector: the array containing input of elu activation alpha: hyper-parameter return: elu (np.array): The input numpy array after applying elu. Mathematically, f(x) = x, x>0 else (alpha * (e^x -1)), x<=0, alpha >=0 Examples: >>> exponential_linear_unit(vector=np.array([2.3,0.6,-2,-3.8]), alpha=0.3) array([ 2.3 , 0.6 , -0.25939942, -0.29328877]) >>> exponential_linear_unit(vector=np.array([-9.2,-0.3,0.45,-4.56]), alpha=0.067) array([-0.06699323, -0.01736518, 0.45 , -0.06629904]) """ return np.where(vector > 0, vector, (alpha * (np.exp(vector) - 1))) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: neural_network/activation_functions/gaussian_error_linear_unit.py ================================================ """ This script demonstrates an implementation of the Gaussian Error Linear Unit function. * https://en.wikipedia.org/wiki/Activation_function#Comparison_of_activation_functions The function takes a vector of K real numbers as input and returns x * sigmoid(1.702*x). Gaussian Error Linear Unit (GELU) is a high-performing neural network activation function. This script is inspired by a corresponding research paper. * https://arxiv.org/abs/1606.08415 """ import numpy as np def sigmoid(vector: np.ndarray) -> np.ndarray: """ Mathematical function sigmoid takes a vector x of K real numbers as input and returns 1/ (1 + e^-x). https://en.wikipedia.org/wiki/Sigmoid_function >>> sigmoid(np.array([-1.0, 1.0, 2.0])) array([0.26894142, 0.73105858, 0.88079708]) """ return 1 / (1 + np.exp(-vector)) def gaussian_error_linear_unit(vector: np.ndarray) -> np.ndarray: """ Implements the Gaussian Error Linear Unit (GELU) function Parameters: vector (np.ndarray): A numpy array of shape (1, n) consisting of real values Returns: gelu_vec (np.ndarray): The input numpy array, after applying gelu Examples: >>> gaussian_error_linear_unit(np.array([-1.0, 1.0, 2.0])) array([-0.15420423, 0.84579577, 1.93565862]) >>> gaussian_error_linear_unit(np.array([-3])) array([-0.01807131]) """ return vector * sigmoid(1.702 * vector) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: neural_network/activation_functions/leaky_rectified_linear_unit.py ================================================ """ Leaky Rectified Linear Unit (Leaky ReLU) Use Case: Leaky ReLU addresses the problem of the vanishing gradient. For more detailed information, you can refer to the following link: https://en.wikipedia.org/wiki/Rectifier_(neural_networks)#Leaky_ReLU """ import numpy as np def leaky_rectified_linear_unit(vector: np.ndarray, alpha: float) -> np.ndarray: """ Implements the LeakyReLU activation function. Parameters: vector (np.ndarray): The input array for LeakyReLU activation. alpha (float): The slope for negative values. Returns: np.ndarray: The input array after applying the LeakyReLU activation. Formula: f(x) = x if x > 0 else f(x) = alpha * x Examples: >>> leaky_rectified_linear_unit(vector=np.array([2.3,0.6,-2,-3.8]), alpha=0.3) array([ 2.3 , 0.6 , -0.6 , -1.14]) >>> leaky_rectified_linear_unit(np.array([-9.2, -0.3, 0.45, -4.56]), alpha=0.067) array([-0.6164 , -0.0201 , 0.45 , -0.30552]) """ return np.where(vector > 0, vector, alpha * vector) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: neural_network/activation_functions/mish.py ================================================ """ Mish Activation Function Use Case: Improved version of the ReLU activation function used in Computer Vision. For more detailed information, you can refer to the following link: https://en.wikipedia.org/wiki/Rectifier_(neural_networks)#Mish """ import numpy as np from .softplus import softplus def mish(vector: np.ndarray) -> np.ndarray: """ Implements the Mish activation function. Parameters: vector (np.ndarray): The input array for Mish activation. Returns: np.ndarray: The input array after applying the Mish activation. Formula: f(x) = x * tanh(softplus(x)) = x * tanh(ln(1 + e^x)) Examples: >>> mish(vector=np.array([2.3,0.6,-2,-3.8])) array([ 2.26211893, 0.46613649, -0.25250148, -0.08405831]) >>> mish(np.array([-9.2, -0.3, 0.45, -4.56])) array([-0.00092952, -0.15113318, 0.33152014, -0.04745745]) """ return vector * np.tanh(softplus(vector)) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: neural_network/activation_functions/rectified_linear_unit.py ================================================ """ This script demonstrates the implementation of the ReLU function. It's a kind of activation function defined as the positive part of its argument in the context of neural network. The function takes a vector of K real numbers as input and then argmax(x, 0). After through ReLU, the element of the vector always 0 or real number. Script inspired from its corresponding Wikipedia article https://en.wikipedia.org/wiki/Rectifier_(neural_networks) """ from __future__ import annotations import numpy as np def relu(vector: list[float]): """ Implements the relu function Parameters: vector (np.array,list,tuple): A numpy array of shape (1,n) consisting of real values or a similar list,tuple Returns: relu_vec (np.array): The input numpy array, after applying relu. >>> vec = np.array([-1, 0, 5]) >>> relu(vec) array([0, 0, 5]) """ # compare two arrays and then return element-wise maxima. return np.maximum(0, vector) if __name__ == "__main__": print(np.array(relu([-1, 0, 5]))) # --> [0, 0, 5] ================================================ FILE: neural_network/activation_functions/scaled_exponential_linear_unit.py ================================================ """ Implements the Scaled Exponential Linear Unit or SELU function. The function takes a vector of K real numbers and two real numbers alpha(default = 1.6732) & lambda (default = 1.0507) as input and then applies the SELU function to each element of the vector. SELU is a self-normalizing activation function. It is a variant of the ELU. The main advantage of SELU is that we can be sure that the output will always be standardized due to its self-normalizing behavior. That means there is no need to include Batch-Normalization layers. References : https://iq.opengenus.org/scaled-exponential-linear-unit/ """ import numpy as np def scaled_exponential_linear_unit( vector: np.ndarray, alpha: float = 1.6732, lambda_: float = 1.0507 ) -> np.ndarray: """ Applies the Scaled Exponential Linear Unit function to each element of the vector. Parameters : vector : np.ndarray alpha : float (default = 1.6732) lambda_ : float (default = 1.0507) Returns : np.ndarray Formula : f(x) = lambda_ * x if x > 0 lambda_ * alpha * (e**x - 1) if x <= 0 Examples : >>> scaled_exponential_linear_unit(vector=np.array([1.3, 3.7, 2.4])) array([1.36591, 3.88759, 2.52168]) >>> scaled_exponential_linear_unit(vector=np.array([1.3, 4.7, 8.2])) array([1.36591, 4.93829, 8.61574]) """ return lambda_ * np.where(vector > 0, vector, alpha * (np.exp(vector) - 1)) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: neural_network/activation_functions/soboleva_modified_hyperbolic_tangent.py ================================================ """ This script implements the Soboleva Modified Hyperbolic Tangent function. The function applies the Soboleva Modified Hyperbolic Tangent function to each element of the vector. More details about the activation function can be found on: https://en.wikipedia.org/wiki/Soboleva_modified_hyperbolic_tangent """ import numpy as np def soboleva_modified_hyperbolic_tangent( vector: np.ndarray, a_value: float, b_value: float, c_value: float, d_value: float ) -> np.ndarray: """ Implements the Soboleva Modified Hyperbolic Tangent function Parameters: vector (ndarray): A vector that consists of numeric values a_value (float): parameter a of the equation b_value (float): parameter b of the equation c_value (float): parameter c of the equation d_value (float): parameter d of the equation Returns: vector (ndarray): Input array after applying SMHT function >>> vector = np.array([5.4, -2.4, 6.3, -5.23, 3.27, 0.56]) >>> soboleva_modified_hyperbolic_tangent(vector, 0.2, 0.4, 0.6, 0.8) array([ 0.11075085, -0.28236685, 0.07861169, -0.1180085 , 0.22999056, 0.1566043 ]) """ # Separate the numerator and denominator for simplicity # Calculate the numerator and denominator element-wise numerator = np.exp(a_value * vector) - np.exp(-b_value * vector) denominator = np.exp(c_value * vector) + np.exp(-d_value * vector) # Calculate and return the final result element-wise return numerator / denominator if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: neural_network/activation_functions/softplus.py ================================================ """ Softplus Activation Function Use Case: The Softplus function is a smooth approximation of the ReLU function. For more detailed information, you can refer to the following link: https://en.wikipedia.org/wiki/Rectifier_(neural_networks)#Softplus """ import numpy as np def softplus(vector: np.ndarray) -> np.ndarray: """ Implements the Softplus activation function. Parameters: vector (np.ndarray): The input array for the Softplus activation. Returns: np.ndarray: The input array after applying the Softplus activation. Formula: f(x) = ln(1 + e^x) Examples: >>> softplus(np.array([2.3, 0.6, -2, -3.8])) array([2.39554546, 1.03748795, 0.12692801, 0.02212422]) >>> softplus(np.array([-9.2, -0.3, 0.45, -4.56])) array([1.01034298e-04, 5.54355244e-01, 9.43248946e-01, 1.04077103e-02]) """ return np.log(1 + np.exp(vector)) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: neural_network/activation_functions/squareplus.py ================================================ """ Squareplus Activation Function Use Case: Squareplus designed to enhance positive values and suppress negative values. For more detailed information, you can refer to the following link: https://en.wikipedia.org/wiki/Rectifier_(neural_networks)#Squareplus """ import numpy as np def squareplus(vector: np.ndarray, beta: float) -> np.ndarray: """ Implements the SquarePlus activation function. Parameters: vector (np.ndarray): The input array for the SquarePlus activation. beta (float): size of the curved region Returns: np.ndarray: The input array after applying the SquarePlus activation. Formula: f(x) = ( x + sqrt(x^2 + b) ) / 2 Examples: >>> squareplus(np.array([2.3, 0.6, -2, -3.8]), beta=2) array([2.5 , 1.06811457, 0.22474487, 0.12731349]) >>> squareplus(np.array([-9.2, -0.3, 0.45, -4.56]), beta=3) array([0.0808119 , 0.72891979, 1.11977651, 0.15893419]) """ return (vector + np.sqrt(vector**2 + beta)) / 2 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: neural_network/activation_functions/swish.py ================================================ """ This script demonstrates the implementation of the Sigmoid Linear Unit (SiLU) or swish function. * https://en.wikipedia.org/wiki/Rectifier_(neural_networks) * https://en.wikipedia.org/wiki/Swish_function The function takes a vector x of K real numbers as input and returns x * sigmoid(x). Swish is a smooth, non-monotonic function defined as f(x) = x * sigmoid(x). Extensive experiments shows that Swish consistently matches or outperforms ReLU on deep networks applied to a variety of challenging domains such as image classification and machine translation. This script is inspired by a corresponding research paper. * https://arxiv.org/abs/1710.05941 * https://blog.paperspace.com/swish-activation-function/ """ import numpy as np def sigmoid(vector: np.ndarray) -> np.ndarray: """ Mathematical function sigmoid takes a vector x of K real numbers as input and returns 1/ (1 + e^-x). https://en.wikipedia.org/wiki/Sigmoid_function >>> sigmoid(np.array([-1.0, 1.0, 2.0])) array([0.26894142, 0.73105858, 0.88079708]) """ return 1 / (1 + np.exp(-vector)) def sigmoid_linear_unit(vector: np.ndarray) -> np.ndarray: """ Implements the Sigmoid Linear Unit (SiLU) or swish function Parameters: vector (np.ndarray): A numpy array consisting of real values Returns: swish_vec (np.ndarray): The input numpy array, after applying swish Examples: >>> sigmoid_linear_unit(np.array([-1.0, 1.0, 2.0])) array([-0.26894142, 0.73105858, 1.76159416]) >>> sigmoid_linear_unit(np.array([-2])) array([-0.23840584]) """ return vector * sigmoid(vector) def swish(vector: np.ndarray, trainable_parameter: int) -> np.ndarray: """ Parameters: vector (np.ndarray): A numpy array consisting of real values trainable_parameter: Use to implement various Swish Activation Functions Returns: swish_vec (np.ndarray): The input numpy array, after applying swish Examples: >>> swish(np.array([-1.0, 1.0, 2.0]), 2) array([-0.11920292, 0.88079708, 1.96402758]) >>> swish(np.array([-2]), 1) array([-0.23840584]) """ return vector * sigmoid(trainable_parameter * vector) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: neural_network/back_propagation_neural_network.py ================================================ #!/usr/bin/python """ A Framework of Back Propagation Neural Network (BP) model Easy to use: * add many layers as you want ! ! ! * clearly see how the loss decreasing Easy to expand: * more activation functions * more loss functions * more optimization method Author: Stephen Lee Github : https://github.com/RiptideBo Date: 2017.11.23 """ import numpy as np from matplotlib import pyplot as plt def sigmoid(x: np.ndarray) -> np.ndarray: return 1 / (1 + np.exp(-x)) class DenseLayer: """ Layers of BP neural network """ def __init__( self, units, activation=None, learning_rate=None, is_input_layer=False ): """ common connected layer of bp network :param units: numbers of neural units :param activation: activation function :param learning_rate: learning rate for paras :param is_input_layer: whether it is input layer or not """ self.units = units self.weight = None self.bias = None self.activation = activation if learning_rate is None: learning_rate = 0.3 self.learn_rate = learning_rate self.is_input_layer = is_input_layer def initializer(self, back_units): rng = np.random.default_rng() self.weight = np.asmatrix(rng.normal(0, 0.5, (self.units, back_units))) self.bias = np.asmatrix(rng.normal(0, 0.5, self.units)).T if self.activation is None: self.activation = sigmoid def cal_gradient(self): # activation function may be sigmoid or linear if self.activation == sigmoid: gradient_mat = np.dot(self.output, (1 - self.output).T) gradient_activation = np.diag(np.diag(gradient_mat)) else: gradient_activation = 1 return gradient_activation def forward_propagation(self, xdata): self.xdata = xdata if self.is_input_layer: # input layer self.wx_plus_b = xdata self.output = xdata return xdata else: self.wx_plus_b = np.dot(self.weight, self.xdata) - self.bias self.output = self.activation(self.wx_plus_b) return self.output def back_propagation(self, gradient): gradient_activation = self.cal_gradient() # i * i 维 gradient = np.asmatrix(np.dot(gradient.T, gradient_activation)) self._gradient_weight = np.asmatrix(self.xdata) self._gradient_bias = -1 self._gradient_x = self.weight self.gradient_weight = np.dot(gradient.T, self._gradient_weight.T) self.gradient_bias = gradient * self._gradient_bias self.gradient = np.dot(gradient, self._gradient_x).T # upgrade: the Negative gradient direction self.weight = self.weight - self.learn_rate * self.gradient_weight self.bias = self.bias - self.learn_rate * self.gradient_bias.T # updates the weights and bias according to learning rate (0.3 if undefined) return self.gradient class BPNN: """ Back Propagation Neural Network model """ def __init__(self): self.layers = [] self.train_mse = [] self.fig_loss = plt.figure() self.ax_loss = self.fig_loss.add_subplot(1, 1, 1) def add_layer(self, layer): self.layers.append(layer) def build(self): for i, layer in enumerate(self.layers[:]): if i < 1: layer.is_input_layer = True else: layer.initializer(self.layers[i - 1].units) def summary(self): for i, layer in enumerate(self.layers[:]): print(f"------- layer {i} -------") print("weight.shape ", np.shape(layer.weight)) print("bias.shape ", np.shape(layer.bias)) def train(self, xdata, ydata, train_round, accuracy): self.train_round = train_round self.accuracy = accuracy self.ax_loss.hlines(self.accuracy, 0, self.train_round * 1.1) x_shape = np.shape(xdata) for _ in range(train_round): all_loss = 0 for row in range(x_shape[0]): _xdata = np.asmatrix(xdata[row, :]).T _ydata = np.asmatrix(ydata[row, :]).T # forward propagation for layer in self.layers: _xdata = layer.forward_propagation(_xdata) loss, gradient = self.cal_loss(_ydata, _xdata) all_loss = all_loss + loss # back propagation: the input_layer does not upgrade for layer in self.layers[:0:-1]: gradient = layer.back_propagation(gradient) mse = all_loss / x_shape[0] self.train_mse.append(mse) self.plot_loss() if mse < self.accuracy: print("----达到精度----") return mse return None def cal_loss(self, ydata, ydata_): self.loss = np.sum(np.power((ydata - ydata_), 2)) self.loss_gradient = 2 * (ydata_ - ydata) # vector (shape is the same as _ydata.shape) return self.loss, self.loss_gradient def plot_loss(self): if self.ax_loss.lines: self.ax_loss.lines.remove(self.ax_loss.lines[0]) self.ax_loss.plot(self.train_mse, "r-") plt.ion() plt.xlabel("step") plt.ylabel("loss") plt.show() plt.pause(0.1) def example(): rng = np.random.default_rng() x = rng.normal(size=(10, 10)) y = np.asarray( [ [0.8, 0.4], [0.4, 0.3], [0.34, 0.45], [0.67, 0.32], [0.88, 0.67], [0.78, 0.77], [0.55, 0.66], [0.55, 0.43], [0.54, 0.1], [0.1, 0.5], ] ) model = BPNN() for i in (10, 20, 30, 2): model.add_layer(DenseLayer(i)) model.build() model.summary() model.train(xdata=x, ydata=y, train_round=100, accuracy=0.01) if __name__ == "__main__": example() ================================================ FILE: neural_network/convolution_neural_network.py ================================================ """ - - - - - -- - - - - - - - - - - - - - - - - - - - - - - Name - - CNN - Convolution Neural Network For Photo Recognizing Goal - - Recognize Handwriting Word Photo Detail: Total 5 layers neural network * Convolution layer * Pooling layer * Input layer layer of BP * Hidden layer of BP * Output layer of BP Author: Stephen Lee Github: 245885195@qq.com Date: 2017.9.20 - - - - - -- - - - - - - - - - - - - - - - - - - - - - - """ import pickle import numpy as np from matplotlib import pyplot as plt class CNN: def __init__( self, conv1_get, size_p1, bp_num1, bp_num2, bp_num3, rate_w=0.2, rate_t=0.2 ): """ :param conv1_get: [a,c,d], size, number, step of convolution kernel :param size_p1: pooling size :param bp_num1: units number of flatten layer :param bp_num2: units number of hidden layer :param bp_num3: units number of output layer :param rate_w: rate of weight learning :param rate_t: rate of threshold learning """ self.num_bp1 = bp_num1 self.num_bp2 = bp_num2 self.num_bp3 = bp_num3 self.conv1 = conv1_get[:2] self.step_conv1 = conv1_get[2] self.size_pooling1 = size_p1 self.rate_weight = rate_w self.rate_thre = rate_t rng = np.random.default_rng() self.w_conv1 = [ np.asmatrix(-1 * rng.random((self.conv1[0], self.conv1[0])) + 0.5) for i in range(self.conv1[1]) ] self.wkj = np.asmatrix(-1 * rng.random((self.num_bp3, self.num_bp2)) + 0.5) self.vji = np.asmatrix(-1 * rng.random((self.num_bp2, self.num_bp1)) + 0.5) self.thre_conv1 = -2 * rng.random(self.conv1[1]) + 1 self.thre_bp2 = -2 * rng.random(self.num_bp2) + 1 self.thre_bp3 = -2 * rng.random(self.num_bp3) + 1 def save_model(self, save_path): # save model dict with pickle model_dic = { "num_bp1": self.num_bp1, "num_bp2": self.num_bp2, "num_bp3": self.num_bp3, "conv1": self.conv1, "step_conv1": self.step_conv1, "size_pooling1": self.size_pooling1, "rate_weight": self.rate_weight, "rate_thre": self.rate_thre, "w_conv1": self.w_conv1, "wkj": self.wkj, "vji": self.vji, "thre_conv1": self.thre_conv1, "thre_bp2": self.thre_bp2, "thre_bp3": self.thre_bp3, } with open(save_path, "wb") as f: pickle.dump(model_dic, f) print(f"Model saved: {save_path}") @classmethod def read_model(cls, model_path): # read saved model with open(model_path, "rb") as f: model_dic = pickle.load(f) # noqa: S301 conv_get = model_dic.get("conv1") conv_get.append(model_dic.get("step_conv1")) size_p1 = model_dic.get("size_pooling1") bp1 = model_dic.get("num_bp1") bp2 = model_dic.get("num_bp2") bp3 = model_dic.get("num_bp3") r_w = model_dic.get("rate_weight") r_t = model_dic.get("rate_thre") # create model instance conv_ins = CNN(conv_get, size_p1, bp1, bp2, bp3, r_w, r_t) # modify model parameter conv_ins.w_conv1 = model_dic.get("w_conv1") conv_ins.wkj = model_dic.get("wkj") conv_ins.vji = model_dic.get("vji") conv_ins.thre_conv1 = model_dic.get("thre_conv1") conv_ins.thre_bp2 = model_dic.get("thre_bp2") conv_ins.thre_bp3 = model_dic.get("thre_bp3") return conv_ins def sig(self, x): return 1 / (1 + np.exp(-1 * x)) def do_round(self, x): return round(x, 3) def convolute(self, data, convs, w_convs, thre_convs, conv_step): # convolution process size_conv = convs[0] num_conv = convs[1] size_data = np.shape(data)[0] # get the data slice of original image data, data_focus data_focus = [] for i_focus in range(0, size_data - size_conv + 1, conv_step): for j_focus in range(0, size_data - size_conv + 1, conv_step): focus = data[ i_focus : i_focus + size_conv, j_focus : j_focus + size_conv ] data_focus.append(focus) # calculate the feature map of every single kernel, and saved as list of matrix data_featuremap = [] size_feature_map = int((size_data - size_conv) / conv_step + 1) for i_map in range(num_conv): featuremap = [] for i_focus in range(len(data_focus)): net_focus = ( np.sum(np.multiply(data_focus[i_focus], w_convs[i_map])) - thre_convs[i_map] ) featuremap.append(self.sig(net_focus)) featuremap = np.asmatrix(featuremap).reshape( size_feature_map, size_feature_map ) data_featuremap.append(featuremap) # expanding the data slice to one dimension focus1_list = [] for each_focus in data_focus: focus1_list.extend(self.Expand_Mat(each_focus)) focus_list = np.asarray(focus1_list) return focus_list, data_featuremap def pooling(self, featuremaps, size_pooling, pooling_type="average_pool"): # pooling process size_map = len(featuremaps[0]) size_pooled = int(size_map / size_pooling) featuremap_pooled = [] for i_map in range(len(featuremaps)): feature_map = featuremaps[i_map] map_pooled = [] for i_focus in range(0, size_map, size_pooling): for j_focus in range(0, size_map, size_pooling): focus = feature_map[ i_focus : i_focus + size_pooling, j_focus : j_focus + size_pooling, ] if pooling_type == "average_pool": # average pooling map_pooled.append(np.average(focus)) elif pooling_type == "max_pooling": # max pooling map_pooled.append(np.max(focus)) map_pooled = np.asmatrix(map_pooled).reshape(size_pooled, size_pooled) featuremap_pooled.append(map_pooled) return featuremap_pooled def _expand(self, data): # expanding three dimension data to one dimension list data_expanded = [] for i in range(len(data)): shapes = np.shape(data[i]) data_listed = data[i].reshape(1, shapes[0] * shapes[1]) data_listed = data_listed.getA().tolist()[0] data_expanded.extend(data_listed) data_expanded = np.asarray(data_expanded) return data_expanded def _expand_mat(self, data_mat): # expanding matrix to one dimension list data_mat = np.asarray(data_mat) shapes = np.shape(data_mat) data_expanded = data_mat.reshape(1, shapes[0] * shapes[1]) return data_expanded def _calculate_gradient_from_pool( self, out_map, pd_pool, num_map, size_map, size_pooling ): """ calculate the gradient from the data slice of pool layer pd_pool: list of matrix out_map: the shape of data slice(size_map*size_map) return: pd_all: list of matrix, [num, size_map, size_map] """ pd_all = [] i_pool = 0 for i_map in range(num_map): pd_conv1 = np.ones((size_map, size_map)) for i in range(0, size_map, size_pooling): for j in range(0, size_map, size_pooling): pd_conv1[i : i + size_pooling, j : j + size_pooling] = pd_pool[ i_pool ] i_pool = i_pool + 1 pd_conv2 = np.multiply( pd_conv1, np.multiply(out_map[i_map], (1 - out_map[i_map])) ) pd_all.append(pd_conv2) return pd_all def train( self, patterns, datas_train, datas_teach, n_repeat, error_accuracy, draw_e=bool ): # model training print("----------------------Start Training-------------------------") print((" - - Shape: Train_Data ", np.shape(datas_train))) print((" - - Shape: Teach_Data ", np.shape(datas_teach))) rp = 0 all_mse = [] mse = 10000 while rp < n_repeat and mse >= error_accuracy: error_count = 0 print(f"-------------Learning Time {rp}--------------") for p in range(len(datas_train)): # print('------------Learning Image: %d--------------'%p) data_train = np.asmatrix(datas_train[p]) data_teach = np.asarray(datas_teach[p]) data_focus1, data_conved1 = self.convolute( data_train, self.conv1, self.w_conv1, self.thre_conv1, conv_step=self.step_conv1, ) data_pooled1 = self.pooling(data_conved1, self.size_pooling1) shape_featuremap1 = np.shape(data_conved1) """ print(' -----original shape ', np.shape(data_train)) print(' ---- after convolution ',np.shape(data_conv1)) print(' -----after pooling ',np.shape(data_pooled1)) """ data_bp_input = self._expand(data_pooled1) bp_out1 = data_bp_input bp_net_j = np.dot(bp_out1, self.vji.T) - self.thre_bp2 bp_out2 = self.sig(bp_net_j) bp_net_k = np.dot(bp_out2, self.wkj.T) - self.thre_bp3 bp_out3 = self.sig(bp_net_k) # --------------Model Leaning ------------------------ # calculate error and gradient--------------- pd_k_all = np.multiply( (data_teach - bp_out3), np.multiply(bp_out3, (1 - bp_out3)) ) pd_j_all = np.multiply( np.dot(pd_k_all, self.wkj), np.multiply(bp_out2, (1 - bp_out2)) ) pd_i_all = np.dot(pd_j_all, self.vji) pd_conv1_pooled = pd_i_all / (self.size_pooling1 * self.size_pooling1) pd_conv1_pooled = pd_conv1_pooled.T.getA().tolist() pd_conv1_all = self._calculate_gradient_from_pool( data_conved1, pd_conv1_pooled, shape_featuremap1[0], shape_featuremap1[1], self.size_pooling1, ) # weight and threshold learning process--------- # convolution layer for k_conv in range(self.conv1[1]): pd_conv_list = self._expand_mat(pd_conv1_all[k_conv]) delta_w = self.rate_weight * np.dot(pd_conv_list, data_focus1) self.w_conv1[k_conv] = self.w_conv1[k_conv] + delta_w.reshape( (self.conv1[0], self.conv1[0]) ) self.thre_conv1[k_conv] = ( self.thre_conv1[k_conv] - np.sum(pd_conv1_all[k_conv]) * self.rate_thre ) # all connected layer self.wkj = self.wkj + pd_k_all.T * bp_out2 * self.rate_weight self.vji = self.vji + pd_j_all.T * bp_out1 * self.rate_weight self.thre_bp3 = self.thre_bp3 - pd_k_all * self.rate_thre self.thre_bp2 = self.thre_bp2 - pd_j_all * self.rate_thre # calculate the sum error of all single image errors = np.sum(abs(data_teach - bp_out3)) error_count += errors # print(' ----Teach ',data_teach) # print(' ----BP_output ',bp_out3) rp = rp + 1 mse = error_count / patterns all_mse.append(mse) def draw_error(): yplot = [error_accuracy for i in range(int(n_repeat * 1.2))] plt.plot(all_mse, "+-") plt.plot(yplot, "r--") plt.xlabel("Learning Times") plt.ylabel("All_mse") plt.grid(True, alpha=0.5) plt.show() print("------------------Training Complete---------------------") print((" - - Training epoch: ", rp, f" - - Mse: {mse:.6f}")) if draw_e: draw_error() return mse def predict(self, datas_test): # model predict produce_out = [] print("-------------------Start Testing-------------------------") print((" - - Shape: Test_Data ", np.shape(datas_test))) for p in range(len(datas_test)): data_test = np.asmatrix(datas_test[p]) _data_focus1, data_conved1 = self.convolute( data_test, self.conv1, self.w_conv1, self.thre_conv1, conv_step=self.step_conv1, ) data_pooled1 = self.pooling(data_conved1, self.size_pooling1) data_bp_input = self._expand(data_pooled1) bp_out1 = data_bp_input bp_net_j = bp_out1 * self.vji.T - self.thre_bp2 bp_out2 = self.sig(bp_net_j) bp_net_k = bp_out2 * self.wkj.T - self.thre_bp3 bp_out3 = self.sig(bp_net_k) produce_out.extend(bp_out3.getA().tolist()) res = [list(map(self.do_round, each)) for each in produce_out] return np.asarray(res) def convolution(self, data): # return the data of image after convoluting process so we can check it out data_test = np.asmatrix(data) _data_focus1, data_conved1 = self.convolute( data_test, self.conv1, self.w_conv1, self.thre_conv1, conv_step=self.step_conv1, ) data_pooled1 = self.pooling(data_conved1, self.size_pooling1) return data_conved1, data_pooled1 if __name__ == "__main__": """ I will put the example in another file """ ================================================ FILE: neural_network/gan.py_tf ================================================ import matplotlib.gridspec as gridspec import matplotlib.pyplot as plt import numpy as np from sklearn.utils import shuffle import input_data random_numer = 42 np.random.seed(random_numer) def ReLu(x): mask = (x > 0) * 1.0 return mask * x def d_ReLu(x): mask = (x > 0) * 1.0 return mask def arctan(x): return np.arctan(x) def d_arctan(x): return 1 / (1 + x ** 2) def log(x): return 1 / (1 + np.exp(-1 * x)) def d_log(x): return log(x) * (1 - log(x)) def tanh(x): return np.tanh(x) def d_tanh(x): return 1 - np.tanh(x) ** 2 def plot(samples): fig = plt.figure(figsize=(4, 4)) gs = gridspec.GridSpec(4, 4) gs.update(wspace=0.05, hspace=0.05) for i, sample in enumerate(samples): ax = plt.subplot(gs[i]) plt.axis("off") ax.set_xticklabels([]) ax.set_yticklabels([]) ax.set_aspect("equal") plt.imshow(sample.reshape(28, 28), cmap="Greys_r") return fig if __name__ == "__main__": # 1. Load Data and declare hyper print("--------- Load Data ----------") mnist = input_data.read_data_sets("MNIST_data", one_hot=False) temp = mnist.test images, labels = temp.images, temp.labels images, labels = shuffle(np.asarray(images), np.asarray(labels)) num_epoch = 10 learing_rate = 0.00009 G_input = 100 hidden_input, hidden_input2, hidden_input3 = 128, 256, 346 hidden_input4, hidden_input5, hidden_input6 = 480, 560, 686 print("--------- Declare Hyper Parameters ----------") # 2. Declare Weights D_W1 = ( np.random.normal(size=(784, hidden_input), scale=(1.0 / np.sqrt(784 / 2.0))) * 0.002 ) # D_b1 = np.random.normal(size=(128),scale=(1. / np.sqrt(128 / 2.))) *0.002 D_b1 = np.zeros(hidden_input) D_W2 = ( np.random.normal( size=(hidden_input, 1), scale=(1.0 / np.sqrt(hidden_input / 2.0)) ) * 0.002 ) # D_b2 = np.random.normal(size=(1),scale=(1. / np.sqrt(1 / 2.))) *0.002 D_b2 = np.zeros(1) G_W1 = ( np.random.normal( size=(G_input, hidden_input), scale=(1.0 / np.sqrt(G_input / 2.0)) ) * 0.002 ) # G_b1 = np.random.normal(size=(128),scale=(1. / np.sqrt(128 / 2.))) *0.002 G_b1 = np.zeros(hidden_input) G_W2 = ( np.random.normal( size=(hidden_input, hidden_input2), scale=(1.0 / np.sqrt(hidden_input / 2.0)), ) * 0.002 ) # G_b1 = np.random.normal(size=(128),scale=(1. / np.sqrt(128 / 2.))) *0.002 G_b2 = np.zeros(hidden_input2) G_W3 = ( np.random.normal( size=(hidden_input2, hidden_input3), scale=(1.0 / np.sqrt(hidden_input2 / 2.0)), ) * 0.002 ) # G_b1 = np.random.normal(size=(128),scale=(1. / np.sqrt(128 / 2.))) *0.002 G_b3 = np.zeros(hidden_input3) G_W4 = ( np.random.normal( size=(hidden_input3, hidden_input4), scale=(1.0 / np.sqrt(hidden_input3 / 2.0)), ) * 0.002 ) # G_b1 = np.random.normal(size=(128),scale=(1. / np.sqrt(128 / 2.))) *0.002 G_b4 = np.zeros(hidden_input4) G_W5 = ( np.random.normal( size=(hidden_input4, hidden_input5), scale=(1.0 / np.sqrt(hidden_input4 / 2.0)), ) * 0.002 ) # G_b1 = np.random.normal(size=(128),scale=(1. / np.sqrt(128 / 2.))) *0.002 G_b5 = np.zeros(hidden_input5) G_W6 = ( np.random.normal( size=(hidden_input5, hidden_input6), scale=(1.0 / np.sqrt(hidden_input5 / 2.0)), ) * 0.002 ) # G_b1 = np.random.normal(size=(128),scale=(1. / np.sqrt(128 / 2.))) *0.002 G_b6 = np.zeros(hidden_input6) G_W7 = ( np.random.normal( size=(hidden_input6, 784), scale=(1.0 / np.sqrt(hidden_input6 / 2.0)) ) * 0.002 ) # G_b2 = np.random.normal(size=(784),scale=(1. / np.sqrt(784 / 2.))) *0.002 G_b7 = np.zeros(784) # 3. For Adam Optimizer v1, m1 = 0, 0 v2, m2 = 0, 0 v3, m3 = 0, 0 v4, m4 = 0, 0 v5, m5 = 0, 0 v6, m6 = 0, 0 v7, m7 = 0, 0 v8, m8 = 0, 0 v9, m9 = 0, 0 v10, m10 = 0, 0 v11, m11 = 0, 0 v12, m12 = 0, 0 v13, m13 = 0, 0 v14, m14 = 0, 0 v15, m15 = 0, 0 v16, m16 = 0, 0 v17, m17 = 0, 0 v18, m18 = 0, 0 beta_1, beta_2, eps = 0.9, 0.999, 0.00000001 print("--------- Started Training ----------") for iter in range(num_epoch): random_int = np.random.randint(len(images) - 5) current_image = np.expand_dims(images[random_int], axis=0) # Func: Generate The first Fake Data Z = np.random.uniform(-1.0, 1.0, size=[1, G_input]) Gl1 = Z.dot(G_W1) + G_b1 Gl1A = arctan(Gl1) Gl2 = Gl1A.dot(G_W2) + G_b2 Gl2A = ReLu(Gl2) Gl3 = Gl2A.dot(G_W3) + G_b3 Gl3A = arctan(Gl3) Gl4 = Gl3A.dot(G_W4) + G_b4 Gl4A = ReLu(Gl4) Gl5 = Gl4A.dot(G_W5) + G_b5 Gl5A = tanh(Gl5) Gl6 = Gl5A.dot(G_W6) + G_b6 Gl6A = ReLu(Gl6) Gl7 = Gl6A.dot(G_W7) + G_b7 current_fake_data = log(Gl7) # Func: Forward Feed for Real data Dl1_r = current_image.dot(D_W1) + D_b1 Dl1_rA = ReLu(Dl1_r) Dl2_r = Dl1_rA.dot(D_W2) + D_b2 Dl2_rA = log(Dl2_r) # Func: Forward Feed for Fake Data Dl1_f = current_fake_data.dot(D_W1) + D_b1 Dl1_fA = ReLu(Dl1_f) Dl2_f = Dl1_fA.dot(D_W2) + D_b2 Dl2_fA = log(Dl2_f) # Func: Cost D D_cost = -np.log(Dl2_rA) + np.log(1.0 - Dl2_fA) # Func: Gradient grad_f_w2_part_1 = 1 / (1.0 - Dl2_fA) grad_f_w2_part_2 = d_log(Dl2_f) grad_f_w2_part_3 = Dl1_fA grad_f_w2 = grad_f_w2_part_3.T.dot(grad_f_w2_part_1 * grad_f_w2_part_2) grad_f_b2 = grad_f_w2_part_1 * grad_f_w2_part_2 grad_f_w1_part_1 = (grad_f_w2_part_1 * grad_f_w2_part_2).dot(D_W2.T) grad_f_w1_part_2 = d_ReLu(Dl1_f) grad_f_w1_part_3 = current_fake_data grad_f_w1 = grad_f_w1_part_3.T.dot(grad_f_w1_part_1 * grad_f_w1_part_2) grad_f_b1 = grad_f_w1_part_1 * grad_f_w1_part_2 grad_r_w2_part_1 = -1 / Dl2_rA grad_r_w2_part_2 = d_log(Dl2_r) grad_r_w2_part_3 = Dl1_rA grad_r_w2 = grad_r_w2_part_3.T.dot(grad_r_w2_part_1 * grad_r_w2_part_2) grad_r_b2 = grad_r_w2_part_1 * grad_r_w2_part_2 grad_r_w1_part_1 = (grad_r_w2_part_1 * grad_r_w2_part_2).dot(D_W2.T) grad_r_w1_part_2 = d_ReLu(Dl1_r) grad_r_w1_part_3 = current_image grad_r_w1 = grad_r_w1_part_3.T.dot(grad_r_w1_part_1 * grad_r_w1_part_2) grad_r_b1 = grad_r_w1_part_1 * grad_r_w1_part_2 grad_w1 = grad_f_w1 + grad_r_w1 grad_b1 = grad_f_b1 + grad_r_b1 grad_w2 = grad_f_w2 + grad_r_w2 grad_b2 = grad_f_b2 + grad_r_b2 # ---- Update Gradient ---- m1 = beta_1 * m1 + (1 - beta_1) * grad_w1 v1 = beta_2 * v1 + (1 - beta_2) * grad_w1 ** 2 m2 = beta_1 * m2 + (1 - beta_1) * grad_b1 v2 = beta_2 * v2 + (1 - beta_2) * grad_b1 ** 2 m3 = beta_1 * m3 + (1 - beta_1) * grad_w2 v3 = beta_2 * v3 + (1 - beta_2) * grad_w2 ** 2 m4 = beta_1 * m4 + (1 - beta_1) * grad_b2 v4 = beta_2 * v4 + (1 - beta_2) * grad_b2 ** 2 D_W1 = D_W1 - (learing_rate / (np.sqrt(v1 / (1 - beta_2)) + eps)) * ( m1 / (1 - beta_1) ) D_b1 = D_b1 - (learing_rate / (np.sqrt(v2 / (1 - beta_2)) + eps)) * ( m2 / (1 - beta_1) ) D_W2 = D_W2 - (learing_rate / (np.sqrt(v3 / (1 - beta_2)) + eps)) * ( m3 / (1 - beta_1) ) D_b2 = D_b2 - (learing_rate / (np.sqrt(v4 / (1 - beta_2)) + eps)) * ( m4 / (1 - beta_1) ) # Func: Forward Feed for G Z = np.random.uniform(-1.0, 1.0, size=[1, G_input]) Gl1 = Z.dot(G_W1) + G_b1 Gl1A = arctan(Gl1) Gl2 = Gl1A.dot(G_W2) + G_b2 Gl2A = ReLu(Gl2) Gl3 = Gl2A.dot(G_W3) + G_b3 Gl3A = arctan(Gl3) Gl4 = Gl3A.dot(G_W4) + G_b4 Gl4A = ReLu(Gl4) Gl5 = Gl4A.dot(G_W5) + G_b5 Gl5A = tanh(Gl5) Gl6 = Gl5A.dot(G_W6) + G_b6 Gl6A = ReLu(Gl6) Gl7 = Gl6A.dot(G_W7) + G_b7 current_fake_data = log(Gl7) Dl1 = current_fake_data.dot(D_W1) + D_b1 Dl1_A = ReLu(Dl1) Dl2 = Dl1_A.dot(D_W2) + D_b2 Dl2_A = log(Dl2) # Func: Cost G G_cost = -np.log(Dl2_A) # Func: Gradient grad_G_w7_part_1 = ((-1 / Dl2_A) * d_log(Dl2).dot(D_W2.T) * (d_ReLu(Dl1))).dot( D_W1.T ) grad_G_w7_part_2 = d_log(Gl7) grad_G_w7_part_3 = Gl6A grad_G_w7 = grad_G_w7_part_3.T.dot(grad_G_w7_part_1 * grad_G_w7_part_1) grad_G_b7 = grad_G_w7_part_1 * grad_G_w7_part_2 grad_G_w6_part_1 = (grad_G_w7_part_1 * grad_G_w7_part_2).dot(G_W7.T) grad_G_w6_part_2 = d_ReLu(Gl6) grad_G_w6_part_3 = Gl5A grad_G_w6 = grad_G_w6_part_3.T.dot(grad_G_w6_part_1 * grad_G_w6_part_2) grad_G_b6 = grad_G_w6_part_1 * grad_G_w6_part_2 grad_G_w5_part_1 = (grad_G_w6_part_1 * grad_G_w6_part_2).dot(G_W6.T) grad_G_w5_part_2 = d_tanh(Gl5) grad_G_w5_part_3 = Gl4A grad_G_w5 = grad_G_w5_part_3.T.dot(grad_G_w5_part_1 * grad_G_w5_part_2) grad_G_b5 = grad_G_w5_part_1 * grad_G_w5_part_2 grad_G_w4_part_1 = (grad_G_w5_part_1 * grad_G_w5_part_2).dot(G_W5.T) grad_G_w4_part_2 = d_ReLu(Gl4) grad_G_w4_part_3 = Gl3A grad_G_w4 = grad_G_w4_part_3.T.dot(grad_G_w4_part_1 * grad_G_w4_part_2) grad_G_b4 = grad_G_w4_part_1 * grad_G_w4_part_2 grad_G_w3_part_1 = (grad_G_w4_part_1 * grad_G_w4_part_2).dot(G_W4.T) grad_G_w3_part_2 = d_arctan(Gl3) grad_G_w3_part_3 = Gl2A grad_G_w3 = grad_G_w3_part_3.T.dot(grad_G_w3_part_1 * grad_G_w3_part_2) grad_G_b3 = grad_G_w3_part_1 * grad_G_w3_part_2 grad_G_w2_part_1 = (grad_G_w3_part_1 * grad_G_w3_part_2).dot(G_W3.T) grad_G_w2_part_2 = d_ReLu(Gl2) grad_G_w2_part_3 = Gl1A grad_G_w2 = grad_G_w2_part_3.T.dot(grad_G_w2_part_1 * grad_G_w2_part_2) grad_G_b2 = grad_G_w2_part_1 * grad_G_w2_part_2 grad_G_w1_part_1 = (grad_G_w2_part_1 * grad_G_w2_part_2).dot(G_W2.T) grad_G_w1_part_2 = d_arctan(Gl1) grad_G_w1_part_3 = Z grad_G_w1 = grad_G_w1_part_3.T.dot(grad_G_w1_part_1 * grad_G_w1_part_2) grad_G_b1 = grad_G_w1_part_1 * grad_G_w1_part_2 # ---- Update Gradient ---- m5 = beta_1 * m5 + (1 - beta_1) * grad_G_w1 v5 = beta_2 * v5 + (1 - beta_2) * grad_G_w1 ** 2 m6 = beta_1 * m6 + (1 - beta_1) * grad_G_b1 v6 = beta_2 * v6 + (1 - beta_2) * grad_G_b1 ** 2 m7 = beta_1 * m7 + (1 - beta_1) * grad_G_w2 v7 = beta_2 * v7 + (1 - beta_2) * grad_G_w2 ** 2 m8 = beta_1 * m8 + (1 - beta_1) * grad_G_b2 v8 = beta_2 * v8 + (1 - beta_2) * grad_G_b2 ** 2 m9 = beta_1 * m9 + (1 - beta_1) * grad_G_w3 v9 = beta_2 * v9 + (1 - beta_2) * grad_G_w3 ** 2 m10 = beta_1 * m10 + (1 - beta_1) * grad_G_b3 v10 = beta_2 * v10 + (1 - beta_2) * grad_G_b3 ** 2 m11 = beta_1 * m11 + (1 - beta_1) * grad_G_w4 v11 = beta_2 * v11 + (1 - beta_2) * grad_G_w4 ** 2 m12 = beta_1 * m12 + (1 - beta_1) * grad_G_b4 v12 = beta_2 * v12 + (1 - beta_2) * grad_G_b4 ** 2 m13 = beta_1 * m13 + (1 - beta_1) * grad_G_w5 v13 = beta_2 * v13 + (1 - beta_2) * grad_G_w5 ** 2 m14 = beta_1 * m14 + (1 - beta_1) * grad_G_b5 v14 = beta_2 * v14 + (1 - beta_2) * grad_G_b5 ** 2 m15 = beta_1 * m15 + (1 - beta_1) * grad_G_w6 v15 = beta_2 * v15 + (1 - beta_2) * grad_G_w6 ** 2 m16 = beta_1 * m16 + (1 - beta_1) * grad_G_b6 v16 = beta_2 * v16 + (1 - beta_2) * grad_G_b6 ** 2 m17 = beta_1 * m17 + (1 - beta_1) * grad_G_w7 v17 = beta_2 * v17 + (1 - beta_2) * grad_G_w7 ** 2 m18 = beta_1 * m18 + (1 - beta_1) * grad_G_b7 v18 = beta_2 * v18 + (1 - beta_2) * grad_G_b7 ** 2 G_W1 = G_W1 - (learing_rate / (np.sqrt(v5 / (1 - beta_2)) + eps)) * ( m5 / (1 - beta_1) ) G_b1 = G_b1 - (learing_rate / (np.sqrt(v6 / (1 - beta_2)) + eps)) * ( m6 / (1 - beta_1) ) G_W2 = G_W2 - (learing_rate / (np.sqrt(v7 / (1 - beta_2)) + eps)) * ( m7 / (1 - beta_1) ) G_b2 = G_b2 - (learing_rate / (np.sqrt(v8 / (1 - beta_2)) + eps)) * ( m8 / (1 - beta_1) ) G_W3 = G_W3 - (learing_rate / (np.sqrt(v9 / (1 - beta_2)) + eps)) * ( m9 / (1 - beta_1) ) G_b3 = G_b3 - (learing_rate / (np.sqrt(v10 / (1 - beta_2)) + eps)) * ( m10 / (1 - beta_1) ) G_W4 = G_W4 - (learing_rate / (np.sqrt(v11 / (1 - beta_2)) + eps)) * ( m11 / (1 - beta_1) ) G_b4 = G_b4 - (learing_rate / (np.sqrt(v12 / (1 - beta_2)) + eps)) * ( m12 / (1 - beta_1) ) G_W5 = G_W5 - (learing_rate / (np.sqrt(v13 / (1 - beta_2)) + eps)) * ( m13 / (1 - beta_1) ) G_b5 = G_b5 - (learing_rate / (np.sqrt(v14 / (1 - beta_2)) + eps)) * ( m14 / (1 - beta_1) ) G_W6 = G_W6 - (learing_rate / (np.sqrt(v15 / (1 - beta_2)) + eps)) * ( m15 / (1 - beta_1) ) G_b6 = G_b6 - (learing_rate / (np.sqrt(v16 / (1 - beta_2)) + eps)) * ( m16 / (1 - beta_1) ) G_W7 = G_W7 - (learing_rate / (np.sqrt(v17 / (1 - beta_2)) + eps)) * ( m17 / (1 - beta_1) ) G_b7 = G_b7 - (learing_rate / (np.sqrt(v18 / (1 - beta_2)) + eps)) * ( m18 / (1 - beta_1) ) # --- Print Error ---- # print("Current Iter: ",iter, " Current D cost:",D_cost, " Current G cost: ", G_cost,end='\r') if iter == 0: learing_rate = learing_rate * 0.01 if iter == 40: learing_rate = learing_rate * 0.01 # ---- Print to Out put ---- if iter % 10 == 0: print( "Current Iter: ", iter, " Current D cost:", D_cost, " Current G cost: ", G_cost, end="\r", ) print("--------- Show Example Result See Tab Above ----------") print("--------- Wait for the image to load ---------") Z = np.random.uniform(-1.0, 1.0, size=[16, G_input]) Gl1 = Z.dot(G_W1) + G_b1 Gl1A = arctan(Gl1) Gl2 = Gl1A.dot(G_W2) + G_b2 Gl2A = ReLu(Gl2) Gl3 = Gl2A.dot(G_W3) + G_b3 Gl3A = arctan(Gl3) Gl4 = Gl3A.dot(G_W4) + G_b4 Gl4A = ReLu(Gl4) Gl5 = Gl4A.dot(G_W5) + G_b5 Gl5A = tanh(Gl5) Gl6 = Gl5A.dot(G_W6) + G_b6 Gl6A = ReLu(Gl6) Gl7 = Gl6A.dot(G_W7) + G_b7 current_fake_data = log(Gl7) fig = plot(current_fake_data) fig.savefig( "Click_Me_{}.png".format( str(iter).zfill(3) + "_Ginput_" + str(G_input) + "_hiddenone" + str(hidden_input) + "_hiddentwo" + str(hidden_input2) + "_LR_" + str(learing_rate) ), bbox_inches="tight", ) # for complete explanation visit https://towardsdatascience.com/only-numpy-implementing-gan-general-adversarial-networks-and-adam-optimizer-using-numpy-with-2a7e4e032021 # -- end code -- ================================================ FILE: neural_network/input_data.py ================================================ # Copyright 2016 The TensorFlow Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ============================================================================== """Functions for downloading and reading MNIST data (deprecated). This module and all its submodules are deprecated. """ import gzip import os import typing import urllib import numpy as np from tensorflow.python.framework import dtypes, random_seed from tensorflow.python.platform import gfile from tensorflow.python.util.deprecation import deprecated class _Datasets(typing.NamedTuple): train: "_DataSet" validation: "_DataSet" test: "_DataSet" # CVDF mirror of http://yann.lecun.com/exdb/mnist/ DEFAULT_SOURCE_URL = "https://storage.googleapis.com/cvdf-datasets/mnist/" def _read32(bytestream): dt = np.dtype(np.uint32).newbyteorder(">") return np.frombuffer(bytestream.read(4), dtype=dt)[0] @deprecated(None, "Please use tf.data to implement this functionality.") def _extract_images(f): """Extract the images into a 4D uint8 numpy array [index, y, x, depth]. Args: f: A file object that can be passed into a gzip reader. Returns: data: A 4D uint8 numpy array [index, y, x, depth]. Raises: ValueError: If the bytestream does not start with 2051. """ print("Extracting", f.name) with gzip.GzipFile(fileobj=f) as bytestream: magic = _read32(bytestream) if magic != 2051: msg = f"Invalid magic number {magic} in MNIST image file: {f.name}" raise ValueError(msg) num_images = _read32(bytestream) rows = _read32(bytestream) cols = _read32(bytestream) buf = bytestream.read(rows * cols * num_images) data = np.frombuffer(buf, dtype=np.uint8) data = data.reshape(num_images, rows, cols, 1) return data @deprecated(None, "Please use tf.one_hot on tensors.") def _dense_to_one_hot(labels_dense, num_classes): """Convert class labels from scalars to one-hot vectors.""" num_labels = labels_dense.shape[0] index_offset = np.arange(num_labels) * num_classes labels_one_hot = np.zeros((num_labels, num_classes)) labels_one_hot.flat[index_offset + labels_dense.ravel()] = 1 return labels_one_hot @deprecated(None, "Please use tf.data to implement this functionality.") def _extract_labels(f, one_hot=False, num_classes=10): """Extract the labels into a 1D uint8 numpy array [index]. Args: f: A file object that can be passed into a gzip reader. one_hot: Does one hot encoding for the result. num_classes: Number of classes for the one hot encoding. Returns: labels: a 1D uint8 numpy array. Raises: ValueError: If the bystream doesn't start with 2049. """ print("Extracting", f.name) with gzip.GzipFile(fileobj=f) as bytestream: magic = _read32(bytestream) if magic != 2049: msg = f"Invalid magic number {magic} in MNIST label file: {f.name}" raise ValueError(msg) num_items = _read32(bytestream) buf = bytestream.read(num_items) labels = np.frombuffer(buf, dtype=np.uint8) if one_hot: return _dense_to_one_hot(labels, num_classes) return labels class _DataSet: """Container class for a _DataSet (deprecated). THIS CLASS IS DEPRECATED. """ @deprecated( None, "Please use alternatives such as official/mnist/_DataSet.py" " from tensorflow/models.", ) def __init__( self, images, labels, fake_data=False, one_hot=False, dtype=dtypes.float32, reshape=True, seed=None, ): """Construct a _DataSet. one_hot arg is used only if fake_data is true. `dtype` can be either `uint8` to leave the input as `[0, 255]`, or `float32` to rescale into `[0, 1]`. Seed arg provides for convenient deterministic testing. Args: images: The images labels: The labels fake_data: Ignore inages and labels, use fake data. one_hot: Bool, return the labels as one hot vectors (if True) or ints (if False). dtype: Output image dtype. One of [uint8, float32]. `uint8` output has range [0,255]. float32 output has range [0,1]. reshape: Bool. If True returned images are returned flattened to vectors. seed: The random seed to use. """ seed1, seed2 = random_seed.get_seed(seed) # If op level seed is not set, use whatever graph level seed is returned self._rng = np.random.default_rng(seed1 if seed is None else seed2) dtype = dtypes.as_dtype(dtype).base_dtype if dtype not in (dtypes.uint8, dtypes.float32): msg = f"Invalid image dtype {dtype!r}, expected uint8 or float32" raise TypeError(msg) if fake_data: self._num_examples = 10000 self.one_hot = one_hot else: assert images.shape[0] == labels.shape[0], ( f"images.shape: {images.shape} labels.shape: {labels.shape}" ) self._num_examples = images.shape[0] # Convert shape from [num examples, rows, columns, depth] # to [num examples, rows*columns] (assuming depth == 1) if reshape: assert images.shape[3] == 1 images = images.reshape( images.shape[0], images.shape[1] * images.shape[2] ) if dtype == dtypes.float32: # Convert from [0, 255] -> [0.0, 1.0]. images = images.astype(np.float32) images = np.multiply(images, 1.0 / 255.0) self._images = images self._labels = labels self._epochs_completed = 0 self._index_in_epoch = 0 @property def images(self): return self._images @property def labels(self): return self._labels @property def num_examples(self): return self._num_examples @property def epochs_completed(self): return self._epochs_completed def next_batch(self, batch_size, fake_data=False, shuffle=True): """Return the next `batch_size` examples from this data set.""" if fake_data: fake_image = [1] * 784 fake_label = [1] + [0] * 9 if self.one_hot else 0 return ( [fake_image for _ in range(batch_size)], [fake_label for _ in range(batch_size)], ) start = self._index_in_epoch # Shuffle for the first epoch if self._epochs_completed == 0 and start == 0 and shuffle: perm0 = np.arange(self._num_examples) self._rng.shuffle(perm0) self._images = self.images[perm0] self._labels = self.labels[perm0] # Go to the next epoch if start + batch_size > self._num_examples: # Finished epoch self._epochs_completed += 1 # Get the rest examples in this epoch rest_num_examples = self._num_examples - start images_rest_part = self._images[start : self._num_examples] labels_rest_part = self._labels[start : self._num_examples] # Shuffle the data if shuffle: perm = np.arange(self._num_examples) self._rng.shuffle(perm) self._images = self.images[perm] self._labels = self.labels[perm] # Start next epoch start = 0 self._index_in_epoch = batch_size - rest_num_examples end = self._index_in_epoch images_new_part = self._images[start:end] labels_new_part = self._labels[start:end] return ( np.concatenate((images_rest_part, images_new_part), axis=0), np.concatenate((labels_rest_part, labels_new_part), axis=0), ) else: self._index_in_epoch += batch_size end = self._index_in_epoch return self._images[start:end], self._labels[start:end] @deprecated(None, "Please write your own downloading logic.") def _maybe_download(filename, work_directory, source_url): """Download the data from source url, unless it's already here. Args: filename: string, name of the file in the directory. work_directory: string, path to working directory. source_url: url to download from if file doesn't exist. Returns: Path to resulting file. """ if not gfile.Exists(work_directory): gfile.MakeDirs(work_directory) filepath = os.path.join(work_directory, filename) if not gfile.Exists(filepath): urllib.request.urlretrieve(source_url, filepath) # noqa: S310 with gfile.GFile(filepath) as f: size = f.size() print("Successfully downloaded", filename, size, "bytes.") return filepath @deprecated(None, "Please use alternatives such as: tensorflow_datasets.load('mnist')") def read_data_sets( train_dir, fake_data=False, one_hot=False, dtype=dtypes.float32, reshape=True, validation_size=5000, seed=None, source_url=DEFAULT_SOURCE_URL, ): if fake_data: def fake(): return _DataSet( [], [], fake_data=True, one_hot=one_hot, dtype=dtype, seed=seed ) train = fake() validation = fake() test = fake() return _Datasets(train=train, validation=validation, test=test) if not source_url: # empty string check source_url = DEFAULT_SOURCE_URL train_images_file = "train-images-idx3-ubyte.gz" train_labels_file = "train-labels-idx1-ubyte.gz" test_images_file = "t10k-images-idx3-ubyte.gz" test_labels_file = "t10k-labels-idx1-ubyte.gz" local_file = _maybe_download( train_images_file, train_dir, source_url + train_images_file ) with gfile.Open(local_file, "rb") as f: train_images = _extract_images(f) local_file = _maybe_download( train_labels_file, train_dir, source_url + train_labels_file ) with gfile.Open(local_file, "rb") as f: train_labels = _extract_labels(f, one_hot=one_hot) local_file = _maybe_download( test_images_file, train_dir, source_url + test_images_file ) with gfile.Open(local_file, "rb") as f: test_images = _extract_images(f) local_file = _maybe_download( test_labels_file, train_dir, source_url + test_labels_file ) with gfile.Open(local_file, "rb") as f: test_labels = _extract_labels(f, one_hot=one_hot) if not 0 <= validation_size <= len(train_images): msg = ( "Validation size should be between 0 and " f"{len(train_images)}. Received: {validation_size}." ) raise ValueError(msg) validation_images = train_images[:validation_size] validation_labels = train_labels[:validation_size] train_images = train_images[validation_size:] train_labels = train_labels[validation_size:] options = {"dtype": dtype, "reshape": reshape, "seed": seed} train = _DataSet(train_images, train_labels, **options) validation = _DataSet(validation_images, validation_labels, **options) test = _DataSet(test_images, test_labels, **options) return _Datasets(train=train, validation=validation, test=test) ================================================ FILE: neural_network/perceptron.py.DISABLED ================================================ """ Perceptron w = w + N * (d(k) - y) * x(k) Using perceptron network for oil analysis, with Measuring of 3 parameters that represent chemical characteristics we can classify the oil, in p1 or p2 p1 = -1 p2 = 1 """ import random class Perceptron: def __init__( self, sample: list[list[float]], target: list[int], learning_rate: float = 0.01, epoch_number: int = 1000, bias: float = -1, ) -> None: """ Initializes a Perceptron network for oil analysis :param sample: sample dataset of 3 parameters with shape [30,3] :param target: variable for classification with two possible states -1 or 1 :param learning_rate: learning rate used in optimizing. :param epoch_number: number of epochs to train network on. :param bias: bias value for the network. >>> p = Perceptron([], (0, 1, 2)) Traceback (most recent call last): ... ValueError: Sample data can not be empty >>> p = Perceptron(([0], 1, 2), []) Traceback (most recent call last): ... ValueError: Target data can not be empty >>> p = Perceptron(([0], 1, 2), (0, 1)) Traceback (most recent call last): ... ValueError: Sample data and Target data do not have matching lengths """ self.sample = sample if len(self.sample) == 0: raise ValueError("Sample data can not be empty") self.target = target if len(self.target) == 0: raise ValueError("Target data can not be empty") if len(self.sample) != len(self.target): raise ValueError("Sample data and Target data do not have matching lengths") self.learning_rate = learning_rate self.epoch_number = epoch_number self.bias = bias self.number_sample = len(sample) self.col_sample = len(sample[0]) # number of columns in dataset self.weight: list = [] def training(self) -> None: """ Trains perceptron for epochs <= given number of epochs :return: None >>> data = [[2.0149, 0.6192, 10.9263]] >>> targets = [-1] >>> perceptron = Perceptron(data,targets) >>> perceptron.training() # doctest: +ELLIPSIS ('\\nEpoch:\\n', ...) ... """ for sample in self.sample: sample.insert(0, self.bias) for _ in range(self.col_sample): self.weight.append(random.random()) self.weight.insert(0, self.bias) epoch_count = 0 while True: has_misclassified = False for i in range(self.number_sample): u = 0 for j in range(self.col_sample + 1): u = u + self.weight[j] * self.sample[i][j] y = self.sign(u) if y != self.target[i]: for j in range(self.col_sample + 1): self.weight[j] = ( self.weight[j] + self.learning_rate * (self.target[i] - y) * self.sample[i][j] ) has_misclassified = True # print('Epoch: \n',epoch_count) epoch_count = epoch_count + 1 # if you want control the epoch or just by error if not has_misclassified: print(("\nEpoch:\n", epoch_count)) print("------------------------\n") # if epoch_count > self.epoch_number or not error: break def sort(self, sample: list[float]) -> None: """ :param sample: example row to classify as P1 or P2 :return: None >>> data = [[2.0149, 0.6192, 10.9263]] >>> targets = [-1] >>> perceptron = Perceptron(data,targets) >>> perceptron.training() # doctest: +ELLIPSIS ('\\nEpoch:\\n', ...) ... >>> perceptron.sort([-0.6508, 0.1097, 4.0009]) # doctest: +ELLIPSIS ('Sample: ', ...) classification: P... """ if len(self.sample) == 0: raise ValueError("Sample data can not be empty") sample.insert(0, self.bias) u = 0 for i in range(self.col_sample + 1): u = u + self.weight[i] * sample[i] y = self.sign(u) if y == -1: print(("Sample: ", sample)) print("classification: P1") else: print(("Sample: ", sample)) print("classification: P2") def sign(self, u: float) -> int: """ threshold function for classification :param u: input number :return: 1 if the input is greater than 0, otherwise -1 >>> data = [[0],[-0.5],[0.5]] >>> targets = [1,-1,1] >>> perceptron = Perceptron(data,targets) >>> perceptron.sign(0) 1 >>> perceptron.sign(-0.5) -1 >>> perceptron.sign(0.5) 1 """ return 1 if u >= 0 else -1 samples = [ [-0.6508, 0.1097, 4.0009], [-1.4492, 0.8896, 4.4005], [2.0850, 0.6876, 12.0710], [0.2626, 1.1476, 7.7985], [0.6418, 1.0234, 7.0427], [0.2569, 0.6730, 8.3265], [1.1155, 0.6043, 7.4446], [0.0914, 0.3399, 7.0677], [0.0121, 0.5256, 4.6316], [-0.0429, 0.4660, 5.4323], [0.4340, 0.6870, 8.2287], [0.2735, 1.0287, 7.1934], [0.4839, 0.4851, 7.4850], [0.4089, -0.1267, 5.5019], [1.4391, 0.1614, 8.5843], [-0.9115, -0.1973, 2.1962], [0.3654, 1.0475, 7.4858], [0.2144, 0.7515, 7.1699], [0.2013, 1.0014, 6.5489], [0.6483, 0.2183, 5.8991], [-0.1147, 0.2242, 7.2435], [-0.7970, 0.8795, 3.8762], [-1.0625, 0.6366, 2.4707], [0.5307, 0.1285, 5.6883], [-1.2200, 0.7777, 1.7252], [0.3957, 0.1076, 5.6623], [-0.1013, 0.5989, 7.1812], [2.4482, 0.9455, 11.2095], [2.0149, 0.6192, 10.9263], [0.2012, 0.2611, 5.4631], ] target = [ -1, -1, -1, 1, 1, -1, 1, -1, 1, 1, -1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, 1, ] if __name__ == "__main__": import doctest doctest.testmod() network = Perceptron( sample=samples, target=target, learning_rate=0.01, epoch_number=1000, bias=-1 ) network.training() print("Finished training perceptron") print("Enter values to predict or q to exit") while True: sample: list = [] for i in range(len(samples[0])): user_input = input("value: ").strip() if user_input == "q": break observation = float(user_input) sample.insert(i, observation) network.sort(sample) ================================================ FILE: neural_network/simple_neural_network.py ================================================ """ Forward propagation explanation: https://towardsdatascience.com/forward-propagation-in-neural-networks-simplified-math-and-code-version-bbcfef6f9250 """ import math import random # Sigmoid def sigmoid_function(value: float, deriv: bool = False) -> float: """Return the sigmoid function of a float. >>> sigmoid_function(3.5) 0.9706877692486436 >>> sigmoid_function(3.5, True) -8.75 """ if deriv: return value * (1 - value) return 1 / (1 + math.exp(-value)) # Initial Value INITIAL_VALUE = 0.02 def forward_propagation(expected: int, number_propagations: int) -> float: """Return the value found after the forward propagation training. >>> res = forward_propagation(32, 450_000) # Was 10_000_000 >>> res > 31 and res < 33 True >>> res = forward_propagation(32, 1000) >>> res > 31 and res < 33 False """ # Random weight weight = float(2 * (random.randint(1, 100)) - 1) for _ in range(number_propagations): # Forward propagation layer_1 = sigmoid_function(INITIAL_VALUE * weight) # How much did we miss? layer_1_error = (expected / 100) - layer_1 # Error delta layer_1_delta = layer_1_error * sigmoid_function(layer_1, True) # Update weight weight += INITIAL_VALUE * layer_1_delta return layer_1 * 100 if __name__ == "__main__": import doctest doctest.testmod() expected = int(input("Expected value: ")) number_propagations = int(input("Number of propagations: ")) print(forward_propagation(expected, number_propagations)) ================================================ FILE: neural_network/two_hidden_layers_neural_network.py ================================================ """ References: - http://neuralnetworksanddeeplearning.com/chap2.html (Backpropagation) - https://en.wikipedia.org/wiki/Sigmoid_function (Sigmoid activation function) - https://en.wikipedia.org/wiki/Feedforward_neural_network (Feedforward) """ import numpy as np class TwoHiddenLayerNeuralNetwork: def __init__(self, input_array: np.ndarray, output_array: np.ndarray) -> None: """ This function initializes the TwoHiddenLayerNeuralNetwork class with random weights for every layer and initializes predicted output with zeroes. input_array : input values for training the neural network (i.e training data) . output_array : expected output values of the given inputs. """ # Input values provided for training the model. self.input_array = input_array # Random initial weights are assigned where first argument is the # number of nodes in previous layer and second argument is the # number of nodes in the next layer. # Random initial weights are assigned. # self.input_array.shape[1] is used to represent number of nodes in input layer. # First hidden layer consists of 4 nodes. rng = np.random.default_rng() self.input_layer_and_first_hidden_layer_weights = rng.random( (self.input_array.shape[1], 4) ) # Random initial values for the first hidden layer. # First hidden layer has 4 nodes. # Second hidden layer has 3 nodes. self.first_hidden_layer_and_second_hidden_layer_weights = rng.random((4, 3)) # Random initial values for the second hidden layer. # Second hidden layer has 3 nodes. # Output layer has 1 node. self.second_hidden_layer_and_output_layer_weights = rng.random((3, 1)) # Real output values provided. self.output_array = output_array # Predicted output values by the neural network. # Predicted_output array initially consists of zeroes. self.predicted_output = np.zeros(output_array.shape) def feedforward(self) -> np.ndarray: """ The information moves in only one direction i.e. forward from the input nodes, through the two hidden nodes and to the output nodes. There are no cycles or loops in the network. Return layer_between_second_hidden_layer_and_output (i.e the last layer of the neural network). >>> input_val = np.array(([0, 0, 0], [0, 0, 0], [0, 0, 0]), dtype=float) >>> output_val = np.array(([0], [0], [0]), dtype=float) >>> nn = TwoHiddenLayerNeuralNetwork(input_val, output_val) >>> res = nn.feedforward() >>> array_sum = np.sum(res) >>> bool(np.isnan(array_sum)) False """ # Layer_between_input_and_first_hidden_layer is the layer connecting the # input nodes with the first hidden layer nodes. self.layer_between_input_and_first_hidden_layer = sigmoid( np.dot(self.input_array, self.input_layer_and_first_hidden_layer_weights) ) # layer_between_first_hidden_layer_and_second_hidden_layer is the layer # connecting the first hidden set of nodes with the second hidden set of nodes. self.layer_between_first_hidden_layer_and_second_hidden_layer = sigmoid( np.dot( self.layer_between_input_and_first_hidden_layer, self.first_hidden_layer_and_second_hidden_layer_weights, ) ) # layer_between_second_hidden_layer_and_output is the layer connecting # second hidden layer with the output node. self.layer_between_second_hidden_layer_and_output = sigmoid( np.dot( self.layer_between_first_hidden_layer_and_second_hidden_layer, self.second_hidden_layer_and_output_layer_weights, ) ) return self.layer_between_second_hidden_layer_and_output def back_propagation(self) -> None: """ Function for fine-tuning the weights of the neural net based on the error rate obtained in the previous epoch (i.e., iteration). Updation is done using derivative of sogmoid activation function. >>> input_val = np.array(([0, 0, 0], [0, 0, 0], [0, 0, 0]), dtype=float) >>> output_val = np.array(([0], [0], [0]), dtype=float) >>> nn = TwoHiddenLayerNeuralNetwork(input_val, output_val) >>> res = nn.feedforward() >>> nn.back_propagation() >>> updated_weights = nn.second_hidden_layer_and_output_layer_weights >>> bool((res == updated_weights).all()) False """ updated_second_hidden_layer_and_output_layer_weights = np.dot( self.layer_between_first_hidden_layer_and_second_hidden_layer.T, 2 * (self.output_array - self.predicted_output) * sigmoid_derivative(self.predicted_output), ) updated_first_hidden_layer_and_second_hidden_layer_weights = np.dot( self.layer_between_input_and_first_hidden_layer.T, np.dot( 2 * (self.output_array - self.predicted_output) * sigmoid_derivative(self.predicted_output), self.second_hidden_layer_and_output_layer_weights.T, ) * sigmoid_derivative( self.layer_between_first_hidden_layer_and_second_hidden_layer ), ) updated_input_layer_and_first_hidden_layer_weights = np.dot( self.input_array.T, np.dot( np.dot( 2 * (self.output_array - self.predicted_output) * sigmoid_derivative(self.predicted_output), self.second_hidden_layer_and_output_layer_weights.T, ) * sigmoid_derivative( self.layer_between_first_hidden_layer_and_second_hidden_layer ), self.first_hidden_layer_and_second_hidden_layer_weights.T, ) * sigmoid_derivative(self.layer_between_input_and_first_hidden_layer), ) self.input_layer_and_first_hidden_layer_weights += ( updated_input_layer_and_first_hidden_layer_weights ) self.first_hidden_layer_and_second_hidden_layer_weights += ( updated_first_hidden_layer_and_second_hidden_layer_weights ) self.second_hidden_layer_and_output_layer_weights += ( updated_second_hidden_layer_and_output_layer_weights ) def train(self, output: np.ndarray, iterations: int, give_loss: bool) -> None: """ Performs the feedforwarding and back propagation process for the given number of iterations. Every iteration will update the weights of neural network. output : real output values,required for calculating loss. iterations : number of times the weights are to be updated. give_loss : boolean value, If True then prints loss for each iteration, If False then nothing is printed >>> input_val = np.array(([0, 0, 0], [0, 1, 0], [0, 0, 1]), dtype=float) >>> output_val = np.array(([0], [1], [1]), dtype=float) >>> nn = TwoHiddenLayerNeuralNetwork(input_val, output_val) >>> first_iteration_weights = nn.feedforward() >>> nn.back_propagation() >>> updated_weights = nn.second_hidden_layer_and_output_layer_weights >>> bool((first_iteration_weights == updated_weights).all()) False """ for iteration in range(1, iterations + 1): self.output = self.feedforward() self.back_propagation() if give_loss: loss = np.mean(np.square(output - self.feedforward())) print(f"Iteration {iteration} Loss: {loss}") def predict(self, input_arr: np.ndarray) -> int: """ Predict's the output for the given input values using the trained neural network. The output value given by the model ranges in-between 0 and 1. The predict function returns 1 if the model value is greater than the threshold value else returns 0, as the real output values are in binary. >>> input_val = np.array(([0, 0, 0], [0, 1, 0], [0, 0, 1]), dtype=float) >>> output_val = np.array(([0], [1], [1]), dtype=float) >>> nn = TwoHiddenLayerNeuralNetwork(input_val, output_val) >>> nn.train(output_val, 1000, False) >>> nn.predict([0, 1, 0]) in (0, 1) True """ # Input values for which the predictions are to be made. self.array = input_arr self.layer_between_input_and_first_hidden_layer = sigmoid( np.dot(self.array, self.input_layer_and_first_hidden_layer_weights) ) self.layer_between_first_hidden_layer_and_second_hidden_layer = sigmoid( np.dot( self.layer_between_input_and_first_hidden_layer, self.first_hidden_layer_and_second_hidden_layer_weights, ) ) self.layer_between_second_hidden_layer_and_output = sigmoid( np.dot( self.layer_between_first_hidden_layer_and_second_hidden_layer, self.second_hidden_layer_and_output_layer_weights, ) ) return int((self.layer_between_second_hidden_layer_and_output > 0.6)[0]) def sigmoid(value: np.ndarray) -> np.ndarray: """ Applies sigmoid activation function. return normalized values >>> sigmoid(np.array(([1, 0, 2], [1, 0, 0]), dtype=np.float64)) array([[0.73105858, 0.5 , 0.88079708], [0.73105858, 0.5 , 0.5 ]]) """ return 1 / (1 + np.exp(-value)) def sigmoid_derivative(value: np.ndarray) -> np.ndarray: """ Provides the derivative value of the sigmoid function. returns derivative of the sigmoid value >>> sigmoid_derivative(np.array(([1, 0, 2], [1, 0, 0]), dtype=np.float64)) array([[ 0., 0., -2.], [ 0., 0., 0.]]) """ return (value) * (1 - (value)) def example() -> int: """ Example for "how to use the neural network class and use the respected methods for the desired output". Calls the TwoHiddenLayerNeuralNetwork class and provides the fixed input output values to the model. Model is trained for a fixed amount of iterations then the predict method is called. In this example the output is divided into 2 classes i.e. binary classification, the two classes are represented by '0' and '1'. >>> example() in (0, 1) True """ # Input values. test_input = np.array( ( [0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1], ), dtype=np.float64, ) # True output values for the given input values. output = np.array(([0], [1], [1], [0], [1], [0], [0], [1]), dtype=np.float64) # Calling neural network class. neural_network = TwoHiddenLayerNeuralNetwork( input_array=test_input, output_array=output ) # Calling training function. # Set give_loss to True if you want to see loss in every iteration. neural_network.train(output=output, iterations=10, give_loss=False) return neural_network.predict(np.array(([1, 1, 1]), dtype=np.float64)) if __name__ == "__main__": example() ================================================ FILE: other/__init__.py ================================================ ================================================ FILE: other/activity_selection.py ================================================ """The following implementation assumes that the activities are already sorted according to their finish time""" """Prints a maximum set of activities that can be done by a single person, one at a time""" # n --> Total number of activities # start[]--> An array that contains start time of all activities # finish[] --> An array that contains finish time of all activities def print_max_activities(start: list[int], finish: list[int]) -> None: """ >>> start = [1, 3, 0, 5, 8, 5] >>> finish = [2, 4, 6, 7, 9, 9] >>> print_max_activities(start, finish) The following activities are selected: 0,1,3,4, """ n = len(finish) print("The following activities are selected:") # The first activity is always selected i = 0 print(i, end=",") # Consider rest of the activities for j in range(n): # If this activity has start time greater than # or equal to the finish time of previously # selected activity, then select it if start[j] >= finish[i]: print(j, end=",") i = j if __name__ == "__main__": import doctest doctest.testmod() start = [1, 3, 0, 5, 8, 5] finish = [2, 4, 6, 7, 9, 9] print_max_activities(start, finish) ================================================ FILE: other/alternative_list_arrange.py ================================================ def alternative_list_arrange(first_input_list: list, second_input_list: list) -> list: """ The method arranges two lists as one list in alternative forms of the list elements. :param first_input_list: :param second_input_list: :return: List >>> alternative_list_arrange([1, 2, 3, 4, 5], ["A", "B", "C"]) [1, 'A', 2, 'B', 3, 'C', 4, 5] >>> alternative_list_arrange(["A", "B", "C"], [1, 2, 3, 4, 5]) ['A', 1, 'B', 2, 'C', 3, 4, 5] >>> alternative_list_arrange(["X", "Y", "Z"], [9, 8, 7, 6]) ['X', 9, 'Y', 8, 'Z', 7, 6] >>> alternative_list_arrange([1, 2, 3, 4, 5], []) [1, 2, 3, 4, 5] """ first_input_list_length: int = len(first_input_list) second_input_list_length: int = len(second_input_list) abs_length: int = ( first_input_list_length if first_input_list_length > second_input_list_length else second_input_list_length ) output_result_list: list = [] for char_count in range(abs_length): if char_count < first_input_list_length: output_result_list.append(first_input_list[char_count]) if char_count < second_input_list_length: output_result_list.append(second_input_list[char_count]) return output_result_list if __name__ == "__main__": print(alternative_list_arrange(["A", "B", "C"], [1, 2, 3, 4, 5]), end=" ") ================================================ FILE: other/bankers_algorithm.py ================================================ # A Python implementation of the Banker's Algorithm in Operating Systems using # Processes and Resources # { # "Author: "Biney Kingsley (bluedistro@github.io), bineykingsley36@gmail.com", # "Date": 28-10-2018 # } """ The Banker's algorithm is a resource allocation and deadlock avoidance algorithm developed by Edsger Dijkstra that tests for safety by simulating the allocation of predetermined maximum possible amounts of all resources, and then makes a "s-state" check to test for possible deadlock conditions for all other pending activities, before deciding whether allocation should be allowed to continue. | [Source] Wikipedia | [Credit] Rosetta Code C implementation helped very much. | (https://rosettacode.org/wiki/Banker%27s_algorithm) """ from __future__ import annotations import numpy as np test_claim_vector = [8, 5, 9, 7] test_allocated_res_table = [ [2, 0, 1, 1], [0, 1, 2, 1], [4, 0, 0, 3], [0, 2, 1, 0], [1, 0, 3, 0], ] test_maximum_claim_table = [ [3, 2, 1, 4], [0, 2, 5, 2], [5, 1, 0, 5], [1, 5, 3, 0], [3, 0, 3, 3], ] class BankersAlgorithm: def __init__( self, claim_vector: list[int], allocated_resources_table: list[list[int]], maximum_claim_table: list[list[int]], ) -> None: """ :param claim_vector: A nxn/nxm list depicting the amount of each resources (eg. memory, interface, semaphores, etc.) available. :param allocated_resources_table: A nxn/nxm list depicting the amount of each resource each process is currently holding :param maximum_claim_table: A nxn/nxm list depicting how much of each resource the system currently has available """ self.__claim_vector = claim_vector self.__allocated_resources_table = allocated_resources_table self.__maximum_claim_table = maximum_claim_table def __processes_resource_summation(self) -> list[int]: """ Check for allocated resources in line with each resource in the claim vector """ return [ sum(p_item[i] for p_item in self.__allocated_resources_table) for i in range(len(self.__allocated_resources_table[0])) ] def __available_resources(self) -> list[int]: """ Check for available resources in line with each resource in the claim vector """ return np.array(self.__claim_vector) - np.array( self.__processes_resource_summation() ) def __need(self) -> list[list[int]]: """ Implement safety checker that calculates the needs by ensuring that ``max_claim[i][j] - alloc_table[i][j] <= avail[j]`` """ return [ list(np.array(self.__maximum_claim_table[i]) - np.array(allocated_resource)) for i, allocated_resource in enumerate(self.__allocated_resources_table) ] def __need_index_manager(self) -> dict[int, list[int]]: """ This function builds an index control dictionary to track original ids/indices of processes when altered during execution of method "main" :Return: {0: [a: int, b: int], 1: [c: int, d: int]} >>> index_control = BankersAlgorithm( ... test_claim_vector, test_allocated_res_table, test_maximum_claim_table ... )._BankersAlgorithm__need_index_manager() >>> {key: [int(x) for x in value] for key, value ... in index_control.items()} # doctest: +NORMALIZE_WHITESPACE {0: [1, 2, 0, 3], 1: [0, 1, 3, 1], 2: [1, 1, 0, 2], 3: [1, 3, 2, 0], 4: [2, 0, 0, 3]} """ return {self.__need().index(i): i for i in self.__need()} def main(self, **kwargs) -> None: """ Utilize various methods in this class to simulate the Banker's algorithm :Return: None >>> BankersAlgorithm(test_claim_vector, test_allocated_res_table, ... test_maximum_claim_table).main(describe=True) Allocated Resource Table P1 2 0 1 1 P2 0 1 2 1 P3 4 0 0 3 P4 0 2 1 0 P5 1 0 3 0 System Resource Table P1 3 2 1 4 P2 0 2 5 2 P3 5 1 0 5 P4 1 5 3 0 P5 3 0 3 3 Current Usage by Active Processes: 8 5 9 7 Initial Available Resources: 1 2 2 2 __________________________________________________ Process 3 is executing. Updated available resource stack for processes: 5 2 2 5 The process is in a safe state. Process 1 is executing. Updated available resource stack for processes: 7 2 3 6 The process is in a safe state. Process 2 is executing. Updated available resource stack for processes: 7 3 5 7 The process is in a safe state. Process 4 is executing. Updated available resource stack for processes: 7 5 6 7 The process is in a safe state. Process 5 is executing. Updated available resource stack for processes: 8 5 9 7 The process is in a safe state. """ need_list = self.__need() alloc_resources_table = self.__allocated_resources_table available_resources = self.__available_resources() need_index_manager = self.__need_index_manager() for kw, val in kwargs.items(): if kw and val is True: self.__pretty_data() print("_" * 50 + "\n") while need_list: safe = False for each_need in need_list: execution = True for index, need in enumerate(each_need): if need > available_resources[index]: execution = False break if execution: safe = True # get the original index of the process from ind_ctrl db for original_need_index, need_clone in need_index_manager.items(): if each_need == need_clone: process_number = original_need_index print(f"Process {process_number + 1} is executing.") # remove the process run from stack need_list.remove(each_need) # update available/freed resources stack available_resources = np.array(available_resources) + np.array( alloc_resources_table[process_number] ) print( "Updated available resource stack for processes: " + " ".join([str(x) for x in available_resources]) ) break if safe: print("The process is in a safe state.\n") else: print("System in unsafe state. Aborting...\n") break def __pretty_data(self): """ Properly align display of the algorithm's solution """ print(" " * 9 + "Allocated Resource Table") for item in self.__allocated_resources_table: print( f"P{self.__allocated_resources_table.index(item) + 1}" + " ".join(f"{it:>8}" for it in item) + "\n" ) print(" " * 9 + "System Resource Table") for item in self.__maximum_claim_table: print( f"P{self.__maximum_claim_table.index(item) + 1}" + " ".join(f"{it:>8}" for it in item) + "\n" ) print( "Current Usage by Active Processes: " + " ".join(str(x) for x in self.__claim_vector) ) print( "Initial Available Resources: " + " ".join(str(x) for x in self.__available_resources()) ) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: other/davis_putnam_logemann_loveland.py ================================================ #!/usr/bin/env python3 """ Davis-Putnam-Logemann-Loveland (DPLL) algorithm is a complete, backtracking-based search algorithm for deciding the satisfiability of propositional logic formulae in conjunctive normal form, i.e, for solving the Conjunctive Normal Form SATisfiability (CNF-SAT) problem. For more information about the algorithm: https://en.wikipedia.org/wiki/DPLL_algorithm """ from __future__ import annotations import random from collections.abc import Iterable class Clause: """ | A clause represented in Conjunctive Normal Form. | A clause is a set of literals, either complemented or otherwise. For example: * {A1, A2, A3'} is the clause (A1 v A2 v A3') * {A5', A2', A1} is the clause (A5' v A2' v A1) Create model >>> clause = Clause(["A1", "A2'", "A3"]) >>> clause.evaluate({"A1": True}) True """ def __init__(self, literals: list[str]) -> None: """ Represent the literals and an assignment in a clause." """ # Assign all literals to None initially self.literals: dict[str, bool | None] = dict.fromkeys(literals) def __str__(self) -> str: """ To print a clause as in Conjunctive Normal Form. >>> str(Clause(["A1", "A2'", "A3"])) "{A1 , A2' , A3}" """ return "{" + " , ".join(self.literals) + "}" def __len__(self) -> int: """ To print a clause as in Conjunctive Normal Form. >>> len(Clause([])) 0 >>> len(Clause(["A1", "A2'", "A3"])) 3 """ return len(self.literals) def assign(self, model: dict[str, bool | None]) -> None: """ Assign values to literals of the clause as given by model. """ for literal in self.literals: symbol = literal[:2] if symbol in model: value = model[symbol] else: continue # Complement assignment if literal is in complemented form if value is not None and literal.endswith("'"): value = not value self.literals[literal] = value def evaluate(self, model: dict[str, bool | None]) -> bool | None: """ Evaluates the clause with the assignments in model. This has the following steps: 1. Return ``True`` if both a literal and its complement exist in the clause. 2. Return ``True`` if a single literal has the assignment ``True``. 3. Return ``None`` (unable to complete evaluation) if a literal has no assignment. 4. Compute disjunction of all values assigned in clause. """ for literal in self.literals: symbol = literal.rstrip("'") if literal.endswith("'") else literal + "'" if symbol in self.literals: return True self.assign(model) for value in self.literals.values(): if value in (True, None): return value return any(self.literals.values()) class Formula: """ | A formula represented in Conjunctive Normal Form. | A formula is a set of clauses. | For example, | {{A1, A2, A3'}, {A5', A2', A1}} is ((A1 v A2 v A3') and (A5' v A2' v A1)) """ def __init__(self, clauses: Iterable[Clause]) -> None: """ Represent the number of clauses and the clauses themselves. """ self.clauses = list(clauses) def __str__(self) -> str: """ To print a formula as in Conjunctive Normal Form. >>> str(Formula([Clause(["A1", "A2'", "A3"]), Clause(["A5'", "A2'", "A1"])])) "{{A1 , A2' , A3} , {A5' , A2' , A1}}" """ return "{" + " , ".join(str(clause) for clause in self.clauses) + "}" def generate_clause() -> Clause: """ | Randomly generate a clause. | All literals have the name Ax, where x is an integer from ``1`` to ``5``. """ literals = [] no_of_literals = random.randint(1, 5) base_var = "A" i = 0 while i < no_of_literals: var_no = random.randint(1, 5) var_name = base_var + str(var_no) var_complement = random.randint(0, 1) if var_complement == 1: var_name += "'" if var_name in literals: i -= 1 else: literals.append(var_name) i += 1 return Clause(literals) def generate_formula() -> Formula: """ Randomly generate a formula. """ clauses: set[Clause] = set() no_of_clauses = random.randint(1, 10) while len(clauses) < no_of_clauses: clauses.add(generate_clause()) return Formula(clauses) def generate_parameters(formula: Formula) -> tuple[list[Clause], list[str]]: """ | Return the clauses and symbols from a formula. | A symbol is the uncomplemented form of a literal. For example, * Symbol of A3 is A3. * Symbol of A5' is A5. >>> formula = Formula([Clause(["A1", "A2'", "A3"]), Clause(["A5'", "A2'", "A1"])]) >>> clauses, symbols = generate_parameters(formula) >>> clauses_list = [str(i) for i in clauses] >>> clauses_list ["{A1 , A2' , A3}", "{A5' , A2' , A1}"] >>> symbols ['A1', 'A2', 'A3', 'A5'] """ clauses = formula.clauses symbols_set = [] for clause in formula.clauses: for literal in clause.literals: symbol = literal[:2] if symbol not in symbols_set: symbols_set.append(symbol) return clauses, symbols_set def find_pure_symbols( clauses: list[Clause], symbols: list[str], model: dict[str, bool | None] ) -> tuple[list[str], dict[str, bool | None]]: """ | Return pure symbols and their values to satisfy clause. | Pure symbols are symbols in a formula that exist only in one form, | either complemented or otherwise. | For example, | {{A4 , A3 , A5' , A1 , A3'} , {A4} , {A3}} has pure symbols A4, A5' and A1. This has the following steps: 1. Ignore clauses that have already evaluated to be ``True``. 2. Find symbols that occur only in one form in the rest of the clauses. 3. Assign value ``True`` or ``False`` depending on whether the symbols occurs in normal or complemented form respectively. >>> formula = Formula([Clause(["A1", "A2'", "A3"]), Clause(["A5'", "A2'", "A1"])]) >>> clauses, symbols = generate_parameters(formula) >>> pure_symbols, values = find_pure_symbols(clauses, symbols, {}) >>> pure_symbols ['A1', 'A2', 'A3', 'A5'] >>> values {'A1': True, 'A2': False, 'A3': True, 'A5': False} """ pure_symbols = [] assignment: dict[str, bool | None] = {} literals = [] for clause in clauses: if clause.evaluate(model): continue for literal in clause.literals: literals.append(literal) for s in symbols: sym = s + "'" if (s in literals and sym not in literals) or ( s not in literals and sym in literals ): pure_symbols.append(s) for p in pure_symbols: assignment[p] = None for s in pure_symbols: sym = s + "'" if s in literals: assignment[s] = True elif sym in literals: assignment[s] = False return pure_symbols, assignment def find_unit_clauses( clauses: list[Clause], model: dict[str, bool | None], # noqa: ARG001 ) -> tuple[list[str], dict[str, bool | None]]: """ Returns the unit symbols and their values to satisfy clause. Unit symbols are symbols in a formula that are: - Either the only symbol in a clause - Or all other literals in that clause have been assigned ``False`` This has the following steps: 1. Find symbols that are the only occurrences in a clause. 2. Find symbols in a clause where all other literals are assigned ``False``. 3. Assign ``True`` or ``False`` depending on whether the symbols occurs in normal or complemented form respectively. >>> clause1 = Clause(["A4", "A3", "A5'", "A1", "A3'"]) >>> clause2 = Clause(["A4"]) >>> clause3 = Clause(["A3"]) >>> clauses, symbols = generate_parameters(Formula([clause1, clause2, clause3])) >>> unit_clauses, values = find_unit_clauses(clauses, {}) >>> unit_clauses ['A4', 'A3'] >>> values {'A4': True, 'A3': True} """ unit_symbols = [] for clause in clauses: if len(clause) == 1: unit_symbols.append(next(iter(clause.literals.keys()))) else: f_count, n_count = 0, 0 for literal, value in clause.literals.items(): if value is False: f_count += 1 elif value is None: sym = literal n_count += 1 if f_count == len(clause) - 1 and n_count == 1: unit_symbols.append(sym) assignment: dict[str, bool | None] = {} for i in unit_symbols: symbol = i[:2] assignment[symbol] = len(i) == 2 unit_symbols = [i[:2] for i in unit_symbols] return unit_symbols, assignment def dpll_algorithm( clauses: list[Clause], symbols: list[str], model: dict[str, bool | None] ) -> tuple[bool | None, dict[str, bool | None] | None]: """ Returns the model if the formula is satisfiable, else ``None`` This has the following steps: 1. If every clause in clauses is ``True``, return ``True``. 2. If some clause in clauses is ``False``, return ``False``. 3. Find pure symbols. 4. Find unit symbols. >>> formula = Formula([Clause(["A4", "A3", "A5'", "A1", "A3'"]), Clause(["A4"])]) >>> clauses, symbols = generate_parameters(formula) >>> soln, model = dpll_algorithm(clauses, symbols, {}) >>> soln True >>> model {'A4': True} """ check_clause_all_true = True for clause in clauses: clause_check = clause.evaluate(model) if clause_check is False: return False, None elif clause_check is None: check_clause_all_true = False continue if check_clause_all_true: return True, model try: pure_symbols, assignment = find_pure_symbols(clauses, symbols, model) except RecursionError: print("raises a RecursionError and is") return None, {} p = None if len(pure_symbols) > 0: p, value = pure_symbols[0], assignment[pure_symbols[0]] if p: tmp_model = model tmp_model[p] = value tmp_symbols = list(symbols) if p in tmp_symbols: tmp_symbols.remove(p) return dpll_algorithm(clauses, tmp_symbols, tmp_model) unit_symbols, assignment = find_unit_clauses(clauses, model) p = None if len(unit_symbols) > 0: p, value = unit_symbols[0], assignment[unit_symbols[0]] if p: tmp_model = model tmp_model[p] = value tmp_symbols = list(symbols) if p in tmp_symbols: tmp_symbols.remove(p) return dpll_algorithm(clauses, tmp_symbols, tmp_model) p = symbols[0] rest = symbols[1:] tmp1, tmp2 = model, model tmp1[p], tmp2[p] = True, False return dpll_algorithm(clauses, rest, tmp1) or dpll_algorithm(clauses, rest, tmp2) if __name__ == "__main__": import doctest doctest.testmod() formula = generate_formula() print(f"The formula {formula} is", end=" ") clauses, symbols = generate_parameters(formula) solution, model = dpll_algorithm(clauses, symbols, {}) if solution: print(f"satisfiable with the assignment {model}.") else: print("not satisfiable.") ================================================ FILE: other/doomsday.py ================================================ #!/bin/python3 # Doomsday algorithm info: https://en.wikipedia.org/wiki/Doomsday_rule DOOMSDAY_LEAP = [4, 1, 7, 4, 2, 6, 4, 1, 5, 3, 7, 5] DOOMSDAY_NOT_LEAP = [3, 7, 7, 4, 2, 6, 4, 1, 5, 3, 7, 5] WEEK_DAY_NAMES = { 0: "Sunday", 1: "Monday", 2: "Tuesday", 3: "Wednesday", 4: "Thursday", 5: "Friday", 6: "Saturday", } def get_week_day(year: int, month: int, day: int) -> str: """Returns the week-day name out of a given date. >>> get_week_day(2020, 10, 24) 'Saturday' >>> get_week_day(2017, 10, 24) 'Tuesday' >>> get_week_day(2019, 5, 3) 'Friday' >>> get_week_day(1970, 9, 16) 'Wednesday' >>> get_week_day(1870, 8, 13) 'Saturday' >>> get_week_day(2040, 3, 14) 'Wednesday' """ # minimal input check: assert len(str(year)) > 2, "year should be in YYYY format" assert 1 <= month <= 12, "month should be between 1 to 12" assert 1 <= day <= 31, "day should be between 1 to 31" # Doomsday algorithm: century = year // 100 century_anchor = (5 * (century % 4) + 2) % 7 centurian = year % 100 centurian_m = centurian % 12 dooms_day = ( (centurian // 12) + centurian_m + (centurian_m // 4) + century_anchor ) % 7 day_anchor = ( DOOMSDAY_NOT_LEAP[month - 1] if year % 4 != 0 or (centurian == 0 and year % 400 != 0) else DOOMSDAY_LEAP[month - 1] ) week_day = (dooms_day + day - day_anchor) % 7 return WEEK_DAY_NAMES[week_day] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: other/fischer_yates_shuffle.py ================================================ #!/usr/bin/python """ The Fisher-Yates shuffle is an algorithm for generating a random permutation of a finite sequence. For more details visit wikipedia/Fischer-Yates-Shuffle. """ import random from typing import Any def fisher_yates_shuffle(data: list) -> list[Any]: for _ in range(len(data)): a = random.randint(0, len(data) - 1) b = random.randint(0, len(data) - 1) data[a], data[b] = data[b], data[a] return data if __name__ == "__main__": integers = [0, 1, 2, 3, 4, 5, 6, 7] strings = ["python", "says", "hello", "!"] print("Fisher-Yates Shuffle:") print("List", integers, strings) print("FY Shuffle", fisher_yates_shuffle(integers), fisher_yates_shuffle(strings)) ================================================ FILE: other/gauss_easter.py ================================================ """ https://en.wikipedia.org/wiki/Computus#Gauss'_Easter_algorithm """ import math from datetime import UTC, datetime, timedelta def gauss_easter(year: int) -> datetime: """ Calculation Gregorian easter date for given year >>> gauss_easter(2007) datetime.datetime(2007, 4, 8, 0, 0, tzinfo=datetime.timezone.utc) >>> gauss_easter(2008) datetime.datetime(2008, 3, 23, 0, 0, tzinfo=datetime.timezone.utc) >>> gauss_easter(2020) datetime.datetime(2020, 4, 12, 0, 0, tzinfo=datetime.timezone.utc) >>> gauss_easter(2021) datetime.datetime(2021, 4, 4, 0, 0, tzinfo=datetime.timezone.utc) """ metonic_cycle = year % 19 julian_leap_year = year % 4 non_leap_year = year % 7 leap_day_inhibits = math.floor(year / 100) lunar_orbit_correction = math.floor((13 + 8 * leap_day_inhibits) / 25) leap_day_reinstall_number = leap_day_inhibits / 4 secular_moon_shift = ( 15 - lunar_orbit_correction + leap_day_inhibits - leap_day_reinstall_number ) % 30 century_starting_point = (4 + leap_day_inhibits - leap_day_reinstall_number) % 7 # days to be added to March 21 days_to_add = (19 * metonic_cycle + secular_moon_shift) % 30 # PHM -> Paschal Full Moon days_from_phm_to_sunday = ( 2 * julian_leap_year + 4 * non_leap_year + 6 * days_to_add + century_starting_point ) % 7 if days_to_add == 29 and days_from_phm_to_sunday == 6: return datetime(year, 4, 19, tzinfo=UTC) elif days_to_add == 28 and days_from_phm_to_sunday == 6: return datetime(year, 4, 18, tzinfo=UTC) else: return datetime(year, 3, 22, tzinfo=UTC) + timedelta( days=int(days_to_add + days_from_phm_to_sunday) ) if __name__ == "__main__": for year in (1994, 2000, 2010, 2021, 2023, 2032, 2100): tense = "will be" if year > datetime.now(tz=UTC).year else "was" print(f"Easter in {year} {tense} {gauss_easter(year)}") ================================================ FILE: other/graham_scan.py ================================================ """ This is a pure Python implementation of the Graham scan algorithm Source: https://en.wikipedia.org/wiki/Graham_scan For doctests run following command: python3 -m doctest -v graham_scan.py """ from __future__ import annotations from collections import deque from enum import Enum from math import atan2, degrees from sys import maxsize # traversal from the lowest and the most left point in anti-clockwise direction # if direction gets right, the previous point is not the convex hull. class Direction(Enum): left = 1 straight = 2 right = 3 def __repr__(self): return f"{self.__class__.__name__}.{self.name}" def angle_comparer(point: tuple[int, int], minx: int, miny: int) -> float: """Return the angle toward to point from (minx, miny) :param point: The target point minx: The starting point's x miny: The starting point's y :return: the angle Examples: >>> angle_comparer((1,1), 0, 0) 45.0 >>> angle_comparer((100,1), 10, 10) -5.710593137499642 >>> angle_comparer((5,5), 2, 3) 33.690067525979785 """ # sort the points accorgind to the angle from the lowest and the most left point x, y = point return degrees(atan2(y - miny, x - minx)) def check_direction( starting: tuple[int, int], via: tuple[int, int], target: tuple[int, int] ) -> Direction: """Return the direction toward to the line from via to target from starting :param starting: The starting point via: The via point target: The target point :return: the Direction Examples: >>> check_direction((1,1), (2,2), (3,3)) Direction.straight >>> check_direction((60,1), (-50,199), (30,2)) Direction.left >>> check_direction((0,0), (5,5), (10,0)) Direction.right """ x0, y0 = starting x1, y1 = via x2, y2 = target via_angle = degrees(atan2(y1 - y0, x1 - x0)) via_angle %= 360 target_angle = degrees(atan2(y2 - y0, x2 - x0)) target_angle %= 360 # t- # \ \ # \ v # \| # s # via_angle is always lower than target_angle, if direction is left. # If they are same, it means they are on a same line of convex hull. if target_angle > via_angle: return Direction.left elif target_angle == via_angle: return Direction.straight else: return Direction.right def graham_scan(points: list[tuple[int, int]]) -> list[tuple[int, int]]: """Pure implementation of graham scan algorithm in Python :param points: The unique points on coordinates. :return: The points on convex hell. Examples: >>> graham_scan([(9, 6), (3, 1), (0, 0), (5, 5), (5, 2), (7, 0), (3, 3), (1, 4)]) [(0, 0), (7, 0), (9, 6), (5, 5), (1, 4)] >>> graham_scan([(0, 0), (1, 0), (1, 1), (0, 1)]) [(0, 0), (1, 0), (1, 1), (0, 1)] >>> graham_scan([(0, 0), (1, 1), (2, 2), (3, 3), (-1, 2)]) [(0, 0), (1, 1), (2, 2), (3, 3), (-1, 2)] >>> graham_scan([(-100, 20), (99, 3), (1, 10000001), (5133186, -25), (-66, -4)]) [(5133186, -25), (1, 10000001), (-100, 20), (-66, -4)] """ if len(points) <= 2: # There is no convex hull raise ValueError("graham_scan: argument must contain more than 3 points.") if len(points) == 3: return points # find the lowest and the most left point minidx = 0 miny, minx = maxsize, maxsize for i, point in enumerate(points): x = point[0] y = point[1] if y < miny: miny = y minx = x minidx = i if y == miny and x < minx: minx = x minidx = i # remove the lowest and the most left point from points for preparing for sort points.pop(minidx) sorted_points = sorted(points, key=lambda point: angle_comparer(point, minx, miny)) # This insert actually costs complexity, # and you should instead add (minx, miny) into stack later. # I'm using insert just for easy understanding. sorted_points.insert(0, (minx, miny)) stack: deque[tuple[int, int]] = deque() stack.append(sorted_points[0]) stack.append(sorted_points[1]) stack.append(sorted_points[2]) # The first 3 points lines are towards the left because we sort them by their angle # from minx, miny. current_direction = Direction.left for i in range(3, len(sorted_points)): while True: starting = stack[-2] via = stack[-1] target = sorted_points[i] next_direction = check_direction(starting, via, target) if next_direction == Direction.left: current_direction = Direction.left break if next_direction == Direction.straight: if current_direction == Direction.left: # We keep current_direction as left. # Because if the straight line keeps as straight, # we want to know if this straight line is towards left. break elif current_direction == Direction.right: # If the straight line is towards right, # every previous points on that straight line is not convex hull. stack.pop() if next_direction == Direction.right: stack.pop() stack.append(sorted_points[i]) return list(stack) ================================================ FILE: other/greedy.py ================================================ class Things: def __init__(self, name, value, weight): self.name = name self.value = value self.weight = weight def __repr__(self): return f"{self.__class__.__name__}({self.name}, {self.value}, {self.weight})" def get_value(self): return self.value def get_name(self): return self.name def get_weight(self): return self.weight def value_weight(self): return self.value / self.weight def build_menu(name, value, weight): menu = [] for i in range(len(value)): menu.append(Things(name[i], value[i], weight[i])) return menu def greedy(item, max_cost, key_func): items_copy = sorted(item, key=key_func, reverse=True) result = [] total_value, total_cost = 0.0, 0.0 for i in range(len(items_copy)): if (total_cost + items_copy[i].get_weight()) <= max_cost: result.append(items_copy[i]) total_cost += items_copy[i].get_weight() total_value += items_copy[i].get_value() return (result, total_value) def test_greedy(): """ >>> food = ["Burger", "Pizza", "Coca Cola", "Rice", ... "Sambhar", "Chicken", "Fries", "Milk"] >>> value = [80, 100, 60, 70, 50, 110, 90, 60] >>> weight = [40, 60, 40, 70, 100, 85, 55, 70] >>> foods = build_menu(food, value, weight) >>> foods # doctest: +NORMALIZE_WHITESPACE [Things(Burger, 80, 40), Things(Pizza, 100, 60), Things(Coca Cola, 60, 40), Things(Rice, 70, 70), Things(Sambhar, 50, 100), Things(Chicken, 110, 85), Things(Fries, 90, 55), Things(Milk, 60, 70)] >>> greedy(foods, 500, Things.get_value) # doctest: +NORMALIZE_WHITESPACE ([Things(Chicken, 110, 85), Things(Pizza, 100, 60), Things(Fries, 90, 55), Things(Burger, 80, 40), Things(Rice, 70, 70), Things(Coca Cola, 60, 40), Things(Milk, 60, 70)], 570.0) """ if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: other/guess_the_number_search.py ================================================ """ guess the number using lower,higher and the value to find or guess solution works by dividing lower and higher of number guessed suppose lower is 0, higher is 1000 and the number to guess is 355 >>> guess_the_number(10, 1000, 17) started... guess the number : 17 details : [505, 257, 133, 71, 40, 25, 17] """ def temp_input_value( min_val: int = 10, max_val: int = 1000, option: bool = True ) -> int: """ Temporary input values for tests >>> temp_input_value(option=True) 10 >>> temp_input_value(option=False) 1000 >>> temp_input_value(min_val=100, option=True) 100 >>> temp_input_value(min_val=100, max_val=50) Traceback (most recent call last): ... ValueError: Invalid value for min_val or max_val (min_value < max_value) >>> temp_input_value("ten","fifty",1) Traceback (most recent call last): ... AssertionError: Invalid type of value(s) specified to function! >>> temp_input_value(min_val=-100, max_val=500) -100 >>> temp_input_value(min_val=-5100, max_val=-100) -5100 """ assert ( isinstance(min_val, int) and isinstance(max_val, int) and isinstance(option, bool) ), "Invalid type of value(s) specified to function!" if min_val > max_val: raise ValueError("Invalid value for min_val or max_val (min_value < max_value)") return min_val if option else max_val def get_avg(number_1: int, number_2: int) -> int: """ Return the mid-number(whole) of two integers a and b >>> get_avg(10, 15) 12 >>> get_avg(20, 300) 160 >>> get_avg("abcd", 300) Traceback (most recent call last): ... TypeError: can only concatenate str (not "int") to str >>> get_avg(10.5,50.25) 30 """ return int((number_1 + number_2) / 2) def guess_the_number(lower: int, higher: int, to_guess: int) -> None: """ The `guess_the_number` function that guess the number by some operations and using inner functions >>> guess_the_number(10, 1000, 17) started... guess the number : 17 details : [505, 257, 133, 71, 40, 25, 17] >>> guess_the_number(-10000, 10000, 7) started... guess the number : 7 details : [0, 5000, 2500, 1250, 625, 312, 156, 78, 39, 19, 9, 4, 6, 7] >>> guess_the_number(10, 1000, "a") Traceback (most recent call last): ... AssertionError: argument values must be type of "int" >>> guess_the_number(10, 1000, 5) Traceback (most recent call last): ... ValueError: guess value must be within the range of lower and higher value >>> guess_the_number(10000, 100, 5) Traceback (most recent call last): ... ValueError: argument value for lower and higher must be(lower > higher) """ assert ( isinstance(lower, int) and isinstance(higher, int) and isinstance(to_guess, int) ), 'argument values must be type of "int"' if lower > higher: raise ValueError("argument value for lower and higher must be(lower > higher)") if not lower < to_guess < higher: raise ValueError( "guess value must be within the range of lower and higher value" ) def answer(number: int) -> str: """ Returns value by comparing with entered `to_guess` number """ if number > to_guess: return "high" elif number < to_guess: return "low" else: return "same" print("started...") last_lowest = lower last_highest = higher last_numbers = [] while True: number = get_avg(last_lowest, last_highest) last_numbers.append(number) if answer(number) == "low": last_lowest = number elif answer(number) == "high": last_highest = number else: break print(f"guess the number : {last_numbers[-1]}") print(f"details : {last_numbers!s}") def main() -> None: """ starting point or function of script """ lower = int(input("Enter lower value : ").strip()) higher = int(input("Enter high value : ").strip()) guess = int(input("Enter value to guess : ").strip()) guess_the_number(lower, higher, guess) if __name__ == "__main__": main() ================================================ FILE: other/h_index.py ================================================ """ Task: Given an array of integers citations where citations[i] is the number of citations a researcher received for their ith paper, return compute the researcher's h-index. According to the definition of h-index on Wikipedia: A scientist has an index h if h of their n papers have at least h citations each, and the other n - h papers have no more than h citations each. If there are several possible values for h, the maximum one is taken as the h-index. H-Index link: https://en.wikipedia.org/wiki/H-index Implementation notes: Use sorting of array Leetcode link: https://leetcode.com/problems/h-index/description/ n = len(citations) Runtime Complexity: O(n * log(n)) Space Complexity: O(1) """ def h_index(citations: list[int]) -> int: """ Return H-index of citations >>> h_index([3, 0, 6, 1, 5]) 3 >>> h_index([1, 3, 1]) 1 >>> h_index([1, 2, 3]) 2 >>> h_index('test') Traceback (most recent call last): ... ValueError: The citations should be a list of non negative integers. >>> h_index([1,2,'3']) Traceback (most recent call last): ... ValueError: The citations should be a list of non negative integers. >>> h_index([1,2,-3]) Traceback (most recent call last): ... ValueError: The citations should be a list of non negative integers. """ # validate: if not isinstance(citations, list) or not all( isinstance(item, int) and item >= 0 for item in citations ): raise ValueError("The citations should be a list of non negative integers.") citations.sort() len_citations = len(citations) for i in range(len_citations): if citations[len_citations - 1 - i] <= i: return i return len_citations if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: other/least_recently_used.py ================================================ from __future__ import annotations import sys from collections import deque from typing import TypeVar T = TypeVar("T") class LRUCache[T]: """ Page Replacement Algorithm, Least Recently Used (LRU) Caching. >>> lru_cache: LRUCache[str | int] = LRUCache(4) >>> lru_cache.refer("A") >>> lru_cache.refer(2) >>> lru_cache.refer(3) >>> lru_cache LRUCache(4) => [3, 2, 'A'] >>> lru_cache.refer("A") >>> lru_cache LRUCache(4) => ['A', 3, 2] >>> lru_cache.refer(4) >>> lru_cache.refer(5) >>> lru_cache LRUCache(4) => [5, 4, 'A', 3] """ dq_store: deque[T] # Cache store of keys key_reference: set[T] # References of the keys in cache _MAX_CAPACITY: int = 10 # Maximum capacity of cache def __init__(self, n: int) -> None: """Creates an empty store and map for the keys. The LRUCache is set the size n. """ self.dq_store = deque() self.key_reference = set() if not n: LRUCache._MAX_CAPACITY = sys.maxsize elif n < 0: raise ValueError("n should be an integer greater than 0.") else: LRUCache._MAX_CAPACITY = n def refer(self, x: T) -> None: """ Looks for a page in the cache store and adds reference to the set. Remove the least recently used key if the store is full. Update store to reflect recent access. """ if x not in self.key_reference: if len(self.dq_store) == LRUCache._MAX_CAPACITY: last_element = self.dq_store.pop() self.key_reference.remove(last_element) else: self.dq_store.remove(x) self.dq_store.appendleft(x) self.key_reference.add(x) def display(self) -> None: """ Prints all the elements in the store. """ for k in self.dq_store: print(k) def __repr__(self) -> str: return f"LRUCache({self._MAX_CAPACITY}) => {list(self.dq_store)}" if __name__ == "__main__": import doctest doctest.testmod() lru_cache: LRUCache[str | int] = LRUCache(4) lru_cache.refer("A") lru_cache.refer(2) lru_cache.refer(3) lru_cache.refer("A") lru_cache.refer(4) lru_cache.refer(5) lru_cache.display() print(lru_cache) assert str(lru_cache) == "LRUCache(4) => [5, 4, 'A', 3]" ================================================ FILE: other/lfu_cache.py ================================================ from __future__ import annotations from collections.abc import Callable from typing import TypeVar T = TypeVar("T") U = TypeVar("U") class DoubleLinkedListNode[T, U]: """ Double Linked List Node built specifically for LFU Cache >>> node = DoubleLinkedListNode(1,1) >>> node Node: key: 1, val: 1, freq: 0, has next: False, has prev: False """ def __init__(self, key: T | None, val: U | None): self.key = key self.val = val self.freq: int = 0 self.next: DoubleLinkedListNode[T, U] | None = None self.prev: DoubleLinkedListNode[T, U] | None = None def __repr__(self) -> str: return ( f"Node: key: {self.key}, val: {self.val}, freq: {self.freq}, " f"has next: {self.next is not None}, has prev: {self.prev is not None}" ) class DoubleLinkedList[T, U]: """ Double Linked List built specifically for LFU Cache >>> dll: DoubleLinkedList = DoubleLinkedList() >>> dll DoubleLinkedList, Node: key: None, val: None, freq: 0, has next: True, has prev: False, Node: key: None, val: None, freq: 0, has next: False, has prev: True >>> first_node = DoubleLinkedListNode(1,10) >>> first_node Node: key: 1, val: 10, freq: 0, has next: False, has prev: False >>> dll.add(first_node) >>> dll DoubleLinkedList, Node: key: None, val: None, freq: 0, has next: True, has prev: False, Node: key: 1, val: 10, freq: 1, has next: True, has prev: True, Node: key: None, val: None, freq: 0, has next: False, has prev: True >>> # node is mutated >>> first_node Node: key: 1, val: 10, freq: 1, has next: True, has prev: True >>> second_node = DoubleLinkedListNode(2,20) >>> second_node Node: key: 2, val: 20, freq: 0, has next: False, has prev: False >>> dll.add(second_node) >>> dll DoubleLinkedList, Node: key: None, val: None, freq: 0, has next: True, has prev: False, Node: key: 1, val: 10, freq: 1, has next: True, has prev: True, Node: key: 2, val: 20, freq: 1, has next: True, has prev: True, Node: key: None, val: None, freq: 0, has next: False, has prev: True >>> removed_node = dll.remove(first_node) >>> assert removed_node == first_node >>> dll DoubleLinkedList, Node: key: None, val: None, freq: 0, has next: True, has prev: False, Node: key: 2, val: 20, freq: 1, has next: True, has prev: True, Node: key: None, val: None, freq: 0, has next: False, has prev: True >>> # Attempt to remove node not on list >>> removed_node = dll.remove(first_node) >>> removed_node is None True >>> # Attempt to remove head or rear >>> dll.head Node: key: None, val: None, freq: 0, has next: True, has prev: False >>> dll.remove(dll.head) is None True >>> # Attempt to remove head or rear >>> dll.rear Node: key: None, val: None, freq: 0, has next: False, has prev: True >>> dll.remove(dll.rear) is None True """ def __init__(self) -> None: self.head: DoubleLinkedListNode[T, U] = DoubleLinkedListNode(None, None) self.rear: DoubleLinkedListNode[T, U] = DoubleLinkedListNode(None, None) self.head.next, self.rear.prev = self.rear, self.head def __repr__(self) -> str: rep = ["DoubleLinkedList"] node = self.head while node.next is not None: rep.append(str(node)) node = node.next rep.append(str(self.rear)) return ",\n ".join(rep) def add(self, node: DoubleLinkedListNode[T, U]) -> None: """ Adds the given node at the tail of the list and shifting it to proper position """ previous = self.rear.prev # All nodes other than self.head are guaranteed to have non-None previous assert previous is not None previous.next = node node.prev = previous self.rear.prev = node node.next = self.rear node.freq += 1 self._position_node(node) def _position_node(self, node: DoubleLinkedListNode[T, U]) -> None: """ Moves node forward to maintain invariant of sort by freq value """ while node.prev is not None and node.prev.freq > node.freq: # swap node with previous node previous_node = node.prev node.prev = previous_node.prev previous_node.next = node.prev node.next = previous_node previous_node.prev = node def remove( self, node: DoubleLinkedListNode[T, U] ) -> DoubleLinkedListNode[T, U] | None: """ Removes and returns the given node from the list Returns None if node.prev or node.next is None """ if node.prev is None or node.next is None: return None node.prev.next = node.next node.next.prev = node.prev node.prev = None node.next = None return node class LFUCache[T, U]: """ LFU Cache to store a given capacity of data. Can be used as a stand-alone object or as a function decorator. >>> cache = LFUCache(2) >>> cache.put(1, 1) >>> cache.put(2, 2) >>> cache.get(1) 1 >>> cache.put(3, 3) >>> cache.get(2) is None True >>> cache.put(4, 4) >>> cache.get(1) is None True >>> cache.get(3) 3 >>> cache.get(4) 4 >>> cache CacheInfo(hits=3, misses=2, capacity=2, current_size=2) >>> @LFUCache.decorator(100) ... def fib(num): ... if num in (1, 2): ... return 1 ... return fib(num - 1) + fib(num - 2) >>> for i in range(1, 101): ... res = fib(i) >>> fib.cache_info() CacheInfo(hits=196, misses=100, capacity=100, current_size=100) """ def __init__(self, capacity: int): self.list: DoubleLinkedList[T, U] = DoubleLinkedList() self.capacity = capacity self.num_keys = 0 self.hits = 0 self.miss = 0 self.cache: dict[T, DoubleLinkedListNode[T, U]] = {} def __repr__(self) -> str: """ Return the details for the cache instance [hits, misses, capacity, current_size] """ return ( f"CacheInfo(hits={self.hits}, misses={self.miss}, " f"capacity={self.capacity}, current_size={self.num_keys})" ) def __contains__(self, key: T) -> bool: """ >>> cache = LFUCache(1) >>> 1 in cache False >>> cache.put(1, 1) >>> 1 in cache True """ return key in self.cache def get(self, key: T) -> U | None: """ Returns the value for the input key and updates the Double Linked List. Returns Returns None if key is not present in cache """ if key in self.cache: self.hits += 1 value_node: DoubleLinkedListNode[T, U] = self.cache[key] node = self.list.remove(self.cache[key]) assert node == value_node # node is guaranteed not None because it is in self.cache assert node is not None self.list.add(node) return node.val self.miss += 1 return None def put(self, key: T, value: U) -> None: """ Sets the value for the input key and updates the Double Linked List """ if key not in self.cache: if self.num_keys >= self.capacity: # delete first node when over capacity first_node = self.list.head.next # guaranteed to have a non-None first node when num_keys > 0 # explain to type checker via assertions assert first_node is not None assert first_node.key is not None assert self.list.remove(first_node) is not None # first_node guaranteed to be in list del self.cache[first_node.key] self.num_keys -= 1 self.cache[key] = DoubleLinkedListNode(key, value) self.list.add(self.cache[key]) self.num_keys += 1 else: node = self.list.remove(self.cache[key]) assert node is not None # node guaranteed to be in list node.val = value self.list.add(node) @classmethod def decorator( cls: type[LFUCache[T, U]], size: int = 128 ) -> Callable[[Callable[[T], U]], Callable[..., U]]: """ Decorator version of LFU Cache Decorated function must be function of T -> U """ def cache_decorator_inner(func: Callable[[T], U]) -> Callable[..., U]: # variable to map the decorator functions to their respective instance decorator_function_to_instance_map: dict[ Callable[[T], U], LFUCache[T, U] ] = {} def cache_decorator_wrapper(*args: T) -> U: if func not in decorator_function_to_instance_map: decorator_function_to_instance_map[func] = LFUCache(size) result = decorator_function_to_instance_map[func].get(args[0]) if result is None: result = func(*args) decorator_function_to_instance_map[func].put(args[0], result) return result def cache_info() -> LFUCache[T, U]: return decorator_function_to_instance_map[func] setattr(cache_decorator_wrapper, "cache_info", cache_info) # noqa: B010 return cache_decorator_wrapper return cache_decorator_inner if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: other/linear_congruential_generator.py ================================================ __author__ = "Tobias Carryer" from time import time class LinearCongruentialGenerator: """ A pseudorandom number generator. """ # The default value for **seed** is the result of a function call, which is not # normally recommended and causes ruff to raise a B008 error. However, in this case, # it is acceptable because `LinearCongruentialGenerator.__init__()` will only be # called once per instance and it ensures that each instance will generate a unique # sequence of numbers. def __init__(self, multiplier, increment, modulo, seed=int(time())): # noqa: B008 """ These parameters are saved and used when nextNumber() is called. modulo is the largest number that can be generated (exclusive). The most efficient values are powers of 2. 2^32 is a common value. """ self.multiplier = multiplier self.increment = increment self.modulo = modulo self.seed = seed def next_number(self): """ The smallest number that can be generated is zero. The largest number that can be generated is modulo-1. modulo is set in the constructor. """ self.seed = (self.multiplier * self.seed + self.increment) % self.modulo return self.seed if __name__ == "__main__": # Show the LCG in action. lcg = LinearCongruentialGenerator(1664525, 1013904223, 2 << 31) while True: print(lcg.next_number()) ================================================ FILE: other/lru_cache.py ================================================ from __future__ import annotations from collections.abc import Callable from typing import TypeVar T = TypeVar("T") U = TypeVar("U") class DoubleLinkedListNode[T, U]: """ Double Linked List Node built specifically for LRU Cache >>> DoubleLinkedListNode(1,1) Node: key: 1, val: 1, has next: False, has prev: False """ def __init__(self, key: T | None, val: U | None): self.key = key self.val = val self.next: DoubleLinkedListNode[T, U] | None = None self.prev: DoubleLinkedListNode[T, U] | None = None def __repr__(self) -> str: return ( f"Node: key: {self.key}, val: {self.val}, " f"has next: {bool(self.next)}, has prev: {bool(self.prev)}" ) class DoubleLinkedList[T, U]: """ Double Linked List built specifically for LRU Cache >>> dll: DoubleLinkedList = DoubleLinkedList() >>> dll DoubleLinkedList, Node: key: None, val: None, has next: True, has prev: False, Node: key: None, val: None, has next: False, has prev: True >>> first_node = DoubleLinkedListNode(1,10) >>> first_node Node: key: 1, val: 10, has next: False, has prev: False >>> dll.add(first_node) >>> dll DoubleLinkedList, Node: key: None, val: None, has next: True, has prev: False, Node: key: 1, val: 10, has next: True, has prev: True, Node: key: None, val: None, has next: False, has prev: True >>> # node is mutated >>> first_node Node: key: 1, val: 10, has next: True, has prev: True >>> second_node = DoubleLinkedListNode(2,20) >>> second_node Node: key: 2, val: 20, has next: False, has prev: False >>> dll.add(second_node) >>> dll DoubleLinkedList, Node: key: None, val: None, has next: True, has prev: False, Node: key: 1, val: 10, has next: True, has prev: True, Node: key: 2, val: 20, has next: True, has prev: True, Node: key: None, val: None, has next: False, has prev: True >>> removed_node = dll.remove(first_node) >>> assert removed_node == first_node >>> dll DoubleLinkedList, Node: key: None, val: None, has next: True, has prev: False, Node: key: 2, val: 20, has next: True, has prev: True, Node: key: None, val: None, has next: False, has prev: True >>> # Attempt to remove node not on list >>> removed_node = dll.remove(first_node) >>> removed_node is None True >>> # Attempt to remove head or rear >>> dll.head Node: key: None, val: None, has next: True, has prev: False >>> dll.remove(dll.head) is None True >>> # Attempt to remove head or rear >>> dll.rear Node: key: None, val: None, has next: False, has prev: True >>> dll.remove(dll.rear) is None True """ def __init__(self) -> None: self.head: DoubleLinkedListNode[T, U] = DoubleLinkedListNode(None, None) self.rear: DoubleLinkedListNode[T, U] = DoubleLinkedListNode(None, None) self.head.next, self.rear.prev = self.rear, self.head def __repr__(self) -> str: rep = ["DoubleLinkedList"] node = self.head while node.next is not None: rep.append(str(node)) node = node.next rep.append(str(self.rear)) return ",\n ".join(rep) def add(self, node: DoubleLinkedListNode[T, U]) -> None: """ Adds the given node to the end of the list (before rear) """ previous = self.rear.prev # All nodes other than self.head are guaranteed to have non-None previous assert previous is not None previous.next = node node.prev = previous self.rear.prev = node node.next = self.rear def remove( self, node: DoubleLinkedListNode[T, U] ) -> DoubleLinkedListNode[T, U] | None: """ Removes and returns the given node from the list Returns None if node.prev or node.next is None """ if node.prev is None or node.next is None: return None node.prev.next = node.next node.next.prev = node.prev node.prev = None node.next = None return node class LRUCache[T, U]: """ LRU Cache to store a given capacity of data. Can be used as a stand-alone object or as a function decorator. >>> cache = LRUCache(2) >>> cache.put(1, 1) >>> cache.put(2, 2) >>> cache.get(1) 1 >>> cache.list DoubleLinkedList, Node: key: None, val: None, has next: True, has prev: False, Node: key: 2, val: 2, has next: True, has prev: True, Node: key: 1, val: 1, has next: True, has prev: True, Node: key: None, val: None, has next: False, has prev: True >>> cache.cache # doctest: +NORMALIZE_WHITESPACE {1: Node: key: 1, val: 1, has next: True, has prev: True, \ 2: Node: key: 2, val: 2, has next: True, has prev: True} >>> cache.put(3, 3) >>> cache.list DoubleLinkedList, Node: key: None, val: None, has next: True, has prev: False, Node: key: 1, val: 1, has next: True, has prev: True, Node: key: 3, val: 3, has next: True, has prev: True, Node: key: None, val: None, has next: False, has prev: True >>> cache.cache # doctest: +NORMALIZE_WHITESPACE {1: Node: key: 1, val: 1, has next: True, has prev: True, \ 3: Node: key: 3, val: 3, has next: True, has prev: True} >>> cache.get(2) is None True >>> cache.put(4, 4) >>> cache.get(1) is None True >>> cache.get(3) 3 >>> cache.get(4) 4 >>> cache CacheInfo(hits=3, misses=2, capacity=2, current size=2) >>> @LRUCache.decorator(100) ... def fib(num): ... if num in (1, 2): ... return 1 ... return fib(num - 1) + fib(num - 2) >>> for i in range(1, 100): ... res = fib(i) >>> fib.cache_info() CacheInfo(hits=194, misses=99, capacity=100, current size=99) """ def __init__(self, capacity: int): self.list: DoubleLinkedList[T, U] = DoubleLinkedList() self.capacity = capacity self.num_keys = 0 self.hits = 0 self.miss = 0 self.cache: dict[T, DoubleLinkedListNode[T, U]] = {} def __repr__(self) -> str: """ Return the details for the cache instance [hits, misses, capacity, current_size] """ return ( f"CacheInfo(hits={self.hits}, misses={self.miss}, " f"capacity={self.capacity}, current size={self.num_keys})" ) def __contains__(self, key: T) -> bool: """ >>> cache = LRUCache(1) >>> 1 in cache False >>> cache.put(1, 1) >>> 1 in cache True """ return key in self.cache def get(self, key: T) -> U | None: """ Returns the value for the input key and updates the Double Linked List. Returns None if key is not present in cache """ # Note: pythonic interface would throw KeyError rather than return None if key in self.cache: self.hits += 1 value_node: DoubleLinkedListNode[T, U] = self.cache[key] node = self.list.remove(self.cache[key]) assert node == value_node # node is guaranteed not None because it is in self.cache assert node is not None self.list.add(node) return node.val self.miss += 1 return None def put(self, key: T, value: U) -> None: """ Sets the value for the input key and updates the Double Linked List """ if key not in self.cache: if self.num_keys >= self.capacity: # delete first node (oldest) when over capacity first_node = self.list.head.next # guaranteed to have a non-None first node when num_keys > 0 # explain to type checker via assertions assert first_node is not None assert first_node.key is not None assert ( self.list.remove(first_node) is not None ) # node guaranteed to be in list assert node.key is not None del self.cache[first_node.key] self.num_keys -= 1 self.cache[key] = DoubleLinkedListNode(key, value) self.list.add(self.cache[key]) self.num_keys += 1 else: # bump node to the end of the list, update value node = self.list.remove(self.cache[key]) assert node is not None # node guaranteed to be in list node.val = value self.list.add(node) @classmethod def decorator( cls, size: int = 128 ) -> Callable[[Callable[[T], U]], Callable[..., U]]: """ Decorator version of LRU Cache Decorated function must be function of T -> U """ def cache_decorator_inner(func: Callable[[T], U]) -> Callable[..., U]: # variable to map the decorator functions to their respective instance decorator_function_to_instance_map: dict[ Callable[[T], U], LRUCache[T, U] ] = {} def cache_decorator_wrapper(*args: T) -> U: if func not in decorator_function_to_instance_map: decorator_function_to_instance_map[func] = LRUCache(size) result = decorator_function_to_instance_map[func].get(args[0]) if result is None: result = func(*args) decorator_function_to_instance_map[func].put(args[0], result) return result def cache_info() -> LRUCache[T, U]: return decorator_function_to_instance_map[func] setattr(cache_decorator_wrapper, "cache_info", cache_info) # noqa: B010 return cache_decorator_wrapper return cache_decorator_inner if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: other/magicdiamondpattern.py ================================================ # Python program for generating diamond pattern in Python 3.7+ # Function to print upper half of diamond (pyramid) def floyd(n): """ Print the upper half of a diamond pattern with '*' characters. Args: n (int): Size of the pattern. Examples: >>> floyd(3) ' * \\n * * \\n* * * \\n' >>> floyd(5) ' * \\n * * \\n * * * \\n * * * * \\n* * * * * \\n' """ result = "" for i in range(n): for _ in range(n - i - 1): # printing spaces result += " " for _ in range(i + 1): # printing stars result += "* " result += "\n" return result # Function to print lower half of diamond (pyramid) def reverse_floyd(n): """ Print the lower half of a diamond pattern with '*' characters. Args: n (int): Size of the pattern. Examples: >>> reverse_floyd(3) '* * * \\n * * \\n * \\n ' >>> reverse_floyd(5) '* * * * * \\n * * * * \\n * * * \\n * * \\n * \\n ' """ result = "" for i in range(n, 0, -1): for _ in range(i, 0, -1): # printing stars result += "* " result += "\n" for _ in range(n - i + 1, 0, -1): # printing spaces result += " " return result # Function to print complete diamond pattern of "*" def pretty_print(n): """ Print a complete diamond pattern with '*' characters. Args: n (int): Size of the pattern. Examples: >>> pretty_print(0) ' ... .... nothing printing :(' >>> pretty_print(3) ' * \\n * * \\n* * * \\n* * * \\n * * \\n * \\n ' """ if n <= 0: return " ... .... nothing printing :(" upper_half = floyd(n) # upper half lower_half = reverse_floyd(n) # lower half return upper_half + lower_half if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: other/majority_vote_algorithm.py ================================================ """ This is Booyer-Moore Majority Vote Algorithm. The problem statement goes like this: Given an integer array of size n, find all elements that appear more than ⌊ n/k ⌋ times. We have to solve in O(n) time and O(1) Space. URL : https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_majority_vote_algorithm """ from collections import Counter def majority_vote(votes: list[int], votes_needed_to_win: int) -> list[int]: """ >>> majority_vote([1, 2, 2, 3, 1, 3, 2], 3) [2] >>> majority_vote([1, 2, 2, 3, 1, 3, 2], 2) [] >>> majority_vote([1, 2, 2, 3, 1, 3, 2], 4) [1, 2, 3] """ majority_candidate_counter: Counter[int] = Counter() for vote in votes: majority_candidate_counter[vote] += 1 if len(majority_candidate_counter) == votes_needed_to_win: majority_candidate_counter -= Counter(set(majority_candidate_counter)) majority_candidate_counter = Counter( vote for vote in votes if vote in majority_candidate_counter ) return [ vote for vote in majority_candidate_counter if majority_candidate_counter[vote] > len(votes) / votes_needed_to_win ] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: other/maximum_subsequence.py ================================================ from collections.abc import Sequence def max_subsequence_sum(nums: Sequence[int] | None = None) -> int: """Return the maximum possible sum amongst all non - empty subsequences. Raises: ValueError: when nums is empty. >>> max_subsequence_sum([1,2,3,4,-2]) 10 >>> max_subsequence_sum([-2, -3, -1, -4, -6]) -1 >>> max_subsequence_sum([]) Traceback (most recent call last): . . . ValueError: Input sequence should not be empty >>> max_subsequence_sum() Traceback (most recent call last): . . . ValueError: Input sequence should not be empty """ if nums is None or not nums: raise ValueError("Input sequence should not be empty") ans = nums[0] for i in range(1, len(nums)): num = nums[i] ans = max(ans, ans + num, num) return ans if __name__ == "__main__": import doctest doctest.testmod() # Try on a sample input from the user n = int(input("Enter number of elements : ").strip()) array = list(map(int, input("\nEnter the numbers : ").strip().split()))[:n] print(max_subsequence_sum(array)) ================================================ FILE: other/nested_brackets.py ================================================ """ The nested brackets problem is a problem that determines if a sequence of brackets are properly nested. A sequence of brackets s is considered properly nested if any of the following conditions are true: - s is empty - s has the form (U) or [U] or {U} where U is a properly nested string - s has the form VW where V and W are properly nested strings For example, the string "()()[()]" is properly nested but "[(()]" is not. The function called is_balanced takes as input a string S which is a sequence of brackets and returns true if S is nested and false otherwise. """ def is_balanced(s: str) -> bool: """ >>> is_balanced("") True >>> is_balanced("()") True >>> is_balanced("[]") True >>> is_balanced("{}") True >>> is_balanced("()[]{}") True >>> is_balanced("(())") True >>> is_balanced("[[") False >>> is_balanced("([{}])") True >>> is_balanced("(()[)]") False >>> is_balanced("([)]") False >>> is_balanced("[[()]]") True >>> is_balanced("(()(()))") True >>> is_balanced("]") False >>> is_balanced("Life is a bowl of cherries.") True >>> is_balanced("Life is a bowl of che{}ies.") True >>> is_balanced("Life is a bowl of che}{ies.") False """ open_to_closed = {"{": "}", "[": "]", "(": ")"} stack = [] for symbol in s: if symbol in open_to_closed: stack.append(symbol) elif symbol in open_to_closed.values() and ( not stack or open_to_closed[stack.pop()] != symbol ): return False return not stack # stack should be empty def main(): s = input("Enter sequence of brackets: ") print(f"'{s}' is {'' if is_balanced(s) else 'not '}balanced.") if __name__ == "__main__": from doctest import testmod testmod() main() ================================================ FILE: other/number_container_system.py ================================================ """ A number container system that uses binary search to delete and insert values into arrays with O(log n) write times and O(1) read times. This container system holds integers at indexes. Further explained in this leetcode problem > https://leetcode.com/problems/minimum-cost-tree-from-leaf-values """ class NumberContainer: def __init__(self) -> None: # numbermap keys are the number and its values are lists of indexes sorted # in ascending order self.numbermap: dict[int, list[int]] = {} # indexmap keys are an index and it's values are the number at that index self.indexmap: dict[int, int] = {} def binary_search_delete(self, array: list | str | range, item: int) -> list[int]: """ Removes the item from the sorted array and returns the new array. >>> NumberContainer().binary_search_delete([1,2,3], 2) [1, 3] >>> NumberContainer().binary_search_delete([0, 0, 0], 0) [0, 0] >>> NumberContainer().binary_search_delete([-1, -1, -1], -1) [-1, -1] >>> NumberContainer().binary_search_delete([-1, 0], 0) [-1] >>> NumberContainer().binary_search_delete([-1, 0], -1) [0] >>> NumberContainer().binary_search_delete(range(7), 3) [0, 1, 2, 4, 5, 6] >>> NumberContainer().binary_search_delete([1.1, 2.2, 3.3], 2.2) [1.1, 3.3] >>> NumberContainer().binary_search_delete("abcde", "c") ['a', 'b', 'd', 'e'] >>> NumberContainer().binary_search_delete([0, -1, 2, 4], 0) Traceback (most recent call last): ... ValueError: Either the item is not in the array or the array was unsorted >>> NumberContainer().binary_search_delete([2, 0, 4, -1, 11], -1) Traceback (most recent call last): ... ValueError: Either the item is not in the array or the array was unsorted >>> NumberContainer().binary_search_delete(125, 1) Traceback (most recent call last): ... TypeError: binary_search_delete() only accepts either a list, range or str """ if isinstance(array, (range, str)): array = list(array) elif not isinstance(array, list): raise TypeError( "binary_search_delete() only accepts either a list, range or str" ) low = 0 high = len(array) - 1 while low <= high: mid = (low + high) // 2 if array[mid] == item: array.pop(mid) return array elif array[mid] < item: low = mid + 1 else: high = mid - 1 raise ValueError( "Either the item is not in the array or the array was unsorted" ) def binary_search_insert(self, array: list | str | range, index: int) -> list[int]: """ Inserts the index into the sorted array at the correct position. >>> NumberContainer().binary_search_insert([1,2,3], 2) [1, 2, 2, 3] >>> NumberContainer().binary_search_insert([0,1,3], 2) [0, 1, 2, 3] >>> NumberContainer().binary_search_insert([-5, -3, 0, 0, 11, 103], 51) [-5, -3, 0, 0, 11, 51, 103] >>> NumberContainer().binary_search_insert([-5, -3, 0, 0, 11, 100, 103], 101) [-5, -3, 0, 0, 11, 100, 101, 103] >>> NumberContainer().binary_search_insert(range(10), 4) [0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9] >>> NumberContainer().binary_search_insert("abd", "c") ['a', 'b', 'c', 'd'] >>> NumberContainer().binary_search_insert(131, 23) Traceback (most recent call last): ... TypeError: binary_search_insert() only accepts either a list, range or str """ if isinstance(array, (range, str)): array = list(array) elif not isinstance(array, list): raise TypeError( "binary_search_insert() only accepts either a list, range or str" ) low = 0 high = len(array) - 1 while low <= high: mid = (low + high) // 2 if array[mid] == index: # If the item already exists in the array, # insert it after the existing item array.insert(mid + 1, index) return array elif array[mid] < index: low = mid + 1 else: high = mid - 1 # If the item doesn't exist in the array, insert it at the appropriate position array.insert(low, index) return array def change(self, index: int, number: int) -> None: """ Changes (sets) the index as number >>> cont = NumberContainer() >>> cont.change(0, 10) >>> cont.change(0, 20) >>> cont.change(-13, 20) >>> cont.change(-100030, 20032903290) """ # Remove previous index if index in self.indexmap: n = self.indexmap[index] if len(self.numbermap[n]) == 1: del self.numbermap[n] else: self.numbermap[n] = self.binary_search_delete(self.numbermap[n], index) # Set new index self.indexmap[index] = number # Number not seen before or empty so insert number value if number not in self.numbermap: self.numbermap[number] = [index] # Here we need to perform a binary search insertion in order to insert # The item in the correct place else: self.numbermap[number] = self.binary_search_insert( self.numbermap[number], index ) def find(self, number: int) -> int: """ Returns the smallest index where the number is. >>> cont = NumberContainer() >>> cont.find(10) -1 >>> cont.change(0, 10) >>> cont.find(10) 0 >>> cont.change(0, 20) >>> cont.find(10) -1 >>> cont.find(20) 0 """ # Simply return the 0th index (smallest) of the indexes found (or -1) return self.numbermap.get(number, [-1])[0] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: other/password.py ================================================ import secrets from random import shuffle from string import ascii_letters, ascii_lowercase, ascii_uppercase, digits, punctuation def password_generator(length: int = 8) -> str: """ Password Generator allows you to generate a random password of length N. >>> len(password_generator()) 8 >>> len(password_generator(length=16)) 16 >>> len(password_generator(257)) 257 >>> len(password_generator(length=0)) 0 >>> len(password_generator(-1)) 0 """ chars = ascii_letters + digits + punctuation return "".join(secrets.choice(chars) for _ in range(length)) # ALTERNATIVE METHODS # chars_incl= characters that must be in password # i= how many letters or characters the password length will be def alternative_password_generator(chars_incl: str, i: int) -> str: # Password Generator = full boot with random_number, random_letters, and # random_character FUNCTIONS # Put your code here... i -= len(chars_incl) quotient = i // 3 remainder = i % 3 # chars = chars_incl + random_letters(ascii_letters, i / 3 + remainder) + # random_number(digits, i / 3) + random_characters(punctuation, i / 3) chars = ( chars_incl + random(ascii_letters, quotient + remainder) + random(digits, quotient) + random(punctuation, quotient) ) list_of_chars = list(chars) shuffle(list_of_chars) return "".join(list_of_chars) # random is a generalised function for letters, characters and numbers def random(chars_incl: str, i: int) -> str: return "".join(secrets.choice(chars_incl) for _ in range(i)) def is_strong_password(password: str, min_length: int = 8) -> bool: """ This will check whether a given password is strong or not. The password must be at least as long as the provided minimum length, and it must contain at least 1 lowercase letter, 1 uppercase letter, 1 number and 1 special character. >>> is_strong_password('Hwea7$2!') True >>> is_strong_password('Sh0r1') False >>> is_strong_password('Hello123') False >>> is_strong_password('Hello1238udfhiaf038fajdvjjf!jaiuFhkqi1') True >>> is_strong_password('0') False """ if len(password) < min_length: return False upper = any(char in ascii_uppercase for char in password) lower = any(char in ascii_lowercase for char in password) num = any(char in digits for char in password) spec_char = any(char in punctuation for char in password) return upper and lower and num and spec_char def main(): length = int(input("Please indicate the max length of your password: ").strip()) chars_incl = input( "Please indicate the characters that must be in your password: " ).strip() print("Password generated:", password_generator(length)) print( "Alternative Password generated:", alternative_password_generator(chars_incl, length), ) print("[If you are thinking of using this password, You better save it.]") if __name__ == "__main__": main() ================================================ FILE: other/quine.py ================================================ #!/bin/python3 # ruff: noqa: PLC3002 """ Quine: A quine is a computer program which takes no input and produces a copy of its own source code as its only output (disregarding this docstring and the shebang). More info on: https://en.wikipedia.org/wiki/Quine_(computing) """ print((lambda quine: quine % quine)("print((lambda quine: quine %% quine)(%r))")) ================================================ FILE: other/scoring_algorithm.py ================================================ """ | developed by: markmelnic | original repo: https://github.com/markmelnic/Scoring-Algorithm Analyse data using a range based percentual proximity algorithm and calculate the linear maximum likelihood estimation. The basic principle is that all values supplied will be broken down to a range from ``0`` to ``1`` and each column's score will be added up to get the total score. Example for data of vehicles :: price|mileage|registration_year 20k |60k |2012 22k |50k |2011 23k |90k |2015 16k |210k |2010 We want the vehicle with the lowest price, lowest mileage but newest registration year. Thus the weights for each column are as follows: ``[0, 0, 1]`` """ def get_data(source_data: list[list[float]]) -> list[list[float]]: """ >>> get_data([[20, 60, 2012],[23, 90, 2015],[22, 50, 2011]]) [[20.0, 23.0, 22.0], [60.0, 90.0, 50.0], [2012.0, 2015.0, 2011.0]] """ data_lists: list[list[float]] = [] for data in source_data: for i, el in enumerate(data): if len(data_lists) < i + 1: data_lists.append([]) data_lists[i].append(float(el)) return data_lists def calculate_each_score( data_lists: list[list[float]], weights: list[int] ) -> list[list[float]]: """ >>> calculate_each_score([[20, 23, 22], [60, 90, 50], [2012, 2015, 2011]], ... [0, 0, 1]) [[1.0, 0.0, 0.33333333333333337], [0.75, 0.0, 1.0], [0.25, 1.0, 0.0]] """ score_lists: list[list[float]] = [] for dlist, weight in zip(data_lists, weights): mind = min(dlist) maxd = max(dlist) score: list[float] = [] # for weight 0 score is 1 - actual score if weight == 0: for item in dlist: try: score.append(1 - ((item - mind) / (maxd - mind))) except ZeroDivisionError: score.append(1) elif weight == 1: for item in dlist: try: score.append((item - mind) / (maxd - mind)) except ZeroDivisionError: score.append(0) # weight not 0 or 1 else: msg = f"Invalid weight of {weight:f} provided" raise ValueError(msg) score_lists.append(score) return score_lists def generate_final_scores(score_lists: list[list[float]]) -> list[float]: """ >>> generate_final_scores([[1.0, 0.0, 0.33333333333333337], ... [0.75, 0.0, 1.0], ... [0.25, 1.0, 0.0]]) [2.0, 1.0, 1.3333333333333335] """ # initialize final scores final_scores: list[float] = [0 for i in range(len(score_lists[0]))] for slist in score_lists: for j, ele in enumerate(slist): final_scores[j] = final_scores[j] + ele return final_scores def procentual_proximity( source_data: list[list[float]], weights: list[int] ) -> list[list[float]]: """ | `weights` - ``int`` list | possible values - ``0`` / ``1`` * ``0`` if lower values have higher weight in the data set * ``1`` if higher values have higher weight in the data set >>> procentual_proximity([[20, 60, 2012],[23, 90, 2015],[22, 50, 2011]], [0, 0, 1]) [[20, 60, 2012, 2.0], [23, 90, 2015, 1.0], [22, 50, 2011, 1.3333333333333335]] """ data_lists = get_data(source_data) score_lists = calculate_each_score(data_lists, weights) final_scores = generate_final_scores(score_lists) # append scores to source data for i, ele in enumerate(final_scores): source_data[i].append(ele) return source_data ================================================ FILE: other/sdes.py ================================================ def apply_table(inp, table): """ >>> apply_table("0123456789", list(range(10))) '9012345678' >>> apply_table("0123456789", list(range(9, -1, -1))) '8765432109' """ res = "" for i in table: res += inp[i - 1] return res def left_shift(data): """ >>> left_shift("0123456789") '1234567890' """ return data[1:] + data[0] def xor(a, b): """ >>> xor("01010101", "00001111") '01011010' """ res = "" for i in range(len(a)): if a[i] == b[i]: res += "0" else: res += "1" return res def apply_sbox(s, data): row = int("0b" + data[0] + data[-1], 2) col = int("0b" + data[1:3], 2) return bin(s[row][col])[2:] def function(expansion, s0, s1, key, message): left = message[:4] right = message[4:] temp = apply_table(right, expansion) temp = xor(temp, key) left_bin_str = apply_sbox(s0, temp[:4]) right_bin_str = apply_sbox(s1, temp[4:]) left_bin_str = "0" * (2 - len(left_bin_str)) + left_bin_str right_bin_str = "0" * (2 - len(right_bin_str)) + right_bin_str temp = apply_table(left_bin_str + right_bin_str, p4_table) temp = xor(left, temp) return temp + right if __name__ == "__main__": key = input("Enter 10 bit key: ") message = input("Enter 8 bit message: ") p8_table = [6, 3, 7, 4, 8, 5, 10, 9] p10_table = [3, 5, 2, 7, 4, 10, 1, 9, 8, 6] p4_table = [2, 4, 3, 1] IP = [2, 6, 3, 1, 4, 8, 5, 7] IP_inv = [4, 1, 3, 5, 7, 2, 8, 6] expansion = [4, 1, 2, 3, 2, 3, 4, 1] s0 = [[1, 0, 3, 2], [3, 2, 1, 0], [0, 2, 1, 3], [3, 1, 3, 2]] s1 = [[0, 1, 2, 3], [2, 0, 1, 3], [3, 0, 1, 0], [2, 1, 0, 3]] # key generation temp = apply_table(key, p10_table) left = temp[:5] right = temp[5:] left = left_shift(left) right = left_shift(right) key1 = apply_table(left + right, p8_table) left = left_shift(left) right = left_shift(right) left = left_shift(left) right = left_shift(right) key2 = apply_table(left + right, p8_table) # encryption temp = apply_table(message, IP) temp = function(expansion, s0, s1, key1, temp) temp = temp[4:] + temp[:4] temp = function(expansion, s0, s1, key2, temp) CT = apply_table(temp, IP_inv) print("Cipher text is:", CT) # decryption temp = apply_table(CT, IP) temp = function(expansion, s0, s1, key2, temp) temp = temp[4:] + temp[:4] temp = function(expansion, s0, s1, key1, temp) PT = apply_table(temp, IP_inv) print("Plain text after decypting is:", PT) ================================================ FILE: other/sliding_window_maximum.py ================================================ from collections import deque def sliding_window_maximum(numbers: list[int], window_size: int) -> list[int]: """ Return a list containing the maximum of each sliding window of size window_size. This implementation uses a monotonic deque to achieve O(n) time complexity. Args: numbers: List of integers representing the input array. window_size: Size of the sliding window (must be positive). Returns: List of maximum values for each valid window. Raises: ValueError: If window_size is not a positive integer. Time Complexity: O(n) - each element is added and removed at most once Space Complexity: O(k) - deque stores at most window_size indices Examples: >>> sliding_window_maximum([1, 3, -1, -3, 5, 3, 6, 7], 3) [3, 3, 5, 5, 6, 7] >>> sliding_window_maximum([9, 11], 2) [11] >>> sliding_window_maximum([], 3) [] >>> sliding_window_maximum([4, 2, 12, 3], 1) [4, 2, 12, 3] >>> sliding_window_maximum([1], 1) [1] """ if window_size <= 0: raise ValueError("Window size must be a positive integer") if not numbers: return [] result: list[int] = [] index_deque: deque[int] = deque() for current_index, current_value in enumerate(numbers): # Remove the element which is out of this window if index_deque and index_deque[0] == current_index - window_size: index_deque.popleft() # Remove useless elements (smaller than current) from back while index_deque and numbers[index_deque[-1]] < current_value: index_deque.pop() index_deque.append(current_index) # Start adding to result once we have a full window if current_index >= window_size - 1: result.append(numbers[index_deque[0]]) return result ================================================ FILE: other/tower_of_hanoi.py ================================================ def move_tower(height, from_pole, to_pole, with_pole): """ >>> move_tower(3, 'A', 'B', 'C') moving disk from A to B moving disk from A to C moving disk from B to C moving disk from A to B moving disk from C to A moving disk from C to B moving disk from A to B """ if height >= 1: move_tower(height - 1, from_pole, with_pole, to_pole) move_disk(from_pole, to_pole) move_tower(height - 1, with_pole, to_pole, from_pole) def move_disk(fp, tp): print("moving disk from", fp, "to", tp) def main(): height = int(input("Height of hanoi: ").strip()) move_tower(height, "A", "B", "C") if __name__ == "__main__": main() ================================================ FILE: other/word_search.py ================================================ """ Creates a random wordsearch with eight different directions that are best described as compass locations. @ https://en.wikipedia.org/wiki/Word_search """ from random import choice, randint, shuffle # The words to display on the word search - # can be made dynamic by randonly selecting a certain number of # words from a predefined word file, while ensuring the character # count fits within the matrix size (n x m) WORDS = ["cat", "dog", "snake", "fish"] WIDTH = 10 HEIGHT = 10 class WordSearch: """ >>> ws = WordSearch(WORDS, WIDTH, HEIGHT) >>> ws.board # doctest: +ELLIPSIS [[None, ..., None], ..., [None, ..., None]] >>> ws.generate_board() """ def __init__(self, words: list[str], width: int, height: int) -> None: self.words = words self.width = width self.height = height # Board matrix holding each letter self.board: list[list[str | None]] = [[None] * width for _ in range(height)] def insert_north(self, word: str, rows: list[int], cols: list[int]) -> None: """ >>> ws = WordSearch(WORDS, 3, 3) >>> ws.insert_north("cat", [2], [2]) >>> ws.board # doctest: +NORMALIZE_WHITESPACE [[None, None, 't'], [None, None, 'a'], [None, None, 'c']] >>> ws.insert_north("at", [0, 1, 2], [2, 1]) >>> ws.board # doctest: +NORMALIZE_WHITESPACE [[None, 't', 't'], [None, 'a', 'a'], [None, None, 'c']] """ word_length = len(word) # Attempt to insert the word into each row and when successful, exit for row in rows: # Check if there is space above the row to fit in the word if word_length > row + 1: continue # Attempt to insert the word into each column for col in cols: # Only check to be made here is if there are existing letters # above the column that will be overwritten letters_above = [self.board[row - i][col] for i in range(word_length)] if all(letter is None for letter in letters_above): # Successful, insert the word north for i in range(word_length): self.board[row - i][col] = word[i] return def insert_northeast(self, word: str, rows: list[int], cols: list[int]) -> None: """ >>> ws = WordSearch(WORDS, 3, 3) >>> ws.insert_northeast("cat", [2], [0]) >>> ws.board # doctest: +NORMALIZE_WHITESPACE [[None, None, 't'], [None, 'a', None], ['c', None, None]] >>> ws.insert_northeast("at", [0, 1], [2, 1, 0]) >>> ws.board # doctest: +NORMALIZE_WHITESPACE [[None, 't', 't'], ['a', 'a', None], ['c', None, None]] """ word_length = len(word) # Attempt to insert the word into each row and when successful, exit for row in rows: # Check if there is space for the word above the row if word_length > row + 1: continue # Attempt to insert the word into each column for col in cols: # Check if there is space to the right of the word as well as above if word_length + col > self.width: continue # Check if there are existing letters # to the right of the column that will be overwritten letters_diagonal_left = [ self.board[row - i][col + i] for i in range(word_length) ] if all(letter is None for letter in letters_diagonal_left): # Successful, insert the word northeast for i in range(word_length): self.board[row - i][col + i] = word[i] return def insert_east(self, word: str, rows: list[int], cols: list[int]) -> None: """ >>> ws = WordSearch(WORDS, 3, 3) >>> ws.insert_east("cat", [1], [0]) >>> ws.board # doctest: +NORMALIZE_WHITESPACE [[None, None, None], ['c', 'a', 't'], [None, None, None]] >>> ws.insert_east("at", [1, 0], [2, 1, 0]) >>> ws.board # doctest: +NORMALIZE_WHITESPACE [[None, 'a', 't'], ['c', 'a', 't'], [None, None, None]] """ word_length = len(word) # Attempt to insert the word into each row and when successful, exit for row in rows: # Attempt to insert the word into each column for col in cols: # Check if there is space to the right of the word if word_length + col > self.width: continue # Check if there are existing letters # to the right of the column that will be overwritten letters_left = [self.board[row][col + i] for i in range(word_length)] if all(letter is None for letter in letters_left): # Successful, insert the word east for i in range(word_length): self.board[row][col + i] = word[i] return def insert_southeast(self, word: str, rows: list[int], cols: list[int]) -> None: """ >>> ws = WordSearch(WORDS, 3, 3) >>> ws.insert_southeast("cat", [0], [0]) >>> ws.board # doctest: +NORMALIZE_WHITESPACE [['c', None, None], [None, 'a', None], [None, None, 't']] >>> ws.insert_southeast("at", [1, 0], [2, 1, 0]) >>> ws.board # doctest: +NORMALIZE_WHITESPACE [['c', None, None], ['a', 'a', None], [None, 't', 't']] """ word_length = len(word) # Attempt to insert the word into each row and when successful, exit for row in rows: # Check if there is space for the word below the row if word_length + row > self.height: continue # Attempt to insert the word into each column for col in cols: # Check if there is space to the right of the word as well as below if word_length + col > self.width: continue # Check if there are existing letters # to the right of the column that will be overwritten letters_diagonal_left = [ self.board[row + i][col + i] for i in range(word_length) ] if all(letter is None for letter in letters_diagonal_left): # Successful, insert the word southeast for i in range(word_length): self.board[row + i][col + i] = word[i] return def insert_south(self, word: str, rows: list[int], cols: list[int]) -> None: """ >>> ws = WordSearch(WORDS, 3, 3) >>> ws.insert_south("cat", [0], [0]) >>> ws.board # doctest: +NORMALIZE_WHITESPACE [['c', None, None], ['a', None, None], ['t', None, None]] >>> ws.insert_south("at", [2, 1, 0], [0, 1, 2]) >>> ws.board # doctest: +NORMALIZE_WHITESPACE [['c', None, None], ['a', 'a', None], ['t', 't', None]] """ word_length = len(word) # Attempt to insert the word into each row and when successful, exit for row in rows: # Check if there is space below the row to fit in the word if word_length + row > self.height: continue # Attempt to insert the word into each column for col in cols: # Only check to be made here is if there are existing letters # below the column that will be overwritten letters_below = [self.board[row + i][col] for i in range(word_length)] if all(letter is None for letter in letters_below): # Successful, insert the word south for i in range(word_length): self.board[row + i][col] = word[i] return def insert_southwest(self, word: str, rows: list[int], cols: list[int]) -> None: """ >>> ws = WordSearch(WORDS, 3, 3) >>> ws.insert_southwest("cat", [0], [2]) >>> ws.board # doctest: +NORMALIZE_WHITESPACE [[None, None, 'c'], [None, 'a', None], ['t', None, None]] >>> ws.insert_southwest("at", [1, 2], [2, 1, 0]) >>> ws.board # doctest: +NORMALIZE_WHITESPACE [[None, None, 'c'], [None, 'a', 'a'], ['t', 't', None]] """ word_length = len(word) # Attempt to insert the word into each row and when successful, exit for row in rows: # Check if there is space for the word below the row if word_length + row > self.height: continue # Attempt to insert the word into each column for col in cols: # Check if there is space to the left of the word as well as below if word_length > col + 1: continue # Check if there are existing letters # to the right of the column that will be overwritten letters_diagonal_left = [ self.board[row + i][col - i] for i in range(word_length) ] if all(letter is None for letter in letters_diagonal_left): # Successful, insert the word southwest for i in range(word_length): self.board[row + i][col - i] = word[i] return def insert_west(self, word: str, rows: list[int], cols: list[int]) -> None: """ >>> ws = WordSearch(WORDS, 3, 3) >>> ws.insert_west("cat", [1], [2]) >>> ws.board # doctest: +NORMALIZE_WHITESPACE [[None, None, None], ['t', 'a', 'c'], [None, None, None]] >>> ws.insert_west("at", [1, 0], [1, 2, 0]) >>> ws.board # doctest: +NORMALIZE_WHITESPACE [['t', 'a', None], ['t', 'a', 'c'], [None, None, None]] """ word_length = len(word) # Attempt to insert the word into each row and when successful, exit for row in rows: # Attempt to insert the word into each column for col in cols: # Check if there is space to the left of the word if word_length > col + 1: continue # Check if there are existing letters # to the left of the column that will be overwritten letters_left = [self.board[row][col - i] for i in range(word_length)] if all(letter is None for letter in letters_left): # Successful, insert the word west for i in range(word_length): self.board[row][col - i] = word[i] return def insert_northwest(self, word: str, rows: list[int], cols: list[int]) -> None: """ >>> ws = WordSearch(WORDS, 3, 3) >>> ws.insert_northwest("cat", [2], [2]) >>> ws.board # doctest: +NORMALIZE_WHITESPACE [['t', None, None], [None, 'a', None], [None, None, 'c']] >>> ws.insert_northwest("at", [1, 2], [0, 1]) >>> ws.board # doctest: +NORMALIZE_WHITESPACE [['t', None, None], ['t', 'a', None], [None, 'a', 'c']] """ word_length = len(word) # Attempt to insert the word into each row and when successful, exit for row in rows: # Check if there is space for the word above the row if word_length > row + 1: continue # Attempt to insert the word into each column for col in cols: # Check if there is space to the left of the word as well as above if word_length > col + 1: continue # Check if there are existing letters # to the right of the column that will be overwritten letters_diagonal_left = [ self.board[row - i][col - i] for i in range(word_length) ] if all(letter is None for letter in letters_diagonal_left): # Successful, insert the word northwest for i in range(word_length): self.board[row - i][col - i] = word[i] return def generate_board(self) -> None: """ Generates a board with a random direction for each word. >>> wt = WordSearch(WORDS, WIDTH, HEIGHT) >>> wt.generate_board() >>> len(list(filter(lambda word: word is not None, sum(wt.board, start=[]))) ... ) == sum(map(lambda word: len(word), WORDS)) True """ directions = ( self.insert_north, self.insert_northeast, self.insert_east, self.insert_southeast, self.insert_south, self.insert_southwest, self.insert_west, self.insert_northwest, ) for word in self.words: # Shuffle the row order and column order that is used when brute forcing # the insertion of the word rows, cols = list(range(self.height)), list(range(self.width)) shuffle(rows) shuffle(cols) # Insert the word via the direction choice(directions)(word, rows, cols) def visualise_word_search( board: list[list[str | None]] | None = None, *, add_fake_chars: bool = True ) -> None: """ Graphically displays the word search in the terminal. >>> ws = WordSearch(WORDS, 5, 5) >>> ws.insert_north("cat", [4], [4]) >>> visualise_word_search( ... ws.board, add_fake_chars=False) # doctest: +NORMALIZE_WHITESPACE # # # # # # # # # # # # # # t # # # # a # # # # c >>> ws.insert_northeast("snake", [4], [4, 3, 2, 1, 0]) >>> visualise_word_search( ... ws.board, add_fake_chars=False) # doctest: +NORMALIZE_WHITESPACE # # # # e # # # k # # # a # t # n # # a s # # # c """ if board is None: word_search = WordSearch(WORDS, WIDTH, HEIGHT) word_search.generate_board() board = word_search.board result = "" for row in range(len(board)): for col in range(len(board[0])): character = "#" if (letter := board[row][col]) is not None: character = letter # Empty char, so add a fake char elif add_fake_chars: character = chr(randint(97, 122)) result += f"{character} " result += "\n" print(result, end="") if __name__ == "__main__": import doctest doctest.testmod() visualise_word_search() ================================================ FILE: physics/__init__.py ================================================ ================================================ FILE: physics/altitude_pressure.py ================================================ """ Title : Calculate altitude using Pressure Description : The below algorithm approximates the altitude using Barometric formula """ def get_altitude_at_pressure(pressure: float) -> float: """ This method calculates the altitude from Pressure wrt to Sea level pressure as reference .Pressure is in Pascals https://en.wikipedia.org/wiki/Pressure_altitude https://community.bosch-sensortec.com/t5/Question-and-answers/How-to-calculate-the-altitude-from-the-pressure-sensor-data/qaq-p/5702 H = 44330 * [1 - (P/p0)^(1/5.255) ] Where : H = altitude (m) P = measured pressure p0 = reference pressure at sea level 101325 Pa Examples: >>> get_altitude_at_pressure(pressure=100_000) 105.47836610778828 >>> get_altitude_at_pressure(pressure=101_325) 0.0 >>> get_altitude_at_pressure(pressure=80_000) 1855.873388064995 >>> get_altitude_at_pressure(pressure=201_325) Traceback (most recent call last): ... ValueError: Value Higher than Pressure at Sea Level ! >>> get_altitude_at_pressure(pressure=-80_000) Traceback (most recent call last): ... ValueError: Atmospheric Pressure can not be negative ! """ if pressure > 101325: raise ValueError("Value Higher than Pressure at Sea Level !") if pressure < 0: raise ValueError("Atmospheric Pressure can not be negative !") return 44_330 * (1 - (pressure / 101_325) ** (1 / 5.5255)) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: physics/archimedes_principle_of_buoyant_force.py ================================================ """ Calculate the buoyant force of any body completely or partially submerged in a static fluid. This principle was discovered by the Greek mathematician Archimedes. Equation for calculating buoyant force: Fb = p * V * g https://en.wikipedia.org/wiki/Archimedes%27_principle """ # Acceleration Constant on Earth (unit m/s^2) g = 9.80665 # Also available in scipy.constants.g def archimedes_principle( fluid_density: float, volume: float, gravity: float = g ) -> float: """ Args: fluid_density: density of fluid (kg/m^3) volume: volume of object/liquid being displaced by the object (m^3) gravity: Acceleration from gravity. Gravitational force on the system, The default is Earth Gravity returns: the buoyant force on an object in Newtons >>> archimedes_principle(fluid_density=500, volume=4, gravity=9.8) 19600.0 >>> archimedes_principle(fluid_density=997, volume=0.5, gravity=9.8) 4885.3 >>> archimedes_principle(fluid_density=997, volume=0.7) 6844.061035 >>> archimedes_principle(fluid_density=997, volume=-0.7) Traceback (most recent call last): ... ValueError: Impossible object volume >>> archimedes_principle(fluid_density=0, volume=0.7) Traceback (most recent call last): ... ValueError: Impossible fluid density >>> archimedes_principle(fluid_density=997, volume=0.7, gravity=0) 0.0 >>> archimedes_principle(fluid_density=997, volume=0.7, gravity=-9.8) Traceback (most recent call last): ... ValueError: Impossible gravity """ if fluid_density <= 0: raise ValueError("Impossible fluid density") if volume <= 0: raise ValueError("Impossible object volume") if gravity < 0: raise ValueError("Impossible gravity") return fluid_density * gravity * volume if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: physics/basic_orbital_capture.py ================================================ """ These two functions will return the radii of impact for a target object of mass M and radius R as well as it's effective cross sectional area sigma. That is to say any projectile with velocity v passing within sigma, will impact the target object with mass M. The derivation of which is given at the bottom of this file. The derivation shows that a projectile does not need to aim directly at the target body in order to hit it, as R_capture>R_target. Astronomers refer to the effective cross section for capture as sigma=π*R_capture**2. This algorithm does not account for an N-body problem. """ from math import pow, sqrt # noqa: A004 from scipy.constants import G, c, pi def capture_radii( target_body_radius: float, target_body_mass: float, projectile_velocity: float ) -> float: """ Input Params: ------------- target_body_radius: Radius of the central body SI units: meters | m target_body_mass: Mass of the central body SI units: kilograms | kg projectile_velocity: Velocity of object moving toward central body SI units: meters/second | m/s Returns: -------- >>> capture_radii(6.957e8, 1.99e30, 25000.0) 17209590691.0 >>> capture_radii(-6.957e8, 1.99e30, 25000.0) Traceback (most recent call last): ... ValueError: Radius cannot be less than 0 >>> capture_radii(6.957e8, -1.99e30, 25000.0) Traceback (most recent call last): ... ValueError: Mass cannot be less than 0 >>> capture_radii(6.957e8, 1.99e30, c+1) Traceback (most recent call last): ... ValueError: Cannot go beyond speed of light Returned SI units: ------------------ meters | m """ if target_body_mass < 0: raise ValueError("Mass cannot be less than 0") if target_body_radius < 0: raise ValueError("Radius cannot be less than 0") if projectile_velocity > c: raise ValueError("Cannot go beyond speed of light") escape_velocity_squared = (2 * G * target_body_mass) / target_body_radius capture_radius = target_body_radius * sqrt( 1 + escape_velocity_squared / pow(projectile_velocity, 2) ) return round(capture_radius, 0) def capture_area(capture_radius: float) -> float: """ Input Param: ------------ capture_radius: The radius of orbital capture and impact for a central body of mass M and a projectile moving towards it with velocity v SI units: meters | m Returns: -------- >>> capture_area(17209590691) 9.304455331329126e+20 >>> capture_area(-1) Traceback (most recent call last): ... ValueError: Cannot have a capture radius less than 0 Returned SI units: ------------------ meters*meters | m**2 """ if capture_radius < 0: raise ValueError("Cannot have a capture radius less than 0") sigma = pi * pow(capture_radius, 2) return round(sigma, 0) if __name__ == "__main__": from doctest import testmod testmod() """ Derivation: Let: Mt=target mass, Rt=target radius, v=projectile_velocity, r_0=radius of projectile at instant 0 to CM of target v_p=v at closest approach, r_p=radius from projectile to target CM at closest approach, R_capture= radius of impact for projectile with velocity v (1)At time=0 the projectile's energy falling from infinity| E=K+U=0.5*m*(v**2)+0 E_initial=0.5*m*(v**2) (2)at time=0 the angular momentum of the projectile relative to CM target| L_initial=m*r_0*v*sin(Θ)->m*r_0*v*(R_capture/r_0)->m*v*R_capture L_i=m*v*R_capture (3)The energy of the projectile at closest approach will be its kinetic energy at closest approach plus gravitational potential energy(-(GMm)/R)| E_p=K_p+U_p->E_p=0.5*m*(v_p**2)-(G*Mt*m)/r_p E_p=0.0.5*m*(v_p**2)-(G*Mt*m)/r_p (4)The angular momentum of the projectile relative to the target at closest approach will be L_p=m*r_p*v_p*sin(Θ), however relative to the target Θ=90° sin(90°)=1| L_p=m*r_p*v_p (5)Using conservation of angular momentum and energy, we can write a quadratic equation that solves for r_p| (a) Ei=Ep-> 0.5*m*(v**2)=0.5*m*(v_p**2)-(G*Mt*m)/r_p-> v**2=v_p**2-(2*G*Mt)/r_p (b) Li=Lp-> m*v*R_capture=m*r_p*v_p-> v*R_capture=r_p*v_p-> v_p=(v*R_capture)/r_p (c) b plugs int a| v**2=((v*R_capture)/r_p)**2-(2*G*Mt)/r_p-> v**2-(v**2)*(R_c**2)/(r_p**2)+(2*G*Mt)/r_p=0-> (v**2)*(r_p**2)+2*G*Mt*r_p-(v**2)*(R_c**2)=0 (d) Using the quadratic formula, we'll solve for r_p then rearrange to solve to R_capture r_p=(-2*G*Mt ± sqrt(4*G^2*Mt^2+ 4(v^4*R_c^2)))/(2*v^2)-> r_p=(-G*Mt ± sqrt(G^2*Mt+v^4*R_c^2))/v^2-> r_p<0 is something we can ignore, as it has no physical meaning for our purposes.-> r_p=(-G*Mt)/v^2 + sqrt(G^2*Mt^2/v^4 + R_c^2) (e)We are trying to solve for R_c. We are looking for impact, so we want r_p=Rt Rt + G*Mt/v^2 = sqrt(G^2*Mt^2/v^4 + R_c^2)-> (Rt + G*Mt/v^2)^2 = G^2*Mt^2/v^4 + R_c^2-> Rt^2 + 2*G*Mt*Rt/v^2 + G^2*Mt^2/v^4 = G^2*Mt^2/v^4 + R_c^2-> Rt**2 + 2*G*Mt*Rt/v**2 = R_c**2-> Rt**2 * (1 + 2*G*Mt/Rt *1/v**2) = R_c**2-> escape velocity = sqrt(2GM/R)= v_escape**2=2GM/R-> Rt**2 * (1 + v_esc**2/v**2) = R_c**2-> (6) R_capture = Rt * sqrt(1 + v_esc**2/v**2) Source: Problem Set 3 #8 c.Fall_2017|Honors Astronomy|Professor Rachel Bezanson Source #2: http://www.nssc.ac.cn/wxzygx/weixin/201607/P020160718380095698873.pdf 8.8 Planetary Rendezvous: Pg.368 """ ================================================ FILE: physics/casimir_effect.py ================================================ """ Title : Finding the value of magnitude of either the Casimir force, the surface area of one of the plates or distance between the plates provided that the other two parameters are given. Description : In quantum field theory, the Casimir effect is a physical force acting on the macroscopic boundaries of a confined space which arises from the quantum fluctuations of the field. It is a physical force exerted between separate objects, which is due to neither charge, gravity, nor the exchange of particles, but instead is due to resonance of all-pervasive energy fields in the intervening space between the objects. Since the strength of the force falls off rapidly with distance it is only measurable when the distance between the objects is extremely small. On a submicron scale, this force becomes so strong that it becomes the dominant force between uncharged conductors. Dutch physicist Hendrik B. G. Casimir first proposed the existence of the force, and he formulated an experiment to detect it in 1948 while participating in research at Philips Research Labs. The classic form of his experiment used a pair of uncharged parallel metal plates in a vacuum, and successfully demonstrated the force to within 15% of the value he had predicted according to his theory. The Casimir force F for idealized, perfectly conducting plates of surface area A square meter and placed at a distance of a meter apart with vacuum between them is expressed as - F = - ((Reduced Planck Constant ℏ) * c * Pi^2 * A) / (240 * a^4) Here, the negative sign indicates the force is attractive in nature. For the ease of calculation, only the magnitude of the force is considered. Source : - https://en.wikipedia.org/wiki/Casimir_effect - https://www.cs.mcgill.ca/~rwest/wikispeedia/wpcd/wp/c/Casimir_effect.htm - Casimir, H. B. ; Polder, D. (1948) "The Influence of Retardation on the London-van der Waals Forces", Physical Review, vol. 73, Issue 4, pp. 360-372 """ from __future__ import annotations from math import pi # Define the Reduced Planck Constant ℏ (H bar), speed of light C, value of # Pi and the function REDUCED_PLANCK_CONSTANT = 1.054571817e-34 # unit of ℏ : J * s SPEED_OF_LIGHT = 3e8 # unit of c : m * s^-1 def casimir_force(force: float, area: float, distance: float) -> dict[str, float]: """ Input Parameters ---------------- force -> Casimir Force : magnitude in Newtons area -> Surface area of each plate : magnitude in square meters distance -> Distance between two plates : distance in Meters Returns ------- result : dict name, value pair of the parameter having Zero as it's value Returns the value of one of the parameters specified as 0, provided the values of other parameters are given. >>> casimir_force(force = 0, area = 4, distance = 0.03) {'force': 6.4248189174864216e-21} >>> casimir_force(force = 2635e-13, area = 0.0023, distance = 0) {'distance': 1.0323056015031114e-05} >>> casimir_force(force = 2737e-21, area = 0, distance = 0.0023746) {'area': 0.06688838837354052} >>> casimir_force(force = 3457e-12, area = 0, distance = 0) Traceback (most recent call last): ... ValueError: One and only one argument must be 0 >>> casimir_force(force = 3457e-12, area = 0, distance = -0.00344) Traceback (most recent call last): ... ValueError: Distance can not be negative >>> casimir_force(force = -912e-12, area = 0, distance = 0.09374) Traceback (most recent call last): ... ValueError: Magnitude of force can not be negative """ if (force, area, distance).count(0) != 1: raise ValueError("One and only one argument must be 0") if force < 0: raise ValueError("Magnitude of force can not be negative") if distance < 0: raise ValueError("Distance can not be negative") if area < 0: raise ValueError("Area can not be negative") if force == 0: force = (REDUCED_PLANCK_CONSTANT * SPEED_OF_LIGHT * pi**2 * area) / ( 240 * (distance) ** 4 ) return {"force": force} elif area == 0: area = (240 * force * (distance) ** 4) / ( REDUCED_PLANCK_CONSTANT * SPEED_OF_LIGHT * pi**2 ) return {"area": area} elif distance == 0: distance = ( (REDUCED_PLANCK_CONSTANT * SPEED_OF_LIGHT * pi**2 * area) / (240 * force) ) ** (1 / 4) return {"distance": distance} raise ValueError("One and only one argument must be 0") # Run doctest if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: physics/center_of_mass.py ================================================ """ Calculating the center of mass for a discrete system of particles, given their positions and masses. Description: In physics, the center of mass of a distribution of mass in space (sometimes referred to as the barycenter or balance point) is the unique point at any given time where the weighted relative position of the distributed mass sums to zero. This is the point to which a force may be applied to cause a linear acceleration without an angular acceleration. Calculations in mechanics are often simplified when formulated with respect to the center of mass. It is a hypothetical point where the entire mass of an object may be assumed to be concentrated to visualize its motion. In other words, the center of mass is the particle equivalent of a given object for the application of Newton's laws of motion. In the case of a system of particles P_i, i = 1, ..., n , each with mass m_i that are located in space with coordinates r_i, i = 1, ..., n , the coordinates R of the center of mass corresponds to: R = (Σ(mi * ri) / Σ(mi)) Reference: https://en.wikipedia.org/wiki/Center_of_mass """ from collections import namedtuple Particle = namedtuple("Particle", "x y z mass") # noqa: PYI024 Coord3D = namedtuple("Coord3D", "x y z") # noqa: PYI024 def center_of_mass(particles: list[Particle]) -> Coord3D: """ Input Parameters ---------------- particles: list(Particle): A list of particles where each particle is a tuple with it's (x, y, z) position and it's mass. Returns ------- Coord3D: A tuple with the coordinates of the center of mass (Xcm, Ycm, Zcm) rounded to two decimal places. Examples -------- >>> center_of_mass([ ... Particle(1.5, 4, 3.4, 4), ... Particle(5, 6.8, 7, 8.1), ... Particle(9.4, 10.1, 11.6, 12) ... ]) Coord3D(x=6.61, y=7.98, z=8.69) >>> center_of_mass([ ... Particle(1, 2, 3, 4), ... Particle(5, 6, 7, 8), ... Particle(9, 10, 11, 12) ... ]) Coord3D(x=6.33, y=7.33, z=8.33) >>> center_of_mass([ ... Particle(1, 2, 3, -4), ... Particle(5, 6, 7, 8), ... Particle(9, 10, 11, 12) ... ]) Traceback (most recent call last): ... ValueError: Mass of all particles must be greater than 0 >>> center_of_mass([ ... Particle(1, 2, 3, 0), ... Particle(5, 6, 7, 8), ... Particle(9, 10, 11, 12) ... ]) Traceback (most recent call last): ... ValueError: Mass of all particles must be greater than 0 >>> center_of_mass([]) Traceback (most recent call last): ... ValueError: No particles provided """ if not particles: raise ValueError("No particles provided") if any(particle.mass <= 0 for particle in particles): raise ValueError("Mass of all particles must be greater than 0") total_mass = sum(particle.mass for particle in particles) center_of_mass_x = round( sum(particle.x * particle.mass for particle in particles) / total_mass, 2 ) center_of_mass_y = round( sum(particle.y * particle.mass for particle in particles) / total_mass, 2 ) center_of_mass_z = round( sum(particle.z * particle.mass for particle in particles) / total_mass, 2 ) return Coord3D(center_of_mass_x, center_of_mass_y, center_of_mass_z) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: physics/centripetal_force.py ================================================ """ Description : Centripetal force is the force acting on an object in curvilinear motion directed towards the axis of rotation or centre of curvature. The unit of centripetal force is newton. The centripetal force is always directed perpendicular to the direction of the object's displacement. Using Newton's second law of motion, it is found that the centripetal force of an object moving in a circular path always acts towards the centre of the circle. The Centripetal Force Formula is given as the product of mass (in kg) and tangential velocity (in meters per second) squared, divided by the radius (in meters) that implies that on doubling the tangential velocity, the centripetal force will be quadrupled. Mathematically it is written as: F = mv²/r Where, F is the Centripetal force, m is the mass of the object, v is the speed or velocity of the object and r is the radius. Reference: https://byjus.com/physics/centripetal-and-centrifugal-force/ """ def centripetal(mass: float, velocity: float, radius: float) -> float: """ The Centripetal Force formula is given as: (m*v*v)/r >>> round(centripetal(15.5,-30,10),2) 1395.0 >>> round(centripetal(10,15,5),2) 450.0 >>> round(centripetal(20,-50,15),2) 3333.33 >>> round(centripetal(12.25,40,25),2) 784.0 >>> round(centripetal(50,100,50),2) 10000.0 """ if mass < 0: raise ValueError("The mass of the body cannot be negative") if radius <= 0: raise ValueError("The radius is always a positive non zero integer") return (mass * (velocity) ** 2) / radius if __name__ == "__main__": import doctest doctest.testmod(verbose=True) ================================================ FILE: physics/coulombs_law.py ================================================ """ Coulomb's law states that the magnitude of the electrostatic force of attraction or repulsion between two point charges is directly proportional to the product of the magnitudes of charges and inversely proportional to the square of the distance between them. F = k * q1 * q2 / r^2 k is Coulomb's constant and equals 1/(4π*ε0) q1 is charge of first body (C) q2 is charge of second body (C) r is distance between two charged bodies (m) Reference: https://en.wikipedia.org/wiki/Coulomb%27s_law """ def coulombs_law(q1: float, q2: float, radius: float) -> float: """ Calculate the electrostatic force of attraction or repulsion between two point charges >>> coulombs_law(15.5, 20, 15) 12382849136.06 >>> coulombs_law(1, 15, 5) 5392531075.38 >>> coulombs_law(20, -50, 15) -39944674632.44 >>> coulombs_law(-5, -8, 10) 3595020716.92 >>> coulombs_law(50, 100, 50) 17975103584.6 """ if radius <= 0: raise ValueError("The radius is always a positive number") return round(((8.9875517923 * 10**9) * q1 * q2) / (radius**2), 2) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: physics/doppler_frequency.py ================================================ """ Doppler's effect The Doppler effect (also Doppler shift) is the change in the frequency of a wave in relation to an observer who is moving relative to the source of the wave. The Doppler effect is named after the physicist Christian Doppler. A common example of Doppler shift is the change of pitch heard when a vehicle sounding a horn approaches and recedes from an observer. The reason for the Doppler effect is that when the source of the waves is moving towards the observer, each successive wave crest is emitted from a position closer to the observer than the crest of the previous wave. Therefore, each wave takes slightly less time to reach the observer than the previous wave. Hence, the time between the arrivals of successive wave crests at the observer is reduced, causing an increase in the frequency. Similarly, if the source of waves is moving away from the observer, each wave is emitted from a position farther from the observer than the previous wave, so the arrival time between successive waves is increased, reducing the frequency. If the source of waves is stationary but the observer is moving with respect to the source, the transmission velocity of the waves changes (ie the rate at which the observer receives waves) even if the wavelength and frequency emitted from the source remain constant. These results are all summarized by the Doppler formula: f = (f0 * (v + v0)) / (v - vs) where: f: frequency of the wave f0: frequency of the wave when the source is stationary v: velocity of the wave in the medium v0: velocity of the observer, positive if the observer is moving towards the source vs: velocity of the source, positive if the source is moving towards the observer Doppler's effect has many applications in physics and engineering, such as radar, astronomy, medical imaging, and seismology. References: https://en.wikipedia.org/wiki/Doppler_effect Now, we will implement a function that calculates the frequency of a wave as a function of the frequency of the wave when the source is stationary, the velocity of the wave in the medium, the velocity of the observer and the velocity of the source. """ def doppler_effect( org_freq: float, wave_vel: float, obs_vel: float, src_vel: float ) -> float: """ Input Parameters: ----------------- org_freq: frequency of the wave when the source is stationary wave_vel: velocity of the wave in the medium obs_vel: velocity of the observer, +ve if the observer is moving towards the source src_vel: velocity of the source, +ve if the source is moving towards the observer Returns: -------- f: frequency of the wave as perceived by the observer Docstring Tests: >>> doppler_effect(100, 330, 10, 0) # observer moving towards the source 103.03030303030303 >>> doppler_effect(100, 330, -10, 0) # observer moving away from the source 96.96969696969697 >>> doppler_effect(100, 330, 0, 10) # source moving towards the observer 103.125 >>> doppler_effect(100, 330, 0, -10) # source moving away from the observer 97.05882352941177 >>> doppler_effect(100, 330, 10, 10) # source & observer moving towards each other 106.25 >>> doppler_effect(100, 330, -10, -10) # source and observer moving away 94.11764705882354 >>> doppler_effect(100, 330, 10, 330) # source moving at same speed as the wave Traceback (most recent call last): ... ZeroDivisionError: Division by zero implies vs=v and observer in front of the source >>> doppler_effect(100, 330, 10, 340) # source moving faster than the wave Traceback (most recent call last): ... ValueError: Non-positive frequency implies vs>v or v0>v (in the opposite direction) >>> doppler_effect(100, 330, -340, 10) # observer moving faster than the wave Traceback (most recent call last): ... ValueError: Non-positive frequency implies vs>v or v0>v (in the opposite direction) """ if wave_vel == src_vel: raise ZeroDivisionError( "Division by zero implies vs=v and observer in front of the source" ) doppler_freq = (org_freq * (wave_vel + obs_vel)) / (wave_vel - src_vel) if doppler_freq <= 0: raise ValueError( "Non-positive frequency implies vs>v or v0>v (in the opposite direction)" ) return doppler_freq if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: physics/escape_velocity.py ================================================ import math def escape_velocity(mass: float, radius: float) -> float: """ Calculates the escape velocity needed to break free from a celestial body's gravitational field. The formula used is: v = sqrt(2 * G * M / R) where: v = escape velocity (m/s) G = gravitational constant (6.67430 * 10^-11 m^3 kg^-1 s^-2) M = mass of the celestial body (kg) R = radius from the center of mass (m) Source: https://en.wikipedia.org/wiki/Escape_velocity Args: mass (float): Mass of the celestial body in kilograms. radius (float): Radius from the center of mass in meters. Returns: float: Escape velocity in meters per second, rounded to 3 decimal places. Examples: >>> escape_velocity(mass=5.972e24, radius=6.371e6) # Earth 11185.978 >>> escape_velocity(mass=7.348e22, radius=1.737e6) # Moon 2376.307 >>> escape_velocity(mass=1.898e27, radius=6.9911e7) # Jupiter 60199.545 >>> escape_velocity(mass=0, radius=1.0) 0.0 >>> escape_velocity(mass=1.0, radius=0) Traceback (most recent call last): ... ZeroDivisionError: Radius cannot be zero. """ gravitational_constant = 6.67430e-11 # m^3 kg^-1 s^-2 if radius == 0: raise ZeroDivisionError("Radius cannot be zero.") velocity = math.sqrt(2 * gravitational_constant * mass / radius) return round(velocity, 3) if __name__ == "__main__": import doctest doctest.testmod() print("Calculate escape velocity of a celestial body...\n") try: mass = float(input("Enter mass of the celestial body (in kgs): ").strip()) radius = float(input("Enter radius from the center of mass (in ms): ").strip()) velocity = escape_velocity(mass=mass, radius=radius) print(f"Escape velocity is {velocity} m/s") except ValueError: print("Invalid input. Please enter valid numeric values.") except ZeroDivisionError as e: print(e) ================================================ FILE: physics/grahams_law.py ================================================ """ Title: Graham's Law of Effusion Description: Graham's law of effusion states that the rate of effusion of a gas is inversely proportional to the square root of the molar mass of its particles: r1/r2 = sqrt(m2/m1) r1 = Rate of effusion for the first gas. r2 = Rate of effusion for the second gas. m1 = Molar mass of the first gas. m2 = Molar mass of the second gas. (Description adapted from https://en.wikipedia.org/wiki/Graham%27s_law) """ from math import pow, sqrt # noqa: A004 def validate(*values: float) -> bool: """ Input Parameters: ----------------- effusion_rate_1: Effustion rate of first gas (m^2/s, mm^2/s, etc.) effusion_rate_2: Effustion rate of second gas (m^2/s, mm^2/s, etc.) molar_mass_1: Molar mass of the first gas (g/mol, kg/kmol, etc.) molar_mass_2: Molar mass of the second gas (g/mol, kg/kmol, etc.) Returns: -------- >>> validate(2.016, 4.002) True >>> validate(-2.016, 4.002) False >>> validate() False """ result = len(values) > 0 and all(value > 0.0 for value in values) return result def effusion_ratio(molar_mass_1: float, molar_mass_2: float) -> float | ValueError: """ Input Parameters: ----------------- molar_mass_1: Molar mass of the first gas (g/mol, kg/kmol, etc.) molar_mass_2: Molar mass of the second gas (g/mol, kg/kmol, etc.) Returns: -------- >>> effusion_ratio(2.016, 4.002) 1.408943 >>> effusion_ratio(-2.016, 4.002) ValueError('Input Error: Molar mass values must greater than 0.') >>> effusion_ratio(2.016) Traceback (most recent call last): ... TypeError: effusion_ratio() missing 1 required positional argument: 'molar_mass_2' """ return ( round(sqrt(molar_mass_2 / molar_mass_1), 6) if validate(molar_mass_1, molar_mass_2) else ValueError("Input Error: Molar mass values must greater than 0.") ) def first_effusion_rate( effusion_rate: float, molar_mass_1: float, molar_mass_2: float ) -> float | ValueError: """ Input Parameters: ----------------- effusion_rate: Effustion rate of second gas (m^2/s, mm^2/s, etc.) molar_mass_1: Molar mass of the first gas (g/mol, kg/kmol, etc.) molar_mass_2: Molar mass of the second gas (g/mol, kg/kmol, etc.) Returns: -------- >>> first_effusion_rate(1, 2.016, 4.002) 1.408943 >>> first_effusion_rate(-1, 2.016, 4.002) ValueError('Input Error: Molar mass and effusion rate values must greater than 0.') >>> first_effusion_rate(1) Traceback (most recent call last): ... TypeError: first_effusion_rate() missing 2 required positional arguments: \ 'molar_mass_1' and 'molar_mass_2' >>> first_effusion_rate(1, 2.016) Traceback (most recent call last): ... TypeError: first_effusion_rate() missing 1 required positional argument: \ 'molar_mass_2' """ return ( round(effusion_rate * sqrt(molar_mass_2 / molar_mass_1), 6) if validate(effusion_rate, molar_mass_1, molar_mass_2) else ValueError( "Input Error: Molar mass and effusion rate values must greater than 0." ) ) def second_effusion_rate( effusion_rate: float, molar_mass_1: float, molar_mass_2: float ) -> float | ValueError: """ Input Parameters: ----------------- effusion_rate: Effustion rate of second gas (m^2/s, mm^2/s, etc.) molar_mass_1: Molar mass of the first gas (g/mol, kg/kmol, etc.) molar_mass_2: Molar mass of the second gas (g/mol, kg/kmol, etc.) Returns: -------- >>> second_effusion_rate(1, 2.016, 4.002) 0.709752 >>> second_effusion_rate(-1, 2.016, 4.002) ValueError('Input Error: Molar mass and effusion rate values must greater than 0.') >>> second_effusion_rate(1) Traceback (most recent call last): ... TypeError: second_effusion_rate() missing 2 required positional arguments: \ 'molar_mass_1' and 'molar_mass_2' >>> second_effusion_rate(1, 2.016) Traceback (most recent call last): ... TypeError: second_effusion_rate() missing 1 required positional argument: \ 'molar_mass_2' """ return ( round(effusion_rate / sqrt(molar_mass_2 / molar_mass_1), 6) if validate(effusion_rate, molar_mass_1, molar_mass_2) else ValueError( "Input Error: Molar mass and effusion rate values must greater than 0." ) ) def first_molar_mass( molar_mass: float, effusion_rate_1: float, effusion_rate_2: float ) -> float | ValueError: """ Input Parameters: ----------------- molar_mass: Molar mass of the first gas (g/mol, kg/kmol, etc.) effusion_rate_1: Effustion rate of first gas (m^2/s, mm^2/s, etc.) effusion_rate_2: Effustion rate of second gas (m^2/s, mm^2/s, etc.) Returns: -------- >>> first_molar_mass(2, 1.408943, 0.709752) 0.507524 >>> first_molar_mass(-1, 2.016, 4.002) ValueError('Input Error: Molar mass and effusion rate values must greater than 0.') >>> first_molar_mass(1) Traceback (most recent call last): ... TypeError: first_molar_mass() missing 2 required positional arguments: \ 'effusion_rate_1' and 'effusion_rate_2' >>> first_molar_mass(1, 2.016) Traceback (most recent call last): ... TypeError: first_molar_mass() missing 1 required positional argument: \ 'effusion_rate_2' """ return ( round(molar_mass / pow(effusion_rate_1 / effusion_rate_2, 2), 6) if validate(molar_mass, effusion_rate_1, effusion_rate_2) else ValueError( "Input Error: Molar mass and effusion rate values must greater than 0." ) ) def second_molar_mass( molar_mass: float, effusion_rate_1: float, effusion_rate_2: float ) -> float | ValueError: """ Input Parameters: ----------------- molar_mass: Molar mass of the first gas (g/mol, kg/kmol, etc.) effusion_rate_1: Effustion rate of first gas (m^2/s, mm^2/s, etc.) effusion_rate_2: Effustion rate of second gas (m^2/s, mm^2/s, etc.) Returns: -------- >>> second_molar_mass(2, 1.408943, 0.709752) 1.970351 >>> second_molar_mass(-2, 1.408943, 0.709752) ValueError('Input Error: Molar mass and effusion rate values must greater than 0.') >>> second_molar_mass(1) Traceback (most recent call last): ... TypeError: second_molar_mass() missing 2 required positional arguments: \ 'effusion_rate_1' and 'effusion_rate_2' >>> second_molar_mass(1, 2.016) Traceback (most recent call last): ... TypeError: second_molar_mass() missing 1 required positional argument: \ 'effusion_rate_2' """ return ( round(pow(effusion_rate_1 / effusion_rate_2, 2) / molar_mass, 6) if validate(molar_mass, effusion_rate_1, effusion_rate_2) else ValueError( "Input Error: Molar mass and effusion rate values must greater than 0." ) ) ================================================ FILE: physics/horizontal_projectile_motion.py ================================================ """ Horizontal Projectile Motion problem in physics. This algorithm solves a specific problem in which the motion starts from the ground as can be seen below:: (v = 0) * * * * * * * * * * * * GROUND GROUND For more info: https://en.wikipedia.org/wiki/Projectile_motion """ # Importing packages from math import radians as deg_to_rad from math import sin # Acceleration Constant on Earth (unit m/s^2) g = 9.80665 def check_args(init_velocity: float, angle: float) -> None: """ Check that the arguments are valid """ # Ensure valid instance if not isinstance(init_velocity, (int, float)): raise TypeError("Invalid velocity. Should be an integer or float.") if not isinstance(angle, (int, float)): raise TypeError("Invalid angle. Should be an integer or float.") # Ensure valid angle if angle > 90 or angle < 1: raise ValueError("Invalid angle. Range is 1-90 degrees.") # Ensure valid velocity if init_velocity < 0: raise ValueError("Invalid velocity. Should be a positive number.") def horizontal_distance(init_velocity: float, angle: float) -> float: r""" Returns the horizontal distance that the object cover Formula: .. math:: \frac{v_0^2 \cdot \sin(2 \alpha)}{g} v_0 - \text{initial velocity} \alpha - \text{angle} >>> horizontal_distance(30, 45) 91.77 >>> horizontal_distance(100, 78) 414.76 >>> horizontal_distance(-1, 20) Traceback (most recent call last): ... ValueError: Invalid velocity. Should be a positive number. >>> horizontal_distance(30, -20) Traceback (most recent call last): ... ValueError: Invalid angle. Range is 1-90 degrees. """ check_args(init_velocity, angle) radians = deg_to_rad(2 * angle) return round(init_velocity**2 * sin(radians) / g, 2) def max_height(init_velocity: float, angle: float) -> float: r""" Returns the maximum height that the object reach Formula: .. math:: \frac{v_0^2 \cdot \sin^2 (\alpha)}{2 g} v_0 - \text{initial velocity} \alpha - \text{angle} >>> max_height(30, 45) 22.94 >>> max_height(100, 78) 487.82 >>> max_height("a", 20) Traceback (most recent call last): ... TypeError: Invalid velocity. Should be an integer or float. >>> horizontal_distance(30, "b") Traceback (most recent call last): ... TypeError: Invalid angle. Should be an integer or float. """ check_args(init_velocity, angle) radians = deg_to_rad(angle) return round(init_velocity**2 * sin(radians) ** 2 / (2 * g), 2) def total_time(init_velocity: float, angle: float) -> float: r""" Returns total time of the motion Formula: .. math:: \frac{2 v_0 \cdot \sin (\alpha)}{g} v_0 - \text{initial velocity} \alpha - \text{angle} >>> total_time(30, 45) 4.33 >>> total_time(100, 78) 19.95 >>> total_time(-10, 40) Traceback (most recent call last): ... ValueError: Invalid velocity. Should be a positive number. >>> total_time(30, "b") Traceback (most recent call last): ... TypeError: Invalid angle. Should be an integer or float. """ check_args(init_velocity, angle) radians = deg_to_rad(angle) return round(2 * init_velocity * sin(radians) / g, 2) def test_motion() -> None: """ Test motion >>> test_motion() """ v0, angle = 25, 20 assert horizontal_distance(v0, angle) == 40.97 assert max_height(v0, angle) == 3.73 assert total_time(v0, angle) == 1.74 if __name__ == "__main__": from doctest import testmod testmod() # Get input from user init_vel = float(input("Initial Velocity: ").strip()) # Get input from user angle = float(input("angle: ").strip()) # Print results print() print("Results: ") print(f"Horizontal Distance: {horizontal_distance(init_vel, angle)!s} [m]") print(f"Maximum Height: {max_height(init_vel, angle)!s} [m]") print(f"Total Time: {total_time(init_vel, angle)!s} [s]") ================================================ FILE: physics/hubble_parameter.py ================================================ """ Title : Calculating the Hubble Parameter Description : The Hubble parameter H is the Universe expansion rate in any time. In cosmology is customary to use the redshift redshift in place of time, becausethe redshift is directily mensure in the light of galaxies moving away from us. So, the general relation that we obtain is H = hubble_constant*(radiation_density*(redshift+1)**4 + matter_density*(redshift+1)**3 + curvature*(redshift+1)**2 + dark_energy)**(1/2) where radiation_density, matter_density, dark_energy are the relativity (the percentage) energy densities that exist in the Universe today. Here, matter_density is the sum of the barion density and the dark matter. Curvature is the curvature parameter and can be written in term of the densities by the completeness curvature = 1 - (matter_density + radiation_density + dark_energy) Source : https://www.sciencedirect.com/topics/mathematics/hubble-parameter """ def hubble_parameter( hubble_constant: float, radiation_density: float, matter_density: float, dark_energy: float, redshift: float, ) -> float: """ Input Parameters ---------------- hubble_constant: Hubble constante is the expansion rate today usually given in km/(s*Mpc) radiation_density: relative radiation density today matter_density: relative mass density today dark_energy: relative dark energy density today redshift: the light redshift Returns ------- result : Hubble parameter in and the unit km/s/Mpc (the unit can be changed if you want, just need to change the unit of the Hubble constant) >>> hubble_parameter(hubble_constant=68.3, radiation_density=1e-4, ... matter_density=-0.3, dark_energy=0.7, redshift=1) Traceback (most recent call last): ... ValueError: All input parameters must be positive >>> hubble_parameter(hubble_constant=68.3, radiation_density=1e-4, ... matter_density= 1.2, dark_energy=0.7, redshift=1) Traceback (most recent call last): ... ValueError: Relative densities cannot be greater than one >>> hubble_parameter(hubble_constant=68.3, radiation_density=1e-4, ... matter_density= 0.3, dark_energy=0.7, redshift=0) 68.3 """ parameters = [redshift, radiation_density, matter_density, dark_energy] if any(p < 0 for p in parameters): raise ValueError("All input parameters must be positive") if any(p > 1 for p in parameters[1:4]): raise ValueError("Relative densities cannot be greater than one") else: curvature = 1 - (matter_density + radiation_density + dark_energy) e_2 = ( radiation_density * (redshift + 1) ** 4 + matter_density * (redshift + 1) ** 3 + curvature * (redshift + 1) ** 2 + dark_energy ) hubble = hubble_constant * e_2 ** (1 / 2) return hubble if __name__ == "__main__": import doctest # run doctest doctest.testmod() # demo LCDM approximation matter_density = 0.3 print( hubble_parameter( hubble_constant=68.3, radiation_density=1e-4, matter_density=matter_density, dark_energy=1 - matter_density, redshift=0, ) ) ================================================ FILE: physics/ideal_gas_law.py ================================================ """ The ideal gas law, also called the general gas equation, is the equation of state of a hypothetical ideal gas. It is a good approximation of the behavior of many gases under many conditions, although it has several limitations. It was first stated by Benoît Paul Émile Clapeyron in 1834 as a combination of the empirical Boyle's law, Charles's law, Avogadro's law, and Gay-Lussac's law.[1] The ideal gas law is often written in an empirical form: ------------ | PV = nRT | ------------ P = Pressure (Pa) V = Volume (m^3) n = Amount of substance (mol) R = Universal gas constant T = Absolute temperature (Kelvin) (Description adapted from https://en.wikipedia.org/wiki/Ideal_gas_law ) """ UNIVERSAL_GAS_CONSTANT = 8.314462 # Unit - J mol-1 K-1 def pressure_of_gas_system(moles: float, kelvin: float, volume: float) -> float: """ >>> pressure_of_gas_system(2, 100, 5) 332.57848 >>> pressure_of_gas_system(0.5, 273, 0.004) 283731.01575 >>> pressure_of_gas_system(3, -0.46, 23.5) Traceback (most recent call last): ... ValueError: Invalid inputs. Enter positive value. """ if moles < 0 or kelvin < 0 or volume < 0: raise ValueError("Invalid inputs. Enter positive value.") return moles * kelvin * UNIVERSAL_GAS_CONSTANT / volume def volume_of_gas_system(moles: float, kelvin: float, pressure: float) -> float: """ >>> volume_of_gas_system(2, 100, 5) 332.57848 >>> volume_of_gas_system(0.5, 273, 0.004) 283731.01575 >>> volume_of_gas_system(3, -0.46, 23.5) Traceback (most recent call last): ... ValueError: Invalid inputs. Enter positive value. """ if moles < 0 or kelvin < 0 or pressure < 0: raise ValueError("Invalid inputs. Enter positive value.") return moles * kelvin * UNIVERSAL_GAS_CONSTANT / pressure def temperature_of_gas_system(moles: float, volume: float, pressure: float) -> float: """ >>> temperature_of_gas_system(2, 100, 5) 30.068090996146232 >>> temperature_of_gas_system(11, 5009, 1000) 54767.66101807144 >>> temperature_of_gas_system(3, -0.46, 23.5) Traceback (most recent call last): ... ValueError: Invalid inputs. Enter positive value. """ if moles < 0 or volume < 0 or pressure < 0: raise ValueError("Invalid inputs. Enter positive value.") return pressure * volume / (moles * UNIVERSAL_GAS_CONSTANT) def moles_of_gas_system(kelvin: float, volume: float, pressure: float) -> float: """ >>> moles_of_gas_system(100, 5, 10) 0.06013618199229246 >>> moles_of_gas_system(110, 5009, 1000) 5476.766101807144 >>> moles_of_gas_system(3, -0.46, 23.5) Traceback (most recent call last): ... ValueError: Invalid inputs. Enter positive value. """ if kelvin < 0 or volume < 0 or pressure < 0: raise ValueError("Invalid inputs. Enter positive value.") return pressure * volume / (kelvin * UNIVERSAL_GAS_CONSTANT) if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: physics/image_data/__init__.py ================================================ ================================================ FILE: physics/in_static_equilibrium.py ================================================ """ Checks if a system of forces is in static equilibrium. """ from __future__ import annotations from numpy import array, cos, cross, float64, radians, sin from numpy.typing import NDArray def polar_force( magnitude: float, angle: float, radian_mode: bool = False ) -> list[float]: """ Resolves force along rectangular components. (force, angle) => (force_x, force_y) >>> import math >>> force = polar_force(10, 45) >>> math.isclose(force[0], 7.071067811865477) True >>> math.isclose(force[1], 7.0710678118654755) True >>> force = polar_force(10, 3.14, radian_mode=True) >>> math.isclose(force[0], -9.999987317275396) True >>> math.isclose(force[1], 0.01592652916486828) True """ if radian_mode: return [magnitude * cos(angle), magnitude * sin(angle)] return [magnitude * cos(radians(angle)), magnitude * sin(radians(angle))] def in_static_equilibrium( forces: NDArray[float64], location: NDArray[float64], eps: float = 10**-1 ) -> bool: """ Check if a system is in equilibrium. It takes two numpy.array objects. forces ==> [ [force1_x, force1_y], [force2_x, force2_y], ....] location ==> [ [x1, y1], [x2, y2], ....] >>> force = array([[1, 1], [-1, 2]]) >>> location = array([[1, 0], [10, 0]]) >>> in_static_equilibrium(force, location) False """ # summation of moments is zero moments: NDArray[float64] = cross(location, forces) sum_moments: float = sum(moments) return bool(abs(sum_moments) < eps) if __name__ == "__main__": # Test to check if it works forces = array( [ polar_force(718.4, 180 - 30), polar_force(879.54, 45), polar_force(100, -90), ] ) location: NDArray[float64] = array([[0, 0], [0, 0], [0, 0]]) assert in_static_equilibrium(forces, location) # Problem 1 in image_data/2D_problems.jpg forces = array( [ polar_force(30 * 9.81, 15), polar_force(215, 180 - 45), polar_force(264, 90 - 30), ] ) location = array([[0, 0], [0, 0], [0, 0]]) assert in_static_equilibrium(forces, location) # Problem in image_data/2D_problems_1.jpg forces = array([[0, -2000], [0, -1200], [0, 15600], [0, -12400]]) location = array([[0, 0], [6, 0], [10, 0], [12, 0]]) assert in_static_equilibrium(forces, location) import doctest doctest.testmod() ================================================ FILE: physics/kinetic_energy.py ================================================ """ Find the kinetic energy of an object, given its mass and velocity. Description : In physics, the kinetic energy of an object is the energy that it possesses due to its motion.It is defined as the work needed to accelerate a body of a given mass from rest to its stated velocity.Having gained this energy during its acceleration, the body maintains this kinetic energy unless its speed changes.The same amount of work is done by the body when decelerating from its current speed to a state of rest.Formally, a kinetic energy is any term in a system's Lagrangian which includes a derivative with respect to time. In classical mechanics, the kinetic energy of a non-rotating object of mass m traveling at a speed v is ½mv².In relativistic mechanics, this is a good approximation only when v is much less than the speed of light.The standard unit of kinetic energy is the joule, while the English unit of kinetic energy is the foot-pound. Reference : https://en.m.wikipedia.org/wiki/Kinetic_energy """ def kinetic_energy(mass: float, velocity: float) -> float: """ Calculate kinetic energy. The kinetic energy of a non-rotating object of mass m traveling at a speed v is ½mv² >>> kinetic_energy(10,10) 500.0 >>> kinetic_energy(0,10) 0.0 >>> kinetic_energy(10,0) 0.0 >>> kinetic_energy(20,-20) 4000.0 >>> kinetic_energy(0,0) 0.0 >>> kinetic_energy(2,2) 4.0 >>> kinetic_energy(100,100) 500000.0 """ if mass < 0: raise ValueError("The mass of a body cannot be negative") return 0.5 * mass * abs(velocity) * abs(velocity) if __name__ == "__main__": import doctest doctest.testmod(verbose=True) ================================================ FILE: physics/lens_formulae.py ================================================ """ This module has functions which calculate focal length of lens, distance of image from the lens and distance of object from the lens. The above is calculated using the lens formula. In optics, the relationship between the distance of the image (v), the distance of the object (u), and the focal length (f) of the lens is given by the formula known as the Lens formula. The Lens formula is applicable for convex as well as concave lenses. The formula is given as follows: ------------------- | 1/f = 1/v + 1/u | ------------------- Where f = focal length of the lens in meters. v = distance of the image from the lens in meters. u = distance of the object from the lens in meters. To make our calculations easy few assumptions are made while deriving the formula which are important to keep in mind before solving this equation. The assumptions are as follows: 1. The object O is a point object lying somewhere on the principle axis. 2. The lens is thin. 3. The aperture of the lens taken must be small. 4. The angles of incidence and angle of refraction should be small. Sign convention is a set of rules to set signs for image distance, object distance, focal length, etc for mathematical analysis of image formation. According to it: 1. Object is always placed to the left of lens. 2. All distances are measured from the optical centre of the mirror. 3. Distances measured in the direction of the incident ray are positive and the distances measured in the direction opposite to that of the incident rays are negative. 4. Distances measured along y-axis above the principal axis are positive and that measured along y-axis below the principal axis are negative. Note: Sign convention can be reversed and will still give the correct results. Reference for Sign convention: https://www.toppr.com/ask/content/concept/sign-convention-for-lenses-210246/ Reference for assumptions: https://testbook.com/physics/derivation-of-lens-maker-formula """ def focal_length_of_lens( object_distance_from_lens: float, image_distance_from_lens: float ) -> float: """ Doctests: >>> from math import isclose >>> isclose(focal_length_of_lens(10,4), 6.666666666666667) True >>> from math import isclose >>> isclose(focal_length_of_lens(2.7,5.8), -5.0516129032258075) True >>> focal_length_of_lens(0, 20) # doctest: +NORMALIZE_WHITESPACE Traceback (most recent call last): ... ValueError: Invalid inputs. Enter non zero values with respect to the sign convention. """ if object_distance_from_lens == 0 or image_distance_from_lens == 0: raise ValueError( "Invalid inputs. Enter non zero values with respect to the sign convention." ) focal_length = 1 / ( (1 / image_distance_from_lens) - (1 / object_distance_from_lens) ) return focal_length def object_distance( focal_length_of_lens: float, image_distance_from_lens: float ) -> float: """ Doctests: >>> from math import isclose >>> isclose(object_distance(10,40), -13.333333333333332) True >>> from math import isclose >>> isclose(object_distance(6.2,1.5), 1.9787234042553192) True >>> object_distance(0, 20) # doctest: +NORMALIZE_WHITESPACE Traceback (most recent call last): ... ValueError: Invalid inputs. Enter non zero values with respect to the sign convention. """ if image_distance_from_lens == 0 or focal_length_of_lens == 0: raise ValueError( "Invalid inputs. Enter non zero values with respect to the sign convention." ) object_distance = 1 / ((1 / image_distance_from_lens) - (1 / focal_length_of_lens)) return object_distance def image_distance( focal_length_of_lens: float, object_distance_from_lens: float ) -> float: """ Doctests: >>> from math import isclose >>> isclose(image_distance(50,40), 22.22222222222222) True >>> from math import isclose >>> isclose(image_distance(5.3,7.9), 3.1719696969696973) True >>> object_distance(0, 20) # doctest: +NORMALIZE_WHITESPACE Traceback (most recent call last): ... ValueError: Invalid inputs. Enter non zero values with respect to the sign convention. """ if object_distance_from_lens == 0 or focal_length_of_lens == 0: raise ValueError( "Invalid inputs. Enter non zero values with respect to the sign convention." ) image_distance = 1 / ((1 / object_distance_from_lens) + (1 / focal_length_of_lens)) return image_distance ================================================ FILE: physics/lorentz_transformation_four_vector.py ================================================ """ Lorentz transformations describe the transition between two inertial reference frames F and F', each of which is moving in some direction with respect to the other. This code only calculates Lorentz transformations for movement in the x direction with no spatial rotation (i.e., a Lorentz boost in the x direction). The Lorentz transformations are calculated here as linear transformations of four-vectors [ct, x, y, z] described by Minkowski space. Note that t (time) is multiplied by c (the speed of light) in the first entry of each four-vector. Thus, if X = [ct; x; y; z] and X' = [ct'; x'; y'; z'] are the four-vectors for two inertial reference frames and X' moves in the x direction with velocity v with respect to X, then the Lorentz transformation from X to X' is X' = BX, where | y -γβ 0 0| B = |-γβ y 0 0| | 0 0 1 0| | 0 0 0 1| is the matrix describing the Lorentz boost between X and X', y = 1 / √(1 - v²/c²) is the Lorentz factor, and β = v/c is the velocity as a fraction of c. Reference: https://en.wikipedia.org/wiki/Lorentz_transformation """ from math import sqrt import numpy as np from sympy import symbols # Coefficient # Speed of light (m/s) c = 299792458 # Symbols ct, x, y, z = symbols("ct x y z") # Vehicle's speed divided by speed of light (no units) def beta(velocity: float) -> float: """ Calculates β = v/c, the given velocity as a fraction of c >>> beta(c) 1.0 >>> beta(199792458) 0.666435904801848 >>> beta(1e5) 0.00033356409519815205 >>> beta(0.2) Traceback (most recent call last): ... ValueError: Speed must be greater than or equal to 1! """ if velocity > c: raise ValueError("Speed must not exceed light speed 299,792,458 [m/s]!") elif velocity < 1: # Usually the speed should be much higher than 1 (c order of magnitude) raise ValueError("Speed must be greater than or equal to 1!") return velocity / c def gamma(velocity: float) -> float: """ Calculate the Lorentz factor y = 1 / √(1 - v²/c²) for a given velocity >>> gamma(4) 1.0000000000000002 >>> gamma(1e5) 1.0000000556325075 >>> gamma(3e7) 1.005044845777813 >>> gamma(2.8e8) 2.7985595722318277 >>> gamma(299792451) 4627.49902669495 >>> gamma(0.3) Traceback (most recent call last): ... ValueError: Speed must be greater than or equal to 1! >>> gamma(2 * c) Traceback (most recent call last): ... ValueError: Speed must not exceed light speed 299,792,458 [m/s]! """ return 1 / sqrt(1 - beta(velocity) ** 2) def transformation_matrix(velocity: float) -> np.ndarray: """ Calculate the Lorentz transformation matrix for movement in the x direction: | y -γβ 0 0| |-γβ y 0 0| | 0 0 1 0| | 0 0 0 1| where y is the Lorentz factor and β is the velocity as a fraction of c >>> transformation_matrix(29979245) array([[ 1.00503781, -0.10050378, 0. , 0. ], [-0.10050378, 1.00503781, 0. , 0. ], [ 0. , 0. , 1. , 0. ], [ 0. , 0. , 0. , 1. ]]) >>> transformation_matrix(19979245.2) array([[ 1.00222811, -0.06679208, 0. , 0. ], [-0.06679208, 1.00222811, 0. , 0. ], [ 0. , 0. , 1. , 0. ], [ 0. , 0. , 0. , 1. ]]) >>> transformation_matrix(1) array([[ 1.00000000e+00, -3.33564095e-09, 0.00000000e+00, 0.00000000e+00], [-3.33564095e-09, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 1.00000000e+00]]) >>> transformation_matrix(0) Traceback (most recent call last): ... ValueError: Speed must be greater than or equal to 1! >>> transformation_matrix(c * 1.5) Traceback (most recent call last): ... ValueError: Speed must not exceed light speed 299,792,458 [m/s]! """ return np.array( [ [gamma(velocity), -gamma(velocity) * beta(velocity), 0, 0], [-gamma(velocity) * beta(velocity), gamma(velocity), 0, 0], [0, 0, 1, 0], [0, 0, 0, 1], ] ) def transform(velocity: float, event: np.ndarray | None = None) -> np.ndarray: """ Calculate a Lorentz transformation for movement in the x direction given a velocity and a four-vector for an inertial reference frame If no four-vector is given, then calculate the transformation symbolically with variables >>> transform(29979245, np.array([1, 2, 3, 4])) array([ 3.01302757e+08, -3.01302729e+07, 3.00000000e+00, 4.00000000e+00]) >>> transform(29979245) array([1.00503781498831*ct - 0.100503778816875*x, -0.100503778816875*ct + 1.00503781498831*x, 1.0*y, 1.0*z], dtype=object) >>> transform(19879210.2) array([1.0022057787097*ct - 0.066456172618675*x, -0.066456172618675*ct + 1.0022057787097*x, 1.0*y, 1.0*z], dtype=object) >>> transform(299792459, np.array([1, 1, 1, 1])) Traceback (most recent call last): ... ValueError: Speed must not exceed light speed 299,792,458 [m/s]! >>> transform(-1, np.array([1, 1, 1, 1])) Traceback (most recent call last): ... ValueError: Speed must be greater than or equal to 1! """ # Ensure event is not empty if event is None: event = np.array([ct, x, y, z]) # Symbolic four vector else: event[0] *= c # x0 is ct (speed of light * time) return transformation_matrix(velocity) @ event if __name__ == "__main__": import doctest doctest.testmod() # Example of symbolic vector: four_vector = transform(29979245) print("Example of four vector: ") print(f"ct' = {four_vector[0]}") print(f"x' = {four_vector[1]}") print(f"y' = {four_vector[2]}") print(f"z' = {four_vector[3]}") # Substitute symbols with numerical values sub_dict = {ct: c, x: 1, y: 1, z: 1} numerical_vector = [four_vector[i].subs(sub_dict) for i in range(4)] print(f"\n{numerical_vector}") ================================================ FILE: physics/malus_law.py ================================================ import math """ Finding the intensity of light transmitted through a polariser using Malus Law and by taking initial intensity and angle between polariser and axis as input Description : Malus's law, which is named after Étienne-Louis Malus, says that when a perfect polarizer is placed in a polarized beam of light, the irradiance, I, of the light that passes through is given by I=I'cos²θ where I' is the initial intensity and θ is the angle between the light's initial polarization direction and the axis of the polarizer. A beam of unpolarized light can be thought of as containing a uniform mixture of linear polarizations at all possible angles. Since the average value of cos²θ is 1/2, the transmission coefficient becomes I/I' = 1/2 In practice, some light is lost in the polarizer and the actual transmission will be somewhat lower than this, around 38% for Polaroid-type polarizers but considerably higher (>49.9%) for some birefringent prism types. If two polarizers are placed one after another (the second polarizer is generally called an analyzer), the mutual angle between their polarizing axes gives the value of θ in Malus's law. If the two axes are orthogonal, the polarizers are crossed and in theory no light is transmitted, though again practically speaking no polarizer is perfect and the transmission is not exactly zero (for example, crossed Polaroid sheets appear slightly blue in colour because their extinction ratio is better in the red). If a transparent object is placed between the crossed polarizers, any polarization effects present in the sample (such as birefringence) will be shown as an increase in transmission. This effect is used in polarimetry to measure the optical activity of a sample. Real polarizers are also not perfect blockers of the polarization orthogonal to their polarization axis; the ratio of the transmission of the unwanted component to the wanted component is called the extinction ratio, and varies from around 1:500 for Polaroid to about 1:106 for Glan-Taylor prism polarizers. Reference : "https://en.wikipedia.org/wiki/Polarizer#Malus's_law_and_other_properties" """ def malus_law(initial_intensity: float, angle: float) -> float: """ >>> round(malus_law(10,45),2) 5.0 >>> round(malus_law(100,60),2) 25.0 >>> round(malus_law(50,150),2) 37.5 >>> round(malus_law(75,270),2) 0.0 >>> round(malus_law(10,-900),2) Traceback (most recent call last): ... ValueError: In Malus Law, the angle is in the range 0-360 degrees >>> round(malus_law(10,900),2) Traceback (most recent call last): ... ValueError: In Malus Law, the angle is in the range 0-360 degrees >>> round(malus_law(-100,900),2) Traceback (most recent call last): ... ValueError: The value of intensity cannot be negative >>> round(malus_law(100,180),2) 100.0 >>> round(malus_law(100,360),2) 100.0 """ if initial_intensity < 0: raise ValueError("The value of intensity cannot be negative") # handling of negative values of initial intensity if angle < 0 or angle > 360: raise ValueError("In Malus Law, the angle is in the range 0-360 degrees") # handling of values out of allowed range return initial_intensity * (math.cos(math.radians(angle)) ** 2) if __name__ == "__main__": import doctest doctest.testmod(name="malus_law") ================================================ FILE: physics/mass_energy_equivalence.py ================================================ """ Title: Finding the energy equivalence of mass and mass equivalence of energy by Einstein's equation. Description: Einstein's mass-energy equivalence is a pivotal concept in theoretical physics. It asserts that energy (E) and mass (m) are directly related by the speed of light in vacuum (c) squared, as described in the equation E = mc². This means that mass and energy are interchangeable; a mass increase corresponds to an energy increase, and vice versa. This principle has profound implications in nuclear reactions, explaining the release of immense energy from minuscule changes in atomic nuclei. Equations: E = mc² and m = E/c², where m is mass, E is Energy, c is speed of light in vacuum. Reference: https://en.wikipedia.org/wiki/Mass%E2%80%93energy_equivalence """ from scipy.constants import c # speed of light in vacuum (299792458 m/s) def energy_from_mass(mass: float) -> float: """ Calculates the Energy equivalence of the Mass using E = mc² in SI units J from Mass in kg. mass (float): Mass of body. Usage example: >>> energy_from_mass(124.56) 1.11948945063458e+19 >>> energy_from_mass(320) 2.8760165719578165e+19 >>> energy_from_mass(0) 0.0 >>> energy_from_mass(-967.9) Traceback (most recent call last): ... ValueError: Mass can't be negative. """ if mass < 0: raise ValueError("Mass can't be negative.") return mass * c**2 def mass_from_energy(energy: float) -> float: """ Calculates the Mass equivalence of the Energy using m = E/c² in SI units kg from Energy in J. energy (float): Mass of body. Usage example: >>> mass_from_energy(124.56) 1.3859169098203872e-15 >>> mass_from_energy(320) 3.560480179371579e-15 >>> mass_from_energy(0) 0.0 >>> mass_from_energy(-967.9) Traceback (most recent call last): ... ValueError: Energy can't be negative. """ if energy < 0: raise ValueError("Energy can't be negative.") return energy / c**2 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: physics/mirror_formulae.py ================================================ """ This module contains the functions to calculate the focal length, object distance and image distance of a mirror. The mirror formula is an equation that relates the object distance (u), image distance (v), and focal length (f) of a spherical mirror. It is commonly used in optics to determine the position and characteristics of an image formed by a mirror. It is expressed using the formulae : ------------------- | 1/f = 1/v + 1/u | ------------------- Where, f = Focal length of the spherical mirror (metre) v = Image distance from the mirror (metre) u = Object distance from the mirror (metre) The signs of the distances are taken with respect to the sign convention. The sign convention is as follows: 1) Object is always placed to the left of mirror 2) Distances measured in the direction of the incident ray are positive and the distances measured in the direction opposite to that of the incident rays are negative. 3) All distances are measured from the pole of the mirror. There are a few assumptions that are made while using the mirror formulae. They are as follows: 1) Thin Mirror: The mirror is assumed to be thin, meaning its thickness is negligible compared to its radius of curvature. This assumption allows us to treat the mirror as a two-dimensional surface. 2) Spherical Mirror: The mirror is assumed to have a spherical shape. While this assumption may not hold exactly for all mirrors, it is a reasonable approximation for most practical purposes. 3) Small Angles: The angles involved in the derivation are assumed to be small. This assumption allows us to use the small-angle approximation, where the tangent of a small angle is approximately equal to the angle itself. It simplifies the calculations and makes the derivation more manageable. 4) Paraxial Rays: The mirror formula is derived using paraxial rays, which are rays that are close to the principal axis and make small angles with it. This assumption ensures that the rays are close enough to the principal axis, making the calculations more accurate. 5) Reflection and Refraction Laws: The derivation assumes that the laws of reflection and refraction hold. These laws state that the angle of incidence is equal to the angle of reflection for reflection, and the incident and refracted rays lie in the same plane and obey Snell's law for refraction. (Description and Assumptions adapted from https://www.collegesearch.in/articles/mirror-formula-derivation) (Sign Convention adapted from https://www.toppr.com/ask/content/concept/sign-convention-for-mirrors-210189/) """ def focal_length(distance_of_object: float, distance_of_image: float) -> float: """ >>> from math import isclose >>> isclose(focal_length(10, 20), 6.66666666666666) True >>> from math import isclose >>> isclose(focal_length(9.5, 6.7), 3.929012346) True >>> focal_length(0, 20) # doctest: +NORMALIZE_WHITESPACE Traceback (most recent call last): ... ValueError: Invalid inputs. Enter non zero values with respect to the sign convention. """ if distance_of_object == 0 or distance_of_image == 0: raise ValueError( "Invalid inputs. Enter non zero values with respect to the sign convention." ) focal_length = 1 / ((1 / distance_of_object) + (1 / distance_of_image)) return focal_length def object_distance(focal_length: float, distance_of_image: float) -> float: """ >>> from math import isclose >>> isclose(object_distance(30, 20), -60.0) True >>> from math import isclose >>> isclose(object_distance(10.5, 11.7), 102.375) True >>> object_distance(90, 0) # doctest: +NORMALIZE_WHITESPACE Traceback (most recent call last): ... ValueError: Invalid inputs. Enter non zero values with respect to the sign convention. """ if distance_of_image == 0 or focal_length == 0: raise ValueError( "Invalid inputs. Enter non zero values with respect to the sign convention." ) object_distance = 1 / ((1 / focal_length) - (1 / distance_of_image)) return object_distance def image_distance(focal_length: float, distance_of_object: float) -> float: """ >>> from math import isclose >>> isclose(image_distance(10, 40), 13.33333333) True >>> from math import isclose >>> isclose(image_distance(1.5, 6.7), 1.932692308) True >>> image_distance(0, 0) # doctest: +NORMALIZE_WHITESPACE Traceback (most recent call last): ... ValueError: Invalid inputs. Enter non zero values with respect to the sign convention. """ if distance_of_object == 0 or focal_length == 0: raise ValueError( "Invalid inputs. Enter non zero values with respect to the sign convention." ) image_distance = 1 / ((1 / focal_length) - (1 / distance_of_object)) return image_distance ================================================ FILE: physics/n_body_simulation.py ================================================ """ In physics and astronomy, a gravitational N-body simulation is a simulation of a dynamical system of particles under the influence of gravity. The system consists of a number of bodies, each of which exerts a gravitational force on all other bodies. These forces are calculated using Newton's law of universal gravitation. The Euler method is used at each time-step to calculate the change in velocity and position brought about by these forces. Softening is used to prevent numerical divergences when a particle comes too close to another (and the force goes to infinity). (Description adapted from https://en.wikipedia.org/wiki/N-body_simulation ) (See also http://www.shodor.org/refdesk/Resources/Algorithms/EulersMethod/ ) """ from __future__ import annotations import random from matplotlib import animation from matplotlib import pyplot as plt # Frame rate of the animation INTERVAL = 20 # Time between time steps in seconds DELTA_TIME = INTERVAL / 1000 class Body: def __init__( self, position_x: float, position_y: float, velocity_x: float, velocity_y: float, mass: float = 1.0, size: float = 1.0, color: str = "blue", ) -> None: """ The parameters "size" & "color" are not relevant for the simulation itself, they are only used for plotting. """ self.position_x = position_x self.position_y = position_y self.velocity_x = velocity_x self.velocity_y = velocity_y self.mass = mass self.size = size self.color = color @property def position(self) -> tuple[float, float]: return self.position_x, self.position_y @property def velocity(self) -> tuple[float, float]: return self.velocity_x, self.velocity_y def update_velocity( self, force_x: float, force_y: float, delta_time: float ) -> None: """ Euler algorithm for velocity >>> body_1 = Body(0.,0.,0.,0.) >>> body_1.update_velocity(1.,0.,1.) >>> body_1.velocity (1.0, 0.0) >>> body_1.update_velocity(1.,0.,1.) >>> body_1.velocity (2.0, 0.0) >>> body_2 = Body(0.,0.,5.,0.) >>> body_2.update_velocity(0.,-10.,10.) >>> body_2.velocity (5.0, -100.0) >>> body_2.update_velocity(0.,-10.,10.) >>> body_2.velocity (5.0, -200.0) """ self.velocity_x += force_x * delta_time self.velocity_y += force_y * delta_time def update_position(self, delta_time: float) -> None: """ Euler algorithm for position >>> body_1 = Body(0.,0.,1.,0.) >>> body_1.update_position(1.) >>> body_1.position (1.0, 0.0) >>> body_1.update_position(1.) >>> body_1.position (2.0, 0.0) >>> body_2 = Body(10.,10.,0.,-2.) >>> body_2.update_position(1.) >>> body_2.position (10.0, 8.0) >>> body_2.update_position(1.) >>> body_2.position (10.0, 6.0) """ self.position_x += self.velocity_x * delta_time self.position_y += self.velocity_y * delta_time class BodySystem: """ This class is used to hold the bodies, the gravitation constant, the time factor and the softening factor. The time factor is used to control the speed of the simulation. The softening factor is used for softening, a numerical trick for N-body simulations to prevent numerical divergences when two bodies get too close to each other. """ def __init__( self, bodies: list[Body], gravitation_constant: float = 1.0, time_factor: float = 1.0, softening_factor: float = 0.0, ) -> None: self.bodies = bodies self.gravitation_constant = gravitation_constant self.time_factor = time_factor self.softening_factor = softening_factor def __len__(self) -> int: return len(self.bodies) def update_system(self, delta_time: float) -> None: """ For each body, loop through all other bodies to calculate the total force they exert on it. Use that force to update the body's velocity. >>> body_system_1 = BodySystem([Body(0,0,0,0), Body(10,0,0,0)]) >>> len(body_system_1) 2 >>> body_system_1.update_system(1) >>> body_system_1.bodies[0].position (0.01, 0.0) >>> body_system_1.bodies[0].velocity (0.01, 0.0) >>> body_system_2 = BodySystem([Body(-10,0,0,0), Body(10,0,0,0, mass=4)], 1, 10) >>> body_system_2.update_system(1) >>> body_system_2.bodies[0].position (-9.0, 0.0) >>> body_system_2.bodies[0].velocity (0.1, 0.0) """ for body1 in self.bodies: force_x = 0.0 force_y = 0.0 for body2 in self.bodies: if body1 != body2: dif_x = body2.position_x - body1.position_x dif_y = body2.position_y - body1.position_y # Calculation of the distance using Pythagoras's theorem # Extra factor due to the softening technique distance = (dif_x**2 + dif_y**2 + self.softening_factor) ** (1 / 2) # Newton's law of universal gravitation. force_x += ( self.gravitation_constant * body2.mass * dif_x / distance**3 ) force_y += ( self.gravitation_constant * body2.mass * dif_y / distance**3 ) # Update the body's velocity once all the force components have been added body1.update_velocity(force_x, force_y, delta_time * self.time_factor) # Update the positions only after all the velocities have been updated for body in self.bodies: body.update_position(delta_time * self.time_factor) def update_step( body_system: BodySystem, delta_time: float, patches: list[plt.Circle] ) -> None: """ Updates the body-system and applies the change to the patch-list used for plotting >>> body_system_1 = BodySystem([Body(0,0,0,0), Body(10,0,0,0)]) >>> patches_1 = [plt.Circle((body.position_x, body.position_y), body.size, ... fc=body.color)for body in body_system_1.bodies] #doctest: +ELLIPSIS >>> update_step(body_system_1, 1, patches_1) >>> patches_1[0].center (0.01, 0.0) >>> body_system_2 = BodySystem([Body(-10,0,0,0), Body(10,0,0,0, mass=4)], 1, 10) >>> patches_2 = [plt.Circle((body.position_x, body.position_y), body.size, ... fc=body.color)for body in body_system_2.bodies] #doctest: +ELLIPSIS >>> update_step(body_system_2, 1, patches_2) >>> patches_2[0].center (-9.0, 0.0) """ # Update the positions of the bodies body_system.update_system(delta_time) # Update the positions of the patches for patch, body in zip(patches, body_system.bodies): patch.center = (body.position_x, body.position_y) def plot( title: str, body_system: BodySystem, x_start: float = -1, x_end: float = 1, y_start: float = -1, y_end: float = 1, ) -> None: """ Utility function to plot how the given body-system evolves over time. No doctest provided since this function does not have a return value. """ fig = plt.figure() fig.canvas.manager.set_window_title(title) ax = plt.axes( xlim=(x_start, x_end), ylim=(y_start, y_end) ) # Set section to be plotted plt.gca().set_aspect("equal") # Fix aspect ratio # Each body is drawn as a patch by the plt-function patches = [ plt.Circle((body.position_x, body.position_y), body.size, fc=body.color) for body in body_system.bodies ] for patch in patches: ax.add_patch(patch) # Function called at each step of the animation def update(frame: int) -> list[plt.Circle]: # noqa: ARG001 update_step(body_system, DELTA_TIME, patches) return patches anim = animation.FuncAnimation( # noqa: F841 fig, update, interval=INTERVAL, blit=True ) plt.show() def example_1() -> BodySystem: """ Example 1: figure-8 solution to the 3-body-problem This example can be seen as a test of the implementation: given the right initial conditions, the bodies should move in a figure-8. (initial conditions taken from http://www.artcompsci.org/vol_1/v1_web/node56.html) >>> body_system = example_1() >>> len(body_system) 3 """ position_x = 0.9700436 position_y = -0.24308753 velocity_x = 0.466203685 velocity_y = 0.43236573 bodies1 = [ Body(position_x, position_y, velocity_x, velocity_y, size=0.2, color="red"), Body(-position_x, -position_y, velocity_x, velocity_y, size=0.2, color="green"), Body(0, 0, -2 * velocity_x, -2 * velocity_y, size=0.2, color="blue"), ] return BodySystem(bodies1, time_factor=3) def example_2() -> BodySystem: """ Example 2: Moon's orbit around the earth This example can be seen as a test of the implementation: given the right initial conditions, the moon should orbit around the earth as it actually does. (mass, velocity and distance taken from https://en.wikipedia.org/wiki/Earth and https://en.wikipedia.org/wiki/Moon) No doctest provided since this function does not have a return value. """ moon_mass = 7.3476e22 earth_mass = 5.972e24 velocity_dif = 1022 earth_moon_distance = 384399000 gravitation_constant = 6.674e-11 # Calculation of the respective velocities so that total impulse is zero, # i.e. the two bodies together don't move moon_velocity = earth_mass * velocity_dif / (earth_mass + moon_mass) earth_velocity = moon_velocity - velocity_dif moon = Body(-earth_moon_distance, 0, 0, moon_velocity, moon_mass, 10000000, "grey") earth = Body(0, 0, 0, earth_velocity, earth_mass, 50000000, "blue") return BodySystem([earth, moon], gravitation_constant, time_factor=1000000) def example_3() -> BodySystem: """ Example 3: Random system with many bodies. No doctest provided since this function does not have a return value. """ bodies = [] for _ in range(10): velocity_x = random.uniform(-0.5, 0.5) velocity_y = random.uniform(-0.5, 0.5) # Bodies are created pairwise with opposite velocities so that the # total impulse remains zero bodies.append( Body( random.uniform(-0.5, 0.5), random.uniform(-0.5, 0.5), velocity_x, velocity_y, size=0.05, ) ) bodies.append( Body( random.uniform(-0.5, 0.5), random.uniform(-0.5, 0.5), -velocity_x, -velocity_y, size=0.05, ) ) return BodySystem(bodies, 0.01, 10, 0.1) if __name__ == "__main__": plot("Figure-8 solution to the 3-body-problem", example_1(), -2, 2, -2, 2) plot( "Moon's orbit around the earth", example_2(), -430000000, 430000000, -430000000, 430000000, ) plot("Random system with many bodies", example_3(), -1.5, 1.5, -1.5, 1.5) ================================================ FILE: physics/newtons_law_of_gravitation.py ================================================ """ Title : Finding the value of either Gravitational Force, one of the masses or distance provided that the other three parameters are given. Description : Newton's Law of Universal Gravitation explains the presence of force of attraction between bodies having a definite mass situated at a distance. It is usually stated as that, every particle attracts every other particle in the universe with a force that is directly proportional to the product of their masses and inversely proportional to the square of the distance between their centers. The publication of the theory has become known as the "first great unification", as it marked the unification of the previously described phenomena of gravity on Earth with known astronomical behaviors. The equation for the universal gravitation is as follows: F = (G * mass_1 * mass_2) / (distance)^2 Source : - https://en.wikipedia.org/wiki/Newton%27s_law_of_universal_gravitation - Newton (1687) "Philosophiæ Naturalis Principia Mathematica" """ from __future__ import annotations # Define the Gravitational Constant G and the function GRAVITATIONAL_CONSTANT = 6.6743e-11 # unit of G : m^3 * kg^-1 * s^-2 def gravitational_law( force: float, mass_1: float, mass_2: float, distance: float ) -> dict[str, float]: """ Input Parameters ---------------- force : magnitude in Newtons mass_1 : mass in Kilograms mass_2 : mass in Kilograms distance : distance in Meters Returns ------- result : dict name, value pair of the parameter having Zero as it's value Returns the value of one of the parameters specified as 0, provided the values of other parameters are given. >>> gravitational_law(force=0, mass_1=5, mass_2=10, distance=20) {'force': 8.342875e-12} >>> gravitational_law(force=7367.382, mass_1=0, mass_2=74, distance=3048) {'mass_1': 1.385816317292268e+19} >>> gravitational_law(force=36337.283, mass_1=0, mass_2=0, distance=35584) Traceback (most recent call last): ... ValueError: One and only one argument must be 0 >>> gravitational_law(force=36337.283, mass_1=-674, mass_2=0, distance=35584) Traceback (most recent call last): ... ValueError: Mass can not be negative >>> gravitational_law(force=-847938e12, mass_1=674, mass_2=0, distance=9374) Traceback (most recent call last): ... ValueError: Gravitational force can not be negative """ product_of_mass = mass_1 * mass_2 if (force, mass_1, mass_2, distance).count(0) != 1: raise ValueError("One and only one argument must be 0") if force < 0: raise ValueError("Gravitational force can not be negative") if distance < 0: raise ValueError("Distance can not be negative") if mass_1 < 0 or mass_2 < 0: raise ValueError("Mass can not be negative") if force == 0: force = GRAVITATIONAL_CONSTANT * product_of_mass / (distance**2) return {"force": force} elif mass_1 == 0: mass_1 = (force) * (distance**2) / (GRAVITATIONAL_CONSTANT * mass_2) return {"mass_1": mass_1} elif mass_2 == 0: mass_2 = (force) * (distance**2) / (GRAVITATIONAL_CONSTANT * mass_1) return {"mass_2": mass_2} elif distance == 0: distance = (GRAVITATIONAL_CONSTANT * product_of_mass / (force)) ** 0.5 return {"distance": distance} raise ValueError("One and only one argument must be 0") # Run doctest if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: physics/newtons_second_law_of_motion.py ================================================ r""" Description: Newton's second law of motion pertains to the behavior of objects for which all existing forces are not balanced. The second law states that the acceleration of an object is dependent upon two variables - the net force acting upon the object and the mass of the object. The acceleration of an object depends directly upon the net force acting upon the object, and inversely upon the mass of the object. As the force acting upon an object is increased, the acceleration of the object is increased. As the mass of an object is increased, the acceleration of the object is decreased. Source: https://www.physicsclassroom.com/class/newtlaws/Lesson-3/Newton-s-Second-Law Formulation: F_net = m • a Diagrammatic Explanation:: Forces are unbalanced | | | V There is acceleration /\ / \ / \ / \ / \ / \ / \ __________________ ____________________ | The acceleration | | The acceleration | | depends directly | | depends inversely | | on the net force | | upon the object's | | | | mass | |__________________| |____________________| Units: 1 Newton = 1 kg • meters/seconds^2 How to use? Inputs:: ______________ _____________________ ___________ | Name | Units | Type | |--------------|---------------------|-----------| | mass | in kgs | float | |--------------|---------------------|-----------| | acceleration | in meters/seconds^2 | float | |______________|_____________________|___________| Output:: ______________ _______________________ ___________ | Name | Units | Type | |--------------|-----------------------|-----------| | force | in Newtons | float | |______________|_______________________|___________| """ def newtons_second_law_of_motion(mass: float, acceleration: float) -> float: """ Calculates force from `mass` and `acceleration` >>> newtons_second_law_of_motion(10, 10) 100 >>> newtons_second_law_of_motion(2.0, 1) 2.0 """ force = 0.0 try: force = mass * acceleration except Exception: return -0.0 return force if __name__ == "__main__": import doctest # run doctest doctest.testmod() # demo mass = 12.5 acceleration = 10 force = newtons_second_law_of_motion(mass, acceleration) print("The force is ", force, "N") ================================================ FILE: physics/orbital_transfer_work.py ================================================ def orbital_transfer_work( mass_central: float, mass_object: float, r_initial: float, r_final: float ) -> str: """ Calculates the work required to move an object from one orbit to another in a gravitational field based on the change in total mechanical energy. The formula used is: W = (G * M * m / 2) * (1/r_initial - 1/r_final) where: W = work done (Joules) G = gravitational constant (6.67430 * 10^-11 m^3 kg^-1 s^-2) M = mass of the central body (kg) m = mass of the orbiting object (kg) r_initial = initial orbit radius (m) r_final = final orbit radius (m) Args: mass_central (float): Mass of the central body (kg) mass_object (float): Mass of the object being moved (kg) r_initial (float): Initial orbital radius (m) r_final (float): Final orbital radius (m) Returns: str: Work done in Joules as a string in scientific notation (3 decimals) Examples: >>> orbital_transfer_work(5.972e24, 1000, 6.371e6, 7e6) '2.811e+09' >>> orbital_transfer_work(5.972e24, 500, 7e6, 6.371e6) '-1.405e+09' >>> orbital_transfer_work(1.989e30, 1000, 1.5e11, 2.28e11) '1.514e+11' """ gravitational_constant = 6.67430e-11 if r_initial <= 0 or r_final <= 0: raise ValueError("Orbital radii must be greater than zero.") work = (gravitational_constant * mass_central * mass_object / 2) * ( 1 / r_initial - 1 / r_final ) return f"{work:.3e}" if __name__ == "__main__": import doctest doctest.testmod() print("Orbital transfer work calculator\n") try: M = float(input("Enter mass of central body (kg): ").strip()) if M <= 0: r1 = float(input("Enter initial orbit radius (m): ").strip()) if r1 <= 0: raise ValueError("Initial orbit radius must be greater than zero.") r2 = float(input("Enter final orbit radius (m): ").strip()) if r2 <= 0: raise ValueError("Final orbit radius must be greater than zero.") m = float(input("Enter mass of orbiting object (kg): ").strip()) if m <= 0: raise ValueError("Mass of the orbiting object must be greater than zero.") r1 = float(input("Enter initial orbit radius (m): ").strip()) r2 = float(input("Enter final orbit radius (m): ").strip()) result = orbital_transfer_work(M, m, r1, r2) print(f"Work done in orbital transfer: {result} Joules") except ValueError as e: print(f"Input error: {e}") ================================================ FILE: physics/period_of_pendulum.py ================================================ """ Title : Computing the time period of a simple pendulum The simple pendulum is a mechanical system that sways or moves in an oscillatory motion. The simple pendulum comprises of a small bob of mass m suspended by a thin string of length L and secured to a platform at its upper end. Its motion occurs in a vertical plane and is mainly driven by gravitational force. The period of the pendulum depends on the length of the string and the amplitude (the maximum angle) of oscillation. However, the effect of the amplitude can be ignored if the amplitude is small. It should be noted that the period does not depend on the mass of the bob. For small amplitudes, the period of a simple pendulum is given by the following approximation: T ≈ 2π * √(L / g) where: L = length of string from which the bob is hanging (in m) g = acceleration due to gravity (approx 9.8 m/s²) Reference : https://byjus.com/jee/simple-pendulum/ """ from math import pi from scipy.constants import g def period_of_pendulum(length: float) -> float: """ >>> period_of_pendulum(1.23) 2.2252155506257845 >>> period_of_pendulum(2.37) 3.0888278441908574 >>> period_of_pendulum(5.63) 4.76073193364765 >>> period_of_pendulum(-12) Traceback (most recent call last): ... ValueError: The length should be non-negative >>> period_of_pendulum(0) 0.0 """ if length < 0: raise ValueError("The length should be non-negative") return 2 * pi * (length / g) ** 0.5 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: physics/photoelectric_effect.py ================================================ """ The photoelectric effect is the emission of electrons when electromagnetic radiation , such as light, hits a material. Electrons emitted in this manner are called photoelectrons. In 1905, Einstein proposed a theory of the photoelectric effect using a concept that light consists of tiny packets of energy known as photons or light quanta. Each packet carries energy hv that is proportional to the frequency v of the corresponding electromagnetic wave. The proportionality constant h has become known as the Planck constant. In the range of kinetic energies of the electrons that are removed from their varying atomic bindings by the absorption of a photon of energy hv, the highest kinetic energy K_max is : K_max = hv-W Here, W is the minimum energy required to remove an electron from the surface of the material. It is called the work function of the surface Reference: https://en.wikipedia.org/wiki/Photoelectric_effect """ PLANCK_CONSTANT_JS = 6.6261 * pow(10, -34) # in SI (Js) PLANCK_CONSTANT_EVS = 4.1357 * pow(10, -15) # in eVs def maximum_kinetic_energy( frequency: float, work_function: float, in_ev: bool = False ) -> float: """ Calculates the maximum kinetic energy of emitted electron from the surface. if the maximum kinetic energy is zero then no electron will be emitted or given electromagnetic wave frequency is small. frequency (float): Frequency of electromagnetic wave. work_function (float): Work function of the surface. in_ev (optional)(bool): Pass True if values are in eV. Usage example: >>> maximum_kinetic_energy(1000000,2) 0 >>> maximum_kinetic_energy(1000000,2,True) 0 >>> maximum_kinetic_energy(10000000000000000,2,True) 39.357000000000006 >>> maximum_kinetic_energy(-9,20) Traceback (most recent call last): ... ValueError: Frequency can't be negative. >>> maximum_kinetic_energy(1000,"a") Traceback (most recent call last): ... TypeError: unsupported operand type(s) for -: 'float' and 'str' """ if frequency < 0: raise ValueError("Frequency can't be negative.") if in_ev: return max(PLANCK_CONSTANT_EVS * frequency - work_function, 0) return max(PLANCK_CONSTANT_JS * frequency - work_function, 0) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: physics/potential_energy.py ================================================ from scipy.constants import g """ Finding the gravitational potential energy of an object with reference to the earth,by taking its mass and height above the ground as input Description : Gravitational energy or gravitational potential energy is the potential energy a massive object has in relation to another massive object due to gravity. It is the potential energy associated with the gravitational field, which is released (converted into kinetic energy) when the objects fall towards each other. Gravitational potential energy increases when two objects are brought further apart. For two pairwise interacting point particles, the gravitational potential energy U is given by U=-GMm/R where M and m are the masses of the two particles, R is the distance between them, and G is the gravitational constant. Close to the Earth's surface, the gravitational field is approximately constant, and the gravitational potential energy of an object reduces to U=mgh where m is the object's mass, g=GM/R² is the gravity of Earth, and h is the height of the object's center of mass above a chosen reference level. Reference : "https://en.m.wikipedia.org/wiki/Gravitational_energy" """ def potential_energy(mass: float, height: float) -> float: # function will accept mass and height as parameters and return potential energy """ >>> potential_energy(10,10) 980.665 >>> potential_energy(0,5) 0.0 >>> potential_energy(8,0) 0.0 >>> potential_energy(10,5) 490.3325 >>> potential_energy(0,0) 0.0 >>> potential_energy(2,8) 156.9064 >>> potential_energy(20,100) 19613.3 """ if mass < 0: # handling of negative values of mass raise ValueError("The mass of a body cannot be negative") if height < 0: # handling of negative values of height raise ValueError("The height above the ground cannot be negative") return mass * g * height if __name__ == "__main__": from doctest import testmod testmod(name="potential_energy") ================================================ FILE: physics/rainfall_intensity.py ================================================ """ Rainfall Intensity ================== This module contains functions to calculate the intensity of a rainfall event for a given duration and return period. This function uses the Sherman intensity-duration-frequency curve. References ---------- - Aparicio, F. (1997): Fundamentos de Hidrología de Superficie. Balderas, México, Limusa. 303 p. - https://en.wikipedia.org/wiki/Intensity-duration-frequency_curve """ def rainfall_intensity( coefficient_k: float, coefficient_a: float, coefficient_b: float, coefficient_c: float, return_period: float, duration: float, ) -> float: """ Calculate the intensity of a rainfall event for a given duration and return period. It's based on the Sherman intensity-duration-frequency curve: I = k * T^a / (D + b)^c where: I = Intensity of the rainfall event [mm/h] k, a, b, c = Coefficients obtained through statistical distribution adjust T = Return period in years D = Rainfall event duration in minutes Parameters ---------- coefficient_k : float Coefficient obtained through statistical distribution adjust. coefficient_a : float Coefficient obtained through statistical distribution adjust. coefficient_b : float Coefficient obtained through statistical distribution adjust. coefficient_c : float Coefficient obtained through statistical distribution adjust. return_period : float Return period in years. duration : float Rainfall event duration in minutes. Returns ------- intensity : float Intensity of the rainfall event in mm/h. Raises ------ ValueError If any of the parameters are not positive. Examples -------- >>> rainfall_intensity(1000, 0.2, 11.6, 0.81, 10, 60) 49.83339231138578 >>> rainfall_intensity(1000, 0.2, 11.6, 0.81, 10, 30) 77.36319588106228 >>> rainfall_intensity(1000, 0.2, 11.6, 0.81, 5, 60) 43.382487747633625 >>> rainfall_intensity(0, 0.2, 11.6, 0.81, 10, 60) Traceback (most recent call last): ... ValueError: All parameters must be positive. >>> rainfall_intensity(1000, -0.2, 11.6, 0.81, 10, 60) Traceback (most recent call last): ... ValueError: All parameters must be positive. >>> rainfall_intensity(1000, 0.2, -11.6, 0.81, 10, 60) Traceback (most recent call last): ... ValueError: All parameters must be positive. >>> rainfall_intensity(1000, 0.2, 11.6, -0.81, 10, 60) Traceback (most recent call last): ... ValueError: All parameters must be positive. >>> rainfall_intensity(1000, 0, 11.6, 0.81, 10, 60) Traceback (most recent call last): ... ValueError: All parameters must be positive. >>> rainfall_intensity(1000, 0.2, 0, 0.81, 10, 60) Traceback (most recent call last): ... ValueError: All parameters must be positive. >>> rainfall_intensity(1000, 0.2, 11.6, 0, 10, 60) Traceback (most recent call last): ... ValueError: All parameters must be positive. >>> rainfall_intensity(0, 0.2, 11.6, 0.81, 10, 60) Traceback (most recent call last): ... ValueError: All parameters must be positive. >>> rainfall_intensity(1000, 0.2, 11.6, 0.81, 0, 60) Traceback (most recent call last): ... ValueError: All parameters must be positive. >>> rainfall_intensity(1000, 0.2, 11.6, 0.81, 10, 0) Traceback (most recent call last): ... ValueError: All parameters must be positive. """ if ( coefficient_k <= 0 or coefficient_a <= 0 or coefficient_b <= 0 or coefficient_c <= 0 or return_period <= 0 or duration <= 0 ): raise ValueError("All parameters must be positive.") intensity = (coefficient_k * (return_period**coefficient_a)) / ( (duration + coefficient_b) ** coefficient_c ) return intensity if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: physics/reynolds_number.py ================================================ """ Title : computing the Reynolds number to find out the type of flow (laminar or turbulent) Reynolds number is a dimensionless quantity that is used to determine the type of flow pattern as laminar or turbulent while flowing through a pipe. Reynolds number is defined by the ratio of inertial forces to that of viscous forces. R = Inertial Forces / Viscous Forces R = (p * V * D)/μ where : p = Density of fluid (in Kg/m^3) D = Diameter of pipe through which fluid flows (in m) V = Velocity of flow of the fluid (in m/s) μ = Viscosity of the fluid (in Ns/m^2) If the Reynolds number calculated is high (greater than 2000), then the flow through the pipe is said to be turbulent. If Reynolds number is low (less than 2000), the flow is said to be laminar. Numerically, these are acceptable values, although in general the laminar and turbulent flows are classified according to a range. Laminar flow falls below Reynolds number of 1100 and turbulent falls in a range greater than 2200. Laminar flow is the type of flow in which the fluid travels smoothly in regular paths. Conversely, turbulent flow isn't smooth and follows an irregular path with lots of mixing. Reference : https://byjus.com/physics/reynolds-number/ """ def reynolds_number( density: float, velocity: float, diameter: float, viscosity: float ) -> float: """ >>> reynolds_number(900, 2.5, 0.05, 0.4) 281.25 >>> reynolds_number(450, 3.86, 0.078, 0.23) 589.0695652173912 >>> reynolds_number(234, -4.5, 0.3, 0.44) 717.9545454545454 >>> reynolds_number(-90, 2, 0.045, 1) Traceback (most recent call last): ... ValueError: please ensure that density, diameter and viscosity are positive >>> reynolds_number(0, 2, -0.4, -2) Traceback (most recent call last): ... ValueError: please ensure that density, diameter and viscosity are positive """ if density <= 0 or diameter <= 0 or viscosity <= 0: raise ValueError( "please ensure that density, diameter and viscosity are positive" ) return (density * abs(velocity) * diameter) / viscosity if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: physics/rms_speed_of_molecule.py ================================================ """ The root-mean-square speed is essential in measuring the average speed of particles contained in a gas, defined as, ----------------- | Vrms = √3RT/M | ----------------- In Kinetic Molecular Theory, gasified particles are in a condition of constant random motion; each particle moves at a completely different pace, perpetually clashing and changing directions consistently velocity is used to describe the movement of gas particles, thereby taking into account both speed and direction. Although the velocity of gaseous particles is constantly changing, the distribution of velocities does not change. We cannot gauge the velocity of every individual particle, thus we frequently reason in terms of the particles average behavior. Particles moving in opposite directions have velocities of opposite signs. Since gas particles are in random motion, it's plausible that there'll be about as several moving in one direction as within the other way, which means that the average velocity for a collection of gas particles equals zero; as this value is unhelpful, the average of velocities can be determined using an alternative method. """ UNIVERSAL_GAS_CONSTANT = 8.3144598 def rms_speed_of_molecule(temperature: float, molar_mass: float) -> float: """ >>> rms_speed_of_molecule(100, 2) 35.315279554323226 >>> rms_speed_of_molecule(273, 12) 23.821458421977443 """ if temperature < 0: raise Exception("Temperature cannot be less than 0 K") if molar_mass <= 0: raise Exception("Molar mass cannot be less than or equal to 0 kg/mol") else: return (3 * UNIVERSAL_GAS_CONSTANT * temperature / molar_mass) ** 0.5 if __name__ == "__main__": import doctest # run doctest doctest.testmod() # example temperature = 300 molar_mass = 28 vrms = rms_speed_of_molecule(temperature, molar_mass) print(f"Vrms of Nitrogen gas at 300 K is {vrms} m/s") ================================================ FILE: physics/shear_stress.py ================================================ from __future__ import annotations """ Shear stress is a component of stress that is coplanar to the material cross-section. It arises due to a shear force, the component of the force vector parallel to the material cross-section. https://en.wikipedia.org/wiki/Shear_stress """ def shear_stress( stress: float, tangential_force: float, area: float, ) -> tuple[str, float]: """ This function can calculate any one of the three - 1. Shear Stress 2. Tangential Force 3. Cross-sectional Area This is calculated from the other two provided values Examples - >>> shear_stress(stress=25, tangential_force=100, area=0) ('area', 4.0) >>> shear_stress(stress=0, tangential_force=1600, area=200) ('stress', 8.0) >>> shear_stress(stress=1000, tangential_force=0, area=1200) ('tangential_force', 1200000) """ if (stress, tangential_force, area).count(0) != 1: raise ValueError("You cannot supply more or less than 2 values") elif stress < 0: raise ValueError("Stress cannot be negative") elif tangential_force < 0: raise ValueError("Tangential Force cannot be negative") elif area < 0: raise ValueError("Area cannot be negative") elif stress == 0: return ( "stress", tangential_force / area, ) elif tangential_force == 0: return ( "tangential_force", stress * area, ) else: return ( "area", tangential_force / stress, ) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: physics/speed_of_sound.py ================================================ """ Title : Calculating the speed of sound Description : The speed of sound (c) is the speed that a sound wave travels per unit time (m/s). During propagation, the sound wave propagates through an elastic medium. Sound propagates as longitudinal waves in liquids and gases and as transverse waves in solids. This file calculates the speed of sound in a fluid based on its bulk module and density. Equation for the speed of sound in a fluid: c_fluid = sqrt(K_s / p) c_fluid: speed of sound in fluid K_s: isentropic bulk modulus p: density of fluid Source : https://en.wikipedia.org/wiki/Speed_of_sound """ def speed_of_sound_in_a_fluid(density: float, bulk_modulus: float) -> float: """ Calculates the speed of sound in a fluid from its density and bulk modulus Examples: Example 1 --> Water 20°C: bulk_modulus= 2.15MPa, density=998kg/m³ Example 2 --> Mercury 20°C: bulk_modulus= 28.5MPa, density=13600kg/m³ >>> speed_of_sound_in_a_fluid(bulk_modulus=2.15e9, density=998) 1467.7563207952705 >>> speed_of_sound_in_a_fluid(bulk_modulus=28.5e9, density=13600) 1447.614670861731 """ if density <= 0: raise ValueError("Impossible fluid density") if bulk_modulus <= 0: raise ValueError("Impossible bulk modulus") return (bulk_modulus / density) ** 0.5 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: physics/speeds_of_gas_molecules.py ================================================ """ The root-mean-square, average and most probable speeds of gas molecules are derived from the Maxwell-Boltzmann distribution. The Maxwell-Boltzmann distribution is a probability distribution that describes the distribution of speeds of particles in an ideal gas. The distribution is given by the following equation:: ------------------------------------------------- | f(v) = (M/2πRT)^(3/2) * 4πv^2 * e^(-Mv^2/2RT) | ------------------------------------------------- where: * ``f(v)`` is the fraction of molecules with a speed ``v`` * ``M`` is the molar mass of the gas in kg/mol * ``R`` is the gas constant * ``T`` is the absolute temperature More information about the Maxwell-Boltzmann distribution can be found here: https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution The average speed can be calculated by integrating the Maxwell-Boltzmann distribution from 0 to infinity and dividing by the total number of molecules. The result is:: ---------------------- | v_avg = √(8RT/πM) | ---------------------- The most probable speed is the speed at which the Maxwell-Boltzmann distribution is at its maximum. This can be found by differentiating the Maxwell-Boltzmann distribution with respect to ``v`` and setting the result equal to zero. The result is:: ---------------------- | v_mp = √(2RT/M) | ---------------------- The root-mean-square speed is another measure of the average speed of the molecules in a gas. It is calculated by taking the square root of the average of the squares of the speeds of the molecules. The result is:: ---------------------- | v_rms = √(3RT/M) | ---------------------- Here we have defined functions to calculate the average and most probable speeds of molecules in a gas given the temperature and molar mass of the gas. """ # import the constants R and pi from the scipy.constants library from scipy.constants import R, pi def avg_speed_of_molecule(temperature: float, molar_mass: float) -> float: """ Takes the temperature (in K) and molar mass (in kg/mol) of a gas and returns the average speed of a molecule in the gas (in m/s). Examples: >>> avg_speed_of_molecule(273, 0.028) # nitrogen at 273 K 454.3488755062257 >>> avg_speed_of_molecule(300, 0.032) # oxygen at 300 K 445.5257273433045 >>> avg_speed_of_molecule(-273, 0.028) # invalid temperature Traceback (most recent call last): ... Exception: Absolute temperature cannot be less than 0 K >>> avg_speed_of_molecule(273, 0) # invalid molar mass Traceback (most recent call last): ... Exception: Molar mass should be greater than 0 kg/mol """ if temperature < 0: raise Exception("Absolute temperature cannot be less than 0 K") if molar_mass <= 0: raise Exception("Molar mass should be greater than 0 kg/mol") return (8 * R * temperature / (pi * molar_mass)) ** 0.5 def mps_speed_of_molecule(temperature: float, molar_mass: float) -> float: """ Takes the temperature (in K) and molar mass (in kg/mol) of a gas and returns the most probable speed of a molecule in the gas (in m/s). Examples: >>> mps_speed_of_molecule(273, 0.028) # nitrogen at 273 K 402.65620702280023 >>> mps_speed_of_molecule(300, 0.032) # oxygen at 300 K 394.8368955535605 >>> mps_speed_of_molecule(-273, 0.028) # invalid temperature Traceback (most recent call last): ... Exception: Absolute temperature cannot be less than 0 K >>> mps_speed_of_molecule(273, 0) # invalid molar mass Traceback (most recent call last): ... Exception: Molar mass should be greater than 0 kg/mol """ if temperature < 0: raise Exception("Absolute temperature cannot be less than 0 K") if molar_mass <= 0: raise Exception("Molar mass should be greater than 0 kg/mol") return (2 * R * temperature / molar_mass) ** 0.5 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: physics/terminal_velocity.py ================================================ """ Title : Computing the terminal velocity of an object falling through a fluid. Terminal velocity is defined as the highest velocity attained by an object falling through a fluid. It is observed when the sum of drag force and buoyancy is equal to the downward gravity force acting on the object. The acceleration of the object is zero as the net force acting on the object is zero. Vt = ((2 * m * g)/(p * A * Cd))^0.5 where : Vt = Terminal velocity (in m/s) m = Mass of the falling object (in Kg) g = Acceleration due to gravity (value taken : imported from scipy) p = Density of the fluid through which the object is falling (in Kg/m^3) A = Projected area of the object (in m^2) Cd = Drag coefficient (dimensionless) Reference : https://byjus.com/physics/derivation-of-terminal-velocity/ """ from scipy.constants import g def terminal_velocity( mass: float, density: float, area: float, drag_coefficient: float ) -> float: """ >>> terminal_velocity(1, 25, 0.6, 0.77) 1.3031197996044768 >>> terminal_velocity(2, 100, 0.45, 0.23) 1.9467947148674276 >>> terminal_velocity(5, 50, 0.2, 0.5) 4.428690551393267 >>> terminal_velocity(-5, 50, -0.2, -2) Traceback (most recent call last): ... ValueError: mass, density, area and the drag coefficient all need to be positive >>> terminal_velocity(3, -20, -1, 2) Traceback (most recent call last): ... ValueError: mass, density, area and the drag coefficient all need to be positive >>> terminal_velocity(-2, -1, -0.44, -1) Traceback (most recent call last): ... ValueError: mass, density, area and the drag coefficient all need to be positive """ if mass <= 0 or density <= 0 or area <= 0 or drag_coefficient <= 0: raise ValueError( "mass, density, area and the drag coefficient all need to be positive" ) return ((2 * mass * g) / (density * area * drag_coefficient)) ** 0.5 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: project_euler/README.md ================================================ # Project Euler Problems are taken from https://projecteuler.net/, the Project Euler. [Problems are licensed under CC BY-NC-SA 4.0](https://projecteuler.net/copyright). Project Euler is a series of challenging mathematical/computer programming problems that require more than just mathematical insights to solve. Project Euler is ideal for mathematicians who are learning to code. The solutions will be checked by our [automated testing on GitHub Actions](https://github.com/TheAlgorithms/Python/actions) with the help of [this script](https://github.com/TheAlgorithms/Python/blob/master/scripts/validate_solutions.py). The efficiency of your code is also checked. You can view the top 10 slowest solutions on GitHub Actions logs (under `slowest 10 durations`) and open a pull request to improve those solutions. ## Solution Guidelines Welcome to [TheAlgorithms/Python](https://github.com/TheAlgorithms/Python)! Before reading the solution guidelines, make sure you read the whole [Contributing Guidelines](https://github.com/TheAlgorithms/Python/blob/master/CONTRIBUTING.md) as it won't be repeated in here. If you have any doubt on the guidelines, please feel free to [state it clearly in an issue](https://github.com/TheAlgorithms/Python/issues/new) or ask the community in [Gitter](https://gitter.im/TheAlgorithms/community). You can use the [template](https://github.com/TheAlgorithms/Python/blob/master/project_euler/README.md#solution-template) we have provided below as your starting point but be sure to read the [Coding Style](https://github.com/TheAlgorithms/Python/blob/master/project_euler/README.md#coding-style) part first. ### Coding Style * Please maintain consistency in project directory and solution file names. Keep the following points in mind: * Create a new directory only for the problems which do not exist yet. * If you create a new directory, please create an empty `__init__.py` file inside it as well. * Please name the project **directory** as `problem_` where `problem_number` should be filled with 0s so as to occupy 3 digits. Example: `problem_001`, `problem_002`, `problem_067`, `problem_145`, and so on. * Please provide a link to the problem and other references, if used, in the **module-level docstring**. * All imports should come ***after*** the module-level docstring. * You can have as many helper functions as you want but there should be one main function called `solution` which should satisfy the conditions as stated below: * It should contain positional argument(s) whose default value is the question input. Example: Please take a look at [Problem 1](https://projecteuler.net/problem=1) where the question is to *Find the sum of all the multiples of 3 or 5 below 1000.* In this case the main solution function will be `solution(limit: int = 1000)`. * When the `solution` function is called without any arguments like so: `solution()`, it should return the answer to the problem. * Every function, which includes all the helper functions, if any, and the main solution function, should have `doctest` in the function docstring along with a brief statement mentioning what the function is about. * There should not be a `doctest` for testing the answer as that is done by our GitHub Actions build using this [script](https://github.com/TheAlgorithms/Python/blob/master/scripts/validate_solutions.py). Keeping in mind the above example of [Problem 1](https://projecteuler.net/problem=1): ```python def solution(limit: int = 1000): """ A brief statement mentioning what the function is about. You can have a detailed explanation about the solution method in the module-level docstring. >>> solution(1) ... >>> solution(16) ... >>> solution(100) ... """ ``` ### Solution Template You can use the below template as your starting point but please read the [Coding Style](https://github.com/TheAlgorithms/Python/blob/master/project_euler/README.md#coding-style) first to understand how the template works. Please change the name of the helper functions accordingly, change the parameter names with a descriptive one, replace the content within `[square brackets]` (including the brackets) with the appropriate content. ```python """ Project Euler Problem [problem number]: [link to the original problem] ... [Entire problem statement] ... ... [Solution explanation - Optional] ... References [Optional]: - [Wikipedia link to the topic] - [Stackoverflow link] ... """ import module1 import module2 ... def helper1(arg1: [type hint], arg2: [type hint], ...) -> [Return type hint]: """ A brief statement explaining what the function is about. ... A more elaborate description ... [Optional] ... [Doctest] ... """ ... # calculations ... return # You can have multiple helper functions but the solution function should be # after all the helper functions ... def solution(arg1: [type hint], arg2: [type hint], ...) -> [Return type hint]: """ A brief statement mentioning what the function is about. You can have a detailed explanation about the solution in the module-level docstring. ... [Doctest as mentioned above] ... """ ... # calculations ... return answer if __name__ == "__main__": print(f"{solution() = }") ``` ================================================ FILE: project_euler/__init__.py ================================================ ================================================ FILE: project_euler/problem_001/__init__.py ================================================ ================================================ FILE: project_euler/problem_001/sol1.py ================================================ """ Project Euler Problem 1: https://projecteuler.net/problem=1 Multiples of 3 and 5 If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. Find the sum of all the multiples of 3 or 5 below 1000. """ def solution(n: int = 1000) -> int: """ Returns the sum of all the multiples of 3 or 5 below n. >>> solution(3) 0 >>> solution(4) 3 >>> solution(10) 23 >>> solution(600) 83700 >>> solution(-7) 0 """ return sum(e for e in range(3, n) if e % 3 == 0 or e % 5 == 0) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_001/sol2.py ================================================ """ Project Euler Problem 1: https://projecteuler.net/problem=1 Multiples of 3 and 5 If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. Find the sum of all the multiples of 3 or 5 below 1000. """ def solution(n: int = 1000) -> int: """ Returns the sum of all the multiples of 3 or 5 below n. >>> solution(3) 0 >>> solution(4) 3 >>> solution(10) 23 >>> solution(600) 83700 """ total = 0 terms = (n - 1) // 3 total += ((terms) * (6 + (terms - 1) * 3)) // 2 # total of an A.P. terms = (n - 1) // 5 total += ((terms) * (10 + (terms - 1) * 5)) // 2 terms = (n - 1) // 15 total -= ((terms) * (30 + (terms - 1) * 15)) // 2 return total if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_001/sol3.py ================================================ """ Project Euler Problem 1: https://projecteuler.net/problem=1 Multiples of 3 and 5 If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. Find the sum of all the multiples of 3 or 5 below 1000. """ def solution(n: int = 1000) -> int: """ This solution is based on the pattern that the successive numbers in the series follow: 0+3,+2,+1,+3,+1,+2,+3. Returns the sum of all the multiples of 3 or 5 below n. >>> solution(3) 0 >>> solution(4) 3 >>> solution(10) 23 >>> solution(600) 83700 """ total = 0 num = 0 while 1: num += 3 if num >= n: break total += num num += 2 if num >= n: break total += num num += 1 if num >= n: break total += num num += 3 if num >= n: break total += num num += 1 if num >= n: break total += num num += 2 if num >= n: break total += num num += 3 if num >= n: break total += num return total if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_001/sol4.py ================================================ """ Project Euler Problem 1: https://projecteuler.net/problem=1 Multiples of 3 and 5 If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. Find the sum of all the multiples of 3 or 5 below 1000. """ def solution(n: int = 1000) -> int: """ Returns the sum of all the multiples of 3 or 5 below n. >>> solution(3) 0 >>> solution(4) 3 >>> solution(10) 23 >>> solution(600) 83700 """ xmulti = [] zmulti = [] z = 3 x = 5 temp = 1 while True: result = z * temp if result < n: zmulti.append(result) temp += 1 else: temp = 1 break while True: result = x * temp if result < n: xmulti.append(result) temp += 1 else: break collection = list(set(xmulti + zmulti)) return sum(collection) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_001/sol5.py ================================================ """ Project Euler Problem 1: https://projecteuler.net/problem=1 Multiples of 3 and 5 If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. Find the sum of all the multiples of 3 or 5 below 1000. """ def solution(n: int = 1000) -> int: """ Returns the sum of all the multiples of 3 or 5 below n. A straightforward pythonic solution using list comprehension. >>> solution(3) 0 >>> solution(4) 3 >>> solution(10) 23 >>> solution(600) 83700 """ return sum(i for i in range(n) if i % 3 == 0 or i % 5 == 0) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_001/sol6.py ================================================ """ Project Euler Problem 1: https://projecteuler.net/problem=1 Multiples of 3 and 5 If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. Find the sum of all the multiples of 3 or 5 below 1000. """ def solution(n: int = 1000) -> int: """ Returns the sum of all the multiples of 3 or 5 below n. >>> solution(3) 0 >>> solution(4) 3 >>> solution(10) 23 >>> solution(600) 83700 """ a = 3 result = 0 while a < n: if a % 3 == 0 or a % 5 == 0: result += a elif a % 15 == 0: result -= a a += 1 return result if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_001/sol7.py ================================================ """ Project Euler Problem 1: https://projecteuler.net/problem=1 Multiples of 3 and 5 If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. Find the sum of all the multiples of 3 or 5 below 1000. """ def solution(n: int = 1000) -> int: """ Returns the sum of all the multiples of 3 or 5 below n. >>> solution(3) 0 >>> solution(4) 3 >>> solution(10) 23 >>> solution(600) 83700 """ result = 0 for i in range(n): if i % 3 == 0 or i % 5 == 0: result += i return result if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_002/__init__.py ================================================ ================================================ FILE: project_euler/problem_002/sol1.py ================================================ """ Project Euler Problem 2: https://projecteuler.net/problem=2 Even Fibonacci Numbers Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be: 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms. References: - https://en.wikipedia.org/wiki/Fibonacci_number """ def solution(n: int = 4000000) -> int: """ Returns the sum of all even fibonacci sequence elements that are lower or equal to n. >>> solution(10) 10 >>> solution(15) 10 >>> solution(2) 2 >>> solution(1) 0 >>> solution(34) 44 """ i = 1 j = 2 total = 0 while j <= n: if j % 2 == 0: total += j i, j = j, i + j return total if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_002/sol2.py ================================================ """ Project Euler Problem 2: https://projecteuler.net/problem=2 Even Fibonacci Numbers Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be: 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms. References: - https://en.wikipedia.org/wiki/Fibonacci_number """ def solution(n: int = 4000000) -> int: """ Returns the sum of all even fibonacci sequence elements that are lower or equal to n. >>> solution(10) 10 >>> solution(15) 10 >>> solution(2) 2 >>> solution(1) 0 >>> solution(34) 44 """ even_fibs = [] a, b = 0, 1 while b <= n: if b % 2 == 0: even_fibs.append(b) a, b = b, a + b return sum(even_fibs) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_002/sol3.py ================================================ """ Project Euler Problem 2: https://projecteuler.net/problem=2 Even Fibonacci Numbers Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be: 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms. References: - https://en.wikipedia.org/wiki/Fibonacci_number """ def solution(n: int = 4000000) -> int: """ Returns the sum of all even fibonacci sequence elements that are lower or equal to n. >>> solution(10) 10 >>> solution(15) 10 >>> solution(2) 2 >>> solution(1) 0 >>> solution(34) 44 """ if n <= 1: return 0 a = 0 b = 2 count = 0 while 4 * b + a <= n: a, b = b, 4 * b + a count += a return count + b if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_002/sol4.py ================================================ """ Project Euler Problem 2: https://projecteuler.net/problem=2 Even Fibonacci Numbers Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be: 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms. References: - https://en.wikipedia.org/wiki/Fibonacci_number """ import math from decimal import Decimal, getcontext def solution(n: int = 4000000) -> int: """ Returns the sum of all even fibonacci sequence elements that are lower or equal to n. >>> solution(10) 10 >>> solution(15) 10 >>> solution(2) 2 >>> solution(1) 0 >>> solution(34) 44 >>> solution(3.4) 2 >>> solution(0) Traceback (most recent call last): ... ValueError: Parameter n must be greater than or equal to one. >>> solution(-17) Traceback (most recent call last): ... ValueError: Parameter n must be greater than or equal to one. >>> solution([]) Traceback (most recent call last): ... TypeError: Parameter n must be int or castable to int. >>> solution("asd") Traceback (most recent call last): ... TypeError: Parameter n must be int or castable to int. """ try: n = int(n) except (TypeError, ValueError): raise TypeError("Parameter n must be int or castable to int.") if n <= 0: raise ValueError("Parameter n must be greater than or equal to one.") getcontext().prec = 100 phi = (Decimal(5) ** Decimal("0.5") + 1) / Decimal(2) index = (math.floor(math.log(n * (phi + 2), phi) - 1) // 3) * 3 + 2 num = Decimal(round(phi ** Decimal(index + 1))) / (phi + 2) total = num // 2 return int(total) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_002/sol5.py ================================================ """ Project Euler Problem 2: https://projecteuler.net/problem=2 Even Fibonacci Numbers Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be: 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms. References: - https://en.wikipedia.org/wiki/Fibonacci_number """ def solution(n: int = 4000000) -> int: """ Returns the sum of all even fibonacci sequence elements that are lower or equal to n. >>> solution(10) 10 >>> solution(15) 10 >>> solution(2) 2 >>> solution(1) 0 >>> solution(34) 44 """ fib = [0, 1] i = 0 while fib[i] <= n: fib.append(fib[i] + fib[i + 1]) if fib[i + 2] > n: break i += 1 total = 0 for j in range(len(fib) - 1): if fib[j] % 2 == 0: total += fib[j] return total if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_003/__init__.py ================================================ ================================================ FILE: project_euler/problem_003/sol1.py ================================================ """ Project Euler Problem 3: https://projecteuler.net/problem=3 Largest prime factor The prime factors of 13195 are 5, 7, 13 and 29. What is the largest prime factor of the number 600851475143? References: - https://en.wikipedia.org/wiki/Prime_number#Unique_factorization """ import math def is_prime(number: int) -> bool: """Checks to see if a number is a prime in O(sqrt(n)). A number is prime if it has exactly two factors: 1 and itself. Returns boolean representing primality of given number (i.e., if the result is true, then the number is indeed prime else it is not). >>> is_prime(2) True >>> is_prime(3) True >>> is_prime(27) False >>> is_prime(2999) True >>> is_prime(0) False >>> is_prime(1) False """ if 1 < number < 4: # 2 and 3 are primes return True elif number < 2 or number % 2 == 0 or number % 3 == 0: # Negatives, 0, 1, all even numbers, all multiples of 3 are not primes return False # All primes number are in format of 6k +/- 1 for i in range(5, int(math.sqrt(number) + 1), 6): if number % i == 0 or number % (i + 2) == 0: return False return True def solution(n: int = 600851475143) -> int: """ Returns the largest prime factor of a given number n. >>> solution(13195) 29 >>> solution(10) 5 >>> solution(17) 17 >>> solution(3.4) 3 >>> solution(0) Traceback (most recent call last): ... ValueError: Parameter n must be greater than or equal to one. >>> solution(-17) Traceback (most recent call last): ... ValueError: Parameter n must be greater than or equal to one. >>> solution([]) Traceback (most recent call last): ... TypeError: Parameter n must be int or castable to int. >>> solution("asd") Traceback (most recent call last): ... TypeError: Parameter n must be int or castable to int. """ try: n = int(n) except (TypeError, ValueError): raise TypeError("Parameter n must be int or castable to int.") if n <= 0: raise ValueError("Parameter n must be greater than or equal to one.") max_number = 0 if is_prime(n): return n while n % 2 == 0: n //= 2 if is_prime(n): return n for i in range(3, int(math.sqrt(n)) + 1, 2): if n % i == 0: if is_prime(n // i): max_number = n // i break elif is_prime(i): max_number = i return max_number if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_003/sol2.py ================================================ """ Project Euler Problem 3: https://projecteuler.net/problem=3 Largest prime factor The prime factors of 13195 are 5, 7, 13 and 29. What is the largest prime factor of the number 600851475143? References: - https://en.wikipedia.org/wiki/Prime_number#Unique_factorization """ def solution(n: int = 600851475143) -> int: """ Returns the largest prime factor of a given number n. >>> solution(13195) 29 >>> solution(10) 5 >>> solution(17) 17 >>> solution(3.4) 3 >>> solution(0) Traceback (most recent call last): ... ValueError: Parameter n must be greater than or equal to one. >>> solution(-17) Traceback (most recent call last): ... ValueError: Parameter n must be greater than or equal to one. >>> solution([]) Traceback (most recent call last): ... TypeError: Parameter n must be int or castable to int. >>> solution("asd") Traceback (most recent call last): ... TypeError: Parameter n must be int or castable to int. """ try: n = int(n) except (TypeError, ValueError): raise TypeError("Parameter n must be int or castable to int.") if n <= 0: raise ValueError("Parameter n must be greater than or equal to one.") prime = 1 i = 2 while i * i <= n: while n % i == 0: prime = i n //= i i += 1 if n > 1: prime = n return int(prime) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_003/sol3.py ================================================ """ Project Euler Problem 3: https://projecteuler.net/problem=3 Largest prime factor The prime factors of 13195 are 5, 7, 13 and 29. What is the largest prime factor of the number 600851475143? References: - https://en.wikipedia.org/wiki/Prime_number#Unique_factorization """ def solution(n: int = 600851475143) -> int: """ Returns the largest prime factor of a given number n. >>> solution(13195) 29 >>> solution(10) 5 >>> solution(17) 17 >>> solution(3.4) 3 >>> solution(0) Traceback (most recent call last): ... ValueError: Parameter n must be greater than or equal to one. >>> solution(-17) Traceback (most recent call last): ... ValueError: Parameter n must be greater than or equal to one. >>> solution([]) Traceback (most recent call last): ... TypeError: Parameter n must be int or castable to int. >>> solution("asd") Traceback (most recent call last): ... TypeError: Parameter n must be int or castable to int. """ try: n = int(n) except (TypeError, ValueError): raise TypeError("Parameter n must be int or castable to int.") if n <= 0: raise ValueError("Parameter n must be greater than or equal to one.") i = 2 ans = 0 if n == 2: return 2 while n > 2: while n % i != 0: i += 1 ans = i while n % i == 0: n = n // i i += 1 return int(ans) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_004/__init__.py ================================================ ================================================ FILE: project_euler/problem_004/sol1.py ================================================ """ Project Euler Problem 4: https://projecteuler.net/problem=4 Largest palindrome product A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 x 99. Find the largest palindrome made from the product of two 3-digit numbers. References: - https://en.wikipedia.org/wiki/Palindromic_number """ def solution(n: int = 998001) -> int: """ Returns the largest palindrome made from the product of two 3-digit numbers which is less than n. >>> solution(20000) 19591 >>> solution(30000) 29992 >>> solution(40000) 39893 >>> solution(10000) Traceback (most recent call last): ... ValueError: That number is larger than our acceptable range. """ # fetches the next number for number in range(n - 1, 9999, -1): str_number = str(number) # checks whether 'str_number' is a palindrome. if str_number == str_number[::-1]: divisor = 999 # if 'number' is a product of two 3-digit numbers # then number is the answer otherwise fetch next number. while divisor != 99: if (number % divisor == 0) and (len(str(number // divisor)) == 3.0): return number divisor -= 1 raise ValueError("That number is larger than our acceptable range.") if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_004/sol2.py ================================================ """ Project Euler Problem 4: https://projecteuler.net/problem=4 Largest palindrome product A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 x 99. Find the largest palindrome made from the product of two 3-digit numbers. References: - https://en.wikipedia.org/wiki/Palindromic_number """ def solution(n: int = 998001) -> int: """ Returns the largest palindrome made from the product of two 3-digit numbers which is less than n. >>> solution(20000) 19591 >>> solution(30000) 29992 >>> solution(40000) 39893 """ answer = 0 for i in range(999, 99, -1): # 3 digit numbers range from 999 down to 100 for j in range(999, 99, -1): product_string = str(i * j) if product_string == product_string[::-1] and i * j < n: answer = max(answer, i * j) return answer if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_005/__init__.py ================================================ ================================================ FILE: project_euler/problem_005/sol1.py ================================================ """ Project Euler Problem 5: https://projecteuler.net/problem=5 Smallest multiple 2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder. What is the smallest positive number that is _evenly divisible_ by all of the numbers from 1 to 20? References: - https://en.wiktionary.org/wiki/evenly_divisible """ def solution(n: int = 20) -> int: """ Returns the smallest positive number that is evenly divisible (divisible with no remainder) by all of the numbers from 1 to n. >>> solution(10) 2520 >>> solution(15) 360360 >>> solution(22) 232792560 >>> solution(3.4) 6 >>> solution(0) Traceback (most recent call last): ... ValueError: Parameter n must be greater than or equal to one. >>> solution(-17) Traceback (most recent call last): ... ValueError: Parameter n must be greater than or equal to one. >>> solution([]) Traceback (most recent call last): ... TypeError: Parameter n must be int or castable to int. >>> solution("asd") Traceback (most recent call last): ... TypeError: Parameter n must be int or castable to int. """ try: n = int(n) except (TypeError, ValueError): raise TypeError("Parameter n must be int or castable to int.") if n <= 0: raise ValueError("Parameter n must be greater than or equal to one.") i = 0 while 1: i += n * (n - 1) nfound = 0 for j in range(2, n): if i % j != 0: nfound = 1 break if nfound == 0: if i == 0: i = 1 return i return None if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_005/sol2.py ================================================ from maths.greatest_common_divisor import greatest_common_divisor """ Project Euler Problem 5: https://projecteuler.net/problem=5 Smallest multiple 2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder. What is the smallest positive number that is _evenly divisible_ by all of the numbers from 1 to 20? References: - https://en.wiktionary.org/wiki/evenly_divisible - https://en.wikipedia.org/wiki/Euclidean_algorithm - https://en.wikipedia.org/wiki/Least_common_multiple """ def lcm(x: int, y: int) -> int: """ Least Common Multiple. Using the property that lcm(a, b) * greatest_common_divisor(a, b) = a*b >>> lcm(3, 15) 15 >>> lcm(1, 27) 27 >>> lcm(13, 27) 351 >>> lcm(64, 48) 192 """ return (x * y) // greatest_common_divisor(x, y) def solution(n: int = 20) -> int: """ Returns the smallest positive number that is evenly divisible (divisible with no remainder) by all of the numbers from 1 to n. >>> solution(10) 2520 >>> solution(15) 360360 >>> solution(22) 232792560 """ g = 1 for i in range(1, n + 1): g = lcm(g, i) return g if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_006/__init__.py ================================================ ================================================ FILE: project_euler/problem_006/sol1.py ================================================ """ Project Euler Problem 6: https://projecteuler.net/problem=6 Sum square difference The sum of the squares of the first ten natural numbers is, 1^2 + 2^2 + ... + 10^2 = 385 The square of the sum of the first ten natural numbers is, (1 + 2 + ... + 10)^2 = 55^2 = 3025 Hence the difference between the sum of the squares of the first ten natural numbers and the square of the sum is 3025 - 385 = 2640. Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum. """ def solution(n: int = 100) -> int: """ Returns the difference between the sum of the squares of the first n natural numbers and the square of the sum. >>> solution(10) 2640 >>> solution(15) 13160 >>> solution(20) 41230 >>> solution(50) 1582700 """ sum_of_squares = 0 sum_of_ints = 0 for i in range(1, n + 1): sum_of_squares += i**2 sum_of_ints += i return sum_of_ints**2 - sum_of_squares if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_006/sol2.py ================================================ """ Project Euler Problem 6: https://projecteuler.net/problem=6 Sum square difference The sum of the squares of the first ten natural numbers is, 1^2 + 2^2 + ... + 10^2 = 385 The square of the sum of the first ten natural numbers is, (1 + 2 + ... + 10)^2 = 55^2 = 3025 Hence the difference between the sum of the squares of the first ten natural numbers and the square of the sum is 3025 - 385 = 2640. Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum. """ def solution(n: int = 100) -> int: """ Returns the difference between the sum of the squares of the first n natural numbers and the square of the sum. >>> solution(10) 2640 >>> solution(15) 13160 >>> solution(20) 41230 >>> solution(50) 1582700 """ sum_cubes = (n * (n + 1) // 2) ** 2 sum_squares = n * (n + 1) * (2 * n + 1) // 6 return sum_cubes - sum_squares if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_006/sol3.py ================================================ """ Project Euler Problem 6: https://projecteuler.net/problem=6 Sum square difference The sum of the squares of the first ten natural numbers is, 1^2 + 2^2 + ... + 10^2 = 385 The square of the sum of the first ten natural numbers is, (1 + 2 + ... + 10)^2 = 55^2 = 3025 Hence the difference between the sum of the squares of the first ten natural numbers and the square of the sum is 3025 - 385 = 2640. Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum. """ import math def solution(n: int = 100) -> int: """ Returns the difference between the sum of the squares of the first n natural numbers and the square of the sum. >>> solution(10) 2640 >>> solution(15) 13160 >>> solution(20) 41230 >>> solution(50) 1582700 """ sum_of_squares = sum(i * i for i in range(1, n + 1)) square_of_sum = int(math.pow(sum(range(1, n + 1)), 2)) return square_of_sum - sum_of_squares if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_006/sol4.py ================================================ """ Project Euler Problem 6: https://projecteuler.net/problem=6 Sum square difference The sum of the squares of the first ten natural numbers is, 1^2 + 2^2 + ... + 10^2 = 385 The square of the sum of the first ten natural numbers is, (1 + 2 + ... + 10)^2 = 55^2 = 3025 Hence the difference between the sum of the squares of the first ten natural numbers and the square of the sum is 3025 - 385 = 2640. Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum. """ def solution(n: int = 100) -> int: """ Returns the difference between the sum of the squares of the first n natural numbers and the square of the sum. >>> solution(10) 2640 >>> solution(15) 13160 >>> solution(20) 41230 >>> solution(50) 1582700 """ sum_of_squares = n * (n + 1) * (2 * n + 1) / 6 square_of_sum = (n * (n + 1) / 2) ** 2 return int(square_of_sum - sum_of_squares) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_007/__init__.py ================================================ ================================================ FILE: project_euler/problem_007/sol1.py ================================================ """ Project Euler Problem 7: https://projecteuler.net/problem=7 10001st prime By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13. What is the 10001st prime number? References: - https://en.wikipedia.org/wiki/Prime_number """ from math import sqrt def is_prime(number: int) -> bool: """Checks to see if a number is a prime in O(sqrt(n)). A number is prime if it has exactly two factors: 1 and itself. Returns boolean representing primality of given number (i.e., if the result is true, then the number is indeed prime else it is not). >>> is_prime(2) True >>> is_prime(3) True >>> is_prime(27) False >>> is_prime(2999) True >>> is_prime(0) False >>> is_prime(1) False """ if 1 < number < 4: # 2 and 3 are primes return True elif number < 2 or number % 2 == 0 or number % 3 == 0: # Negatives, 0, 1, all even numbers, all multiples of 3 are not primes return False # All primes number are in format of 6k +/- 1 for i in range(5, int(sqrt(number) + 1), 6): if number % i == 0 or number % (i + 2) == 0: return False return True def solution(nth: int = 10001) -> int: """ Returns the n-th prime number. >>> solution(6) 13 >>> solution(1) 2 >>> solution(3) 5 >>> solution(20) 71 >>> solution(50) 229 >>> solution(100) 541 """ count = 0 number = 1 while count != nth and number < 3: number += 1 if is_prime(number): count += 1 while count != nth: number += 2 if is_prime(number): count += 1 return number if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_007/sol2.py ================================================ """ Project Euler Problem 7: https://projecteuler.net/problem=7 10001st prime By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13. What is the 10001st prime number? References: - https://en.wikipedia.org/wiki/Prime_number """ import math def is_prime(number: int) -> bool: """Checks to see if a number is a prime in O(sqrt(n)). A number is prime if it has exactly two factors: 1 and itself. Returns boolean representing primality of given number (i.e., if the result is true, then the number is indeed prime else it is not). >>> is_prime(2) True >>> is_prime(3) True >>> is_prime(27) False >>> is_prime(2999) True >>> is_prime(0) False >>> is_prime(1) False """ if 1 < number < 4: # 2 and 3 are primes return True elif number < 2 or number % 2 == 0 or number % 3 == 0: # Negatives, 0, 1, all even numbers, all multiples of 3 are not primes return False # All primes number are in format of 6k +/- 1 for i in range(5, int(math.sqrt(number) + 1), 6): if number % i == 0 or number % (i + 2) == 0: return False return True def solution(nth: int = 10001) -> int: """ Returns the n-th prime number. >>> solution(6) 13 >>> solution(1) 2 >>> solution(3) 5 >>> solution(20) 71 >>> solution(50) 229 >>> solution(100) 541 >>> solution(3.4) 5 >>> solution(0) Traceback (most recent call last): ... ValueError: Parameter nth must be greater than or equal to one. >>> solution(-17) Traceback (most recent call last): ... ValueError: Parameter nth must be greater than or equal to one. >>> solution([]) Traceback (most recent call last): ... TypeError: Parameter nth must be int or castable to int. >>> solution("asd") Traceback (most recent call last): ... TypeError: Parameter nth must be int or castable to int. """ try: nth = int(nth) except (TypeError, ValueError): raise TypeError("Parameter nth must be int or castable to int.") from None if nth <= 0: raise ValueError("Parameter nth must be greater than or equal to one.") primes: list[int] = [] num = 2 while len(primes) < nth: if is_prime(num): primes.append(num) num += 1 else: num += 1 return primes[len(primes) - 1] if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_007/sol3.py ================================================ """ Project Euler Problem 7: https://projecteuler.net/problem=7 10001st prime By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13. What is the 10001st prime number? References: - https://en.wikipedia.org/wiki/Prime_number """ import itertools import math def is_prime(number: int) -> bool: """Checks to see if a number is a prime in O(sqrt(n)). A number is prime if it has exactly two factors: 1 and itself. Returns boolean representing primality of given number (i.e., if the result is true, then the number is indeed prime else it is not). >>> is_prime(2) True >>> is_prime(3) True >>> is_prime(27) False >>> is_prime(2999) True >>> is_prime(0) False >>> is_prime(1) False """ if 1 < number < 4: # 2 and 3 are primes return True elif number < 2 or number % 2 == 0 or number % 3 == 0: # Negatives, 0, 1, all even numbers, all multiples of 3 are not primes return False # All primes number are in format of 6k +/- 1 for i in range(5, int(math.sqrt(number) + 1), 6): if number % i == 0 or number % (i + 2) == 0: return False return True def prime_generator(): """ Generate a sequence of prime numbers """ num = 2 while True: if is_prime(num): yield num num += 1 def solution(nth: int = 10001) -> int: """ Returns the n-th prime number. >>> solution(6) 13 >>> solution(1) 2 >>> solution(3) 5 >>> solution(20) 71 >>> solution(50) 229 >>> solution(100) 541 """ return next(itertools.islice(prime_generator(), nth - 1, nth)) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_008/__init__.py ================================================ ================================================ FILE: project_euler/problem_008/sol1.py ================================================ """ Project Euler Problem 8: https://projecteuler.net/problem=8 Largest product in a series The four adjacent digits in the 1000-digit number that have the greatest product are 9 x 9 x 8 x 9 = 5832. 73167176531330624919225119674426574742355349194934 96983520312774506326239578318016984801869478851843 85861560789112949495459501737958331952853208805511 12540698747158523863050715693290963295227443043557 66896648950445244523161731856403098711121722383113 62229893423380308135336276614282806444486645238749 30358907296290491560440772390713810515859307960866 70172427121883998797908792274921901699720888093776 65727333001053367881220235421809751254540594752243 52584907711670556013604839586446706324415722155397 53697817977846174064955149290862569321978468622482 83972241375657056057490261407972968652414535100474 82166370484403199890008895243450658541227588666881 16427171479924442928230863465674813919123162824586 17866458359124566529476545682848912883142607690042 24219022671055626321111109370544217506941658960408 07198403850962455444362981230987879927244284909188 84580156166097919133875499200524063689912560717606 05886116467109405077541002256983155200055935729725 71636269561882670428252483600823257530420752963450 Find the thirteen adjacent digits in the 1000-digit number that have the greatest product. What is the value of this product? """ import sys N = ( "73167176531330624919225119674426574742355349194934" "96983520312774506326239578318016984801869478851843" "85861560789112949495459501737958331952853208805511" "12540698747158523863050715693290963295227443043557" "66896648950445244523161731856403098711121722383113" "62229893423380308135336276614282806444486645238749" "30358907296290491560440772390713810515859307960866" "70172427121883998797908792274921901699720888093776" "65727333001053367881220235421809751254540594752243" "52584907711670556013604839586446706324415722155397" "53697817977846174064955149290862569321978468622482" "83972241375657056057490261407972968652414535100474" "82166370484403199890008895243450658541227588666881" "16427171479924442928230863465674813919123162824586" "17866458359124566529476545682848912883142607690042" "24219022671055626321111109370544217506941658960408" "07198403850962455444362981230987879927244284909188" "84580156166097919133875499200524063689912560717606" "05886116467109405077541002256983155200055935729725" "71636269561882670428252483600823257530420752963450" ) def solution(n: str = N) -> int: """ Find the thirteen adjacent digits in the 1000-digit number n that have the greatest product and returns it. >>> solution("13978431290823798458352374") 609638400 >>> solution("13978431295823798458352374") 2612736000 >>> solution("1397843129582379841238352374") 209018880 """ largest_product = -sys.maxsize - 1 for i in range(len(n) - 12): product = 1 for j in range(13): product *= int(n[i + j]) largest_product = max(largest_product, product) return largest_product if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_008/sol2.py ================================================ """ Project Euler Problem 8: https://projecteuler.net/problem=8 Largest product in a series The four adjacent digits in the 1000-digit number that have the greatest product are 9 x 9 x 8 x 9 = 5832. 73167176531330624919225119674426574742355349194934 96983520312774506326239578318016984801869478851843 85861560789112949495459501737958331952853208805511 12540698747158523863050715693290963295227443043557 66896648950445244523161731856403098711121722383113 62229893423380308135336276614282806444486645238749 30358907296290491560440772390713810515859307960866 70172427121883998797908792274921901699720888093776 65727333001053367881220235421809751254540594752243 52584907711670556013604839586446706324415722155397 53697817977846174064955149290862569321978468622482 83972241375657056057490261407972968652414535100474 82166370484403199890008895243450658541227588666881 16427171479924442928230863465674813919123162824586 17866458359124566529476545682848912883142607690042 24219022671055626321111109370544217506941658960408 07198403850962455444362981230987879927244284909188 84580156166097919133875499200524063689912560717606 05886116467109405077541002256983155200055935729725 71636269561882670428252483600823257530420752963450 Find the thirteen adjacent digits in the 1000-digit number that have the greatest product. What is the value of this product? """ from functools import reduce N = ( "73167176531330624919225119674426574742355349194934" "96983520312774506326239578318016984801869478851843" "85861560789112949495459501737958331952853208805511" "12540698747158523863050715693290963295227443043557" "66896648950445244523161731856403098711121722383113" "62229893423380308135336276614282806444486645238749" "30358907296290491560440772390713810515859307960866" "70172427121883998797908792274921901699720888093776" "65727333001053367881220235421809751254540594752243" "52584907711670556013604839586446706324415722155397" "53697817977846174064955149290862569321978468622482" "83972241375657056057490261407972968652414535100474" "82166370484403199890008895243450658541227588666881" "16427171479924442928230863465674813919123162824586" "17866458359124566529476545682848912883142607690042" "24219022671055626321111109370544217506941658960408" "07198403850962455444362981230987879927244284909188" "84580156166097919133875499200524063689912560717606" "05886116467109405077541002256983155200055935729725" "71636269561882670428252483600823257530420752963450" ) def solution(n: str = N) -> int: """ Find the thirteen adjacent digits in the 1000-digit number n that have the greatest product and returns it. >>> solution("13978431290823798458352374") 609638400 >>> solution("13978431295823798458352374") 2612736000 >>> solution("1397843129582379841238352374") 209018880 """ return max( # mypy cannot properly interpret reduce int(reduce(lambda x, y: str(int(x) * int(y)), n[i : i + 13])) for i in range(len(n) - 12) ) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_008/sol3.py ================================================ """ Project Euler Problem 8: https://projecteuler.net/problem=8 Largest product in a series The four adjacent digits in the 1000-digit number that have the greatest product are 9 x 9 x 8 x 9 = 5832. 73167176531330624919225119674426574742355349194934 96983520312774506326239578318016984801869478851843 85861560789112949495459501737958331952853208805511 12540698747158523863050715693290963295227443043557 66896648950445244523161731856403098711121722383113 62229893423380308135336276614282806444486645238749 30358907296290491560440772390713810515859307960866 70172427121883998797908792274921901699720888093776 65727333001053367881220235421809751254540594752243 52584907711670556013604839586446706324415722155397 53697817977846174064955149290862569321978468622482 83972241375657056057490261407972968652414535100474 82166370484403199890008895243450658541227588666881 16427171479924442928230863465674813919123162824586 17866458359124566529476545682848912883142607690042 24219022671055626321111109370544217506941658960408 07198403850962455444362981230987879927244284909188 84580156166097919133875499200524063689912560717606 05886116467109405077541002256983155200055935729725 71636269561882670428252483600823257530420752963450 Find the thirteen adjacent digits in the 1000-digit number that have the greatest product. What is the value of this product? """ import sys N = ( "73167176531330624919225119674426574742355349194934" "96983520312774506326239578318016984801869478851843" "85861560789112949495459501737958331952853208805511" "12540698747158523863050715693290963295227443043557" "66896648950445244523161731856403098711121722383113" "62229893423380308135336276614282806444486645238749" "30358907296290491560440772390713810515859307960866" "70172427121883998797908792274921901699720888093776" "65727333001053367881220235421809751254540594752243" "52584907711670556013604839586446706324415722155397" "53697817977846174064955149290862569321978468622482" "83972241375657056057490261407972968652414535100474" "82166370484403199890008895243450658541227588666881" "16427171479924442928230863465674813919123162824586" "17866458359124566529476545682848912883142607690042" "24219022671055626321111109370544217506941658960408" "07198403850962455444362981230987879927244284909188" "84580156166097919133875499200524063689912560717606" "05886116467109405077541002256983155200055935729725" "71636269561882670428252483600823257530420752963450" ) def str_eval(s: str) -> int: """ Returns product of digits in given string n >>> str_eval("987654321") 362880 >>> str_eval("22222222") 256 """ product = 1 for digit in s: product *= int(digit) return product def solution(n: str = N) -> int: """ Find the thirteen adjacent digits in the 1000-digit number n that have the greatest product and returns it. """ largest_product = -sys.maxsize - 1 substr = n[:13] cur_index = 13 while cur_index < len(n) - 13: if int(n[cur_index]) >= int(substr[0]): substr = substr[1:] + n[cur_index] cur_index += 1 else: largest_product = max(largest_product, str_eval(substr)) substr = n[cur_index : cur_index + 13] cur_index += 13 return largest_product if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_009/__init__.py ================================================ ================================================ FILE: project_euler/problem_009/sol1.py ================================================ """ Project Euler Problem 9: https://projecteuler.net/problem=9 Special Pythagorean triplet A Pythagorean triplet is a set of three natural numbers, a < b < c, for which, a^2 + b^2 = c^2 For example, 3^2 + 4^2 = 9 + 16 = 25 = 5^2. There exists exactly one Pythagorean triplet for which a + b + c = 1000. Find the product a*b*c. References: - https://en.wikipedia.org/wiki/Pythagorean_triple """ def solution() -> int: """ Returns the product of a,b,c which are Pythagorean Triplet that satisfies the following: 1. a < b < c 2. a**2 + b**2 = c**2 3. a + b + c = 1000 >>> solution() 31875000 """ for a in range(300): for b in range(a + 1, 400): for c in range(b + 1, 500): if (a + b + c) == 1000 and (a**2) + (b**2) == (c**2): return a * b * c return -1 def solution_fast() -> int: """ Returns the product of a,b,c which are Pythagorean Triplet that satisfies the following: 1. a < b < c 2. a**2 + b**2 = c**2 3. a + b + c = 1000 >>> solution_fast() 31875000 """ for a in range(300): for b in range(400): c = 1000 - a - b if a < b < c and (a**2) + (b**2) == (c**2): return a * b * c return -1 def benchmark() -> None: """ Benchmark code comparing two different version function. """ import timeit print( timeit.timeit("solution()", setup="from __main__ import solution", number=1000) ) print( timeit.timeit( "solution_fast()", setup="from __main__ import solution_fast", number=1000 ) ) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_009/sol2.py ================================================ """ Project Euler Problem 9: https://projecteuler.net/problem=9 Special Pythagorean triplet A Pythagorean triplet is a set of three natural numbers, a < b < c, for which, a^2 + b^2 = c^2 For example, 3^2 + 4^2 = 9 + 16 = 25 = 5^2. There exists exactly one Pythagorean triplet for which a + b + c = 1000. Find the product a*b*c. References: - https://en.wikipedia.org/wiki/Pythagorean_triple """ def solution(n: int = 1000) -> int: """ Return the product of a,b,c which are Pythagorean Triplet that satisfies the following: 1. a < b < c 2. a**2 + b**2 = c**2 3. a + b + c = n >>> solution(36) 1620 >>> solution(126) 66780 """ product = -1 candidate = 0 for a in range(1, n // 3): # Solving the two equations a**2+b**2=c**2 and a+b+c=N eliminating c b = (n * n - 2 * a * n) // (2 * n - 2 * a) c = n - a - b if c * c == (a * a + b * b): candidate = a * b * c product = max(product, candidate) return product if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_009/sol3.py ================================================ """ Project Euler Problem 9: https://projecteuler.net/problem=9 Special Pythagorean triplet A Pythagorean triplet is a set of three natural numbers, a < b < c, for which, a^2 + b^2 = c^2 For example, 3^2 + 4^2 = 9 + 16 = 25 = 5^2. There exists exactly one Pythagorean triplet for which a + b + c = 1000. Find the product a*b*c. References: - https://en.wikipedia.org/wiki/Pythagorean_triple """ def solution() -> int: """ Returns the product of a,b,c which are Pythagorean Triplet that satisfies the following: 1. a**2 + b**2 = c**2 2. a + b + c = 1000 >>> solution() 31875000 """ return next( iter( [ a * b * (1000 - a - b) for a in range(1, 999) for b in range(a, 999) if (a * a + b * b == (1000 - a - b) ** 2) ] ) ) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_009/sol4.py ================================================ """ Project Euler Problem 9: https://projecteuler.net/problem=9 Special Pythagorean triplet A Pythagorean triplet is a set of three natural numbers, a < b < c, for which, a^2 + b^2 = c^2. For example, 3^2 + 4^2 = 9 + 16 = 25 = 5^2. There exists exactly one Pythagorean triplet for which a + b + c = 1000. Find the product abc. References: - https://en.wikipedia.org/wiki/Pythagorean_triple """ def get_squares(n: int) -> list[int]: """ >>> get_squares(0) [] >>> get_squares(1) [0] >>> get_squares(2) [0, 1] >>> get_squares(3) [0, 1, 4] >>> get_squares(4) [0, 1, 4, 9] """ return [number * number for number in range(n)] def solution(n: int = 1000) -> int: """ Precomputing squares and checking if a^2 + b^2 is the square by set look-up. >>> solution(12) 60 >>> solution(36) 1620 """ squares = get_squares(n) squares_set = set(squares) for a in range(1, n // 3): for b in range(a + 1, (n - a) // 2 + 1): if ( squares[a] + squares[b] in squares_set and squares[n - a - b] == squares[a] + squares[b] ): return a * b * (n - a - b) return -1 if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_010/__init__.py ================================================ ================================================ FILE: project_euler/problem_010/sol1.py ================================================ """ Project Euler Problem 10: https://projecteuler.net/problem=10 Summation of primes The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. Find the sum of all the primes below two million. References: - https://en.wikipedia.org/wiki/Prime_number """ import math def is_prime(number: int) -> bool: """Checks to see if a number is a prime in O(sqrt(n)). A number is prime if it has exactly two factors: 1 and itself. Returns boolean representing primality of given number num (i.e., if the result is true, then the number is indeed prime else it is not). >>> is_prime(2) True >>> is_prime(3) True >>> is_prime(27) False >>> is_prime(2999) True >>> is_prime(0) False >>> is_prime(1) False """ if 1 < number < 4: # 2 and 3 are primes return True elif number < 2 or number % 2 == 0 or number % 3 == 0: # Negatives, 0, 1, all even numbers, all multiples of 3 are not primes return False # All primes number are in format of 6k +/- 1 for i in range(5, int(math.sqrt(number) + 1), 6): if number % i == 0 or number % (i + 2) == 0: return False return True def solution(n: int = 2000000) -> int: """ Returns the sum of all the primes below n. >>> solution(1000) 76127 >>> solution(5000) 1548136 >>> solution(10000) 5736396 >>> solution(7) 10 """ return sum(num for num in range(3, n, 2) if is_prime(num)) + 2 if n > 2 else 0 if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_010/sol2.py ================================================ """ Project Euler Problem 10: https://projecteuler.net/problem=10 Summation of primes The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. Find the sum of all the primes below two million. References: - https://en.wikipedia.org/wiki/Prime_number """ import math from collections.abc import Iterator from itertools import takewhile def is_prime(number: int) -> bool: """Checks to see if a number is a prime in O(sqrt(n)). A number is prime if it has exactly two factors: 1 and itself. Returns boolean representing primality of given number num (i.e., if the result is true, then the number is indeed prime else it is not). >>> is_prime(2) True >>> is_prime(3) True >>> is_prime(27) False >>> is_prime(2999) True >>> is_prime(0) False >>> is_prime(1) False """ if 1 < number < 4: # 2 and 3 are primes return True elif number < 2 or number % 2 == 0 or number % 3 == 0: # Negatives, 0, 1, all even numbers, all multiples of 3 are not primes return False # All primes number are in format of 6k +/- 1 for i in range(5, int(math.sqrt(number) + 1), 6): if number % i == 0 or number % (i + 2) == 0: return False return True def prime_generator() -> Iterator[int]: """ Generate a list sequence of prime numbers """ num = 2 while True: if is_prime(num): yield num num += 1 def solution(n: int = 2000000) -> int: """ Returns the sum of all the primes below n. >>> solution(1000) 76127 >>> solution(5000) 1548136 >>> solution(10000) 5736396 >>> solution(7) 10 """ return sum(takewhile(lambda x: x < n, prime_generator())) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_010/sol3.py ================================================ """ Project Euler Problem 10: https://projecteuler.net/problem=10 Summation of primes The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. Find the sum of all the primes below two million. References: - https://en.wikipedia.org/wiki/Prime_number - https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes """ def solution(n: int = 2000000) -> int: """ Returns the sum of all the primes below n using Sieve of Eratosthenes: The sieve of Eratosthenes is one of the most efficient ways to find all primes smaller than n when n is smaller than 10 million. Only for positive numbers. >>> solution(1000) 76127 >>> solution(5000) 1548136 >>> solution(10000) 5736396 >>> solution(7) 10 >>> solution(7.1) # doctest: +ELLIPSIS Traceback (most recent call last): ... TypeError: 'float' object cannot be interpreted as an integer >>> solution(-7) # doctest: +ELLIPSIS Traceback (most recent call last): ... IndexError: list assignment index out of range >>> solution("seven") # doctest: +ELLIPSIS Traceback (most recent call last): ... TypeError: can only concatenate str (not "int") to str """ primality_list = [0 for i in range(n + 1)] primality_list[0] = 1 primality_list[1] = 1 for i in range(2, int(n**0.5) + 1): if primality_list[i] == 0: for j in range(i * i, n + 1, i): primality_list[j] = 1 sum_of_primes = 0 for i in range(n): if primality_list[i] == 0: sum_of_primes += i return sum_of_primes if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_011/__init__.py ================================================ ================================================ FILE: project_euler/problem_011/grid.txt ================================================ 08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48 ================================================ FILE: project_euler/problem_011/sol1.py ================================================ """ What is the greatest product of four adjacent numbers (horizontally, vertically, or diagonally) in this 20x20 array? 08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48 """ import os def largest_product(grid): n_columns = len(grid[0]) n_rows = len(grid) largest = 0 lr_diag_product = 0 rl_diag_product = 0 # Check vertically, horizontally, diagonally at the same time (only works # for nxn grid) for i in range(n_columns): for j in range(n_rows - 3): vert_product = grid[j][i] * grid[j + 1][i] * grid[j + 2][i] * grid[j + 3][i] horz_product = grid[i][j] * grid[i][j + 1] * grid[i][j + 2] * grid[i][j + 3] # Left-to-right diagonal (\) product if i < n_columns - 3: lr_diag_product = ( grid[i][j] * grid[i + 1][j + 1] * grid[i + 2][j + 2] * grid[i + 3][j + 3] ) # Right-to-left diagonal(/) product if i > 2: rl_diag_product = ( grid[i][j] * grid[i - 1][j + 1] * grid[i - 2][j + 2] * grid[i - 3][j + 3] ) max_product = max( vert_product, horz_product, lr_diag_product, rl_diag_product ) largest = max(largest, max_product) return largest def solution(): """Returns the greatest product of four adjacent numbers (horizontally, vertically, or diagonally). >>> solution() 70600674 """ grid = [] with open(os.path.dirname(__file__) + "/grid.txt") as file: for line in file: grid.append(line.strip("\n").split(" ")) grid = [[int(i) for i in grid[j]] for j in range(len(grid))] return largest_product(grid) if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_011/sol2.py ================================================ """ What is the greatest product of four adjacent numbers (horizontally, vertically, or diagonally) in this 20x20 array? 08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48 """ import os def solution(): """Returns the greatest product of four adjacent numbers (horizontally, vertically, or diagonally). >>> solution() 70600674 """ with open(os.path.dirname(__file__) + "/grid.txt") as f: grid = [] for _ in range(20): grid.append([int(x) for x in f.readline().split()]) maximum = 0 # right for i in range(20): for j in range(17): temp = grid[i][j] * grid[i][j + 1] * grid[i][j + 2] * grid[i][j + 3] maximum = max(maximum, temp) # down for i in range(17): for j in range(20): temp = grid[i][j] * grid[i + 1][j] * grid[i + 2][j] * grid[i + 3][j] maximum = max(maximum, temp) # diagonal 1 for i in range(17): for j in range(17): temp = ( grid[i][j] * grid[i + 1][j + 1] * grid[i + 2][j + 2] * grid[i + 3][j + 3] ) maximum = max(maximum, temp) # diagonal 2 for i in range(17): for j in range(3, 20): temp = ( grid[i][j] * grid[i + 1][j - 1] * grid[i + 2][j - 2] * grid[i + 3][j - 3] ) maximum = max(maximum, temp) return maximum if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_012/__init__.py ================================================ ================================================ FILE: project_euler/problem_012/sol1.py ================================================ """ Highly divisible triangular numbers Problem 12 The sequence of triangle numbers is generated by adding the natural numbers. So the 7th triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. The first ten terms would be: 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ... Let us list the factors of the first seven triangle numbers: 1: 1 3: 1,3 6: 1,2,3,6 10: 1,2,5,10 15: 1,3,5,15 21: 1,3,7,21 28: 1,2,4,7,14,28 We can see that 28 is the first triangle number to have over five divisors. What is the value of the first triangle number to have over five hundred divisors? """ def count_divisors(n): n_divisors = 1 i = 2 while i * i <= n: multiplicity = 0 while n % i == 0: n //= i multiplicity += 1 n_divisors *= multiplicity + 1 i += 1 if n > 1: n_divisors *= 2 return n_divisors def solution(): """Returns the value of the first triangle number to have over five hundred divisors. >>> solution() 76576500 """ t_num = 1 i = 1 while True: i += 1 t_num += i if count_divisors(t_num) > 500: break return t_num if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_012/sol2.py ================================================ """ Highly divisible triangular numbers Problem 12 The sequence of triangle numbers is generated by adding the natural numbers. So the 7th triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. The first ten terms would be: 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ... Let us list the factors of the first seven triangle numbers: 1: 1 3: 1,3 6: 1,2,3,6 10: 1,2,5,10 15: 1,3,5,15 21: 1,3,7,21 28: 1,2,4,7,14,28 We can see that 28 is the first triangle number to have over five divisors. What is the value of the first triangle number to have over five hundred divisors? """ def triangle_number_generator(): for n in range(1, 1000000): yield n * (n + 1) // 2 def count_divisors(n): divisors_count = 1 i = 2 while i * i <= n: multiplicity = 0 while n % i == 0: n //= i multiplicity += 1 divisors_count *= multiplicity + 1 i += 1 if n > 1: divisors_count *= 2 return divisors_count def solution(): """Returns the value of the first triangle number to have over five hundred divisors. >>> solution() 76576500 """ return next(i for i in triangle_number_generator() if count_divisors(i) > 500) if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_013/__init__.py ================================================ ================================================ FILE: project_euler/problem_013/num.txt ================================================ 37107287533902102798797998220837590246510135740250 46376937677490009712648124896970078050417018260538 74324986199524741059474233309513058123726617309629 91942213363574161572522430563301811072406154908250 23067588207539346171171980310421047513778063246676 89261670696623633820136378418383684178734361726757 28112879812849979408065481931592621691275889832738 44274228917432520321923589422876796487670272189318 47451445736001306439091167216856844588711603153276 70386486105843025439939619828917593665686757934951 62176457141856560629502157223196586755079324193331 64906352462741904929101432445813822663347944758178 92575867718337217661963751590579239728245598838407 58203565325359399008402633568948830189458628227828 80181199384826282014278194139940567587151170094390 35398664372827112653829987240784473053190104293586 86515506006295864861532075273371959191420517255829 71693888707715466499115593487603532921714970056938 54370070576826684624621495650076471787294438377604 53282654108756828443191190634694037855217779295145 36123272525000296071075082563815656710885258350721 45876576172410976447339110607218265236877223636045 17423706905851860660448207621209813287860733969412 81142660418086830619328460811191061556940512689692 51934325451728388641918047049293215058642563049483 62467221648435076201727918039944693004732956340691 15732444386908125794514089057706229429197107928209 55037687525678773091862540744969844508330393682126 18336384825330154686196124348767681297534375946515 80386287592878490201521685554828717201219257766954 78182833757993103614740356856449095527097864797581 16726320100436897842553539920931837441497806860984 48403098129077791799088218795327364475675590848030 87086987551392711854517078544161852424320693150332 59959406895756536782107074926966537676326235447210 69793950679652694742597709739166693763042633987085 41052684708299085211399427365734116182760315001271 65378607361501080857009149939512557028198746004375 35829035317434717326932123578154982629742552737307 94953759765105305946966067683156574377167401875275 88902802571733229619176668713819931811048770190271 25267680276078003013678680992525463401061632866526 36270218540497705585629946580636237993140746255962 24074486908231174977792365466257246923322810917141 91430288197103288597806669760892938638285025333403 34413065578016127815921815005561868836468420090470 23053081172816430487623791969842487255036638784583 11487696932154902810424020138335124462181441773470 63783299490636259666498587618221225225512486764533 67720186971698544312419572409913959008952310058822 95548255300263520781532296796249481641953868218774 76085327132285723110424803456124867697064507995236 37774242535411291684276865538926205024910326572967 23701913275725675285653248258265463092207058596522 29798860272258331913126375147341994889534765745501 18495701454879288984856827726077713721403798879715 38298203783031473527721580348144513491373226651381 34829543829199918180278916522431027392251122869539 40957953066405232632538044100059654939159879593635 29746152185502371307642255121183693803580388584903 41698116222072977186158236678424689157993532961922 62467957194401269043877107275048102390895523597457 23189706772547915061505504953922979530901129967519 86188088225875314529584099251203829009407770775672 11306739708304724483816533873502340845647058077308 82959174767140363198008187129011875491310547126581 97623331044818386269515456334926366572897563400500 42846280183517070527831839425882145521227251250327 55121603546981200581762165212827652751691296897789 32238195734329339946437501907836945765883352399886 75506164965184775180738168837861091527357929701337 62177842752192623401942399639168044983993173312731 32924185707147349566916674687634660915035914677504 99518671430235219628894890102423325116913619626622 73267460800591547471830798392868535206946944540724 76841822524674417161514036427982273348055556214818 97142617910342598647204516893989422179826088076852 87783646182799346313767754307809363333018982642090 10848802521674670883215120185883543223812876952786 71329612474782464538636993009049310363619763878039 62184073572399794223406235393808339651327408011116 66627891981488087797941876876144230030984490851411 60661826293682836764744779239180335110989069790714 85786944089552990653640447425576083659976645795096 66024396409905389607120198219976047599490197230297 64913982680032973156037120041377903785566085089252 16730939319872750275468906903707539413042652315011 94809377245048795150954100921645863754710598436791 78639167021187492431995700641917969777599028300699 15368713711936614952811305876380278410754449733078 40789923115535562561142322423255033685442488917353 44889911501440648020369068063960672322193204149535 41503128880339536053299340368006977710650566631954 81234880673210146739058568557934581403627822703280 82616570773948327592232845941706525094512325230608 22918802058777319719839450180888072429661980811197 77158542502016545090413245809786882778948721859617 72107838435069186155435662884062257473692284509516 20849603980134001723930671666823555245252804609722 53503534226472524250874054075591789781264330331690 ================================================ FILE: project_euler/problem_013/sol1.py ================================================ """ Problem 13: https://projecteuler.net/problem=13 Problem Statement: Work out the first ten digits of the sum of the following one-hundred 50-digit numbers. """ import os def solution(): """ Returns the first ten digits of the sum of the array elements from the file num.txt >>> solution() '5537376230' """ file_path = os.path.join(os.path.dirname(__file__), "num.txt") with open(file_path) as file_hand: return str(sum(int(line) for line in file_hand))[:10] if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_014/__init__.py ================================================ ================================================ FILE: project_euler/problem_014/sol1.py ================================================ """ Problem 14: https://projecteuler.net/problem=14 Problem Statement: The following iterative sequence is defined for the set of positive integers: n → n/2 (n is even) n → 3n + 1 (n is odd) Using the rule above and starting with 13, we generate the following sequence: 13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1 It can be seen that this sequence (starting at 13 and finishing at 1) contains 10 terms. Although it has not been proved yet (Collatz Problem), it is thought that all starting numbers finish at 1. Which starting number, under one million, produces the longest chain? """ def solution(n: int = 1000000) -> int: """Returns the number under n that generates the longest sequence using the formula: n → n/2 (n is even) n → 3n + 1 (n is odd) >>> solution(1000000) 837799 >>> solution(200) 171 >>> solution(5000) 3711 >>> solution(15000) 13255 """ largest_number = 1 pre_counter = 1 counters = {1: 1} for input1 in range(2, n): counter = 0 number = input1 while True: if number in counters: counter += counters[number] break if number % 2 == 0: number //= 2 counter += 1 else: number = (3 * number) + 1 counter += 1 if input1 not in counters: counters[input1] = counter if counter > pre_counter: largest_number = input1 pre_counter = counter return largest_number if __name__ == "__main__": print(solution(int(input().strip()))) ================================================ FILE: project_euler/problem_014/sol2.py ================================================ """ Problem 14: https://projecteuler.net/problem=14 Collatz conjecture: start with any positive integer n. Next term obtained from the previous term as follows: If the previous term is even, the next term is one half the previous term. If the previous term is odd, the next term is 3 times the previous term plus 1. The conjecture states the sequence will always reach 1 regardless of starting n. Problem Statement: The following iterative sequence is defined for the set of positive integers: n → n/2 (n is even) n → 3n + 1 (n is odd) Using the rule above and starting with 13, we generate the following sequence: 13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1 It can be seen that this sequence (starting at 13 and finishing at 1) contains 10 terms. Although it has not been proved yet (Collatz Problem), it is thought that all starting numbers finish at 1. Which starting number, under one million, produces the longest chain? """ from __future__ import annotations COLLATZ_SEQUENCE_LENGTHS = {1: 1} def collatz_sequence_length(n: int) -> int: """Returns the Collatz sequence length for n.""" if n in COLLATZ_SEQUENCE_LENGTHS: return COLLATZ_SEQUENCE_LENGTHS[n] next_n = n // 2 if n % 2 == 0 else 3 * n + 1 sequence_length = collatz_sequence_length(next_n) + 1 COLLATZ_SEQUENCE_LENGTHS[n] = sequence_length return sequence_length def solution(n: int = 1000000) -> int: """Returns the number under n that generates the longest Collatz sequence. >>> solution(1000000) 837799 >>> solution(200) 171 >>> solution(5000) 3711 >>> solution(15000) 13255 """ result = max((collatz_sequence_length(i), i) for i in range(1, n)) return result[1] if __name__ == "__main__": print(solution(int(input().strip()))) ================================================ FILE: project_euler/problem_015/__init__.py ================================================ ================================================ FILE: project_euler/problem_015/sol1.py ================================================ """ Problem 15: https://projecteuler.net/problem=15 Starting in the top left corner of a 2x2 grid, and only being able to move to the right and down, there are exactly 6 routes to the bottom right corner. How many such routes are there through a 20x20 grid? """ from math import factorial def solution(n: int = 20) -> int: """ Returns the number of paths possible in a n x n grid starting at top left corner going to bottom right corner and being able to move right and down only. >>> solution(25) 126410606437752 >>> solution(23) 8233430727600 >>> solution(20) 137846528820 >>> solution(15) 155117520 >>> solution(1) 2 """ n = 2 * n # middle entry of odd rows starting at row 3 is the solution for n = 1, # 2, 3,... k = n // 2 return int(factorial(n) / (factorial(k) * factorial(n - k))) if __name__ == "__main__": import sys if len(sys.argv) == 1: print(solution(20)) else: try: n = int(sys.argv[1]) print(solution(n)) except ValueError: print("Invalid entry - please enter a number.") ================================================ FILE: project_euler/problem_015/sol2.py ================================================ """ Problem 15: https://projecteuler.net/problem=15 Starting in the top left corner of a 2x2 grid, and only being able to move to the right and down, there are exactly 6 routes to the bottom right corner. How many such routes are there through a 20x20 grid? """ def solution(n: int = 20) -> int: """ Solve by explicitly counting the paths with dynamic programming. >>> solution(6) 924 >>> solution(2) 6 >>> solution(1) 2 """ counts = [[1 for _ in range(n + 1)] for _ in range(n + 1)] for i in range(1, n + 1): for j in range(1, n + 1): counts[i][j] = counts[i - 1][j] + counts[i][j - 1] return counts[n][n] if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_016/__init__.py ================================================ ================================================ FILE: project_euler/problem_016/sol1.py ================================================ """ Problem 16: https://projecteuler.net/problem=16 2^15 = 32768 and the sum of its digits is 3 + 2 + 7 + 6 + 8 = 26. What is the sum of the digits of the number 2^1000? """ def solution(power: int = 1000) -> int: """Returns the sum of the digits of the number 2^power. >>> solution(1000) 1366 >>> solution(50) 76 >>> solution(20) 31 >>> solution(15) 26 """ num = 2**power string_num = str(num) list_num = list(string_num) sum_of_num = 0 for i in list_num: sum_of_num += int(i) return sum_of_num if __name__ == "__main__": power = int(input("Enter the power of 2: ").strip()) print("2 ^ ", power, " = ", 2**power) result = solution(power) print("Sum of the digits is: ", result) ================================================ FILE: project_euler/problem_016/sol2.py ================================================ """ Problem 16: https://projecteuler.net/problem=16 2^15 = 32768 and the sum of its digits is 3 + 2 + 7 + 6 + 8 = 26. What is the sum of the digits of the number 2^1000? """ def solution(power: int = 1000) -> int: """Returns the sum of the digits of the number 2^power. >>> solution(1000) 1366 >>> solution(50) 76 >>> solution(20) 31 >>> solution(15) 26 """ n = 2**power r = 0 while n: r, n = r + n % 10, n // 10 return r if __name__ == "__main__": print(solution(int(str(input()).strip()))) ================================================ FILE: project_euler/problem_017/__init__.py ================================================ ================================================ FILE: project_euler/problem_017/sol1.py ================================================ """ Number letter counts Problem 17: https://projecteuler.net/problem=17 If the numbers 1 to 5 are written out in words: one, two, three, four, five, then there are 3 + 3 + 5 + 4 + 4 = 19 letters used in total. If all the numbers from 1 to 1000 (one thousand) inclusive were written out in words, how many letters would be used? NOTE: Do not count spaces or hyphens. For example, 342 (three hundred and forty-two) contains 23 letters and 115 (one hundred and fifteen) contains 20 letters. The use of "and" when writing out numbers is in compliance withBritish usage. """ def solution(n: int = 1000) -> int: """Returns the number of letters used to write all numbers from 1 to n. where n is lower or equals to 1000. >>> solution(1000) 21124 >>> solution(5) 19 """ # number of letters in zero, one, two, ..., nineteen (0 for zero since it's # never said aloud) ones_counts = [0, 3, 3, 5, 4, 4, 3, 5, 5, 4, 3, 6, 6, 8, 8, 7, 7, 9, 8, 8] # number of letters in twenty, thirty, ..., ninety (0 for numbers less than # 20 due to inconsistency in teens) tens_counts = [0, 0, 6, 6, 5, 5, 5, 7, 6, 6] count = 0 for i in range(1, n + 1): if i < 1000: if i >= 100: # add number of letters for "n hundred" count += ones_counts[i // 100] + 7 if i % 100 != 0: # add number of letters for "and" if number is not multiple # of 100 count += 3 if 0 < i % 100 < 20: # add number of letters for one, two, three, ..., nineteen # (could be combined with below if not for inconsistency in # teens) count += ones_counts[i % 100] else: # add number of letters for twenty, twenty one, ..., ninety # nine count += ones_counts[i % 10] count += tens_counts[(i % 100 - i % 10) // 10] else: count += ones_counts[i // 1000] + 8 return count if __name__ == "__main__": print(solution(int(input().strip()))) ================================================ FILE: project_euler/problem_018/__init__.py ================================================ ================================================ FILE: project_euler/problem_018/solution.py ================================================ """ By starting at the top of the triangle below and moving to adjacent numbers on the row below, the maximum total from top to bottom is 23. 3 7 4 2 4 6 8 5 9 3 That is, 3 + 7 + 4 + 9 = 23. Find the maximum total from top to bottom of the triangle below: 75 95 64 17 47 82 18 35 87 10 20 04 82 47 65 19 01 23 75 03 34 88 02 77 73 07 63 67 99 65 04 28 06 16 70 92 41 41 26 56 83 40 80 70 33 41 48 72 33 47 32 37 16 94 29 53 71 44 65 25 43 91 52 97 51 14 70 11 33 28 77 73 17 78 39 68 17 57 91 71 52 38 17 14 91 43 58 50 27 29 48 63 66 04 68 89 53 67 30 73 16 69 87 40 31 04 62 98 27 23 09 70 98 73 93 38 53 60 04 23 """ import os def solution(): """ Finds the maximum total in a triangle as described by the problem statement above. >>> solution() 1074 """ script_dir = os.path.dirname(os.path.realpath(__file__)) triangle = os.path.join(script_dir, "triangle.txt") with open(triangle) as f: triangle = f.readlines() a = [[int(y) for y in x.rstrip("\r\n").split(" ")] for x in triangle] for i in range(1, len(a)): for j in range(len(a[i])): number1 = a[i - 1][j] if j != len(a[i - 1]) else 0 number2 = a[i - 1][j - 1] if j > 0 else 0 a[i][j] += max(number1, number2) return max(a[-1]) if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_018/triangle.txt ================================================ 75 95 64 17 47 82 18 35 87 10 20 04 82 47 65 19 01 23 75 03 34 88 02 77 73 07 63 67 99 65 04 28 06 16 70 92 41 41 26 56 83 40 80 70 33 41 48 72 33 47 32 37 16 94 29 53 71 44 65 25 43 91 52 97 51 14 70 11 33 28 77 73 17 78 39 68 17 57 91 71 52 38 17 14 91 43 58 50 27 29 48 63 66 04 68 89 53 67 30 73 16 69 87 40 31 04 62 98 27 23 09 70 98 73 93 38 53 60 04 23 ================================================ FILE: project_euler/problem_019/__init__.py ================================================ ================================================ FILE: project_euler/problem_019/sol1.py ================================================ """ Counting Sundays Problem 19 You are given the following information, but you may prefer to do some research for yourself. 1 Jan 1900 was a Monday. Thirty days has September, April, June and November. All the rest have thirty-one, Saving February alone, Which has twenty-eight, rain or shine. And on leap years, twenty-nine. A leap year occurs on any year evenly divisible by 4, but not on a century unless it is divisible by 400. How many Sundays fell on the first of the month during the twentieth century (1 Jan 1901 to 31 Dec 2000)? """ def solution(): """Returns the number of mondays that fall on the first of the month during the twentieth century (1 Jan 1901 to 31 Dec 2000)? >>> solution() 171 """ days_per_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] day = 6 month = 1 year = 1901 sundays = 0 while year < 2001: day += 7 if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0): if day > days_per_month[month - 1] and month != 2: month += 1 day = day - days_per_month[month - 2] elif day > 29 and month == 2: month += 1 day = day - 29 elif day > days_per_month[month - 1]: month += 1 day = day - days_per_month[month - 2] if month > 12: year += 1 month = 1 if year < 2001 and day == 1: sundays += 1 return sundays if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_020/__init__.py ================================================ ================================================ FILE: project_euler/problem_020/sol1.py ================================================ """ Problem 20: https://projecteuler.net/problem=20 n! means n x (n - 1) x ... x 3 x 2 x 1 For example, 10! = 10 x 9 x ... x 3 x 2 x 1 = 3628800, and the sum of the digits in the number 10! is 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27. Find the sum of the digits in the number 100! """ def factorial(num: int) -> int: """Find the factorial of a given number n""" fact = 1 for i in range(1, num + 1): fact *= i return fact def split_and_add(number: int) -> int: """Split number digits and add them.""" sum_of_digits = 0 while number > 0: last_digit = number % 10 sum_of_digits += last_digit number = number // 10 # Removing the last_digit from the given number return sum_of_digits def solution(num: int = 100) -> int: """Returns the sum of the digits in the factorial of num >>> solution(100) 648 >>> solution(50) 216 >>> solution(10) 27 >>> solution(5) 3 >>> solution(3) 6 >>> solution(2) 2 >>> solution(1) 1 """ nfact = factorial(num) result = split_and_add(nfact) return result if __name__ == "__main__": print(solution(int(input("Enter the Number: ").strip()))) ================================================ FILE: project_euler/problem_020/sol2.py ================================================ """ Problem 20: https://projecteuler.net/problem=20 n! means n x (n - 1) x ... x 3 x 2 x 1 For example, 10! = 10 x 9 x ... x 3 x 2 x 1 = 3628800, and the sum of the digits in the number 10! is 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27. Find the sum of the digits in the number 100! """ from math import factorial def solution(num: int = 100) -> int: """Returns the sum of the digits in the factorial of num >>> solution(100) 648 >>> solution(50) 216 >>> solution(10) 27 >>> solution(5) 3 >>> solution(3) 6 >>> solution(2) 2 >>> solution(1) 1 """ return sum(int(x) for x in str(factorial(num))) if __name__ == "__main__": print(solution(int(input("Enter the Number: ").strip()))) ================================================ FILE: project_euler/problem_020/sol3.py ================================================ """ Problem 20: https://projecteuler.net/problem=20 n! means n x (n - 1) x ... x 3 x 2 x 1 For example, 10! = 10 x 9 x ... x 3 x 2 x 1 = 3628800, and the sum of the digits in the number 10! is 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27. Find the sum of the digits in the number 100! """ from math import factorial def solution(num: int = 100) -> int: """Returns the sum of the digits in the factorial of num >>> solution(1000) 10539 >>> solution(200) 1404 >>> solution(100) 648 >>> solution(50) 216 >>> solution(10) 27 >>> solution(5) 3 >>> solution(3) 6 >>> solution(2) 2 >>> solution(1) 1 >>> solution(0) 1 """ return sum(map(int, str(factorial(num)))) if __name__ == "__main__": print(solution(int(input("Enter the Number: ").strip()))) ================================================ FILE: project_euler/problem_020/sol4.py ================================================ """ Problem 20: https://projecteuler.net/problem=20 n! means n x (n - 1) x ... x 3 x 2 x 1 For example, 10! = 10 x 9 x ... x 3 x 2 x 1 = 3628800, and the sum of the digits in the number 10! is 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27. Find the sum of the digits in the number 100! """ def solution(num: int = 100) -> int: """Returns the sum of the digits in the factorial of num >>> solution(100) 648 >>> solution(50) 216 >>> solution(10) 27 >>> solution(5) 3 >>> solution(3) 6 >>> solution(2) 2 >>> solution(1) 1 """ fact = 1 result = 0 for i in range(1, num + 1): fact *= i for j in str(fact): result += int(j) return result if __name__ == "__main__": print(solution(int(input("Enter the Number: ").strip()))) ================================================ FILE: project_euler/problem_021/__init__.py ================================================ ================================================ FILE: project_euler/problem_021/sol1.py ================================================ """ Amicable Numbers Problem 21 Let d(n) be defined as the sum of proper divisors of n (numbers less than n which divide evenly into n). If d(a) = b and d(b) = a, where a ≠ b, then a and b are an amicable pair and each of a and b are called amicable numbers. For example, the proper divisors of 220 are 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 and 110; therefore d(220) = 284. The proper divisors of 284 are 1, 2, 4, 71 and 142; so d(284) = 220. Evaluate the sum of all the amicable numbers under 10000. """ from math import sqrt def sum_of_divisors(n: int) -> int: total = 0 for i in range(1, int(sqrt(n) + 1)): if n % i == 0 and i != sqrt(n): total += i + n // i elif i == sqrt(n): total += i return total - n def solution(n: int = 10000) -> int: """Returns the sum of all the amicable numbers under n. >>> solution(10000) 31626 >>> solution(5000) 8442 >>> solution(1000) 504 >>> solution(100) 0 >>> solution(50) 0 """ total = sum( i for i in range(1, n) if sum_of_divisors(sum_of_divisors(i)) == i and sum_of_divisors(i) != i ) return total if __name__ == "__main__": print(solution(int(str(input()).strip()))) ================================================ FILE: project_euler/problem_022/__init__.py ================================================ ================================================ FILE: project_euler/problem_022/p022_names.txt ================================================ "MARY","PATRICIA","LINDA","BARBARA","ELIZABETH","JENNIFER","MARIA","SUSAN","MARGARET","DOROTHY","LISA","NANCY","KAREN","BETTY","HELEN","SANDRA","DONNA","CAROL","RUTH","SHARON","MICHELLE","LAURA","SARAH","KIMBERLY","DEBORAH","JESSICA","SHIRLEY","CYNTHIA","ANGELA","MELISSA","BRENDA","AMY","ANNA","REBECCA","VIRGINIA","KATHLEEN","PAMELA","MARTHA","DEBRA","AMANDA","STEPHANIE","CAROLYN","CHRISTINE","MARIE","JANET","CATHERINE","FRANCES","ANN","JOYCE","DIANE","ALICE","JULIE","HEATHER","TERESA","DORIS","GLORIA","EVELYN","JEAN","CHERYL","MILDRED","KATHERINE","JOAN","ASHLEY","JUDITH","ROSE","JANICE","KELLY","NICOLE","JUDY","CHRISTINA","KATHY","THERESA","BEVERLY","DENISE","TAMMY","IRENE","JANE","LORI","RACHEL","MARILYN","ANDREA","KATHRYN","LOUISE","SARA","ANNE","JACQUELINE","WANDA","BONNIE","JULIA","RUBY","LOIS","TINA","PHYLLIS","NORMA","PAULA","DIANA","ANNIE","LILLIAN","EMILY","ROBIN","PEGGY","CRYSTAL","GLADYS","RITA","DAWN","CONNIE","FLORENCE","TRACY","EDNA","TIFFANY","CARMEN","ROSA","CINDY","GRACE","WENDY","VICTORIA","EDITH","KIM","SHERRY","SYLVIA","JOSEPHINE","THELMA","SHANNON","SHEILA","ETHEL","ELLEN","ELAINE","MARJORIE","CARRIE","CHARLOTTE","MONICA","ESTHER","PAULINE","EMMA","JUANITA","ANITA","RHONDA","HAZEL","AMBER","EVA","DEBBIE","APRIL","LESLIE","CLARA","LUCILLE","JAMIE","JOANNE","ELEANOR","VALERIE","DANIELLE","MEGAN","ALICIA","SUZANNE","MICHELE","GAIL","BERTHA","DARLENE","VERONICA","JILL","ERIN","GERALDINE","LAUREN","CATHY","JOANN","LORRAINE","LYNN","SALLY","REGINA","ERICA","BEATRICE","DOLORES","BERNICE","AUDREY","YVONNE","ANNETTE","JUNE","SAMANTHA","MARION","DANA","STACY","ANA","RENEE","IDA","VIVIAN","ROBERTA","HOLLY","BRITTANY","MELANIE","LORETTA","YOLANDA","JEANETTE","LAURIE","KATIE","KRISTEN","VANESSA","ALMA","SUE","ELSIE","BETH","JEANNE","VICKI","CARLA","TARA","ROSEMARY","EILEEN","TERRI","GERTRUDE","LUCY","TONYA","ELLA","STACEY","WILMA","GINA","KRISTIN","JESSIE","NATALIE","AGNES","VERA","WILLIE","CHARLENE","BESSIE","DELORES","MELINDA","PEARL","ARLENE","MAUREEN","COLLEEN","ALLISON","TAMARA","JOY","GEORGIA","CONSTANCE","LILLIE","CLAUDIA","JACKIE","MARCIA","TANYA","NELLIE","MINNIE","MARLENE","HEIDI","GLENDA","LYDIA","VIOLA","COURTNEY","MARIAN","STELLA","CAROLINE","DORA","JO","VICKIE","MATTIE","TERRY","MAXINE","IRMA","MABEL","MARSHA","MYRTLE","LENA","CHRISTY","DEANNA","PATSY","HILDA","GWENDOLYN","JENNIE","NORA","MARGIE","NINA","CASSANDRA","LEAH","PENNY","KAY","PRISCILLA","NAOMI","CAROLE","BRANDY","OLGA","BILLIE","DIANNE","TRACEY","LEONA","JENNY","FELICIA","SONIA","MIRIAM","VELMA","BECKY","BOBBIE","VIOLET","KRISTINA","TONI","MISTY","MAE","SHELLY","DAISY","RAMONA","SHERRI","ERIKA","KATRINA","CLAIRE","LINDSEY","LINDSAY","GENEVA","GUADALUPE","BELINDA","MARGARITA","SHERYL","CORA","FAYE","ADA","NATASHA","SABRINA","ISABEL","MARGUERITE","HATTIE","HARRIET","MOLLY","CECILIA","KRISTI","BRANDI","BLANCHE","SANDY","ROSIE","JOANNA","IRIS","EUNICE","ANGIE","INEZ","LYNDA","MADELINE","AMELIA","ALBERTA","GENEVIEVE","MONIQUE","JODI","JANIE","MAGGIE","KAYLA","SONYA","JAN","LEE","KRISTINE","CANDACE","FANNIE","MARYANN","OPAL","ALISON","YVETTE","MELODY","LUZ","SUSIE","OLIVIA","FLORA","SHELLEY","KRISTY","MAMIE","LULA","LOLA","VERNA","BEULAH","ANTOINETTE","CANDICE","JUANA","JEANNETTE","PAM","KELLI","HANNAH","WHITNEY","BRIDGET","KARLA","CELIA","LATOYA","PATTY","SHELIA","GAYLE","DELLA","VICKY","LYNNE","SHERI","MARIANNE","KARA","JACQUELYN","ERMA","BLANCA","MYRA","LETICIA","PAT","KRISTA","ROXANNE","ANGELICA","JOHNNIE","ROBYN","FRANCIS","ADRIENNE","ROSALIE","ALEXANDRA","BROOKE","BETHANY","SADIE","BERNADETTE","TRACI","JODY","KENDRA","JASMINE","NICHOLE","RACHAEL","CHELSEA","MABLE","ERNESTINE","MURIEL","MARCELLA","ELENA","KRYSTAL","ANGELINA","NADINE","KARI","ESTELLE","DIANNA","PAULETTE","LORA","MONA","DOREEN","ROSEMARIE","ANGEL","DESIREE","ANTONIA","HOPE","GINGER","JANIS","BETSY","CHRISTIE","FREDA","MERCEDES","MEREDITH","LYNETTE","TERI","CRISTINA","EULA","LEIGH","MEGHAN","SOPHIA","ELOISE","ROCHELLE","GRETCHEN","CECELIA","RAQUEL","HENRIETTA","ALYSSA","JANA","KELLEY","GWEN","KERRY","JENNA","TRICIA","LAVERNE","OLIVE","ALEXIS","TASHA","SILVIA","ELVIRA","CASEY","DELIA","SOPHIE","KATE","PATTI","LORENA","KELLIE","SONJA","LILA","LANA","DARLA","MAY","MINDY","ESSIE","MANDY","LORENE","ELSA","JOSEFINA","JEANNIE","MIRANDA","DIXIE","LUCIA","MARTA","FAITH","LELA","JOHANNA","SHARI","CAMILLE","TAMI","SHAWNA","ELISA","EBONY","MELBA","ORA","NETTIE","TABITHA","OLLIE","JAIME","WINIFRED","KRISTIE","MARINA","ALISHA","AIMEE","RENA","MYRNA","MARLA","TAMMIE","LATASHA","BONITA","PATRICE","RONDA","SHERRIE","ADDIE","FRANCINE","DELORIS","STACIE","ADRIANA","CHERI","SHELBY","ABIGAIL","CELESTE","JEWEL","CARA","ADELE","REBEKAH","LUCINDA","DORTHY","CHRIS","EFFIE","TRINA","REBA","SHAWN","SALLIE","AURORA","LENORA","ETTA","LOTTIE","KERRI","TRISHA","NIKKI","ESTELLA","FRANCISCA","JOSIE","TRACIE","MARISSA","KARIN","BRITTNEY","JANELLE","LOURDES","LAUREL","HELENE","FERN","ELVA","CORINNE","KELSEY","INA","BETTIE","ELISABETH","AIDA","CAITLIN","INGRID","IVA","EUGENIA","CHRISTA","GOLDIE","CASSIE","MAUDE","JENIFER","THERESE","FRANKIE","DENA","LORNA","JANETTE","LATONYA","CANDY","MORGAN","CONSUELO","TAMIKA","ROSETTA","DEBORA","CHERIE","POLLY","DINA","JEWELL","FAY","JILLIAN","DOROTHEA","NELL","TRUDY","ESPERANZA","PATRICA","KIMBERLEY","SHANNA","HELENA","CAROLINA","CLEO","STEFANIE","ROSARIO","OLA","JANINE","MOLLIE","LUPE","ALISA","LOU","MARIBEL","SUSANNE","BETTE","SUSANA","ELISE","CECILE","ISABELLE","LESLEY","JOCELYN","PAIGE","JONI","RACHELLE","LEOLA","DAPHNE","ALTA","ESTER","PETRA","GRACIELA","IMOGENE","JOLENE","KEISHA","LACEY","GLENNA","GABRIELA","KERI","URSULA","LIZZIE","KIRSTEN","SHANA","ADELINE","MAYRA","JAYNE","JACLYN","GRACIE","SONDRA","CARMELA","MARISA","ROSALIND","CHARITY","TONIA","BEATRIZ","MARISOL","CLARICE","JEANINE","SHEENA","ANGELINE","FRIEDA","LILY","ROBBIE","SHAUNA","MILLIE","CLAUDETTE","CATHLEEN","ANGELIA","GABRIELLE","AUTUMN","KATHARINE","SUMMER","JODIE","STACI","LEA","CHRISTI","JIMMIE","JUSTINE","ELMA","LUELLA","MARGRET","DOMINIQUE","SOCORRO","RENE","MARTINA","MARGO","MAVIS","CALLIE","BOBBI","MARITZA","LUCILE","LEANNE","JEANNINE","DEANA","AILEEN","LORIE","LADONNA","WILLA","MANUELA","GALE","SELMA","DOLLY","SYBIL","ABBY","LARA","DALE","IVY","DEE","WINNIE","MARCY","LUISA","JERI","MAGDALENA","OFELIA","MEAGAN","AUDRA","MATILDA","LEILA","CORNELIA","BIANCA","SIMONE","BETTYE","RANDI","VIRGIE","LATISHA","BARBRA","GEORGINA","ELIZA","LEANN","BRIDGETTE","RHODA","HALEY","ADELA","NOLA","BERNADINE","FLOSSIE","ILA","GRETA","RUTHIE","NELDA","MINERVA","LILLY","TERRIE","LETHA","HILARY","ESTELA","VALARIE","BRIANNA","ROSALYN","EARLINE","CATALINA","AVA","MIA","CLARISSA","LIDIA","CORRINE","ALEXANDRIA","CONCEPCION","TIA","SHARRON","RAE","DONA","ERICKA","JAMI","ELNORA","CHANDRA","LENORE","NEVA","MARYLOU","MELISA","TABATHA","SERENA","AVIS","ALLIE","SOFIA","JEANIE","ODESSA","NANNIE","HARRIETT","LORAINE","PENELOPE","MILAGROS","EMILIA","BENITA","ALLYSON","ASHLEE","TANIA","TOMMIE","ESMERALDA","KARINA","EVE","PEARLIE","ZELMA","MALINDA","NOREEN","TAMEKA","SAUNDRA","HILLARY","AMIE","ALTHEA","ROSALINDA","JORDAN","LILIA","ALANA","GAY","CLARE","ALEJANDRA","ELINOR","MICHAEL","LORRIE","JERRI","DARCY","EARNESTINE","CARMELLA","TAYLOR","NOEMI","MARCIE","LIZA","ANNABELLE","LOUISA","EARLENE","MALLORY","CARLENE","NITA","SELENA","TANISHA","KATY","JULIANNE","JOHN","LAKISHA","EDWINA","MARICELA","MARGERY","KENYA","DOLLIE","ROXIE","ROSLYN","KATHRINE","NANETTE","CHARMAINE","LAVONNE","ILENE","KRIS","TAMMI","SUZETTE","CORINE","KAYE","JERRY","MERLE","CHRYSTAL","LINA","DEANNE","LILIAN","JULIANA","ALINE","LUANN","KASEY","MARYANNE","EVANGELINE","COLETTE","MELVA","LAWANDA","YESENIA","NADIA","MADGE","KATHIE","EDDIE","OPHELIA","VALERIA","NONA","MITZI","MARI","GEORGETTE","CLAUDINE","FRAN","ALISSA","ROSEANN","LAKEISHA","SUSANNA","REVA","DEIDRE","CHASITY","SHEREE","CARLY","JAMES","ELVIA","ALYCE","DEIRDRE","GENA","BRIANA","ARACELI","KATELYN","ROSANNE","WENDI","TESSA","BERTA","MARVA","IMELDA","MARIETTA","MARCI","LEONOR","ARLINE","SASHA","MADELYN","JANNA","JULIETTE","DEENA","AURELIA","JOSEFA","AUGUSTA","LILIANA","YOUNG","CHRISTIAN","LESSIE","AMALIA","SAVANNAH","ANASTASIA","VILMA","NATALIA","ROSELLA","LYNNETTE","CORINA","ALFREDA","LEANNA","CAREY","AMPARO","COLEEN","TAMRA","AISHA","WILDA","KARYN","CHERRY","QUEEN","MAURA","MAI","EVANGELINA","ROSANNA","HALLIE","ERNA","ENID","MARIANA","LACY","JULIET","JACKLYN","FREIDA","MADELEINE","MARA","HESTER","CATHRYN","LELIA","CASANDRA","BRIDGETT","ANGELITA","JANNIE","DIONNE","ANNMARIE","KATINA","BERYL","PHOEBE","MILLICENT","KATHERYN","DIANN","CARISSA","MARYELLEN","LIZ","LAURI","HELGA","GILDA","ADRIAN","RHEA","MARQUITA","HOLLIE","TISHA","TAMERA","ANGELIQUE","FRANCESCA","BRITNEY","KAITLIN","LOLITA","FLORINE","ROWENA","REYNA","TWILA","FANNY","JANELL","INES","CONCETTA","BERTIE","ALBA","BRIGITTE","ALYSON","VONDA","PANSY","ELBA","NOELLE","LETITIA","KITTY","DEANN","BRANDIE","LOUELLA","LETA","FELECIA","SHARLENE","LESA","BEVERLEY","ROBERT","ISABELLA","HERMINIA","TERRA","CELINA","TORI","OCTAVIA","JADE","DENICE","GERMAINE","SIERRA","MICHELL","CORTNEY","NELLY","DORETHA","SYDNEY","DEIDRA","MONIKA","LASHONDA","JUDI","CHELSEY","ANTIONETTE","MARGOT","BOBBY","ADELAIDE","NAN","LEEANN","ELISHA","DESSIE","LIBBY","KATHI","GAYLA","LATANYA","MINA","MELLISA","KIMBERLEE","JASMIN","RENAE","ZELDA","ELDA","MA","JUSTINA","GUSSIE","EMILIE","CAMILLA","ABBIE","ROCIO","KAITLYN","JESSE","EDYTHE","ASHLEIGH","SELINA","LAKESHA","GERI","ALLENE","PAMALA","MICHAELA","DAYNA","CARYN","ROSALIA","SUN","JACQULINE","REBECA","MARYBETH","KRYSTLE","IOLA","DOTTIE","BENNIE","BELLE","AUBREY","GRISELDA","ERNESTINA","ELIDA","ADRIANNE","DEMETRIA","DELMA","CHONG","JAQUELINE","DESTINY","ARLEEN","VIRGINA","RETHA","FATIMA","TILLIE","ELEANORE","CARI","TREVA","BIRDIE","WILHELMINA","ROSALEE","MAURINE","LATRICE","YONG","JENA","TARYN","ELIA","DEBBY","MAUDIE","JEANNA","DELILAH","CATRINA","SHONDA","HORTENCIA","THEODORA","TERESITA","ROBBIN","DANETTE","MARYJANE","FREDDIE","DELPHINE","BRIANNE","NILDA","DANNA","CINDI","BESS","IONA","HANNA","ARIEL","WINONA","VIDA","ROSITA","MARIANNA","WILLIAM","RACHEAL","GUILLERMINA","ELOISA","CELESTINE","CAREN","MALISSA","LONA","CHANTEL","SHELLIE","MARISELA","LEORA","AGATHA","SOLEDAD","MIGDALIA","IVETTE","CHRISTEN","ATHENA","JANEL","CHLOE","VEDA","PATTIE","TESSIE","TERA","MARILYNN","LUCRETIA","KARRIE","DINAH","DANIELA","ALECIA","ADELINA","VERNICE","SHIELA","PORTIA","MERRY","LASHAWN","DEVON","DARA","TAWANA","OMA","VERDA","CHRISTIN","ALENE","ZELLA","SANDI","RAFAELA","MAYA","KIRA","CANDIDA","ALVINA","SUZAN","SHAYLA","LYN","LETTIE","ALVA","SAMATHA","ORALIA","MATILDE","MADONNA","LARISSA","VESTA","RENITA","INDIA","DELOIS","SHANDA","PHILLIS","LORRI","ERLINDA","CRUZ","CATHRINE","BARB","ZOE","ISABELL","IONE","GISELA","CHARLIE","VALENCIA","ROXANNA","MAYME","KISHA","ELLIE","MELLISSA","DORRIS","DALIA","BELLA","ANNETTA","ZOILA","RETA","REINA","LAURETTA","KYLIE","CHRISTAL","PILAR","CHARLA","ELISSA","TIFFANI","TANA","PAULINA","LEOTA","BREANNA","JAYME","CARMEL","VERNELL","TOMASA","MANDI","DOMINGA","SANTA","MELODIE","LURA","ALEXA","TAMELA","RYAN","MIRNA","KERRIE","VENUS","NOEL","FELICITA","CRISTY","CARMELITA","BERNIECE","ANNEMARIE","TIARA","ROSEANNE","MISSY","CORI","ROXANA","PRICILLA","KRISTAL","JUNG","ELYSE","HAYDEE","ALETHA","BETTINA","MARGE","GILLIAN","FILOMENA","CHARLES","ZENAIDA","HARRIETTE","CARIDAD","VADA","UNA","ARETHA","PEARLINE","MARJORY","MARCELA","FLOR","EVETTE","ELOUISE","ALINA","TRINIDAD","DAVID","DAMARIS","CATHARINE","CARROLL","BELVA","NAKIA","MARLENA","LUANNE","LORINE","KARON","DORENE","DANITA","BRENNA","TATIANA","SAMMIE","LOUANN","LOREN","JULIANNA","ANDRIA","PHILOMENA","LUCILA","LEONORA","DOVIE","ROMONA","MIMI","JACQUELIN","GAYE","TONJA","MISTI","JOE","GENE","CHASTITY","STACIA","ROXANN","MICAELA","NIKITA","MEI","VELDA","MARLYS","JOHNNA","AURA","LAVERN","IVONNE","HAYLEY","NICKI","MAJORIE","HERLINDA","GEORGE","ALPHA","YADIRA","PERLA","GREGORIA","DANIEL","ANTONETTE","SHELLI","MOZELLE","MARIAH","JOELLE","CORDELIA","JOSETTE","CHIQUITA","TRISTA","LOUIS","LAQUITA","GEORGIANA","CANDI","SHANON","LONNIE","HILDEGARD","CECIL","VALENTINA","STEPHANY","MAGDA","KAROL","GERRY","GABRIELLA","TIANA","ROMA","RICHELLE","RAY","PRINCESS","OLETA","JACQUE","IDELLA","ALAINA","SUZANNA","JOVITA","BLAIR","TOSHA","RAVEN","NEREIDA","MARLYN","KYLA","JOSEPH","DELFINA","TENA","STEPHENIE","SABINA","NATHALIE","MARCELLE","GERTIE","DARLEEN","THEA","SHARONDA","SHANTEL","BELEN","VENESSA","ROSALINA","ONA","GENOVEVA","COREY","CLEMENTINE","ROSALBA","RENATE","RENATA","MI","IVORY","GEORGIANNA","FLOY","DORCAS","ARIANA","TYRA","THEDA","MARIAM","JULI","JESICA","DONNIE","VIKKI","VERLA","ROSELYN","MELVINA","JANNETTE","GINNY","DEBRAH","CORRIE","ASIA","VIOLETA","MYRTIS","LATRICIA","COLLETTE","CHARLEEN","ANISSA","VIVIANA","TWYLA","PRECIOUS","NEDRA","LATONIA","LAN","HELLEN","FABIOLA","ANNAMARIE","ADELL","SHARYN","CHANTAL","NIKI","MAUD","LIZETTE","LINDY","KIA","KESHA","JEANA","DANELLE","CHARLINE","CHANEL","CARROL","VALORIE","LIA","DORTHA","CRISTAL","SUNNY","LEONE","LEILANI","GERRI","DEBI","ANDRA","KESHIA","IMA","EULALIA","EASTER","DULCE","NATIVIDAD","LINNIE","KAMI","GEORGIE","CATINA","BROOK","ALDA","WINNIFRED","SHARLA","RUTHANN","MEAGHAN","MAGDALENE","LISSETTE","ADELAIDA","VENITA","TRENA","SHIRLENE","SHAMEKA","ELIZEBETH","DIAN","SHANTA","MICKEY","LATOSHA","CARLOTTA","WINDY","SOON","ROSINA","MARIANN","LEISA","JONNIE","DAWNA","CATHIE","BILLY","ASTRID","SIDNEY","LAUREEN","JANEEN","HOLLI","FAWN","VICKEY","TERESSA","SHANTE","RUBYE","MARCELINA","CHANDA","CARY","TERESE","SCARLETT","MARTY","MARNIE","LULU","LISETTE","JENIFFER","ELENOR","DORINDA","DONITA","CARMAN","BERNITA","ALTAGRACIA","ALETA","ADRIANNA","ZORAIDA","RONNIE","NICOLA","LYNDSEY","KENDALL","JANINA","CHRISSY","AMI","STARLA","PHYLIS","PHUONG","KYRA","CHARISSE","BLANCH","SANJUANITA","RONA","NANCI","MARILEE","MARANDA","CORY","BRIGETTE","SANJUANA","MARITA","KASSANDRA","JOYCELYN","IRA","FELIPA","CHELSIE","BONNY","MIREYA","LORENZA","KYONG","ILEANA","CANDELARIA","TONY","TOBY","SHERIE","OK","MARK","LUCIE","LEATRICE","LAKESHIA","GERDA","EDIE","BAMBI","MARYLIN","LAVON","HORTENSE","GARNET","EVIE","TRESSA","SHAYNA","LAVINA","KYUNG","JEANETTA","SHERRILL","SHARA","PHYLISS","MITTIE","ANABEL","ALESIA","THUY","TAWANDA","RICHARD","JOANIE","TIFFANIE","LASHANDA","KARISSA","ENRIQUETA","DARIA","DANIELLA","CORINNA","ALANNA","ABBEY","ROXANE","ROSEANNA","MAGNOLIA","LIDA","KYLE","JOELLEN","ERA","CORAL","CARLEEN","TRESA","PEGGIE","NOVELLA","NILA","MAYBELLE","JENELLE","CARINA","NOVA","MELINA","MARQUERITE","MARGARETTE","JOSEPHINA","EVONNE","DEVIN","CINTHIA","ALBINA","TOYA","TAWNYA","SHERITA","SANTOS","MYRIAM","LIZABETH","LISE","KEELY","JENNI","GISELLE","CHERYLE","ARDITH","ARDIS","ALESHA","ADRIANE","SHAINA","LINNEA","KAROLYN","HONG","FLORIDA","FELISHA","DORI","DARCI","ARTIE","ARMIDA","ZOLA","XIOMARA","VERGIE","SHAMIKA","NENA","NANNETTE","MAXIE","LOVIE","JEANE","JAIMIE","INGE","FARRAH","ELAINA","CAITLYN","STARR","FELICITAS","CHERLY","CARYL","YOLONDA","YASMIN","TEENA","PRUDENCE","PENNIE","NYDIA","MACKENZIE","ORPHA","MARVEL","LIZBETH","LAURETTE","JERRIE","HERMELINDA","CAROLEE","TIERRA","MIRIAN","META","MELONY","KORI","JENNETTE","JAMILA","ENA","ANH","YOSHIKO","SUSANNAH","SALINA","RHIANNON","JOLEEN","CRISTINE","ASHTON","ARACELY","TOMEKA","SHALONDA","MARTI","LACIE","KALA","JADA","ILSE","HAILEY","BRITTANI","ZONA","SYBLE","SHERRYL","RANDY","NIDIA","MARLO","KANDICE","KANDI","DEB","DEAN","AMERICA","ALYCIA","TOMMY","RONNA","NORENE","MERCY","JOSE","INGEBORG","GIOVANNA","GEMMA","CHRISTEL","AUDRY","ZORA","VITA","VAN","TRISH","STEPHAINE","SHIRLEE","SHANIKA","MELONIE","MAZIE","JAZMIN","INGA","HOA","HETTIE","GERALYN","FONDA","ESTRELLA","ADELLA","SU","SARITA","RINA","MILISSA","MARIBETH","GOLDA","EVON","ETHELYN","ENEDINA","CHERISE","CHANA","VELVA","TAWANNA","SADE","MIRTA","LI","KARIE","JACINTA","ELNA","DAVINA","CIERRA","ASHLIE","ALBERTHA","TANESHA","STEPHANI","NELLE","MINDI","LU","LORINDA","LARUE","FLORENE","DEMETRA","DEDRA","CIARA","CHANTELLE","ASHLY","SUZY","ROSALVA","NOELIA","LYDA","LEATHA","KRYSTYNA","KRISTAN","KARRI","DARLINE","DARCIE","CINDA","CHEYENNE","CHERRIE","AWILDA","ALMEDA","ROLANDA","LANETTE","JERILYN","GISELE","EVALYN","CYNDI","CLETA","CARIN","ZINA","ZENA","VELIA","TANIKA","PAUL","CHARISSA","THOMAS","TALIA","MARGARETE","LAVONDA","KAYLEE","KATHLENE","JONNA","IRENA","ILONA","IDALIA","CANDIS","CANDANCE","BRANDEE","ANITRA","ALIDA","SIGRID","NICOLETTE","MARYJO","LINETTE","HEDWIG","CHRISTIANA","CASSIDY","ALEXIA","TRESSIE","MODESTA","LUPITA","LITA","GLADIS","EVELIA","DAVIDA","CHERRI","CECILY","ASHELY","ANNABEL","AGUSTINA","WANITA","SHIRLY","ROSAURA","HULDA","EUN","BAILEY","YETTA","VERONA","THOMASINA","SIBYL","SHANNAN","MECHELLE","LUE","LEANDRA","LANI","KYLEE","KANDY","JOLYNN","FERNE","EBONI","CORENE","ALYSIA","ZULA","NADA","MOIRA","LYNDSAY","LORRETTA","JUAN","JAMMIE","HORTENSIA","GAYNELL","CAMERON","ADRIA","VINA","VICENTA","TANGELA","STEPHINE","NORINE","NELLA","LIANA","LESLEE","KIMBERELY","ILIANA","GLORY","FELICA","EMOGENE","ELFRIEDE","EDEN","EARTHA","CARMA","BEA","OCIE","MARRY","LENNIE","KIARA","JACALYN","CARLOTA","ARIELLE","YU","STAR","OTILIA","KIRSTIN","KACEY","JOHNETTA","JOEY","JOETTA","JERALDINE","JAUNITA","ELANA","DORTHEA","CAMI","AMADA","ADELIA","VERNITA","TAMAR","SIOBHAN","RENEA","RASHIDA","OUIDA","ODELL","NILSA","MERYL","KRISTYN","JULIETA","DANICA","BREANNE","AUREA","ANGLEA","SHERRON","ODETTE","MALIA","LORELEI","LIN","LEESA","KENNA","KATHLYN","FIONA","CHARLETTE","SUZIE","SHANTELL","SABRA","RACQUEL","MYONG","MIRA","MARTINE","LUCIENNE","LAVADA","JULIANN","JOHNIE","ELVERA","DELPHIA","CLAIR","CHRISTIANE","CHAROLETTE","CARRI","AUGUSTINE","ASHA","ANGELLA","PAOLA","NINFA","LEDA","LAI","EDA","SUNSHINE","STEFANI","SHANELL","PALMA","MACHELLE","LISSA","KECIA","KATHRYNE","KARLENE","JULISSA","JETTIE","JENNIFFER","HUI","CORRINA","CHRISTOPHER","CAROLANN","ALENA","TESS","ROSARIA","MYRTICE","MARYLEE","LIANE","KENYATTA","JUDIE","JANEY","IN","ELMIRA","ELDORA","DENNA","CRISTI","CATHI","ZAIDA","VONNIE","VIVA","VERNIE","ROSALINE","MARIELA","LUCIANA","LESLI","KARAN","FELICE","DENEEN","ADINA","WYNONA","TARSHA","SHERON","SHASTA","SHANITA","SHANI","SHANDRA","RANDA","PINKIE","PARIS","NELIDA","MARILOU","LYLA","LAURENE","LACI","JOI","JANENE","DOROTHA","DANIELE","DANI","CAROLYNN","CARLYN","BERENICE","AYESHA","ANNELIESE","ALETHEA","THERSA","TAMIKO","RUFINA","OLIVA","MOZELL","MARYLYN","MADISON","KRISTIAN","KATHYRN","KASANDRA","KANDACE","JANAE","GABRIEL","DOMENICA","DEBBRA","DANNIELLE","CHUN","BUFFY","BARBIE","ARCELIA","AJA","ZENOBIA","SHAREN","SHAREE","PATRICK","PAGE","MY","LAVINIA","KUM","KACIE","JACKELINE","HUONG","FELISA","EMELIA","ELEANORA","CYTHIA","CRISTIN","CLYDE","CLARIBEL","CARON","ANASTACIA","ZULMA","ZANDRA","YOKO","TENISHA","SUSANN","SHERILYN","SHAY","SHAWANDA","SABINE","ROMANA","MATHILDA","LINSEY","KEIKO","JOANA","ISELA","GRETTA","GEORGETTA","EUGENIE","DUSTY","DESIRAE","DELORA","CORAZON","ANTONINA","ANIKA","WILLENE","TRACEE","TAMATHA","REGAN","NICHELLE","MICKIE","MAEGAN","LUANA","LANITA","KELSIE","EDELMIRA","BREE","AFTON","TEODORA","TAMIE","SHENA","MEG","LINH","KELI","KACI","DANYELLE","BRITT","ARLETTE","ALBERTINE","ADELLE","TIFFINY","STORMY","SIMONA","NUMBERS","NICOLASA","NICHOL","NIA","NAKISHA","MEE","MAIRA","LOREEN","KIZZY","JOHNNY","JAY","FALLON","CHRISTENE","BOBBYE","ANTHONY","YING","VINCENZA","TANJA","RUBIE","RONI","QUEENIE","MARGARETT","KIMBERLI","IRMGARD","IDELL","HILMA","EVELINA","ESTA","EMILEE","DENNISE","DANIA","CARL","CARIE","ANTONIO","WAI","SANG","RISA","RIKKI","PARTICIA","MUI","MASAKO","MARIO","LUVENIA","LOREE","LONI","LIEN","KEVIN","GIGI","FLORENCIA","DORIAN","DENITA","DALLAS","CHI","BILLYE","ALEXANDER","TOMIKA","SHARITA","RANA","NIKOLE","NEOMA","MARGARITE","MADALYN","LUCINA","LAILA","KALI","JENETTE","GABRIELE","EVELYNE","ELENORA","CLEMENTINA","ALEJANDRINA","ZULEMA","VIOLETTE","VANNESSA","THRESA","RETTA","PIA","PATIENCE","NOELLA","NICKIE","JONELL","DELTA","CHUNG","CHAYA","CAMELIA","BETHEL","ANYA","ANDREW","THANH","SUZANN","SPRING","SHU","MILA","LILLA","LAVERNA","KEESHA","KATTIE","GIA","GEORGENE","EVELINE","ESTELL","ELIZBETH","VIVIENNE","VALLIE","TRUDIE","STEPHANE","MICHEL","MAGALY","MADIE","KENYETTA","KARREN","JANETTA","HERMINE","HARMONY","DRUCILLA","DEBBI","CELESTINA","CANDIE","BRITNI","BECKIE","AMINA","ZITA","YUN","YOLANDE","VIVIEN","VERNETTA","TRUDI","SOMMER","PEARLE","PATRINA","OSSIE","NICOLLE","LOYCE","LETTY","LARISA","KATHARINA","JOSELYN","JONELLE","JENELL","IESHA","HEIDE","FLORINDA","FLORENTINA","FLO","ELODIA","DORINE","BRUNILDA","BRIGID","ASHLI","ARDELLA","TWANA","THU","TARAH","SUNG","SHEA","SHAVON","SHANE","SERINA","RAYNA","RAMONITA","NGA","MARGURITE","LUCRECIA","KOURTNEY","KATI","JESUS","JESENIA","DIAMOND","CRISTA","AYANA","ALICA","ALIA","VINNIE","SUELLEN","ROMELIA","RACHELL","PIPER","OLYMPIA","MICHIKO","KATHALEEN","JOLIE","JESSI","JANESSA","HANA","HA","ELEASE","CARLETTA","BRITANY","SHONA","SALOME","ROSAMOND","REGENA","RAINA","NGOC","NELIA","LOUVENIA","LESIA","LATRINA","LATICIA","LARHONDA","JINA","JACKI","HOLLIS","HOLLEY","EMMY","DEEANN","CORETTA","ARNETTA","VELVET","THALIA","SHANICE","NETA","MIKKI","MICKI","LONNA","LEANA","LASHUNDA","KILEY","JOYE","JACQULYN","IGNACIA","HYUN","HIROKO","HENRY","HENRIETTE","ELAYNE","DELINDA","DARNELL","DAHLIA","COREEN","CONSUELA","CONCHITA","CELINE","BABETTE","AYANNA","ANETTE","ALBERTINA","SKYE","SHAWNEE","SHANEKA","QUIANA","PAMELIA","MIN","MERRI","MERLENE","MARGIT","KIESHA","KIERA","KAYLENE","JODEE","JENISE","ERLENE","EMMIE","ELSE","DARYL","DALILA","DAISEY","CODY","CASIE","BELIA","BABARA","VERSIE","VANESA","SHELBA","SHAWNDA","SAM","NORMAN","NIKIA","NAOMA","MARNA","MARGERET","MADALINE","LAWANA","KINDRA","JUTTA","JAZMINE","JANETT","HANNELORE","GLENDORA","GERTRUD","GARNETT","FREEDA","FREDERICA","FLORANCE","FLAVIA","DENNIS","CARLINE","BEVERLEE","ANJANETTE","VALDA","TRINITY","TAMALA","STEVIE","SHONNA","SHA","SARINA","ONEIDA","MICAH","MERILYN","MARLEEN","LURLINE","LENNA","KATHERIN","JIN","JENI","HAE","GRACIA","GLADY","FARAH","ERIC","ENOLA","EMA","DOMINQUE","DEVONA","DELANA","CECILA","CAPRICE","ALYSHA","ALI","ALETHIA","VENA","THERESIA","TAWNY","SONG","SHAKIRA","SAMARA","SACHIKO","RACHELE","PAMELLA","NICKY","MARNI","MARIEL","MAREN","MALISA","LIGIA","LERA","LATORIA","LARAE","KIMBER","KATHERN","KAREY","JENNEFER","JANETH","HALINA","FREDIA","DELISA","DEBROAH","CIERA","CHIN","ANGELIKA","ANDREE","ALTHA","YEN","VIVAN","TERRESA","TANNA","SUK","SUDIE","SOO","SIGNE","SALENA","RONNI","REBBECCA","MYRTIE","MCKENZIE","MALIKA","MAIDA","LOAN","LEONARDA","KAYLEIGH","FRANCE","ETHYL","ELLYN","DAYLE","CAMMIE","BRITTNI","BIRGIT","AVELINA","ASUNCION","ARIANNA","AKIKO","VENICE","TYESHA","TONIE","TIESHA","TAKISHA","STEFFANIE","SINDY","SANTANA","MEGHANN","MANDA","MACIE","LADY","KELLYE","KELLEE","JOSLYN","JASON","INGER","INDIRA","GLINDA","GLENNIS","FERNANDA","FAUSTINA","ENEIDA","ELICIA","DOT","DIGNA","DELL","ARLETTA","ANDRE","WILLIA","TAMMARA","TABETHA","SHERRELL","SARI","REFUGIO","REBBECA","PAULETTA","NIEVES","NATOSHA","NAKITA","MAMMIE","KENISHA","KAZUKO","KASSIE","GARY","EARLEAN","DAPHINE","CORLISS","CLOTILDE","CAROLYNE","BERNETTA","AUGUSTINA","AUDREA","ANNIS","ANNABELL","YAN","TENNILLE","TAMICA","SELENE","SEAN","ROSANA","REGENIA","QIANA","MARKITA","MACY","LEEANNE","LAURINE","KYM","JESSENIA","JANITA","GEORGINE","GENIE","EMIKO","ELVIE","DEANDRA","DAGMAR","CORIE","COLLEN","CHERISH","ROMAINE","PORSHA","PEARLENE","MICHELINE","MERNA","MARGORIE","MARGARETTA","LORE","KENNETH","JENINE","HERMINA","FREDERICKA","ELKE","DRUSILLA","DORATHY","DIONE","DESIRE","CELENA","BRIGIDA","ANGELES","ALLEGRA","THEO","TAMEKIA","SYNTHIA","STEPHEN","SOOK","SLYVIA","ROSANN","REATHA","RAYE","MARQUETTA","MARGART","LING","LAYLA","KYMBERLY","KIANA","KAYLEEN","KATLYN","KARMEN","JOELLA","IRINA","EMELDA","ELENI","DETRA","CLEMMIE","CHERYLL","CHANTELL","CATHEY","ARNITA","ARLA","ANGLE","ANGELIC","ALYSE","ZOFIA","THOMASINE","TENNIE","SON","SHERLY","SHERLEY","SHARYL","REMEDIOS","PETRINA","NICKOLE","MYUNG","MYRLE","MOZELLA","LOUANNE","LISHA","LATIA","LANE","KRYSTA","JULIENNE","JOEL","JEANENE","JACQUALINE","ISAURA","GWENDA","EARLEEN","DONALD","CLEOPATRA","CARLIE","AUDIE","ANTONIETTA","ALISE","ALEX","VERDELL","VAL","TYLER","TOMOKO","THAO","TALISHA","STEVEN","SO","SHEMIKA","SHAUN","SCARLET","SAVANNA","SANTINA","ROSIA","RAEANN","ODILIA","NANA","MINNA","MAGAN","LYNELLE","LE","KARMA","JOEANN","IVANA","INELL","ILANA","HYE","HONEY","HEE","GUDRUN","FRANK","DREAMA","CRISSY","CHANTE","CARMELINA","ARVILLA","ARTHUR","ANNAMAE","ALVERA","ALEIDA","AARON","YEE","YANIRA","VANDA","TIANNA","TAM","STEFANIA","SHIRA","PERRY","NICOL","NANCIE","MONSERRATE","MINH","MELYNDA","MELANY","MATTHEW","LOVELLA","LAURE","KIRBY","KACY","JACQUELYNN","HYON","GERTHA","FRANCISCO","ELIANA","CHRISTENA","CHRISTEEN","CHARISE","CATERINA","CARLEY","CANDYCE","ARLENA","AMMIE","YANG","WILLETTE","VANITA","TUYET","TINY","SYREETA","SILVA","SCOTT","RONALD","PENNEY","NYLA","MICHAL","MAURICE","MARYAM","MARYA","MAGEN","LUDIE","LOMA","LIVIA","LANELL","KIMBERLIE","JULEE","DONETTA","DIEDRA","DENISHA","DEANE","DAWNE","CLARINE","CHERRYL","BRONWYN","BRANDON","ALLA","VALERY","TONDA","SUEANN","SORAYA","SHOSHANA","SHELA","SHARLEEN","SHANELLE","NERISSA","MICHEAL","MERIDITH","MELLIE","MAYE","MAPLE","MAGARET","LUIS","LILI","LEONILA","LEONIE","LEEANNA","LAVONIA","LAVERA","KRISTEL","KATHEY","KATHE","JUSTIN","JULIAN","JIMMY","JANN","ILDA","HILDRED","HILDEGARDE","GENIA","FUMIKO","EVELIN","ERMELINDA","ELLY","DUNG","DOLORIS","DIONNA","DANAE","BERNEICE","ANNICE","ALIX","VERENA","VERDIE","TRISTAN","SHAWNNA","SHAWANA","SHAUNNA","ROZELLA","RANDEE","RANAE","MILAGRO","LYNELL","LUISE","LOUIE","LOIDA","LISBETH","KARLEEN","JUNITA","JONA","ISIS","HYACINTH","HEDY","GWENN","ETHELENE","ERLINE","EDWARD","DONYA","DOMONIQUE","DELICIA","DANNETTE","CICELY","BRANDA","BLYTHE","BETHANN","ASHLYN","ANNALEE","ALLINE","YUKO","VELLA","TRANG","TOWANDA","TESHA","SHERLYN","NARCISA","MIGUELINA","MERI","MAYBELL","MARLANA","MARGUERITA","MADLYN","LUNA","LORY","LORIANN","LIBERTY","LEONORE","LEIGHANN","LAURICE","LATESHA","LARONDA","KATRICE","KASIE","KARL","KALEY","JADWIGA","GLENNIE","GEARLDINE","FRANCINA","EPIFANIA","DYAN","DORIE","DIEDRE","DENESE","DEMETRICE","DELENA","DARBY","CRISTIE","CLEORA","CATARINA","CARISA","BERNIE","BARBERA","ALMETA","TRULA","TEREASA","SOLANGE","SHEILAH","SHAVONNE","SANORA","ROCHELL","MATHILDE","MARGARETA","MAIA","LYNSEY","LAWANNA","LAUNA","KENA","KEENA","KATIA","JAMEY","GLYNDA","GAYLENE","ELVINA","ELANOR","DANUTA","DANIKA","CRISTEN","CORDIE","COLETTA","CLARITA","CARMON","BRYNN","AZUCENA","AUNDREA","ANGELE","YI","WALTER","VERLIE","VERLENE","TAMESHA","SILVANA","SEBRINA","SAMIRA","REDA","RAYLENE","PENNI","PANDORA","NORAH","NOMA","MIREILLE","MELISSIA","MARYALICE","LARAINE","KIMBERY","KARYL","KARINE","KAM","JOLANDA","JOHANA","JESUSA","JALEESA","JAE","JACQUELYNE","IRISH","ILUMINADA","HILARIA","HANH","GENNIE","FRANCIE","FLORETTA","EXIE","EDDA","DREMA","DELPHA","BEV","BARBAR","ASSUNTA","ARDELL","ANNALISA","ALISIA","YUKIKO","YOLANDO","WONDA","WEI","WALTRAUD","VETA","TEQUILA","TEMEKA","TAMEIKA","SHIRLEEN","SHENITA","PIEDAD","OZELLA","MIRTHA","MARILU","KIMIKO","JULIANE","JENICE","JEN","JANAY","JACQUILINE","HILDE","FE","FAE","EVAN","EUGENE","ELOIS","ECHO","DEVORAH","CHAU","BRINDA","BETSEY","ARMINDA","ARACELIS","APRYL","ANNETT","ALISHIA","VEOLA","USHA","TOSHIKO","THEOLA","TASHIA","TALITHA","SHERY","RUDY","RENETTA","REIKO","RASHEEDA","OMEGA","OBDULIA","MIKA","MELAINE","MEGGAN","MARTIN","MARLEN","MARGET","MARCELINE","MANA","MAGDALEN","LIBRADA","LEZLIE","LEXIE","LATASHIA","LASANDRA","KELLE","ISIDRA","ISA","INOCENCIA","GWYN","FRANCOISE","ERMINIA","ERINN","DIMPLE","DEVORA","CRISELDA","ARMANDA","ARIE","ARIANE","ANGELO","ANGELENA","ALLEN","ALIZA","ADRIENE","ADALINE","XOCHITL","TWANNA","TRAN","TOMIKO","TAMISHA","TAISHA","SUSY","SIU","RUTHA","ROXY","RHONA","RAYMOND","OTHA","NORIKO","NATASHIA","MERRIE","MELVIN","MARINDA","MARIKO","MARGERT","LORIS","LIZZETTE","LEISHA","KAILA","KA","JOANNIE","JERRICA","JENE","JANNET","JANEE","JACINDA","HERTA","ELENORE","DORETTA","DELAINE","DANIELL","CLAUDIE","CHINA","BRITTA","APOLONIA","AMBERLY","ALEASE","YURI","YUK","WEN","WANETA","UTE","TOMI","SHARRI","SANDIE","ROSELLE","REYNALDA","RAGUEL","PHYLICIA","PATRIA","OLIMPIA","ODELIA","MITZIE","MITCHELL","MISS","MINDA","MIGNON","MICA","MENDY","MARIVEL","MAILE","LYNETTA","LAVETTE","LAURYN","LATRISHA","LAKIESHA","KIERSTEN","KARY","JOSPHINE","JOLYN","JETTA","JANISE","JACQUIE","IVELISSE","GLYNIS","GIANNA","GAYNELLE","EMERALD","DEMETRIUS","DANYELL","DANILLE","DACIA","CORALEE","CHER","CEOLA","BRETT","BELL","ARIANNE","ALESHIA","YUNG","WILLIEMAE","TROY","TRINH","THORA","TAI","SVETLANA","SHERIKA","SHEMEKA","SHAUNDA","ROSELINE","RICKI","MELDA","MALLIE","LAVONNA","LATINA","LARRY","LAQUANDA","LALA","LACHELLE","KLARA","KANDIS","JOHNA","JEANMARIE","JAYE","HANG","GRAYCE","GERTUDE","EMERITA","EBONIE","CLORINDA","CHING","CHERY","CAROLA","BREANN","BLOSSOM","BERNARDINE","BECKI","ARLETHA","ARGELIA","ARA","ALITA","YULANDA","YON","YESSENIA","TOBI","TASIA","SYLVIE","SHIRL","SHIRELY","SHERIDAN","SHELLA","SHANTELLE","SACHA","ROYCE","REBECKA","REAGAN","PROVIDENCIA","PAULENE","MISHA","MIKI","MARLINE","MARICA","LORITA","LATOYIA","LASONYA","KERSTIN","KENDA","KEITHA","KATHRIN","JAYMIE","JACK","GRICELDA","GINETTE","ERYN","ELINA","ELFRIEDA","DANYEL","CHEREE","CHANELLE","BARRIE","AVERY","AURORE","ANNAMARIA","ALLEEN","AILENE","AIDE","YASMINE","VASHTI","VALENTINE","TREASA","TORY","TIFFANEY","SHERYLL","SHARIE","SHANAE","SAU","RAISA","PA","NEDA","MITSUKO","MIRELLA","MILDA","MARYANNA","MARAGRET","MABELLE","LUETTA","LORINA","LETISHA","LATARSHA","LANELLE","LAJUANA","KRISSY","KARLY","KARENA","JON","JESSIKA","JERICA","JEANELLE","JANUARY","JALISA","JACELYN","IZOLA","IVEY","GREGORY","EUNA","ETHA","DREW","DOMITILA","DOMINICA","DAINA","CREOLA","CARLI","CAMIE","BUNNY","BRITTNY","ASHANTI","ANISHA","ALEEN","ADAH","YASUKO","WINTER","VIKI","VALRIE","TONA","TINISHA","THI","TERISA","TATUM","TANEKA","SIMONNE","SHALANDA","SERITA","RESSIE","REFUGIA","PAZ","OLENE","NA","MERRILL","MARGHERITA","MANDIE","MAN","MAIRE","LYNDIA","LUCI","LORRIANE","LORETA","LEONIA","LAVONA","LASHAWNDA","LAKIA","KYOKO","KRYSTINA","KRYSTEN","KENIA","KELSI","JUDE","JEANICE","ISOBEL","GEORGIANN","GENNY","FELICIDAD","EILENE","DEON","DELOISE","DEEDEE","DANNIE","CONCEPTION","CLORA","CHERILYN","CHANG","CALANDRA","BERRY","ARMANDINA","ANISA","ULA","TIMOTHY","TIERA","THERESSA","STEPHANIA","SIMA","SHYLA","SHONTA","SHERA","SHAQUITA","SHALA","SAMMY","ROSSANA","NOHEMI","NERY","MORIAH","MELITA","MELIDA","MELANI","MARYLYNN","MARISHA","MARIETTE","MALORIE","MADELENE","LUDIVINA","LORIA","LORETTE","LORALEE","LIANNE","LEON","LAVENIA","LAURINDA","LASHON","KIT","KIMI","KEILA","KATELYNN","KAI","JONE","JOANE","JI","JAYNA","JANELLA","JA","HUE","HERTHA","FRANCENE","ELINORE","DESPINA","DELSIE","DEEDRA","CLEMENCIA","CARRY","CAROLIN","CARLOS","BULAH","BRITTANIE","BOK","BLONDELL","BIBI","BEAULAH","BEATA","ANNITA","AGRIPINA","VIRGEN","VALENE","UN","TWANDA","TOMMYE","TOI","TARRA","TARI","TAMMERA","SHAKIA","SADYE","RUTHANNE","ROCHEL","RIVKA","PURA","NENITA","NATISHA","MING","MERRILEE","MELODEE","MARVIS","LUCILLA","LEENA","LAVETA","LARITA","LANIE","KEREN","ILEEN","GEORGEANN","GENNA","GENESIS","FRIDA","EWA","EUFEMIA","EMELY","ELA","EDYTH","DEONNA","DEADRA","DARLENA","CHANELL","CHAN","CATHERN","CASSONDRA","CASSAUNDRA","BERNARDA","BERNA","ARLINDA","ANAMARIA","ALBERT","WESLEY","VERTIE","VALERI","TORRI","TATYANA","STASIA","SHERISE","SHERILL","SEASON","SCOTTIE","SANDA","RUTHE","ROSY","ROBERTO","ROBBI","RANEE","QUYEN","PEARLY","PALMIRA","ONITA","NISHA","NIESHA","NIDA","NEVADA","NAM","MERLYN","MAYOLA","MARYLOUISE","MARYLAND","MARX","MARTH","MARGENE","MADELAINE","LONDA","LEONTINE","LEOMA","LEIA","LAWRENCE","LAURALEE","LANORA","LAKITA","KIYOKO","KETURAH","KATELIN","KAREEN","JONIE","JOHNETTE","JENEE","JEANETT","IZETTA","HIEDI","HEIKE","HASSIE","HAROLD","GIUSEPPINA","GEORGANN","FIDELA","FERNANDE","ELWANDA","ELLAMAE","ELIZ","DUSTI","DOTTY","CYNDY","CORALIE","CELESTA","ARGENTINA","ALVERTA","XENIA","WAVA","VANETTA","TORRIE","TASHINA","TANDY","TAMBRA","TAMA","STEPANIE","SHILA","SHAUNTA","SHARAN","SHANIQUA","SHAE","SETSUKO","SERAFINA","SANDEE","ROSAMARIA","PRISCILA","OLINDA","NADENE","MUOI","MICHELINA","MERCEDEZ","MARYROSE","MARIN","MARCENE","MAO","MAGALI","MAFALDA","LOGAN","LINN","LANNIE","KAYCE","KAROLINE","KAMILAH","KAMALA","JUSTA","JOLINE","JENNINE","JACQUETTA","IRAIDA","GERALD","GEORGEANNA","FRANCHESCA","FAIRY","EMELINE","ELANE","EHTEL","EARLIE","DULCIE","DALENE","CRIS","CLASSIE","CHERE","CHARIS","CAROYLN","CARMINA","CARITA","BRIAN","BETHANIE","AYAKO","ARICA","AN","ALYSA","ALESSANDRA","AKILAH","ADRIEN","ZETTA","YOULANDA","YELENA","YAHAIRA","XUAN","WENDOLYN","VICTOR","TIJUANA","TERRELL","TERINA","TERESIA","SUZI","SUNDAY","SHERELL","SHAVONDA","SHAUNTE","SHARDA","SHAKITA","SENA","RYANN","RUBI","RIVA","REGINIA","REA","RACHAL","PARTHENIA","PAMULA","MONNIE","MONET","MICHAELE","MELIA","MARINE","MALKA","MAISHA","LISANDRA","LEO","LEKISHA","LEAN","LAURENCE","LAKENDRA","KRYSTIN","KORTNEY","KIZZIE","KITTIE","KERA","KENDAL","KEMBERLY","KANISHA","JULENE","JULE","JOSHUA","JOHANNE","JEFFREY","JAMEE","HAN","HALLEY","GIDGET","GALINA","FREDRICKA","FLETA","FATIMAH","EUSEBIA","ELZA","ELEONORE","DORTHEY","DORIA","DONELLA","DINORAH","DELORSE","CLARETHA","CHRISTINIA","CHARLYN","BONG","BELKIS","AZZIE","ANDERA","AIKO","ADENA","YER","YAJAIRA","WAN","VANIA","ULRIKE","TOSHIA","TIFANY","STEFANY","SHIZUE","SHENIKA","SHAWANNA","SHAROLYN","SHARILYN","SHAQUANA","SHANTAY","SEE","ROZANNE","ROSELEE","RICKIE","REMONA","REANNA","RAELENE","QUINN","PHUNG","PETRONILA","NATACHA","NANCEY","MYRL","MIYOKO","MIESHA","MERIDETH","MARVELLA","MARQUITTA","MARHTA","MARCHELLE","LIZETH","LIBBIE","LAHOMA","LADAWN","KINA","KATHELEEN","KATHARYN","KARISA","KALEIGH","JUNIE","JULIEANN","JOHNSIE","JANEAN","JAIMEE","JACKQUELINE","HISAKO","HERMA","HELAINE","GWYNETH","GLENN","GITA","EUSTOLIA","EMELINA","ELIN","EDRIS","DONNETTE","DONNETTA","DIERDRE","DENAE","DARCEL","CLAUDE","CLARISA","CINDERELLA","CHIA","CHARLESETTA","CHARITA","CELSA","CASSY","CASSI","CARLEE","BRUNA","BRITTANEY","BRANDE","BILLI","BAO","ANTONETTA","ANGLA","ANGELYN","ANALISA","ALANE","WENONA","WENDIE","VERONIQUE","VANNESA","TOBIE","TEMPIE","SUMIKO","SULEMA","SPARKLE","SOMER","SHEBA","SHAYNE","SHARICE","SHANEL","SHALON","SAGE","ROY","ROSIO","ROSELIA","RENAY","REMA","REENA","PORSCHE","PING","PEG","OZIE","ORETHA","ORALEE","ODA","NU","NGAN","NAKESHA","MILLY","MARYBELLE","MARLIN","MARIS","MARGRETT","MARAGARET","MANIE","LURLENE","LILLIA","LIESELOTTE","LAVELLE","LASHAUNDA","LAKEESHA","KEITH","KAYCEE","KALYN","JOYA","JOETTE","JENAE","JANIECE","ILLA","GRISEL","GLAYDS","GENEVIE","GALA","FREDDA","FRED","ELMER","ELEONOR","DEBERA","DEANDREA","DAN","CORRINNE","CORDIA","CONTESSA","COLENE","CLEOTILDE","CHARLOTT","CHANTAY","CECILLE","BEATRIS","AZALEE","ARLEAN","ARDATH","ANJELICA","ANJA","ALFREDIA","ALEISHA","ADAM","ZADA","YUONNE","XIAO","WILLODEAN","WHITLEY","VENNIE","VANNA","TYISHA","TOVA","TORIE","TONISHA","TILDA","TIEN","TEMPLE","SIRENA","SHERRIL","SHANTI","SHAN","SENAIDA","SAMELLA","ROBBYN","RENDA","REITA","PHEBE","PAULITA","NOBUKO","NGUYET","NEOMI","MOON","MIKAELA","MELANIA","MAXIMINA","MARG","MAISIE","LYNNA","LILLI","LAYNE","LASHAUN","LAKENYA","LAEL","KIRSTIE","KATHLINE","KASHA","KARLYN","KARIMA","JOVAN","JOSEFINE","JENNELL","JACQUI","JACKELYN","HYO","HIEN","GRAZYNA","FLORRIE","FLORIA","ELEONORA","DWANA","DORLA","DONG","DELMY","DEJA","DEDE","DANN","CRYSTA","CLELIA","CLARIS","CLARENCE","CHIEKO","CHERLYN","CHERELLE","CHARMAIN","CHARA","CAMMY","BEE","ARNETTE","ARDELLE","ANNIKA","AMIEE","AMEE","ALLENA","YVONE","YUKI","YOSHIE","YEVETTE","YAEL","WILLETTA","VONCILE","VENETTA","TULA","TONETTE","TIMIKA","TEMIKA","TELMA","TEISHA","TAREN","TA","STACEE","SHIN","SHAWNTA","SATURNINA","RICARDA","POK","PASTY","ONIE","NUBIA","MORA","MIKE","MARIELLE","MARIELLA","MARIANELA","MARDELL","MANY","LUANNA","LOISE","LISABETH","LINDSY","LILLIANA","LILLIAM","LELAH","LEIGHA","LEANORA","LANG","KRISTEEN","KHALILAH","KEELEY","KANDRA","JUNKO","JOAQUINA","JERLENE","JANI","JAMIKA","JAME","HSIU","HERMILA","GOLDEN","GENEVIVE","EVIA","EUGENA","EMMALINE","ELFREDA","ELENE","DONETTE","DELCIE","DEEANNA","DARCEY","CUC","CLARINDA","CIRA","CHAE","CELINDA","CATHERYN","CATHERIN","CASIMIRA","CARMELIA","CAMELLIA","BREANA","BOBETTE","BERNARDINA","BEBE","BASILIA","ARLYNE","AMAL","ALAYNA","ZONIA","ZENIA","YURIKO","YAEKO","WYNELL","WILLOW","WILLENA","VERNIA","TU","TRAVIS","TORA","TERRILYN","TERICA","TENESHA","TAWNA","TAJUANA","TAINA","STEPHNIE","SONA","SOL","SINA","SHONDRA","SHIZUKO","SHERLENE","SHERICE","SHARIKA","ROSSIE","ROSENA","RORY","RIMA","RIA","RHEBA","RENNA","PETER","NATALYA","NANCEE","MELODI","MEDA","MAXIMA","MATHA","MARKETTA","MARICRUZ","MARCELENE","MALVINA","LUBA","LOUETTA","LEIDA","LECIA","LAURAN","LASHAWNA","LAINE","KHADIJAH","KATERINE","KASI","KALLIE","JULIETTA","JESUSITA","JESTINE","JESSIA","JEREMY","JEFFIE","JANYCE","ISADORA","GEORGIANNE","FIDELIA","EVITA","EURA","EULAH","ESTEFANA","ELSY","ELIZABET","ELADIA","DODIE","DION","DIA","DENISSE","DELORAS","DELILA","DAYSI","DAKOTA","CURTIS","CRYSTLE","CONCHA","COLBY","CLARETTA","CHU","CHRISTIA","CHARLSIE","CHARLENA","CARYLON","BETTYANN","ASLEY","ASHLEA","AMIRA","AI","AGUEDA","AGNUS","YUETTE","VINITA","VICTORINA","TYNISHA","TREENA","TOCCARA","TISH","THOMASENA","TEGAN","SOILA","SHILOH","SHENNA","SHARMAINE","SHANTAE","SHANDI","SEPTEMBER","SARAN","SARAI","SANA","SAMUEL","SALLEY","ROSETTE","ROLANDE","REGINE","OTELIA","OSCAR","OLEVIA","NICHOLLE","NECOLE","NAIDA","MYRTA","MYESHA","MITSUE","MINTA","MERTIE","MARGY","MAHALIA","MADALENE","LOVE","LOURA","LOREAN","LEWIS","LESHA","LEONIDA","LENITA","LAVONE","LASHELL","LASHANDRA","LAMONICA","KIMBRA","KATHERINA","KARRY","KANESHA","JULIO","JONG","JENEVA","JAQUELYN","HWA","GILMA","GHISLAINE","GERTRUDIS","FRANSISCA","FERMINA","ETTIE","ETSUKO","ELLIS","ELLAN","ELIDIA","EDRA","DORETHEA","DOREATHA","DENYSE","DENNY","DEETTA","DAINE","CYRSTAL","CORRIN","CAYLA","CARLITA","CAMILA","BURMA","BULA","BUENA","BLAKE","BARABARA","AVRIL","AUSTIN","ALAINE","ZANA","WILHEMINA","WANETTA","VIRGIL","VI","VERONIKA","VERNON","VERLINE","VASILIKI","TONITA","TISA","TEOFILA","TAYNA","TAUNYA","TANDRA","TAKAKO","SUNNI","SUANNE","SIXTA","SHARELL","SEEMA","RUSSELL","ROSENDA","ROBENA","RAYMONDE","PEI","PAMILA","OZELL","NEIDA","NEELY","MISTIE","MICHA","MERISSA","MAURITA","MARYLN","MARYETTA","MARSHALL","MARCELL","MALENA","MAKEDA","MADDIE","LOVETTA","LOURIE","LORRINE","LORILEE","LESTER","LAURENA","LASHAY","LARRAINE","LAREE","LACRESHA","KRISTLE","KRISHNA","KEVA","KEIRA","KAROLE","JOIE","JINNY","JEANNETTA","JAMA","HEIDY","GILBERTE","GEMA","FAVIOLA","EVELYNN","ENDA","ELLI","ELLENA","DIVINA","DAGNY","COLLENE","CODI","CINDIE","CHASSIDY","CHASIDY","CATRICE","CATHERINA","CASSEY","CAROLL","CARLENA","CANDRA","CALISTA","BRYANNA","BRITTENY","BEULA","BARI","AUDRIE","AUDRIA","ARDELIA","ANNELLE","ANGILA","ALONA","ALLYN","DOUGLAS","ROGER","JONATHAN","RALPH","NICHOLAS","BENJAMIN","BRUCE","HARRY","WAYNE","STEVE","HOWARD","ERNEST","PHILLIP","TODD","CRAIG","ALAN","PHILIP","EARL","DANNY","BRYAN","STANLEY","LEONARD","NATHAN","MANUEL","RODNEY","MARVIN","VINCENT","JEFFERY","JEFF","CHAD","JACOB","ALFRED","BRADLEY","HERBERT","FREDERICK","EDWIN","DON","RICKY","RANDALL","BARRY","BERNARD","LEROY","MARCUS","THEODORE","CLIFFORD","MIGUEL","JIM","TOM","CALVIN","BILL","LLOYD","DEREK","WARREN","DARRELL","JEROME","FLOYD","ALVIN","TIM","GORDON","GREG","JORGE","DUSTIN","PEDRO","DERRICK","ZACHARY","HERMAN","GLEN","HECTOR","RICARDO","RICK","BRENT","RAMON","GILBERT","MARC","REGINALD","RUBEN","NATHANIEL","RAFAEL","EDGAR","MILTON","RAUL","BEN","CHESTER","DUANE","FRANKLIN","BRAD","RON","ROLAND","ARNOLD","HARVEY","JARED","ERIK","DARRYL","NEIL","JAVIER","FERNANDO","CLINTON","TED","MATHEW","TYRONE","DARREN","LANCE","KURT","ALLAN","NELSON","GUY","CLAYTON","HUGH","MAX","DWAYNE","DWIGHT","ARMANDO","FELIX","EVERETT","IAN","WALLACE","KEN","BOB","ALFREDO","ALBERTO","DAVE","IVAN","BYRON","ISAAC","MORRIS","CLIFTON","WILLARD","ROSS","ANDY","SALVADOR","KIRK","SERGIO","SETH","KENT","TERRANCE","EDUARDO","TERRENCE","ENRIQUE","WADE","STUART","FREDRICK","ARTURO","ALEJANDRO","NICK","LUTHER","WENDELL","JEREMIAH","JULIUS","OTIS","TREVOR","OLIVER","LUKE","HOMER","GERARD","DOUG","KENNY","HUBERT","LYLE","MATT","ALFONSO","ORLANDO","REX","CARLTON","ERNESTO","NEAL","PABLO","LORENZO","OMAR","WILBUR","GRANT","HORACE","RODERICK","ABRAHAM","WILLIS","RICKEY","ANDRES","CESAR","JOHNATHAN","MALCOLM","RUDOLPH","DAMON","KELVIN","PRESTON","ALTON","ARCHIE","MARCO","WM","PETE","RANDOLPH","GARRY","GEOFFREY","JONATHON","FELIPE","GERARDO","ED","DOMINIC","DELBERT","COLIN","GUILLERMO","EARNEST","LUCAS","BENNY","SPENCER","RODOLFO","MYRON","EDMUND","GARRETT","SALVATORE","CEDRIC","LOWELL","GREGG","SHERMAN","WILSON","SYLVESTER","ROOSEVELT","ISRAEL","JERMAINE","FORREST","WILBERT","LELAND","SIMON","CLARK","IRVING","BRYANT","OWEN","RUFUS","WOODROW","KRISTOPHER","MACK","LEVI","MARCOS","GUSTAVO","JAKE","LIONEL","GILBERTO","CLINT","NICOLAS","ISMAEL","ORVILLE","ERVIN","DEWEY","AL","WILFRED","JOSH","HUGO","IGNACIO","CALEB","TOMAS","SHELDON","ERICK","STEWART","DOYLE","DARREL","ROGELIO","TERENCE","SANTIAGO","ALONZO","ELIAS","BERT","ELBERT","RAMIRO","CONRAD","NOAH","GRADY","PHIL","CORNELIUS","LAMAR","ROLANDO","CLAY","PERCY","DEXTER","BRADFORD","DARIN","AMOS","MOSES","IRVIN","SAUL","ROMAN","RANDAL","TIMMY","DARRIN","WINSTON","BRENDAN","ABEL","DOMINICK","BOYD","EMILIO","ELIJAH","DOMINGO","EMMETT","MARLON","EMANUEL","JERALD","EDMOND","EMIL","DEWAYNE","WILL","OTTO","TEDDY","REYNALDO","BRET","JESS","TRENT","HUMBERTO","EMMANUEL","STEPHAN","VICENTE","LAMONT","GARLAND","MILES","EFRAIN","HEATH","RODGER","HARLEY","ETHAN","ELDON","ROCKY","PIERRE","JUNIOR","FREDDY","ELI","BRYCE","ANTOINE","STERLING","CHASE","GROVER","ELTON","CLEVELAND","DYLAN","CHUCK","DAMIAN","REUBEN","STAN","AUGUST","LEONARDO","JASPER","RUSSEL","ERWIN","BENITO","HANS","MONTE","BLAINE","ERNIE","CURT","QUENTIN","AGUSTIN","MURRAY","JAMAL","ADOLFO","HARRISON","TYSON","BURTON","BRADY","ELLIOTT","WILFREDO","BART","JARROD","VANCE","DENIS","DAMIEN","JOAQUIN","HARLAN","DESMOND","ELLIOT","DARWIN","GREGORIO","BUDDY","XAVIER","KERMIT","ROSCOE","ESTEBAN","ANTON","SOLOMON","SCOTTY","NORBERT","ELVIN","WILLIAMS","NOLAN","ROD","QUINTON","HAL","BRAIN","ROB","ELWOOD","KENDRICK","DARIUS","MOISES","FIDEL","THADDEUS","CLIFF","MARCEL","JACKSON","RAPHAEL","BRYON","ARMAND","ALVARO","JEFFRY","DANE","JOESPH","THURMAN","NED","RUSTY","MONTY","FABIAN","REGGIE","MASON","GRAHAM","ISAIAH","VAUGHN","GUS","LOYD","DIEGO","ADOLPH","NORRIS","MILLARD","ROCCO","GONZALO","DERICK","RODRIGO","WILEY","RIGOBERTO","ALPHONSO","TY","NOE","VERN","REED","JEFFERSON","ELVIS","BERNARDO","MAURICIO","HIRAM","DONOVAN","BASIL","RILEY","NICKOLAS","MAYNARD","SCOT","VINCE","QUINCY","EDDY","SEBASTIAN","FEDERICO","ULYSSES","HERIBERTO","DONNELL","COLE","DAVIS","GAVIN","EMERY","WARD","ROMEO","JAYSON","DANTE","CLEMENT","COY","MAXWELL","JARVIS","BRUNO","ISSAC","DUDLEY","BROCK","SANFORD","CARMELO","BARNEY","NESTOR","STEFAN","DONNY","ART","LINWOOD","BEAU","WELDON","GALEN","ISIDRO","TRUMAN","DELMAR","JOHNATHON","SILAS","FREDERIC","DICK","IRWIN","MERLIN","CHARLEY","MARCELINO","HARRIS","CARLO","TRENTON","KURTIS","HUNTER","AURELIO","WINFRED","VITO","COLLIN","DENVER","CARTER","LEONEL","EMORY","PASQUALE","MOHAMMAD","MARIANO","DANIAL","LANDON","DIRK","BRANDEN","ADAN","BUFORD","GERMAN","WILMER","EMERSON","ZACHERY","FLETCHER","JACQUES","ERROL","DALTON","MONROE","JOSUE","EDWARDO","BOOKER","WILFORD","SONNY","SHELTON","CARSON","THERON","RAYMUNDO","DAREN","HOUSTON","ROBBY","LINCOLN","GENARO","BENNETT","OCTAVIO","CORNELL","HUNG","ARRON","ANTONY","HERSCHEL","GIOVANNI","GARTH","CYRUS","CYRIL","RONNY","LON","FREEMAN","DUNCAN","KENNITH","CARMINE","ERICH","CHADWICK","WILBURN","RUSS","REID","MYLES","ANDERSON","MORTON","JONAS","FOREST","MITCHEL","MERVIN","ZANE","RICH","JAMEL","LAZARO","ALPHONSE","RANDELL","MAJOR","JARRETT","BROOKS","ABDUL","LUCIANO","SEYMOUR","EUGENIO","MOHAMMED","VALENTIN","CHANCE","ARNULFO","LUCIEN","FERDINAND","THAD","EZRA","ALDO","RUBIN","ROYAL","MITCH","EARLE","ABE","WYATT","MARQUIS","LANNY","KAREEM","JAMAR","BORIS","ISIAH","EMILE","ELMO","ARON","LEOPOLDO","EVERETTE","JOSEF","ELOY","RODRICK","REINALDO","LUCIO","JERROD","WESTON","HERSHEL","BARTON","PARKER","LEMUEL","BURT","JULES","GIL","ELISEO","AHMAD","NIGEL","EFREN","ANTWAN","ALDEN","MARGARITO","COLEMAN","DINO","OSVALDO","LES","DEANDRE","NORMAND","KIETH","TREY","NORBERTO","NAPOLEON","JEROLD","FRITZ","ROSENDO","MILFORD","CHRISTOPER","ALFONZO","LYMAN","JOSIAH","BRANT","WILTON","RICO","JAMAAL","DEWITT","BRENTON","OLIN","FOSTER","FAUSTINO","CLAUDIO","JUDSON","GINO","EDGARDO","ALEC","TANNER","JARRED","DONN","TAD","PRINCE","PORFIRIO","ODIS","LENARD","CHAUNCEY","TOD","MEL","MARCELO","KORY","AUGUSTUS","KEVEN","HILARIO","BUD","SAL","ORVAL","MAURO","ZACHARIAH","OLEN","ANIBAL","MILO","JED","DILLON","AMADO","NEWTON","LENNY","RICHIE","HORACIO","BRICE","MOHAMED","DELMER","DARIO","REYES","MAC","JONAH","JERROLD","ROBT","HANK","RUPERT","ROLLAND","KENTON","DAMION","ANTONE","WALDO","FREDRIC","BRADLY","KIP","BURL","WALKER","TYREE","JEFFEREY","AHMED","WILLY","STANFORD","OREN","NOBLE","MOSHE","MIKEL","ENOCH","BRENDON","QUINTIN","JAMISON","FLORENCIO","DARRICK","TOBIAS","HASSAN","GIUSEPPE","DEMARCUS","CLETUS","TYRELL","LYNDON","KEENAN","WERNER","GERALDO","COLUMBUS","CHET","BERTRAM","MARKUS","HUEY","HILTON","DWAIN","DONTE","TYRON","OMER","ISAIAS","HIPOLITO","FERMIN","ADALBERTO","BO","BARRETT","TEODORO","MCKINLEY","MAXIMO","GARFIELD","RALEIGH","LAWERENCE","ABRAM","RASHAD","KING","EMMITT","DARON","SAMUAL","MIQUEL","EUSEBIO","DOMENIC","DARRON","BUSTER","WILBER","RENATO","JC","HOYT","HAYWOOD","EZEKIEL","CHAS","FLORENTINO","ELROY","CLEMENTE","ARDEN","NEVILLE","EDISON","DESHAWN","NATHANIAL","JORDON","DANILO","CLAUD","SHERWOOD","RAYMON","RAYFORD","CRISTOBAL","AMBROSE","TITUS","HYMAN","FELTON","EZEQUIEL","ERASMO","STANTON","LONNY","LEN","IKE","MILAN","LINO","JAROD","HERB","ANDREAS","WALTON","RHETT","PALMER","DOUGLASS","CORDELL","OSWALDO","ELLSWORTH","VIRGILIO","TONEY","NATHANAEL","DEL","BENEDICT","MOSE","JOHNSON","ISREAL","GARRET","FAUSTO","ASA","ARLEN","ZACK","WARNER","MODESTO","FRANCESCO","MANUAL","GAYLORD","GASTON","FILIBERTO","DEANGELO","MICHALE","GRANVILLE","WES","MALIK","ZACKARY","TUAN","ELDRIDGE","CRISTOPHER","CORTEZ","ANTIONE","MALCOM","LONG","KOREY","JOSPEH","COLTON","WAYLON","VON","HOSEA","SHAD","SANTO","RUDOLF","ROLF","REY","RENALDO","MARCELLUS","LUCIUS","KRISTOFER","BOYCE","BENTON","HAYDEN","HARLAND","ARNOLDO","RUEBEN","LEANDRO","KRAIG","JERRELL","JEROMY","HOBERT","CEDRICK","ARLIE","WINFORD","WALLY","LUIGI","KENETH","JACINTO","GRAIG","FRANKLYN","EDMUNDO","SID","PORTER","LEIF","JERAMY","BUCK","WILLIAN","VINCENZO","SHON","LYNWOOD","JERE","HAI","ELDEN","DORSEY","DARELL","BRODERICK","ALONSO" ================================================ FILE: project_euler/problem_022/sol1.py ================================================ """ Name scores Problem 22 Using names.txt (right click and 'Save Link/Target As...'), a 46K text file containing over five-thousand first names, begin by sorting it into alphabetical order. Then working out the alphabetical value for each name, multiply this value by its alphabetical position in the list to obtain a name score. For example, when the list is sorted into alphabetical order, COLIN, which is worth 3 + 15 + 12 + 9 + 14 = 53, is the 938th name in the list. So, COLIN would obtain a score of 938 x 53 = 49714. What is the total of all the name scores in the file? """ import os def solution(): """Returns the total of all the name scores in the file. >>> solution() 871198282 """ with open(os.path.dirname(__file__) + "/p022_names.txt") as file: names = str(file.readlines()[0]) names = names.replace('"', "").split(",") names.sort() name_score = 0 total_score = 0 for i, name in enumerate(names): for letter in name: name_score += ord(letter) - 64 total_score += (i + 1) * name_score name_score = 0 return total_score if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_022/sol2.py ================================================ """ Name scores Problem 22 Using names.txt (right click and 'Save Link/Target As...'), a 46K text file containing over five-thousand first names, begin by sorting it into alphabetical order. Then working out the alphabetical value for each name, multiply this value by its alphabetical position in the list to obtain a name score. For example, when the list is sorted into alphabetical order, COLIN, which is worth 3 + 15 + 12 + 9 + 14 = 53, is the 938th name in the list. So, COLIN would obtain a score of 938 x 53 = 49714. What is the total of all the name scores in the file? """ import os def solution(): """Returns the total of all the name scores in the file. >>> solution() 871198282 """ total_sum = 0 temp_sum = 0 with open(os.path.dirname(__file__) + "/p022_names.txt") as file: name = str(file.readlines()[0]) name = name.replace('"', "").split(",") name.sort() for i in range(len(name)): for j in name[i]: temp_sum += ord(j) - ord("A") + 1 total_sum += (i + 1) * temp_sum temp_sum = 0 return total_sum if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_023/__init__.py ================================================ ================================================ FILE: project_euler/problem_023/sol1.py ================================================ """ A perfect number is a number for which the sum of its proper divisors is exactly equal to the number. For example, the sum of the proper divisors of 28 would be 1 + 2 + 4 + 7 + 14 = 28, which means that 28 is a perfect number. A number n is called deficient if the sum of its proper divisors is less than n and it is called abundant if this sum exceeds n. As 12 is the smallest abundant number, 1 + 2 + 3 + 4 + 6 = 16, the smallest number that can be written as the sum of two abundant numbers is 24. By mathematical analysis, it can be shown that all integers greater than 28123 can be written as the sum of two abundant numbers. However, this upper limit cannot be reduced any further by analysis even though it is known that the greatest number that cannot be expressed as the sum of two abundant numbers is less than this limit. Find the sum of all the positive integers which cannot be written as the sum of two abundant numbers. """ def solution(limit=28123): """ Finds the sum of all the positive integers which cannot be written as the sum of two abundant numbers as described by the statement above. >>> solution() 4179871 """ sum_divs = [1] * (limit + 1) for i in range(2, int(limit**0.5) + 1): sum_divs[i * i] += i for k in range(i + 1, limit // i + 1): sum_divs[k * i] += k + i abundants = set() res = 0 for n in range(1, limit + 1): if sum_divs[n] > n: abundants.add(n) if not any((n - a in abundants) for a in abundants): res += n return res if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_024/__init__.py ================================================ ================================================ FILE: project_euler/problem_024/sol1.py ================================================ """ A permutation is an ordered arrangement of objects. For example, 3124 is one possible permutation of the digits 1, 2, 3 and 4. If all of the permutations are listed numerically or alphabetically, we call it lexicographic order. The lexicographic permutations of 0, 1 and 2 are: 012 021 102 120 201 210 What is the millionth lexicographic permutation of the digits 0, 1, 2, 3, 4, 5, 6, 7, 8 and 9? """ from itertools import permutations def solution(): """Returns the millionth lexicographic permutation of the digits 0, 1, 2, 3, 4, 5, 6, 7, 8 and 9. >>> solution() '2783915460' """ result = list(map("".join, permutations("0123456789"))) return result[999999] if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_025/__init__.py ================================================ ================================================ FILE: project_euler/problem_025/sol1.py ================================================ """ The Fibonacci sequence is defined by the recurrence relation: Fn = Fn-1 + Fn-2, where F1 = 1 and F2 = 1. Hence the first 12 terms will be: F1 = 1 F2 = 1 F3 = 2 F4 = 3 F5 = 5 F6 = 8 F7 = 13 F8 = 21 F9 = 34 F10 = 55 F11 = 89 F12 = 144 The 12th term, F12, is the first term to contain three digits. What is the index of the first term in the Fibonacci sequence to contain 1000 digits? """ def fibonacci(n: int) -> int: """ Computes the Fibonacci number for input n by iterating through n numbers and creating an array of ints using the Fibonacci formula. Returns the nth element of the array. >>> fibonacci(2) 1 >>> fibonacci(3) 2 >>> fibonacci(5) 5 >>> fibonacci(10) 55 >>> fibonacci(12) 144 """ if n == 1 or not isinstance(n, int): return 0 elif n == 2: return 1 else: sequence = [0, 1] for i in range(2, n + 1): sequence.append(sequence[i - 1] + sequence[i - 2]) return sequence[n] def fibonacci_digits_index(n: int) -> int: """ Computes incrementing Fibonacci numbers starting from 3 until the length of the resulting Fibonacci result is the input value n. Returns the term of the Fibonacci sequence where this occurs. >>> fibonacci_digits_index(1000) 4782 >>> fibonacci_digits_index(100) 476 >>> fibonacci_digits_index(50) 237 >>> fibonacci_digits_index(3) 12 """ digits = 0 index = 2 while digits < n: index += 1 digits = len(str(fibonacci(index))) return index def solution(n: int = 1000) -> int: """ Returns the index of the first term in the Fibonacci sequence to contain n digits. >>> solution(1000) 4782 >>> solution(100) 476 >>> solution(50) 237 >>> solution(3) 12 """ return fibonacci_digits_index(n) if __name__ == "__main__": print(solution(int(str(input()).strip()))) ================================================ FILE: project_euler/problem_025/sol2.py ================================================ """ The Fibonacci sequence is defined by the recurrence relation: Fn = Fn-1 + Fn-2, where F1 = 1 and F2 = 1. Hence the first 12 terms will be: F1 = 1 F2 = 1 F3 = 2 F4 = 3 F5 = 5 F6 = 8 F7 = 13 F8 = 21 F9 = 34 F10 = 55 F11 = 89 F12 = 144 The 12th term, F12, is the first term to contain three digits. What is the index of the first term in the Fibonacci sequence to contain 1000 digits? """ from collections.abc import Generator def fibonacci_generator() -> Generator[int]: """ A generator that produces numbers in the Fibonacci sequence >>> generator = fibonacci_generator() >>> next(generator) 1 >>> next(generator) 2 >>> next(generator) 3 >>> next(generator) 5 >>> next(generator) 8 """ a, b = 0, 1 while True: a, b = b, a + b yield b def solution(n: int = 1000) -> int: """Returns the index of the first term in the Fibonacci sequence to contain n digits. >>> solution(1000) 4782 >>> solution(100) 476 >>> solution(50) 237 >>> solution(3) 12 """ answer = 1 gen = fibonacci_generator() while len(str(next(gen))) < n: answer += 1 return answer + 1 if __name__ == "__main__": print(solution(int(str(input()).strip()))) ================================================ FILE: project_euler/problem_025/sol3.py ================================================ """ The Fibonacci sequence is defined by the recurrence relation: Fn = Fn-1 + Fn-2, where F1 = 1 and F2 = 1. Hence the first 12 terms will be: F1 = 1 F2 = 1 F3 = 2 F4 = 3 F5 = 5 F6 = 8 F7 = 13 F8 = 21 F9 = 34 F10 = 55 F11 = 89 F12 = 144 The 12th term, F12, is the first term to contain three digits. What is the index of the first term in the Fibonacci sequence to contain 1000 digits? """ def solution(n: int = 1000) -> int: """Returns the index of the first term in the Fibonacci sequence to contain n digits. >>> solution(1000) 4782 >>> solution(100) 476 >>> solution(50) 237 >>> solution(3) 12 """ f1, f2 = 1, 1 index = 2 while True: i = 0 f = f1 + f2 f1, f2 = f2, f index += 1 for _ in str(f): i += 1 if i == n: break return index if __name__ == "__main__": print(solution(int(str(input()).strip()))) ================================================ FILE: project_euler/problem_026/__init__.py ================================================ ================================================ FILE: project_euler/problem_026/sol1.py ================================================ """ Euler Problem 26 https://projecteuler.net/problem=26 Problem Statement: A unit fraction contains 1 in the numerator. The decimal representation of the unit fractions with denominators 2 to 10 are given: 1/2 = 0.5 1/3 = 0.(3) 1/4 = 0.25 1/5 = 0.2 1/6 = 0.1(6) 1/7 = 0.(142857) 1/8 = 0.125 1/9 = 0.(1) 1/10 = 0.1 Where 0.1(6) means 0.166666..., and has a 1-digit recurring cycle. It can be seen that 1/7 has a 6-digit recurring cycle. Find the value of d < 1000 for which 1/d contains the longest recurring cycle in its decimal fraction part. """ def solution(numerator: int = 1, digit: int = 1000) -> int: """ Considering any range can be provided, because as per the problem, the digit d < 1000 >>> solution(1, 10) 7 >>> solution(10, 100) 97 >>> solution(10, 1000) 983 """ the_digit = 1 longest_list_length = 0 for divide_by_number in range(numerator, digit + 1): has_been_divided: list[int] = [] now_divide = numerator for _ in range(1, digit + 1): if now_divide in has_been_divided: if longest_list_length < len(has_been_divided): longest_list_length = len(has_been_divided) the_digit = divide_by_number else: has_been_divided.append(now_divide) now_divide = now_divide * 10 % divide_by_number return the_digit # Tests if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: project_euler/problem_027/__init__.py ================================================ ================================================ FILE: project_euler/problem_027/sol1.py ================================================ """ Project Euler Problem 27 https://projecteuler.net/problem=27 Problem Statement: Euler discovered the remarkable quadratic formula: n2 + n + 41 It turns out that the formula will produce 40 primes for the consecutive values n = 0 to 39. However, when n = 40, 402 + 40 + 41 = 40(40 + 1) + 41 is divisible by 41, and certainly when n = 41, 412 + 41 + 41 is clearly divisible by 41. The incredible formula n2 - 79n + 1601 was discovered, which produces 80 primes for the consecutive values n = 0 to 79. The product of the coefficients, -79 and 1601, is -126479. Considering quadratics of the form: n² + an + b, where |a| < 1000 and |b| < 1000 where |n| is the modulus/absolute value of ne.g. |11| = 11 and |-4| = 4 Find the product of the coefficients, a and b, for the quadratic expression that produces the maximum number of primes for consecutive values of n, starting with n = 0. """ import math def is_prime(number: int) -> bool: """Checks to see if a number is a prime in O(sqrt(n)). A number is prime if it has exactly two factors: 1 and itself. Returns boolean representing primality of given number num (i.e., if the result is true, then the number is indeed prime else it is not). >>> is_prime(2) True >>> is_prime(3) True >>> is_prime(27) False >>> is_prime(2999) True >>> is_prime(0) False >>> is_prime(1) False >>> is_prime(-10) False """ if 1 < number < 4: # 2 and 3 are primes return True elif number < 2 or number % 2 == 0 or number % 3 == 0: # Negatives, 0, 1, all even numbers, all multiples of 3 are not primes return False # All primes number are in format of 6k +/- 1 for i in range(5, int(math.sqrt(number) + 1), 6): if number % i == 0 or number % (i + 2) == 0: return False return True def solution(a_limit: int = 1000, b_limit: int = 1000) -> int: """ >>> solution(1000, 1000) -59231 >>> solution(200, 1000) -59231 >>> solution(200, 200) -4925 >>> solution(-1000, 1000) 0 >>> solution(-1000, -1000) 0 """ longest = [0, 0, 0] # length, a, b for a in range((a_limit * -1) + 1, a_limit): for b in range(2, b_limit): if is_prime(b): count = 0 n = 0 while is_prime((n**2) + (a * n) + b): count += 1 n += 1 if count > longest[0]: longest = [count, a, b] ans = longest[1] * longest[2] return ans if __name__ == "__main__": print(solution(1000, 1000)) ================================================ FILE: project_euler/problem_028/__init__.py ================================================ ================================================ FILE: project_euler/problem_028/sol1.py ================================================ """ Problem 28 Url: https://projecteuler.net/problem=28 Statement: Starting with the number 1 and moving to the right in a clockwise direction a 5 by 5 spiral is formed as follows: 21 22 23 24 25 20 7 8 9 10 19 6 1 2 11 18 5 4 3 12 17 16 15 14 13 It can be verified that the sum of the numbers on the diagonals is 101. What is the sum of the numbers on the diagonals in a 1001 by 1001 spiral formed in the same way? """ from math import ceil def solution(n: int = 1001) -> int: """Returns the sum of the numbers on the diagonals in a n by n spiral formed in the same way. >>> solution(1001) 669171001 >>> solution(500) 82959497 >>> solution(100) 651897 >>> solution(50) 79697 >>> solution(10) 537 """ total = 1 for i in range(1, ceil(n / 2.0)): odd = 2 * i + 1 even = 2 * i total = total + 4 * odd**2 - 6 * even return total if __name__ == "__main__": import sys if len(sys.argv) == 1: print(solution()) else: try: n = int(sys.argv[1]) print(solution(n)) except ValueError: print("Invalid entry - please enter a number") ================================================ FILE: project_euler/problem_029/__init__.py ================================================ ================================================ FILE: project_euler/problem_029/sol1.py ================================================ """ Consider all integer combinations of ab for 2 <= a <= 5 and 2 <= b <= 5: 2^2=4, 2^3=8, 2^4=16, 2^5=32 3^2=9, 3^3=27, 3^4=81, 3^5=243 4^2=16, 4^3=64, 4^4=256, 4^5=1024 5^2=25, 5^3=125, 5^4=625, 5^5=3125 If they are then placed in numerical order, with any repeats removed, we get the following sequence of 15 distinct terms: 4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125 How many distinct terms are in the sequence generated by ab for 2 <= a <= 100 and 2 <= b <= 100? """ def solution(n: int = 100) -> int: """Returns the number of distinct terms in the sequence generated by a^b for 2 <= a <= 100 and 2 <= b <= 100. >>> solution(100) 9183 >>> solution(50) 2184 >>> solution(20) 324 >>> solution(5) 15 >>> solution(2) 1 >>> solution(1) 0 """ collect_powers = set() current_pow = 0 n = n + 1 # maximum limit for a in range(2, n): for b in range(2, n): current_pow = a**b # calculates the current power collect_powers.add(current_pow) # adds the result to the set return len(collect_powers) if __name__ == "__main__": print("Number of terms ", solution(int(str(input()).strip()))) ================================================ FILE: project_euler/problem_030/__init__.py ================================================ ================================================ FILE: project_euler/problem_030/sol1.py ================================================ """Problem Statement (Digit Fifth Powers): https://projecteuler.net/problem=30 Surprisingly there are only three numbers that can be written as the sum of fourth powers of their digits: 1634 = 1^4 + 6^4 + 3^4 + 4^4 8208 = 8^4 + 2^4 + 0^4 + 8^4 9474 = 9^4 + 4^4 + 7^4 + 4^4 As 1 = 1^4 is not a sum it is not included. The sum of these numbers is 1634 + 8208 + 9474 = 19316. Find the sum of all the numbers that can be written as the sum of fifth powers of their digits. 9^5 = 59049 59049 * 7 = 413343 (which is only 6 digit number) So, numbers greater than 999999 are rejected and also 59049 * 3 = 177147 (which exceeds the criteria of number being 3 digit) So, number > 999 and hence a number between 1000 and 1000000 """ DIGITS_FIFTH_POWER = {str(digit): digit**5 for digit in range(10)} def digits_fifth_powers_sum(number: int) -> int: """ >>> digits_fifth_powers_sum(1234) 1300 """ return sum(DIGITS_FIFTH_POWER[digit] for digit in str(number)) def solution() -> int: return sum( number for number in range(1000, 1000000) if number == digits_fifth_powers_sum(number) ) if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_031/__init__.py ================================================ ================================================ FILE: project_euler/problem_031/sol1.py ================================================ """ Coin sums Problem 31: https://projecteuler.net/problem=31 In England the currency is made up of pound, f, and pence, p, and there are eight coins in general circulation: 1p, 2p, 5p, 10p, 20p, 50p, f1 (100p) and f2 (200p). It is possible to make f2 in the following way: 1xf1 + 1x50p + 2x20p + 1x5p + 1x2p + 3x1p How many different ways can f2 be made using any number of coins? """ def one_pence() -> int: return 1 def two_pence(x: int) -> int: return 0 if x < 0 else two_pence(x - 2) + one_pence() def five_pence(x: int) -> int: return 0 if x < 0 else five_pence(x - 5) + two_pence(x) def ten_pence(x: int) -> int: return 0 if x < 0 else ten_pence(x - 10) + five_pence(x) def twenty_pence(x: int) -> int: return 0 if x < 0 else twenty_pence(x - 20) + ten_pence(x) def fifty_pence(x: int) -> int: return 0 if x < 0 else fifty_pence(x - 50) + twenty_pence(x) def one_pound(x: int) -> int: return 0 if x < 0 else one_pound(x - 100) + fifty_pence(x) def two_pound(x: int) -> int: return 0 if x < 0 else two_pound(x - 200) + one_pound(x) def solution(n: int = 200) -> int: """Returns the number of different ways can n pence be made using any number of coins? >>> solution(500) 6295434 >>> solution(200) 73682 >>> solution(50) 451 >>> solution(10) 11 """ return two_pound(n) if __name__ == "__main__": print(solution(int(input().strip()))) ================================================ FILE: project_euler/problem_031/sol2.py ================================================ """ Problem 31: https://projecteuler.net/problem=31 Coin sums In England the currency is made up of pound, f, and pence, p, and there are eight coins in general circulation: 1p, 2p, 5p, 10p, 20p, 50p, f1 (100p) and f2 (200p). It is possible to make f2 in the following way: 1xf1 + 1x50p + 2x20p + 1x5p + 1x2p + 3x1p How many different ways can f2 be made using any number of coins? Hint: > There are 100 pence in a pound (f1 = 100p) > There are coins(in pence) are available: 1, 2, 5, 10, 20, 50, 100 and 200. > how many different ways you can combine these values to create 200 pence. Example: to make 6p there are 5 ways 1,1,1,1,1,1 1,1,1,1,2 1,1,2,2 2,2,2 1,5 to make 5p there are 4 ways 1,1,1,1,1 1,1,1,2 1,2,2 5 """ def solution(pence: int = 200) -> int: """Returns the number of different ways to make X pence using any number of coins. The solution is based on dynamic programming paradigm in a bottom-up fashion. >>> solution(500) 6295434 >>> solution(200) 73682 >>> solution(50) 451 >>> solution(10) 11 """ coins = [1, 2, 5, 10, 20, 50, 100, 200] number_of_ways = [0] * (pence + 1) number_of_ways[0] = 1 # base case: 1 way to make 0 pence for coin in coins: for i in range(coin, pence + 1, 1): number_of_ways[i] += number_of_ways[i - coin] return number_of_ways[pence] if __name__ == "__main__": assert solution(200) == 73682 ================================================ FILE: project_euler/problem_032/__init__.py ================================================ ================================================ FILE: project_euler/problem_032/sol32.py ================================================ """ We shall say that an n-digit number is pandigital if it makes use of all the digits 1 to n exactly once; for example, the 5-digit number, 15234, is 1 through 5 pandigital. The product 7254 is unusual, as the identity, 39 x 186 = 7254, containing multiplicand, multiplier, and product is 1 through 9 pandigital. Find the sum of all products whose multiplicand/multiplier/product identity can be written as a 1 through 9 pandigital. HINT: Some products can be obtained in more than one way so be sure to only include it once in your sum. """ import itertools def is_combination_valid(combination): """ Checks if a combination (a tuple of 9 digits) is a valid product equation. >>> is_combination_valid(('3', '9', '1', '8', '6', '7', '2', '5', '4')) True >>> is_combination_valid(('1', '2', '3', '4', '5', '6', '7', '8', '9')) False """ return ( int("".join(combination[0:2])) * int("".join(combination[2:5])) == int("".join(combination[5:9])) ) or ( int("".join(combination[0])) * int("".join(combination[1:5])) == int("".join(combination[5:9])) ) def solution(): """ Finds the sum of all products whose multiplicand/multiplier/product identity can be written as a 1 through 9 pandigital >>> solution() 45228 """ return sum( { int("".join(pandigital[5:9])) for pandigital in itertools.permutations("123456789") if is_combination_valid(pandigital) } ) if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_033/__init__.py ================================================ ================================================ FILE: project_euler/problem_033/sol1.py ================================================ """ Problem 33: https://projecteuler.net/problem=33 The fraction 49/98 is a curious fraction, as an inexperienced mathematician in attempting to simplify it may incorrectly believe that 49/98 = 4/8, which is correct, is obtained by cancelling the 9s. We shall consider fractions like, 30/50 = 3/5, to be trivial examples. There are exactly four non-trivial examples of this type of fraction, less than one in value, and containing two digits in the numerator and denominator. If the product of these four fractions is given in its lowest common terms, find the value of the denominator. """ from __future__ import annotations from fractions import Fraction def is_digit_cancelling(num: int, den: int) -> bool: return ( num != den and num % 10 == den // 10 and (num // 10) / (den % 10) == num / den ) def fraction_list(digit_len: int) -> list[str]: """ >>> fraction_list(2) ['16/64', '19/95', '26/65', '49/98'] >>> fraction_list(3) ['16/64', '19/95', '26/65', '49/98'] >>> fraction_list(4) ['16/64', '19/95', '26/65', '49/98'] >>> fraction_list(0) [] >>> fraction_list(5) ['16/64', '19/95', '26/65', '49/98'] """ solutions = [] den = 11 last_digit = int("1" + "0" * digit_len) for num in range(den, last_digit): while den <= 99: if ( (num != den) and (num % 10 == den // 10) and (den % 10 != 0) and is_digit_cancelling(num, den) ): solutions.append(f"{num}/{den}") den += 1 num += 1 den = 10 return solutions def solution(n: int = 2) -> int: """ Return the solution to the problem """ result = 1.0 for fraction in fraction_list(n): frac = Fraction(fraction) result *= frac.denominator / frac.numerator return int(result) if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_034/__init__.py ================================================ ================================================ FILE: project_euler/problem_034/sol1.py ================================================ """ Problem 34: https://projecteuler.net/problem=34 145 is a curious number, as 1! + 4! + 5! = 1 + 24 + 120 = 145. Find the sum of all numbers which are equal to the sum of the factorial of their digits. Note: As 1! = 1 and 2! = 2 are not sums they are not included. """ from math import factorial DIGIT_FACTORIAL = {str(d): factorial(d) for d in range(10)} def sum_of_digit_factorial(n: int) -> int: """ Returns the sum of the factorial of digits in n >>> sum_of_digit_factorial(15) 121 >>> sum_of_digit_factorial(0) 1 """ return sum(DIGIT_FACTORIAL[d] for d in str(n)) def solution() -> int: """ Returns the sum of all numbers whose sum of the factorials of all digits add up to the number itself. >>> solution() 40730 """ limit = 7 * factorial(9) + 1 return sum(i for i in range(3, limit) if sum_of_digit_factorial(i) == i) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_035/__init__.py ================================================ ================================================ FILE: project_euler/problem_035/sol1.py ================================================ """ Project Euler Problem 35 https://projecteuler.net/problem=35 Problem Statement: The number 197 is called a circular prime because all rotations of the digits: 197, 971, and 719, are themselves prime. There are thirteen such primes below 100: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, and 97. How many circular primes are there below one million? To solve this problem in an efficient manner, we will first mark all the primes below 1 million using the Sieve of Eratosthenes. Then, out of all these primes, we will rule out the numbers which contain an even digit. After this we will generate each circular combination of the number and check if all are prime. """ from __future__ import annotations sieve = [True] * 1000001 i = 2 while i * i <= 1000000: if sieve[i]: for j in range(i * i, 1000001, i): sieve[j] = False i += 1 def is_prime(n: int) -> bool: """ For 2 <= n <= 1000000, return True if n is prime. >>> is_prime(87) False >>> is_prime(23) True >>> is_prime(25363) False """ return sieve[n] def contains_an_even_digit(n: int) -> bool: """ Return True if n contains an even digit. >>> contains_an_even_digit(0) True >>> contains_an_even_digit(975317933) False >>> contains_an_even_digit(-245679) True """ return any(digit in "02468" for digit in str(n)) def find_circular_primes(limit: int = 1000000) -> list[int]: """ Return circular primes below limit. >>> len(find_circular_primes(100)) 13 >>> len(find_circular_primes(1000000)) 55 """ result = [2] # result already includes the number 2. for num in range(3, limit + 1, 2): if is_prime(num) and not contains_an_even_digit(num): str_num = str(num) list_nums = [int(str_num[j:] + str_num[:j]) for j in range(len(str_num))] if all(is_prime(i) for i in list_nums): result.append(num) return result def solution() -> int: """ >>> solution() 55 """ return len(find_circular_primes()) if __name__ == "__main__": print(f"{len(find_circular_primes()) = }") ================================================ FILE: project_euler/problem_036/__init__.py ================================================ ================================================ FILE: project_euler/problem_036/sol1.py ================================================ """ Project Euler Problem 36 https://projecteuler.net/problem=36 Problem Statement: Double-base palindromes Problem 36 The decimal number, 585 = 10010010012 (binary), is palindromic in both bases. Find the sum of all numbers, less than one million, which are palindromic in base 10 and base 2. (Please note that the palindromic number, in either base, may not include leading zeros.) """ from __future__ import annotations def is_palindrome(n: int | str) -> bool: """ Return true if the input n is a palindrome. Otherwise return false. n can be an integer or a string. >>> is_palindrome(909) True >>> is_palindrome(908) False >>> is_palindrome('10101') True >>> is_palindrome('10111') False """ n = str(n) return n == n[::-1] def solution(n: int = 1000000): """Return the sum of all numbers, less than n , which are palindromic in base 10 and base 2. >>> solution(1000000) 872187 >>> solution(500000) 286602 >>> solution(100000) 286602 >>> solution(1000) 1772 >>> solution(100) 157 >>> solution(10) 25 >>> solution(2) 1 >>> solution(1) 0 """ total = 0 for i in range(1, n): if is_palindrome(i) and is_palindrome(bin(i).split("b")[1]): total += i return total if __name__ == "__main__": print(solution(int(str(input().strip())))) ================================================ FILE: project_euler/problem_037/__init__.py ================================================ ================================================ FILE: project_euler/problem_037/sol1.py ================================================ """ Truncatable primes Problem 37: https://projecteuler.net/problem=37 The number 3797 has an interesting property. Being prime itself, it is possible to continuously remove digits from left to right, and remain prime at each stage: 3797, 797, 97, and 7. Similarly we can work from right to left: 3797, 379, 37, and 3. Find the sum of the only eleven primes that are both truncatable from left to right and right to left. NOTE: 2, 3, 5, and 7 are not considered to be truncatable primes. """ from __future__ import annotations import math def is_prime(number: int) -> bool: """Checks to see if a number is a prime in O(sqrt(n)). A number is prime if it has exactly two factors: 1 and itself. >>> is_prime(0) False >>> is_prime(1) False >>> is_prime(2) True >>> is_prime(3) True >>> is_prime(27) False >>> is_prime(87) False >>> is_prime(563) True >>> is_prime(2999) True >>> is_prime(67483) False """ if 1 < number < 4: # 2 and 3 are primes return True elif number < 2 or number % 2 == 0 or number % 3 == 0: # Negatives, 0, 1, all even numbers, all multiples of 3 are not primes return False # All primes number are in format of 6k +/- 1 for i in range(5, int(math.sqrt(number) + 1), 6): if number % i == 0 or number % (i + 2) == 0: return False return True def list_truncated_nums(n: int) -> list[int]: """ Returns a list of all left and right truncated numbers of n >>> list_truncated_nums(927628) [927628, 27628, 92762, 7628, 9276, 628, 927, 28, 92, 8, 9] >>> list_truncated_nums(467) [467, 67, 46, 7, 4] >>> list_truncated_nums(58) [58, 8, 5] """ str_num = str(n) list_nums = [n] for i in range(1, len(str_num)): list_nums.append(int(str_num[i:])) list_nums.append(int(str_num[:-i])) return list_nums def validate(n: int) -> bool: """ To optimize the approach, we will rule out the numbers above 1000, whose first or last three digits are not prime >>> validate(74679) False >>> validate(235693) False >>> validate(3797) True """ return not ( len(str(n)) > 3 and (not is_prime(int(str(n)[-3:])) or not is_prime(int(str(n)[:3]))) ) def compute_truncated_primes(count: int = 11) -> list[int]: """ Returns the list of truncated primes >>> compute_truncated_primes(11) [23, 37, 53, 73, 313, 317, 373, 797, 3137, 3797, 739397] """ list_truncated_primes: list[int] = [] num = 13 while len(list_truncated_primes) != count: if validate(num): list_nums = list_truncated_nums(num) if all(is_prime(i) for i in list_nums): list_truncated_primes.append(num) num += 2 return list_truncated_primes def solution() -> int: """ Returns the sum of truncated primes """ return sum(compute_truncated_primes(11)) if __name__ == "__main__": print(f"{sum(compute_truncated_primes(11)) = }") ================================================ FILE: project_euler/problem_038/__init__.py ================================================ ================================================ FILE: project_euler/problem_038/sol1.py ================================================ """ Project Euler Problem 38: https://projecteuler.net/problem=38 Take the number 192 and multiply it by each of 1, 2, and 3: 192 x 1 = 192 192 x 2 = 384 192 x 3 = 576 By concatenating each product we get the 1 to 9 pandigital, 192384576. We will call 192384576 the concatenated product of 192 and (1,2,3) The same can be achieved by starting with 9 and multiplying by 1, 2, 3, 4, and 5, giving the pandigital, 918273645, which is the concatenated product of 9 and (1,2,3,4,5). What is the largest 1 to 9 pandigital 9-digit number that can be formed as the concatenated product of an integer with (1,2, ... , n) where n > 1? Solution: Since n>1, the largest candidate for the solution will be a concactenation of a 4-digit number and its double, a 5-digit number. Let a be the 4-digit number. a has 4 digits => 1000 <= a < 10000 2a has 5 digits => 10000 <= 2a < 100000 => 5000 <= a < 10000 The concatenation of a with 2a = a * 10^5 + 2a so our candidate for a given a is 100002 * a. We iterate through the search space 5000 <= a < 10000 in reverse order, calculating the candidates for each a and checking if they are 1-9 pandigital. In case there are no 4-digit numbers that satisfy this property, we check the 3-digit numbers with a similar formula (the example a=192 gives a lower bound on the length of a): a has 3 digits, etc... => 100 <= a < 334, candidate = a * 10^6 + 2a * 10^3 + 3a = 1002003 * a """ from __future__ import annotations def is_9_pandigital(n: int) -> bool: """ Checks whether n is a 9-digit 1 to 9 pandigital number. >>> is_9_pandigital(12345) False >>> is_9_pandigital(156284973) True >>> is_9_pandigital(1562849733) False """ s = str(n) return len(s) == 9 and set(s) == set("123456789") def solution() -> int | None: """ Return the largest 1 to 9 pandigital 9-digital number that can be formed as the concatenated product of an integer with (1,2,...,n) where n > 1. """ for base_num in range(9999, 4999, -1): candidate = 100002 * base_num if is_9_pandigital(candidate): return candidate for base_num in range(333, 99, -1): candidate = 1002003 * base_num if is_9_pandigital(candidate): return candidate return None if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_039/__init__.py ================================================ ================================================ FILE: project_euler/problem_039/sol1.py ================================================ """ Problem 39: https://projecteuler.net/problem=39 If p is the perimeter of a right angle triangle with integral length sides, {a,b,c}, there are exactly three solutions for p = 120. {20,48,52}, {24,45,51}, {30,40,50} For which value of p ≤ 1000, is the number of solutions maximised? """ from __future__ import annotations import typing from collections import Counter def pythagorean_triple(max_perimeter: int) -> typing.Counter[int]: """ Returns a dictionary with keys as the perimeter of a right angled triangle and value as the number of corresponding triplets. >>> pythagorean_triple(15) Counter({12: 1}) >>> pythagorean_triple(40) Counter({12: 1, 30: 1, 24: 1, 40: 1, 36: 1}) >>> pythagorean_triple(50) Counter({12: 1, 30: 1, 24: 1, 40: 1, 36: 1, 48: 1}) """ triplets: typing.Counter[int] = Counter() for base in range(1, max_perimeter + 1): for perpendicular in range(base, max_perimeter + 1): hypotenuse = (base * base + perpendicular * perpendicular) ** 0.5 if hypotenuse == int(hypotenuse): perimeter = int(base + perpendicular + hypotenuse) if perimeter > max_perimeter: continue triplets[perimeter] += 1 return triplets def solution(n: int = 1000) -> int: """ Returns perimeter with maximum solutions. >>> solution(100) 90 >>> solution(200) 180 >>> solution(1000) 840 """ triplets = pythagorean_triple(n) return triplets.most_common(1)[0][0] if __name__ == "__main__": print(f"Perimeter {solution()} has maximum solutions") ================================================ FILE: project_euler/problem_040/__init__.py ================================================ ================================================ FILE: project_euler/problem_040/sol1.py ================================================ """ Champernowne's constant Problem 40 An irrational decimal fraction is created by concatenating the positive integers: 0.123456789101112131415161718192021... It can be seen that the 12th digit of the fractional part is 1. If dn represents the nth digit of the fractional part, find the value of the following expression. d1 x d10 x d100 x d1000 x d10000 x d100000 x d1000000 """ def solution(): """Returns >>> solution() 210 """ constant = [] i = 1 while len(constant) < 1e6: constant.append(str(i)) i += 1 constant = "".join(constant) return ( int(constant[0]) * int(constant[9]) * int(constant[99]) * int(constant[999]) * int(constant[9999]) * int(constant[99999]) * int(constant[999999]) ) if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_041/__init__.py ================================================ ================================================ FILE: project_euler/problem_041/sol1.py ================================================ """ Pandigital prime Problem 41: https://projecteuler.net/problem=41 We shall say that an n-digit number is pandigital if it makes use of all the digits 1 to n exactly once. For example, 2143 is a 4-digit pandigital and is also prime. What is the largest n-digit pandigital prime that exists? All pandigital numbers except for 1, 4 ,7 pandigital numbers are divisible by 3. So we will check only 7 digit pandigital numbers to obtain the largest possible pandigital prime. """ from __future__ import annotations import math from itertools import permutations def is_prime(number: int) -> bool: """Checks to see if a number is a prime in O(sqrt(n)). A number is prime if it has exactly two factors: 1 and itself. >>> is_prime(0) False >>> is_prime(1) False >>> is_prime(2) True >>> is_prime(3) True >>> is_prime(27) False >>> is_prime(87) False >>> is_prime(563) True >>> is_prime(2999) True >>> is_prime(67483) False """ if 1 < number < 4: # 2 and 3 are primes return True elif number < 2 or number % 2 == 0 or number % 3 == 0: # Negatives, 0, 1, all even numbers, all multiples of 3 are not primes return False # All primes number are in format of 6k +/- 1 for i in range(5, int(math.sqrt(number) + 1), 6): if number % i == 0 or number % (i + 2) == 0: return False return True def solution(n: int = 7) -> int: """ Returns the maximum pandigital prime number of length n. If there are none, then it will return 0. >>> solution(2) 0 >>> solution(4) 4231 >>> solution(7) 7652413 """ pandigital_str = "".join(str(i) for i in range(1, n + 1)) perm_list = [int("".join(i)) for i in permutations(pandigital_str, n)] pandigitals = [num for num in perm_list if is_prime(num)] return max(pandigitals) if pandigitals else 0 if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_042/__init__.py ================================================ ================================================ FILE: project_euler/problem_042/solution42.py ================================================ """ The nth term of the sequence of triangle numbers is given by, tn = ½n(n+1); so the first ten triangle numbers are: 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ... By converting each letter in a word to a number corresponding to its alphabetical position and adding these values we form a word value. For example, the word value for SKY is 19 + 11 + 25 = 55 = t10. If the word value is a triangle number then we shall call the word a triangle word. Using words.txt (right click and 'Save Link/Target As...'), a 16K text file containing nearly two-thousand common English words, how many are triangle words? """ import os # Precomputes a list of the 100 first triangular numbers TRIANGULAR_NUMBERS = [int(0.5 * n * (n + 1)) for n in range(1, 101)] def solution(): """ Finds the amount of triangular words in the words file. >>> solution() 162 """ script_dir = os.path.dirname(os.path.realpath(__file__)) words_file_path = os.path.join(script_dir, "words.txt") words = "" with open(words_file_path) as f: words = f.readline() words = [word.strip('"') for word in words.strip("\r\n").split(",")] words = [ word for word in [sum(ord(x) - 64 for x in word) for word in words] if word in TRIANGULAR_NUMBERS ] return len(words) if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_042/words.txt ================================================ "A","ABILITY","ABLE","ABOUT","ABOVE","ABSENCE","ABSOLUTELY","ACADEMIC","ACCEPT","ACCESS","ACCIDENT","ACCOMPANY","ACCORDING","ACCOUNT","ACHIEVE","ACHIEVEMENT","ACID","ACQUIRE","ACROSS","ACT","ACTION","ACTIVE","ACTIVITY","ACTUAL","ACTUALLY","ADD","ADDITION","ADDITIONAL","ADDRESS","ADMINISTRATION","ADMIT","ADOPT","ADULT","ADVANCE","ADVANTAGE","ADVICE","ADVISE","AFFAIR","AFFECT","AFFORD","AFRAID","AFTER","AFTERNOON","AFTERWARDS","AGAIN","AGAINST","AGE","AGENCY","AGENT","AGO","AGREE","AGREEMENT","AHEAD","AID","AIM","AIR","AIRCRAFT","ALL","ALLOW","ALMOST","ALONE","ALONG","ALREADY","ALRIGHT","ALSO","ALTERNATIVE","ALTHOUGH","ALWAYS","AMONG","AMONGST","AMOUNT","AN","ANALYSIS","ANCIENT","AND","ANIMAL","ANNOUNCE","ANNUAL","ANOTHER","ANSWER","ANY","ANYBODY","ANYONE","ANYTHING","ANYWAY","APART","APPARENT","APPARENTLY","APPEAL","APPEAR","APPEARANCE","APPLICATION","APPLY","APPOINT","APPOINTMENT","APPROACH","APPROPRIATE","APPROVE","AREA","ARGUE","ARGUMENT","ARISE","ARM","ARMY","AROUND","ARRANGE","ARRANGEMENT","ARRIVE","ART","ARTICLE","ARTIST","AS","ASK","ASPECT","ASSEMBLY","ASSESS","ASSESSMENT","ASSET","ASSOCIATE","ASSOCIATION","ASSUME","ASSUMPTION","AT","ATMOSPHERE","ATTACH","ATTACK","ATTEMPT","ATTEND","ATTENTION","ATTITUDE","ATTRACT","ATTRACTIVE","AUDIENCE","AUTHOR","AUTHORITY","AVAILABLE","AVERAGE","AVOID","AWARD","AWARE","AWAY","AYE","BABY","BACK","BACKGROUND","BAD","BAG","BALANCE","BALL","BAND","BANK","BAR","BASE","BASIC","BASIS","BATTLE","BE","BEAR","BEAT","BEAUTIFUL","BECAUSE","BECOME","BED","BEDROOM","BEFORE","BEGIN","BEGINNING","BEHAVIOUR","BEHIND","BELIEF","BELIEVE","BELONG","BELOW","BENEATH","BENEFIT","BESIDE","BEST","BETTER","BETWEEN","BEYOND","BIG","BILL","BIND","BIRD","BIRTH","BIT","BLACK","BLOCK","BLOOD","BLOODY","BLOW","BLUE","BOARD","BOAT","BODY","BONE","BOOK","BORDER","BOTH","BOTTLE","BOTTOM","BOX","BOY","BRAIN","BRANCH","BREAK","BREATH","BRIDGE","BRIEF","BRIGHT","BRING","BROAD","BROTHER","BUDGET","BUILD","BUILDING","BURN","BUS","BUSINESS","BUSY","BUT","BUY","BY","CABINET","CALL","CAMPAIGN","CAN","CANDIDATE","CAPABLE","CAPACITY","CAPITAL","CAR","CARD","CARE","CAREER","CAREFUL","CAREFULLY","CARRY","CASE","CASH","CAT","CATCH","CATEGORY","CAUSE","CELL","CENTRAL","CENTRE","CENTURY","CERTAIN","CERTAINLY","CHAIN","CHAIR","CHAIRMAN","CHALLENGE","CHANCE","CHANGE","CHANNEL","CHAPTER","CHARACTER","CHARACTERISTIC","CHARGE","CHEAP","CHECK","CHEMICAL","CHIEF","CHILD","CHOICE","CHOOSE","CHURCH","CIRCLE","CIRCUMSTANCE","CITIZEN","CITY","CIVIL","CLAIM","CLASS","CLEAN","CLEAR","CLEARLY","CLIENT","CLIMB","CLOSE","CLOSELY","CLOTHES","CLUB","COAL","CODE","COFFEE","COLD","COLLEAGUE","COLLECT","COLLECTION","COLLEGE","COLOUR","COMBINATION","COMBINE","COME","COMMENT","COMMERCIAL","COMMISSION","COMMIT","COMMITMENT","COMMITTEE","COMMON","COMMUNICATION","COMMUNITY","COMPANY","COMPARE","COMPARISON","COMPETITION","COMPLETE","COMPLETELY","COMPLEX","COMPONENT","COMPUTER","CONCENTRATE","CONCENTRATION","CONCEPT","CONCERN","CONCERNED","CONCLUDE","CONCLUSION","CONDITION","CONDUCT","CONFERENCE","CONFIDENCE","CONFIRM","CONFLICT","CONGRESS","CONNECT","CONNECTION","CONSEQUENCE","CONSERVATIVE","CONSIDER","CONSIDERABLE","CONSIDERATION","CONSIST","CONSTANT","CONSTRUCTION","CONSUMER","CONTACT","CONTAIN","CONTENT","CONTEXT","CONTINUE","CONTRACT","CONTRAST","CONTRIBUTE","CONTRIBUTION","CONTROL","CONVENTION","CONVERSATION","COPY","CORNER","CORPORATE","CORRECT","COS","COST","COULD","COUNCIL","COUNT","COUNTRY","COUNTY","COUPLE","COURSE","COURT","COVER","CREATE","CREATION","CREDIT","CRIME","CRIMINAL","CRISIS","CRITERION","CRITICAL","CRITICISM","CROSS","CROWD","CRY","CULTURAL","CULTURE","CUP","CURRENT","CURRENTLY","CURRICULUM","CUSTOMER","CUT","DAMAGE","DANGER","DANGEROUS","DARK","DATA","DATE","DAUGHTER","DAY","DEAD","DEAL","DEATH","DEBATE","DEBT","DECADE","DECIDE","DECISION","DECLARE","DEEP","DEFENCE","DEFENDANT","DEFINE","DEFINITION","DEGREE","DELIVER","DEMAND","DEMOCRATIC","DEMONSTRATE","DENY","DEPARTMENT","DEPEND","DEPUTY","DERIVE","DESCRIBE","DESCRIPTION","DESIGN","DESIRE","DESK","DESPITE","DESTROY","DETAIL","DETAILED","DETERMINE","DEVELOP","DEVELOPMENT","DEVICE","DIE","DIFFERENCE","DIFFERENT","DIFFICULT","DIFFICULTY","DINNER","DIRECT","DIRECTION","DIRECTLY","DIRECTOR","DISAPPEAR","DISCIPLINE","DISCOVER","DISCUSS","DISCUSSION","DISEASE","DISPLAY","DISTANCE","DISTINCTION","DISTRIBUTION","DISTRICT","DIVIDE","DIVISION","DO","DOCTOR","DOCUMENT","DOG","DOMESTIC","DOOR","DOUBLE","DOUBT","DOWN","DRAW","DRAWING","DREAM","DRESS","DRINK","DRIVE","DRIVER","DROP","DRUG","DRY","DUE","DURING","DUTY","EACH","EAR","EARLY","EARN","EARTH","EASILY","EAST","EASY","EAT","ECONOMIC","ECONOMY","EDGE","EDITOR","EDUCATION","EDUCATIONAL","EFFECT","EFFECTIVE","EFFECTIVELY","EFFORT","EGG","EITHER","ELDERLY","ELECTION","ELEMENT","ELSE","ELSEWHERE","EMERGE","EMPHASIS","EMPLOY","EMPLOYEE","EMPLOYER","EMPLOYMENT","EMPTY","ENABLE","ENCOURAGE","END","ENEMY","ENERGY","ENGINE","ENGINEERING","ENJOY","ENOUGH","ENSURE","ENTER","ENTERPRISE","ENTIRE","ENTIRELY","ENTITLE","ENTRY","ENVIRONMENT","ENVIRONMENTAL","EQUAL","EQUALLY","EQUIPMENT","ERROR","ESCAPE","ESPECIALLY","ESSENTIAL","ESTABLISH","ESTABLISHMENT","ESTATE","ESTIMATE","EVEN","EVENING","EVENT","EVENTUALLY","EVER","EVERY","EVERYBODY","EVERYONE","EVERYTHING","EVIDENCE","EXACTLY","EXAMINATION","EXAMINE","EXAMPLE","EXCELLENT","EXCEPT","EXCHANGE","EXECUTIVE","EXERCISE","EXHIBITION","EXIST","EXISTENCE","EXISTING","EXPECT","EXPECTATION","EXPENDITURE","EXPENSE","EXPENSIVE","EXPERIENCE","EXPERIMENT","EXPERT","EXPLAIN","EXPLANATION","EXPLORE","EXPRESS","EXPRESSION","EXTEND","EXTENT","EXTERNAL","EXTRA","EXTREMELY","EYE","FACE","FACILITY","FACT","FACTOR","FACTORY","FAIL","FAILURE","FAIR","FAIRLY","FAITH","FALL","FAMILIAR","FAMILY","FAMOUS","FAR","FARM","FARMER","FASHION","FAST","FATHER","FAVOUR","FEAR","FEATURE","FEE","FEEL","FEELING","FEMALE","FEW","FIELD","FIGHT","FIGURE","FILE","FILL","FILM","FINAL","FINALLY","FINANCE","FINANCIAL","FIND","FINDING","FINE","FINGER","FINISH","FIRE","FIRM","FIRST","FISH","FIT","FIX","FLAT","FLIGHT","FLOOR","FLOW","FLOWER","FLY","FOCUS","FOLLOW","FOLLOWING","FOOD","FOOT","FOOTBALL","FOR","FORCE","FOREIGN","FOREST","FORGET","FORM","FORMAL","FORMER","FORWARD","FOUNDATION","FREE","FREEDOM","FREQUENTLY","FRESH","FRIEND","FROM","FRONT","FRUIT","FUEL","FULL","FULLY","FUNCTION","FUND","FUNNY","FURTHER","FUTURE","GAIN","GAME","GARDEN","GAS","GATE","GATHER","GENERAL","GENERALLY","GENERATE","GENERATION","GENTLEMAN","GET","GIRL","GIVE","GLASS","GO","GOAL","GOD","GOLD","GOOD","GOVERNMENT","GRANT","GREAT","GREEN","GREY","GROUND","GROUP","GROW","GROWING","GROWTH","GUEST","GUIDE","GUN","HAIR","HALF","HALL","HAND","HANDLE","HANG","HAPPEN","HAPPY","HARD","HARDLY","HATE","HAVE","HE","HEAD","HEALTH","HEAR","HEART","HEAT","HEAVY","HELL","HELP","HENCE","HER","HERE","HERSELF","HIDE","HIGH","HIGHLY","HILL","HIM","HIMSELF","HIS","HISTORICAL","HISTORY","HIT","HOLD","HOLE","HOLIDAY","HOME","HOPE","HORSE","HOSPITAL","HOT","HOTEL","HOUR","HOUSE","HOUSEHOLD","HOUSING","HOW","HOWEVER","HUGE","HUMAN","HURT","HUSBAND","I","IDEA","IDENTIFY","IF","IGNORE","ILLUSTRATE","IMAGE","IMAGINE","IMMEDIATE","IMMEDIATELY","IMPACT","IMPLICATION","IMPLY","IMPORTANCE","IMPORTANT","IMPOSE","IMPOSSIBLE","IMPRESSION","IMPROVE","IMPROVEMENT","IN","INCIDENT","INCLUDE","INCLUDING","INCOME","INCREASE","INCREASED","INCREASINGLY","INDEED","INDEPENDENT","INDEX","INDICATE","INDIVIDUAL","INDUSTRIAL","INDUSTRY","INFLUENCE","INFORM","INFORMATION","INITIAL","INITIATIVE","INJURY","INSIDE","INSIST","INSTANCE","INSTEAD","INSTITUTE","INSTITUTION","INSTRUCTION","INSTRUMENT","INSURANCE","INTEND","INTENTION","INTEREST","INTERESTED","INTERESTING","INTERNAL","INTERNATIONAL","INTERPRETATION","INTERVIEW","INTO","INTRODUCE","INTRODUCTION","INVESTIGATE","INVESTIGATION","INVESTMENT","INVITE","INVOLVE","IRON","IS","ISLAND","ISSUE","IT","ITEM","ITS","ITSELF","JOB","JOIN","JOINT","JOURNEY","JUDGE","JUMP","JUST","JUSTICE","KEEP","KEY","KID","KILL","KIND","KING","KITCHEN","KNEE","KNOW","KNOWLEDGE","LABOUR","LACK","LADY","LAND","LANGUAGE","LARGE","LARGELY","LAST","LATE","LATER","LATTER","LAUGH","LAUNCH","LAW","LAWYER","LAY","LEAD","LEADER","LEADERSHIP","LEADING","LEAF","LEAGUE","LEAN","LEARN","LEAST","LEAVE","LEFT","LEG","LEGAL","LEGISLATION","LENGTH","LESS","LET","LETTER","LEVEL","LIABILITY","LIBERAL","LIBRARY","LIE","LIFE","LIFT","LIGHT","LIKE","LIKELY","LIMIT","LIMITED","LINE","LINK","LIP","LIST","LISTEN","LITERATURE","LITTLE","LIVE","LIVING","LOAN","LOCAL","LOCATION","LONG","LOOK","LORD","LOSE","LOSS","LOT","LOVE","LOVELY","LOW","LUNCH","MACHINE","MAGAZINE","MAIN","MAINLY","MAINTAIN","MAJOR","MAJORITY","MAKE","MALE","MAN","MANAGE","MANAGEMENT","MANAGER","MANNER","MANY","MAP","MARK","MARKET","MARRIAGE","MARRIED","MARRY","MASS","MASTER","MATCH","MATERIAL","MATTER","MAY","MAYBE","ME","MEAL","MEAN","MEANING","MEANS","MEANWHILE","MEASURE","MECHANISM","MEDIA","MEDICAL","MEET","MEETING","MEMBER","MEMBERSHIP","MEMORY","MENTAL","MENTION","MERELY","MESSAGE","METAL","METHOD","MIDDLE","MIGHT","MILE","MILITARY","MILK","MIND","MINE","MINISTER","MINISTRY","MINUTE","MISS","MISTAKE","MODEL","MODERN","MODULE","MOMENT","MONEY","MONTH","MORE","MORNING","MOST","MOTHER","MOTION","MOTOR","MOUNTAIN","MOUTH","MOVE","MOVEMENT","MUCH","MURDER","MUSEUM","MUSIC","MUST","MY","MYSELF","NAME","NARROW","NATION","NATIONAL","NATURAL","NATURE","NEAR","NEARLY","NECESSARILY","NECESSARY","NECK","NEED","NEGOTIATION","NEIGHBOUR","NEITHER","NETWORK","NEVER","NEVERTHELESS","NEW","NEWS","NEWSPAPER","NEXT","NICE","NIGHT","NO","NOBODY","NOD","NOISE","NONE","NOR","NORMAL","NORMALLY","NORTH","NORTHERN","NOSE","NOT","NOTE","NOTHING","NOTICE","NOTION","NOW","NUCLEAR","NUMBER","NURSE","OBJECT","OBJECTIVE","OBSERVATION","OBSERVE","OBTAIN","OBVIOUS","OBVIOUSLY","OCCASION","OCCUR","ODD","OF","OFF","OFFENCE","OFFER","OFFICE","OFFICER","OFFICIAL","OFTEN","OIL","OKAY","OLD","ON","ONCE","ONE","ONLY","ONTO","OPEN","OPERATE","OPERATION","OPINION","OPPORTUNITY","OPPOSITION","OPTION","OR","ORDER","ORDINARY","ORGANISATION","ORGANISE","ORGANIZATION","ORIGIN","ORIGINAL","OTHER","OTHERWISE","OUGHT","OUR","OURSELVES","OUT","OUTCOME","OUTPUT","OUTSIDE","OVER","OVERALL","OWN","OWNER","PACKAGE","PAGE","PAIN","PAINT","PAINTING","PAIR","PANEL","PAPER","PARENT","PARK","PARLIAMENT","PART","PARTICULAR","PARTICULARLY","PARTLY","PARTNER","PARTY","PASS","PASSAGE","PAST","PATH","PATIENT","PATTERN","PAY","PAYMENT","PEACE","PENSION","PEOPLE","PER","PERCENT","PERFECT","PERFORM","PERFORMANCE","PERHAPS","PERIOD","PERMANENT","PERSON","PERSONAL","PERSUADE","PHASE","PHONE","PHOTOGRAPH","PHYSICAL","PICK","PICTURE","PIECE","PLACE","PLAN","PLANNING","PLANT","PLASTIC","PLATE","PLAY","PLAYER","PLEASE","PLEASURE","PLENTY","PLUS","POCKET","POINT","POLICE","POLICY","POLITICAL","POLITICS","POOL","POOR","POPULAR","POPULATION","POSITION","POSITIVE","POSSIBILITY","POSSIBLE","POSSIBLY","POST","POTENTIAL","POUND","POWER","POWERFUL","PRACTICAL","PRACTICE","PREFER","PREPARE","PRESENCE","PRESENT","PRESIDENT","PRESS","PRESSURE","PRETTY","PREVENT","PREVIOUS","PREVIOUSLY","PRICE","PRIMARY","PRIME","PRINCIPLE","PRIORITY","PRISON","PRISONER","PRIVATE","PROBABLY","PROBLEM","PROCEDURE","PROCESS","PRODUCE","PRODUCT","PRODUCTION","PROFESSIONAL","PROFIT","PROGRAM","PROGRAMME","PROGRESS","PROJECT","PROMISE","PROMOTE","PROPER","PROPERLY","PROPERTY","PROPORTION","PROPOSE","PROPOSAL","PROSPECT","PROTECT","PROTECTION","PROVE","PROVIDE","PROVIDED","PROVISION","PUB","PUBLIC","PUBLICATION","PUBLISH","PULL","PUPIL","PURPOSE","PUSH","PUT","QUALITY","QUARTER","QUESTION","QUICK","QUICKLY","QUIET","QUITE","RACE","RADIO","RAILWAY","RAIN","RAISE","RANGE","RAPIDLY","RARE","RATE","RATHER","REACH","REACTION","READ","READER","READING","READY","REAL","REALISE","REALITY","REALIZE","REALLY","REASON","REASONABLE","RECALL","RECEIVE","RECENT","RECENTLY","RECOGNISE","RECOGNITION","RECOGNIZE","RECOMMEND","RECORD","RECOVER","RED","REDUCE","REDUCTION","REFER","REFERENCE","REFLECT","REFORM","REFUSE","REGARD","REGION","REGIONAL","REGULAR","REGULATION","REJECT","RELATE","RELATION","RELATIONSHIP","RELATIVE","RELATIVELY","RELEASE","RELEVANT","RELIEF","RELIGION","RELIGIOUS","RELY","REMAIN","REMEMBER","REMIND","REMOVE","REPEAT","REPLACE","REPLY","REPORT","REPRESENT","REPRESENTATION","REPRESENTATIVE","REQUEST","REQUIRE","REQUIREMENT","RESEARCH","RESOURCE","RESPECT","RESPOND","RESPONSE","RESPONSIBILITY","RESPONSIBLE","REST","RESTAURANT","RESULT","RETAIN","RETURN","REVEAL","REVENUE","REVIEW","REVOLUTION","RICH","RIDE","RIGHT","RING","RISE","RISK","RIVER","ROAD","ROCK","ROLE","ROLL","ROOF","ROOM","ROUND","ROUTE","ROW","ROYAL","RULE","RUN","RURAL","SAFE","SAFETY","SALE","SAME","SAMPLE","SATISFY","SAVE","SAY","SCALE","SCENE","SCHEME","SCHOOL","SCIENCE","SCIENTIFIC","SCIENTIST","SCORE","SCREEN","SEA","SEARCH","SEASON","SEAT","SECOND","SECONDARY","SECRETARY","SECTION","SECTOR","SECURE","SECURITY","SEE","SEEK","SEEM","SELECT","SELECTION","SELL","SEND","SENIOR","SENSE","SENTENCE","SEPARATE","SEQUENCE","SERIES","SERIOUS","SERIOUSLY","SERVANT","SERVE","SERVICE","SESSION","SET","SETTLE","SETTLEMENT","SEVERAL","SEVERE","SEX","SEXUAL","SHAKE","SHALL","SHAPE","SHARE","SHE","SHEET","SHIP","SHOE","SHOOT","SHOP","SHORT","SHOT","SHOULD","SHOULDER","SHOUT","SHOW","SHUT","SIDE","SIGHT","SIGN","SIGNAL","SIGNIFICANCE","SIGNIFICANT","SILENCE","SIMILAR","SIMPLE","SIMPLY","SINCE","SING","SINGLE","SIR","SISTER","SIT","SITE","SITUATION","SIZE","SKILL","SKIN","SKY","SLEEP","SLIGHTLY","SLIP","SLOW","SLOWLY","SMALL","SMILE","SO","SOCIAL","SOCIETY","SOFT","SOFTWARE","SOIL","SOLDIER","SOLICITOR","SOLUTION","SOME","SOMEBODY","SOMEONE","SOMETHING","SOMETIMES","SOMEWHAT","SOMEWHERE","SON","SONG","SOON","SORRY","SORT","SOUND","SOURCE","SOUTH","SOUTHERN","SPACE","SPEAK","SPEAKER","SPECIAL","SPECIES","SPECIFIC","SPEECH","SPEED","SPEND","SPIRIT","SPORT","SPOT","SPREAD","SPRING","STAFF","STAGE","STAND","STANDARD","STAR","START","STATE","STATEMENT","STATION","STATUS","STAY","STEAL","STEP","STICK","STILL","STOCK","STONE","STOP","STORE","STORY","STRAIGHT","STRANGE","STRATEGY","STREET","STRENGTH","STRIKE","STRONG","STRONGLY","STRUCTURE","STUDENT","STUDIO","STUDY","STUFF","STYLE","SUBJECT","SUBSTANTIAL","SUCCEED","SUCCESS","SUCCESSFUL","SUCH","SUDDENLY","SUFFER","SUFFICIENT","SUGGEST","SUGGESTION","SUITABLE","SUM","SUMMER","SUN","SUPPLY","SUPPORT","SUPPOSE","SURE","SURELY","SURFACE","SURPRISE","SURROUND","SURVEY","SURVIVE","SWITCH","SYSTEM","TABLE","TAKE","TALK","TALL","TAPE","TARGET","TASK","TAX","TEA","TEACH","TEACHER","TEACHING","TEAM","TEAR","TECHNICAL","TECHNIQUE","TECHNOLOGY","TELEPHONE","TELEVISION","TELL","TEMPERATURE","TEND","TERM","TERMS","TERRIBLE","TEST","TEXT","THAN","THANK","THANKS","THAT","THE","THEATRE","THEIR","THEM","THEME","THEMSELVES","THEN","THEORY","THERE","THEREFORE","THESE","THEY","THIN","THING","THINK","THIS","THOSE","THOUGH","THOUGHT","THREAT","THREATEN","THROUGH","THROUGHOUT","THROW","THUS","TICKET","TIME","TINY","TITLE","TO","TODAY","TOGETHER","TOMORROW","TONE","TONIGHT","TOO","TOOL","TOOTH","TOP","TOTAL","TOTALLY","TOUCH","TOUR","TOWARDS","TOWN","TRACK","TRADE","TRADITION","TRADITIONAL","TRAFFIC","TRAIN","TRAINING","TRANSFER","TRANSPORT","TRAVEL","TREAT","TREATMENT","TREATY","TREE","TREND","TRIAL","TRIP","TROOP","TROUBLE","TRUE","TRUST","TRUTH","TRY","TURN","TWICE","TYPE","TYPICAL","UNABLE","UNDER","UNDERSTAND","UNDERSTANDING","UNDERTAKE","UNEMPLOYMENT","UNFORTUNATELY","UNION","UNIT","UNITED","UNIVERSITY","UNLESS","UNLIKELY","UNTIL","UP","UPON","UPPER","URBAN","US","USE","USED","USEFUL","USER","USUAL","USUALLY","VALUE","VARIATION","VARIETY","VARIOUS","VARY","VAST","VEHICLE","VERSION","VERY","VIA","VICTIM","VICTORY","VIDEO","VIEW","VILLAGE","VIOLENCE","VISION","VISIT","VISITOR","VITAL","VOICE","VOLUME","VOTE","WAGE","WAIT","WALK","WALL","WANT","WAR","WARM","WARN","WASH","WATCH","WATER","WAVE","WAY","WE","WEAK","WEAPON","WEAR","WEATHER","WEEK","WEEKEND","WEIGHT","WELCOME","WELFARE","WELL","WEST","WESTERN","WHAT","WHATEVER","WHEN","WHERE","WHEREAS","WHETHER","WHICH","WHILE","WHILST","WHITE","WHO","WHOLE","WHOM","WHOSE","WHY","WIDE","WIDELY","WIFE","WILD","WILL","WIN","WIND","WINDOW","WINE","WING","WINNER","WINTER","WISH","WITH","WITHDRAW","WITHIN","WITHOUT","WOMAN","WONDER","WONDERFUL","WOOD","WORD","WORK","WORKER","WORKING","WORKS","WORLD","WORRY","WORTH","WOULD","WRITE","WRITER","WRITING","WRONG","YARD","YEAH","YEAR","YES","YESTERDAY","YET","YOU","YOUNG","YOUR","YOURSELF","YOUTH" ================================================ FILE: project_euler/problem_043/__init__.py ================================================ ================================================ FILE: project_euler/problem_043/sol1.py ================================================ """ Problem 43: https://projecteuler.net/problem=43 The number, 1406357289, is a 0 to 9 pandigital number because it is made up of each of the digits 0 to 9 in some order, but it also has a rather interesting sub-string divisibility property. Let d1 be the 1st digit, d2 be the 2nd digit, and so on. In this way, we note the following: d2d3d4=406 is divisible by 2 d3d4d5=063 is divisible by 3 d4d5d6=635 is divisible by 5 d5d6d7=357 is divisible by 7 d6d7d8=572 is divisible by 11 d7d8d9=728 is divisible by 13 d8d9d10=289 is divisible by 17 Find the sum of all 0 to 9 pandigital numbers with this property. """ from itertools import permutations def is_substring_divisible(num: tuple) -> bool: """ Returns True if the pandigital number passes all the divisibility tests. >>> is_substring_divisible((0, 1, 2, 4, 6, 5, 7, 3, 8, 9)) False >>> is_substring_divisible((5, 1, 2, 4, 6, 0, 7, 8, 3, 9)) False >>> is_substring_divisible((1, 4, 0, 6, 3, 5, 7, 2, 8, 9)) True """ if num[3] % 2 != 0: return False if (num[2] + num[3] + num[4]) % 3 != 0: return False if num[5] % 5 != 0: return False tests = [7, 11, 13, 17] for i, test in enumerate(tests): if (num[i + 4] * 100 + num[i + 5] * 10 + num[i + 6]) % test != 0: return False return True def solution(n: int = 10) -> int: """ Returns the sum of all pandigital numbers which pass the divisibility tests. >>> solution(10) 16695334890 """ return sum( int("".join(map(str, num))) for num in permutations(range(n)) if is_substring_divisible(num) ) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_044/__init__.py ================================================ ================================================ FILE: project_euler/problem_044/sol1.py ================================================ """ Problem 44: https://projecteuler.net/problem=44 Pentagonal numbers are generated by the formula, Pn=n(3n-1)/2. The first ten pentagonal numbers are: 1, 5, 12, 22, 35, 51, 70, 92, 117, 145, ... It can be seen that P4 + P7 = 22 + 70 = 92 = P8. However, their difference, 70 - 22 = 48, is not pentagonal. Find the pair of pentagonal numbers, Pj and Pk, for which their sum and difference are pentagonal and D = |Pk - Pj| is minimised; what is the value of D? """ def is_pentagonal(n: int) -> bool: """ Returns True if n is pentagonal, False otherwise. >>> is_pentagonal(330) True >>> is_pentagonal(7683) False >>> is_pentagonal(2380) True """ root = (1 + 24 * n) ** 0.5 return ((1 + root) / 6) % 1 == 0 def solution(limit: int = 5000) -> int: """ Returns the minimum difference of two pentagonal numbers P1 and P2 such that P1 + P2 is pentagonal and P2 - P1 is pentagonal. >>> solution(5000) 5482660 """ pentagonal_nums = [(i * (3 * i - 1)) // 2 for i in range(1, limit)] for i, pentagonal_i in enumerate(pentagonal_nums): for j in range(i, len(pentagonal_nums)): pentagonal_j = pentagonal_nums[j] a = pentagonal_i + pentagonal_j b = pentagonal_j - pentagonal_i if is_pentagonal(a) and is_pentagonal(b): return b return -1 if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_045/__init__.py ================================================ ================================================ FILE: project_euler/problem_045/sol1.py ================================================ """ Problem 45: https://projecteuler.net/problem=45 Triangle, pentagonal, and hexagonal numbers are generated by the following formulae: Triangle T(n) = (n * (n + 1)) / 2 1, 3, 6, 10, 15, ... Pentagonal P(n) = (n * (3 * n - 1)) / 2 1, 5, 12, 22, 35, ... Hexagonal H(n) = n * (2 * n - 1) 1, 6, 15, 28, 45, ... It can be verified that T(285) = P(165) = H(143) = 40755. Find the next triangle number that is also pentagonal and hexagonal. All triangle numbers are hexagonal numbers. T(2n-1) = n * (2 * n - 1) = H(n) So we shall check only for hexagonal numbers which are also pentagonal. """ def hexagonal_num(n: int) -> int: """ Returns nth hexagonal number >>> hexagonal_num(143) 40755 >>> hexagonal_num(21) 861 >>> hexagonal_num(10) 190 """ return n * (2 * n - 1) def is_pentagonal(n: int) -> bool: """ Returns True if n is pentagonal, False otherwise. >>> is_pentagonal(330) True >>> is_pentagonal(7683) False >>> is_pentagonal(2380) True """ root = (1 + 24 * n) ** 0.5 return ((1 + root) / 6) % 1 == 0 def solution(start: int = 144) -> int: """ Returns the next number which is triangular, pentagonal and hexagonal. >>> solution(144) 1533776805 """ n = start num = hexagonal_num(n) while not is_pentagonal(num): n += 1 num = hexagonal_num(n) return num if __name__ == "__main__": print(f"{solution()} = ") ================================================ FILE: project_euler/problem_046/__init__.py ================================================ ================================================ FILE: project_euler/problem_046/sol1.py ================================================ """ Problem 46: https://projecteuler.net/problem=46 It was proposed by Christian Goldbach that every odd composite number can be written as the sum of a prime and twice a square. 9 = 7 + 2 x 12 15 = 7 + 2 x 22 21 = 3 + 2 x 32 25 = 7 + 2 x 32 27 = 19 + 2 x 22 33 = 31 + 2 x 12 It turns out that the conjecture was false. What is the smallest odd composite that cannot be written as the sum of a prime and twice a square? """ from __future__ import annotations import math def is_prime(number: int) -> bool: """Checks to see if a number is a prime in O(sqrt(n)). A number is prime if it has exactly two factors: 1 and itself. >>> is_prime(0) False >>> is_prime(1) False >>> is_prime(2) True >>> is_prime(3) True >>> is_prime(27) False >>> is_prime(87) False >>> is_prime(563) True >>> is_prime(2999) True >>> is_prime(67483) False """ if 1 < number < 4: # 2 and 3 are primes return True elif number < 2 or number % 2 == 0 or number % 3 == 0: # Negatives, 0, 1, all even numbers, all multiples of 3 are not primes return False # All primes number are in format of 6k +/- 1 for i in range(5, int(math.sqrt(number) + 1), 6): if number % i == 0 or number % (i + 2) == 0: return False return True odd_composites = [num for num in range(3, 100001, 2) if not is_prime(num)] def compute_nums(n: int) -> list[int]: """ Returns a list of first n odd composite numbers which do not follow the conjecture. >>> compute_nums(1) [5777] >>> compute_nums(2) [5777, 5993] >>> compute_nums(0) Traceback (most recent call last): ... ValueError: n must be >= 0 >>> compute_nums("a") Traceback (most recent call last): ... ValueError: n must be an integer >>> compute_nums(1.1) Traceback (most recent call last): ... ValueError: n must be an integer """ if not isinstance(n, int): raise ValueError("n must be an integer") if n <= 0: raise ValueError("n must be >= 0") list_nums = [] for num in range(len(odd_composites)): i = 0 while 2 * i * i <= odd_composites[num]: rem = odd_composites[num] - 2 * i * i if is_prime(rem): break i += 1 else: list_nums.append(odd_composites[num]) if len(list_nums) == n: return list_nums return [] def solution() -> int: """Return the solution to the problem""" return compute_nums(1)[0] if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_047/__init__.py ================================================ ================================================ FILE: project_euler/problem_047/sol1.py ================================================ """ Combinatoric selections Problem 47 The first two consecutive numbers to have two distinct prime factors are: 14 = 2 x 7 15 = 3 x 5 The first three consecutive numbers to have three distinct prime factors are: 644 = 2² x 7 x 23 645 = 3 x 5 x 43 646 = 2 x 17 x 19. Find the first four consecutive integers to have four distinct prime factors each. What is the first of these numbers? """ from functools import lru_cache def unique_prime_factors(n: int) -> set: """ Find unique prime factors of an integer. Tests include sorting because only the set matters, not the order in which it is produced. >>> sorted(set(unique_prime_factors(14))) [2, 7] >>> sorted(set(unique_prime_factors(644))) [2, 7, 23] >>> sorted(set(unique_prime_factors(646))) [2, 17, 19] """ i = 2 factors = set() while i * i <= n: if n % i: i += 1 else: n //= i factors.add(i) if n > 1: factors.add(n) return factors @lru_cache def upf_len(num: int) -> int: """ Memoize upf() length results for a given value. >>> upf_len(14) 2 """ return len(unique_prime_factors(num)) def equality(iterable: list) -> bool: """ Check the equality of ALL elements in an iterable >>> equality([1, 2, 3, 4]) False >>> equality([2, 2, 2, 2]) True >>> equality([1, 2, 3, 2, 1]) False """ return len(set(iterable)) in (0, 1) def run(n: int) -> list[int]: """ Runs core process to find problem solution. >>> run(3) [644, 645, 646] """ # Incrementor variable for our group list comprehension. # This is the first number in each list of values # to test. base = 2 while True: # Increment each value of a generated range group = [base + i for i in range(n)] # Run elements through the unique_prime_factors function # Append our target number to the end. checker = [upf_len(x) for x in group] checker.append(n) # If all numbers in the list are equal, return the group variable. if equality(checker): return group # Increment our base variable by 1 base += 1 def solution(n: int = 4) -> int | None: """Return the first value of the first four consecutive integers to have four distinct prime factors each. >>> solution() 134043 """ results = run(n) return results[0] if len(results) else None if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_048/__init__.py ================================================ ================================================ FILE: project_euler/problem_048/sol1.py ================================================ """ Self Powers Problem 48 The series, 1^1 + 2^2 + 3^3 + ... + 10^10 = 10405071317. Find the last ten digits of the series, 1^1 + 2^2 + 3^3 + ... + 1000^1000. """ def solution(): """ Returns the last 10 digits of the series, 1^1 + 2^2 + 3^3 + ... + 1000^1000. >>> solution() '9110846700' """ total = 0 for i in range(1, 1001): total += i**i return str(total)[-10:] if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_049/__init__.py ================================================ ================================================ FILE: project_euler/problem_049/sol1.py ================================================ """ Prime permutations Problem 49 The arithmetic sequence, 1487, 4817, 8147, in which each of the terms increases by 3330, is unusual in two ways: (i) each of the three terms are prime, (ii) each of the 4-digit numbers are permutations of one another. There are no arithmetic sequences made up of three 1-, 2-, or 3-digit primes, exhibiting this property, but there is one other 4-digit increasing sequence. What 12-digit number do you form by concatenating the three terms in this sequence? Solution: First, we need to generate all 4 digits prime numbers. Then greedy all of them and use permutation to form new numbers. Use binary search to check if the permutated numbers is in our prime list and include them in a candidate list. After that, bruteforce all passed candidates sequences using 3 nested loops since we know the answer will be 12 digits. The bruteforce of this solution will be about 1 sec. """ import math from itertools import permutations def is_prime(number: int) -> bool: """Checks to see if a number is a prime in O(sqrt(n)). A number is prime if it has exactly two factors: 1 and itself. >>> is_prime(0) False >>> is_prime(1) False >>> is_prime(2) True >>> is_prime(3) True >>> is_prime(27) False >>> is_prime(87) False >>> is_prime(563) True >>> is_prime(2999) True >>> is_prime(67483) False """ if 1 < number < 4: # 2 and 3 are primes return True elif number < 2 or number % 2 == 0 or number % 3 == 0: # Negatives, 0, 1, all even numbers, all multiples of 3 are not primes return False # All primes number are in format of 6k +/- 1 for i in range(5, int(math.sqrt(number) + 1), 6): if number % i == 0 or number % (i + 2) == 0: return False return True def search(target: int, prime_list: list) -> bool: """ function to search a number in a list using Binary Search. >>> search(3, [1, 2, 3]) True >>> search(4, [1, 2, 3]) False >>> search(101, list(range(-100, 100))) False """ left, right = 0, len(prime_list) - 1 while left <= right: middle = (left + right) // 2 if prime_list[middle] == target: return True elif prime_list[middle] < target: left = middle + 1 else: right = middle - 1 return False def solution(): """ Return the solution of the problem. >>> solution() 296962999629 """ prime_list = [n for n in range(1001, 10000, 2) if is_prime(n)] candidates = [] for number in prime_list: tmp_numbers = [] for prime_member in permutations(list(str(number))): prime = int("".join(prime_member)) if prime % 2 == 0: continue if search(prime, prime_list): tmp_numbers.append(prime) tmp_numbers.sort() if len(tmp_numbers) >= 3: candidates.append(tmp_numbers) passed = [] for candidate in candidates: length = len(candidate) found = False for i in range(length): for j in range(i + 1, length): for k in range(j + 1, length): if ( abs(candidate[i] - candidate[j]) == abs(candidate[j] - candidate[k]) and len({candidate[i], candidate[j], candidate[k]}) == 3 ): passed.append( sorted([candidate[i], candidate[j], candidate[k]]) ) found = True if found: break if found: break if found: break answer = set() for seq in passed: answer.add("".join([str(i) for i in seq])) return max(int(x) for x in answer) if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_050/__init__.py ================================================ ================================================ FILE: project_euler/problem_050/sol1.py ================================================ """ Project Euler Problem 50: https://projecteuler.net/problem=50 Consecutive prime sum The prime 41, can be written as the sum of six consecutive primes: 41 = 2 + 3 + 5 + 7 + 11 + 13 This is the longest sum of consecutive primes that adds to a prime below one-hundred. The longest sum of consecutive primes below one-thousand that adds to a prime, contains 21 terms, and is equal to 953. Which prime, below one-million, can be written as the sum of the most consecutive primes? """ from __future__ import annotations def prime_sieve(limit: int) -> list[int]: """ Sieve of Erotosthenes Function to return all the prime numbers up to a number 'limit' https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes >>> prime_sieve(3) [2] >>> prime_sieve(50) [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47] """ is_prime = [True] * limit is_prime[0] = False is_prime[1] = False is_prime[2] = True for i in range(3, int(limit**0.5 + 1), 2): index = i * 2 while index < limit: is_prime[index] = False index = index + i primes = [2] for i in range(3, limit, 2): if is_prime[i]: primes.append(i) return primes def solution(ceiling: int = 1_000_000) -> int: """ Returns the biggest prime, below the celing, that can be written as the sum of consecutive the most consecutive primes. >>> solution(500) 499 >>> solution(1_000) 953 >>> solution(10_000) 9521 """ primes = prime_sieve(ceiling) length = 0 largest = 0 for i in range(len(primes)): for j in range(i + length, len(primes)): sol = sum(primes[i:j]) if sol >= ceiling: break if sol in primes: length = j - i largest = sol return largest if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_051/__init__.py ================================================ ================================================ FILE: project_euler/problem_051/sol1.py ================================================ """ https://projecteuler.net/problem=51 Prime digit replacements Problem 51 By replacing the 1st digit of the 2-digit number *3, it turns out that six of the nine possible values: 13, 23, 43, 53, 73, and 83, are all prime. By replacing the 3rd and 4th digits of 56**3 with the same digit, this 5-digit number is the first example having seven primes among the ten generated numbers, yielding the family: 56003, 56113, 56333, 56443, 56663, 56773, and 56993. Consequently 56003, being the first member of this family, is the smallest prime with this property. Find the smallest prime which, by replacing part of the number (not necessarily adjacent digits) with the same digit, is part of an eight prime value family. """ from __future__ import annotations from collections import Counter def prime_sieve(n: int) -> list[int]: """ Sieve of Erotosthenes Function to return all the prime numbers up to a certain number https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes >>> prime_sieve(3) [2] >>> prime_sieve(50) [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47] """ is_prime = [True] * n is_prime[0] = False is_prime[1] = False is_prime[2] = True for i in range(3, int(n**0.5 + 1), 2): index = i * 2 while index < n: is_prime[index] = False index = index + i primes = [2] for i in range(3, n, 2): if is_prime[i]: primes.append(i) return primes def digit_replacements(number: int) -> list[list[int]]: """ Returns all the possible families of digit replacements in a number which contains at least one repeating digit >>> digit_replacements(544) [[500, 511, 522, 533, 544, 555, 566, 577, 588, 599]] >>> digit_replacements(3112) [[3002, 3112, 3222, 3332, 3442, 3552, 3662, 3772, 3882, 3992]] """ number_str = str(number) replacements = [] digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"] for duplicate in Counter(number_str) - Counter(set(number_str)): family = [int(number_str.replace(duplicate, digit)) for digit in digits] replacements.append(family) return replacements def solution(family_length: int = 8) -> int: """ Returns the solution of the problem >>> solution(2) 229399 >>> solution(3) 221311 """ numbers_checked = set() # Filter primes with less than 3 replaceable digits primes = { x for x in set(prime_sieve(1_000_000)) if len(str(x)) - len(set(str(x))) >= 3 } for prime in primes: if prime in numbers_checked: continue replacements = digit_replacements(prime) for family in replacements: numbers_checked.update(family) primes_in_family = primes.intersection(family) if len(primes_in_family) != family_length: continue return min(primes_in_family) return -1 if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_052/__init__.py ================================================ ================================================ FILE: project_euler/problem_052/sol1.py ================================================ """ Permuted multiples Problem 52 It can be seen that the number, 125874, and its double, 251748, contain exactly the same digits, but in a different order. Find the smallest positive integer, x, such that 2x, 3x, 4x, 5x, and 6x, contain the same digits. """ def solution(): """Returns the smallest positive integer, x, such that 2x, 3x, 4x, 5x, and 6x, contain the same digits. >>> solution() 142857 """ i = 1 while True: if ( sorted(str(i)) == sorted(str(2 * i)) == sorted(str(3 * i)) == sorted(str(4 * i)) == sorted(str(5 * i)) == sorted(str(6 * i)) ): return i i += 1 if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_053/__init__.py ================================================ ================================================ FILE: project_euler/problem_053/sol1.py ================================================ """ Combinatoric selections Problem 53 There are exactly ten ways of selecting three from five, 12345: 123, 124, 125, 134, 135, 145, 234, 235, 245, and 345 In combinatorics, we use the notation, 5C3 = 10. In general, nCr = n!/(r!(n-r)!),where r ≤ n, n! = nx(n-1)x...x3x2x1, and 0! = 1. It is not until n = 23, that a value exceeds one-million: 23C10 = 1144066. How many, not necessarily distinct, values of nCr, for 1 ≤ n ≤ 100, are greater than one-million? """ from math import factorial def combinations(n, r): return factorial(n) / (factorial(r) * factorial(n - r)) def solution(): """Returns the number of values of nCr, for 1 ≤ n ≤ 100, are greater than one-million >>> solution() 4075 """ total = 0 for i in range(1, 101): for j in range(1, i + 1): if combinations(i, j) > 1e6: total += 1 return total if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_054/__init__.py ================================================ ================================================ FILE: project_euler/problem_054/poker_hands.txt ================================================ 8C TS KC 9H 4S 7D 2S 5D 3S AC 5C AD 5D AC 9C 7C 5H 8D TD KS 3H 7H 6S KC JS QH TD JC 2D 8S TH 8H 5C QS TC 9H 4D JC KS JS 7C 5H KC QH JD AS KH 4C AD 4S 5H KS 9C 7D 9H 8D 3S 5D 5C AH 6H 4H 5C 3H 2H 3S QH 5S 6S AS TD 8C 4H 7C TC KC 4C 3H 7S KS 7C 9C 6D KD 3H 4C QS QC AC KH JC 6S 5H 2H 2D KD 9D 7C AS JS AD QH TH 9D 8H TS 6D 3S AS AC 2H 4S 5C 5S TC KC JD 6C TS 3C QD AS 6H JS 2C 3D 9H KC 4H 8S KD 8S 9S 7C 2S 3S 6D 6S 4H KC 3C 8C 2D 7D 4D 9S 4S QH 4H JD 8C KC 7S TC 2D TS 8H QD AC 5C 3D KH QD 6C 6S AD AS 8H 2H QS 6S 8D 4C 8S 6C QH TC 6D 7D 9D 2S 8D 8C 4C TS 9S 9D 9C AC 3D 3C QS 2S 4H JH 3D 2D TD 8S 9H 5H QS 8S 6D 3C 8C JD AS 7H 7D 6H TD 9D AS JH 6C QC 9S KD JC AH 8S QS 4D TH AC TS 3C 3D 5C 5S 4D JS 3D 8H 6C TS 3S AD 8C 6D 7C 5D 5H 3S 5C JC 2H 5S 3D 5H 6H 2S KS 3D 5D JD 7H JS 8H KH 4H AS JS QS QC TC 6D 7C KS 3D QS TS 2H JS 4D AS 9S JC KD QD 5H 4D 5D KH 7H 3D JS KD 4H 2C 9H 6H 5C 9D 6C JC 2D TH 9S 7D 6D AS QD JH 4D JS 7C QS 5C 3H KH QD AD 8C 8H 3S TH 9D 5S AH 9S 4D 9D 8S 4H JS 3C TC 8D 2C KS 5H QD 3S TS 9H AH AD 8S 5C 7H 5D KD 9H 4D 3D 2D KS AD KS KC 9S 6D 2C QH 9D 9H TS TC 9C 6H 5D QH 4D AD 6D QC JS KH 9S 3H 9D JD 5C 4D 9H AS TC QH 2C 6D JC 9C 3C AD 9S KH 9D 7D KC 9C 7C JC JS KD 3H AS 3C 7D QD KH QS 2C 3S 8S 8H 9H 9C JC QH 8D 3C KC 4C 4H 6D AD 9H 9D 3S KS QS 7H KH 7D 5H 5D JD AD 2H 2C 6H TH TC 7D 8D 4H 8C AS 4S 2H AC QC 3S 6D TH 4D 4C KH 4D TC KS AS 7C 3C 6D 2D 9H 6C 8C TD 5D QS 2C 7H 4C 9C 3H 9H 5H JH TS 7S TD 6H AD QD 8H 8S 5S AD 9C 8C 7C 8D 5H 9D 8S 2S 4H KH KS 9S 2S KC 5S AD 4S 7D QS 9C QD 6H JS 5D AC 8D 2S AS KH AC JC 3S 9D 9S 3C 9C 5S JS AD 3C 3D KS 3S 5C 9C 8C TS 4S JH 8D 5D 6H KD QS QD 3D 6C KC 8S JD 6C 3S 8C TC QC 3C QH JS KC JC 8H 2S 9H 9C JH 8S 8C 9S 8S 2H QH 4D QC 9D KC AS TH 3C 8S 6H TH 7C 2H 6S 3C 3H AS 7S QH 5S JS 4H 5H TS 8H AH AC JC 9D 8H 2S 4S TC JC 3C 7H 3H 5C 3D AD 3C 3S 4C QC AS 5D TH 8C 6S 9D 4C JS KH AH TS JD 8H AD 4C 6S 9D 7S AC 4D 3D 3S TC JD AD 7H 6H 4H JH KC TD TS 7D 6S 8H JH TC 3S 8D 8C 9S 2C 5C 4D 2C 9D KC QH TH QS JC 9C 4H TS QS 3C QD 8H KH 4H 8D TD 8S AC 7C 3C TH 5S 8H 8C 9C JD TC KD QC TC JD TS 8C 3H 6H KD 7C TD JH QS KS 9C 6D 6S AS 9H KH 6H 2H 4D AH 2D JH 6H TD 5D 4H JD KD 8C 9S JH QD JS 2C QS 5C 7C 4S TC 7H 8D 2S 6H 7S 9C 7C KC 8C 5D 7H 4S TD QC 8S JS 4H KS AD 8S JH 6D TD KD 7C 6C 2D 7D JC 6H 6S JS 4H QH 9H AH 4C 3C 6H 5H AS 7C 7S 3D KH KC 5D 5C JC 3D TD AS 4D 6D 6S QH JD KS 8C 7S 8S QH 2S JD 5C 7H AH QD 8S 3C 6H 6C 2C 8D TD 7D 4C 4D 5D QH KH 7C 2S 7H JS 6D QC QD AD 6C 6S 7D TH 6H 2H 8H KH 4H KS JS KD 5D 2D KH 7D 9C 8C 3D 9C 6D QD 3C KS 3S 7S AH JD 2D AH QH AS JC 8S 8H 4C KC TH 7D JC 5H TD 7C 5D KD 4C AD 8H JS KC 2H AC AH 7D JH KH 5D 7S 6D 9S 5S 9C 6H 8S TD JD 9H 6C AC 7D 8S 6D TS KD 7H AC 5S 7C 5D AH QC JC 4C TC 8C 2H TS 2C 7D KD KC 6S 3D 7D 2S 8S 3H 5S 5C 8S 5D 8H 4C 6H KC 3H 7C 5S KD JH 8C 3D 3C 6C KC TD 7H 7C 4C JC KC 6H TS QS TD KS 8H 8C 9S 6C 5S 9C QH 7D AH KS KC 9S 2C 4D 4S 8H TD 9C 3S 7D 9D AS TH 6S 7D 3C 6H 5D KD 2C 5C 9D 9C 2H KC 3D AD 3H QD QS 8D JC 4S 8C 3H 9C 7C AD 5D JC 9D JS AS 5D 9H 5C 7H 6S 6C QC JC QD 9S JC QS JH 2C 6S 9C QC 3D 4S TC 4H 5S 8D 3D 4D 2S KC 2H JS 2C TD 3S TH KD 4D 7H JH JS KS AC 7S 8C 9S 2D 8S 7D 5C AD 9D AS 8C 7H 2S 6C TH 3H 4C 3S 8H AC KD 5H JC 8H JD 2D 4H TD JH 5C 3D AS QH KS 7H JD 8S 5S 6D 5H 9S 6S TC QS JC 5C 5D 9C TH 8C 5H 3S JH 9H 2S 2C 6S 7S AS KS 8C QD JC QS TC QC 4H AC KH 6C TC 5H 7D JH 4H 2H 8D JC KS 4D 5S 9C KH KD 9H 5C TS 3D 7D 2D 5H AS TC 4D 8C 2C TS 9D 3H 8D 6H 8D 2D 9H JD 6C 4S 5H 5S 6D AD 9C JC 7D 6H 9S 6D JS 9H 3C AD JH TC QS 4C 5D 9S 7C 9C AH KD 6H 2H TH 8S QD KS 9D 9H AS 4H 8H 8D 5H 6C AH 5S AS AD 8S QS 5D 4S 2H TD KS 5H AC 3H JC 9C 7D QD KD AC 6D 5H QH 6H 5S KC AH QH 2H 7D QS 3H KS 7S JD 6C 8S 3H 6D KS QD 5D 5C 8H TC 9H 4D 4S 6S 9D KH QC 4H 6C JD TD 2D QH 4S 6H JH KD 3C QD 8C 4S 6H 7C QD 9D AS AH 6S AD 3C 2C KC TH 6H 8D AH 5C 6D 8S 5D TD TS 7C AD JC QD 9H 3C KC 7H 5D 4D 5S 8H 4H 7D 3H JD KD 2D JH TD 6H QS 4S KD 5C 8S 7D 8H AC 3D AS 8C TD 7H KH 5D 6C JD 9D KS 7C 6D QH TC JD KD AS KC JH 8S 5S 7S 7D AS 2D 3D AD 2H 2H 5D AS 3C QD KC 6H 9H 9S 2C 9D 5D TH 4C JH 3H 8D TC 8H 9H 6H KD 2C TD 2H 6C 9D 2D JS 8C KD 7S 3C 7C AS QH TS AD 8C 2S QS 8H 6C JS 4C 9S QC AD TD TS 2H 7C TS TC 8C 3C 9H 2D 6D JC TC 2H 8D JH KS 6D 3H TD TH 8H 9D TD 9H QC 5D 6C 8H 8C KC TS 2H 8C 3D AH 4D TH TC 7D 8H KC TS 5C 2D 8C 6S KH AH 5H 6H KC 5S 5D AH TC 4C JD 8D 6H 8C 6C KC QD 3D 8H 2D JC 9H 4H AD 2S TD 6S 7D JS KD 4H QS 2S 3S 8C 4C 9H JH TS 3S 4H QC 5S 9S 9C 2C KD 9H JS 9S 3H JC TS 5D AC AS 2H 5D AD 5H JC 7S TD JS 4C 2D 4S 8H 3D 7D 2C AD KD 9C TS 7H QD JH 5H JS AC 3D TH 4C 8H 6D KH KC QD 5C AD 7C 2D 4H AC 3D 9D TC 8S QD 2C JC 4H JD AH 6C TD 5S TC 8S AH 2C 5D AS AC TH 7S 3D AS 6C 4C 7H 7D 4H AH 5C 2H KS 6H 7S 4H 5H 3D 3C 7H 3C 9S AC 7S QH 2H 3D 6S 3S 3H 2D 3H AS 2C 6H TC JS 6S 9C 6C QH KD QD 6D AC 6H KH 2C TS 8C 8H 7D 3S 9H 5D 3H 4S QC 9S 5H 2D 9D 7H 6H 3C 8S 5H 4D 3S 4S KD 9S 4S TC 7S QC 3S 8S 2H 7H TC 3D 8C 3H 6C 2H 6H KS KD 4D KC 3D 9S 3H JS 4S 8H 2D 6C 8S 6H QS 6C TC QD 9H 7D 7C 5H 4D TD 9D 8D 6S 6C TC 5D TS JS 8H 4H KC JD 9H TC 2C 6S 5H 8H AS JS 9C 5C 6S 9D JD 8H KC 4C 6D 4D 8D 8S 6C 7C 6H 7H 8H 5C KC TC 3D JC 6D KS 9S 6H 7S 9C 2C 6C 3S KD 5H TS 7D 9H 9S 6H KH 3D QD 4C 6H TS AC 3S 5C 2H KD 4C AS JS 9S 7C TS 7H 9H JC KS 4H 8C JD 3H 6H AD 9S 4S 5S KS 4C 2C 7D 3D AS 9C 2S QS KC 6C 8S 5H 3D 2S AC 9D 6S 3S 4D TD QD TH 7S TS 3D AC 7H 6C 5D QC TC QD AD 9C QS 5C 8D KD 3D 3C 9D 8H AS 3S 7C 8S JD 2D 8D KC 4C TH AC QH JS 8D 7D 7S 9C KH 9D 8D 4C JH 2C 2S QD KD TS 4H 4D 6D 5D 2D JH 3S 8S 3H TC KH AD 4D 2C QS 8C KD JH JD AH 5C 5C 6C 5H 2H JH 4H KS 7C TC 3H 3C 4C QC 5D JH 9C QD KH 8D TC 3H 9C JS 7H QH AS 7C 9H 5H JC 2D 5S QD 4S 3C KC 6S 6C 5C 4C 5D KH 2D TS 8S 9C AS 9S 7C 4C 7C AH 8C 8D 5S KD QH QS JH 2C 8C 9D AH 2H AC QC 5S 8H 7H 2C QD 9H 5S QS QC 9C 5H JC TH 4H 6C 6S 3H 5H 3S 6H KS 8D AC 7S AC QH 7H 8C 4S KC 6C 3D 3S TC 9D 3D JS TH AC 5H 3H 8S 3S TC QD KH JS KS 9S QC 8D AH 3C AC 5H 6C KH 3S 9S JH 2D QD AS 8C 6C 4D 7S 7H 5S JC 6S 9H 4H JH AH 5S 6H 9S AD 3S TH 2H 9D 8C 4C 8D 9H 7C QC AD 4S 9C KC 5S 9D 6H 4D TC 4C JH 2S 5D 3S AS 2H 6C 7C KH 5C AD QS TH JD 8S 3S 4S 7S AH AS KC JS 2S AD TH JS KC 2S 7D 8C 5C 9C TS 5H 9D 7S 9S 4D TD JH JS KH 6H 5D 2C JD JS JC TH 2D 3D QD 8C AC 5H 7S KH 5S 9D 5D TD 4S 6H 3C 2D 4S 5D AC 8D 4D 7C AD AS AH 9C 6S TH TS KS 2C QC AH AS 3C 4S 2H 8C 3S JC 5C 7C 3H 3C KH JH 7S 3H JC 5S 6H 4C 2S 4D KC 7H 4D 7C 4H 9S 8S 6S AD TC 6C JC KH QS 3S TC 4C 8H 8S AC 3C TS QD QS TH 3C TS 7H 7D AH TD JC TD JD QC 4D 9S 7S TS AD 7D AC AH 7H 4S 6D 7C 2H 9D KS JC TD 7C AH JD 4H 6D QS TS 2H 2C 5C TC KC 8C 9S 4C JS 3C JC 6S AH AS 7D QC 3D 5S JC JD 9D TD KH TH 3C 2S 6H AH AC 5H 5C 7S 8H QC 2D AC QD 2S 3S JD QS 6S 8H KC 4H 3C 9D JS 6H 3S 8S AS 8C 7H KC 7D JD 2H JC QH 5S 3H QS 9H TD 3S 8H 7S AC 5C 6C AH 7C 8D 9H AH JD TD QS 7D 3S 9C 8S AH QH 3C JD KC 4S 5S 5D TD KS 9H 7H 6S JH TH 4C 7C AD 5C 2D 7C KD 5S TC 9D 6S 6C 5D 2S TH KC 9H 8D 5H 7H 4H QC 3D 7C AS 6S 8S QC TD 4S 5C TH QS QD 2S 8S 5H TH QC 9H 6S KC 7D 7C 5C 7H KD AH 4D KH 5C 4S 2D KC QH 6S 2C TD JC AS 4D 6C 8C 4H 5S JC TC JD 5S 6S 8D AS 9D AD 3S 6D 6H 5D 5S TC 3D 7D QS 9D QD 4S 6C 8S 3S 7S AD KS 2D 7D 7C KC QH JC AC QD 5D 8D QS 7H 7D JS AH 8S 5H 3D TD 3H 4S 6C JH 4S QS 7D AS 9H JS KS 6D TC 5C 2D 5C 6H TC 4D QH 3D 9H 8S 6C 6D 7H TC TH 5S JD 5C 9C KS KD 8D TD QH 6S 4S 6C 8S KC 5C TC 5S 3D KS AC 4S 7D QD 4C TH 2S TS 8H 9S 6S 7S QH 3C AH 7H 8C 4C 8C TS JS QC 3D 7D 5D 7S JH 8S 7S 9D QC AC 7C 6D 2H JH KC JS KD 3C 6S 4S 7C AH QC KS 5H KS 6S 4H JD QS TC 8H KC 6H AS KH 7C TC 6S TD JC 5C 7D AH 3S 3H 4C 4H TC TH 6S 7H 6D 9C QH 7D 5H 4S 8C JS 4D 3D 8S QH KC 3H 6S AD 7H 3S QC 8S 4S 7S JS 3S JD KH TH 6H QS 9C 6C 2D QD 4S QH 4D 5H KC 7D 6D 8D TH 5S TD AD 6S 7H KD KH 9H 5S KC JC 3H QC AS TS 4S QD KS 9C 7S KC TS 6S QC 6C TH TC 9D 5C 5D KD JS 3S 4H KD 4C QD 6D 9S JC 9D 8S JS 6D 4H JH 6H 6S 6C KS KH AC 7D 5D TC 9S KH 6S QD 6H AS AS 7H 6D QH 8D TH 2S KH 5C 5H 4C 7C 3D QC TC 4S KH 8C 2D JS 6H 5D 7S 5H 9C 9H JH 8S TH 7H AS JS 2S QD KH 8H 4S AC 8D 8S 3H 4C TD KD 8C JC 5C QS 2D JD TS 7D 5D 6C 2C QS 2H 3C AH KS 4S 7C 9C 7D JH 6C 5C 8H 9D QD 2S TD 7S 6D 9C 9S QS KH QH 5C JC 6S 9C QH JH 8D 7S JS KH 2H 8D 5H TH KC 4D 4S 3S 6S 3D QS 2D JD 4C TD 7C 6D TH 7S JC AH QS 7S 4C TH 9D TS AD 4D 3H 6H 2D 3H 7D JD 3D AS 2S 9C QC 8S 4H 9H 9C 2C 7S JH KD 5C 5D 6H TC 9H 8H JC 3C 9S 8D KS AD KC TS 5H JD QS QH QC 8D 5D KH AH 5D AS 8S 6S 4C AH QC QD TH 7H 3H 4H 7D 6S 4S 9H AS 8H JS 9D JD 8C 2C 9D 7D 5H 5S 9S JC KD KD 9C 4S QD AH 7C AD 9D AC TD 6S 4H 4S 9C 8D KS TC 9D JH 7C 5S JC 5H 4S QH AC 2C JS 2S 9S 8C 5H AS QD AD 5C 7D 8S QC TD JC 4C 8D 5C KH QS 4D 6H 2H 2C TH 4S 2D KC 3H QD AC 7H AD 9D KH QD AS 8H TH KC 8D 7S QH 8C JC 6C 7D 8C KH AD QS 2H 6S 2D JC KH 2D 7D JS QC 5H 4C 5D AD TS 3S AD 4S TD 2D TH 6S 9H JH 9H 2D QS 2C 4S 3D KH AS AC 9D KH 6S 8H 4S KD 7D 9D TS QD QC JH 5H AH KS AS AD JC QC 5S KH 5D 7D 6D KS KD 3D 7C 4D JD 3S AC JS 8D 5H 9C 3H 4H 4D TS 2C 6H KS KH 9D 7C 2S 6S 8S 2H 3D 6H AC JS 7S 3S TD 8H 3H 4H TH 9H TC QC KC 5C KS 6H 4H AC 8S TC 7D QH 4S JC TS 6D 6C AC KH QH 7D 7C JH QS QD TH 3H 5D KS 3D 5S 8D JS 4C 2C KS 7H 9C 4H 5H 8S 4H TD 2C 3S QD QC 3H KC QC JS KD 9C AD 5S 9D 7D 7H TS 8C JC KH 7C 7S 6C TS 2C QD TH 5S 9D TH 3C 7S QH 8S 9C 2H 5H 5D 9H 6H 2S JS KH 3H 7C 2H 5S JD 5D 5S 2C TC 2S 6S 6C 3C 8S 4D KH 8H 4H 2D KS 3H 5C 2S 9H 3S 2D TD 7H 8S 6H JD KC 9C 8D 6S QD JH 7C 9H 5H 8S 8H TH TD QS 7S TD 7D TS JC KD 7C 3C 2C 3C JD 8S 4H 2D 2S TD AS 4D AC AH KS 6C 4C 4S 7D 8C 9H 6H AS 5S 3C 9S 2C QS KD 4D 4S AC 5D 2D TS 2C JS KH QH 5D 8C AS KC KD 3H 6C TH 8S 7S KH 6H 9S AC 6H 7S 6C QS AH 2S 2H 4H 5D 5H 5H JC QD 2C 2S JD AS QC 6S 7D 6C TC AS KD 8H 9D 2C 7D JH 9S 2H 4C 6C AH 8S TD 3H TH 7C TS KD 4S TS 6C QH 8D 9D 9C AH 7D 6D JS 5C QD QC 9C 5D 8C 2H KD 3C QH JH AD 6S AH KC 8S 6D 6H 3D 7C 4C 7S 5S 3S 6S 5H JC 3C QH 7C 5H 3C 3S 8C TS 4C KD 9C QD 3S 7S 5H 7H QH JC 7C 8C KD 3C KD KH 2S 4C TS AC 6S 2C 7C 2C KH 3C 4C 6H 4D 5H 5S 7S QD 4D 7C 8S QD TS 9D KS 6H KD 3C QS 4D TS 7S 4C 3H QD 8D 9S TC TS QH AC 6S 3C 9H 9D QS 8S 6H 3S 7S 5D 4S JS 2D 6C QH 6S TH 4C 4H AS JS 5D 3D TS 9C AC 8S 6S 9C 7C 3S 5C QS AD AS 6H 3C 9S 8C 7H 3H 6S 7C AS 9H JD KH 3D 3H 7S 4D 6C 7C AC 2H 9C TH 4H 5S 3H AC TC TH 9C 9H 9S 8D 8D 9H 5H 4D 6C 2H QD 6S 5D 3S 4C 5C JD QS 4D 3H TH AC QH 8C QC 5S 3C 7H AD 4C KS 4H JD 6D QS AH 3H KS 9H 2S JS JH 5H 2H 2H 5S TH 6S TS 3S KS 3C 5H JS 2D 9S 7H 3D KC JH 6D 7D JS TD AC JS 8H 2C 8C JH JC 2D TH 7S 5D 9S 8H 2H 3D TC AH JC KD 9C 9D QD JC 2H 6D KH TS 9S QH TH 2C 8D 4S JD 5H 3H TH TC 9C KC AS 3D 9H 7D 4D TH KH 2H 7S 3H 4H 7S KS 2S JS TS 8S 2H QD 8D 5S 6H JH KS 8H 2S QC AC 6S 3S JC AS AD QS 8H 6C KH 4C 4D QD 2S 3D TS TD 9S KS 6S QS 5C 8D 3C 6D 4S QC KC JH QD TH KH AD 9H AH 4D KS 2S 8D JH JC 7C QS 2D 6C TH 3C 8H QD QH 2S 3S KS 6H 5D 9S 4C TS TD JS QD 9D JD 5H 8H KH 8S KS 7C TD AD 4S KD 2C 7C JC 5S AS 6C 7D 8S 5H 9C 6S QD 9S TS KH QS 5S QH 3C KC 7D 3H 3C KD 5C AS JH 7H 6H JD 9D 5C 9H KC 8H KS 4S AD 4D 2S 3S JD QD 8D 2S 7C 5S 6S 5H TS 6D 9S KC TD 3S 6H QD JD 5C 8D 5H 9D TS KD 8D 6H TD QC 4C 7D 6D 4S JD 9D AH 9S AS TD 9H QD 2D 5S 2H 9C 6H 9S TD QC 7D TC 3S 2H KS TS 2C 9C 8S JS 9D 7D 3C KC 6D 5D 6C 6H 8S AS 7S QS JH 9S 2H 8D 4C 8H 9H AD TH KH QC AS 2S JS 5C 6H KD 3H 7H 2C QD 8H 2S 8D 3S 6D AH 2C TC 5C JD JS TS 8S 3H 5D TD KC JC 6H 6S QS TC 3H 5D AH JC 7C 7D 4H 7C 5D 8H 9C 2H 9H JH KH 5S 2C 9C 7H 6S TH 3S QC QD 4C AC JD 2H 5D 9S 7D KC 3S QS 2D AS KH 2S 4S 2H 7D 5C TD TH QH 9S 4D 6D 3S TS 6H 4H KS 9D 8H 5S 2D 9H KS 4H 3S 5C 5D KH 6H 6S JS KC AS 8C 4C JC KH QC TH QD AH 6S KH 9S 2C 5H TC 3C 7H JC 4D JD 4S 6S 5S 8D 7H 7S 4D 4C 2H 7H 9H 5D KH 9C 7C TS TC 7S 5H 4C 8D QC TS 4S 9H 3D AD JS 7C 8C QS 5C 5D 3H JS AH KC 4S 9D TS JD 8S QS TH JH KH 2D QD JS JD QC 5D 6S 9H 3S 2C 8H 9S TS 2S 4C AD 7H JC 5C 2D 6D 4H 3D 7S JS 2C 4H 8C AD QD 9C 3S TD JD TS 4C 6H 9H 7D QD 6D 3C AS AS 7C 4C 6S 5D 5S 5C JS QC 4S KD 6S 9S 7C 3C 5S 7D JH QD JS 4S 7S JH 2C 8S 5D 7H 3D QH AD TD 6H 2H 8D 4H 2D 7C AD KH 5D TS 3S 5H 2C QD AH 2S 5C KH TD KC 4D 8C 5D AS 6C 2H 2S 9H 7C KD JS QC TS QS KH JH 2C 5D AD 3S 5H KC 6C 9H 3H 2H AD 7D 7S 7S JS JH KD 8S 7D 2S 9H 7C 2H 9H 2D 8D QC 6S AD AS 8H 5H 6C 2S 7H 6C 6D 7D 8C 5D 9D JC 3C 7C 9C 7H JD 2H KD 3S KH AD 4S QH AS 9H 4D JD KS KD TS KH 5H 4C 8H 5S 3S 3D 7D TD AD 7S KC JS 8S 5S JC 8H TH 9C 4D 5D KC 7C 5S 9C QD 2C QH JS 5H 8D KH TD 2S KS 3D AD KC 7S TC 3C 5D 4C 2S AD QS 6C 9S QD TH QH 5C 8C AD QS 2D 2S KC JD KS 6C JC 8D 4D JS 2H 5D QD 7S 7D QH TS 6S 7H 3S 8C 8S 9D QS 8H 6C 9S 4S TC 2S 5C QD 4D QS 6D TH 6S 3S 5C 9D 6H 8D 4C 7D TC 7C TD AH 6S AS 7H 5S KD 3H 5H AC 4C 8D 8S AH KS QS 2C AD 6H 7D 5D 6H 9H 9S 2H QS 8S 9C 5D 2D KD TS QC 5S JH 7D 7S TH 9S 9H AC 7H 3H 6S KC 4D 6D 5C 4S QD TS TD 2S 7C QD 3H JH 9D 4H 7S 7H KS 3D 4H 5H TC 2S AS 2D 6D 7D 8H 3C 7H TD 3H AD KC TH 9C KH TC 4C 2C 9S 9D 9C 5C 2H JD 3C 3H AC TS 5D AD 8D 6H QC 6S 8C 2S TS 3S JD 7H 8S QH 4C 5S 8D AC 4S 6C 3C KH 3D 7C 2D 8S 2H 4H 6C 8S TH 2H 4S 8H 9S 3H 7S 7C 4C 9C 2C 5C AS 5D KD 4D QH 9H 4H TS AS 7D 8D 5D 9S 8C 2H QC KD AC AD 2H 7S AS 3S 2D 9S 2H QC 8H TC 6D QD QS 5D KH 3C TH JD QS 4C 2S 5S AD 7H 3S AS 7H JS 3D 6C 3S 6D AS 9S AC QS 9C TS AS 8C TC 8S 6H 9D 8D 6C 4D JD 9C KC 7C 6D KS 3S 8C AS 3H 6S TC 8D TS 3S KC 9S 7C AS 8C QC 4H 4S 8S 6C 3S TC AH AC 4D 7D 5C AS 2H 6S TS QC AD TC QD QC 8S 4S TH 3D AH TS JH 4H 5C 2D 9S 2C 3H 3C 9D QD QH 7D KC 9H 6C KD 7S 3C 4D AS TC 2D 3D JS 4D 9D KS 7D TH QC 3H 3C 8D 5S 2H 9D 3H 8C 4C 4H 3C TH JC TH 4S 6S JD 2D 4D 6C 3D 4C TS 3S 2D 4H AC 2C 6S 2H JH 6H TD 8S AD TC AH AC JH 9S 6S 7S 6C KC 4S JD 8D 9H 5S 7H QH AH KD 8D TS JH 5C 5H 3H AD AS JS 2D 4H 3D 6C 8C 7S AD 5D 5C 8S TD 5D 7S 9C 4S 5H 6C 8C 4C 8S JS QH 9C AS 5C QS JC 3D QC 7C JC 9C KH JH QS QC 2C TS 3D AD 5D JH AC 5C 9S TS 4C JD 8C KS KC AS 2D KH 9H 2C 5S 4D 3D 6H TH AH 2D 8S JC 3D 8C QH 7S 3S 8H QD 4H JC AS KH KS 3C 9S 6D 9S QH 7D 9C 4S AC 7H KH 4D KD AH AD TH 6D 9C 9S KD KS QH 4H QD 6H 9C 7C QS 6D 6S 9D 5S JH AH 8D 5H QD 2H JC KS 4H KH 5S 5C 2S JS 8D 9C 8C 3D AS KC AH JD 9S 2H QS 8H 5S 8C TH 5C 4C QC QS 8C 2S 2C 3S 9C 4C KS KH 2D 5D 8S AH AD TD 2C JS KS 8C TC 5S 5H 8H QC 9H 6H JD 4H 9S 3C JH 4H 9H AH 4S 2H 4C 8D AC 8S TH 4D 7D 6D QD QS 7S TC 7C KH 6D 2D JD 5H JS QD JH 4H 4S 9C 7S JH 4S 3S TS QC 8C TC 4H QH 9D 4D JH QS 3S 2C 7C 6C 2D 4H 9S JD 5C 5H AH 9D TS 2D 4C KS JH TS 5D 2D AH JS 7H AS 8D JS AH 8C AD KS 5S 8H 2C 6C TH 2H 5D AD AC KS 3D 8H TS 6H QC 6D 4H TS 9C 5H JS JH 6S JD 4C JH QH 4H 2C 6D 3C 5D 4C QS KC 6H 4H 6C 7H 6S 2S 8S KH QC 8C 3H 3D 5D KS 4H TD AD 3S 4D TS 5S 7C 8S 7D 2C KS 7S 6C 8C JS 5D 2H 3S 7C 5C QD 5H 6D 9C 9H JS 2S KD 9S 8D TD TS AC 8C 9D 5H QD 2S AC 8C 9H KS 7C 4S 3C KH AS 3H 8S 9C JS QS 4S AD 4D AS 2S TD AD 4D 9H JC 4C 5H QS 5D 7C 4H TC 2D 6C JS 4S KC 3S 4C 2C 5D AC 9H 3D JD 8S QS QH 2C 8S 6H 3C QH 6D TC KD AC AH QC 6C 3S QS 4S AC 8D 5C AD KH 5S 4C AC KH AS QC 2C 5C 8D 9C 8H JD 3C KH 8D 5C 9C QD QH 9D 7H TS 2C 8C 4S TD JC 9C 5H QH JS 4S 2C 7C TH 6C AS KS 7S JD JH 7C 9H 7H TC 5H 3D 6D 5D 4D 2C QD JH 2H 9D 5S 3D TD AD KS JD QH 3S 4D TH 7D 6S QS KS 4H TC KS 5S 8D 8H AD 2S 2D 4C JH 5S JH TC 3S 2D QS 9D 4C KD 9S AC KH 3H AS 9D KC 9H QD 6C 6S 9H 7S 3D 5C 7D KC TD 8H 4H 6S 3C 7H 8H TC QD 4D 7S 6S QH 6C 6D AD 4C QD 6C 5D 7D 9D KS TS JH 2H JD 9S 7S TS KH 8D 5D 8H 2D 9S 4C 7D 9D 5H QD 6D AC 6S 7S 6D JC QD JH 4C 6S QS 2H 7D 8C TD JH KD 2H 5C QS 2C JS 7S TC 5H 4H JH QD 3S 5S 5D 8S KH KS KH 7C 2C 5D JH 6S 9C 6D JC 5H AH JD 9C JS KC 2H 6H 4D 5S AS 3C TH QC 6H 9C 8S 8C TD 7C KC 2C QD 9C KH 4D 7S 3C TS 9H 9C QC 2S TS 8C TD 9S QD 3S 3C 4D 9D TH JH AH 6S 2S JD QH JS QD 9H 6C KD 7D 7H 5D 6S 8H AH 8H 3C 4S 2H 5H QS QH 7S 4H AC QS 3C 7S 9S 4H 3S AH KS 9D 7C AD 5S 6S 2H 2D 5H TC 4S 3C 8C QH TS 6S 4D JS KS JH AS 8S 6D 2C 8S 2S TD 5H AS TC TS 6C KC KC TS 8H 2H 3H 7C 4C 5S TH TD KD AD KH 7H 7S 5D 5H 5S 2D 9C AD 9S 3D 7S 8C QC 7C 9C KD KS 3C QC 9S 8C 4D 5C AS QD 6C 2C 2H KC 8S JD 7S AC 8D 5C 2S 4D 9D QH 3D 2S TC 3S KS 3C 9H TD KD 6S AC 2C 7H 5H 3S 6C 6H 8C QH TC 8S 6S KH TH 4H 5D TS 4D 8C JS 4H 6H 2C 2H 7D AC QD 3D QS KC 6S 2D 5S 4H TD 3H JH 4C 7S 5H 7H 8H KH 6H QS TH KD 7D 5H AD KD 7C KH 5S TD 6D 3C 6C 8C 9C 5H JD 7C KC KH 7H 2H 3S 7S 4H AD 4D 8S QS TH 3D 7H 5S 8D TC KS KD 9S 6D AD JD 5C 2S 7H 8H 6C QD 2H 6H 9D TC 9S 7C 8D 6D 4C 7C 6C 3C TH KH JS JH 5S 3S 8S JS 9H AS AD 8H 7S KD JH 7C 2C KC 5H AS AD 9C 9S JS AD AC 2C 6S QD 7C 3H TH KS KD 9D JD 4H 8H 4C KH 7S TS 8C KC 3S 5S 2H 7S 6H 7D KS 5C 6D AD 5S 8C 9H QS 7H 7S 2H 6C 7D TD QS 5S TD AC 9D KC 3D TC 2D 4D TD 2H 7D JD QD 4C 7H 5D KC 3D 4C 3H 8S KD QH 5S QC 9H TC 5H 9C QD TH 5H TS 5C 9H AH QH 2C 4D 6S 3C AC 6C 3D 2C 2H TD TH AC 9C 5D QC 4D AD 8D 6D 8C KC AD 3C 4H AC 8D 8H 7S 9S TD JC 4H 9H QH JS 2D TH TD TC KD KS 5S 6S 9S 8D TH AS KH 5H 5C 8S JD 2S 9S 6S 5S 8S 5D 7S 7H 9D 5D 8C 4C 9D AD TS 2C 7D KD TC 8S QS 4D KC 5C 8D 4S KH JD KD AS 5C AD QH 7D 2H 9S 7H 7C TC 2S 8S JD KH 7S 6C 6D AD 5D QC 9H 6H 3S 8C 8H AH TC 4H JS TD 2C TS 4D 7H 2D QC 9C 5D TH 7C 6C 8H QC 5D TS JH 5C 5H 9H 4S 2D QC 7H AS JS 8S 2H 4C 4H 8D JS 6S AC KD 3D 3C 4S 7H TH KC QH KH 6S QS 5S 4H 3C QD 3S 3H 7H AS KH 8C 4H 9C 5S 3D 6S TS 9C 7C 3H 5S QD 2C 3D AD AC 5H JH TD 2D 4C TS 3H KH AD 3S 7S AS 4C 5H 4D 6S KD JC 3C 6H 2D 3H 6S 8C 2D TH 4S AH QH AD 5H 7C 2S 9H 7H KC 5C 6D 5S 3H JC 3C TC 9C 4H QD TD JH 6D 9H 5S 7C 6S 5C 5D 6C 4S 7H 9H 6H AH AD 2H 7D KC 2C 4C 2S 9S 7H 3S TH 4C 8S 6S 3S AD KS AS JH TD 5C TD 4S 4D AD 6S 5D TC 9C 7D 8H 3S 4D 4S 5S 6H 5C AC 3H 3D 9H 3C AC 4S QS 8S 9D QH 5H 4D JC 6C 5H TS AC 9C JD 8C 7C QD 8S 8H 9C JD 2D QC QH 6H 3C 8D KS JS 2H 6H 5H QH QS 3H 7C 6D TC 3H 4S 7H QC 2H 3S 8C JS KH AH 8H 5S 4C 9H JD 3H 7S JC AC 3C 2D 4C 5S 6C 4S QS 3S JD 3D 5H 2D TC AH KS 6D 7H AD 8C 6H 6C 7S 3C JD 7C 8H KS KH AH 6D AH 7D 3H 8H 8S 7H QS 5H 9D 2D JD AC 4H 7S 8S 9S KS AS 9D QH 7S 2C 8S 5S JH QS JC AH KD 4C AH 2S 9H 4H 8D TS TD 6H QH JD 4H JC 3H QS 6D 7S 9C 8S 9D 8D 5H TD 4S 9S 4C 8C 8D 7H 3H 3D QS KH 3S 2C 2S 3C 7S TD 4S QD 7C TD 4D 5S KH AC AS 7H 4C 6C 2S 5H 6D JD 9H QS 8S 2C 2H TD 2S TS 6H 9H 7S 4H JC 4C 5D 5S 2C 5H 7D 4H 3S QH JC JS 6D 8H 4C QH 7C QD 3S AD TH 8S 5S TS 9H TC 2S TD JC 7D 3S 3D TH QH 7D 4C 8S 5C JH 8H 6S 3S KC 3H JC 3H KH TC QH TH 6H 2C AC 5H QS 2H 9D 2C AS 6S 6C 2S 8C 8S 9H 7D QC TH 4H KD QS AC 7S 3C 4D JH 6S 5S 8H KS 9S QC 3S AS JD 2D 6S 7S TC 9H KC 3H 7D KD 2H KH 7C 4D 4S 3H JS QD 7D KC 4C JC AS 9D 3C JS 6C 8H QD 4D AH JS 3S 6C 4C 3D JH 6D 9C 9H 9H 2D 8C 7H 5S KS 6H 9C 2S TC 6C 8C AD 7H 6H 3D KH AS 5D TH KS 8C 3S TS 8S 4D 5S 9S 6C 4H 9H 4S 4H 5C 7D KC 2D 2H 9D JH 5C JS TC 9D 9H 5H 7S KH JC 6S 7C 9H 8H 4D JC KH JD 2H TD TC 8H 6C 2H 2C KH 6H 9D QS QH 5H AC 7D 2S 3D QD JC 2D 8D JD JH 2H JC 2D 7H 2C 3C 8D KD TD 4H 3S 4H 6D 8D TS 3H TD 3D 6H TH JH JC 3S AC QH 9H 7H 8S QC 2C 7H TD QS 4S 8S 9C 2S 5D 4D 2H 3D TS 3H 2S QC 8H 6H KC JC KS 5D JD 7D TC 8C 6C 9S 3D 8D AC 8H 6H JH 6C 5D 8D 8S 4H AD 2C 9D 4H 2D 2C 3S TS AS TC 3C 5D 4D TH 5H KS QS 6C 4S 2H 3D AD 5C KC 6H 2C 5S 3C 4D 2D 9H 9S JD 4C 3H TH QH 9H 5S AH 8S AC 7D 9S 6S 2H TD 9C 4H 8H QS 4C 3C 6H 5D 4H 8C 9C KC 6S QD QS 3S 9H KD TC 2D JS 8C 6S 4H 4S 2S 4C 8S QS 6H KH 3H TH 8C 5D 2C KH 5S 3S 7S 7H 6C 9D QD 8D 8H KS AC 2D KH TS 6C JS KC 7H 9C KS 5C TD QC AH 6C 5H 9S 7C 5D 4D 3H 4H 6S 7C 7S AH QD TD 2H 7D QC 6S TC TS AH 7S 9D 3H TH 5H QD 9S KS 7S 7C 6H 8C TD TH 2D 4D QC 5C 7D JD AH 9C 4H 4H 3H AH 8D 6H QC QH 9H 2H 2C 2D AD 4C TS 6H 7S TH 4H QS TD 3C KD 2H 3H QS JD TC QC 5D 8H KS JC QD TH 9S KD 8D 8C 2D 9C 3C QD KD 6D 4D 8D AH AD QC 8S 8H 3S 9D 2S 3H KS 6H 4C 7C KC TH 9S 5C 3D 7D 6H AC 7S 4D 2C 5C 3D JD 4D 2D 6D 5H 9H 4C KH AS 7H TD 6C 2H 3D QD KS 4C 4S JC 3C AC 7C JD JS 8H 9S QC 5D JD 6S 5S 2H AS 8C 7D 5H JH 3D 8D TC 5S 9S 8S 3H JC 5H 7S AS 5C TD 3D 7D 4H 8D 7H 4D 5D JS QS 9C KS TD 2S 8S 5C 2H 4H AS TH 7S 4H 7D 3H JD KD 5D 2S KC JD 7H 4S 8H 4C JS 6H QH 5S 4H 2C QS 8C 5S 3H QC 2S 6C QD AD 8C 3D JD TC 4H 2H AD 5S AC 2S 5D 2C JS 2D AD 9D 3D 4C 4S JH 8D 5H 5D 6H 7S 4D KS 9D TD JD 3D 6D 9C 2S AS 7D 5S 5C 8H JD 7C 8S 3S 6S 5H JD TC AD 7H 7S 2S 9D TS 4D AC 8D 6C QD JD 3H 9S KH 2C 3C AC 3D 5H 6H 8D 5D KS 3D 2D 6S AS 4C 2S 7C 7H KH AC 2H 3S JC 5C QH 4D 2D 5H 7S TS AS JD 8C 6H JC 8S 5S 2C 5D 7S QH 7H 6C QC 8H 2D 7C JD 2S 2C QD 2S 2H JC 9C 5D 2D JD JH 7C 5C 9C 8S 7D 6D 8D 6C 9S JH 2C AD 6S 5H 3S KS 7S 9D KH 4C 7H 6C 2C 5C TH 9D 8D 3S QC AH 5S KC 6H TC 5H 8S TH 6D 3C AH 9C KD 4H AD TD 9S 4S 7D 6H 5D 7H 5C 5H 6D AS 4C KD KH 4H 9D 3C 2S 5C 6C JD QS 2H 9D 7D 3H AC 2S 6S 7S JS QD 5C QS 6H AD 5H TH QC 7H TC 3S 7C 6D KC 3D 4H 3D QC 9S 8H 2C 3S JC KS 5C 4S 6S 2C 6H 8S 3S 3D 9H 3H JS 4S 8C 4D 2D 8H 9H 7D 9D AH TS 9S 2C 9H 4C 8D AS 7D 3D 6D 5S 6S 4C 7H 8C 3H 5H JC AH 9D 9C 2S 7C 5S JD 8C 3S 3D 4D 7D 6S 3C KC 4S 5D 7D 3D JD 7H 3H 4H 9C 9H 4H 4D TH 6D QD 8S 9S 7S 2H AC 8S 4S AD 8C 2C AH 7D TC TS 9H 3C AD KS TC 3D 8C 8H JD QC 8D 2C 3C 7D 7C JD 9H 9C 6C AH 6S JS JH 5D AS QC 2C JD TD 9H KD 2H 5D 2D 3S 7D TC AH TS TD 8H AS 5D AH QC AC 6S TC 5H KS 4S 7H 4D 8D 9C TC 2H 6H 3H 3H KD 4S QD QH 3D 8H 8C TD 7S 8S JD TC AH JS QS 2D KH KS 4D 3C AD JC KD JS KH 4S TH 9H 2C QC 5S JS 9S KS AS 7C QD 2S JD KC 5S QS 3S 2D AC 5D 9H 8H KS 6H 9C TC AD 2C 6D 5S JD 6C 7C QS KH TD QD 2C 3H 8S 2S QC AH 9D 9H JH TC QH 3C 2S JS 5C 7H 6C 3S 3D 2S 4S QD 2D TH 5D 2C 2D 6H 6D 2S JC QH AS 7H 4H KH 5H 6S KS AD TC TS 7C AC 4S 4H AD 3C 4H QS 8C 9D KS 2H 2D 4D 4S 9D 6C 6D 9C AC 8D 3H 7H KD JC AH 6C TS JD 6D AD 3S 5D QD JC JH JD 3S 7S 8S JS QC 3H 4S JD TH 5C 2C AD JS 7H 9S 2H 7S 8D 3S JH 4D QC AS JD 2C KC 6H 2C AC 5H KD 5S 7H QD JH AH 2D JC QH 8D 8S TC 5H 5C AH 8C 6C 3H JS 8S QD JH 3C 4H 6D 5C 3S 6D 4S 4C AH 5H 5S 3H JD 7C 8D 8H AH 2H 3H JS 3C 7D QC 4H KD 6S 2H KD 5H 8H 2D 3C 8S 7S QD 2S 7S KC QC AH TC QS 6D 4C 8D 5S 9H 2C 3S QD 7S 6C 2H 7C 9D 3C 6C 5C 5S JD JC KS 3S 5D TS 7C KS 6S 5S 2S 2D TC 2H 5H QS AS 7H 6S TS 5H 9S 9D 3C KD 2H 4S JS QS 3S 4H 7C 2S AC 6S 9D 8C JH 2H 5H 7C 5D QH QS KH QC 3S TD 3H 7C KC 8D 5H 8S KH 8C 4H KH JD TS 3C 7H AS QC JS 5S AH 9D 2C 8D 4D 2D 6H 6C KC 6S 2S 6H 9D 3S 7H 4D KH 8H KD 3D 9C TC AC JH KH 4D JD 5H TD 3S 7S 4H 9D AS 4C 7D QS 9S 2S KH 3S 8D 8S KS 8C JC 5C KH 2H 5D 8S QH 2C 4D KC JS QC 9D AC 6H 8S 8C 7C JS JD 6S 4C 9C AC 4S QH 5D 2C 7D JC 8S 2D JS JH 4C JS 4C 7S TS JH KC KH 5H QD 4S QD 8C 8D 2D 6S TD 9D AC QH 5S QH QC JS 3D 3C 5C 4H KH 8S 7H 7C 2C 5S JC 8S 3H QC 5D 2H KC 5S 8D KD 6H 4H QD QH 6D AH 3D 7S KS 6C 2S 4D AC QS 5H TS JD 7C 2D TC 5D QS AC JS QC 6C KC 2C KS 4D 3H TS 8S AD 4H 7S 9S QD 9H QH 5H 4H 4D KH 3S JC AD 4D AC KC 8D 6D 4C 2D KH 2C JD 2C 9H 2D AH 3H 6D 9C 7D TC KS 8C 3H KD 7C 5C 2S 4S 5H AS AH TH JD 4H KD 3H TC 5C 3S AC KH 6D 7H AH 7S QC 6H 2D TD JD AS JH 5D 7H TC 9S 7D JC AS 5S KH 2H 8C AD TH 6H QD KD 9H 6S 6C QH KC 9D 4D 3S JS JH 4H 2C 9H TC 7H KH 4H JC 7D 9S 3H QS 7S AD 7D JH 6C 7H 4H 3S 3H 4D QH JD 2H 5C AS 6C QC 4D 3C TC JH AC JD 3H 6H 4C JC AD 7D 7H 9H 4H TC TS 2C 8C 6S KS 2H JD 9S 4C 3H QS QC 9S 9H 6D KC 9D 9C 5C AD 8C 2C QH TH QD JC 8D 8H QC 2C 2S QD 9C 4D 3S 8D JH QS 9D 3S 2C 7S 7C JC TD 3C TC 9H 3C TS 8H 5C 4C 2C 6S 8D 7C 4H KS 7H 2H TC 4H 2C 3S AS AH QS 8C 2D 2H 2C 4S 4C 6S 7D 5S 3S TH QC 5D TD 3C QS KD KC KS AS 4D AH KD 9H KS 5C 4C 6H JC 7S KC 4H 5C QS TC 2H JC 9S AH QH 4S 9H 3H 5H 3C QD 2H QC JH 8H 5D AS 7H 2C 3D JH 6H 4C 6S 7D 9C JD 9H AH JS 8S QH 3H KS 8H 3S AC QC TS 4D AD 3D AH 8S 9H 7H 3H QS 9C 9S 5H JH JS AH AC 8D 3C JD 2H AC 9C 7H 5S 4D 8H 7C JH 9H 6C JS 9S 7H 8C 9D 4H 2D AS 9S 6H 4D JS JH 9H AD QD 6H 7S JH KH AH 7H TD 5S 6S 2C 8H JH 6S 5H 5S 9D TC 4C QC 9S 7D 2C KD 3H 5H AS QD 7H JS 4D TS QH 6C 8H TH 5H 3C 3H 9C 9D AD KH JS 5D 3H AS AC 9S 5C KC 2C KH 8C JC QS 6D AH 2D KC TC 9D 3H 2S 7C 4D 6D KH KS 8D 7D 9H 2S TC JH AC QC 3H 5S 3S 8H 3S AS KD 8H 4C 3H 7C JH QH TS 7S 6D 7H 9D JH 4C 3D 3S 6C AS 4S 2H 2C 4C 8S 5H KC 8C QC QD 3H 3S 6C QS QC 2D 6S 5D 2C 9D 2H 8D JH 2S 3H 2D 6C 5C 7S AD 9H JS 5D QH 8S TS 2H 7S 6S AD 6D QC 9S 7H 5H 5C 7D KC JD 4H QC 5S 9H 9C 4D 6S KS 2S 4C 7C 9H 7C 4H 8D 3S 6H 5C 8H JS 7S 2D 6H JS TD 4H 4D JC TH 5H KC AC 7C 8D TH 3H 9S 2D 4C KC 4D KD QS 9C 7S 3D KS AD TS 4C 4H QH 9C 8H 2S 7D KS 7H 5D KD 4C 9C 2S 2H JC 6S 6C TC QC JH 5C 7S AC 8H KC 8S 6H QS JC 3D 6S JS 2D JH 8C 4S 6H 8H 6D 5D AD 6H 7D 2S 4H 9H 7C AS AC 8H 5S 3C JS 4S 6D 5H 2S QH 6S 9C 2C 3D 5S 6S 9S 4C QS 8D QD 8S TC 9C 3D AH 9H 5S 2C 7D AD JC 3S 7H TC AS 3C 6S 6D 7S KH KC 9H 3S TC 8H 6S 5H JH 8C 7D AC 2S QD 9D 9C 3S JC 8C KS 8H 5D 4D JS AH JD 6D 9D 8C 9H 9S 8H 3H 2D 6S 4C 4D 8S AD 4S TC AH 9H TS AC QC TH KC 6D 4H 7S 8C 2H 3C QD JS 9D 5S JC AH 2H TS 9H 3H 4D QH 5D 9C 5H 7D 4S JC 3S 8S TH 3H 7C 2H JD JS TS AC 8D 9C 2H TD KC JD 2S 8C 5S AD 2C 3D KD 7C 5H 4D QH QD TC 6H 7D 7H 2C KC 5S KD 6H AH QC 7S QH 6H 5C AC 5H 2C 9C 2D 7C TD 2S 4D 9D AH 3D 7C JD 4H 8C 4C KS TH 3C JS QH 8H 4C AS 3D QS QC 4D 7S 5H JH 6D 7D 6H JS KH 3C QD 8S 7D 2H 2C 7C JC 2S 5H 8C QH 8S 9D TC 2H AD 7C 8D QD 6S 3S 7C AD 9H 2H 9S JD TS 4C 2D 3S AS 4H QC 2C 8H 8S 7S TD TC JH TH TD 3S 4D 4H 5S 5D QS 2C 8C QD QH TC 6D 4S 9S 9D 4H QC 8C JS 9D 6H JD 3H AD 6S TD QC KC 8S 3D 7C TD 7D 8D 9H 4S 3S 6C 4S 3D 9D KD TC KC KS AC 5S 7C 6S QH 3D JS KD 6H 6D 2D 8C JD 2S 5S 4H 8S AC 2D 6S TS 5C 5H 8C 5S 3C 4S 3D 7C 8D AS 3H AS TS 7C 3H AD 7D JC QS 6C 6H 3S 9S 4C AC QH 5H 5D 9H TS 4H 6C 5C 7H 7S TD AD JD 5S 2H 2S 7D 6C KC 3S JD 8D 8S TS QS KH 8S QS 8D 6C TH AC AH 2C 8H 9S 7H TD KH QH 8S 3D 4D AH JD AS TS 3D 2H JC 2S JH KH 6C QC JS KC TH 2D 6H 7S 2S TC 8C 9D QS 3C 9D 6S KH 8H 6D 5D TH 2C 2H 6H TC 7D AD 4D 8S TS 9H TD 7S JS 6D JD JC 2H AC 6C 3D KH 8D KH JD 9S 5D 4H 4C 3H 7S QS 5C 4H JD 5D 3S 3C 4D KH QH QS 7S JD TS 8S QD AH 4C 6H 3S 5S 2C QS 3D JD AS 8D TH 7C 6S QC KS 7S 2H 8C QC 7H AC 6D 2D TH KH 5S 6C 7H KH 7D AH 8C 5C 7S 3D 3C KD AD 7D 6C 4D KS 2D 8C 4S 7C 8D 5S 2D 2S AH AD 2C 9D TD 3C AD 4S KS JH 7C 5C 8C 9C TH AS TD 4D 7C JD 8C QH 3C 5H 9S 3H 9C 8S 9S 6S QD KS AH 5H JH QC 9C 5S 4H 2H TD 7D AS 8C 9D 8C 2C 9D KD TC 7S 3D KH QC 3C 4D AS 4C QS 5S 9D 6S JD QH KS 6D AH 6C 4C 5H TS 9H 7D 3D 5S QS JD 7C 8D 9C AC 3S 6S 6C KH 8H JH 5D 9S 6D AS 6S 3S QC 7H QD AD 5C JH 2H AH 4H AS KC 2C JH 9C 2C 6H 2D JS 5D 9H KC 6D 7D 9D KD TH 3H AS 6S QC 6H AD JD 4H 7D KC 3H JS 3C TH 3D QS 4C 3H 8C QD 5H 6H AS 8H AD JD TH 8S KD 5D QC 7D JS 5S 5H TS 7D KC 9D QS 3H 3C 6D TS 7S AH 7C 4H 7H AH QC AC 4D 5D 6D TH 3C 4H 2S KD 8H 5H JH TC 6C JD 4S 8C 3D 4H JS TD 7S JH QS KD 7C QC KD 4D 7H 6S AD TD TC KH 5H 9H KC 3H 4D 3D AD 6S QD 6H TH 7C 6H TS QH 5S 2C KC TD 6S 7C 4D 5S JD JH 7D AC KD KH 4H 7D 6C 8D 8H 5C JH 8S QD TH JD 8D 7D 6C 7C 9D KD AS 5C QH JH 9S 2C 8C 3C 4C KS JH 2D 8D 4H 7S 6C JH KH 8H 3H 9D 2D AH 6D 4D TC 9C 8D 7H TD KS TH KD 3C JD 9H 8D QD AS KD 9D 2C 2S 9C 8D 3H 5C 7H KS 5H QH 2D 8C 9H 2D TH 6D QD 6C KC 3H 3S AD 4C 4H 3H JS 9D 3C TC 5H QH QC JC 3D 5C 6H 3S 3C JC 5S 7S 2S QH AC 5C 8C 4D 5D 4H 2S QD 3C 3H 2C TD AH 9C KD JS 6S QD 4C QC QS 8C 3S 4H TC JS 3H 7C JC AD 5H 4D 9C KS JC TD 9S TS 8S 9H QD TS 7D AS AC 2C TD 6H 8H AH 6S AD 8C 4S 9H 8D 9D KH 8S 3C QS 4D 2D 7S KH JS JC AD 4C 3C QS 9S 7H KC TD TH 5H JS AC JH 6D AC 2S QS 7C AS KS 6S KH 5S 6D 8H KH 3C QS 2H 5C 9C 9D 6C JS 2C 4C 6H 7D JC AC QD TD 3H 4H QC 8H JD 4C KD KS 5C KC 7S 6D 2D 3H 2S QD 5S 7H AS TH 6S AS 6D 8D 2C 8S TD 8H QD JC AH 9C 9H 2D TD QH 2H 5C TC 3D 8H KC 8S 3D KH 2S TS TC 6S 4D JH 9H 9D QS AC KC 6H 5D 4D 8D AH 9S 5C QS 4H 7C 7D 2H 8S AD JS 3D AC 9S AS 2C 2D 2H 3H JC KH 7H QH KH JD TC KS 5S 8H 4C 8D 2H 7H 3S 2S 5H QS 3C AS 9H KD AD 3D JD 6H 5S 9C 6D AC 9S 3S 3D 5D 9C 2D AC 4S 2S AD 6C 6S QC 4C 2D 3H 6S KC QH QD 2H JH QC 3C 8S 4D 9S 2H 5C 8H QS QD 6D KD 6S 7H 3S KH 2H 5C JC 6C 3S 9S TC 6S 8H 2D AD 7S 8S TS 3C 6H 9C 3H 5C JC 8H QH TD QD 3C JS QD 5D TD 2C KH 9H TH AS 9S TC JD 3D 5C 5H AD QH 9H KC TC 7H 4H 8H 3H TD 6S AC 7C 2S QS 9D 5D 3C JC KS 4D 6C JH 2S 9S 6S 3C 7H TS 4C KD 6D 3D 9C 2D 9H AH AC 7H 2S JH 3S 7C QC QD 9H 3C 2H AC AS 8S KD 8C KH 2D 7S TD TH 6D JD 8D 4D 2H 5S 8S QH KD JD QS JH 4D KC 5H 3S 3C KH QC 6D 8H 3S AH 7D TD 2D 5S 9H QH 4S 6S 6C 6D TS TH 7S 6C 4C 6D QS JS 9C TS 3H 8D 8S JS 5C 7S AS 2C AH 2H AD 5S TC KD 6C 9C 9D TS 2S JC 4H 2C QD QS 9H TC 3H KC KS 4H 3C AD TH KH 9C 2H KD 9D TC 7S KC JH 2D 7C 3S KC AS 8C 5D 9C 9S QH 3H 2D 8C TD 4C 2H QC 5D TC 2C 7D KS 4D 6C QH TD KH 5D 7C AD 8D 2S 9S 8S 4C 8C 3D 6H QD 7C 7H 6C 8S QH 5H TS 5C 3C 4S 2S 2H 8S 6S 2H JC 3S 3H 9D 8C 2S 7H QC 2C 8H 9C AC JD 4C 4H 6S 3S 3H 3S 7D 4C 9S 5H 8H JC 3D TC QH 2S 2D 9S KD QD 9H AD 6D 9C 8D 2D KS 9S JC 4C JD KC 4S TH KH TS 6D 4D 5C KD 5H AS 9H AD QD JS 7C 6D 5D 5C TH 5H QH QS 9D QH KH 5H JH 4C 4D TC TH 6C KH AS TS 9D KD 9C 7S 4D 8H 5S KH AS 2S 7D 9D 4C TS TH AH 7C KS 4D AC 8S 9S 8D TH QH 9D 5C 5D 5C 8C QS TC 4C 3D 3S 2C 8D 9D KS 2D 3C KC 4S 8C KH 6C JC 8H AH 6H 7D 7S QD 3C 4C 6C KC 3H 2C QH 8H AS 7D 4C 8C 4H KC QD 5S 4H 2C TD AH JH QH 4C 8S 3H QS 5S JS 8H 2S 9H 9C 3S 2C 6H TS 7S JC QD AC TD KC 5S 3H QH AS QS 7D JC KC 2C 4C 5C 5S QH 3D AS JS 4H 8D 7H JC 2S 9C 5D 4D 2S 4S 9D 9C 2D QS 8H 7H 6D 7H 3H JS TS AC 2D JH 7C 8S JH 5H KC 3C TC 5S 9H 4C 8H 9D 8S KC 5H 9H AD KS 9D KH 8D AH JC 2H 9H KS 6S 3H QC 5H AH 9C 5C KH 5S AD 6C JC 9H QC 9C TD 5S 5D JC QH 2D KS 8H QS 2H TS JH 5H 5S AH 7H 3C 8S AS TD KH 6H 3D JD 2C 4C KC 7S AH 6C JH 4C KS 9D AD 7S KC 7D 8H 3S 9C 7H 5C 5H 3C 8H QC 3D KH 6D JC 2D 4H 5D 7D QC AD AH 9H QH 8H KD 8C JS 9D 3S 3C 2H 5D 6D 2S 8S 6S TS 3C 6H 8D 5S 3H TD 6C KS 3D JH 9C 7C 9S QS 5S 4H 6H 7S 6S TH 4S KC KD 3S JC JH KS 7C 3C 2S 6D QH 2C 7S 5H 8H AH KC 8D QD 6D KH 5C 7H 9D 3D 9C 6H 2D 8S JS 9S 2S 6D KC 7C TC KD 9C JH 7H KC 8S 2S 7S 3D 6H 4H 9H 2D 4C 8H 7H 5S 8S 2H 8D AD 7C 3C 7S 5S 4D 9H 3D JC KH 5D AS 7D 6D 9C JC 4C QH QS KH KD JD 7D 3D QS QC 8S 6D JS QD 6S 8C 5S QH TH 9H AS AC 2C JD QC KS QH 7S 3C 4C 5C KC 5D AH 6C 4H 9D AH 2C 3H KD 3D TS 5C TD 8S QS AS JS 3H KD AC 4H KS 7D 5D TS 9H 4H 4C 9C 2H 8C QC 2C 7D 9H 4D KS 4C QH AD KD JS QD AD AH KH 9D JS 9H JC KD JD 8S 3C 4S TS 7S 4D 5C 2S 6H 7C JS 7S 5C KD 6D QH 8S TD 2H 6S QH 6C TC 6H TD 4C 9D 2H QC 8H 3D TS 4D 2H 6H 6S 2C 7H 8S 6C 9H 9D JD JH 3S AH 2C 6S 3H 8S 2C QS 8C 5S 3H 2S 7D 3C AD 4S 5C QC QH AS TS 4S 6S 4C 5H JS JH 5C TD 4C 6H JS KD KH QS 4H TC KH JC 4D 9H 9D 8D KC 3C 8H 2H TC 8S AD 9S 4H TS 7H 2C 5C 4H 2S 6C 5S KS AH 9C 7C 8H KD TS QH TD QS 3C JH AH 2C 8D 7D 5D KC 3H 5S AC 4S 7H QS 4C 2H 3D 7D QC KH JH 6D 6C TD TH KD 5S 8D TH 6C 9D 7D KH 8C 9S 6D JD QS 7S QC 2S QH JC 4S KS 8D 7S 5S 9S JD KD 9C JC AD 2D 7C 4S 5H AH JH 9C 5D TD 7C 2D 6S KC 6C 7H 6S 9C QD 5S 4H KS TD 6S 8D KS 2D TH TD 9H JD TS 3S KH JS 4H 5D 9D TC TD QC JD TS QS QD AC AD 4C 6S 2D AS 3H KC 4C 7C 3C TD QS 9C KC AS 8D AD KC 7H QC 6D 8H 6S 5S AH 7S 8C 3S AD 9H JC 6D JD AS KH 6S JH AD 3D TS KS 7H JH 2D JS QD AC 9C JD 7C 6D TC 6H 6C JC 3D 3S QC KC 3S JC KD 2C 8D AH QS TS AS KD 3D JD 8H 7C 8C 5C QD 6C ================================================ FILE: project_euler/problem_054/sol1.py ================================================ """ Problem: https://projecteuler.net/problem=54 In the card game poker, a hand consists of five cards and are ranked, from lowest to highest, in the following way: High Card: Highest value card. One Pair: Two cards of the same value. Two Pairs: Two different pairs. Three of a Kind: Three cards of the same value. Straight: All cards are consecutive values. Flush: All cards of the same suit. Full House: Three of a kind and a pair. Four of a Kind: Four cards of the same value. Straight Flush: All cards are consecutive values of same suit. Royal Flush: Ten, Jack, Queen, King, Ace, in same suit. The cards are valued in the order: 2, 3, 4, 5, 6, 7, 8, 9, 10, Jack, Queen, King, Ace. If two players have the same ranked hands then the rank made up of the highest value wins; for example, a pair of eights beats a pair of fives. But if two ranks tie, for example, both players have a pair of queens, then highest cards in each hand are compared; if the highest cards tie then the next highest cards are compared, and so on. The file, poker.txt, contains one-thousand random hands dealt to two players. Each line of the file contains ten cards (separated by a single space): the first five are Player 1's cards and the last five are Player 2's cards. You can assume that all hands are valid (no invalid characters or repeated cards), each player's hand is in no specific order, and in each hand there is a clear winner. How many hands does Player 1 win? Resources used: https://en.wikipedia.org/wiki/Texas_hold_%27em https://en.wikipedia.org/wiki/List_of_poker_hands Similar problem on codewars: https://www.codewars.com/kata/ranking-poker-hands https://www.codewars.com/kata/sortable-poker-hands """ from __future__ import annotations import os class PokerHand: """Create an object representing a Poker Hand based on an input of a string which represents the best 5-card combination from the player's hand and board cards. Attributes: (read-only) hand: a string representing the hand consisting of five cards Methods: compare_with(opponent): takes in player's hand (self) and opponent's hand (opponent) and compares both hands according to the rules of Texas Hold'em. Returns one of 3 strings (Win, Loss, Tie) based on whether player's hand is better than the opponent's hand. hand_name(): Returns a string made up of two parts: hand name and high card. Supported operators: Rich comparison operators: <, >, <=, >=, ==, != Supported built-in methods and functions: list.sort(), sorted() """ _HAND_NAME = ( "High card", "One pair", "Two pairs", "Three of a kind", "Straight", "Flush", "Full house", "Four of a kind", "Straight flush", "Royal flush", ) _CARD_NAME = ( "", # placeholder as tuples are zero-indexed "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King", "Ace", ) def __init__(self, hand: str) -> None: """ Initialize hand. Hand should of type str and should contain only five cards each separated by a space. The cards should be of the following format: [card value][card suit] The first character is the value of the card: 2, 3, 4, 5, 6, 7, 8, 9, T(en), J(ack), Q(ueen), K(ing), A(ce) The second character represents the suit: S(pades), H(earts), D(iamonds), C(lubs) For example: "6S 4C KC AS TH" """ if not isinstance(hand, str): msg = f"Hand should be of type 'str': {hand!r}" raise TypeError(msg) # split removes duplicate whitespaces so no need of strip if len(hand.split(" ")) != 5: msg = f"Hand should contain only 5 cards: {hand!r}" raise ValueError(msg) self._hand = hand self._first_pair = 0 self._second_pair = 0 self._card_values, self._card_suit = self._internal_state() self._hand_type = self._get_hand_type() self._high_card = self._card_values[0] @property def hand(self): """Returns the self hand""" return self._hand def compare_with(self, other: PokerHand) -> str: """ Determines the outcome of comparing self hand with other hand. Returns the output as 'Win', 'Loss', 'Tie' according to the rules of Texas Hold'em. Here are some examples: >>> player = PokerHand("2H 3H 4H 5H 6H") # Stright flush >>> opponent = PokerHand("KS AS TS QS JS") # Royal flush >>> player.compare_with(opponent) 'Loss' >>> player = PokerHand("2S AH 2H AS AC") # Full house >>> opponent = PokerHand("2H 3H 5H 6H 7H") # Flush >>> player.compare_with(opponent) 'Win' >>> player = PokerHand("2S AH 4H 5S 6C") # High card >>> opponent = PokerHand("AD 4C 5H 6H 2C") # High card >>> player.compare_with(opponent) 'Tie' """ # Breaking the tie works on the following order of precedence: # 1. First pair (default 0) # 2. Second pair (default 0) # 3. Compare all cards in reverse order because they are sorted. # First pair and second pair will only be a non-zero value if the card # type is either from the following: # 21: Four of a kind # 20: Full house # 17: Three of a kind # 16: Two pairs # 15: One pair if self._hand_type > other._hand_type: return "Win" elif self._hand_type < other._hand_type: return "Loss" elif self._first_pair == other._first_pair: if self._second_pair == other._second_pair: return self._compare_cards(other) else: return "Win" if self._second_pair > other._second_pair else "Loss" return "Win" if self._first_pair > other._first_pair else "Loss" # This function is not part of the problem, I did it just for fun def hand_name(self) -> str: """ Return the name of the hand in the following format: 'hand name, high card' Here are some examples: >>> PokerHand("KS AS TS QS JS").hand_name() 'Royal flush' >>> PokerHand("2D 6D 3D 4D 5D").hand_name() 'Straight flush, Six-high' >>> PokerHand("JC 6H JS JD JH").hand_name() 'Four of a kind, Jacks' >>> PokerHand("3D 2H 3H 2C 2D").hand_name() 'Full house, Twos over Threes' >>> PokerHand("2H 4D 3C AS 5S").hand_name() # Low ace 'Straight, Five-high' Source: https://en.wikipedia.org/wiki/List_of_poker_hands """ name = PokerHand._HAND_NAME[self._hand_type - 14] high = PokerHand._CARD_NAME[self._high_card] pair1 = PokerHand._CARD_NAME[self._first_pair] pair2 = PokerHand._CARD_NAME[self._second_pair] if self._hand_type in [22, 19, 18]: return name + f", {high}-high" elif self._hand_type in [21, 17, 15]: return name + f", {pair1}s" elif self._hand_type in [20, 16]: join = "over" if self._hand_type == 20 else "and" return name + f", {pair1}s {join} {pair2}s" elif self._hand_type == 23: return name else: return name + f", {high}" def _compare_cards(self, other: PokerHand) -> str: # Enumerate gives us the index as well as the element of a list for index, card_value in enumerate(self._card_values): if card_value != other._card_values[index]: return "Win" if card_value > other._card_values[index] else "Loss" return "Tie" def _get_hand_type(self) -> int: # Number representing the type of hand internally: # 23: Royal flush # 22: Straight flush # 21: Four of a kind # 20: Full house # 19: Flush # 18: Straight # 17: Three of a kind # 16: Two pairs # 15: One pair # 14: High card if self._is_flush(): if self._is_five_high_straight() or self._is_straight(): return 23 if sum(self._card_values) == 60 else 22 return 19 elif self._is_five_high_straight() or self._is_straight(): return 18 return 14 + self._is_same_kind() def _is_flush(self) -> bool: return len(self._card_suit) == 1 def _is_five_high_straight(self) -> bool: # If a card is a five high straight (low ace) change the location of # ace from the start of the list to the end. Check whether the first # element is ace or not. (Don't want to change again) # Five high straight (low ace): AH 2H 3S 4C 5D # Why use sorted here? One call to this function will mutate the list to # [5, 4, 3, 2, 14] and so for subsequent calls (which will be rare) we # need to compare the sorted version. # Refer test_multiple_calls_five_high_straight in test_poker_hand.py if sorted(self._card_values) == [2, 3, 4, 5, 14]: if self._card_values[0] == 14: # Remember, our list is sorted in reverse order ace_card = self._card_values.pop(0) self._card_values.append(ace_card) return True return False def _is_straight(self) -> bool: for i in range(4): if self._card_values[i] - self._card_values[i + 1] != 1: return False return True def _is_same_kind(self) -> int: # Kind Values for internal use: # 7: Four of a kind # 6: Full house # 3: Three of a kind # 2: Two pairs # 1: One pair # 0: False kind = val1 = val2 = 0 for i in range(4): # Compare two cards at a time, if they are same increase 'kind', # add the value of the card to val1, if it is repeating again we # will add 2 to 'kind' as there are now 3 cards with same value. # If we get card of different value than val1, we will do the same # thing with val2 if self._card_values[i] == self._card_values[i + 1]: if not val1: val1 = self._card_values[i] kind += 1 elif val1 == self._card_values[i]: kind += 2 elif not val2: val2 = self._card_values[i] kind += 1 elif val2 == self._card_values[i]: kind += 2 # For consistency in hand type (look at note in _get_hand_type function) kind = kind + 2 if kind in [4, 5] else kind # first meaning first pair to compare in 'compare_with' first = max(val1, val2) second = min(val1, val2) # If it's full house (three count pair + two count pair), make sure # first pair is three count and if not then switch them both. if kind == 6 and self._card_values.count(first) != 3: first, second = second, first self._first_pair = first self._second_pair = second return kind def _internal_state(self) -> tuple[list[int], set[str]]: # Internal representation of hand as a list of card values and # a set of card suit trans: dict = {"T": "10", "J": "11", "Q": "12", "K": "13", "A": "14"} new_hand = self._hand.translate(str.maketrans(trans)).split() card_values = [int(card[:-1]) for card in new_hand] card_suit = {card[-1] for card in new_hand} return sorted(card_values, reverse=True), card_suit def __repr__(self): return f'{self.__class__}("{self._hand}")' def __str__(self): return self._hand # Rich comparison operators (used in list.sort() and sorted() builtin functions) # Note that this is not part of the problem but another extra feature where # if you have a list of PokerHand objects, you can sort them just through # the builtin functions. def __eq__(self, other): if isinstance(other, PokerHand): return self.compare_with(other) == "Tie" return NotImplemented def __lt__(self, other): if isinstance(other, PokerHand): return self.compare_with(other) == "Loss" return NotImplemented def __le__(self, other): if isinstance(other, PokerHand): return self < other or self == other return NotImplemented def __gt__(self, other): if isinstance(other, PokerHand): return not self < other and self != other return NotImplemented def __ge__(self, other): if isinstance(other, PokerHand): return not self < other return NotImplemented def __hash__(self): return object.__hash__(self) def solution() -> int: # Solution for problem number 54 from Project Euler # Input from poker_hands.txt file answer = 0 script_dir = os.path.abspath(os.path.dirname(__file__)) poker_hands = os.path.join(script_dir, "poker_hands.txt") with open(poker_hands) as file_hand: for line in file_hand: player_hand = line[:14].strip() opponent_hand = line[15:].strip() player, opponent = PokerHand(player_hand), PokerHand(opponent_hand) output = player.compare_with(opponent) if output == "Win": answer += 1 return answer if __name__ == "__main__": solution() ================================================ FILE: project_euler/problem_054/test_poker_hand.py ================================================ import os from itertools import chain from random import randrange, shuffle import pytest from .sol1 import PokerHand SORTED_HANDS = ( "4S 3H 2C 7S 5H", "9D 8H 2C 6S 7H", "2D 6D 9D TH 7D", "TC 8C 2S JH 6C", "JH 8S TH AH QH", "TS KS 5S 9S AC", "KD 6S 9D TH AD", "KS 8D 4D 9S 4S", # pair "8C 4S KH JS 4D", # pair "QH 8H KD JH 8S", # pair "KC 4H KS 2H 8D", # pair "KD 4S KC 3H 8S", # pair "AH 8S AS KC JH", # pair "3H 4C 4H 3S 2H", # 2 pairs "5S 5D 2C KH KH", # 2 pairs "3C KH 5D 5S KH", # 2 pairs "AS 3C KH AD KH", # 2 pairs "7C 7S 3S 7H 5S", # 3 of a kind "7C 7S KH 2H 7H", # 3 of a kind "AC KH QH AH AS", # 3 of a kind "2H 4D 3C AS 5S", # straight (low ace) "3C 5C 4C 2C 6H", # straight "6S 8S 7S 5H 9H", # straight "JS QS 9H TS KH", # straight "QC KH TS JS AH", # straight (high ace) "8C 9C 5C 3C TC", # flush "3S 8S 9S 5S KS", # flush "4C 5C 9C 8C KC", # flush "JH 8H AH KH QH", # flush "3D 2H 3H 2C 2D", # full house "2H 2C 3S 3H 3D", # full house "KH KC 3S 3H 3D", # full house "JC 6H JS JD JH", # 4 of a kind "JC 7H JS JD JH", # 4 of a kind "JC KH JS JD JH", # 4 of a kind "2S AS 4S 5S 3S", # straight flush (low ace) "2D 6D 3D 4D 5D", # straight flush "5C 6C 3C 7C 4C", # straight flush "JH 9H TH KH QH", # straight flush "JH AH TH KH QH", # royal flush (high ace straight flush) ) TEST_COMPARE = ( ("2H 3H 4H 5H 6H", "KS AS TS QS JS", "Loss"), ("2H 3H 4H 5H 6H", "AS AD AC AH JD", "Win"), ("AS AH 2H AD AC", "JS JD JC JH 3D", "Win"), ("2S AH 2H AS AC", "JS JD JC JH AD", "Loss"), ("2S AH 2H AS AC", "2H 3H 5H 6H 7H", "Win"), ("AS 3S 4S 8S 2S", "2H 3H 5H 6H 7H", "Win"), ("2H 3H 5H 6H 7H", "2S 3H 4H 5S 6C", "Win"), ("2S 3H 4H 5S 6C", "3D 4C 5H 6H 2S", "Tie"), ("2S 3H 4H 5S 6C", "AH AC 5H 6H AS", "Win"), ("2S 2H 4H 5S 4C", "AH AC 5H 6H AS", "Loss"), ("2S 2H 4H 5S 4C", "AH AC 5H 6H 7S", "Win"), ("6S AD 7H 4S AS", "AH AC 5H 6H 7S", "Loss"), ("2S AH 4H 5S KC", "AH AC 5H 6H 7S", "Loss"), ("2S 3H 6H 7S 9C", "7H 3C TH 6H 9S", "Loss"), ("4S 5H 6H TS AC", "3S 5H 6H TS AC", "Win"), ("2S AH 4H 5S 6C", "AD 4C 5H 6H 2C", "Tie"), ("AS AH 3H AD AC", "AS AH 2H AD AC", "Win"), ("AH AC 5H 5C QS", "AH AC 5H 5C KS", "Loss"), ("AH AC 5H 5C QS", "KH KC 5H 5C QS", "Win"), ("7C 7S KH 2H 7H", "3C 3S AH 2H 3H", "Win"), ("3C 3S AH 2H 3H", "7C 7S KH 2H 7H", "Loss"), ("6H 5H 4H 3H 2H", "5H 4H 3H 2H AH", "Win"), ("5H 4H 3H 2H AH", "5H 4H 3H 2H AH", "Tie"), ("5H 4H 3H 2H AH", "6H 5H 4H 3H 2H", "Loss"), ("AH AD KS KC AC", "AH KD KH AC KC", "Win"), ("2H 4D 3C AS 5S", "2H 4D 3C 6S 5S", "Loss"), ("2H 3S 3C 3H 2S", "3S 3C 2S 2H 2D", "Win"), ("4D 6D 5D 2D JH", "3S 8S 3H TC KH", "Loss"), ("4S 6C 8S 3S 7S", "AD KS 2D 7D 7C", "Loss"), ("6S 4C 7H 8C 3H", "5H JC AH 9D 9C", "Loss"), ("9D 9H JH TC QH", "3C 2S JS 5C 7H", "Win"), ("2H TC 8S AD 9S", "4H TS 7H 2C 5C", "Win"), ("9D 3S 2C 7S 7C", "JC TD 3C TC 9H", "Loss"), ) TEST_FLUSH = ( ("2H 3H 4H 5H 6H", True), ("AS AH 2H AD AC", False), ("2H 3H 5H 6H 7H", True), ("KS AS TS QS JS", True), ("8H 9H QS JS TH", False), ("AS 3S 4S 8S 2S", True), ) TEST_STRAIGHT = ( ("2H 3H 4H 5H 6H", True), ("AS AH 2H AD AC", False), ("2H 3H 5H 6H 7H", False), ("KS AS TS QS JS", True), ("8H 9H QS JS TH", True), ) TEST_FIVE_HIGH_STRAIGHT = ( ("2H 4D 3C AS 5S", True, [5, 4, 3, 2, 14]), ("2H 5D 3C AS 5S", False, [14, 5, 5, 3, 2]), ("JH QD KC AS TS", False, [14, 13, 12, 11, 10]), ("9D 3S 2C 7S 7C", False, [9, 7, 7, 3, 2]), ) TEST_KIND = ( ("JH AH TH KH QH", 0), ("JH 9H TH KH QH", 0), ("JC KH JS JD JH", 7), ("KH KC 3S 3H 3D", 6), ("8C 9C 5C 3C TC", 0), ("JS QS 9H TS KH", 0), ("7C 7S KH 2H 7H", 3), ("3C KH 5D 5S KH", 2), ("QH 8H KD JH 8S", 1), ("2D 6D 9D TH 7D", 0), ) TEST_TYPES = ( ("JH AH TH KH QH", 23), ("JH 9H TH KH QH", 22), ("JC KH JS JD JH", 21), ("KH KC 3S 3H 3D", 20), ("8C 9C 5C 3C TC", 19), ("JS QS 9H TS KH", 18), ("7C 7S KH 2H 7H", 17), ("3C KH 5D 5S KH", 16), ("QH 8H KD JH 8S", 15), ("2D 6D 9D TH 7D", 14), ) def generate_random_hand(): play, oppo = randrange(len(SORTED_HANDS)), randrange(len(SORTED_HANDS)) expected = ["Loss", "Tie", "Win"][(play >= oppo) + (play > oppo)] hand, other = SORTED_HANDS[play], SORTED_HANDS[oppo] return hand, other, expected def generate_random_hands(number_of_hands: int = 100): return (generate_random_hand() for _ in range(number_of_hands)) @pytest.mark.parametrize(("hand", "expected"), TEST_FLUSH) def test_hand_is_flush(hand, expected): assert PokerHand(hand)._is_flush() == expected @pytest.mark.parametrize(("hand", "expected"), TEST_STRAIGHT) def test_hand_is_straight(hand, expected): assert PokerHand(hand)._is_straight() == expected @pytest.mark.parametrize(("hand", "expected", "card_values"), TEST_FIVE_HIGH_STRAIGHT) def test_hand_is_five_high_straight(hand, expected, card_values): player = PokerHand(hand) assert player._is_five_high_straight() == expected assert player._card_values == card_values @pytest.mark.parametrize(("hand", "expected"), TEST_KIND) def test_hand_is_same_kind(hand, expected): assert PokerHand(hand)._is_same_kind() == expected @pytest.mark.parametrize(("hand", "expected"), TEST_TYPES) def test_hand_values(hand, expected): assert PokerHand(hand)._hand_type == expected @pytest.mark.parametrize(("hand", "other", "expected"), TEST_COMPARE) def test_compare_simple(hand, other, expected): assert PokerHand(hand).compare_with(PokerHand(other)) == expected @pytest.mark.parametrize(("hand", "other", "expected"), generate_random_hands()) def test_compare_random(hand, other, expected): assert PokerHand(hand).compare_with(PokerHand(other)) == expected def test_hand_sorted(): poker_hands = [PokerHand(hand) for hand in SORTED_HANDS] list_copy = poker_hands.copy() shuffle(list_copy) user_sorted = chain(sorted(list_copy)) for index, hand in enumerate(user_sorted): assert hand == poker_hands[index] def test_custom_sort_five_high_straight(): # Test that five high straights are compared correctly. pokerhands = [PokerHand("2D AC 3H 4H 5S"), PokerHand("2S 3H 4H 5S 6C")] pokerhands.sort(reverse=True) assert pokerhands[0].__str__() == "2S 3H 4H 5S 6C" def test_multiple_calls_five_high_straight(): # Multiple calls to five_high_straight function should still return True # and shouldn't mutate the list in every call other than the first. pokerhand = PokerHand("2C 4S AS 3D 5C") expected = True expected_card_values = [5, 4, 3, 2, 14] for _ in range(10): assert pokerhand._is_five_high_straight() == expected assert pokerhand._card_values == expected_card_values def test_euler_project(): # Problem number 54 from Project Euler # Testing from poker_hands.txt file answer = 0 script_dir = os.path.abspath(os.path.dirname(__file__)) poker_hands = os.path.join(script_dir, "poker_hands.txt") with open(poker_hands) as file_hand: for line in file_hand: player_hand = line[:14].strip() opponent_hand = line[15:].strip() player, opponent = PokerHand(player_hand), PokerHand(opponent_hand) output = player.compare_with(opponent) if output == "Win": answer += 1 assert answer == 376 ================================================ FILE: project_euler/problem_055/__init__.py ================================================ ================================================ FILE: project_euler/problem_055/sol1.py ================================================ """ Lychrel numbers Problem 55: https://projecteuler.net/problem=55 If we take 47, reverse and add, 47 + 74 = 121, which is palindromic. Not all numbers produce palindromes so quickly. For example, 349 + 943 = 1292, 1292 + 2921 = 4213 4213 + 3124 = 7337 That is, 349 took three iterations to arrive at a palindrome. Although no one has proved it yet, it is thought that some numbers, like 196, never produce a palindrome. A number that never forms a palindrome through the reverse and add process is called a Lychrel number. Due to the theoretical nature of these numbers, and for the purpose of this problem, we shall assume that a number is Lychrel until proven otherwise. In addition you are given that for every number below ten-thousand, it will either (i) become a palindrome in less than fifty iterations, or, (ii) no one, with all the computing power that exists, has managed so far to map it to a palindrome. In fact, 10677 is the first number to be shown to require over fifty iterations before producing a palindrome: 4668731596684224866951378664 (53 iterations, 28-digits). Surprisingly, there are palindromic numbers that are themselves Lychrel numbers; the first example is 4994. How many Lychrel numbers are there below ten-thousand? """ def is_palindrome(n: int) -> bool: """ Returns True if a number is palindrome. >>> is_palindrome(12567321) False >>> is_palindrome(1221) True >>> is_palindrome(9876789) True """ return str(n) == str(n)[::-1] def sum_reverse(n: int) -> int: """ Returns the sum of n and reverse of n. >>> sum_reverse(123) 444 >>> sum_reverse(3478) 12221 >>> sum_reverse(12) 33 """ return int(n) + int(str(n)[::-1]) def solution(limit: int = 10000) -> int: """ Returns the count of all lychrel numbers below limit. >>> solution(10000) 249 >>> solution(5000) 76 >>> solution(1000) 13 """ lychrel_nums = [] for num in range(1, limit): iterations = 0 a = num while iterations < 50: num = sum_reverse(num) iterations += 1 if is_palindrome(num): break else: lychrel_nums.append(a) return len(lychrel_nums) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_056/__init__.py ================================================ ================================================ FILE: project_euler/problem_056/sol1.py ================================================ """ Project Euler Problem 56: https://projecteuler.net/problem=56 A googol (10^100) is a massive number: one followed by one-hundred zeros; 100^100 is almost unimaginably large: one followed by two-hundred zeros. Despite their size, the sum of the digits in each number is only 1. Considering natural numbers of the form, ab, where a, b < 100, what is the maximum digital sum? """ def solution(a: int = 100, b: int = 100) -> int: """ Considering natural numbers of the form, a**b, where a, b < 100, what is the maximum digital sum? :param a: :param b: :return: >>> solution(10,10) 45 >>> solution(100,100) 972 >>> solution(100,200) 1872 """ # RETURN the MAXIMUM from the list of SUMs of the list of INT converted from STR of # BASE raised to the POWER return max( sum(int(x) for x in str(base**power)) for base in range(a) for power in range(b) ) # Tests if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: project_euler/problem_057/__init__.py ================================================ ================================================ FILE: project_euler/problem_057/sol1.py ================================================ """ Project Euler Problem 57: https://projecteuler.net/problem=57 It is possible to show that the square root of two can be expressed as an infinite continued fraction. sqrt(2) = 1 + 1 / (2 + 1 / (2 + 1 / (2 + ...))) By expanding this for the first four iterations, we get: 1 + 1 / 2 = 3 / 2 = 1.5 1 + 1 / (2 + 1 / 2} = 7 / 5 = 1.4 1 + 1 / (2 + 1 / (2 + 1 / 2)) = 17 / 12 = 1.41666... 1 + 1 / (2 + 1 / (2 + 1 / (2 + 1 / 2))) = 41/ 29 = 1.41379... The next three expansions are 99/70, 239/169, and 577/408, but the eighth expansion, 1393/985, is the first example where the number of digits in the numerator exceeds the number of digits in the denominator. In the first one-thousand expansions, how many fractions contain a numerator with more digits than the denominator? """ def solution(n: int = 1000) -> int: """ returns number of fractions containing a numerator with more digits than the denominator in the first n expansions. >>> solution(14) 2 >>> solution(100) 15 >>> solution(10000) 1508 """ prev_numerator, prev_denominator = 1, 1 result = [] for i in range(1, n + 1): numerator = prev_numerator + 2 * prev_denominator denominator = prev_numerator + prev_denominator if len(str(numerator)) > len(str(denominator)): result.append(i) prev_numerator = numerator prev_denominator = denominator return len(result) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_058/__init__.py ================================================ ================================================ FILE: project_euler/problem_058/sol1.py ================================================ """ Project Euler Problem 58:https://projecteuler.net/problem=58 Starting with 1 and spiralling anticlockwise in the following way, a square spiral with side length 7 is formed. 37 36 35 34 33 32 31 38 17 16 15 14 13 30 39 18 5 4 3 12 29 40 19 6 1 2 11 28 41 20 7 8 9 10 27 42 21 22 23 24 25 26 43 44 45 46 47 48 49 It is interesting to note that the odd squares lie along the bottom right diagonal ,but what is more interesting is that 8 out of the 13 numbers lying along both diagonals are prime; that is, a ratio of 8/13 ≈ 62%. If one complete new layer is wrapped around the spiral above, a square spiral with side length 9 will be formed. If this process is continued, what is the side length of the square spiral for which the ratio of primes along both diagonals first falls below 10%? Solution: We have to find an odd length side for which square falls below 10%. With every layer we add 4 elements are being added to the diagonals ,lets say we have a square spiral of odd length with side length j, then if we move from j to j+2, we are adding j*j+j+1,j*j+2*(j+1),j*j+3*(j+1) j*j+4*(j+1). Out of these 4 only the first three can become prime because last one reduces to (j+2)*(j+2). So we check individually each one of these before incrementing our count of current primes. """ import math def is_prime(number: int) -> bool: """Checks to see if a number is a prime in O(sqrt(n)). A number is prime if it has exactly two factors: 1 and itself. >>> is_prime(0) False >>> is_prime(1) False >>> is_prime(2) True >>> is_prime(3) True >>> is_prime(27) False >>> is_prime(87) False >>> is_prime(563) True >>> is_prime(2999) True >>> is_prime(67483) False """ if 1 < number < 4: # 2 and 3 are primes return True elif number < 2 or number % 2 == 0 or number % 3 == 0: # Negatives, 0, 1, all even numbers, all multiples of 3 are not primes return False # All primes number are in format of 6k +/- 1 for i in range(5, int(math.sqrt(number) + 1), 6): if number % i == 0 or number % (i + 2) == 0: return False return True def solution(ratio: float = 0.1) -> int: """ Returns the side length of the square spiral of odd length greater than 1 for which the ratio of primes along both diagonals first falls below the given ratio. >>> solution(.5) 11 >>> solution(.2) 309 >>> solution(.111) 11317 """ j = 3 primes = 3 while primes / (2 * j - 1) >= ratio: for i in range(j * j + j + 1, (j + 2) * (j + 2), j + 1): primes += is_prime(i) j += 2 return j if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: project_euler/problem_059/__init__.py ================================================ ================================================ FILE: project_euler/problem_059/p059_cipher.txt ================================================ 36,22,80,0,0,4,23,25,19,17,88,4,4,19,21,11,88,22,23,23,29,69,12,24,0,88,25,11,12,2,10,28,5,6,12,25,10,22,80,10,30,80,10,22,21,69,23,22,69,61,5,9,29,2,66,11,80,8,23,3,17,88,19,0,20,21,7,10,17,17,29,20,69,8,17,21,29,2,22,84,80,71,60,21,69,11,5,8,21,25,22,88,3,0,10,25,0,10,5,8,88,2,0,27,25,21,10,31,6,25,2,16,21,82,69,35,63,11,88,4,13,29,80,22,13,29,22,88,31,3,88,3,0,10,25,0,11,80,10,30,80,23,29,19,12,8,2,10,27,17,9,11,45,95,88,57,69,16,17,19,29,80,23,29,19,0,22,4,9,1,80,3,23,5,11,28,92,69,9,5,12,12,21,69,13,30,0,0,0,0,27,4,0,28,28,28,84,80,4,22,80,0,20,21,2,25,30,17,88,21,29,8,2,0,11,3,12,23,30,69,30,31,23,88,4,13,29,80,0,22,4,12,10,21,69,11,5,8,88,31,3,88,4,13,17,3,69,11,21,23,17,21,22,88,65,69,83,80,84,87,68,69,83,80,84,87,73,69,83,80,84,87,65,83,88,91,69,29,4,6,86,92,69,15,24,12,27,24,69,28,21,21,29,30,1,11,80,10,22,80,17,16,21,69,9,5,4,28,2,4,12,5,23,29,80,10,30,80,17,16,21,69,27,25,23,27,28,0,84,80,22,23,80,17,16,17,17,88,25,3,88,4,13,29,80,17,10,5,0,88,3,16,21,80,10,30,80,17,16,25,22,88,3,0,10,25,0,11,80,12,11,80,10,26,4,4,17,30,0,28,92,69,30,2,10,21,80,12,12,80,4,12,80,10,22,19,0,88,4,13,29,80,20,13,17,1,10,17,17,13,2,0,88,31,3,88,4,13,29,80,6,17,2,6,20,21,69,30,31,9,20,31,18,11,94,69,54,17,8,29,28,28,84,80,44,88,24,4,14,21,69,30,31,16,22,20,69,12,24,4,12,80,17,16,21,69,11,5,8,88,31,3,88,4,13,17,3,69,11,21,23,17,21,22,88,25,22,88,17,69,11,25,29,12,24,69,8,17,23,12,80,10,30,80,17,16,21,69,11,1,16,25,2,0,88,31,3,88,4,13,29,80,21,29,2,12,21,21,17,29,2,69,23,22,69,12,24,0,88,19,12,10,19,9,29,80,18,16,31,22,29,80,1,17,17,8,29,4,0,10,80,12,11,80,84,67,80,10,10,80,7,1,80,21,13,4,17,17,30,2,88,4,13,29,80,22,13,29,69,23,22,69,12,24,12,11,80,22,29,2,12,29,3,69,29,1,16,25,28,69,12,31,69,11,92,69,17,4,69,16,17,22,88,4,13,29,80,23,25,4,12,23,80,22,9,2,17,80,70,76,88,29,16,20,4,12,8,28,12,29,20,69,26,9,69,11,80,17,23,80,84,88,31,3,88,4,13,29,80,21,29,2,12,21,21,17,29,2,69,12,31,69,12,24,0,88,20,12,25,29,0,12,21,23,86,80,44,88,7,12,20,28,69,11,31,10,22,80,22,16,31,18,88,4,13,25,4,69,12,24,0,88,3,16,21,80,10,30,80,17,16,25,22,88,3,0,10,25,0,11,80,17,23,80,7,29,80,4,8,0,23,23,8,12,21,17,17,29,28,28,88,65,75,78,68,81,65,67,81,72,70,83,64,68,87,74,70,81,75,70,81,67,80,4,22,20,69,30,2,10,21,80,8,13,28,17,17,0,9,1,25,11,31,80,17,16,25,22,88,30,16,21,18,0,10,80,7,1,80,22,17,8,73,88,17,11,28,80,17,16,21,11,88,4,4,19,25,11,31,80,17,16,21,69,11,1,16,25,2,0,88,2,10,23,4,73,88,4,13,29,80,11,13,29,7,29,2,69,75,94,84,76,65,80,65,66,83,77,67,80,64,73,82,65,67,87,75,72,69,17,3,69,17,30,1,29,21,1,88,0,23,23,20,16,27,21,1,84,80,18,16,25,6,16,80,0,0,0,23,29,3,22,29,3,69,12,24,0,88,0,0,10,25,8,29,4,0,10,80,10,30,80,4,88,19,12,10,19,9,29,80,18,16,31,22,29,80,1,17,17,8,29,4,0,10,80,12,11,80,84,86,80,35,23,28,9,23,7,12,22,23,69,25,23,4,17,30,69,12,24,0,88,3,4,21,21,69,11,4,0,8,3,69,26,9,69,15,24,12,27,24,69,49,80,13,25,20,69,25,2,23,17,6,0,28,80,4,12,80,17,16,25,22,88,3,16,21,92,69,49,80,13,25,6,0,88,20,12,11,19,10,14,21,23,29,20,69,12,24,4,12,80,17,16,21,69,11,5,8,88,31,3,88,4,13,29,80,22,29,2,12,29,3,69,73,80,78,88,65,74,73,70,69,83,80,84,87,72,84,88,91,69,73,95,87,77,70,69,83,80,84,87,70,87,77,80,78,88,21,17,27,94,69,25,28,22,23,80,1,29,0,0,22,20,22,88,31,11,88,4,13,29,80,20,13,17,1,10,17,17,13,2,0,88,31,3,88,4,13,29,80,6,17,2,6,20,21,75,88,62,4,21,21,9,1,92,69,12,24,0,88,3,16,21,80,10,30,80,17,16,25,22,88,29,16,20,4,12,8,28,12,29,20,69,26,9,69,65,64,69,31,25,19,29,3,69,12,24,0,88,18,12,9,5,4,28,2,4,12,21,69,80,22,10,13,2,17,16,80,21,23,7,0,10,89,69,23,22,69,12,24,0,88,19,12,10,19,16,21,22,0,10,21,11,27,21,69,23,22,69,12,24,0,88,0,0,10,25,8,29,4,0,10,80,10,30,80,4,88,19,12,10,19,9,29,80,18,16,31,22,29,80,1,17,17,8,29,4,0,10,80,12,11,80,84,86,80,36,22,20,69,26,9,69,11,25,8,17,28,4,10,80,23,29,17,22,23,30,12,22,23,69,49,80,13,25,6,0,88,28,12,19,21,18,17,3,0,88,18,0,29,30,69,25,18,9,29,80,17,23,80,1,29,4,0,10,29,12,22,21,69,12,24,0,88,3,16,21,3,69,23,22,69,12,24,0,88,3,16,26,3,0,9,5,0,22,4,69,11,21,23,17,21,22,88,25,11,88,7,13,17,19,13,88,4,13,29,80,0,0,0,10,22,21,11,12,3,69,25,2,0,88,21,19,29,30,69,22,5,8,26,21,23,11,94 ================================================ FILE: project_euler/problem_059/sol1.py ================================================ """ Each character on a computer is assigned a unique code and the preferred standard is ASCII (American Standard Code for Information Interchange). For example, uppercase A = 65, asterisk (*) = 42, and lowercase k = 107. A modern encryption method is to take a text file, convert the bytes to ASCII, then XOR each byte with a given value, taken from a secret key. The advantage with the XOR function is that using the same encryption key on the cipher text, restores the plain text; for example, 65 XOR 42 = 107, then 107 XOR 42 = 65. For unbreakable encryption, the key is the same length as the plain text message, and the key is made up of random bytes. The user would keep the encrypted message and the encryption key in different locations, and without both "halves", it is impossible to decrypt the message. Unfortunately, this method is impractical for most users, so the modified method is to use a password as a key. If the password is shorter than the message, which is likely, the key is repeated cyclically throughout the message. The balance for this method is using a sufficiently long password key for security, but short enough to be memorable. Your task has been made easy, as the encryption key consists of three lower case characters. Using p059_cipher.txt (right click and 'Save Link/Target As...'), a file containing the encrypted ASCII codes, and the knowledge that the plain text must contain common English words, decrypt the message and find the sum of the ASCII values in the original text. """ from __future__ import annotations import string from itertools import cycle, product from pathlib import Path VALID_CHARS: str = ( string.ascii_letters + string.digits + string.punctuation + string.whitespace ) LOWERCASE_INTS: list[int] = [ord(letter) for letter in string.ascii_lowercase] VALID_INTS: set[int] = {ord(char) for char in VALID_CHARS} COMMON_WORDS: list[str] = ["the", "be", "to", "of", "and", "in", "that", "have"] def try_key(ciphertext: list[int], key: tuple[int, ...]) -> str | None: """ Given an encrypted message and a possible 3-character key, decrypt the message. If the decrypted message contains a invalid character, i.e. not an ASCII letter, a digit, punctuation or whitespace, then we know the key is incorrect, so return None. >>> try_key([0, 17, 20, 4, 27], (104, 116, 120)) 'hello' >>> try_key([68, 10, 300, 4, 27], (104, 116, 120)) is None True """ decoded: str = "" keychar: int cipherchar: int decodedchar: int for keychar, cipherchar in zip(cycle(key), ciphertext): decodedchar = cipherchar ^ keychar if decodedchar not in VALID_INTS: return None decoded += chr(decodedchar) return decoded def filter_valid_chars(ciphertext: list[int]) -> list[str]: """ Given an encrypted message, test all 3-character strings to try and find the key. Return a list of the possible decrypted messages. >>> from itertools import cycle >>> text = "The enemy's gate is down" >>> key = "end" >>> encoded = [ord(k) ^ ord(c) for k,c in zip(cycle(key), text)] >>> text in filter_valid_chars(encoded) True """ possibles: list[str] = [] for key in product(LOWERCASE_INTS, repeat=3): encoded = try_key(ciphertext, key) if encoded is not None: possibles.append(encoded) return possibles def filter_common_word(possibles: list[str], common_word: str) -> list[str]: """ Given a list of possible decoded messages, narrow down the possibilities for checking for the presence of a specified common word. Only decoded messages containing common_word will be returned. >>> filter_common_word(['asfla adf', 'I am here', ' !?! #a'], 'am') ['I am here'] >>> filter_common_word(['athla amf', 'I am here', ' !?! #a'], 'am') ['athla amf', 'I am here'] """ return [possible for possible in possibles if common_word in possible.lower()] def solution(filename: str = "p059_cipher.txt") -> int: """ Test the ciphertext against all possible 3-character keys, then narrow down the possibilities by filtering using common words until there's only one possible decoded message. >>> solution("test_cipher.txt") 3000 """ ciphertext: list[int] possibles: list[str] common_word: str decoded_text: str data: str = Path(__file__).parent.joinpath(filename).read_text(encoding="utf-8") ciphertext = [int(number) for number in data.strip().split(",")] possibles = filter_valid_chars(ciphertext) for common_word in COMMON_WORDS: possibles = filter_common_word(possibles, common_word) if len(possibles) == 1: break decoded_text = possibles[0] return sum(ord(char) for char in decoded_text) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_059/test_cipher.txt ================================================ 63,13,28,75,0,23,14,8,0,76,22,89,12,4,13,14,69,16,24,69,29,4,18,23,69,69,59,14,69,11,14,4,29,18 ================================================ FILE: project_euler/problem_062/__init__.py ================================================ ================================================ FILE: project_euler/problem_062/sol1.py ================================================ """ Project Euler 62 https://projecteuler.net/problem=62 The cube, 41063625 (345^3), can be permuted to produce two other cubes: 56623104 (384^3) and 66430125 (405^3). In fact, 41063625 is the smallest cube which has exactly three permutations of its digits which are also cube. Find the smallest cube for which exactly five permutations of its digits are cube. """ from collections import defaultdict def solution(max_base: int = 5) -> int: """ Iterate through every possible cube and sort the cube's digits in ascending order. Sorting maintains an ordering of the digits that allows you to compare permutations. Store each sorted sequence of digits in a dictionary, whose key is the sequence of digits and value is a list of numbers that are the base of the cube. Once you find 5 numbers that produce the same sequence of digits, return the smallest one, which is at index 0 since we insert each base number in ascending order. >>> solution(2) 125 >>> solution(3) 41063625 """ freqs = defaultdict(list) num = 0 while True: digits = get_digits(num) freqs[digits].append(num) if len(freqs[digits]) == max_base: base = freqs[digits][0] ** 3 return base num += 1 def get_digits(num: int) -> str: """ Computes the sorted sequence of digits of the cube of num. >>> get_digits(3) '27' >>> get_digits(99) '027999' >>> get_digits(123) '0166788' """ return "".join(sorted(str(num**3))) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_063/__init__.py ================================================ ================================================ FILE: project_euler/problem_063/sol1.py ================================================ """ The 5-digit number, 16807=75, is also a fifth power. Similarly, the 9-digit number, 134217728=89, is a ninth power. How many n-digit positive integers exist which are also an nth power? """ """ The maximum base can be 9 because all n-digit numbers < 10^n. Now 9**23 has 22 digits so the maximum power can be 22. Using these conclusions, we will calculate the result. """ def solution(max_base: int = 10, max_power: int = 22) -> int: """ Returns the count of all n-digit numbers which are nth power >>> solution(10, 22) 49 >>> solution(0, 0) 0 >>> solution(1, 1) 0 >>> solution(-1, -1) 0 """ bases = range(1, max_base) powers = range(1, max_power) return sum( 1 for power in powers for base in bases if len(str(base**power)) == power ) if __name__ == "__main__": print(f"{solution(10, 22) = }") ================================================ FILE: project_euler/problem_064/__init__.py ================================================ ================================================ FILE: project_euler/problem_064/sol1.py ================================================ """ Project Euler Problem 64: https://projecteuler.net/problem=64 All square roots are periodic when written as continued fractions. For example, let us consider sqrt(23). It can be seen that the sequence is repeating. For conciseness, we use the notation sqrt(23)=[4;(1,3,1,8)], to indicate that the block (1,3,1,8) repeats indefinitely. Exactly four continued fractions, for N<=13, have an odd period. How many continued fractions for N<=10000 have an odd period? References: - https://en.wikipedia.org/wiki/Continued_fraction """ from math import floor, sqrt def continuous_fraction_period(n: int) -> int: """ Returns the continued fraction period of a number n. >>> continuous_fraction_period(2) 1 >>> continuous_fraction_period(5) 1 >>> continuous_fraction_period(7) 4 >>> continuous_fraction_period(11) 2 >>> continuous_fraction_period(13) 5 """ numerator = 0.0 denominator = 1.0 root = int(sqrt(n)) integer_part = root period = 0 while integer_part != 2 * root: numerator = denominator * integer_part - numerator denominator = (n - numerator**2) / denominator integer_part = int((root + numerator) / denominator) period += 1 return period def solution(n: int = 10000) -> int: """ Returns the count of numbers <= 10000 with odd periods. This function calls continuous_fraction_period for numbers which are not perfect squares. This is checked in if sr - floor(sr) != 0 statement. If an odd period is returned by continuous_fraction_period, count_odd_periods is increased by 1. >>> solution(2) 1 >>> solution(5) 2 >>> solution(7) 2 >>> solution(11) 3 >>> solution(13) 4 """ count_odd_periods = 0 for i in range(2, n + 1): sr = sqrt(i) if sr - floor(sr) != 0 and continuous_fraction_period(i) % 2 == 1: count_odd_periods += 1 return count_odd_periods if __name__ == "__main__": print(f"{solution(int(input().strip()))}") ================================================ FILE: project_euler/problem_065/__init__.py ================================================ ================================================ FILE: project_euler/problem_065/sol1.py ================================================ """ Project Euler Problem 65: https://projecteuler.net/problem=65 The square root of 2 can be written as an infinite continued fraction. sqrt(2) = 1 + 1 / (2 + 1 / (2 + 1 / (2 + 1 / (2 + ...)))) The infinite continued fraction can be written, sqrt(2) = [1;(2)], (2) indicates that 2 repeats ad infinitum. In a similar way, sqrt(23) = [4;(1,3,1,8)]. It turns out that the sequence of partial values of continued fractions for square roots provide the best rational approximations. Let us consider the convergents for sqrt(2). 1 + 1 / 2 = 3/2 1 + 1 / (2 + 1 / 2) = 7/5 1 + 1 / (2 + 1 / (2 + 1 / 2)) = 17/12 1 + 1 / (2 + 1 / (2 + 1 / (2 + 1 / 2))) = 41/29 Hence the sequence of the first ten convergents for sqrt(2) are: 1, 3/2, 7/5, 17/12, 41/29, 99/70, 239/169, 577/408, 1393/985, 3363/2378, ... What is most surprising is that the important mathematical constant, e = [2;1,2,1,1,4,1,1,6,1,...,1,2k,1,...]. The first ten terms in the sequence of convergents for e are: 2, 3, 8/3, 11/4, 19/7, 87/32, 106/39, 193/71, 1264/465, 1457/536, ... The sum of digits in the numerator of the 10th convergent is 1 + 4 + 5 + 7 = 17. Find the sum of the digits in the numerator of the 100th convergent of the continued fraction for e. ----- The solution mostly comes down to finding an equation that will generate the numerator of the continued fraction. For the i-th numerator, the pattern is: n_i = m_i * n_(i-1) + n_(i-2) for m_i = the i-th index of the continued fraction representation of e, n_0 = 1, and n_1 = 2 as the first 2 numbers of the representation. For example: n_9 = 6 * 193 + 106 = 1264 1 + 2 + 6 + 4 = 13 n_10 = 1 * 193 + 1264 = 1457 1 + 4 + 5 + 7 = 17 """ def sum_digits(num: int) -> int: """ Returns the sum of every digit in num. >>> sum_digits(1) 1 >>> sum_digits(12345) 15 >>> sum_digits(999001) 28 """ digit_sum = 0 while num > 0: digit_sum += num % 10 num //= 10 return digit_sum def solution(max_n: int = 100) -> int: """ Returns the sum of the digits in the numerator of the max-th convergent of the continued fraction for e. >>> solution(9) 13 >>> solution(10) 17 >>> solution(50) 91 """ pre_numerator = 1 cur_numerator = 2 for i in range(2, max_n + 1): temp = pre_numerator e_cont = 2 * i // 3 if i % 3 == 0 else 1 pre_numerator = cur_numerator cur_numerator = e_cont * pre_numerator + temp return sum_digits(cur_numerator) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_067/__init__.py ================================================ ================================================ FILE: project_euler/problem_067/sol1.py ================================================ """ Problem Statement: By starting at the top of the triangle below and moving to adjacent numbers on the row below, the maximum total from top to bottom is 23. 3 7 4 2 4 6 8 5 9 3 That is, 3 + 7 + 4 + 9 = 23. Find the maximum total from top to bottom in triangle.txt (right click and 'Save Link/Target As...'), a 15K text file containing a triangle with one-hundred rows. """ import os def solution(): """ Finds the maximum total in a triangle as described by the problem statement above. >>> solution() 7273 """ script_dir = os.path.dirname(os.path.realpath(__file__)) triangle = os.path.join(script_dir, "triangle.txt") with open(triangle) as f: triangle = f.readlines() a = [] for line in triangle: numbers_from_line = [] for number in line.strip().split(" "): numbers_from_line.append(int(number)) a.append(numbers_from_line) for i in range(1, len(a)): for j in range(len(a[i])): number1 = a[i - 1][j] if j != len(a[i - 1]) else 0 number2 = a[i - 1][j - 1] if j > 0 else 0 a[i][j] += max(number1, number2) return max(a[-1]) if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_067/sol2.py ================================================ """ Problem Statement: By starting at the top of the triangle below and moving to adjacent numbers on the row below, the maximum total from top to bottom is 23. 3 7 4 2 4 6 8 5 9 3 That is, 3 + 7 + 4 + 9 = 23. Find the maximum total from top to bottom in triangle.txt (right click and 'Save Link/Target As...'), a 15K text file containing a triangle with one-hundred rows. """ import os def solution() -> int: """ Finds the maximum total in a triangle as described by the problem statement above. >>> solution() 7273 """ script_dir = os.path.dirname(os.path.realpath(__file__)) triangle_path = os.path.join(script_dir, "triangle.txt") with open(triangle_path) as in_file: triangle = [[int(i) for i in line.split()] for line in in_file] while len(triangle) != 1: last_row = triangle.pop() curr_row = triangle[-1] for j in range(len(last_row) - 1): curr_row[j] += max(last_row[j], last_row[j + 1]) return triangle[0][0] if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_067/triangle.txt ================================================ 59 73 41 52 40 09 26 53 06 34 10 51 87 86 81 61 95 66 57 25 68 90 81 80 38 92 67 73 30 28 51 76 81 18 75 44 84 14 95 87 62 81 17 78 58 21 46 71 58 02 79 62 39 31 09 56 34 35 53 78 31 81 18 90 93 15 78 53 04 21 84 93 32 13 97 11 37 51 45 03 81 79 05 18 78 86 13 30 63 99 95 39 87 96 28 03 38 42 17 82 87 58 07 22 57 06 17 51 17 07 93 09 07 75 97 95 78 87 08 53 67 66 59 60 88 99 94 65 55 77 55 34 27 53 78 28 76 40 41 04 87 16 09 42 75 69 23 97 30 60 10 79 87 12 10 44 26 21 36 32 84 98 60 13 12 36 16 63 31 91 35 70 39 06 05 55 27 38 48 28 22 34 35 62 62 15 14 94 89 86 66 56 68 84 96 21 34 34 34 81 62 40 65 54 62 05 98 03 02 60 38 89 46 37 99 54 34 53 36 14 70 26 02 90 45 13 31 61 83 73 47 36 10 63 96 60 49 41 05 37 42 14 58 84 93 96 17 09 43 05 43 06 59 66 57 87 57 61 28 37 51 84 73 79 15 39 95 88 87 43 39 11 86 77 74 18 54 42 05 79 30 49 99 73 46 37 50 02 45 09 54 52 27 95 27 65 19 45 26 45 71 39 17 78 76 29 52 90 18 99 78 19 35 62 71 19 23 65 93 85 49 33 75 09 02 33 24 47 61 60 55 32 88 57 55 91 54 46 57 07 77 98 52 80 99 24 25 46 78 79 05 92 09 13 55 10 67 26 78 76 82 63 49 51 31 24 68 05 57 07 54 69 21 67 43 17 63 12 24 59 06 08 98 74 66 26 61 60 13 03 09 09 24 30 71 08 88 70 72 70 29 90 11 82 41 34 66 82 67 04 36 60 92 77 91 85 62 49 59 61 30 90 29 94 26 41 89 04 53 22 83 41 09 74 90 48 28 26 37 28 52 77 26 51 32 18 98 79 36 62 13 17 08 19 54 89 29 73 68 42 14 08 16 70 37 37 60 69 70 72 71 09 59 13 60 38 13 57 36 09 30 43 89 30 39 15 02 44 73 05 73 26 63 56 86 12 55 55 85 50 62 99 84 77 28 85 03 21 27 22 19 26 82 69 54 04 13 07 85 14 01 15 70 59 89 95 10 19 04 09 31 92 91 38 92 86 98 75 21 05 64 42 62 84 36 20 73 42 21 23 22 51 51 79 25 45 85 53 03 43 22 75 63 02 49 14 12 89 14 60 78 92 16 44 82 38 30 72 11 46 52 90 27 08 65 78 03 85 41 57 79 39 52 33 48 78 27 56 56 39 13 19 43 86 72 58 95 39 07 04 34 21 98 39 15 39 84 89 69 84 46 37 57 59 35 59 50 26 15 93 42 89 36 27 78 91 24 11 17 41 05 94 07 69 51 96 03 96 47 90 90 45 91 20 50 56 10 32 36 49 04 53 85 92 25 65 52 09 61 30 61 97 66 21 96 92 98 90 06 34 96 60 32 69 68 33 75 84 18 31 71 50 84 63 03 03 19 11 28 42 75 45 45 61 31 61 68 96 34 49 39 05 71 76 59 62 67 06 47 96 99 34 21 32 47 52 07 71 60 42 72 94 56 82 83 84 40 94 87 82 46 01 20 60 14 17 38 26 78 66 81 45 95 18 51 98 81 48 16 53 88 37 52 69 95 72 93 22 34 98 20 54 27 73 61 56 63 60 34 63 93 42 94 83 47 61 27 51 79 79 45 01 44 73 31 70 83 42 88 25 53 51 30 15 65 94 80 44 61 84 12 77 02 62 02 65 94 42 14 94 32 73 09 67 68 29 74 98 10 19 85 48 38 31 85 67 53 93 93 77 47 67 39 72 94 53 18 43 77 40 78 32 29 59 24 06 02 83 50 60 66 32 01 44 30 16 51 15 81 98 15 10 62 86 79 50 62 45 60 70 38 31 85 65 61 64 06 69 84 14 22 56 43 09 48 66 69 83 91 60 40 36 61 92 48 22 99 15 95 64 43 01 16 94 02 99 19 17 69 11 58 97 56 89 31 77 45 67 96 12 73 08 20 36 47 81 44 50 64 68 85 40 81 85 52 09 91 35 92 45 32 84 62 15 19 64 21 66 06 01 52 80 62 59 12 25 88 28 91 50 40 16 22 99 92 79 87 51 21 77 74 77 07 42 38 42 74 83 02 05 46 19 77 66 24 18 05 32 02 84 31 99 92 58 96 72 91 36 62 99 55 29 53 42 12 37 26 58 89 50 66 19 82 75 12 48 24 87 91 85 02 07 03 76 86 99 98 84 93 07 17 33 61 92 20 66 60 24 66 40 30 67 05 37 29 24 96 03 27 70 62 13 04 45 47 59 88 43 20 66 15 46 92 30 04 71 66 78 70 53 99 67 60 38 06 88 04 17 72 10 99 71 07 42 25 54 05 26 64 91 50 45 71 06 30 67 48 69 82 08 56 80 67 18 46 66 63 01 20 08 80 47 07 91 16 03 79 87 18 54 78 49 80 48 77 40 68 23 60 88 58 80 33 57 11 69 55 53 64 02 94 49 60 92 16 35 81 21 82 96 25 24 96 18 02 05 49 03 50 77 06 32 84 27 18 38 68 01 50 04 03 21 42 94 53 24 89 05 92 26 52 36 68 11 85 01 04 42 02 45 15 06 50 04 53 73 25 74 81 88 98 21 67 84 79 97 99 20 95 04 40 46 02 58 87 94 10 02 78 88 52 21 03 88 60 06 53 49 71 20 91 12 65 07 49 21 22 11 41 58 99 36 16 09 48 17 24 52 36 23 15 72 16 84 56 02 99 43 76 81 71 29 39 49 17 64 39 59 84 86 16 17 66 03 09 43 06 64 18 63 29 68 06 23 07 87 14 26 35 17 12 98 41 53 64 78 18 98 27 28 84 80 67 75 62 10 11 76 90 54 10 05 54 41 39 66 43 83 18 37 32 31 52 29 95 47 08 76 35 11 04 53 35 43 34 10 52 57 12 36 20 39 40 55 78 44 07 31 38 26 08 15 56 88 86 01 52 62 10 24 32 05 60 65 53 28 57 99 03 50 03 52 07 73 49 92 66 80 01 46 08 67 25 36 73 93 07 42 25 53 13 96 76 83 87 90 54 89 78 22 78 91 73 51 69 09 79 94 83 53 09 40 69 62 10 79 49 47 03 81 30 71 54 73 33 51 76 59 54 79 37 56 45 84 17 62 21 98 69 41 95 65 24 39 37 62 03 24 48 54 64 46 82 71 78 33 67 09 16 96 68 52 74 79 68 32 21 13 78 96 60 09 69 20 36 73 26 21 44 46 38 17 83 65 98 07 23 52 46 61 97 33 13 60 31 70 15 36 77 31 58 56 93 75 68 21 36 69 53 90 75 25 82 39 50 65 94 29 30 11 33 11 13 96 02 56 47 07 49 02 76 46 73 30 10 20 60 70 14 56 34 26 37 39 48 24 55 76 84 91 39 86 95 61 50 14 53 93 64 67 37 31 10 84 42 70 48 20 10 72 60 61 84 79 69 65 99 73 89 25 85 48 92 56 97 16 03 14 80 27 22 30 44 27 67 75 79 32 51 54 81 29 65 14 19 04 13 82 04 91 43 40 12 52 29 99 07 76 60 25 01 07 61 71 37 92 40 47 99 66 57 01 43 44 22 40 53 53 09 69 26 81 07 49 80 56 90 93 87 47 13 75 28 87 23 72 79 32 18 27 20 28 10 37 59 21 18 70 04 79 96 03 31 45 71 81 06 14 18 17 05 31 50 92 79 23 47 09 39 47 91 43 54 69 47 42 95 62 46 32 85 37 18 62 85 87 28 64 05 77 51 47 26 30 65 05 70 65 75 59 80 42 52 25 20 44 10 92 17 71 95 52 14 77 13 24 55 11 65 26 91 01 30 63 15 49 48 41 17 67 47 03 68 20 90 98 32 04 40 68 90 51 58 60 06 55 23 68 05 19 76 94 82 36 96 43 38 90 87 28 33 83 05 17 70 83 96 93 06 04 78 47 80 06 23 84 75 23 87 72 99 14 50 98 92 38 90 64 61 58 76 94 36 66 87 80 51 35 61 38 57 95 64 06 53 36 82 51 40 33 47 14 07 98 78 65 39 58 53 06 50 53 04 69 40 68 36 69 75 78 75 60 03 32 39 24 74 47 26 90 13 40 44 71 90 76 51 24 36 50 25 45 70 80 61 80 61 43 90 64 11 18 29 86 56 68 42 79 10 42 44 30 12 96 18 23 18 52 59 02 99 67 46 60 86 43 38 55 17 44 93 42 21 55 14 47 34 55 16 49 24 23 29 96 51 55 10 46 53 27 92 27 46 63 57 30 65 43 27 21 20 24 83 81 72 93 19 69 52 48 01 13 83 92 69 20 48 69 59 20 62 05 42 28 89 90 99 32 72 84 17 08 87 36 03 60 31 36 36 81 26 97 36 48 54 56 56 27 16 91 08 23 11 87 99 33 47 02 14 44 73 70 99 43 35 33 90 56 61 86 56 12 70 59 63 32 01 15 81 47 71 76 95 32 65 80 54 70 34 51 40 45 33 04 64 55 78 68 88 47 31 47 68 87 03 84 23 44 89 72 35 08 31 76 63 26 90 85 96 67 65 91 19 14 17 86 04 71 32 95 37 13 04 22 64 37 37 28 56 62 86 33 07 37 10 44 52 82 52 06 19 52 57 75 90 26 91 24 06 21 14 67 76 30 46 14 35 89 89 41 03 64 56 97 87 63 22 34 03 79 17 45 11 53 25 56 96 61 23 18 63 31 37 37 47 77 23 26 70 72 76 77 04 28 64 71 69 14 85 96 54 95 48 06 62 99 83 86 77 97 75 71 66 30 19 57 90 33 01 60 61 14 12 90 99 32 77 56 41 18 14 87 49 10 14 90 64 18 50 21 74 14 16 88 05 45 73 82 47 74 44 22 97 41 13 34 31 54 61 56 94 03 24 59 27 98 77 04 09 37 40 12 26 87 09 71 70 07 18 64 57 80 21 12 71 83 94 60 39 73 79 73 19 97 32 64 29 41 07 48 84 85 67 12 74 95 20 24 52 41 67 56 61 29 93 35 72 69 72 23 63 66 01 11 07 30 52 56 95 16 65 26 83 90 50 74 60 18 16 48 43 77 37 11 99 98 30 94 91 26 62 73 45 12 87 73 47 27 01 88 66 99 21 41 95 80 02 53 23 32 61 48 32 43 43 83 14 66 95 91 19 81 80 67 25 88 08 62 32 18 92 14 83 71 37 96 11 83 39 99 05 16 23 27 10 67 02 25 44 11 55 31 46 64 41 56 44 74 26 81 51 31 45 85 87 09 81 95 22 28 76 69 46 48 64 87 67 76 27 89 31 11 74 16 62 03 60 94 42 47 09 34 94 93 72 56 18 90 18 42 17 42 32 14 86 06 53 33 95 99 35 29 15 44 20 49 59 25 54 34 59 84 21 23 54 35 90 78 16 93 13 37 88 54 19 86 67 68 55 66 84 65 42 98 37 87 56 33 28 58 38 28 38 66 27 52 21 81 15 08 22 97 32 85 27 91 53 40 28 13 34 91 25 01 63 50 37 22 49 71 58 32 28 30 18 68 94 23 83 63 62 94 76 80 41 90 22 82 52 29 12 18 56 10 08 35 14 37 57 23 65 67 40 72 39 93 39 70 89 40 34 07 46 94 22 20 05 53 64 56 30 05 56 61 88 27 23 95 11 12 37 69 68 24 66 10 87 70 43 50 75 07 62 41 83 58 95 93 89 79 45 39 02 22 05 22 95 43 62 11 68 29 17 40 26 44 25 71 87 16 70 85 19 25 59 94 90 41 41 80 61 70 55 60 84 33 95 76 42 63 15 09 03 40 38 12 03 32 09 84 56 80 61 55 85 97 16 94 82 94 98 57 84 30 84 48 93 90 71 05 95 90 73 17 30 98 40 64 65 89 07 79 09 19 56 36 42 30 23 69 73 72 07 05 27 61 24 31 43 48 71 84 21 28 26 65 65 59 65 74 77 20 10 81 61 84 95 08 52 23 70 47 81 28 09 98 51 67 64 35 51 59 36 92 82 77 65 80 24 72 53 22 07 27 10 21 28 30 22 48 82 80 48 56 20 14 43 18 25 50 95 90 31 77 08 09 48 44 80 90 22 93 45 82 17 13 96 25 26 08 73 34 99 06 49 24 06 83 51 40 14 15 10 25 01 54 25 10 81 30 64 24 74 75 80 36 75 82 60 22 69 72 91 45 67 03 62 79 54 89 74 44 83 64 96 66 73 44 30 74 50 37 05 09 97 70 01 60 46 37 91 39 75 75 18 58 52 72 78 51 81 86 52 08 97 01 46 43 66 98 62 81 18 70 93 73 08 32 46 34 96 80 82 07 59 71 92 53 19 20 88 66 03 26 26 10 24 27 50 82 94 73 63 08 51 33 22 45 19 13 58 33 90 15 22 50 36 13 55 06 35 47 82 52 33 61 36 27 28 46 98 14 73 20 73 32 16 26 80 53 47 66 76 38 94 45 02 01 22 52 47 96 64 58 52 39 88 46 23 39 74 63 81 64 20 90 33 33 76 55 58 26 10 46 42 26 74 74 12 83 32 43 09 02 73 55 86 54 85 34 28 23 29 79 91 62 47 41 82 87 99 22 48 90 20 05 96 75 95 04 43 28 81 39 81 01 28 42 78 25 39 77 90 57 58 98 17 36 73 22 63 74 51 29 39 74 94 95 78 64 24 38 86 63 87 93 06 70 92 22 16 80 64 29 52 20 27 23 50 14 13 87 15 72 96 81 22 08 49 72 30 70 24 79 31 16 64 59 21 89 34 96 91 48 76 43 53 88 01 57 80 23 81 90 79 58 01 80 87 17 99 86 90 72 63 32 69 14 28 88 69 37 17 71 95 56 93 71 35 43 45 04 98 92 94 84 96 11 30 31 27 31 60 92 03 48 05 98 91 86 94 35 90 90 08 48 19 33 28 68 37 59 26 65 96 50 68 22 07 09 49 34 31 77 49 43 06 75 17 81 87 61 79 52 26 27 72 29 50 07 98 86 01 17 10 46 64 24 18 56 51 30 25 94 88 85 79 91 40 33 63 84 49 67 98 92 15 26 75 19 82 05 18 78 65 93 61 48 91 43 59 41 70 51 22 15 92 81 67 91 46 98 11 11 65 31 66 10 98 65 83 21 05 56 05 98 73 67 46 74 69 34 08 30 05 52 07 98 32 95 30 94 65 50 24 63 28 81 99 57 19 23 61 36 09 89 71 98 65 17 30 29 89 26 79 74 94 11 44 48 97 54 81 55 39 66 69 45 28 47 13 86 15 76 74 70 84 32 36 33 79 20 78 14 41 47 89 28 81 05 99 66 81 86 38 26 06 25 13 60 54 55 23 53 27 05 89 25 23 11 13 54 59 54 56 34 16 24 53 44 06 13 40 57 72 21 15 60 08 04 19 11 98 34 45 09 97 86 71 03 15 56 19 15 44 97 31 90 04 87 87 76 08 12 30 24 62 84 28 12 85 82 53 99 52 13 94 06 65 97 86 09 50 94 68 69 74 30 67 87 94 63 07 78 27 80 36 69 41 06 92 32 78 37 82 30 05 18 87 99 72 19 99 44 20 55 77 69 91 27 31 28 81 80 27 02 07 97 23 95 98 12 25 75 29 47 71 07 47 78 39 41 59 27 76 13 15 66 61 68 35 69 86 16 53 67 63 99 85 41 56 08 28 33 40 94 76 90 85 31 70 24 65 84 65 99 82 19 25 54 37 21 46 33 02 52 99 51 33 26 04 87 02 08 18 96 54 42 61 45 91 06 64 79 80 82 32 16 83 63 42 49 19 78 65 97 40 42 14 61 49 34 04 18 25 98 59 30 82 72 26 88 54 36 21 75 03 88 99 53 46 51 55 78 22 94 34 40 68 87 84 25 30 76 25 08 92 84 42 61 40 38 09 99 40 23 29 39 46 55 10 90 35 84 56 70 63 23 91 39 52 92 03 71 89 07 09 37 68 66 58 20 44 92 51 56 13 71 79 99 26 37 02 06 16 67 36 52 58 16 79 73 56 60 59 27 44 77 94 82 20 50 98 33 09 87 94 37 40 83 64 83 58 85 17 76 53 02 83 52 22 27 39 20 48 92 45 21 09 42 24 23 12 37 52 28 50 78 79 20 86 62 73 20 59 54 96 80 15 91 90 99 70 10 09 58 90 93 50 81 99 54 38 36 10 30 11 35 84 16 45 82 18 11 97 36 43 96 79 97 65 40 48 23 19 17 31 64 52 65 65 37 32 65 76 99 79 34 65 79 27 55 33 03 01 33 27 61 28 66 08 04 70 49 46 48 83 01 45 19 96 13 81 14 21 31 79 93 85 50 05 92 92 48 84 59 98 31 53 23 27 15 22 79 95 24 76 05 79 16 93 97 89 38 89 42 83 02 88 94 95 82 21 01 97 48 39 31 78 09 65 50 56 97 61 01 07 65 27 21 23 14 15 80 97 44 78 49 35 33 45 81 74 34 05 31 57 09 38 94 07 69 54 69 32 65 68 46 68 78 90 24 28 49 51 45 86 35 41 63 89 76 87 31 86 09 46 14 87 82 22 29 47 16 13 10 70 72 82 95 48 64 58 43 13 75 42 69 21 12 67 13 64 85 58 23 98 09 37 76 05 22 31 12 66 50 29 99 86 72 45 25 10 28 19 06 90 43 29 31 67 79 46 25 74 14 97 35 76 37 65 46 23 82 06 22 30 76 93 66 94 17 96 13 20 72 63 40 78 08 52 09 90 41 70 28 36 14 46 44 85 96 24 52 58 15 87 37 05 98 99 39 13 61 76 38 44 99 83 74 90 22 53 80 56 98 30 51 63 39 44 30 91 91 04 22 27 73 17 35 53 18 35 45 54 56 27 78 48 13 69 36 44 38 71 25 30 56 15 22 73 43 32 69 59 25 93 83 45 11 34 94 44 39 92 12 36 56 88 13 96 16 12 55 54 11 47 19 78 17 17 68 81 77 51 42 55 99 85 66 27 81 79 93 42 65 61 69 74 14 01 18 56 12 01 58 37 91 22 42 66 83 25 19 04 96 41 25 45 18 69 96 88 36 93 10 12 98 32 44 83 83 04 72 91 04 27 73 07 34 37 71 60 59 31 01 54 54 44 96 93 83 36 04 45 30 18 22 20 42 96 65 79 17 41 55 69 94 81 29 80 91 31 85 25 47 26 43 49 02 99 34 67 99 76 16 14 15 93 08 32 99 44 61 77 67 50 43 55 87 55 53 72 17 46 62 25 50 99 73 05 93 48 17 31 70 80 59 09 44 59 45 13 74 66 58 94 87 73 16 14 85 38 74 99 64 23 79 28 71 42 20 37 82 31 23 51 96 39 65 46 71 56 13 29 68 53 86 45 33 51 49 12 91 21 21 76 85 02 17 98 15 46 12 60 21 88 30 92 83 44 59 42 50 27 88 46 86 94 73 45 54 23 24 14 10 94 21 20 34 23 51 04 83 99 75 90 63 60 16 22 33 83 70 11 32 10 50 29 30 83 46 11 05 31 17 86 42 49 01 44 63 28 60 07 78 95 40 44 61 89 59 04 49 51 27 69 71 46 76 44 04 09 34 56 39 15 06 94 91 75 90 65 27 56 23 74 06 23 33 36 69 14 39 05 34 35 57 33 22 76 46 56 10 61 65 98 09 16 69 04 62 65 18 99 76 49 18 72 66 73 83 82 40 76 31 89 91 27 88 17 35 41 35 32 51 32 67 52 68 74 85 80 57 07 11 62 66 47 22 67 65 37 19 97 26 17 16 24 24 17 50 37 64 82 24 36 32 11 68 34 69 31 32 89 79 93 96 68 49 90 14 23 04 04 67 99 81 74 70 74 36 96 68 09 64 39 88 35 54 89 96 58 66 27 88 97 32 14 06 35 78 20 71 06 85 66 57 02 58 91 72 05 29 56 73 48 86 52 09 93 22 57 79 42 12 01 31 68 17 59 63 76 07 77 73 81 14 13 17 20 11 09 01 83 08 85 91 70 84 63 62 77 37 07 47 01 59 95 39 69 39 21 99 09 87 02 97 16 92 36 74 71 90 66 33 73 73 75 52 91 11 12 26 53 05 26 26 48 61 50 90 65 01 87 42 47 74 35 22 73 24 26 56 70 52 05 48 41 31 18 83 27 21 39 80 85 26 08 44 02 71 07 63 22 05 52 19 08 20 17 25 21 11 72 93 33 49 64 23 53 82 03 13 91 65 85 02 40 05 42 31 77 42 05 36 06 54 04 58 07 76 87 83 25 57 66 12 74 33 85 37 74 32 20 69 03 97 91 68 82 44 19 14 89 28 85 85 80 53 34 87 58 98 88 78 48 65 98 40 11 57 10 67 70 81 60 79 74 72 97 59 79 47 30 20 54 80 89 91 14 05 33 36 79 39 60 85 59 39 60 07 57 76 77 92 06 35 15 72 23 41 45 52 95 18 64 79 86 53 56 31 69 11 91 31 84 50 44 82 22 81 41 40 30 42 30 91 48 94 74 76 64 58 74 25 96 57 14 19 03 99 28 83 15 75 99 01 89 85 79 50 03 95 32 67 44 08 07 41 62 64 29 20 14 76 26 55 48 71 69 66 19 72 44 25 14 01 48 74 12 98 07 64 66 84 24 18 16 27 48 20 14 47 69 30 86 48 40 23 16 61 21 51 50 26 47 35 33 91 28 78 64 43 68 04 79 51 08 19 60 52 95 06 68 46 86 35 97 27 58 04 65 30 58 99 12 12 75 91 39 50 31 42 64 70 04 46 07 98 73 98 93 37 89 77 91 64 71 64 65 66 21 78 62 81 74 42 20 83 70 73 95 78 45 92 27 34 53 71 15 30 11 85 31 34 71 13 48 05 14 44 03 19 67 23 73 19 57 06 90 94 72 57 69 81 62 59 68 88 57 55 69 49 13 07 87 97 80 89 05 71 05 05 26 38 40 16 62 45 99 18 38 98 24 21 26 62 74 69 04 85 57 77 35 58 67 91 79 79 57 86 28 66 34 72 51 76 78 36 95 63 90 08 78 47 63 45 31 22 70 52 48 79 94 15 77 61 67 68 23 33 44 81 80 92 93 75 94 88 23 61 39 76 22 03 28 94 32 06 49 65 41 34 18 23 08 47 62 60 03 63 33 13 80 52 31 54 73 43 70 26 16 69 57 87 83 31 03 93 70 81 47 95 77 44 29 68 39 51 56 59 63 07 25 70 07 77 43 53 64 03 94 42 95 39 18 01 66 21 16 97 20 50 90 16 70 10 95 69 29 06 25 61 41 26 15 59 63 35 ================================================ FILE: project_euler/problem_068/__init__.py ================================================ ================================================ FILE: project_euler/problem_068/sol1.py ================================================ """ Project Euler Problem 68: https://projecteuler.net/problem=68 Magic 5-gon ring Problem Statement: Consider the following "magic" 3-gon ring, filled with the numbers 1 to 6, and each line adding to nine. 4 \ 3 / \ 1 - 2 - 6 / 5 Working clockwise, and starting from the group of three with the numerically lowest external node (4,3,2 in this example), each solution can be described uniquely. For example, the above solution can be described by the set: 4,3,2; 6,2,1; 5,1,3. It is possible to complete the ring with four different totals: 9, 10, 11, and 12. There are eight solutions in total. Total Solution Set 9 4,2,3; 5,3,1; 6,1,2 9 4,3,2; 6,2,1; 5,1,3 10 2,3,5; 4,5,1; 6,1,3 10 2,5,3; 6,3,1; 4,1,5 11 1,4,6; 3,6,2; 5,2,4 11 1,6,4; 5,4,2; 3,2,6 12 1,5,6; 2,6,4; 3,4,5 12 1,6,5; 3,5,4; 2,4,6 By concatenating each group it is possible to form 9-digit strings; the maximum string for a 3-gon ring is 432621513. Using the numbers 1 to 10, and depending on arrangements, it is possible to form 16- and 17-digit strings. What is the maximum 16-digit string for a "magic" 5-gon ring? """ from itertools import permutations def solution(gon_side: int = 5) -> int: """ Find the maximum number for a "magic" gon_side-gon ring The gon_side parameter should be in the range [3, 5], other side numbers aren't tested >>> solution(3) 432621513 >>> solution(4) 426561813732 >>> solution() 6531031914842725 >>> solution(6) Traceback (most recent call last): ValueError: gon_side must be in the range [3, 5] """ if gon_side < 3 or gon_side > 5: raise ValueError("gon_side must be in the range [3, 5]") # Since it's 16, we know 10 is on the outer ring # Put the big numbers at the end so that they are never the first number small_numbers = list(range(gon_side + 1, 0, -1)) big_numbers = list(range(gon_side + 2, gon_side * 2 + 1)) for perm in permutations(small_numbers + big_numbers): numbers = generate_gon_ring(gon_side, list(perm)) if is_magic_gon(numbers): return int("".join(str(n) for n in numbers)) msg = f"Magic {gon_side}-gon ring is impossible" raise ValueError(msg) def generate_gon_ring(gon_side: int, perm: list[int]) -> list[int]: """ Generate a gon_side-gon ring from a permutation state The permutation state is the ring, but every duplicate is removed >>> generate_gon_ring(3, [4, 2, 3, 5, 1, 6]) [4, 2, 3, 5, 3, 1, 6, 1, 2] >>> generate_gon_ring(5, [6, 5, 4, 3, 2, 1, 7, 8, 9, 10]) [6, 5, 4, 3, 4, 2, 1, 2, 7, 8, 7, 9, 10, 9, 5] """ result = [0] * (gon_side * 3) result[0:3] = perm[0:3] perm.append(perm[1]) magic_number = 1 if gon_side < 5 else 2 for i in range(1, len(perm) // 3 + magic_number): result[3 * i] = perm[2 * i + 1] result[3 * i + 1] = result[3 * i - 1] result[3 * i + 2] = perm[2 * i + 2] return result def is_magic_gon(numbers: list[int]) -> bool: """ Check if the solution set is a magic n-gon ring Check that the first number is the smallest number on the outer ring Take a list, and check if the sum of each 3 numbers chunk is equal to the same total >>> is_magic_gon([4, 2, 3, 5, 3, 1, 6, 1, 2]) True >>> is_magic_gon([4, 3, 2, 6, 2, 1, 5, 1, 3]) True >>> is_magic_gon([2, 3, 5, 4, 5, 1, 6, 1, 3]) True >>> is_magic_gon([1, 2, 3, 4, 5, 6, 7, 8, 9]) False >>> is_magic_gon([1]) Traceback (most recent call last): ValueError: a gon ring should have a length that is a multiple of 3 """ if len(numbers) % 3 != 0: raise ValueError("a gon ring should have a length that is a multiple of 3") if min(numbers[::3]) != numbers[0]: return False total = sum(numbers[:3]) return all(sum(numbers[i : i + 3]) == total for i in range(3, len(numbers), 3)) if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_069/__init__.py ================================================ ================================================ FILE: project_euler/problem_069/sol1.py ================================================ """ Totient maximum Problem 69: https://projecteuler.net/problem=69 Euler's Totient function, φ(n) [sometimes called the phi function], is used to determine the number of numbers less than n which are relatively prime to n. For example, as 1, 2, 4, 5, 7, and 8, are all less than nine and relatively prime to nine, φ(9)=6. n Relatively Prime φ(n) n/φ(n) 2 1 1 2 3 1,2 2 1.5 4 1,3 2 2 5 1,2,3,4 4 1.25 6 1,5 2 3 7 1,2,3,4,5,6 6 1.1666... 8 1,3,5,7 4 2 9 1,2,4,5,7,8 6 1.5 10 1,3,7,9 4 2.5 It can be seen that n=6 produces a maximum n/φ(n) for n ≤ 10. Find the value of n ≤ 1,000,000 for which n/φ(n) is a maximum. """ def solution(n: int = 10**6) -> int: """ Returns solution to problem. Algorithm: 1. Precompute φ(k) for all natural k, k <= n using product formula (wikilink below) https://en.wikipedia.org/wiki/Euler%27s_totient_function#Euler's_product_formula 2. Find k/φ(k) for all k ≤ n and return the k that attains maximum >>> solution(10) 6 >>> solution(100) 30 >>> solution(9973) 2310 """ if n <= 0: raise ValueError("Please enter an integer greater than 0") phi = list(range(n + 1)) for number in range(2, n + 1): if phi[number] == number: phi[number] -= 1 for multiple in range(number * 2, n + 1, number): phi[multiple] = (phi[multiple] // number) * (number - 1) answer = 1 for number in range(1, n + 1): if (answer / phi[answer]) < (number / phi[number]): answer = number return answer if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_070/__init__.py ================================================ ================================================ FILE: project_euler/problem_070/sol1.py ================================================ """ Project Euler Problem 70: https://projecteuler.net/problem=70 Euler's Totient function, φ(n) [sometimes called the phi function], is used to determine the number of positive numbers less than or equal to n which are relatively prime to n. For example, as 1, 2, 4, 5, 7, and 8, are all less than nine and relatively prime to nine, φ(9)=6. The number 1 is considered to be relatively prime to every positive number, so φ(1)=1. Interestingly, φ(87109)=79180, and it can be seen that 87109 is a permutation of 79180. Find the value of n, 1 < n < 10^7, for which φ(n) is a permutation of n and the ratio n/φ(n) produces a minimum. ----- This is essentially brute force. Calculate all totients up to 10^7 and find the minimum ratio of n/φ(n) that way. To minimize the ratio, we want to minimize n and maximize φ(n) as much as possible, so we can store the minimum fraction's numerator and denominator and calculate new fractions with each totient to compare against. To avoid dividing by zero, I opt to use cross multiplication. References: Finding totients https://en.wikipedia.org/wiki/Euler's_totient_function#Euler's_product_formula """ from __future__ import annotations import numpy as np def get_totients(max_one: int) -> list[int]: """ Calculates a list of totients from 0 to max_one exclusive, using the definition of Euler's product formula. >>> get_totients(5) [0, 1, 1, 2, 2] >>> get_totients(10) [0, 1, 1, 2, 2, 4, 2, 6, 4, 6] """ totients = np.arange(max_one) for i in range(2, max_one): if totients[i] == i: x = np.arange(i, max_one, i) # array of indexes to select totients[x] -= totients[x] // i return totients.tolist() def has_same_digits(num1: int, num2: int) -> bool: """ Return True if num1 and num2 have the same frequency of every digit, False otherwise. >>> has_same_digits(123456789, 987654321) True >>> has_same_digits(123, 23) False >>> has_same_digits(1234566, 123456) False """ return sorted(str(num1)) == sorted(str(num2)) def solution(max_n: int = 10000000) -> int: """ Finds the value of n from 1 to max such that n/φ(n) produces a minimum. >>> solution(100) 21 >>> solution(10000) 4435 """ min_numerator = 1 # i min_denominator = 0 # φ(i) totients = get_totients(max_n + 1) for i in range(2, max_n + 1): t = totients[i] if i * min_denominator < min_numerator * t and has_same_digits(i, t): min_numerator = i min_denominator = t return min_numerator if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_071/__init__.py ================================================ ================================================ FILE: project_euler/problem_071/sol1.py ================================================ """ Ordered fractions Problem 71 https://projecteuler.net/problem=71 Consider the fraction n/d, where n and d are positive integers. If n int: """ Returns the closest numerator of the fraction immediately to the left of given fraction (numerator/denominator) from a list of reduced proper fractions. >>> solution() 428570 >>> solution(3, 7, 8) 2 >>> solution(6, 7, 60) 47 """ max_numerator = 0 max_denominator = 1 for current_denominator in range(1, limit + 1): current_numerator = current_denominator * numerator // denominator if current_denominator % denominator == 0: current_numerator -= 1 if current_numerator * max_denominator > current_denominator * max_numerator: max_numerator = current_numerator max_denominator = current_denominator return max_numerator if __name__ == "__main__": print(solution(numerator=3, denominator=7, limit=1000000)) ================================================ FILE: project_euler/problem_072/__init__.py ================================================ ================================================ FILE: project_euler/problem_072/sol1.py ================================================ """ Problem 72 Counting fractions: https://projecteuler.net/problem=72 Description: Consider the fraction, n/d, where n and d are positive integers. If n int: """ Returns an integer, the solution to the problem >>> solution(10) 31 >>> solution(100) 3043 >>> solution(1_000) 304191 """ # generating an array from -1 to limit phi = np.arange(-1, limit) for i in range(2, limit + 1): if phi[i] == i - 1: ind = np.arange(2 * i, limit + 1, i) # indexes for selection phi[ind] -= phi[ind] // i return int(np.sum(phi[2 : limit + 1])) if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_072/sol2.py ================================================ """ Project Euler Problem 72: https://projecteuler.net/problem=72 Consider the fraction, n/d, where n and d are positive integers. If n int: """ Return the number of reduced proper fractions with denominator less than limit. >>> solution(8) 21 >>> solution(1000) 304191 """ primes = set(range(3, limit, 2)) primes.add(2) for p in range(3, limit, 2): if p not in primes: continue primes.difference_update(set(range(p * p, limit, p))) phi = [float(n) for n in range(limit + 1)] for p in primes: for n in range(p, limit + 1, p): phi[n] *= 1 - 1 / p return int(sum(phi[2:])) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_073/__init__.py ================================================ ================================================ FILE: project_euler/problem_073/sol1.py ================================================ """ Project Euler Problem 73: https://projecteuler.net/problem=73 Consider the fraction, n/d, where n and d are positive integers. If n int: """ Returns number of fractions lie between 1/3 and 1/2 in the sorted set of reduced proper fractions for d ≤ max_d >>> solution(4) 0 >>> solution(5) 1 >>> solution(8) 3 """ fractions_number = 0 for d in range(max_d + 1): n_start = d // 3 + 1 n_step = 1 if d % 2 == 0: n_start += 1 - n_start % 2 n_step = 2 for n in range(n_start, (d + 1) // 2, n_step): if gcd(n, d) == 1: fractions_number += 1 return fractions_number if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_074/__init__.py ================================================ ================================================ FILE: project_euler/problem_074/sol1.py ================================================ """ Project Euler Problem 74: https://projecteuler.net/problem=74 The number 145 is well known for the property that the sum of the factorial of its digits is equal to 145: 1! + 4! + 5! = 1 + 24 + 120 = 145 Perhaps less well known is 169, in that it produces the longest chain of numbers that link back to 169; it turns out that there are only three such loops that exist: 169 → 363601 → 1454 → 169 871 → 45361 → 871 872 → 45362 → 872 It is not difficult to prove that EVERY starting number will eventually get stuck in a loop. For example, 69 → 363600 → 1454 → 169 → 363601 (→ 1454) 78 → 45360 → 871 → 45361 (→ 871) 540 → 145 (→ 145) Starting with 69 produces a chain of five non-repeating terms, but the longest non-repeating chain with a starting number below one million is sixty terms. How many chains, with a starting number below one million, contain exactly sixty non-repeating terms? """ DIGIT_FACTORIALS = { "0": 1, "1": 1, "2": 2, "3": 6, "4": 24, "5": 120, "6": 720, "7": 5040, "8": 40320, "9": 362880, } CACHE_SUM_DIGIT_FACTORIALS = {145: 145} CHAIN_LENGTH_CACHE = { 145: 0, 169: 3, 36301: 3, 1454: 3, 871: 2, 45361: 2, 872: 2, } def sum_digit_factorials(n: int) -> int: """ Return the sum of the factorial of the digits of n. >>> sum_digit_factorials(145) 145 >>> sum_digit_factorials(45361) 871 >>> sum_digit_factorials(540) 145 """ if n in CACHE_SUM_DIGIT_FACTORIALS: return CACHE_SUM_DIGIT_FACTORIALS[n] ret = sum(DIGIT_FACTORIALS[let] for let in str(n)) CACHE_SUM_DIGIT_FACTORIALS[n] = ret return ret def chain_length(n: int, previous: set | None = None) -> int: """ Calculate the length of the chain of non-repeating terms starting with n. Previous is a set containing the previous member of the chain. >>> chain_length(10101) 11 >>> chain_length(555) 20 >>> chain_length(178924) 39 """ previous = previous or set() if n in CHAIN_LENGTH_CACHE: return CHAIN_LENGTH_CACHE[n] next_number = sum_digit_factorials(n) if next_number in previous: CHAIN_LENGTH_CACHE[n] = 0 return 0 else: previous.add(n) ret = 1 + chain_length(next_number, previous) CHAIN_LENGTH_CACHE[n] = ret return ret def solution(num_terms: int = 60, max_start: int = 1000000) -> int: """ Return the number of chains with a starting number below one million which contain exactly n non-repeating terms. >>> solution(10,1000) 28 """ return sum(1 for i in range(1, max_start) if chain_length(i) == num_terms) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_074/sol2.py ================================================ """ Project Euler Problem 074: https://projecteuler.net/problem=74 The number 145 is well known for the property that the sum of the factorial of its digits is equal to 145: 1! + 4! + 5! = 1 + 24 + 120 = 145 Perhaps less well known is 169, in that it produces the longest chain of numbers that link back to 169; it turns out that there are only three such loops that exist: 169 → 363601 → 1454 → 169 871 → 45361 → 871 872 → 45362 → 872 It is not difficult to prove that EVERY starting number will eventually get stuck in a loop. For example, 69 → 363600 → 1454 → 169 → 363601 (→ 1454) 78 → 45360 → 871 → 45361 (→ 871) 540 → 145 (→ 145) Starting with 69 produces a chain of five non-repeating terms, but the longest non-repeating chain with a starting number below one million is sixty terms. How many chains, with a starting number below one million, contain exactly sixty non-repeating terms? Solution approach: This solution simply consists in a loop that generates the chains of non repeating items using the cached sizes of the previous chains. The generation of the chain stops before a repeating item or if the size of the chain is greater then the desired one. After generating each chain, the length is checked and the counter increases. """ from math import factorial DIGIT_FACTORIAL: dict[str, int] = {str(digit): factorial(digit) for digit in range(10)} def digit_factorial_sum(number: int) -> int: """ Function to perform the sum of the factorial of all the digits in number >>> digit_factorial_sum(69.0) Traceback (most recent call last): ... TypeError: Parameter number must be int >>> digit_factorial_sum(-1) Traceback (most recent call last): ... ValueError: Parameter number must be greater than or equal to 0 >>> digit_factorial_sum(0) 1 >>> digit_factorial_sum(69) 363600 """ if not isinstance(number, int): raise TypeError("Parameter number must be int") if number < 0: raise ValueError("Parameter number must be greater than or equal to 0") # Converts number in string to iterate on its digits and adds its factorial. return sum(DIGIT_FACTORIAL[digit] for digit in str(number)) def solution(chain_length: int = 60, number_limit: int = 1000000) -> int: """ Returns the number of numbers below number_limit that produce chains with exactly chain_length non repeating elements. >>> solution(10.0, 1000) Traceback (most recent call last): ... TypeError: Parameters chain_length and number_limit must be int >>> solution(10, 1000.0) Traceback (most recent call last): ... TypeError: Parameters chain_length and number_limit must be int >>> solution(0, 1000) Traceback (most recent call last): ... ValueError: Parameters chain_length and number_limit must be greater than 0 >>> solution(10, 0) Traceback (most recent call last): ... ValueError: Parameters chain_length and number_limit must be greater than 0 >>> solution(10, 1000) 26 """ if not isinstance(chain_length, int) or not isinstance(number_limit, int): raise TypeError("Parameters chain_length and number_limit must be int") if chain_length <= 0 or number_limit <= 0: raise ValueError( "Parameters chain_length and number_limit must be greater than 0" ) # the counter for the chains with the exact desired length chains_counter = 0 # the cached sizes of the previous chains chain_sets_lengths: dict[int, int] = {} for start_chain_element in range(1, number_limit): # The temporary set will contain the elements of the chain chain_set = set() chain_set_length = 0 # Stop computing the chain when you find a cached size, a repeating item or the # length is greater then the desired one. chain_element = start_chain_element while ( chain_element not in chain_sets_lengths and chain_element not in chain_set and chain_set_length <= chain_length ): chain_set.add(chain_element) chain_set_length += 1 chain_element = digit_factorial_sum(chain_element) if chain_element in chain_sets_lengths: chain_set_length += chain_sets_lengths[chain_element] chain_sets_lengths[start_chain_element] = chain_set_length # If chain contains the exact amount of elements increase the counter if chain_set_length == chain_length: chains_counter += 1 return chains_counter if __name__ == "__main__": import doctest doctest.testmod() print(f"{solution()}") ================================================ FILE: project_euler/problem_075/__init__.py ================================================ ================================================ FILE: project_euler/problem_075/sol1.py ================================================ """ Project Euler Problem 75: https://projecteuler.net/problem=75 It turns out that 12 cm is the smallest length of wire that can be bent to form an integer sided right angle triangle in exactly one way, but there are many more examples. 12 cm: (3,4,5) 24 cm: (6,8,10) 30 cm: (5,12,13) 36 cm: (9,12,15) 40 cm: (8,15,17) 48 cm: (12,16,20) In contrast, some lengths of wire, like 20 cm, cannot be bent to form an integer sided right angle triangle, and other lengths allow more than one solution to be found; for example, using 120 cm it is possible to form exactly three different integer sided right angle triangles. 120 cm: (30,40,50), (20,48,52), (24,45,51) Given that L is the length of the wire, for how many values of L ≤ 1,500,000 can exactly one integer sided right angle triangle be formed? Solution: we generate all pythagorean triples using Euclid's formula and keep track of the frequencies of the perimeters. Reference: https://en.wikipedia.org/wiki/Pythagorean_triple#Generating_a_triple """ from collections import defaultdict from math import gcd def solution(limit: int = 1500000) -> int: """ Return the number of values of L <= limit such that a wire of length L can be formmed into an integer sided right angle triangle in exactly one way. >>> solution(50) 6 >>> solution(1000) 112 >>> solution(50000) 5502 """ frequencies: defaultdict = defaultdict(int) euclid_m = 2 while 2 * euclid_m * (euclid_m + 1) <= limit: for euclid_n in range((euclid_m % 2) + 1, euclid_m, 2): if gcd(euclid_m, euclid_n) > 1: continue primitive_perimeter = 2 * euclid_m * (euclid_m + euclid_n) for perimeter in range(primitive_perimeter, limit + 1, primitive_perimeter): frequencies[perimeter] += 1 euclid_m += 1 return sum(1 for frequency in frequencies.values() if frequency == 1) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_076/__init__.py ================================================ ================================================ FILE: project_euler/problem_076/sol1.py ================================================ """ Counting Summations Problem 76: https://projecteuler.net/problem=76 It is possible to write five as a sum in exactly six different ways: 4 + 1 3 + 2 3 + 1 + 1 2 + 2 + 1 2 + 1 + 1 + 1 1 + 1 + 1 + 1 + 1 How many different ways can one hundred be written as a sum of at least two positive integers? """ def solution(m: int = 100) -> int: """ Returns the number of different ways the number m can be written as a sum of at least two positive integers. >>> solution(100) 190569291 >>> solution(50) 204225 >>> solution(30) 5603 >>> solution(10) 41 >>> solution(5) 6 >>> solution(3) 2 >>> solution(2) 1 >>> solution(1) 0 """ memo = [[0 for _ in range(m)] for _ in range(m + 1)] for i in range(m + 1): memo[i][0] = 1 for n in range(m + 1): for k in range(1, m): memo[n][k] += memo[n][k - 1] if n > k: memo[n][k] += memo[n - k - 1][k] return memo[m][m - 1] - 1 if __name__ == "__main__": print(solution(int(input("Enter a number: ").strip()))) ================================================ FILE: project_euler/problem_077/__init__.py ================================================ ================================================ FILE: project_euler/problem_077/sol1.py ================================================ """ Project Euler Problem 77: https://projecteuler.net/problem=77 It is possible to write ten as the sum of primes in exactly five different ways: 7 + 3 5 + 5 5 + 3 + 2 3 + 3 + 2 + 2 2 + 2 + 2 + 2 + 2 What is the first value which can be written as the sum of primes in over five thousand different ways? """ from __future__ import annotations from functools import lru_cache from math import ceil NUM_PRIMES = 100 primes = set(range(3, NUM_PRIMES, 2)) primes.add(2) prime: int for prime in range(3, ceil(NUM_PRIMES**0.5), 2): if prime not in primes: continue primes.difference_update(set(range(prime * prime, NUM_PRIMES, prime))) @lru_cache(maxsize=100) def partition(number_to_partition: int) -> set[int]: """ Return a set of integers corresponding to unique prime partitions of n. The unique prime partitions can be represented as unique prime decompositions, e.g. (7+3) <-> 7*3 = 12, (3+3+2+2) = 3*3*2*2 = 36 >>> partition(10) {32, 36, 21, 25, 30} >>> partition(15) {192, 160, 105, 44, 112, 243, 180, 150, 216, 26, 125, 126} >>> len(partition(20)) 26 """ if number_to_partition < 0: return set() elif number_to_partition == 0: return {1} ret: set[int] = set() prime: int sub: int for prime in primes: if prime > number_to_partition: continue for sub in partition(number_to_partition - prime): ret.add(sub * prime) return ret def solution(number_unique_partitions: int = 5000) -> int | None: """ Return the smallest integer that can be written as the sum of primes in over m unique ways. >>> solution(4) 10 >>> solution(500) 45 >>> solution(1000) 53 """ for number_to_partition in range(1, NUM_PRIMES): if len(partition(number_to_partition)) > number_unique_partitions: return number_to_partition return None if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_078/__init__.py ================================================ ================================================ FILE: project_euler/problem_078/sol1.py ================================================ """ Problem 78 Url: https://projecteuler.net/problem=78 Statement: Let p(n) represent the number of different ways in which n coins can be separated into piles. For example, five coins can be separated into piles in exactly seven different ways, so p(5)=7. OOOOO OOOO O OOO OO OOO O O OO OO O OO O O O O O O O O Find the least value of n for which p(n) is divisible by one million. """ import itertools def solution(number: int = 1000000) -> int: """ >>> solution(1) 1 >>> solution(9) 14 >>> solution() 55374 """ partitions = [1] for i in itertools.count(len(partitions)): item = 0 for j in itertools.count(1): sign = -1 if j % 2 == 0 else +1 index = (j * j * 3 - j) // 2 if index > i: break item += partitions[i - index] * sign item %= number index += j if index > i: break item += partitions[i - index] * sign item %= number if item == 0: return i partitions.append(item) return 0 if __name__ == "__main__": import doctest doctest.testmod() print(f"{solution() = }") ================================================ FILE: project_euler/problem_079/__init__.py ================================================ ================================================ FILE: project_euler/problem_079/keylog.txt ================================================ 319 680 180 690 129 620 762 689 762 318 368 710 720 710 629 168 160 689 716 731 736 729 316 729 729 710 769 290 719 680 318 389 162 289 162 718 729 319 790 680 890 362 319 760 316 729 380 319 728 716 ================================================ FILE: project_euler/problem_079/keylog_test.txt ================================================ 319 680 180 690 129 620 698 318 328 310 320 610 629 198 190 631 ================================================ FILE: project_euler/problem_079/sol1.py ================================================ """ Project Euler Problem 79: https://projecteuler.net/problem=79 Passcode derivation A common security method used for online banking is to ask the user for three random characters from a passcode. For example, if the passcode was 531278, they may ask for the 2nd, 3rd, and 5th characters; the expected reply would be: 317. The text file, keylog.txt, contains fifty successful login attempts. Given that the three characters are always asked for in order, analyse the file so as to determine the shortest possible secret passcode of unknown length. """ import itertools from pathlib import Path def find_secret_passcode(logins: list[str]) -> int: """ Returns the shortest possible secret passcode of unknown length. >>> find_secret_passcode(["135", "259", "235", "189", "690", "168", "120", ... "136", "289", "589", "160", "165", "580", "369", "250", "280"]) 12365890 >>> find_secret_passcode(["426", "281", "061", "819" "268", "406", "420", ... "428", "209", "689", "019", "421", "469", "261", "681", "201"]) 4206819 """ # Split each login by character e.g. '319' -> ('3', '1', '9') split_logins = [tuple(login) for login in logins] unique_chars = {char for login in split_logins for char in login} for permutation in itertools.permutations(unique_chars): satisfied = True for login in logins: if not ( permutation.index(login[0]) < permutation.index(login[1]) < permutation.index(login[2]) ): satisfied = False break if satisfied: return int("".join(permutation)) raise Exception("Unable to find the secret passcode") def solution(input_file: str = "keylog.txt") -> int: """ Returns the shortest possible secret passcode of unknown length for successful login attempts given by `input_file` text file. >>> solution("keylog_test.txt") 6312980 """ logins = Path(__file__).parent.joinpath(input_file).read_text().splitlines() return find_secret_passcode(logins) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_080/__init__.py ================================================ ================================================ FILE: project_euler/problem_080/sol1.py ================================================ """ Project Euler Problem 80: https://projecteuler.net/problem=80 Author: Sandeep Gupta Problem statement: For the first one hundred natural numbers, find the total of the digital sums of the first one hundred decimal digits for all the irrational square roots. Time: 5 October 2020, 18:30 """ import decimal def solution() -> int: """ To evaluate the sum, Used decimal python module to calculate the decimal places up to 100, the most important thing would be take calculate a few extra places for decimal otherwise there will be rounding error. >>> solution() 40886 """ answer = 0 decimal_context = decimal.Context(prec=105) for i in range(2, 100): number = decimal.Decimal(i) sqrt_number = number.sqrt(decimal_context) if len(str(sqrt_number)) > 1: answer += int(str(sqrt_number)[0]) sqrt_number_str = str(sqrt_number)[2:101] answer += sum(int(x) for x in sqrt_number_str) return answer if __name__ == "__main__": import doctest doctest.testmod() print(f"{solution() = }") ================================================ FILE: project_euler/problem_081/__init__.py ================================================ ================================================ FILE: project_euler/problem_081/matrix.txt ================================================ 4445,2697,5115,718,2209,2212,654,4348,3079,6821,7668,3276,8874,4190,3785,2752,9473,7817,9137,496,7338,3434,7152,4355,4552,7917,7827,2460,2350,691,3514,5880,3145,7633,7199,3783,5066,7487,3285,1084,8985,760,872,8609,8051,1134,9536,5750,9716,9371,7619,5617,275,9721,2997,2698,1887,8825,6372,3014,2113,7122,7050,6775,5948,2758,1219,3539,348,7989,2735,9862,1263,8089,6401,9462,3168,2758,3748,5870 1096,20,1318,7586,5167,2642,1443,5741,7621,7030,5526,4244,2348,4641,9827,2448,6918,5883,3737,300,7116,6531,567,5997,3971,6623,820,6148,3287,1874,7981,8424,7672,7575,6797,6717,1078,5008,4051,8795,5820,346,1851,6463,2117,6058,3407,8211,117,4822,1317,4377,4434,5925,8341,4800,1175,4173,690,8978,7470,1295,3799,8724,3509,9849,618,3320,7068,9633,2384,7175,544,6583,1908,9983,481,4187,9353,9377 9607,7385,521,6084,1364,8983,7623,1585,6935,8551,2574,8267,4781,3834,2764,2084,2669,4656,9343,7709,2203,9328,8004,6192,5856,3555,2260,5118,6504,1839,9227,1259,9451,1388,7909,5733,6968,8519,9973,1663,5315,7571,3035,4325,4283,2304,6438,3815,9213,9806,9536,196,5542,6907,2475,1159,5820,9075,9470,2179,9248,1828,4592,9167,3713,4640,47,3637,309,7344,6955,346,378,9044,8635,7466,5036,9515,6385,9230 7206,3114,7760,1094,6150,5182,7358,7387,4497,955,101,1478,7777,6966,7010,8417,6453,4955,3496,107,449,8271,131,2948,6185,784,5937,8001,6104,8282,4165,3642,710,2390,575,715,3089,6964,4217,192,5949,7006,715,3328,1152,66,8044,4319,1735,146,4818,5456,6451,4113,1063,4781,6799,602,1504,6245,6550,1417,1343,2363,3785,5448,4545,9371,5420,5068,4613,4882,4241,5043,7873,8042,8434,3939,9256,2187 3620,8024,577,9997,7377,7682,1314,1158,6282,6310,1896,2509,5436,1732,9480,706,496,101,6232,7375,2207,2306,110,6772,3433,2878,8140,5933,8688,1399,2210,7332,6172,6403,7333,4044,2291,1790,2446,7390,8698,5723,3678,7104,1825,2040,140,3982,4905,4160,2200,5041,2512,1488,2268,1175,7588,8321,8078,7312,977,5257,8465,5068,3453,3096,1651,7906,253,9250,6021,8791,8109,6651,3412,345,4778,5152,4883,7505 1074,5438,9008,2679,5397,5429,2652,3403,770,9188,4248,2493,4361,8327,9587,707,9525,5913,93,1899,328,2876,3604,673,8576,6908,7659,2544,3359,3883,5273,6587,3065,1749,3223,604,9925,6941,2823,8767,7039,3290,3214,1787,7904,3421,7137,9560,8451,2669,9219,6332,1576,5477,6755,8348,4164,4307,2984,4012,6629,1044,2874,6541,4942,903,1404,9125,5160,8836,4345,2581,460,8438,1538,5507,668,3352,2678,6942 4295,1176,5596,1521,3061,9868,7037,7129,8933,6659,5947,5063,3653,9447,9245,2679,767,714,116,8558,163,3927,8779,158,5093,2447,5782,3967,1716,931,7772,8164,1117,9244,5783,7776,3846,8862,6014,2330,6947,1777,3112,6008,3491,1906,5952,314,4602,8994,5919,9214,3995,5026,7688,6809,5003,3128,2509,7477,110,8971,3982,8539,2980,4689,6343,5411,2992,5270,5247,9260,2269,7474,1042,7162,5206,1232,4556,4757 510,3556,5377,1406,5721,4946,2635,7847,4251,8293,8281,6351,4912,287,2870,3380,3948,5322,3840,4738,9563,1906,6298,3234,8959,1562,6297,8835,7861,239,6618,1322,2553,2213,5053,5446,4402,6500,5182,8585,6900,5756,9661,903,5186,7687,5998,7997,8081,8955,4835,6069,2621,1581,732,9564,1082,1853,5442,1342,520,1737,3703,5321,4793,2776,1508,1647,9101,2499,6891,4336,7012,3329,3212,1442,9993,3988,4930,7706 9444,3401,5891,9716,1228,7107,109,3563,2700,6161,5039,4992,2242,8541,7372,2067,1294,3058,1306,320,8881,5756,9326,411,8650,8824,5495,8282,8397,2000,1228,7817,2099,6473,3571,5994,4447,1299,5991,543,7874,2297,1651,101,2093,3463,9189,6872,6118,872,1008,1779,2805,9084,4048,2123,5877,55,3075,1737,9459,4535,6453,3644,108,5982,4437,5213,1340,6967,9943,5815,669,8074,1838,6979,9132,9315,715,5048 3327,4030,7177,6336,9933,5296,2621,4785,2755,4832,2512,2118,2244,4407,2170,499,7532,9742,5051,7687,970,6924,3527,4694,5145,1306,2165,5940,2425,8910,3513,1909,6983,346,6377,4304,9330,7203,6605,3709,3346,970,369,9737,5811,4427,9939,3693,8436,5566,1977,3728,2399,3985,8303,2492,5366,9802,9193,7296,1033,5060,9144,2766,1151,7629,5169,5995,58,7619,7565,4208,1713,6279,3209,4908,9224,7409,1325,8540 6882,1265,1775,3648,4690,959,5837,4520,5394,1378,9485,1360,4018,578,9174,2932,9890,3696,116,1723,1178,9355,7063,1594,1918,8574,7594,7942,1547,6166,7888,354,6932,4651,1010,7759,6905,661,7689,6092,9292,3845,9605,8443,443,8275,5163,7720,7265,6356,7779,1798,1754,5225,6661,1180,8024,5666,88,9153,1840,3508,1193,4445,2648,3538,6243,6375,8107,5902,5423,2520,1122,5015,6113,8859,9370,966,8673,2442 7338,3423,4723,6533,848,8041,7921,8277,4094,5368,7252,8852,9166,2250,2801,6125,8093,5738,4038,9808,7359,9494,601,9116,4946,2702,5573,2921,9862,1462,1269,2410,4171,2709,7508,6241,7522,615,2407,8200,4189,5492,5649,7353,2590,5203,4274,710,7329,9063,956,8371,3722,4253,4785,1194,4828,4717,4548,940,983,2575,4511,2938,1827,2027,2700,1236,841,5760,1680,6260,2373,3851,1841,4968,1172,5179,7175,3509 4420,1327,3560,2376,6260,2988,9537,4064,4829,8872,9598,3228,1792,7118,9962,9336,4368,9189,6857,1829,9863,6287,7303,7769,2707,8257,2391,2009,3975,4993,3068,9835,3427,341,8412,2134,4034,8511,6421,3041,9012,2983,7289,100,1355,7904,9186,6920,5856,2008,6545,8331,3655,5011,839,8041,9255,6524,3862,8788,62,7455,3513,5003,8413,3918,2076,7960,6108,3638,6999,3436,1441,4858,4181,1866,8731,7745,3744,1000 356,8296,8325,1058,1277,4743,3850,2388,6079,6462,2815,5620,8495,5378,75,4324,3441,9870,1113,165,1544,1179,2834,562,6176,2313,6836,8839,2986,9454,5199,6888,1927,5866,8760,320,1792,8296,7898,6121,7241,5886,5814,2815,8336,1576,4314,3109,2572,6011,2086,9061,9403,3947,5487,9731,7281,3159,1819,1334,3181,5844,5114,9898,4634,2531,4412,6430,4262,8482,4546,4555,6804,2607,9421,686,8649,8860,7794,6672 9870,152,1558,4963,8750,4754,6521,6256,8818,5208,5691,9659,8377,9725,5050,5343,2539,6101,1844,9700,7750,8114,5357,3001,8830,4438,199,9545,8496,43,2078,327,9397,106,6090,8181,8646,6414,7499,5450,4850,6273,5014,4131,7639,3913,6571,8534,9703,4391,7618,445,1320,5,1894,6771,7383,9191,4708,9706,6939,7937,8726,9382,5216,3685,2247,9029,8154,1738,9984,2626,9438,4167,6351,5060,29,1218,1239,4785 192,5213,8297,8974,4032,6966,5717,1179,6523,4679,9513,1481,3041,5355,9303,9154,1389,8702,6589,7818,6336,3539,5538,3094,6646,6702,6266,2759,4608,4452,617,9406,8064,6379,444,5602,4950,1810,8391,1536,316,8714,1178,5182,5863,5110,5372,4954,1978,2971,5680,4863,2255,4630,5723,2168,538,1692,1319,7540,440,6430,6266,7712,7385,5702,620,641,3136,7350,1478,3155,2820,9109,6261,1122,4470,14,8493,2095 1046,4301,6082,474,4974,7822,2102,5161,5172,6946,8074,9716,6586,9962,9749,5015,2217,995,5388,4402,7652,6399,6539,1349,8101,3677,1328,9612,7922,2879,231,5887,2655,508,4357,4964,3554,5930,6236,7384,4614,280,3093,9600,2110,7863,2631,6626,6620,68,1311,7198,7561,1768,5139,1431,221,230,2940,968,5283,6517,2146,1646,869,9402,7068,8645,7058,1765,9690,4152,2926,9504,2939,7504,6074,2944,6470,7859 4659,736,4951,9344,1927,6271,8837,8711,3241,6579,7660,5499,5616,3743,5801,4682,9748,8796,779,1833,4549,8138,4026,775,4170,2432,4174,3741,7540,8017,2833,4027,396,811,2871,1150,9809,2719,9199,8504,1224,540,2051,3519,7982,7367,2761,308,3358,6505,2050,4836,5090,7864,805,2566,2409,6876,3361,8622,5572,5895,3280,441,7893,8105,1634,2929,274,3926,7786,6123,8233,9921,2674,5340,1445,203,4585,3837 5759,338,7444,7968,7742,3755,1591,4839,1705,650,7061,2461,9230,9391,9373,2413,1213,431,7801,4994,2380,2703,6161,6878,8331,2538,6093,1275,5065,5062,2839,582,1014,8109,3525,1544,1569,8622,7944,2905,6120,1564,1839,5570,7579,1318,2677,5257,4418,5601,7935,7656,5192,1864,5886,6083,5580,6202,8869,1636,7907,4759,9082,5854,3185,7631,6854,5872,5632,5280,1431,2077,9717,7431,4256,8261,9680,4487,4752,4286 1571,1428,8599,1230,7772,4221,8523,9049,4042,8726,7567,6736,9033,2104,4879,4967,6334,6716,3994,1269,8995,6539,3610,7667,6560,6065,874,848,4597,1711,7161,4811,6734,5723,6356,6026,9183,2586,5636,1092,7779,7923,8747,6887,7505,9909,1792,3233,4526,3176,1508,8043,720,5212,6046,4988,709,5277,8256,3642,1391,5803,1468,2145,3970,6301,7767,2359,8487,9771,8785,7520,856,1605,8972,2402,2386,991,1383,5963 1822,4824,5957,6511,9868,4113,301,9353,6228,2881,2966,6956,9124,9574,9233,1601,7340,973,9396,540,4747,8590,9535,3650,7333,7583,4806,3593,2738,8157,5215,8472,2284,9473,3906,6982,5505,6053,7936,6074,7179,6688,1564,1103,6860,5839,2022,8490,910,7551,7805,881,7024,1855,9448,4790,1274,3672,2810,774,7623,4223,4850,6071,9975,4935,1915,9771,6690,3846,517,463,7624,4511,614,6394,3661,7409,1395,8127 8738,3850,9555,3695,4383,2378,87,6256,6740,7682,9546,4255,6105,2000,1851,4073,8957,9022,6547,5189,2487,303,9602,7833,1628,4163,6678,3144,8589,7096,8913,5823,4890,7679,1212,9294,5884,2972,3012,3359,7794,7428,1579,4350,7246,4301,7779,7790,3294,9547,4367,3549,1958,8237,6758,3497,3250,3456,6318,1663,708,7714,6143,6890,3428,6853,9334,7992,591,6449,9786,1412,8500,722,5468,1371,108,3939,4199,2535 7047,4323,1934,5163,4166,461,3544,2767,6554,203,6098,2265,9078,2075,4644,6641,8412,9183,487,101,7566,5622,1975,5726,2920,5374,7779,5631,3753,3725,2672,3621,4280,1162,5812,345,8173,9785,1525,955,5603,2215,2580,5261,2765,2990,5979,389,3907,2484,1232,5933,5871,3304,1138,1616,5114,9199,5072,7442,7245,6472,4760,6359,9053,7876,2564,9404,3043,9026,2261,3374,4460,7306,2326,966,828,3274,1712,3446 3975,4565,8131,5800,4570,2306,8838,4392,9147,11,3911,7118,9645,4994,2028,6062,5431,2279,8752,2658,7836,994,7316,5336,7185,3289,1898,9689,2331,5737,3403,1124,2679,3241,7748,16,2724,5441,6640,9368,9081,5618,858,4969,17,2103,6035,8043,7475,2181,939,415,1617,8500,8253,2155,7843,7974,7859,1746,6336,3193,2617,8736,4079,6324,6645,8891,9396,5522,6103,1857,8979,3835,2475,1310,7422,610,8345,7615 9248,5397,5686,2988,3446,4359,6634,9141,497,9176,6773,7448,1907,8454,916,1596,2241,1626,1384,2741,3649,5362,8791,7170,2903,2475,5325,6451,924,3328,522,90,4813,9737,9557,691,2388,1383,4021,1609,9206,4707,5200,7107,8104,4333,9860,5013,1224,6959,8527,1877,4545,7772,6268,621,4915,9349,5970,706,9583,3071,4127,780,8231,3017,9114,3836,7503,2383,1977,4870,8035,2379,9704,1037,3992,3642,1016,4303 5093,138,4639,6609,1146,5565,95,7521,9077,2272,974,4388,2465,2650,722,4998,3567,3047,921,2736,7855,173,2065,4238,1048,5,6847,9548,8632,9194,5942,4777,7910,8971,6279,7253,2516,1555,1833,3184,9453,9053,6897,7808,8629,4877,1871,8055,4881,7639,1537,7701,2508,7564,5845,5023,2304,5396,3193,2955,1088,3801,6203,1748,3737,1276,13,4120,7715,8552,3047,2921,106,7508,304,1280,7140,2567,9135,5266 6237,4607,7527,9047,522,7371,4883,2540,5867,6366,5301,1570,421,276,3361,527,6637,4861,2401,7522,5808,9371,5298,2045,5096,5447,7755,5115,7060,8529,4078,1943,1697,1764,5453,7085,960,2405,739,2100,5800,728,9737,5704,5693,1431,8979,6428,673,7540,6,7773,5857,6823,150,5869,8486,684,5816,9626,7451,5579,8260,3397,5322,6920,1879,2127,2884,5478,4977,9016,6165,6292,3062,5671,5968,78,4619,4763 9905,7127,9390,5185,6923,3721,9164,9705,4341,1031,1046,5127,7376,6528,3248,4941,1178,7889,3364,4486,5358,9402,9158,8600,1025,874,1839,1783,309,9030,1843,845,8398,1433,7118,70,8071,2877,3904,8866,6722,4299,10,1929,5897,4188,600,1889,3325,2485,6473,4474,7444,6992,4846,6166,4441,2283,2629,4352,7775,1101,2214,9985,215,8270,9750,2740,8361,7103,5930,8664,9690,8302,9267,344,2077,1372,1880,9550 5825,8517,7769,2405,8204,1060,3603,7025,478,8334,1997,3692,7433,9101,7294,7498,9415,5452,3850,3508,6857,9213,6807,4412,7310,854,5384,686,4978,892,8651,3241,2743,3801,3813,8588,6701,4416,6990,6490,3197,6838,6503,114,8343,5844,8646,8694,65,791,5979,2687,2621,2019,8097,1423,3644,9764,4921,3266,3662,5561,2476,8271,8138,6147,1168,3340,1998,9874,6572,9873,6659,5609,2711,3931,9567,4143,7833,8887 6223,2099,2700,589,4716,8333,1362,5007,2753,2848,4441,8397,7192,8191,4916,9955,6076,3370,6396,6971,3156,248,3911,2488,4930,2458,7183,5455,170,6809,6417,3390,1956,7188,577,7526,2203,968,8164,479,8699,7915,507,6393,4632,1597,7534,3604,618,3280,6061,9793,9238,8347,568,9645,2070,5198,6482,5000,9212,6655,5961,7513,1323,3872,6170,3812,4146,2736,67,3151,5548,2781,9679,7564,5043,8587,1893,4531 5826,3690,6724,2121,9308,6986,8106,6659,2142,1642,7170,2877,5757,6494,8026,6571,8387,9961,6043,9758,9607,6450,8631,8334,7359,5256,8523,2225,7487,1977,9555,8048,5763,2414,4948,4265,2427,8978,8088,8841,9208,9601,5810,9398,8866,9138,4176,5875,7212,3272,6759,5678,7649,4922,5422,1343,8197,3154,3600,687,1028,4579,2084,9467,4492,7262,7296,6538,7657,7134,2077,1505,7332,6890,8964,4879,7603,7400,5973,739 1861,1613,4879,1884,7334,966,2000,7489,2123,4287,1472,3263,4726,9203,1040,4103,6075,6049,330,9253,4062,4268,1635,9960,577,1320,3195,9628,1030,4092,4979,6474,6393,2799,6967,8687,7724,7392,9927,2085,3200,6466,8702,265,7646,8665,7986,7266,4574,6587,612,2724,704,3191,8323,9523,3002,704,5064,3960,8209,2027,2758,8393,4875,4641,9584,6401,7883,7014,768,443,5490,7506,1852,2005,8850,5776,4487,4269 4052,6687,4705,7260,6645,6715,3706,5504,8672,2853,1136,8187,8203,4016,871,1809,1366,4952,9294,5339,6872,2645,6083,7874,3056,5218,7485,8796,7401,3348,2103,426,8572,4163,9171,3176,948,7654,9344,3217,1650,5580,7971,2622,76,2874,880,2034,9929,1546,2659,5811,3754,7096,7436,9694,9960,7415,2164,953,2360,4194,2397,1047,2196,6827,575,784,2675,8821,6802,7972,5996,6699,2134,7577,2887,1412,4349,4380 4629,2234,6240,8132,7592,3181,6389,1214,266,1910,2451,8784,2790,1127,6932,1447,8986,2492,5476,397,889,3027,7641,5083,5776,4022,185,3364,5701,2442,2840,4160,9525,4828,6602,2614,7447,3711,4505,7745,8034,6514,4907,2605,7753,6958,7270,6936,3006,8968,439,2326,4652,3085,3425,9863,5049,5361,8688,297,7580,8777,7916,6687,8683,7141,306,9569,2384,1500,3346,4601,7329,9040,6097,2727,6314,4501,4974,2829 8316,4072,2025,6884,3027,1808,5714,7624,7880,8528,4205,8686,7587,3230,1139,7273,6163,6986,3914,9309,1464,9359,4474,7095,2212,7302,2583,9462,7532,6567,1606,4436,8981,5612,6796,4385,5076,2007,6072,3678,8331,1338,3299,8845,4783,8613,4071,1232,6028,2176,3990,2148,3748,103,9453,538,6745,9110,926,3125,473,5970,8728,7072,9062,1404,1317,5139,9862,6496,6062,3338,464,1600,2532,1088,8232,7739,8274,3873 2341,523,7096,8397,8301,6541,9844,244,4993,2280,7689,4025,4196,5522,7904,6048,2623,9258,2149,9461,6448,8087,7245,1917,8340,7127,8466,5725,6996,3421,5313,512,9164,9837,9794,8369,4185,1488,7210,1524,1016,4620,9435,2478,7765,8035,697,6677,3724,6988,5853,7662,3895,9593,1185,4727,6025,5734,7665,3070,138,8469,6748,6459,561,7935,8646,2378,462,7755,3115,9690,8877,3946,2728,8793,244,6323,8666,4271 6430,2406,8994,56,1267,3826,9443,7079,7579,5232,6691,3435,6718,5698,4144,7028,592,2627,217,734,6194,8156,9118,58,2640,8069,4127,3285,694,3197,3377,4143,4802,3324,8134,6953,7625,3598,3584,4289,7065,3434,2106,7132,5802,7920,9060,7531,3321,1725,1067,3751,444,5503,6785,7937,6365,4803,198,6266,8177,1470,6390,1606,2904,7555,9834,8667,2033,1723,5167,1666,8546,8152,473,4475,6451,7947,3062,3281 2810,3042,7759,1741,2275,2609,7676,8640,4117,1958,7500,8048,1757,3954,9270,1971,4796,2912,660,5511,3553,1012,5757,4525,6084,7198,8352,5775,7726,8591,7710,9589,3122,4392,6856,5016,749,2285,3356,7482,9956,7348,2599,8944,495,3462,3578,551,4543,7207,7169,7796,1247,4278,6916,8176,3742,8385,2310,1345,8692,2667,4568,1770,8319,3585,4920,3890,4928,7343,5385,9772,7947,8786,2056,9266,3454,2807,877,2660 6206,8252,5928,5837,4177,4333,207,7934,5581,9526,8906,1498,8411,2984,5198,5134,2464,8435,8514,8674,3876,599,5327,826,2152,4084,2433,9327,9697,4800,2728,3608,3849,3861,3498,9943,1407,3991,7191,9110,5666,8434,4704,6545,5944,2357,1163,4995,9619,6754,4200,9682,6654,4862,4744,5953,6632,1054,293,9439,8286,2255,696,8709,1533,1844,6441,430,1999,6063,9431,7018,8057,2920,6266,6799,356,3597,4024,6665 3847,6356,8541,7225,2325,2946,5199,469,5450,7508,2197,9915,8284,7983,6341,3276,3321,16,1321,7608,5015,3362,8491,6968,6818,797,156,2575,706,9516,5344,5457,9210,5051,8099,1617,9951,7663,8253,9683,2670,1261,4710,1068,8753,4799,1228,2621,3275,6188,4699,1791,9518,8701,5932,4275,6011,9877,2933,4182,6059,2930,6687,6682,9771,654,9437,3169,8596,1827,5471,8909,2352,123,4394,3208,8756,5513,6917,2056 5458,8173,3138,3290,4570,4892,3317,4251,9699,7973,1163,1935,5477,6648,9614,5655,9592,975,9118,2194,7322,8248,8413,3462,8560,1907,7810,6650,7355,2939,4973,6894,3933,3784,3200,2419,9234,4747,2208,2207,1945,2899,1407,6145,8023,3484,5688,7686,2737,3828,3704,9004,5190,9740,8643,8650,5358,4426,1522,1707,3613,9887,6956,2447,2762,833,1449,9489,2573,1080,4167,3456,6809,2466,227,7125,2759,6250,6472,8089 3266,7025,9756,3914,1265,9116,7723,9788,6805,5493,2092,8688,6592,9173,4431,4028,6007,7131,4446,4815,3648,6701,759,3312,8355,4485,4187,5188,8746,7759,3528,2177,5243,8379,3838,7233,4607,9187,7216,2190,6967,2920,6082,7910,5354,3609,8958,6949,7731,494,8753,8707,1523,4426,3543,7085,647,6771,9847,646,5049,824,8417,5260,2730,5702,2513,9275,4279,2767,8684,1165,9903,4518,55,9682,8963,6005,2102,6523 1998,8731,936,1479,5259,7064,4085,91,7745,7136,3773,3810,730,8255,2705,2653,9790,6807,2342,355,9344,2668,3690,2028,9679,8102,574,4318,6481,9175,5423,8062,2867,9657,7553,3442,3920,7430,3945,7639,3714,3392,2525,4995,4850,2867,7951,9667,486,9506,9888,781,8866,1702,3795,90,356,1483,4200,2131,6969,5931,486,6880,4404,1084,5169,4910,6567,8335,4686,5043,2614,3352,2667,4513,6472,7471,5720,1616 8878,1613,1716,868,1906,2681,564,665,5995,2474,7496,3432,9491,9087,8850,8287,669,823,347,6194,2264,2592,7871,7616,8508,4827,760,2676,4660,4881,7572,3811,9032,939,4384,929,7525,8419,5556,9063,662,8887,7026,8534,3111,1454,2082,7598,5726,6687,9647,7608,73,3014,5063,670,5461,5631,3367,9796,8475,7908,5073,1565,5008,5295,4457,1274,4788,1728,338,600,8415,8535,9351,7750,6887,5845,1741,125 3637,6489,9634,9464,9055,2413,7824,9517,7532,3577,7050,6186,6980,9365,9782,191,870,2497,8498,2218,2757,5420,6468,586,3320,9230,1034,1393,9886,5072,9391,1178,8464,8042,6869,2075,8275,3601,7715,9470,8786,6475,8373,2159,9237,2066,3264,5000,679,355,3069,4073,494,2308,5512,4334,9438,8786,8637,9774,1169,1949,6594,6072,4270,9158,7916,5752,6794,9391,6301,5842,3285,2141,3898,8027,4310,8821,7079,1307 8497,6681,4732,7151,7060,5204,9030,7157,833,5014,8723,3207,9796,9286,4913,119,5118,7650,9335,809,3675,2597,5144,3945,5090,8384,187,4102,1260,2445,2792,4422,8389,9290,50,1765,1521,6921,8586,4368,1565,5727,7855,2003,4834,9897,5911,8630,5070,1330,7692,7557,7980,6028,5805,9090,8265,3019,3802,698,9149,5748,1965,9658,4417,5994,5584,8226,2937,272,5743,1278,5698,8736,2595,6475,5342,6596,1149,6920 8188,8009,9546,6310,8772,2500,9846,6592,6872,3857,1307,8125,7042,1544,6159,2330,643,4604,7899,6848,371,8067,2062,3200,7295,1857,9505,6936,384,2193,2190,301,8535,5503,1462,7380,5114,4824,8833,1763,4974,8711,9262,6698,3999,2645,6937,7747,1128,2933,3556,7943,2885,3122,9105,5447,418,2899,5148,3699,9021,9501,597,4084,175,1621,1,1079,6067,5812,4326,9914,6633,5394,4233,6728,9084,1864,5863,1225 9935,8793,9117,1825,9542,8246,8437,3331,9128,9675,6086,7075,319,1334,7932,3583,7167,4178,1726,7720,695,8277,7887,6359,5912,1719,2780,8529,1359,2013,4498,8072,1129,9998,1147,8804,9405,6255,1619,2165,7491,1,8882,7378,3337,503,5758,4109,3577,985,3200,7615,8058,5032,1080,6410,6873,5496,1466,2412,9885,5904,4406,3605,8770,4361,6205,9193,1537,9959,214,7260,9566,1685,100,4920,7138,9819,5637,976 3466,9854,985,1078,7222,8888,5466,5379,3578,4540,6853,8690,3728,6351,7147,3134,6921,9692,857,3307,4998,2172,5783,3931,9417,2541,6299,13,787,2099,9131,9494,896,8600,1643,8419,7248,2660,2609,8579,91,6663,5506,7675,1947,6165,4286,1972,9645,3805,1663,1456,8853,5705,9889,7489,1107,383,4044,2969,3343,152,7805,4980,9929,5033,1737,9953,7197,9158,4071,1324,473,9676,3984,9680,3606,8160,7384,5432 1005,4512,5186,3953,2164,3372,4097,3247,8697,3022,9896,4101,3871,6791,3219,2742,4630,6967,7829,5991,6134,1197,1414,8923,8787,1394,8852,5019,7768,5147,8004,8825,5062,9625,7988,1110,3992,7984,9966,6516,6251,8270,421,3723,1432,4830,6935,8095,9059,2214,6483,6846,3120,1587,6201,6691,9096,9627,6671,4002,3495,9939,7708,7465,5879,6959,6634,3241,3401,2355,9061,2611,7830,3941,2177,2146,5089,7079,519,6351 7280,8586,4261,2831,7217,3141,9994,9940,5462,2189,4005,6942,9848,5350,8060,6665,7519,4324,7684,657,9453,9296,2944,6843,7499,7847,1728,9681,3906,6353,5529,2822,3355,3897,7724,4257,7489,8672,4356,3983,1948,6892,7415,4153,5893,4190,621,1736,4045,9532,7701,3671,1211,1622,3176,4524,9317,7800,5638,6644,6943,5463,3531,2821,1347,5958,3436,1438,2999,994,850,4131,2616,1549,3465,5946,690,9273,6954,7991 9517,399,3249,2596,7736,2142,1322,968,7350,1614,468,3346,3265,7222,6086,1661,5317,2582,7959,4685,2807,2917,1037,5698,1529,3972,8716,2634,3301,3412,8621,743,8001,4734,888,7744,8092,3671,8941,1487,5658,7099,2781,99,1932,4443,4756,4652,9328,1581,7855,4312,5976,7255,6480,3996,2748,1973,9731,4530,2790,9417,7186,5303,3557,351,7182,9428,1342,9020,7599,1392,8304,2070,9138,7215,2008,9937,1106,7110 7444,769,9688,632,1571,6820,8743,4338,337,3366,3073,1946,8219,104,4210,6986,249,5061,8693,7960,6546,1004,8857,5997,9352,4338,6105,5008,2556,6518,6694,4345,3727,7956,20,3954,8652,4424,9387,2035,8358,5962,5304,5194,8650,8282,1256,1103,2138,6679,1985,3653,2770,2433,4278,615,2863,1715,242,3790,2636,6998,3088,1671,2239,957,5411,4595,6282,2881,9974,2401,875,7574,2987,4587,3147,6766,9885,2965 3287,3016,3619,6818,9073,6120,5423,557,2900,2015,8111,3873,1314,4189,1846,4399,7041,7583,2427,2864,3525,5002,2069,748,1948,6015,2684,438,770,8367,1663,7887,7759,1885,157,7770,4520,4878,3857,1137,3525,3050,6276,5569,7649,904,4533,7843,2199,5648,7628,9075,9441,3600,7231,2388,5640,9096,958,3058,584,5899,8150,1181,9616,1098,8162,6819,8171,1519,1140,7665,8801,2632,1299,9192,707,9955,2710,7314 1772,2963,7578,3541,3095,1488,7026,2634,6015,4633,4370,2762,1650,2174,909,8158,2922,8467,4198,4280,9092,8856,8835,5457,2790,8574,9742,5054,9547,4156,7940,8126,9824,7340,8840,6574,3547,1477,3014,6798,7134,435,9484,9859,3031,4,1502,4133,1738,1807,4825,463,6343,9701,8506,9822,9555,8688,8168,3467,3234,6318,1787,5591,419,6593,7974,8486,9861,6381,6758,194,3061,4315,2863,4665,3789,2201,1492,4416 126,8927,6608,5682,8986,6867,1715,6076,3159,788,3140,4744,830,9253,5812,5021,7616,8534,1546,9590,1101,9012,9821,8132,7857,4086,1069,7491,2988,1579,2442,4321,2149,7642,6108,250,6086,3167,24,9528,7663,2685,1220,9196,1397,5776,1577,1730,5481,977,6115,199,6326,2183,3767,5928,5586,7561,663,8649,9688,949,5913,9160,1870,5764,9887,4477,6703,1413,4995,5494,7131,2192,8969,7138,3997,8697,646,1028 8074,1731,8245,624,4601,8706,155,8891,309,2552,8208,8452,2954,3124,3469,4246,3352,1105,4509,8677,9901,4416,8191,9283,5625,7120,2952,8881,7693,830,4580,8228,9459,8611,4499,1179,4988,1394,550,2336,6089,6872,269,7213,1848,917,6672,4890,656,1478,6536,3165,4743,4990,1176,6211,7207,5284,9730,4738,1549,4986,4942,8645,3698,9429,1439,2175,6549,3058,6513,1574,6988,8333,3406,5245,5431,7140,7085,6407 7845,4694,2530,8249,290,5948,5509,1588,5940,4495,5866,5021,4626,3979,3296,7589,4854,1998,5627,3926,8346,6512,9608,1918,7070,4747,4182,2858,2766,4606,6269,4107,8982,8568,9053,4244,5604,102,2756,727,5887,2566,7922,44,5986,621,1202,374,6988,4130,3627,6744,9443,4568,1398,8679,397,3928,9159,367,2917,6127,5788,3304,8129,911,2669,1463,9749,264,4478,8940,1109,7309,2462,117,4692,7724,225,2312 4164,3637,2000,941,8903,39,3443,7172,1031,3687,4901,8082,4945,4515,7204,9310,9349,9535,9940,218,1788,9245,2237,1541,5670,6538,6047,5553,9807,8101,1925,8714,445,8332,7309,6830,5786,5736,7306,2710,3034,1838,7969,6318,7912,2584,2080,7437,6705,2254,7428,820,782,9861,7596,3842,3631,8063,5240,6666,394,4565,7865,4895,9890,6028,6117,4724,9156,4473,4552,602,470,6191,4927,5387,884,3146,1978,3000 4258,6880,1696,3582,5793,4923,2119,1155,9056,9698,6603,3768,5514,9927,9609,6166,6566,4536,4985,4934,8076,9062,6741,6163,7399,4562,2337,5600,2919,9012,8459,1308,6072,1225,9306,8818,5886,7243,7365,8792,6007,9256,6699,7171,4230,7002,8720,7839,4533,1671,478,7774,1607,2317,5437,4705,7886,4760,6760,7271,3081,2997,3088,7675,6208,3101,6821,6840,122,9633,4900,2067,8546,4549,2091,7188,5605,8599,6758,5229 7854,5243,9155,3556,8812,7047,2202,1541,5993,4600,4760,713,434,7911,7426,7414,8729,322,803,7960,7563,4908,6285,6291,736,3389,9339,4132,8701,7534,5287,3646,592,3065,7582,2592,8755,6068,8597,1982,5782,1894,2900,6236,4039,6569,3037,5837,7698,700,7815,2491,7272,5878,3083,6778,6639,3589,5010,8313,2581,6617,5869,8402,6808,2951,2321,5195,497,2190,6187,1342,1316,4453,7740,4154,2959,1781,1482,8256 7178,2046,4419,744,8312,5356,6855,8839,319,2962,5662,47,6307,8662,68,4813,567,2712,9931,1678,3101,8227,6533,4933,6656,92,5846,4780,6256,6361,4323,9985,1231,2175,7178,3034,9744,6155,9165,7787,5836,9318,7860,9644,8941,6480,9443,8188,5928,161,6979,2352,5628,6991,1198,8067,5867,6620,3778,8426,2994,3122,3124,6335,3918,8897,2655,9670,634,1088,1576,8935,7255,474,8166,7417,9547,2886,5560,3842 6957,3111,26,7530,7143,1295,1744,6057,3009,1854,8098,5405,2234,4874,9447,2620,9303,27,7410,969,40,2966,5648,7596,8637,4238,3143,3679,7187,690,9980,7085,7714,9373,5632,7526,6707,3951,9734,4216,2146,3602,5371,6029,3039,4433,4855,4151,1449,3376,8009,7240,7027,4602,2947,9081,4045,8424,9352,8742,923,2705,4266,3232,2264,6761,363,2651,3383,7770,6730,7856,7340,9679,2158,610,4471,4608,910,6241 4417,6756,1013,8797,658,8809,5032,8703,7541,846,3357,2920,9817,1745,9980,7593,4667,3087,779,3218,6233,5568,4296,2289,2654,7898,5021,9461,5593,8214,9173,4203,2271,7980,2983,5952,9992,8399,3468,1776,3188,9314,1720,6523,2933,621,8685,5483,8986,6163,3444,9539,4320,155,3992,2828,2150,6071,524,2895,5468,8063,1210,3348,9071,4862,483,9017,4097,6186,9815,3610,5048,1644,1003,9865,9332,2145,1944,2213 9284,3803,4920,1927,6706,4344,7383,4786,9890,2010,5228,1224,3158,6967,8580,8990,8883,5213,76,8306,2031,4980,5639,9519,7184,5645,7769,3259,8077,9130,1317,3096,9624,3818,1770,695,2454,947,6029,3474,9938,3527,5696,4760,7724,7738,2848,6442,5767,6845,8323,4131,2859,7595,2500,4815,3660,9130,8580,7016,8231,4391,8369,3444,4069,4021,556,6154,627,2778,1496,4206,6356,8434,8491,3816,8231,3190,5575,1015 3787,7572,1788,6803,5641,6844,1961,4811,8535,9914,9999,1450,8857,738,4662,8569,6679,2225,7839,8618,286,2648,5342,2294,3205,4546,176,8705,3741,6134,8324,8021,7004,5205,7032,6637,9442,5539,5584,4819,5874,5807,8589,6871,9016,983,1758,3786,1519,6241,185,8398,495,3370,9133,3051,4549,9674,7311,9738,3316,9383,2658,2776,9481,7558,619,3943,3324,6491,4933,153,9738,4623,912,3595,7771,7939,1219,4405 2650,3883,4154,5809,315,7756,4430,1788,4451,1631,6461,7230,6017,5751,138,588,5282,2442,9110,9035,6349,2515,1570,6122,4192,4174,3530,1933,4186,4420,4609,5739,4135,2963,6308,1161,8809,8619,2796,3819,6971,8228,4188,1492,909,8048,2328,6772,8467,7671,9068,2226,7579,6422,7056,8042,3296,2272,3006,2196,7320,3238,3490,3102,37,1293,3212,4767,5041,8773,5794,4456,6174,7279,7054,2835,7053,9088,790,6640 3101,1057,7057,3826,6077,1025,2955,1224,1114,6729,5902,4698,6239,7203,9423,1804,4417,6686,1426,6941,8071,1029,4985,9010,6122,6597,1622,1574,3513,1684,7086,5505,3244,411,9638,4150,907,9135,829,981,1707,5359,8781,9751,5,9131,3973,7159,1340,6955,7514,7993,6964,8198,1933,2797,877,3993,4453,8020,9349,8646,2779,8679,2961,3547,3374,3510,1129,3568,2241,2625,9138,5974,8206,7669,7678,1833,8700,4480 4865,9912,8038,8238,782,3095,8199,1127,4501,7280,2112,2487,3626,2790,9432,1475,6312,8277,4827,2218,5806,7132,8752,1468,7471,6386,739,8762,8323,8120,5169,9078,9058,3370,9560,7987,8585,8531,5347,9312,1058,4271,1159,5286,5404,6925,8606,9204,7361,2415,560,586,4002,2644,1927,2824,768,4409,2942,3345,1002,808,4941,6267,7979,5140,8643,7553,9438,7320,4938,2666,4609,2778,8158,6730,3748,3867,1866,7181 171,3771,7134,8927,4778,2913,3326,2004,3089,7853,1378,1729,4777,2706,9578,1360,5693,3036,1851,7248,2403,2273,8536,6501,9216,613,9671,7131,7719,6425,773,717,8803,160,1114,7554,7197,753,4513,4322,8499,4533,2609,4226,8710,6627,644,9666,6260,4870,5744,7385,6542,6203,7703,6130,8944,5589,2262,6803,6381,7414,6888,5123,7320,9392,9061,6780,322,8975,7050,5089,1061,2260,3199,1150,1865,5386,9699,6501 3744,8454,6885,8277,919,1923,4001,6864,7854,5519,2491,6057,8794,9645,1776,5714,9786,9281,7538,6916,3215,395,2501,9618,4835,8846,9708,2813,3303,1794,8309,7176,2206,1602,1838,236,4593,2245,8993,4017,10,8215,6921,5206,4023,5932,6997,7801,262,7640,3107,8275,4938,7822,2425,3223,3886,2105,8700,9526,2088,8662,8034,7004,5710,2124,7164,3574,6630,9980,4242,2901,9471,1491,2117,4562,1130,9086,4117,6698 2810,2280,2331,1170,4554,4071,8387,1215,2274,9848,6738,1604,7281,8805,439,1298,8318,7834,9426,8603,6092,7944,1309,8828,303,3157,4638,4439,9175,1921,4695,7716,1494,1015,1772,5913,1127,1952,1950,8905,4064,9890,385,9357,7945,5035,7082,5369,4093,6546,5187,5637,2041,8946,1758,7111,6566,1027,1049,5148,7224,7248,296,6169,375,1656,7993,2816,3717,4279,4675,1609,3317,42,6201,3100,3144,163,9530,4531 7096,6070,1009,4988,3538,5801,7149,3063,2324,2912,7911,7002,4338,7880,2481,7368,3516,2016,7556,2193,1388,3865,8125,4637,4096,8114,750,3144,1938,7002,9343,4095,1392,4220,3455,6969,9647,1321,9048,1996,1640,6626,1788,314,9578,6630,2813,6626,4981,9908,7024,4355,3201,3521,3864,3303,464,1923,595,9801,3391,8366,8084,9374,1041,8807,9085,1892,9431,8317,9016,9221,8574,9981,9240,5395,2009,6310,2854,9255 8830,3145,2960,9615,8220,6061,3452,2918,6481,9278,2297,3385,6565,7066,7316,5682,107,7646,4466,68,1952,9603,8615,54,7191,791,6833,2560,693,9733,4168,570,9127,9537,1925,8287,5508,4297,8452,8795,6213,7994,2420,4208,524,5915,8602,8330,2651,8547,6156,1812,6271,7991,9407,9804,1553,6866,1128,2119,4691,9711,8315,5879,9935,6900,482,682,4126,1041,428,6247,3720,5882,7526,2582,4327,7725,3503,2631 2738,9323,721,7434,1453,6294,2957,3786,5722,6019,8685,4386,3066,9057,6860,499,5315,3045,5194,7111,3137,9104,941,586,3066,755,4177,8819,7040,5309,3583,3897,4428,7788,4721,7249,6559,7324,825,7311,3760,6064,6070,9672,4882,584,1365,9739,9331,5783,2624,7889,1604,1303,1555,7125,8312,425,8936,3233,7724,1480,403,7440,1784,1754,4721,1569,652,3893,4574,5692,9730,4813,9844,8291,9199,7101,3391,8914 6044,2928,9332,3328,8588,447,3830,1176,3523,2705,8365,6136,5442,9049,5526,8575,8869,9031,7280,706,2794,8814,5767,4241,7696,78,6570,556,5083,1426,4502,3336,9518,2292,1885,3740,3153,9348,9331,8051,2759,5407,9028,7840,9255,831,515,2612,9747,7435,8964,4971,2048,4900,5967,8271,1719,9670,2810,6777,1594,6367,6259,8316,3815,1689,6840,9437,4361,822,9619,3065,83,6344,7486,8657,8228,9635,6932,4864 8478,4777,6334,4678,7476,4963,6735,3096,5860,1405,5127,7269,7793,4738,227,9168,2996,8928,765,733,1276,7677,6258,1528,9558,3329,302,8901,1422,8277,6340,645,9125,8869,5952,141,8141,1816,9635,4025,4184,3093,83,2344,2747,9352,7966,1206,1126,1826,218,7939,2957,2729,810,8752,5247,4174,4038,8884,7899,9567,301,5265,5752,7524,4381,1669,3106,8270,6228,6373,754,2547,4240,2313,5514,3022,1040,9738 2265,8192,1763,1369,8469,8789,4836,52,1212,6690,5257,8918,6723,6319,378,4039,2421,8555,8184,9577,1432,7139,8078,5452,9628,7579,4161,7490,5159,8559,1011,81,478,5840,1964,1334,6875,8670,9900,739,1514,8692,522,9316,6955,1345,8132,2277,3193,9773,3923,4177,2183,1236,6747,6575,4874,6003,6409,8187,745,8776,9440,7543,9825,2582,7381,8147,7236,5185,7564,6125,218,7991,6394,391,7659,7456,5128,5294 2132,8992,8160,5782,4420,3371,3798,5054,552,5631,7546,4716,1332,6486,7892,7441,4370,6231,4579,2121,8615,1145,9391,1524,1385,2400,9437,2454,7896,7467,2928,8400,3299,4025,7458,4703,7206,6358,792,6200,725,4275,4136,7390,5984,4502,7929,5085,8176,4600,119,3568,76,9363,6943,2248,9077,9731,6213,5817,6729,4190,3092,6910,759,2682,8380,1254,9604,3011,9291,5329,9453,9746,2739,6522,3765,5634,1113,5789 5304,5499,564,2801,679,2653,1783,3608,7359,7797,3284,796,3222,437,7185,6135,8571,2778,7488,5746,678,6140,861,7750,803,9859,9918,2425,3734,2698,9005,4864,9818,6743,2475,132,9486,3825,5472,919,292,4411,7213,7699,6435,9019,6769,1388,802,2124,1345,8493,9487,8558,7061,8777,8833,2427,2238,5409,4957,8503,3171,7622,5779,6145,2417,5873,5563,5693,9574,9491,1937,7384,4563,6842,5432,2751,3406,7981 ================================================ FILE: project_euler/problem_081/sol1.py ================================================ """ Problem 81: https://projecteuler.net/problem=81 In the 5 by 5 matrix below, the minimal path sum from the top left to the bottom right, by only moving to the right and down, is indicated in bold red and is equal to 2427. [131] 673 234 103 18 [201] [96] [342] 965 150 630 803 [746] [422] 111 537 699 497 [121] 956 805 732 524 [37] [331] Find the minimal path sum from the top left to the bottom right by only moving right and down in matrix.txt (https://projecteuler.net/project/resources/p081_matrix.txt), a 31K text file containing an 80 by 80 matrix. """ import os def solution(filename: str = "matrix.txt") -> int: """ Returns the minimal path sum from the top left to the bottom right of the matrix. >>> solution() 427337 """ with open(os.path.join(os.path.dirname(__file__), filename)) as in_file: data = in_file.read() grid = [[int(cell) for cell in row.split(",")] for row in data.strip().splitlines()] dp = [[0 for cell in row] for row in grid] n = len(grid[0]) dp = [[0 for i in range(n)] for j in range(n)] dp[0][0] = grid[0][0] for i in range(1, n): dp[0][i] = grid[0][i] + dp[0][i - 1] for i in range(1, n): dp[i][0] = grid[i][0] + dp[i - 1][0] for i in range(1, n): for j in range(1, n): dp[i][j] = grid[i][j] + min(dp[i - 1][j], dp[i][j - 1]) return dp[-1][-1] if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_082/__init__.py ================================================ ================================================ FILE: project_euler/problem_082/input.txt ================================================ 4445,2697,5115,718,2209,2212,654,4348,3079,6821,7668,3276,8874,4190,3785,2752,9473,7817,9137,496,7338,3434,7152,4355,4552,7917,7827,2460,2350,691,3514,5880,3145,7633,7199,3783,5066,7487,3285,1084,8985,760,872,8609,8051,1134,9536,5750,9716,9371,7619,5617,275,9721,2997,2698,1887,8825,6372,3014,2113,7122,7050,6775,5948,2758,1219,3539,348,7989,2735,9862,1263,8089,6401,9462,3168,2758,3748,5870 1096,20,1318,7586,5167,2642,1443,5741,7621,7030,5526,4244,2348,4641,9827,2448,6918,5883,3737,300,7116,6531,567,5997,3971,6623,820,6148,3287,1874,7981,8424,7672,7575,6797,6717,1078,5008,4051,8795,5820,346,1851,6463,2117,6058,3407,8211,117,4822,1317,4377,4434,5925,8341,4800,1175,4173,690,8978,7470,1295,3799,8724,3509,9849,618,3320,7068,9633,2384,7175,544,6583,1908,9983,481,4187,9353,9377 9607,7385,521,6084,1364,8983,7623,1585,6935,8551,2574,8267,4781,3834,2764,2084,2669,4656,9343,7709,2203,9328,8004,6192,5856,3555,2260,5118,6504,1839,9227,1259,9451,1388,7909,5733,6968,8519,9973,1663,5315,7571,3035,4325,4283,2304,6438,3815,9213,9806,9536,196,5542,6907,2475,1159,5820,9075,9470,2179,9248,1828,4592,9167,3713,4640,47,3637,309,7344,6955,346,378,9044,8635,7466,5036,9515,6385,9230 7206,3114,7760,1094,6150,5182,7358,7387,4497,955,101,1478,7777,6966,7010,8417,6453,4955,3496,107,449,8271,131,2948,6185,784,5937,8001,6104,8282,4165,3642,710,2390,575,715,3089,6964,4217,192,5949,7006,715,3328,1152,66,8044,4319,1735,146,4818,5456,6451,4113,1063,4781,6799,602,1504,6245,6550,1417,1343,2363,3785,5448,4545,9371,5420,5068,4613,4882,4241,5043,7873,8042,8434,3939,9256,2187 3620,8024,577,9997,7377,7682,1314,1158,6282,6310,1896,2509,5436,1732,9480,706,496,101,6232,7375,2207,2306,110,6772,3433,2878,8140,5933,8688,1399,2210,7332,6172,6403,7333,4044,2291,1790,2446,7390,8698,5723,3678,7104,1825,2040,140,3982,4905,4160,2200,5041,2512,1488,2268,1175,7588,8321,8078,7312,977,5257,8465,5068,3453,3096,1651,7906,253,9250,6021,8791,8109,6651,3412,345,4778,5152,4883,7505 1074,5438,9008,2679,5397,5429,2652,3403,770,9188,4248,2493,4361,8327,9587,707,9525,5913,93,1899,328,2876,3604,673,8576,6908,7659,2544,3359,3883,5273,6587,3065,1749,3223,604,9925,6941,2823,8767,7039,3290,3214,1787,7904,3421,7137,9560,8451,2669,9219,6332,1576,5477,6755,8348,4164,4307,2984,4012,6629,1044,2874,6541,4942,903,1404,9125,5160,8836,4345,2581,460,8438,1538,5507,668,3352,2678,6942 4295,1176,5596,1521,3061,9868,7037,7129,8933,6659,5947,5063,3653,9447,9245,2679,767,714,116,8558,163,3927,8779,158,5093,2447,5782,3967,1716,931,7772,8164,1117,9244,5783,7776,3846,8862,6014,2330,6947,1777,3112,6008,3491,1906,5952,314,4602,8994,5919,9214,3995,5026,7688,6809,5003,3128,2509,7477,110,8971,3982,8539,2980,4689,6343,5411,2992,5270,5247,9260,2269,7474,1042,7162,5206,1232,4556,4757 510,3556,5377,1406,5721,4946,2635,7847,4251,8293,8281,6351,4912,287,2870,3380,3948,5322,3840,4738,9563,1906,6298,3234,8959,1562,6297,8835,7861,239,6618,1322,2553,2213,5053,5446,4402,6500,5182,8585,6900,5756,9661,903,5186,7687,5998,7997,8081,8955,4835,6069,2621,1581,732,9564,1082,1853,5442,1342,520,1737,3703,5321,4793,2776,1508,1647,9101,2499,6891,4336,7012,3329,3212,1442,9993,3988,4930,7706 9444,3401,5891,9716,1228,7107,109,3563,2700,6161,5039,4992,2242,8541,7372,2067,1294,3058,1306,320,8881,5756,9326,411,8650,8824,5495,8282,8397,2000,1228,7817,2099,6473,3571,5994,4447,1299,5991,543,7874,2297,1651,101,2093,3463,9189,6872,6118,872,1008,1779,2805,9084,4048,2123,5877,55,3075,1737,9459,4535,6453,3644,108,5982,4437,5213,1340,6967,9943,5815,669,8074,1838,6979,9132,9315,715,5048 3327,4030,7177,6336,9933,5296,2621,4785,2755,4832,2512,2118,2244,4407,2170,499,7532,9742,5051,7687,970,6924,3527,4694,5145,1306,2165,5940,2425,8910,3513,1909,6983,346,6377,4304,9330,7203,6605,3709,3346,970,369,9737,5811,4427,9939,3693,8436,5566,1977,3728,2399,3985,8303,2492,5366,9802,9193,7296,1033,5060,9144,2766,1151,7629,5169,5995,58,7619,7565,4208,1713,6279,3209,4908,9224,7409,1325,8540 6882,1265,1775,3648,4690,959,5837,4520,5394,1378,9485,1360,4018,578,9174,2932,9890,3696,116,1723,1178,9355,7063,1594,1918,8574,7594,7942,1547,6166,7888,354,6932,4651,1010,7759,6905,661,7689,6092,9292,3845,9605,8443,443,8275,5163,7720,7265,6356,7779,1798,1754,5225,6661,1180,8024,5666,88,9153,1840,3508,1193,4445,2648,3538,6243,6375,8107,5902,5423,2520,1122,5015,6113,8859,9370,966,8673,2442 7338,3423,4723,6533,848,8041,7921,8277,4094,5368,7252,8852,9166,2250,2801,6125,8093,5738,4038,9808,7359,9494,601,9116,4946,2702,5573,2921,9862,1462,1269,2410,4171,2709,7508,6241,7522,615,2407,8200,4189,5492,5649,7353,2590,5203,4274,710,7329,9063,956,8371,3722,4253,4785,1194,4828,4717,4548,940,983,2575,4511,2938,1827,2027,2700,1236,841,5760,1680,6260,2373,3851,1841,4968,1172,5179,7175,3509 4420,1327,3560,2376,6260,2988,9537,4064,4829,8872,9598,3228,1792,7118,9962,9336,4368,9189,6857,1829,9863,6287,7303,7769,2707,8257,2391,2009,3975,4993,3068,9835,3427,341,8412,2134,4034,8511,6421,3041,9012,2983,7289,100,1355,7904,9186,6920,5856,2008,6545,8331,3655,5011,839,8041,9255,6524,3862,8788,62,7455,3513,5003,8413,3918,2076,7960,6108,3638,6999,3436,1441,4858,4181,1866,8731,7745,3744,1000 356,8296,8325,1058,1277,4743,3850,2388,6079,6462,2815,5620,8495,5378,75,4324,3441,9870,1113,165,1544,1179,2834,562,6176,2313,6836,8839,2986,9454,5199,6888,1927,5866,8760,320,1792,8296,7898,6121,7241,5886,5814,2815,8336,1576,4314,3109,2572,6011,2086,9061,9403,3947,5487,9731,7281,3159,1819,1334,3181,5844,5114,9898,4634,2531,4412,6430,4262,8482,4546,4555,6804,2607,9421,686,8649,8860,7794,6672 9870,152,1558,4963,8750,4754,6521,6256,8818,5208,5691,9659,8377,9725,5050,5343,2539,6101,1844,9700,7750,8114,5357,3001,8830,4438,199,9545,8496,43,2078,327,9397,106,6090,8181,8646,6414,7499,5450,4850,6273,5014,4131,7639,3913,6571,8534,9703,4391,7618,445,1320,5,1894,6771,7383,9191,4708,9706,6939,7937,8726,9382,5216,3685,2247,9029,8154,1738,9984,2626,9438,4167,6351,5060,29,1218,1239,4785 192,5213,8297,8974,4032,6966,5717,1179,6523,4679,9513,1481,3041,5355,9303,9154,1389,8702,6589,7818,6336,3539,5538,3094,6646,6702,6266,2759,4608,4452,617,9406,8064,6379,444,5602,4950,1810,8391,1536,316,8714,1178,5182,5863,5110,5372,4954,1978,2971,5680,4863,2255,4630,5723,2168,538,1692,1319,7540,440,6430,6266,7712,7385,5702,620,641,3136,7350,1478,3155,2820,9109,6261,1122,4470,14,8493,2095 1046,4301,6082,474,4974,7822,2102,5161,5172,6946,8074,9716,6586,9962,9749,5015,2217,995,5388,4402,7652,6399,6539,1349,8101,3677,1328,9612,7922,2879,231,5887,2655,508,4357,4964,3554,5930,6236,7384,4614,280,3093,9600,2110,7863,2631,6626,6620,68,1311,7198,7561,1768,5139,1431,221,230,2940,968,5283,6517,2146,1646,869,9402,7068,8645,7058,1765,9690,4152,2926,9504,2939,7504,6074,2944,6470,7859 4659,736,4951,9344,1927,6271,8837,8711,3241,6579,7660,5499,5616,3743,5801,4682,9748,8796,779,1833,4549,8138,4026,775,4170,2432,4174,3741,7540,8017,2833,4027,396,811,2871,1150,9809,2719,9199,8504,1224,540,2051,3519,7982,7367,2761,308,3358,6505,2050,4836,5090,7864,805,2566,2409,6876,3361,8622,5572,5895,3280,441,7893,8105,1634,2929,274,3926,7786,6123,8233,9921,2674,5340,1445,203,4585,3837 5759,338,7444,7968,7742,3755,1591,4839,1705,650,7061,2461,9230,9391,9373,2413,1213,431,7801,4994,2380,2703,6161,6878,8331,2538,6093,1275,5065,5062,2839,582,1014,8109,3525,1544,1569,8622,7944,2905,6120,1564,1839,5570,7579,1318,2677,5257,4418,5601,7935,7656,5192,1864,5886,6083,5580,6202,8869,1636,7907,4759,9082,5854,3185,7631,6854,5872,5632,5280,1431,2077,9717,7431,4256,8261,9680,4487,4752,4286 1571,1428,8599,1230,7772,4221,8523,9049,4042,8726,7567,6736,9033,2104,4879,4967,6334,6716,3994,1269,8995,6539,3610,7667,6560,6065,874,848,4597,1711,7161,4811,6734,5723,6356,6026,9183,2586,5636,1092,7779,7923,8747,6887,7505,9909,1792,3233,4526,3176,1508,8043,720,5212,6046,4988,709,5277,8256,3642,1391,5803,1468,2145,3970,6301,7767,2359,8487,9771,8785,7520,856,1605,8972,2402,2386,991,1383,5963 1822,4824,5957,6511,9868,4113,301,9353,6228,2881,2966,6956,9124,9574,9233,1601,7340,973,9396,540,4747,8590,9535,3650,7333,7583,4806,3593,2738,8157,5215,8472,2284,9473,3906,6982,5505,6053,7936,6074,7179,6688,1564,1103,6860,5839,2022,8490,910,7551,7805,881,7024,1855,9448,4790,1274,3672,2810,774,7623,4223,4850,6071,9975,4935,1915,9771,6690,3846,517,463,7624,4511,614,6394,3661,7409,1395,8127 8738,3850,9555,3695,4383,2378,87,6256,6740,7682,9546,4255,6105,2000,1851,4073,8957,9022,6547,5189,2487,303,9602,7833,1628,4163,6678,3144,8589,7096,8913,5823,4890,7679,1212,9294,5884,2972,3012,3359,7794,7428,1579,4350,7246,4301,7779,7790,3294,9547,4367,3549,1958,8237,6758,3497,3250,3456,6318,1663,708,7714,6143,6890,3428,6853,9334,7992,591,6449,9786,1412,8500,722,5468,1371,108,3939,4199,2535 7047,4323,1934,5163,4166,461,3544,2767,6554,203,6098,2265,9078,2075,4644,6641,8412,9183,487,101,7566,5622,1975,5726,2920,5374,7779,5631,3753,3725,2672,3621,4280,1162,5812,345,8173,9785,1525,955,5603,2215,2580,5261,2765,2990,5979,389,3907,2484,1232,5933,5871,3304,1138,1616,5114,9199,5072,7442,7245,6472,4760,6359,9053,7876,2564,9404,3043,9026,2261,3374,4460,7306,2326,966,828,3274,1712,3446 3975,4565,8131,5800,4570,2306,8838,4392,9147,11,3911,7118,9645,4994,2028,6062,5431,2279,8752,2658,7836,994,7316,5336,7185,3289,1898,9689,2331,5737,3403,1124,2679,3241,7748,16,2724,5441,6640,9368,9081,5618,858,4969,17,2103,6035,8043,7475,2181,939,415,1617,8500,8253,2155,7843,7974,7859,1746,6336,3193,2617,8736,4079,6324,6645,8891,9396,5522,6103,1857,8979,3835,2475,1310,7422,610,8345,7615 9248,5397,5686,2988,3446,4359,6634,9141,497,9176,6773,7448,1907,8454,916,1596,2241,1626,1384,2741,3649,5362,8791,7170,2903,2475,5325,6451,924,3328,522,90,4813,9737,9557,691,2388,1383,4021,1609,9206,4707,5200,7107,8104,4333,9860,5013,1224,6959,8527,1877,4545,7772,6268,621,4915,9349,5970,706,9583,3071,4127,780,8231,3017,9114,3836,7503,2383,1977,4870,8035,2379,9704,1037,3992,3642,1016,4303 5093,138,4639,6609,1146,5565,95,7521,9077,2272,974,4388,2465,2650,722,4998,3567,3047,921,2736,7855,173,2065,4238,1048,5,6847,9548,8632,9194,5942,4777,7910,8971,6279,7253,2516,1555,1833,3184,9453,9053,6897,7808,8629,4877,1871,8055,4881,7639,1537,7701,2508,7564,5845,5023,2304,5396,3193,2955,1088,3801,6203,1748,3737,1276,13,4120,7715,8552,3047,2921,106,7508,304,1280,7140,2567,9135,5266 6237,4607,7527,9047,522,7371,4883,2540,5867,6366,5301,1570,421,276,3361,527,6637,4861,2401,7522,5808,9371,5298,2045,5096,5447,7755,5115,7060,8529,4078,1943,1697,1764,5453,7085,960,2405,739,2100,5800,728,9737,5704,5693,1431,8979,6428,673,7540,6,7773,5857,6823,150,5869,8486,684,5816,9626,7451,5579,8260,3397,5322,6920,1879,2127,2884,5478,4977,9016,6165,6292,3062,5671,5968,78,4619,4763 9905,7127,9390,5185,6923,3721,9164,9705,4341,1031,1046,5127,7376,6528,3248,4941,1178,7889,3364,4486,5358,9402,9158,8600,1025,874,1839,1783,309,9030,1843,845,8398,1433,7118,70,8071,2877,3904,8866,6722,4299,10,1929,5897,4188,600,1889,3325,2485,6473,4474,7444,6992,4846,6166,4441,2283,2629,4352,7775,1101,2214,9985,215,8270,9750,2740,8361,7103,5930,8664,9690,8302,9267,344,2077,1372,1880,9550 5825,8517,7769,2405,8204,1060,3603,7025,478,8334,1997,3692,7433,9101,7294,7498,9415,5452,3850,3508,6857,9213,6807,4412,7310,854,5384,686,4978,892,8651,3241,2743,3801,3813,8588,6701,4416,6990,6490,3197,6838,6503,114,8343,5844,8646,8694,65,791,5979,2687,2621,2019,8097,1423,3644,9764,4921,3266,3662,5561,2476,8271,8138,6147,1168,3340,1998,9874,6572,9873,6659,5609,2711,3931,9567,4143,7833,8887 6223,2099,2700,589,4716,8333,1362,5007,2753,2848,4441,8397,7192,8191,4916,9955,6076,3370,6396,6971,3156,248,3911,2488,4930,2458,7183,5455,170,6809,6417,3390,1956,7188,577,7526,2203,968,8164,479,8699,7915,507,6393,4632,1597,7534,3604,618,3280,6061,9793,9238,8347,568,9645,2070,5198,6482,5000,9212,6655,5961,7513,1323,3872,6170,3812,4146,2736,67,3151,5548,2781,9679,7564,5043,8587,1893,4531 5826,3690,6724,2121,9308,6986,8106,6659,2142,1642,7170,2877,5757,6494,8026,6571,8387,9961,6043,9758,9607,6450,8631,8334,7359,5256,8523,2225,7487,1977,9555,8048,5763,2414,4948,4265,2427,8978,8088,8841,9208,9601,5810,9398,8866,9138,4176,5875,7212,3272,6759,5678,7649,4922,5422,1343,8197,3154,3600,687,1028,4579,2084,9467,4492,7262,7296,6538,7657,7134,2077,1505,7332,6890,8964,4879,7603,7400,5973,739 1861,1613,4879,1884,7334,966,2000,7489,2123,4287,1472,3263,4726,9203,1040,4103,6075,6049,330,9253,4062,4268,1635,9960,577,1320,3195,9628,1030,4092,4979,6474,6393,2799,6967,8687,7724,7392,9927,2085,3200,6466,8702,265,7646,8665,7986,7266,4574,6587,612,2724,704,3191,8323,9523,3002,704,5064,3960,8209,2027,2758,8393,4875,4641,9584,6401,7883,7014,768,443,5490,7506,1852,2005,8850,5776,4487,4269 4052,6687,4705,7260,6645,6715,3706,5504,8672,2853,1136,8187,8203,4016,871,1809,1366,4952,9294,5339,6872,2645,6083,7874,3056,5218,7485,8796,7401,3348,2103,426,8572,4163,9171,3176,948,7654,9344,3217,1650,5580,7971,2622,76,2874,880,2034,9929,1546,2659,5811,3754,7096,7436,9694,9960,7415,2164,953,2360,4194,2397,1047,2196,6827,575,784,2675,8821,6802,7972,5996,6699,2134,7577,2887,1412,4349,4380 4629,2234,6240,8132,7592,3181,6389,1214,266,1910,2451,8784,2790,1127,6932,1447,8986,2492,5476,397,889,3027,7641,5083,5776,4022,185,3364,5701,2442,2840,4160,9525,4828,6602,2614,7447,3711,4505,7745,8034,6514,4907,2605,7753,6958,7270,6936,3006,8968,439,2326,4652,3085,3425,9863,5049,5361,8688,297,7580,8777,7916,6687,8683,7141,306,9569,2384,1500,3346,4601,7329,9040,6097,2727,6314,4501,4974,2829 8316,4072,2025,6884,3027,1808,5714,7624,7880,8528,4205,8686,7587,3230,1139,7273,6163,6986,3914,9309,1464,9359,4474,7095,2212,7302,2583,9462,7532,6567,1606,4436,8981,5612,6796,4385,5076,2007,6072,3678,8331,1338,3299,8845,4783,8613,4071,1232,6028,2176,3990,2148,3748,103,9453,538,6745,9110,926,3125,473,5970,8728,7072,9062,1404,1317,5139,9862,6496,6062,3338,464,1600,2532,1088,8232,7739,8274,3873 2341,523,7096,8397,8301,6541,9844,244,4993,2280,7689,4025,4196,5522,7904,6048,2623,9258,2149,9461,6448,8087,7245,1917,8340,7127,8466,5725,6996,3421,5313,512,9164,9837,9794,8369,4185,1488,7210,1524,1016,4620,9435,2478,7765,8035,697,6677,3724,6988,5853,7662,3895,9593,1185,4727,6025,5734,7665,3070,138,8469,6748,6459,561,7935,8646,2378,462,7755,3115,9690,8877,3946,2728,8793,244,6323,8666,4271 6430,2406,8994,56,1267,3826,9443,7079,7579,5232,6691,3435,6718,5698,4144,7028,592,2627,217,734,6194,8156,9118,58,2640,8069,4127,3285,694,3197,3377,4143,4802,3324,8134,6953,7625,3598,3584,4289,7065,3434,2106,7132,5802,7920,9060,7531,3321,1725,1067,3751,444,5503,6785,7937,6365,4803,198,6266,8177,1470,6390,1606,2904,7555,9834,8667,2033,1723,5167,1666,8546,8152,473,4475,6451,7947,3062,3281 2810,3042,7759,1741,2275,2609,7676,8640,4117,1958,7500,8048,1757,3954,9270,1971,4796,2912,660,5511,3553,1012,5757,4525,6084,7198,8352,5775,7726,8591,7710,9589,3122,4392,6856,5016,749,2285,3356,7482,9956,7348,2599,8944,495,3462,3578,551,4543,7207,7169,7796,1247,4278,6916,8176,3742,8385,2310,1345,8692,2667,4568,1770,8319,3585,4920,3890,4928,7343,5385,9772,7947,8786,2056,9266,3454,2807,877,2660 6206,8252,5928,5837,4177,4333,207,7934,5581,9526,8906,1498,8411,2984,5198,5134,2464,8435,8514,8674,3876,599,5327,826,2152,4084,2433,9327,9697,4800,2728,3608,3849,3861,3498,9943,1407,3991,7191,9110,5666,8434,4704,6545,5944,2357,1163,4995,9619,6754,4200,9682,6654,4862,4744,5953,6632,1054,293,9439,8286,2255,696,8709,1533,1844,6441,430,1999,6063,9431,7018,8057,2920,6266,6799,356,3597,4024,6665 3847,6356,8541,7225,2325,2946,5199,469,5450,7508,2197,9915,8284,7983,6341,3276,3321,16,1321,7608,5015,3362,8491,6968,6818,797,156,2575,706,9516,5344,5457,9210,5051,8099,1617,9951,7663,8253,9683,2670,1261,4710,1068,8753,4799,1228,2621,3275,6188,4699,1791,9518,8701,5932,4275,6011,9877,2933,4182,6059,2930,6687,6682,9771,654,9437,3169,8596,1827,5471,8909,2352,123,4394,3208,8756,5513,6917,2056 5458,8173,3138,3290,4570,4892,3317,4251,9699,7973,1163,1935,5477,6648,9614,5655,9592,975,9118,2194,7322,8248,8413,3462,8560,1907,7810,6650,7355,2939,4973,6894,3933,3784,3200,2419,9234,4747,2208,2207,1945,2899,1407,6145,8023,3484,5688,7686,2737,3828,3704,9004,5190,9740,8643,8650,5358,4426,1522,1707,3613,9887,6956,2447,2762,833,1449,9489,2573,1080,4167,3456,6809,2466,227,7125,2759,6250,6472,8089 3266,7025,9756,3914,1265,9116,7723,9788,6805,5493,2092,8688,6592,9173,4431,4028,6007,7131,4446,4815,3648,6701,759,3312,8355,4485,4187,5188,8746,7759,3528,2177,5243,8379,3838,7233,4607,9187,7216,2190,6967,2920,6082,7910,5354,3609,8958,6949,7731,494,8753,8707,1523,4426,3543,7085,647,6771,9847,646,5049,824,8417,5260,2730,5702,2513,9275,4279,2767,8684,1165,9903,4518,55,9682,8963,6005,2102,6523 1998,8731,936,1479,5259,7064,4085,91,7745,7136,3773,3810,730,8255,2705,2653,9790,6807,2342,355,9344,2668,3690,2028,9679,8102,574,4318,6481,9175,5423,8062,2867,9657,7553,3442,3920,7430,3945,7639,3714,3392,2525,4995,4850,2867,7951,9667,486,9506,9888,781,8866,1702,3795,90,356,1483,4200,2131,6969,5931,486,6880,4404,1084,5169,4910,6567,8335,4686,5043,2614,3352,2667,4513,6472,7471,5720,1616 8878,1613,1716,868,1906,2681,564,665,5995,2474,7496,3432,9491,9087,8850,8287,669,823,347,6194,2264,2592,7871,7616,8508,4827,760,2676,4660,4881,7572,3811,9032,939,4384,929,7525,8419,5556,9063,662,8887,7026,8534,3111,1454,2082,7598,5726,6687,9647,7608,73,3014,5063,670,5461,5631,3367,9796,8475,7908,5073,1565,5008,5295,4457,1274,4788,1728,338,600,8415,8535,9351,7750,6887,5845,1741,125 3637,6489,9634,9464,9055,2413,7824,9517,7532,3577,7050,6186,6980,9365,9782,191,870,2497,8498,2218,2757,5420,6468,586,3320,9230,1034,1393,9886,5072,9391,1178,8464,8042,6869,2075,8275,3601,7715,9470,8786,6475,8373,2159,9237,2066,3264,5000,679,355,3069,4073,494,2308,5512,4334,9438,8786,8637,9774,1169,1949,6594,6072,4270,9158,7916,5752,6794,9391,6301,5842,3285,2141,3898,8027,4310,8821,7079,1307 8497,6681,4732,7151,7060,5204,9030,7157,833,5014,8723,3207,9796,9286,4913,119,5118,7650,9335,809,3675,2597,5144,3945,5090,8384,187,4102,1260,2445,2792,4422,8389,9290,50,1765,1521,6921,8586,4368,1565,5727,7855,2003,4834,9897,5911,8630,5070,1330,7692,7557,7980,6028,5805,9090,8265,3019,3802,698,9149,5748,1965,9658,4417,5994,5584,8226,2937,272,5743,1278,5698,8736,2595,6475,5342,6596,1149,6920 8188,8009,9546,6310,8772,2500,9846,6592,6872,3857,1307,8125,7042,1544,6159,2330,643,4604,7899,6848,371,8067,2062,3200,7295,1857,9505,6936,384,2193,2190,301,8535,5503,1462,7380,5114,4824,8833,1763,4974,8711,9262,6698,3999,2645,6937,7747,1128,2933,3556,7943,2885,3122,9105,5447,418,2899,5148,3699,9021,9501,597,4084,175,1621,1,1079,6067,5812,4326,9914,6633,5394,4233,6728,9084,1864,5863,1225 9935,8793,9117,1825,9542,8246,8437,3331,9128,9675,6086,7075,319,1334,7932,3583,7167,4178,1726,7720,695,8277,7887,6359,5912,1719,2780,8529,1359,2013,4498,8072,1129,9998,1147,8804,9405,6255,1619,2165,7491,1,8882,7378,3337,503,5758,4109,3577,985,3200,7615,8058,5032,1080,6410,6873,5496,1466,2412,9885,5904,4406,3605,8770,4361,6205,9193,1537,9959,214,7260,9566,1685,100,4920,7138,9819,5637,976 3466,9854,985,1078,7222,8888,5466,5379,3578,4540,6853,8690,3728,6351,7147,3134,6921,9692,857,3307,4998,2172,5783,3931,9417,2541,6299,13,787,2099,9131,9494,896,8600,1643,8419,7248,2660,2609,8579,91,6663,5506,7675,1947,6165,4286,1972,9645,3805,1663,1456,8853,5705,9889,7489,1107,383,4044,2969,3343,152,7805,4980,9929,5033,1737,9953,7197,9158,4071,1324,473,9676,3984,9680,3606,8160,7384,5432 1005,4512,5186,3953,2164,3372,4097,3247,8697,3022,9896,4101,3871,6791,3219,2742,4630,6967,7829,5991,6134,1197,1414,8923,8787,1394,8852,5019,7768,5147,8004,8825,5062,9625,7988,1110,3992,7984,9966,6516,6251,8270,421,3723,1432,4830,6935,8095,9059,2214,6483,6846,3120,1587,6201,6691,9096,9627,6671,4002,3495,9939,7708,7465,5879,6959,6634,3241,3401,2355,9061,2611,7830,3941,2177,2146,5089,7079,519,6351 7280,8586,4261,2831,7217,3141,9994,9940,5462,2189,4005,6942,9848,5350,8060,6665,7519,4324,7684,657,9453,9296,2944,6843,7499,7847,1728,9681,3906,6353,5529,2822,3355,3897,7724,4257,7489,8672,4356,3983,1948,6892,7415,4153,5893,4190,621,1736,4045,9532,7701,3671,1211,1622,3176,4524,9317,7800,5638,6644,6943,5463,3531,2821,1347,5958,3436,1438,2999,994,850,4131,2616,1549,3465,5946,690,9273,6954,7991 9517,399,3249,2596,7736,2142,1322,968,7350,1614,468,3346,3265,7222,6086,1661,5317,2582,7959,4685,2807,2917,1037,5698,1529,3972,8716,2634,3301,3412,8621,743,8001,4734,888,7744,8092,3671,8941,1487,5658,7099,2781,99,1932,4443,4756,4652,9328,1581,7855,4312,5976,7255,6480,3996,2748,1973,9731,4530,2790,9417,7186,5303,3557,351,7182,9428,1342,9020,7599,1392,8304,2070,9138,7215,2008,9937,1106,7110 7444,769,9688,632,1571,6820,8743,4338,337,3366,3073,1946,8219,104,4210,6986,249,5061,8693,7960,6546,1004,8857,5997,9352,4338,6105,5008,2556,6518,6694,4345,3727,7956,20,3954,8652,4424,9387,2035,8358,5962,5304,5194,8650,8282,1256,1103,2138,6679,1985,3653,2770,2433,4278,615,2863,1715,242,3790,2636,6998,3088,1671,2239,957,5411,4595,6282,2881,9974,2401,875,7574,2987,4587,3147,6766,9885,2965 3287,3016,3619,6818,9073,6120,5423,557,2900,2015,8111,3873,1314,4189,1846,4399,7041,7583,2427,2864,3525,5002,2069,748,1948,6015,2684,438,770,8367,1663,7887,7759,1885,157,7770,4520,4878,3857,1137,3525,3050,6276,5569,7649,904,4533,7843,2199,5648,7628,9075,9441,3600,7231,2388,5640,9096,958,3058,584,5899,8150,1181,9616,1098,8162,6819,8171,1519,1140,7665,8801,2632,1299,9192,707,9955,2710,7314 1772,2963,7578,3541,3095,1488,7026,2634,6015,4633,4370,2762,1650,2174,909,8158,2922,8467,4198,4280,9092,8856,8835,5457,2790,8574,9742,5054,9547,4156,7940,8126,9824,7340,8840,6574,3547,1477,3014,6798,7134,435,9484,9859,3031,4,1502,4133,1738,1807,4825,463,6343,9701,8506,9822,9555,8688,8168,3467,3234,6318,1787,5591,419,6593,7974,8486,9861,6381,6758,194,3061,4315,2863,4665,3789,2201,1492,4416 126,8927,6608,5682,8986,6867,1715,6076,3159,788,3140,4744,830,9253,5812,5021,7616,8534,1546,9590,1101,9012,9821,8132,7857,4086,1069,7491,2988,1579,2442,4321,2149,7642,6108,250,6086,3167,24,9528,7663,2685,1220,9196,1397,5776,1577,1730,5481,977,6115,199,6326,2183,3767,5928,5586,7561,663,8649,9688,949,5913,9160,1870,5764,9887,4477,6703,1413,4995,5494,7131,2192,8969,7138,3997,8697,646,1028 8074,1731,8245,624,4601,8706,155,8891,309,2552,8208,8452,2954,3124,3469,4246,3352,1105,4509,8677,9901,4416,8191,9283,5625,7120,2952,8881,7693,830,4580,8228,9459,8611,4499,1179,4988,1394,550,2336,6089,6872,269,7213,1848,917,6672,4890,656,1478,6536,3165,4743,4990,1176,6211,7207,5284,9730,4738,1549,4986,4942,8645,3698,9429,1439,2175,6549,3058,6513,1574,6988,8333,3406,5245,5431,7140,7085,6407 7845,4694,2530,8249,290,5948,5509,1588,5940,4495,5866,5021,4626,3979,3296,7589,4854,1998,5627,3926,8346,6512,9608,1918,7070,4747,4182,2858,2766,4606,6269,4107,8982,8568,9053,4244,5604,102,2756,727,5887,2566,7922,44,5986,621,1202,374,6988,4130,3627,6744,9443,4568,1398,8679,397,3928,9159,367,2917,6127,5788,3304,8129,911,2669,1463,9749,264,4478,8940,1109,7309,2462,117,4692,7724,225,2312 4164,3637,2000,941,8903,39,3443,7172,1031,3687,4901,8082,4945,4515,7204,9310,9349,9535,9940,218,1788,9245,2237,1541,5670,6538,6047,5553,9807,8101,1925,8714,445,8332,7309,6830,5786,5736,7306,2710,3034,1838,7969,6318,7912,2584,2080,7437,6705,2254,7428,820,782,9861,7596,3842,3631,8063,5240,6666,394,4565,7865,4895,9890,6028,6117,4724,9156,4473,4552,602,470,6191,4927,5387,884,3146,1978,3000 4258,6880,1696,3582,5793,4923,2119,1155,9056,9698,6603,3768,5514,9927,9609,6166,6566,4536,4985,4934,8076,9062,6741,6163,7399,4562,2337,5600,2919,9012,8459,1308,6072,1225,9306,8818,5886,7243,7365,8792,6007,9256,6699,7171,4230,7002,8720,7839,4533,1671,478,7774,1607,2317,5437,4705,7886,4760,6760,7271,3081,2997,3088,7675,6208,3101,6821,6840,122,9633,4900,2067,8546,4549,2091,7188,5605,8599,6758,5229 7854,5243,9155,3556,8812,7047,2202,1541,5993,4600,4760,713,434,7911,7426,7414,8729,322,803,7960,7563,4908,6285,6291,736,3389,9339,4132,8701,7534,5287,3646,592,3065,7582,2592,8755,6068,8597,1982,5782,1894,2900,6236,4039,6569,3037,5837,7698,700,7815,2491,7272,5878,3083,6778,6639,3589,5010,8313,2581,6617,5869,8402,6808,2951,2321,5195,497,2190,6187,1342,1316,4453,7740,4154,2959,1781,1482,8256 7178,2046,4419,744,8312,5356,6855,8839,319,2962,5662,47,6307,8662,68,4813,567,2712,9931,1678,3101,8227,6533,4933,6656,92,5846,4780,6256,6361,4323,9985,1231,2175,7178,3034,9744,6155,9165,7787,5836,9318,7860,9644,8941,6480,9443,8188,5928,161,6979,2352,5628,6991,1198,8067,5867,6620,3778,8426,2994,3122,3124,6335,3918,8897,2655,9670,634,1088,1576,8935,7255,474,8166,7417,9547,2886,5560,3842 6957,3111,26,7530,7143,1295,1744,6057,3009,1854,8098,5405,2234,4874,9447,2620,9303,27,7410,969,40,2966,5648,7596,8637,4238,3143,3679,7187,690,9980,7085,7714,9373,5632,7526,6707,3951,9734,4216,2146,3602,5371,6029,3039,4433,4855,4151,1449,3376,8009,7240,7027,4602,2947,9081,4045,8424,9352,8742,923,2705,4266,3232,2264,6761,363,2651,3383,7770,6730,7856,7340,9679,2158,610,4471,4608,910,6241 4417,6756,1013,8797,658,8809,5032,8703,7541,846,3357,2920,9817,1745,9980,7593,4667,3087,779,3218,6233,5568,4296,2289,2654,7898,5021,9461,5593,8214,9173,4203,2271,7980,2983,5952,9992,8399,3468,1776,3188,9314,1720,6523,2933,621,8685,5483,8986,6163,3444,9539,4320,155,3992,2828,2150,6071,524,2895,5468,8063,1210,3348,9071,4862,483,9017,4097,6186,9815,3610,5048,1644,1003,9865,9332,2145,1944,2213 9284,3803,4920,1927,6706,4344,7383,4786,9890,2010,5228,1224,3158,6967,8580,8990,8883,5213,76,8306,2031,4980,5639,9519,7184,5645,7769,3259,8077,9130,1317,3096,9624,3818,1770,695,2454,947,6029,3474,9938,3527,5696,4760,7724,7738,2848,6442,5767,6845,8323,4131,2859,7595,2500,4815,3660,9130,8580,7016,8231,4391,8369,3444,4069,4021,556,6154,627,2778,1496,4206,6356,8434,8491,3816,8231,3190,5575,1015 3787,7572,1788,6803,5641,6844,1961,4811,8535,9914,9999,1450,8857,738,4662,8569,6679,2225,7839,8618,286,2648,5342,2294,3205,4546,176,8705,3741,6134,8324,8021,7004,5205,7032,6637,9442,5539,5584,4819,5874,5807,8589,6871,9016,983,1758,3786,1519,6241,185,8398,495,3370,9133,3051,4549,9674,7311,9738,3316,9383,2658,2776,9481,7558,619,3943,3324,6491,4933,153,9738,4623,912,3595,7771,7939,1219,4405 2650,3883,4154,5809,315,7756,4430,1788,4451,1631,6461,7230,6017,5751,138,588,5282,2442,9110,9035,6349,2515,1570,6122,4192,4174,3530,1933,4186,4420,4609,5739,4135,2963,6308,1161,8809,8619,2796,3819,6971,8228,4188,1492,909,8048,2328,6772,8467,7671,9068,2226,7579,6422,7056,8042,3296,2272,3006,2196,7320,3238,3490,3102,37,1293,3212,4767,5041,8773,5794,4456,6174,7279,7054,2835,7053,9088,790,6640 3101,1057,7057,3826,6077,1025,2955,1224,1114,6729,5902,4698,6239,7203,9423,1804,4417,6686,1426,6941,8071,1029,4985,9010,6122,6597,1622,1574,3513,1684,7086,5505,3244,411,9638,4150,907,9135,829,981,1707,5359,8781,9751,5,9131,3973,7159,1340,6955,7514,7993,6964,8198,1933,2797,877,3993,4453,8020,9349,8646,2779,8679,2961,3547,3374,3510,1129,3568,2241,2625,9138,5974,8206,7669,7678,1833,8700,4480 4865,9912,8038,8238,782,3095,8199,1127,4501,7280,2112,2487,3626,2790,9432,1475,6312,8277,4827,2218,5806,7132,8752,1468,7471,6386,739,8762,8323,8120,5169,9078,9058,3370,9560,7987,8585,8531,5347,9312,1058,4271,1159,5286,5404,6925,8606,9204,7361,2415,560,586,4002,2644,1927,2824,768,4409,2942,3345,1002,808,4941,6267,7979,5140,8643,7553,9438,7320,4938,2666,4609,2778,8158,6730,3748,3867,1866,7181 171,3771,7134,8927,4778,2913,3326,2004,3089,7853,1378,1729,4777,2706,9578,1360,5693,3036,1851,7248,2403,2273,8536,6501,9216,613,9671,7131,7719,6425,773,717,8803,160,1114,7554,7197,753,4513,4322,8499,4533,2609,4226,8710,6627,644,9666,6260,4870,5744,7385,6542,6203,7703,6130,8944,5589,2262,6803,6381,7414,6888,5123,7320,9392,9061,6780,322,8975,7050,5089,1061,2260,3199,1150,1865,5386,9699,6501 3744,8454,6885,8277,919,1923,4001,6864,7854,5519,2491,6057,8794,9645,1776,5714,9786,9281,7538,6916,3215,395,2501,9618,4835,8846,9708,2813,3303,1794,8309,7176,2206,1602,1838,236,4593,2245,8993,4017,10,8215,6921,5206,4023,5932,6997,7801,262,7640,3107,8275,4938,7822,2425,3223,3886,2105,8700,9526,2088,8662,8034,7004,5710,2124,7164,3574,6630,9980,4242,2901,9471,1491,2117,4562,1130,9086,4117,6698 2810,2280,2331,1170,4554,4071,8387,1215,2274,9848,6738,1604,7281,8805,439,1298,8318,7834,9426,8603,6092,7944,1309,8828,303,3157,4638,4439,9175,1921,4695,7716,1494,1015,1772,5913,1127,1952,1950,8905,4064,9890,385,9357,7945,5035,7082,5369,4093,6546,5187,5637,2041,8946,1758,7111,6566,1027,1049,5148,7224,7248,296,6169,375,1656,7993,2816,3717,4279,4675,1609,3317,42,6201,3100,3144,163,9530,4531 7096,6070,1009,4988,3538,5801,7149,3063,2324,2912,7911,7002,4338,7880,2481,7368,3516,2016,7556,2193,1388,3865,8125,4637,4096,8114,750,3144,1938,7002,9343,4095,1392,4220,3455,6969,9647,1321,9048,1996,1640,6626,1788,314,9578,6630,2813,6626,4981,9908,7024,4355,3201,3521,3864,3303,464,1923,595,9801,3391,8366,8084,9374,1041,8807,9085,1892,9431,8317,9016,9221,8574,9981,9240,5395,2009,6310,2854,9255 8830,3145,2960,9615,8220,6061,3452,2918,6481,9278,2297,3385,6565,7066,7316,5682,107,7646,4466,68,1952,9603,8615,54,7191,791,6833,2560,693,9733,4168,570,9127,9537,1925,8287,5508,4297,8452,8795,6213,7994,2420,4208,524,5915,8602,8330,2651,8547,6156,1812,6271,7991,9407,9804,1553,6866,1128,2119,4691,9711,8315,5879,9935,6900,482,682,4126,1041,428,6247,3720,5882,7526,2582,4327,7725,3503,2631 2738,9323,721,7434,1453,6294,2957,3786,5722,6019,8685,4386,3066,9057,6860,499,5315,3045,5194,7111,3137,9104,941,586,3066,755,4177,8819,7040,5309,3583,3897,4428,7788,4721,7249,6559,7324,825,7311,3760,6064,6070,9672,4882,584,1365,9739,9331,5783,2624,7889,1604,1303,1555,7125,8312,425,8936,3233,7724,1480,403,7440,1784,1754,4721,1569,652,3893,4574,5692,9730,4813,9844,8291,9199,7101,3391,8914 6044,2928,9332,3328,8588,447,3830,1176,3523,2705,8365,6136,5442,9049,5526,8575,8869,9031,7280,706,2794,8814,5767,4241,7696,78,6570,556,5083,1426,4502,3336,9518,2292,1885,3740,3153,9348,9331,8051,2759,5407,9028,7840,9255,831,515,2612,9747,7435,8964,4971,2048,4900,5967,8271,1719,9670,2810,6777,1594,6367,6259,8316,3815,1689,6840,9437,4361,822,9619,3065,83,6344,7486,8657,8228,9635,6932,4864 8478,4777,6334,4678,7476,4963,6735,3096,5860,1405,5127,7269,7793,4738,227,9168,2996,8928,765,733,1276,7677,6258,1528,9558,3329,302,8901,1422,8277,6340,645,9125,8869,5952,141,8141,1816,9635,4025,4184,3093,83,2344,2747,9352,7966,1206,1126,1826,218,7939,2957,2729,810,8752,5247,4174,4038,8884,7899,9567,301,5265,5752,7524,4381,1669,3106,8270,6228,6373,754,2547,4240,2313,5514,3022,1040,9738 2265,8192,1763,1369,8469,8789,4836,52,1212,6690,5257,8918,6723,6319,378,4039,2421,8555,8184,9577,1432,7139,8078,5452,9628,7579,4161,7490,5159,8559,1011,81,478,5840,1964,1334,6875,8670,9900,739,1514,8692,522,9316,6955,1345,8132,2277,3193,9773,3923,4177,2183,1236,6747,6575,4874,6003,6409,8187,745,8776,9440,7543,9825,2582,7381,8147,7236,5185,7564,6125,218,7991,6394,391,7659,7456,5128,5294 2132,8992,8160,5782,4420,3371,3798,5054,552,5631,7546,4716,1332,6486,7892,7441,4370,6231,4579,2121,8615,1145,9391,1524,1385,2400,9437,2454,7896,7467,2928,8400,3299,4025,7458,4703,7206,6358,792,6200,725,4275,4136,7390,5984,4502,7929,5085,8176,4600,119,3568,76,9363,6943,2248,9077,9731,6213,5817,6729,4190,3092,6910,759,2682,8380,1254,9604,3011,9291,5329,9453,9746,2739,6522,3765,5634,1113,5789 5304,5499,564,2801,679,2653,1783,3608,7359,7797,3284,796,3222,437,7185,6135,8571,2778,7488,5746,678,6140,861,7750,803,9859,9918,2425,3734,2698,9005,4864,9818,6743,2475,132,9486,3825,5472,919,292,4411,7213,7699,6435,9019,6769,1388,802,2124,1345,8493,9487,8558,7061,8777,8833,2427,2238,5409,4957,8503,3171,7622,5779,6145,2417,5873,5563,5693,9574,9491,1937,7384,4563,6842,5432,2751,3406,7981 ================================================ FILE: project_euler/problem_082/sol1.py ================================================ """ Project Euler Problem 82: https://projecteuler.net/problem=82 The minimal path sum in the 5 by 5 matrix below, by starting in any cell in the left column and finishing in any cell in the right column, and only moving up, down, and right, is indicated in red and bold; the sum is equal to 994. 131 673 [234] [103] [18] [201] [96] [342] 965 150 630 803 746 422 111 537 699 497 121 956 805 732 524 37 331 Find the minimal path sum from the left column to the right column in matrix.txt (https://projecteuler.net/project/resources/p082_matrix.txt) (right click and "Save Link/Target As..."), a 31K text file containing an 80 by 80 matrix. """ import os def solution(filename: str = "input.txt") -> int: """ Returns the minimal path sum in the matrix from the file, by starting in any cell in the left column and finishing in any cell in the right column, and only moving up, down, and right >>> solution("test_matrix.txt") 994 """ with open(os.path.join(os.path.dirname(__file__), filename)) as input_file: matrix = [ [int(element) for element in line.split(",")] for line in input_file.readlines() ] rows = len(matrix) cols = len(matrix[0]) minimal_path_sums = [[-1 for _ in range(cols)] for _ in range(rows)] for i in range(rows): minimal_path_sums[i][0] = matrix[i][0] for j in range(1, cols): for i in range(rows): minimal_path_sums[i][j] = minimal_path_sums[i][j - 1] + matrix[i][j] for i in range(1, rows): minimal_path_sums[i][j] = min( minimal_path_sums[i][j], minimal_path_sums[i - 1][j] + matrix[i][j] ) for i in range(rows - 2, -1, -1): minimal_path_sums[i][j] = min( minimal_path_sums[i][j], minimal_path_sums[i + 1][j] + matrix[i][j] ) return min(minimal_path_sums_row[-1] for minimal_path_sums_row in minimal_path_sums) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_082/test_matrix.txt ================================================ 131,673,234,103,18 201,96,342,965,150 630,803,746,422,111 537,699,497,121,956 805,732,524,37,331 ================================================ FILE: project_euler/problem_085/__init__.py ================================================ ================================================ FILE: project_euler/problem_085/sol1.py ================================================ """ Project Euler Problem 85: https://projecteuler.net/problem=85 By counting carefully it can be seen that a rectangular grid measuring 3 by 2 contains eighteen rectangles.  Although there exists no rectangular grid that contains exactly two million rectangles, find the area of the grid with the nearest solution. Solution: For a grid with side-lengths a and b, the number of rectangles contained in the grid is [a*(a+1)/2] * [b*(b+1)/2)], which happens to be the product of the a-th and b-th triangle numbers. So to find the solution grid (a,b), we need to find the two triangle numbers whose product is closest to two million. Denote these two triangle numbers Ta and Tb. We want their product Ta*Tb to be as close as possible to 2m. Assuming that the best solution is fairly close to 2m, We can assume that both Ta and Tb are roughly bounded by 2m. Since Ta = a(a+1)/2, we can assume that a (and similarly b) are roughly bounded by sqrt(2 * 2m) = 2000. Since this is a rough bound, to be on the safe side we add 10%. Therefore we start by generating all the triangle numbers Ta for 1 <= a <= 2200. This can be done iteratively since the ith triangle number is the sum of 1,2, ... ,i, and so T(i) = T(i-1) + i. We then search this list of triangle numbers for the two that give a product closest to our target of two million. Rather than testing every combination of 2 elements of the list, which would find the result in quadratic time, we can find the best pair in linear time. We iterate through the list of triangle numbers using enumerate() so we have a and Ta. Since we want Ta * Tb to be as close as possible to 2m, we know that Tb needs to be roughly 2m / Ta. Using the formula Tb = b*(b+1)/2 as well as the quadratic formula, we can solve for b: b is roughly (-1 + sqrt(1 + 8 * 2m / Ta)) / 2. Since the closest integers to this estimate will give product closest to 2m, we only need to consider the integers above and below. It's then a simple matter to get the triangle numbers corresponding to those integers, calculate the product Ta * Tb, compare that product to our target 2m, and keep track of the (a,b) pair that comes the closest. Reference: https://en.wikipedia.org/wiki/Triangular_number https://en.wikipedia.org/wiki/Quadratic_formula """ from __future__ import annotations from math import ceil, floor, sqrt def solution(target: int = 2000000) -> int: """ Find the area of the grid which contains as close to two million rectangles as possible. >>> solution(20) 6 >>> solution(2000) 72 >>> solution(2000000000) 86595 """ triangle_numbers: list[int] = [0] idx: int for idx in range(1, ceil(sqrt(target * 2) * 1.1)): triangle_numbers.append(triangle_numbers[-1] + idx) # we want this to be as close as possible to target best_product: int = 0 # the area corresponding to the grid that gives the product closest to target area: int = 0 # an estimate of b, using the quadratic formula b_estimate: float # the largest integer less than b_estimate b_floor: int # the largest integer less than b_estimate b_ceil: int # the triangle number corresponding to b_floor triangle_b_first_guess: int # the triangle number corresponding to b_ceil triangle_b_second_guess: int for idx_a, triangle_a in enumerate(triangle_numbers[1:], 1): b_estimate = (-1 + sqrt(1 + 8 * target / triangle_a)) / 2 b_floor = floor(b_estimate) b_ceil = ceil(b_estimate) triangle_b_first_guess = triangle_numbers[b_floor] triangle_b_second_guess = triangle_numbers[b_ceil] if abs(target - triangle_b_first_guess * triangle_a) < abs( target - best_product ): best_product = triangle_b_first_guess * triangle_a area = idx_a * b_floor if abs(target - triangle_b_second_guess * triangle_a) < abs( target - best_product ): best_product = triangle_b_second_guess * triangle_a area = idx_a * b_ceil return area if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_086/__init__.py ================================================ ================================================ FILE: project_euler/problem_086/sol1.py ================================================ """ Project Euler Problem 86: https://projecteuler.net/problem=86 A spider, S, sits in one corner of a cuboid room, measuring 6 by 5 by 3, and a fly, F, sits in the opposite corner. By travelling on the surfaces of the room the shortest "straight line" distance from S to F is 10 and the path is shown on the diagram.  However, there are up to three "shortest" path candidates for any given cuboid and the shortest route doesn't always have integer length. It can be shown that there are exactly 2060 distinct cuboids, ignoring rotations, with integer dimensions, up to a maximum size of M by M by M, for which the shortest route has integer length when M = 100. This is the least value of M for which the number of solutions first exceeds two thousand; the number of solutions when M = 99 is 1975. Find the least value of M such that the number of solutions first exceeds one million. Solution: Label the 3 side-lengths of the cuboid a,b,c such that 1 <= a <= b <= c <= M. By conceptually "opening up" the cuboid and laying out its faces on a plane, it can be seen that the shortest distance between 2 opposite corners is sqrt((a+b)^2 + c^2). This distance is an integer if and only if (a+b),c make up the first 2 sides of a pythagorean triplet. The second useful insight is rather than calculate the number of cuboids with integral shortest distance for each maximum cuboid side-length M, we can calculate this number iteratively each time we increase M, as follows. The set of cuboids satisfying this property with maximum side-length M-1 is a subset of the cuboids satisfying the property with maximum side-length M (since any cuboids with side lengths <= M-1 are also <= M). To calculate the number of cuboids in the larger set (corresponding to M) we need only consider the cuboids which have at least one side of length M. Since we have ordered the side lengths a <= b <= c, we can assume that c = M. Then we just need to count the number of pairs a,b satisfying the conditions: sqrt((a+b)^2 + M^2) is integer 1 <= a <= b <= M To count the number of pairs (a,b) satisfying these conditions, write d = a+b. Now we have: 1 <= a <= b <= M => 2 <= d <= 2*M we can actually make the second equality strict, since d = 2*M => d^2 + M^2 = 5M^2 => shortest distance = M * sqrt(5) => not integral. a + b = d => b = d - a and a <= b => a <= d/2 also a <= M => a <= min(M, d//2) a + b = d => a = d - b and b <= M => a >= d - M also a >= 1 => a >= max(1, d - M) So a is in range(max(1, d - M), min(M, d // 2) + 1) For a given d, the number of cuboids satisfying the required property with c = M and a + b = d is the length of this range, which is min(M, d // 2) + 1 - max(1, d - M). In the code below, d is sum_shortest_sides and M is max_cuboid_size. """ from math import sqrt def solution(limit: int = 1000000) -> int: """ Return the least value of M such that there are more than one million cuboids of side lengths 1 <= a,b,c <= M such that the shortest distance between two opposite vertices of the cuboid is integral. >>> solution(100) 24 >>> solution(1000) 72 >>> solution(2000) 100 >>> solution(20000) 288 """ num_cuboids: int = 0 max_cuboid_size: int = 0 sum_shortest_sides: int while num_cuboids <= limit: max_cuboid_size += 1 for sum_shortest_sides in range(2, 2 * max_cuboid_size + 1): if sqrt(sum_shortest_sides**2 + max_cuboid_size**2).is_integer(): num_cuboids += ( min(max_cuboid_size, sum_shortest_sides // 2) - max(1, sum_shortest_sides - max_cuboid_size) + 1 ) return max_cuboid_size if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_087/__init__.py ================================================ ================================================ FILE: project_euler/problem_087/sol1.py ================================================ """ Project Euler Problem 87: https://projecteuler.net/problem=87 The smallest number expressible as the sum of a prime square, prime cube, and prime fourth power is 28. In fact, there are exactly four numbers below fifty that can be expressed in such a way: 28 = 22 + 23 + 24 33 = 32 + 23 + 24 49 = 52 + 23 + 24 47 = 22 + 33 + 24 How many numbers below fifty million can be expressed as the sum of a prime square, prime cube, and prime fourth power? """ def solution(limit: int = 50000000) -> int: """ Return the number of integers less than limit which can be expressed as the sum of a prime square, prime cube, and prime fourth power. >>> solution(50) 4 """ ret = set() prime_square_limit = int((limit - 24) ** (1 / 2)) primes = set(range(3, prime_square_limit + 1, 2)) primes.add(2) for p in range(3, prime_square_limit + 1, 2): if p not in primes: continue primes.difference_update(set(range(p * p, prime_square_limit + 1, p))) for prime1 in primes: square = prime1 * prime1 for prime2 in primes: cube = prime2 * prime2 * prime2 if square + cube >= limit - 16: break for prime3 in primes: tetr = prime3 * prime3 * prime3 * prime3 total = square + cube + tetr if total >= limit: break ret.add(total) return len(ret) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_089/__init__.py ================================================ ================================================ FILE: project_euler/problem_089/numeralcleanup_test.txt ================================================ IIII IV IIIIIIIIII X VIIIII ================================================ FILE: project_euler/problem_089/p089_roman.txt ================================================ MMMMDCLXXII MMDCCCLXXXIII MMMDLXVIIII MMMMDXCV DCCCLXXII MMCCCVI MMMCDLXXXVII MMMMCCXXI MMMCCXX MMMMDCCCLXXIII MMMCCXXXVII MMCCCLXXXXIX MDCCCXXIIII MMCXCVI CCXCVIII MMMCCCXXXII MDCCXXX MMMDCCCL MMMMCCLXXXVI MMDCCCXCVI MMMDCII MMMCCXII MMMMDCCCCI MMDCCCXCII MDCXX CMLXXXVII MMMXXI MMMMCCCXIV MLXXII MCCLXXVIIII MMMMCCXXXXI MMDCCCLXXII MMMMXXXI MMMDCCLXXX MMDCCCLXXIX MMMMLXXXV MCXXI MDCCCXXXVII MMCCCLXVII MCDXXXV CCXXXIII CMXX MMMCLXIV MCCCLXXXVI DCCCXCVIII MMMDCCCCXXXIV CDXVIIII MMCCXXXV MDCCCXXXII MMMMD MMDCCLXIX MMMMCCCLXXXXVI MMDCCXLII MMMDCCCVIIII DCCLXXXIIII MDCCCCXXXII MMCXXVII DCCCXXX CCLXIX MMMXI MMMMCMLXXXXVIII MMMMDLXXXVII MMMMDCCCLX MMCCLIV CMIX MMDCCCLXXXIIII CLXXXII MMCCCCXXXXV MMMMDLXXXVIIII MMMDCCCXXI MMDCCCCLXXVI MCCCCLXX MMCDLVIIII MMMDCCCLIX MMMMCCCCXIX MMMDCCCLXXV XXXI CDLXXXIII MMMCXV MMDCCLXIII MMDXXX MMMMCCCLVII MMMDCI MMMMCDLXXXIIII MMMMCCCXVI CCCLXXXVIII MMMMCML MMMMXXIV MMMCCCCXXX DCCX MMMCCLX MMDXXXIII CCCLXIII MMDCCXIII MMMCCCXLIV CLXXXXI CXVI MMMMCXXXIII CLXX DCCCXVIII MLXVII DLXXXX MMDXXI MMMMDLXXXXVIII MXXII LXI DCCCCXLIII MMMMDV MMMMXXXIV MDCCCLVIII MMMCCLXXII MMMMDCCXXXVI MMMMLXXXIX MDCCCLXXXI MMMMDCCCXV MMMMCCCCXI MMMMCCCLIII MDCCCLXXI MMCCCCXI MLXV MMCDLXII MMMMDXXXXII MMMMDCCCXL MMMMCMLVI CCLXXXIV MMMDCCLXXXVI MMCLII MMMCCCCXV MMLXXXIII MMMV MMMV DCCLXII MMDCCCCXVI MMDCXLVIII CCLIIII CCCXXV MMDCCLXXXVIIII MMMMDCLXXVIII MMMMDCCCXCI MMMMCCCXX MMCCXLV MMMDCCCLXIX MMCCLXIIII MMMDCCCXLIX MMMMCCCLXIX CMLXXXXI MCMLXXXIX MMCDLXI MMDCLXXVIII MMMMDCCLXI MCDXXV DL CCCLXXII MXVIIII MCCCCLXVIII CIII MMMDCCLXXIIII MMMDVIII MMMMCCCLXXXXVII MMDXXVII MMDCCLXXXXV MMMMCXLVI MMMDCCLXXXII MMMDXXXVI MCXXII CLI DCLXXXIX MMMCLI MDCLXIII MMMMDCCXCVII MMCCCLXXXV MMMDCXXVIII MMMCDLX MMMCMLII MMMIV MMMMDCCCLVIII MMMDLXXXVIII MCXXIV MMMMLXXVI CLXXIX MMMCCCCXXVIIII DCCLXXXV MMMDCCCVI LI CLXXXVI MMMMCCCLXXVI MCCCLXVI CCXXXIX MMDXXXXI MMDCCCXLI DCCCLXXXVIII MMMMDCCCIV MDCCCCXV MMCMVI MMMMCMLXXXXV MMDCCLVI MMMMCCXLVIII DCCCCIIII MMCCCCIII MMMDCCLXXXVIIII MDCCCLXXXXV DVII MMMV DCXXV MMDCCCXCV DCVIII MMCDLXVI MCXXVIII MDCCXCVIII MMDCLX MMMDCCLXIV MMCDLXXVII MMDLXXXIIII MMMMCCCXXII MMMDCCCXLIIII DCCCCLXVII MMMCLXXXXIII MCCXV MMMMDCXI MMMMDCLXXXXV MMMCCCLII MMCMIX MMDCCXXV MMDLXXXVI MMMMDCXXVIIII DCCCCXXXVIIII MMCCXXXIIII MMDCCLXXVIII MDCCLXVIIII MMCCLXXXV MMMMDCCCLXXXVIII MMCMXCI MDXLII MMMMDCCXIV MMMMLI DXXXXIII MMDCCXI MMMMCCLXXXIII MMMDCCCLXXIII MDCLVII MMCD MCCCXXVII MMMMDCCIIII MMMDCCXLVI MMMCLXXXVII MMMCCVIIII MCCCCLXXIX DL DCCCLXXVI MMDXCI MMMMDCCCCXXXVI MMCII MMMDCCCXXXXV MMMCDXLV MMDCXXXXIV MMD MDCCCLXXXX MMDCXLIII MMCCXXXII MMDCXXXXVIIII DCCCLXXI MDXCVIIII MMMMCCLXXVIII MDCLVIIII MMMCCCLXXXIX MDCLXXXV MDLVIII MMMMCCVII MMMMDCXIV MMMCCCLXIIII MMIIII MMMMCCCLXXIII CCIII MMMCCLV MMMDXIII MMMCCCXC MMMDCCCXXI MMMMCCCCXXXII CCCLVI MMMCCCLXXXVI MXVIIII MMMCCCCXIIII CLXVII MMMCCLXX CCCCLXIV MMXXXXII MMMMCCLXXXX MXL CCXVI CCCCLVIIII MMCCCII MCCCLVIII MMMMCCCX MCDLXXXXIV MDCCCXIII MMDCCCXL MMMMCCCXXIII DXXXIV CVI MMMMDCLXXX DCCCVII MMCMLXIIII MMMDCCCXXXIII DCCC MDIII MMCCCLXVI MMMCCCCLXXI MMDCCCCXVIII CCXXXVII CCCXXV MDCCCXII MMMCMV MMMMCMXV MMMMDCXCI DXXI MMCCXLVIIII MMMMCMLII MDLXXX MMDCLXVI CXXI MMMDCCCLIIII MMMCXXI MCCIII MMDCXXXXI CCXCII MMMMDXXXV MMMCCCLXV MMMMDLXV MMMCCCCXXXII MMMCCCVIII DCCCCLXXXXII MMCLXIV MMMMCXI MLXXXXVII MMMCDXXXVIII MDXXII MLV MMMMDLXVI MMMCXII XXXIII MMMMDCCCXXVI MMMLXVIIII MMMLX MMMCDLXVII MDCCCLVII MMCXXXVII MDCCCCXXX MMDCCCLXIII MMMMDCXLIX MMMMCMXLVIII DCCCLXXVIIII MDCCCLIII MMMCMLXI MMMMCCLXI MMDCCCLIII MMMDCCCVI MMDXXXXIX MMCLXXXXV MMDXXX MMMXIII DCLXXIX DCCLXII MMMMDCCLXVIII MDCCXXXXIII CCXXXII MMMMDCXXV MMMCCCXXVIII MDCVIII MMMCLXXXXIIII CLXXXI MDCCCCXXXIII MMMMDCXXX MMMDCXXIV MMMCCXXXVII MCCCXXXXIIII CXVIII MMDCCCCIV MMMMCDLXXV MMMDLXIV MDXCIII MCCLXXXI MMMDCCCXXIV MCXLIII MMMDCCCI MCCLXXX CCXV MMDCCLXXI MMDLXXXIII MMMMDCXVII MMMCMLXV MCLXVIII MMMMCCLXXVI MMMDCCLXVIIII MMMMDCCCIX DLXXXXIX DCCCXXII MMMMIII MMMMCCCLXXVI DCCCXCIII DXXXI MXXXIIII CCXII MMMDCCLXXXIIII MMMCXX MMMCMXXVII DCCCXXXX MMCDXXXVIIII MMMMDCCXVIII LV MMMDCCCCVI MCCCII MMCMLXVIIII MDCCXI MMMMDLXVII MMCCCCLXI MMDCCV MMMCCCXXXIIII MMMMDI MMMDCCCXCV MMDCCLXXXXI MMMDXXVI MMMDCCCLVI MMDCXXX MCCCVII MMMMCCCLXII MMMMXXV MMCMXXV MMLVI MMDXXX MMMMCVII MDC MCCIII MMMMDCC MMCCLXXV MMDCCCXXXXVI MMMMCCCLXV CDXIIII MLXIIII CCV MMMCMXXXI CCCCLXVI MDXXXII MMMMCCCLVIII MMV MMMCLII MCMLI MMDCCXX MMMMCCCCXXXVI MCCLXXXI MMMCMVI DCCXXX MMMMCCCLXV DCCCXI MMMMDCCCXIV CCCXXI MMDLXXV CCCCLXXXX MCCCLXXXXII MMDCIX DCCXLIIII DXIV MMMMCLII CDLXI MMMCXXVII MMMMDCCCCLXIII MMMDCLIIII MCCCCXXXXII MMCCCLX CCCCLIII MDCCLXXVI MCMXXIII MMMMDLXXVIII MMDCCCCLX MMMCCCLXXXX MMMCDXXVI MMMDLVIII CCCLXI MMMMDCXXII MMDCCCXXI MMDCCXIII MMMMCLXXXVI MDCCCCXXVI MDV MMDCCCCLXXVI MMMMCCXXXVII MMMDCCLXXVIIII MMMCCCCLXVII DCCXLI MMCLXXXVIII MCCXXXVI MMDCXLVIII MMMMCXXXII MMMMDCCLXVI MMMMCMLI MMMMCLXV MMMMDCCCXCIV MCCLXXVII LXXVIIII DCCLII MMMCCCXCVI MMMCLV MMDCCCXXXXVIII DCCCXV MXC MMDCCLXXXXVII MMMMCML MMDCCCLXXVIII DXXI MCCCXLI DCLXXXXI MMCCCLXXXXVIII MDCCCCLXXVIII MMMMDXXV MMMDCXXXVI MMMCMXCVII MMXVIIII MMMDCCLXXIV MMMCXXV DXXXVIII MMMMCLXVI MDXII MMCCCLXX CCLXXI DXIV MMMCLIII DLII MMMCCCXLIX MMCCCCXXVI MMDCXLIII MXXXXII CCCLXXXV MDCLXXVI MDCXII MMMCCCLXXXIII MMDCCCCLXXXII MMMMCCCLXXXV MMDCXXI DCCCXXX MMMDCCCCLII MMMDCCXXII MMMMCDXCVIII MMMCCLXVIIII MMXXV MMMMCDXIX MMMMCCCX MMMCCCCLXVI MMMMDCLXXVIIII MMMMDCXXXXIV MMMCMXII MMMMXXXIII MMMMDLXXXII DCCCLIV MDXVIIII MMMCLXXXXV CCCCXX MMDIX MMCMLXXXVIII DCCXLIII DCCLX D MCCCVII MMMMCCCLXXXIII MDCCCLXXIIII MMMDCCCCLXXXVII MMMMCCCVII MMMDCCLXXXXVI CDXXXIV MCCLXVIII MMMMDLX MMMMDXII MMMMCCCCLIIII MCMLXXXXIII MMMMDCCCIII MMDCLXXXIII MDCCCXXXXIV XXXXVII MMMDCCCXXXII MMMDCCCXLII MCXXXV MDCXXVIIII MMMCXXXXIIII MMMMCDXVII MMMDXXIII MMMMCCCCLXI DCLXXXXVIIII LXXXXI CXXXIII MCDX MCCLVII MDCXXXXII MMMCXXIV MMMMLXXXX MMDCCCCXLV MLXXX MMDCCCCLX MCDLIII MMMCCCLXVII MMMMCCCLXXIV MMMDCVIII DCCCCXXIII MMXCI MMDCCIV MMMMDCCCXXXIV CCCLXXI MCCLXXXII MCMIII CCXXXI DCCXXXVIII MMMMDCCXLVIIII MMMMCMXXXV DCCCLXXV DCCXCI MMMMDVII MMMMDCCCLXVIIII CCCXCV MMMMDCCXX MCCCCII MMMCCCXC MMMCCCII MMDCCLXXVII MMDCLIIII CCXLIII MMMDCXVIII MMMCCCIX MCXV MMCCXXV MLXXIIII MDCCXXVI MMMCCCXX MMDLXX MMCCCCVI MMDCCXX MMMMDCCCCXCV MDCCCXXXII MMMMDCCCCXXXX XCIV MMCCCCLX MMXVII MLXXI MMMDXXVIII MDCCCCII MMMCMLVII MMCLXXXXVIII MDCCCCLV MCCCCLXXIIII MCCCLII MCDXLVI MMMMDXVIII DCCLXXXIX MMMDCCLXIV MDCCCCXLIII CLXXXXV MMMMCCXXXVI MMMDCCCXXI MMMMCDLXXVII MCDLIII MMCCXLVI DCCCLV MCDLXX DCLXXVIII MMDCXXXIX MMMMDCLX MMDCCLI MMCXXXV MMMCCXII MMMMCMLXII MMMMCCV MCCCCLXIX MMMMCCIII CLXVII MCCCLXXXXIIII MMMMDCVIII MMDCCCLXI MMLXXIX CMLXIX MMDCCCXLVIIII DCLXII MMMCCCXLVII MDCCCXXXV MMMMDCCXCVI DCXXX XXVI MMLXIX MMCXI DCXXXVII MMMMCCCXXXXVIII MMMMDCLXI MMMMDCLXXIIII MMMMVIII MMMMDCCCLXII MDCXCI MMCCCXXIIII CCCCXXXXV MMDCCCXXI MCVI MMDCCLXVIII MMMMCXL MLXVIII CMXXVII CCCLV MDCCLXXXIX MMMCCCCLXV MMDCCLXII MDLXVI MMMCCCXVIII MMMMCCLXXXI MMCXXVII MMDCCCLXVIII MMMCXCII MMMMDCLVIII MMMMDCCCXXXXII MMDCCCCLXXXXVI MDCCXL MDCCLVII MMMMDCCCLXXXVI DCCXXXIII MMMMDCCCCLXXXV MMCCXXXXVIII MMMCCLXXVIII MMMDCLXXVIII DCCCI MMMMLXXXXVIIII MMMCCCCLXXII MMCLXXXVII CCLXVI MCDXLIII MMCXXVIII MDXIV CCCXCVIII CLXXVIII MMCXXXXVIIII MMMDCLXXXIV CMLVIII MCDLIX MMMMDCCCXXXII MMMMDCXXXIIII MDCXXI MMMDCXLV MCLXXVIII MCDXXII IV MCDLXXXXIII MMMMDCCLXV CCLI MMMMDCCCXXXVIII DCLXII MCCCLXVII MMMMDCCCXXXVI MMDCCXLI MLXI MMMCDLXVIII MCCCCXCIII XXXIII MMMDCLXIII MMMMDCL DCCCXXXXIIII MMDLVII DXXXVII MCCCCXXIIII MCVII MMMMDCCXL MMMMCXXXXIIII MCCCCXXIV MMCLXVIII MMXCIII MDCCLXXX MCCCLIIII MMDCLXXI MXI MCMLIV MMMCCIIII DCCLXXXVIIII MDCLIV MMMDCXIX CMLXXXI DCCLXXXVII XXV MMMXXXVI MDVIIII CLXIII MMMCDLVIIII MMCCCCVII MMMLXX MXXXXII MMMMCCCLXVIII MMDCCCXXVIII MMMMDCXXXXI MMMMDCCCXXXXV MMMXV MMMMCCXVIIII MMDCCXIIII MMMXXVII MDCCLVIIII MMCXXIIII MCCCLXXIV DCLVIII MMMLVII MMMCXLV MMXCVII MMMCCCLXXXVII MMMMCCXXII DXII MMMDLV MCCCLXXVIII MMMCLIIII MMMMCLXXXX MMMCLXXXIIII MDCXXIII MMMMCCXVI MMMMDLXXXIII MMMDXXXXIII MMMMCCCCLV MMMDLXXXI MMMCCLXXVI MMMMXX MMMMDLVI MCCCCLXXX MMMXXII MMXXII MMDCCCCXXXI MMMDXXV MMMDCLXXXVIIII MMMDLXXXXVII MDLXIIII CMXC MMMXXXVIII MDLXXXVIII MCCCLXXVI MMCDLIX MMDCCCXVIII MDCCCXXXXVI MMMMCMIV MMMMDCIIII MMCCXXXV XXXXVI MMMMCCXVII MMCCXXIV MCMLVIIII MLXXXIX MMMMLXXXIX CLXXXXIX MMMDCCCCLVIII MMMMCCLXXIII MCCCC DCCCLIX MMMCCCLXXXII MMMCCLXVIIII MCLXXXV CDLXXXVII DCVI MMX MMCCXIII MMMMDCXX MMMMXXVIII DCCCLXII MMMMCCCXLIII MMMMCLXV DXCI MMMMCLXXX MMMDCCXXXXI MMMMXXXXVI DCLX MMMCCCXI MCCLXXX MMCDLXXII DCCLXXI MMMCCCXXXVI MCCCCLXXXVIIII CDLVIII DCCLVI MMMMDCXXXVIII MMCCCLXXXIII MMMMDCCLXXV MMMXXXVI CCCLXXXXIX CV CCCCXIII CCCCXVI MDCCCLXXXIIII MMDCCLXXXII MMMMCCCCLXXXI MXXV MMCCCLXXVIIII MMMCCXII MMMMCCXXXIII MMCCCLXXXVI MMMDCCCLVIIII MCCXXXVII MDCLXXV XXXV MMDLI MMMCCXXX MMMMCXXXXV CCCCLIX MMMMDCCCLXXIII MMCCCXVII DCCCXVI MMMCCCXXXXV MDCCCCXCV CLXXXI MMMMDCCLXX MMMDCCCIII MMCLXXVII MMMDCCXXIX MMDCCCXCIIII MMMCDXXIIII MMMMXXVIII MMMMDCCCCLXVIII MDCCCXX MMMMCDXXI MMMMDLXXXIX CCXVI MDVIII MMCCLXXI MMMDCCCLXXI MMMCCCLXXVI MMCCLXI MMMMDCCCXXXIV DLXXXVI MMMMDXXXII MMMXXIIII MMMMCDIV MMMMCCCXLVIII MMMMCXXXVIII MMMCCCLXVI MDCCXVIII MMCXX CCCLIX MMMMDCCLXXII MDCCCLXXV MMMMDCCCXXIV DCCCXXXXVIII MMMDCCCCXXXVIIII MMMMCCXXXV MDCLXXXIII MMCCLXXXIV MCLXXXXIIII DXXXXIII MCCCXXXXVIII MMCLXXIX MMMMCCLXIV MXXII MMMCXIX MDCXXXVII MMDCCVI MCLXXXXVIII MMMCXVI MCCCLX MMMCDX CCLXVIIII MMMCCLX MCXXVIII LXXXII MCCCCLXXXI MMMI MMMCCCLXIV MMMCCCXXVIIII CXXXVIII MMCCCXX MMMCCXXVIIII MCCLXVI MMMCCCCXXXXVI MMDCCXCIX MCMLXXI MMCCLXVIII CDLXXXXIII MMMMDCCXXII MMMMDCCLXXXVII MMMDCCLIV MMCCLXIII MDXXXVII DCCXXXIIII MCII MMMDCCCLXXI MMMLXXIII MDCCCLIII MMXXXVIII MDCCXVIIII MDCCCCXXXVII MMCCCXVI MCMXXII MMMCCCLVIII MMMMDCCCXX MCXXIII MMMDLXI MMMMDXXII MDCCCX MMDXCVIIII MMMDCCCCVIII MMMMDCCCCXXXXVI MMDCCCXXXV MMCXCIV MCMLXXXXIII MMMCCCLXXVI MMMMDCLXXXV CMLXIX DCXCII MMXXVIII MMMMCCCXXX XXXXVIIII ================================================ FILE: project_euler/problem_089/sol1.py ================================================ """ Project Euler Problem 89: https://projecteuler.net/problem=89 For a number written in Roman numerals to be considered valid there are basic rules which must be followed. Even though the rules allow some numbers to be expressed in more than one way there is always a "best" way of writing a particular number. For example, it would appear that there are at least six ways of writing the number sixteen: IIIIIIIIIIIIIIII VIIIIIIIIIII VVIIIIII XIIIIII VVVI XVI However, according to the rules only XIIIIII and XVI are valid, and the last example is considered to be the most efficient, as it uses the least number of numerals. The 11K text file, roman.txt (right click and 'Save Link/Target As...'), contains one thousand numbers written in valid, but not necessarily minimal, Roman numerals; see About... Roman Numerals for the definitive rules for this problem. Find the number of characters saved by writing each of these in their minimal form. Note: You can assume that all the Roman numerals in the file contain no more than four consecutive identical units. """ import os SYMBOLS = {"I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000} def parse_roman_numerals(numerals: str) -> int: """ Converts a string of roman numerals to an integer. e.g. >>> parse_roman_numerals("LXXXIX") 89 >>> parse_roman_numerals("IIII") 4 """ total_value = 0 index = 0 while index < len(numerals) - 1: current_value = SYMBOLS[numerals[index]] next_value = SYMBOLS[numerals[index + 1]] if current_value < next_value: total_value -= current_value else: total_value += current_value index += 1 total_value += SYMBOLS[numerals[index]] return total_value def generate_roman_numerals(num: int) -> str: """ Generates a string of roman numerals for a given integer. e.g. >>> generate_roman_numerals(89) 'LXXXIX' >>> generate_roman_numerals(4) 'IV' """ numerals = "" m_count = num // 1000 numerals += m_count * "M" num %= 1000 c_count = num // 100 if c_count == 9: numerals += "CM" c_count -= 9 elif c_count == 4: numerals += "CD" c_count -= 4 if c_count >= 5: numerals += "D" c_count -= 5 numerals += c_count * "C" num %= 100 x_count = num // 10 if x_count == 9: numerals += "XC" x_count -= 9 elif x_count == 4: numerals += "XL" x_count -= 4 if x_count >= 5: numerals += "L" x_count -= 5 numerals += x_count * "X" num %= 10 if num == 9: numerals += "IX" num -= 9 elif num == 4: numerals += "IV" num -= 4 if num >= 5: numerals += "V" num -= 5 numerals += num * "I" return numerals def solution(roman_numerals_filename: str = "/p089_roman.txt") -> int: """ Calculates and returns the answer to project euler problem 89. >>> solution("/numeralcleanup_test.txt") 16 """ savings = 0 with open(os.path.dirname(__file__) + roman_numerals_filename) as file1: lines = file1.readlines() for line in lines: original = line.strip() num = parse_roman_numerals(original) shortened = generate_roman_numerals(num) savings += len(original) - len(shortened) return savings if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_091/__init__.py ================================================ ================================================ FILE: project_euler/problem_091/sol1.py ================================================ """ Project Euler Problem 91: https://projecteuler.net/problem=91 The points P (x1, y1) and Q (x2, y2) are plotted at integer coordinates and are joined to the origin, O(0,0), to form ΔOPQ.  There are exactly fourteen triangles containing a right angle that can be formed when each coordinate lies between 0 and 2 inclusive; that is, 0 ≤ x1, y1, x2, y2 ≤ 2.  Given that 0 ≤ x1, y1, x2, y2 ≤ 50, how many right triangles can be formed? """ from itertools import combinations, product def is_right(x1: int, y1: int, x2: int, y2: int) -> bool: """ Check if the triangle described by P(x1,y1), Q(x2,y2) and O(0,0) is right-angled. Note: this doesn't check if P and Q are equal, but that's handled by the use of itertools.combinations in the solution function. >>> is_right(0, 1, 2, 0) True >>> is_right(1, 0, 2, 2) False """ if x1 == y1 == 0 or x2 == y2 == 0: return False a_square = x1 * x1 + y1 * y1 b_square = x2 * x2 + y2 * y2 c_square = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) return ( a_square + b_square == c_square or a_square + c_square == b_square or b_square + c_square == a_square ) def solution(limit: int = 50) -> int: """ Return the number of right triangles OPQ that can be formed by two points P, Q which have both x- and y- coordinates between 0 and limit inclusive. >>> solution(2) 14 >>> solution(10) 448 """ return sum( 1 for pt1, pt2 in combinations(product(range(limit + 1), repeat=2), 2) if is_right(*pt1, *pt2) ) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_092/__init__.py ================================================ ================================================ FILE: project_euler/problem_092/sol1.py ================================================ """ Project Euler Problem 092: https://projecteuler.net/problem=92 Square digit chains A number chain is created by continuously adding the square of the digits in a number to form a new number until it has been seen before. For example, 44 → 32 → 13 → 10 → 1 → 1 85 → 89 → 145 → 42 → 20 → 4 → 16 → 37 → 58 → 89 Therefore any chain that arrives at 1 or 89 will become stuck in an endless loop. What is most amazing is that EVERY starting number will eventually arrive at 1 or 89. How many starting numbers below ten million will arrive at 89? """ DIGITS_SQUARED = [sum(int(c, 10) ** 2 for c in i.__str__()) for i in range(100000)] def next_number(number: int) -> int: """ Returns the next number of the chain by adding the square of each digit to form a new number. For example, if number = 12, next_number() will return 1^2 + 2^2 = 5. Therefore, 5 is the next number of the chain. >>> next_number(44) 32 >>> next_number(10) 1 >>> next_number(32) 13 """ sum_of_digits_squared = 0 while number: # Increased Speed Slightly by checking every 5 digits together. sum_of_digits_squared += DIGITS_SQUARED[number % 100000] number //= 100000 return sum_of_digits_squared # There are 2 Chains made, # One ends with 89 with the chain member 58 being the one which when declared first, # there will be the least number of iterations for all the members to be checked. # The other one ends with 1 and has only one element 1. # So 58 and 1 are chosen to be declared at the starting. # Changed dictionary to an array to quicken the solution CHAINS: list[bool | None] = [None] * 10000000 CHAINS[0] = True CHAINS[57] = False def chain(number: int) -> bool: """ The function generates the chain of numbers until the next number is 1 or 89. For example, if starting number is 44, then the function generates the following chain of numbers: 44 → 32 → 13 → 10 → 1 → 1. Once the next number generated is 1 or 89, the function returns whether or not the next number generated by next_number() is 1. >>> chain(10) True >>> chain(58) False >>> chain(1) True """ if CHAINS[number - 1] is not None: return CHAINS[number - 1] # type: ignore[return-value] number_chain = chain(next_number(number)) CHAINS[number - 1] = number_chain while number < 10000000: CHAINS[number - 1] = number_chain number *= 10 return number_chain def solution(number: int = 10000000) -> int: """ The function returns the number of integers that end up being 89 in each chain. The function accepts a range number and the function checks all the values under value number. >>> solution(100) 80 >>> solution(10000000) 8581146 """ for i in range(1, number): if CHAINS[i] is None: chain(i + 1) return CHAINS[:number].count(False) if __name__ == "__main__": import doctest doctest.testmod() print(f"{solution() = }") ================================================ FILE: project_euler/problem_094/__init__.py ================================================ ================================================ FILE: project_euler/problem_094/sol1.py ================================================ """ Project Euler Problem 94: https://projecteuler.net/problem=94 It is easily proved that no equilateral triangle exists with integral length sides and integral area. However, the almost equilateral triangle 5-5-6 has an area of 12 square units. We shall define an almost equilateral triangle to be a triangle for which two sides are equal and the third differs by no more than one unit. Find the sum of the perimeters of all almost equilateral triangles with integral side lengths and area and whose perimeters do not exceed one billion (1,000,000,000). """ def solution(max_perimeter: int = 10**9) -> int: """ Returns the sum of the perimeters of all almost equilateral triangles with integral side lengths and area and whose perimeters do not exceed max_perimeter >>> solution(20) 16 """ prev_value = 1 value = 2 perimeters_sum = 0 i = 0 perimeter = 0 while perimeter <= max_perimeter: perimeters_sum += perimeter prev_value += 2 * value value += prev_value perimeter = 2 * value + 2 if i % 2 == 0 else 2 * value - 2 i += 1 return perimeters_sum if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_095/__init__.py ================================================ ================================================ FILE: project_euler/problem_095/sol1.py ================================================ """ Project Euler Problem 95: https://projecteuler.net/problem=95 Amicable Chains The proper divisors of a number are all the divisors excluding the number itself. For example, the proper divisors of 28 are 1, 2, 4, 7, and 14. As the sum of these divisors is equal to 28, we call it a perfect number. Interestingly the sum of the proper divisors of 220 is 284 and the sum of the proper divisors of 284 is 220, forming a chain of two numbers. For this reason, 220 and 284 are called an amicable pair. Perhaps less well known are longer chains. For example, starting with 12496, we form a chain of five numbers: 12496 -> 14288 -> 15472 -> 14536 -> 14264 (-> 12496 -> ...) Since this chain returns to its starting point, it is called an amicable chain. Find the smallest member of the longest amicable chain with no element exceeding one million. Solution is doing the following: - Get relevant prime numbers - Iterate over product combination of prime numbers to generate all non-prime numbers up to max number, by keeping track of prime factors - Calculate the sum of factors for each number - Iterate over found some factors to find longest chain """ from math import isqrt def generate_primes(max_num: int) -> list[int]: """ Calculates the list of primes up to and including `max_num`. >>> generate_primes(6) [2, 3, 5] """ are_primes = [True] * (max_num + 1) are_primes[0] = are_primes[1] = False for i in range(2, isqrt(max_num) + 1): if are_primes[i]: for j in range(i * i, max_num + 1, i): are_primes[j] = False return [prime for prime, is_prime in enumerate(are_primes) if is_prime] def multiply( chain: list[int], primes: list[int], min_prime_idx: int, prev_num: int, max_num: int, prev_sum: int, primes_degrees: dict[int, int], ) -> None: """ Run over all prime combinations to generate non-prime numbers. >>> chain = [0] * 3 >>> primes_degrees = {} >>> multiply( ... chain=chain, ... primes=[2], ... min_prime_idx=0, ... prev_num=1, ... max_num=2, ... prev_sum=0, ... primes_degrees=primes_degrees, ... ) >>> chain [0, 0, 1] >>> primes_degrees {2: 1} """ min_prime = primes[min_prime_idx] num = prev_num * min_prime min_prime_degree = primes_degrees.get(min_prime, 0) min_prime_degree += 1 primes_degrees[min_prime] = min_prime_degree new_sum = prev_sum * min_prime + (prev_sum + prev_num) * (min_prime - 1) // ( min_prime**min_prime_degree - 1 ) chain[num] = new_sum for prime_idx in range(min_prime_idx, len(primes)): if primes[prime_idx] * num > max_num: break multiply( chain=chain, primes=primes, min_prime_idx=prime_idx, prev_num=num, max_num=max_num, prev_sum=new_sum, primes_degrees=primes_degrees.copy(), ) def find_longest_chain(chain: list[int], max_num: int) -> int: """ Finds the smallest element of longest chain >>> find_longest_chain(chain=[0, 0, 0, 0, 0, 0, 6], max_num=6) 6 """ max_len = 0 min_elem = 0 for start in range(2, len(chain)): visited = {start} elem = chain[start] length = 1 while elem > 1 and elem <= max_num and elem not in visited: visited.add(elem) elem = chain[elem] length += 1 if elem == start and length > max_len: max_len = length min_elem = start return min_elem def solution(max_num: int = 1000000) -> int: """ Runs the calculation for numbers <= `max_num`. >>> solution(10) 6 >>> solution(200000) 12496 """ primes = generate_primes(max_num) chain = [0] * (max_num + 1) for prime_idx, prime in enumerate(primes): if prime**2 > max_num: break multiply( chain=chain, primes=primes, min_prime_idx=prime_idx, prev_num=1, max_num=max_num, prev_sum=0, primes_degrees={}, ) return find_longest_chain(chain=chain, max_num=max_num) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_097/__init__.py ================================================ ================================================ FILE: project_euler/problem_097/sol1.py ================================================ """ The first known prime found to exceed one million digits was discovered in 1999, and is a Mersenne prime of the form 2**6972593 - 1; it contains exactly 2,098,960 digits. Subsequently other Mersenne primes, of the form 2**p - 1, have been found which contain more digits. However, in 2004 there was found a massive non-Mersenne prime which contains 2,357,207 digits: (28433 * (2 ** 7830457 + 1)). Find the last ten digits of this prime number. """ def solution(n: int = 10) -> str: """ Returns the last n digits of NUMBER. >>> solution() '8739992577' >>> solution(8) '39992577' >>> solution(1) '7' >>> solution(-1) Traceback (most recent call last): ... ValueError: Invalid input >>> solution(8.3) Traceback (most recent call last): ... ValueError: Invalid input >>> solution("a") Traceback (most recent call last): ... ValueError: Invalid input """ if not isinstance(n, int) or n < 0: raise ValueError("Invalid input") modulus = 10**n number = 28433 * (pow(2, 7830457, modulus)) + 1 return str(number % modulus) if __name__ == "__main__": from doctest import testmod testmod() print(f"{solution(10) = }") ================================================ FILE: project_euler/problem_099/__init__.py ================================================ ================================================ FILE: project_euler/problem_099/base_exp.txt ================================================ 519432,525806 632382,518061 78864,613712 466580,530130 780495,510032 525895,525320 15991,714883 960290,502358 760018,511029 166800,575487 210884,564478 555151,523163 681146,515199 563395,522587 738250,512126 923525,503780 595148,520429 177108,572629 750923,511482 440902,532446 881418,505504 422489,534197 979858,501616 685893,514935 747477,511661 167214,575367 234140,559696 940238,503122 728969,512609 232083,560102 900971,504694 688801,514772 189664,569402 891022,505104 445689,531996 119570,591871 821453,508118 371084,539600 911745,504251 623655,518600 144361,582486 352442,541775 420726,534367 295298,549387 6530,787777 468397,529976 672336,515696 431861,533289 84228,610150 805376,508857 444409,532117 33833,663511 381850,538396 402931,536157 92901,604930 304825,548004 731917,512452 753734,511344 51894,637373 151578,580103 295075,549421 303590,548183 333594,544123 683952,515042 60090,628880 951420,502692 28335,674991 714940,513349 343858,542826 549279,523586 804571,508887 260653,554881 291399,549966 402342,536213 408889,535550 40328,652524 375856,539061 768907,510590 165993,575715 976327,501755 898500,504795 360404,540830 478714,529095 694144,514472 488726,528258 841380,507226 328012,544839 22389,690868 604053,519852 329514,544641 772965,510390 492798,527927 30125,670983 895603,504906 450785,531539 840237,507276 380711,538522 63577,625673 76801,615157 502694,527123 597706,520257 310484,547206 944468,502959 121283,591152 451131,531507 566499,522367 425373,533918 40240,652665 39130,654392 714926,513355 469219,529903 806929,508783 287970,550487 92189,605332 103841,599094 671839,515725 452048,531421 987837,501323 935192,503321 88585,607450 613883,519216 144551,582413 647359,517155 213902,563816 184120,570789 258126,555322 502546,527130 407655,535678 401528,536306 477490,529193 841085,507237 732831,512408 833000,507595 904694,504542 581435,521348 455545,531110 873558,505829 94916,603796 720176,513068 545034,523891 246348,557409 556452,523079 832015,507634 173663,573564 502634,527125 250732,556611 569786,522139 216919,563178 521815,525623 92304,605270 164446,576167 753413,511364 11410,740712 448845,531712 925072,503725 564888,522477 7062,780812 641155,517535 738878,512100 636204,517828 372540,539436 443162,532237 571192,522042 655350,516680 299741,548735 581914,521307 965471,502156 513441,526277 808682,508700 237589,559034 543300,524025 804712,508889 247511,557192 543486,524008 504383,526992 326529,545039 792493,509458 86033,609017 126554,589005 579379,521481 948026,502823 404777,535969 265767,554022 266876,553840 46631,643714 492397,527958 856106,506581 795757,509305 748946,511584 294694,549480 409781,535463 775887,510253 543747,523991 210592,564536 517119,525990 520253,525751 247926,557124 592141,520626 346580,542492 544969,523902 506501,526817 244520,557738 144745,582349 69274,620858 292620,549784 926027,503687 736320,512225 515528,526113 407549,535688 848089,506927 24141,685711 9224,757964 980684,501586 175259,573121 489160,528216 878970,505604 969546,502002 525207,525365 690461,514675 156510,578551 659778,516426 468739,529945 765252,510770 76703,615230 165151,575959 29779,671736 928865,503569 577538,521605 927555,503618 185377,570477 974756,501809 800130,509093 217016,563153 365709,540216 774508,510320 588716,520851 631673,518104 954076,502590 777828,510161 990659,501222 597799,520254 786905,509727 512547,526348 756449,511212 869787,505988 653747,516779 84623,609900 839698,507295 30159,670909 797275,509234 678136,515373 897144,504851 989554,501263 413292,535106 55297,633667 788650,509637 486748,528417 150724,580377 56434,632490 77207,614869 588631,520859 611619,519367 100006,601055 528924,525093 190225,569257 851155,506789 682593,515114 613043,519275 514673,526183 877634,505655 878905,505602 1926,914951 613245,519259 152481,579816 841774,507203 71060,619442 865335,506175 90244,606469 302156,548388 399059,536557 478465,529113 558601,522925 69132,620966 267663,553700 988276,501310 378354,538787 529909,525014 161733,576968 758541,511109 823425,508024 149821,580667 269258,553438 481152,528891 120871,591322 972322,501901 981350,501567 676129,515483 950860,502717 119000,592114 392252,537272 191618,568919 946699,502874 289555,550247 799322,509139 703886,513942 194812,568143 261823,554685 203052,566221 217330,563093 734748,512313 391759,537328 807052,508777 564467,522510 59186,629748 113447,594545 518063,525916 905944,504492 613922,519213 439093,532607 445946,531981 230530,560399 297887,549007 459029,530797 403692,536075 855118,506616 963127,502245 841711,507208 407411,535699 924729,503735 914823,504132 333725,544101 176345,572832 912507,504225 411273,535308 259774,555036 632853,518038 119723,591801 163902,576321 22691,689944 402427,536212 175769,572988 837260,507402 603432,519893 313679,546767 538165,524394 549026,523608 61083,627945 898345,504798 992556,501153 369999,539727 32847,665404 891292,505088 152715,579732 824104,507997 234057,559711 730507,512532 960529,502340 388395,537687 958170,502437 57105,631806 186025,570311 993043,501133 576770,521664 215319,563513 927342,503628 521353,525666 39563,653705 752516,511408 110755,595770 309749,547305 374379,539224 919184,503952 990652,501226 647780,517135 187177,570017 168938,574877 649558,517023 278126,552016 162039,576868 658512,516499 498115,527486 896583,504868 561170,522740 747772,511647 775093,510294 652081,516882 724905,512824 499707,527365 47388,642755 646668,517204 571700,522007 180430,571747 710015,513617 435522,532941 98137,602041 759176,511070 486124,528467 526942,525236 878921,505604 408313,535602 926980,503640 882353,505459 566887,522345 3326,853312 911981,504248 416309,534800 392991,537199 622829,518651 148647,581055 496483,527624 666314,516044 48562,641293 672618,515684 443676,532187 274065,552661 265386,554079 347668,542358 31816,667448 181575,571446 961289,502320 365689,540214 987950,501317 932299,503440 27388,677243 746701,511701 492258,527969 147823,581323 57918,630985 838849,507333 678038,515375 27852,676130 850241,506828 818403,508253 131717,587014 850216,506834 904848,504529 189758,569380 392845,537217 470876,529761 925353,503711 285431,550877 454098,531234 823910,508003 318493,546112 766067,510730 261277,554775 421530,534289 694130,514478 120439,591498 213308,563949 854063,506662 365255,540263 165437,575872 662240,516281 289970,550181 847977,506933 546083,523816 413252,535113 975829,501767 361540,540701 235522,559435 224643,561577 736350,512229 328303,544808 35022,661330 307838,547578 474366,529458 873755,505819 73978,617220 827387,507845 670830,515791 326511,545034 309909,547285 400970,536363 884827,505352 718307,513175 28462,674699 599384,520150 253565,556111 284009,551093 343403,542876 446557,531921 992372,501160 961601,502308 696629,514342 919537,503945 894709,504944 892201,505051 358160,541097 448503,531745 832156,507636 920045,503924 926137,503675 416754,534757 254422,555966 92498,605151 826833,507873 660716,516371 689335,514746 160045,577467 814642,508425 969939,501993 242856,558047 76302,615517 472083,529653 587101,520964 99066,601543 498005,527503 709800,513624 708000,513716 20171,698134 285020,550936 266564,553891 981563,501557 846502,506991 334,1190800 209268,564829 9844,752610 996519,501007 410059,535426 432931,533188 848012,506929 966803,502110 983434,501486 160700,577267 504374,526989 832061,507640 392825,537214 443842,532165 440352,532492 745125,511776 13718,726392 661753,516312 70500,619875 436952,532814 424724,533973 21954,692224 262490,554567 716622,513264 907584,504425 60086,628882 837123,507412 971345,501940 947162,502855 139920,584021 68330,621624 666452,516038 731446,512481 953350,502619 183157,571042 845400,507045 651548,516910 20399,697344 861779,506331 629771,518229 801706,509026 189207,569512 737501,512168 719272,513115 479285,529045 136046,585401 896746,504860 891735,505067 684771,514999 865309,506184 379066,538702 503117,527090 621780,518717 209518,564775 677135,515423 987500,501340 197049,567613 329315,544673 236756,559196 357092,541226 520440,525733 213471,563911 956852,502490 702223,514032 404943,535955 178880,572152 689477,514734 691351,514630 866669,506128 370561,539656 739805,512051 71060,619441 624861,518534 261660,554714 366137,540160 166054,575698 601878,519990 153445,579501 279899,551729 379166,538691 423209,534125 675310,515526 145641,582050 691353,514627 917468,504026 284778,550976 81040,612235 161699,576978 616394,519057 767490,510661 156896,578431 427408,533714 254849,555884 737217,512182 897133,504851 203815,566051 270822,553189 135854,585475 778805,510111 784373,509847 305426,547921 733418,512375 732087,512448 540668,524215 702898,513996 628057,518328 640280,517587 422405,534204 10604,746569 746038,511733 839808,507293 457417,530938 479030,529064 341758,543090 620223,518824 251661,556451 561790,522696 497733,527521 724201,512863 489217,528217 415623,534867 624610,518548 847541,506953 432295,533249 400391,536421 961158,502319 139173,584284 421225,534315 579083,521501 74274,617000 701142,514087 374465,539219 217814,562985 358972,540995 88629,607424 288597,550389 285819,550812 538400,524385 809930,508645 738326,512126 955461,502535 163829,576343 826475,507891 376488,538987 102234,599905 114650,594002 52815,636341 434037,533082 804744,508880 98385,601905 856620,506559 220057,562517 844734,507078 150677,580387 558697,522917 621751,518719 207067,565321 135297,585677 932968,503404 604456,519822 579728,521462 244138,557813 706487,513800 711627,513523 853833,506674 497220,527562 59428,629511 564845,522486 623621,518603 242689,558077 125091,589591 363819,540432 686453,514901 656813,516594 489901,528155 386380,537905 542819,524052 243987,557841 693412,514514 488484,528271 896331,504881 336730,543721 728298,512647 604215,519840 153729,579413 595687,520398 540360,524240 245779,557511 924873,503730 509628,526577 528523,525122 3509,847707 522756,525555 895447,504922 44840,646067 45860,644715 463487,530404 398164,536654 894483,504959 619415,518874 966306,502129 990922,501212 835756,507474 548881,523618 453578,531282 474993,529410 80085,612879 737091,512193 50789,638638 979768,501620 792018,509483 665001,516122 86552,608694 462772,530469 589233,520821 891694,505072 592605,520594 209645,564741 42531,649269 554376,523226 803814,508929 334157,544042 175836,572970 868379,506051 658166,516520 278203,551995 966198,502126 627162,518387 296774,549165 311803,547027 843797,507118 702304,514032 563875,522553 33103,664910 191932,568841 543514,524006 506835,526794 868368,506052 847025,506971 678623,515342 876139,505726 571997,521984 598632,520198 213590,563892 625404,518497 726508,512738 689426,514738 332495,544264 411366,535302 242546,558110 315209,546555 797544,509219 93889,604371 858879,506454 124906,589666 449072,531693 235960,559345 642403,517454 720567,513047 705534,513858 603692,519870 488137,528302 157370,578285 63515,625730 666326,516041 619226,518883 443613,532186 597717,520257 96225,603069 86940,608450 40725,651929 460976,530625 268875,553508 270671,553214 363254,540500 384248,538137 762889,510892 377941,538833 278878,551890 176615,572755 860008,506412 944392,502967 608395,519571 225283,561450 45095,645728 333798,544090 625733,518476 995584,501037 506135,526853 238050,558952 557943,522972 530978,524938 634244,517949 177168,572616 85200,609541 953043,502630 523661,525484 999295,500902 840803,507246 961490,502312 471747,529685 380705,538523 911180,504275 334149,544046 478992,529065 325789,545133 335884,543826 426976,533760 749007,511582 667067,516000 607586,519623 674054,515599 188534,569675 565185,522464 172090,573988 87592,608052 907432,504424 8912,760841 928318,503590 757917,511138 718693,513153 315141,546566 728326,512645 353492,541647 638429,517695 628892,518280 877286,505672 620895,518778 385878,537959 423311,534113 633501,517997 884833,505360 883402,505416 999665,500894 708395,513697 548142,523667 756491,511205 987352,501340 766520,510705 591775,520647 833758,507563 843890,507108 925551,503698 74816,616598 646942,517187 354923,541481 256291,555638 634470,517942 930904,503494 134221,586071 282663,551304 986070,501394 123636,590176 123678,590164 481717,528841 423076,534137 866246,506145 93313,604697 783632,509880 317066,546304 502977,527103 141272,583545 71708,618938 617748,518975 581190,521362 193824,568382 682368,515131 352956,541712 351375,541905 505362,526909 905165,504518 128645,588188 267143,553787 158409,577965 482776,528754 628896,518282 485233,528547 563606,522574 111001,595655 115920,593445 365510,540237 959724,502374 938763,503184 930044,503520 970959,501956 913658,504176 68117,621790 989729,501253 567697,522288 820427,508163 54236,634794 291557,549938 124961,589646 403177,536130 405421,535899 410233,535417 815111,508403 213176,563974 83099,610879 998588,500934 513640,526263 129817,587733 1820,921851 287584,550539 299160,548820 860621,506386 529258,525059 586297,521017 953406,502616 441234,532410 986217,501386 781938,509957 461247,530595 735424,512277 146623,581722 839838,507288 510667,526494 935085,503327 737523,512167 303455,548204 992779,501145 60240,628739 939095,503174 794368,509370 501825,527189 459028,530798 884641,505363 512287,526364 835165,507499 307723,547590 160587,577304 735043,512300 493289,527887 110717,595785 306480,547772 318593,546089 179810,571911 200531,566799 314999,546580 197020,567622 301465,548487 237808,559000 131944,586923 882527,505449 468117,530003 711319,513541 156240,578628 965452,502162 992756,501148 437959,532715 739938,512046 614249,519196 391496,537356 62746,626418 688215,514806 75501,616091 883573,505412 558824,522910 759371,511061 173913,573489 891351,505089 727464,512693 164833,576051 812317,508529 540320,524243 698061,514257 69149,620952 471673,529694 159092,577753 428134,533653 89997,606608 711061,513557 779403,510081 203327,566155 798176,509187 667688,515963 636120,517833 137410,584913 217615,563034 556887,523038 667229,515991 672276,515708 325361,545187 172115,573985 13846,725685 ================================================ FILE: project_euler/problem_099/sol1.py ================================================ """ Problem: Comparing two numbers written in index form like 2'11 and 3'7 is not difficult, as any calculator would confirm that 2^11 = 2048 < 3^7 = 2187. However, confirming that 632382^518061 > 519432^525806 would be much more difficult, as both numbers contain over three million digits. Using base_exp.txt, a 22K text file containing one thousand lines with a base/exponent pair on each line, determine which line number has the greatest numerical value. NOTE: The first two lines in the file represent the numbers in the example given above. """ import os from math import log10 def solution(data_file: str = "base_exp.txt") -> int: """ >>> solution() 709 """ largest: float = 0 result = 0 for i, line in enumerate(open(os.path.join(os.path.dirname(__file__), data_file))): a, x = list(map(int, line.split(","))) if x * log10(a) > largest: largest = x * log10(a) result = i + 1 return result if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_100/__init__.py ================================================ ================================================ FILE: project_euler/problem_100/sol1.py ================================================ """ Project Euler Problem 100: https://projecteuler.net/problem=100 If a box contains twenty-one coloured discs, composed of fifteen blue discs and six red discs, and two discs were taken at random, it can be seen that the probability of taking two blue discs, P(BB) = (15/21) x (14/20) = 1/2. The next such arrangement, for which there is exactly 50% chance of taking two blue discs at random, is a box containing eighty-five blue discs and thirty-five red discs. By finding the first arrangement to contain over 10^12 = 1,000,000,000,000 discs in total, determine the number of blue discs that the box would contain. """ def solution(min_total: int = 10**12) -> int: """ Returns the number of blue discs for the first arrangement to contain over min_total discs in total >>> solution(2) 3 >>> solution(4) 15 >>> solution(21) 85 """ prev_numerator = 1 prev_denominator = 0 numerator = 1 denominator = 1 while numerator <= 2 * min_total - 1: prev_numerator += 2 * numerator numerator += 2 * prev_numerator prev_denominator += 2 * denominator denominator += 2 * prev_denominator return (denominator + 1) // 2 if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_101/__init__.py ================================================ ================================================ FILE: project_euler/problem_101/sol1.py ================================================ """ If we are presented with the first k terms of a sequence it is impossible to say with certainty the value of the next term, as there are infinitely many polynomial functions that can model the sequence. As an example, let us consider the sequence of cube numbers. This is defined by the generating function, u(n) = n3: 1, 8, 27, 64, 125, 216, ... Suppose we were only given the first two terms of this sequence. Working on the principle that "simple is best" we should assume a linear relationship and predict the next term to be 15 (common difference 7). Even if we were presented with the first three terms, by the same principle of simplicity, a quadratic relationship should be assumed. We shall define OP(k, n) to be the nth term of the optimum polynomial generating function for the first k terms of a sequence. It should be clear that OP(k, n) will accurately generate the terms of the sequence for n ≤ k, and potentially the first incorrect term (FIT) will be OP(k, k+1); in which case we shall call it a bad OP (BOP). As a basis, if we were only given the first term of sequence, it would be most sensible to assume constancy; that is, for n ≥ 2, OP(1, n) = u(1). Hence we obtain the following OPs for the cubic sequence: OP(1, n) = 1 1, 1, 1, 1, ... OP(2, n) = 7n-6 1, 8, 15, ... OP(3, n) = 6n^2-11n+6 1, 8, 27, 58, ... OP(4, n) = n^3 1, 8, 27, 64, 125, ... Clearly no BOPs exist for k ≥ 4. By considering the sum of FITs generated by the BOPs (indicated in red above), we obtain 1 + 15 + 58 = 74. Consider the following tenth degree polynomial generating function: 1 - n + n^2 - n^3 + n^4 - n^5 + n^6 - n^7 + n^8 - n^9 + n^10 Find the sum of FITs for the BOPs. """ from __future__ import annotations from collections.abc import Callable Matrix = list[list[float | int]] def solve(matrix: Matrix, vector: Matrix) -> Matrix: """ Solve the linear system of equations Ax = b (A = "matrix", b = "vector") for x using Gaussian elimination and back substitution. We assume that A is an invertible square matrix and that b is a column vector of the same height. >>> solve([[1, 0], [0, 1]], [[1],[2]]) [[1.0], [2.0]] >>> solve([[2, 1, -1],[-3, -1, 2],[-2, 1, 2]],[[8], [-11],[-3]]) [[2.0], [3.0], [-1.0]] """ size: int = len(matrix) augmented: Matrix = [[0 for _ in range(size + 1)] for _ in range(size)] row: int row2: int col: int col2: int pivot_row: int ratio: float for row in range(size): for col in range(size): augmented[row][col] = matrix[row][col] augmented[row][size] = vector[row][0] row = 0 col = 0 while row < size and col < size: # pivoting pivot_row = max((abs(augmented[row2][col]), row2) for row2 in range(col, size))[ 1 ] if augmented[pivot_row][col] == 0: col += 1 continue else: augmented[row], augmented[pivot_row] = augmented[pivot_row], augmented[row] for row2 in range(row + 1, size): ratio = augmented[row2][col] / augmented[row][col] augmented[row2][col] = 0 for col2 in range(col + 1, size + 1): augmented[row2][col2] -= augmented[row][col2] * ratio row += 1 col += 1 # back substitution for col in range(1, size): for row in range(col): ratio = augmented[row][col] / augmented[col][col] for col2 in range(col, size + 1): augmented[row][col2] -= augmented[col][col2] * ratio # round to get rid of numbers like 2.000000000000004 return [ [round(augmented[row][size] / augmented[row][row], 10)] for row in range(size) ] def interpolate(y_list: list[int]) -> Callable[[int], int]: """ Given a list of data points (1,y0),(2,y1), ..., return a function that interpolates the data points. We find the coefficients of the interpolating polynomial by solving a system of linear equations corresponding to x = 1, 2, 3... >>> interpolate([1])(3) 1 >>> interpolate([1, 8])(3) 15 >>> interpolate([1, 8, 27])(4) 58 >>> interpolate([1, 8, 27, 64])(6) 216 """ size: int = len(y_list) matrix: Matrix = [[0 for _ in range(size)] for _ in range(size)] vector: Matrix = [[0] for _ in range(size)] coeffs: Matrix x_val: int y_val: int col: int for x_val, y_val in enumerate(y_list): for col in range(size): matrix[x_val][col] = (x_val + 1) ** (size - col - 1) vector[x_val][0] = y_val coeffs = solve(matrix, vector) def interpolated_func(var: int) -> int: """ >>> interpolate([1])(3) 1 >>> interpolate([1, 8])(3) 15 >>> interpolate([1, 8, 27])(4) 58 >>> interpolate([1, 8, 27, 64])(6) 216 """ return sum( round(coeffs[x_val][0]) * (var ** (size - x_val - 1)) for x_val in range(size) ) return interpolated_func def question_function(variable: int) -> int: """ The generating function u as specified in the question. >>> question_function(0) 1 >>> question_function(1) 1 >>> question_function(5) 8138021 >>> question_function(10) 9090909091 """ return ( 1 - variable + variable**2 - variable**3 + variable**4 - variable**5 + variable**6 - variable**7 + variable**8 - variable**9 + variable**10 ) def solution(func: Callable[[int], int] = question_function, order: int = 10) -> int: """ Find the sum of the FITs of the BOPS. For each interpolating polynomial of order 1, 2, ... , 10, find the first x such that the value of the polynomial at x does not equal u(x). >>> solution(lambda n: n ** 3, 3) 74 """ data_points: list[int] = [func(x_val) for x_val in range(1, order + 1)] polynomials: list[Callable[[int], int]] = [ interpolate(data_points[:max_coeff]) for max_coeff in range(1, order + 1) ] ret: int = 0 poly: Callable[[int], int] x_val: int for poly in polynomials: x_val = 1 while func(x_val) == poly(x_val): x_val += 1 ret += poly(x_val) return ret if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_102/__init__.py ================================================ ================================================ FILE: project_euler/problem_102/p102_triangles.txt ================================================ -340,495,-153,-910,835,-947 -175,41,-421,-714,574,-645 -547,712,-352,579,951,-786 419,-864,-83,650,-399,171 -429,-89,-357,-930,296,-29 -734,-702,823,-745,-684,-62 -971,762,925,-776,-663,-157 162,570,628,485,-807,-896 641,91,-65,700,887,759 215,-496,46,-931,422,-30 -119,359,668,-609,-358,-494 440,929,968,214,760,-857 -700,785,838,29,-216,411 -770,-458,-325,-53,-505,633 -752,-805,349,776,-799,687 323,5,561,-36,919,-560 -907,358,264,320,204,274 -728,-466,350,969,292,-345 940,836,272,-533,748,185 411,998,813,520,316,-949 -152,326,658,-762,148,-651 330,507,-9,-628,101,174 551,-496,772,-541,-702,-45 -164,-489,-90,322,631,-59 673,366,-4,-143,-606,-704 428,-609,801,-449,740,-269 453,-924,-785,-346,-853,111 -738,555,-181,467,-426,-20 958,-692,784,-343,505,-569 620,27,263,54,-439,-726 804,87,998,859,871,-78 -119,-453,-709,-292,-115,-56 -626,138,-940,-476,-177,-274 -11,160,142,588,446,158 538,727,550,787,330,810 420,-689,854,-546,337,516 872,-998,-607,748,473,-192 653,440,-516,-985,808,-857 374,-158,331,-940,-338,-641 137,-925,-179,771,734,-715 -314,198,-115,29,-641,-39 759,-574,-385,355,590,-603 -189,-63,-168,204,289,305 -182,-524,-715,-621,911,-255 331,-816,-833,471,168,126 -514,581,-855,-220,-731,-507 129,169,576,651,-87,-458 783,-444,-881,658,-266,298 603,-430,-598,585,368,899 43,-724,962,-376,851,409 -610,-646,-883,-261,-482,-881 -117,-237,978,641,101,-747 579,125,-715,-712,208,534 672,-214,-762,372,874,533 -564,965,38,715,367,242 500,951,-700,-981,-61,-178 -382,-224,-959,903,-282,-60 -355,295,426,-331,-591,655 892,128,958,-271,-993,274 -454,-619,302,138,-790,-874 -642,601,-574,159,-290,-318 266,-109,257,-686,54,975 162,628,-478,840,264,-266 466,-280,982,1,904,-810 721,839,730,-807,777,981 -129,-430,748,263,943,96 434,-94,410,-990,249,-704 237,42,122,-732,44,-51 909,-116,-229,545,292,717 824,-768,-807,-370,-262,30 675,58,332,-890,-651,791 363,825,-717,254,684,240 405,-715,900,166,-589,422 -476,686,-830,-319,634,-807 633,837,-971,917,-764,207 -116,-44,-193,-70,908,809 -26,-252,998,408,70,-713 -601,645,-462,842,-644,-591 -160,653,274,113,-138,687 369,-273,-181,925,-167,-693 -338,135,480,-967,-13,-840 -90,-270,-564,695,161,907 607,-430,869,-713,461,-469 919,-165,-776,522,606,-708 -203,465,288,207,-339,-458 -453,-534,-715,975,838,-677 -973,310,-350,934,546,-805 -835,385,708,-337,-594,-772 -14,914,900,-495,-627,594 833,-713,-213,578,-296,699 -27,-748,484,455,915,291 270,889,739,-57,442,-516 119,811,-679,905,184,130 -678,-469,925,553,612,482 101,-571,-732,-842,644,588 -71,-737,566,616,957,-663 -634,-356,90,-207,936,622 598,443,964,-895,-58,529 847,-467,929,-742,91,10 -633,829,-780,-408,222,-30 -818,57,275,-38,-746,198 -722,-825,-549,597,-391,99 -570,908,430,873,-103,-360 342,-681,512,434,542,-528 297,850,479,609,543,-357 9,784,212,548,56,859 -152,560,-240,-969,-18,713 140,-133,34,-635,250,-163 -272,-22,-169,-662,989,-604 471,-765,355,633,-742,-118 -118,146,942,663,547,-376 583,16,162,264,715,-33 -230,-446,997,-838,561,555 372,397,-729,-318,-276,649 92,982,-970,-390,-922,922 -981,713,-951,-337,-669,670 -999,846,-831,-504,7,-128 455,-954,-370,682,-510,45 822,-960,-892,-385,-662,314 -668,-686,-367,-246,530,-341 -723,-720,-926,-836,-142,757 -509,-134,384,-221,-873,-639 -803,-52,-706,-669,373,-339 933,578,631,-616,770,555 741,-564,-33,-605,-576,275 -715,445,-233,-730,734,-704 120,-10,-266,-685,-490,-17 -232,-326,-457,-946,-457,-116 811,52,639,826,-200,147 -329,279,293,612,943,955 -721,-894,-393,-969,-642,453 -688,-826,-352,-75,371,79 -809,-979,407,497,858,-248 -485,-232,-242,-582,-81,849 141,-106,123,-152,806,-596 -428,57,-992,811,-192,478 864,393,122,858,255,-876 -284,-780,240,457,354,-107 956,605,-477,44,26,-678 86,710,-533,-815,439,327 -906,-626,-834,763,426,-48 201,-150,-904,652,475,412 -247,149,81,-199,-531,-148 923,-76,-353,175,-121,-223 427,-674,453,472,-410,585 931,776,-33,85,-962,-865 -655,-908,-902,208,869,792 -316,-102,-45,-436,-222,885 -309,768,-574,653,745,-975 896,27,-226,993,332,198 323,655,-89,260,240,-902 501,-763,-424,793,813,616 993,375,-938,-621,672,-70 -880,-466,-283,770,-824,143 63,-283,886,-142,879,-116 -964,-50,-521,-42,-306,-161 724,-22,866,-871,933,-383 -344,135,282,966,-80,917 -281,-189,420,810,362,-582 -515,455,-588,814,162,332 555,-436,-123,-210,869,-943 589,577,232,286,-554,876 -773,127,-58,-171,-452,125 -428,575,906,-232,-10,-224 437,276,-335,-348,605,878 -964,511,-386,-407,168,-220 307,513,912,-463,-423,-416 -445,539,273,886,-18,760 -396,-585,-670,414,47,364 143,-506,754,906,-971,-203 -544,472,-180,-541,869,-465 -779,-15,-396,890,972,-220 -430,-564,503,182,-119,456 89,-10,-739,399,506,499 954,162,-810,-973,127,870 890,952,-225,158,828,237 -868,952,349,465,574,750 -915,369,-975,-596,-395,-134 -135,-601,575,582,-667,640 413,890,-560,-276,-555,-562 -633,-269,561,-820,-624,499 371,-92,-784,-593,864,-717 -971,655,-439,367,754,-951 172,-347,36,279,-247,-402 633,-301,364,-349,-683,-387 -780,-211,-713,-948,-648,543 72,58,762,-465,-66,462 78,502,781,-832,713,836 -431,-64,-484,-392,208,-343 -64,101,-29,-860,-329,844 398,391,828,-858,700,395 578,-896,-326,-604,314,180 97,-321,-695,185,-357,852 854,839,283,-375,951,-209 194,96,-564,-847,162,524 -354,532,494,621,580,560 419,-678,-450,926,-5,-924 -661,905,519,621,-143,394 -573,268,296,-562,-291,-319 -211,266,-196,158,564,-183 18,-585,-398,777,-581,864 790,-894,-745,-604,-418,70 848,-339,150,773,11,851 -954,-809,-53,-20,-648,-304 658,-336,-658,-905,853,407 -365,-844,350,-625,852,-358 986,-315,-230,-159,21,180 -15,599,45,-286,-941,847 -613,-68,184,639,-987,550 334,675,-56,-861,923,340 -848,-596,960,231,-28,-34 707,-811,-994,-356,-167,-171 -470,-764,72,576,-600,-204 379,189,-542,-576,585,800 440,540,-445,-563,379,-334 -155,64,514,-288,853,106 -304,751,481,-520,-708,-694 -709,132,594,126,-844,63 723,471,421,-138,-962,892 -440,-263,39,513,-672,-954 775,809,-581,330,752,-107 -376,-158,335,-708,-514,578 -343,-769,456,-187,25,413 548,-877,-172,300,-500,928 938,-102,423,-488,-378,-969 -36,564,-55,131,958,-800 -322,511,-413,503,700,-847 -966,547,-88,-17,-359,-67 637,-341,-437,-181,527,-153 -74,449,-28,3,485,189 -997,658,-224,-948,702,-807 -224,736,-896,127,-945,-850 -395,-106,439,-553,-128,124 -841,-445,-758,-572,-489,212 633,-327,13,-512,952,771 -940,-171,-6,-46,-923,-425 -142,-442,-817,-998,843,-695 340,847,-137,-920,-988,-658 -653,217,-679,-257,651,-719 -294,365,-41,342,74,-892 690,-236,-541,494,408,-516 180,-807,225,790,494,59 707,605,-246,656,284,271 65,294,152,824,442,-442 -321,781,-540,341,316,415 420,371,-2,545,995,248 56,-191,-604,971,615,449 -981,-31,510,592,-390,-362 -317,-968,913,365,97,508 832,63,-864,-510,86,202 -483,456,-636,340,-310,676 981,-847,751,-508,-962,-31 -157,99,73,797,63,-172 220,858,872,924,866,-381 996,-169,805,321,-164,971 896,11,-625,-973,-782,76 578,-280,730,-729,307,-905 -580,-749,719,-698,967,603 -821,874,-103,-623,662,-491 -763,117,661,-644,672,-607 592,787,-798,-169,-298,690 296,644,-526,-762,-447,665 534,-818,852,-120,57,-379 -986,-549,-329,294,954,258 -133,352,-660,-77,904,-356 748,343,215,500,317,-277 311,7,910,-896,-809,795 763,-602,-753,313,-352,917 668,619,-474,-597,-650,650 -297,563,-701,-987,486,-902 -461,-740,-657,233,-482,-328 -446,-250,-986,-458,-629,520 542,-49,-327,-469,257,-947 121,-575,-634,-143,-184,521 30,504,455,-645,-229,-945 -12,-295,377,764,771,125 -686,-133,225,-25,-376,-143 -6,-46,338,270,-405,-872 -623,-37,582,467,963,898 -804,869,-477,420,-475,-303 94,41,-842,-193,-768,720 -656,-918,415,645,-357,460 -47,-486,-911,468,-608,-686 -158,251,419,-394,-655,-895 272,-695,979,508,-358,959 -776,650,-918,-467,-690,-534 -85,-309,-626,167,-366,-429 -880,-732,-186,-924,970,-875 517,645,-274,962,-804,544 721,402,104,640,478,-499 198,684,-134,-723,-452,-905 -245,745,239,238,-826,441 -217,206,-32,462,-981,-895 -51,989,526,-173,560,-676 -480,-659,-976,-580,-727,466 -996,-90,-995,158,-239,642 302,288,-194,-294,17,924 -943,969,-326,114,-500,103 -619,163,339,-880,230,421 -344,-601,-795,557,565,-779 590,345,-129,-202,-125,-58 -777,-195,159,674,775,411 -939,312,-665,810,121,855 -971,254,712,815,452,581 442,-9,327,-750,61,757 -342,869,869,-160,390,-772 620,601,565,-169,-69,-183 -25,924,-817,964,321,-970 -64,-6,-133,978,825,-379 601,436,-24,98,-115,940 -97,502,614,-574,922,513 -125,262,-946,695,99,-220 429,-721,719,-694,197,-558 326,689,-70,-908,-673,338 -468,-856,-902,-254,-358,305 -358,530,542,355,-253,-47 -438,-74,-362,963,988,788 137,717,467,622,319,-380 -86,310,-336,851,918,-288 721,395,646,-53,255,-425 255,175,912,84,-209,878 -632,-485,-400,-357,991,-608 235,-559,992,-297,857,-591 87,-71,148,130,647,578 -290,-584,-639,-788,-21,592 386,984,625,-731,-993,-336 -538,634,-209,-828,-150,-774 -754,-387,607,-781,976,-199 412,-798,-664,295,709,-537 -412,932,-880,-232,561,852 -656,-358,-198,-964,-433,-848 -762,-668,-632,186,-673,-11 -876,237,-282,-312,-83,682 403,73,-57,-436,-622,781 -587,873,798,976,-39,329 -369,-622,553,-341,817,794 -108,-616,920,-849,-679,96 290,-974,234,239,-284,-321 -22,394,-417,-419,264,58 -473,-551,69,923,591,-228 -956,662,-113,851,-581,-794 -258,-681,413,-471,-637,-817 -866,926,992,-653,-7,794 556,-350,602,917,831,-610 188,245,-906,361,492,174 -720,384,-818,329,638,-666 -246,846,890,-325,-59,-850 -118,-509,620,-762,-256,15 -787,-536,-452,-338,-399,813 458,560,525,-311,-608,-419 494,-811,-825,-127,-812,894 -801,890,-629,-860,574,925 -709,-193,-213,138,-410,-403 861,91,708,-187,5,-222 789,646,777,154,90,-49 -267,-830,-114,531,591,-698 -126,-82,881,-418,82,652 -894,130,-726,-935,393,-815 -142,563,654,638,-712,-597 -759,60,-23,977,100,-765 -305,595,-570,-809,482,762 -161,-267,53,963,998,-529 -300,-57,798,353,703,486 -990,696,-764,699,-565,719 -232,-205,566,571,977,369 740,865,151,-817,-204,-293 94,445,-768,229,537,-406 861,620,37,-424,-36,656 390,-369,952,733,-464,569 -482,-604,959,554,-705,-626 -396,-615,-991,108,272,-723 143,780,535,142,-917,-147 138,-629,-217,-908,905,115 915,103,-852,64,-468,-642 570,734,-785,-268,-326,-759 738,531,-332,586,-779,24 870,440,-217,473,-383,415 -296,-333,-330,-142,-924,950 118,120,-35,-245,-211,-652 61,634,153,-243,838,789 726,-582,210,105,983,537 -313,-323,758,234,29,848 -847,-172,-593,733,-56,617 54,255,-512,156,-575,675 -873,-956,-148,623,95,200 700,-370,926,649,-978,157 -639,-202,719,130,747,222 194,-33,955,943,505,114 -226,-790,28,-930,827,783 -392,-74,-28,714,218,-612 209,626,-888,-683,-912,495 487,751,614,933,631,445 -348,-34,-411,-106,835,321 -689,872,-29,-800,312,-542 -52,566,827,570,-862,-77 471,992,309,-402,389,912 24,520,-83,-51,555,503 -265,-317,283,-970,-472,690 606,526,137,71,-651,150 217,-518,663,66,-605,-331 -562,232,-76,-503,205,-323 842,-521,546,285,625,-186 997,-927,344,909,-546,974 -677,419,81,121,-705,771 719,-379,-944,-797,784,-155 -378,286,-317,-797,-111,964 -288,-573,784,80,-532,-646 -77,407,-248,-797,769,-816 -24,-637,287,-858,-927,-333 -902,37,894,-823,141,684 125,467,-177,-516,686,399 -321,-542,641,-590,527,-224 -400,-712,-876,-208,632,-543 -676,-429,664,-242,-269,922 -608,-273,-141,930,687,380 786,-12,498,494,310,326 -739,-617,606,-960,804,188 384,-368,-243,-350,-459,31 -550,397,320,-868,328,-279 969,-179,853,864,-110,514 910,793,302,-822,-285,488 -605,-128,218,-283,-17,-227 16,324,667,708,750,3 485,-813,19,585,71,930 -218,816,-687,-97,-732,-360 -497,-151,376,-23,3,315 -412,-989,-610,-813,372,964 -878,-280,87,381,-311,69 -609,-90,-731,-679,150,585 889,27,-162,605,75,-770 448,617,-988,0,-103,-504 -800,-537,-69,627,608,-668 534,686,-664,942,830,920 -238,775,495,932,-793,497 -343,958,-914,-514,-691,651 568,-136,208,359,728,28 286,912,-794,683,556,-102 -638,-629,-484,445,-64,-497 58,505,-801,-110,872,632 -390,777,353,267,976,369 -993,515,105,-133,358,-572 964,996,355,-212,-667,38 -725,-614,-35,365,132,-196 237,-536,-416,-302,312,477 -664,574,-210,224,48,-925 869,-261,-256,-240,-3,-698 712,385,32,-34,916,-315 895,-409,-100,-346,728,-624 -806,327,-450,889,-781,-939 -586,-403,698,318,-939,899 557,-57,-920,659,333,-51 -441,232,-918,-205,246,1 783,167,-797,-595,245,-736 -36,-531,-486,-426,-813,-160 777,-843,817,313,-228,-572 735,866,-309,-564,-81,190 -413,645,101,719,-719,218 -83,164,767,796,-430,-459 122,779,-15,-295,-96,-892 462,379,70,548,834,-312 -630,-534,124,187,-737,114 -299,-604,318,-591,936,826 -879,218,-642,-483,-318,-866 -691,62,-658,761,-895,-854 -822,493,687,569,910,-202 -223,784,304,-5,541,925 -914,541,737,-662,-662,-195 -622,615,414,358,881,-878 339,745,-268,-968,-280,-227 -364,855,148,-709,-827,472 -890,-532,-41,664,-612,577 -702,-859,971,-722,-660,-920 -539,-605,737,149,973,-802 800,42,-448,-811,152,511 -933,377,-110,-105,-374,-937 -766,152,482,120,-308,390 -568,775,-292,899,732,890 -177,-317,-502,-259,328,-511 612,-696,-574,-660,132,31 -119,563,-805,-864,179,-672 425,-627,183,-331,839,318 -711,-976,-749,152,-916,261 181,-63,497,211,262,406 -537,700,-859,-765,-928,77 892,832,231,-749,-82,613 816,216,-642,-216,-669,-912 -6,624,-937,-370,-344,268 737,-710,-869,983,-324,-274 565,952,-547,-158,374,-444 51,-683,645,-845,515,636 -953,-631,114,-377,-764,-144 -8,470,-242,-399,-675,-730 -540,689,-20,47,-607,590 -329,-710,-779,942,-388,979 123,829,674,122,203,563 46,782,396,-33,386,610 872,-846,-523,-122,-55,-190 388,-994,-525,974,127,596 781,-680,796,-34,-959,-62 -749,173,200,-384,-745,-446 379,618,136,-250,-224,970 -58,240,-921,-760,-901,-626 366,-185,565,-100,515,688 489,999,-893,-263,-637,816 838,-496,-316,-513,419,479 107,676,-15,882,98,-397 -999,941,-903,-424,670,-325 171,-979,835,178,169,-984 -609,-607,378,-681,184,402 -316,903,-575,-800,224,983 591,-18,-460,551,-167,918 -756,405,-117,441,163,-320 456,24,6,881,-836,-539 -489,-585,915,651,-892,-382 -177,-122,73,-711,-386,591 181,724,530,686,-131,241 737,288,886,216,233,33 -548,-386,-749,-153,-85,-982 -835,227,904,160,-99,25 -9,-42,-162,728,840,-963 217,-763,870,771,47,-846 -595,808,-491,556,337,-900 -134,281,-724,441,-134,708 -789,-508,651,-962,661,315 -839,-923,339,402,41,-487 300,-790,48,703,-398,-811 955,-51,462,-685,960,-717 910,-880,592,-255,-51,-776 -885,169,-793,368,-565,458 -905,940,-492,-630,-535,-988 245,797,763,869,-82,550 -310,38,-933,-367,-650,824 -95,32,-83,337,226,990 -218,-975,-191,-208,-785,-293 -672,-953,517,-901,-247,465 681,-148,261,-857,544,-923 640,341,446,-618,195,769 384,398,-846,365,671,815 578,576,-911,907,762,-859 548,-428,144,-630,-759,-146 710,-73,-700,983,-97,-889 -46,898,-973,-362,-817,-717 151,-81,-125,-900,-478,-154 483,615,-537,-932,181,-68 786,-223,518,25,-306,-12 -422,268,-809,-683,635,468 983,-734,-694,-608,-110,4 -786,-196,749,-354,137,-8 -181,36,668,-200,691,-973 -629,-838,692,-736,437,-871 -208,-536,-159,-596,8,197 -3,370,-686,170,913,-376 44,-998,-149,-993,-200,512 -519,136,859,497,536,434 77,-985,972,-340,-705,-837 -381,947,250,360,344,322 -26,131,699,750,707,384 -914,655,299,193,406,955 -883,-921,220,595,-546,794 -599,577,-569,-404,-704,489 -594,-963,-624,-460,880,-760 -603,88,-99,681,55,-328 976,472,139,-453,-531,-860 192,-290,513,-89,666,432 417,487,575,293,567,-668 655,711,-162,449,-980,972 -505,664,-685,-239,603,-592 -625,-802,-67,996,384,-636 365,-593,522,-666,-200,-431 -868,708,560,-860,-630,-355 -702,785,-637,-611,-597,960 -137,-696,-93,-803,408,406 891,-123,-26,-609,-610,518 133,-832,-198,555,708,-110 791,617,-69,487,696,315 -900,694,-565,517,-269,-416 914,135,-781,600,-71,-600 991,-915,-422,-351,-837,313 -840,-398,-302,21,590,146 62,-558,-702,-384,-625,831 -363,-426,-924,-496,792,-908 73,361,-817,-466,400,922 -626,-164,-626,860,-524,286 255,26,-944,809,-606,986 -457,-256,-103,50,-867,-871 -223,803,196,480,612,136 -820,-928,700,780,-977,721 717,332,53,-933,-128,793 -602,-648,562,593,890,702 -469,-875,-527,911,-475,-222 110,-281,-552,-536,-816,596 -981,654,413,-981,-75,-95 -754,-742,-515,894,-220,-344 795,-52,156,408,-603,76 474,-157,423,-499,-807,-791 260,688,40,-52,702,-122 -584,-517,-390,-881,302,-504 61,797,665,708,14,668 366,166,458,-614,564,-983 72,539,-378,796,381,-824 -485,201,-588,842,736,379 -149,-894,-298,705,-303,-406 660,-935,-580,521,93,633 -382,-282,-375,-841,-828,171 -567,743,-100,43,144,122 -281,-786,-749,-551,296,304 11,-426,-792,212,857,-175 594,143,-699,289,315,137 341,596,-390,107,-631,-804 -751,-636,-424,-854,193,651 -145,384,749,675,-786,517 224,-865,-323,96,-916,258 -309,403,-388,826,35,-270 -942,709,222,158,-699,-103 -589,842,-997,29,-195,-210 264,426,566,145,-217,623 217,965,507,-601,-453,507 -206,307,-982,4,64,-292 676,-49,-38,-701,550,883 5,-850,-438,659,745,-773 933,238,-574,-570,91,-33 -866,121,-928,358,459,-843 -568,-631,-352,-580,-349,189 -737,849,-963,-486,-662,970 135,334,-967,-71,-365,-792 789,21,-227,51,990,-275 240,412,-886,230,591,256 -609,472,-853,-754,959,661 401,521,521,314,929,982 -499,784,-208,71,-302,296 -557,-948,-553,-526,-864,793 270,-626,828,44,37,14 -412,224,617,-593,502,699 41,-908,81,562,-849,163 165,917,761,-197,331,-341 -687,314,799,755,-969,648 -164,25,578,439,-334,-576 213,535,874,-177,-551,24 -689,291,-795,-225,-496,-125 465,461,558,-118,-568,-909 567,660,-810,46,-485,878 -147,606,685,-690,-774,984 568,-886,-43,854,-738,616 -800,386,-614,585,764,-226 -518,23,-225,-732,-79,440 -173,-291,-689,636,642,-447 -598,-16,227,410,496,211 -474,-930,-656,-321,-420,36 -435,165,-819,555,540,144 -969,149,828,568,394,648 65,-848,257,720,-625,-851 981,899,275,635,465,-877 80,290,792,760,-191,-321 -605,-858,594,33,706,593 585,-472,318,-35,354,-927 -365,664,803,581,-965,-814 -427,-238,-480,146,-55,-606 879,-193,250,-890,336,117 -226,-322,-286,-765,-836,-218 -913,564,-667,-698,937,283 872,-901,810,-623,-52,-709 473,171,717,38,-429,-644 225,824,-219,-475,-180,234 -530,-797,-948,238,851,-623 85,975,-363,529,598,28 -799,166,-804,210,-769,851 -687,-158,885,736,-381,-461 447,592,928,-514,-515,-661 -399,-777,-493,80,-544,-78 -884,631,171,-825,-333,551 191,268,-577,676,137,-33 212,-853,709,798,583,-56 -908,-172,-540,-84,-135,-56 303,311,406,-360,-240,811 798,-708,824,59,234,-57 491,693,-74,585,-85,877 509,-65,-936,329,-51,722 -122,858,-52,467,-77,-609 850,760,547,-495,-953,-952 -460,-541,890,910,286,724 -914,843,-579,-983,-387,-460 989,-171,-877,-326,-899,458 846,175,-915,540,-1000,-982 -852,-920,-306,496,530,-18 338,-991,160,85,-455,-661 -186,-311,-460,-563,-231,-414 -932,-302,959,597,793,748 -366,-402,-788,-279,514,53 -940,-956,447,-956,211,-285 564,806,-911,-914,934,754 575,-858,-277,15,409,-714 848,462,100,-381,135,242 330,718,-24,-190,860,-78 479,458,941,108,-866,-653 212,980,962,-962,115,841 -827,-474,-206,881,323,765 506,-45,-30,-293,524,-133 832,-173,547,-852,-561,-842 -397,-661,-708,819,-545,-228 521,51,-489,852,36,-258 227,-164,189,465,-987,-882 -73,-997,641,-995,449,-615 151,-995,-638,415,257,-400 -663,-297,-748,537,-734,198 -585,-401,-81,-782,-80,-105 99,-21,238,-365,-704,-368 45,416,849,-211,-371,-1 -404,-443,795,-406,36,-933 272,-363,981,-491,-380,77 713,-342,-366,-849,643,911 -748,671,-537,813,961,-200 -194,-909,703,-662,-601,188 281,500,724,286,267,197 -832,847,-595,820,-316,637 520,521,-54,261,923,-10 4,-808,-682,-258,441,-695 -793,-107,-969,905,798,446 -108,-739,-590,69,-855,-365 380,-623,-930,817,468,713 759,-849,-236,433,-723,-931 95,-320,-686,124,-69,-329 -655,518,-210,-523,284,-866 144,303,639,70,-171,269 173,-333,947,-304,55,40 274,878,-482,-888,-835,375 -982,-854,-36,-218,-114,-230 905,-979,488,-485,-479,114 877,-157,553,-530,-47,-321 350,664,-881,442,-220,-284 434,-423,-365,878,-726,584 535,909,-517,-447,-660,-141 -966,191,50,353,182,-642 -785,-634,123,-907,-162,511 146,-850,-214,814,-704,25 692,1,521,492,-637,274 -662,-372,-313,597,983,-647 -962,-526,68,-549,-819,231 740,-890,-318,797,-666,948 -190,-12,-468,-455,948,284 16,478,-506,-888,628,-154 272,630,-976,308,433,3 -169,-391,-132,189,302,-388 109,-784,474,-167,-265,-31 -177,-532,283,464,421,-73 650,635,592,-138,1,-387 -932,703,-827,-492,-355,686 586,-311,340,-618,645,-434 -951,736,647,-127,-303,590 188,444,903,718,-931,500 -872,-642,-296,-571,337,241 23,65,152,125,880,470 512,823,-42,217,823,-263 180,-831,-380,886,607,762 722,443,-149,-216,-115,759 -19,660,-36,901,923,231 562,-322,-626,-968,194,-825 204,-920,938,784,362,150 -410,-266,-715,559,-672,124 -198,446,-140,454,-461,-447 83,-346,830,-493,-759,-382 -881,601,581,234,-134,-925 -494,914,-42,899,235,629 -390,50,956,437,774,-700 -514,514,44,-512,-576,-313 63,-688,808,-534,-570,-399 -726,572,-896,102,-294,-28 -688,757,401,406,955,-511 -283,423,-485,480,-767,908 -541,952,-594,116,-854,451 -273,-796,236,625,-626,257 -407,-493,373,826,-309,297 -750,955,-476,641,-809,713 8,415,695,226,-111,2 733,209,152,-920,401,995 921,-103,-919,66,871,-947 -907,89,-869,-214,851,-559 -307,748,524,-755,314,-711 188,897,-72,-763,482,103 545,-821,-232,-596,-334,-754 -217,-788,-820,388,-200,-662 779,160,-723,-975,-142,-998 -978,-519,-78,-981,842,904 -504,-736,-295,21,-472,-482 391,115,-705,574,652,-446 813,-988,865,830,-263,487 194,80,774,-493,-761,-872 -415,-284,-803,7,-810,670 -484,-4,881,-872,55,-852 -379,822,-266,324,-48,748 -304,-278,406,-60,959,-89 404,756,577,-643,-332,658 291,460,125,491,-312,83 311,-734,-141,582,282,-557 -450,-661,-981,710,-177,794 328,264,-787,971,-743,-407 -622,518,993,-241,-738,229 273,-826,-254,-917,-710,-111 809,770,96,368,-818,725 -488,773,502,-342,534,745 -28,-414,236,-315,-484,363 179,-466,-566,713,-683,56 560,-240,-597,619,916,-940 893,473,872,-868,-642,-461 799,489,383,-321,-776,-833 980,490,-508,764,-512,-426 917,961,-16,-675,440,559 -812,212,784,-987,-132,554 -886,454,747,806,190,231 910,341,21,-66,708,725 29,929,-831,-494,-303,389 -103,492,-271,-174,-515,529 -292,119,419,788,247,-951 483,543,-347,-673,664,-549 -926,-871,-437,337,162,-877 299,472,-771,5,-88,-643 -103,525,-725,-998,264,22 -505,708,550,-545,823,347 -738,931,59,147,-156,-259 456,968,-162,889,132,-911 535,120,968,-517,-864,-541 24,-395,-593,-766,-565,-332 834,611,825,-576,280,629 211,-548,140,-278,-592,929 -999,-240,-63,-78,793,573 -573,160,450,987,529,322 63,353,315,-187,-461,577 189,-950,-247,656,289,241 209,-297,397,664,-805,484 -655,452,435,-556,917,874 253,-756,262,-888,-778,-214 793,-451,323,-251,-401,-458 -396,619,-651,-287,-668,-781 698,720,-349,742,-807,546 738,280,680,279,-540,858 -789,387,530,-36,-551,-491 162,579,-427,-272,228,710 689,356,917,-580,729,217 -115,-638,866,424,-82,-194 411,-338,-917,172,227,-29 -612,63,630,-976,-64,-204 -200,911,583,-571,682,-579 91,298,396,-183,788,-955 141,-873,-277,149,-396,916 321,958,-136,573,541,-777 797,-909,-469,-877,988,-653 784,-198,129,883,-203,399 -68,-810,223,-423,-467,-512 531,-445,-603,-997,-841,641 -274,-242,174,261,-636,-158 -574,494,-796,-798,-798,99 95,-82,-613,-954,-753,986 -883,-448,-864,-401,938,-392 913,930,-542,-988,310,410 506,-99,43,512,790,-222 724,31,49,-950,260,-134 -287,-947,-234,-700,56,588 -33,782,-144,948,105,-791 548,-546,-652,-293,881,-520 691,-91,76,991,-631,742 -520,-429,-244,-296,724,-48 778,646,377,50,-188,56 -895,-507,-898,-165,-674,652 654,584,-634,177,-349,-620 114,-980,355,62,182,975 516,9,-442,-298,274,-579 -238,262,-431,-896,506,-850 47,748,846,821,-537,-293 839,726,593,285,-297,840 634,-486,468,-304,-887,-567 -864,914,296,-124,335,233 88,-253,-523,-956,-554,803 -587,417,281,-62,-409,-363 -136,-39,-292,-768,-264,876 -127,506,-891,-331,-744,-430 778,584,-750,-129,-479,-94 -876,-771,-987,-757,180,-641 -777,-694,411,-87,329,190 -347,-999,-882,158,-754,232 -105,918,188,237,-110,-591 -209,703,-838,77,838,909 -995,-339,-762,750,860,472 185,271,-289,173,811,-300 2,65,-656,-22,36,-139 765,-210,883,974,961,-905 -212,295,-615,-840,77,474 211,-910,-440,703,-11,859 -559,-4,-196,841,-277,969 -73,-159,-887,126,978,-371 -569,633,-423,-33,512,-393 503,143,-383,-109,-649,-998 -663,339,-317,-523,-2,596 690,-380,570,378,-652,132 72,-744,-930,399,-525,935 865,-983,115,37,995,826 594,-621,-872,443,188,-241 -1000,291,754,234,-435,-869 -868,901,654,-907,59,181 -868,-793,-431,596,-446,-564 900,-944,-680,-796,902,-366 331,430,943,853,-851,-942 315,-538,-354,-909,139,721 170,-884,-225,-818,-808,-657 -279,-34,-533,-871,-972,552 691,-986,-800,-950,654,-747 603,988,899,841,-630,591 876,-949,809,562,602,-536 -693,363,-189,495,738,-1000 -383,431,-633,297,665,959 -740,686,-207,-803,188,-520 -820,226,31,-339,10,121 -312,-844,624,-516,483,621 -822,-529,69,-278,800,328 834,-82,-759,420,811,-264 -960,-240,-921,561,173,46 -324,909,-790,-814,-2,-785 976,334,-290,-891,704,-581 150,-798,689,-823,237,-639 -551,-320,876,-502,-622,-628 -136,845,904,595,-702,-261 -857,-377,-522,-101,-943,-805 -682,-787,-888,-459,-752,-985 -571,-81,623,-133,447,643 -375,-158,72,-387,-324,-696 -660,-650,340,188,569,526 727,-218,16,-7,-595,-988 -966,-684,802,-783,-272,-194 115,-566,-888,47,712,180 -237,-69,45,-272,981,-812 48,897,439,417,50,325 348,616,180,254,104,-784 -730,811,-548,612,-736,790 138,-810,123,930,65,865 -768,-299,-49,-895,-692,-418 487,-531,802,-159,-12,634 808,-179,552,-73,470,717 720,-644,886,-141,625,144 -485,-505,-347,-244,-916,66 600,-565,995,-5,324,227 -771,-35,904,-482,753,-303 -701,65,426,-763,-504,-479 409,733,-823,475,64,718 865,975,368,893,-413,-433 812,-597,-970,819,813,624 193,-642,-381,-560,545,398 711,28,-316,771,717,-865 -509,462,809,-136,786,635 618,-49,484,169,635,547 -747,685,-882,-496,-332,82 -501,-851,870,563,290,570 -279,-829,-509,397,457,816 -508,80,850,-188,483,-326 860,-100,360,119,-205,787 -870,21,-39,-827,-185,932 826,284,-136,-866,-330,-97 -944,-82,745,899,-97,365 929,262,564,632,-115,632 244,-276,713,330,-897,-214 -890,-109,664,876,-974,-907 716,249,816,489,723,141 -96,-560,-272,45,-70,645 762,-503,414,-828,-254,-646 909,-13,903,-422,-344,-10 658,-486,743,545,50,674 -241,507,-367,18,-48,-241 886,-268,884,-762,120,-486 -412,-528,879,-647,223,-393 851,810,234,937,-726,797 -999,942,839,-134,-996,-189 100,979,-527,-521,378,800 544,-844,-832,-530,-77,-641 43,889,31,442,-934,-503 -330,-370,-309,-439,173,547 169,945,62,-753,-542,-597 208,751,-372,-647,-520,70 765,-840,907,-257,379,918 334,-135,-689,730,-427,618 137,-508,66,-695,78,169 -962,-123,400,-417,151,969 328,689,666,427,-555,-642 -907,343,605,-341,-647,582 -667,-363,-571,818,-265,-399 525,-938,904,898,725,692 -176,-802,-858,-9,780,275 580,170,-740,287,691,-97 365,557,-375,361,-288,859 193,737,842,-808,520,282 -871,65,-799,836,179,-720 958,-144,744,-789,797,-48 122,582,662,912,68,757 595,241,-801,513,388,186 -103,-677,-259,-731,-281,-857 921,319,-696,683,-88,-997 775,200,78,858,648,768 316,821,-763,68,-290,-741 564,664,691,504,760,787 694,-119,973,-385,309,-760 777,-947,-57,990,74,19 971,626,-496,-781,-602,-239 -651,433,11,-339,939,294 -965,-728,560,569,-708,-247 ================================================ FILE: project_euler/problem_102/sol1.py ================================================ """ Three distinct points are plotted at random on a Cartesian plane, for which -1000 ≤ x, y ≤ 1000, such that a triangle is formed. Consider the following two triangles: A(-340,495), B(-153,-910), C(835,-947) X(-175,41), Y(-421,-714), Z(574,-645) It can be verified that triangle ABC contains the origin, whereas triangle XYZ does not. Using triangles.txt (right click and 'Save Link/Target As...'), a 27K text file containing the coordinates of one thousand "random" triangles, find the number of triangles for which the interior contains the origin. NOTE: The first two examples in the file represent the triangles in the example given above. """ from __future__ import annotations from pathlib import Path def vector_product(point1: tuple[int, int], point2: tuple[int, int]) -> int: """ Return the 2-d vector product of two vectors. >>> vector_product((1, 2), (-5, 0)) 10 >>> vector_product((3, 1), (6, 10)) 24 """ return point1[0] * point2[1] - point1[1] * point2[0] def contains_origin(x1: int, y1: int, x2: int, y2: int, x3: int, y3: int) -> bool: """ Check if the triangle given by the points A(x1, y1), B(x2, y2), C(x3, y3) contains the origin. >>> contains_origin(-340, 495, -153, -910, 835, -947) True >>> contains_origin(-175, 41, -421, -714, 574, -645) False """ point_a: tuple[int, int] = (x1, y1) point_a_to_b: tuple[int, int] = (x2 - x1, y2 - y1) point_a_to_c: tuple[int, int] = (x3 - x1, y3 - y1) a: float = -vector_product(point_a, point_a_to_b) / vector_product( point_a_to_c, point_a_to_b ) b: float = +vector_product(point_a, point_a_to_c) / vector_product( point_a_to_c, point_a_to_b ) return a > 0 and b > 0 and a + b < 1 def solution(filename: str = "p102_triangles.txt") -> int: """ Find the number of triangles whose interior contains the origin. >>> solution("test_triangles.txt") 1 """ data: str = Path(__file__).parent.joinpath(filename).read_text(encoding="utf-8") triangles: list[list[int]] = [] for line in data.strip().split("\n"): triangles.append([int(number) for number in line.split(",")]) ret: int = 0 triangle: list[int] for triangle in triangles: ret += contains_origin(*triangle) return ret if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_102/test_triangles.txt ================================================ -340,495,-153,-910,835,-947 -175,41,-421,-714,574,-645 ================================================ FILE: project_euler/problem_104/__init__.py ================================================ ================================================ FILE: project_euler/problem_104/sol1.py ================================================ """ Project Euler Problem 104 : https://projecteuler.net/problem=104 The Fibonacci sequence is defined by the recurrence relation: Fn = Fn-1 + Fn-2, where F1 = 1 and F2 = 1. It turns out that F541, which contains 113 digits, is the first Fibonacci number for which the last nine digits are 1-9 pandigital (contain all the digits 1 to 9, but not necessarily in order). And F2749, which contains 575 digits, is the first Fibonacci number for which the first nine digits are 1-9 pandigital. Given that Fk is the first Fibonacci number for which the first nine digits AND the last nine digits are 1-9 pandigital, find k. """ import sys sys.set_int_max_str_digits(0) def check(number: int) -> bool: """ Takes a number and checks if it is pandigital both from start and end >>> check(123456789987654321) True >>> check(120000987654321) False >>> check(1234567895765677987654321) True """ check_last = [0] * 11 check_front = [0] * 11 # mark last 9 numbers for _ in range(9): check_last[int(number % 10)] = 1 number = number // 10 # flag f = True # check last 9 numbers for pandigitality for x in range(9): if not check_last[x + 1]: f = False if not f: return f # mark first 9 numbers number = int(str(number)[:9]) for _ in range(9): check_front[int(number % 10)] = 1 number = number // 10 # check first 9 numbers for pandigitality for x in range(9): if not check_front[x + 1]: f = False return f def check1(number: int) -> bool: """ Takes a number and checks if it is pandigital from END >>> check1(123456789987654321) True >>> check1(120000987654321) True >>> check1(12345678957656779870004321) False """ check_last = [0] * 11 # mark last 9 numbers for _ in range(9): check_last[int(number % 10)] = 1 number = number // 10 # flag f = True # check last 9 numbers for pandigitality for x in range(9): if not check_last[x + 1]: f = False return f def solution() -> int: """ Outputs the answer is the least Fibonacci number pandigital from both sides. >>> solution() 329468 """ a = 1 b = 1 c = 2 # temporary Fibonacci numbers a1 = 1 b1 = 1 c1 = 2 # temporary Fibonacci numbers mod 1e9 # mod m=1e9, done for fast optimisation tocheck = [0] * 1000000 m = 1000000000 for x in range(1000000): c1 = (a1 + b1) % m a1 = b1 % m b1 = c1 % m if check1(b1): tocheck[x + 3] = 1 for x in range(1000000): c = a + b a = b b = c # perform check only if in tocheck if tocheck[x + 3] and check(b): return x + 3 # first 2 already done return -1 if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_107/__init__.py ================================================ ================================================ FILE: project_euler/problem_107/p107_network.txt ================================================ -,-,-,427,668,495,377,678,-,177,-,-,870,-,869,624,300,609,131,-,251,-,-,-,856,221,514,-,591,762,182,56,-,884,412,273,636,-,-,774 -,-,262,-,-,508,472,799,-,956,578,363,940,143,-,162,122,910,-,729,802,941,922,573,531,539,667,607,-,920,-,-,315,649,937,-,185,102,636,289 -,262,-,-,926,-,958,158,647,47,621,264,81,-,402,813,649,386,252,391,264,637,349,-,-,-,108,-,727,225,578,699,-,898,294,-,575,168,432,833 427,-,-,-,366,-,-,635,-,32,962,468,893,854,718,427,448,916,258,-,760,909,529,311,404,-,-,588,680,875,-,615,-,409,758,221,-,-,76,257 668,-,926,366,-,-,-,250,268,-,503,944,-,677,-,727,793,457,981,191,-,-,-,351,969,925,987,328,282,589,-,873,477,-,-,19,450,-,-,- 495,508,-,-,-,-,-,765,711,819,305,302,926,-,-,582,-,861,-,683,293,-,-,66,-,27,-,-,290,-,786,-,554,817,33,-,54,506,386,381 377,472,958,-,-,-,-,-,-,120,42,-,134,219,457,639,538,374,-,-,-,966,-,-,-,-,-,449,120,797,358,232,550,-,305,997,662,744,686,239 678,799,158,635,250,765,-,-,-,35,-,106,385,652,160,-,890,812,605,953,-,-,-,79,-,712,613,312,452,-,978,900,-,901,-,-,225,533,770,722 -,-,647,-,268,711,-,-,-,283,-,172,-,663,236,36,403,286,986,-,-,810,761,574,53,793,-,-,777,330,936,883,286,-,174,-,-,-,828,711 177,956,47,32,-,819,120,35,283,-,50,-,565,36,767,684,344,489,565,-,-,103,810,463,733,665,494,644,863,25,385,-,342,470,-,-,-,730,582,468 -,578,621,962,503,305,42,-,-,50,-,155,519,-,-,256,990,801,154,53,474,650,402,-,-,-,966,-,-,406,989,772,932,7,-,823,391,-,-,933 -,363,264,468,944,302,-,106,172,-,155,-,-,-,380,438,-,41,266,-,-,104,867,609,-,270,861,-,-,165,-,675,250,686,995,366,191,-,433,- 870,940,81,893,-,926,134,385,-,565,519,-,-,313,851,-,-,-,248,220,-,826,359,829,-,234,198,145,409,68,359,-,814,218,186,-,-,929,203,- -,143,-,854,677,-,219,652,663,36,-,-,313,-,132,-,433,598,-,-,168,870,-,-,-,128,437,-,383,364,966,227,-,-,807,993,-,-,526,17 869,-,402,718,-,-,457,160,236,767,-,380,851,132,-,-,596,903,613,730,-,261,-,142,379,885,89,-,848,258,112,-,900,-,-,818,639,268,600,- 624,162,813,427,727,582,639,-,36,684,256,438,-,-,-,-,539,379,664,561,542,-,999,585,-,-,321,398,-,-,950,68,193,-,697,-,390,588,848,- 300,122,649,448,793,-,538,890,403,344,990,-,-,433,596,539,-,-,73,-,318,-,-,500,-,968,-,291,-,-,765,196,504,757,-,542,-,395,227,148 609,910,386,916,457,861,374,812,286,489,801,41,-,598,903,379,-,-,-,946,136,399,-,941,707,156,757,258,251,-,807,-,-,-,461,501,-,-,616,- 131,-,252,258,981,-,-,605,986,565,154,266,248,-,613,664,73,-,-,686,-,-,575,627,817,282,-,698,398,222,-,649,-,-,-,-,-,654,-,- -,729,391,-,191,683,-,953,-,-,53,-,220,-,730,561,-,946,686,-,-,389,729,553,304,703,455,857,260,-,991,182,351,477,867,-,-,889,217,853 251,802,264,760,-,293,-,-,-,-,474,-,-,168,-,542,318,136,-,-,-,-,392,-,-,-,267,407,27,651,80,927,-,974,977,-,-,457,117,- -,941,637,909,-,-,966,-,810,103,650,104,826,870,261,-,-,399,-,389,-,-,-,202,-,-,-,-,867,140,403,962,785,-,511,-,1,-,707,- -,922,349,529,-,-,-,-,761,810,402,867,359,-,-,999,-,-,575,729,392,-,-,388,939,-,959,-,83,463,361,-,-,512,931,-,224,690,369,- -,573,-,311,351,66,-,79,574,463,-,609,829,-,142,585,500,941,627,553,-,202,388,-,164,829,-,620,523,639,936,-,-,490,-,695,-,505,109,- 856,531,-,404,969,-,-,-,53,733,-,-,-,-,379,-,-,707,817,304,-,-,939,164,-,-,616,716,728,-,889,349,-,963,150,447,-,292,586,264 221,539,-,-,925,27,-,712,793,665,-,270,234,128,885,-,968,156,282,703,-,-,-,829,-,-,-,822,-,-,-,736,576,-,697,946,443,-,205,194 514,667,108,-,987,-,-,613,-,494,966,861,198,437,89,321,-,757,-,455,267,-,959,-,616,-,-,-,349,156,339,-,102,790,359,-,439,938,809,260 -,607,-,588,328,-,449,312,-,644,-,-,145,-,-,398,291,258,698,857,407,-,-,620,716,822,-,-,293,486,943,-,779,-,6,880,116,775,-,947 591,-,727,680,282,290,120,452,777,863,-,-,409,383,848,-,-,251,398,260,27,867,83,523,728,-,349,293,-,212,684,505,341,384,9,992,507,48,-,- 762,920,225,875,589,-,797,-,330,25,406,165,68,364,258,-,-,-,222,-,651,140,463,639,-,-,156,486,212,-,-,349,723,-,-,186,-,36,240,752 182,-,578,-,-,786,358,978,936,385,989,-,359,966,112,950,765,807,-,991,80,403,361,936,889,-,339,943,684,-,-,965,302,676,725,-,327,134,-,147 56,-,699,615,873,-,232,900,883,-,772,675,-,227,-,68,196,-,649,182,927,962,-,-,349,736,-,-,505,349,965,-,474,178,833,-,-,555,853,- -,315,-,-,477,554,550,-,286,342,932,250,814,-,900,193,504,-,-,351,-,785,-,-,-,576,102,779,341,723,302,474,-,689,-,-,-,451,-,- 884,649,898,409,-,817,-,901,-,470,7,686,218,-,-,-,757,-,-,477,974,-,512,490,963,-,790,-,384,-,676,178,689,-,245,596,445,-,-,343 412,937,294,758,-,33,305,-,174,-,-,995,186,807,-,697,-,461,-,867,977,511,931,-,150,697,359,6,9,-,725,833,-,245,-,949,-,270,-,112 273,-,-,221,19,-,997,-,-,-,823,366,-,993,818,-,542,501,-,-,-,-,-,695,447,946,-,880,992,186,-,-,-,596,949,-,91,-,768,273 636,185,575,-,450,54,662,225,-,-,391,191,-,-,639,390,-,-,-,-,-,1,224,-,-,443,439,116,507,-,327,-,-,445,-,91,-,248,-,344 -,102,168,-,-,506,744,533,-,730,-,-,929,-,268,588,395,-,654,889,457,-,690,505,292,-,938,775,48,36,134,555,451,-,270,-,248,-,371,680 -,636,432,76,-,386,686,770,828,582,-,433,203,526,600,848,227,616,-,217,117,707,369,109,586,205,809,-,-,240,-,853,-,-,-,768,-,371,-,540 774,289,833,257,-,381,239,722,711,468,933,-,-,17,-,-,148,-,-,853,-,-,-,-,264,194,260,947,-,752,147,-,-,343,112,273,344,680,540,- ================================================ FILE: project_euler/problem_107/sol1.py ================================================ """ The following undirected network consists of seven vertices and twelve edges with a total weight of 243.  The same network can be represented by the matrix below. A B C D E F G A - 16 12 21 - - - B 16 - - 17 20 - - C 12 - - 28 - 31 - D 21 17 28 - 18 19 23 E - 20 - 18 - - 11 F - - 31 19 - - 27 G - - - 23 11 27 - However, it is possible to optimise the network by removing some edges and still ensure that all points on the network remain connected. The network which achieves the maximum saving is shown below. It has a weight of 93, representing a saving of 243 - 93 = 150 from the original network. Using network.txt (right click and 'Save Link/Target As...'), a 6K text file containing a network with forty vertices, and given in matrix form, find the maximum saving which can be achieved by removing redundant edges whilst ensuring that the network remains connected. Solution: We use Prim's algorithm to find a Minimum Spanning Tree. Reference: https://en.wikipedia.org/wiki/Prim%27s_algorithm """ from __future__ import annotations import os from collections.abc import Mapping EdgeT = tuple[int, int] class Graph: """ A class representing an undirected weighted graph. """ def __init__(self, vertices: set[int], edges: Mapping[EdgeT, int]) -> None: self.vertices: set[int] = vertices self.edges: dict[EdgeT, int] = { (min(edge), max(edge)): weight for edge, weight in edges.items() } def add_edge(self, edge: EdgeT, weight: int) -> None: """ Add a new edge to the graph. >>> graph = Graph({1, 2}, {(2, 1): 4}) >>> graph.add_edge((3, 1), 5) >>> sorted(graph.vertices) [1, 2, 3] >>> sorted([(v,k) for k,v in graph.edges.items()]) [(4, (1, 2)), (5, (1, 3))] """ self.vertices.add(edge[0]) self.vertices.add(edge[1]) self.edges[(min(edge), max(edge))] = weight def prims_algorithm(self) -> Graph: """ Run Prim's algorithm to find the minimum spanning tree. Reference: https://en.wikipedia.org/wiki/Prim%27s_algorithm >>> graph = Graph({1,2,3,4},{(1,2):5, (1,3):10, (1,4):20, (2,4):30, (3,4):1}) >>> mst = graph.prims_algorithm() >>> sorted(mst.vertices) [1, 2, 3, 4] >>> sorted(mst.edges) [(1, 2), (1, 3), (3, 4)] """ subgraph: Graph = Graph({min(self.vertices)}, {}) min_edge: EdgeT min_weight: int edge: EdgeT weight: int while len(subgraph.vertices) < len(self.vertices): min_weight = max(self.edges.values()) + 1 for edge, weight in self.edges.items(): if (edge[0] in subgraph.vertices) ^ ( edge[1] in subgraph.vertices ) and weight < min_weight: min_edge = edge min_weight = weight subgraph.add_edge(min_edge, min_weight) return subgraph def solution(filename: str = "p107_network.txt") -> int: """ Find the maximum saving which can be achieved by removing redundant edges whilst ensuring that the network remains connected. >>> solution("test_network.txt") 150 """ script_dir: str = os.path.abspath(os.path.dirname(__file__)) network_file: str = os.path.join(script_dir, filename) edges: dict[EdgeT, int] = {} data: list[str] edge1: int edge2: int with open(network_file) as f: data = f.read().strip().split("\n") adjaceny_matrix = [line.split(",") for line in data] for edge1 in range(1, len(adjaceny_matrix)): for edge2 in range(edge1): if adjaceny_matrix[edge1][edge2] != "-": edges[(edge2, edge1)] = int(adjaceny_matrix[edge1][edge2]) graph: Graph = Graph(set(range(len(adjaceny_matrix))), edges) subgraph: Graph = graph.prims_algorithm() initial_total: int = sum(graph.edges.values()) optimal_total: int = sum(subgraph.edges.values()) return initial_total - optimal_total if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_107/test_network.txt ================================================ -,16,12,21,-,-,- 16,-,-,17,20,-,- 12,-,-,28,-,31,- 21,17,28,-,18,19,23 -,20,-,18,-,-,11 -,-,31,19,-,-,27 -,-,-,23,11,27,- ================================================ FILE: project_euler/problem_109/__init__.py ================================================ ================================================ FILE: project_euler/problem_109/sol1.py ================================================ """ In the game of darts a player throws three darts at a target board which is split into twenty equal sized sections numbered one to twenty.  The score of a dart is determined by the number of the region that the dart lands in. A dart landing outside the red/green outer ring scores zero. The black and cream regions inside this ring represent single scores. However, the red/green outer ring and middle ring score double and treble scores respectively. At the centre of the board are two concentric circles called the bull region, or bulls-eye. The outer bull is worth 25 points and the inner bull is a double, worth 50 points. There are many variations of rules but in the most popular game the players will begin with a score 301 or 501 and the first player to reduce their running total to zero is a winner. However, it is normal to play a "doubles out" system, which means that the player must land a double (including the double bulls-eye at the centre of the board) on their final dart to win; any other dart that would reduce their running total to one or lower means the score for that set of three darts is "bust". When a player is able to finish on their current score it is called a "checkout" and the highest checkout is 170: T20 T20 D25 (two treble 20s and double bull). There are exactly eleven distinct ways to checkout on a score of 6: D3 D1 D2 S2 D2 D2 D1 S4 D1 S1 S1 D2 S1 T1 D1 S1 S3 D1 D1 D1 D1 D1 S2 D1 S2 S2 D1 Note that D1 D2 is considered different to D2 D1 as they finish on different doubles. However, the combination S1 T1 D1 is considered the same as T1 S1 D1. In addition we shall not include misses in considering combinations; for example, D3 is the same as 0 D3 and 0 0 D3. Incredibly there are 42336 distinct ways of checking out in total. How many distinct ways can a player checkout with a score less than 100? Solution: We first construct a list of the possible dart values, separated by type. We then iterate through the doubles, followed by the possible 2 following throws. If the total of these three darts is less than the given limit, we increment the counter. """ from itertools import combinations_with_replacement def solution(limit: int = 100) -> int: """ Count the number of distinct ways a player can checkout with a score less than limit. >>> solution(171) 42336 >>> solution(50) 12577 """ singles: list[int] = [*list(range(1, 21)), 25] doubles: list[int] = [2 * x for x in range(1, 21)] + [50] triples: list[int] = [3 * x for x in range(1, 21)] all_values: list[int] = singles + doubles + triples + [0] num_checkouts: int = 0 double: int throw1: int throw2: int checkout_total: int for double in doubles: for throw1, throw2 in combinations_with_replacement(all_values, 2): checkout_total = double + throw1 + throw2 if checkout_total < limit: num_checkouts += 1 return num_checkouts if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_112/__init__.py ================================================ ================================================ FILE: project_euler/problem_112/sol1.py ================================================ """ Problem 112: https://projecteuler.net/problem=112 Working from left-to-right if no digit is exceeded by the digit to its left it is called an increasing number; for example, 134468. Similarly if no digit is exceeded by the digit to its right it is called a decreasing number; for example, 66420. We shall call a positive integer that is neither increasing nor decreasing a "bouncy" number, for example, 155349. Clearly there cannot be any bouncy numbers below one-hundred, but just over half of the numbers below one-thousand (525) are bouncy. In fact, the least number for which the proportion of bouncy numbers first reaches 50% is 538. Surprisingly, bouncy numbers become more and more common and by the time we reach 21780 the proportion of bouncy numbers is equal to 90%. Find the least number for which the proportion of bouncy numbers is exactly 99%. """ def check_bouncy(n: int) -> bool: """ Returns True if number is bouncy, False otherwise >>> check_bouncy(6789) False >>> check_bouncy(-12345) False >>> check_bouncy(0) False >>> check_bouncy(6.74) Traceback (most recent call last): ... ValueError: check_bouncy() accepts only integer arguments >>> check_bouncy(132475) True >>> check_bouncy(34) False >>> check_bouncy(341) True >>> check_bouncy(47) False >>> check_bouncy(-12.54) Traceback (most recent call last): ... ValueError: check_bouncy() accepts only integer arguments >>> check_bouncy(-6548) True """ if not isinstance(n, int): raise ValueError("check_bouncy() accepts only integer arguments") str_n = str(n) sorted_str_n = "".join(sorted(str_n)) return str_n not in {sorted_str_n, sorted_str_n[::-1]} def solution(percent: float = 99) -> int: """ Returns the least number for which the proportion of bouncy numbers is exactly 'percent' >>> solution(50) 538 >>> solution(90) 21780 >>> solution(80) 4770 >>> solution(105) Traceback (most recent call last): ... ValueError: solution() only accepts values from 0 to 100 >>> solution(100.011) Traceback (most recent call last): ... ValueError: solution() only accepts values from 0 to 100 """ if not 0 < percent < 100: raise ValueError("solution() only accepts values from 0 to 100") bouncy_num = 0 num = 1 while True: if check_bouncy(num): bouncy_num += 1 if (bouncy_num / num) * 100 >= percent: return num num += 1 if __name__ == "__main__": from doctest import testmod testmod() print(f"{solution(99)}") ================================================ FILE: project_euler/problem_113/__init__.py ================================================ ================================================ FILE: project_euler/problem_113/sol1.py ================================================ """ Project Euler Problem 113: https://projecteuler.net/problem=113 Working from left-to-right if no digit is exceeded by the digit to its left it is called an increasing number; for example, 134468. Similarly if no digit is exceeded by the digit to its right it is called a decreasing number; for example, 66420. We shall call a positive integer that is neither increasing nor decreasing a "bouncy" number; for example, 155349. As n increases, the proportion of bouncy numbers below n increases such that there are only 12951 numbers below one-million that are not bouncy and only 277032 non-bouncy numbers below 10^10. How many numbers below a googol (10^100) are not bouncy? """ def choose(n: int, r: int) -> int: """ Calculate the binomial coefficient c(n,r) using the multiplicative formula. >>> choose(4,2) 6 >>> choose(5,3) 10 >>> choose(20,6) 38760 """ ret = 1.0 for i in range(1, r + 1): ret *= (n + 1 - i) / i return round(ret) def non_bouncy_exact(n: int) -> int: """ Calculate the number of non-bouncy numbers with at most n digits. >>> non_bouncy_exact(1) 9 >>> non_bouncy_exact(6) 7998 >>> non_bouncy_exact(10) 136126 """ return choose(8 + n, n) + choose(9 + n, n) - 10 def non_bouncy_upto(n: int) -> int: """ Calculate the number of non-bouncy numbers with at most n digits. >>> non_bouncy_upto(1) 9 >>> non_bouncy_upto(6) 12951 >>> non_bouncy_upto(10) 277032 """ return sum(non_bouncy_exact(i) for i in range(1, n + 1)) def solution(num_digits: int = 100) -> int: """ Calculate the number of non-bouncy numbers less than a googol. >>> solution(6) 12951 >>> solution(10) 277032 """ return non_bouncy_upto(num_digits) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_114/__init__.py ================================================ ================================================ FILE: project_euler/problem_114/sol1.py ================================================ """ Project Euler Problem 114: https://projecteuler.net/problem=114 A row measuring seven units in length has red blocks with a minimum length of three units placed on it, such that any two red blocks (which are allowed to be different lengths) are separated by at least one grey square. There are exactly seventeen ways of doing this. |g|g|g|g|g|g|g| |r,r,r|g|g|g|g| |g|r,r,r|g|g|g| |g|g|r,r,r|g|g| |g|g|g|r,r,r|g| |g|g|g|g|r,r,r| |r,r,r|g|r,r,r| |r,r,r,r|g|g|g| |g|r,r,r,r|g|g| |g|g|r,r,r,r|g| |g|g|g|r,r,r,r| |r,r,r,r,r|g|g| |g|r,r,r,r,r|g| |g|g|r,r,r,r,r| |r,r,r,r,r,r|g| |g|r,r,r,r,r,r| |r,r,r,r,r,r,r| How many ways can a row measuring fifty units in length be filled? NOTE: Although the example above does not lend itself to the possibility, in general it is permitted to mix block sizes. For example, on a row measuring eight units in length you could use red (3), grey (1), and red (4). """ def solution(length: int = 50) -> int: """ Returns the number of ways a row of the given length can be filled >>> solution(7) 17 """ ways_number = [1] * (length + 1) for row_length in range(3, length + 1): for block_length in range(3, row_length + 1): for block_start in range(row_length - block_length): ways_number[row_length] += ways_number[ row_length - block_start - block_length - 1 ] ways_number[row_length] += 1 return ways_number[length] if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_115/__init__.py ================================================ ================================================ FILE: project_euler/problem_115/sol1.py ================================================ """ Project Euler Problem 115: https://projecteuler.net/problem=115 NOTE: This is a more difficult version of Problem 114 (https://projecteuler.net/problem=114). A row measuring n units in length has red blocks with a minimum length of m units placed on it, such that any two red blocks (which are allowed to be different lengths) are separated by at least one black square. Let the fill-count function, F(m, n), represent the number of ways that a row can be filled. For example, F(3, 29) = 673135 and F(3, 30) = 1089155. That is, for m = 3, it can be seen that n = 30 is the smallest value for which the fill-count function first exceeds one million. In the same way, for m = 10, it can be verified that F(10, 56) = 880711 and F(10, 57) = 1148904, so n = 57 is the least value for which the fill-count function first exceeds one million. For m = 50, find the least value of n for which the fill-count function first exceeds one million. """ from itertools import count def solution(min_block_length: int = 50) -> int: """ Returns for given minimum block length the least value of n for which the fill-count function first exceeds one million >>> solution(3) 30 >>> solution(10) 57 """ fill_count_functions = [1] * min_block_length for n in count(min_block_length): fill_count_functions.append(1) for block_length in range(min_block_length, n + 1): for block_start in range(n - block_length): fill_count_functions[n] += fill_count_functions[ n - block_start - block_length - 1 ] fill_count_functions[n] += 1 if fill_count_functions[n] > 1_000_000: break return n if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_116/__init__.py ================================================ ================================================ FILE: project_euler/problem_116/sol1.py ================================================ """ Project Euler Problem 116: https://projecteuler.net/problem=116 A row of five grey square tiles is to have a number of its tiles replaced with coloured oblong tiles chosen from red (length two), green (length three), or blue (length four). If red tiles are chosen there are exactly seven ways this can be done. |red,red|grey|grey|grey| |grey|red,red|grey|grey| |grey|grey|red,red|grey| |grey|grey|grey|red,red| |red,red|red,red|grey| |red,red|grey|red,red| |grey|red,red|red,red| If green tiles are chosen there are three ways. |green,green,green|grey|grey| |grey|green,green,green|grey| |grey|grey|green,green,green| And if blue tiles are chosen there are two ways. |blue,blue,blue,blue|grey| |grey|blue,blue,blue,blue| Assuming that colours cannot be mixed there are 7 + 3 + 2 = 12 ways of replacing the grey tiles in a row measuring five units in length. How many different ways can the grey tiles in a row measuring fifty units in length be replaced if colours cannot be mixed and at least one coloured tile must be used? NOTE: This is related to Problem 117 (https://projecteuler.net/problem=117). """ def solution(length: int = 50) -> int: """ Returns the number of different ways can the grey tiles in a row of the given length be replaced if colours cannot be mixed and at least one coloured tile must be used >>> solution(5) 12 """ different_colour_ways_number = [[0] * 3 for _ in range(length + 1)] for row_length in range(length + 1): for tile_length in range(2, 5): for tile_start in range(row_length - tile_length + 1): different_colour_ways_number[row_length][tile_length - 2] += ( different_colour_ways_number[row_length - tile_start - tile_length][ tile_length - 2 ] + 1 ) return sum(different_colour_ways_number[length]) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_117/__init__.py ================================================ ================================================ FILE: project_euler/problem_117/sol1.py ================================================ """ Project Euler Problem 117: https://projecteuler.net/problem=117 Using a combination of grey square tiles and oblong tiles chosen from: red tiles (measuring two units), green tiles (measuring three units), and blue tiles (measuring four units), it is possible to tile a row measuring five units in length in exactly fifteen different ways. |grey|grey|grey|grey|grey| |red,red|grey|grey|grey| |grey|red,red|grey|grey| |grey|grey|red,red|grey| |grey|grey|grey|red,red| |red,red|red,red|grey| |red,red|grey|red,red| |grey|red,red|red,red| |green,green,green|grey|grey| |grey|green,green,green|grey| |grey|grey|green,green,green| |red,red|green,green,green| |green,green,green|red,red| |blue,blue,blue,blue|grey| |grey|blue,blue,blue,blue| How many ways can a row measuring fifty units in length be tiled? NOTE: This is related to Problem 116 (https://projecteuler.net/problem=116). """ def solution(length: int = 50) -> int: """ Returns the number of ways can a row of the given length be tiled >>> solution(5) 15 """ ways_number = [1] * (length + 1) for row_length in range(length + 1): for tile_length in range(2, 5): for tile_start in range(row_length - tile_length + 1): ways_number[row_length] += ways_number[ row_length - tile_start - tile_length ] return ways_number[length] if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_119/__init__.py ================================================ ================================================ FILE: project_euler/problem_119/sol1.py ================================================ """ Problem 119: https://projecteuler.net/problem=119 Name: Digit power sum The number 512 is interesting because it is equal to the sum of its digits raised to some power: 5 + 1 + 2 = 8, and 8^3 = 512. Another example of a number with this property is 614656 = 28^4. We shall define an to be the nth term of this sequence and insist that a number must contain at least two digits to have a sum. You are given that a2 = 512 and a10 = 614656. Find a30 """ import math def digit_sum(n: int) -> int: """ Returns the sum of the digits of the number. >>> digit_sum(123) 6 >>> digit_sum(456) 15 >>> digit_sum(78910) 25 """ return sum(int(digit) for digit in str(n)) def solution(n: int = 30) -> int: """ Returns the value of 30th digit power sum. >>> solution(2) 512 >>> solution(5) 5832 >>> solution(10) 614656 """ digit_to_powers = [] for digit in range(2, 100): for power in range(2, 100): number = int(math.pow(digit, power)) if digit == digit_sum(number): digit_to_powers.append(number) digit_to_powers.sort() return digit_to_powers[n - 1] if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_120/__init__.py ================================================ ================================================ FILE: project_euler/problem_120/sol1.py ================================================ """ Problem 120 Square remainders: https://projecteuler.net/problem=120 Description: Let r be the remainder when (a-1)^n + (a+1)^n is divided by a^2. For example, if a = 7 and n = 3, then r = 42: 6^3 + 8^3 = 728 ≡ 42 mod 49. And as n varies, so too will r, but for a = 7 it turns out that r_max = 42. For 3 ≤ a ≤ 1000, find ∑ r_max. Solution: On expanding the terms, we get 2 if n is even and 2an if n is odd. For maximizing the value, 2an < a*a => n <= (a - 1)/2 (integer division) """ def solution(n: int = 1000) -> int: """ Returns ∑ r_max for 3 <= a <= n as explained above >>> solution(10) 300 >>> solution(100) 330750 >>> solution(1000) 333082500 """ return sum(2 * a * ((a - 1) // 2) for a in range(3, n + 1)) if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_121/__init__.py ================================================ ================================================ FILE: project_euler/problem_121/sol1.py ================================================ """ A bag contains one red disc and one blue disc. In a game of chance a player takes a disc at random and its colour is noted. After each turn the disc is returned to the bag, an extra red disc is added, and another disc is taken at random. The player pays £1 to play and wins if they have taken more blue discs than red discs at the end of the game. If the game is played for four turns, the probability of a player winning is exactly 11/120, and so the maximum prize fund the banker should allocate for winning in this game would be £10 before they would expect to incur a loss. Note that any payout will be a whole number of pounds and also includes the original £1 paid to play the game, so in the example given the player actually wins £9. Find the maximum prize fund that should be allocated to a single game in which fifteen turns are played. Solution: For each 15-disc sequence of red and blue for which there are more red than blue, we calculate the probability of that sequence and add it to the total probability of the player winning. The inverse of this probability gives an upper bound for the prize if the banker wants to avoid an expected loss. """ from itertools import product def solution(num_turns: int = 15) -> int: """ Find the maximum prize fund that should be allocated to a single game in which fifteen turns are played. >>> solution(4) 10 >>> solution(10) 225 """ total_prob: float = 0.0 prob: float num_blue: int num_red: int ind: int col: int series: tuple[int, ...] for series in product(range(2), repeat=num_turns): num_blue = series.count(1) num_red = num_turns - num_blue if num_red >= num_blue: continue prob = 1.0 for ind, col in enumerate(series, 2): if col == 0: prob *= (ind - 1) / ind else: prob *= 1 / ind total_prob += prob return int(1 / total_prob) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_122/__init__.py ================================================ ================================================ FILE: project_euler/problem_122/sol1.py ================================================ """ Project Euler Problem 122: https://projecteuler.net/problem=122 Efficient Exponentiation The most naive way of computing n^15 requires fourteen multiplications: n x n x ... x n = n^15. But using a "binary" method you can compute it in six multiplications: n x n = n^2 n^2 x n^2 = n^4 n^4 x n^4 = n^8 n^8 x n^4 = n^12 n^12 x n^2 = n^14 n^14 x n = n^15 However it is yet possible to compute it in only five multiplications: n x n = n^2 n^2 x n = n^3 n^3 x n^3 = n^6 n^6 x n^6 = n^12 n^12 x n^3 = n^15 We shall define m(k) to be the minimum number of multiplications to compute n^k; for example m(15) = 5. Find sum_{k = 1}^200 m(k). It uses the fact that for rather small n, applicable for this problem, the solution for each number can be formed by increasing the largest element. References: - https://en.wikipedia.org/wiki/Addition_chain """ def solve(nums: list[int], goal: int, depth: int) -> bool: """ Checks if nums can have a sum equal to goal, given that length of nums does not exceed depth. >>> solve([1], 2, 2) True >>> solve([1], 2, 0) False """ if len(nums) > depth: return False for el in nums: if el + nums[-1] == goal: return True nums.append(el + nums[-1]) if solve(nums=nums, goal=goal, depth=depth): return True del nums[-1] return False def solution(n: int = 200) -> int: """ Calculates sum of smallest number of multiplactions for each number up to and including n. >>> solution(1) 0 >>> solution(2) 1 >>> solution(14) 45 >>> solution(15) 50 """ total = 0 for i in range(2, n + 1): max_length = 0 while True: nums = [1] max_length += 1 if solve(nums=nums, goal=i, depth=max_length): break total += max_length return total if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_123/__init__.py ================================================ ================================================ FILE: project_euler/problem_123/sol1.py ================================================ """ Problem 123: https://projecteuler.net/problem=123 Name: Prime square remainders Let pn be the nth prime: 2, 3, 5, 7, 11, ..., and let r be the remainder when (pn-1)^n + (pn+1)^n is divided by pn^2. For example, when n = 3, p3 = 5, and 43 + 63 = 280 ≡ 5 mod 25. The least value of n for which the remainder first exceeds 10^9 is 7037. Find the least value of n for which the remainder first exceeds 10^10. Solution: n=1: (p-1) + (p+1) = 2p n=2: (p-1)^2 + (p+1)^2 = p^2 + 1 - 2p + p^2 + 1 + 2p (Using (p+b)^2 = (p^2 + b^2 + 2pb), (p-b)^2 = (p^2 + b^2 - 2pb) and b = 1) = 2p^2 + 2 n=3: (p-1)^3 + (p+1)^3 (Similarly using (p+b)^3 & (p-b)^3 formula and so on) = 2p^3 + 6p n=4: 2p^4 + 12p^2 + 2 n=5: 2p^5 + 20p^3 + 10p As you could see, when the expression is divided by p^2. Except for the last term, the rest will result in the remainder 0. n=1: 2p n=2: 2 n=3: 6p n=4: 2 n=5: 10p So it could be simplified as, r = 2pn when n is odd r = 2 when n is even. """ from __future__ import annotations from collections.abc import Generator def sieve() -> Generator[int]: """ Returns a prime number generator using sieve method. >>> type(sieve()) >>> primes = sieve() >>> next(primes) 2 >>> next(primes) 3 >>> next(primes) 5 >>> next(primes) 7 >>> next(primes) 11 >>> next(primes) 13 """ factor_map: dict[int, int] = {} prime = 2 while True: factor = factor_map.pop(prime, None) if factor: x = factor + prime while x in factor_map: x += factor factor_map[x] = factor else: factor_map[prime * prime] = prime yield prime prime += 1 def solution(limit: float = 1e10) -> int: """ Returns the least value of n for which the remainder first exceeds 10^10. >>> solution(1e8) 2371 >>> solution(1e9) 7037 """ primes = sieve() n = 1 while True: prime = next(primes) if (2 * prime * n) > limit: return n # Ignore the next prime as the reminder will be 2. next(primes) n += 2 if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_125/__init__.py ================================================ ================================================ FILE: project_euler/problem_125/sol1.py ================================================ """ Problem 125: https://projecteuler.net/problem=125 The palindromic number 595 is interesting because it can be written as the sum of consecutive squares: 6^2 + 7^2 + 8^2 + 9^2 + 10^2 + 11^2 + 12^2. There are exactly eleven palindromes below one-thousand that can be written as consecutive square sums, and the sum of these palindromes is 4164. Note that 1 = 0^2 + 1^2 has not been included as this problem is concerned with the squares of positive integers. Find the sum of all the numbers less than 10^8 that are both palindromic and can be written as the sum of consecutive squares. """ LIMIT = 10**8 def is_palindrome(n: int) -> bool: """ Check if an integer is palindromic. >>> is_palindrome(12521) True >>> is_palindrome(12522) False >>> is_palindrome(12210) False """ if n % 10 == 0: return False s = str(n) return s == s[::-1] def solution() -> int: """ Returns the sum of all numbers less than 1e8 that are both palindromic and can be written as the sum of consecutive squares. """ answer = set() first_square = 1 sum_squares = 5 while sum_squares < LIMIT: last_square = first_square + 1 while sum_squares < LIMIT: if is_palindrome(sum_squares): answer.add(sum_squares) last_square += 1 sum_squares += last_square**2 first_square += 1 sum_squares = first_square**2 + (first_square + 1) ** 2 return sum(answer) if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_129/__init__.py ================================================ ================================================ FILE: project_euler/problem_129/sol1.py ================================================ """ Project Euler Problem 129: https://projecteuler.net/problem=129 A number consisting entirely of ones is called a repunit. We shall define R(k) to be a repunit of length k; for example, R(6) = 111111. Given that n is a positive integer and GCD(n, 10) = 1, it can be shown that there always exists a value, k, for which R(k) is divisible by n, and let A(n) be the least such value of k; for example, A(7) = 6 and A(41) = 5. The least value of n for which A(n) first exceeds ten is 17. Find the least value of n for which A(n) first exceeds one-million. """ def least_divisible_repunit(divisor: int) -> int: """ Return the least value k such that the Repunit of length k is divisible by divisor. >>> least_divisible_repunit(7) 6 >>> least_divisible_repunit(41) 5 >>> least_divisible_repunit(1234567) 34020 """ if divisor % 5 == 0 or divisor % 2 == 0: return 0 repunit = 1 repunit_index = 1 while repunit: repunit = (10 * repunit + 1) % divisor repunit_index += 1 return repunit_index def solution(limit: int = 1000000) -> int: """ Return the least value of n for which least_divisible_repunit(n) first exceeds limit. >>> solution(10) 17 >>> solution(100) 109 >>> solution(1000) 1017 """ divisor = limit - 1 if divisor % 2 == 0: divisor += 1 while least_divisible_repunit(divisor) <= limit: divisor += 2 return divisor if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_131/__init__.py ================================================ ================================================ FILE: project_euler/problem_131/sol1.py ================================================ """ Project Euler Problem 131: https://projecteuler.net/problem=131 There are some prime values, p, for which there exists a positive integer, n, such that the expression n^3 + n^2p is a perfect cube. For example, when p = 19, 8^3 + 8^2 x 19 = 12^3. What is perhaps most surprising is that for each prime with this property the value of n is unique, and there are only four such primes below one-hundred. How many primes below one million have this remarkable property? """ from math import isqrt def is_prime(number: int) -> bool: """ Determines whether number is prime >>> is_prime(3) True >>> is_prime(4) False """ return all(number % divisor != 0 for divisor in range(2, isqrt(number) + 1)) def solution(max_prime: int = 10**6) -> int: """ Returns number of primes below max_prime with the property >>> solution(100) 4 """ primes_count = 0 cube_index = 1 prime_candidate = 7 while prime_candidate < max_prime: primes_count += is_prime(prime_candidate) cube_index += 1 prime_candidate += 6 * cube_index return primes_count if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_135/__init__.py ================================================ ================================================ FILE: project_euler/problem_135/sol1.py ================================================ """ Project Euler Problem 135: https://projecteuler.net/problem=135 Given the positive integers, x, y, and z, are consecutive terms of an arithmetic progression, the least value of the positive integer, n, for which the equation, x2 - y2 - z2 = n, has exactly two solutions is n = 27: 342 - 272 - 202 = 122 - 92 - 62 = 27 It turns out that n = 1155 is the least value which has exactly ten solutions. How many values of n less than one million have exactly ten distinct solutions? Taking x, y, z of the form a + d, a, a - d respectively, the given equation reduces to a * (4d - a) = n. Calculating no of solutions for every n till 1 million by fixing a, and n must be a multiple of a. Total no of steps = n * (1/1 + 1/2 + 1/3 + 1/4 + ... + 1/n), so roughly O(nlogn) time complexity. """ def solution(limit: int = 1000000) -> int: """ returns the values of n less than or equal to the limit have exactly ten distinct solutions. >>> solution(100) 0 >>> solution(10000) 45 >>> solution(50050) 292 """ limit = limit + 1 frequency = [0] * limit for first_term in range(1, limit): for n in range(first_term, limit, first_term): common_difference = first_term + n / first_term if common_difference % 4: # d must be divisible by 4 continue else: common_difference /= 4 if ( first_term > common_difference and first_term < 4 * common_difference ): # since x, y, z are positive integers frequency[n] += 1 # so z > 0, a > d and 4d < a count = sum(1 for x in frequency[1:limit] if x == 10) return count if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_136/__init__.py ================================================ ================================================ FILE: project_euler/problem_136/sol1.py ================================================ """ Project Euler Problem 136: https://projecteuler.net/problem=136 Singleton Difference The positive integers, x, y, and z, are consecutive terms of an arithmetic progression. Given that n is a positive integer, the equation, x^2 - y^2 - z^2 = n, has exactly one solution when n = 20: 13^2 - 10^2 - 7^2 = 20. In fact there are twenty-five values of n below one hundred for which the equation has a unique solution. How many values of n less than fifty million have exactly one solution? By change of variables x = y + delta z = y - delta The expression can be rewritten: x^2 - y^2 - z^2 = y * (4 * delta - y) = n The algorithm loops over delta and y, which is restricted in upper and lower limits, to count how many solutions each n has. In the end it is counted how many n's have one solution. """ def solution(n_limit: int = 50 * 10**6) -> int: """ Define n count list and loop over delta, y to get the counts, then check which n has count == 1. >>> solution(3) 0 >>> solution(10) 3 >>> solution(100) 25 >>> solution(110) 27 """ n_sol = [0] * n_limit for delta in range(1, (n_limit + 1) // 4 + 1): for y in range(4 * delta - 1, delta, -1): n = y * (4 * delta - y) if n >= n_limit: break n_sol[n] += 1 ans = 0 for i in range(n_limit): if n_sol[i] == 1: ans += 1 return ans if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_144/__init__.py ================================================ ================================================ FILE: project_euler/problem_144/sol1.py ================================================ """ In laser physics, a "white cell" is a mirror system that acts as a delay line for the laser beam. The beam enters the cell, bounces around on the mirrors, and eventually works its way back out. The specific white cell we will be considering is an ellipse with the equation 4x^2 + y^2 = 100 The section corresponding to -0.01 ≤ x ≤ +0.01 at the top is missing, allowing the light to enter and exit through the hole.  The light beam in this problem starts at the point (0.0,10.1) just outside the white cell, and the beam first impacts the mirror at (1.4,-9.6). Each time the laser beam hits the surface of the ellipse, it follows the usual law of reflection "angle of incidence equals angle of reflection." That is, both the incident and reflected beams make the same angle with the normal line at the point of incidence. In the figure on the left, the red line shows the first two points of contact between the laser beam and the wall of the white cell; the blue line shows the line tangent to the ellipse at the point of incidence of the first bounce. The slope m of the tangent line at any point (x,y) of the given ellipse is: m = -4x/y The normal line is perpendicular to this tangent line at the point of incidence. The animation on the right shows the first 10 reflections of the beam. How many times does the beam hit the internal surface of the white cell before exiting? """ from math import isclose, sqrt def next_point( point_x: float, point_y: float, incoming_gradient: float ) -> tuple[float, float, float]: """ Given that a laser beam hits the interior of the white cell at point (point_x, point_y) with gradient incoming_gradient, return a tuple (x,y,m1) where the next point of contact with the interior is (x,y) with gradient m1. >>> next_point(5.0, 0.0, 0.0) (-5.0, 0.0, 0.0) >>> next_point(5.0, 0.0, -2.0) (0.0, -10.0, 2.0) """ # normal_gradient = gradient of line through which the beam is reflected # outgoing_gradient = gradient of reflected line normal_gradient = point_y / 4 / point_x s2 = 2 * normal_gradient / (1 + normal_gradient * normal_gradient) c2 = (1 - normal_gradient * normal_gradient) / ( 1 + normal_gradient * normal_gradient ) outgoing_gradient = (s2 - c2 * incoming_gradient) / (c2 + s2 * incoming_gradient) # to find the next point, solve the simultaeneous equations: # y^2 + 4x^2 = 100 # y - b = m * (x - a) # ==> A x^2 + B x + C = 0 quadratic_term = outgoing_gradient**2 + 4 linear_term = 2 * outgoing_gradient * (point_y - outgoing_gradient * point_x) constant_term = (point_y - outgoing_gradient * point_x) ** 2 - 100 x_minus = ( -linear_term - sqrt(linear_term**2 - 4 * quadratic_term * constant_term) ) / (2 * quadratic_term) x_plus = ( -linear_term + sqrt(linear_term**2 - 4 * quadratic_term * constant_term) ) / (2 * quadratic_term) # two solutions, one of which is our input point next_x = x_minus if isclose(x_plus, point_x) else x_plus next_y = point_y + outgoing_gradient * (next_x - point_x) return next_x, next_y, outgoing_gradient def solution(first_x_coord: float = 1.4, first_y_coord: float = -9.6) -> int: """ Return the number of times that the beam hits the interior wall of the cell before exiting. >>> solution(0.00001,-10) 1 >>> solution(5, 0) 287 """ num_reflections: int = 0 point_x: float = first_x_coord point_y: float = first_y_coord gradient: float = (10.1 - point_y) / (0.0 - point_x) while not (-0.01 <= point_x <= 0.01 and point_y > 0): point_x, point_y, gradient = next_point(point_x, point_y, gradient) num_reflections += 1 return num_reflections if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_145/__init__.py ================================================ ================================================ FILE: project_euler/problem_145/sol1.py ================================================ """ Project Euler problem 145: https://projecteuler.net/problem=145 Author: Vineet Rao, Maxim Smolskiy Problem statement: Some positive integers n have the property that the sum [ n + reverse(n) ] consists entirely of odd (decimal) digits. For instance, 36 + 63 = 99 and 409 + 904 = 1313. We will call such numbers reversible; so 36, 63, 409, and 904 are reversible. Leading zeroes are not allowed in either n or reverse(n). There are 120 reversible numbers below one-thousand. How many reversible numbers are there below one-billion (10^9)? """ EVEN_DIGITS = [0, 2, 4, 6, 8] ODD_DIGITS = [1, 3, 5, 7, 9] def slow_reversible_numbers( remaining_length: int, remainder: int, digits: list[int], length: int ) -> int: """ Count the number of reversible numbers of given length. Iterate over possible digits considering parity of current sum remainder. >>> slow_reversible_numbers(1, 0, [0], 1) 0 >>> slow_reversible_numbers(2, 0, [0] * 2, 2) 20 >>> slow_reversible_numbers(3, 0, [0] * 3, 3) 100 """ if remaining_length == 0: if digits[0] == 0 or digits[-1] == 0: return 0 for i in range(length // 2 - 1, -1, -1): remainder += digits[i] + digits[length - i - 1] if remainder % 2 == 0: return 0 remainder //= 10 return 1 if remaining_length == 1: if remainder % 2 == 0: return 0 result = 0 for digit in range(10): digits[length // 2] = digit result += slow_reversible_numbers( 0, (remainder + 2 * digit) // 10, digits, length ) return result result = 0 for digit1 in range(10): digits[(length + remaining_length) // 2 - 1] = digit1 if (remainder + digit1) % 2 == 0: other_parity_digits = ODD_DIGITS else: other_parity_digits = EVEN_DIGITS for digit2 in other_parity_digits: digits[(length - remaining_length) // 2] = digit2 result += slow_reversible_numbers( remaining_length - 2, (remainder + digit1 + digit2) // 10, digits, length, ) return result def slow_solution(max_power: int = 9) -> int: """ To evaluate the solution, use solution() >>> slow_solution(3) 120 >>> slow_solution(6) 18720 >>> slow_solution(7) 68720 """ result = 0 for length in range(1, max_power + 1): result += slow_reversible_numbers(length, 0, [0] * length, length) return result def reversible_numbers( remaining_length: int, remainder: int, digits: list[int], length: int ) -> int: """ Count the number of reversible numbers of given length. Iterate over possible digits considering parity of current sum remainder. >>> reversible_numbers(1, 0, [0], 1) 0 >>> reversible_numbers(2, 0, [0] * 2, 2) 20 >>> reversible_numbers(3, 0, [0] * 3, 3) 100 """ # There exist no reversible 1, 5, 9, 13 (ie. 4k+1) digit numbers if (length - 1) % 4 == 0: return 0 return slow_reversible_numbers(remaining_length, remainder, digits, length) def solution(max_power: int = 9) -> int: """ To evaluate the solution, use solution() >>> solution(3) 120 >>> solution(6) 18720 >>> solution(7) 68720 """ result = 0 for length in range(1, max_power + 1): result += reversible_numbers(length, 0, [0] * length, length) return result def benchmark() -> None: """ Benchmarks """ # Running performance benchmarks... # slow_solution : 292.9300301000003 # solution : 54.90970860000016 from timeit import timeit print("Running performance benchmarks...") print(f"slow_solution : {timeit('slow_solution()', globals=globals(), number=10)}") print(f"solution : {timeit('solution()', globals=globals(), number=10)}") if __name__ == "__main__": print(f"Solution : {solution()}") benchmark() # for i in range(1, 15): # print(f"{i}. {reversible_numbers(i, 0, [0]*i, i)}") ================================================ FILE: project_euler/problem_164/__init__.py ================================================ ================================================ FILE: project_euler/problem_164/sol1.py ================================================ """ Project Euler Problem 164: https://projecteuler.net/problem=164 Three Consecutive Digital Sum Limit How many 20 digit numbers n (without any leading zero) exist such that no three consecutive digits of n have a sum greater than 9? Brute-force recursive solution with caching of intermediate results. """ def solve( digit: int, prev1: int, prev2: int, sum_max: int, first: bool, cache: dict[str, int] ) -> int: """ Solve for remaining 'digit' digits, with previous 'prev1' digit, and previous-previous 'prev2' digit, total sum of 'sum_max'. Pass around 'cache' to store/reuse intermediate results. >>> solve(digit=1, prev1=0, prev2=0, sum_max=9, first=True, cache={}) 9 >>> solve(digit=1, prev1=0, prev2=0, sum_max=9, first=False, cache={}) 10 """ if digit == 0: return 1 cache_str = f"{digit},{prev1},{prev2}" if cache_str in cache: return cache[cache_str] comb = 0 for curr in range(sum_max - prev1 - prev2 + 1): if first and curr == 0: continue comb += solve( digit=digit - 1, prev1=curr, prev2=prev1, sum_max=sum_max, first=False, cache=cache, ) cache[cache_str] = comb return comb def solution(n_digits: int = 20) -> int: """ Solves the problem for n_digits number of digits. >>> solution(2) 45 >>> solution(10) 21838806 """ cache: dict[str, int] = {} return solve(digit=n_digits, prev1=0, prev2=0, sum_max=9, first=True, cache=cache) if __name__ == "__main__": print(f"{solution(10) = }") ================================================ FILE: project_euler/problem_173/__init__.py ================================================ ================================================ FILE: project_euler/problem_173/sol1.py ================================================ """ Project Euler Problem 173: https://projecteuler.net/problem=173 We shall define a square lamina to be a square outline with a square "hole" so that the shape possesses vertical and horizontal symmetry. For example, using exactly thirty-two square tiles we can form two different square laminae: With one-hundred tiles, and not necessarily using all of the tiles at one time, it is possible to form forty-one different square laminae. Using up to one million tiles how many different square laminae can be formed? """ from math import ceil, sqrt def solution(limit: int = 1000000) -> int: """ Return the number of different square laminae that can be formed using up to one million tiles. >>> solution(100) 41 """ answer = 0 for outer_width in range(3, (limit // 4) + 2): if outer_width**2 > limit: hole_width_lower_bound = max(ceil(sqrt(outer_width**2 - limit)), 1) else: hole_width_lower_bound = 1 if (outer_width - hole_width_lower_bound) % 2: hole_width_lower_bound += 1 answer += (outer_width - hole_width_lower_bound - 2) // 2 + 1 return answer if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_174/__init__.py ================================================ ================================================ FILE: project_euler/problem_174/sol1.py ================================================ """ Project Euler Problem 174: https://projecteuler.net/problem=174 We shall define a square lamina to be a square outline with a square "hole" so that the shape possesses vertical and horizontal symmetry. Given eight tiles it is possible to form a lamina in only one way: 3x3 square with a 1x1 hole in the middle. However, using thirty-two tiles it is possible to form two distinct laminae. If t represents the number of tiles used, we shall say that t = 8 is type L(1) and t = 32 is type L(2). Let N(n) be the number of t ≤ 1000000 such that t is type L(n); for example, N(15) = 832. What is sum N(n) for 1 ≤ n ≤ 10? """ from collections import defaultdict from math import ceil, sqrt def solution(t_limit: int = 1000000, n_limit: int = 10) -> int: """ Return the sum of N(n) for 1 <= n <= n_limit. >>> solution(1000,5) 222 >>> solution(1000,10) 249 >>> solution(10000,10) 2383 """ count: defaultdict = defaultdict(int) for outer_width in range(3, (t_limit // 4) + 2): if outer_width * outer_width > t_limit: hole_width_lower_bound = max( ceil(sqrt(outer_width * outer_width - t_limit)), 1 ) else: hole_width_lower_bound = 1 hole_width_lower_bound += (outer_width - hole_width_lower_bound) % 2 for hole_width in range(hole_width_lower_bound, outer_width - 1, 2): count[outer_width * outer_width - hole_width * hole_width] += 1 return sum(1 for n in count.values() if 1 <= n <= n_limit) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_180/__init__.py ================================================ ================================================ FILE: project_euler/problem_180/sol1.py ================================================ """ Project Euler Problem 234: https://projecteuler.net/problem=234 For any integer n, consider the three functions f1,n(x,y,z) = x^(n+1) + y^(n+1) - z^(n+1) f2,n(x,y,z) = (xy + yz + zx)*(x^(n-1) + y^(n-1) - z^(n-1)) f3,n(x,y,z) = xyz*(xn-2 + yn-2 - zn-2) and their combination fn(x,y,z) = f1,n(x,y,z) + f2,n(x,y,z) - f3,n(x,y,z) We call (x,y,z) a golden triple of order k if x, y, and z are all rational numbers of the form a / b with 0 < a < b ≤ k and there is (at least) one integer n, so that fn(x,y,z) = 0. Let s(x,y,z) = x + y + z. Let t = u / v be the sum of all distinct s(x,y,z) for all golden triples (x,y,z) of order 35. All the s(x,y,z) and t must be in reduced form. Find u + v. Solution: By expanding the brackets it is easy to show that fn(x, y, z) = (x + y + z) * (x^n + y^n - z^n). Since x,y,z are positive, the requirement fn(x, y, z) = 0 is fulfilled if and only if x^n + y^n = z^n. By Fermat's Last Theorem, this means that the absolute value of n can not exceed 2, i.e. n is in {-2, -1, 0, 1, 2}. We can eliminate n = 0 since then the equation would reduce to 1 + 1 = 1, for which there are no solutions. So all we have to do is iterate through the possible numerators and denominators of x and y, calculate the corresponding z, and check if the corresponding numerator and denominator are integer and satisfy 0 < z_num < z_den <= 0. We use a set "uniquq_s" to make sure there are no duplicates, and the fractions.Fraction class to make sure we get the right numerator and denominator. Reference: https://en.wikipedia.org/wiki/Fermat%27s_Last_Theorem """ from __future__ import annotations from fractions import Fraction from math import gcd, sqrt def is_sq(number: int) -> bool: """ Check if number is a perfect square. >>> is_sq(1) True >>> is_sq(1000001) False >>> is_sq(1000000) True """ sq: int = int(number**0.5) return number == sq * sq def add_three( x_num: int, x_den: int, y_num: int, y_den: int, z_num: int, z_den: int ) -> tuple[int, int]: """ Given the numerators and denominators of three fractions, return the numerator and denominator of their sum in lowest form. >>> add_three(1, 3, 1, 3, 1, 3) (1, 1) >>> add_three(2, 5, 4, 11, 12, 3) (262, 55) """ top: int = x_num * y_den * z_den + y_num * x_den * z_den + z_num * x_den * y_den bottom: int = x_den * y_den * z_den hcf: int = gcd(top, bottom) top //= hcf bottom //= hcf return top, bottom def solution(order: int = 35) -> int: """ Find the sum of the numerator and denominator of the sum of all s(x,y,z) for golden triples (x,y,z) of the given order. >>> solution(5) 296 >>> solution(10) 12519 >>> solution(20) 19408891927 """ unique_s: set = set() hcf: int total: Fraction = Fraction(0) fraction_sum: tuple[int, int] for x_num in range(1, order + 1): for x_den in range(x_num + 1, order + 1): for y_num in range(1, order + 1): for y_den in range(y_num + 1, order + 1): # n=1 z_num = x_num * y_den + x_den * y_num z_den = x_den * y_den hcf = gcd(z_num, z_den) z_num //= hcf z_den //= hcf if 0 < z_num < z_den <= order: fraction_sum = add_three( x_num, x_den, y_num, y_den, z_num, z_den ) unique_s.add(fraction_sum) # n=2 z_num = ( x_num * x_num * y_den * y_den + x_den * x_den * y_num * y_num ) z_den = x_den * x_den * y_den * y_den if is_sq(z_num) and is_sq(z_den): z_num = int(sqrt(z_num)) z_den = int(sqrt(z_den)) hcf = gcd(z_num, z_den) z_num //= hcf z_den //= hcf if 0 < z_num < z_den <= order: fraction_sum = add_three( x_num, x_den, y_num, y_den, z_num, z_den ) unique_s.add(fraction_sum) # n=-1 z_num = x_num * y_num z_den = x_den * y_num + x_num * y_den hcf = gcd(z_num, z_den) z_num //= hcf z_den //= hcf if 0 < z_num < z_den <= order: fraction_sum = add_three( x_num, x_den, y_num, y_den, z_num, z_den ) unique_s.add(fraction_sum) # n=2 z_num = x_num * x_num * y_num * y_num z_den = ( x_den * x_den * y_num * y_num + x_num * x_num * y_den * y_den ) if is_sq(z_num) and is_sq(z_den): z_num = int(sqrt(z_num)) z_den = int(sqrt(z_den)) hcf = gcd(z_num, z_den) z_num //= hcf z_den //= hcf if 0 < z_num < z_den <= order: fraction_sum = add_three( x_num, x_den, y_num, y_den, z_num, z_den ) unique_s.add(fraction_sum) for num, den in unique_s: total += Fraction(num, den) return total.denominator + total.numerator if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_187/__init__.py ================================================ ================================================ FILE: project_euler/problem_187/sol1.py ================================================ """ Project Euler Problem 187: https://projecteuler.net/problem=187 A composite is a number containing at least two prime factors. For example, 15 = 3 x 5; 9 = 3 x 3; 12 = 2 x 2 x 3. There are ten composites below thirty containing precisely two, not necessarily distinct, prime factors: 4, 6, 9, 10, 14, 15, 21, 22, 25, 26. How many composite integers, n < 10^8, have precisely two, not necessarily distinct, prime factors? """ from math import isqrt def slow_calculate_prime_numbers(max_number: int) -> list[int]: """ Returns prime numbers below max_number. See: https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes >>> slow_calculate_prime_numbers(10) [2, 3, 5, 7] >>> slow_calculate_prime_numbers(2) [] """ # List containing a bool value for every number below max_number/2 is_prime = [True] * max_number for i in range(2, isqrt(max_number - 1) + 1): if is_prime[i]: # Mark all multiple of i as not prime for j in range(i**2, max_number, i): is_prime[j] = False return [i for i in range(2, max_number) if is_prime[i]] def calculate_prime_numbers(max_number: int) -> list[int]: """ Returns prime numbers below max_number. See: https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes >>> calculate_prime_numbers(10) [2, 3, 5, 7] >>> calculate_prime_numbers(2) [] """ if max_number <= 2: return [] # List containing a bool value for every odd number below max_number/2 is_prime = [True] * (max_number // 2) for i in range(3, isqrt(max_number - 1) + 1, 2): if is_prime[i // 2]: # Mark all multiple of i as not prime using list slicing is_prime[i**2 // 2 :: i] = [False] * ( # Same as: (max_number - (i**2)) // (2 * i) + 1 # but faster than len(is_prime[i**2 // 2 :: i]) len(range(i**2 // 2, max_number // 2, i)) ) return [2] + [2 * i + 1 for i in range(1, max_number // 2) if is_prime[i]] def slow_solution(max_number: int = 10**8) -> int: """ Returns the number of composite integers below max_number have precisely two, not necessarily distinct, prime factors. >>> slow_solution(30) 10 """ prime_numbers = slow_calculate_prime_numbers(max_number // 2) semiprimes_count = 0 left = 0 right = len(prime_numbers) - 1 while left <= right: while prime_numbers[left] * prime_numbers[right] >= max_number: right -= 1 semiprimes_count += right - left + 1 left += 1 return semiprimes_count def while_solution(max_number: int = 10**8) -> int: """ Returns the number of composite integers below max_number have precisely two, not necessarily distinct, prime factors. >>> while_solution(30) 10 """ prime_numbers = calculate_prime_numbers(max_number // 2) semiprimes_count = 0 left = 0 right = len(prime_numbers) - 1 while left <= right: while prime_numbers[left] * prime_numbers[right] >= max_number: right -= 1 semiprimes_count += right - left + 1 left += 1 return semiprimes_count def solution(max_number: int = 10**8) -> int: """ Returns the number of composite integers below max_number have precisely two, not necessarily distinct, prime factors. >>> solution(30) 10 """ prime_numbers = calculate_prime_numbers(max_number // 2) semiprimes_count = 0 right = len(prime_numbers) - 1 for left in range(len(prime_numbers)): if left > right: break for r in range(right, left - 2, -1): if prime_numbers[left] * prime_numbers[r] < max_number: break right = r semiprimes_count += right - left + 1 return semiprimes_count def benchmark() -> None: """ Benchmarks """ # Running performance benchmarks... # slow_solution : 108.50874730000032 # while_sol : 28.09581200000048 # solution : 25.063097400000515 from timeit import timeit print("Running performance benchmarks...") print(f"slow_solution : {timeit('slow_solution()', globals=globals(), number=10)}") print(f"while_sol : {timeit('while_solution()', globals=globals(), number=10)}") print(f"solution : {timeit('solution()', globals=globals(), number=10)}") if __name__ == "__main__": print(f"Solution: {solution()}") benchmark() ================================================ FILE: project_euler/problem_188/__init__.py ================================================ ================================================ FILE: project_euler/problem_188/sol1.py ================================================ """ Project Euler Problem 188: https://projecteuler.net/problem=188 The hyperexponentiation of a number The hyperexponentiation or tetration of a number a by a positive integer b, denoted by a↑↑b or b^a, is recursively defined by: a↑↑1 = a, a↑↑(k+1) = a(a↑↑k). Thus we have e.g. 3↑↑2 = 3^3 = 27, hence 3↑↑3 = 3^27 = 7625597484987 and 3↑↑4 is roughly 103.6383346400240996*10^12. Find the last 8 digits of 1777↑↑1855. References: - https://en.wikipedia.org/wiki/Tetration """ # small helper function for modular exponentiation (fast exponentiation algorithm) def _modexpt(base: int, exponent: int, modulo_value: int) -> int: """ Returns the modular exponentiation, that is the value of `base ** exponent % modulo_value`, without calculating the actual number. >>> _modexpt(2, 4, 10) 6 >>> _modexpt(2, 1024, 100) 16 >>> _modexpt(13, 65535, 7) 6 """ if exponent == 1: return base if exponent % 2 == 0: x = _modexpt(base, exponent // 2, modulo_value) % modulo_value return (x * x) % modulo_value else: return (base * _modexpt(base, exponent - 1, modulo_value)) % modulo_value def solution(base: int = 1777, height: int = 1855, digits: int = 8) -> int: """ Returns the last 8 digits of the hyperexponentiation of base by height, i.e. the number base↑↑height: >>> solution(base=3, height=2) 27 >>> solution(base=3, height=3) 97484987 >>> solution(base=123, height=456, digits=4) 2547 """ # calculate base↑↑height by right-assiciative repeated modular # exponentiation result = base for _ in range(1, height): result = _modexpt(base, result, 10**digits) return result if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_190/__init__.py ================================================ ================================================ FILE: project_euler/problem_190/sol1.py ================================================ """ Project Euler Problem 190: https://projecteuler.net/problem=190 Maximising a Weighted Product Let S_m = (x_1, x_2, ..., x_m) be the m-tuple of positive real numbers with x_1 + x_2 + ... + x_m = m for which P_m = x_1 * x_2^2 * ... * x_m^m is maximised. For example, it can be verified that |_ P_10 _| = 4112 (|_ _| is the integer part function). Find Sum_{m=2}^15 = |_ P_m _|. Solution: - Fix x_1 = m - x_2 - ... - x_m. - Calculate partial derivatives of P_m wrt the x_2, ..., x_m. This gives that x_2 = 2 * x_1, x_3 = 3 * x_1, ..., x_m = m * x_1. - Calculate partial second order derivatives of P_m wrt the x_2, ..., x_m. By plugging in the values from the previous step, can verify that solution is maximum. """ def solution(n: int = 15) -> int: """ Calculate sum of |_ P_m _| for m from 2 to n. >>> solution(2) 1 >>> solution(3) 2 >>> solution(4) 4 >>> solution(5) 10 """ total = 0 for m in range(2, n + 1): x1 = 2 / (m + 1) p = 1.0 for i in range(1, m + 1): xi = i * x1 p *= xi**i total += int(p) return total if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_191/__init__.py ================================================ ================================================ FILE: project_euler/problem_191/sol1.py ================================================ """ Prize Strings Problem 191 A particular school offers cash rewards to children with good attendance and punctuality. If they are absent for three consecutive days or late on more than one occasion then they forfeit their prize. During an n-day period a trinary string is formed for each child consisting of L's (late), O's (on time), and A's (absent). Although there are eighty-one trinary strings for a 4-day period that can be formed, exactly forty-three strings would lead to a prize: OOOO OOOA OOOL OOAO OOAA OOAL OOLO OOLA OAOO OAOA OAOL OAAO OAAL OALO OALA OLOO OLOA OLAO OLAA AOOO AOOA AOOL AOAO AOAA AOAL AOLO AOLA AAOO AAOA AAOL AALO AALA ALOO ALOA ALAO ALAA LOOO LOOA LOAO LOAA LAOO LAOA LAAO How many "prize" strings exist over a 30-day period? References: - The original Project Euler project page: https://projecteuler.net/problem=191 """ cache: dict[tuple[int, int, int], int] = {} def _calculate(days: int, absent: int, late: int) -> int: """ A small helper function for the recursion, mainly to have a clean interface for the solution() function below. It should get called with the number of days (corresponding to the desired length of the 'prize strings'), and the initial values for the number of consecutive absent days and number of total late days. >>> _calculate(days=4, absent=0, late=0) 43 >>> _calculate(days=30, absent=2, late=0) 0 >>> _calculate(days=30, absent=1, late=0) 98950096 """ # if we are absent twice, or late 3 consecutive days, # no further prize strings are possible if late == 3 or absent == 2: return 0 # if we have no days left, and have not failed any other rules, # we have a prize string if days == 0: return 1 # No easy solution, so now we need to do the recursive calculation # First, check if the combination is already in the cache, and # if yes, return the stored value from there since we already # know the number of possible prize strings from this point on key = (days, absent, late) if key in cache: return cache[key] # now we calculate the three possible ways that can unfold from # this point on, depending on our attendance today # 1) if we are late (but not absent), the "absent" counter stays as # it is, but the "late" counter increases by one state_late = _calculate(days - 1, absent, late + 1) # 2) if we are absent, the "absent" counter increases by 1, and the # "late" counter resets to 0 state_absent = _calculate(days - 1, absent + 1, 0) # 3) if we are on time, this resets the "late" counter and keeps the # absent counter state_ontime = _calculate(days - 1, absent, 0) prizestrings = state_late + state_absent + state_ontime cache[key] = prizestrings return prizestrings def solution(days: int = 30) -> int: """ Returns the number of possible prize strings for a particular number of days, using a simple recursive function with caching to speed it up. >>> solution() 1918080160 >>> solution(4) 43 """ return _calculate(days, absent=0, late=0) if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_203/__init__.py ================================================ ================================================ FILE: project_euler/problem_203/sol1.py ================================================ """ Project Euler Problem 203: https://projecteuler.net/problem=203 The binomial coefficients (n k) can be arranged in triangular form, Pascal's triangle, like this: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 ......... It can be seen that the first eight rows of Pascal's triangle contain twelve distinct numbers: 1, 2, 3, 4, 5, 6, 7, 10, 15, 20, 21 and 35. A positive integer n is called squarefree if no square of a prime divides n. Of the twelve distinct numbers in the first eight rows of Pascal's triangle, all except 4 and 20 are squarefree. The sum of the distinct squarefree numbers in the first eight rows is 105. Find the sum of the distinct squarefree numbers in the first 51 rows of Pascal's triangle. References: - https://en.wikipedia.org/wiki/Pascal%27s_triangle """ from __future__ import annotations def get_pascal_triangle_unique_coefficients(depth: int) -> set[int]: """ Returns the unique coefficients of a Pascal's triangle of depth "depth". The coefficients of this triangle are symmetric. A further improvement to this method could be to calculate the coefficients once per level. Nonetheless, the current implementation is fast enough for the original problem. >>> get_pascal_triangle_unique_coefficients(1) {1} >>> get_pascal_triangle_unique_coefficients(2) {1} >>> get_pascal_triangle_unique_coefficients(3) {1, 2} >>> get_pascal_triangle_unique_coefficients(8) {1, 2, 3, 4, 5, 6, 7, 35, 10, 15, 20, 21} """ coefficients = {1} previous_coefficients = [1] for _ in range(2, depth + 1): coefficients_begins_one = [*previous_coefficients, 0] coefficients_ends_one = [0, *previous_coefficients] previous_coefficients = [] for x, y in zip(coefficients_begins_one, coefficients_ends_one): coefficients.add(x + y) previous_coefficients.append(x + y) return coefficients def get_squarefrees(unique_coefficients: set[int]) -> set[int]: """ Calculates the squarefree numbers inside unique_coefficients. Based on the definition of a non-squarefree number, then any non-squarefree n can be decomposed as n = p*p*r, where p is positive prime number and r is a positive integer. Under the previous formula, any coefficient that is lower than p*p is squarefree as r cannot be negative. On the contrary, if any r exists such that n = p*p*r, then the number is non-squarefree. >>> get_squarefrees({1}) {1} >>> get_squarefrees({1, 2}) {1, 2} >>> get_squarefrees({1, 2, 3, 4, 5, 6, 7, 35, 10, 15, 20, 21}) {1, 2, 3, 5, 6, 7, 35, 10, 15, 21} """ non_squarefrees = set() for number in unique_coefficients: divisor = 2 copy_number = number while divisor**2 <= copy_number: multiplicity = 0 while copy_number % divisor == 0: copy_number //= divisor multiplicity += 1 if multiplicity >= 2: non_squarefrees.add(number) break divisor += 1 return unique_coefficients.difference(non_squarefrees) def solution(n: int = 51) -> int: """ Returns the sum of squarefrees for a given Pascal's Triangle of depth n. >>> solution(1) 1 >>> solution(8) 105 >>> solution(9) 175 """ unique_coefficients = get_pascal_triangle_unique_coefficients(n) squarefrees = get_squarefrees(unique_coefficients) return sum(squarefrees) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_205/__init__.py ================================================ ================================================ FILE: project_euler/problem_205/sol1.py ================================================ """ Project Euler Problem 205: https://projecteuler.net/problem=205 Peter has nine four-sided (pyramidal) dice, each with faces numbered 1, 2, 3, 4. Colin has six six-sided (cubic) dice, each with faces numbered 1, 2, 3, 4, 5, 6. Peter and Colin roll their dice and compare totals: the highest total wins. The result is a draw if the totals are equal. What is the probability that Pyramidal Peter beats Cubic Colin? Give your answer rounded to seven decimal places in the form 0.abcdefg """ from itertools import product def total_frequency_distribution(sides_number: int, dice_number: int) -> list[int]: """ Returns frequency distribution of total >>> total_frequency_distribution(sides_number=6, dice_number=1) [0, 1, 1, 1, 1, 1, 1] >>> total_frequency_distribution(sides_number=4, dice_number=2) [0, 0, 1, 2, 3, 4, 3, 2, 1] """ max_face_number = sides_number max_total = max_face_number * dice_number totals_frequencies = [0] * (max_total + 1) min_face_number = 1 faces_numbers = range(min_face_number, max_face_number + 1) for dice_numbers in product(faces_numbers, repeat=dice_number): total = sum(dice_numbers) totals_frequencies[total] += 1 return totals_frequencies def solution() -> float: """ Returns probability that Pyramidal Peter beats Cubic Colin rounded to seven decimal places in the form 0.abcdefg >>> solution() 0.5731441 """ peter_totals_frequencies = total_frequency_distribution( sides_number=4, dice_number=9 ) colin_totals_frequencies = total_frequency_distribution( sides_number=6, dice_number=6 ) peter_wins_count = 0 min_peter_total = 9 max_peter_total = 4 * 9 min_colin_total = 6 for peter_total in range(min_peter_total, max_peter_total + 1): peter_wins_count += peter_totals_frequencies[peter_total] * sum( colin_totals_frequencies[min_colin_total:peter_total] ) total_games_number = (4**9) * (6**6) peter_win_probability = peter_wins_count / total_games_number rounded_peter_win_probability = round(peter_win_probability, ndigits=7) return rounded_peter_win_probability if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_206/__init__.py ================================================ ================================================ FILE: project_euler/problem_206/sol1.py ================================================ """ Project Euler Problem 206: https://projecteuler.net/problem=206 Find the unique positive integer whose square has the form 1_2_3_4_5_6_7_8_9_0, where each “_” is a single digit. ----- Instead of computing every single permutation of that number and going through a 10^9 search space, we can narrow it down considerably. If the square ends in a 0, then the square root must also end in a 0. Thus, the last missing digit must be 0 and the square root is a multiple of 10. We can narrow the search space down to the first 8 digits and multiply the result of that by 10 at the end. Now the last digit is a 9, which can only happen if the square root ends in a 3 or 7. From this point, we can try one of two different methods to find the answer: 1. Start at the lowest possible base number whose square would be in the format, and count up. The base we would start at is 101010103, whose square is the closest number to 10203040506070809. Alternate counting up by 4 and 6 so the last digit of the base is always a 3 or 7. 2. Start at the highest possible base number whose square would be in the format, and count down. That base would be 138902663, whose square is the closest number to 1929394959697989. Alternate counting down by 6 and 4 so the last digit of the base is always a 3 or 7. The solution does option 2 because the answer happens to be much closer to the starting point. """ def is_square_form(num: int) -> bool: """ Determines if num is in the form 1_2_3_4_5_6_7_8_9 >>> is_square_form(1) False >>> is_square_form(112233445566778899) True >>> is_square_form(123456789012345678) False """ digit = 9 while num > 0: if num % 10 != digit: return False num //= 100 digit -= 1 return True def solution() -> int: """ Returns the first integer whose square is of the form 1_2_3_4_5_6_7_8_9_0 """ num = 138902663 while not is_square_form(num * num): if num % 10 == 3: num -= 6 # (3 - 6) % 10 = 7 else: num -= 4 # (7 - 4) % 10 = 3 return num * 10 if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_207/__init__.py ================================================ ================================================ FILE: project_euler/problem_207/sol1.py ================================================ """ Project Euler Problem 207: https://projecteuler.net/problem=207 Problem Statement: For some positive integers k, there exists an integer partition of the form 4**t = 2**t + k, where 4**t, 2**t, and k are all positive integers and t is a real number. The first two such partitions are 4**1 = 2**1 + 2 and 4**1.5849625... = 2**1.5849625... + 6. Partitions where t is also an integer are called perfect. For any m ≥ 1 let P(m) be the proportion of such partitions that are perfect with k ≤ m. Thus P(6) = 1/2. In the following table are listed some values of P(m) P(5) = 1/1 P(10) = 1/2 P(15) = 2/3 P(20) = 1/2 P(25) = 1/2 P(30) = 2/5 ... P(180) = 1/4 P(185) = 3/13 Find the smallest m for which P(m) < 1/12345 Solution: Equation 4**t = 2**t + k solved for t gives: t = log2(sqrt(4*k+1)/2 + 1/2) For t to be real valued, sqrt(4*k+1) must be an integer which is implemented in function check_t_real(k). For a perfect partition t must be an integer. To speed up significantly the search for partitions, instead of incrementing k by one per iteration, the next valid k is found by k = (i**2 - 1) / 4 with an integer i and k has to be a positive integer. If this is the case a partition is found. The partition is perfect if t os an integer. The integer i is increased with increment 1 until the proportion perfect partitions / total partitions drops under the given value. """ import math def check_partition_perfect(positive_integer: int) -> bool: """ Check if t = f(positive_integer) = log2(sqrt(4*positive_integer+1)/2 + 1/2) is a real number. >>> check_partition_perfect(2) True >>> check_partition_perfect(6) False """ exponent = math.log2(math.sqrt(4 * positive_integer + 1) / 2 + 1 / 2) return exponent == int(exponent) def solution(max_proportion: float = 1 / 12345) -> int: """ Find m for which the proportion of perfect partitions to total partitions is lower than max_proportion >>> solution(1) > 5 True >>> solution(1/2) > 10 True >>> solution(3 / 13) > 185 True """ total_partitions = 0 perfect_partitions = 0 integer = 3 while True: partition_candidate = (integer**2 - 1) / 4 # if candidate is an integer, then there is a partition for k if partition_candidate == int(partition_candidate): partition_candidate = int(partition_candidate) total_partitions += 1 if check_partition_perfect(partition_candidate): perfect_partitions += 1 if ( perfect_partitions > 0 and perfect_partitions / total_partitions < max_proportion ): return int(partition_candidate) integer += 1 if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_234/__init__.py ================================================ ================================================ FILE: project_euler/problem_234/sol1.py ================================================ """ https://projecteuler.net/problem=234 For an integer n ≥ 4, we define the lower prime square root of n, denoted by lps(n), as the largest prime ≤ √n and the upper prime square root of n, ups(n), as the smallest prime ≥ √n. So, for example, lps(4) = 2 = ups(4), lps(1000) = 31, ups(1000) = 37. Let us call an integer n ≥ 4 semidivisible, if one of lps(n) and ups(n) divides n, but not both. The sum of the semidivisible numbers not exceeding 15 is 30, the numbers are 8, 10 and 12. 15 is not semidivisible because it is a multiple of both lps(15) = 3 and ups(15) = 5. As a further example, the sum of the 92 semidivisible numbers up to 1000 is 34825. What is the sum of all semidivisible numbers not exceeding 999966663333 ? """ import math def prime_sieve(n: int) -> list: """ Sieve of Erotosthenes Function to return all the prime numbers up to a certain number https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes >>> prime_sieve(3) [2] >>> prime_sieve(50) [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47] """ is_prime = [True] * n is_prime[0] = False is_prime[1] = False is_prime[2] = True for i in range(3, int(n**0.5 + 1), 2): index = i * 2 while index < n: is_prime[index] = False index = index + i primes = [2] for i in range(3, n, 2): if is_prime[i]: primes.append(i) return primes def solution(limit: int = 999_966_663_333) -> int: """ Computes the solution to the problem up to the specified limit >>> solution(1000) 34825 >>> solution(10_000) 1134942 >>> solution(100_000) 36393008 """ primes_upper_bound = math.floor(math.sqrt(limit)) + 100 primes = prime_sieve(primes_upper_bound) matches_sum = 0 prime_index = 0 last_prime = primes[prime_index] while (last_prime**2) <= limit: next_prime = primes[prime_index + 1] lower_bound = last_prime**2 upper_bound = next_prime**2 # Get numbers divisible by lps(current) current = lower_bound + last_prime while upper_bound > current <= limit: matches_sum += current current += last_prime # Reset the upper_bound while (upper_bound - next_prime) > limit: upper_bound -= next_prime # Add the numbers divisible by ups(current) current = upper_bound - next_prime while current > lower_bound: matches_sum += current current -= next_prime # Remove the numbers divisible by both ups and lps current = 0 while upper_bound > current <= limit: if current <= lower_bound: # Increment the current number current += last_prime * next_prime continue if current > limit: break # Remove twice since it was added by both ups and lps matches_sum -= current * 2 # Increment the current number current += last_prime * next_prime # Setup for next pair last_prime = next_prime prime_index += 1 return matches_sum if __name__ == "__main__": print(solution()) ================================================ FILE: project_euler/problem_301/__init__.py ================================================ ================================================ FILE: project_euler/problem_301/sol1.py ================================================ """ Project Euler Problem 301: https://projecteuler.net/problem=301 Problem Statement: Nim is a game played with heaps of stones, where two players take it in turn to remove any number of stones from any heap until no stones remain. We'll consider the three-heap normal-play version of Nim, which works as follows: - At the start of the game there are three heaps of stones. - On each player's turn, the player may remove any positive number of stones from any single heap. - The first player unable to move (because no stones remain) loses. If (n1, n2, n3) indicates a Nim position consisting of heaps of size n1, n2, and n3, then there is a simple function, which you may look up or attempt to deduce for yourself, X(n1, n2, n3) that returns: - zero if, with perfect strategy, the player about to move will eventually lose; or - non-zero if, with perfect strategy, the player about to move will eventually win. For example X(1,2,3) = 0 because, no matter what the current player does, the opponent can respond with a move that leaves two heaps of equal size, at which point every move by the current player can be mirrored by the opponent until no stones remain; so the current player loses. To illustrate: - current player moves to (1,2,1) - opponent moves to (1,0,1) - current player moves to (0,0,1) - opponent moves to (0,0,0), and so wins. For how many positive integers n <= 2^30 does X(n,2n,3n) = 0? """ def solution(exponent: int = 30) -> int: """ For any given exponent x >= 0, 1 <= n <= 2^x. This function returns how many Nim games are lost given that each Nim game has three heaps of the form (n, 2*n, 3*n). >>> solution(0) 1 >>> solution(2) 3 >>> solution(10) 144 """ # To find how many total games were lost for a given exponent x, # we need to find the Fibonacci number F(x+2). fibonacci_index = exponent + 2 phi = (1 + 5**0.5) / 2 fibonacci = (phi**fibonacci_index - (phi - 1) ** fibonacci_index) / 5**0.5 return int(fibonacci) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_345/__init__.py ================================================ ================================================ FILE: project_euler/problem_345/sol1.py ================================================ """ Project Euler Problem 345: https://projecteuler.net/problem=345 Matrix Sum We define the Matrix Sum of a matrix as the maximum possible sum of matrix elements such that none of the selected elements share the same row or column. For example, the Matrix Sum of the matrix below equals 3315 ( = 863 + 383 + 343 + 959 + 767): 7 53 183 439 863 497 383 563 79 973 287 63 343 169 583 627 343 773 959 943 767 473 103 699 303 Find the Matrix Sum of: 7 53 183 439 863 497 383 563 79 973 287 63 343 169 583 627 343 773 959 943 767 473 103 699 303 957 703 583 639 913 447 283 463 29 23 487 463 993 119 883 327 493 423 159 743 217 623 3 399 853 407 103 983 89 463 290 516 212 462 350 960 376 682 962 300 780 486 502 912 800 250 346 172 812 350 870 456 192 162 593 473 915 45 989 873 823 965 425 329 803 973 965 905 919 133 673 665 235 509 613 673 815 165 992 326 322 148 972 962 286 255 941 541 265 323 925 281 601 95 973 445 721 11 525 473 65 511 164 138 672 18 428 154 448 848 414 456 310 312 798 104 566 520 302 248 694 976 430 392 198 184 829 373 181 631 101 969 613 840 740 778 458 284 760 390 821 461 843 513 17 901 711 993 293 157 274 94 192 156 574 34 124 4 878 450 476 712 914 838 669 875 299 823 329 699 815 559 813 459 522 788 168 586 966 232 308 833 251 631 107 813 883 451 509 615 77 281 613 459 205 380 274 302 35 805 Brute force solution, with caching intermediate steps to speed up the calculation. """ import numpy as np from numpy.typing import NDArray MATRIX_1 = [ "7 53 183 439 863", "497 383 563 79 973", "287 63 343 169 583", "627 343 773 959 943", "767 473 103 699 303", ] MATRIX_2 = [ "7 53 183 439 863 497 383 563 79 973 287 63 343 169 583", "627 343 773 959 943 767 473 103 699 303 957 703 583 639 913", "447 283 463 29 23 487 463 993 119 883 327 493 423 159 743", "217 623 3 399 853 407 103 983 89 463 290 516 212 462 350", "960 376 682 962 300 780 486 502 912 800 250 346 172 812 350", "870 456 192 162 593 473 915 45 989 873 823 965 425 329 803", "973 965 905 919 133 673 665 235 509 613 673 815 165 992 326", "322 148 972 962 286 255 941 541 265 323 925 281 601 95 973", "445 721 11 525 473 65 511 164 138 672 18 428 154 448 848", "414 456 310 312 798 104 566 520 302 248 694 976 430 392 198", "184 829 373 181 631 101 969 613 840 740 778 458 284 760 390", "821 461 843 513 17 901 711 993 293 157 274 94 192 156 574", "34 124 4 878 450 476 712 914 838 669 875 299 823 329 699", "815 559 813 459 522 788 168 586 966 232 308 833 251 631 107", "813 883 451 509 615 77 281 613 459 205 380 274 302 35 805", ] def solve(arr: NDArray, row: int, cols: set[int], cache: dict[str, int]) -> int: """ Finds the max sum for array `arr` starting with row index `row`, and with columns included in `cols`. `cache` is used for caching intermediate results. >>> solve(arr=np.array([[1, 2], [3, 4]]), row=0, cols={0, 1}, cache={}) 5 """ cache_id = f"{row}, {sorted(cols)}" if cache_id in cache: return cache[cache_id] if row == len(arr): return 0 max_sum = 0 for col in cols: new_cols = cols - {col} max_sum = max( max_sum, int(arr[row, col]) + solve(arr=arr, row=row + 1, cols=new_cols, cache=cache), ) cache[cache_id] = max_sum return max_sum def solution(matrix_str: list[str] = MATRIX_2) -> int: """ Takes list of strings `matrix_str` to parse the matrix and calculates the max sum. >>> solution(["1 2", "3 4"]) 5 >>> solution(MATRIX_1) 3315 """ n = len(matrix_str) arr = np.empty(shape=(n, n), dtype=int) for row, matrix_row_str in enumerate(matrix_str): matrix_row_list_str = matrix_row_str.split() for col, elem_str in enumerate(matrix_row_list_str): arr[row, col] = int(elem_str) cache: dict[str, int] = {} return solve(arr=arr, row=0, cols=set(range(n)), cache=cache) if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_493/__init__.py ================================================ ================================================ FILE: project_euler/problem_493/sol1.py ================================================ """ Project Euler Problem 493: https://projecteuler.net/problem=493 70 coloured balls are placed in an urn, 10 for each of the seven rainbow colours. What is the expected number of distinct colours in 20 randomly picked balls? Give your answer with nine digits after the decimal point (a.bcdefghij). ----- This combinatorial problem can be solved by decomposing the problem into the following steps: 1. Calculate the total number of possible picking combinations [combinations := binom_coeff(70, 20)] 2. Calculate the number of combinations with one colour missing [missing := binom_coeff(60, 20)] 3. Calculate the probability of one colour missing [missing_prob := missing / combinations] 4. Calculate the probability of no colour missing [no_missing_prob := 1 - missing_prob] 5. Calculate the expected number of distinct colours [expected = 7 * no_missing_prob] References: - https://en.wikipedia.org/wiki/Binomial_coefficient """ import math BALLS_PER_COLOUR = 10 NUM_COLOURS = 7 NUM_BALLS = BALLS_PER_COLOUR * NUM_COLOURS def solution(num_picks: int = 20) -> str: """ Calculates the expected number of distinct colours >>> solution(10) '5.669644129' >>> solution(30) '6.985042712' """ total = math.comb(NUM_BALLS, num_picks) missing_colour = math.comb(NUM_BALLS - BALLS_PER_COLOUR, num_picks) result = NUM_COLOURS * (1 - missing_colour / total) return f"{result:.9f}" if __name__ == "__main__": print(solution(20)) ================================================ FILE: project_euler/problem_551/__init__.py ================================================ ================================================ FILE: project_euler/problem_551/sol1.py ================================================ """ Sum of digits sequence Problem 551 Let a(0), a(1),... be an integer sequence defined by: a(0) = 1 for n >= 1, a(n) is the sum of the digits of all preceding terms The sequence starts with 1, 1, 2, 4, 8, ... You are given a(10^6) = 31054319. Find a(10^15) """ ks = range(2, 20 + 1) base = [10**k for k in range(ks[-1] + 1)] memo: dict[int, dict[int, list[list[int]]]] = {} def next_term(a_i, k, i, n): """ Calculates and updates a_i in-place to either the n-th term or the smallest term for which c > 10^k when the terms are written in the form: a(i) = b * 10^k + c For any a(i), if digitsum(b) and c have the same value, the difference between subsequent terms will be the same until c >= 10^k. This difference is cached to greatly speed up the computation. Arguments: a_i -- array of digits starting from the one's place that represent the i-th term in the sequence k -- k when terms are written in the from a(i) = b*10^k + c. Term are calulcated until c > 10^k or the n-th term is reached. i -- position along the sequence n -- term to calculate up to if k is large enough Return: a tuple of difference between ending term and starting term, and the number of terms calculated. ex. if starting term is a_0=1, and ending term is a_10=62, then (61, 9) is returned. """ # ds_b - digitsum(b) ds_b = sum(a_i[j] for j in range(k, len(a_i))) c = sum(a_i[j] * base[j] for j in range(min(len(a_i), k))) diff, dn = 0, 0 max_dn = n - i sub_memo = memo.get(ds_b) if sub_memo is not None: jumps = sub_memo.get(c) if jumps is not None and len(jumps) > 0: # find and make the largest jump without going over max_jump = -1 for _k in range(len(jumps) - 1, -1, -1): if jumps[_k][2] <= k and jumps[_k][1] <= max_dn: max_jump = _k break if max_jump >= 0: diff, dn, _kk = jumps[max_jump] # since the difference between jumps is cached, add c new_c = diff + c for j in range(min(k, len(a_i))): new_c, a_i[j] = divmod(new_c, 10) if new_c > 0: add(a_i, k, new_c) else: sub_memo[c] = [] else: sub_memo = {c: []} memo[ds_b] = sub_memo if dn >= max_dn or c + diff >= base[k]: return diff, dn if k > ks[0]: while True: # keep doing smaller jumps _diff, terms_jumped = next_term(a_i, k - 1, i + dn, n) diff += _diff dn += terms_jumped if dn >= max_dn or c + diff >= base[k]: break else: # would be too small a jump, just compute sequential terms instead _diff, terms_jumped = compute(a_i, k, i + dn, n) diff += _diff dn += terms_jumped jumps = sub_memo[c] # keep jumps sorted by # of terms skipped j = 0 while j < len(jumps): if jumps[j][1] > dn: break j += 1 # cache the jump for this value digitsum(b) and c sub_memo[c].insert(j, (diff, dn, k)) return (diff, dn) def compute(a_i, k, i, n): """ same as next_term(a_i, k, i, n) but computes terms without memoizing results. """ if i >= n: return 0, i if k > len(a_i): a_i.extend([0 for _ in range(k - len(a_i))]) # note: a_i -> b * 10^k + c # ds_b -> digitsum(b) # ds_c -> digitsum(c) start_i = i ds_b, ds_c, diff = 0, 0, 0 for j in range(len(a_i)): if j >= k: ds_b += a_i[j] else: ds_c += a_i[j] while i < n: i += 1 addend = ds_c + ds_b diff += addend ds_c = 0 for j in range(k): s = a_i[j] + addend addend, a_i[j] = divmod(s, 10) ds_c += a_i[j] if addend > 0: break if addend > 0: add(a_i, k, addend) return diff, i - start_i def add(digits, k, addend): """ adds addend to digit array given in digits starting at index k """ for j in range(k, len(digits)): s = digits[j] + addend if s >= 10: quotient, digits[j] = divmod(s, 10) addend = addend // 10 + quotient else: digits[j] = s addend = addend // 10 if addend == 0: break while addend > 0: addend, digit = divmod(addend, 10) digits.append(digit) def solution(n: int = 10**15) -> int: """ returns n-th term of sequence >>> solution(10) 62 >>> solution(10**6) 31054319 >>> solution(10**15) 73597483551591773 """ digits = [1] i = 1 dn = 0 while True: _diff, terms_jumped = next_term(digits, 20, i + dn, n) dn += terms_jumped if dn == n - i: break a_n = 0 for j in range(len(digits)): a_n += digits[j] * 10**j return a_n if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_587/__init__.py ================================================ ================================================ FILE: project_euler/problem_587/sol1.py ================================================ """ Project Euler Problem 587: https://projecteuler.net/problem=587 A square is drawn around a circle as shown in the diagram below on the left. We shall call the blue shaded region the L-section. A line is drawn from the bottom left of the square to the top right as shown in the diagram on the right. We shall call the orange shaded region a concave triangle. It should be clear that the concave triangle occupies exactly half of the L-section. Two circles are placed next to each other horizontally, a rectangle is drawn around both circles, and a line is drawn from the bottom left to the top right as shown in the diagram below. This time the concave triangle occupies approximately 36.46% of the L-section. If n circles are placed next to each other horizontally, a rectangle is drawn around the n circles, and a line is drawn from the bottom left to the top right, then it can be shown that the least value of n for which the concave triangle occupies less than 10% of the L-section is n = 15. What is the least value of n for which the concave triangle occupies less than 0.1% of the L-section? """ from itertools import count from math import asin, pi, sqrt def circle_bottom_arc_integral(point: float) -> float: """ Returns integral of circle bottom arc y = 1 / 2 - sqrt(1 / 4 - (x - 1 / 2) ^ 2) >>> circle_bottom_arc_integral(0) 0.39269908169872414 >>> circle_bottom_arc_integral(1 / 2) 0.44634954084936207 >>> circle_bottom_arc_integral(1) 0.5 """ return ( (1 - 2 * point) * sqrt(point - point**2) + 2 * point + asin(sqrt(1 - point)) ) / 4 def concave_triangle_area(circles_number: int) -> float: """ Returns area of concave triangle >>> concave_triangle_area(1) 0.026825229575318944 >>> concave_triangle_area(2) 0.01956236140083944 """ intersection_y = (circles_number + 1 - sqrt(2 * circles_number)) / ( 2 * (circles_number**2 + 1) ) intersection_x = circles_number * intersection_y triangle_area = intersection_x * intersection_y / 2 concave_region_area = circle_bottom_arc_integral( 1 / 2 ) - circle_bottom_arc_integral(intersection_x) return triangle_area + concave_region_area def solution(fraction: float = 1 / 1000) -> int: """ Returns least value of n for which the concave triangle occupies less than fraction of the L-section >>> solution(1 / 10) 15 """ l_section_area = (1 - pi / 4) / 4 for n in count(1): if concave_triangle_area(n) / l_section_area < fraction: return n return -1 if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: project_euler/problem_686/__init__.py ================================================ ================================================ FILE: project_euler/problem_686/sol1.py ================================================ """ Project Euler Problem 686: https://projecteuler.net/problem=686 2^7 = 128 is the first power of two whose leading digits are "12". The next power of two whose leading digits are "12" is 2^80. Define p(L,n) to be the nth-smallest value of j such that the base 10 representation of 2^j begins with the digits of L. So p(12, 1) = 7 and p(12, 2) = 80. You are given that p(123, 45) = 12710. Find p(123, 678910). """ import math def log_difference(number: int) -> float: """ This function returns the decimal value of a number multiplied with log(2) Since the problem is on powers of two, finding the powers of two with large exponents is time consuming. Hence we use log to reduce compute time. We can find out that the first power of 2 with starting digits 123 is 90. Computing 2^90 is time consuming. Hence we find log(2^90) = 90*log(2) = 27.092699609758302 But we require only the decimal part to determine whether the power starts with 123. So we just return the decimal part of the log product. Therefore we return 0.092699609758302 >>> log_difference(90) 0.092699609758302 >>> log_difference(379) 0.090368356648852 """ log_number = math.log(2, 10) * number difference = round((log_number - int(log_number)), 15) return difference def solution(number: int = 678910) -> int: """ This function calculates the power of two which is nth (n = number) smallest value of power of 2 such that the starting digits of the 2^power is 123. For example the powers of 2 for which starting digits is 123 are: 90, 379, 575, 864, 1060, 1545, 1741, 2030, 2226, 2515 and so on. 90 is the first power of 2 whose starting digits are 123, 379 is second power of 2 whose starting digits are 123, and so on. So if number = 10, then solution returns 2515 as we observe from above series. We will define a lowerbound and upperbound. lowerbound = log(1.23), upperbound = log(1.24) because we need to find the powers that yield 123 as starting digits. log(1.23) = 0.08990511143939792, log(1,24) = 0.09342168516223506. We use 1.23 and not 12.3 or 123, because log(1.23) yields only decimal value which is less than 1. log(12.3) will be same decimal value but 1 added to it which is log(12.3) = 1.093421685162235. We observe that decimal value remains same no matter 1.23 or 12.3 Since we use the function log_difference(), which returns the value that is only decimal part, using 1.23 is logical. If we see, 90*log(2) = 27.092699609758302, decimal part = 0.092699609758302, which is inside the range of lowerbound and upperbound. If we compute the difference between all the powers which lead to 123 starting digits is as follows: 379 - 90 = 289 575 - 379 = 196 864 - 575 = 289 1060 - 864 = 196 We see a pattern here. The difference is either 196 or 289 = 196 + 93. Hence to optimize the algorithm we will increment by 196 or 93 depending upon the log_difference() value. Let's take for example 90. Since 90 is the first power leading to staring digits as 123, we will increment iterator by 196. Because the difference between any two powers leading to 123 as staring digits is greater than or equal to 196. After incrementing by 196 we get 286. log_difference(286) = 0.09457875989861 which is greater than upperbound. The next power is 379, and we need to add 93 to get there. The iterator will now become 379, which is the next power leading to 123 as starting digits. Let's take 1060. We increment by 196, we get 1256. log_difference(1256) = 0.09367455396034, Which is greater than upperbound hence we increment by 93. Now iterator is 1349. log_difference(1349) = 0.08946415071057 which is less than lowerbound. The next power is 1545 and we need to add 196 to get 1545. Conditions are as follows: 1) If we find a power whose log_difference() is in the range of lower and upperbound, we will increment by 196. which implies that the power is a number which will lead to 123 as starting digits. 2) If we find a power, whose log_difference() is greater than or equal upperbound, we will increment by 93. 3) if log_difference() < lowerbound, we increment by 196. Reference to the above logic: https://math.stackexchange.com/questions/4093970/powers-of-2-starting-with-123-does-a-pattern-exist >>> solution(1000) 284168 >>> solution(56000) 15924915 >>> solution(678910) 193060223 """ power_iterator = 90 position = 0 lower_limit = math.log(1.23, 10) upper_limit = math.log(1.24, 10) previous_power = 0 while position < number: difference = log_difference(power_iterator) if difference >= upper_limit: power_iterator += 93 elif difference < lower_limit: power_iterator += 196 else: previous_power = power_iterator power_iterator += 196 position += 1 return previous_power if __name__ == "__main__": import doctest doctest.testmod() print(f"{solution() = }") ================================================ FILE: project_euler/problem_800/__init__.py ================================================ ================================================ FILE: project_euler/problem_800/sol1.py ================================================ """ Project Euler Problem 800: https://projecteuler.net/problem=800 An integer of the form p^q q^p with prime numbers p != q is called a hybrid-integer. For example, 800 = 2^5 5^2 is a hybrid-integer. We define C(n) to be the number of hybrid-integers less than or equal to n. You are given C(800) = 2 and C(800^800) = 10790 Find C(800800^800800) """ from math import isqrt, log2 def calculate_prime_numbers(max_number: int) -> list[int]: """ Returns prime numbers below max_number >>> calculate_prime_numbers(10) [2, 3, 5, 7] """ is_prime = [True] * max_number for i in range(2, isqrt(max_number - 1) + 1): if is_prime[i]: for j in range(i**2, max_number, i): is_prime[j] = False return [i for i in range(2, max_number) if is_prime[i]] def solution(base: int = 800800, degree: int = 800800) -> int: """ Returns the number of hybrid-integers less than or equal to base^degree >>> solution(800, 1) 2 >>> solution(800, 800) 10790 """ upper_bound = degree * log2(base) max_prime = int(upper_bound) prime_numbers = calculate_prime_numbers(max_prime) hybrid_integers_count = 0 left = 0 right = len(prime_numbers) - 1 while left < right: while ( prime_numbers[right] * log2(prime_numbers[left]) + prime_numbers[left] * log2(prime_numbers[right]) > upper_bound ): right -= 1 hybrid_integers_count += right - left left += 1 return hybrid_integers_count if __name__ == "__main__": print(f"{solution() = }") ================================================ FILE: pyproject.toml ================================================ [project] name = "thealgorithms-python" version = "0.0.1" description = "TheAlgorithms in Python" authors = [ { name = "TheAlgorithms Contributors" } ] requires-python = ">=3.14" classifiers = [ "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.14", ] dependencies = [ "beautifulsoup4>=4.12.3", "cython>=3.1.2", "fake-useragent>=1.5.1", "httpx>=0.28.1", "imageio>=2.36.1", "keras>=3.7", "lxml>=6", "matplotlib>=3.9.3", "numpy>=2.1.3", "opencv-python>=4.10.0.84", "pandas>=2.2.3", "pillow>=11.3", "rich>=13.9.4", "scikit-learn>=1.5.2", "scipy>=1.16.2", "sphinx-pyproject>=0.3", "statsmodels>=0.14.4", "sympy>=1.13.3", "tweepy>=4.14", "typing-extensions>=4.12.2", "xgboost>=2.1.3", ] [dependency-groups] test = [ "pytest>=8.4.1", "pytest-cov>=6", ] docs = [ "myst-parser>=4", "sphinx-autoapi>=3.4", "sphinx-pyproject>=0.3", ] euler-validate = [ "httpx>=0.28.1", "numpy>=2.1.3", ] [tool.ruff] target-version = "py314" output-format = "full" lint.select = [ # https://beta.ruff.rs/docs/rules "A", # flake8-builtins "ARG", # flake8-unused-arguments "ASYNC", # flake8-async "B", # flake8-bugbear "BLE", # flake8-blind-except "C4", # flake8-comprehensions "C90", # McCabe cyclomatic complexity "DJ", # flake8-django "DTZ", # flake8-datetimez "E", # pycodestyle "EM", # flake8-errmsg "EXE", # flake8-executable "F", # Pyflakes "FA", # flake8-future-annotations "FLY", # flynt "G", # flake8-logging-format "I", # isort "ICN", # flake8-import-conventions "INP", # flake8-no-pep420 "INT", # flake8-gettext "ISC", # flake8-implicit-str-concat "N", # pep8-naming "NPY", # NumPy-specific rules "PD", # pandas-vet "PGH", # pygrep-hooks "PIE", # flake8-pie "PL", # Pylint "PT", # flake8-pytest-style "PYI", # flake8-pyi "RSE", # flake8-raise "RUF", # Ruff-specific rules "S", # flake8-bandit "SIM", # flake8-simplify "SLF", # flake8-self "T10", # flake8-debugger "TD", # flake8-todos "TID", # flake8-tidy-imports "UP", # pyupgrade "W", # pycodestyle "YTT", # flake8-2020 # "ANN", # flake8-annotations -- FIX ME? # "COM", # flake8-commas -- DO NOT FIX # "D", # pydocstyle -- FIX ME? # "ERA", # eradicate -- DO NOT FIX # "FBT", # flake8-boolean-trap # FIX ME # "PTH", # flake8-use-pathlib # FIX ME # "Q", # flake8-quotes # "RET", # flake8-return # FIX ME? # "T20", # flake8-print # "TCH", # flake8-type-checking # "TRY", # tryceratops ] lint.ignore = [ # `ruff rule S101` for a description of that rule "B904", # Within an `except` clause, raise exceptions with `raise ... from err` -- FIX ME "B905", # `zip()` without an explicit `strict=` parameter -- FIX ME "EM101", # Exception must not use a string literal, assign to a variable first "EXE001", # Shebang is present but file is not executable -- DO NOT FIX "G004", # Logging statement uses f-string "ISC001", # Conflicts with ruff format -- DO NOT FIX "PLC0415", # import-outside-top-level -- DO NOT FIX "PLC1901", # `{}` can be simplified to `{}` as an empty string is falsey "PLW060", # Using global for `{name}` but no assignment is done -- DO NOT FIX "PLW1641", # eq-without-hash "PLW2901", # PLW2901: Redefined loop variable -- FIX ME "PT011", # `pytest.raises(Exception)` is too broad, set the `match` parameter or use a more specific exception "PT018", # Assertion should be broken down into multiple parts "PT028", # pytest-parameter-with-default-argument "S101", # Use of `assert` detected -- DO NOT FIX "S311", # Standard pseudo-random generators are not suitable for cryptographic purposes -- FIX ME "SIM905", # Consider using a list literal instead of `str.split` -- DO NOT FIX "SLF001", # Private member accessed: `_Iterator` -- FIX ME "UP037", # FIX ME ] lint.per-file-ignores."data_structures/hashing/tests/test_hash_map.py" = [ "BLE001", ] lint.per-file-ignores."hashes/enigma_machine.py" = [ "BLE001", ] lint.per-file-ignores."machine_learning/sequential_minimum_optimization.py" = [ "SIM115", ] lint.per-file-ignores."matrix/sherman_morrison.py" = [ "SIM103", ] lint.per-file-ignores."physics/newtons_second_law_of_motion.py" = [ "BLE001", ] lint.per-file-ignores."project_euler/problem_099/sol1.py" = [ "SIM115", ] lint.per-file-ignores."sorts/external_sort.py" = [ "SIM115", ] lint.mccabe.max-complexity = 17 # default: 10 lint.pylint.allow-magic-value-types = [ "float", "int", "str", ] lint.pylint.max-args = 10 # default: 5 lint.pylint.max-branches = 20 # default: 12 lint.pylint.max-returns = 8 # default: 6 lint.pylint.max-statements = 88 # default: 50 [tool.codespell] ignore-words-list = "3rt,abd,aer,ans,bitap,crate,damon,fo,followings,hist,iff,kwanza,manuel,mater,secant,som,sur,tim,toi,zar" skip = "./.*,*.json,*.lock,ciphers/prehistoric_men.txt,project_euler/problem_022/p022_names.txt,pyproject.toml,strings/dictionary.txt,strings/words.txt" [tool.pytest.ini_options] markers = [ "mat_ops: mark a test as utilizing matrix operations.", ] addopts = [ "--durations=10", "--doctest-modules", "--showlocals", ] [tool.coverage.report] omit = [ ".env/*", "project_euler/*", ] sort = "Cover" [tool.sphinx-pyproject] copyright = "2014, TheAlgorithms" autoapi_dirs = [ "audio_filters", "backtracking", "bit_manipulation", "blockchain", "boolean_algebra", "cellular_automata", "ciphers", "computer_vision", "conversions", "data_compression", "data_structures", "digital_image_processing", "divide_and_conquer", "dynamic_programming", "electronics", "file_transfer", "financial", "fractals", "fuzzy_logic", "genetic_algorithm", "geodesy", "geometry", "graphics", "graphs", "greedy_methods", "hashes", "knapsack", "linear_algebra", "linear_programming", "machine_learning", "maths", "matrix", "networking_flow", "neural_network", "other", "physics", "project_euler", "quantum", "scheduling", "searches", "sorts", "strings", "web_programming", ] autoapi_member_order = "groupwise" # autoapi_python_use_implicit_namespaces = true exclude_patterns = [ ".*/*", "docs/", ] extensions = [ "autoapi.extension", "myst_parser", ] html_static_path = [ "_static" ] html_theme = "alabaster" myst_enable_extensions = [ "amsmath", "attrs_inline", "colon_fence", "deflist", "dollarmath", "fieldlist", "html_admonition", "html_image", # "linkify", "replacements", "smartquotes", "strikethrough", "substitution", "tasklist", ] myst_fence_as_directive = [ "include", ] templates_path = [ "_templates" ] [tool.sphinx-pyproject.source_suffix] ".rst" = "restructuredtext" # ".txt" = "markdown" ".md" = "markdown" ================================================ FILE: quantum/README.md ================================================ # Welcome to Quantum Algorithms Started at https://github.com/TheAlgorithms/Python/issues/1831 * D-Wave: https://www.dwavesys.com and https://github.com/dwavesystems * Google: https://research.google/teams/applied-science/quantum * IBM: https://qiskit.org and https://github.com/Qiskit * Rigetti: https://rigetti.com and https://github.com/rigetti * Zapata: https://www.zapatacomputing.com and https://github.com/zapatacomputing ## IBM Qiskit - Start using by installing `pip install qiskit`, refer the [docs](https://qiskit.org/documentation/install.html) for more info. - Tutorials & References - https://github.com/Qiskit/qiskit-tutorials - https://quantum-computing.ibm.com/docs/iql/first-circuit - https://medium.com/qiskit/how-to-program-a-quantum-computer-982a9329ed02 ## Google Cirq - Start using by installing `python -m pip install cirq`, refer the [docs](https://quantumai.google/cirq/start/install) for more info. - Tutorials & references - https://github.com/quantumlib/cirq - https://quantumai.google/cirq/experiments - https://tanishabassan.medium.com/quantum-programming-with-google-cirq-3209805279bc ================================================ FILE: quantum/__init__.py ================================================ ================================================ FILE: quantum/bb84.py.DISABLED.txt ================================================ #!/usr/bin/env python3 """ Simulation of the Quantum Key Distribution (QKD) protocol called BB84, created by Charles Bennett and Gilles Brassard in 1984. BB84 is a key-distribution protocol that ensures secure key distribution using qubits instead of classical bits. The generated key is the result of simulating a quantum circuit. Our algorithm to construct the circuit is as follows: Alice generates two binary strings. One encodes the basis for each qubit: - 0 -> {0,1} basis. - 1 -> {+,-} basis. The other encodes the state: - 0 -> |0> or |+>. - 1 -> |1> or |->. Bob also generates a binary string and uses the same convention to choose a basis for measurement. Based on the following results, we follow the algorithm below: X|0> = |1> H|0> = |+> HX|0> = |-> 1. Whenever Alice wants to encode 1 in a qubit, she applies an X (NOT) gate to the qubit. To encode 0, no action is needed. 2. Wherever she wants to encode it in the {+,-} basis, she applies an H (Hadamard) gate. No action is necessary to encode a qubit in the {0,1} basis. 3. She then sends the qubits to Bob (symbolically represented in this circuit using wires). 4. Bob measures the qubits according to his binary string for measurement. To measure a qubit in the {+,-} basis, he applies an H gate to the corresponding qubit and then performs a measurement. References: https://en.wikipedia.org/wiki/BB84 https://qiskit.org/textbook/ch-algorithms/quantum-key-distribution.html """ import numpy as np import qiskit def bb84(key_len: int = 8, seed: int | None = None) -> str: """ Performs the BB84 protocol using a key made of `key_len` bits. The two parties in the key distribution are called Alice and Bob. Args: key_len: The length of the generated key in bits. The default is 8. seed: Seed for the random number generator. Mostly used for testing. Default is None. Returns: key: The key generated using BB84 protocol. >>> bb84(16, seed=0) '0111110111010010' >>> bb84(8, seed=0) '10110001' """ # Set up the random number generator. rng = np.random.default_rng(seed=seed) # Roughly 25% of the qubits will contribute to the key. # So we take more than we need. num_qubits = 6 * key_len # Measurement basis for Alice's qubits. alice_basis = rng.integers(2, size=num_qubits) # The set of states Alice will prepare. alice_state = rng.integers(2, size=num_qubits) # Measurement basis for Bob's qubits. bob_basis = rng.integers(2, size=num_qubits) # Quantum Circuit to simulate BB84 bb84_circ = qiskit.QuantumCircuit(num_qubits, name="BB84") # Alice prepares her qubits according to rules above. for index, _ in enumerate(alice_basis): if alice_state[index] == 1: bb84_circ.x(index) if alice_basis[index] == 1: bb84_circ.h(index) bb84_circ.barrier() # Bob measures the received qubits according to rules above. for index, _ in enumerate(bob_basis): if bob_basis[index] == 1: bb84_circ.h(index) bb84_circ.barrier() bb84_circ.measure_all() # Simulate the quantum circuit. sim = qiskit.Aer.get_backend("aer_simulator") # We only need to run one shot because the key is unique. # Multiple shots will produce the same key. job = qiskit.execute(bb84_circ, sim, shots=1, seed_simulator=seed) # Returns the result of measurement. result = job.result().get_counts(bb84_circ).most_frequent() # Extracting the generated key from the simulation results. # Only keep measurement results where Alice and Bob chose the same basis. gen_key = "".join( [ result_bit for alice_basis_bit, bob_basis_bit, result_bit in zip( alice_basis, bob_basis, result ) if alice_basis_bit == bob_basis_bit ] ) # Get final key. Pad with 0 if too short, otherwise truncate. key = gen_key[:key_len] if len(gen_key) >= key_len else gen_key.ljust(key_len, "0") return key if __name__ == "__main__": print(f"The generated key is : {bb84(8, seed=0)}") from doctest import testmod testmod() ================================================ FILE: quantum/deutsch_jozsa.py.DISABLED.txt ================================================ # DISABLED!! #!/usr/bin/env python3 """ Deutsch-Jozsa Algorithm is one of the first examples of a quantum algorithm that is exponentially faster than any possible deterministic classical algorithm Premise: We are given a hidden Boolean function f, which takes as input a string of bits, and returns either 0 or 1: f({x0,x1,x2,...}) -> 0 or 1, where xn is 0 or 1 The property of the given Boolean function is that it is guaranteed to either be balanced or constant. A constant function returns all 0's or all 1's for any input, while a balanced function returns 0's for exactly half of all inputs and 1's for the other half. Our task is to determine whether the given function is balanced or constant. References: - https://en.wikipedia.org/wiki/Deutsch-Jozsa_algorithm - https://qiskit.org/textbook/ch-algorithms/deutsch-jozsa.html """ import numpy as np import qiskit def dj_oracle(case: str, num_qubits: int) -> qiskit.QuantumCircuit: """ Returns a Quantum Circuit for the Oracle function. The circuit returned can represent balanced or constant function, according to the arguments passed """ # This circuit has num_qubits+1 qubits: the size of the input, # plus one output qubit oracle_qc = qiskit.QuantumCircuit(num_qubits + 1) # First, let's deal with the case in which oracle is balanced if case == "balanced": # First generate a random number that tells us which CNOTs to # wrap in X-gates: b = np.random.randint(1, 2**num_qubits) # Next, format 'b' as a binary string of length 'n', padded with zeros: b_str = format(b, f"0{num_qubits}b") # Next, we place the first X-gates. Each digit in our binary string # corresponds to a qubit, if the digit is 0, we do nothing, if it's 1 # we apply an X-gate to that qubit: for index, bit in enumerate(b_str): if bit == "1": oracle_qc.x(index) # Do the controlled-NOT gates for each qubit, using the output qubit # as the target: for index in range(num_qubits): oracle_qc.cx(index, num_qubits) # Next, place the final X-gates for index, bit in enumerate(b_str): if bit == "1": oracle_qc.x(index) # Case in which oracle is constant if case == "constant": # First decide what the fixed output of the oracle will be # (either always 0 or always 1) output = np.random.randint(2) if output == 1: oracle_qc.x(num_qubits) oracle_gate = oracle_qc.to_gate() oracle_gate.name = "Oracle" # To show when we display the circuit return oracle_gate def dj_algorithm( oracle: qiskit.QuantumCircuit, num_qubits: int ) -> qiskit.QuantumCircuit: """ Returns the complete Deutsch-Jozsa Quantum Circuit, adding Input & Output registers and Hadamard & Measurement Gates, to the Oracle Circuit passed in arguments """ dj_circuit = qiskit.QuantumCircuit(num_qubits + 1, num_qubits) # Set up the output qubit: dj_circuit.x(num_qubits) dj_circuit.h(num_qubits) # And set up the input register: for qubit in range(num_qubits): dj_circuit.h(qubit) # Let's append the oracle gate to our circuit: dj_circuit.append(oracle, range(num_qubits + 1)) # Finally, perform the H-gates again and measure: for qubit in range(num_qubits): dj_circuit.h(qubit) for i in range(num_qubits): dj_circuit.measure(i, i) return dj_circuit def deutsch_jozsa(case: str, num_qubits: int) -> qiskit.result.counts.Counts: """ Main function that builds the circuit using other helper functions, runs the experiment 1000 times & returns the resultant qubit counts >>> deutsch_jozsa("constant", 3) {'000': 1000} >>> deutsch_jozsa("balanced", 3) {'111': 1000} """ # Use Aer's simulator simulator = qiskit.Aer.get_backend("aer_simulator") oracle_gate = dj_oracle(case, num_qubits) dj_circuit = dj_algorithm(oracle_gate, num_qubits) # Execute the circuit on the simulator job = qiskit.execute(dj_circuit, simulator, shots=1000) # Return the histogram data of the results of the experiment. return job.result().get_counts(dj_circuit) if __name__ == "__main__": print(f"Deutsch Jozsa - Constant Oracle: {deutsch_jozsa('constant', 3)}") print(f"Deutsch Jozsa - Balanced Oracle: {deutsch_jozsa('balanced', 3)}") ================================================ FILE: quantum/half_adder.py.DISABLED.txt ================================================ # DISABLED!! #!/usr/bin/env python3 """ Build a half-adder quantum circuit that takes two bits as input, encodes them into qubits, then runs the half-adder circuit calculating the sum and carry qubits, observed over 1000 runs of the experiment . References: https://en.wikipedia.org/wiki/Adder_(electronics) https://qiskit.org/textbook/ch-states/atoms-computation.html#4.2-Remembering-how-to-add- """ import qiskit def half_adder(bit0: int, bit1: int) -> qiskit.result.counts.Counts: """ >>> half_adder(0, 0) {'00': 1000} >>> half_adder(0, 1) {'01': 1000} >>> half_adder(1, 0) {'01': 1000} >>> half_adder(1, 1) {'10': 1000} """ # Use Aer's simulator simulator = qiskit.Aer.get_backend("aer_simulator") qc_ha = qiskit.QuantumCircuit(4, 2) # encode inputs in qubits 0 and 1 if bit0 == 1: qc_ha.x(0) if bit1 == 1: qc_ha.x(1) qc_ha.barrier() # use cnots to write XOR of the inputs on qubit2 qc_ha.cx(0, 2) qc_ha.cx(1, 2) # use ccx / toffoli gate to write AND of the inputs on qubit3 qc_ha.ccx(0, 1, 3) qc_ha.barrier() # extract outputs qc_ha.measure(2, 0) # extract XOR value qc_ha.measure(3, 1) # extract AND value # Execute the circuit on the qasm simulator job = qiskit.execute(qc_ha, simulator, shots=1000) # Return the histogram data of the results of the experiment return job.result().get_counts(qc_ha) if __name__ == "__main__": counts = half_adder(1, 1) print(f"Half Adder Output Qubit Counts: {counts}") ================================================ FILE: quantum/not_gate.py.DISABLED.txt ================================================ #!/usr/bin/env python3 """ Build a simple bare-minimum quantum circuit that starts with a single qubit (by default, in state 0) and inverts it. Run the experiment 1000 times and print the total count of the states finally observed. Qiskit Docs: https://qiskit.org/documentation/getting_started.html """ import qiskit def single_qubit_measure( qubits: int, classical_bits: int ) -> qiskit.result.counts.Counts: """ >>> single_qubit_measure(2, 2) {'11': 1000} >>> single_qubit_measure(4, 4) {'0011': 1000} """ # Use Aer's simulator simulator = qiskit.Aer.get_backend("aer_simulator") # Create a Quantum Circuit acting on the q register circuit = qiskit.QuantumCircuit(qubits, classical_bits) # Apply X (NOT) Gate to Qubits 0 & 1 circuit.x(0) circuit.x(1) # Map the quantum measurement to the classical bits circuit.measure([0, 1], [0, 1]) # Execute the circuit on the qasm simulator job = qiskit.execute(circuit, simulator, shots=1000) # Return the histogram data of the results of the experiment. return job.result().get_counts(circuit) if __name__ == "__main__": counts = single_qubit_measure(2, 2) print(f"Total count for various states are: {counts}") ================================================ FILE: quantum/q_fourier_transform.py ================================================ """ Build the quantum fourier transform (qft) for a desire number of quantum bits using Qiskit framework. This experiment run in IBM Q simulator with 10000 shots. This circuit can be use as a building block to design the Shor's algorithm in quantum computing. As well as, quantum phase estimation among others. . References: https://en.wikipedia.org/wiki/Quantum_Fourier_transform https://qiskit.org/textbook/ch-algorithms/quantum-fourier-transform.html """ import math import numpy as np import qiskit from qiskit import Aer, ClassicalRegister, QuantumCircuit, QuantumRegister, execute def quantum_fourier_transform(number_of_qubits: int = 3) -> qiskit.result.counts.Counts: """ # >>> quantum_fourier_transform(2) # {'00': 2500, '01': 2500, '11': 2500, '10': 2500} # quantum circuit for number_of_qubits = 3: ┌───┐ qr_0: ──────■──────────────────────■───────┤ H ├─X─ │ ┌───┐ │P(π/2) └───┘ │ qr_1: ──────┼────────■───────┤ H ├─■─────────────┼─ ┌───┐ │P(π/4) │P(π/2) └───┘ │ qr_2: ┤ H ├─■────────■───────────────────────────X─ └───┘ cr: 3/═════════════════════════════════════════════ Args: n : number of qubits Returns: qiskit.result.counts.Counts: distribute counts. >>> quantum_fourier_transform(2) {'00': 2500, '01': 2500, '10': 2500, '11': 2500} >>> quantum_fourier_transform(-1) Traceback (most recent call last): ... ValueError: number of qubits must be > 0. >>> quantum_fourier_transform('a') Traceback (most recent call last): ... TypeError: number of qubits must be a integer. >>> quantum_fourier_transform(100) Traceback (most recent call last): ... ValueError: number of qubits too large to simulate(>10). >>> quantum_fourier_transform(0.5) Traceback (most recent call last): ... ValueError: number of qubits must be exact integer. """ if isinstance(number_of_qubits, str): raise TypeError("number of qubits must be a integer.") if number_of_qubits <= 0: raise ValueError("number of qubits must be > 0.") if math.floor(number_of_qubits) != number_of_qubits: raise ValueError("number of qubits must be exact integer.") if number_of_qubits > 10: raise ValueError("number of qubits too large to simulate(>10).") qr = QuantumRegister(number_of_qubits, "qr") cr = ClassicalRegister(number_of_qubits, "cr") quantum_circuit = QuantumCircuit(qr, cr) counter = number_of_qubits for i in range(counter): quantum_circuit.h(number_of_qubits - i - 1) counter -= 1 for j in range(counter): quantum_circuit.cp(np.pi / 2 ** (counter - j), j, counter) for k in range(number_of_qubits // 2): quantum_circuit.swap(k, number_of_qubits - k - 1) # measure all the qubits quantum_circuit.measure(qr, cr) # simulate with 10000 shots backend = Aer.get_backend("qasm_simulator") job = execute(quantum_circuit, backend, shots=10000) return job.result().get_counts(quantum_circuit) if __name__ == "__main__": print( f"Total count for quantum fourier transform state is: \ {quantum_fourier_transform(3)}" ) ================================================ FILE: quantum/q_full_adder.py.DISABLED.txt ================================================ """ Build the quantum full adder (QFA) for any sum of two quantum registers and one carry in. This circuit is designed using the Qiskit framework. This experiment run in IBM Q simulator with 1000 shots. . References: https://www.quantum-inspire.com/kbase/full-adder/ """ import math import qiskit def quantum_full_adder( input_1: int = 1, input_2: int = 1, carry_in: int = 1 ) -> qiskit.result.counts.Counts: """ # >>> q_full_adder(inp_1, inp_2, cin) # the inputs can be 0/1 for qubits in define # values, or can be in a superposition of both # states with hadamard gate using the input value 2. # result for default values: {11: 1000} qr_0: ──■────■──────────────■── │ ┌─┴─┐ ┌─┴─┐ qr_1: ──■──┤ X ├──■────■──┤ X ├ │ └───┘ │ ┌─┴─┐└───┘ qr_2: ──┼─────────■──┤ X ├───── ┌─┴─┐ ┌─┴─┐└───┘ qr_3: ┤ X ├─────┤ X ├────────── └───┘ └───┘ cr: 2/═════════════════════════ Args: input_1: input 1 for the circuit. input_2: input 2 for the circuit. carry_in: carry in for the circuit. Returns: qiskit.result.counts.Counts: sum result counts. >>> quantum_full_adder(1, 1, 1) {'11': 1000} >>> quantum_full_adder(0, 0, 1) {'01': 1000} >>> quantum_full_adder(1, 0, 1) {'10': 1000} >>> quantum_full_adder(1, -4, 1) Traceback (most recent call last): ... ValueError: inputs must be positive. >>> quantum_full_adder('q', 0, 1) Traceback (most recent call last): ... TypeError: inputs must be integers. >>> quantum_full_adder(0.5, 0, 1) Traceback (most recent call last): ... ValueError: inputs must be exact integers. >>> quantum_full_adder(0, 1, 3) Traceback (most recent call last): ... ValueError: inputs must be less or equal to 2. """ if ( isinstance(input_1, str) or isinstance(input_2, str) or isinstance(carry_in, str) ): raise TypeError("inputs must be integers.") if (input_1 < 0) or (input_2 < 0) or (carry_in < 0): raise ValueError("inputs must be positive.") if ( (math.floor(input_1) != input_1) or (math.floor(input_2) != input_2) or (math.floor(carry_in) != carry_in) ): raise ValueError("inputs must be exact integers.") if (input_1 > 2) or (input_2 > 2) or (carry_in > 2): raise ValueError("inputs must be less or equal to 2.") # build registers qr = qiskit.QuantumRegister(4, "qr") cr = qiskit.ClassicalRegister(2, "cr") # list the entries entry = [input_1, input_2, carry_in] quantum_circuit = qiskit.QuantumCircuit(qr, cr) for i in range(3): if entry[i] == 2: quantum_circuit.h(i) # for hadamard entries elif entry[i] == 1: quantum_circuit.x(i) # for 1 entries elif entry[i] == 0: quantum_circuit.i(i) # for 0 entries # build the circuit quantum_circuit.ccx(0, 1, 3) # ccx = toffoli gate quantum_circuit.cx(0, 1) quantum_circuit.ccx(1, 2, 3) quantum_circuit.cx(1, 2) quantum_circuit.cx(0, 1) quantum_circuit.measure([2, 3], cr) # measure the last two qbits backend = qiskit.Aer.get_backend("aer_simulator") job = qiskit.execute(quantum_circuit, backend, shots=1000) return job.result().get_counts(quantum_circuit) if __name__ == "__main__": print(f"Total sum count for state is: {quantum_full_adder(1, 1, 1)}") ================================================ FILE: quantum/quantum_entanglement.py.DISABLED.txt ================================================ #!/usr/bin/env python3 """ Build a quantum circuit with pair or group of qubits to perform quantum entanglement. Quantum entanglement is a phenomenon observed at the quantum scale where entangled particles stay connected (in some sense) so that the actions performed on one of the particles affects the other, no matter the distance between two particles. """ import qiskit def quantum_entanglement(qubits: int = 2) -> qiskit.result.counts.Counts: """ # >>> quantum_entanglement(2) # {'00': 500, '11': 500} # ┌───┐ ┌─┐ # q_0: ┤ H ├──■──┤M├─── # └───┘┌─┴─┐└╥┘┌─┐ # q_1: ─────┤ X ├─╫─┤M├ # └───┘ ║ └╥┘ # c: 2/═══════════╩══╩═ # 0 1 Args: qubits (int): number of quibits to use. Defaults to 2 Returns: qiskit.result.counts.Counts: mapping of states to its counts """ classical_bits = qubits # Using Aer's simulator simulator = qiskit.Aer.get_backend("aer_simulator") # Creating a Quantum Circuit acting on the q register circuit = qiskit.QuantumCircuit(qubits, classical_bits) # Adding a H gate on qubit 0 (now q0 in superposition) circuit.h(0) for i in range(1, qubits): # Adding CX (CNOT) gate circuit.cx(i - 1, i) # Mapping the quantum measurement to the classical bits circuit.measure(list(range(qubits)), list(range(classical_bits))) # Now measuring any one qubit would affect other qubits to collapse # their super position and have same state as the measured one. # Executing the circuit on the simulator job = qiskit.execute(circuit, simulator, shots=1000) return job.result().get_counts(circuit) if __name__ == "__main__": print(f"Total count for various states are: {quantum_entanglement(3)}") ================================================ FILE: quantum/quantum_random.py.DISABLED.txt ================================================ import doctest import projectq from projectq.ops import H, Measure def get_random_number(quantum_engine: projectq.cengines._main.MainEngine) -> int: """ >>> isinstance(get_random_number(projectq.MainEngine()), int) True """ qubit = quantum_engine.allocate_qubit() H | qubit Measure | qubit return int(qubit) if __name__ == "__main__": doctest.testmod() # initialises a new quantum backend quantum_engine = projectq.MainEngine() # Generate a list of 10 random numbers random_numbers_list = [get_random_number(quantum_engine) for _ in range(10)] # Flushes the quantum engine from memory quantum_engine.flush() print("Random numbers", random_numbers_list) ================================================ FILE: quantum/quantum_teleportation.py.DISABLED.txt ================================================ #!/usr/bin/env python3 """ Build quantum teleportation circuit using three quantum bits and 1 classical bit. The main idea is to send one qubit from Alice to Bob using the entanglement properties. This experiment run in IBM Q simulator with 1000 shots. . References: https://en.wikipedia.org/wiki/Quantum_teleportation https://qiskit.org/textbook/ch-algorithms/teleportation.html """ import numpy as np import qiskit from qiskit import Aer, ClassicalRegister, QuantumCircuit, QuantumRegister, execute def quantum_teleportation( theta: float = np.pi / 2, phi: float = np.pi / 2, lam: float = np.pi / 2 ) -> qiskit.result.counts.Counts: """ # >>> quantum_teleportation() #{'00': 500, '11': 500} # ideally # ┌─────────────────┐ ┌───┐ #qr_0: ┤ U(π/2,π/2,π/2) ├───────■──┤ H ├─■───────── # └──────┬───┬──────┘ ┌─┴─┐└───┘ │ #qr_1: ───────┤ H ├─────────■──┤ X ├──────┼───■───── # └───┘ ┌─┴─┐└───┘ │ ┌─┴─┐┌─┐ #qr_2: ───────────────────┤ X ├───────────■─┤ X ├┤M├ # └───┘ └───┘└╥┘ #cr: 1/═══════════════════════════════════════════╩═ Args: theta (float): Single qubit rotation U Gate theta parameter. Default to np.pi/2 phi (float): Single qubit rotation U Gate phi parameter. Default to np.pi/2 lam (float): Single qubit rotation U Gate lam parameter. Default to np.pi/2 Returns: qiskit.result.counts.Counts: Teleported qubit counts. """ qr = QuantumRegister(3, "qr") # Define the number of quantum bits cr = ClassicalRegister(1, "cr") # Define the number of classical bits quantum_circuit = QuantumCircuit(qr, cr) # Define the quantum circuit. # Build the circuit quantum_circuit.u(theta, phi, lam, 0) # Quantum State to teleport quantum_circuit.h(1) # add hadamard gate quantum_circuit.cx( 1, 2 ) # add control gate with qubit 1 as control and 2 as target. quantum_circuit.cx(0, 1) quantum_circuit.h(0) quantum_circuit.cz(0, 2) # add control z gate. quantum_circuit.cx(1, 2) quantum_circuit.measure([2], [0]) # measure the qubit. # Simulate the circuit using qasm simulator backend = Aer.get_backend("aer_simulator") job = execute(quantum_circuit, backend, shots=1000) return job.result().get_counts(quantum_circuit) if __name__ == "__main__": print( "Total count for teleported state is: " f"{quantum_teleportation(np.pi/2, np.pi/2, np.pi/2)}" ) ================================================ FILE: quantum/ripple_adder_classic.py.DISABLED.txt ================================================ # https://github.com/rupansh/QuantumComputing/blob/master/rippleadd.py # https://en.wikipedia.org/wiki/Adder_(electronics)#Full_adder # https://en.wikipedia.org/wiki/Controlled_NOT_gate import qiskit from qiskit.providers import Backend def store_two_classics(val1: int, val2: int) -> tuple[qiskit.QuantumCircuit, str, str]: """ Generates a Quantum Circuit which stores two classical integers Returns the circuit and binary representation of the integers """ x, y = bin(val1)[2:], bin(val2)[2:] # Remove leading '0b' # Ensure that both strings are of the same length if len(x) > len(y): y = y.zfill(len(x)) else: x = x.zfill(len(y)) # We need (3 * number of bits in the larger number)+1 qBits # The second parameter is the number of classical registers, to measure the result circuit = qiskit.QuantumCircuit((len(x) * 3) + 1, len(x) + 1) # We are essentially "not-ing" the bits that are 1 # Reversed because it's easier to perform ops on more significant bits for i in range(len(x)): if x[::-1][i] == "1": circuit.x(i) for j in range(len(y)): if y[::-1][j] == "1": circuit.x(len(x) + j) return circuit, x, y def full_adder( circuit: qiskit.QuantumCircuit, input1_loc: int, input2_loc: int, carry_in: int, carry_out: int, ): """ Quantum Equivalent of a Full Adder Circuit CX/CCX is like 2-way/3-way XOR """ circuit.ccx(input1_loc, input2_loc, carry_out) circuit.cx(input1_loc, input2_loc) circuit.ccx(input2_loc, carry_in, carry_out) circuit.cx(input2_loc, carry_in) circuit.cx(input1_loc, input2_loc) # The default value for **backend** is the result of a function call which is not # normally recommended and causes ruff to raise a B008 error. However, in this case, # this is acceptable because `Aer.get_backend()` is called when the function is defined # and that same backend is then reused for all function calls. def ripple_adder( val1: int, val2: int, backend: Backend = qiskit.Aer.get_backend("aer_simulator"), # noqa: B008 ) -> int: """ Quantum Equivalent of a Ripple Adder Circuit Uses qasm_simulator backend by default Currently only adds 'emulated' Classical Bits but nothing prevents us from doing this with hadamard'd bits :) Only supports adding positive integers >>> ripple_adder(3, 4) 7 >>> ripple_adder(10, 4) 14 >>> ripple_adder(-1, 10) Traceback (most recent call last): ... ValueError: Both Integers must be positive! """ if val1 < 0 or val2 < 0: raise ValueError("Both Integers must be positive!") # Store the Integers circuit, x, y = store_two_classics(val1, val2) """ We are essentially using each bit of x & y respectively as full_adder's input the carry_input is used from the previous circuit (for circuit num > 1) the carry_out is just below carry_input because it will be essentially the carry_input for the next full_adder """ for i in range(len(x)): full_adder(circuit, i, len(x) + i, len(x) + len(y) + i, len(x) + len(y) + i + 1) circuit.barrier() # Optional, just for aesthetics # Measure the resultant qBits for i in range(len(x) + 1): circuit.measure([(len(x) * 2) + i], [i]) res = qiskit.execute(circuit, backend, shots=1).result() # The result is in binary. Convert it back to int return int(next(iter(res.get_counts())), 2) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: quantum/single_qubit_measure.py.DISABLED.txt ================================================ #!/usr/bin/env python3 """ Build a simple bare-minimum quantum circuit that starts with a single qubit (by default, in state 0), runs the experiment 1000 times, and finally prints the total count of the states finally observed. Qiskit Docs: https://qiskit.org/documentation/getting_started.html """ import qiskit def single_qubit_measure( qubits: int, classical_bits: int ) -> qiskit.result.counts.Counts: """ >>> single_qubit_measure(1, 1) {'0': 1000} """ # Use Aer's simulator simulator = qiskit.Aer.get_backend("aer_simulator") # Create a Quantum Circuit acting on the q register circuit = qiskit.QuantumCircuit(qubits, classical_bits) # Map the quantum measurement to the classical bits circuit.measure([0], [0]) # Execute the circuit on the simulator job = qiskit.execute(circuit, simulator, shots=1000) # Return the histogram data of the results of the experiment. return job.result().get_counts(circuit) if __name__ == "__main__": print(f"Total count for various states are: {single_qubit_measure(1, 1)}") ================================================ FILE: quantum/superdense_coding.py.DISABLED.txt ================================================ """ Build the superdense coding protocol. This quantum circuit can send two classical bits using one quantum bit. This circuit is designed using the Qiskit framework. This experiment run in IBM Q simulator with 1000 shots. . References: https://qiskit.org/textbook/ch-algorithms/superdense-coding.html https://en.wikipedia.org/wiki/Superdense_coding """ import math import qiskit from qiskit import Aer, ClassicalRegister, QuantumCircuit, QuantumRegister, execute def superdense_coding(bit_1: int = 1, bit_2: int = 1) -> qiskit.result.counts.Counts: """ The input refer to the classical message that you wants to send. {'00','01','10','11'} result for default values: {11: 1000} ┌───┐ ┌───┐ qr_0: ─────┤ X ├──────────┤ X ├───── ┌───┐└─┬─┘┌───┐┌───┐└─┬─┘┌───┐ qr_1: ┤ H ├──■──┤ X ├┤ Z ├──■──┤ H ├ └───┘ └───┘└───┘ └───┘ cr: 2/══════════════════════════════ Args: bit_1: bit 1 of classical information to send. bit_2: bit 2 of classical information to send. Returns: qiskit.result.counts.Counts: counts of send state. >>> superdense_coding(0,0) {'00': 1000} >>> superdense_coding(0,1) {'01': 1000} >>> superdense_coding(-1,0) Traceback (most recent call last): ... ValueError: inputs must be positive. >>> superdense_coding(1,'j') Traceback (most recent call last): ... TypeError: inputs must be integers. >>> superdense_coding(1,0.5) Traceback (most recent call last): ... ValueError: inputs must be exact integers. >>> superdense_coding(2,1) Traceback (most recent call last): ... ValueError: inputs must be less or equal to 1. """ if isinstance(bit_1, str) or isinstance(bit_2, str): raise TypeError("inputs must be integers.") if (bit_1 < 0) or (bit_2 < 0): raise ValueError("inputs must be positive.") if (math.floor(bit_1) != bit_1) or (math.floor(bit_2) != bit_2): raise ValueError("inputs must be exact integers.") if (bit_1 > 1) or (bit_2 > 1): raise ValueError("inputs must be less or equal to 1.") # build registers qr = QuantumRegister(2, "qr") cr = ClassicalRegister(2, "cr") quantum_circuit = QuantumCircuit(qr, cr) # entanglement the qubits quantum_circuit.h(1) quantum_circuit.cx(1, 0) # send the information c_information = str(bit_1) + str(bit_2) if c_information == "11": quantum_circuit.x(1) quantum_circuit.z(1) elif c_information == "10": quantum_circuit.z(1) elif c_information == "01": quantum_circuit.x(1) else: quantum_circuit.i(1) # unentangled the circuit quantum_circuit.cx(1, 0) quantum_circuit.h(1) # measure the circuit quantum_circuit.measure(qr, cr) backend = Aer.get_backend("aer_simulator") job = execute(quantum_circuit, backend, shots=1000) return job.result().get_counts(quantum_circuit) if __name__ == "__main__": print(f"Counts for classical state send: {superdense_coding(1,1)}") ================================================ FILE: scheduling/__init__.py ================================================ ================================================ FILE: scheduling/first_come_first_served.py ================================================ # Implementation of First Come First Served scheduling algorithm # In this Algorithm we just care about the order that the processes arrived # without carring about their duration time # https://en.wikipedia.org/wiki/Scheduling_(computing)#First_come,_first_served from __future__ import annotations def calculate_waiting_times(duration_times: list[int]) -> list[int]: """ This function calculates the waiting time of some processes that have a specified duration time. Return: The waiting time for each process. >>> calculate_waiting_times([5, 10, 15]) [0, 5, 15] >>> calculate_waiting_times([1, 2, 3, 4, 5]) [0, 1, 3, 6, 10] >>> calculate_waiting_times([10, 3]) [0, 10] """ waiting_times = [0] * len(duration_times) for i in range(1, len(duration_times)): waiting_times[i] = duration_times[i - 1] + waiting_times[i - 1] return waiting_times def calculate_turnaround_times( duration_times: list[int], waiting_times: list[int] ) -> list[int]: """ This function calculates the turnaround time of some processes. Return: The time difference between the completion time and the arrival time. Practically waiting_time + duration_time >>> calculate_turnaround_times([5, 10, 15], [0, 5, 15]) [5, 15, 30] >>> calculate_turnaround_times([1, 2, 3, 4, 5], [0, 1, 3, 6, 10]) [1, 3, 6, 10, 15] >>> calculate_turnaround_times([10, 3], [0, 10]) [10, 13] """ return [ duration_time + waiting_times[i] for i, duration_time in enumerate(duration_times) ] def calculate_average_turnaround_time(turnaround_times: list[int]) -> float: """ This function calculates the average of the turnaround times Return: The average of the turnaround times. >>> calculate_average_turnaround_time([0, 5, 16]) 7.0 >>> calculate_average_turnaround_time([1, 5, 8, 12]) 6.5 >>> calculate_average_turnaround_time([10, 24]) 17.0 """ return sum(turnaround_times) / len(turnaround_times) def calculate_average_waiting_time(waiting_times: list[int]) -> float: """ This function calculates the average of the waiting times Return: The average of the waiting times. >>> calculate_average_waiting_time([0, 5, 16]) 7.0 >>> calculate_average_waiting_time([1, 5, 8, 12]) 6.5 >>> calculate_average_waiting_time([10, 24]) 17.0 """ return sum(waiting_times) / len(waiting_times) if __name__ == "__main__": # process id's processes = [1, 2, 3] # ensure that we actually have processes if len(processes) == 0: print("Zero amount of processes") raise SystemExit(0) # duration time of all processes duration_times = [19, 8, 9] # ensure we can match each id to a duration time if len(duration_times) != len(processes): print("Unable to match all id's with their duration time") raise SystemExit(0) # get the waiting times and the turnaround times waiting_times = calculate_waiting_times(duration_times) turnaround_times = calculate_turnaround_times(duration_times, waiting_times) # get the average times average_waiting_time = calculate_average_waiting_time(waiting_times) average_turnaround_time = calculate_average_turnaround_time(turnaround_times) # print all the results print("Process ID\tDuration Time\tWaiting Time\tTurnaround Time") for i, process in enumerate(processes): print( f"{process}\t\t{duration_times[i]}\t\t{waiting_times[i]}\t\t" f"{turnaround_times[i]}" ) print(f"Average waiting time = {average_waiting_time}") print(f"Average turn around time = {average_turnaround_time}") ================================================ FILE: scheduling/highest_response_ratio_next.py ================================================ """ Highest response ratio next (HRRN) scheduling is a non-preemptive discipline. It was developed as modification of shortest job next or shortest job first (SJN or SJF) to mitigate the problem of process starvation. https://en.wikipedia.org/wiki/Highest_response_ratio_next """ from statistics import mean import numpy as np def calculate_turn_around_time( process_name: list, arrival_time: list, burst_time: list, no_of_process: int ) -> list: """ Calculate the turn around time of each processes Return: The turn around time time for each process. >>> calculate_turn_around_time(["A", "B", "C"], [3, 5, 8], [2, 4, 6], 3) [2, 4, 7] >>> calculate_turn_around_time(["A", "B", "C"], [0, 2, 4], [3, 5, 7], 3) [3, 6, 11] """ current_time = 0 # Number of processes finished finished_process_count = 0 # Displays the finished process. # If it is 0, the performance is completed if it is 1, before the performance. finished_process = [0] * no_of_process # List to include calculation results turn_around_time = [0] * no_of_process # Sort by arrival time. burst_time = [burst_time[i] for i in np.argsort(arrival_time)] process_name = [process_name[i] for i in np.argsort(arrival_time)] arrival_time.sort() while no_of_process > finished_process_count: """ If the current time is less than the arrival time of the process that arrives first among the processes that have not been performed, change the current time. """ i = 0 while finished_process[i] == 1: i += 1 current_time = max(current_time, arrival_time[i]) response_ratio = 0 # Index showing the location of the process being performed loc = 0 # Saves the current response ratio. temp = 0 for i in range(no_of_process): if finished_process[i] == 0 and arrival_time[i] <= current_time: temp = (burst_time[i] + (current_time - arrival_time[i])) / burst_time[ i ] if response_ratio < temp: response_ratio = temp loc = i # Calculate the turn around time turn_around_time[loc] = current_time + burst_time[loc] - arrival_time[loc] current_time += burst_time[loc] # Indicates that the process has been performed. finished_process[loc] = 1 # Increase finished_process_count by 1 finished_process_count += 1 return turn_around_time def calculate_waiting_time( process_name: list, # noqa: ARG001 turn_around_time: list, burst_time: list, no_of_process: int, ) -> list: """ Calculate the waiting time of each processes. Return: The waiting time for each process. >>> calculate_waiting_time(["A", "B", "C"], [2, 4, 7], [2, 4, 6], 3) [0, 0, 1] >>> calculate_waiting_time(["A", "B", "C"], [3, 6, 11], [3, 5, 7], 3) [0, 1, 4] """ waiting_time = [0] * no_of_process for i in range(no_of_process): waiting_time[i] = turn_around_time[i] - burst_time[i] return waiting_time if __name__ == "__main__": no_of_process = 5 process_name = ["A", "B", "C", "D", "E"] arrival_time = [1, 2, 3, 4, 5] burst_time = [1, 2, 3, 4, 5] turn_around_time = calculate_turn_around_time( process_name, arrival_time, burst_time, no_of_process ) waiting_time = calculate_waiting_time( process_name, turn_around_time, burst_time, no_of_process ) print("Process name \tArrival time \tBurst time \tTurn around time \tWaiting time") for i in range(no_of_process): print( f"{process_name[i]}\t\t{arrival_time[i]}\t\t{burst_time[i]}\t\t" f"{turn_around_time[i]}\t\t\t{waiting_time[i]}" ) print(f"average waiting time : {mean(waiting_time):.5f}") print(f"average turn around time : {mean(turn_around_time):.5f}") ================================================ FILE: scheduling/job_sequence_with_deadline.py ================================================ """ Given a list of tasks, each with a deadline and reward, calculate which tasks can be completed to yield the maximum reward. Each task takes one unit of time to complete, and we can only work on one task at a time. Once a task has passed its deadline, it can no longer be scheduled. Example : tasks_info = [(4, 20), (1, 10), (1, 40), (1, 30)] max_tasks will return (2, [2, 0]) - Scheduling these tasks would result in a reward of 40 + 20 This problem can be solved using the concept of "GREEDY ALGORITHM". Time Complexity - O(n log n) https://medium.com/@nihardudhat2000/job-sequencing-with-deadline-17ddbb5890b5 """ from dataclasses import dataclass from operator import attrgetter @dataclass class Task: task_id: int deadline: int reward: int def max_tasks(tasks_info: list[tuple[int, int]]) -> list[int]: """ Create a list of Task objects that are sorted so the highest rewards come first. Return a list of those task ids that can be completed before i becomes too high. >>> max_tasks([(4, 20), (1, 10), (1, 40), (1, 30)]) [2, 0] >>> max_tasks([(1, 10), (2, 20), (3, 30), (2, 40)]) [3, 2] >>> max_tasks([(9, 10)]) [0] >>> max_tasks([(-9, 10)]) [] >>> max_tasks([]) [] >>> max_tasks([(0, 10), (0, 20), (0, 30), (0, 40)]) [] >>> max_tasks([(-1, 10), (-2, 20), (-3, 30), (-4, 40)]) [] """ tasks = sorted( ( Task(task_id, deadline, reward) for task_id, (deadline, reward) in enumerate(tasks_info) ), key=attrgetter("reward"), reverse=True, ) return [task.task_id for i, task in enumerate(tasks, start=1) if task.deadline >= i] if __name__ == "__main__": import doctest doctest.testmod() print(f"{max_tasks([(4, 20), (1, 10), (1, 40), (1, 30)]) = }") print(f"{max_tasks([(1, 10), (2, 20), (3, 30), (2, 40)]) = }") ================================================ FILE: scheduling/job_sequencing_with_deadline.py ================================================ def job_sequencing_with_deadlines(jobs: list) -> list: """ Function to find the maximum profit by doing jobs in a given time frame Args: jobs [list]: A list of tuples of (job_id, deadline, profit) Returns: max_profit [int]: Maximum profit that can be earned by doing jobs in a given time frame Examples: >>> job_sequencing_with_deadlines( ... [(1, 4, 20), (2, 1, 10), (3, 1, 40), (4, 1, 30)]) [2, 60] >>> job_sequencing_with_deadlines( ... [(1, 2, 100), (2, 1, 19), (3, 2, 27), (4, 1, 25), (5, 1, 15)]) [2, 127] """ # Sort the jobs in descending order of profit jobs = sorted(jobs, key=lambda value: value[2], reverse=True) # Create a list of size equal to the maximum deadline # and initialize it with -1 max_deadline = max(jobs, key=lambda value: value[1])[1] time_slots = [-1] * max_deadline # Finding the maximum profit and the count of jobs count = 0 max_profit = 0 for job in jobs: # Find a free time slot for this job # (Note that we start from the last possible slot) for i in range(job[1] - 1, -1, -1): if time_slots[i] == -1: time_slots[i] = job[0] count += 1 max_profit += job[2] break return [count, max_profit] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: scheduling/multi_level_feedback_queue.py ================================================ from collections import deque class Process: def __init__(self, process_name: str, arrival_time: int, burst_time: int) -> None: self.process_name = process_name # process name self.arrival_time = arrival_time # arrival time of the process # completion time of finished process or last interrupted time self.stop_time = arrival_time self.burst_time = burst_time # remaining burst time self.waiting_time = 0 # total time of the process wait in ready queue self.turnaround_time = 0 # time from arrival time to completion time class MLFQ: """ MLFQ(Multi Level Feedback Queue) https://en.wikipedia.org/wiki/Multilevel_feedback_queue MLFQ has a lot of queues that have different priority In this MLFQ, The first Queue(0) to last second Queue(N-2) of MLFQ have Round Robin Algorithm The last Queue(N-1) has First Come, First Served Algorithm """ def __init__( self, number_of_queues: int, time_slices: list[int], queue: deque[Process], current_time: int, ) -> None: # total number of mlfq's queues self.number_of_queues = number_of_queues # time slice of queues that round robin algorithm applied self.time_slices = time_slices # unfinished process is in this ready_queue self.ready_queue = queue # current time self.current_time = current_time # finished process is in this sequence queue self.finish_queue: deque[Process] = deque() def calculate_sequence_of_finish_queue(self) -> list[str]: """ This method returns the sequence of finished processes >>> P1 = Process("P1", 0, 53) >>> P2 = Process("P2", 0, 17) >>> P3 = Process("P3", 0, 68) >>> P4 = Process("P4", 0, 24) >>> mlfq = MLFQ(3, [17, 25], deque([P1, P2, P3, P4]), 0) >>> _ = mlfq.multi_level_feedback_queue() >>> mlfq.calculate_sequence_of_finish_queue() ['P2', 'P4', 'P1', 'P3'] """ sequence = [] for i in range(len(self.finish_queue)): sequence.append(self.finish_queue[i].process_name) return sequence def calculate_waiting_time(self, queue: list[Process]) -> list[int]: """ This method calculates waiting time of processes >>> P1 = Process("P1", 0, 53) >>> P2 = Process("P2", 0, 17) >>> P3 = Process("P3", 0, 68) >>> P4 = Process("P4", 0, 24) >>> mlfq = MLFQ(3, [17, 25], deque([P1, P2, P3, P4]), 0) >>> _ = mlfq.multi_level_feedback_queue() >>> mlfq.calculate_waiting_time([P1, P2, P3, P4]) [83, 17, 94, 101] """ waiting_times = [] for i in range(len(queue)): waiting_times.append(queue[i].waiting_time) return waiting_times def calculate_turnaround_time(self, queue: list[Process]) -> list[int]: """ This method calculates turnaround time of processes >>> P1 = Process("P1", 0, 53) >>> P2 = Process("P2", 0, 17) >>> P3 = Process("P3", 0, 68) >>> P4 = Process("P4", 0, 24) >>> mlfq = MLFQ(3, [17, 25], deque([P1, P2, P3, P4]), 0) >>> _ = mlfq.multi_level_feedback_queue() >>> mlfq.calculate_turnaround_time([P1, P2, P3, P4]) [136, 34, 162, 125] """ turnaround_times = [] for i in range(len(queue)): turnaround_times.append(queue[i].turnaround_time) return turnaround_times def calculate_completion_time(self, queue: list[Process]) -> list[int]: """ This method calculates completion time of processes >>> P1 = Process("P1", 0, 53) >>> P2 = Process("P2", 0, 17) >>> P3 = Process("P3", 0, 68) >>> P4 = Process("P4", 0, 24) >>> mlfq = MLFQ(3, [17, 25], deque([P1, P2, P3, P4]), 0) >>> _ = mlfq.multi_level_feedback_queue() >>> mlfq.calculate_turnaround_time([P1, P2, P3, P4]) [136, 34, 162, 125] """ completion_times = [] for i in range(len(queue)): completion_times.append(queue[i].stop_time) return completion_times def calculate_remaining_burst_time_of_processes( self, queue: deque[Process] ) -> list[int]: """ This method calculate remaining burst time of processes >>> P1 = Process("P1", 0, 53) >>> P2 = Process("P2", 0, 17) >>> P3 = Process("P3", 0, 68) >>> P4 = Process("P4", 0, 24) >>> mlfq = MLFQ(3, [17, 25], deque([P1, P2, P3, P4]), 0) >>> finish_queue, ready_queue = mlfq.round_robin(deque([P1, P2, P3, P4]), 17) >>> mlfq.calculate_remaining_burst_time_of_processes(mlfq.finish_queue) [0] >>> mlfq.calculate_remaining_burst_time_of_processes(ready_queue) [36, 51, 7] >>> finish_queue, ready_queue = mlfq.round_robin(ready_queue, 25) >>> mlfq.calculate_remaining_burst_time_of_processes(mlfq.finish_queue) [0, 0] >>> mlfq.calculate_remaining_burst_time_of_processes(ready_queue) [11, 26] """ return [q.burst_time for q in queue] def update_waiting_time(self, process: Process) -> int: """ This method updates waiting times of unfinished processes >>> P1 = Process("P1", 0, 53) >>> P2 = Process("P2", 0, 17) >>> P3 = Process("P3", 0, 68) >>> P4 = Process("P4", 0, 24) >>> mlfq = MLFQ(3, [17, 25], deque([P1, P2, P3, P4]), 0) >>> mlfq.current_time = 10 >>> P1.stop_time = 5 >>> mlfq.update_waiting_time(P1) 5 """ process.waiting_time += self.current_time - process.stop_time return process.waiting_time def first_come_first_served(self, ready_queue: deque[Process]) -> deque[Process]: """ FCFS(First Come, First Served) FCFS will be applied to MLFQ's last queue A first came process will be finished at first >>> P1 = Process("P1", 0, 53) >>> P2 = Process("P2", 0, 17) >>> P3 = Process("P3", 0, 68) >>> P4 = Process("P4", 0, 24) >>> mlfq = MLFQ(3, [17, 25], deque([P1, P2, P3, P4]), 0) >>> _ = mlfq.first_come_first_served(mlfq.ready_queue) >>> mlfq.calculate_sequence_of_finish_queue() ['P1', 'P2', 'P3', 'P4'] """ finished: deque[Process] = deque() # sequence deque of finished process while len(ready_queue) != 0: cp = ready_queue.popleft() # current process # if process's arrival time is later than current time, update current time if self.current_time < cp.arrival_time: self.current_time += cp.arrival_time # update waiting time of current process self.update_waiting_time(cp) # update current time self.current_time += cp.burst_time # finish the process and set the process's burst-time 0 cp.burst_time = 0 # set the process's turnaround time because it is finished cp.turnaround_time = self.current_time - cp.arrival_time # set the completion time cp.stop_time = self.current_time # add the process to queue that has finished queue finished.append(cp) self.finish_queue.extend(finished) # add finished process to finish queue # FCFS will finish all remaining processes return finished def round_robin( self, ready_queue: deque[Process], time_slice: int ) -> tuple[deque[Process], deque[Process]]: """ RR(Round Robin) RR will be applied to MLFQ's all queues except last queue All processes can't use CPU for time more than time_slice If the process consume CPU up to time_slice, it will go back to ready queue >>> P1 = Process("P1", 0, 53) >>> P2 = Process("P2", 0, 17) >>> P3 = Process("P3", 0, 68) >>> P4 = Process("P4", 0, 24) >>> mlfq = MLFQ(3, [17, 25], deque([P1, P2, P3, P4]), 0) >>> finish_queue, ready_queue = mlfq.round_robin(mlfq.ready_queue, 17) >>> mlfq.calculate_sequence_of_finish_queue() ['P2'] """ finished: deque[Process] = deque() # sequence deque of terminated process # just for 1 cycle and unfinished processes will go back to queue for _ in range(len(ready_queue)): cp = ready_queue.popleft() # current process # if process's arrival time is later than current time, update current time if self.current_time < cp.arrival_time: self.current_time += cp.arrival_time # update waiting time of unfinished processes self.update_waiting_time(cp) # if the burst time of process is bigger than time-slice if cp.burst_time > time_slice: # use CPU for only time-slice self.current_time += time_slice # update remaining burst time cp.burst_time -= time_slice # update end point time cp.stop_time = self.current_time # locate the process behind the queue because it is not finished ready_queue.append(cp) else: # use CPU for remaining burst time self.current_time += cp.burst_time # set burst time 0 because the process is finished cp.burst_time = 0 # set the finish time cp.stop_time = self.current_time # update the process' turnaround time because it is finished cp.turnaround_time = self.current_time - cp.arrival_time # add the process to queue that has finished queue finished.append(cp) self.finish_queue.extend(finished) # add finished process to finish queue # return finished processes queue and remaining processes queue return finished, ready_queue def multi_level_feedback_queue(self) -> deque[Process]: """ MLFQ(Multi Level Feedback Queue) >>> P1 = Process("P1", 0, 53) >>> P2 = Process("P2", 0, 17) >>> P3 = Process("P3", 0, 68) >>> P4 = Process("P4", 0, 24) >>> mlfq = MLFQ(3, [17, 25], deque([P1, P2, P3, P4]), 0) >>> finish_queue = mlfq.multi_level_feedback_queue() >>> mlfq.calculate_sequence_of_finish_queue() ['P2', 'P4', 'P1', 'P3'] """ # all queues except last one have round_robin algorithm for i in range(self.number_of_queues - 1): _finished, self.ready_queue = self.round_robin( self.ready_queue, self.time_slices[i] ) # the last queue has first_come_first_served algorithm self.first_come_first_served(self.ready_queue) return self.finish_queue if __name__ == "__main__": import doctest P1 = Process("P1", 0, 53) P2 = Process("P2", 0, 17) P3 = Process("P3", 0, 68) P4 = Process("P4", 0, 24) number_of_queues = 3 time_slices = [17, 25] queue = deque([P1, P2, P3, P4]) if len(time_slices) != number_of_queues - 1: raise SystemExit(0) doctest.testmod(extraglobs={"queue": deque([P1, P2, P3, P4])}) P1 = Process("P1", 0, 53) P2 = Process("P2", 0, 17) P3 = Process("P3", 0, 68) P4 = Process("P4", 0, 24) number_of_queues = 3 time_slices = [17, 25] queue = deque([P1, P2, P3, P4]) mlfq = MLFQ(number_of_queues, time_slices, queue, 0) finish_queue = mlfq.multi_level_feedback_queue() # print total waiting times of processes(P1, P2, P3, P4) print( f"waiting time:\ \t\t\t{MLFQ.calculate_waiting_time(mlfq, [P1, P2, P3, P4])}" ) # print completion times of processes(P1, P2, P3, P4) print( f"completion time:\ \t\t{MLFQ.calculate_completion_time(mlfq, [P1, P2, P3, P4])}" ) # print total turnaround times of processes(P1, P2, P3, P4) print( f"turnaround time:\ \t\t{MLFQ.calculate_turnaround_time(mlfq, [P1, P2, P3, P4])}" ) # print sequence of finished processes print( f"sequence of finished processes:\ {mlfq.calculate_sequence_of_finish_queue()}" ) ================================================ FILE: scheduling/non_preemptive_shortest_job_first.py ================================================ """ Non-preemptive Shortest Job First Shortest execution time process is chosen for the next execution. https://www.guru99.com/shortest-job-first-sjf-scheduling.html https://en.wikipedia.org/wiki/Shortest_job_next """ from __future__ import annotations from statistics import mean def calculate_waitingtime( arrival_time: list[int], burst_time: list[int], no_of_processes: int ) -> list[int]: """ Calculate the waiting time of each processes Return: The waiting time for each process. >>> calculate_waitingtime([0,1,2], [10, 5, 8], 3) [0, 9, 13] >>> calculate_waitingtime([1,2,2,4], [4, 6, 3, 1], 4) [0, 7, 4, 1] >>> calculate_waitingtime([0,0,0], [12, 2, 10],3) [12, 0, 2] """ waiting_time = [0] * no_of_processes remaining_time = [0] * no_of_processes # Initialize remaining_time to waiting_time. for i in range(no_of_processes): remaining_time[i] = burst_time[i] ready_process: list[int] = [] completed = 0 total_time = 0 # When processes are not completed, # A process whose arrival time has passed \ # and has remaining execution time is put into the ready_process. # The shortest process in the ready_process, target_process is executed. while completed != no_of_processes: ready_process = [] target_process = -1 for i in range(no_of_processes): if (arrival_time[i] <= total_time) and (remaining_time[i] > 0): ready_process.append(i) if len(ready_process) > 0: target_process = ready_process[0] for i in ready_process: if remaining_time[i] < remaining_time[target_process]: target_process = i total_time += burst_time[target_process] completed += 1 remaining_time[target_process] = 0 waiting_time[target_process] = ( total_time - arrival_time[target_process] - burst_time[target_process] ) else: total_time += 1 return waiting_time def calculate_turnaroundtime( burst_time: list[int], no_of_processes: int, waiting_time: list[int] ) -> list[int]: """ Calculate the turnaround time of each process. Return: The turnaround time for each process. >>> calculate_turnaroundtime([0,1,2], 3, [0, 10, 15]) [0, 11, 17] >>> calculate_turnaroundtime([1,2,2,4], 4, [1, 8, 5, 4]) [2, 10, 7, 8] >>> calculate_turnaroundtime([0,0,0], 3, [12, 0, 2]) [12, 0, 2] """ turn_around_time = [0] * no_of_processes for i in range(no_of_processes): turn_around_time[i] = burst_time[i] + waiting_time[i] return turn_around_time if __name__ == "__main__": print("[TEST CASE 01]") no_of_processes = 4 burst_time = [2, 5, 3, 7] arrival_time = [0, 0, 0, 0] waiting_time = calculate_waitingtime(arrival_time, burst_time, no_of_processes) turn_around_time = calculate_turnaroundtime( burst_time, no_of_processes, waiting_time ) # Printing the Result print("PID\tBurst Time\tArrival Time\tWaiting Time\tTurnaround Time") for i, process_id in enumerate(list(range(1, 5))): print( f"{process_id}\t{burst_time[i]}\t\t\t{arrival_time[i]}\t\t\t\t" f"{waiting_time[i]}\t\t\t\t{turn_around_time[i]}" ) print(f"\nAverage waiting time = {mean(waiting_time):.5f}") print(f"Average turnaround time = {mean(turn_around_time):.5f}") ================================================ FILE: scheduling/round_robin.py ================================================ """ Round Robin is a scheduling algorithm. In Round Robin each process is assigned a fixed time slot in a cyclic way. https://en.wikipedia.org/wiki/Round-robin_scheduling """ from __future__ import annotations from statistics import mean def calculate_waiting_times(burst_times: list[int]) -> list[int]: """ Calculate the waiting times of a list of processes that have a specified duration. Return: The waiting time for each process. >>> calculate_waiting_times([10, 5, 8]) [13, 10, 13] >>> calculate_waiting_times([4, 6, 3, 1]) [5, 8, 9, 6] >>> calculate_waiting_times([12, 2, 10]) [12, 2, 12] """ quantum = 2 rem_burst_times = list(burst_times) waiting_times = [0] * len(burst_times) t = 0 while True: done = True for i, burst_time in enumerate(burst_times): if rem_burst_times[i] > 0: done = False if rem_burst_times[i] > quantum: t += quantum rem_burst_times[i] -= quantum else: t += rem_burst_times[i] waiting_times[i] = t - burst_time rem_burst_times[i] = 0 if done is True: return waiting_times def calculate_turn_around_times( burst_times: list[int], waiting_times: list[int] ) -> list[int]: """ >>> calculate_turn_around_times([1, 2, 3, 4], [0, 1, 3]) [1, 3, 6] >>> calculate_turn_around_times([10, 3, 7], [10, 6, 11]) [20, 9, 18] """ return [burst + waiting for burst, waiting in zip(burst_times, waiting_times)] if __name__ == "__main__": burst_times = [3, 5, 7] waiting_times = calculate_waiting_times(burst_times) turn_around_times = calculate_turn_around_times(burst_times, waiting_times) print("Process ID \tBurst Time \tWaiting Time \tTurnaround Time") for i, burst_time in enumerate(burst_times): print( f" {i + 1}\t\t {burst_time}\t\t {waiting_times[i]}\t\t " f"{turn_around_times[i]}" ) print(f"\nAverage waiting time = {mean(waiting_times):.5f}") print(f"Average turn around time = {mean(turn_around_times):.5f}") ================================================ FILE: scheduling/shortest_job_first.py ================================================ """ Shortest job remaining first Please note arrival time and burst Please use spaces to separate times entered. """ from __future__ import annotations import pandas as pd def calculate_waitingtime( arrival_time: list[int], burst_time: list[int], no_of_processes: int ) -> list[int]: """ Calculate the waiting time of each processes Return: List of waiting times. >>> calculate_waitingtime([1,2,3,4],[3,3,5,1],4) [0, 3, 5, 0] >>> calculate_waitingtime([1,2,3],[2,5,1],3) [0, 2, 0] >>> calculate_waitingtime([2,3],[5,1],2) [1, 0] """ remaining_time = [0] * no_of_processes waiting_time = [0] * no_of_processes # Copy the burst time into remaining_time[] for i in range(no_of_processes): remaining_time[i] = burst_time[i] complete = 0 increment_time = 0 minm = 999999999 short = 0 check = False # Process until all processes are completed while complete != no_of_processes: for j in range(no_of_processes): if ( arrival_time[j] <= increment_time and remaining_time[j] > 0 and remaining_time[j] < minm ): minm = remaining_time[j] short = j check = True if not check: increment_time += 1 continue remaining_time[short] -= 1 minm = remaining_time[short] if minm == 0: minm = 999999999 if remaining_time[short] == 0: complete += 1 check = False # Find finish time of current process finish_time = increment_time + 1 # Calculate waiting time finar = finish_time - arrival_time[short] waiting_time[short] = finar - burst_time[short] waiting_time[short] = max(waiting_time[short], 0) # Increment time increment_time += 1 return waiting_time def calculate_turnaroundtime( burst_time: list[int], no_of_processes: int, waiting_time: list[int] ) -> list[int]: """ Calculate the turn around time of each Processes Return: list of turn around times. >>> calculate_turnaroundtime([3,3,5,1], 4, [0,3,5,0]) [3, 6, 10, 1] >>> calculate_turnaroundtime([3,3], 2, [0,3]) [3, 6] >>> calculate_turnaroundtime([8,10,1], 3, [1,0,3]) [9, 10, 4] """ turn_around_time = [0] * no_of_processes for i in range(no_of_processes): turn_around_time[i] = burst_time[i] + waiting_time[i] return turn_around_time def calculate_average_times( waiting_time: list[int], turn_around_time: list[int], no_of_processes: int ) -> None: """ This function calculates the average of the waiting & turnaround times Prints: Average Waiting time & Average Turn Around Time >>> calculate_average_times([0,3,5,0],[3,6,10,1],4) Average waiting time = 2.00000 Average turn around time = 5.0 >>> calculate_average_times([2,3],[3,6],2) Average waiting time = 2.50000 Average turn around time = 4.5 >>> calculate_average_times([10,4,3],[2,7,6],3) Average waiting time = 5.66667 Average turn around time = 5.0 """ total_waiting_time = 0 total_turn_around_time = 0 for i in range(no_of_processes): total_waiting_time = total_waiting_time + waiting_time[i] total_turn_around_time = total_turn_around_time + turn_around_time[i] print(f"Average waiting time = {total_waiting_time / no_of_processes:.5f}") print("Average turn around time =", total_turn_around_time / no_of_processes) if __name__ == "__main__": print("Enter how many process you want to analyze") no_of_processes = int(input()) burst_time = [0] * no_of_processes arrival_time = [0] * no_of_processes processes = list(range(1, no_of_processes + 1)) for i in range(no_of_processes): print("Enter the arrival time and burst time for process:--" + str(i + 1)) arrival_time[i], burst_time[i] = map(int, input().split()) waiting_time = calculate_waitingtime(arrival_time, burst_time, no_of_processes) bt = burst_time n = no_of_processes wt = waiting_time turn_around_time = calculate_turnaroundtime(bt, n, wt) calculate_average_times(waiting_time, turn_around_time, no_of_processes) fcfs = pd.DataFrame( list(zip(processes, burst_time, arrival_time, waiting_time, turn_around_time)), columns=[ "Process", "BurstTime", "ArrivalTime", "WaitingTime", "TurnAroundTime", ], ) # Printing the dataFrame pd.set_option("display.max_rows", fcfs.shape[0] + 1) print(fcfs) ================================================ FILE: scripts/README.md ================================================ Dealing with the onslaught of Hacktoberfest * https://hacktoberfest.com Each year, October brings a swarm of new contributors participating in Hacktoberfest. This event has its pros and cons, but it presents a monumental workload for the few active maintainers of this repo. The maintainer workload is further impacted by a new version of CPython being released in the first week of each October. To help make our algorithms more valuable to visitors, our CONTRIBUTING.md file outlines several strict requirements, such as tests, type hints, descriptive names, functions, and/or classes. Maintainers reviewing pull requests should try to encourage improvements to meet these goals, but when the workload becomes overwhelming (esp. in October), pull requests that do not meet these goals should be closed. Below are a few [`gh`](https://cli.github.com) scripts that should close pull requests that do not match the definition of an acceptable algorithm as defined in CONTRIBUTING.md. I tend to run these scripts in the following order. * close_pull_requests_with_require_descriptive_names.sh * close_pull_requests_with_require_tests.sh * close_pull_requests_with_require_type_hints.sh * close_pull_requests_with_failing_tests.sh * close_pull_requests_with_awaiting_changes.sh * find_git_conflicts.sh ### Run on 14 Oct 2025: 107 of 541 (19.77%) pull requests closed. Script run | Open pull requests | Pull requests closed --- | --- | --- None | 541 | 0 require_descriptive_names | 515 | 26 require_tests | 498 | 17 require_type_hints | 496 | 2 failing_tests | 438 | ___58___ awaiting_changes | 434 | 4 git_conflicts | [ broken ] | 0 ================================================ FILE: scripts/__init__.py ================================================ ================================================ FILE: scripts/build_directory_md.py ================================================ #!/usr/bin/env python3 import os from collections.abc import Iterator def good_file_paths(top_dir: str = ".") -> Iterator[str]: for dir_path, dir_names, filenames in os.walk(top_dir): dir_names[:] = [ d for d in dir_names if d != "scripts" and d[0] not in "._" and "venv" not in d ] for filename in filenames: if filename == "__init__.py": continue if os.path.splitext(filename)[1] in (".py", ".ipynb"): yield os.path.join(dir_path, filename).lstrip("./") def md_prefix(indent: int) -> str: """ Markdown prefix based on indent for bullet points >>> md_prefix(0) '\\n##' >>> md_prefix(1) ' *' >>> md_prefix(2) ' *' >>> md_prefix(3) ' *' """ return f"{indent * ' '}*" if indent else "\n##" def print_path(old_path: str, new_path: str) -> str: old_parts = old_path.split(os.sep) for i, new_part in enumerate(new_path.split(os.sep)): if (i + 1 > len(old_parts) or old_parts[i] != new_part) and new_part: print(f"{md_prefix(i)} {new_part.replace('_', ' ').title()}") return new_path def print_directory_md(top_dir: str = ".") -> None: old_path = "" for filepath in sorted(good_file_paths(top_dir)): filepath, filename = os.path.split(filepath) if filepath != old_path: old_path = print_path(old_path, filepath) indent = (filepath.count(os.sep) + 1) if filepath else 0 url = f"{filepath}/{filename}".replace(" ", "%20") filename = os.path.splitext(filename.replace("_", " ").title())[0] print(f"{md_prefix(indent)} [{filename}]({url})") if __name__ == "__main__": print_directory_md(".") ================================================ FILE: scripts/close_pull_requests_with_awaiting_changes.sh ================================================ #!/bin/bash # List all open pull requests prs=$(gh pr list --state open --json number,title,labels --limit 500) # Loop through each pull request echo "$prs" | jq -c '.[]' | while read -r pr; do pr_number=$(echo "$pr" | jq -r '.number') pr_title=$(echo "$pr" | jq -r '.title') pr_labels=$(echo "$pr" | jq -r '.labels') # Check if the "awaiting changes" label is present awaiting_changes=$(echo "$pr_labels" | jq -r '.[] | select(.name == "awaiting changes")') echo "Checking PR #$pr_number $pr_title ($awaiting_changes) ($pr_labels)" # If awaiting_changes, close the pull request if [[ -n "$awaiting_changes" ]]; then echo "Closing PR #$pr_number $pr_title due to awaiting_changes label" gh pr close "$pr_number" --comment "Closing awaiting_changes PRs to prepare for Hacktoberfest" sleep 2 fi done ================================================ FILE: scripts/close_pull_requests_with_failing_tests.sh ================================================ #!/bin/bash # List all open pull requests prs=$(gh pr list --state open --json number,title,labels --limit 500) # Loop through each pull request echo "$prs" | jq -c '.[]' | while read -r pr; do pr_number=$(echo "$pr" | jq -r '.number') pr_title=$(echo "$pr" | jq -r '.title') pr_labels=$(echo "$pr" | jq -r '.labels') # Check if the "tests are failing" label is present tests_are_failing=$(echo "$pr_labels" | jq -r '.[] | select(.name == "tests are failing")') echo "Checking PR #$pr_number $pr_title ($tests_are_failing) ($pr_labels)" # If there are failing tests, close the pull request if [[ -n "$tests_are_failing" ]]; then echo "Closing PR #$pr_number $pr_title due to tests_are_failing label" gh pr close "$pr_number" --comment "Closing tests_are_failing PRs to prepare for Hacktoberfest" sleep 2 fi done ================================================ FILE: scripts/close_pull_requests_with_require_descriptive_names.sh ================================================ #!/bin/bash # List all open pull requests prs=$(gh pr list --state open --json number,title,labels --limit 500) # Loop through each pull request echo "$prs" | jq -c '.[]' | while read -r pr; do pr_number=$(echo "$pr" | jq -r '.number') pr_title=$(echo "$pr" | jq -r '.title') pr_labels=$(echo "$pr" | jq -r '.labels') # Check if the "require descriptive names" label is present require_descriptive_names=$(echo "$pr_labels" | jq -r '.[] | select(.name == "require descriptive names")') echo "Checking PR #$pr_number $pr_title ($require_descriptive_names) ($pr_labels)" # If there are require_descriptive_names, close the pull request if [[ -n "$require_descriptive_names" ]]; then echo "Closing PR #$pr_number $pr_title due to require_descriptive_names label" gh pr close "$pr_number" --comment "Closing require_descriptive_names PRs to prepare for Hacktoberfest" fi done ================================================ FILE: scripts/close_pull_requests_with_require_tests.sh ================================================ #!/bin/bash # List all open pull requests prs=$(gh pr list --state open --json number,title,labels --limit 500) # Loop through each pull request echo "$prs" | jq -c '.[]' | while read -r pr; do pr_number=$(echo "$pr" | jq -r '.number') pr_title=$(echo "$pr" | jq -r '.title') pr_labels=$(echo "$pr" | jq -r '.labels') # Check if the "require_tests" label is present require_tests=$(echo "$pr_labels" | jq -r '.[] | select(.name == "require tests")') echo "Checking PR #$pr_number $pr_title ($require_tests) ($pr_labels)" # If there require tests, close the pull request if [[ -n "$require_tests" ]]; then echo "Closing PR #$pr_number $pr_title due to require_tests label" gh pr close "$pr_number" --comment "Closing require_tests PRs to prepare for Hacktoberfest" # sleep 2 fi done ================================================ FILE: scripts/close_pull_requests_with_require_type_hints.sh ================================================ #!/bin/bash # List all open pull requests prs=$(gh pr list --state open --json number,title,labels --limit 500) # Loop through each pull request echo "$prs" | jq -c '.[]' | while read -r pr; do pr_number=$(echo "$pr" | jq -r '.number') pr_title=$(echo "$pr" | jq -r '.title') pr_labels=$(echo "$pr" | jq -r '.labels') # Check if the "require type hints" label is present require_type_hints=$(echo "$pr_labels" | jq -r '.[] | select(.name == "require type hints")') echo "Checking PR #$pr_number $pr_title ($require_type_hints) ($pr_labels)" # If require_type_hints, close the pull request if [[ -n "$require_type_hints" ]]; then echo "Closing PR #$pr_number $pr_title due to require_type_hints label" gh pr close "$pr_number" --comment "Closing require_type_hints PRs to prepare for Hacktoberfest" fi done ================================================ FILE: scripts/find_git_conflicts.sh ================================================ #!/bin/bash # Replace with your repository (format: owner/repo) REPO="TheAlgorithms/Python" # Fetch open pull requests with conflicts into a variable echo "Checking for pull requests with conflicts in $REPO..." prs=$(gh pr list --repo "$REPO" --state open --json number,title,mergeable --jq '.[] | select(.mergeable == "CONFLICTING") | {number, title}' --limit 500) # Process each conflicting PR echo "$prs" | jq -c '.[]' | while read -r pr; do PR_NUMBER=$(echo "$pr" | jq -r '.number') PR_TITLE=$(echo "$pr" | jq -r '.title') echo "PR #$PR_NUMBER - $PR_TITLE has conflicts." done ================================================ FILE: scripts/project_euler_answers.json ================================================ { "001": "c0b20f4665d0388d564f0b6ecf3edc9f9480cb15fff87198b95701d9f5fe1f7b", "002": "1f5882e19314ac13acca52ad5503184b3cb1fd8dbeea82e0979d799af2361704", "003": "5c09f0554518a413e58e6bc5964ba90655713483d0b2bbc94572ad6b0b4dda28", "004": "aa74f52b4c428d89606b411bc165eb81a6266821ecc9b4f30cdb70c5c930f4d9", "005": "1ba90ab11bfb2d2400545337212b0de2a5c7f399215175ade6396e91388912b1", "006": "537942be3eb323c507623a6a73fa87bf5aeb97b7c7422993a82aa7c15f6d9cd6", "007": "ecbe74e25cfa4763dbc304ccac2ffb9912e9625cd9993a84bd0dd6d7dc0ca021", "008": "b9fb30b6553415e9150051ce5710a93d0f55b22557c0068d8e16619a388f145a", "009": "d912d9d473ef86f12da1fb2011c5c0c155bd3a0ebdb4bbd7ea275cecdcb63731", "010": "bed2d160e02f0540f19a64ca738aacb79cfcd08ba7e2421567b16cb6e7e3e90e", "011": "9ded5bc849d33e477aa9c944138d34f0aacc485a372e84464e8a572712a5b7da", "012": "3e7be445b6c19e6db58c2482005c1f78cb74011a4279249ca632011a9f1b61a2", "013": "3cb265a96c5645a9ad11d47551f015c25f3f99792c951617656d84626fbc4868", "014": "78a262dd40eba0f7195686ec7f3891a39437523456f8d16fa9065a34409eeac6", "015": "7b8f812ca89e311e1b16b903de76fa7b0800a939b3028d9dc4d35f6fa4050281", "016": "a6f988d30328bd706c66f8ac0d92aac21dd732149cdd69cb31f459dca20c5abe", "017": "1a455b216c6e916943acf3fa4c7e57a7a5cac66d97cc51befca810c223ef9c23", "018": "fde3f2e7127f6810eb4160bf7bb0563240d78c9d75a9a590b6d6244748a7f4ff", "019": "284de502c9847342318c17d474733ef468fbdbe252cddf6e4b4be0676706d9d0", "020": "c86a2932e1c79343a3c16fb218b9944791aaeedd3e30c87d1c7f505c0e588f7c", "021": "e8c6ef4a1736a245b5682e0262c5c43862cfb233ca5e286be2f5bb4d8a974ecf", "022": "85148c096c25e3ed3da55c7e9c89448018b0f5f53ad8d042129c33d9beac6736", "023": "42e2552a2f589e021824339e2508629ffa00b3489ea467f47e77a1ea97e735c9", "024": "4677b3d9daa3b30a9665e4558f826e04f7833dda886b8ef24f7176519a0db537", "025": "7d398da8791745001b3d1c41030676d1c036687eb1ab32e0b5a1832e7579c073", "026": "fbe10beedf9d29cf53137ba38859ffd1dbe7642cedb7ef0a102a3ab109b47842", "027": "e4110e0852a2f70703f0081fc91c4a20f595919a038729cb37c564d68b875c6f", "028": "261171a770d594f6a7fc76c1a839eda7f6dd4e9495e00e75048578fc86d8adf0", "029": "a207c35d8417aeed4c9e78bcf83f936cd8191c702893be62aa690ce16bc909ca", "030": "46e68e4199ab0a663ab306651528b06756556c9f0d8b819095af45e036dfbe6b", "031": "8de34b4ba97b184c7a2096b9266776175242b87d67bc8d77d7289be6f70cd105", "032": "0d246750daa7f1b367a21f55da454ddc8f62e0a95d163062e9b9273320d5130f", "033": "ad57366865126e55649ecb23ae1d48887544976efea46a48eb5d85a6eeb4d306", "034": "728b8d7d6d5d34cad9cbb7c3ea15f807ae57144594b1740b3c73b82314ccd1ed", "035": "02d20bbd7e394ad5999a4cebabac9619732c343a4cac99470c03e23ba2bdc2bc", "036": "9480c0160719234b57defc0681c0949a175ffb3ff4a3bf5e8163ac843f383f35", "037": "e9800abda89919edac504e90dac91f95e0778e3ba0f21a0bac4e77a84766eaaf", "038": "b2004522103364a6e842b9d042c0707d79af68dec7810078729d061fb7948912", "039": "fd0f7e53c5b02b688a57ee37f3d52065cb168a7b9fd5a3abd93d37e1559fbd30", "040": "d29d53701d3c859e29e1b90028eec1ca8e2f29439198b6e036c60951fb458aa1", "041": "bf05020e70de94e26dba112bb6fb7b0755db5ca88c7225e99187c5a08c8a0428", "042": "79d6eaa2676189eb927f2e16a70091474078e2117c3fc607d35cdc6b591ef355", "043": "6512f20c244844b6130204379601855098826afa1b55ff91c293c853ddf67db5", "044": "97e2524fd3796e83b06c0f89fdcb16e4c544e76e9c0496f57ac84834869f4cc3", "045": "8b0300d71656b9cf0716318be9453c99a13bb8644d227fd683d06124e6a28b35", "046": "8485ee802cc628b8cbd82476133d11b57af87e00711516a703525a9af0193b12", "047": "c7274da71333bd93201fa1e05b1ed54e0074d83f259bd7148c70ddc43082bde1", "048": "743d17cbff06ab458b99ecbb32e1d6bb9a7ff2ac804118f7743177dd969cfc61", "049": "47c6094ff1ff6e37788def89190c8256619ef1511681c503fea02c171569d16e", "050": "6ee74ef623df9fb69facd30b91ed78fe70370462bb267097f0dfeef9d9b057bb", "051": "d17cec28356b4f9a7f1ec0f20cca4c89e270aeb0e75d70d485b05bb1f28e9f6d", "052": "ebd72b510911af3e254a030cd891cb804e1902189eee7a0f6199472eb5e4dba2", "053": "9705cc6128a60cc22581217b715750a6053b2ddda67cc3af7e14803b27cf0c1f", "054": "12e2c8df501501b2bb531e941a737ffa7a2a491e849c5c5841e3b6132291bc35", "055": "9f484139a27415ae2e8612bf6c65a8101a18eb5e9b7809e74ca63a45a65f17f4", "056": "3658d7fa3c43456f3c9c87db0490e872039516e6375336254560167cc3db2ea2", "057": "620c9c332101a5bae955c66ae72268fbcd3972766179522c8deede6a249addb7", "058": "196f327021627b6a48db9c6e0a3388d110909d4bb957eb3fbc90ff1ecbda42cb", "059": "0295239a9d71f7452b93e920b7e0e462f712af5444579d25e06b9614ed77de74", "060": "ad7c26db722221bfb1bf7e3c36b501bedf8be857b1cfa8664fccb074b54354f9", "061": "94e4fb283c1abcccae4b8b28e39a294a323cdc9732c3d3ce1133c518d0a286f6", "062": "d25a595036aa8722157aca38f90084acb369b00df1070f49e203d5a3b7a0736d", "063": "0e17daca5f3e175f448bacace3bc0da47d0655a74c8dd0dc497a3afbdad95f1f", "064": "6d62aa4b52071e39f064a930d190b85ab327eb1a5045a8050ac538666ee765ca", "065": "1c6c0bb2c7ecdc3be8e134f79b9de45155258c1f554ae7542dce48f5cc8d63f0", "066": "316c0f93c7fe125865d85d6e7e7a31b79e9a46c414c45078b732080fa22ef2a3", "067": "53f66b6783cb7552d83015df01b0d5229569fce1dd7d1856335c7244b9a3ded6", "068": "4bf689d09a156621220881a2264dc031b2bfb181213b26d6ff2c338408cf94c3", "069": "79555e4b891e2885525c136f8b834cc0b1e9416960b12e371111a5cb2da0479f", "070": "08c6a7c8c06a01d2b17993ada398084b0707652bcfbd580f9173bcddf120ac2c", "071": "63f032489227c969135c6a6571fe9b33d6970dc6eca32c2086c61a4a099c98fa", "072": "9ef8a4249d4b8f24147ab6e9ad2536eb04f10fb886a8099e88e0e7c41cf7c616", "073": "ae9f9c786cd0f24fe03196d5061545862d87a208580570d46e2cfb371319aa68", "074": "b7c7470e59e2a2df1bfd0a4705488ee6fe0c5c125de15cccdfab0e00d6c03dc0", "075": "8a426e100572b8e2ea7c1b404a1ee694699346632cf4942705c54f05162bc07a", "076": "81c54809c3bdfc23f844fde21ae645525817b6e1bee1525270f49282888a5546", "077": "7f2253d7e228b22a08bda1f09c516f6fead81df6536eb02fa991a34bb38d9be8", "078": "71374036b661ac8ffe4b78c191050c3ccd1c956ca8a5f465ea1956f7ce571f63", "079": "2df095aea1862ebfed8df7fb26e8c4a518ca1a8f604a31cfba9da991fc1d6422", "080": "58bfe3a44f8ae452aaa6ef6267bafc3e841cfe7f9672bdfeb841d2e3a62c1587", "081": "04bad90d08bdf11010267ec9d1c9bbb49a813194dace245868ea8140aec9a1f7", "082": "52c42c55daea3131d5357498b8a0ddcf99d1babd16f6ccaee67cb3d0a665b772", "083": "a825281bc5ce8fe70d66a04e96314e7de070f11fed0f78bc81e007ca7c92e8b0", "084": "692a776beae0e92d1121fed36427c10d0860344614ead6b4760d1b7091a6ab1f", "085": "7b2e7211fb4f4d8352c9215c591252344775c56d58b9a5ff88bda8358628ec4e", "086": "8ffe8459134b46975acd31df13a50c51dbeacf1c19a764bf1602ba7c73ffc8fb", "087": "cec1917df3b3ee1f43b3468596ed3042df700dc7a752fefc06c4142a2832995d", "088": "c06356fdcaff01810e1f794263f3e44a75f28e8902a145a0d01a1fff77614722", "089": "0df5486b7bca884d5f00c502e216f734b2865b202397f24bca25ac9b8a95ab4a", "090": "cb69775effd93fc34ef38dfbfcdc4c593b1a3d8e7ab70c0f05d627dbc5cbd298", "091": "327f057e054d1e6a9a1be4ac6acc4b1dedc63d8a88222396ffe98b3194067347", "092": "538cd20a275b610698691d714b2adf4e4c321915def05667f4d25d97413ec076", "093": "d8ed8ca27d83a63df6982905ea53b4613b9d7974edcee06f301cf43d63177f47", "094": "d1b79281d95ce5bfa848060de4e0c80af2c3cae1ff7453cca31ff31e2d67ac14", "095": "0a3ddcd71cf30a567070630f947ab79fc168865ba0bf112aed9b71fb4e76c32f", "096": "9c527d233befbf357335e18e6dd5b14ef3a62e19ef34f90bd3fb9e5a2a0a0111", "097": "f0e2911e303617c9648692ee8056beeb045d89e469315716abed47cd94a3cd56", "098": "ededac5db280586f534cde4f69ce2c134d2360d6b5da3c3ebc400494cc016e78", "099": "92c5fd0421c1d619cbf1bdba83a207261f2c5f764aed46db9b4d2de03b72b654", "100": "993189cbf49fef4c913aa081f2ef44d360b84bf33d19df93fce4663ac34e9927", "101": "e8539f8b271851cad65d551354874d3086fa9ff7b6f6a2ab9890d63f5ba16c68", "102": "9d693eeee1d1899cbc50b6d45df953d3835acf28ee869879b45565fccc814765", "103": "1f17277005b8d58ad32f2cbee4c482cb8c0f3687c3cfe764ec30ee99827c3b1d", "104": "87dfcf5471e77980d098ff445701dbada0f6f7bac2fa5e43fa7685ec435040e1", "105": "a76f4e7fa1357a955743d5c0acb2e641c50bcaf0eec27eb4aaffebb45fe12994", "106": "197f5e68d1e83af7e40a7c7717acc6a99767bf8c53eece9253131a3790a02063", "107": "bf13bc90121776d7de3c4c3ca4c400a4c12284c3da684b3d530113236813ce81", "108": "3dea386e2c4a8a0633b667fdd4beacd8bb3fe27c282f886c828ad7d6b42c2d73", "109": "735cc3e619b9a1e3ac503ba5195c43c02d968113fd3795373ca085ed7777b54d", "110": "01b4e8163485356b46f612c9d40ed4b8602621d4d02289623e7dbb3dcbe03395", "111": "97c1b054c094337ec1397cd5ccdf6c9efe1067ad16f531824a94eaadb3c0953b", "112": "c99c843e0f6d6566132d97c829780332218e005efc14b633e25a5badb912d63a", "113": "8dbc8319e5d8923ef7ab42108341ee2c32a34ffc0d19d5ae5677f1564813314a", "114": "b3b9ebc9f9ddadb6b630eeef5d7ba724b3bb4d071b249318093eb7547949bbb9", "115": "80c3cd40fa35f9088b8741bd8be6153de05f661cfeeb4625ffbf5f4a6c3c02c4", "116": "a39208d7130682b772d6206acd746bc3779cc1bc0033f0a472e97993d0a32d5b", "117": "54201fbc7a70d21c1b0acede7708f1658d8e87032ab666001e888e7887c67d50", "118": "834e6235764ae632737ebf7cd0be66634c4fb70fe1e55e858efd260a66a0e3a9", "119": "bcabd9609d7293a3a3f1640c2937e302fa52ff03a95c117f87f2c465817eba5e", "120": "2bd8cabf5aecfcadde03beda142ac26c00b6ccfc59fdcb685672cd79a92f63a6", "121": "5292478e83f6b244c7c7c5c1fe272121abdc2982f66ed11fcbc6ea7e73af124d", "122": "6d78b19a042a64f08cc4df0d42fb91cd757829718e60e82a54e3498f03f3ef32", "123": "057b9b6e49d03958b3f38e812d2cfdd0f500e35e537b4fa9afedd2f3444db8a2", "124": "d251170c5287da10bffc1ac8af344e0c434ef5f649fd430fcf1049f90d45cf45", "125": "e9b7a676dc359ffce7075886373af79e3348ddbf344502614d9940eecd0532c1", "126": "38752ed2e711a3c001d5139cb3c945c0f780939db4ea80d68f31e6763b11cfba", "127": "e707d9f315269a34d94d9d9fa4f8b29328e66b53447ef38419c6033e57d5d123", "128": "5e15922fba7f61ddccb2ee579b5ec35034cc32def25ff156ae2b0a3e98c4414e", "129": "3cc4ad1254491787f52a66e595dbb573e13ceb554c51d81e42d5490a575da070", "130": "7a6e9899cccb6a01e05013c622422717f54853f7f2581bc3b88a78b25981da08", "131": "4a8596a7790b5ca9e067da401c018b3206befbcf95c38121854d1a0158e7678a", "132": "ed77e05f47f7f19f09cae9b272bfd6daa1682b426d39dcb7f473234c0c9381c5", "133": "e456d3fec55d88653dd88c3f8bbde1f8240c8ceb7882016d19e6f329e412a4ae", "134": "b144116982f4f0930038299efbdd56afc1528ef59047fb75bade8777309fde4b", "135": "0709e1008834c2ca8648376ac62d74ac8df5457069cbfedf2b0776dab07a3c5b", "136": "84692ebaa4fc17e9cfce27126b3fc5a92c1e33e1d94658de0544f8b35a597592", "137": "6eca481578c967fb9373fe4ce7930b39d8eefe1c0c9c7cb5af241a766bd4dfbc", "138": "1b5f0f504917592dea2e878497b0e12655366f2a7a163e0a081d785124982d2c", "139": "0d2f26ec4004c99171fc415282ec714afa617208480b45aeb104c039dc653f5d", "140": "78ceab5e434a86a6a6bb4f486707bffaf536ef6cb2cc5b45a90b3edd89a03283", "141": "d74ae4b07f05779065fb038b35d85a21444ed3bed2373f51d9e22d85a16a704c", "142": "f59af8b0b63a3d0eb580405092c1539261aec18890ea5b6d6e2d93697d67cd38", "143": "66e9d1093f00eef9a32e704232219f462138f13c493cc0775c507cf51cb231ed", "144": "09a1b036b82baba3177d83c27c1f7d0beacaac6de1c5fdcc9680c49f638c5fb9", "145": "b910b9b7bf3c3f071e410e0474958931a022d20c717a298a568308250ed2b0da", "146": "5292f0166523ea1a89c9f7f2d69064dee481a7d3c119841442cd36f03c42b657", "147": "cdb162a8a376b1df385dac44ce7b10777c9fea049961cb303078ebbd08d70de8", "148": "54f631973f7bc002a958b818a1e99e2fc1a91c41eafe19b9136fac9a4eb8d7b8", "149": "c49382eb9fc41e750239ac7b209513a266e80a268c83cf4d0c79f571629bac48", "150": "c89b0574a2e2f4a63845fe0fd9d51122d9d4149d887995051c3e53d2244bba41", "151": "5d09e3b57ced9fd215acc96186743e422ce48900b8992c9b6c74d3e4117e4140", "152": "c3ea99f86b2f8a74ef4145bb245155ff5f91cd856f287523481c15a1959d5fd1", "153": "fb57f89f289ee59c36cede64d2d13828b8997766b49aa4530aabfc18ff4a4f17", "154": "c877d90a178511a52ae2b2119e99e0b8b643cec44d5fd864bd3ef3e0d7f1f4bb", "155": "58801bebc14c905b79c209affab74e176e2e971c1d9799a1a342ae6a3c2afbc1", "156": "983d2222220ab7ffa243f48274f6eb82f92258445b93b23724770995575d77fe", "157": "023344e94ad747fbc529e3e68b95e596badcc445c85c1c7c8fa590e3d492779a", "158": "d1b58f4c07d1db5eb97785807b6d97a0d1ee1340e7dbcc7bb289f3547559f2fc", "159": "cd3a3d2cf8973c5f2c97ebed2460784818513e7d0fee8f98f4fdcf510295e159", "160": "3a926519b024ea9df5e7ad79d0b1c4400f78f58d07834f5ecd7be522112b676d", "161": "2b3d09a4c76b282db1428342c82c5a55c0ab57c7a7640e0850d82021164477e9", "162": "d50ce1ab3a25a5c5e020517092128ab3ec4a3bd5b58673b2e6cda86bcc0c48a0", "163": "7e17ce0fca5d559f76015765c652d76b8468f9ddc91c2069d7799867b9d52769", "164": "5c680d0b2c4dfac8aade87be60cb4d04a4c3d4db398f51e2cbf131d699b630a8", "165": "304de2e63f91f8f74faaebae7a7ec2e0c6e0d8d322d8a747e4e3be88de2d3505", "166": "14212843872dab188a86eb1f0f7012e1b72ea1097545f29377b3b9b52822af76", "167": "18c18f8710f831a82eb74ae979bd36d609bee818c972ff88f8d8fa065270f951", "168": "66640021d592f79b510f9d6101bd8eca89893187d23919c8edff4075e73ae390", "169": "819b01e0394727fd089f84b9351243176920f03d0c6e33e5ff136016da5d8d4e", "170": "e68fadd33a8c41d9a259577a278d8518aeb8b81c67b8cf03ccf43fc451ec8bd8", "171": "33bf9ed4714b0e5da8828f8b3d9d3e9d0cf55c1d496324acb04a3f195252749c", "172": "b9a27b513dc15448772cac5e914de61f02efe323f528892c0bff86d19913a6bd", "173": "1b2a5e44fda5dfee3ce230f44fe73c672249f6620cdbaa343ba0ba808034958c", "174": "98aabf085c6c8647f5e8a4775dc1d036513742d8e03b8c5c51e41bdfc9c3e7ae", "175": "c03dcb22b7faf121d99542018dd10a07a778abee2678d35c03394a8d207b826b", "176": "4fff1a7beda4291446d76e5ed5177c3f36e52a10481009fdaf2976da39e802ae", "177": "614d3df0ba5fdffab2328eff8e9ca2d76b09bbc447c06bf1fab0419ae278fae9", "178": "094a2ba3011118efdd9d4c1f839e6747dee8ba953b52e9012fe2977e32599375", "179": "9f5563a5ea90ca7023f0304acba78005ee6b7351245a8a668a94dfef160f8d29", "180": "dbef09115a57784ea4ea14c1fe35571301b0d6139bea29d1b9e0babf2c2aae05", "181": "3920627e86db42beb1cdf61d026f9f7798082f1221db25a17fb7feb6c1d49027", "182": "58096166bb8199abf4e07a9ef0f960065e5a635443c1937a1a3c527ade51d594", "183": "bdf84a73b16a5dd5ece189dc970ab2c8f0cb5334c96bdd1d6ba2bad6e7f8a213", "184": "c1e8c0f1b1eb3c258923e9daa46ef055bd79512b485c7dc73a9c5e395d5e6911", "185": "0ea72907eb6c1120740cd80ee6b9a935cd754edcf69379328f24dfc3f09b9986", "186": "3c0078aeae0362b6b7561518d3eb28400193fec73aab35980f138c28b6579433", "187": "f2bc655b33e35669ee9adc841cbda98e0834083eb0657d10f7170e70081db7e0", "188": "38e0291a3f5438779b157e5efcae6cef9db21cbac5607cd08882844cf981febd", "189": "9b2a65ac4c35f6b392501dee2a28221a3975aac5f0866b476f5e6a5a59f3fcc2", "190": "606fe2cb6525dabfcdab93afb594dbc8399cb967fc05f0ca93f6084d3f8fb591", "191": "ea1977e7b22df383de61bded2a4bb3064cf17fcc0170be452330256f938b8d55", "192": "91d614f139082168d730003f04b87135c64e13709ced2a96001ed60796867825", "193": "65648f18a50a7f9195fe56bb8cb9e25421c6d777ad2447a3b566dc8c54f3399a", "194": "cdd31847c6138853597261756d5e795884566220a9361217daa5ba7f87560404", "195": "d12224510de6c98076f6289cbe342a7ec7ea3c5453f6e3cf8d37d9eea74bd07e", "196": "1349b472d2821dff215e54d683dbfca49f0b490ade6a30b1db9667bc94e5312d", "197": "e2aa8f7cb3ba893af8bddbffa6240e7eb71a4f4c4498f2a360f3db7b513094df", "198": "a29d9edd0dceca9a72d2238a50dbb728846cd06594baec35a1b2c053faeab93d", "199": "50a6b9725ef854537a554584ca74612a4d37d0ec35d85d04812c3ae730a4c8cc", "200": "5b439098a3081d99496a7b1b2df6500ca5f66c2f170c709a57b27c6be717538a", "201": "b4e86186652a11df0b9ec8f601c68b4823ae0bafd96357051371fde5d11a25ed", "202": "057243f52fd25fa90a16219d945950ed5523ddb7eb6f2f361b33f8b85af25930", "203": "2742f7af8ce9e20185e940bb4e27afc5fefe8cd7d01d7d8e16c7a5aaf3ad47aa", "204": "15f5e9ae4636a6bf8bdd52f582774b9696b485671f4a64ab8c717166dc085205", "205": "e03c2f4ceabf677ec502d235064a62271ce2ee91132b33f57382c4150c295784", "206": "16bb96da8f20d738bbd735404ea148818ef5942d4d1bc4c707171f9e5e476b1e", "207": "133fea765d0b055894d8aba573f47891c1f7f715f53edeefb200fbda758a1884", "208": "90831cd89b4cceacaf099c9bae2452132cfa2f2b5553c651ef4948460e53d1f3", "209": "570fab1574a3fd9aca6404083dec1c150e858e137692ee0c8011e702ec3e902f", "210": "ae9a76ce3418c06d0eac3375a82744fb4250a2f380e723c404334d8572faead0", "211": "aa4b2bc3a136b27bf10a858ac6a8d48f41e40f769182c444df89c5b9f0ed84e5", "212": "81489bf56605b69cc48f0bce22615d4415b2eea882a11a33e1b317c4facba6eb", "213": "a497e789f49b77d647de0e80cd2699acd3d384cc29c534d6609c700968124d14", "214": "409520c6a94de382003db04a3dfee85a6dbb71324f8bd033e566e510ad47e747", "215": "0eccb27846f417380a12dfd588a353e151b328425ecf3794c9cf7b7eec1a1110", "216": "f735b4b441635ecded989bdc2862e35c75f5179d118d0533ae827a84ed29e81b", "217": "9aa88ac109aefaa7ce79c7b085495863a70679058b106a5deb76b2772a531faa", "218": "5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e9", "219": "9da1307fd12f4c9a21a34e612920cec286d937418a2d5040676408ba0c47f3d8", "220": "a262318d02a14747ed2137c701f94248bf8651a23d1f82826952e66c25029588", "221": "bfb4e53578fa42f83eda027da0467a351298dd65e3e8e84a987d69fc275e9f2d", "222": "4308f4374b84e657aa7a21e5f5fe42ed16386b6dc7a74bff0d24d08ad62acd26", "223": "3790f82f65ce7bc071b4096ca22544548b3413a755f58bfc401eff3ddf487a86", "224": "96356c050fa66d919c75212d789544db81b012bbaf1f7915b053cb9ba2d67de7", "225": "f37f3f2b0dc57a86dee4ba6ff855283bb4d2f0dea1c5bd1b708853444c2ffcec", "226": "49bd28d97a79875007a6713aa9700df14464217c28a6e76bc93ded57b75a33f5", "227": "b1f73471a3e6ea1dfb04610bd89ccb110994780084280fae872d42a2786f9131", "228": "e38da154f6cccd06cd0001924ec2dad8de5bdcd0b78b68e8d8347768d99ac0bd", "229": "098ffc6baaa32734053275ce38f4bbe58efe0ff946bf31e0e2df4c6a169e23d8", "230": "2c72b887a8638941b85765645b45c5cdb73255427e14d5114f6830f847a6b861", "231": "4aa0c92e77eeed08994650ac6129d77db9f026ae2aee78ad5c9fde132fac0505", "232": "5f7905b71cb897bc7cc6db7e29cc38ee459e2fd8f5d58ba4746d3acd4e46d444", "233": "8d986e287ad21475728b0dbd9e935623d69db4e5fdca0d42bc32d70eda48985b", "234": "2d9d03b778af897e305caa8a1a14a117737bbdd549003c6d7477dd3be8331694", "235": "7168cff545d365b09e8997bb9450343c7090913876c8f7eb9f0e9849c6fc7dd5", "236": "ceb3002bad36c22c5da82fd422b36bad91b97a7d3f5409ed5d16aa9b42dc137a", "237": "c857d8fa78c8fde91f29b3fbe332c2e781f7e8b54532f4c352693d6676fda2a8", "238": "3e2edae8b8ddbcfaecd5aa6c69cb5960b84cc16f7b3232f3386aae9ecbd23f20", "239": "49df3a63ca6509687cabb3d208e92b057630231e66b87fe8c781baabb12a55f8", "240": "5034a21557b2de1c5c2d2aadfe8ffe62162c23f42d1aaabc705ed8519e91a3c1", "241": "85abbe1913df41c57d1e6f00cecea416edb19c64681d1bb43fb5024e2f48d409", "242": "4da30e6198a3d9ae6a538c2366e08ee218de6efe2c5b8f231493e21489c21a7e", "243": "7404bb7881a010271831847e71162ee7a393843922ee93cf7cf3455a0074279c", "244": "21aa3213adeb0a562ec7161e1cfcb5f1701303f1c9f03ed726c536283e080db6", "245": "22b9cfa9ab97c84eb64e3478a43acd4d95b90cae8c3453c968457a89c6387a81", "246": "729e3de7687fc597be2eb4c592d697ff29c78cff6945c9690cfb1ee67550eeed", "247": "f49b98df95a1f826c24cf622ba4d80427a0e0767dffcc28a9206c58508863cca", "248": "44b8116c29dafbdfa984b3751c1dfd057b3e93fc57c8cd18495f1c0f605496bc", "249": "49e96b6ba41e88901dbd118139ef6f013b4fc59e2347058a7e726cf6a2f14067", "250": "f0e0dc05fb555ae5ba9820586bef3bb8a3a82905ece3d8a998a3015fc91c1c3e", "251": "8c1ece1b350c210380456da2bab70054f717731b0dfb34bc3cf4abfacf696f15", "252": "ad20a49374f9176bd26460d35f96f30d734df3cf6fc63b4642380b4e866848de", "253": "ba1a2bbccabbcddbf29ee0b56d0d56b4f026e8a7b97e97de2d48c133ccbdf2a1", "254": "381a2eac64a984a81671722bd95ca5b8b6508a6f490af46780e9f393c6797223", "255": "5e6ece13372bad4a6ea011c933389dfaefedad5860aefba2ab97fe5f59156c42", "256": "068d4a3c845803bf66a9e5320261a0fd7b6292a8230b271a6a83f0dc8c73e907", "257": "d80ac9215ffa7adacb22711cc88f5b580272d0d65c49e1ea48e69d17e264d91a", "258": "256c4d399703b7f16dadef9201efc0ef9f6aa6ee05ddfa2d3e26ff6efe09704d", "259": "275a4e84039a1596ac7e8bbe186163dcfb02bfa99c209653ff5d505a29b4cb10", "260": "f461ff2df66653be1a2e579b1aea515d4a84f2ae5ebea3aa21fb2477a53699f4", "261": "178ecd56cd79c7aaec1353093571ce89845130991d64c5a715a02da83a2705ab", "262": "2e0cb5e8fc8ef04c50a5b9ab9a9eecad446598ebc2527b19c447143e5ae09736", "263": "c870fd75ed0d5ed92ec35789c522d029f364328a16282a1c5eb9b3b7e121eff3", "264": "da5d6bdd89eacf70a88810935f80e4725da4feaf2aa86adb13985d7d9e1c247f", "265": "13f16351c3971c286fae5e9cfbaf6f0a128a6507804fd280971a600019e352e8", "266": "4f39cdd293598de9259231592e99bfc5fde82a0bc1820a4c5faeb54f96037f00", "267": "3e054d92034d3d32c3d4e7acadf1c09232e468fc2520d23d2c7d183ec0735aa3", "268": "2d47c47a2b19178cef9e4eba1a53dd39b5f8657bbe011a71c8d402d294d50132", "269": "4448f310ab9bff796ca70c7b7d0cd3b9c517f72744a8615112f65ba30a6d61f7", "270": "ce71f5bd1db540762e4bc6c4798d8b7f3d2b7068e91c300fd271a46298aea2aa", "271": "5a05e212b9b6ccf6092081f567aa73d27da399d45418f674628a8154f9182b6b", "272": "a326c2d7121d80861aaf110826615e560aa4efdec0cc9fdfce051c6b9038e781", "273": "d32b75411f407c5da6a9a6b4a3907b9a9ebbca6b651324c03432d549671bb837", "274": "b5740ac928d58f53537b05ecc80b7463dc1fd5a53400f57aa55573ecbd5faa56", "275": "e1c843ff0e97692a180e384c1a9c03c7de06ef92ccad5aa6157fabf0dbe5b804", "276": "2edf523574e0a062cacf21f51ed6f81128537f27a3cd27b84a8b5d2478d0092d", "277": "130c990ad499345b7638e57dce365442e2ab2d2571546aae60a9fa6ed3834b8d", "278": "2204d89df74e664621dfe8892277d50e7774f60613561d70ae06ee0eb4c483d4", "279": "4618456c7239784964b8fcd27155e01cf5417a16cdca7b163cc885d598ba93f4", "280": "4b2d9501483d450371ec4413519b0b3461502aabb970fb2b07766d0a3d3a3f85", "281": "b04a4a02fa0ae20b657dcfe3f80ef84fd446daa1521aabae006b61bb8fa5a7da", "282": "6dab2ee10b0dc8db525aeaa2f000f3bd35580ba91e71fe92bcd120ad83cf82c5", "283": "c964c01082a258f4c6bb66a983615686cb4ae363f4d25bd0bdad14cd628cfce8", "284": "df960dabff27b2404555d6b83aed7a58ef9a887104d85b6d5296f1c379b28494", "285": "087de77e5f379e7733505f196e483390596050c75dad56a999b1079ea89246ed", "286": "8f3e5fda508a37403238471d09494dde8c206beadfa0a71381bd8c6ac93abaf4", "287": "5d834d4c0ca68d0dca107ffe9dbaddac7fc038b0ad6ccc7ba3cfb53920236103", "288": "20a3ef9e411065c7265deff5e9b4d398cab6f71faa134353ccea35d2b279af04", "289": "9dda7eb623939f599551ad1d39dbf405211352ae4e65ddd87fe3e31899ca571b", "290": "a629c35ad526f4a6c0bb42f35f3e3fa1077c34e1898eac658775072730c40d6b", "291": "81b1e5196bec98afe72f4412cf907a2816515bad0680bd4062f2b2c715643088", "292": "614950a1cff05f4cf403f55393ed9d7807febbae49522ef83b97e0390038ae03", "293": "9e4067ac93c6febda554d724d453d78bf3e28a7742cdec57ee47c5c706fbe940", "294": "9ac900bf0fbb4c3c7e26986ac33698c46c6c3e8102ab75b40b8df94fc3a0c7a1", "295": "2fdcd631f3c68bef3c90f8679b7aef685fa33f20c2d6eb5965cd2a62267c2ffa", "296": "dfc947e61ea2138ebe47234ba503cf5246ecec530b12e363acb240822ddf0b34", "297": "4d5af88ba8a28b49a79773d3e6521e8731ff07d49765203b157481469e6ae6d0", "298": "94aa77eadafaad7327acb8e653888f00e114cca2fbe04691dabdafa2a0c8cd64", "299": "0f221ba58a8ea417e13847ef91af9ff029561ac18c74bbeeb3f5509af81a3b03", "300": "50a79fb6e417fb4a34e155a9af683aa9a74ee922a6c156a58bfedd22cf3185c4", "301": "eb09a0097a47e7a95b892ad7230475a1a28343b47db4faeb3e47f227aeb04738", "302": "fcf9736fe8c20a6d02f00e9b1e719de06aff4afa99d2eba166592aeff1b8f3b7", "303": "e6266f575c94d805a67fcd3f2391d0961b4b121b8a66afbfbae76dfc34e5c06b", "304": "189bd2a8daf5b638ede7c50035fcf426d125de87a401382f66ab75f35b2ac1f7", "305": "0ac58c6eb8513f4ffe911bf0f044e0153862ee89c04939fd9b294860a37ec9ce", "306": "335998d7e2a3fae2da75a5192d62c37dd006be96831fd37e7438ec6d84451c44", "307": "4f1f2695b1b6b1660f3ef6ac31a81630ca74da9368eafbfb214ec1980705c13c", "308": "bc5ae127f8690ba7f6e9ddad98a49137acb45abf4e187eaf3648f197c72fbe90", "309": "6b78ed4c4bfc942b9b5dc340961f19c690d56f9d721b6b764d1db31da53139db", "310": "0d183ec2ff1cbc768a9eb7eb06c2a354f6c8bab00e64ca2aed2da00825f33c05", "311": "3ae7fdad095eed78e0c63cfe4e28ab7ba2b977259590ed38722e9c44727e598b", "312": "329d107b5743a96e3551084832587a6346e410aa89641d83f03f1242a7244473", "313": "ecc63ee12cbe487e5390007271890b8aa5df2cf48b8e692404895d3c2af20758", "314": "5fa65495795c52818aea910c24e4d3176c71817f5268c34e1cb259b256737352", "315": "95bd03b9913be37d24809d30e7bfd31a1b7a127d03d65e52086857bb3a364b5d", "316": "ca6ec6c9159e10719cd8d2cfcfaf2fe2d3637fb3d497e2c80866de6b593632e6", "317": "5b0d72d34b406ce20714a59f1c4d5340c5559285e340497dbcad68729a9db786", "318": "3e2b479fafb86b8ab097588b8fa12ae8a078f8b5801e15c7faa1ef23d87a631b", "319": "e04b18947b36771937dea491f47b75fedf42a6db684035f5690e6c2bd7e6031e", "320": "e546e4a4c9020669c78a095aa5c5038242dd78e0f98517c0e23c43aefeb58138", "321": "3da0198df2f98a7306ee6d2e12b96ba9a6ad837a6c2d4f316d3cd8589b6af308", "322": "07e511e9002147c33739c924c17a61126d12823d143069535a615a97f86d936f", "323": "be514911dd6258f860c2773253f6df6c22ca975a10c4e34db5903269f2975faf", "324": "53ed94369b59a84d003ff3155edbf481a0eef362325539d6ab1a7f370ce919c8", "325": "43c8dc1907d3e1eb30deb565475ec1ad4f807baf6ef34178508ec85071722f0a", "326": "b08d72606988ea5a82e0caf15e68d81b4f2e8dbb4af6a22437916f3fc53e3dea", "327": "f70bb9cb351daf610a91a3c769d84bbb3f3b8f1169b10839196b65b8585e7c38", "328": "6e26ed661a0add2e583229066d304f7e765a0ea337b6a93bf979e4027b70b94e", "329": "89d8b56a1e05d90ccde0df482ff2fec3d44270739810f3c5d06856c38d801380", "330": "2dfac8e04d08dc5eefcbba4e475164103d339f844896a75ef3af2229185118f9", "331": "a20f9b06c126f4ee65e3f3a0bf345007b35ecb69d035dd0ad848e09300130fcb", "332": "6593d40f4e3f53a73191c704d388c7cd1639403da6e679c8e4169b26ade19f3f", "333": "7499bc84f6bd2211365fec34943d64f6be80a53ee2efb21c099c1c910ca29967", "334": "f24dd99fe5b46bb7a7a30c5eff61e71cab21e05f1b03132d7da9c943f65713f6", "335": "8e2111c24160d92b1b29dd010b8b3a0a4f9af55f1d30bd5892756c58ffaec201", "336": "eed2e8d970c1c5031220476e6b700d16e5065d7893a2766a53600825b4ad3ae5", "337": "44e298d1b55c51c9f127989da1149ccf6bda24c40041f777d35d5b8f192753d2", "338": "b3a60e80296f79cfdfc02354acc674162faefcb3fb78b9672254c9cfc6eb113f", "339": "2b55688ba27d72202632783186211ee24ea39c53915066578291fffd9db73128", "340": "15765221271275022a6ef57634d836b052ffbab6d7d5a6899992972143841e3c", "341": "f7340563f85e057709a2fcc71bd448fed8d6de6907d8ba5f91fefa2abffda6cf", "342": "f252eec230c2e92ed1fa04834bc0738b79597c3b0d2a66c787fdd520e63cb3d3", "343": "1d65c53a04f7eea94ebf76d797c0f79fe3d251bd33e5edc16c780715531b4345", "344": "86d3fb095439bddbc0d6e6e8e433d54aff04350e2da2ad05f53d607113075c8b", "345": "21db551743591f9cd20fffcedf3bda17f9f178bc9fbca528a56c2c61b9e7c731", "346": "f326e2241b7e57320914aa279f9ba2e155ea77f809a188958e0b590bea9c3ada", "347": "0fb6749b98280cc8c26950a2cb9c9dbecac18f8760e161e9bab887dcb0077653", "348": "0cdb77330ae73fbbd0f287240f82b7547a0ef42d37004003a9c759f86b686d61", "349": "690ad38e4357b34368966b9de08d89e0c095246bf55969842f373f1976f86062", "350": "5b427d47f98e296cb78875619fe67d42f41868b78886d560d8fcac89043fe945", "351": "93dcda27a0c12f0c32cc35f0de161e7f7792d11abe5d4c50d7fd5192ab8b11c0", "352": "d01c0cd49e7649289a1f13162757de494bb9104b20ac8bdb30a4180df5225889", "353": "3d856f38821d7b221aaaa9baa3d7927f6e360919e8f8505d7499f9bbd85c44b8", "354": "36dd3030dec4a8050d2079678250c9c6c86c66c64fdbe7f5b82e79024bb8d5a7", "355": "b0a915b700e415ba3acc3ef261128680b921b5df9bd6fb1d35c2d1180e7f61d7", "356": "a309814f13708f2eb5ee8dd1a3114e8f8b15646b8c797bc7119ceaa3f6911f0e", "357": "61c9c81a41fd294a8f07033c8373706694faab4df3652d310e84904356cf5e6c", "358": "7d59500b8883d81040173b88462a73849e0d386a53830d599e6a042f4c1c165f", "359": "0793805920db4896155cbce40fb58570a3cc952d0c15ee57393fa3c6ca7a8222", "360": "ee8cacd40fb7515e510cbbe7deb6005369ce7d9800ecff897f3fd8721fd6ef71", "361": "e96f225fa470174b4ac787b21579ad1556804de85c0c83da99a92ddc2c56c7ac", "362": "9a4ce079c1a882a306e21e0c145dab75a2698cba3860152f03dafc802ad9006e", "363": "258a6e6ea10385ca3c0cf08377d13ef31135bd9479d5a4983beadf158e19ccc6", "364": "13aefde214541fab44d2a3013c532637a3da82199fb6c0a1a941c3108f76b9cf", "365": "0cd978902035027c6898d6b5fc11fb5931f06f8e8ec9c24b4706143c91de9450", "366": "47495a92574a6d7b150eb3f4338748ba03672ff93162139f98e03847f96551cb", "367": "fad9203cd26fccb99f0f89fdc569c230eda46cd72ed3fb7e5f6fbcce78ced1a9", "368": "a237e13fa6c32b66695b8c8de6472d5c93c7650989f047f62a17438c07036845", "369": "da4c450ba0c4f76556fce54bc3f6b2a754a626cf1f87ba3280f545e023942640", "370": "5000899cd3070e1937d42a68766c840bdb9629a49c6112bea5cff52fdb4e9f7a", "371": "7afb55ee21c0447f7b961265abe7ccf87f59af6206949bb1da19fd36334b09df", "372": "fcf734716ed1fa724e7228a489304e3c55e813734fb5792a83f806ab04e40485", "373": "83c98f0431cf944440dfe0a9831275ed451b0d16856aba4100f53170c55c2e6c", "374": "d998ea6616a5a7a9f7beb3ec02f8cbed4a9c5f17be978c31f32ac0f9f4e4460d", "375": "6a72aba5c61e27e281235b1f001ab68b840f6e8bef0e6bbd7bfd8eec1abf844e", "376": "980dce9435a9fc03250df4e809c2f68c48601b64c30d32c6e67bf1faa35fe274", "377": "7b4a0b6958cf23951636b5e27af8041dd9901256c53de44c9be313ffd0a01ea0", "378": "a1b13bda78da3ccab1af6c330d3e768fce62841f924933285e7b1f7a8b7dcd5f", "379": "c957fcbb90e1afe9a342e95608ca035596a7dfd4cef398ada55e05a2462aba14", "380": "b794fae83475a77832f46e69799419f9881bd774e1bfda56773b587c42591039", "381": "e7208f3630a20b01a5e1bf5d0537be9dae9fd7529773cac12b96c4ac2b0f8dbf", "382": "70480c0d26a6d76eba0faf3ee047d6214b2ca4d1442070ae5e79893192ffa699", "383": "3c814d251089cb2a92a78ec3424b2a729cfbbfc6a996fd48148261312364a9a8", "384": "f709015ae0f8ad20bd2efd94d01af3858234e381942b5b15391ff7f77211b116", "385": "0bca6cad1f4ff336b93c9f86c4ac872bda67ee0cd41b1862a7a663852717535d", "386": "3e1748647b60bbf292aacae65b3608ccce8e55e203a36ff062ee787cd8c14480", "387": "cf592fa81780e727a56553df32410beba6de9c33543dd1ef1155b368ba9a9b9f", "388": "911326fcfb0638154f69eabb87e4c0c141df09e56274c8522e9c13b7b577f00f", "389": "cdd56fb06838a10149f2c7229bbc76f78b4a5a58945fb70a47261f1bf635c404", "390": "07dde4848eb878808635fb7b366261b1e9cb158635e76577eecc48ccf941323f", "391": "76cd3def1eea8e2631d333798f4d282bf40f6254b2d18c02c78cb56b33462093", "392": "c4f7ecf21a8738c3ad0114a1ee6a2d16668e71b499741381f30827ed451dc817", "393": "7bbc419f89fde57d2862bfb3678ddab96614693dfca109d0f444e4762a2b7a8f", "394": "7781ca3332d6da18b1b9be5e2eff634b526ae9e8088f6e479b49d657f4f41525", "395": "5b5de0def2c4a989a54ae3e748362c78cd018778d5adc4dec13c1bde6ffdc139", "396": "d42c389d6abc7d8102b8cd1b906e4600da08394388d4dcd432ec955e6d8b311d", "397": "629e23dc358ed2a8c202e1b870e270e401aecc5d726a679b542df8e6becb4200", "398": "c30114e73097c3fa4efb203915f3b828b1b8c432ddeab2b7e1ba3fe63c50e190", "399": "a681ef7bdb22145a3e051ecf7bfb694c18b255c80dae6fb8d49f187d28f3c58f", "400": "c993a792804e09c9f60313f4144953eec072ca6a8a27f44d8718ce53d9429585", "401": "074b576ae2054cd030ffcfa132b1465f8f49b836f505cd4bb01af4a98f4f5337", "402": "d45f88fc3c00673ef7e628d867a54a4ea281b3b2620735cea85a8da3b06321df", "403": "a09086d3cdab7d6ff8a9fba1746c5d236e0ad0abe088be99bb172e80c6f0f8f3", "404": "55a774ac3423440dda50d73e472887195940d5e9df605b30deeb0f2528b001a4", "405": "ee9fa61ae8153df7979be3afe6377e584fbdad624833424a5cff64f6ea94c9da", "406": "584cba4abd5711b8f558fde97620b8ff0fe91586bad052ccff87c49c13f72555", "407": "ac50b37409f7ea91f90856bbfa716731013deffb5f5b51540a99736e08e5378e", "408": "2c12c3cf062c3d9cf2c53e6e4dafce70ca5c7a38c97479c3b013cd91076ecf4a", "409": "5a55b5fb584c359f4b6ee2d21deb62923b0b25e1b4c3da0a6f351079ce657173", "410": "9e224b6ab0b7f20759b63d1799b426a8652c9e637b1f38d3eaf8beff73c80c67", "411": "66c0c1ab79e9887b5daf2c510f2c2c4097044b69fee6bd4ffcff73ad4816b8c7", "412": "27f1768d99e22f8b55d010b8b7acd904e8b66751d5310d32c4d017a0ad34d650", "413": "7c99634a1161e424a14d60b516291655096eb90ed055326325d7f5de7a44a3e7", "414": "4e03e038e99870b1faf45a0a29d6124379d05a0a3553a11aaaa91b8ba56eac5f", "415": "955e433ea745016af2a5df015f1cc223ddd84ddccaee60d5302b7ad61542d9e1", "416": "8d07a87b9012a166f5bec4dcd646d5957c9b3633a1a37c40c584ede75cb7ad22", "417": "3f738338cef45597e3b839536953104186f11d94d16877c77abd8a067c152dc3", "418": "0c813356b30108f89fb37e8774a98af4f9eca3df49e963f985ecea82a88b1437", "419": "8ea8d93a9e874f8c8ceeb240f1f1245a077a7c0a62287d3044feaf855b5dae78", "420": "af7ac1e90e07f189afbb284ae24614d9e713e32098bc39bb81d6484d47351444", "421": "f45e155846624f37cf2ee08be2a63cb1ca35bf795fb0f770b4c91ab549f22b25", "422": "69d728f7e25055dbebd41684bc6de61be6b4db4119d7ecdcef5b5d8ead976537", "423": "3e78c62395be704a59a3a6a65e457725105619e0a6f9f3aa6b311c4f7762b0a0", "424": "fbd6edb36c3754a35e7de936839c4fd0564db873924ba97b35cd43e065835582", "425": "ee5bb631b2a9edf8ed05781b192f42e24ae748f3aa4ba5e635374c094d28ddac", "426": "3e913e088a689d2d33bc797040cea94512bf54a61f96501f60576ab22ed0304b", "427": "415e6da4c7f92da36e2d8c43fa8056d0050ae127e648451e2fada49bf2c936d1", "428": "389bded7b0c14212fb69b559fd1ade4f5b235b976c9655365c45481c3afda486", "429": "3007beefa50c509b89b86c54f53757ff701f795dc5f7ed47a1520c2b092455f7", "430": "59ec8ec2866ca502ad558ade9f8a06a9ff815a1ed649bd1cb513f417f1d4727c", "431": "d3f28dffa4e22b3bed74c3c2c9ded1e4a8be49d3757368e4e3efaf7f79affb15", "432": "59fd80dbc8eb4af9596e4ce8a87313d363da41313351a69ab3525faeb905c27e", "433": "471a7ddde597fbaaaed1941f42ca1fc0f4f047e17f2197f8999dea98b38213f3", "434": "319cb430c66d9f418aa90a3d6f9c2dfc8171383d6f4af5803a73684afcf18e15", "435": "aa29c0119ca84133617c8bc7455afdfcf5b05a569393ff21ebcb10d32ffde2c8", "436": "928f772ad7a9fc501f71cdef6dfe60e2d8cb5d5c5800b519d01afeae0681dd08", "437": "ea70162a014b8294ede65af6fcdc11fb365ab2b126aef8d47983d58816fd6a54", "438": "43633662392854b5d9f9f0fa564605212d016c9ea9377d2a6ab52137238d4191", "439": "42f7e88fab5c9cb31d4bb34403d7958abd5023e9cf9ac05cd29626c5df763584", "440": "cd08ef4f14b804e3106ee88f9d2b24864d5e2fec6c7cd7dddfa2713e1431375a", "441": "daa69bac44ce5f57b4b43ab6ece3b2b3561292c0f4c6e82a506ce2973713f749", "442": "910d2abf184cfd7b1964cec906a79f3e45f59e3d42ec20b22f56de59c9018927", "443": "7a14ac86724d318e6d40464e710c17625d441d1e7adf83d3062305de2f85d445", "444": "390877dded07897360921e8d0d126bf45d6a379d47292c90826d775bd1897f2f", "445": "5ee5723341b0b81c9e0172fcb654f8b24322244bc2d1b55afcb78b180ada180b", "446": "8b2dcb0168e8701dc9da286489a1e68e43e1b17638e5990edd882196d7fd5a29", "447": "179af1c75faa5f42e89ce3b41496a64b2d2846361f76dd5d87f4ce97ec2bec07", "448": "18173b14e0c0bf403b5f0d4aa23515ecf44622b3a860d80e866cd498f107123c", "449": "22d7739bccf54ea1159ce6aca3e215482deba85a4db0676cf86d82a760c44a6c", "450": "938bf7cdedab94bd7208b69047014e3d9ab7b54d1223bd649eb3de0bd61ab47e", "451": "abd88e378f54b649e818d6e1d8e06c9f8cf225ac96b4085523acbb1f0c1df24b", "452": "4119701c51dd8c457b74a19ed7ae3bdf069f5fd915c8085e9a15d909a39db036", "453": "381ba093e8ece9e14efc965ee94bb8adbd1c0bf140875ef95f8f11050d5ed489", "454": "b7613128b0401fdbc07a4015eb3935f6677b84dff936fc5e7e9f424d0ba1006e", "455": "35ee11c9763f48a68f2b60b4b9c3919d3a895afc7071e8dcac5abd5845dfe79f", "456": "8b129a3c7163dae86f1f43c18557296240a02bdac70ad29538eb5dce00e51f4d", "457": "629c99f9af0e962f00b812057c0967861a9b6db9dd652233ac4b37f368d09206", "458": "02df8a1d11130bde8af932dfc5cafe7d8e6c2fc12b82df5d222a91e4eed8e2f8", "459": "062b225facc7a897e0e42e6b0f95deeb8b02de64267bf5cea4cb5280ccec1562", "460": "a05f9a7cb049c40760ea2196eb41df1826ad492e6e5fc4696ce7bfcf7a842811", "461": "95e5e99da04c0cd73e1818a62be3fc0de98c76d5cbdc81261672824ed5b8c1a7", "462": "69eafed1b3d4022fc245a8416c1120bdcd039716db8cd43351a96e6c7d10691d", "463": "018efbd353bb456112cf2c760b4d96aef02aa899ef74d4aadfb3dcf374a22987", "464": "cd4447e836cdbed7f6a3998b50c4ab467aedaeb8e54c377da34245e90fddbe12", "465": "da0612471988c89ea2fb190838f9f5e9029fd106330a801e66280c967ff1c52b", "466": "8d16100c0148ed7bd41003b4a0612cbc5fa150ddabe5f9916ed6eac3fcfdefa4", "467": "d6ea164cb91d14d6aba2d482926cb6cbd1a3644737a0530abac635083a97b8a4", "468": "8d0e3f6bff322ff11d1267f1f8303a8ce1e2d796b7dc2d9eb3e3da939dd850b5", "469": "35e2072f22c7cb980fbe797e30c25e9224328813eb81d07d3c88820492ce9a1f", "470": "4993f275946ae0d444410821faa3ef4a448f10888c50ff59f7ae01d0b50328d9", "471": "b9af9323a0237fbf88fdb14b8bce95c084351325249629ffd4fbb32fe9d6da5d", "472": "5b278c08ab97d82c1779411fb1018b07feac7ddf38a69e4d398240a495c54271", "473": "4448b03417a784f554c44eb15ad2d4cc022bd9cb5abe2547811eb8085355aaaa", "474": "1c64fc4076d6b00aff86a180fd9af927b7c1c9ba87a2ca3c83dd80ba5e5ea973", "475": "e571b4b8218a2961ed2b04f62f816eb18686d82b7f2693694b9c774acef4a0ff", "476": "a6383ed918d7851ed7503921a64201a032a33c9e1cbd4e08d1233f543bd21be9", "477": "c871da03e684e099190c4ce787a9588ae85841246ad7bcc9cb4c302d617f881d", "478": "96d8bec6b787a7aea2da8dfa8a1226e00881afc218c211fc59da830775d55acb", "479": "b35720df96afbd98c6a4f081ae1173fdce21d63f75f7b455f4c2b9fc0aa672c2", "480": "2db876e9625c8638c66103ad0206c9a51b68d4c6a3222f403b195a81837856e3", "481": "bac35824e79af403a2058b08cbc84f8e4df93a21d1766e4ea1de6414e2a8a926", "482": "0f9797e2f3691bc7291d81d1ddd5d88cb4e10b0be555e2ebfbd3c5b12b7cd2b2", "483": "8f3348df383ec9ee00e18d41c419370d42ca6ebf71c510690aa5435a679b7e4f", "484": "3b3bac32669c5b66faaa42b89a2dcb4de0bb9aa0bd279d60061dbe9e7039f5dc", "485": "25d0335a0576f974617351ef5aec889f311fc8d7cddb997862b10b2496842d4d", "486": "93b9a59a937594d2196271416ea3b2221d32b3b40a04bbebbdf97e8bdc557e0a", "487": "a643c75a8d062b87a1c8635fdf439c04d949ce01f75dde10ab6edba90cbaee77", "488": "984593c12abbff5d009091cd3c1883c87efc535f760727ed12f06df0902bfa75", "489": "926ac61244f94e10270a2d40169de025be6db342b3de7f0db33a50b07176c143", "490": "e2c8142e501b0b0b808d2d36f5f38266f99cd3aaca7d2f70f4bba386ae1d2025", "491": "1a1c8b472424f8057c94a9f5e0c0b673551fbe9ea4cde5ca2d90df1de76a5c76", "492": "345a83966ead821efa2a9de93aeb0fd5bd60a8f50e162caae2447f1f4d9462bd", "493": "ee7018d63b08bc7226d6f77c2345a87e09fc7cc87b0a003aaf3a4a3f622edffd", "494": "3d69e540997d79f21f249d4d8f73cd75119d81bcfb8bd80782863249f0d7c62c", "495": "b717f1088b0ce24851c30d54bc8dad9f3ae93402b91c874e385e5c699323a5e2", "496": "fbe77ec1978ad86e73e5a3f494fa7c198fe334b511298f5a0f2d04d6a7f51d01", "497": "a4a66d6c7c555a2997ca59a8dbab512388adf20902293a5617132a16df76d954", "498": "d71813b8175fa2d70181d87ae8f839e79792516a1cfa99a7e6b29500c057617f", "499": "477d5b817df8c0b6f0928d02a58fc39fde2224493cec89393bd6dc349e5235bf", "500": "3ac8e26d4864c538936efa7c5920435107a50c01306adaee5a4aeaa2ef378f7d", "501": "766448b05b248ac3d6e991baa3e4b2d53b02aac426bda312c2299b2b983e145e", "502": "50218b55f5b7207438137f2b0c71e3f6d37afd76aa5b1f2106111f3432b4cef8", "503": "1d7c24799a287d42e97dd4ccc5bbd3713ce139e6294896cc5fe2efb80a1be7ad", "504": "9878db5eb2218b18568dc8cfa13bc8363a1c93e6a59a05cc76da0588fd54af46", "505": "872fc20275833f09c8aaef277abfe77f67be6bd443b489e0cb8bdf9d4ca9fac7", "506": "d66834cc7ebe58cce2ee1c02bb11ae69672d711ead6a0a58ab592339cddbf02e", "507": "ae955394665befbbc89e2ba85b5e520cb293b8d03209b1f71d78ce2cc807a437", "508": "3917ce4173af47bfaf8525f0917736bde3f4bee0ed5fae721c3e2fa957ab1675", "509": "2f64571cd71f0e59006da84808abf3d3ccff9a38884321533d448b3e8e3cae05", "510": "41ce72f4701e786427413b68fb70bd77d921c06648ca15033ce1926a9f1224cb", "511": "c9fc787389265492e60d5503f279714d5b19760ea7b2e1a720e6fc0251fe087c", "512": "a8af6acf3744af13cde63540e37bb9bc722ea19a012656e3a3c5bfff8292c423", "513": "506b90816555d1083be7d211f02a5db364e5c2337fc85b1ba845c1a806689373", "514": "e4e9536766181eda627721723bfbdbca85859a3ba92d439f58ac0009c102430c", "515": "16daaa62fa87776bc4843d226988cc83ee846ceef7b885ab63e10789b30071ae", "516": "44b6de4eb51dd8f762142f284b154d3153592549cdea3b94467fa95484a4f172", "517": "bb72c6d437197a8c1f1132626b3b47adb9827f4f9b912d1069cfcc75575371b5", "518": "ff57c1f518651af805bb4b258130c7c5b0726422c3390327217562088785b4ba", "519": "159b59f1261b7a31d7172cdc28d9515d0731e5117cb30f34a497bc3bd0496da2", "520": "bdfb7f17c8c841c0b61ee7f00e51f09e4c78c90f7977548b72050a7aa12dfa3f", "521": "bd27ca9292c19160cbb0568f750b247fbb805b85f4a2316fcf2c3a35d3ae031d", "522": "98e0ef155297aac8a4060d204614753f26f6ba5357deb78c683783dc7ae30191", "523": "9bfc344c80d1200fe12bea3ba4cacf8d5ac9693258962f2f15f42b30ce8ef3ef", "524": "8df22d8716d7ca6354ea42b8e522d286ff9362cfa5881f527efcf1a953ed1151", "525": "13dc6d869fbe2c3d95f715e55f02bc3d5787874b4c88d7da1d05360afd2025fa", "526": "dfbe442040ce9afba654773fb14f307d67ab614267d3feb6b18df03182b5b60f", "527": "ba634833af68fcf0ca7bcb08fa699b2c5fab934eb81ecd85e7464b01bca131ca", "528": "016f7b569dc1c3466c97754c7dcc0f76c2a32a76c22357cc521bcc330d86daf5", "529": "4960ff863e3d21a58f9e81c3d94075cb7a4daea5fcf396812382111e462fc57f", "530": "6a2e45fdfcad65e0ee84d206d59cbac998026d7415d16a5c0b8c55e4a7d6bb3f", "531": "95ec72fa8c409255d43e7c8d4e957bcb9239534973187b3b4cc2557b09bdba98", "532": "fee6802490757983c499a08831d9bdc75a9eff08700bd29e8e5c134583ee07b3", "533": "8a056666bd75d853a12d22b8317042a3f5500cfb21f6698d90ab41e01edcf81d", "534": "8f65c9feb935e09a04c87143d1b2c63e38f08738199ebcc2758f67ee914d8a48", "535": "ed8970f8ef1e2374289fc735aedff90b010c311a3b80d16df6bca2d3c250fdeb", "536": "f82635851b442ec0ee95c5c2b7377ba382aa364cc49ff4e981d509ef324bb356", "537": "54fc97bb6f3d7c724d4e245df37111c20334972300297fe38b590354fb9dfe92", "538": "650c7f5f382c295cf6e7fb092db6fdfff164c861bcfcfe1fb38a50268f53f50a", "539": "0bfb3df290912d8a70dc5e1e2761151cdf2c4b75d4b37c8fdcbed7483ada85fd", "540": "08f1b2bffa88a9d01eecb8c9da6636b5e668a5478d8876a63ec3a74d7f932205", "541": "5e59cf440336e86b67c17ed61f7bee7e548c434f475c415294b3b652d1aec606", "542": "1257b6a3ad900df97f5aabc1e18b9f7ddae8c7d7ad60216ae21b5b7310cbda84", "543": "8a783bfbe11c7f7b24431a15a0eb582f6fe5f75d1d21a3d55f8d8d81ba6b411c", "544": "ce93bedef94ffbf62ad449cb0c68e8103a0bd005563ab854daa5e470664b4d7b", "545": "40c253003d601fd2c90908bffcd8133e77489fe247e74ec03901895318fe69de", "546": "d40739115f18fee96817266232ff1b8845e7966778fdcc644028fe5c759469be", "547": "fa32a8de8fdcfc551d808c5dd0ff5545a199027acd32e380959b91f3b3d04643", "548": "72e66168068b6ffcd2988e24124c8b1dba9a5b52a383a937397575e3c1e3f031", "549": "a23baaa745a976b4f212836beb81a0a7b42d9f2e923c2412e2c07c63ff660ceb", "550": "f58ff320639b2c47c76ed8aba487e31da0fd4656c3be6e33807cd00f77456e5d", "551": "0449ec4d6d5b2e88603e62f3ec0287ed711cff682bbdfe298a197144ab24e80b", "552": "f125761e8a0d02b17b1dc4be40216f2791727fd4e4bc56f60ebea1925c2fbf36", "553": "dbb93b2a6cbf972bb1f94d1f8656cd113a09a02cbc44f25737e7d75c986646e1", "554": "dcfd1e7a4a32ff0fae296b8211b5c9e91ab81844a0308933f598c712c1bc313d", "555": "cebbca914f917f990202f110e77285132d2a5a3ba9a7475c93e3561d8ba88ea0", "556": "0d5518ef165979b758fcc8df9c8cf536861f376f8640541ba6112ee7610ed82e", "557": "0547c86b57c7c8c590f6d7a5131778f5b6ab2eeccc5e819e5fd095a6d4e68b08", "558": "e763aa1dd494e097251484381ddb057c7d79b739c3f8644b1759e786e12f5b40", "559": "e48eea4c3b4c9d58fe02739accf31bb64dd9c31623ad4cc06c740463d664c098", "560": "77a09dc1ea6f1ae669004b8c9429dd83ead1148c62e0d945173edac45d9000a4", "561": "756d226727e611d4bd22aa33747da2f635eeec070906dbc3262ef29e341e2a6d", "562": "29de450d6e440c528287b98bcb4b76fb5155ab573df4721467446114661936ed", "563": "7703d943dbbfdccb90acad65ed7c0eb13a10034ad01809472a55eb3162b7e53b", "564": "65712c105411e6fc0ed35b9347de8cbaea33b0c5e57cf162f48dc257dd4f05b5", "565": "2945ef4779089c9e49a9a9f5e2a67ba7e393aa20a955ed9302da6677cb03a9cd", "566": "95d936e1d454df2e1e7d486c43af387b39a50cb57e57c7712d967bc9ec556f41", "567": "2abe8af9ee20c6b8ad5034bc31fc1f4f16769595d5b4fc2837db3e76a90ac405", "568": "fdc104338866e50ae2bffc1ea19719136f639df6c25f38a8680a70e9375a9378", "569": "25677266de2b900788dfa047cb53f5585c37b564b3a711243fad52e186ec184a", "570": "9101edb48d98c3742ceb713de591d261b79e90481d28f83f2d2c74d7034f4b46", "571": "c364dde8cce2080d073eb1f9666cca97ccdeba61b2bf19ca0c84987e6f8d3576", "572": "9cc3049e9464376b95fb88d6fff4331e0e40196f92a0a9aa1c5d10dfe33079f7", "573": "2ade73491e183608b340f312d08cfd39c10ecb581c87b873443590452580a43e", "574": "96325b210d18a7a1d6873e00a859648c4754bd4c91c324aa812ed78bd047118b", "575": "33942a261a9150e2b5ce2ffe5b934a81f3972cf5aa5a9414a9d5f63f6b55324b", "576": "7fca01a835681914b5fe5014d5649b5170faf459375ccc2bf9ad71ebaa73940c", "577": "2bdc7a0e8adacf885c6ea0f6534b935b8a9dd338c5dcff05a74c162c3e9dd531", "578": "ce6b6de1d907c8839b84f5f3967f6af7e9a3644a0bd7dffe80cfe531de08f8ca", "579": "03dbff2575902a3c56a64483c8e8ca38d9888f72c6a71a6236eb07b808fb24ab", "580": "96892003c30358ed55a39e13e6159fad09ebc3916e34492b91d63832fa86f731", "581": "4fc5533c52133e54f8b54dcbfc4555638ae809676dbfec9d1400ab032f30648d", "582": "7ba9b154acf699c8a123df5471fd40ad556cf6fc630136c686c87b09c88ff546", "583": "ec10ea6801eadac9ae8ead5f222e0580f419b67d2ad5cd5c8ac914dcf5cfd69f", "584": "510001c4104c80517a13f967df6ee071f15fb7b65e97229bc91b2925cbe4e93e", "585": "ced737da53940337c5dff81720024fbaf4cee38aed1d3514d2a75c7b1271acf8", "586": "9ab074d1d480d718930c9abac8b616a0bc5c30846381d6d9bce1741e9bca1991", "587": "ec3fdcd8136188e3b476270894351cdc05dc44a4df50d1c4ed727294fb89430f", "588": "31400607f95129fcc531604b7b0478a748d2495746280dc07ff30e39cd6f4a97", "589": "3051de9b2a7ced941140aa1074952029f532e133beb41c18bfd990f43bfbd9ae", "590": "4af295f83800334d77a04d56be7524ff6241e3d8b2f23820c9c54580b7996086", "591": "2ecf2c1ab8d9e5cef5224842732af17bd2259598e4363e1d46cb172dccc39022", "592": "2e71a26370d45781f31ede0c7810c2705706ce63291a52d5cd6f060ae16aeb01", "593": "423867f77b64f725f823204796301ae09b427190cdbb62d472bc1395507da9a2", "594": "6c28830e35913c59000dfce4432db255f7dd34809285881f05a9e9749f5d8452", "595": "53fc00ae32e0b0d701175ac17ac0b91e05859ae6d7f3e5bf0548dad36e3d68f9", "596": "9ccbee33387383d458e7ffa2c9c0cb9e4f5bbe3d1b949463a98232ae67d29956", "597": "921102754e24e8ba99480e77652d88764020202e6dcd67adddbb1660204e8e78", "598": "430f975f490ce37df74bc346556cb2186f7a47a58d3b282ab42f35b33a812f7c", "599": "b603988248769444a1566b058ef3660cac528086b8193efd6d0be4080b834780", "600": "dd539cd38fade63aa0d14899c7c75ff459ab839148b15b4efacd4bdfa0408dae", "601": "571c5ade4cd89b460b7d2568a44d1efb05e2927ec840d8ecf149dc9e0ff09734", "602": "edef32d6c2c7193b4b30a0e2c7d3ab37e0ec21db62543f4bf78169b683792e41", "603": "cce7491b7ddf0e3ebde191e0e57614e61602cfaa2b52be5c2d657d9ae5e1f1b1", "604": "d08fe0e5c0fc10640043f9d645446e23fa8efbfdf29c93c87794e5b6405ff51e", "605": "1bdd74af73e2434db6149fd8089bd294defe3cedfaaf92f532568ddc6c48e2ea", "606": "30e44b49f18048323d1c1bf4631587df8f0dbd477ebc79b7ef860a792953d932", "607": "2d9b6a1b4810a39471e5dae85eadf595fc108097eeda746c8925a7be057464de", "608": "cd3fdc5ee5b6e606349b9e5775d6e632e0424d6190f632632bd7435d5622b20d", "609": "8b86933e27e64e6840bedc8087fa31326d9527a424c63ecc61823894c81f867d", "610": "a781fd7cb6970e8f6f679296be5bb0fe7ea62207caa7ce86635257186a5a70d9", "611": "4a3a0b9877d68deb8d7db624ec2d7f4b1c467fe337f803a220292ac6131acc05", "612": "6e95bb170c3a521fc7befa446cad879a36b7b3d0e0e8eab1df6ddbd753156ab7", "613": "afe8c7002c5e15859be829b4b69f0da00c1298971d5afa469b050016fc021978", "614": "f85495a58ad9d5c4d16167084bbc3581ea22e6dfc39423b70d7fe486e316d951", "615": "8da9fc3356df220081c71ccfc9c67251e6dd7058fb11258ecfc88ea9b8c00c92", "616": "0fadf4975e2c27aae12447e080505d604258102f61c8667a5c2594ee033567e8", "617": "06d9e8723de7ffd20129f1d8b5993926a97cad1261dc0cf01a37d8fa728ee996", "618": "04d0dc62694f26c61871d8129259540884ad2296a3cf455f6b92fc911f98c336", "619": "a93d0ec83cbbd4ec0866c97b372e4374a9d6724cc3767f5230e8316734cbb0eb", "620": "071da5dc1dd87c2558b45247c29a92092bc5a00ef3cd46d70d08e18b791d2926", "621": "458ca388a6b74c57ae13d1233984d5b66abb1f18dbfa12aa14ba868a9b5a708d", "622": "1ad0227dc5f8c259ada5120d9db05ac7a013bd1bd84cbbca2f0ae6b174dac129", "623": "d82d0401e10767b022417dbb64d348bc6c03ed4bb7e4553493e8d9e65525d229", "624": "1d25005c86a9635d3483ea63ce95fa097f95792ebab86319c12bc66ea1d2ac83", "625": "3fc397ed884cabc16bf30bb7487c8211424a08279a166d4fa4da6dc151a02cd1", "626": "7c42e09e504cb269512dae989ee7fffe1f3bfea499c990e8edea796761331ccb", "627": "5062b75aa39c974a579b0a3360c4da32e481d2242de72106f651c7d7de631cf1", "628": "dc656eef13928f18d14a9265be6a923bc7d76048b861cdf1523e397801a8ef52", "629": "9eefedc5b5995658be337f48146e37020db4ed3bb61e2af1fc57f698bd398b0d", "630": "6e17ecc4a4d07ffbd67c49a59d31b7efeabd3bfead49fdf1ec005836e6030ebf", "631": "781372694518c122f62566aec8867772e492fefef32c00e24b5604297dc1d44c", "632": "c978055ae1d71dfdfd8bb4e845bb82fc4211b14560bf6001edefa4367e1d4403", "633": "af4ff4b546369974642b3f68d4d3e90f0a0496b3b5d1572b638378fb49c7b4fa", "634": "f6af89331ee087a2fc03e0bddd738e2716b49ed616ceb3b47743cf3806c6d8c2", "635": "e4251ea6989571d8b83993560b537b7a9d0777ba54e6941757580cbfc14aab5f", "636": "dc15b5ccabd8fd3141c244b7dbc6fe95078299ea3ce3016cbb483893fcdd4236", "637": "053571be83ed06ab23a96d4e8fa129a4ce7e740de17dc35b000fb56c35a5ab80", "638": "df57e1f418a24e38b39011048084c6b5cc91a56c1deb643ab605e0350f329b4b", "639": "56930902baea90d1a8e505a227e5d7ac4da6b60f6c370ab75a0011cb3746818f", "640": "c105d171242fa8e35f26491ba2f932d1577dfab2a4a6e75034ae69f062e8aa71", "641": "0f6c3873a87ce630accf7f3b19feb764aac3fa0c3933042a817a82e6a9963aea", "642": "c20081830b70a00d1bcc6f4b6572d511d534986c10ea3c057db304a1f26df2da", "643": "143de023a92c7c8ce5fc0b839644e897267c44c8ba4e715743dc99686415a8b5", "644": "7a8c9f1db1b1bce9a3b8d91e5b1a39a92a478029d975f5e45d593b7ca81a7134", "645": "932a51e4c0cc5e30041ca5db1fd0674820638563a9df1300bece7df12c23017e", "646": "a49cbd2966ea8248816b0a53b6eedea4aef2525aac45272b862d7d52e604625a", "647": "40ad98735f3b5417ea1916f6146b69b7659963263caed186abf0790de0d9dae9", "648": "53b288529a83c376f2399e986e5ca25c5993a6640063386fdb2de491afba2e81", "649": "c0bebda0473186148087feb9828a418ab8d50726a1ff5c39ec69c4a6232c6b67", "650": "98ac68d2bc42f89dbe97b3392ac691ed6c2c4f36a44665555bf7f816ca97cd27", "651": "81f8287532f504b4f4a21e6d6ed573845bff197c479fb52e4c5b6f2fc1cfc40f", "652": "fa32d8e7c1c766a6126b0f1cdd9d752cad55f54d0c05839e89d4da238615d9ed", "653": "311cec39a42837f803ce8cfa5e6df32cc27fe541de108e3e7cf7ba3242e414ee", "654": "f2b3d205c2da66cdf9a596e2caa1098132b832758eea2b14da071b8dd9584ec9", "655": "39517ea688972769cccd46ad15b4f06ac2a6175d053dc97f849fa11a63a163e8", "656": "2a21e5e89d9b019c1195c50af7c6e1864cbab05068d10e11519fb6d4766ceae5", "657": "bbf54db41dc18753a3caa5001aae99c0c998e8a07b6e7390932054d7882498e3", "658": "ca8e7b53b095939e5fafefa56e9b45b40c396145acf2a767f9f2430fbba75a79", "659": "3d6c8492fbfe1c76e3f9d66485a7447489b89763623127deb6ed327a0c2a011b", "660": "23d754ebe35981ad5de850f66bb2294a22280a8ad0b4160b1c29dfb5487505d9", "661": "fd7eaca9690ee0384770e855ed600c96080c5c23565bfdae01c6045a87d9550a", "662": "b93bc0a52860ee0a1fdc28adeca7b39288b1119e0f318467f0a193236e00f99c", "663": "f73e3335b21c11b78987deb5a6eace1cef327981322f53a070adfbe31b56e7d0", "664": "f3f0de955603850bd411690d11a5391e63f515a29e31e9241c66c62d688bcf72", "665": "f2650e75f39098e5a114077b6e07bc15325adce22e1ab4b20569a4eeda5c6ca6", "666": "a01a34d1c29aff5618a96046605adb74fa49b834975051d4ac82672567727a21", "667": "2db51646a4038b38c88512738f79bb21776d39c7bfa3086538cccba0b63024db", "668": "2f3336b7f1211fcc180cd76dc6442fecb412771aa45ef1a7675aa437d04e582b", "669": "28bf022d827392eff1ec8ec121767ec24778f1b69da8605b4ab059023b8ad28a", "670": "38db5dbb2a3ce2d31d1958f5b3ca4c3555eb0ac4193ebffa3f42ffd6bb4806e3", "671": "0580cf2ef8abd3afbf91fba2032c2d51e43306bebb7f979bb750c3d7bd14c961", "672": "394f1b74ccfac5a4fa958d813b5932371c5f8c2f3dbd1eb7202af2223aa08afb", "673": "61c90400cd197b8ea6d7de90fcd1af0959fc37625fe163363fdae0ac4a724bfd", "674": "6037c38f696b10fb531c26396890cd3b48d5408c5b37e61d03a72ae2f7b64ed6", "675": "39c8b1bd1d534381b811bd8050e54b753106c1bfaf5d3cc63d8fe92a94471915", "676": "346d1e2de9915fa2f4ce3675ccebadccb8e9d14239f1e53b6d08d09f5c26297d", "677": "36841bba8f77d669e9d8f4e09ec580ce2c7a36c37da719815e65cc641eb1fdeb", "678": "09532ddbaffb710f02964e270f8658bd8a09149744726a82f618708b35a5fa26", "679": "774f8d6f89a5875342b21e8337aa5e3ab0539960a5b42554bc8d8a0fffce7d65", "680": "48d62baa62c2a9c561612192ec39a7dbcecc8badadc0ddc755191648597a42f9", "681": "7adc09dd86f3e73979d9f8a4b3232102ca52bc41d043614fe989cd908ed88c76", "682": "522f0ff3ae2f1761dca78207dec1c9b52556eba2db7503ca03441abf62f65c76", "683": "376e3c3e4b88ee76cb0f02390751a7248fcf1562013b1390b1e276a3f3d7da63", "684": "6363f306f081683781908acd4bedd92b3a75c796243cdacadc4b9896d8cfaaaa", "685": "29f2c4c5325cf626b392a910e6e22b6d2a989bfbb38439c20162b7b786b5e2f8", "686": "990ae3583a1f7a32b7581a8ace626511c812e0bd910b8064fefb31e625b9c22d", "687": "7e78b4b91851b976f5cc2a1341b9389ae7bdd0248ae7f7c53e7ebb2d86bbc73c", "688": "1ada92e769892b4bb540d75cbf40017a24b5b309b28a097ed62eb7f2727518e7", "689": "17a0ba5b100d0a92f3f82e2e6f31c71a6ca53a0f043094a6419331e22036150b", "690": "f9658a8f0687d69f420f655c500304c3c0888f298a68075ab6a2165a3bc47c53", "691": "3ff8aa53eb2f7e700fdc7cb838ca7f7b495948bb997ef70d196c10592fa64680", "692": "c01c3e579b2743866cd3d0c1d9039871356143a99c572593d2702f387e9f629f", "693": "c08e2dd3686459c2989cd6a367d2cc64b2bc2af460417102e9856e91b5f78fa4", "694": "063e59bfd9cbed08afa508954ac9c1c313b80331d6a917fd2202e15e1eeb00e9", "695": "c3259eeed96a5837a6630fd9d1245de7c77e10d0733b6129a3dc99548bd92800", "696": "9ab20a4d8c3c0de897a1c8afa95733d0f7f79870c6379064ef4cf1f5baae67e6", "697": "62c07adf4da24a20a723f6c32e35a51f2b942e363dc9fa35070e34991a5a9c1d", "698": "632f1a4eba12f5c80401d82c4bad7c5679f55ccc89bf2da3e3930ff3d6671ba1", "699": "8c40c5c92fad7ed2774080ddd39f62cdc94ca05dde4273344497ab4206499484", "700": "3dccee8e873d2c9c2f8359417e666b702f97b60b90b229e3c41190909ff9388b", "701": "65a57fc7ebcdab77821276a1eba1c1a625bf2bae575b025359de492592ded205", "702": "c1b0ade78aadbf0d5576489c2200439ef825fe74452115edbc908e9ff955efc0", "703": "1e5ea7fffdcdbca5fc91694b200db8e2e3737e829b7694e4dcf3b937b41be330", "704": "9ddf38880f294ac1a759c764c394cacd4635735880f326a0b5e4a896e4fdce8c", "705": "2bb033d9eeb9157fc6ae835e99b9523bfb1d61173cfb34941cbfdc4c0d3ea67e", "706": "51a0e8daacbd6537efd583c48c5815a9bd22fef0eb9b8e15dbe2ee87c76e2a6b", "707": "9f50d3b52dc4ebae279c6f6021258ca8cd60b8cd13e358f29a2879caa390a774", "708": "42e0a9be7737aaab1fd27543c0273f4c97dd3bd6471e6ec04b1fc7b79542db71", "709": "ac2605c16873ea2b5f0ce5008089a55e37588f45313ad06ccc7dfd96f407eb8a", "710": "09214942caed4184e7155b4016b1e0de37c0a142deaebee3879c770438a28276", "711": "8d8ea19a78bcb10e502f91a057bac1b200ab17db66e11cdf42b63ec65a8e6c18", "712": "001493340cc232a48125f958308be6d0567ff2684e0625e55af8b0a024c4ccca", "713": "98a124df4ffa11cca86fbd959f4d091665fc871a4a86cc1024429d1c116b556e", "714": "cd175b00873a9a3369c628861c1f20df57a4ca75074530ebf5b974d04b8b93c4", "715": "cdb954d8620ad2d95915f94243cdcf71170cfc363334b2f831544f55f0d15746", "716": "abb62293fb9df9bc7a6e80ea24f0da1049f894ade937367e24563a3277f953ef", "717": "319369720bf1831be4c73600c26f5d08dcf6cf85fd32340c28263e39c1dda5e6", "718": "412ce061b1ae228d2226fdb3bf2cb68421870465d6a8cf7ae58515c02fe54684", "719": "c461587d4f3a41c375628e94fb9f971cc2829b8608d3c7aca840e62a6c8f1929", "720": "3651d0d1f023c90e42be5c6ccf28ca71203d1c67d85249323d35db28f146786f", "721": "8430fc43038ba44efb6e9ecbd5aa3dfeaeaf73f2d04a2d5596855c7de5de9c20", "722": "9687101dfe209fd65f57a10603baa38ba83c9152e43a8b802b96f1e07f568e0e", "723": "74832787e7d4e0cb7991256c8f6d02775dffec0684de234786f25f898003f2de", "724": "fa05e2b497e7eafa64574017a4c45aadef6b163d907b03d63ba3f4021096d329", "725": "005c873563f51bbebfdb1f8dbc383259e9a98e506bc87ae8d8c9044b81fc6418", "726": "93e41c533136bf4b436e493090fd4e7b277234db2a69c62a871f775ff26681bf", "727": "c366f7426ca9351dcdde2e3bea01181897cda4d9b44977678ea3828419b84851", "728": "8de62a644511d27c7c23c7722f56112b3c1ab9b05a078a98a0891f09f92464c6", "729": "0ae82177174eef99fc80a2ec921295f61a6ac4dfed86a1bf333a50c26d01955c", "730": "78cd876a176c8fbf7c2155b80dccbdededdbc43c28ef17b5a6e554d649325d38", "731": "54afb9f829be51d29f90eecbfe40e5ba91f3a3bf538de62f3e34674af15eb542", "732": "c4dc4610dcafc806b30e5d3f5560b57f462218a04397809843a7110838f0ebac", "733": "bdde7d98d057d6a6ae360fd2f872d8bccb7e7f2971df37a3c5f20712ea3c618f", "734": "9a514875bd9af26fcc565337771f852d311cd77033186e4d957e7b6c7b8ce018", "735": "8bbc5a27c0031d8c44f3f73c99622a202cd6ea9a080049d615a7ae80ce6024f9", "736": "e0d4c78b9b3dae51940877aff28275d036eccfc641111c8e34227ff6015a0fab", "737": "a600884bcaa01797310c83b198bad58c98530289305af29b0bf75f679af38d3a", "738": "c85f15fdaafe7d5525acff960afef7e4b8ffded5a7ee0d1dc2b0e8d0c26b9b46", "739": "8716e9302f0fb90153e2f522bd88a710361a897480e4ccc0542473c704793518", "740": "6ff41ee34b263b742cda109aee3be9ad6c95eec2ce31d6a9fc5353bba1b41afd", "741": "99ac0eb9589b895e5755895206bbad5febd6bc29b2912df1c7544c547e26bca3", "742": "7d2761a240aa577348df4813ea248088d0d6d8d421142c712ed576cdc90d4df9", "743": "d93c42a129c0961b4e36738efae3b7e8ffae3a4daeced20e85bb740d3d72522d", "744": "211f76700a010461486dde6c723720be85e68c192cd8a8ed0a88860b8ae9b0f0", "745": "2d32dc1fea2f1b8600c0ada927b057b566870ceb5362cce71ac3693dcb7136ae", "746": "2df1c2a0181f0c25e8d13d2a1eadba55a6b06267a2b22075fcf6867fb2e10c02", "747": "a8d8f93142e320c6f0dd386c7a3bfb011bbdc15b85291a9be8f0266b3608175e", "748": "7de937e04c10386b240afb8bb2ff590009946df8b7850a0329ccdb59fca8955f", "749": "1a55f5484ccf964aeb186faedefa01db05d87180891dc2280b6eb85b6efb4779", "750": "fa4318c213179e6af1c949be7cf47210f4383e0a44d191e2bad44228d3192f14", "751": "12fe650fcb3afc214b3d647c655070e8142cfd397441fc7636ad7e6ffcaefde2", "752": "e416c0123bc6b82df8726b328494db31aa4781d938a0a6e2107b1e44c73c0434", "753": "0ee3299bc89e1e4c2fc79285fb1cd84c887456358a825e56be92244b7115f5af", "754": "1370574b16207c41d3dafb62aa898379ec101ac36843634b1633b7b509d4c35a", "755": "78bb4b18b13f5254cfafe872c0e93791ab5206b2851960dc6aebea8f62b9580c", "756": "6becaabbda2e9ea22373e62e989b6b70467efa24fbe2f0d124d7a99a53e93f74", "757": "fbfee0a5c4fa57a1dd6cf0c9bb2423cf7e7bcb130e67114aa360e42234987314", "758": "8e4dfc259cec9dfd89d4b4ac8c33c75af6e0f5f7926526ee22ad4d45f93d3c18", "759": "40bac0ed2e4f7861a6d9a2d87191a9034e177c319aa40a43638cc1b69572e5f2", "760": "7ab50386a211f0815593389ab05b57a1a5eb5cbf5b9a85fe4afc517dcab74e06", "761": "1cdb0318ac16e11c8d2ae7b1d7ca7138f7b1a461e9d75bd69be0f9cdd3add0c5", "762": "84c4662267d5809380a540dfc2881665b3019047d74d5ef0a01f86e45f4b5b59", "763": "f0def5903139447fabe7d106db5fff660d94b45af7b8b48d789596cf65ab2514", "764": "7b4131f4d1e13d091ca7dd4d32317a14a2a24e6e1abd214df1c14c215287b330", "765": "7558b775727426bccd945f5aa6b3e131e6034a7b1ff8576332329ef65d6a1663", "766": "23c309430fa9546adb617457dbfd30fb7432904595c8c000e9b67ea23f32a53b", "767": "70aef22ac2db8a5bdfcc42ff8dafbd2901e85e268f5f3c45085aa40c590b1d42", "768": "b69a808dfc654b037e2f47ace16f48fe3bb553b3c8eed3e2b6421942fbf521d0", "769": "78537a30577e806c6d8d94725e54d2d52e56f7f39f89c133cd5d0a2aad7e46e4", "770": "c9d80c19c4895d1498bf809fcc37c447fa961fb325e5667eb35d6aa992966b41", "771": "9803ace30c0d90d422e703fdf25a10a9342d0178a277ebc20c7bd6feac4c7a15", "772": "f5a1e391af815ea6453db58a1bd71790f433c44ed63e5e93d8f5c045dfd5a464", "773": "e1b93fc323c4d9c383100603339548e1e56ce9c38bcdcc425024c12b862ea8cb", "774": "3646cd098b213014fb7bbc9597871585e62ee0cf2770e141f1df771237cc09ab", "775": "d9d7d515ce7350c9e5696d85f68bbb42daa74b9e171a601dd04c823b18bb7757", "776": "83286074d3bc86a5b449facb5fe5eafc91eb4c8031e2fb5e716443402cd8ed0f", "777": "e62616a387d05b619d47cee3d49d5d2db19393736bf54b6cdd20933c0531cb7e", "778": "d4de958ba44d25353de5b380e04d06c7968794ad50dbf6231ad0049ff53e106b", "779": "c08ce54a59afc4af62f28b80a9c9a5190822d124eed8d73fd6db3e19c81e2157", "780": "fc7ba646c16482f0f4f5ce2b06d21183dba2bdeaf9469b36b55bc7bc2d87baf3", "781": "8fa5733f06838fb61b55b3e9d59c5061d922147e59947fe52e566dd975b2199f", "782": "9f757d92df401ee049bc066bb2625c6287e5e4bcd38c958396a77a578f036a24", "783": "270ff37f60c267a673bd4b223e44941f01ae9cfbf6bbdf99ca57af89b1e9a66f", "784": "388b17c4c7b829cef767f83b4686c903faeec1241edfe5f58ee91d2b0c7f8dfc", "785": "77cf600204c5265e1d5d3d26bf28ba1e92e6f24def040c16977450bec8b1cb99", "786": "fb14022b7edbc6c7bfde27f35b49f6acaa4f0fc383af27614cb9d4a1980e626b", "787": "7516ba0ac1951665723dcc4adcc52764d9497e7b6ed30bdb9937ac9df82b7c4f", "788": "adede1d30258bb0f353af11f559b67f8b823304c71e967f52db52d002760c24f", "789": "0c82e744a1f9bc57fd8ae8b2f479998455bc45126de971c59b68541c254e303a", "790": "319847122251afd20d4d650047c55981a509fa2be78abd7c9c3caa0555e60a05", "791": "2e0bbdcd0a8460e1e33c55668d0dc9752379a78b9f3561d7a17b922a5541a3fb", "792": "5f77834c5a509023dd95dd98411eae1dd4bafd125deca590632f409f92fd257b", "793": "dbfd900a3b31eeec2f14b916f5151611541cb716d80b7b9a1229de12293a02ea", "794": "d019fe415aba832c4c761140d60c466c9aaad52b504df3167c17f2d3f0b277a7", "795": "617b259349da44c2af2664acde113673ab3bb03a85d31f1be8f01027d0ebd4d3", "796": "cba6b30a818d073398e5802211987f0897523e4752987bb445b2bca079670e22", "797": "61e42cac3d7858b8850111a8c64c56432a18dd058dfb6afd773f07d703703b1a", "798": "ae8b155d6b77522af79f7e4017fefe92aaa5d45eff132c83dc4d4bcfc9686020", "799": "a41cb14ddf8f1948a01f590fbe53d9ca4e2faf48375ce1c306f91acf7c94e005", "800": "c6a47bc6f02cf06be16728fb308c83f2f2ae350325ef7016867f5bdaea849d71", "801": "d14b358c76b55106613f9c0a2112393338dfd01513b0fd231b79fc8db20e41f0", "802": "22ae33e67fb48accfaa3b36e70c5a19066b974194c3130680de0c7cdce2d0f2e", "803": "d95b3f9bbb7054042c1fba4db02f7223a2dad94977a36f08c8aaf92f373f9e78", "804": "b0b1cf7253593eb2334c75e66dbe22b4b4540347485f1ea24e80226b4b18171c", "805": "41b1ff5db0e70984ad20c50d1a9ac2b5a53ccd5f42796c8e948ae8880005fbb9", "806": "b9c813beb39671adb8e1530555cadca44c21ddc7127932274918df2091dbd9ca", "807": "745fd9ba97970d85a29877942839e41fc192794420e86f3bde39fd26db7a8bff", "808": "6c73b947eb603602a7e8afadc83eaaa381a46db8b82a6fb89c9c1d93cb023fce", "809": "eebac7753da4c1230dfce0f15fc124ffff01b0e432f0b74623b60cff71bbc9a9", "810": "42be7899672a1a0046823603ce60dbeda7250a56fcb8d0913093850c85394307", "811": "8698cd28ae4d93db36631870c33e4a8a527d970050d994666115f54260b64138", "812": "dc2495924f37353db8b846323b8085fae9db502e890c513ed2e64ed7281f567f", "813": "92179dde05aa6557baca65699fda50ca024d33a77078d8e128caa3c5db84064b", "814": "344ed8cb7684307c00b7f03d751729a7f9d2a5f4a4cb4574594113d69593c0c1", "815": "f642cf15345af3feab60e26a02aee038f759914906a5b2b469b46fdeee50ff59", "816": "058178444e85f2aedb2f75d824a469747381f0bd3235d8c72df4385fec86eb07", "817": "582fdc2233298192b09ceaf1463d6be06a09894075532630aa9d9efcfcb31da4", "818": "67f6964d6ff114a43371b8375c44db2f1362df4f110b4a7ce8d79cf1b76621a0", "819": "c7a82513ad48dfc87f2c1e0f2915b71464b7f5a16501c71df4ae4a8741dceef3", "820": "9b23ae0181f320aadda2637ac2179c8b41b00715630c3acb643c7aee3b81cf90", "821": "0941e396ff15b98fd7827de8e33ef94996d48ba719a88ba8e2da7f2605df3e5c", "822": "ed8ef7f568939b9df1b77ae58344940b91c7e154a4367fe2b179bc7b9484d4e6", "823": "05139328571a86096032b57e3a6a02a61acad4fb0d8f8e1b5d0ffb0d063ba697", "826": "7f40f14ca65e5c06dd9ec9bbb212adb4d97a503199cb3c30ed921a04373bbe1c", "827": "80461f02c63654c642382a6ffb7a44d0a3554434dfcfcea00ba91537724c7106", "828": "520c196175625a0230afb76579ea26033372de3ef4c78aceb146b84322bfa871", "829": "ed0089e61cf5540dd4a8fef1c468b96cf57f1d2bb79968755ba856d547ddafdf", "831": "8ec445084427419ca6da405e0ded9814a4b4e11a2be84d88a8dea421f8e49992", "832": "cfcb9ebef9308823f64798b5e12a59bf77ff6f92b0eae3790a61c0a26f577010", "833": "e6ff3a5b257eb53366a32bfc8ea410a00a78bafa63650c76ac2bceddfbb42ff5", "834": "b0d2a7e7d629ef14db9e7352a9a06d6ca66f750429170bb169ca52c172b8cc96", "835": "bdfa1b1eecbad79f5de48bc6daee4d2b07689d7fb172aa306dd6094172b396f0" } ================================================ FILE: scripts/validate_filenames.py ================================================ #!/usr/bin/env python3 import os try: from .build_directory_md import good_file_paths except ImportError: from build_directory_md import good_file_paths # type: ignore[no-redef] filepaths = list(good_file_paths()) assert filepaths, "good_file_paths() failed!" if upper_files := [file for file in filepaths if file != file.lower()]: print(f"{len(upper_files)} files contain uppercase characters:") print("\n".join(upper_files) + "\n") if space_files := [file for file in filepaths if " " in file]: print(f"{len(space_files)} files contain space characters:") print("\n".join(space_files) + "\n") if hyphen_files := [ file for file in filepaths if "-" in file and "/site-packages/" not in file ]: print(f"{len(hyphen_files)} files contain hyphen characters:") print("\n".join(hyphen_files) + "\n") if nodir_files := [file for file in filepaths if os.sep not in file]: print(f"{len(nodir_files)} files are not in a directory:") print("\n".join(nodir_files) + "\n") if bad_files := len(upper_files + space_files + hyphen_files + nodir_files): import sys sys.exit(bad_files) ================================================ FILE: scripts/validate_solutions.py ================================================ #!/usr/bin/env python3 # /// script # requires-python = ">=3.13" # dependencies = [ # "httpx", # "pytest", # ] # /// import hashlib import importlib.util import json import os import pathlib from types import ModuleType import httpx import pytest PROJECT_EULER_DIR_PATH = pathlib.Path.cwd().joinpath("project_euler") PROJECT_EULER_ANSWERS_PATH = pathlib.Path.cwd().joinpath( "scripts", "project_euler_answers.json" ) with open(PROJECT_EULER_ANSWERS_PATH) as file_handle: PROBLEM_ANSWERS: dict[str, str] = json.load(file_handle) def convert_path_to_module(file_path: pathlib.Path) -> ModuleType: """Converts a file path to a Python module""" spec = importlib.util.spec_from_file_location(file_path.name, str(file_path)) module = importlib.util.module_from_spec(spec) # type: ignore[arg-type] spec.loader.exec_module(module) # type: ignore[union-attr] return module def all_solution_file_paths() -> list[pathlib.Path]: """Collects all the solution file path in the Project Euler directory""" solution_file_paths = [] for problem_dir_path in PROJECT_EULER_DIR_PATH.iterdir(): if problem_dir_path.is_file() or problem_dir_path.name.startswith("_"): continue for file_path in problem_dir_path.iterdir(): if file_path.suffix != ".py" or file_path.name.startswith(("_", "test")): continue solution_file_paths.append(file_path) return solution_file_paths def get_files_url() -> str: """Return the pull request number which triggered this action.""" with open(os.environ["GITHUB_EVENT_PATH"]) as file: event = json.load(file) return event["pull_request"]["url"] + "/files" def added_solution_file_path() -> list[pathlib.Path]: """Collects only the solution file path which got added in the current pull request. This will only be triggered if the script is ran from GitHub Actions. """ solution_file_paths = [] headers = { "Accept": "application/vnd.github.v3+json", "Authorization": "token " + os.environ["GITHUB_TOKEN"], } files = httpx.get(get_files_url(), headers=headers, timeout=10).json() for file in files: filepath = pathlib.Path.cwd().joinpath(file["filename"]) if ( filepath.suffix != ".py" or filepath.name.startswith(("_", "test")) or not filepath.name.startswith("sol") ): continue solution_file_paths.append(filepath) return solution_file_paths def collect_solution_file_paths() -> list[pathlib.Path]: # Return only if there are any, otherwise default to all solutions if ( os.environ.get("CI") and os.environ.get("GITHUB_EVENT_NAME") == "pull_request" and (filepaths := added_solution_file_path()) ): return filepaths return all_solution_file_paths() @pytest.mark.parametrize( "solution_path", collect_solution_file_paths(), ids=lambda path: f"{path.parent.name}/{path.name}", ) def test_project_euler(solution_path: pathlib.Path) -> None: """Testing for all Project Euler solutions""" # problem_[extract this part] and pad it with zeroes for width 3 problem_number: str = solution_path.parent.name[8:].zfill(3) expected: str = PROBLEM_ANSWERS[problem_number] solution_module = convert_path_to_module(solution_path) answer = str(solution_module.solution()) answer = hashlib.sha256(answer.encode()).hexdigest() assert answer == expected, ( f"Expected solution to {problem_number} to have hash {expected}, got {answer}" ) ================================================ FILE: searches/__init__.py ================================================ ================================================ FILE: searches/binary_search.py ================================================ #!/usr/bin/env python3 """ Pure Python implementations of binary search algorithms For doctests run the following command: python3 -m doctest -v binary_search.py For manual testing run: python3 binary_search.py """ import bisect from itertools import pairwise def bisect_left( sorted_collection: list[int], item: int, lo: int = 0, hi: int = -1 ) -> int: """ Locates the first element in a sorted array that is larger or equal to a given value. It has the same interface as https://docs.python.org/3/library/bisect.html#bisect.bisect_left . :param sorted_collection: some ascending sorted collection with comparable items :param item: item to bisect :param lo: lowest index to consider (as in sorted_collection[lo:hi]) :param hi: past the highest index to consider (as in sorted_collection[lo:hi]) :return: index i such that all values in sorted_collection[lo:i] are < item and all values in sorted_collection[i:hi] are >= item. Examples: >>> bisect_left([0, 5, 7, 10, 15], 0) 0 >>> bisect_left([0, 5, 7, 10, 15], 6) 2 >>> bisect_left([0, 5, 7, 10, 15], 20) 5 >>> bisect_left([0, 5, 7, 10, 15], 15, 1, 3) 3 >>> bisect_left([0, 5, 7, 10, 15], 6, 2) 2 """ if hi < 0: hi = len(sorted_collection) while lo < hi: mid = lo + (hi - lo) // 2 if sorted_collection[mid] < item: lo = mid + 1 else: hi = mid return lo def bisect_right( sorted_collection: list[int], item: int, lo: int = 0, hi: int = -1 ) -> int: """ Locates the first element in a sorted array that is larger than a given value. It has the same interface as https://docs.python.org/3/library/bisect.html#bisect.bisect_right . :param sorted_collection: some ascending sorted collection with comparable items :param item: item to bisect :param lo: lowest index to consider (as in sorted_collection[lo:hi]) :param hi: past the highest index to consider (as in sorted_collection[lo:hi]) :return: index i such that all values in sorted_collection[lo:i] are <= item and all values in sorted_collection[i:hi] are > item. Examples: >>> bisect_right([0, 5, 7, 10, 15], 0) 1 >>> bisect_right([0, 5, 7, 10, 15], 15) 5 >>> bisect_right([0, 5, 7, 10, 15], 6) 2 >>> bisect_right([0, 5, 7, 10, 15], 15, 1, 3) 3 >>> bisect_right([0, 5, 7, 10, 15], 6, 2) 2 """ if hi < 0: hi = len(sorted_collection) while lo < hi: mid = lo + (hi - lo) // 2 if sorted_collection[mid] <= item: lo = mid + 1 else: hi = mid return lo def insort_left( sorted_collection: list[int], item: int, lo: int = 0, hi: int = -1 ) -> None: """ Inserts a given value into a sorted array before other values with the same value. It has the same interface as https://docs.python.org/3/library/bisect.html#bisect.insort_left . :param sorted_collection: some ascending sorted collection with comparable items :param item: item to insert :param lo: lowest index to consider (as in sorted_collection[lo:hi]) :param hi: past the highest index to consider (as in sorted_collection[lo:hi]) Examples: >>> sorted_collection = [0, 5, 7, 10, 15] >>> insort_left(sorted_collection, 6) >>> sorted_collection [0, 5, 6, 7, 10, 15] >>> sorted_collection = [(0, 0), (5, 5), (7, 7), (10, 10), (15, 15)] >>> item = (5, 5) >>> insort_left(sorted_collection, item) >>> sorted_collection [(0, 0), (5, 5), (5, 5), (7, 7), (10, 10), (15, 15)] >>> item is sorted_collection[1] True >>> item is sorted_collection[2] False >>> sorted_collection = [0, 5, 7, 10, 15] >>> insort_left(sorted_collection, 20) >>> sorted_collection [0, 5, 7, 10, 15, 20] >>> sorted_collection = [0, 5, 7, 10, 15] >>> insort_left(sorted_collection, 15, 1, 3) >>> sorted_collection [0, 5, 7, 15, 10, 15] """ sorted_collection.insert(bisect_left(sorted_collection, item, lo, hi), item) def insort_right( sorted_collection: list[int], item: int, lo: int = 0, hi: int = -1 ) -> None: """ Inserts a given value into a sorted array after other values with the same value. It has the same interface as https://docs.python.org/3/library/bisect.html#bisect.insort_right . :param sorted_collection: some ascending sorted collection with comparable items :param item: item to insert :param lo: lowest index to consider (as in sorted_collection[lo:hi]) :param hi: past the highest index to consider (as in sorted_collection[lo:hi]) Examples: >>> sorted_collection = [0, 5, 7, 10, 15] >>> insort_right(sorted_collection, 6) >>> sorted_collection [0, 5, 6, 7, 10, 15] >>> sorted_collection = [(0, 0), (5, 5), (7, 7), (10, 10), (15, 15)] >>> item = (5, 5) >>> insort_right(sorted_collection, item) >>> sorted_collection [(0, 0), (5, 5), (5, 5), (7, 7), (10, 10), (15, 15)] >>> item is sorted_collection[1] False >>> item is sorted_collection[2] True >>> sorted_collection = [0, 5, 7, 10, 15] >>> insort_right(sorted_collection, 20) >>> sorted_collection [0, 5, 7, 10, 15, 20] >>> sorted_collection = [0, 5, 7, 10, 15] >>> insort_right(sorted_collection, 15, 1, 3) >>> sorted_collection [0, 5, 7, 15, 10, 15] """ sorted_collection.insert(bisect_right(sorted_collection, item, lo, hi), item) def binary_search(sorted_collection: list[int], item: int) -> int: """Pure implementation of a binary search algorithm in Python Be careful collection must be ascending sorted otherwise, the result will be unpredictable :param sorted_collection: some ascending sorted collection with comparable items :param item: item value to search :return: index of the found item or -1 if the item is not found Examples: >>> binary_search([0, 5, 7, 10, 15], 0) 0 >>> binary_search([0, 5, 7, 10, 15], 15) 4 >>> binary_search([0, 5, 7, 10, 15], 5) 1 >>> binary_search([0, 5, 7, 10, 15], 6) -1 """ if any(a > b for a, b in pairwise(sorted_collection)): raise ValueError("sorted_collection must be sorted in ascending order") left = 0 right = len(sorted_collection) - 1 while left <= right: midpoint = left + (right - left) // 2 current_item = sorted_collection[midpoint] if current_item == item: return midpoint elif item < current_item: right = midpoint - 1 else: left = midpoint + 1 return -1 def binary_search_std_lib(sorted_collection: list[int], item: int) -> int: """Pure implementation of a binary search algorithm in Python using stdlib Be careful collection must be ascending sorted otherwise, the result will be unpredictable :param sorted_collection: some ascending sorted collection with comparable items :param item: item value to search :return: index of the found item or -1 if the item is not found Examples: >>> binary_search_std_lib([0, 5, 7, 10, 15], 0) 0 >>> binary_search_std_lib([0, 5, 7, 10, 15], 15) 4 >>> binary_search_std_lib([0, 5, 7, 10, 15], 5) 1 >>> binary_search_std_lib([0, 5, 7, 10, 15], 6) -1 """ if list(sorted_collection) != sorted(sorted_collection): raise ValueError("sorted_collection must be sorted in ascending order") index = bisect.bisect_left(sorted_collection, item) if index != len(sorted_collection) and sorted_collection[index] == item: return index return -1 def binary_search_with_duplicates(sorted_collection: list[int], item: int) -> list[int]: """Pure implementation of a binary search algorithm in Python that supports duplicates. Resources used: https://stackoverflow.com/questions/13197552/using-binary-search-with-sorted-array-with-duplicates The collection must be sorted in ascending order; otherwise the result will be unpredictable. If the target appears multiple times, this function returns a list of all indexes where the target occurs. If the target is not found, this function returns an empty list. :param sorted_collection: some ascending sorted collection with comparable items :param item: item value to search for :return: a list of indexes where the item is found (empty list if not found) Examples: >>> binary_search_with_duplicates([0, 5, 7, 10, 15], 0) [0] >>> binary_search_with_duplicates([0, 5, 7, 10, 15], 15) [4] >>> binary_search_with_duplicates([1, 2, 2, 2, 3], 2) [1, 2, 3] >>> binary_search_with_duplicates([1, 2, 2, 2, 3], 4) [] """ if list(sorted_collection) != sorted(sorted_collection): raise ValueError("sorted_collection must be sorted in ascending order") def lower_bound(sorted_collection: list[int], item: int) -> int: """ Returns the index of the first element greater than or equal to the item. :param sorted_collection: The sorted list to search. :param item: The item to find the lower bound for. :return: The index where the item can be inserted while maintaining order. """ left = 0 right = len(sorted_collection) while left < right: midpoint = left + (right - left) // 2 current_item = sorted_collection[midpoint] if current_item < item: left = midpoint + 1 else: right = midpoint return left def upper_bound(sorted_collection: list[int], item: int) -> int: """ Returns the index of the first element strictly greater than the item. :param sorted_collection: The sorted list to search. :param item: The item to find the upper bound for. :return: The index where the item can be inserted after all existing instances. """ left = 0 right = len(sorted_collection) while left < right: midpoint = left + (right - left) // 2 current_item = sorted_collection[midpoint] if current_item <= item: left = midpoint + 1 else: right = midpoint return left left = lower_bound(sorted_collection, item) right = upper_bound(sorted_collection, item) if left == len(sorted_collection) or sorted_collection[left] != item: return [] return list(range(left, right)) def binary_search_by_recursion( sorted_collection: list[int], item: int, left: int = 0, right: int = -1 ) -> int: """Pure implementation of a binary search algorithm in Python by recursion Be careful collection must be ascending sorted otherwise, the result will be unpredictable First recursion should be started with left=0 and right=(len(sorted_collection)-1) :param sorted_collection: some ascending sorted collection with comparable items :param item: item value to search :return: index of the found item or -1 if the item is not found Examples: >>> binary_search_by_recursion([0, 5, 7, 10, 15], 0, 0, 4) 0 >>> binary_search_by_recursion([0, 5, 7, 10, 15], 15, 0, 4) 4 >>> binary_search_by_recursion([0, 5, 7, 10, 15], 5, 0, 4) 1 >>> binary_search_by_recursion([0, 5, 7, 10, 15], 6, 0, 4) -1 """ if right < 0: right = len(sorted_collection) - 1 if list(sorted_collection) != sorted(sorted_collection): raise ValueError("sorted_collection must be sorted in ascending order") if right < left: return -1 midpoint = left + (right - left) // 2 if sorted_collection[midpoint] == item: return midpoint elif sorted_collection[midpoint] > item: return binary_search_by_recursion(sorted_collection, item, left, midpoint - 1) else: return binary_search_by_recursion(sorted_collection, item, midpoint + 1, right) def exponential_search(sorted_collection: list[int], item: int) -> int: """Pure implementation of an exponential search algorithm in Python Resources used: https://en.wikipedia.org/wiki/Exponential_search Be careful collection must be ascending sorted otherwise, result will be unpredictable :param sorted_collection: some ascending sorted collection with comparable items :param item: item value to search :return: index of the found item or -1 if the item is not found the order of this algorithm is O(lg I) where I is index position of item if exist Examples: >>> exponential_search([0, 5, 7, 10, 15], 0) 0 >>> exponential_search([0, 5, 7, 10, 15], 15) 4 >>> exponential_search([0, 5, 7, 10, 15], 5) 1 >>> exponential_search([0, 5, 7, 10, 15], 6) -1 """ if list(sorted_collection) != sorted(sorted_collection): raise ValueError("sorted_collection must be sorted in ascending order") bound = 1 while bound < len(sorted_collection) and sorted_collection[bound] < item: bound *= 2 left = bound // 2 right = min(bound, len(sorted_collection) - 1) last_result = binary_search_by_recursion( sorted_collection=sorted_collection, item=item, left=left, right=right ) if last_result is None: return -1 return last_result searches = ( # Fastest to slowest... binary_search_std_lib, binary_search, exponential_search, binary_search_by_recursion, ) if __name__ == "__main__": import doctest import timeit doctest.testmod() for search in searches: name = f"{search.__name__:>26}" print(f"{name}: {search([0, 5, 7, 10, 15], 10) = }") # type: ignore[operator] print("\nBenchmarks...") setup = "collection = range(1000)" for search in searches: name = search.__name__ print( f"{name:>26}:", timeit.timeit( f"{name}(collection, 500)", setup=setup, number=5_000, globals=globals() ), ) user_input = input("\nEnter numbers separated by comma: ").strip() collection = sorted(int(item) for item in user_input.split(",")) target = int(input("Enter a single number to be found in the list: ")) result = binary_search(sorted_collection=collection, item=target) if result == -1: print(f"{target} was not found in {collection}.") else: print(f"{target} was found at position {result} of {collection}.") ================================================ FILE: searches/binary_tree_traversal.py ================================================ """ This is pure Python implementation of tree traversal algorithms """ from __future__ import annotations import queue class TreeNode: def __init__(self, data): self.data = data self.right = None self.left = None def build_tree() -> TreeNode: print("\n********Press N to stop entering at any point of time********\n") check = input("Enter the value of the root node: ").strip().lower() q: queue.Queue = queue.Queue() tree_node = TreeNode(int(check)) q.put(tree_node) while not q.empty(): node_found = q.get() msg = f"Enter the left node of {node_found.data}: " check = input(msg).strip().lower() or "n" if check == "n": return tree_node left_node = TreeNode(int(check)) node_found.left = left_node q.put(left_node) msg = f"Enter the right node of {node_found.data}: " check = input(msg).strip().lower() or "n" if check == "n": return tree_node right_node = TreeNode(int(check)) node_found.right = right_node q.put(right_node) raise ValueError("Something went wrong") def pre_order(node: TreeNode) -> None: """ >>> root = TreeNode(1) >>> tree_node2 = TreeNode(2) >>> tree_node3 = TreeNode(3) >>> tree_node4 = TreeNode(4) >>> tree_node5 = TreeNode(5) >>> tree_node6 = TreeNode(6) >>> tree_node7 = TreeNode(7) >>> root.left, root.right = tree_node2, tree_node3 >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5 >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7 >>> pre_order(root) 1,2,4,5,3,6,7, """ if not isinstance(node, TreeNode) or not node: return print(node.data, end=",") pre_order(node.left) pre_order(node.right) def in_order(node: TreeNode) -> None: """ >>> root = TreeNode(1) >>> tree_node2 = TreeNode(2) >>> tree_node3 = TreeNode(3) >>> tree_node4 = TreeNode(4) >>> tree_node5 = TreeNode(5) >>> tree_node6 = TreeNode(6) >>> tree_node7 = TreeNode(7) >>> root.left, root.right = tree_node2, tree_node3 >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5 >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7 >>> in_order(root) 4,2,5,1,6,3,7, """ if not isinstance(node, TreeNode) or not node: return in_order(node.left) print(node.data, end=",") in_order(node.right) def post_order(node: TreeNode) -> None: """ >>> root = TreeNode(1) >>> tree_node2 = TreeNode(2) >>> tree_node3 = TreeNode(3) >>> tree_node4 = TreeNode(4) >>> tree_node5 = TreeNode(5) >>> tree_node6 = TreeNode(6) >>> tree_node7 = TreeNode(7) >>> root.left, root.right = tree_node2, tree_node3 >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5 >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7 >>> post_order(root) 4,5,2,6,7,3,1, """ if not isinstance(node, TreeNode) or not node: return post_order(node.left) post_order(node.right) print(node.data, end=",") def level_order(node: TreeNode) -> None: """ >>> root = TreeNode(1) >>> tree_node2 = TreeNode(2) >>> tree_node3 = TreeNode(3) >>> tree_node4 = TreeNode(4) >>> tree_node5 = TreeNode(5) >>> tree_node6 = TreeNode(6) >>> tree_node7 = TreeNode(7) >>> root.left, root.right = tree_node2, tree_node3 >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5 >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7 >>> level_order(root) 1,2,3,4,5,6,7, """ if not isinstance(node, TreeNode) or not node: return q: queue.Queue = queue.Queue() q.put(node) while not q.empty(): node_dequeued = q.get() print(node_dequeued.data, end=",") if node_dequeued.left: q.put(node_dequeued.left) if node_dequeued.right: q.put(node_dequeued.right) def level_order_actual(node: TreeNode) -> None: """ >>> root = TreeNode(1) >>> tree_node2 = TreeNode(2) >>> tree_node3 = TreeNode(3) >>> tree_node4 = TreeNode(4) >>> tree_node5 = TreeNode(5) >>> tree_node6 = TreeNode(6) >>> tree_node7 = TreeNode(7) >>> root.left, root.right = tree_node2, tree_node3 >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5 >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7 >>> level_order_actual(root) 1, 2,3, 4,5,6,7, """ if not isinstance(node, TreeNode) or not node: return q: queue.Queue = queue.Queue() q.put(node) while not q.empty(): list_ = [] while not q.empty(): node_dequeued = q.get() print(node_dequeued.data, end=",") if node_dequeued.left: list_.append(node_dequeued.left) if node_dequeued.right: list_.append(node_dequeued.right) print() for inner_node in list_: q.put(inner_node) # iteration version def pre_order_iter(node: TreeNode) -> None: """ >>> root = TreeNode(1) >>> tree_node2 = TreeNode(2) >>> tree_node3 = TreeNode(3) >>> tree_node4 = TreeNode(4) >>> tree_node5 = TreeNode(5) >>> tree_node6 = TreeNode(6) >>> tree_node7 = TreeNode(7) >>> root.left, root.right = tree_node2, tree_node3 >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5 >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7 >>> pre_order_iter(root) 1,2,4,5,3,6,7, """ if not isinstance(node, TreeNode) or not node: return stack: list[TreeNode] = [] n = node while n or stack: while n: # start from root node, find its left child print(n.data, end=",") stack.append(n) n = n.left # end of while means current node doesn't have left child n = stack.pop() # start to traverse its right child n = n.right def in_order_iter(node: TreeNode) -> None: """ >>> root = TreeNode(1) >>> tree_node2 = TreeNode(2) >>> tree_node3 = TreeNode(3) >>> tree_node4 = TreeNode(4) >>> tree_node5 = TreeNode(5) >>> tree_node6 = TreeNode(6) >>> tree_node7 = TreeNode(7) >>> root.left, root.right = tree_node2, tree_node3 >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5 >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7 >>> in_order_iter(root) 4,2,5,1,6,3,7, """ if not isinstance(node, TreeNode) or not node: return stack: list[TreeNode] = [] n = node while n or stack: while n: stack.append(n) n = n.left n = stack.pop() print(n.data, end=",") n = n.right def post_order_iter(node: TreeNode) -> None: """ >>> root = TreeNode(1) >>> tree_node2 = TreeNode(2) >>> tree_node3 = TreeNode(3) >>> tree_node4 = TreeNode(4) >>> tree_node5 = TreeNode(5) >>> tree_node6 = TreeNode(6) >>> tree_node7 = TreeNode(7) >>> root.left, root.right = tree_node2, tree_node3 >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5 >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7 >>> post_order_iter(root) 4,5,2,6,7,3,1, """ if not isinstance(node, TreeNode) or not node: return stack1, stack2 = [], [] n = node stack1.append(n) while stack1: # to find the reversed order of post order, store it in stack2 n = stack1.pop() if n.left: stack1.append(n.left) if n.right: stack1.append(n.right) stack2.append(n) while stack2: # pop up from stack2 will be the post order print(stack2.pop().data, end=",") def prompt(s: str = "", width=50, char="*") -> str: if not s: return "\n" + width * char left, extra = divmod(width - len(s) - 2, 2) return f"{left * char} {s} {(left + extra) * char}" if __name__ == "__main__": import doctest doctest.testmod() print(prompt("Binary Tree Traversals")) node: TreeNode = build_tree() print(prompt("Pre Order Traversal")) pre_order(node) print(prompt() + "\n") print(prompt("In Order Traversal")) in_order(node) print(prompt() + "\n") print(prompt("Post Order Traversal")) post_order(node) print(prompt() + "\n") print(prompt("Level Order Traversal")) level_order(node) print(prompt() + "\n") print(prompt("Actual Level Order Traversal")) level_order_actual(node) print("*" * 50 + "\n") print(prompt("Pre Order Traversal - Iteration Version")) pre_order_iter(node) print(prompt() + "\n") print(prompt("In Order Traversal - Iteration Version")) in_order_iter(node) print(prompt() + "\n") print(prompt("Post Order Traversal - Iteration Version")) post_order_iter(node) print(prompt()) ================================================ FILE: searches/double_linear_search.py ================================================ from __future__ import annotations def double_linear_search(array: list[int], search_item: int) -> int: """ Iterate through the array from both sides to find the index of search_item. :param array: the array to be searched :param search_item: the item to be searched :return the index of search_item, if search_item is in array, else -1 Examples: >>> double_linear_search([1, 5, 5, 10], 1) 0 >>> double_linear_search([1, 5, 5, 10], 5) 1 >>> double_linear_search([1, 5, 5, 10], 100) -1 >>> double_linear_search([1, 5, 5, 10], 10) 3 """ # define the start and end index of the given array start_ind, end_ind = 0, len(array) - 1 while start_ind <= end_ind: if array[start_ind] == search_item: return start_ind elif array[end_ind] == search_item: return end_ind else: start_ind += 1 end_ind -= 1 # returns -1 if search_item is not found in array return -1 if __name__ == "__main__": print(double_linear_search(list(range(100)), 40)) ================================================ FILE: searches/double_linear_search_recursion.py ================================================ def search(list_data: list, key: int, left: int = 0, right: int = 0) -> int: """ Iterate through the array to find the index of key using recursion. :param list_data: the list to be searched :param key: the key to be searched :param left: the index of first element :param right: the index of last element :return: the index of key value if found, -1 otherwise. >>> search(list(range(0, 11)), 5) 5 >>> search([1, 2, 4, 5, 3], 4) 2 >>> search([1, 2, 4, 5, 3], 6) -1 >>> search([5], 5) 0 >>> search([], 1) -1 """ right = right or len(list_data) - 1 if left > right: return -1 elif list_data[left] == key: return left elif list_data[right] == key: return right else: return search(list_data, key, left + 1, right - 1) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: searches/exponential_search.py ================================================ #!/usr/bin/env python3 """ Pure Python implementation of exponential search algorithm For more information, see the Wikipedia page: https://en.wikipedia.org/wiki/Exponential_search For doctests run the following command: python3 -m doctest -v exponential_search.py For manual testing run: python3 exponential_search.py """ from __future__ import annotations def binary_search_by_recursion( sorted_collection: list[int], item: int, left: int = 0, right: int = -1 ) -> int: """Pure implementation of binary search algorithm in Python using recursion Be careful: the collection must be ascending sorted otherwise, the result will be unpredictable. :param sorted_collection: some ascending sorted collection with comparable items :param item: item value to search :param left: starting index for the search :param right: ending index for the search :return: index of the found item or -1 if the item is not found Examples: >>> binary_search_by_recursion([0, 5, 7, 10, 15], 0, 0, 4) 0 >>> binary_search_by_recursion([0, 5, 7, 10, 15], 15, 0, 4) 4 >>> binary_search_by_recursion([0, 5, 7, 10, 15], 5, 0, 4) 1 >>> binary_search_by_recursion([0, 5, 7, 10, 15], 6, 0, 4) -1 """ if right < 0: right = len(sorted_collection) - 1 if list(sorted_collection) != sorted(sorted_collection): raise ValueError("sorted_collection must be sorted in ascending order") if right < left: return -1 midpoint = left + (right - left) // 2 if sorted_collection[midpoint] == item: return midpoint elif sorted_collection[midpoint] > item: return binary_search_by_recursion(sorted_collection, item, left, midpoint - 1) else: return binary_search_by_recursion(sorted_collection, item, midpoint + 1, right) def exponential_search(sorted_collection: list[int], item: int) -> int: """ Pure implementation of an exponential search algorithm in Python. For more information, refer to: https://en.wikipedia.org/wiki/Exponential_search Be careful: the collection must be ascending sorted, otherwise the result will be unpredictable. :param sorted_collection: some ascending sorted collection with comparable items :param item: item value to search :return: index of the found item or -1 if the item is not found The time complexity of this algorithm is O(log i) where i is the index of the item. Examples: >>> exponential_search([0, 5, 7, 10, 15], 0) 0 >>> exponential_search([0, 5, 7, 10, 15], 15) 4 >>> exponential_search([0, 5, 7, 10, 15], 5) 1 >>> exponential_search([0, 5, 7, 10, 15], 6) -1 """ if list(sorted_collection) != sorted(sorted_collection): raise ValueError("sorted_collection must be sorted in ascending order") if sorted_collection[0] == item: return 0 bound = 1 while bound < len(sorted_collection) and sorted_collection[bound] < item: bound *= 2 left = bound // 2 right = min(bound, len(sorted_collection) - 1) return binary_search_by_recursion(sorted_collection, item, left, right) if __name__ == "__main__": import doctest doctest.testmod() # Manual testing user_input = input("Enter numbers separated by commas: ").strip() collection = sorted(int(item) for item in user_input.split(",")) target = int(input("Enter a number to search for: ")) result = exponential_search(sorted_collection=collection, item=target) if result == -1: print(f"{target} was not found in {collection}.") else: print(f"{target} was found at index {result} in {collection}.") ================================================ FILE: searches/fibonacci_search.py ================================================ """ This is pure Python implementation of fibonacci search. Resources used: https://en.wikipedia.org/wiki/Fibonacci_search_technique For doctests run following command: python3 -m doctest -v fibonacci_search.py For manual testing run: python3 fibonacci_search.py """ from functools import lru_cache @lru_cache def fibonacci(k: int) -> int: """Finds fibonacci number in index k. Parameters ---------- k : Index of fibonacci. Returns ------- int Fibonacci number in position k. >>> fibonacci(0) 0 >>> fibonacci(2) 1 >>> fibonacci(5) 5 >>> fibonacci(15) 610 >>> fibonacci('a') Traceback (most recent call last): TypeError: k must be an integer. >>> fibonacci(-5) Traceback (most recent call last): ValueError: k integer must be greater or equal to zero. """ if not isinstance(k, int): raise TypeError("k must be an integer.") if k < 0: raise ValueError("k integer must be greater or equal to zero.") if k == 0: return 0 elif k == 1: return 1 else: return fibonacci(k - 1) + fibonacci(k - 2) def fibonacci_search(arr: list, val: int) -> int: """A pure Python implementation of a fibonacci search algorithm. Parameters ---------- arr List of sorted elements. val Element to search in list. Returns ------- int The index of the element in the array. -1 if the element is not found. >>> fibonacci_search([4, 5, 6, 7], 4) 0 >>> fibonacci_search([4, 5, 6, 7], -10) -1 >>> fibonacci_search([-18, 2], -18) 0 >>> fibonacci_search([5], 5) 0 >>> fibonacci_search(['a', 'c', 'd'], 'c') 1 >>> fibonacci_search(['a', 'c', 'd'], 'f') -1 >>> fibonacci_search([], 1) -1 >>> fibonacci_search([.1, .4 , 7], .4) 1 >>> fibonacci_search([], 9) -1 >>> fibonacci_search(list(range(100)), 63) 63 >>> fibonacci_search(list(range(100)), 99) 99 >>> fibonacci_search(list(range(-100, 100, 3)), -97) 1 >>> fibonacci_search(list(range(-100, 100, 3)), 0) -1 >>> fibonacci_search(list(range(-100, 100, 5)), 0) 20 >>> fibonacci_search(list(range(-100, 100, 5)), 95) 39 """ len_list = len(arr) # Find m such that F_m >= n where F_i is the i_th fibonacci number. i = 0 while True: if fibonacci(i) >= len_list: fibb_k = i break i += 1 offset = 0 while fibb_k > 0: index_k = min( offset + fibonacci(fibb_k - 1), len_list - 1 ) # Prevent out of range item_k_1 = arr[index_k] if item_k_1 == val: return index_k elif val < item_k_1: fibb_k -= 1 elif val > item_k_1: offset += fibonacci(fibb_k - 1) fibb_k -= 2 return -1 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: searches/hill_climbing.py ================================================ # https://en.wikipedia.org/wiki/Hill_climbing import math class SearchProblem: """ An interface to define search problems. The interface will be illustrated using the example of mathematical function. """ def __init__(self, x: int, y: int, step_size: int, function_to_optimize): """ The constructor of the search problem. x: the x coordinate of the current search state. y: the y coordinate of the current search state. step_size: size of the step to take when looking for neighbors. function_to_optimize: a function to optimize having the signature f(x, y). """ self.x = x self.y = y self.step_size = step_size self.function = function_to_optimize def score(self) -> int: """ Returns the output of the function called with current x and y coordinates. >>> def test_function(x, y): ... return x + y >>> SearchProblem(0, 0, 1, test_function).score() # 0 + 0 = 0 0 >>> SearchProblem(5, 7, 1, test_function).score() # 5 + 7 = 12 12 """ return self.function(self.x, self.y) def get_neighbors(self): """ Returns a list of coordinates of neighbors adjacent to the current coordinates. Neighbors: | 0 | 1 | 2 | | 3 | _ | 4 | | 5 | 6 | 7 | """ step_size = self.step_size return [ SearchProblem(x, y, step_size, self.function) for x, y in ( (self.x - step_size, self.y - step_size), (self.x - step_size, self.y), (self.x - step_size, self.y + step_size), (self.x, self.y - step_size), (self.x, self.y + step_size), (self.x + step_size, self.y - step_size), (self.x + step_size, self.y), (self.x + step_size, self.y + step_size), ) ] def __hash__(self): """ hash the string representation of the current search state. """ return hash(str(self)) def __eq__(self, obj): """ Check if the 2 objects are equal. """ if isinstance(obj, SearchProblem): return hash(str(self)) == hash(str(obj)) return False def __str__(self): """ string representation of the current search state. >>> str(SearchProblem(0, 0, 1, None)) 'x: 0 y: 0' >>> str(SearchProblem(2, 5, 1, None)) 'x: 2 y: 5' """ return f"x: {self.x} y: {self.y}" def hill_climbing( search_prob, find_max: bool = True, max_x: float = math.inf, min_x: float = -math.inf, max_y: float = math.inf, min_y: float = -math.inf, visualization: bool = False, max_iter: int = 10000, ) -> SearchProblem: """ Implementation of the hill climbling algorithm. We start with a given state, find all its neighbors, move towards the neighbor which provides the maximum (or minimum) change. We keep doing this until we are at a state where we do not have any neighbors which can improve the solution. Args: search_prob: The search state at the start. find_max: If True, the algorithm should find the maximum else the minimum. max_x, min_x, max_y, min_y: the maximum and minimum bounds of x and y. visualization: If True, a matplotlib graph is displayed. max_iter: number of times to run the iteration. Returns a search state having the maximum (or minimum) score. """ current_state = search_prob scores = [] # list to store the current score at each iteration iterations = 0 solution_found = False visited = set() while not solution_found and iterations < max_iter: visited.add(current_state) iterations += 1 current_score = current_state.score() scores.append(current_score) neighbors = current_state.get_neighbors() max_change = -math.inf min_change = math.inf next_state = None # to hold the next best neighbor for neighbor in neighbors: if neighbor in visited: continue # do not want to visit the same state again if ( neighbor.x > max_x or neighbor.x < min_x or neighbor.y > max_y or neighbor.y < min_y ): continue # neighbor outside our bounds change = neighbor.score() - current_score if find_max: # finding max # going to direction with greatest ascent if change > max_change and change > 0: max_change = change next_state = neighbor elif change < min_change and change < 0: # finding min # to direction with greatest descent min_change = change next_state = neighbor if next_state is not None: # we found at least one neighbor which improved the current state current_state = next_state else: # since we have no neighbor that improves the solution we stop the search solution_found = True if visualization: from matplotlib import pyplot as plt plt.plot(range(iterations), scores) plt.xlabel("Iterations") plt.ylabel("Function values") plt.show() return current_state if __name__ == "__main__": import doctest doctest.testmod() def test_f1(x, y): return (x**2) + (y**2) # starting the problem with initial coordinates (3, 4) prob = SearchProblem(x=3, y=4, step_size=1, function_to_optimize=test_f1) local_min = hill_climbing(prob, find_max=False) print( "The minimum score for f(x, y) = x^2 + y^2 found via hill climbing: " f"{local_min.score()}" ) # starting the problem with initial coordinates (12, 47) prob = SearchProblem(x=12, y=47, step_size=1, function_to_optimize=test_f1) local_min = hill_climbing( prob, find_max=False, max_x=100, min_x=5, max_y=50, min_y=-5, visualization=True ) print( "The minimum score for f(x, y) = x^2 + y^2 with the domain 100 > x > 5 " f"and 50 > y > - 5 found via hill climbing: {local_min.score()}" ) def test_f2(x, y): return (3 * x**2) - (6 * y) prob = SearchProblem(x=3, y=4, step_size=1, function_to_optimize=test_f1) local_min = hill_climbing(prob, find_max=True) print( "The maximum score for f(x, y) = x^2 + y^2 found via hill climbing: " f"{local_min.score()}" ) ================================================ FILE: searches/interpolation_search.py ================================================ """ This is pure Python implementation of interpolation search algorithm """ def interpolation_search(sorted_collection: list[int], item: int) -> int | None: """ Searches for an item in a sorted collection by interpolation search algorithm. Args: sorted_collection: sorted list of integers item: item value to search Returns: int: The index of the found item, or None if the item is not found. Examples: >>> interpolation_search([1, 2, 3, 4, 5], 2) 1 >>> interpolation_search([1, 2, 3, 4, 5], 4) 3 >>> interpolation_search([1, 2, 3, 4, 5], 6) is None True >>> interpolation_search([], 1) is None True >>> interpolation_search([100], 100) 0 >>> interpolation_search([1, 2, 3, 4, 5], 0) is None True >>> interpolation_search([1, 2, 3, 4, 5], 7) is None True >>> interpolation_search([1, 2, 3, 4, 5], 2) 1 >>> interpolation_search([1, 2, 3, 4, 5], 0) is None True >>> interpolation_search([1, 2, 3, 4, 5], 7) is None True >>> interpolation_search([1, 2, 3, 4, 5], 2) 1 >>> interpolation_search([5, 5, 5, 5, 5], 3) is None True """ left = 0 right = len(sorted_collection) - 1 while left <= right: # avoid divided by 0 during interpolation if sorted_collection[left] == sorted_collection[right]: if sorted_collection[left] == item: return left return None point = left + ((item - sorted_collection[left]) * (right - left)) // ( sorted_collection[right] - sorted_collection[left] ) # out of range check if point < 0 or point >= len(sorted_collection): return None current_item = sorted_collection[point] if current_item == item: return point if point < left: right = left left = point elif point > right: left = right right = point elif item < current_item: right = point - 1 else: left = point + 1 return None def interpolation_search_by_recursion( sorted_collection: list[int], item: int, left: int = 0, right: int | None = None ) -> int | None: """Pure implementation of interpolation search algorithm in Python by recursion Be careful collection must be ascending sorted, otherwise result will be unpredictable First recursion should be started with left=0 and right=(len(sorted_collection)-1) Args: sorted_collection: some sorted collection with comparable items item: item value to search left: left index in collection right: right index in collection Returns: index of item in collection or None if item is not present Examples: >>> interpolation_search_by_recursion([0, 5, 7, 10, 15], 0) 0 >>> interpolation_search_by_recursion([0, 5, 7, 10, 15], 15) 4 >>> interpolation_search_by_recursion([0, 5, 7, 10, 15], 5) 1 >>> interpolation_search_by_recursion([0, 5, 7, 10, 15], 100) is None True >>> interpolation_search_by_recursion([5, 5, 5, 5, 5], 3) is None True """ if right is None: right = len(sorted_collection) - 1 # avoid divided by 0 during interpolation if sorted_collection[left] == sorted_collection[right]: if sorted_collection[left] == item: return left return None point = left + ((item - sorted_collection[left]) * (right - left)) // ( sorted_collection[right] - sorted_collection[left] ) # out of range check if point < 0 or point >= len(sorted_collection): return None if sorted_collection[point] == item: return point if point < left: return interpolation_search_by_recursion(sorted_collection, item, point, left) if point > right: return interpolation_search_by_recursion(sorted_collection, item, right, left) if sorted_collection[point] > item: return interpolation_search_by_recursion( sorted_collection, item, left, point - 1 ) return interpolation_search_by_recursion(sorted_collection, item, point + 1, right) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: searches/jump_search.py ================================================ """ Pure Python implementation of the jump search algorithm. This algorithm iterates through a sorted collection with a step of n^(1/2), until the element compared is bigger than the one searched. It will then perform a linear search until it matches the wanted number. If not found, it returns -1. https://en.wikipedia.org/wiki/Jump_search """ import math from collections.abc import Sequence from typing import Any, Protocol class Comparable(Protocol): def __lt__(self, other: Any, /) -> bool: ... def jump_search[T: Comparable](arr: Sequence[T], item: T) -> int: """ Python implementation of the jump search algorithm. Return the index if the `item` is found, otherwise return -1. Examples: >>> jump_search([0, 1, 2, 3, 4, 5], 3) 3 >>> jump_search([-5, -2, -1], -1) 2 >>> jump_search([0, 5, 10, 20], 8) -1 >>> jump_search([0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610], 55) 10 >>> jump_search(["aa", "bb", "cc", "dd", "ee", "ff"], "ee") 4 """ arr_size = len(arr) block_size = int(math.sqrt(arr_size)) prev = 0 step = block_size while arr[min(step, arr_size) - 1] < item: prev = step step += block_size if prev >= arr_size: return -1 while arr[prev] < item: prev += 1 if prev == min(step, arr_size): return -1 if arr[prev] == item: return prev return -1 if __name__ == "__main__": user_input = input("Enter numbers separated by a comma:\n").strip() array = [int(item) for item in user_input.split(",")] x = int(input("Enter the number to be searched:\n")) res = jump_search(array, x) if res == -1: print("Number not found!") else: print(f"Number {x} is at index {res}") ================================================ FILE: searches/linear_search.py ================================================ """ This is a pure Python implementation of the linear search algorithm. For doctests run following command: python3 -m doctest -v linear_search.py For manual testing run: python3 linear_search.py """ def linear_search(sequence: list, target: int) -> int: """A pure Python implementation of a linear search algorithm :param sequence: a collection with comparable items (sorting is not required for linear search) :param target: item value to search :return: index of found item or -1 if item is not found Examples: >>> linear_search([0, 5, 7, 10, 15], 0) 0 >>> linear_search([0, 5, 7, 10, 15], 15) 4 >>> linear_search([0, 5, 7, 10, 15], 5) 1 >>> linear_search([0, 5, 7, 10, 15], 6) -1 """ for index, item in enumerate(sequence): if item == target: return index return -1 def rec_linear_search(sequence: list, low: int, high: int, target: int) -> int: """ A pure Python implementation of a recursive linear search algorithm :param sequence: a collection with comparable items (as sorted items not required in Linear Search) :param low: Lower bound of the array :param high: Higher bound of the array :param target: The element to be found :return: Index of the key or -1 if key not found Examples: >>> rec_linear_search([0, 30, 500, 100, 700], 0, 4, 0) 0 >>> rec_linear_search([0, 30, 500, 100, 700], 0, 4, 700) 4 >>> rec_linear_search([0, 30, 500, 100, 700], 0, 4, 30) 1 >>> rec_linear_search([0, 30, 500, 100, 700], 0, 4, -6) -1 """ if not (0 <= high < len(sequence) and 0 <= low < len(sequence)): raise Exception("Invalid upper or lower bound!") if high < low: return -1 if sequence[low] == target: return low if sequence[high] == target: return high return rec_linear_search(sequence, low + 1, high - 1, target) if __name__ == "__main__": user_input = input("Enter numbers separated by comma:\n").strip() sequence = [int(item.strip()) for item in user_input.split(",")] target = int(input("Enter a single number to be found in the list:\n").strip()) result = linear_search(sequence, target) if result != -1: print(f"linear_search({sequence}, {target}) = {result}") else: print(f"{target} was not found in {sequence}") ================================================ FILE: searches/median_of_medians.py ================================================ """ A Python implementation of the Median of Medians algorithm to select pivots for quick_select, which is efficient for calculating the value that would appear in the index of a list if it would be sorted, even if it is not already sorted. Search in time complexity O(n) at any rank deterministically https://en.wikipedia.org/wiki/Median_of_medians """ def median_of_five(arr: list) -> int: """ Return the median of the input list :param arr: Array to find median of :return: median of arr >>> median_of_five([2, 4, 5, 7, 899]) 5 >>> median_of_five([5, 7, 899, 54, 32]) 32 >>> median_of_five([5, 4, 3, 2]) 4 >>> median_of_five([3, 5, 7, 10, 2]) 5 """ arr = sorted(arr) return arr[len(arr) // 2] def median_of_medians(arr: list) -> int: """ Return a pivot to partition data on by calculating Median of medians of input data :param arr: The data to be checked (a list) :return: median of medians of input array >>> median_of_medians([2, 4, 5, 7, 899, 54, 32]) 54 >>> median_of_medians([5, 7, 899, 54, 32]) 32 >>> median_of_medians([5, 4, 3, 2]) 4 >>> median_of_medians([3, 5, 7, 10, 2, 12]) 12 """ if len(arr) <= 5: return median_of_five(arr) medians = [] i = 0 while i < len(arr): if (i + 4) <= len(arr): medians.append(median_of_five(arr[i:].copy())) else: medians.append(median_of_five(arr[i : i + 5].copy())) i += 5 return median_of_medians(medians) def quick_select(arr: list, target: int) -> int: """ Two way partition the data into smaller and greater lists, in relationship to the pivot :param arr: The data to be searched (a list) :param target: The rank to be searched :return: element at rank target >>> quick_select([2, 4, 5, 7, 899, 54, 32], 5) 32 >>> quick_select([2, 4, 5, 7, 899, 54, 32], 1) 2 >>> quick_select([5, 4, 3, 2], 2) 3 >>> quick_select([3, 5, 7, 10, 2, 12], 3) 5 """ # Invalid Input if target > len(arr): return -1 # x is the estimated pivot by median of medians algorithm x = median_of_medians(arr) left = [] right = [] check = False for i in range(len(arr)): if arr[i] < x: left.append(arr[i]) elif arr[i] > x: right.append(arr[i]) elif arr[i] == x and not check: check = True else: right.append(arr[i]) rank_x = len(left) + 1 if rank_x == target: answer = x elif rank_x > target: answer = quick_select(left, target) elif rank_x < target: answer = quick_select(right, target - rank_x) return answer print(median_of_five([5, 4, 3, 2])) ================================================ FILE: searches/quick_select.py ================================================ """ A Python implementation of the quick select algorithm, which is efficient for calculating the value that would appear in the index of a list if it would be sorted, even if it is not already sorted https://en.wikipedia.org/wiki/Quickselect """ import random def _partition(data: list, pivot) -> tuple: """ Three way partition the data into smaller, equal and greater lists, in relationship to the pivot :param data: The data to be sorted (a list) :param pivot: The value to partition the data on :return: Three list: smaller, equal and greater """ less, equal, greater = [], [], [] for element in data: if element < pivot: less.append(element) elif element > pivot: greater.append(element) else: equal.append(element) return less, equal, greater def quick_select(items: list, index: int): """ >>> quick_select([2, 4, 5, 7, 899, 54, 32], 5) 54 >>> quick_select([2, 4, 5, 7, 899, 54, 32], 1) 4 >>> quick_select([5, 4, 3, 2], 2) 4 >>> quick_select([3, 5, 7, 10, 2, 12], 3) 7 """ # index = len(items) // 2 when trying to find the median # (value of index when items is sorted) # invalid input if index >= len(items) or index < 0: return None pivot = items[random.randint(0, len(items) - 1)] count = 0 smaller, equal, larger = _partition(items, pivot) count = len(equal) m = len(smaller) # index is the pivot if m <= index < m + count: return pivot # must be in smaller elif m > index: return quick_select(smaller, index) # must be in larger else: return quick_select(larger, index - (m + count)) def median(items: list): """ One common application of Quickselect is finding the median, which is the middle element (or average of the two middle elements) in a sorted dataset. It works efficiently on unsorted lists by partially sorting the data without fully sorting the entire list. >>> median([3, 2, 2, 9, 9]) 3 >>> median([2, 2, 9, 9, 9, 3]) 6.0 """ mid, rem = divmod(len(items), 2) if rem != 0: return quick_select(items=items, index=mid) else: low_mid = quick_select(items=items, index=mid - 1) high_mid = quick_select(items=items, index=mid) return (low_mid + high_mid) / 2 ================================================ FILE: searches/sentinel_linear_search.py ================================================ """ This is pure Python implementation of sentinel linear search algorithm For doctests run following command: python -m doctest -v sentinel_linear_search.py or python3 -m doctest -v sentinel_linear_search.py For manual testing run: python sentinel_linear_search.py """ def sentinel_linear_search(sequence, target): """Pure implementation of sentinel linear search algorithm in Python :param sequence: some sequence with comparable items :param target: item value to search :return: index of found item or None if item is not found Examples: >>> sentinel_linear_search([0, 5, 7, 10, 15], 0) 0 >>> sentinel_linear_search([0, 5, 7, 10, 15], 15) 4 >>> sentinel_linear_search([0, 5, 7, 10, 15], 5) 1 >>> sentinel_linear_search([0, 5, 7, 10, 15], 6) """ sequence.append(target) index = 0 while sequence[index] != target: index += 1 sequence.pop() if index == len(sequence): return None return index if __name__ == "__main__": user_input = input("Enter numbers separated by comma:\n").strip() sequence = [int(item) for item in user_input.split(",")] target_input = input("Enter a single number to be found in the list:\n") target = int(target_input) result = sentinel_linear_search(sequence, target) if result is not None: print(f"{target} found at positions: {result}") else: print("Not found") ================================================ FILE: searches/simple_binary_search.py ================================================ """ Pure Python implementation of a binary search algorithm. For doctests run following command: python3 -m doctest -v simple_binary_search.py For manual testing run: python3 simple_binary_search.py """ from __future__ import annotations def binary_search(a_list: list[int], item: int) -> bool: """ >>> test_list = [0, 1, 2, 8, 13, 17, 19, 32, 42] >>> binary_search(test_list, 3) False >>> binary_search(test_list, 13) True >>> binary_search([4, 4, 5, 6, 7], 4) True >>> binary_search([4, 4, 5, 6, 7], -10) False >>> binary_search([-18, 2], -18) True >>> binary_search([5], 5) True >>> binary_search(['a', 'c', 'd'], 'c') True >>> binary_search(['a', 'c', 'd'], 'f') False >>> binary_search([], 1) False >>> binary_search([-.1, .1 , .8], .1) True >>> binary_search(range(-5000, 5000, 10), 80) True >>> binary_search(range(-5000, 5000, 10), 1255) False >>> binary_search(range(0, 10000, 5), 2) False """ if len(a_list) == 0: return False midpoint = len(a_list) // 2 if a_list[midpoint] == item: return True if item < a_list[midpoint]: return binary_search(a_list[:midpoint], item) else: return binary_search(a_list[midpoint + 1 :], item) if __name__ == "__main__": user_input = input("Enter numbers separated by comma:\n").strip() sequence = [int(item.strip()) for item in user_input.split(",")] target = int(input("Enter the number to be found in the list:\n").strip()) not_str = "" if binary_search(sequence, target) else "not " print(f"{target} was {not_str}found in {sequence}") ================================================ FILE: searches/simulated_annealing.py ================================================ # https://en.wikipedia.org/wiki/Simulated_annealing import math import random from typing import Any from .hill_climbing import SearchProblem def simulated_annealing( search_prob, find_max: bool = True, max_x: float = math.inf, min_x: float = -math.inf, max_y: float = math.inf, min_y: float = -math.inf, visualization: bool = False, start_temperate: float = 100, rate_of_decrease: float = 0.01, threshold_temp: float = 1, ) -> Any: """ Implementation of the simulated annealing algorithm. We start with a given state, find all its neighbors. Pick a random neighbor, if that neighbor improves the solution, we move in that direction, if that neighbor does not improve the solution, we generate a random real number between 0 and 1, if the number is within a certain range (calculated using temperature) we move in that direction, else we pick another neighbor randomly and repeat the process. Args: search_prob: The search state at the start. find_max: If True, the algorithm should find the minimum else the minimum. max_x, min_x, max_y, min_y: the maximum and minimum bounds of x and y. visualization: If True, a matplotlib graph is displayed. start_temperate: the initial temperate of the system when the program starts. rate_of_decrease: the rate at which the temperate decreases in each iteration. threshold_temp: the threshold temperature below which we end the search Returns a search state having the maximum (or minimum) score. """ search_end = False current_state = search_prob current_temp = start_temperate scores = [] iterations = 0 best_state = None while not search_end: current_score = current_state.score() if best_state is None or current_score > best_state.score(): best_state = current_state scores.append(current_score) iterations += 1 next_state = None neighbors = current_state.get_neighbors() while ( next_state is None and neighbors ): # till we do not find a neighbor that we can move to index = random.randint(0, len(neighbors) - 1) # picking a random neighbor picked_neighbor = neighbors.pop(index) change = picked_neighbor.score() - current_score if ( picked_neighbor.x > max_x or picked_neighbor.x < min_x or picked_neighbor.y > max_y or picked_neighbor.y < min_y ): continue # neighbor outside our bounds if not find_max: change = change * -1 # in case we are finding minimum if change > 0: # improves the solution next_state = picked_neighbor else: probability = (math.e) ** ( change / current_temp ) # probability generation function if random.random() < probability: # random number within probability next_state = picked_neighbor current_temp = current_temp - (current_temp * rate_of_decrease) if current_temp < threshold_temp or next_state is None: # temperature below threshold, or could not find a suitable neighbor search_end = True else: current_state = next_state if visualization: from matplotlib import pyplot as plt plt.plot(range(iterations), scores) plt.xlabel("Iterations") plt.ylabel("Function values") plt.show() return best_state if __name__ == "__main__": def test_f1(x, y): return (x**2) + (y**2) # starting the problem with initial coordinates (12, 47) prob = SearchProblem(x=12, y=47, step_size=1, function_to_optimize=test_f1) local_min = simulated_annealing( prob, find_max=False, max_x=100, min_x=5, max_y=50, min_y=-5, visualization=True ) print( "The minimum score for f(x, y) = x^2 + y^2 with the domain 100 > x > 5 " f"and 50 > y > - 5 found via hill climbing: {local_min.score()}" ) # starting the problem with initial coordinates (12, 47) prob = SearchProblem(x=12, y=47, step_size=1, function_to_optimize=test_f1) local_min = simulated_annealing( prob, find_max=True, max_x=100, min_x=5, max_y=50, min_y=-5, visualization=True ) print( "The maximum score for f(x, y) = x^2 + y^2 with the domain 100 > x > 5 " f"and 50 > y > - 5 found via hill climbing: {local_min.score()}" ) def test_f2(x, y): return (3 * x**2) - (6 * y) prob = SearchProblem(x=3, y=4, step_size=1, function_to_optimize=test_f1) local_min = simulated_annealing(prob, find_max=False, visualization=True) print( "The minimum score for f(x, y) = 3*x^2 - 6*y found via hill climbing: " f"{local_min.score()}" ) prob = SearchProblem(x=3, y=4, step_size=1, function_to_optimize=test_f1) local_min = simulated_annealing(prob, find_max=True, visualization=True) print( "The maximum score for f(x, y) = 3*x^2 - 6*y found via hill climbing: " f"{local_min.score()}" ) ================================================ FILE: searches/tabu_search.py ================================================ """ This is pure Python implementation of Tabu search algorithm for a Travelling Salesman Problem, that the distances between the cities are symmetric (the distance between city 'a' and city 'b' is the same between city 'b' and city 'a'). The TSP can be represented into a graph. The cities are represented by nodes and the distance between them is represented by the weight of the ark between the nodes. The .txt file with the graph has the form: node1 node2 distance_between_node1_and_node2 node1 node3 distance_between_node1_and_node3 ... Be careful node1, node2 and the distance between them, must exist only once. This means in the .txt file should not exist: node1 node2 distance_between_node1_and_node2 node2 node1 distance_between_node2_and_node1 For pytests run following command: pytest For manual testing run: python tabu_search.py -f your_file_name.txt -number_of_iterations_of_tabu_search \ -s size_of_tabu_search e.g. python tabu_search.py -f tabudata2.txt -i 4 -s 3 """ import argparse import copy def generate_neighbours(path): """ Pure implementation of generating a dictionary of neighbors and the cost with each neighbor, given a path file that includes a graph. :param path: The path to the .txt file that includes the graph (e.g.tabudata2.txt) :return dict_of_neighbours: Dictionary with key each node and value a list of lists with the neighbors of the node and the cost (distance) for each neighbor. Example of dict_of_neighbours: >>) dict_of_neighbours[a] [[b,20],[c,18],[d,22],[e,26]] This indicates the neighbors of node (city) 'a', which has neighbor the node 'b' with distance 20, the node 'c' with distance 18, the node 'd' with distance 22 and the node 'e' with distance 26. """ dict_of_neighbours = {} with open(path) as f: for line in f: if line.split()[0] not in dict_of_neighbours: _list = [] _list.append([line.split()[1], line.split()[2]]) dict_of_neighbours[line.split()[0]] = _list else: dict_of_neighbours[line.split()[0]].append( [line.split()[1], line.split()[2]] ) if line.split()[1] not in dict_of_neighbours: _list = [] _list.append([line.split()[0], line.split()[2]]) dict_of_neighbours[line.split()[1]] = _list else: dict_of_neighbours[line.split()[1]].append( [line.split()[0], line.split()[2]] ) return dict_of_neighbours def generate_first_solution(path, dict_of_neighbours): """ Pure implementation of generating the first solution for the Tabu search to start, with the redundant resolution strategy. That means that we start from the starting node (e.g. node 'a'), then we go to the city nearest (lowest distance) to this node (let's assume is node 'c'), then we go to the nearest city of the node 'c', etc. till we have visited all cities and return to the starting node. :param path: The path to the .txt file that includes the graph (e.g.tabudata2.txt) :param dict_of_neighbours: Dictionary with key each node and value a list of lists with the neighbors of the node and the cost (distance) for each neighbor. :return first_solution: The solution for the first iteration of Tabu search using the redundant resolution strategy in a list. :return distance_of_first_solution: The total distance that Travelling Salesman will travel, if he follows the path in first_solution. """ with open(path) as f: start_node = f.read(1) end_node = start_node first_solution = [] visiting = start_node distance_of_first_solution = 0 while visiting not in first_solution: minim = 10000 for k in dict_of_neighbours[visiting]: if int(k[1]) < int(minim) and k[0] not in first_solution: minim = k[1] best_node = k[0] first_solution.append(visiting) distance_of_first_solution = distance_of_first_solution + int(minim) visiting = best_node first_solution.append(end_node) position = 0 for k in dict_of_neighbours[first_solution[-2]]: if k[0] == start_node: break position += 1 distance_of_first_solution = ( distance_of_first_solution + int(dict_of_neighbours[first_solution[-2]][position][1]) - 10000 ) return first_solution, distance_of_first_solution def find_neighborhood(solution, dict_of_neighbours): """ Pure implementation of generating the neighborhood (sorted by total distance of each solution from lowest to highest) of a solution with 1-1 exchange method, that means we exchange each node in a solution with each other node and generating a number of solution named neighborhood. :param solution: The solution in which we want to find the neighborhood. :param dict_of_neighbours: Dictionary with key each node and value a list of lists with the neighbors of the node and the cost (distance) for each neighbor. :return neighborhood_of_solution: A list that includes the solutions and the total distance of each solution (in form of list) that are produced with 1-1 exchange from the solution that the method took as an input Example: >>> find_neighborhood(['a', 'c', 'b', 'd', 'e', 'a'], ... {'a': [['b', '20'], ['c', '18'], ['d', '22'], ['e', '26']], ... 'c': [['a', '18'], ['b', '10'], ['d', '23'], ['e', '24']], ... 'b': [['a', '20'], ['c', '10'], ['d', '11'], ['e', '12']], ... 'e': [['a', '26'], ['b', '12'], ['c', '24'], ['d', '40']], ... 'd': [['a', '22'], ['b', '11'], ['c', '23'], ['e', '40']]} ... ) # doctest: +NORMALIZE_WHITESPACE [['a', 'e', 'b', 'd', 'c', 'a', 90], ['a', 'c', 'd', 'b', 'e', 'a', 90], ['a', 'd', 'b', 'c', 'e', 'a', 93], ['a', 'c', 'b', 'e', 'd', 'a', 102], ['a', 'c', 'e', 'd', 'b', 'a', 113], ['a', 'b', 'c', 'd', 'e', 'a', 119]] """ neighborhood_of_solution = [] for n in solution[1:-1]: idx1 = solution.index(n) for kn in solution[1:-1]: idx2 = solution.index(kn) if n == kn: continue _tmp = copy.deepcopy(solution) _tmp[idx1] = kn _tmp[idx2] = n distance = 0 for k in _tmp[:-1]: next_node = _tmp[_tmp.index(k) + 1] for i in dict_of_neighbours[k]: if i[0] == next_node: distance = distance + int(i[1]) _tmp.append(distance) if _tmp not in neighborhood_of_solution: neighborhood_of_solution.append(_tmp) index_of_last_item_in_the_list = len(neighborhood_of_solution[0]) - 1 neighborhood_of_solution.sort(key=lambda x: x[index_of_last_item_in_the_list]) return neighborhood_of_solution def tabu_search( first_solution, distance_of_first_solution, dict_of_neighbours, iters, size ): """ Pure implementation of Tabu search algorithm for a Travelling Salesman Problem in Python. :param first_solution: The solution for the first iteration of Tabu search using the redundant resolution strategy in a list. :param distance_of_first_solution: The total distance that Travelling Salesman will travel, if he follows the path in first_solution. :param dict_of_neighbours: Dictionary with key each node and value a list of lists with the neighbors of the node and the cost (distance) for each neighbor. :param iters: The number of iterations that Tabu search will execute. :param size: The size of Tabu List. :return best_solution_ever: The solution with the lowest distance that occurred during the execution of Tabu search. :return best_cost: The total distance that Travelling Salesman will travel, if he follows the path in best_solution ever. """ count = 1 solution = first_solution tabu_list = [] best_cost = distance_of_first_solution best_solution_ever = solution while count <= iters: neighborhood = find_neighborhood(solution, dict_of_neighbours) index_of_best_solution = 0 best_solution = neighborhood[index_of_best_solution] best_cost_index = len(best_solution) - 1 found = False while not found: i = 0 while i < len(best_solution): if best_solution[i] != solution[i]: first_exchange_node = best_solution[i] second_exchange_node = solution[i] break i = i + 1 if [first_exchange_node, second_exchange_node] not in tabu_list and [ second_exchange_node, first_exchange_node, ] not in tabu_list: tabu_list.append([first_exchange_node, second_exchange_node]) found = True solution = best_solution[:-1] cost = neighborhood[index_of_best_solution][best_cost_index] if cost < best_cost: best_cost = cost best_solution_ever = solution else: index_of_best_solution = index_of_best_solution + 1 best_solution = neighborhood[index_of_best_solution] if len(tabu_list) >= size: tabu_list.pop(0) count = count + 1 return best_solution_ever, best_cost def main(args=None): dict_of_neighbours = generate_neighbours(args.File) first_solution, distance_of_first_solution = generate_first_solution( args.File, dict_of_neighbours ) best_sol, best_cost = tabu_search( first_solution, distance_of_first_solution, dict_of_neighbours, args.Iterations, args.Size, ) print(f"Best solution: {best_sol}, with total distance: {best_cost}.") if __name__ == "__main__": parser = argparse.ArgumentParser(description="Tabu Search") parser.add_argument( "-f", "--File", type=str, help="Path to the file containing the data", required=True, ) parser.add_argument( "-i", "--Iterations", type=int, help="How many iterations the algorithm should perform", required=True, ) parser.add_argument( "-s", "--Size", type=int, help="Size of the tabu list", required=True ) # Pass the arguments to main method main(parser.parse_args()) ================================================ FILE: searches/tabu_test_data.txt ================================================ a b 20 a c 18 a d 22 a e 26 b c 10 b d 11 b e 12 c d 23 c e 24 d e 40 ================================================ FILE: searches/ternary_search.py ================================================ """ This is a type of divide and conquer algorithm which divides the search space into 3 parts and finds the target value based on the property of the array or list (usually monotonic property). Time Complexity : O(log3 N) Space Complexity : O(1) """ from __future__ import annotations # This is the precision for this function which can be altered. # It is recommended for users to keep this number greater than or equal to 10. precision = 10 # This is the linear search that will occur after the search space has become smaller. def lin_search(left: int, right: int, array: list[int], target: int) -> int: """Perform linear search in list. Returns -1 if element is not found. Parameters ---------- left : int left index bound. right : int right index bound. array : List[int] List of elements to be searched on target : int Element that is searched Returns ------- int index of element that is looked for. Examples -------- >>> lin_search(0, 4, [4, 5, 6, 7], 7) 3 >>> lin_search(0, 3, [4, 5, 6, 7], 7) -1 >>> lin_search(0, 2, [-18, 2], -18) 0 >>> lin_search(0, 1, [5], 5) 0 >>> lin_search(0, 3, ['a', 'c', 'd'], 'c') 1 >>> lin_search(0, 3, [.1, .4 , -.1], .1) 0 >>> lin_search(0, 3, [.1, .4 , -.1], -.1) 2 """ for i in range(left, right): if array[i] == target: return i return -1 def ite_ternary_search(array: list[int], target: int) -> int: """Iterative method of the ternary search algorithm. >>> test_list = [0, 1, 2, 8, 13, 17, 19, 32, 42] >>> ite_ternary_search(test_list, 3) -1 >>> ite_ternary_search(test_list, 13) 4 >>> ite_ternary_search([4, 5, 6, 7], 4) 0 >>> ite_ternary_search([4, 5, 6, 7], -10) -1 >>> ite_ternary_search([-18, 2], -18) 0 >>> ite_ternary_search([5], 5) 0 >>> ite_ternary_search(['a', 'c', 'd'], 'c') 1 >>> ite_ternary_search(['a', 'c', 'd'], 'f') -1 >>> ite_ternary_search([], 1) -1 >>> ite_ternary_search([.1, .4 , -.1], .1) 0 """ left = 0 right = len(array) while left <= right: if right - left < precision: return lin_search(left, right, array, target) one_third = (left + right) // 3 + 1 two_third = 2 * (left + right) // 3 + 1 if array[one_third] == target: return one_third elif array[two_third] == target: return two_third elif target < array[one_third]: right = one_third - 1 elif array[two_third] < target: left = two_third + 1 else: left = one_third + 1 right = two_third - 1 return -1 def rec_ternary_search(left: int, right: int, array: list[int], target: int) -> int: """Recursive method of the ternary search algorithm. >>> test_list = [0, 1, 2, 8, 13, 17, 19, 32, 42] >>> rec_ternary_search(0, len(test_list), test_list, 3) -1 >>> rec_ternary_search(4, len(test_list), test_list, 42) 8 >>> rec_ternary_search(0, 2, [4, 5, 6, 7], 4) 0 >>> rec_ternary_search(0, 3, [4, 5, 6, 7], -10) -1 >>> rec_ternary_search(0, 1, [-18, 2], -18) 0 >>> rec_ternary_search(0, 1, [5], 5) 0 >>> rec_ternary_search(0, 2, ['a', 'c', 'd'], 'c') 1 >>> rec_ternary_search(0, 2, ['a', 'c', 'd'], 'f') -1 >>> rec_ternary_search(0, 0, [], 1) -1 >>> rec_ternary_search(0, 3, [.1, .4 , -.1], .1) 0 """ if left < right: if right - left < precision: return lin_search(left, right, array, target) one_third = (left + right) // 3 + 1 two_third = 2 * (left + right) // 3 + 1 if array[one_third] == target: return one_third elif array[two_third] == target: return two_third elif target < array[one_third]: return rec_ternary_search(left, one_third - 1, array, target) elif array[two_third] < target: return rec_ternary_search(two_third + 1, right, array, target) else: return rec_ternary_search(one_third + 1, two_third - 1, array, target) else: return -1 if __name__ == "__main__": import doctest doctest.testmod() user_input = input("Enter numbers separated by comma:\n").strip() collection = [int(item.strip()) for item in user_input.split(",")] assert collection == sorted(collection), f"List must be ordered.\n{collection}." target = int(input("Enter the number to be found in the list:\n").strip()) result1 = ite_ternary_search(collection, target) result2 = rec_ternary_search(0, len(collection) - 1, collection, target) if result2 != -1: print(f"Iterative search: {target} found at positions: {result1}") print(f"Recursive search: {target} found at positions: {result2}") else: print("Not found") ================================================ FILE: sorts/README.md ================================================ # Sorting Algorithms Sorting is the process of putting data in a specific order. The way to arrange data in a specific order is specified by the sorting algorithm. The most typical orders are lexical or numerical. The significance of sorting lies in the fact that, if data is stored in a sorted manner, data searching can be highly optimised. Another use for sorting is to represent data in a more readable manner. This section contains a lot of important algorithms that help us to use sorting algorithms in various scenarios. ## References * * * ================================================ FILE: sorts/__init__.py ================================================ ================================================ FILE: sorts/bead_sort.py ================================================ """ Bead sort only works for sequences of non-negative integers. https://en.wikipedia.org/wiki/Bead_sort """ def bead_sort(sequence: list) -> list: """ >>> bead_sort([6, 11, 12, 4, 1, 5]) [1, 4, 5, 6, 11, 12] >>> bead_sort([9, 8, 7, 6, 5, 4 ,3, 2, 1]) [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> bead_sort([5, 0, 4, 3]) [0, 3, 4, 5] >>> bead_sort([8, 2, 1]) [1, 2, 8] >>> bead_sort([1, .9, 0.0, 0, -1, -.9]) Traceback (most recent call last): ... TypeError: Sequence must be list of non-negative integers >>> bead_sort("Hello world") Traceback (most recent call last): ... TypeError: Sequence must be list of non-negative integers """ if any(not isinstance(x, int) or x < 0 for x in sequence): raise TypeError("Sequence must be list of non-negative integers") for _ in range(len(sequence)): for i, (rod_upper, rod_lower) in enumerate(zip(sequence, sequence[1:])): # noqa: RUF007 if rod_upper > rod_lower: sequence[i] -= rod_upper - rod_lower sequence[i + 1] += rod_upper - rod_lower return sequence if __name__ == "__main__": assert bead_sort([5, 4, 3, 2, 1]) == [1, 2, 3, 4, 5] assert bead_sort([7, 9, 4, 3, 5]) == [3, 4, 5, 7, 9] ================================================ FILE: sorts/binary_insertion_sort.py ================================================ """ This is a pure Python implementation of the binary insertion sort algorithm For doctests run following command: python -m doctest -v binary_insertion_sort.py or python3 -m doctest -v binary_insertion_sort.py For manual testing run: python binary_insertion_sort.py """ def binary_insertion_sort(collection: list) -> list: """ Sorts a list using the binary insertion sort algorithm. :param collection: A mutable ordered collection with comparable items. :return: The same collection ordered in ascending order. Examples: >>> binary_insertion_sort([0, 4, 1234, 4, 1]) [0, 1, 4, 4, 1234] >>> binary_insertion_sort([]) == sorted([]) True >>> binary_insertion_sort([-1, -2, -3]) == sorted([-1, -2, -3]) True >>> lst = ['d', 'a', 'b', 'e', 'c'] >>> binary_insertion_sort(lst) == sorted(lst) True >>> import random >>> collection = random.sample(range(-50, 50), 100) >>> binary_insertion_sort(collection) == sorted(collection) True >>> import string >>> collection = random.choices(string.ascii_letters + string.digits, k=100) >>> binary_insertion_sort(collection) == sorted(collection) True """ n = len(collection) for i in range(1, n): value_to_insert = collection[i] low = 0 high = i - 1 while low <= high: mid = (low + high) // 2 if value_to_insert < collection[mid]: high = mid - 1 else: low = mid + 1 for j in range(i, low, -1): collection[j] = collection[j - 1] collection[low] = value_to_insert return collection if __name__ == "__main__": user_input = input("Enter numbers separated by a comma:\n").strip() try: unsorted = [int(item) for item in user_input.split(",")] except ValueError: print("Invalid input. Please enter valid integers separated by commas.") raise print(f"{binary_insertion_sort(unsorted) = }") ================================================ FILE: sorts/bitonic_sort.py ================================================ """ Python program for Bitonic Sort. Note that this program works only when size of input is a power of 2. """ from __future__ import annotations def comp_and_swap(array: list[int], index1: int, index2: int, direction: int) -> None: """Compare the value at given index1 and index2 of the array and swap them as per the given direction. The parameter direction indicates the sorting direction, ASCENDING(1) or DESCENDING(0); if (a[i] > a[j]) agrees with the direction, then a[i] and a[j] are interchanged. >>> arr = [12, 42, -21, 1] >>> comp_and_swap(arr, 1, 2, 1) >>> arr [12, -21, 42, 1] >>> comp_and_swap(arr, 1, 2, 0) >>> arr [12, 42, -21, 1] >>> comp_and_swap(arr, 0, 3, 1) >>> arr [1, 42, -21, 12] >>> comp_and_swap(arr, 0, 3, 0) >>> arr [12, 42, -21, 1] """ if (direction == 1 and array[index1] > array[index2]) or ( direction == 0 and array[index1] < array[index2] ): array[index1], array[index2] = array[index2], array[index1] def bitonic_merge(array: list[int], low: int, length: int, direction: int) -> None: """ It recursively sorts a bitonic sequence in ascending order, if direction = 1, and in descending if direction = 0. The sequence to be sorted starts at index position low, the parameter length is the number of elements to be sorted. >>> arr = [12, 42, -21, 1] >>> bitonic_merge(arr, 0, 4, 1) >>> arr [-21, 1, 12, 42] >>> bitonic_merge(arr, 0, 4, 0) >>> arr [42, 12, 1, -21] """ if length > 1: middle = int(length / 2) for i in range(low, low + middle): comp_and_swap(array, i, i + middle, direction) bitonic_merge(array, low, middle, direction) bitonic_merge(array, low + middle, middle, direction) def bitonic_sort(array: list[int], low: int, length: int, direction: int) -> None: """ This function first produces a bitonic sequence by recursively sorting its two halves in opposite sorting orders, and then calls bitonic_merge to make them in the same order. >>> arr = [12, 34, 92, -23, 0, -121, -167, 145] >>> bitonic_sort(arr, 0, 8, 1) >>> arr [-167, -121, -23, 0, 12, 34, 92, 145] >>> bitonic_sort(arr, 0, 8, 0) >>> arr [145, 92, 34, 12, 0, -23, -121, -167] """ if length > 1: middle = int(length / 2) bitonic_sort(array, low, middle, 1) bitonic_sort(array, low + middle, middle, 0) bitonic_merge(array, low, length, direction) if __name__ == "__main__": user_input = input("Enter numbers separated by a comma:\n").strip() unsorted = [int(item.strip()) for item in user_input.split(",")] bitonic_sort(unsorted, 0, len(unsorted), 1) print("\nSorted array in ascending order is: ", end="") print(*unsorted, sep=", ") bitonic_merge(unsorted, 0, len(unsorted), 0) print("Sorted array in descending order is: ", end="") print(*unsorted, sep=", ") ================================================ FILE: sorts/bogo_sort.py ================================================ """ This is a pure Python implementation of the bogosort algorithm, also known as permutation sort, stupid sort, slowsort, shotgun sort, or monkey sort. Bogosort generates random permutations until it guesses the correct one. More info on: https://en.wikipedia.org/wiki/Bogosort For doctests run following command: python -m doctest -v bogo_sort.py or python3 -m doctest -v bogo_sort.py For manual testing run: python bogo_sort.py """ import random def bogo_sort(collection: list) -> list: """Pure implementation of the bogosort algorithm in Python :param collection: some mutable ordered collection with heterogeneous comparable items inside :return: the same collection ordered by ascending Examples: >>> bogo_sort([0, 5, 3, 2, 2]) [0, 2, 2, 3, 5] >>> bogo_sort([]) [] >>> bogo_sort([-2, -5, -45]) [-45, -5, -2] """ def is_sorted(collection: list) -> bool: for i in range(len(collection) - 1): if collection[i] > collection[i + 1]: return False return True while not is_sorted(collection): random.shuffle(collection) return collection if __name__ == "__main__": user_input = input("Enter numbers separated by a comma:\n").strip() unsorted = [int(item) for item in user_input.split(",")] print(bogo_sort(unsorted)) ================================================ FILE: sorts/bubble_sort.py ================================================ from typing import Any def bubble_sort_iterative(collection: list[Any]) -> list[Any]: """Pure implementation of bubble sort algorithm in Python :param collection: some mutable ordered collection with heterogeneous comparable items inside :return: the same collection ordered in ascending order Examples: >>> bubble_sort_iterative([0, 5, 2, 3, 2]) [0, 2, 2, 3, 5] >>> bubble_sort_iterative([]) [] >>> bubble_sort_iterative([-2, -45, -5]) [-45, -5, -2] >>> bubble_sort_iterative([-23, 0, 6, -4, 34]) [-23, -4, 0, 6, 34] >>> bubble_sort_iterative([1, 2, 3, 4]) [1, 2, 3, 4] >>> bubble_sort_iterative([3, 3, 3, 3]) [3, 3, 3, 3] >>> bubble_sort_iterative([56]) [56] >>> bubble_sort_iterative([0, 5, 2, 3, 2]) == sorted([0, 5, 2, 3, 2]) True >>> bubble_sort_iterative([]) == sorted([]) True >>> bubble_sort_iterative([-2, -45, -5]) == sorted([-2, -45, -5]) True >>> bubble_sort_iterative([-23, 0, 6, -4, 34]) == sorted([-23, 0, 6, -4, 34]) True >>> bubble_sort_iterative(['d', 'a', 'b', 'e']) == sorted(['d', 'a', 'b', 'e']) True >>> bubble_sort_iterative(['z', 'a', 'y', 'b', 'x', 'c']) ['a', 'b', 'c', 'x', 'y', 'z'] >>> bubble_sort_iterative([1.1, 3.3, 5.5, 7.7, 2.2, 4.4, 6.6]) [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7] >>> bubble_sort_iterative([1, 3.3, 5, 7.7, 2, 4.4, 6]) [1, 2, 3.3, 4.4, 5, 6, 7.7] >>> import random >>> collection_arg = random.sample(range(-50, 50), 100) >>> bubble_sort_iterative(collection_arg) == sorted(collection_arg) True >>> import string >>> collection_arg = random.choices(string.ascii_letters + string.digits, k=100) >>> bubble_sort_iterative(collection_arg) == sorted(collection_arg) True """ length = len(collection) for i in reversed(range(length)): swapped = False for j in range(i): if collection[j] > collection[j + 1]: swapped = True collection[j], collection[j + 1] = collection[j + 1], collection[j] if not swapped: break # Stop iteration if the collection is sorted. return collection def bubble_sort_recursive(collection: list[Any]) -> list[Any]: """It is similar iterative bubble sort but recursive. :param collection: mutable ordered sequence of elements :return: the same list in ascending order Examples: >>> bubble_sort_recursive([0, 5, 2, 3, 2]) [0, 2, 2, 3, 5] >>> bubble_sort_recursive([]) [] >>> bubble_sort_recursive([-2, -45, -5]) [-45, -5, -2] >>> bubble_sort_recursive([-23, 0, 6, -4, 34]) [-23, -4, 0, 6, 34] >>> bubble_sort_recursive([0, 5, 2, 3, 2]) == sorted([0, 5, 2, 3, 2]) True >>> bubble_sort_recursive([]) == sorted([]) True >>> bubble_sort_recursive([-2, -45, -5]) == sorted([-2, -45, -5]) True >>> bubble_sort_recursive([-23, 0, 6, -4, 34]) == sorted([-23, 0, 6, -4, 34]) True >>> bubble_sort_recursive(['d', 'a', 'b', 'e']) == sorted(['d', 'a', 'b', 'e']) True >>> bubble_sort_recursive(['z', 'a', 'y', 'b', 'x', 'c']) ['a', 'b', 'c', 'x', 'y', 'z'] >>> bubble_sort_recursive([1.1, 3.3, 5.5, 7.7, 2.2, 4.4, 6.6]) [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7] >>> bubble_sort_recursive([1, 3.3, 5, 7.7, 2, 4.4, 6]) [1, 2, 3.3, 4.4, 5, 6, 7.7] >>> bubble_sort_recursive(['a', 'Z', 'B', 'C', 'A', 'c']) ['A', 'B', 'C', 'Z', 'a', 'c'] >>> import random >>> collection_arg = random.sample(range(-50, 50), 100) >>> bubble_sort_recursive(collection_arg) == sorted(collection_arg) True >>> import string >>> collection_arg = random.choices(string.ascii_letters + string.digits, k=100) >>> bubble_sort_recursive(collection_arg) == sorted(collection_arg) True """ length = len(collection) swapped = False for i in range(length - 1): if collection[i] > collection[i + 1]: collection[i], collection[i + 1] = collection[i + 1], collection[i] swapped = True return collection if not swapped else bubble_sort_recursive(collection) if __name__ == "__main__": import doctest from random import sample from timeit import timeit doctest.testmod() # Benchmark: Iterative seems slightly faster than recursive. num_runs = 10_000 unsorted = sample(range(-50, 50), 100) timer_iterative = timeit( "bubble_sort_iterative(unsorted[:])", globals=globals(), number=num_runs ) print("\nIterative bubble sort:") print(*bubble_sort_iterative(unsorted), sep=",") print(f"Processing time (iterative): {timer_iterative:.5f}s for {num_runs:,} runs") unsorted = sample(range(-50, 50), 100) timer_recursive = timeit( "bubble_sort_recursive(unsorted[:])", globals=globals(), number=num_runs ) print("\nRecursive bubble sort:") print(*bubble_sort_recursive(unsorted), sep=",") print(f"Processing time (recursive): {timer_recursive:.5f}s for {num_runs:,} runs") ================================================ FILE: sorts/bucket_sort.py ================================================ #!/usr/bin/env python3 """ Illustrate how to implement bucket sort algorithm. Author: OMKAR PATHAK This program will illustrate how to implement bucket sort algorithm Wikipedia says: Bucket sort, or bin sort, is a sorting algorithm that works by distributing the elements of an array into a number of buckets. Each bucket is then sorted individually, either using a different sorting algorithm, or by recursively applying the bucket sorting algorithm. It is a distribution sort, and is a cousin of radix sort in the most to least significant digit flavour. Bucket sort is a generalization of pigeonhole sort. Bucket sort can be implemented with comparisons and therefore can also be considered a comparison sort algorithm. The computational complexity estimates involve the number of buckets. Time Complexity of Solution: Worst case scenario occurs when all the elements are placed in a single bucket. The overall performance would then be dominated by the algorithm used to sort each bucket. In this case, O(n log n), because of TimSort Average Case O(n + (n^2)/k + k), where k is the number of buckets If k = O(n), time complexity is O(n) Source: https://en.wikipedia.org/wiki/Bucket_sort """ from __future__ import annotations def bucket_sort(my_list: list, bucket_count: int = 10) -> list: """ >>> data = [-1, 2, -5, 0] >>> bucket_sort(data) == sorted(data) True >>> data = [9, 8, 7, 6, -12] >>> bucket_sort(data) == sorted(data) True >>> data = [.4, 1.2, .1, .2, -.9] >>> bucket_sort(data) == sorted(data) True >>> bucket_sort([]) == sorted([]) True >>> data = [-1e10, 1e10] >>> bucket_sort(data) == sorted(data) True >>> import random >>> collection = random.sample(range(-50, 50), 50) >>> bucket_sort(collection) == sorted(collection) True >>> data = [1, 2, 2, 1, 1, 3] >>> bucket_sort(data) == sorted(data) True >>> data = [5, 5, 5, 5, 5] >>> bucket_sort(data) == sorted(data) True >>> data = [1000, -1000, 500, -500, 0] >>> bucket_sort(data) == sorted(data) True >>> data = [5.5, 2.2, -1.1, 3.3, 0.0] >>> bucket_sort(data) == sorted(data) True >>> bucket_sort([1]) == [1] True >>> data = [-1.1, -1.5, -3.4, 2.5, 3.6, -3.3] >>> bucket_sort(data) == sorted(data) True >>> data = [9, 2, 7, 1, 5] >>> bucket_sort(data) == sorted(data) True """ if len(my_list) == 0 or bucket_count <= 0: return [] min_value, max_value = min(my_list), max(my_list) if min_value == max_value: return my_list bucket_size = (max_value - min_value) / bucket_count buckets: list[list] = [[] for _ in range(bucket_count)] for val in my_list: index = min(int((val - min_value) / bucket_size), bucket_count - 1) buckets[index].append(val) return [val for bucket in buckets for val in sorted(bucket)] if __name__ == "__main__": from doctest import testmod testmod() assert bucket_sort([4, 5, 3, 2, 1]) == [1, 2, 3, 4, 5] assert bucket_sort([0, 1, -10, 15, 2, -2]) == [-10, -2, 0, 1, 2, 15] assert bucket_sort([1.1, 1.2, -1.2, 0, 2.4]) == [-1.2, 0, 1.1, 1.2, 2.4] assert bucket_sort([5, 5, 5, 5, 5]) == [5, 5, 5, 5, 5] assert bucket_sort([-5, -1, -6, -2]) == [-6, -5, -2, -1] ================================================ FILE: sorts/circle_sort.py ================================================ """ This is a Python implementation of the circle sort algorithm For doctests run following command: python3 -m doctest -v circle_sort.py For manual testing run: python3 circle_sort.py """ def circle_sort(collection: list) -> list: """A pure Python implementation of circle sort algorithm :param collection: a mutable collection of comparable items in any order :return: the same collection in ascending order Examples: >>> circle_sort([0, 5, 3, 2, 2]) [0, 2, 2, 3, 5] >>> circle_sort([]) [] >>> circle_sort([-2, 5, 0, -45]) [-45, -2, 0, 5] >>> collections = ([], [0, 5, 3, 2, 2], [-2, 5, 0, -45]) >>> all(sorted(collection) == circle_sort(collection) for collection in collections) True """ if len(collection) < 2: return collection def circle_sort_util(collection: list, low: int, high: int) -> bool: """ >>> arr = [5,4,3,2,1] >>> circle_sort_util(lst, 0, 2) True >>> arr [3, 4, 5, 2, 1] """ swapped = False if low == high: return swapped left = low right = high while left < right: if collection[left] > collection[right]: collection[left], collection[right] = ( collection[right], collection[left], ) swapped = True left += 1 right -= 1 if left == right and collection[left] > collection[right + 1]: collection[left], collection[right + 1] = ( collection[right + 1], collection[left], ) swapped = True mid = low + int((high - low) / 2) left_swap = circle_sort_util(collection, low, mid) right_swap = circle_sort_util(collection, mid + 1, high) return swapped or left_swap or right_swap is_not_sorted = True while is_not_sorted is True: is_not_sorted = circle_sort_util(collection, 0, len(collection) - 1) return collection if __name__ == "__main__": user_input = input("Enter numbers separated by a comma:\n").strip() unsorted = [int(item) for item in user_input.split(",")] print(circle_sort(unsorted)) ================================================ FILE: sorts/cocktail_shaker_sort.py ================================================ """ An implementation of the cocktail shaker sort algorithm in pure Python. https://en.wikipedia.org/wiki/Cocktail_shaker_sort """ def cocktail_shaker_sort(arr: list[int]) -> list[int]: """ Sorts a list using the Cocktail Shaker Sort algorithm. :param arr: List of elements to be sorted. :return: Sorted list. >>> cocktail_shaker_sort([4, 5, 2, 1, 2]) [1, 2, 2, 4, 5] >>> cocktail_shaker_sort([-4, 5, 0, 1, 2, 11]) [-4, 0, 1, 2, 5, 11] >>> cocktail_shaker_sort([0.1, -2.4, 4.4, 2.2]) [-2.4, 0.1, 2.2, 4.4] >>> cocktail_shaker_sort([1, 2, 3, 4, 5]) [1, 2, 3, 4, 5] >>> cocktail_shaker_sort([-4, -5, -24, -7, -11]) [-24, -11, -7, -5, -4] >>> cocktail_shaker_sort(["elderberry", "banana", "date", "apple", "cherry"]) ['apple', 'banana', 'cherry', 'date', 'elderberry'] >>> cocktail_shaker_sort((-4, -5, -24, -7, -11)) Traceback (most recent call last): ... TypeError: 'tuple' object does not support item assignment """ start, end = 0, len(arr) - 1 while start < end: swapped = False # Pass from left to right for i in range(start, end): if arr[i] > arr[i + 1]: arr[i], arr[i + 1] = arr[i + 1], arr[i] swapped = True if not swapped: break end -= 1 # Decrease the end pointer after each pass # Pass from right to left for i in range(end, start, -1): if arr[i] < arr[i - 1]: arr[i], arr[i - 1] = arr[i - 1], arr[i] swapped = True if not swapped: break start += 1 # Increase the start pointer after each pass return arr if __name__ == "__main__": import doctest doctest.testmod() user_input = input("Enter numbers separated by a comma:\n").strip() unsorted = [int(item) for item in user_input.split(",")] print(f"{cocktail_shaker_sort(unsorted) = }") ================================================ FILE: sorts/comb_sort.py ================================================ """ This is pure Python implementation of comb sort algorithm. Comb sort is a relatively simple sorting algorithm originally designed by Wlodzimierz Dobosiewicz in 1980. It was rediscovered by Stephen Lacey and Richard Box in 1991. Comb sort improves on bubble sort algorithm. In bubble sort, distance (or gap) between two compared elements is always one. Comb sort improvement is that gap can be much more than 1, in order to prevent slowing down by small values at the end of a list. More info on: https://en.wikipedia.org/wiki/Comb_sort For doctests run following command: python -m doctest -v comb_sort.py or python3 -m doctest -v comb_sort.py For manual testing run: python comb_sort.py """ def comb_sort(data: list) -> list: """Pure implementation of comb sort algorithm in Python :param data: mutable collection with comparable items :return: the same collection in ascending order Examples: >>> comb_sort([0, 5, 3, 2, 2]) [0, 2, 2, 3, 5] >>> comb_sort([]) [] >>> comb_sort([99, 45, -7, 8, 2, 0, -15, 3]) [-15, -7, 0, 2, 3, 8, 45, 99] """ shrink_factor = 1.3 gap = len(data) completed = False while not completed: # Update the gap value for a next comb gap = int(gap / shrink_factor) if gap <= 1: completed = True index = 0 while index + gap < len(data): if data[index] > data[index + gap]: # Swap values data[index], data[index + gap] = data[index + gap], data[index] completed = False index += 1 return data if __name__ == "__main__": import doctest doctest.testmod() user_input = input("Enter numbers separated by a comma:\n").strip() unsorted = [int(item) for item in user_input.split(",")] print(comb_sort(unsorted)) ================================================ FILE: sorts/counting_sort.py ================================================ """ This is pure Python implementation of counting sort algorithm For doctests run following command: python -m doctest -v counting_sort.py or python3 -m doctest -v counting_sort.py For manual testing run: python counting_sort.py """ def counting_sort(collection): """Pure implementation of counting sort algorithm in Python :param collection: some mutable ordered collection with heterogeneous comparable items inside :return: the same collection ordered by ascending Examples: >>> counting_sort([0, 5, 3, 2, 2]) [0, 2, 2, 3, 5] >>> counting_sort([]) [] >>> counting_sort([-2, -5, -45]) [-45, -5, -2] """ # if the collection is empty, returns empty if collection == []: return [] # get some information about the collection coll_len = len(collection) coll_max = max(collection) coll_min = min(collection) # create the counting array counting_arr_length = coll_max + 1 - coll_min counting_arr = [0] * counting_arr_length # count how much a number appears in the collection for number in collection: counting_arr[number - coll_min] += 1 # sum each position with it's predecessors. now, counting_arr[i] tells # us how many elements <= i has in the collection for i in range(1, counting_arr_length): counting_arr[i] = counting_arr[i] + counting_arr[i - 1] # create the output collection ordered = [0] * coll_len # place the elements in the output, respecting the original order (stable # sort) from end to begin, updating counting_arr for i in reversed(range(coll_len)): ordered[counting_arr[collection[i] - coll_min] - 1] = collection[i] counting_arr[collection[i] - coll_min] -= 1 return ordered def counting_sort_string(string): """ >>> counting_sort_string("thisisthestring") 'eghhiiinrsssttt' """ return "".join([chr(i) for i in counting_sort([ord(c) for c in string])]) if __name__ == "__main__": # Test string sort assert counting_sort_string("thisisthestring") == "eghhiiinrsssttt" user_input = input("Enter numbers separated by a comma:\n").strip() unsorted = [int(item) for item in user_input.split(",")] print(counting_sort(unsorted)) ================================================ FILE: sorts/cycle_sort.py ================================================ """ Code contributed by Honey Sharma Source: https://en.wikipedia.org/wiki/Cycle_sort """ def cycle_sort(array: list) -> list: """ >>> cycle_sort([4, 3, 2, 1]) [1, 2, 3, 4] >>> cycle_sort([-4, 20, 0, -50, 100, -1]) [-50, -4, -1, 0, 20, 100] >>> cycle_sort([-.1, -.2, 1.3, -.8]) [-0.8, -0.2, -0.1, 1.3] >>> cycle_sort([]) [] """ array_len = len(array) for cycle_start in range(array_len - 1): item = array[cycle_start] pos = cycle_start for i in range(cycle_start + 1, array_len): if array[i] < item: pos += 1 if pos == cycle_start: continue while item == array[pos]: pos += 1 array[pos], item = item, array[pos] while pos != cycle_start: pos = cycle_start for i in range(cycle_start + 1, array_len): if array[i] < item: pos += 1 while item == array[pos]: pos += 1 array[pos], item = item, array[pos] return array if __name__ == "__main__": assert cycle_sort([4, 5, 3, 2, 1]) == [1, 2, 3, 4, 5] assert cycle_sort([0, 1, -10, 15, 2, -2]) == [-10, -2, 0, 1, 2, 15] ================================================ FILE: sorts/cyclic_sort.py ================================================ """ This is a pure Python implementation of the Cyclic Sort algorithm. For doctests run following command: python -m doctest -v cyclic_sort.py or python3 -m doctest -v cyclic_sort.py For manual testing run: python cyclic_sort.py or python3 cyclic_sort.py """ def cyclic_sort(nums: list[int]) -> list[int]: """ Sorts the input list of n integers from 1 to n in-place using the Cyclic Sort algorithm. :param nums: List of n integers from 1 to n to be sorted. :return: The same list sorted in ascending order. Time complexity: O(n), where n is the number of integers in the list. Examples: >>> cyclic_sort([]) [] >>> cyclic_sort([3, 5, 2, 1, 4]) [1, 2, 3, 4, 5] """ # Perform cyclic sort index = 0 while index < len(nums): # Calculate the correct index for the current element correct_index = nums[index] - 1 # If the current element is not at its correct position, # swap it with the element at its correct index if index != correct_index: nums[index], nums[correct_index] = nums[correct_index], nums[index] else: # If the current element is already in its correct position, # move to the next element index += 1 return nums if __name__ == "__main__": import doctest doctest.testmod() user_input = input("Enter numbers separated by a comma:\n").strip() unsorted = [int(item) for item in user_input.split(",")] print(*cyclic_sort(unsorted), sep=",") ================================================ FILE: sorts/double_sort.py ================================================ from typing import Any def double_sort(collection: list[Any]) -> list[Any]: """This sorting algorithm sorts an array using the principle of bubble sort, but does it both from left to right and right to left. Hence, it's called "Double sort" :param collection: mutable ordered sequence of elements :return: the same collection in ascending order Examples: >>> double_sort([-1 ,-2 ,-3 ,-4 ,-5 ,-6 ,-7]) [-7, -6, -5, -4, -3, -2, -1] >>> double_sort([]) [] >>> double_sort([-1 ,-2 ,-3 ,-4 ,-5 ,-6]) [-6, -5, -4, -3, -2, -1] >>> double_sort([-3, 10, 16, -42, 29]) == sorted([-3, 10, 16, -42, 29]) True """ no_of_elements = len(collection) for _ in range( int(((no_of_elements - 1) / 2) + 1) ): # we don't need to traverse to end of list as for j in range(no_of_elements - 1): # apply the bubble sort algorithm from left to right (or forwards) if collection[j + 1] < collection[j]: collection[j], collection[j + 1] = collection[j + 1], collection[j] # apply the bubble sort algorithm from right to left (or backwards) if collection[no_of_elements - 1 - j] < collection[no_of_elements - 2 - j]: ( collection[no_of_elements - 1 - j], collection[no_of_elements - 2 - j], ) = ( collection[no_of_elements - 2 - j], collection[no_of_elements - 1 - j], ) return collection if __name__ == "__main__": # allow the user to input the elements of the list on one line unsorted = [int(x) for x in input("Enter the list to be sorted: ").split() if x] print("the sorted list is") print(f"{double_sort(unsorted) = }") ================================================ FILE: sorts/dutch_national_flag_sort.py ================================================ """ A pure implementation of Dutch national flag (DNF) sort algorithm in Python. Dutch National Flag algorithm is an algorithm originally designed by Edsger Dijkstra. It is the most optimal sort for 3 unique values (eg. 0, 1, 2) in a sequence. DNF can sort a sequence of n size with [0 <= a[i] <= 2] at guaranteed O(n) complexity in a single pass. The flag of the Netherlands consists of three colors: white, red, and blue. The task is to randomly arrange balls of white, red, and blue in such a way that balls of the same color are placed together. DNF sorts a sequence of 0, 1, and 2's in linear time that does not consume any extra space. This algorithm can be implemented only on a sequence that contains three unique elements. 1) Time complexity is O(n). 2) Space complexity is O(1). More info on: https://en.wikipedia.org/wiki/Dutch_national_flag_problem For doctests run following command: python3 -m doctest -v dutch_national_flag_sort.py For manual testing run: python dnf_sort.py """ # Python program to sort a sequence containing only 0, 1 and 2 in a single pass. red = 0 # The first color of the flag. white = 1 # The second color of the flag. blue = 2 # The third color of the flag. colors = (red, white, blue) def dutch_national_flag_sort(sequence: list) -> list: """ A pure Python implementation of Dutch National Flag sort algorithm. :param data: 3 unique integer values (e.g., 0, 1, 2) in an sequence :return: The same collection in ascending order >>> dutch_national_flag_sort([]) [] >>> dutch_national_flag_sort([0]) [0] >>> dutch_national_flag_sort([2, 1, 0, 0, 1, 2]) [0, 0, 1, 1, 2, 2] >>> dutch_national_flag_sort([0, 1, 1, 0, 1, 2, 1, 2, 0, 0, 0, 1]) [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2] >>> dutch_national_flag_sort("abacab") Traceback (most recent call last): ... ValueError: The elements inside the sequence must contains only (0, 1, 2) values >>> dutch_national_flag_sort("Abacab") Traceback (most recent call last): ... ValueError: The elements inside the sequence must contains only (0, 1, 2) values >>> dutch_national_flag_sort([3, 2, 3, 1, 3, 0, 3]) Traceback (most recent call last): ... ValueError: The elements inside the sequence must contains only (0, 1, 2) values >>> dutch_national_flag_sort([-1, 2, -1, 1, -1, 0, -1]) Traceback (most recent call last): ... ValueError: The elements inside the sequence must contains only (0, 1, 2) values >>> dutch_national_flag_sort([1.1, 2, 1.1, 1, 1.1, 0, 1.1]) Traceback (most recent call last): ... ValueError: The elements inside the sequence must contains only (0, 1, 2) values """ if not sequence: return [] if len(sequence) == 1: return list(sequence) low = 0 high = len(sequence) - 1 mid = 0 while mid <= high: if sequence[mid] == colors[0]: sequence[low], sequence[mid] = sequence[mid], sequence[low] low += 1 mid += 1 elif sequence[mid] == colors[1]: mid += 1 elif sequence[mid] == colors[2]: sequence[mid], sequence[high] = sequence[high], sequence[mid] high -= 1 else: msg = f"The elements inside the sequence must contains only {colors} values" raise ValueError(msg) return sequence if __name__ == "__main__": import doctest doctest.testmod() user_input = input("Enter numbers separated by commas:\n").strip() unsorted = [int(item.strip()) for item in user_input.split(",")] print(f"{dutch_national_flag_sort(unsorted)}") ================================================ FILE: sorts/exchange_sort.py ================================================ def exchange_sort(numbers: list[int]) -> list[int]: """ Uses exchange sort to sort a list of numbers. Source: https://en.wikipedia.org/wiki/Sorting_algorithm#Exchange_sort >>> exchange_sort([5, 4, 3, 2, 1]) [1, 2, 3, 4, 5] >>> exchange_sort([-1, -2, -3]) [-3, -2, -1] >>> exchange_sort([1, 2, 3, 4, 5]) [1, 2, 3, 4, 5] >>> exchange_sort([0, 10, -2, 5, 3]) [-2, 0, 3, 5, 10] >>> exchange_sort([]) [] """ numbers_length = len(numbers) for i in range(numbers_length): for j in range(i + 1, numbers_length): if numbers[j] < numbers[i]: numbers[i], numbers[j] = numbers[j], numbers[i] return numbers if __name__ == "__main__": user_input = input("Enter numbers separated by a comma:\n").strip() unsorted = [int(item) for item in user_input.split(",")] print(exchange_sort(unsorted)) ================================================ FILE: sorts/external_sort.py ================================================ #!/usr/bin/env python # # Sort large text files in a minimum amount of memory # import argparse import os class FileSplitter: BLOCK_FILENAME_FORMAT = "block_{0}.dat" def __init__(self, filename): self.filename = filename self.block_filenames = [] def write_block(self, data, block_number): filename = self.BLOCK_FILENAME_FORMAT.format(block_number) with open(filename, "w") as file: file.write(data) self.block_filenames.append(filename) def get_block_filenames(self): return self.block_filenames def split(self, block_size, sort_key=None): i = 0 with open(self.filename) as file: while True: lines = file.readlines(block_size) if lines == []: break if sort_key is None: lines.sort() else: lines.sort(key=sort_key) self.write_block("".join(lines), i) i += 1 def cleanup(self): map(os.remove, self.block_filenames) class NWayMerge: def select(self, choices): min_index = -1 min_str = None for i in range(len(choices)): if min_str is None or choices[i] < min_str: min_index = i return min_index class FilesArray: def __init__(self, files): self.files = files self.empty = set() self.num_buffers = len(files) self.buffers = dict.fromkeys(range(self.num_buffers)) def get_dict(self): return { i: self.buffers[i] for i in range(self.num_buffers) if i not in self.empty } def refresh(self): for i in range(self.num_buffers): if self.buffers[i] is None and i not in self.empty: self.buffers[i] = self.files[i].readline() if self.buffers[i] == "": self.empty.add(i) self.files[i].close() return len(self.empty) != self.num_buffers def unshift(self, index): value = self.buffers[index] self.buffers[index] = None return value class FileMerger: def __init__(self, merge_strategy): self.merge_strategy = merge_strategy def merge(self, filenames, outfilename, buffer_size): buffers = FilesArray(self.get_file_handles(filenames, buffer_size)) with open(outfilename, "w", buffer_size) as outfile: while buffers.refresh(): min_index = self.merge_strategy.select(buffers.get_dict()) outfile.write(buffers.unshift(min_index)) def get_file_handles(self, filenames, buffer_size): files = {} for i in range(len(filenames)): files[i] = open(filenames[i], "r", buffer_size) # noqa: UP015 return files class ExternalSort: def __init__(self, block_size): self.block_size = block_size def sort(self, filename, sort_key=None): num_blocks = self.get_number_blocks(filename, self.block_size) splitter = FileSplitter(filename) splitter.split(self.block_size, sort_key) merger = FileMerger(NWayMerge()) buffer_size = self.block_size / (num_blocks + 1) merger.merge(splitter.get_block_filenames(), filename + ".out", buffer_size) splitter.cleanup() def get_number_blocks(self, filename, block_size): return (os.stat(filename).st_size / block_size) + 1 def parse_memory(string): if string[-1].lower() == "k": return int(string[:-1]) * 1024 elif string[-1].lower() == "m": return int(string[:-1]) * 1024 * 1024 elif string[-1].lower() == "g": return int(string[:-1]) * 1024 * 1024 * 1024 else: return int(string) def main(): parser = argparse.ArgumentParser() parser.add_argument( "-m", "--mem", help="amount of memory to use for sorting", default="100M" ) parser.add_argument( "filename", metavar="", nargs=1, help="name of file to sort" ) args = parser.parse_args() sorter = ExternalSort(parse_memory(args.mem)) sorter.sort(args.filename[0]) if __name__ == "__main__": main() ================================================ FILE: sorts/gnome_sort.py ================================================ """ Gnome Sort Algorithm (A.K.A. Stupid Sort) This algorithm iterates over a list comparing an element with the previous one. If order is not respected, it swaps element backward until order is respected with previous element. It resumes the initial iteration from element new position. For doctests run following command: python3 -m doctest -v gnome_sort.py For manual testing run: python3 gnome_sort.py """ def gnome_sort(lst: list) -> list: """ Pure implementation of the gnome sort algorithm in Python Take some mutable ordered collection with heterogeneous comparable items inside as arguments, return the same collection ordered by ascending. Examples: >>> gnome_sort([0, 5, 3, 2, 2]) [0, 2, 2, 3, 5] >>> gnome_sort([]) [] >>> gnome_sort([-2, -5, -45]) [-45, -5, -2] >>> "".join(gnome_sort(list(set("Gnomes are stupid!")))) ' !Gadeimnoprstu' """ if len(lst) <= 1: return lst i = 1 while i < len(lst): if lst[i - 1] <= lst[i]: i += 1 else: lst[i - 1], lst[i] = lst[i], lst[i - 1] i -= 1 if i == 0: i = 1 return lst if __name__ == "__main__": user_input = input("Enter numbers separated by a comma:\n").strip() unsorted = [int(item) for item in user_input.split(",")] print(gnome_sort(unsorted)) ================================================ FILE: sorts/heap_sort.py ================================================ """ A pure Python implementation of the heap sort algorithm. """ def heapify(unsorted: list[int], index: int, heap_size: int) -> None: """ :param unsorted: unsorted list containing integers numbers :param index: index :param heap_size: size of the heap :return: None >>> unsorted = [1, 4, 3, 5, 2] >>> heapify(unsorted, 0, len(unsorted)) >>> unsorted [4, 5, 3, 1, 2] >>> heapify(unsorted, 0, len(unsorted)) >>> unsorted [5, 4, 3, 1, 2] """ largest = index left_index = 2 * index + 1 right_index = 2 * index + 2 if left_index < heap_size and unsorted[left_index] > unsorted[largest]: largest = left_index if right_index < heap_size and unsorted[right_index] > unsorted[largest]: largest = right_index if largest != index: unsorted[largest], unsorted[index] = (unsorted[index], unsorted[largest]) heapify(unsorted, largest, heap_size) def heap_sort(unsorted: list[int]) -> list[int]: """ A pure Python implementation of the heap sort algorithm :param collection: a mutable ordered collection of heterogeneous comparable items :return: the same collection ordered by ascending Examples: >>> heap_sort([0, 5, 3, 2, 2]) [0, 2, 2, 3, 5] >>> heap_sort([]) [] >>> heap_sort([-2, -5, -45]) [-45, -5, -2] >>> heap_sort([3, 7, 9, 28, 123, -5, 8, -30, -200, 0, 4]) [-200, -30, -5, 0, 3, 4, 7, 8, 9, 28, 123] """ n = len(unsorted) for i in range(n // 2 - 1, -1, -1): heapify(unsorted, i, n) for i in range(n - 1, 0, -1): unsorted[0], unsorted[i] = unsorted[i], unsorted[0] heapify(unsorted, 0, i) return unsorted if __name__ == "__main__": import doctest doctest.testmod() user_input = input("Enter numbers separated by a comma:\n").strip() if user_input: unsorted = [int(item) for item in user_input.split(",")] print(f"{heap_sort(unsorted) = }") ================================================ FILE: sorts/insertion_sort.py ================================================ """ A pure Python implementation of the insertion sort algorithm This algorithm sorts a collection by comparing adjacent elements. When it finds that order is not respected, it moves the element compared backward until the order is correct. It then goes back directly to the element's initial position resuming forward comparison. For doctests run following command: python3 -m doctest -v insertion_sort.py For manual testing run: python3 insertion_sort.py """ from collections.abc import MutableSequence from typing import Any, Protocol, TypeVar class Comparable(Protocol): def __lt__(self, other: Any, /) -> bool: ... T = TypeVar("T", bound=Comparable) def insertion_sort[T: Comparable](collection: MutableSequence[T]) -> MutableSequence[T]: """A pure Python implementation of the insertion sort algorithm :param collection: some mutable ordered collection with heterogeneous comparable items inside :return: the same collection ordered by ascending Examples: >>> insertion_sort([0, 5, 3, 2, 2]) [0, 2, 2, 3, 5] >>> insertion_sort([]) == sorted([]) True >>> insertion_sort([-2, -5, -45]) == sorted([-2, -5, -45]) True >>> insertion_sort(['d', 'a', 'b', 'e', 'c']) == sorted(['d', 'a', 'b', 'e', 'c']) True >>> import random >>> collection = random.sample(range(-50, 50), 100) >>> insertion_sort(collection) == sorted(collection) True >>> import string >>> collection = random.choices(string.ascii_letters + string.digits, k=100) >>> insertion_sort(collection) == sorted(collection) True """ for insert_index in range(1, len(collection)): insert_value = collection[insert_index] while insert_index > 0 and insert_value < collection[insert_index - 1]: collection[insert_index] = collection[insert_index - 1] insert_index -= 1 collection[insert_index] = insert_value return collection if __name__ == "__main__": from doctest import testmod testmod() user_input = input("Enter numbers separated by a comma:\n").strip() unsorted = [int(item) for item in user_input.split(",")] print(f"{insertion_sort(unsorted) = }") ================================================ FILE: sorts/intro_sort.py ================================================ """ Introspective Sort is a hybrid sort (Quick Sort + Heap Sort + Insertion Sort) if the size of the list is under 16, use insertion sort https://en.wikipedia.org/wiki/Introsort """ import math def insertion_sort(array: list, start: int = 0, end: int = 0) -> list: """ >>> array = [4, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12] >>> insertion_sort(array, 0, len(array)) [1, 2, 4, 6, 7, 8, 8, 12, 14, 14, 22, 23, 27, 45, 56, 79] >>> array = [21, 15, 11, 45, -2, -11, 46] >>> insertion_sort(array, 0, len(array)) [-11, -2, 11, 15, 21, 45, 46] >>> array = [-2, 0, 89, 11, 48, 79, 12] >>> insertion_sort(array, 0, len(array)) [-2, 0, 11, 12, 48, 79, 89] >>> array = ['a', 'z', 'd', 'p', 'v', 'l', 'o', 'o'] >>> insertion_sort(array, 0, len(array)) ['a', 'd', 'l', 'o', 'o', 'p', 'v', 'z'] >>> array = [73.568, 73.56, -45.03, 1.7, 0, 89.45] >>> insertion_sort(array, 0, len(array)) [-45.03, 0, 1.7, 73.56, 73.568, 89.45] """ end = end or len(array) for i in range(start, end): temp_index = i temp_index_value = array[i] while temp_index != start and temp_index_value < array[temp_index - 1]: array[temp_index] = array[temp_index - 1] temp_index -= 1 array[temp_index] = temp_index_value return array def heapify(array: list, index: int, heap_size: int) -> None: # Max Heap """ >>> array = [4, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12] >>> heapify(array, len(array) // 2, len(array)) """ largest = index left_index = 2 * index + 1 # Left Node right_index = 2 * index + 2 # Right Node if left_index < heap_size and array[largest] < array[left_index]: largest = left_index if right_index < heap_size and array[largest] < array[right_index]: largest = right_index if largest != index: array[index], array[largest] = array[largest], array[index] heapify(array, largest, heap_size) def heap_sort(array: list) -> list: """ >>> heap_sort([4, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12]) [1, 2, 4, 6, 7, 8, 8, 12, 14, 14, 22, 23, 27, 45, 56, 79] >>> heap_sort([-2, -11, 0, 0, 0, 87, 45, -69, 78, 12, 10, 103, 89, 52]) [-69, -11, -2, 0, 0, 0, 10, 12, 45, 52, 78, 87, 89, 103] >>> heap_sort(['b', 'd', 'e', 'f', 'g', 'p', 'x', 'z', 'b', 's', 'e', 'u', 'v']) ['b', 'b', 'd', 'e', 'e', 'f', 'g', 'p', 's', 'u', 'v', 'x', 'z'] >>> heap_sort([6.2, -45.54, 8465.20, 758.56, -457.0, 0, 1, 2.879, 1.7, 11.7]) [-457.0, -45.54, 0, 1, 1.7, 2.879, 6.2, 11.7, 758.56, 8465.2] """ n = len(array) for i in range(n // 2, -1, -1): heapify(array, i, n) for i in range(n - 1, 0, -1): array[i], array[0] = array[0], array[i] heapify(array, 0, i) return array def median_of_3( array: list, first_index: int, middle_index: int, last_index: int ) -> int: """ >>> array = [4, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12] >>> median_of_3(array, 0, ((len(array) - 0) // 2) + 1, len(array) - 1) 12 >>> array = [13, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12] >>> median_of_3(array, 0, ((len(array) - 0) // 2) + 1, len(array) - 1) 13 >>> array = [4, 2, 6, 8, 1, 7, 8, 22, 15, 14, 27, 79, 23, 45, 14, 16] >>> median_of_3(array, 0, ((len(array) - 0) // 2) + 1, len(array) - 1) 14 """ if (array[first_index] > array[middle_index]) != ( array[first_index] > array[last_index] ): return array[first_index] elif (array[middle_index] > array[first_index]) != ( array[middle_index] > array[last_index] ): return array[middle_index] else: return array[last_index] def partition(array: list, low: int, high: int, pivot: int) -> int: """ >>> array = [4, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12] >>> partition(array, 0, len(array), 12) 8 >>> array = [21, 15, 11, 45, -2, -11, 46] >>> partition(array, 0, len(array), 15) 3 >>> array = ['a', 'z', 'd', 'p', 'v', 'l', 'o', 'o'] >>> partition(array, 0, len(array), 'p') 5 >>> array = [6.2, -45.54, 8465.20, 758.56, -457.0, 0, 1, 2.879, 1.7, 11.7] >>> partition(array, 0, len(array), 2.879) 6 """ i = low j = high while True: while array[i] < pivot: i += 1 j -= 1 while pivot < array[j]: j -= 1 if i >= j: return i array[i], array[j] = array[j], array[i] i += 1 def sort(array: list) -> list: """ :param collection: some mutable ordered collection with heterogeneous comparable items inside :return: the same collection ordered by ascending Examples: >>> sort([4, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12]) [1, 2, 4, 6, 7, 8, 8, 12, 14, 14, 22, 23, 27, 45, 56, 79] >>> sort([-1, -5, -3, -13, -44]) [-44, -13, -5, -3, -1] >>> sort([]) [] >>> sort([5]) [5] >>> sort([-3, 0, -7, 6, 23, -34]) [-34, -7, -3, 0, 6, 23] >>> sort([1.7, 1.0, 3.3, 2.1, 0.3 ]) [0.3, 1.0, 1.7, 2.1, 3.3] >>> sort(['d', 'a', 'b', 'e', 'c']) ['a', 'b', 'c', 'd', 'e'] """ if len(array) == 0: return array max_depth = 2 * math.ceil(math.log2(len(array))) size_threshold = 16 return intro_sort(array, 0, len(array), size_threshold, max_depth) def intro_sort( array: list, start: int, end: int, size_threshold: int, max_depth: int ) -> list: """ >>> array = [4, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12] >>> max_depth = 2 * math.ceil(math.log2(len(array))) >>> intro_sort(array, 0, len(array), 16, max_depth) [1, 2, 4, 6, 7, 8, 8, 12, 14, 14, 22, 23, 27, 45, 56, 79] """ while end - start > size_threshold: if max_depth == 0: return heap_sort(array) max_depth -= 1 pivot = median_of_3(array, start, start + ((end - start) // 2) + 1, end - 1) p = partition(array, start, end, pivot) intro_sort(array, p, end, size_threshold, max_depth) end = p return insertion_sort(array, start, end) if __name__ == "__main__": import doctest doctest.testmod() user_input = input("Enter numbers separated by a comma : ").strip() unsorted = [float(item) for item in user_input.split(",")] print(f"{sort(unsorted) = }") ================================================ FILE: sorts/iterative_merge_sort.py ================================================ """ Implementation of iterative merge sort in Python Author: Aman Gupta For doctests run following command: python3 -m doctest -v iterative_merge_sort.py For manual testing run: python3 iterative_merge_sort.py """ from __future__ import annotations def merge(input_list: list, low: int, mid: int, high: int) -> list: """ sorting left-half and right-half individually then merging them into result """ result = [] left, right = input_list[low:mid], input_list[mid : high + 1] while left and right: result.append((left if left[0] <= right[0] else right).pop(0)) input_list[low : high + 1] = result + left + right return input_list # iteration over the unsorted list def iter_merge_sort(input_list: list) -> list: """ Return a sorted copy of the input list >>> iter_merge_sort([5, 9, 8, 7, 1, 2, 7]) [1, 2, 5, 7, 7, 8, 9] >>> iter_merge_sort([1]) [1] >>> iter_merge_sort([2, 1]) [1, 2] >>> iter_merge_sort([2, 1, 3]) [1, 2, 3] >>> iter_merge_sort([4, 3, 2, 1]) [1, 2, 3, 4] >>> iter_merge_sort([5, 4, 3, 2, 1]) [1, 2, 3, 4, 5] >>> iter_merge_sort(['c', 'b', 'a']) ['a', 'b', 'c'] >>> iter_merge_sort([0.3, 0.2, 0.1]) [0.1, 0.2, 0.3] >>> iter_merge_sort(['dep', 'dang', 'trai']) ['dang', 'dep', 'trai'] >>> iter_merge_sort([6]) [6] >>> iter_merge_sort([]) [] >>> iter_merge_sort([-2, -9, -1, -4]) [-9, -4, -2, -1] >>> iter_merge_sort([1.1, 1, 0.0, -1, -1.1]) [-1.1, -1, 0.0, 1, 1.1] >>> iter_merge_sort(['c', 'b', 'a']) ['a', 'b', 'c'] >>> iter_merge_sort('cba') ['a', 'b', 'c'] """ if len(input_list) <= 1: return input_list input_list = list(input_list) # iteration for two-way merging p = 2 while p <= len(input_list): # getting low, high and middle value for merge-sort of single list for i in range(0, len(input_list), p): low = i high = i + p - 1 mid = (low + high + 1) // 2 input_list = merge(input_list, low, mid, high) # final merge of last two parts if p * 2 >= len(input_list): mid = i input_list = merge(input_list, 0, mid, len(input_list) - 1) break p *= 2 return input_list if __name__ == "__main__": user_input = input("Enter numbers separated by a comma:\n").strip() if user_input == "": unsorted = [] else: unsorted = [int(item.strip()) for item in user_input.split(",")] print(iter_merge_sort(unsorted)) ================================================ FILE: sorts/merge_insertion_sort.py ================================================ """ This is a pure Python implementation of the merge-insertion sort algorithm Source: https://en.wikipedia.org/wiki/Merge-insertion_sort For doctests run following command: python3 -m doctest -v merge_insertion_sort.py or python -m doctest -v merge_insertion_sort.py For manual testing run: python3 merge_insertion_sort.py """ from __future__ import annotations def binary_search_insertion(sorted_list, item): """ >>> binary_search_insertion([1, 2, 7, 9, 10], 4) [1, 2, 4, 7, 9, 10] """ left = 0 right = len(sorted_list) - 1 while left <= right: middle = (left + right) // 2 if left == right: if sorted_list[middle] < item: left = middle + 1 break elif sorted_list[middle] < item: left = middle + 1 else: right = middle - 1 sorted_list.insert(left, item) return sorted_list def merge(left, right): """ >>> merge([[1, 6], [9, 10]], [[2, 3], [4, 5], [7, 8]]) [[1, 6], [2, 3], [4, 5], [7, 8], [9, 10]] """ result = [] while left and right: if left[0][0] < right[0][0]: result.append(left.pop(0)) else: result.append(right.pop(0)) return result + left + right def sortlist_2d(list_2d): """ >>> sortlist_2d([[9, 10], [1, 6], [7, 8], [2, 3], [4, 5]]) [[1, 6], [2, 3], [4, 5], [7, 8], [9, 10]] """ length = len(list_2d) if length <= 1: return list_2d middle = length // 2 return merge(sortlist_2d(list_2d[:middle]), sortlist_2d(list_2d[middle:])) def merge_insertion_sort(collection: list[int]) -> list[int]: """Pure implementation of merge-insertion sort algorithm in Python :param collection: some mutable ordered collection with heterogeneous comparable items inside :return: the same collection ordered by ascending Examples: >>> merge_insertion_sort([0, 5, 3, 2, 2]) [0, 2, 2, 3, 5] >>> merge_insertion_sort([99]) [99] >>> merge_insertion_sort([-2, -5, -45]) [-45, -5, -2] Testing with all permutations on range(0,5): >>> import itertools >>> permutations = list(itertools.permutations([0, 1, 2, 3, 4])) >>> all(merge_insertion_sort(p) == [0, 1, 2, 3, 4] for p in permutations) True """ if len(collection) <= 1: return collection """ Group the items into two pairs, and leave one element if there is a last odd item. Example: [999, 100, 75, 40, 10000] -> [999, 100], [75, 40]. Leave 10000. """ two_paired_list = [] has_last_odd_item = False for i in range(0, len(collection), 2): if i == len(collection) - 1: has_last_odd_item = True else: """ Sort two-pairs in each groups. Example: [999, 100], [75, 40] -> [100, 999], [40, 75] """ if collection[i] < collection[i + 1]: two_paired_list.append([collection[i], collection[i + 1]]) else: two_paired_list.append([collection[i + 1], collection[i]]) """ Sort two_paired_list. Example: [100, 999], [40, 75] -> [40, 75], [100, 999] """ sorted_list_2d = sortlist_2d(two_paired_list) """ 40 < 100 is sure because it has already been sorted. Generate the sorted_list of them so that you can avoid unnecessary comparison. Example: group0 group1 40 100 75 999 -> group0 group1 [40, 100] 75 999 """ result = [i[0] for i in sorted_list_2d] """ 100 < 999 is sure because it has already been sorted. Put 999 in last of the sorted_list so that you can avoid unnecessary comparison. Example: group0 group1 [40, 100] 75 999 -> group0 group1 [40, 100, 999] 75 """ result.append(sorted_list_2d[-1][1]) """ Insert the last odd item left if there is. Example: group0 group1 [40, 100, 999] 75 -> group0 group1 [40, 100, 999, 10000] 75 """ if has_last_odd_item: pivot = collection[-1] result = binary_search_insertion(result, pivot) """ Insert the remaining items. In this case, 40 < 75 is sure because it has already been sorted. Therefore, you only need to insert 75 into [100, 999, 10000], so that you can avoid unnecessary comparison. Example: group0 group1 [40, 100, 999, 10000] ^ You don't need to compare with this as 40 < 75 is already sure. 75 -> [40, 75, 100, 999, 10000] """ is_last_odd_item_inserted_before_this_index = False for i in range(len(sorted_list_2d) - 1): if result[i] == collection[-1] and has_last_odd_item: is_last_odd_item_inserted_before_this_index = True pivot = sorted_list_2d[i][1] # If last_odd_item is inserted before the item's index, # you should forward index one more. if is_last_odd_item_inserted_before_this_index: result = result[: i + 2] + binary_search_insertion(result[i + 2 :], pivot) else: result = result[: i + 1] + binary_search_insertion(result[i + 1 :], pivot) return result if __name__ == "__main__": user_input = input("Enter numbers separated by a comma:\n").strip() unsorted = [int(item) for item in user_input.split(",")] print(merge_insertion_sort(unsorted)) ================================================ FILE: sorts/merge_sort.py ================================================ """ This is a pure Python implementation of the merge sort algorithm. For doctests run following command: python -m doctest -v merge_sort.py or python3 -m doctest -v merge_sort.py For manual testing run: python merge_sort.py """ def merge_sort(collection: list) -> list: """ Sorts a list using the merge sort algorithm. :param collection: A mutable ordered collection with comparable items. :return: The same collection ordered in ascending order. Time Complexity: O(n log n) Space Complexity: O(n) Examples: >>> merge_sort([0, 5, 3, 2, 2]) [0, 2, 2, 3, 5] >>> merge_sort([]) [] >>> merge_sort([-2, -5, -45]) [-45, -5, -2] """ def merge(left: list, right: list) -> list: """ Merge two sorted lists into a single sorted list. :param left: Left collection :param right: Right collection :return: Merged result """ result = [] while left and right: result.append(left.pop(0) if left[0] <= right[0] else right.pop(0)) result.extend(left) result.extend(right) return result if len(collection) <= 1: return collection mid_index = len(collection) // 2 return merge(merge_sort(collection[:mid_index]), merge_sort(collection[mid_index:])) if __name__ == "__main__": import doctest doctest.testmod() try: user_input = input("Enter numbers separated by a comma:\n").strip() unsorted = [int(item) for item in user_input.split(",")] sorted_list = merge_sort(unsorted) print(*sorted_list, sep=",") except ValueError: print("Invalid input. Please enter valid integers separated by commas.") ================================================ FILE: sorts/msd_radix_sort.py ================================================ """ Python implementation of the MSD radix sort algorithm. It used the binary representation of the integers to sort them. https://en.wikipedia.org/wiki/Radix_sort """ from __future__ import annotations def msd_radix_sort(list_of_ints: list[int]) -> list[int]: """ Implementation of the MSD radix sort algorithm. Only works with positive integers :param list_of_ints: A list of integers :return: Returns the sorted list >>> msd_radix_sort([40, 12, 1, 100, 4]) [1, 4, 12, 40, 100] >>> msd_radix_sort([]) [] >>> msd_radix_sort([123, 345, 123, 80]) [80, 123, 123, 345] >>> msd_radix_sort([1209, 834598, 1, 540402, 45]) [1, 45, 1209, 540402, 834598] >>> msd_radix_sort([-1, 34, 45]) Traceback (most recent call last): ... ValueError: All numbers must be positive """ if not list_of_ints: return [] if min(list_of_ints) < 0: raise ValueError("All numbers must be positive") most_bits = max(len(bin(x)[2:]) for x in list_of_ints) return _msd_radix_sort(list_of_ints, most_bits) def _msd_radix_sort(list_of_ints: list[int], bit_position: int) -> list[int]: """ Sort the given list based on the bit at bit_position. Numbers with a 0 at that position will be at the start of the list, numbers with a 1 at the end. :param list_of_ints: A list of integers :param bit_position: the position of the bit that gets compared :return: Returns a partially sorted list >>> _msd_radix_sort([45, 2, 32], 1) [2, 32, 45] >>> _msd_radix_sort([10, 4, 12], 2) [4, 12, 10] """ if bit_position == 0 or len(list_of_ints) in [0, 1]: return list_of_ints zeros = [] ones = [] # Split numbers based on bit at bit_position from the right for number in list_of_ints: if (number >> (bit_position - 1)) & 1: # number has a one at bit bit_position ones.append(number) else: # number has a zero at bit bit_position zeros.append(number) # recursively split both lists further zeros = _msd_radix_sort(zeros, bit_position - 1) ones = _msd_radix_sort(ones, bit_position - 1) # recombine lists res = zeros res.extend(ones) return res def msd_radix_sort_inplace(list_of_ints: list[int]): """ Inplace implementation of the MSD radix sort algorithm. Sorts based on the binary representation of the integers. >>> lst = [1, 345, 23, 89, 0, 3] >>> msd_radix_sort_inplace(lst) >>> lst == sorted(lst) True >>> lst = [1, 43, 0, 0, 0, 24, 3, 3] >>> msd_radix_sort_inplace(lst) >>> lst == sorted(lst) True >>> lst = [] >>> msd_radix_sort_inplace(lst) >>> lst == [] True >>> lst = [-1, 34, 23, 4, -42] >>> msd_radix_sort_inplace(lst) Traceback (most recent call last): ... ValueError: All numbers must be positive """ length = len(list_of_ints) if not list_of_ints or length == 1: return if min(list_of_ints) < 0: raise ValueError("All numbers must be positive") most_bits = max(len(bin(x)[2:]) for x in list_of_ints) _msd_radix_sort_inplace(list_of_ints, most_bits, 0, length) def _msd_radix_sort_inplace( list_of_ints: list[int], bit_position: int, begin_index: int, end_index: int ): """ Sort the given list based on the bit at bit_position. Numbers with a 0 at that position will be at the start of the list, numbers with a 1 at the end. >>> lst = [45, 2, 32, 24, 534, 2932] >>> _msd_radix_sort_inplace(lst, 1, 0, 3) >>> lst == [32, 2, 45, 24, 534, 2932] True >>> lst = [0, 2, 1, 3, 12, 10, 4, 90, 54, 2323, 756] >>> _msd_radix_sort_inplace(lst, 2, 4, 7) >>> lst == [0, 2, 1, 3, 12, 4, 10, 90, 54, 2323, 756] True """ if bit_position == 0 or end_index - begin_index <= 1: return bit_position -= 1 i = begin_index j = end_index - 1 while i <= j: changed = False if not (list_of_ints[i] >> bit_position) & 1: # found zero at the beginning i += 1 changed = True if (list_of_ints[j] >> bit_position) & 1: # found one at the end j -= 1 changed = True if changed: continue list_of_ints[i], list_of_ints[j] = list_of_ints[j], list_of_ints[i] j -= 1 if j != i: i += 1 _msd_radix_sort_inplace(list_of_ints, bit_position, begin_index, i) _msd_radix_sort_inplace(list_of_ints, bit_position, i, end_index) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: sorts/natural_sort.py ================================================ from __future__ import annotations import re def natural_sort(input_list: list[str]) -> list[str]: """ Sort the given list of strings in the way that humans expect. The normal Python sort algorithm sorts lexicographically, so you might not get the results that you expect... >>> example1 = ['2 ft 7 in', '1 ft 5 in', '10 ft 2 in', '2 ft 11 in', '7 ft 6 in'] >>> sorted(example1) ['1 ft 5 in', '10 ft 2 in', '2 ft 11 in', '2 ft 7 in', '7 ft 6 in'] >>> # The natural sort algorithm sort based on meaning and not computer code point. >>> natural_sort(example1) ['1 ft 5 in', '2 ft 7 in', '2 ft 11 in', '7 ft 6 in', '10 ft 2 in'] >>> example2 = ['Elm11', 'Elm12', 'Elm2', 'elm0', 'elm1', 'elm10', 'elm13', 'elm9'] >>> sorted(example2) ['Elm11', 'Elm12', 'Elm2', 'elm0', 'elm1', 'elm10', 'elm13', 'elm9'] >>> natural_sort(example2) ['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13'] """ def alphanum_key(key): return [int(s) if s.isdigit() else s.lower() for s in re.split("([0-9]+)", key)] return sorted(input_list, key=alphanum_key) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: sorts/normal_distribution_quick_sort.md ================================================ # Normal Distribution QuickSort QuickSort Algorithm where the pivot element is chosen randomly between first and last elements of the array, and the array elements are taken from Standard Normal Distribution. ## Array elements The array elements are taken from a Standard Normal Distribution, having mean = 0 and standard deviation = 1. ### The code ```python >>> import numpy as np >>> from tempfile import TemporaryFile >>> outfile = TemporaryFile() >>> p = 100 # 100 elements are to be sorted >>> mu, sigma = 0, 1 # mean and standard deviation >>> X = np.random.normal(mu, sigma, p) >>> np.save(outfile, X) >>> 'The array is' >>> X ``` ------ #### The distribution of the array elements ```python >>> mu, sigma = 0, 1 # mean and standard deviation >>> s = np.random.normal(mu, sigma, p) >>> count, bins, ignored = plt.hist(s, 30, normed=True) >>> plt.plot(bins , 1/(sigma * np.sqrt(2 * np.pi)) *np.exp( - (bins - mu)**2 / (2 * sigma**2) ),linewidth=2, color='r') >>> plt.show() ``` ------ ![normal distribution large](https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/The_Normal_Distribution.svg/1280px-The_Normal_Distribution.svg.png) ------ ## Comparing the numbers of comparisons We can plot the function for Checking 'The Number of Comparisons' taking place between Normal Distribution QuickSort and Ordinary QuickSort: ```python >>> import matplotlib.pyplot as plt # Normal Distribution QuickSort is red >>> plt.plot([1,2,4,16,32,64,128,256,512,1024,2048],[1,1,6,15,43,136,340,800,2156,6821,16325],linewidth=2, color='r') # Ordinary QuickSort is green >>> plt.plot([1,2,4,16,32,64,128,256,512,1024,2048],[1,1,4,16,67,122,362,949,2131,5086,12866],linewidth=2, color='g') >>> plt.show() ``` ================================================ FILE: sorts/odd_even_sort.py ================================================ """ Odd even sort implementation. https://en.wikipedia.org/wiki/Odd%E2%80%93even_sort """ def odd_even_sort(input_list: list) -> list: """ Sort input with odd even sort. This algorithm uses the same idea of bubblesort, but by first dividing in two phase (odd and even). Originally developed for use on parallel processors with local interconnections. :param collection: mutable ordered sequence of elements :return: same collection in ascending order Examples: >>> odd_even_sort([5 , 4 ,3 ,2 ,1]) [1, 2, 3, 4, 5] >>> odd_even_sort([]) [] >>> odd_even_sort([-10 ,-1 ,10 ,2]) [-10, -1, 2, 10] >>> odd_even_sort([1 ,2 ,3 ,4]) [1, 2, 3, 4] """ is_sorted = False while is_sorted is False: # Until all the indices are traversed keep looping is_sorted = True for i in range(0, len(input_list) - 1, 2): # iterating over all even indices if input_list[i] > input_list[i + 1]: input_list[i], input_list[i + 1] = input_list[i + 1], input_list[i] # swapping if elements not in order is_sorted = False for i in range(1, len(input_list) - 1, 2): # iterating over all odd indices if input_list[i] > input_list[i + 1]: input_list[i], input_list[i + 1] = input_list[i + 1], input_list[i] # swapping if elements not in order is_sorted = False return input_list if __name__ == "__main__": print("Enter list to be sorted") input_list = [int(x) for x in input().split()] # inputing elements of the list in one line sorted_list = odd_even_sort(input_list) print("The sorted list is") print(sorted_list) ================================================ FILE: sorts/odd_even_transposition_parallel.py ================================================ """ This is an implementation of odd-even transposition sort. It works by performing a series of parallel swaps between odd and even pairs of variables in the list. This implementation represents each variable in the list with a process and each process communicates with its neighboring processes in the list to perform comparisons. They are synchronized with locks and message passing but other forms of synchronization could be used. """ import multiprocessing as mp # lock used to ensure that two processes do not access a pipe at the same time # NOTE This breaks testing on build runner. May work better locally # process_lock = mp.Lock() """ The function run by the processes that sorts the list position = the position in the list the process represents, used to know which neighbor we pass our value to value = the initial value at list[position] LSend, RSend = the pipes we use to send to our left and right neighbors LRcv, RRcv = the pipes we use to receive from our left and right neighbors resultPipe = the pipe used to send results back to main """ def oe_process( position, value, l_send, r_send, lr_cv, rr_cv, result_pipe, multiprocessing_context, ): process_lock = multiprocessing_context.Lock() # we perform n swaps since after n swaps we know we are sorted # we *could* stop early if we are sorted already, but it takes as long to # find out we are sorted as it does to sort the list with this algorithm for i in range(10): if (i + position) % 2 == 0 and r_send is not None: # send your value to your right neighbor with process_lock: r_send[1].send(value) # receive your right neighbor's value with process_lock: temp = rr_cv[0].recv() # take the lower value since you are on the left value = min(value, temp) elif (i + position) % 2 != 0 and l_send is not None: # send your value to your left neighbor with process_lock: l_send[1].send(value) # receive your left neighbor's value with process_lock: temp = lr_cv[0].recv() # take the higher value since you are on the right value = max(value, temp) # after all swaps are performed, send the values back to main result_pipe[1].send(value) """ the function which creates the processes that perform the parallel swaps arr = the list to be sorted """ def odd_even_transposition(arr): """ >>> odd_even_transposition(list(range(10)[::-1])) == sorted(list(range(10)[::-1])) True >>> odd_even_transposition(["a", "x", "c"]) == sorted(["x", "a", "c"]) True >>> odd_even_transposition([1.9, 42.0, 2.8]) == sorted([1.9, 42.0, 2.8]) True >>> odd_even_transposition([False, True, False]) == sorted([False, False, True]) True >>> odd_even_transposition([1, 32.0, 9]) == sorted([False, False, True]) False >>> odd_even_transposition([1, 32.0, 9]) == sorted([1.0, 32, 9.0]) True >>> unsorted_list = [-442, -98, -554, 266, -491, 985, -53, -529, 82, -429] >>> odd_even_transposition(unsorted_list) == sorted(unsorted_list) True >>> unsorted_list = [-442, -98, -554, 266, -491, 985, -53, -529, 82, -429] >>> odd_even_transposition(unsorted_list) == sorted(unsorted_list + [1]) False """ # spawn method is considered safer than fork multiprocessing_context = mp.get_context("spawn") process_array_ = [] result_pipe = [] # initialize the list of pipes where the values will be retrieved for _ in arr: result_pipe.append(multiprocessing_context.Pipe()) # creates the processes # the first and last process only have one neighbor so they are made outside # of the loop temp_rs = multiprocessing_context.Pipe() temp_rr = multiprocessing_context.Pipe() process_array_.append( multiprocessing_context.Process( target=oe_process, args=( 0, arr[0], None, temp_rs, None, temp_rr, result_pipe[0], multiprocessing_context, ), ) ) temp_lr = temp_rs temp_ls = temp_rr for i in range(1, len(arr) - 1): temp_rs = multiprocessing_context.Pipe() temp_rr = multiprocessing_context.Pipe() process_array_.append( multiprocessing_context.Process( target=oe_process, args=( i, arr[i], temp_ls, temp_rs, temp_lr, temp_rr, result_pipe[i], multiprocessing_context, ), ) ) temp_lr = temp_rs temp_ls = temp_rr process_array_.append( multiprocessing_context.Process( target=oe_process, args=( len(arr) - 1, arr[len(arr) - 1], temp_ls, None, temp_lr, None, result_pipe[len(arr) - 1], multiprocessing_context, ), ) ) # start the processes for p in process_array_: p.start() # wait for the processes to end and write their values to the list for p in range(len(result_pipe)): arr[p] = result_pipe[p][0].recv() process_array_[p].join() return arr # creates a reverse sorted list and sorts it def main(): arr = list(range(10, 0, -1)) print("Initial List") print(*arr) arr = odd_even_transposition(arr) print("Sorted List\n") print(*arr) if __name__ == "__main__": main() ================================================ FILE: sorts/odd_even_transposition_single_threaded.py ================================================ """ Source: https://en.wikipedia.org/wiki/Odd%E2%80%93even_sort This is a non-parallelized implementation of odd-even transposition sort. Normally the swaps in each set happen simultaneously, without that the algorithm is no better than bubble sort. """ def odd_even_transposition(arr: list) -> list: """ >>> odd_even_transposition([5, 4, 3, 2, 1]) [1, 2, 3, 4, 5] >>> odd_even_transposition([13, 11, 18, 0, -1]) [-1, 0, 11, 13, 18] >>> odd_even_transposition([-.1, 1.1, .1, -2.9]) [-2.9, -0.1, 0.1, 1.1] """ arr_size = len(arr) for _ in range(arr_size): for i in range(_ % 2, arr_size - 1, 2): if arr[i + 1] < arr[i]: arr[i], arr[i + 1] = arr[i + 1], arr[i] return arr if __name__ == "__main__": arr = list(range(10, 0, -1)) print(f"Original: {arr}. Sorted: {odd_even_transposition(arr)}") ================================================ FILE: sorts/pancake_sort.py ================================================ """ This is a pure Python implementation of the pancake sort algorithm For doctests run following command: python3 -m doctest -v pancake_sort.py or python -m doctest -v pancake_sort.py For manual testing run: python pancake_sort.py """ def pancake_sort(arr): """Sort Array with Pancake Sort. :param arr: Collection containing comparable items :return: Collection ordered in ascending order of items Examples: >>> pancake_sort([0, 5, 3, 2, 2]) [0, 2, 2, 3, 5] >>> pancake_sort([]) [] >>> pancake_sort([-2, -5, -45]) [-45, -5, -2] """ cur = len(arr) while cur > 1: # Find the maximum number in arr mi = arr.index(max(arr[0:cur])) # Reverse from 0 to mi arr = arr[mi::-1] + arr[mi + 1 : len(arr)] # Reverse whole list arr = arr[cur - 1 :: -1] + arr[cur : len(arr)] cur -= 1 return arr if __name__ == "__main__": user_input = input("Enter numbers separated by a comma:\n").strip() unsorted = [int(item) for item in user_input.split(",")] print(pancake_sort(unsorted)) ================================================ FILE: sorts/patience_sort.py ================================================ from __future__ import annotations from bisect import bisect_left from functools import total_ordering from heapq import merge """ A pure Python implementation of the patience sort algorithm For more information: https://en.wikipedia.org/wiki/Patience_sorting This algorithm is based on the card game patience For doctests run following command: python3 -m doctest -v patience_sort.py For manual testing run: python3 patience_sort.py """ @total_ordering class Stack(list): def __lt__(self, other): return self[-1] < other[-1] def __eq__(self, other): return self[-1] == other[-1] def patience_sort(collection: list) -> list: """A pure implementation of patience sort algorithm in Python :param collection: some mutable ordered collection with heterogeneous comparable items inside :return: the same collection ordered by ascending Examples: >>> patience_sort([1, 9, 5, 21, 17, 6]) [1, 5, 6, 9, 17, 21] >>> patience_sort([]) [] >>> patience_sort([-3, -17, -48]) [-48, -17, -3] """ stacks: list[Stack] = [] # sort into stacks for element in collection: new_stacks = Stack([element]) i = bisect_left(stacks, new_stacks) if i != len(stacks): stacks[i].append(element) else: stacks.append(new_stacks) # use a heap-based merge to merge stack efficiently collection[:] = merge(*(reversed(stack) for stack in stacks)) return collection if __name__ == "__main__": user_input = input("Enter numbers separated by a comma:\n").strip() unsorted = [int(item) for item in user_input.split(",")] print(patience_sort(unsorted)) ================================================ FILE: sorts/pigeon_sort.py ================================================ """ This is an implementation of Pigeon Hole Sort. For doctests run following command: python3 -m doctest -v pigeon_sort.py or python -m doctest -v pigeon_sort.py For manual testing run: python pigeon_sort.py """ from __future__ import annotations def pigeon_sort(array: list[int]) -> list[int]: """ Implementation of pigeon hole sort algorithm :param array: Collection of comparable items :return: Collection sorted in ascending order >>> pigeon_sort([0, 5, 3, 2, 2]) [0, 2, 2, 3, 5] >>> pigeon_sort([]) [] >>> pigeon_sort([-2, -5, -45]) [-45, -5, -2] """ if len(array) == 0: return array _min, _max = min(array), max(array) # Compute the variables holes_range = _max - _min + 1 holes, holes_repeat = [0] * holes_range, [0] * holes_range # Make the sorting. for i in array: index = i - _min holes[index] = i holes_repeat[index] += 1 # Makes the array back by replacing the numbers. index = 0 for i in range(holes_range): while holes_repeat[i] > 0: array[index] = holes[i] index += 1 holes_repeat[i] -= 1 # Returns the sorted array. return array if __name__ == "__main__": import doctest doctest.testmod() user_input = input("Enter numbers separated by comma:\n") unsorted = [int(x) for x in user_input.split(",")] print(pigeon_sort(unsorted)) ================================================ FILE: sorts/pigeonhole_sort.py ================================================ # Python program to implement Pigeonhole Sorting in python # Algorithm for the pigeonhole sorting def pigeonhole_sort(a): """ >>> a = [8, 3, 2, 7, 4, 6, 8] >>> b = sorted(a) # a nondestructive sort >>> pigeonhole_sort(a) # a destructive sort >>> a == b True """ # size of range of values in the list (ie, number of pigeonholes we need) min_val = min(a) # min() finds the minimum value max_val = max(a) # max() finds the maximum value size = max_val - min_val + 1 # size is difference of max and min values plus one # list of pigeonholes of size equal to the variable size holes = [0] * size # Populate the pigeonholes. for x in a: assert isinstance(x, int), "integers only please" holes[x - min_val] += 1 # Putting the elements back into the array in an order. i = 0 for count in range(size): while holes[count] > 0: holes[count] -= 1 a[i] = count + min_val i += 1 def main(): a = [8, 3, 2, 7, 4, 6, 8] pigeonhole_sort(a) print("Sorted order is:", " ".join(a)) if __name__ == "__main__": main() ================================================ FILE: sorts/quick_sort.py ================================================ """ A pure Python implementation of the quick sort algorithm For doctests run following command: python3 -m doctest -v quick_sort.py For manual testing run: python3 quick_sort.py """ from __future__ import annotations from random import randrange def quick_sort(collection: list) -> list: """A pure Python implementation of quicksort algorithm. :param collection: a mutable collection of comparable items :return: the same collection ordered in ascending order Examples: >>> quick_sort([0, 5, 3, 2, 2]) [0, 2, 2, 3, 5] >>> quick_sort([]) [] >>> quick_sort([-2, 5, 0, -45]) [-45, -2, 0, 5] """ # Base case: if the collection has 0 or 1 elements, it is already sorted if len(collection) < 2: return collection # Randomly select a pivot index and remove the pivot element from the collection pivot_index = randrange(len(collection)) pivot = collection.pop(pivot_index) # Partition the remaining elements into two groups: lesser or equal, and greater lesser = [item for item in collection if item <= pivot] greater = [item for item in collection if item > pivot] # Recursively sort the lesser and greater groups, and combine with the pivot return [*quick_sort(lesser), pivot, *quick_sort(greater)] if __name__ == "__main__": # Get user input and convert it into a list of integers user_input = input("Enter numbers separated by a comma:\n").strip() unsorted = [int(item) for item in user_input.split(",")] # Print the result of sorting the user-provided list print(quick_sort(unsorted)) ================================================ FILE: sorts/quick_sort_3_partition.py ================================================ def quick_sort_3partition(sorting: list, left: int, right: int) -> None: """ " Python implementation of quick sort algorithm with 3-way partition. The idea of 3-way quick sort is based on "Dutch National Flag algorithm". :param sorting: sort list :param left: left endpoint of sorting :param right: right endpoint of sorting :return: None Examples: >>> array1 = [5, -1, -1, 5, 5, 24, 0] >>> quick_sort_3partition(array1, 0, 6) >>> array1 [-1, -1, 0, 5, 5, 5, 24] >>> array2 = [9, 0, 2, 6] >>> quick_sort_3partition(array2, 0, 3) >>> array2 [0, 2, 6, 9] >>> array3 = [] >>> quick_sort_3partition(array3, 0, 0) >>> array3 [] """ if right <= left: return a = i = left b = right pivot = sorting[left] while i <= b: if sorting[i] < pivot: sorting[a], sorting[i] = sorting[i], sorting[a] a += 1 i += 1 elif sorting[i] > pivot: sorting[b], sorting[i] = sorting[i], sorting[b] b -= 1 else: i += 1 quick_sort_3partition(sorting, left, a - 1) quick_sort_3partition(sorting, b + 1, right) def quick_sort_lomuto_partition(sorting: list, left: int, right: int) -> None: """ A pure Python implementation of quick sort algorithm(in-place) with Lomuto partition scheme: https://en.wikipedia.org/wiki/Quicksort#Lomuto_partition_scheme :param sorting: sort list :param left: left endpoint of sorting :param right: right endpoint of sorting :return: None Examples: >>> nums1 = [0, 5, 3, 1, 2] >>> quick_sort_lomuto_partition(nums1, 0, 4) >>> nums1 [0, 1, 2, 3, 5] >>> nums2 = [] >>> quick_sort_lomuto_partition(nums2, 0, 0) >>> nums2 [] >>> nums3 = [-2, 5, 0, -4] >>> quick_sort_lomuto_partition(nums3, 0, 3) >>> nums3 [-4, -2, 0, 5] """ if left < right: pivot_index = lomuto_partition(sorting, left, right) quick_sort_lomuto_partition(sorting, left, pivot_index - 1) quick_sort_lomuto_partition(sorting, pivot_index + 1, right) def lomuto_partition(sorting: list, left: int, right: int) -> int: """ Example: >>> lomuto_partition([1,5,7,6], 0, 3) 2 """ pivot = sorting[right] store_index = left for i in range(left, right): if sorting[i] < pivot: sorting[store_index], sorting[i] = sorting[i], sorting[store_index] store_index += 1 sorting[right], sorting[store_index] = sorting[store_index], sorting[right] return store_index def three_way_radix_quicksort(sorting: list) -> list: """ Three-way radix quicksort: https://en.wikipedia.org/wiki/Quicksort#Three-way_radix_quicksort First divide the list into three parts. Then recursively sort the "less than" and "greater than" partitions. >>> three_way_radix_quicksort([]) [] >>> three_way_radix_quicksort([1]) [1] >>> three_way_radix_quicksort([-5, -2, 1, -2, 0, 1]) [-5, -2, -2, 0, 1, 1] >>> three_way_radix_quicksort([1, 2, 5, 1, 2, 0, 0, 5, 2, -1]) [-1, 0, 0, 1, 1, 2, 2, 2, 5, 5] """ if len(sorting) <= 1: return sorting return ( three_way_radix_quicksort([i for i in sorting if i < sorting[0]]) + [i for i in sorting if i == sorting[0]] + three_way_radix_quicksort([i for i in sorting if i > sorting[0]]) ) if __name__ == "__main__": import doctest doctest.testmod(verbose=True) user_input = input("Enter numbers separated by a comma:\n").strip() unsorted = [int(item) for item in user_input.split(",")] quick_sort_3partition(unsorted, 0, len(unsorted) - 1) print(unsorted) ================================================ FILE: sorts/radix_sort.py ================================================ """ This is a pure Python implementation of the radix sort algorithm Source: https://en.wikipedia.org/wiki/Radix_sort """ from __future__ import annotations RADIX = 10 def radix_sort(list_of_ints: list[int]) -> list[int]: """ Examples: >>> radix_sort([0, 5, 3, 2, 2]) [0, 2, 2, 3, 5] >>> radix_sort(list(range(15))) == sorted(range(15)) True >>> radix_sort(list(range(14,-1,-1))) == sorted(range(15)) True >>> radix_sort([1,100,10,1000]) == sorted([1,100,10,1000]) True """ placement = 1 max_digit = max(list_of_ints) while placement <= max_digit: # declare and initialize empty buckets buckets: list[list] = [[] for _ in range(RADIX)] # split list_of_ints between the buckets for i in list_of_ints: tmp = int((i / placement) % RADIX) buckets[tmp].append(i) # put each buckets' contents into list_of_ints a = 0 for b in range(RADIX): for i in buckets[b]: list_of_ints[a] = i a += 1 # move to next placement *= RADIX return list_of_ints if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: sorts/recursive_insertion_sort.py ================================================ """ A recursive implementation of the insertion sort algorithm """ from __future__ import annotations def rec_insertion_sort(collection: list, n: int): """ Given a collection of numbers and its length, sorts the collections in ascending order :param collection: A mutable collection of comparable elements :param n: The length of collections >>> col = [1, 2, 1] >>> rec_insertion_sort(col, len(col)) >>> col [1, 1, 2] >>> col = [2, 1, 0, -1, -2] >>> rec_insertion_sort(col, len(col)) >>> col [-2, -1, 0, 1, 2] >>> col = [1] >>> rec_insertion_sort(col, len(col)) >>> col [1] """ # Checks if the entire collection has been sorted if len(collection) <= 1 or n <= 1: return insert_next(collection, n - 1) rec_insertion_sort(collection, n - 1) def insert_next(collection: list, index: int): """ Inserts the '(index-1)th' element into place >>> col = [3, 2, 4, 2] >>> insert_next(col, 1) >>> col [2, 3, 4, 2] >>> col = [3, 2, 3] >>> insert_next(col, 2) >>> col [3, 2, 3] >>> col = [] >>> insert_next(col, 1) >>> col [] """ # Checks order between adjacent elements if index >= len(collection) or collection[index - 1] <= collection[index]: return # Swaps adjacent elements since they are not in ascending order collection[index - 1], collection[index] = ( collection[index], collection[index - 1], ) insert_next(collection, index + 1) if __name__ == "__main__": numbers = input("Enter integers separated by spaces: ") number_list: list[int] = [int(num) for num in numbers.split()] rec_insertion_sort(number_list, len(number_list)) print(number_list) ================================================ FILE: sorts/recursive_mergesort_array.py ================================================ """A merge sort which accepts an array as input and recursively splits an array in half and sorts and combines them. """ """https://en.wikipedia.org/wiki/Merge_sort """ def merge(arr: list[int]) -> list[int]: """Return a sorted array. >>> merge([10,9,8,7,6,5,4,3,2,1]) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> merge([1,2,3,4,5,6,7,8,9,10]) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> merge([10,22,1,2,3,9,15,23]) [1, 2, 3, 9, 10, 15, 22, 23] >>> merge([100]) [100] >>> merge([]) [] """ if len(arr) > 1: middle_length = len(arr) // 2 # Finds the middle of the array left_array = arr[ :middle_length ] # Creates an array of the elements in the first half. right_array = arr[ middle_length: ] # Creates an array of the elements in the second half. left_size = len(left_array) right_size = len(right_array) merge(left_array) # Starts sorting the left. merge(right_array) # Starts sorting the right left_index = 0 # Left Counter right_index = 0 # Right Counter index = 0 # Position Counter while ( left_index < left_size and right_index < right_size ): # Runs until the lowers size of the left and right are sorted. if left_array[left_index] < right_array[right_index]: arr[index] = left_array[left_index] left_index += 1 else: arr[index] = right_array[right_index] right_index += 1 index += 1 while ( left_index < left_size ): # Adds the left over elements in the left half of the array arr[index] = left_array[left_index] left_index += 1 index += 1 while ( right_index < right_size ): # Adds the left over elements in the right half of the array arr[index] = right_array[right_index] right_index += 1 index += 1 return arr if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: sorts/recursive_quick_sort.py ================================================ def quick_sort(data: list) -> list: """ >>> for data in ([2, 1, 0], [2.2, 1.1, 0], "quick_sort"): ... quick_sort(data) == sorted(data) True True True """ if len(data) <= 1: return data else: return [ *quick_sort([e for e in data[1:] if e <= data[0]]), data[0], *quick_sort([e for e in data[1:] if e > data[0]]), ] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: sorts/selection_sort.py ================================================ def selection_sort(collection: list[int]) -> list[int]: """ Sorts a list in ascending order using the selection sort algorithm. :param collection: A list of integers to be sorted. :return: The sorted list. Examples: >>> selection_sort([0, 5, 3, 2, 2]) [0, 2, 2, 3, 5] >>> selection_sort([]) [] >>> selection_sort([-2, -5, -45]) [-45, -5, -2] """ length = len(collection) for i in range(length - 1): min_index = i for k in range(i + 1, length): if collection[k] < collection[min_index]: min_index = k if min_index != i: collection[i], collection[min_index] = collection[min_index], collection[i] return collection if __name__ == "__main__": user_input = input("Enter numbers separated by a comma:\n").strip() unsorted = [int(item) for item in user_input.split(",")] sorted_list = selection_sort(unsorted) print("Sorted List:", sorted_list) ================================================ FILE: sorts/shell_sort.py ================================================ """ https://en.wikipedia.org/wiki/Shellsort#Pseudocode """ def shell_sort(collection: list[int]) -> list[int]: """Pure implementation of shell sort algorithm in Python :param collection: Some mutable ordered collection with heterogeneous comparable items inside :return: the same collection ordered by ascending >>> shell_sort([0, 5, 3, 2, 2]) [0, 2, 2, 3, 5] >>> shell_sort([]) [] >>> shell_sort([-2, -5, -45]) [-45, -5, -2] """ # Marcin Ciura's gap sequence gaps = [701, 301, 132, 57, 23, 10, 4, 1] for gap in gaps: for i in range(gap, len(collection)): insert_value = collection[i] j = i while j >= gap and collection[j - gap] > insert_value: collection[j] = collection[j - gap] j -= gap if j != i: collection[j] = insert_value return collection if __name__ == "__main__": from doctest import testmod testmod() user_input = input("Enter numbers separated by a comma:\n").strip() unsorted = [int(item) for item in user_input.split(",")] print(shell_sort(unsorted)) ================================================ FILE: sorts/shrink_shell_sort.py ================================================ """ This function implements the shell sort algorithm which is slightly faster than its pure implementation. This shell sort is implemented using a gap, which shrinks by a certain factor each iteration. In this implementation, the gap is initially set to the length of the collection. The gap is then reduced by a certain factor (1.3) each iteration. For each iteration, the algorithm compares elements that are a certain number of positions apart (determined by the gap). If the element at the higher position is greater than the element at the lower position, the two elements are swapped. The process is repeated until the gap is equal to 1. The reason this is more efficient is that it reduces the number of comparisons that need to be made. By using a smaller gap, the list is sorted more quickly. """ def shell_sort(collection: list) -> list: """Implementation of shell sort algorithm in Python :param collection: Some mutable ordered collection with heterogeneous comparable items inside :return: the same collection ordered by ascending >>> shell_sort([3, 2, 1]) [1, 2, 3] >>> shell_sort([]) [] >>> shell_sort([1]) [1] """ # Choose an initial gap value gap = len(collection) # Set the gap value to be decreased by a factor of 1.3 # after each iteration shrink = 1.3 # Continue sorting until the gap is 1 while gap > 1: # Decrease the gap value gap = int(gap / shrink) # Sort the elements using insertion sort for i in range(gap, len(collection)): temp = collection[i] j = i while j >= gap and collection[j - gap] > temp: collection[j] = collection[j - gap] j -= gap collection[j] = temp return collection if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: sorts/slowsort.py ================================================ """ Slowsort is a sorting algorithm. It is of humorous nature and not useful. It's based on the principle of multiply and surrender, a tongue-in-cheek joke of divide and conquer. It was published in 1986 by Andrei Broder and Jorge Stolfi in their paper Pessimal Algorithms and Simplexity Analysis (a parody of optimal algorithms and complexity analysis). Source: https://en.wikipedia.org/wiki/Slowsort """ from __future__ import annotations def slowsort(sequence: list, start: int | None = None, end: int | None = None) -> None: """ Sorts sequence[start..end] (both inclusive) in-place. start defaults to 0 if not given. end defaults to len(sequence) - 1 if not given. It returns None. >>> seq = [1, 6, 2, 5, 3, 4, 4, 5]; slowsort(seq); seq [1, 2, 3, 4, 4, 5, 5, 6] >>> seq = []; slowsort(seq); seq [] >>> seq = [2]; slowsort(seq); seq [2] >>> seq = [1, 2, 3, 4]; slowsort(seq); seq [1, 2, 3, 4] >>> seq = [4, 3, 2, 1]; slowsort(seq); seq [1, 2, 3, 4] >>> seq = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]; slowsort(seq, 2, 7); seq [9, 8, 2, 3, 4, 5, 6, 7, 1, 0] >>> seq = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]; slowsort(seq, end = 4); seq [5, 6, 7, 8, 9, 4, 3, 2, 1, 0] >>> seq = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]; slowsort(seq, start = 5); seq [9, 8, 7, 6, 5, 0, 1, 2, 3, 4] """ if start is None: start = 0 if end is None: end = len(sequence) - 1 if start >= end: return mid = (start + end) // 2 slowsort(sequence, start, mid) slowsort(sequence, mid + 1, end) if sequence[end] < sequence[mid]: sequence[end], sequence[mid] = sequence[mid], sequence[end] slowsort(sequence, start, end - 1) if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: sorts/stalin_sort.py ================================================ """ Stalin Sort algorithm: Removes elements that are out of order. Elements that are not greater than or equal to the previous element are discarded. Reference: https://medium.com/@kaweendra/the-ultimate-sorting-algorithm-6513d6968420 """ def stalin_sort(sequence: list[int]) -> list[int]: """ Sorts a list using the Stalin sort algorithm. >>> stalin_sort([4, 3, 5, 2, 1, 7]) [4, 5, 7] >>> stalin_sort([1, 2, 3, 4]) [1, 2, 3, 4] >>> stalin_sort([4, 5, 5, 2, 3]) [4, 5, 5] >>> stalin_sort([6, 11, 12, 4, 1, 5]) [6, 11, 12] >>> stalin_sort([5, 0, 4, 3]) [5] >>> stalin_sort([5, 4, 3, 2, 1]) [5] >>> stalin_sort([1, 2, 3, 4, 5]) [1, 2, 3, 4, 5] >>> stalin_sort([1, 2, 8, 7, 6]) [1, 2, 8] """ result = [sequence[0]] for element in sequence[1:]: if element >= result[-1]: result.append(element) return result if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: sorts/stooge_sort.py ================================================ def stooge_sort(arr: list[int]) -> list[int]: """ Examples: >>> stooge_sort([18.1, 0, -7.1, -1, 2, 2]) [-7.1, -1, 0, 2, 2, 18.1] >>> stooge_sort([]) [] """ stooge(arr, 0, len(arr) - 1) return arr def stooge(arr: list[int], i: int, h: int) -> None: if i >= h: return # If first element is smaller than the last then swap them if arr[i] > arr[h]: arr[i], arr[h] = arr[h], arr[i] # If there are more than 2 elements in the array if h - i + 1 > 2: t = (int)((h - i + 1) / 3) # Recursively sort first 2/3 elements stooge(arr, i, (h - t)) # Recursively sort last 2/3 elements stooge(arr, i + t, (h)) # Recursively sort first 2/3 elements stooge(arr, i, (h - t)) if __name__ == "__main__": user_input = input("Enter numbers separated by a comma:\n").strip() unsorted = [int(item) for item in user_input.split(",")] print(stooge_sort(unsorted)) ================================================ FILE: sorts/strand_sort.py ================================================ import operator def strand_sort(arr: list, reverse: bool = False, solution: list | None = None) -> list: """ Strand sort implementation source: https://en.wikipedia.org/wiki/Strand_sort :param arr: Unordered input list :param reverse: Descent ordering flag :param solution: Ordered items container Examples: >>> strand_sort([4, 2, 5, 3, 0, 1]) [0, 1, 2, 3, 4, 5] >>> strand_sort([4, 2, 5, 3, 0, 1], reverse=True) [5, 4, 3, 2, 1, 0] """ _operator = operator.lt if reverse else operator.gt solution = solution or [] if not arr: return solution sublist = [arr.pop(0)] for i, item in enumerate(arr): if _operator(item, sublist[-1]): sublist.append(item) arr.pop(i) # merging sublist into solution list if not solution: solution.extend(sublist) else: while sublist: item = sublist.pop(0) for i, xx in enumerate(solution): if not _operator(item, xx): solution.insert(i, item) break else: solution.append(item) strand_sort(arr, reverse, solution) return solution if __name__ == "__main__": assert strand_sort([4, 3, 5, 1, 2]) == [1, 2, 3, 4, 5] assert strand_sort([4, 3, 5, 1, 2], reverse=True) == [5, 4, 3, 2, 1] ================================================ FILE: sorts/tim_sort.py ================================================ def binary_search(lst, item, start, end): if start == end: return start if lst[start] > item else start + 1 if start > end: return start mid = (start + end) // 2 if lst[mid] < item: return binary_search(lst, item, mid + 1, end) elif lst[mid] > item: return binary_search(lst, item, start, mid - 1) else: return mid def insertion_sort(lst): length = len(lst) for index in range(1, length): value = lst[index] pos = binary_search(lst, value, 0, index - 1) lst = [*lst[:pos], value, *lst[pos:index], *lst[index + 1 :]] return lst def merge(left, right): if not left: return right if not right: return left if left[0] < right[0]: return [left[0], *merge(left[1:], right)] return [right[0], *merge(left, right[1:])] def tim_sort(lst): """ >>> tim_sort("Python") ['P', 'h', 'n', 'o', 't', 'y'] >>> tim_sort((1.1, 1, 0, -1, -1.1)) [-1.1, -1, 0, 1, 1.1] >>> tim_sort(list(reversed(list(range(7))))) [0, 1, 2, 3, 4, 5, 6] >>> tim_sort([3, 2, 1]) == insertion_sort([3, 2, 1]) True >>> tim_sort([3, 2, 1]) == sorted([3, 2, 1]) True """ length = len(lst) runs, sorted_runs = [], [] new_run = [lst[0]] sorted_array = [] i = 1 while i < length: if lst[i] < lst[i - 1]: runs.append(new_run) new_run = [lst[i]] else: new_run.append(lst[i]) i += 1 runs.append(new_run) for run in runs: sorted_runs.append(insertion_sort(run)) for run in sorted_runs: sorted_array = merge(sorted_array, run) return sorted_array def main(): lst = [5, 9, 10, 3, -4, 5, 178, 92, 46, -18, 0, 7] sorted_lst = tim_sort(lst) print(sorted_lst) if __name__ == "__main__": main() ================================================ FILE: sorts/topological_sort.py ================================================ """Topological Sort.""" # a # / \ # b c # / \ # d e edges: dict[str, list[str]] = { "a": ["c", "b"], "b": ["d", "e"], "c": [], "d": [], "e": [], } vertices: list[str] = ["a", "b", "c", "d", "e"] def topological_sort(start: str, visited: list[str], sort: list[str]) -> list[str]: """Perform topological sort on a directed acyclic graph.""" current = start # add current to visited visited.append(current) neighbors = edges[current] for neighbor in neighbors: # if neighbor not in visited, visit if neighbor not in visited: sort = topological_sort(neighbor, visited, sort) # if all neighbors visited add current to sort sort.append(current) # if all vertices haven't been visited select a new one to visit if len(visited) != len(vertices): for vertice in vertices: if vertice not in visited: sort = topological_sort(vertice, visited, sort) # return sort return sort if __name__ == "__main__": sort = topological_sort("a", [], []) print(sort) ================================================ FILE: sorts/tree_sort.py ================================================ """ Tree_sort algorithm. Build a Binary Search Tree and then iterate thru it to get a sorted list. """ from __future__ import annotations from collections.abc import Iterator from dataclasses import dataclass @dataclass class Node: val: int left: Node | None = None right: Node | None = None def __iter__(self) -> Iterator[int]: if self.left: yield from self.left yield self.val if self.right: yield from self.right def __len__(self) -> int: return sum(1 for _ in self) def insert(self, val: int) -> None: if val < self.val: if self.left is None: self.left = Node(val) else: self.left.insert(val) elif val > self.val: if self.right is None: self.right = Node(val) else: self.right.insert(val) def tree_sort(arr: list[int]) -> tuple[int, ...]: """ >>> tree_sort([]) () >>> tree_sort((1,)) (1,) >>> tree_sort((1, 2)) (1, 2) >>> tree_sort([5, 2, 7]) (2, 5, 7) >>> tree_sort((5, -4, 9, 2, 7)) (-4, 2, 5, 7, 9) >>> tree_sort([5, 6, 1, -1, 4, 37, 2, 7]) (-1, 1, 2, 4, 5, 6, 7, 37) # >>> tree_sort(range(10, -10, -1)) == tuple(sorted(range(10, -10, -1))) # True """ if len(arr) == 0: return tuple(arr) root = Node(arr[0]) for item in arr[1:]: root.insert(item) return tuple(root) if __name__ == "__main__": import doctest doctest.testmod() print(f"{tree_sort([5, 6, 1, -1, 4, 37, -3, 7]) = }") ================================================ FILE: sorts/unknown_sort.py ================================================ """ Python implementation of a sort algorithm. Best Case Scenario : O(n) Worst Case Scenario : O(n^2) because native Python functions:min, max and remove are already O(n) """ def merge_sort(collection): """Pure implementation of the fastest merge sort algorithm in Python :param collection: some mutable ordered collection with heterogeneous comparable items inside :return: a collection ordered by ascending Examples: >>> merge_sort([0, 5, 3, 2, 2]) [0, 2, 2, 3, 5] >>> merge_sort([]) [] >>> merge_sort([-2, -5, -45]) [-45, -5, -2] """ start, end = [], [] while len(collection) > 1: min_one, max_one = min(collection), max(collection) start.append(min_one) end.append(max_one) collection.remove(min_one) collection.remove(max_one) end.reverse() return start + collection + end if __name__ == "__main__": user_input = input("Enter numbers separated by a comma:\n").strip() unsorted = [int(item) for item in user_input.split(",")] print(*merge_sort(unsorted), sep=",") ================================================ FILE: sorts/wiggle_sort.py ================================================ """ Wiggle Sort. Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] < nums[3].... For example: if input numbers = [3, 5, 2, 1, 6, 4] one possible Wiggle Sorted answer is [3, 5, 1, 6, 2, 4]. """ def wiggle_sort(nums: list) -> list: """ Python implementation of wiggle. Example: >>> wiggle_sort([0, 5, 3, 2, 2]) [0, 5, 2, 3, 2] >>> wiggle_sort([]) [] >>> wiggle_sort([-2, -5, -45]) [-45, -2, -5] >>> wiggle_sort([-2.1, -5.68, -45.11]) [-45.11, -2.1, -5.68] """ for i, _ in enumerate(nums): if (i % 2 == 1) == (nums[i - 1] > nums[i]): nums[i - 1], nums[i] = nums[i], nums[i - 1] return nums if __name__ == "__main__": print("Enter the array elements:") array = list(map(int, input().split())) print("The unsorted array is:") print(array) print("Array after Wiggle sort:") print(wiggle_sort(array)) ================================================ FILE: strings/__init__.py ================================================ ================================================ FILE: strings/aho_corasick.py ================================================ from __future__ import annotations from collections import deque class Automaton: def __init__(self, keywords: list[str]): self.adlist: list[dict] = [] self.adlist.append( {"value": "", "next_states": [], "fail_state": 0, "output": []} ) for keyword in keywords: self.add_keyword(keyword) self.set_fail_transitions() def find_next_state(self, current_state: int, char: str) -> int | None: for state in self.adlist[current_state]["next_states"]: if char == self.adlist[state]["value"]: return state return None def add_keyword(self, keyword: str) -> None: current_state = 0 for character in keyword: next_state = self.find_next_state(current_state, character) if next_state is None: self.adlist.append( { "value": character, "next_states": [], "fail_state": 0, "output": [], } ) self.adlist[current_state]["next_states"].append(len(self.adlist) - 1) current_state = len(self.adlist) - 1 else: current_state = next_state self.adlist[current_state]["output"].append(keyword) def set_fail_transitions(self) -> None: q: deque = deque() for node in self.adlist[0]["next_states"]: q.append(node) self.adlist[node]["fail_state"] = 0 while q: r = q.popleft() for child in self.adlist[r]["next_states"]: q.append(child) state = self.adlist[r]["fail_state"] while ( self.find_next_state(state, self.adlist[child]["value"]) is None and state != 0 ): state = self.adlist[state]["fail_state"] self.adlist[child]["fail_state"] = self.find_next_state( state, self.adlist[child]["value"] ) if self.adlist[child]["fail_state"] is None: self.adlist[child]["fail_state"] = 0 self.adlist[child]["output"] = ( self.adlist[child]["output"] + self.adlist[self.adlist[child]["fail_state"]]["output"] ) def search_in(self, string: str) -> dict[str, list[int]]: """ >>> A = Automaton(["what", "hat", "ver", "er"]) >>> A.search_in("whatever, err ... , wherever") {'what': [0], 'hat': [1], 'ver': [5, 25], 'er': [6, 10, 22, 26]} """ result: dict = {} # returns a dict with keywords and list of its occurrences current_state = 0 for i in range(len(string)): while ( self.find_next_state(current_state, string[i]) is None and current_state != 0 ): current_state = self.adlist[current_state]["fail_state"] next_state = self.find_next_state(current_state, string[i]) if next_state is None: current_state = 0 else: current_state = next_state for key in self.adlist[current_state]["output"]: if key not in result: result[key] = [] result[key].append(i - len(key) + 1) return result if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: strings/alternative_string_arrange.py ================================================ def alternative_string_arrange(first_str: str, second_str: str) -> str: """ Return the alternative arrangements of the two strings. :param first_str: :param second_str: :return: String >>> alternative_string_arrange("ABCD", "XY") 'AXBYCD' >>> alternative_string_arrange("XY", "ABCD") 'XAYBCD' >>> alternative_string_arrange("AB", "XYZ") 'AXBYZ' >>> alternative_string_arrange("ABC", "") 'ABC' """ first_str_length: int = len(first_str) second_str_length: int = len(second_str) abs_length: int = ( first_str_length if first_str_length > second_str_length else second_str_length ) output_list: list = [] for char_count in range(abs_length): if char_count < first_str_length: output_list.append(first_str[char_count]) if char_count < second_str_length: output_list.append(second_str[char_count]) return "".join(output_list) if __name__ == "__main__": print(alternative_string_arrange("AB", "XYZ"), end=" ") ================================================ FILE: strings/anagrams.py ================================================ from __future__ import annotations import collections import pprint from pathlib import Path def signature(word: str) -> str: """ Return a word's frequency-based signature. >>> signature("test") 'e1s1t2' >>> signature("this is a test") ' 3a1e1h1i2s3t3' >>> signature("finaltest") 'a1e1f1i1l1n1s1t2' """ frequencies = collections.Counter(word) return "".join( f"{char}{frequency}" for char, frequency in sorted(frequencies.items()) ) def anagram(my_word: str) -> list[str]: """ Return every anagram of the given word from the dictionary. >>> anagram('test') ['sett', 'stet', 'test'] >>> anagram('this is a test') [] >>> anagram('final') ['final'] """ return word_by_signature[signature(my_word)] data: str = Path(__file__).parent.joinpath("words.txt").read_text(encoding="utf-8") word_list = sorted({word.strip().lower() for word in data.splitlines()}) word_by_signature = collections.defaultdict(list) for word in word_list: word_by_signature[signature(word)].append(word) if __name__ == "__main__": all_anagrams = {word: anagram(word) for word in word_list if len(anagram(word)) > 1} with open("anagrams.txt", "w") as file: file.write("all_anagrams = \n") file.write(pprint.pformat(all_anagrams)) ================================================ FILE: strings/anagrams.txt ================================================ all_anagrams = {'aal': ['aal', 'ala'], 'aam': ['aam', 'ama'], 'aaronic': ['aaronic', 'nicarao', 'ocarina'], 'aaronite': ['aaronite', 'aeration'], 'aaru': ['aaru', 'aura'], 'ab': ['ab', 'ba'], 'aba': ['aba', 'baa'], 'abac': ['abac', 'caba'], 'abactor': ['abactor', 'acrobat'], 'abaft': ['abaft', 'bafta'], 'abalone': ['abalone', 'balonea'], 'abandoner': ['abandoner', 'reabandon'], 'abanic': ['abanic', 'bianca'], 'abaris': ['abaris', 'arabis'], 'abas': ['abas', 'saba'], 'abaser': ['abaser', 'abrase'], 'abate': ['abate', 'ateba', 'batea', 'beata'], 'abater': ['abater', 'artabe', 'eartab', 'trabea'], 'abb': ['abb', 'bab'], 'abba': ['abba', 'baba'], 'abbey': ['abbey', 'bebay'], 'abby': ['abby', 'baby'], 'abdat': ['abdat', 'batad'], 'abdiel': ['abdiel', 'baldie'], 'abdominovaginal': ['abdominovaginal', 'vaginoabdominal'], 'abdominovesical': ['abdominovesical', 'vesicoabdominal'], 'abe': ['abe', 'bae', 'bea'], 'abed': ['abed', 'bade', 'bead'], 'abel': ['abel', 'able', 'albe', 'bale', 'beal', 'bela', 'blae'], 'abele': ['abele', 'albee'], 'abelian': ['abelian', 'nebalia'], 'abenteric': ['abenteric', 'bicrenate'], 'aberia': ['aberia', 'baeria', 'baiera'], 'abet': ['abet', 'bate', 'beat', 'beta'], 'abetment': ['abetment', 'batement'], 'abettor': ['abettor', 'taboret'], 'abhorrent': ['abhorrent', 'earthborn'], 'abhorrer': ['abhorrer', 'harborer'], 'abider': ['abider', 'bardie'], 'abies': ['abies', 'beisa'], 'abilla': ['abilla', 'labial'], 'abilo': ['abilo', 'aboil'], 'abir': ['abir', 'bari', 'rabi'], 'abiston': ['abiston', 'bastion'], 'abiuret': ['abiuret', 'aubrite', 'biurate', 'rubiate'], 'abkar': ['abkar', 'arkab'], 'abkhas': ['abkhas', 'kasbah'], 'ablactate': ['ablactate', 'cabaletta'], 'ablare': ['ablare', 'arable', 'arbela'], 'ablastemic': ['ablastemic', 'masticable'], 'ablation': ['ablation', 'obtainal'], 'ablaut': ['ablaut', 'tabula'], 'able': ['abel', 'able', 'albe', 'bale', 'beal', 'bela', 'blae'], 'ableness': ['ableness', 'blaeness', 'sensable'], 'ablepsia': ['ablepsia', 'epibasal'], 'abler': ['abler', 'baler', 'belar', 'blare', 'blear'], 'ablest': ['ablest', 'stable', 'tables'], 'abloom': ['abloom', 'mabolo'], 'ablow': ['ablow', 'balow', 'bowla'], 'ablude': ['ablude', 'belaud'], 'abluent': ['abluent', 'tunable'], 'ablution': ['ablution', 'abutilon'], 'ably': ['ably', 'blay', 'yalb'], 'abmho': ['abmho', 'abohm'], 'abner': ['abner', 'arneb', 'reban'], 'abnet': ['abnet', 'beant'], 'abo': ['abo', 'boa'], 'aboard': ['aboard', 'aborad', 'abroad'], 'abode': ['abode', 'adobe'], 'abohm': ['abmho', 'abohm'], 'aboil': ['abilo', 'aboil'], 'abolisher': ['abolisher', 'reabolish'], 'abongo': ['abongo', 'gaboon'], 'aborad': ['aboard', 'aborad', 'abroad'], 'aboral': ['aboral', 'arbalo'], 'abord': ['abord', 'bardo', 'board', 'broad', 'dobra', 'dorab'], 'abort': ['abort', 'tabor'], 'aborticide': ['aborticide', 'bacterioid'], 'abortient': ['abortient', 'torbanite'], 'abortin': ['abortin', 'taborin'], 'abortion': ['abortion', 'robotian'], 'abortive': ['abortive', 'bravoite'], 'abouts': ['abouts', 'basuto'], 'abram': ['abram', 'ambar'], 'abramis': ['abramis', 'arabism'], 'abrasax': ['abrasax', 'abraxas'], 'abrase': ['abaser', 'abrase'], 'abrasion': ['abrasion', 'sorabian'], 'abrastol': ['abrastol', 'albatros'], 'abraxas': ['abrasax', 'abraxas'], 'abreact': ['abreact', 'bractea', 'cabaret'], 'abret': ['abret', 'bater', 'berat'], 'abridge': ['abridge', 'brigade'], 'abrim': ['abrim', 'birma'], 'abrin': ['abrin', 'bairn', 'brain', 'brian', 'rabin'], 'abristle': ['abristle', 'libertas'], 'abroad': ['aboard', 'aborad', 'abroad'], 'abrotine': ['abrotine', 'baritone', 'obtainer', 'reobtain'], 'abrus': ['abrus', 'bursa', 'subra'], 'absalom': ['absalom', 'balsamo'], 'abscise': ['abscise', 'scabies'], 'absent': ['absent', 'basten'], 'absenter': ['absenter', 'reabsent'], 'absi': ['absi', 'bais', 'bias', 'isba'], 'absit': ['absit', 'batis'], 'absmho': ['absmho', 'absohm'], 'absohm': ['absmho', 'absohm'], 'absorber': ['absorber', 'reabsorb'], 'absorpt': ['absorpt', 'barpost'], 'abthain': ['abthain', 'habitan'], 'abulic': ['abulic', 'baculi'], 'abut': ['abut', 'tabu', 'tuba'], 'abuta': ['abuta', 'bauta'], 'abutilon': ['ablution', 'abutilon'], 'aby': ['aby', 'bay'], 'abysmal': ['abysmal', 'balsamy'], 'academite': ['academite', 'acetamide'], 'acadie': ['acadie', 'acedia', 'adicea'], 'acaleph': ['acaleph', 'acephal'], 'acalepha': ['acalepha', 'acephala'], 'acalephae': ['acalephae', 'apalachee'], 'acalephan': ['acalephan', 'acephalan'], 'acalyptrate': ['acalyptrate', 'calyptratae'], 'acamar': ['acamar', 'camara', 'maraca'], 'acanth': ['acanth', 'anchat', 'tanach'], 'acanthia': ['acanthia', 'achatina'], 'acanthial': ['acanthial', 'calathian'], 'acanthin': ['acanthin', 'chinanta'], 'acara': ['acara', 'araca'], 'acardia': ['acardia', 'acarida', 'arcadia'], 'acarian': ['acarian', 'acarina', 'acrania'], 'acarid': ['acarid', 'cardia', 'carida'], 'acarida': ['acardia', 'acarida', 'arcadia'], 'acarina': ['acarian', 'acarina', 'acrania'], 'acarine': ['acarine', 'acraein', 'arecain'], 'acastus': ['acastus', 'astacus'], 'acatholic': ['acatholic', 'chaotical'], 'acaudate': ['acaudate', 'ecaudata'], 'acca': ['acca', 'caca'], 'accelerator': ['accelerator', 'retrocaecal'], 'acception': ['acception', 'peccation'], 'accessioner': ['accessioner', 'reaccession'], 'accipitres': ['accipitres', 'preascitic'], 'accite': ['accite', 'acetic'], 'acclinate': ['acclinate', 'analectic'], 'accoil': ['accoil', 'calico'], 'accomplisher': ['accomplisher', 'reaccomplish'], 'accompt': ['accompt', 'compact'], 'accorder': ['accorder', 'reaccord'], 'accoy': ['accoy', 'ccoya'], 'accretion': ['accretion', 'anorectic', 'neoarctic'], 'accrual': ['accrual', 'carucal'], 'accurate': ['accurate', 'carucate'], 'accurse': ['accurse', 'accuser'], 'accusable': ['accusable', 'subcaecal'], 'accused': ['accused', 'succade'], 'accuser': ['accurse', 'accuser'], 'acedia': ['acadie', 'acedia', 'adicea'], 'acedy': ['acedy', 'decay'], 'acentric': ['acentric', 'encratic', 'nearctic'], 'acentrous': ['acentrous', 'courtesan', 'nectarous'], 'acephal': ['acaleph', 'acephal'], 'acephala': ['acalepha', 'acephala'], 'acephalan': ['acalephan', 'acephalan'], 'acephali': ['acephali', 'phacelia'], 'acephalina': ['acephalina', 'phalaecian'], 'acer': ['acer', 'acre', 'care', 'crea', 'race'], 'aceraceae': ['aceraceae', 'arecaceae'], 'aceraceous': ['aceraceous', 'arecaceous'], 'acerb': ['acerb', 'brace', 'caber'], 'acerbic': ['acerbic', 'breccia'], 'acerdol': ['acerdol', 'coraled'], 'acerin': ['acerin', 'cearin'], 'acerous': ['acerous', 'carouse', 'euscaro'], 'acervate': ['acervate', 'revacate'], 'acervation': ['acervation', 'vacationer'], 'acervuline': ['acervuline', 'avirulence'], 'acetamide': ['academite', 'acetamide'], 'acetamido': ['acetamido', 'coadamite'], 'acetanilid': ['acetanilid', 'laciniated', 'teniacidal'], 'acetanion': ['acetanion', 'antoecian'], 'acetation': ['acetation', 'itaconate'], 'acetic': ['accite', 'acetic'], 'acetin': ['acetin', 'actine', 'enatic'], 'acetmethylanilide': ['acetmethylanilide', 'methylacetanilide'], 'acetoin': ['acetoin', 'aconite', 'anoetic', 'antoeci', 'cetonia'], 'acetol': ['acetol', 'colate', 'locate'], 'acetone': ['acetone', 'oceanet'], 'acetonuria': ['acetonuria', 'aeronautic'], 'acetopyrin': ['acetopyrin', 'capernoity'], 'acetous': ['acetous', 'outcase'], 'acetum': ['acetum', 'tecuma'], 'aceturic': ['aceturic', 'cruciate'], 'ach': ['ach', 'cha'], 'achar': ['achar', 'chara'], 'achate': ['achate', 'chaeta'], 'achatina': ['acanthia', 'achatina'], 'ache': ['ache', 'each', 'haec'], 'acheirus': ['acheirus', 'eucharis'], 'achen': ['achen', 'chane', 'chena', 'hance'], 'acher': ['acher', 'arche', 'chare', 'chera', 'rache', 'reach'], 'acherontic': ['acherontic', 'anchoretic'], 'acherontical': ['acherontical', 'anchoretical'], 'achete': ['achete', 'hecate', 'teache', 'thecae'], 'acheulean': ['acheulean', 'euchlaena'], 'achill': ['achill', 'cahill', 'chilla'], 'achillea': ['achillea', 'heliacal'], 'acholia': ['acholia', 'alochia'], 'achondrite': ['achondrite', 'ditrochean', 'ordanchite'], 'achor': ['achor', 'chora', 'corah', 'orach', 'roach'], 'achras': ['achras', 'charas'], 'achromat': ['achromat', 'trachoma'], 'achromatin': ['achromatin', 'chariotman', 'machinator'], 'achromatinic': ['achromatinic', 'chromatician'], 'achtel': ['achtel', 'chalet', 'thecal', 'thecla'], 'achy': ['achy', 'chay'], 'aciculated': ['aciculated', 'claudicate'], 'acid': ['acid', 'cadi', 'caid'], 'acidanthera': ['acidanthera', 'cantharidae'], 'acider': ['acider', 'ericad'], 'acidimeter': ['acidimeter', 'mediatrice'], 'acidity': ['acidity', 'adicity'], 'acidly': ['acidly', 'acidyl'], 'acidometry': ['acidometry', 'medicatory', 'radiectomy'], 'acidophilous': ['acidophilous', 'aphidicolous'], 'acidyl': ['acidly', 'acidyl'], 'acier': ['acier', 'aeric', 'ceria', 'erica'], 'acieral': ['acieral', 'aerical'], 'aciform': ['aciform', 'formica'], 'acilius': ['acilius', 'iliacus'], 'acinar': ['acinar', 'arnica', 'canari', 'carian', 'carina', 'crania', 'narica'], 'acinic': ['acinic', 'incaic'], 'aciniform': ['aciniform', 'formicina'], 'acipenserid': ['acipenserid', 'presidencia'], 'acis': ['acis', 'asci', 'saic'], 'acker': ['acker', 'caker', 'crake', 'creak'], 'ackey': ['ackey', 'cakey'], 'acle': ['acle', 'alec', 'lace'], 'acleistous': ['acleistous', 'ossiculate'], 'aclemon': ['aclemon', 'cloamen'], 'aclinal': ['aclinal', 'ancilla'], 'aclys': ['aclys', 'scaly'], 'acme': ['acme', 'came', 'mace'], 'acmite': ['acmite', 'micate'], 'acne': ['acne', 'cane', 'nace'], 'acnemia': ['acnemia', 'anaemic'], 'acnida': ['acnida', 'anacid', 'dacian'], 'acnodal': ['acnodal', 'canadol', 'locanda'], 'acnode': ['acnode', 'deacon'], 'acoin': ['acoin', 'oncia'], 'acoma': ['acoma', 'macao'], 'acone': ['acone', 'canoe', 'ocean'], 'aconital': ['aconital', 'actional', 'anatolic'], 'aconite': ['acetoin', 'aconite', 'anoetic', 'antoeci', 'cetonia'], 'aconitic': ['aconitic', 'cationic', 'itaconic'], 'aconitin': ['aconitin', 'inaction', 'nicotian'], 'aconitum': ['aconitum', 'acontium'], 'acontias': ['acontias', 'tacsonia'], 'acontium': ['aconitum', 'acontium'], 'acontius': ['acontius', 'anticous'], 'acopon': ['acopon', 'poonac'], 'acor': ['acor', 'caro', 'cora', 'orca'], 'acorn': ['acorn', 'acron', 'racon'], 'acorus': ['acorus', 'soucar'], 'acosmist': ['acosmist', 'massicot', 'somatics'], 'acquest': ['acquest', 'casquet'], 'acrab': ['acrab', 'braca'], 'acraein': ['acarine', 'acraein', 'arecain'], 'acrania': ['acarian', 'acarina', 'acrania'], 'acraniate': ['acraniate', 'carinatae'], 'acratia': ['acratia', 'cataria'], 'acre': ['acer', 'acre', 'care', 'crea', 'race'], 'acream': ['acream', 'camera', 'mareca'], 'acred': ['acred', 'cader', 'cadre', 'cedar'], 'acrid': ['acrid', 'caird', 'carid', 'darci', 'daric', 'dirca'], 'acridan': ['acridan', 'craniad'], 'acridian': ['acridian', 'cnidaria'], 'acrididae': ['acrididae', 'cardiidae', 'cidaridae'], 'acridly': ['acridly', 'acridyl'], 'acridonium': ['acridonium', 'dicoumarin'], 'acridyl': ['acridly', 'acridyl'], 'acrimonious': ['acrimonious', 'isocoumarin'], 'acrisius': ['acrisius', 'sicarius'], 'acrita': ['acrita', 'arctia'], 'acritan': ['acritan', 'arctian'], 'acrite': ['acrite', 'arcite', 'tercia', 'triace', 'tricae'], 'acroa': ['acroa', 'caroa'], 'acrobat': ['abactor', 'acrobat'], 'acrocera': ['acrocera', 'caracore'], 'acroclinium': ['acroclinium', 'alcicornium'], 'acrodus': ['acrodus', 'crusado'], 'acrogen': ['acrogen', 'cornage'], 'acrolein': ['acrolein', 'arecolin', 'caroline', 'colinear', 'cornelia', 'creolian', 'lonicera'], 'acrolith': ['acrolith', 'trochila'], 'acron': ['acorn', 'acron', 'racon'], 'acronical': ['acronical', 'alcoranic'], 'acronym': ['acronym', 'romancy'], 'acropetal': ['acropetal', 'cleopatra'], 'acrose': ['acrose', 'coarse'], 'acrostic': ['acrostic', 'sarcotic', 'socratic'], 'acrostical': ['acrostical', 'socratical'], 'acrostically': ['acrostically', 'socratically'], 'acrosticism': ['acrosticism', 'socraticism'], 'acrotic': ['acrotic', 'carotic'], 'acrotism': ['acrotism', 'rotacism'], 'acrotrophic': ['acrotrophic', 'prothoracic'], 'acryl': ['acryl', 'caryl', 'clary'], 'act': ['act', 'cat'], 'actaeonidae': ['actaeonidae', 'donatiaceae'], 'actian': ['actian', 'natica', 'tanica'], 'actifier': ['actifier', 'artifice'], 'actin': ['actin', 'antic'], 'actinal': ['actinal', 'alantic', 'alicant', 'antical'], 'actine': ['acetin', 'actine', 'enatic'], 'actiniform': ['actiniform', 'naticiform'], 'actinine': ['actinine', 'naticine'], 'actinism': ['actinism', 'manistic'], 'actinogram': ['actinogram', 'morganatic'], 'actinoid': ['actinoid', 'diatonic', 'naticoid'], 'actinon': ['actinon', 'cantion', 'contain'], 'actinopteran': ['actinopteran', 'precantation'], 'actinopteri': ['actinopteri', 'crepitation', 'precitation'], 'actinost': ['actinost', 'oscitant'], 'actinula': ['actinula', 'nautical'], 'action': ['action', 'atonic', 'cation'], 'actional': ['aconital', 'actional', 'anatolic'], 'actioner': ['actioner', 'anerotic', 'ceration', 'creation', 'reaction'], 'activable': ['activable', 'biclavate'], 'activate': ['activate', 'cavitate'], 'activation': ['activation', 'cavitation'], 'activin': ['activin', 'civitan'], 'actomyosin': ['actomyosin', 'inocystoma'], 'acton': ['acton', 'canto', 'octan'], 'actor': ['actor', 'corta', 'croat', 'rocta', 'taroc', 'troca'], 'actorship': ['actorship', 'strophaic'], 'acts': ['acts', 'cast', 'scat'], 'actuator': ['actuator', 'autocrat'], 'acture': ['acture', 'cauter', 'curate'], 'acuan': ['acuan', 'aucan'], 'acubens': ['acubens', 'benacus'], 'acumen': ['acumen', 'cueman'], 'acuminose': ['acuminose', 'mniaceous'], 'acutenaculum': ['acutenaculum', 'unaccumulate'], 'acuteness': ['acuteness', 'encaustes'], 'acutorsion': ['acutorsion', 'octonarius'], 'acyl': ['acyl', 'clay', 'lacy'], 'acylation': ['acylation', 'claytonia'], 'acylogen': ['acylogen', 'cynogale'], 'ad': ['ad', 'da'], 'adad': ['adad', 'adda', 'dada'], 'adage': ['adage', 'agade'], 'adam': ['adam', 'dama'], 'adamic': ['adamic', 'cadmia'], 'adamine': ['adamine', 'manidae'], 'adamite': ['adamite', 'amidate'], 'adamsite': ['adamsite', 'diastema'], 'adance': ['adance', 'ecanda'], 'adapter': ['adapter', 'predata', 'readapt'], 'adaption': ['adaption', 'adoptian'], 'adaptionism': ['adaptionism', 'adoptianism'], 'adar': ['adar', 'arad', 'raad', 'rada'], 'adarme': ['adarme', 'adream'], 'adat': ['adat', 'data'], 'adawn': ['adawn', 'wadna'], 'adays': ['adays', 'dasya'], 'add': ['add', 'dad'], 'adda': ['adad', 'adda', 'dada'], 'addendum': ['addendum', 'unmadded'], 'adder': ['adder', 'dread', 'readd'], 'addicent': ['addicent', 'dedicant'], 'addlings': ['addlings', 'saddling'], 'addresser': ['addresser', 'readdress'], 'addu': ['addu', 'dadu', 'daud', 'duad'], 'addy': ['addy', 'dyad'], 'ade': ['ade', 'dae'], 'adeem': ['adeem', 'ameed', 'edema'], 'adela': ['adela', 'dalea'], 'adeline': ['adeline', 'daniele', 'delaine'], 'adeling': ['adeling', 'dealing', 'leading'], 'adelops': ['adelops', 'deposal'], 'ademonist': ['ademonist', 'demoniast', 'staminode'], 'ademption': ['ademption', 'tampioned'], 'adendric': ['adendric', 'riddance'], 'adenectopic': ['adenectopic', 'pentadecoic'], 'adenia': ['adenia', 'idaean'], 'adenochondroma': ['adenochondroma', 'chondroadenoma'], 'adenocystoma': ['adenocystoma', 'cystoadenoma'], 'adenofibroma': ['adenofibroma', 'fibroadenoma'], 'adenolipoma': ['adenolipoma', 'palaemonoid'], 'adenosarcoma': ['adenosarcoma', 'sarcoadenoma'], 'adenylic': ['adenylic', 'lycaenid'], 'adeptness': ['adeptness', 'pedantess'], 'adequation': ['adequation', 'deaquation'], 'adermia': ['adermia', 'madeira'], 'adermin': ['adermin', 'amerind', 'dimeran'], 'adet': ['adet', 'date', 'tade', 'tead', 'teda'], 'adevism': ['adevism', 'vedaism'], 'adhere': ['adhere', 'header', 'hedera', 'rehead'], 'adherent': ['adherent', 'headrent', 'neatherd', 'threaden'], 'adiaphon': ['adiaphon', 'aphodian'], 'adib': ['adib', 'ibad'], 'adicea': ['acadie', 'acedia', 'adicea'], 'adicity': ['acidity', 'adicity'], 'adiel': ['adiel', 'delia', 'ideal'], 'adieux': ['adieux', 'exaudi'], 'adighe': ['adighe', 'hidage'], 'adin': ['adin', 'andi', 'dain', 'dani', 'dian', 'naid'], 'adinole': ['adinole', 'idoneal'], 'adion': ['adion', 'danio', 'doina', 'donia'], 'adipocele': ['adipocele', 'cepolidae', 'ploceidae'], 'adipocere': ['adipocere', 'percoidea'], 'adipyl': ['adipyl', 'plaidy'], 'adit': ['adit', 'dita'], 'adital': ['adital', 'altaid'], 'aditus': ['aditus', 'studia'], 'adjuster': ['adjuster', 'readjust'], 'adlai': ['adlai', 'alida'], 'adlay': ['adlay', 'dayal'], 'adlet': ['adlet', 'dealt', 'delta', 'lated', 'taled'], 'adlumine': ['adlumine', 'unmailed'], 'adman': ['adman', 'daman', 'namda'], 'admi': ['admi', 'amid', 'madi', 'maid'], 'adminicle': ['adminicle', 'medicinal'], 'admire': ['admire', 'armied', 'damier', 'dimera', 'merida'], 'admired': ['admired', 'diaderm'], 'admirer': ['admirer', 'madrier', 'married'], 'admissive': ['admissive', 'misadvise'], 'admit': ['admit', 'atmid'], 'admittee': ['admittee', 'meditate'], 'admonisher': ['admonisher', 'rhamnoside'], 'admonition': ['admonition', 'domination'], 'admonitive': ['admonitive', 'dominative'], 'admonitor': ['admonitor', 'dominator'], 'adnascence': ['adnascence', 'ascendance'], 'adnascent': ['adnascent', 'ascendant'], 'adnate': ['adnate', 'entada'], 'ado': ['ado', 'dao', 'oda'], 'adobe': ['abode', 'adobe'], 'adolph': ['adolph', 'pholad'], 'adonai': ['adonai', 'adonia'], 'adonia': ['adonai', 'adonia'], 'adonic': ['adonic', 'anodic'], 'adonin': ['adonin', 'nanoid', 'nonaid'], 'adoniram': ['adoniram', 'radioman'], 'adonize': ['adonize', 'anodize'], 'adopter': ['adopter', 'protead', 'readopt'], 'adoptian': ['adaption', 'adoptian'], 'adoptianism': ['adaptionism', 'adoptianism'], 'adoptional': ['adoptional', 'aplodontia'], 'adorability': ['adorability', 'roadability'], 'adorable': ['adorable', 'roadable'], 'adorant': ['adorant', 'ondatra'], 'adore': ['adore', 'oared', 'oread'], 'adorer': ['adorer', 'roader'], 'adorn': ['adorn', 'donar', 'drona', 'radon'], 'adorner': ['adorner', 'readorn'], 'adpao': ['adpao', 'apoda'], 'adpromission': ['adpromission', 'proadmission'], 'adream': ['adarme', 'adream'], 'adrenin': ['adrenin', 'nardine'], 'adrenine': ['adrenine', 'adrienne'], 'adrenolytic': ['adrenolytic', 'declinatory'], 'adrenotropic': ['adrenotropic', 'incorporated'], 'adrian': ['adrian', 'andira', 'andria', 'radian', 'randia'], 'adrienne': ['adrenine', 'adrienne'], 'adrip': ['adrip', 'rapid'], 'adroitly': ['adroitly', 'dilatory', 'idolatry'], 'adrop': ['adrop', 'pardo'], 'adry': ['adry', 'dray', 'yard'], 'adscendent': ['adscendent', 'descendant'], 'adsmith': ['adsmith', 'mahdist'], 'adular': ['adular', 'aludra', 'radula'], 'adulation': ['adulation', 'laudation'], 'adulator': ['adulator', 'laudator'], 'adulatory': ['adulatory', 'laudatory'], 'adult': ['adult', 'dulat'], 'adulterine': ['adulterine', 'laurentide'], 'adultness': ['adultness', 'dauntless'], 'adustion': ['adustion', 'sudation'], 'advene': ['advene', 'evadne'], 'adventism': ['adventism', 'vedantism'], 'adventist': ['adventist', 'vedantist'], 'adventure': ['adventure', 'unaverted'], 'advice': ['advice', 'vedaic'], 'ady': ['ady', 'day', 'yad'], 'adz': ['adz', 'zad'], 'adze': ['adze', 'daze'], 'adzer': ['adzer', 'zerda'], 'ae': ['ae', 'ea'], 'aecidioform': ['aecidioform', 'formicoidea'], 'aedilian': ['aedilian', 'laniidae'], 'aedilic': ['aedilic', 'elaidic'], 'aedility': ['aedility', 'ideality'], 'aegipan': ['aegipan', 'apinage'], 'aegirine': ['aegirine', 'erigenia'], 'aegirite': ['aegirite', 'ariegite'], 'aegle': ['aegle', 'eagle', 'galee'], 'aenean': ['aenean', 'enaena'], 'aeolharmonica': ['aeolharmonica', 'chloroanaemia'], 'aeolian': ['aeolian', 'aeolina', 'aeonial'], 'aeolic': ['aeolic', 'coelia'], 'aeolina': ['aeolian', 'aeolina', 'aeonial'], 'aeolis': ['aeolis', 'laiose'], 'aeolist': ['aeolist', 'isolate'], 'aeolistic': ['aeolistic', 'socialite'], 'aeon': ['aeon', 'eoan'], 'aeonial': ['aeolian', 'aeolina', 'aeonial'], 'aeonist': ['aeonist', 'asiento', 'satieno'], 'aer': ['aer', 'are', 'ear', 'era', 'rea'], 'aerage': ['aerage', 'graeae'], 'aerarian': ['aerarian', 'arenaria'], 'aeration': ['aaronite', 'aeration'], 'aerial': ['aerial', 'aralie'], 'aeric': ['acier', 'aeric', 'ceria', 'erica'], 'aerical': ['acieral', 'aerical'], 'aeried': ['aeried', 'dearie'], 'aerogenic': ['aerogenic', 'recoinage'], 'aerographer': ['aerographer', 'areographer'], 'aerographic': ['aerographic', 'areographic'], 'aerographical': ['aerographical', 'areographical'], 'aerography': ['aerography', 'areography'], 'aerologic': ['aerologic', 'areologic'], 'aerological': ['aerological', 'areological'], 'aerologist': ['aerologist', 'areologist'], 'aerology': ['aerology', 'areology'], 'aeromantic': ['aeromantic', 'cameration', 'maceration', 'racemation'], 'aerometer': ['aerometer', 'areometer'], 'aerometric': ['aerometric', 'areometric'], 'aerometry': ['aerometry', 'areometry'], 'aeronautic': ['acetonuria', 'aeronautic'], 'aeronautism': ['aeronautism', 'measuration'], 'aerope': ['aerope', 'operae'], 'aerophilic': ['aerophilic', 'epichorial'], 'aerosol': ['aerosol', 'roseola'], 'aerostatics': ['aerostatics', 'aortectasis'], 'aery': ['aery', 'eyra', 'yare', 'year'], 'aes': ['aes', 'ase', 'sea'], 'aesthetic': ['aesthetic', 'chaetites'], 'aethalioid': ['aethalioid', 'haliotidae'], 'aetian': ['aetian', 'antiae', 'taenia'], 'aetobatus': ['aetobatus', 'eastabout'], 'afebrile': ['afebrile', 'balefire', 'fireable'], 'afenil': ['afenil', 'finale'], 'affair': ['affair', 'raffia'], 'affecter': ['affecter', 'reaffect'], 'affeer': ['affeer', 'raffee'], 'affiance': ['affiance', 'caffeina'], 'affirmer': ['affirmer', 'reaffirm'], 'afflicter': ['afflicter', 'reafflict'], 'affy': ['affy', 'yaff'], 'afghan': ['afghan', 'hafgan'], 'afield': ['afield', 'defial'], 'afire': ['afire', 'feria'], 'aflare': ['aflare', 'rafael'], 'aflat': ['aflat', 'fatal'], 'afresh': ['afresh', 'fasher', 'ferash'], 'afret': ['afret', 'after'], 'afric': ['afric', 'firca'], 'afshar': ['afshar', 'ashraf'], 'aft': ['aft', 'fat'], 'after': ['afret', 'after'], 'afteract': ['afteract', 'artefact', 'farcetta', 'farctate'], 'afterage': ['afterage', 'fregatae'], 'afterblow': ['afterblow', 'batfowler'], 'aftercome': ['aftercome', 'forcemeat'], 'aftercrop': ['aftercrop', 'prefactor'], 'aftergo': ['aftergo', 'fagoter'], 'afterguns': ['afterguns', 'transfuge'], 'aftermath': ['aftermath', 'hamfatter'], 'afterstate': ['afterstate', 'aftertaste'], 'aftertaste': ['afterstate', 'aftertaste'], 'afunctional': ['afunctional', 'unfactional'], 'agade': ['adage', 'agade'], 'agal': ['agal', 'agla', 'alga', 'gala'], 'agalite': ['agalite', 'tailage', 'taliage'], 'agalma': ['agalma', 'malaga'], 'agama': ['agama', 'amaga'], 'agamid': ['agamid', 'madiga'], 'agapeti': ['agapeti', 'agpaite'], 'agapornis': ['agapornis', 'sporangia'], 'agar': ['agar', 'agra', 'gara', 'raga'], 'agaricin': ['agaricin', 'garcinia'], 'agau': ['agau', 'agua'], 'aged': ['aged', 'egad', 'gade'], 'ageless': ['ageless', 'eagless'], 'agen': ['agen', 'gaen', 'gane', 'gean', 'gena'], 'agenesic': ['agenesic', 'genesiac'], 'agenesis': ['agenesis', 'assignee'], 'agential': ['agential', 'alginate'], 'agentive': ['agentive', 'negative'], 'ager': ['ager', 'agre', 'gare', 'gear', 'rage'], 'agger': ['agger', 'gager', 'regga'], 'aggeration': ['aggeration', 'agregation'], 'aggry': ['aggry', 'raggy'], 'agialid': ['agialid', 'galidia'], 'agib': ['agib', 'biga', 'gabi'], 'agiel': ['agiel', 'agile', 'galei'], 'agile': ['agiel', 'agile', 'galei'], 'agileness': ['agileness', 'signalese'], 'agistment': ['agistment', 'magnetist'], 'agistor': ['agistor', 'agrotis', 'orgiast'], 'agla': ['agal', 'agla', 'alga', 'gala'], 'aglaos': ['aglaos', 'salago'], 'aglare': ['aglare', 'alegar', 'galera', 'laager'], 'aglet': ['aglet', 'galet'], 'agley': ['agley', 'galey'], 'agmatine': ['agmatine', 'agminate'], 'agminate': ['agmatine', 'agminate'], 'agminated': ['agminated', 'diamagnet'], 'agnail': ['agnail', 'linaga'], 'agname': ['agname', 'manage'], 'agnel': ['agnel', 'angel', 'angle', 'galen', 'genal', 'glean', 'lagen'], 'agnes': ['agnes', 'gesan'], 'agnize': ['agnize', 'ganzie'], 'agnosis': ['agnosis', 'ganosis'], 'agnostic': ['agnostic', 'coasting'], 'agnus': ['agnus', 'angus', 'sugan'], 'ago': ['ago', 'goa'], 'agon': ['agon', 'ango', 'gaon', 'goan', 'gona'], 'agonal': ['agonal', 'angola'], 'agone': ['agone', 'genoa'], 'agoniadin': ['agoniadin', 'anangioid', 'ganoidian'], 'agonic': ['agonic', 'angico', 'gaonic', 'goniac'], 'agonista': ['agonista', 'santiago'], 'agonizer': ['agonizer', 'orangize', 'organize'], 'agpaite': ['agapeti', 'agpaite'], 'agra': ['agar', 'agra', 'gara', 'raga'], 'agral': ['agral', 'argal'], 'agrania': ['agrania', 'angaria', 'niagara'], 'agre': ['ager', 'agre', 'gare', 'gear', 'rage'], 'agree': ['agree', 'eager', 'eagre'], 'agreed': ['agreed', 'geared'], 'agregation': ['aggeration', 'agregation'], 'agrege': ['agrege', 'raggee'], 'agrestian': ['agrestian', 'gerastian', 'stangeria'], 'agrestic': ['agrestic', 'ergastic'], 'agria': ['agria', 'igara'], 'agricolist': ['agricolist', 'algoristic'], 'agrilus': ['agrilus', 'gularis'], 'agrin': ['agrin', 'grain'], 'agrito': ['agrito', 'ortiga'], 'agroan': ['agroan', 'angora', 'anogra', 'arango', 'argoan', 'onagra'], 'agrom': ['agrom', 'morga'], 'agrotis': ['agistor', 'agrotis', 'orgiast'], 'aground': ['aground', 'durango'], 'agrufe': ['agrufe', 'gaufer', 'gaufre'], 'agrypnia': ['agrypnia', 'paginary'], 'agsam': ['agsam', 'magas'], 'agua': ['agau', 'agua'], 'ague': ['ague', 'auge'], 'agush': ['agush', 'saugh'], 'agust': ['agust', 'tsuga'], 'agy': ['agy', 'gay'], 'ah': ['ah', 'ha'], 'ahem': ['ahem', 'haem', 'hame'], 'ahet': ['ahet', 'haet', 'hate', 'heat', 'thea'], 'ahey': ['ahey', 'eyah', 'yeah'], 'ahind': ['ahind', 'dinah'], 'ahint': ['ahint', 'hiant', 'tahin'], 'ahir': ['ahir', 'hair'], 'ahmed': ['ahmed', 'hemad'], 'ahmet': ['ahmet', 'thema'], 'aho': ['aho', 'hao'], 'ahom': ['ahom', 'moha'], 'ahong': ['ahong', 'hogan'], 'ahorse': ['ahorse', 'ashore', 'hoarse', 'shorea'], 'ahoy': ['ahoy', 'hoya'], 'ahriman': ['ahriman', 'miranha'], 'ahsan': ['ahsan', 'hansa', 'hasan'], 'aht': ['aht', 'hat', 'tha'], 'ahtena': ['ahtena', 'aneath', 'athena'], 'ahu': ['ahu', 'auh', 'hau'], 'ahum': ['ahum', 'huma'], 'ahunt': ['ahunt', 'haunt', 'thuan', 'unhat'], 'aid': ['aid', 'ida'], 'aidance': ['aidance', 'canidae'], 'aide': ['aide', 'idea'], 'aidenn': ['aidenn', 'andine', 'dannie', 'indane'], 'aider': ['aider', 'deair', 'irade', 'redia'], 'aides': ['aides', 'aside', 'sadie'], 'aiel': ['aiel', 'aile', 'elia'], 'aiglet': ['aiglet', 'ligate', 'taigle', 'tailge'], 'ail': ['ail', 'ila', 'lai'], 'ailantine': ['ailantine', 'antialien'], 'ailanto': ['ailanto', 'alation', 'laotian', 'notalia'], 'aile': ['aiel', 'aile', 'elia'], 'aileen': ['aileen', 'elaine'], 'aileron': ['aileron', 'alienor'], 'ailing': ['ailing', 'angili', 'nilgai'], 'ailment': ['ailment', 'aliment'], 'aim': ['aim', 'ami', 'ima'], 'aimer': ['aimer', 'maire', 'marie', 'ramie'], 'aimless': ['aimless', 'melissa', 'seismal'], 'ainaleh': ['ainaleh', 'halenia'], 'aint': ['aint', 'anti', 'tain', 'tina'], 'aion': ['aion', 'naio'], 'air': ['air', 'ira', 'ria'], 'aira': ['aira', 'aria', 'raia'], 'airan': ['airan', 'arain', 'arian'], 'airdrome': ['airdrome', 'armoried'], 'aire': ['aire', 'eria'], 'airer': ['airer', 'arrie'], 'airlike': ['airlike', 'kiliare'], 'airman': ['airman', 'amarin', 'marian', 'marina', 'mirana'], 'airplane': ['airplane', 'perianal'], 'airplanist': ['airplanist', 'triplasian'], 'airt': ['airt', 'rita', 'tari', 'tiar'], 'airy': ['airy', 'yair'], 'aisle': ['aisle', 'elias'], 'aisled': ['aisled', 'deasil', 'ladies', 'sailed'], 'aisling': ['aisling', 'sailing'], 'aissor': ['aissor', 'rissoa'], 'ait': ['ait', 'ati', 'ita', 'tai'], 'aitch': ['aitch', 'chait', 'chati', 'chita', 'taich', 'tchai'], 'aition': ['aition', 'itonia'], 'aizle': ['aizle', 'eliza'], 'ajar': ['ajar', 'jara', 'raja'], 'ajhar': ['ajhar', 'rajah'], 'ajuga': ['ajuga', 'jagua'], 'ak': ['ak', 'ka'], 'akal': ['akal', 'kala'], 'akali': ['akali', 'alaki'], 'akan': ['akan', 'kana'], 'ake': ['ake', 'kea'], 'akebi': ['akebi', 'bakie'], 'akha': ['akha', 'kaha'], 'akim': ['akim', 'maki'], 'akin': ['akin', 'kina', 'naik'], 'akka': ['akka', 'kaka'], 'aknee': ['aknee', 'ankee', 'keena'], 'ako': ['ako', 'koa', 'oak', 'oka'], 'akoasma': ['akoasma', 'amakosa'], 'aku': ['aku', 'auk', 'kua'], 'al': ['al', 'la'], 'ala': ['aal', 'ala'], 'alacritous': ['alacritous', 'lactarious', 'lactosuria'], 'alain': ['alain', 'alani', 'liana'], 'alaki': ['akali', 'alaki'], 'alalite': ['alalite', 'tillaea'], 'alamo': ['alamo', 'aloma'], 'alan': ['alan', 'anal', 'lana'], 'alangin': ['alangin', 'anginal', 'anglian', 'nagnail'], 'alangine': ['alangine', 'angelina', 'galenian'], 'alani': ['alain', 'alani', 'liana'], 'alanine': ['alanine', 'linnaea'], 'alans': ['alans', 'lanas', 'nasal'], 'alantic': ['actinal', 'alantic', 'alicant', 'antical'], 'alantolic': ['alantolic', 'allantoic'], 'alanyl': ['alanyl', 'anally'], 'alares': ['alares', 'arales'], 'alaria': ['alaria', 'aralia'], 'alaric': ['alaric', 'racial'], 'alarm': ['alarm', 'malar', 'maral', 'marla', 'ramal'], 'alarmable': ['alarmable', 'ambarella'], 'alarmedly': ['alarmedly', 'medallary'], 'alarming': ['alarming', 'marginal'], 'alarmingly': ['alarmingly', 'marginally'], 'alarmist': ['alarmist', 'alastrim'], 'alas': ['alas', 'lasa'], 'alastair': ['alastair', 'salariat'], 'alaster': ['alaster', 'tarsale'], 'alastrim': ['alarmist', 'alastrim'], 'alatern': ['alatern', 'lateran'], 'alaternus': ['alaternus', 'saturnale'], 'alation': ['ailanto', 'alation', 'laotian', 'notalia'], 'alb': ['alb', 'bal', 'lab'], 'alba': ['alba', 'baal', 'bala'], 'alban': ['alban', 'balan', 'banal', 'laban', 'nabal', 'nabla'], 'albanite': ['albanite', 'balanite', 'nabalite'], 'albardine': ['albardine', 'drainable'], 'albarium': ['albarium', 'brumalia'], 'albata': ['albata', 'atabal', 'balata'], 'albatros': ['abrastol', 'albatros'], 'albe': ['abel', 'able', 'albe', 'bale', 'beal', 'bela', 'blae'], 'albedo': ['albedo', 'doable'], 'albee': ['abele', 'albee'], 'albeit': ['albeit', 'albite', 'baltei', 'belait', 'betail', 'bletia', 'libate'], 'albert': ['albert', 'balter', 'labret', 'tabler'], 'alberta': ['alberta', 'latebra', 'ratable'], 'albertina': ['albertina', 'trainable'], 'alberto': ['alberto', 'bloater', 'latrobe'], 'albetad': ['albetad', 'datable'], 'albi': ['albi', 'bail', 'bali'], 'albian': ['albian', 'bilaan'], 'albin': ['albin', 'binal', 'blain'], 'albino': ['albino', 'albion', 'alboin', 'oliban'], 'albion': ['albino', 'albion', 'alboin', 'oliban'], 'albite': ['albeit', 'albite', 'baltei', 'belait', 'betail', 'bletia', 'libate'], 'alboin': ['albino', 'albion', 'alboin', 'oliban'], 'alboranite': ['alboranite', 'rationable'], 'albronze': ['albronze', 'blazoner'], 'albuca': ['albuca', 'bacula'], 'albuminate': ['albuminate', 'antelabium'], 'alburnum': ['alburnum', 'laburnum'], 'alcaic': ['alcaic', 'cicala'], 'alcaide': ['alcaide', 'alcidae'], 'alcamine': ['alcamine', 'analcime', 'calamine', 'camelina'], 'alcantarines': ['alcantarines', 'lancasterian'], 'alcedo': ['alcedo', 'dacelo'], 'alces': ['alces', 'casel', 'scale'], 'alchemic': ['alchemic', 'chemical'], 'alchemistic': ['alchemistic', 'hemiclastic'], 'alchera': ['alchera', 'archeal'], 'alchitran': ['alchitran', 'clathrina'], 'alcicornium': ['acroclinium', 'alcicornium'], 'alcidae': ['alcaide', 'alcidae'], 'alcidine': ['alcidine', 'danielic', 'lecaniid'], 'alcine': ['alcine', 'ancile'], 'alco': ['alco', 'coal', 'cola', 'loca'], 'alcoate': ['alcoate', 'coelata'], 'alcogel': ['alcogel', 'collage'], 'alcor': ['alcor', 'calor', 'carlo', 'carol', 'claro', 'coral'], 'alcoran': ['alcoran', 'ancoral', 'carolan'], 'alcoranic': ['acronical', 'alcoranic'], 'alcove': ['alcove', 'coeval', 'volcae'], 'alcyon': ['alcyon', 'cyanol'], 'alcyone': ['alcyone', 'cyanole'], 'aldamine': ['aldamine', 'lamnidae'], 'aldeament': ['aldeament', 'mandelate'], 'alder': ['alder', 'daler', 'lader'], 'aldermanry': ['aldermanry', 'marylander'], 'aldern': ['aldern', 'darnel', 'enlard', 'lander', 'lenard', 'randle', 'reland'], 'aldime': ['aldime', 'mailed', 'medial'], 'aldine': ['aldine', 'daniel', 'delian', 'denial', 'enalid', 'leadin'], 'aldus': ['aldus', 'sauld'], 'ale': ['ale', 'lea'], 'alec': ['acle', 'alec', 'lace'], 'aleconner': ['aleconner', 'noncereal'], 'alecost': ['alecost', 'lactose', 'scotale', 'talcose'], 'alectoris': ['alectoris', 'sarcolite', 'sclerotia', 'sectorial'], 'alectrion': ['alectrion', 'clarionet', 'crotaline', 'locarnite'], 'alectryon': ['alectryon', 'tolerancy'], 'alecup': ['alecup', 'clupea'], 'alef': ['alef', 'feal', 'flea', 'leaf'], 'aleft': ['aleft', 'alfet', 'fetal', 'fleta'], 'alegar': ['aglare', 'alegar', 'galera', 'laager'], 'alem': ['alem', 'alme', 'lame', 'leam', 'male', 'meal', 'mela'], 'alemanni': ['alemanni', 'melanian'], 'alemite': ['alemite', 'elamite'], 'alen': ['alen', 'lane', 'lean', 'lena', 'nael', 'neal'], 'aleph': ['aleph', 'pheal'], 'alepot': ['alepot', 'pelota'], 'alerce': ['alerce', 'cereal', 'relace'], 'alerse': ['alerse', 'leaser', 'reales', 'resale', 'reseal', 'sealer'], 'alert': ['alert', 'alter', 'artel', 'later', 'ratel', 'taler', 'telar'], 'alertly': ['alertly', 'elytral'], 'alestake': ['alestake', 'eastlake'], 'aletap': ['aletap', 'palate', 'platea'], 'aletris': ['aletris', 'alister', 'listera', 'realist', 'saltier'], 'aleuronic': ['aleuronic', 'urceolina'], 'aleut': ['aleut', 'atule'], 'aleutic': ['aleutic', 'auletic', 'caulite', 'lutecia'], 'alevin': ['alevin', 'alvine', 'valine', 'veinal', 'venial', 'vineal'], 'alex': ['alex', 'axel', 'axle'], 'alexandrian': ['alexandrian', 'alexandrina'], 'alexandrina': ['alexandrian', 'alexandrina'], 'alexin': ['alexin', 'xenial'], 'aleyard': ['aleyard', 'already'], 'alfenide': ['alfenide', 'enfilade'], 'alfet': ['aleft', 'alfet', 'fetal', 'fleta'], 'alfred': ['alfred', 'fardel'], 'alfur': ['alfur', 'fural'], 'alga': ['agal', 'agla', 'alga', 'gala'], 'algae': ['algae', 'galea'], 'algal': ['algal', 'galla'], 'algebar': ['algebar', 'algebra'], 'algebra': ['algebar', 'algebra'], 'algedi': ['algedi', 'galeid'], 'algedo': ['algedo', 'geodal'], 'algedonic': ['algedonic', 'genocidal'], 'algenib': ['algenib', 'bealing', 'belgian', 'bengali'], 'algerian': ['algerian', 'geranial', 'regalian'], 'algernon': ['algernon', 'nonglare'], 'algesia': ['algesia', 'sailage'], 'algesis': ['algesis', 'glassie'], 'algieba': ['algieba', 'bailage'], 'algin': ['algin', 'align', 'langi', 'liang', 'linga'], 'alginate': ['agential', 'alginate'], 'algine': ['algine', 'genial', 'linage'], 'algist': ['algist', 'gaslit'], 'algometer': ['algometer', 'glomerate'], 'algometric': ['algometric', 'melotragic'], 'algomian': ['algomian', 'magnolia'], 'algor': ['algor', 'argol', 'goral', 'largo'], 'algoristic': ['agricolist', 'algoristic'], 'algorithm': ['algorithm', 'logarithm'], 'algorithmic': ['algorithmic', 'logarithmic'], 'algraphic': ['algraphic', 'graphical'], 'algum': ['algum', 'almug', 'glaum', 'gluma', 'mulga'], 'alibility': ['alibility', 'liability'], 'alible': ['alible', 'belial', 'labile', 'liable'], 'alicant': ['actinal', 'alantic', 'alicant', 'antical'], 'alice': ['alice', 'celia', 'ileac'], 'alichel': ['alichel', 'challie', 'helical'], 'alida': ['adlai', 'alida'], 'alien': ['alien', 'aline', 'anile', 'elain', 'elian', 'laine', 'linea'], 'alienation': ['alienation', 'alineation'], 'alienator': ['alienator', 'rationale'], 'alienism': ['alienism', 'milesian'], 'alienor': ['aileron', 'alienor'], 'alif': ['alif', 'fail'], 'aligerous': ['aligerous', 'glaireous'], 'align': ['algin', 'align', 'langi', 'liang', 'linga'], 'aligner': ['aligner', 'engrail', 'realign', 'reginal'], 'alignment': ['alignment', 'lamenting'], 'alike': ['alike', 'lakie'], 'alikeness': ['alikeness', 'leakiness'], 'alima': ['alima', 'lamia'], 'aliment': ['ailment', 'aliment'], 'alimenter': ['alimenter', 'marteline'], 'alimentic': ['alimentic', 'antilemic', 'melanitic', 'metanilic'], 'alimonied': ['alimonied', 'maleinoid'], 'alin': ['alin', 'anil', 'lain', 'lina', 'nail'], 'aline': ['alien', 'aline', 'anile', 'elain', 'elian', 'laine', 'linea'], 'alineation': ['alienation', 'alineation'], 'aliped': ['aliped', 'elapid'], 'aliptes': ['aliptes', 'pastile', 'talipes'], 'aliptic': ['aliptic', 'aplitic'], 'aliseptal': ['aliseptal', 'pallasite'], 'alish': ['alish', 'hilsa'], 'alisier': ['alisier', 'israeli'], 'aliso': ['aliso', 'alois'], 'alison': ['alison', 'anolis'], 'alisp': ['alisp', 'lapsi'], 'alist': ['alist', 'litas', 'slait', 'talis'], 'alister': ['aletris', 'alister', 'listera', 'realist', 'saltier'], 'alit': ['alit', 'tail', 'tali'], 'alite': ['alite', 'laeti'], 'aliunde': ['aliunde', 'unideal'], 'aliveness': ['aliveness', 'vealiness'], 'alix': ['alix', 'axil'], 'alk': ['alk', 'lak'], 'alkalizer': ['alkalizer', 'lazarlike'], 'alkamin': ['alkamin', 'malakin'], 'alkene': ['alkene', 'lekane'], 'alkes': ['alkes', 'sakel', 'slake'], 'alkine': ['alkine', 'ilkane', 'inlake', 'inleak'], 'alky': ['alky', 'laky'], 'alkylic': ['alkylic', 'lilacky'], 'allagite': ['allagite', 'alligate', 'talliage'], 'allah': ['allah', 'halal'], 'allantoic': ['alantolic', 'allantoic'], 'allay': ['allay', 'yalla'], 'allayer': ['allayer', 'yallaer'], 'allbone': ['allbone', 'bellona'], 'alle': ['alle', 'ella', 'leal'], 'allecret': ['allecret', 'cellaret'], 'allegate': ['allegate', 'ellagate'], 'allegorist': ['allegorist', 'legislator'], 'allergen': ['allergen', 'generall'], 'allergia': ['allergia', 'galleria'], 'allergin': ['allergin', 'gralline'], 'allergy': ['allergy', 'gallery', 'largely', 'regally'], 'alliable': ['alliable', 'labiella'], 'alliably': ['alliably', 'labially'], 'alliance': ['alliance', 'canaille'], 'alliancer': ['alliancer', 'ralliance'], 'allie': ['allie', 'leila', 'lelia'], 'allies': ['allies', 'aselli'], 'alligate': ['allagite', 'alligate', 'talliage'], 'allium': ['allium', 'alulim', 'muilla'], 'allocation': ['allocation', 'locational'], 'allocute': ['allocute', 'loculate'], 'allocution': ['allocution', 'loculation'], 'allogenic': ['allogenic', 'collegian'], 'allonym': ['allonym', 'malonyl'], 'allopathy': ['allopathy', 'lalopathy'], 'allopatric': ['allopatric', 'patrilocal'], 'allot': ['allot', 'atoll'], 'allothogenic': ['allothogenic', 'ethnological'], 'allover': ['allover', 'overall'], 'allower': ['allower', 'reallow'], 'alloy': ['alloy', 'loyal'], 'allude': ['allude', 'aludel'], 'allure': ['allure', 'laurel'], 'alma': ['alma', 'amla', 'lama', 'mala'], 'almach': ['almach', 'chamal'], 'almaciga': ['almaciga', 'macaglia'], 'almain': ['almain', 'animal', 'lamina', 'manila'], 'alman': ['alman', 'lamna', 'manal'], 'almandite': ['almandite', 'laminated'], 'alme': ['alem', 'alme', 'lame', 'leam', 'male', 'meal', 'mela'], 'almerian': ['almerian', 'manerial'], 'almoign': ['almoign', 'loaming'], 'almon': ['almon', 'monal'], 'almond': ['almond', 'dolman'], 'almoner': ['almoner', 'moneral', 'nemoral'], 'almonry': ['almonry', 'romanly'], 'alms': ['alms', 'salm', 'slam'], 'almuce': ['almuce', 'caelum', 'macule'], 'almude': ['almude', 'maudle'], 'almug': ['algum', 'almug', 'glaum', 'gluma', 'mulga'], 'almuten': ['almuten', 'emulant'], 'aln': ['aln', 'lan'], 'alnage': ['alnage', 'angela', 'galena', 'lagena'], 'alnico': ['alnico', 'cliona', 'oilcan'], 'alnilam': ['alnilam', 'manilla'], 'alnoite': ['alnoite', 'elation', 'toenail'], 'alnuin': ['alnuin', 'unnail'], 'alo': ['alo', 'lao', 'loa'], 'alochia': ['acholia', 'alochia'], 'alod': ['alod', 'dola', 'load', 'odal'], 'aloe': ['aloe', 'olea'], 'aloetic': ['aloetic', 'coalite'], 'aloft': ['aloft', 'float', 'flota'], 'alogian': ['alogian', 'logania'], 'alogical': ['alogical', 'colalgia'], 'aloid': ['aloid', 'dolia', 'idola'], 'aloin': ['aloin', 'anoil', 'anoli'], 'alois': ['aliso', 'alois'], 'aloma': ['alamo', 'aloma'], 'alone': ['alone', 'anole', 'olena'], 'along': ['along', 'gonal', 'lango', 'longa', 'nogal'], 'alonso': ['alonso', 'alsoon', 'saloon'], 'alonzo': ['alonzo', 'zoonal'], 'alop': ['alop', 'opal'], 'alopecist': ['alopecist', 'altiscope', 'epicostal', 'scapolite'], 'alosa': ['alosa', 'loasa', 'oasal'], 'alose': ['alose', 'osela', 'solea'], 'alow': ['alow', 'awol', 'lowa'], 'aloxite': ['aloxite', 'oxalite'], 'alp': ['alp', 'lap', 'pal'], 'alpeen': ['alpeen', 'lenape', 'pelean'], 'alpen': ['alpen', 'nepal', 'panel', 'penal', 'plane'], 'alpestral': ['alpestral', 'palestral'], 'alpestrian': ['alpestrian', 'palestrian', 'psalterian'], 'alpestrine': ['alpestrine', 'episternal', 'interlapse', 'presential'], 'alphenic': ['alphenic', 'cephalin'], 'alphonse': ['alphonse', 'phenosal'], 'alphos': ['alphos', 'pholas'], 'alphosis': ['alphosis', 'haplosis'], 'alpid': ['alpid', 'plaid'], 'alpieu': ['alpieu', 'paulie'], 'alpine': ['alpine', 'nepali', 'penial', 'pineal'], 'alpinist': ['alpinist', 'antislip'], 'alpist': ['alpist', 'pastil', 'spital'], 'alraun': ['alraun', 'alruna', 'ranula'], 'already': ['aleyard', 'already'], 'alrighty': ['alrighty', 'arightly'], 'alruna': ['alraun', 'alruna', 'ranula'], 'alsine': ['alsine', 'neslia', 'saline', 'selina', 'silane'], 'also': ['also', 'sola'], 'alsoon': ['alonso', 'alsoon', 'saloon'], 'alstonidine': ['alstonidine', 'nonidealist'], 'alstonine': ['alstonine', 'tensional'], 'alt': ['alt', 'lat', 'tal'], 'altaian': ['altaian', 'latania', 'natalia'], 'altaic': ['altaic', 'altica'], 'altaid': ['adital', 'altaid'], 'altair': ['altair', 'atrail', 'atrial', 'lariat', 'latria', 'talari'], 'altamira': ['altamira', 'matralia'], 'altar': ['altar', 'artal', 'ratal', 'talar'], 'altared': ['altared', 'laterad'], 'altarist': ['altarist', 'striatal'], 'alter': ['alert', 'alter', 'artel', 'later', 'ratel', 'taler', 'telar'], 'alterability': ['alterability', 'bilaterality', 'relatability'], 'alterable': ['alterable', 'relatable'], 'alterant': ['alterant', 'tarletan'], 'alterer': ['alterer', 'realter', 'relater'], 'altern': ['altern', 'antler', 'learnt', 'rental', 'ternal'], 'alterne': ['alterne', 'enteral', 'eternal', 'teleran', 'teneral'], 'althea': ['althea', 'elatha'], 'altho': ['altho', 'lhota', 'loath'], 'althorn': ['althorn', 'anthrol', 'thronal'], 'altica': ['altaic', 'altica'], 'altin': ['altin', 'latin'], 'altiscope': ['alopecist', 'altiscope', 'epicostal', 'scapolite'], 'altitude': ['altitude', 'latitude'], 'altitudinal': ['altitudinal', 'latitudinal'], 'altitudinarian': ['altitudinarian', 'latitudinarian'], 'alto': ['alto', 'lota'], 'altrices': ['altrices', 'selictar'], 'altruism': ['altruism', 'muralist', 'traulism', 'ultraism'], 'altruist': ['altruist', 'ultraist'], 'altruistic': ['altruistic', 'truistical', 'ultraistic'], 'aludel': ['allude', 'aludel'], 'aludra': ['adular', 'aludra', 'radula'], 'alulet': ['alulet', 'luteal'], 'alulim': ['allium', 'alulim', 'muilla'], 'alum': ['alum', 'maul'], 'aluminate': ['aluminate', 'alumniate'], 'aluminide': ['aluminide', 'unimedial'], 'aluminosilicate': ['aluminosilicate', 'silicoaluminate'], 'alumna': ['alumna', 'manual'], 'alumni': ['alumni', 'unmail'], 'alumniate': ['aluminate', 'alumniate'], 'alur': ['alur', 'laur', 'lura', 'raul', 'ural'], 'alure': ['alure', 'ureal'], 'alurgite': ['alurgite', 'ligature'], 'aluta': ['aluta', 'taula'], 'alvan': ['alvan', 'naval'], 'alvar': ['alvar', 'arval', 'larva'], 'alveus': ['alveus', 'avulse'], 'alvin': ['alvin', 'anvil', 'nival', 'vinal'], 'alvine': ['alevin', 'alvine', 'valine', 'veinal', 'venial', 'vineal'], 'aly': ['aly', 'lay'], 'alypin': ['alypin', 'pialyn'], 'alytes': ['alytes', 'astely', 'lysate', 'stealy'], 'am': ['am', 'ma'], 'ama': ['aam', 'ama'], 'amacrine': ['amacrine', 'american', 'camerina', 'cinerama'], 'amadi': ['amadi', 'damia', 'madia', 'maida'], 'amaethon': ['amaethon', 'thomaean'], 'amaga': ['agama', 'amaga'], 'amah': ['amah', 'maha'], 'amain': ['amain', 'amani', 'amnia', 'anima', 'mania'], 'amakosa': ['akoasma', 'amakosa'], 'amalgam': ['amalgam', 'malagma'], 'amang': ['amang', 'ganam', 'manga'], 'amani': ['amain', 'amani', 'amnia', 'anima', 'mania'], 'amanist': ['amanist', 'stamina'], 'amanitin': ['amanitin', 'maintain'], 'amanitine': ['amanitine', 'inanimate'], 'amanori': ['amanori', 'moarian'], 'amapa': ['amapa', 'apama'], 'amar': ['amar', 'amra', 'mara', 'rama'], 'amarin': ['airman', 'amarin', 'marian', 'marina', 'mirana'], 'amaroid': ['amaroid', 'diorama'], 'amarth': ['amarth', 'martha'], 'amass': ['amass', 'assam', 'massa', 'samas'], 'amasser': ['amasser', 'reamass'], 'amati': ['amati', 'amita', 'matai'], 'amatorian': ['amatorian', 'inamorata'], 'amaurosis': ['amaurosis', 'mosasauri'], 'amazonite': ['amazonite', 'anatomize'], 'amba': ['amba', 'maba'], 'ambar': ['abram', 'ambar'], 'ambarella': ['alarmable', 'ambarella'], 'ambash': ['ambash', 'shamba'], 'ambay': ['ambay', 'mbaya'], 'ambeer': ['ambeer', 'beamer'], 'amber': ['amber', 'bearm', 'bemar', 'bream', 'embar'], 'ambier': ['ambier', 'bremia', 'embira'], 'ambit': ['ambit', 'imbat'], 'ambivert': ['ambivert', 'verbatim'], 'amble': ['amble', 'belam', 'blame', 'mabel'], 'ambler': ['ambler', 'blamer', 'lamber', 'marble', 'ramble'], 'ambling': ['ambling', 'blaming'], 'amblingly': ['amblingly', 'blamingly'], 'ambo': ['ambo', 'boma'], 'ambos': ['ambos', 'sambo'], 'ambrein': ['ambrein', 'mirbane'], 'ambrette': ['ambrette', 'tambreet'], 'ambrose': ['ambrose', 'mesobar'], 'ambrosia': ['ambrosia', 'saboraim'], 'ambrosin': ['ambrosin', 'barosmin', 'sabromin'], 'ambry': ['ambry', 'barmy'], 'ambury': ['ambury', 'aumbry'], 'ambush': ['ambush', 'shambu'], 'amchoor': ['amchoor', 'ochroma'], 'ame': ['ame', 'mae'], 'ameed': ['adeem', 'ameed', 'edema'], 'ameen': ['ameen', 'amene', 'enema'], 'amelification': ['amelification', 'maleficiation'], 'ameliorant': ['ameliorant', 'lomentaria'], 'amellus': ['amellus', 'malleus'], 'amelu': ['amelu', 'leuma', 'ulema'], 'amelus': ['amelus', 'samuel'], 'amen': ['amen', 'enam', 'mane', 'mean', 'name', 'nema'], 'amenability': ['amenability', 'nameability'], 'amenable': ['amenable', 'nameable'], 'amend': ['amend', 'mande', 'maned'], 'amende': ['amende', 'demean', 'meaned', 'nadeem'], 'amender': ['amender', 'meander', 'reamend', 'reedman'], 'amends': ['amends', 'desman'], 'amene': ['ameen', 'amene', 'enema'], 'amenia': ['amenia', 'anemia'], 'amenism': ['amenism', 'immanes', 'misname'], 'amenite': ['amenite', 'etamine', 'matinee'], 'amenorrheal': ['amenorrheal', 'melanorrhea'], 'ament': ['ament', 'meant', 'teman'], 'amental': ['amental', 'leatman'], 'amentia': ['amentia', 'aminate', 'anamite', 'animate'], 'amerce': ['amerce', 'raceme'], 'amercer': ['amercer', 'creamer'], 'american': ['amacrine', 'american', 'camerina', 'cinerama'], 'amerind': ['adermin', 'amerind', 'dimeran'], 'amerism': ['amerism', 'asimmer', 'sammier'], 'ameristic': ['ameristic', 'armistice', 'artemisic'], 'amesite': ['amesite', 'mesitae', 'semitae'], 'ametria': ['ametria', 'artemia', 'meratia', 'ramaite'], 'ametrope': ['ametrope', 'metapore'], 'amex': ['amex', 'exam', 'xema'], 'amgarn': ['amgarn', 'mangar', 'marang', 'ragman'], 'amhar': ['amhar', 'mahar', 'mahra'], 'amherstite': ['amherstite', 'hemistater'], 'amhran': ['amhran', 'harman', 'mahran'], 'ami': ['aim', 'ami', 'ima'], 'amia': ['amia', 'maia'], 'amic': ['amic', 'mica'], 'amical': ['amical', 'camail', 'lamaic'], 'amiced': ['amiced', 'decima'], 'amicicide': ['amicicide', 'cimicidae'], 'amicron': ['amicron', 'marconi', 'minorca', 'romanic'], 'amid': ['admi', 'amid', 'madi', 'maid'], 'amidate': ['adamite', 'amidate'], 'amide': ['amide', 'damie', 'media'], 'amidide': ['amidide', 'diamide', 'mididae'], 'amidin': ['amidin', 'damnii'], 'amidine': ['amidine', 'diamine'], 'amidism': ['amidism', 'maidism'], 'amidist': ['amidist', 'dimatis'], 'amidon': ['amidon', 'daimon', 'domain'], 'amidophenol': ['amidophenol', 'monodelphia'], 'amidst': ['amidst', 'datism'], 'amigo': ['amigo', 'imago'], 'amiidae': ['amiidae', 'maiidae'], 'amil': ['amil', 'amli', 'lima', 'mail', 'mali', 'mila'], 'amiles': ['amiles', 'asmile', 'mesail', 'mesial', 'samiel'], 'amimia': ['amimia', 'miamia'], 'amimide': ['amimide', 'mimidae'], 'amin': ['amin', 'main', 'mani', 'mian', 'mina', 'naim'], 'aminate': ['amentia', 'aminate', 'anamite', 'animate'], 'amination': ['amination', 'animation'], 'amine': ['amine', 'anime', 'maine', 'manei'], 'amini': ['amini', 'animi'], 'aminize': ['aminize', 'animize', 'azimine'], 'amino': ['amino', 'inoma', 'naomi', 'omani', 'omina'], 'aminoplast': ['aminoplast', 'plasmation'], 'amintor': ['amintor', 'tormina'], 'amir': ['amir', 'irma', 'mari', 'mira', 'rami', 'rima'], 'amiranha': ['amiranha', 'maharani'], 'amiray': ['amiray', 'myaria'], 'amissness': ['amissness', 'massiness'], 'amita': ['amati', 'amita', 'matai'], 'amitosis': ['amitosis', 'omasitis'], 'amixia': ['amixia', 'ixiama'], 'amla': ['alma', 'amla', 'lama', 'mala'], 'amli': ['amil', 'amli', 'lima', 'mail', 'mali', 'mila'], 'amlong': ['amlong', 'logman'], 'amma': ['amma', 'maam'], 'ammelin': ['ammelin', 'limeman'], 'ammeline': ['ammeline', 'melamine'], 'ammeter': ['ammeter', 'metamer'], 'ammi': ['ammi', 'imam', 'maim', 'mima'], 'ammine': ['ammine', 'immane'], 'ammo': ['ammo', 'mamo'], 'ammonic': ['ammonic', 'mocmain'], 'ammonolytic': ['ammonolytic', 'commonality'], 'ammunition': ['ammunition', 'antimonium'], 'amnestic': ['amnestic', 'semantic'], 'amnia': ['amain', 'amani', 'amnia', 'anima', 'mania'], 'amniac': ['amniac', 'caiman', 'maniac'], 'amnic': ['amnic', 'manic'], 'amnion': ['amnion', 'minoan', 'nomina'], 'amnionata': ['amnionata', 'anamniota'], 'amnionate': ['amnionate', 'anamniote', 'emanation'], 'amniota': ['amniota', 'itonama'], 'amniote': ['amniote', 'anomite'], 'amniotic': ['amniotic', 'mication'], 'amniotome': ['amniotome', 'momotinae'], 'amok': ['amok', 'mako'], 'amole': ['amole', 'maleo'], 'amomis': ['amomis', 'mimosa'], 'among': ['among', 'mango'], 'amor': ['amor', 'maro', 'mora', 'omar', 'roam'], 'amores': ['amores', 'ramose', 'sorema'], 'amoret': ['amoret', 'morate'], 'amorist': ['amorist', 'aortism', 'miastor'], 'amoritic': ['amoritic', 'microtia'], 'amorpha': ['amorpha', 'amphora'], 'amorphic': ['amorphic', 'amphoric'], 'amorphous': ['amorphous', 'amphorous'], 'amort': ['amort', 'morat', 'torma'], 'amortize': ['amortize', 'atomizer'], 'amos': ['amos', 'soam', 'soma'], 'amotion': ['amotion', 'otomian'], 'amount': ['amount', 'moutan', 'outman'], 'amoy': ['amoy', 'mayo'], 'ampelis': ['ampelis', 'lepisma'], 'ampelite': ['ampelite', 'pimelate'], 'ampelitic': ['ampelitic', 'implicate'], 'amper': ['amper', 'remap'], 'amperemeter': ['amperemeter', 'permeameter'], 'amperian': ['amperian', 'paramine', 'pearmain'], 'amphicyon': ['amphicyon', 'hypomanic'], 'amphigenous': ['amphigenous', 'musophagine'], 'amphiphloic': ['amphiphloic', 'amphophilic'], 'amphipodous': ['amphipodous', 'hippodamous'], 'amphitropous': ['amphitropous', 'pastophorium'], 'amphophilic': ['amphiphloic', 'amphophilic'], 'amphora': ['amorpha', 'amphora'], 'amphore': ['amphore', 'morphea'], 'amphorette': ['amphorette', 'haptometer'], 'amphoric': ['amorphic', 'amphoric'], 'amphorous': ['amorphous', 'amphorous'], 'amphoteric': ['amphoteric', 'metaphoric'], 'ample': ['ample', 'maple'], 'ampliate': ['ampliate', 'palamite'], 'amplification': ['amplification', 'palmification'], 'amply': ['amply', 'palmy'], 'ampul': ['ampul', 'pluma'], 'ampulla': ['ampulla', 'palmula'], 'amra': ['amar', 'amra', 'mara', 'rama'], 'amsath': ['amsath', 'asthma'], 'amsel': ['amsel', 'melas', 'mesal', 'samel'], 'amsonia': ['amsonia', 'anosmia'], 'amt': ['amt', 'mat', 'tam'], 'amulet': ['amulet', 'muleta'], 'amunam': ['amunam', 'manuma'], 'amuse': ['amuse', 'mesua'], 'amused': ['amused', 'masdeu', 'medusa'], 'amusee': ['amusee', 'saeume'], 'amuser': ['amuser', 'mauser'], 'amusgo': ['amusgo', 'sugamo'], 'amvis': ['amvis', 'mavis'], 'amy': ['amy', 'may', 'mya', 'yam'], 'amyelic': ['amyelic', 'mycelia'], 'amyl': ['amyl', 'lyam', 'myal'], 'amylan': ['amylan', 'lamany', 'layman'], 'amylenol': ['amylenol', 'myelonal'], 'amylidene': ['amylidene', 'mydaleine'], 'amylin': ['amylin', 'mainly'], 'amylo': ['amylo', 'loamy'], 'amylon': ['amylon', 'onymal'], 'amyotrophy': ['amyotrophy', 'myoatrophy'], 'amyrol': ['amyrol', 'molary'], 'an': ['an', 'na'], 'ana': ['ana', 'naa'], 'anacara': ['anacara', 'aracana'], 'anacard': ['anacard', 'caranda'], 'anaces': ['anaces', 'scaean'], 'anachorism': ['anachorism', 'chorasmian', 'maraschino'], 'anacid': ['acnida', 'anacid', 'dacian'], 'anacreontic': ['anacreontic', 'canceration'], 'anacusis': ['anacusis', 'ascanius'], 'anadem': ['anadem', 'maenad'], 'anadenia': ['anadenia', 'danainae'], 'anadrom': ['anadrom', 'madrona', 'mandora', 'monarda', 'roadman'], 'anaemic': ['acnemia', 'anaemic'], 'anaeretic': ['anaeretic', 'ecarinate'], 'anal': ['alan', 'anal', 'lana'], 'analcime': ['alcamine', 'analcime', 'calamine', 'camelina'], 'analcite': ['analcite', 'anticlea', 'laitance'], 'analcitite': ['analcitite', 'catalinite'], 'analectic': ['acclinate', 'analectic'], 'analeptical': ['analeptical', 'placentalia'], 'anally': ['alanyl', 'anally'], 'analogic': ['analogic', 'calinago'], 'analogist': ['analogist', 'nostalgia'], 'anam': ['anam', 'mana', 'naam', 'nama'], 'anamesite': ['anamesite', 'seamanite'], 'anamirta': ['anamirta', 'araminta'], 'anamite': ['amentia', 'aminate', 'anamite', 'animate'], 'anamniota': ['amnionata', 'anamniota'], 'anamniote': ['amnionate', 'anamniote', 'emanation'], 'anan': ['anan', 'anna', 'nana'], 'ananda': ['ananda', 'danaan'], 'anandria': ['anandria', 'andriana'], 'anangioid': ['agoniadin', 'anangioid', 'ganoidian'], 'ananism': ['ananism', 'samnani'], 'ananite': ['ananite', 'anatine', 'taenian'], 'anaphoric': ['anaphoric', 'pharaonic'], 'anaphorical': ['anaphorical', 'pharaonical'], 'anapnea': ['anapnea', 'napaean'], 'anapsid': ['anapsid', 'sapinda'], 'anapsida': ['anapsida', 'anaspida'], 'anaptotic': ['anaptotic', 'captation'], 'anarchic': ['anarchic', 'characin'], 'anarchism': ['anarchism', 'arachnism'], 'anarchist': ['anarchist', 'archsaint', 'cantharis'], 'anarcotin': ['anarcotin', 'cantorian', 'carnation', 'narcotina'], 'anaretic': ['anaretic', 'arcanite', 'carinate', 'craniate'], 'anarthropod': ['anarthropod', 'arthropodan'], 'anas': ['anas', 'ansa', 'saan'], 'anasa': ['anasa', 'asana'], 'anaspida': ['anapsida', 'anaspida'], 'anastaltic': ['anastaltic', 'catalanist'], 'anat': ['anat', 'anta', 'tana'], 'anatidae': ['anatidae', 'taeniada'], 'anatine': ['ananite', 'anatine', 'taenian'], 'anatocism': ['anatocism', 'anosmatic'], 'anatole': ['anatole', 'notaeal'], 'anatolic': ['aconital', 'actional', 'anatolic'], 'anatomicopathologic': ['anatomicopathologic', 'pathologicoanatomic'], 'anatomicopathological': ['anatomicopathological', 'pathologicoanatomical'], 'anatomicophysiologic': ['anatomicophysiologic', 'physiologicoanatomic'], 'anatomism': ['anatomism', 'nomismata'], 'anatomize': ['amazonite', 'anatomize'], 'anatum': ['anatum', 'mantua', 'tamanu'], 'anay': ['anay', 'yana'], 'anba': ['anba', 'bana'], 'ancestor': ['ancestor', 'entosarc'], 'ancestral': ['ancestral', 'lancaster'], 'anchat': ['acanth', 'anchat', 'tanach'], 'anchietin': ['anchietin', 'cathinine'], 'anchistea': ['anchistea', 'hanseatic'], 'anchor': ['anchor', 'archon', 'charon', 'rancho'], 'anchored': ['anchored', 'rondache'], 'anchorer': ['anchorer', 'ranchero', 'reanchor'], 'anchoretic': ['acherontic', 'anchoretic'], 'anchoretical': ['acherontical', 'anchoretical'], 'anchoretism': ['anchoretism', 'trichomanes'], 'anchorite': ['anchorite', 'antechoir', 'heatronic', 'hectorian'], 'anchoritism': ['anchoritism', 'chiromantis', 'chrismation', 'harmonistic'], 'ancile': ['alcine', 'ancile'], 'ancilla': ['aclinal', 'ancilla'], 'ancillary': ['ancillary', 'carlylian', 'cranially'], 'ancon': ['ancon', 'canon'], 'anconitis': ['anconitis', 'antiscion', 'onanistic'], 'ancony': ['ancony', 'canyon'], 'ancoral': ['alcoran', 'ancoral', 'carolan'], 'ancylus': ['ancylus', 'unscaly'], 'ancyrene': ['ancyrene', 'cerynean'], 'and': ['and', 'dan'], 'anda': ['anda', 'dana'], 'andante': ['andante', 'dantean'], 'ande': ['ande', 'dane', 'dean', 'edna'], 'andesitic': ['andesitic', 'dianetics'], 'andhra': ['andhra', 'dharna'], 'andi': ['adin', 'andi', 'dain', 'dani', 'dian', 'naid'], 'andian': ['andian', 'danian', 'nidana'], 'andine': ['aidenn', 'andine', 'dannie', 'indane'], 'andira': ['adrian', 'andira', 'andria', 'radian', 'randia'], 'andorite': ['andorite', 'nadorite', 'ordinate', 'rodentia'], 'andre': ['andre', 'arend', 'daren', 'redan'], 'andrew': ['andrew', 'redawn', 'wander', 'warden'], 'andria': ['adrian', 'andira', 'andria', 'radian', 'randia'], 'andriana': ['anandria', 'andriana'], 'andrias': ['andrias', 'sardian', 'sarinda'], 'andric': ['andric', 'cardin', 'rancid'], 'andries': ['andries', 'isander', 'sardine'], 'androgynus': ['androgynus', 'gynandrous'], 'androl': ['androl', 'arnold', 'lardon', 'roland', 'ronald'], 'andronicus': ['andronicus', 'unsardonic'], 'androtomy': ['androtomy', 'dynamotor'], 'anear': ['anear', 'arean', 'arena'], 'aneath': ['ahtena', 'aneath', 'athena'], 'anecdota': ['anecdota', 'coadnate'], 'anele': ['anele', 'elean'], 'anematosis': ['anematosis', 'menostasia'], 'anemia': ['amenia', 'anemia'], 'anemic': ['anemic', 'cinema', 'iceman'], 'anemograph': ['anemograph', 'phanerogam'], 'anemographic': ['anemographic', 'phanerogamic'], 'anemography': ['anemography', 'phanerogamy'], 'anemone': ['anemone', 'monaene'], 'anent': ['anent', 'annet', 'nenta'], 'anepia': ['anepia', 'apinae'], 'aneretic': ['aneretic', 'centiare', 'creatine', 'increate', 'iterance'], 'anergic': ['anergic', 'garnice', 'garniec', 'geranic', 'grecian'], 'anergy': ['anergy', 'rangey'], 'anerly': ['anerly', 'nearly'], 'aneroid': ['aneroid', 'arenoid'], 'anerotic': ['actioner', 'anerotic', 'ceration', 'creation', 'reaction'], 'anes': ['anes', 'sane', 'sean'], 'anesis': ['anesis', 'anseis', 'sanies', 'sansei', 'sasine'], 'aneuric': ['aneuric', 'rinceau'], 'aneurin': ['aneurin', 'uranine'], 'aneurism': ['aneurism', 'arsenium', 'sumerian'], 'anew': ['anew', 'wane', 'wean'], 'angami': ['angami', 'magani', 'magian'], 'angara': ['angara', 'aranga', 'nagara'], 'angaria': ['agrania', 'angaria', 'niagara'], 'angel': ['agnel', 'angel', 'angle', 'galen', 'genal', 'glean', 'lagen'], 'angela': ['alnage', 'angela', 'galena', 'lagena'], 'angeldom': ['angeldom', 'lodgeman'], 'angelet': ['angelet', 'elegant'], 'angelic': ['angelic', 'galenic'], 'angelical': ['angelical', 'englacial', 'galenical'], 'angelically': ['angelically', 'englacially'], 'angelin': ['angelin', 'leaning'], 'angelina': ['alangine', 'angelina', 'galenian'], 'angelique': ['angelique', 'equiangle'], 'angelo': ['angelo', 'engaol'], 'angelot': ['angelot', 'tangelo'], 'anger': ['anger', 'areng', 'grane', 'range'], 'angerly': ['angerly', 'geranyl'], 'angers': ['angers', 'sanger', 'serang'], 'angico': ['agonic', 'angico', 'gaonic', 'goniac'], 'angie': ['angie', 'gaine'], 'angild': ['angild', 'lading'], 'angili': ['ailing', 'angili', 'nilgai'], 'angina': ['angina', 'inanga'], 'anginal': ['alangin', 'anginal', 'anglian', 'nagnail'], 'angiocholitis': ['angiocholitis', 'cholangioitis'], 'angiochondroma': ['angiochondroma', 'chondroangioma'], 'angiofibroma': ['angiofibroma', 'fibroangioma'], 'angioid': ['angioid', 'gonidia'], 'angiokeratoma': ['angiokeratoma', 'keratoangioma'], 'angiometer': ['angiometer', 'ergotamine', 'geometrina'], 'angka': ['angka', 'kanga'], 'anglaise': ['anglaise', 'gelasian'], 'angle': ['agnel', 'angel', 'angle', 'galen', 'genal', 'glean', 'lagen'], 'angled': ['angled', 'dangle', 'englad', 'lagend'], 'angler': ['angler', 'arleng', 'garnel', 'largen', 'rangle', 'regnal'], 'angles': ['angles', 'gansel'], 'angleworm': ['angleworm', 'lawmonger'], 'anglian': ['alangin', 'anginal', 'anglian', 'nagnail'], 'anglic': ['anglic', 'lacing'], 'anglish': ['anglish', 'ashling'], 'anglist': ['anglist', 'lasting', 'salting', 'slating', 'staling'], 'angloid': ['angloid', 'loading'], 'ango': ['agon', 'ango', 'gaon', 'goan', 'gona'], 'angola': ['agonal', 'angola'], 'angolar': ['angolar', 'organal'], 'angor': ['angor', 'argon', 'goran', 'grano', 'groan', 'nagor', 'orang', 'organ', 'rogan', 'ronga'], 'angora': ['agroan', 'angora', 'anogra', 'arango', 'argoan', 'onagra'], 'angriness': ['angriness', 'ranginess'], 'angrite': ['angrite', 'granite', 'ingrate', 'tangier', 'tearing', 'tigrean'], 'angry': ['angry', 'rangy'], 'angst': ['angst', 'stang', 'tangs'], 'angster': ['angster', 'garnets', 'nagster', 'strange'], 'anguid': ['anguid', 'gaduin'], 'anguine': ['anguine', 'guanine', 'guinean'], 'angula': ['angula', 'nagual'], 'angular': ['angular', 'granula'], 'angulate': ['angulate', 'gaetulan'], 'anguria': ['anguria', 'gaurian', 'guarani'], 'angus': ['agnus', 'angus', 'sugan'], 'anharmonic': ['anharmonic', 'monarchian'], 'anhematosis': ['anhematosis', 'somasthenia'], 'anhidrotic': ['anhidrotic', 'trachinoid'], 'anhistous': ['anhistous', 'isanthous'], 'anhydridize': ['anhydridize', 'hydrazidine'], 'anhydrize': ['anhydrize', 'hydrazine'], 'ani': ['ani', 'ian'], 'anice': ['anice', 'eniac'], 'aniconic': ['aniconic', 'ciconian'], 'aniconism': ['aniconism', 'insomniac'], 'anicular': ['anicular', 'caulinar'], 'anicut': ['anicut', 'nautic', 'ticuna', 'tunica'], 'anidian': ['anidian', 'indiana'], 'aniente': ['aniente', 'itenean'], 'anight': ['anight', 'athing'], 'anil': ['alin', 'anil', 'lain', 'lina', 'nail'], 'anile': ['alien', 'aline', 'anile', 'elain', 'elian', 'laine', 'linea'], 'anilic': ['anilic', 'clinia'], 'anilid': ['anilid', 'dialin', 'dianil', 'inlaid'], 'anilide': ['anilide', 'elaidin'], 'anilidic': ['anilidic', 'indicial'], 'anima': ['amain', 'amani', 'amnia', 'anima', 'mania'], 'animable': ['animable', 'maniable'], 'animal': ['almain', 'animal', 'lamina', 'manila'], 'animalic': ['animalic', 'limacina'], 'animate': ['amentia', 'aminate', 'anamite', 'animate'], 'animated': ['animated', 'mandaite', 'mantidae'], 'animater': ['animater', 'marinate'], 'animating': ['animating', 'imaginant'], 'animation': ['amination', 'animation'], 'animator': ['animator', 'tamanoir'], 'anime': ['amine', 'anime', 'maine', 'manei'], 'animi': ['amini', 'animi'], 'animist': ['animist', 'santimi'], 'animize': ['aminize', 'animize', 'azimine'], 'animus': ['animus', 'anisum', 'anusim', 'manius'], 'anionic': ['anionic', 'iconian'], 'anis': ['anis', 'nais', 'nasi', 'nias', 'sain', 'sina'], 'anisal': ['anisal', 'nasial', 'salian', 'salina'], 'anisate': ['anisate', 'entasia'], 'anise': ['anise', 'insea', 'siena', 'sinae'], 'anisette': ['anisette', 'atestine', 'settaine'], 'anisic': ['anisic', 'sicani', 'sinaic'], 'anisilic': ['anisilic', 'sicilian'], 'anisodont': ['anisodont', 'sondation'], 'anisometric': ['anisometric', 'creationism', 'miscreation', 'ramisection', 'reactionism'], 'anisopod': ['anisopod', 'isopodan'], 'anisoptera': ['anisoptera', 'asperation', 'separation'], 'anisum': ['animus', 'anisum', 'anusim', 'manius'], 'anisuria': ['anisuria', 'isaurian'], 'anisyl': ['anisyl', 'snaily'], 'anita': ['anita', 'niata', 'tania'], 'anither': ['anither', 'inearth', 'naither'], 'ankee': ['aknee', 'ankee', 'keena'], 'anker': ['anker', 'karen', 'naker'], 'ankh': ['ankh', 'hank', 'khan'], 'anklet': ['anklet', 'lanket', 'tankle'], 'ankoli': ['ankoli', 'kaolin'], 'ankus': ['ankus', 'kusan'], 'ankyroid': ['ankyroid', 'dikaryon'], 'anlace': ['anlace', 'calean'], 'ann': ['ann', 'nan'], 'anna': ['anan', 'anna', 'nana'], 'annale': ['annale', 'anneal'], 'annaline': ['annaline', 'linnaean'], 'annalist': ['annalist', 'santalin'], 'annalize': ['annalize', 'zelanian'], 'annam': ['annam', 'manna'], 'annamite': ['annamite', 'manatine'], 'annard': ['annard', 'randan'], 'annat': ['annat', 'tanan'], 'annates': ['annates', 'tannase'], 'anne': ['anne', 'nane'], 'anneal': ['annale', 'anneal'], 'annealer': ['annealer', 'lernaean', 'reanneal'], 'annelid': ['annelid', 'lindane'], 'annelism': ['annelism', 'linesman'], 'anneloid': ['anneloid', 'nonideal'], 'annet': ['anent', 'annet', 'nenta'], 'annexer': ['annexer', 'reannex'], 'annie': ['annie', 'inane'], 'annite': ['annite', 'innate', 'tinean'], 'annotine': ['annotine', 'tenonian'], 'annoy': ['annoy', 'nonya'], 'annoyancer': ['annoyancer', 'rayonnance'], 'annoyer': ['annoyer', 'reannoy'], 'annualist': ['annualist', 'sultanian'], 'annulation': ['annulation', 'unnational'], 'annulet': ['annulet', 'nauntle'], 'annulment': ['annulment', 'tunnelman'], 'annuloid': ['annuloid', 'uninodal'], 'anodic': ['adonic', 'anodic'], 'anodize': ['adonize', 'anodize'], 'anodynic': ['anodynic', 'cydonian'], 'anoestrous': ['anoestrous', 'treasonous'], 'anoestrum': ['anoestrum', 'neuromast'], 'anoetic': ['acetoin', 'aconite', 'anoetic', 'antoeci', 'cetonia'], 'anogenic': ['anogenic', 'canoeing'], 'anogra': ['agroan', 'angora', 'anogra', 'arango', 'argoan', 'onagra'], 'anoil': ['aloin', 'anoil', 'anoli'], 'anoint': ['anoint', 'nation'], 'anointer': ['anointer', 'inornate', 'nonirate', 'reanoint'], 'anole': ['alone', 'anole', 'olena'], 'anoli': ['aloin', 'anoil', 'anoli'], 'anolis': ['alison', 'anolis'], 'anomaliped': ['anomaliped', 'palaemonid'], 'anomalism': ['anomalism', 'malmaison'], 'anomalist': ['anomalist', 'atonalism'], 'anomiidae': ['anomiidae', 'maioidean'], 'anomite': ['amniote', 'anomite'], 'anomodont': ['anomodont', 'monodonta'], 'anomural': ['anomural', 'monaural'], 'anon': ['anon', 'nona', 'onan'], 'anophyte': ['anophyte', 'typhoean'], 'anopia': ['anopia', 'aponia', 'poiana'], 'anorak': ['anorak', 'korana'], 'anorchism': ['anorchism', 'harmonics'], 'anorectic': ['accretion', 'anorectic', 'neoarctic'], 'anorthic': ['anorthic', 'anthroic', 'tanchoir'], 'anorthitite': ['anorthitite', 'trithionate'], 'anorthose': ['anorthose', 'hoarstone'], 'anosia': ['anosia', 'asonia'], 'anosmatic': ['anatocism', 'anosmatic'], 'anosmia': ['amsonia', 'anosmia'], 'anosmic': ['anosmic', 'masonic'], 'anoterite': ['anoterite', 'orientate'], 'another': ['another', 'athenor', 'rheotan'], 'anotia': ['anotia', 'atonia'], 'anoxia': ['anoxia', 'axonia'], 'anoxic': ['anoxic', 'oxanic'], 'ansa': ['anas', 'ansa', 'saan'], 'ansar': ['ansar', 'saran', 'sarna'], 'ansation': ['ansation', 'sonatina'], 'anseis': ['anesis', 'anseis', 'sanies', 'sansei', 'sasine'], 'ansel': ['ansel', 'slane'], 'anselm': ['anselm', 'mensal'], 'anser': ['anser', 'nares', 'rasen', 'snare'], 'anserine': ['anserine', 'reinsane'], 'anserous': ['anserous', 'arsenous'], 'ansu': ['ansu', 'anus'], 'answerer': ['answerer', 'reanswer'], 'ant': ['ant', 'nat', 'tan'], 'anta': ['anat', 'anta', 'tana'], 'antacrid': ['antacrid', 'cardiant', 'radicant', 'tridacna'], 'antagonism': ['antagonism', 'montagnais'], 'antagonist': ['antagonist', 'stagnation'], 'antal': ['antal', 'natal'], 'antanemic': ['antanemic', 'cinnamate'], 'antar': ['antar', 'antra'], 'antarchistical': ['antarchistical', 'charlatanistic'], 'ante': ['ante', 'aten', 'etna', 'nate', 'neat', 'taen', 'tane', 'tean'], 'anteact': ['anteact', 'cantate'], 'anteal': ['anteal', 'lanate', 'teanal'], 'antechoir': ['anchorite', 'antechoir', 'heatronic', 'hectorian'], 'antecornu': ['antecornu', 'connature'], 'antedate': ['antedate', 'edentata'], 'antelabium': ['albuminate', 'antelabium'], 'antelopian': ['antelopian', 'neapolitan', 'panelation'], 'antelucan': ['antelucan', 'cannulate'], 'antelude': ['antelude', 'unelated'], 'anteluminary': ['anteluminary', 'unalimentary'], 'antemedial': ['antemedial', 'delaminate'], 'antenatal': ['antenatal', 'atlantean', 'tantalean'], 'anteriad': ['anteriad', 'atridean', 'dentaria'], 'anteroinferior': ['anteroinferior', 'inferoanterior'], 'anterosuperior': ['anterosuperior', 'superoanterior'], 'antes': ['antes', 'nates', 'stane', 'stean'], 'anthela': ['anthela', 'ethanal'], 'anthem': ['anthem', 'hetman', 'mentha'], 'anthemwise': ['anthemwise', 'whitmanese'], 'anther': ['anther', 'nather', 'tharen', 'thenar'], 'anthericum': ['anthericum', 'narthecium'], 'anthicidae': ['anthicidae', 'tachinidae'], 'anthinae': ['anthinae', 'athenian'], 'anthogenous': ['anthogenous', 'neognathous'], 'anthonomus': ['anthonomus', 'monanthous'], 'anthophile': ['anthophile', 'lithophane'], 'anthracia': ['anthracia', 'antiarcha', 'catharina'], 'anthroic': ['anorthic', 'anthroic', 'tanchoir'], 'anthrol': ['althorn', 'anthrol', 'thronal'], 'anthropic': ['anthropic', 'rhapontic'], 'anti': ['aint', 'anti', 'tain', 'tina'], 'antiabrin': ['antiabrin', 'britannia'], 'antiae': ['aetian', 'antiae', 'taenia'], 'antiager': ['antiager', 'trainage'], 'antialbumid': ['antialbumid', 'balantidium'], 'antialien': ['ailantine', 'antialien'], 'antiarcha': ['anthracia', 'antiarcha', 'catharina'], 'antiaris': ['antiaris', 'intarsia'], 'antibenzaldoxime': ['antibenzaldoxime', 'benzantialdoxime'], 'antiblue': ['antiblue', 'nubilate'], 'antic': ['actin', 'antic'], 'antical': ['actinal', 'alantic', 'alicant', 'antical'], 'anticaste': ['anticaste', 'ataentsic'], 'anticlea': ['analcite', 'anticlea', 'laitance'], 'anticlinorium': ['anticlinorium', 'inclinatorium'], 'anticly': ['anticly', 'cantily'], 'anticness': ['anticness', 'cantiness', 'incessant'], 'anticor': ['anticor', 'carotin', 'cortina', 'ontaric'], 'anticouncil': ['anticouncil', 'inculcation'], 'anticourt': ['anticourt', 'curtation', 'ructation'], 'anticous': ['acontius', 'anticous'], 'anticreative': ['anticreative', 'antireactive'], 'anticreep': ['anticreep', 'apenteric', 'increpate'], 'antidote': ['antidote', 'tetanoid'], 'antidotical': ['antidotical', 'dictational'], 'antietam': ['antietam', 'manettia'], 'antiextreme': ['antiextreme', 'exterminate'], 'antifouler': ['antifouler', 'fluorinate', 'uniflorate'], 'antifriction': ['antifriction', 'nitrifaction'], 'antifungin': ['antifungin', 'unfainting'], 'antigen': ['antigen', 'gentian'], 'antigenic': ['antigenic', 'gentianic'], 'antiglare': ['antiglare', 'raglanite'], 'antigod': ['antigod', 'doating'], 'antigone': ['antigone', 'negation'], 'antiheroic': ['antiheroic', 'theorician'], 'antilemic': ['alimentic', 'antilemic', 'melanitic', 'metanilic'], 'antilia': ['antilia', 'italian'], 'antilipase': ['antilipase', 'sapiential'], 'antilope': ['antilope', 'antipole'], 'antimallein': ['antimallein', 'inalimental'], 'antimasque': ['antimasque', 'squamatine'], 'antimeric': ['antimeric', 'carminite', 'criminate', 'metrician'], 'antimerina': ['antimerina', 'maintainer', 'remaintain'], 'antimeter': ['antimeter', 'attermine', 'interteam', 'terminate', 'tetramine'], 'antimodel': ['antimodel', 'maldonite', 'monilated'], 'antimodern': ['antimodern', 'ordainment'], 'antimonial': ['antimonial', 'lamination'], 'antimonic': ['antimonic', 'antinomic'], 'antimonium': ['ammunition', 'antimonium'], 'antimony': ['antimony', 'antinomy'], 'antimoral': ['antimoral', 'tailorman'], 'antimosquito': ['antimosquito', 'misquotation'], 'antinegro': ['antinegro', 'argentino', 'argention'], 'antinepotic': ['antinepotic', 'pectination'], 'antineutral': ['antineutral', 'triannulate'], 'antinial': ['antinial', 'latinian'], 'antinome': ['antinome', 'nominate'], 'antinomian': ['antinomian', 'innominata'], 'antinomic': ['antimonic', 'antinomic'], 'antinomy': ['antimony', 'antinomy'], 'antinormal': ['antinormal', 'nonmarital', 'nonmartial'], 'antiphonetic': ['antiphonetic', 'pentathionic'], 'antiphonic': ['antiphonic', 'napthionic'], 'antiphony': ['antiphony', 'typhonian'], 'antiphrasis': ['antiphrasis', 'artisanship'], 'antipodic': ['antipodic', 'diapnotic'], 'antipole': ['antilope', 'antipole'], 'antipolo': ['antipolo', 'antipool', 'optional'], 'antipool': ['antipolo', 'antipool', 'optional'], 'antipope': ['antipope', 'appointe'], 'antiprotease': ['antiprotease', 'entoparasite'], 'antipsoric': ['antipsoric', 'ascription', 'crispation'], 'antiptosis': ['antiptosis', 'panostitis'], 'antiputrid': ['antiputrid', 'tripudiant'], 'antipyretic': ['antipyretic', 'pertinacity'], 'antique': ['antique', 'quinate'], 'antiquer': ['antiquer', 'quartine'], 'antirabies': ['antirabies', 'bestiarian'], 'antiracer': ['antiracer', 'tarriance'], 'antireactive': ['anticreative', 'antireactive'], 'antired': ['antired', 'detrain', 'randite', 'trained'], 'antireducer': ['antireducer', 'reincrudate', 'untraceried'], 'antiroyalist': ['antiroyalist', 'stationarily'], 'antirumor': ['antirumor', 'ruminator'], 'antirun': ['antirun', 'untrain', 'urinant'], 'antirust': ['antirust', 'naturist'], 'antiscion': ['anconitis', 'antiscion', 'onanistic'], 'antisepsin': ['antisepsin', 'paintiness'], 'antisepsis': ['antisepsis', 'inspissate'], 'antiseptic': ['antiseptic', 'psittacine'], 'antiserum': ['antiserum', 'misaunter'], 'antisi': ['antisi', 'isatin'], 'antislip': ['alpinist', 'antislip'], 'antisoporific': ['antisoporific', 'prosification', 'sporification'], 'antispace': ['antispace', 'panaceist'], 'antistes': ['antistes', 'titaness'], 'antisun': ['antisun', 'unsaint', 'unsatin', 'unstain'], 'antitheism': ['antitheism', 'themistian'], 'antitonic': ['antitonic', 'nictation'], 'antitorpedo': ['antitorpedo', 'deportation'], 'antitrade': ['antitrade', 'attainder'], 'antitrope': ['antitrope', 'patronite', 'tritanope'], 'antitropic': ['antitropic', 'tritanopic'], 'antitropical': ['antitropical', 'practitional'], 'antivice': ['antivice', 'inactive', 'vineatic'], 'antler': ['altern', 'antler', 'learnt', 'rental', 'ternal'], 'antlia': ['antlia', 'latian', 'nalita'], 'antliate': ['antliate', 'latinate'], 'antlid': ['antlid', 'tindal'], 'antling': ['antling', 'tanling'], 'antoeci': ['acetoin', 'aconite', 'anoetic', 'antoeci', 'cetonia'], 'antoecian': ['acetanion', 'antoecian'], 'anton': ['anton', 'notan', 'tonna'], 'antproof': ['antproof', 'tanproof'], 'antra': ['antar', 'antra'], 'antral': ['antral', 'tarnal'], 'antre': ['antre', 'arent', 'retan', 'terna'], 'antrocele': ['antrocele', 'coeternal', 'tolerance'], 'antronasal': ['antronasal', 'nasoantral'], 'antroscope': ['antroscope', 'contrapose'], 'antroscopy': ['antroscopy', 'syncopator'], 'antrotome': ['antrotome', 'nototrema'], 'antrustion': ['antrustion', 'nasturtion'], 'antu': ['antu', 'aunt', 'naut', 'taun', 'tuan', 'tuna'], 'anubis': ['anubis', 'unbias'], 'anura': ['anura', 'ruana'], 'anuresis': ['anuresis', 'senarius'], 'anuretic': ['anuretic', 'centauri', 'centuria', 'teucrian'], 'anuria': ['anuria', 'urania'], 'anuric': ['anuric', 'cinura', 'uranic'], 'anurous': ['anurous', 'uranous'], 'anury': ['anury', 'unary', 'unray'], 'anus': ['ansu', 'anus'], 'anusim': ['animus', 'anisum', 'anusim', 'manius'], 'anvil': ['alvin', 'anvil', 'nival', 'vinal'], 'any': ['any', 'nay', 'yan'], 'aonach': ['aonach', 'choana'], 'aoristic': ['aoristic', 'iscariot'], 'aortal': ['aortal', 'rotala'], 'aortectasis': ['aerostatics', 'aortectasis'], 'aortism': ['amorist', 'aortism', 'miastor'], 'aosmic': ['aosmic', 'mosaic'], 'apachite': ['apachite', 'hepatica'], 'apalachee': ['acalephae', 'apalachee'], 'apama': ['amapa', 'apama'], 'apanthropy': ['apanthropy', 'panatrophy'], 'apar': ['apar', 'paar', 'para'], 'apart': ['apart', 'trapa'], 'apatetic': ['apatetic', 'capitate'], 'ape': ['ape', 'pea'], 'apedom': ['apedom', 'pomade'], 'apeiron': ['apeiron', 'peorian'], 'apelet': ['apelet', 'ptelea'], 'apelike': ['apelike', 'pealike'], 'apeling': ['apeling', 'leaping'], 'apenteric': ['anticreep', 'apenteric', 'increpate'], 'apeptic': ['apeptic', 'catpipe'], 'aper': ['aper', 'pare', 'pear', 'rape', 'reap'], 'aperch': ['aperch', 'eparch', 'percha', 'preach'], 'aperitive': ['aperitive', 'petiveria'], 'apert': ['apert', 'pater', 'peart', 'prate', 'taper', 'terap'], 'apertly': ['apertly', 'peartly', 'platery', 'pteryla', 'taperly'], 'apertness': ['apertness', 'peartness', 'taperness'], 'apertured': ['apertured', 'departure'], 'apery': ['apery', 'payer', 'repay'], 'aphanes': ['aphanes', 'saphena'], 'aphasia': ['aphasia', 'asaphia'], 'aphasic': ['aphasic', 'asaphic'], 'aphemic': ['aphemic', 'impeach'], 'aphetic': ['aphetic', 'caphite', 'hepatic'], 'aphetism': ['aphetism', 'mateship', 'shipmate', 'spithame'], 'aphetize': ['aphetize', 'hepatize'], 'aphides': ['aphides', 'diphase'], 'aphidicolous': ['acidophilous', 'aphidicolous'], 'aphis': ['aphis', 'apish', 'hispa', 'saiph', 'spahi'], 'aphodian': ['adiaphon', 'aphodian'], 'aphonic': ['aphonic', 'phocian'], 'aphorismical': ['aphorismical', 'parochialism'], 'aphotic': ['aphotic', 'picotah'], 'aphra': ['aphra', 'harpa', 'parah'], 'aphrodistic': ['aphrodistic', 'diastrophic'], 'aphrodite': ['aphrodite', 'atrophied', 'diaporthe'], 'apian': ['apian', 'apina'], 'apiator': ['apiator', 'atropia', 'parotia'], 'apical': ['apical', 'palaic'], 'apicular': ['apicular', 'piacular'], 'apina': ['apian', 'apina'], 'apinae': ['anepia', 'apinae'], 'apinage': ['aegipan', 'apinage'], 'apinch': ['apinch', 'chapin', 'phanic'], 'aping': ['aping', 'ngapi', 'pangi'], 'apiole': ['apiole', 'leipoa'], 'apiolin': ['apiolin', 'pinolia'], 'apionol': ['apionol', 'polonia'], 'apiose': ['apiose', 'apoise'], 'apis': ['apis', 'pais', 'pasi', 'saip'], 'apish': ['aphis', 'apish', 'hispa', 'saiph', 'spahi'], 'apishly': ['apishly', 'layship'], 'apism': ['apism', 'sampi'], 'apitpat': ['apitpat', 'pitapat'], 'apivorous': ['apivorous', 'oviparous'], 'aplenty': ['aplenty', 'penalty'], 'aplite': ['aplite', 'pilate'], 'aplitic': ['aliptic', 'aplitic'], 'aplodontia': ['adoptional', 'aplodontia'], 'aplome': ['aplome', 'malope'], 'apnea': ['apnea', 'paean'], 'apneal': ['apneal', 'panela'], 'apochromat': ['apochromat', 'archoptoma'], 'apocrita': ['apocrita', 'aproctia'], 'apocryph': ['apocryph', 'hypocarp'], 'apod': ['apod', 'dopa'], 'apoda': ['adpao', 'apoda'], 'apogon': ['apogon', 'poonga'], 'apoise': ['apiose', 'apoise'], 'apolaustic': ['apolaustic', 'autopsical'], 'apolistan': ['apolistan', 'lapsation'], 'apollo': ['apollo', 'palolo'], 'aponia': ['anopia', 'aponia', 'poiana'], 'aponic': ['aponic', 'ponica'], 'aporetic': ['aporetic', 'capriote', 'operatic'], 'aporetical': ['aporetical', 'operatical'], 'aporia': ['aporia', 'piaroa'], 'aport': ['aport', 'parto', 'porta'], 'aportoise': ['aportoise', 'esotropia'], 'aposporous': ['aposporous', 'aprosopous'], 'apostil': ['apostil', 'topsail'], 'apostle': ['apostle', 'aseptol'], 'apostrophus': ['apostrophus', 'pastophorus'], 'apothesine': ['apothesine', 'isoheptane'], 'apout': ['apout', 'taupo'], 'appall': ['appall', 'palpal'], 'apparent': ['apparent', 'trappean'], 'appealer': ['appealer', 'reappeal'], 'appealing': ['appealing', 'lagniappe', 'panplegia'], 'appearer': ['appearer', 'rapparee', 'reappear'], 'append': ['append', 'napped'], 'applauder': ['applauder', 'reapplaud'], 'applicator': ['applicator', 'procapital'], 'applier': ['applier', 'aripple'], 'appointe': ['antipope', 'appointe'], 'appointer': ['appointer', 'reappoint'], 'appointor': ['appointor', 'apportion'], 'apportion': ['appointor', 'apportion'], 'apportioner': ['apportioner', 'reapportion'], 'appraisable': ['appraisable', 'parablepsia'], 'apprehender': ['apprehender', 'reapprehend'], 'approacher': ['approacher', 'reapproach'], 'apricot': ['apricot', 'atropic', 'parotic', 'patrico'], 'april': ['april', 'pilar', 'ripal'], 'aprilis': ['aprilis', 'liparis'], 'aproctia': ['apocrita', 'aproctia'], 'apronless': ['apronless', 'responsal'], 'aprosopous': ['aposporous', 'aprosopous'], 'apse': ['apse', 'pesa', 'spae'], 'apsidiole': ['apsidiole', 'episodial'], 'apt': ['apt', 'pat', 'tap'], 'aptal': ['aptal', 'palta', 'talpa'], 'aptera': ['aptera', 'parate', 'patera'], 'apterial': ['apterial', 'parietal'], 'apteroid': ['apteroid', 'proteida'], 'aptian': ['aptian', 'patina', 'taipan'], 'aptly': ['aptly', 'patly', 'platy', 'typal'], 'aptness': ['aptness', 'patness'], 'aptote': ['aptote', 'optate', 'potate', 'teapot'], 'apulian': ['apulian', 'paulian', 'paulina'], 'apulse': ['apulse', 'upseal'], 'apus': ['apus', 'supa', 'upas'], 'aquabelle': ['aquabelle', 'equalable'], 'aqueoigneous': ['aqueoigneous', 'igneoaqueous'], 'aquicolous': ['aquicolous', 'loquacious'], 'ar': ['ar', 'ra'], 'arab': ['arab', 'arba', 'baar', 'bara'], 'arabic': ['arabic', 'cairba'], 'arabinic': ['arabinic', 'cabirian', 'carabini', 'cibarian'], 'arabis': ['abaris', 'arabis'], 'arabism': ['abramis', 'arabism'], 'arabist': ['arabist', 'bartsia'], 'arabit': ['arabit', 'tabira'], 'arable': ['ablare', 'arable', 'arbela'], 'araca': ['acara', 'araca'], 'aracana': ['anacara', 'aracana'], 'aracanga': ['aracanga', 'caragana'], 'arachic': ['arachic', 'archaic'], 'arachidonic': ['arachidonic', 'characinoid'], 'arachis': ['arachis', 'asiarch', 'saharic'], 'arachne': ['arachne', 'archean'], 'arachnism': ['anarchism', 'arachnism'], 'arachnitis': ['arachnitis', 'christiana'], 'arad': ['adar', 'arad', 'raad', 'rada'], 'arain': ['airan', 'arain', 'arian'], 'arales': ['alares', 'arales'], 'aralia': ['alaria', 'aralia'], 'aralie': ['aerial', 'aralie'], 'aramaic': ['aramaic', 'cariama'], 'aramina': ['aramina', 'mariana'], 'araminta': ['anamirta', 'araminta'], 'aramus': ['aramus', 'asarum'], 'araneid': ['araneid', 'ariadne', 'ranidae'], 'aranein': ['aranein', 'raninae'], 'aranga': ['angara', 'aranga', 'nagara'], 'arango': ['agroan', 'angora', 'anogra', 'arango', 'argoan', 'onagra'], 'arati': ['arati', 'atria', 'riata', 'tarai', 'tiara'], 'aration': ['aration', 'otarian'], 'arauan': ['arauan', 'arauna'], 'arauna': ['arauan', 'arauna'], 'arba': ['arab', 'arba', 'baar', 'bara'], 'arbacin': ['arbacin', 'carabin', 'cariban'], 'arbalester': ['arbalester', 'arbalestre', 'arrestable'], 'arbalestre': ['arbalester', 'arbalestre', 'arrestable'], 'arbalister': ['arbalister', 'breastrail'], 'arbalo': ['aboral', 'arbalo'], 'arbela': ['ablare', 'arable', 'arbela'], 'arbiter': ['arbiter', 'rarebit'], 'arbored': ['arbored', 'boarder', 'reboard'], 'arboret': ['arboret', 'roberta', 'taborer'], 'arboretum': ['arboretum', 'tambourer'], 'arborist': ['arborist', 'ribroast'], 'arbuscle': ['arbuscle', 'buscarle'], 'arbutin': ['arbutin', 'tribuna'], 'arc': ['arc', 'car'], 'arca': ['arca', 'cara'], 'arcadia': ['acardia', 'acarida', 'arcadia'], 'arcadic': ['arcadic', 'cardiac'], 'arcane': ['arcane', 'carane'], 'arcanite': ['anaretic', 'arcanite', 'carinate', 'craniate'], 'arcate': ['arcate', 'cerata'], 'arch': ['arch', 'char', 'rach'], 'archae': ['archae', 'areach'], 'archaic': ['arachic', 'archaic'], 'archaism': ['archaism', 'charisma'], 'archapostle': ['archapostle', 'thecasporal'], 'archcount': ['archcount', 'crouchant'], 'arche': ['acher', 'arche', 'chare', 'chera', 'rache', 'reach'], 'archeal': ['alchera', 'archeal'], 'archean': ['arachne', 'archean'], 'archer': ['archer', 'charer', 'rechar'], 'arches': ['arches', 'chaser', 'eschar', 'recash', 'search'], 'archidome': ['archidome', 'chromidae'], 'archil': ['archil', 'chiral'], 'arching': ['arching', 'chagrin'], 'architis': ['architis', 'rachitis'], 'archocele': ['archocele', 'cochleare'], 'archon': ['anchor', 'archon', 'charon', 'rancho'], 'archontia': ['archontia', 'tocharian'], 'archoptoma': ['apochromat', 'archoptoma'], 'archpoet': ['archpoet', 'protheca'], 'archprelate': ['archprelate', 'pretracheal'], 'archsaint': ['anarchist', 'archsaint', 'cantharis'], 'archsee': ['archsee', 'rechase'], 'archsin': ['archsin', 'incrash'], 'archy': ['archy', 'chary'], 'arcidae': ['arcidae', 'caridea'], 'arcing': ['arcing', 'racing'], 'arcite': ['acrite', 'arcite', 'tercia', 'triace', 'tricae'], 'arcked': ['arcked', 'dacker'], 'arcking': ['arcking', 'carking', 'racking'], 'arcos': ['arcos', 'crosa', 'oscar', 'sacro'], 'arctia': ['acrita', 'arctia'], 'arctian': ['acritan', 'arctian'], 'arcticize': ['arcticize', 'cicatrize'], 'arctiid': ['arctiid', 'triacid', 'triadic'], 'arctoid': ['arctoid', 'carotid', 'dartoic'], 'arctoidean': ['arctoidean', 'carotidean', 'cordaitean', 'dinocerata'], 'arctomys': ['arctomys', 'costmary', 'mascotry'], 'arctos': ['arctos', 'castor', 'costar', 'scrota'], 'arcual': ['arcual', 'arcula'], 'arcuale': ['arcuale', 'caurale'], 'arcubalist': ['arcubalist', 'ultrabasic'], 'arcula': ['arcual', 'arcula'], 'arculite': ['arculite', 'cutleria', 'lucretia', 'reticula', 'treculia'], 'ardea': ['ardea', 'aread'], 'ardeb': ['ardeb', 'beard', 'bread', 'debar'], 'ardelia': ['ardelia', 'laridae', 'radiale'], 'ardella': ['ardella', 'dareall'], 'ardency': ['ardency', 'dancery'], 'ardish': ['ardish', 'radish'], 'ardoise': ['ardoise', 'aroides', 'soredia'], 'ardu': ['ardu', 'daur', 'dura'], 'are': ['aer', 'are', 'ear', 'era', 'rea'], 'areach': ['archae', 'areach'], 'aread': ['ardea', 'aread'], 'areal': ['areal', 'reaal'], 'arean': ['anear', 'arean', 'arena'], 'arecaceae': ['aceraceae', 'arecaceae'], 'arecaceous': ['aceraceous', 'arecaceous'], 'arecain': ['acarine', 'acraein', 'arecain'], 'arecolin': ['acrolein', 'arecolin', 'caroline', 'colinear', 'cornelia', 'creolian', 'lonicera'], 'arecoline': ['arecoline', 'arenicole'], 'arecuna': ['arecuna', 'aucaner'], 'ared': ['ared', 'daer', 'dare', 'dear', 'read'], 'areel': ['areel', 'earle'], 'arena': ['anear', 'arean', 'arena'], 'arenaria': ['aerarian', 'arenaria'], 'arend': ['andre', 'arend', 'daren', 'redan'], 'areng': ['anger', 'areng', 'grane', 'range'], 'arenga': ['arenga', 'argean'], 'arenicole': ['arecoline', 'arenicole'], 'arenicolite': ['arenicolite', 'ricinoleate'], 'arenig': ['arenig', 'earing', 'gainer', 'reagin', 'regain'], 'arenoid': ['aneroid', 'arenoid'], 'arenose': ['arenose', 'serenoa'], 'arent': ['antre', 'arent', 'retan', 'terna'], 'areographer': ['aerographer', 'areographer'], 'areographic': ['aerographic', 'areographic'], 'areographical': ['aerographical', 'areographical'], 'areography': ['aerography', 'areography'], 'areologic': ['aerologic', 'areologic'], 'areological': ['aerological', 'areological'], 'areologist': ['aerologist', 'areologist'], 'areology': ['aerology', 'areology'], 'areometer': ['aerometer', 'areometer'], 'areometric': ['aerometric', 'areometric'], 'areometry': ['aerometry', 'areometry'], 'arete': ['arete', 'eater', 'teaer'], 'argal': ['agral', 'argal'], 'argali': ['argali', 'garial'], 'argans': ['argans', 'sangar'], 'argante': ['argante', 'granate', 'tanager'], 'argas': ['argas', 'sagra'], 'argean': ['arenga', 'argean'], 'argeers': ['argeers', 'greaser', 'serrage'], 'argel': ['argel', 'ergal', 'garle', 'glare', 'lager', 'large', 'regal'], 'argenol': ['argenol', 'longear'], 'argent': ['argent', 'garnet', 'garten', 'tanger'], 'argentamid': ['argentamid', 'marginated'], 'argenter': ['argenter', 'garneter'], 'argenteum': ['argenteum', 'augmenter'], 'argentic': ['argentic', 'citrange'], 'argentide': ['argentide', 'denigrate', 'dinergate'], 'argentiferous': ['argentiferous', 'garnetiferous'], 'argentina': ['argentina', 'tanagrine'], 'argentine': ['argentine', 'tangerine'], 'argentino': ['antinegro', 'argentino', 'argention'], 'argention': ['antinegro', 'argentino', 'argention'], 'argentite': ['argentite', 'integrate'], 'argentol': ['argentol', 'gerontal'], 'argenton': ['argenton', 'negatron'], 'argentous': ['argentous', 'neotragus'], 'argentum': ['argentum', 'argument'], 'arghan': ['arghan', 'hangar'], 'argil': ['argil', 'glair', 'grail'], 'arginine': ['arginine', 'nigerian'], 'argive': ['argive', 'rivage'], 'argo': ['argo', 'garo', 'gora'], 'argoan': ['agroan', 'angora', 'anogra', 'arango', 'argoan', 'onagra'], 'argol': ['algor', 'argol', 'goral', 'largo'], 'argolet': ['argolet', 'gloater', 'legator'], 'argolian': ['argolian', 'gloriana'], 'argolic': ['argolic', 'cograil'], 'argolid': ['argolid', 'goliard'], 'argon': ['angor', 'argon', 'goran', 'grano', 'groan', 'nagor', 'orang', 'organ', 'rogan', 'ronga'], 'argot': ['argot', 'gator', 'gotra', 'groat'], 'argue': ['argue', 'auger'], 'argulus': ['argulus', 'lagurus'], 'argument': ['argentum', 'argument'], 'argus': ['argus', 'sugar'], 'arguslike': ['arguslike', 'sugarlike'], 'argute': ['argute', 'guetar', 'rugate', 'tuareg'], 'argyle': ['argyle', 'gleary'], 'arhar': ['arhar', 'arrah'], 'arhat': ['arhat', 'artha', 'athar'], 'aria': ['aira', 'aria', 'raia'], 'ariadne': ['araneid', 'ariadne', 'ranidae'], 'arian': ['airan', 'arain', 'arian'], 'arianrhod': ['arianrhod', 'hordarian'], 'aribine': ['aribine', 'bairnie', 'iberian'], 'arician': ['arician', 'icarian'], 'arid': ['arid', 'dari', 'raid'], 'aridian': ['aridian', 'diarian'], 'aridly': ['aridly', 'lyraid'], 'ariegite': ['aegirite', 'ariegite'], 'aries': ['aries', 'arise', 'raise', 'serai'], 'arietid': ['arietid', 'iridate'], 'arietta': ['arietta', 'ratitae'], 'aright': ['aright', 'graith'], 'arightly': ['alrighty', 'arightly'], 'ariidae': ['ariidae', 'raiidae'], 'aril': ['aril', 'lair', 'lari', 'liar', 'lira', 'rail', 'rial'], 'ariled': ['ariled', 'derail', 'dialer'], 'arillate': ['arillate', 'tiarella'], 'arion': ['arion', 'noria'], 'ariot': ['ariot', 'ratio'], 'aripple': ['applier', 'aripple'], 'arise': ['aries', 'arise', 'raise', 'serai'], 'arisen': ['arisen', 'arsine', 'resina', 'serian'], 'arist': ['arist', 'astir', 'sitar', 'stair', 'stria', 'tarsi', 'tisar', 'trias'], 'arista': ['arista', 'tarsia'], 'aristeas': ['aristeas', 'asterias'], 'aristol': ['aristol', 'oralist', 'ortalis', 'striola'], 'aristulate': ['aristulate', 'australite'], 'arite': ['arite', 'artie', 'irate', 'retia', 'tarie'], 'arithmic': ['arithmic', 'mithraic', 'mithriac'], 'arius': ['arius', 'asuri'], 'arizona': ['arizona', 'azorian', 'zonaria'], 'ark': ['ark', 'kra'], 'arkab': ['abkar', 'arkab'], 'arkite': ['arkite', 'karite'], 'arkose': ['arkose', 'resoak', 'soaker'], 'arlene': ['arlene', 'leaner'], 'arleng': ['angler', 'arleng', 'garnel', 'largen', 'rangle', 'regnal'], 'arles': ['arles', 'arsle', 'laser', 'seral', 'slare'], 'arline': ['arline', 'larine', 'linear', 'nailer', 'renail'], 'arm': ['arm', 'mar', 'ram'], 'armada': ['armada', 'damara', 'ramada'], 'armangite': ['armangite', 'marginate'], 'armata': ['armata', 'matara', 'tamara'], 'armed': ['armed', 'derma', 'dream', 'ramed'], 'armenian': ['armenian', 'marianne'], 'armenic': ['armenic', 'carmine', 'ceriman', 'crimean', 'mercian'], 'armer': ['armer', 'rearm'], 'armeria': ['armeria', 'mararie'], 'armet': ['armet', 'mater', 'merat', 'metra', 'ramet', 'tamer', 'terma', 'trame', 'trema'], 'armful': ['armful', 'fulmar'], 'armgaunt': ['armgaunt', 'granatum'], 'armied': ['admire', 'armied', 'damier', 'dimera', 'merida'], 'armiferous': ['armiferous', 'ramiferous'], 'armigerous': ['armigerous', 'ramigerous'], 'armil': ['armil', 'marli', 'rimal'], 'armilla': ['armilla', 'marilla'], 'armillated': ['armillated', 'malladrite', 'mallardite'], 'arming': ['arming', 'ingram', 'margin'], 'armistice': ['ameristic', 'armistice', 'artemisic'], 'armlet': ['armlet', 'malter', 'martel'], 'armonica': ['armonica', 'macaroni', 'marocain'], 'armoried': ['airdrome', 'armoried'], 'armpit': ['armpit', 'impart'], 'armplate': ['armplate', 'malapert'], 'arms': ['arms', 'mars'], 'armscye': ['armscye', 'screamy'], 'army': ['army', 'mary', 'myra', 'yarm'], 'arn': ['arn', 'nar', 'ran'], 'arna': ['arna', 'rana'], 'arnaut': ['arnaut', 'arunta'], 'arne': ['arne', 'earn', 'rane'], 'arneb': ['abner', 'arneb', 'reban'], 'arni': ['arni', 'iran', 'nair', 'rain', 'rani'], 'arnica': ['acinar', 'arnica', 'canari', 'carian', 'carina', 'crania', 'narica'], 'arnold': ['androl', 'arnold', 'lardon', 'roland', 'ronald'], 'arnotta': ['arnotta', 'natator'], 'arnotto': ['arnotto', 'notator'], 'arnut': ['arnut', 'tuarn', 'untar'], 'aro': ['aro', 'oar', 'ora'], 'aroast': ['aroast', 'ostara'], 'arock': ['arock', 'croak'], 'aroid': ['aroid', 'doria', 'radio'], 'aroides': ['ardoise', 'aroides', 'soredia'], 'aroint': ['aroint', 'ration'], 'aromatic': ['aromatic', 'macrotia'], 'aroon': ['aroon', 'oraon'], 'arose': ['arose', 'oreas'], 'around': ['around', 'arundo'], 'arpen': ['arpen', 'paren'], 'arpent': ['arpent', 'enrapt', 'entrap', 'panter', 'parent', 'pretan', 'trepan'], 'arrah': ['arhar', 'arrah'], 'arras': ['arras', 'sarra'], 'arrau': ['arrau', 'aurar'], 'arrayer': ['arrayer', 'rearray'], 'arrect': ['arrect', 'carter', 'crater', 'recart', 'tracer'], 'arrector': ['arrector', 'carroter'], 'arrent': ['arrent', 'errant', 'ranter', 'ternar'], 'arrest': ['arrest', 'astrer', 'raster', 'starer'], 'arrestable': ['arbalester', 'arbalestre', 'arrestable'], 'arrester': ['arrester', 'rearrest'], 'arresting': ['arresting', 'astringer'], 'arretine': ['arretine', 'eretrian', 'eritrean', 'retainer'], 'arride': ['arride', 'raider'], 'arrie': ['airer', 'arrie'], 'arriet': ['arriet', 'tarrie'], 'arrish': ['arrish', 'harris', 'rarish', 'sirrah'], 'arrive': ['arrive', 'varier'], 'arrogance': ['arrogance', 'coarrange'], 'arrogant': ['arrogant', 'tarragon'], 'arrogative': ['arrogative', 'variegator'], 'arrowy': ['arrowy', 'yarrow'], 'arry': ['arry', 'yarr'], 'arsacid': ['arsacid', 'ascarid'], 'arse': ['arse', 'rase', 'sare', 'sear', 'sera'], 'arsedine': ['arsedine', 'arsenide', 'sedanier', 'siderean'], 'arsenal': ['arsenal', 'ranales'], 'arsenate': ['arsenate', 'serenata'], 'arsenation': ['arsenation', 'senatorian', 'sonneratia'], 'arseniate': ['arseniate', 'saernaite'], 'arsenic': ['arsenic', 'cerasin', 'sarcine'], 'arsenide': ['arsedine', 'arsenide', 'sedanier', 'siderean'], 'arsenite': ['arsenite', 'resinate', 'teresian', 'teresina'], 'arsenium': ['aneurism', 'arsenium', 'sumerian'], 'arseniuret': ['arseniuret', 'uniserrate'], 'arseno': ['arseno', 'reason'], 'arsenopyrite': ['arsenopyrite', 'pyroarsenite'], 'arsenous': ['anserous', 'arsenous'], 'arses': ['arses', 'rasse'], 'arshine': ['arshine', 'nearish', 'rhesian', 'sherani'], 'arsine': ['arisen', 'arsine', 'resina', 'serian'], 'arsino': ['arsino', 'rasion', 'sonrai'], 'arsis': ['arsis', 'sarsi'], 'arsle': ['arles', 'arsle', 'laser', 'seral', 'slare'], 'arson': ['arson', 'saron', 'sonar'], 'arsonic': ['arsonic', 'saronic'], 'arsonite': ['arsonite', 'asterion', 'oestrian', 'rosinate', 'serotina'], 'art': ['art', 'rat', 'tar', 'tra'], 'artaba': ['artaba', 'batara'], 'artabe': ['abater', 'artabe', 'eartab', 'trabea'], 'artal': ['altar', 'artal', 'ratal', 'talar'], 'artamus': ['artamus', 'sumatra'], 'artarine': ['artarine', 'errantia'], 'artefact': ['afteract', 'artefact', 'farcetta', 'farctate'], 'artel': ['alert', 'alter', 'artel', 'later', 'ratel', 'taler', 'telar'], 'artemas': ['artemas', 'astream'], 'artemia': ['ametria', 'artemia', 'meratia', 'ramaite'], 'artemis': ['artemis', 'maestri', 'misrate'], 'artemisic': ['ameristic', 'armistice', 'artemisic'], 'arterial': ['arterial', 'triareal'], 'arterin': ['arterin', 'retrain', 'terrain', 'trainer'], 'arterious': ['arterious', 'autoriser'], 'artesian': ['artesian', 'asterina', 'asternia', 'erastian', 'seatrain'], 'artgum': ['artgum', 'targum'], 'artha': ['arhat', 'artha', 'athar'], 'arthel': ['arthel', 'halter', 'lather', 'thaler'], 'arthemis': ['arthemis', 'marshite', 'meharist'], 'arthrochondritis': ['arthrochondritis', 'chondroarthritis'], 'arthromere': ['arthromere', 'metrorrhea'], 'arthropodan': ['anarthropod', 'arthropodan'], 'arthrosteitis': ['arthrosteitis', 'ostearthritis'], 'article': ['article', 'recital'], 'articled': ['articled', 'lacertid'], 'artie': ['arite', 'artie', 'irate', 'retia', 'tarie'], 'artifice': ['actifier', 'artifice'], 'artisan': ['artisan', 'astrain', 'sartain', 'tsarina'], 'artisanship': ['antiphrasis', 'artisanship'], 'artist': ['artist', 'strait', 'strati'], 'artiste': ['artiste', 'striate'], 'artlet': ['artlet', 'latter', 'rattle', 'tartle', 'tatler'], 'artlike': ['artlike', 'ratlike', 'tarlike'], 'arty': ['arty', 'atry', 'tray'], 'aru': ['aru', 'rua', 'ura'], 'aruac': ['aruac', 'carua'], 'arui': ['arui', 'uria'], 'arum': ['arum', 'maru', 'mura'], 'arundo': ['around', 'arundo'], 'arunta': ['arnaut', 'arunta'], 'arusa': ['arusa', 'saura', 'usara'], 'arusha': ['arusha', 'aushar'], 'arustle': ['arustle', 'estrual', 'saluter', 'saulter'], 'arval': ['alvar', 'arval', 'larva'], 'arvel': ['arvel', 'larve', 'laver', 'ravel', 'velar'], 'arx': ['arx', 'rax'], 'ary': ['ary', 'ray', 'yar'], 'arya': ['arya', 'raya'], 'aryan': ['aryan', 'nayar', 'rayan'], 'aryl': ['aryl', 'lyra', 'ryal', 'yarl'], 'as': ['as', 'sa'], 'asa': ['asa', 'saa'], 'asak': ['asak', 'kasa', 'saka'], 'asana': ['anasa', 'asana'], 'asaph': ['asaph', 'pasha'], 'asaphia': ['aphasia', 'asaphia'], 'asaphic': ['aphasic', 'asaphic'], 'asaprol': ['asaprol', 'parasol'], 'asarh': ['asarh', 'raash', 'sarah'], 'asarite': ['asarite', 'asteria', 'atresia', 'setaria'], 'asarum': ['aramus', 'asarum'], 'asbest': ['asbest', 'basset'], 'ascanius': ['anacusis', 'ascanius'], 'ascare': ['ascare', 'caesar', 'resaca'], 'ascarid': ['arsacid', 'ascarid'], 'ascaris': ['ascaris', 'carissa'], 'ascendance': ['adnascence', 'ascendance'], 'ascendant': ['adnascent', 'ascendant'], 'ascender': ['ascender', 'reascend'], 'ascent': ['ascent', 'secant', 'stance'], 'ascertain': ['ascertain', 'cartesian', 'cartisane', 'sectarian'], 'ascertainer': ['ascertainer', 'reascertain', 'secretarian'], 'ascetic': ['ascetic', 'castice', 'siccate'], 'ascham': ['ascham', 'chasma'], 'asci': ['acis', 'asci', 'saic'], 'ascian': ['ascian', 'sacian', 'scania', 'sicana'], 'ascidia': ['ascidia', 'diascia'], 'ascii': ['ascii', 'isiac'], 'ascites': ['ascites', 'ectasis'], 'ascitic': ['ascitic', 'sciatic'], 'ascitical': ['ascitical', 'sciatical'], 'asclent': ['asclent', 'scantle'], 'asclepian': ['asclepian', 'spalacine'], 'ascolichen': ['ascolichen', 'chalcosine'], 'ascon': ['ascon', 'canso', 'oscan'], 'ascot': ['ascot', 'coast', 'costa', 'tacso', 'tasco'], 'ascription': ['antipsoric', 'ascription', 'crispation'], 'ascry': ['ascry', 'scary', 'scray'], 'ascula': ['ascula', 'calusa', 'casual', 'casula', 'causal'], 'asdic': ['asdic', 'sadic'], 'ase': ['aes', 'ase', 'sea'], 'asearch': ['asearch', 'eschara'], 'aselli': ['allies', 'aselli'], 'asem': ['asem', 'mesa', 'same', 'seam'], 'asemia': ['asemia', 'saeima'], 'aseptic': ['aseptic', 'spicate'], 'aseptol': ['apostle', 'aseptol'], 'ash': ['ash', 'sah', 'sha'], 'ashanti': ['ashanti', 'sanhita', 'shaitan', 'thasian'], 'ashen': ['ashen', 'hanse', 'shane', 'shean'], 'asher': ['asher', 'share', 'shear'], 'ashet': ['ashet', 'haste', 'sheat'], 'ashimmer': ['ashimmer', 'haremism'], 'ashir': ['ashir', 'shari'], 'ashling': ['anglish', 'ashling'], 'ashman': ['ashman', 'shaman'], 'ashore': ['ahorse', 'ashore', 'hoarse', 'shorea'], 'ashraf': ['afshar', 'ashraf'], 'ashur': ['ashur', 'surah'], 'ashy': ['ashy', 'shay'], 'asian': ['asian', 'naias', 'sanai'], 'asiarch': ['arachis', 'asiarch', 'saharic'], 'aside': ['aides', 'aside', 'sadie'], 'asideu': ['asideu', 'suidae'], 'asiento': ['aeonist', 'asiento', 'satieno'], 'asilid': ['asilid', 'sialid'], 'asilidae': ['asilidae', 'sialidae'], 'asilus': ['asilus', 'lasius'], 'asimen': ['asimen', 'inseam', 'mesian'], 'asimmer': ['amerism', 'asimmer', 'sammier'], 'asiphonate': ['asiphonate', 'asthenopia'], 'ask': ['ask', 'sak'], 'asker': ['asker', 'reask', 'saker', 'sekar'], 'askew': ['askew', 'wakes'], 'askip': ['askip', 'spaik'], 'askr': ['askr', 'kras', 'sark'], 'aslant': ['aslant', 'lansat', 'natals', 'santal'], 'asleep': ['asleep', 'elapse', 'please'], 'aslope': ['aslope', 'poales'], 'asmalte': ['asmalte', 'maltase'], 'asmile': ['amiles', 'asmile', 'mesail', 'mesial', 'samiel'], 'asnort': ['asnort', 'satron'], 'asoak': ['asoak', 'asoka'], 'asok': ['asok', 'soak', 'soka'], 'asoka': ['asoak', 'asoka'], 'asonia': ['anosia', 'asonia'], 'asop': ['asop', 'sapo', 'soap'], 'asor': ['asor', 'rosa', 'soar', 'sora'], 'asp': ['asp', 'sap', 'spa'], 'aspartic': ['aspartic', 'satrapic'], 'aspection': ['aspection', 'stenopaic'], 'aspectual': ['aspectual', 'capsulate'], 'aspen': ['aspen', 'panse', 'snape', 'sneap', 'spane', 'spean'], 'asper': ['asper', 'parse', 'prase', 'spaer', 'spare', 'spear'], 'asperate': ['asperate', 'separate'], 'asperation': ['anisoptera', 'asperation', 'separation'], 'asperge': ['asperge', 'presage'], 'asperger': ['asperger', 'presager'], 'aspergil': ['aspergil', 'splairge'], 'asperite': ['asperite', 'parietes'], 'aspermia': ['aspermia', 'sapremia'], 'aspermic': ['aspermic', 'sapremic'], 'asperser': ['asperser', 'repasser'], 'asperulous': ['asperulous', 'pleasurous'], 'asphalt': ['asphalt', 'spathal', 'taplash'], 'aspic': ['aspic', 'spica'], 'aspidinol': ['aspidinol', 'diplasion'], 'aspirant': ['aspirant', 'partisan', 'spartina'], 'aspirata': ['aspirata', 'parasita'], 'aspirate': ['aspirate', 'parasite'], 'aspire': ['aspire', 'paries', 'praise', 'sirpea', 'spirea'], 'aspirer': ['aspirer', 'praiser', 'serpari'], 'aspiring': ['aspiring', 'praising', 'singarip'], 'aspiringly': ['aspiringly', 'praisingly'], 'aspish': ['aspish', 'phasis'], 'asporous': ['asporous', 'saporous'], 'asport': ['asport', 'pastor', 'sproat'], 'aspread': ['aspread', 'saperda'], 'aspring': ['aspring', 'rasping', 'sparing'], 'asquirm': ['asquirm', 'marquis'], 'assagai': ['assagai', 'gaiassa'], 'assailer': ['assailer', 'reassail'], 'assam': ['amass', 'assam', 'massa', 'samas'], 'assaulter': ['assaulter', 'reassault', 'saleratus'], 'assayer': ['assayer', 'reassay'], 'assemble': ['assemble', 'beamless'], 'assent': ['assent', 'snaste'], 'assenter': ['assenter', 'reassent', 'sarsenet'], 'assentor': ['assentor', 'essorant', 'starnose'], 'assert': ['assert', 'tasser'], 'asserter': ['asserter', 'reassert'], 'assertible': ['assertible', 'resistable'], 'assertional': ['assertional', 'sensatorial'], 'assertor': ['assertor', 'assorter', 'oratress', 'reassort'], 'asset': ['asset', 'tasse'], 'assets': ['assets', 'stases'], 'assidean': ['assidean', 'nassidae'], 'assiento': ['assiento', 'ossetian'], 'assignee': ['agenesis', 'assignee'], 'assigner': ['assigner', 'reassign'], 'assist': ['assist', 'stasis'], 'assister': ['assister', 'reassist'], 'associationism': ['associationism', 'misassociation'], 'assoilment': ['assoilment', 'salmonsite'], 'assorter': ['assertor', 'assorter', 'oratress', 'reassort'], 'assuage': ['assuage', 'sausage'], 'assume': ['assume', 'seamus'], 'assumer': ['assumer', 'erasmus', 'masseur'], 'ast': ['ast', 'sat'], 'astacus': ['acastus', 'astacus'], 'astare': ['astare', 'satrae'], 'astart': ['astart', 'strata'], 'astartian': ['astartian', 'astrantia'], 'astatine': ['astatine', 'sanitate'], 'asteep': ['asteep', 'peseta'], 'asteer': ['asteer', 'easter', 'eastre', 'reseat', 'saeter', 'seater', 'staree', 'teaser', 'teresa'], 'astelic': ['astelic', 'elastic', 'latices'], 'astely': ['alytes', 'astely', 'lysate', 'stealy'], 'aster': ['aster', 'serta', 'stare', 'strae', 'tarse', 'teras'], 'asteria': ['asarite', 'asteria', 'atresia', 'setaria'], 'asterias': ['aristeas', 'asterias'], 'asterikos': ['asterikos', 'keratosis'], 'asterin': ['asterin', 'eranist', 'restain', 'stainer', 'starnie', 'stearin'], 'asterina': ['artesian', 'asterina', 'asternia', 'erastian', 'seatrain'], 'asterion': ['arsonite', 'asterion', 'oestrian', 'rosinate', 'serotina'], 'astern': ['astern', 'enstar', 'stenar', 'sterna'], 'asternia': ['artesian', 'asterina', 'asternia', 'erastian', 'seatrain'], 'asteroid': ['asteroid', 'troiades'], 'asterope': ['asterope', 'protease'], 'asthenopia': ['asiphonate', 'asthenopia'], 'asthma': ['amsath', 'asthma'], 'asthmogenic': ['asthmogenic', 'mesognathic'], 'asthore': ['asthore', 'earshot'], 'astian': ['astian', 'tasian'], 'astigmism': ['astigmism', 'sigmatism'], 'astilbe': ['astilbe', 'bestial', 'blastie', 'stabile'], 'astint': ['astint', 'tanist'], 'astir': ['arist', 'astir', 'sitar', 'stair', 'stria', 'tarsi', 'tisar', 'trias'], 'astomous': ['astomous', 'somatous'], 'astonied': ['astonied', 'sedation'], 'astonisher': ['astonisher', 'reastonish', 'treasonish'], 'astor': ['astor', 'roast'], 'astragali': ['astragali', 'tarsalgia'], 'astrain': ['artisan', 'astrain', 'sartain', 'tsarina'], 'astral': ['astral', 'tarsal'], 'astrantia': ['astartian', 'astrantia'], 'astream': ['artemas', 'astream'], 'astrer': ['arrest', 'astrer', 'raster', 'starer'], 'astrict': ['astrict', 'cartist', 'stratic'], 'astride': ['astride', 'diaster', 'disrate', 'restiad', 'staired'], 'astrier': ['astrier', 'tarsier'], 'astringe': ['astringe', 'ganister', 'gantries'], 'astringent': ['astringent', 'transigent'], 'astringer': ['arresting', 'astringer'], 'astrodome': ['astrodome', 'roomstead'], 'astrofel': ['astrofel', 'forestal'], 'astroite': ['astroite', 'ostraite', 'storiate'], 'astrolabe': ['astrolabe', 'roastable'], 'astrut': ['astrut', 'rattus', 'stuart'], 'astur': ['astur', 'surat', 'sutra'], 'asturian': ['asturian', 'austrian', 'saturnia'], 'astute': ['astute', 'statue'], 'astylar': ['astylar', 'saltary'], 'asunder': ['asunder', 'drusean'], 'asuri': ['arius', 'asuri'], 'aswail': ['aswail', 'sawali'], 'asweat': ['asweat', 'awaste'], 'aswim': ['aswim', 'swami'], 'aswing': ['aswing', 'sawing'], 'asyla': ['asyla', 'salay', 'sayal'], 'asyllabic': ['asyllabic', 'basically'], 'asyndetic': ['asyndetic', 'cystidean', 'syndicate'], 'asynergia': ['asynergia', 'gainsayer'], 'at': ['at', 'ta'], 'ata': ['ata', 'taa'], 'atabal': ['albata', 'atabal', 'balata'], 'atabrine': ['atabrine', 'rabatine'], 'atacaman': ['atacaman', 'tamanaca'], 'ataentsic': ['anticaste', 'ataentsic'], 'atalan': ['atalan', 'tanala'], 'atap': ['atap', 'pata', 'tapa'], 'atazir': ['atazir', 'ziarat'], 'atchison': ['atchison', 'chitosan'], 'ate': ['ate', 'eat', 'eta', 'tae', 'tea'], 'ateba': ['abate', 'ateba', 'batea', 'beata'], 'atebrin': ['atebrin', 'rabinet'], 'atechnic': ['atechnic', 'catechin', 'technica'], 'atechny': ['atechny', 'chantey'], 'ateeter': ['ateeter', 'treatee'], 'atef': ['atef', 'fate', 'feat'], 'ateles': ['ateles', 'saltee', 'sealet', 'stelae', 'teasel'], 'atelets': ['atelets', 'tsatlee'], 'atelier': ['atelier', 'tiralee'], 'aten': ['ante', 'aten', 'etna', 'nate', 'neat', 'taen', 'tane', 'tean'], 'atenism': ['atenism', 'inmeats', 'insteam', 'samnite'], 'atenist': ['atenist', 'instate', 'satient', 'steatin'], 'ates': ['ates', 'east', 'eats', 'sate', 'seat', 'seta'], 'atestine': ['anisette', 'atestine', 'settaine'], 'athar': ['arhat', 'artha', 'athar'], 'atheism': ['atheism', 'hamites'], 'athena': ['ahtena', 'aneath', 'athena'], 'athenian': ['anthinae', 'athenian'], 'athenor': ['another', 'athenor', 'rheotan'], 'athens': ['athens', 'hasten', 'snathe', 'sneath'], 'atherine': ['atherine', 'herniate'], 'atheris': ['atheris', 'sheriat'], 'athermic': ['athermic', 'marchite', 'rhematic'], 'athing': ['anight', 'athing'], 'athirst': ['athirst', 'rattish', 'tartish'], 'athletic': ['athletic', 'thetical'], 'athletics': ['athletics', 'statelich'], 'athort': ['athort', 'throat'], 'athrive': ['athrive', 'hervati'], 'ati': ['ait', 'ati', 'ita', 'tai'], 'atik': ['atik', 'ikat'], 'atimon': ['atimon', 'manito', 'montia'], 'atingle': ['atingle', 'gelatin', 'genital', 'langite', 'telinga'], 'atip': ['atip', 'pita'], 'atis': ['atis', 'sita', 'tsia'], 'atlantean': ['antenatal', 'atlantean', 'tantalean'], 'atlantic': ['atlantic', 'tantalic'], 'atlantid': ['atlantid', 'dilatant'], 'atlantite': ['atlantite', 'tantalite'], 'atlas': ['atlas', 'salat', 'salta'], 'atle': ['atle', 'laet', 'late', 'leat', 'tael', 'tale', 'teal'], 'atlee': ['atlee', 'elate'], 'atloidean': ['atloidean', 'dealation'], 'atma': ['atma', 'tama'], 'atman': ['atman', 'manta'], 'atmid': ['admit', 'atmid'], 'atmo': ['atmo', 'atom', 'moat', 'toma'], 'atmogenic': ['atmogenic', 'geomantic'], 'atmos': ['atmos', 'stoma', 'tomas'], 'atmosphere': ['atmosphere', 'shapometer'], 'atmostea': ['atmostea', 'steatoma'], 'atnah': ['atnah', 'tanha', 'thana'], 'atocia': ['atocia', 'coaita'], 'atokal': ['atokal', 'lakota'], 'atoll': ['allot', 'atoll'], 'atom': ['atmo', 'atom', 'moat', 'toma'], 'atomic': ['atomic', 'matico'], 'atomics': ['atomics', 'catoism', 'cosmati', 'osmatic', 'somatic'], 'atomize': ['atomize', 'miaotze'], 'atomizer': ['amortize', 'atomizer'], 'atonal': ['atonal', 'latona'], 'atonalism': ['anomalist', 'atonalism'], 'atone': ['atone', 'oaten'], 'atoner': ['atoner', 'norate', 'ornate'], 'atonia': ['anotia', 'atonia'], 'atonic': ['action', 'atonic', 'cation'], 'atony': ['atony', 'ayont'], 'atop': ['atop', 'pato'], 'atopic': ['atopic', 'capito', 'copita'], 'atorai': ['atorai', 'otaria'], 'atrail': ['altair', 'atrail', 'atrial', 'lariat', 'latria', 'talari'], 'atrepsy': ['atrepsy', 'yapster'], 'atresia': ['asarite', 'asteria', 'atresia', 'setaria'], 'atresic': ['atresic', 'stearic'], 'atresy': ['atresy', 'estray', 'reasty', 'stayer'], 'atretic': ['atretic', 'citrate'], 'atria': ['arati', 'atria', 'riata', 'tarai', 'tiara'], 'atrial': ['altair', 'atrail', 'atrial', 'lariat', 'latria', 'talari'], 'atridean': ['anteriad', 'atridean', 'dentaria'], 'atrip': ['atrip', 'tapir'], 'atrocity': ['atrocity', 'citatory'], 'atrophied': ['aphrodite', 'atrophied', 'diaporthe'], 'atropia': ['apiator', 'atropia', 'parotia'], 'atropic': ['apricot', 'atropic', 'parotic', 'patrico'], 'atroscine': ['atroscine', 'certosina', 'ostracine', 'tinoceras', 'tricosane'], 'atry': ['arty', 'atry', 'tray'], 'attacco': ['attacco', 'toccata'], 'attach': ['attach', 'chatta'], 'attache': ['attache', 'thecata'], 'attacher': ['attacher', 'reattach'], 'attacker': ['attacker', 'reattack'], 'attain': ['attain', 'tatian'], 'attainder': ['antitrade', 'attainder'], 'attainer': ['attainer', 'reattain', 'tertiana'], 'attar': ['attar', 'tatar'], 'attempter': ['attempter', 'reattempt'], 'attender': ['attender', 'nattered', 'reattend'], 'attention': ['attention', 'tentation'], 'attentive': ['attentive', 'tentative'], 'attentively': ['attentively', 'tentatively'], 'attentiveness': ['attentiveness', 'tentativeness'], 'atter': ['atter', 'tater', 'teart', 'tetra', 'treat'], 'attermine': ['antimeter', 'attermine', 'interteam', 'terminate', 'tetramine'], 'attern': ['attern', 'natter', 'ratten', 'tarten'], 'attery': ['attery', 'treaty', 'yatter'], 'attester': ['attester', 'reattest'], 'attic': ['attic', 'catti', 'tacit'], 'attical': ['attical', 'cattail'], 'attinge': ['attinge', 'tintage'], 'attire': ['attire', 'ratite', 'tertia'], 'attired': ['attired', 'tradite'], 'attorn': ['attorn', 'ratton', 'rottan'], 'attracter': ['attracter', 'reattract'], 'attractor': ['attractor', 'tractator'], 'attrite': ['attrite', 'titrate'], 'attrition': ['attrition', 'titration'], 'attune': ['attune', 'nutate', 'tauten'], 'atule': ['aleut', 'atule'], 'atumble': ['atumble', 'mutable'], 'atwin': ['atwin', 'twain', 'witan'], 'atypic': ['atypic', 'typica'], 'aube': ['aube', 'beau'], 'aubrite': ['abiuret', 'aubrite', 'biurate', 'rubiate'], 'aucan': ['acuan', 'aucan'], 'aucaner': ['arecuna', 'aucaner'], 'auchlet': ['auchlet', 'cutheal', 'taluche'], 'auction': ['auction', 'caution'], 'auctionary': ['auctionary', 'cautionary'], 'audiencier': ['audiencier', 'enicuridae'], 'auge': ['ague', 'auge'], 'augen': ['augen', 'genua'], 'augend': ['augend', 'engaud', 'unaged'], 'auger': ['argue', 'auger'], 'augerer': ['augerer', 'reargue'], 'augh': ['augh', 'guha'], 'augmenter': ['argenteum', 'augmenter'], 'augustan': ['augustan', 'guatusan'], 'auh': ['ahu', 'auh', 'hau'], 'auk': ['aku', 'auk', 'kua'], 'auld': ['auld', 'dual', 'laud', 'udal'], 'aulete': ['aulete', 'eluate'], 'auletic': ['aleutic', 'auletic', 'caulite', 'lutecia'], 'auletris': ['auletris', 'lisuarte'], 'aulic': ['aulic', 'lucia'], 'aulostoma': ['aulostoma', 'autosomal'], 'aulu': ['aulu', 'ulua'], 'aum': ['aum', 'mau'], 'aumbry': ['ambury', 'aumbry'], 'aumil': ['aumil', 'miaul'], 'aumrie': ['aumrie', 'uremia'], 'auncel': ['auncel', 'cuneal', 'lacune', 'launce', 'unlace'], 'aunt': ['antu', 'aunt', 'naut', 'taun', 'tuan', 'tuna'], 'auntie': ['auntie', 'uniate'], 'auntish': ['auntish', 'inhaust'], 'auntly': ['auntly', 'lutany'], 'auntsary': ['auntsary', 'unastray'], 'aura': ['aaru', 'aura'], 'aural': ['aural', 'laura'], 'aurar': ['arrau', 'aurar'], 'auresca': ['auresca', 'caesura'], 'aureus': ['aureus', 'uraeus'], 'auricle': ['auricle', 'ciruela'], 'auricled': ['auricled', 'radicule'], 'auride': ['auride', 'rideau'], 'aurin': ['aurin', 'urian'], 'aurir': ['aurir', 'urari'], 'auriscalp': ['auriscalp', 'spiracula'], 'auscult': ['auscult', 'scutula'], 'aushar': ['arusha', 'aushar'], 'auster': ['auster', 'reatus'], 'austere': ['austere', 'euaster'], 'australian': ['australian', 'saturnalia'], 'australic': ['australic', 'lactarius'], 'australite': ['aristulate', 'australite'], 'austrian': ['asturian', 'austrian', 'saturnia'], 'aute': ['aute', 'etua'], 'autecism': ['autecism', 'musicate'], 'authotype': ['authotype', 'autophyte'], 'autoclave': ['autoclave', 'vacuolate'], 'autocrat': ['actuator', 'autocrat'], 'autoheterosis': ['autoheterosis', 'heteroousiast'], 'autometric': ['autometric', 'tautomeric'], 'autometry': ['autometry', 'tautomery'], 'autophyte': ['authotype', 'autophyte'], 'autoplast': ['autoplast', 'postulata'], 'autopsic': ['autopsic', 'captious'], 'autopsical': ['apolaustic', 'autopsical'], 'autoradiograph': ['autoradiograph', 'radioautograph'], 'autoradiographic': ['autoradiographic', 'radioautographic'], 'autoradiography': ['autoradiography', 'radioautography'], 'autoriser': ['arterious', 'autoriser'], 'autosomal': ['aulostoma', 'autosomal'], 'auxetic': ['auxetic', 'eutaxic'], 'aval': ['aval', 'lava'], 'avanti': ['avanti', 'vinata'], 'avar': ['avar', 'vara'], 'ave': ['ave', 'eva'], 'avenge': ['avenge', 'geneva', 'vangee'], 'avenger': ['avenger', 'engrave'], 'avenin': ['avenin', 'vienna'], 'aventine': ['aventine', 'venetian'], 'aventurine': ['aventurine', 'uninervate'], 'aver': ['aver', 'rave', 'vare', 'vera'], 'avera': ['avera', 'erava'], 'averil': ['averil', 'elvira'], 'averin': ['averin', 'ravine'], 'avert': ['avert', 'tarve', 'taver', 'trave'], 'avertible': ['avertible', 'veritable'], 'avertin': ['avertin', 'vitrean'], 'aves': ['aves', 'save', 'vase'], 'aviatic': ['aviatic', 'viatica'], 'aviator': ['aviator', 'tovaria'], 'avicular': ['avicular', 'varicula'], 'avid': ['avid', 'diva'], 'avidous': ['avidous', 'vaudois'], 'avignonese': ['avignonese', 'ingaevones'], 'avine': ['avine', 'naive', 'vinea'], 'avirulence': ['acervuline', 'avirulence'], 'avis': ['avis', 'siva', 'visa'], 'avitic': ['avitic', 'viatic'], 'avo': ['avo', 'ova'], 'avocet': ['avocet', 'octave', 'vocate'], 'avodire': ['avodire', 'avoider', 'reavoid'], 'avoider': ['avodire', 'avoider', 'reavoid'], 'avolation': ['avolation', 'ovational'], 'avolitional': ['avolitional', 'violational'], 'avoucher': ['avoucher', 'reavouch'], 'avower': ['avower', 'reavow'], 'avshar': ['avshar', 'varsha'], 'avulse': ['alveus', 'avulse'], 'aw': ['aw', 'wa'], 'awag': ['awag', 'waag'], 'awaiter': ['awaiter', 'reawait'], 'awakener': ['awakener', 'reawaken'], 'awarder': ['awarder', 'reaward'], 'awash': ['awash', 'sawah'], 'awaste': ['asweat', 'awaste'], 'awat': ['awat', 'tawa'], 'awd': ['awd', 'daw', 'wad'], 'awe': ['awe', 'wae', 'wea'], 'aweather': ['aweather', 'wheatear'], 'aweek': ['aweek', 'keawe'], 'awesome': ['awesome', 'waesome'], 'awest': ['awest', 'sweat', 'tawse', 'waste'], 'awfu': ['awfu', 'wauf'], 'awful': ['awful', 'fulwa'], 'awhet': ['awhet', 'wheat'], 'awin': ['awin', 'wain'], 'awing': ['awing', 'wigan'], 'awl': ['awl', 'law'], 'awn': ['awn', 'naw', 'wan'], 'awned': ['awned', 'dewan', 'waned'], 'awner': ['awner', 'newar'], 'awning': ['awning', 'waning'], 'awny': ['awny', 'wany', 'yawn'], 'awol': ['alow', 'awol', 'lowa'], 'awork': ['awork', 'korwa'], 'awreck': ['awreck', 'wacker'], 'awrong': ['awrong', 'growan'], 'awry': ['awry', 'wary'], 'axel': ['alex', 'axel', 'axle'], 'axes': ['axes', 'saxe', 'seax'], 'axil': ['alix', 'axil'], 'axile': ['axile', 'lexia'], 'axine': ['axine', 'xenia'], 'axle': ['alex', 'axel', 'axle'], 'axon': ['axon', 'noxa', 'oxan'], 'axonal': ['axonal', 'oxalan'], 'axonia': ['anoxia', 'axonia'], 'ay': ['ay', 'ya'], 'ayah': ['ayah', 'haya'], 'aye': ['aye', 'yea'], 'ayont': ['atony', 'ayont'], 'azimine': ['aminize', 'animize', 'azimine'], 'azo': ['azo', 'zoa'], 'azole': ['azole', 'zoeal'], 'azon': ['azon', 'onza', 'ozan'], 'azorian': ['arizona', 'azorian', 'zonaria'], 'azorite': ['azorite', 'zoarite'], 'azoxine': ['azoxine', 'oxazine'], 'azteca': ['azteca', 'zacate'], 'azurine': ['azurine', 'urazine'], 'ba': ['ab', 'ba'], 'baa': ['aba', 'baa'], 'baal': ['alba', 'baal', 'bala'], 'baalath': ['baalath', 'bathala'], 'baalite': ['baalite', 'bialate', 'labiate'], 'baalshem': ['baalshem', 'shamable'], 'baar': ['arab', 'arba', 'baar', 'bara'], 'bab': ['abb', 'bab'], 'baba': ['abba', 'baba'], 'babbler': ['babbler', 'blabber', 'brabble'], 'babery': ['babery', 'yabber'], 'babhan': ['babhan', 'habnab'], 'babishly': ['babishly', 'shabbily'], 'babishness': ['babishness', 'shabbiness'], 'babite': ['babite', 'bebait'], 'babu': ['babu', 'buba'], 'babul': ['babul', 'bubal'], 'baby': ['abby', 'baby'], 'babylonish': ['babylonish', 'nabobishly'], 'bac': ['bac', 'cab'], 'bacao': ['bacao', 'caoba'], 'bach': ['bach', 'chab'], 'bache': ['bache', 'beach'], 'bachel': ['bachel', 'bleach'], 'bachelor': ['bachelor', 'crabhole'], 'bacillar': ['bacillar', 'cabrilla'], 'bacis': ['bacis', 'basic'], 'backblow': ['backblow', 'blowback'], 'backen': ['backen', 'neback'], 'backer': ['backer', 'reback'], 'backfall': ['backfall', 'fallback'], 'backfire': ['backfire', 'fireback'], 'backlog': ['backlog', 'gablock'], 'backrun': ['backrun', 'runback'], 'backsaw': ['backsaw', 'sawback'], 'backset': ['backset', 'setback'], 'backstop': ['backstop', 'stopback'], 'backswing': ['backswing', 'swingback'], 'backward': ['backward', 'drawback'], 'backway': ['backway', 'wayback'], 'bacon': ['bacon', 'banco'], 'bacterial': ['bacterial', 'calibrate'], 'bacteriform': ['bacteriform', 'bracteiform'], 'bacterin': ['bacterin', 'centibar'], 'bacterioid': ['aborticide', 'bacterioid'], 'bacterium': ['bacterium', 'cumbraite'], 'bactrian': ['bactrian', 'cantabri'], 'bacula': ['albuca', 'bacula'], 'baculi': ['abulic', 'baculi'], 'baculite': ['baculite', 'cubitale'], 'baculites': ['baculites', 'bisulcate'], 'baculoid': ['baculoid', 'cuboidal'], 'bad': ['bad', 'dab'], 'badaga': ['badaga', 'dagaba', 'gadaba'], 'badan': ['badan', 'banda'], 'bade': ['abed', 'bade', 'bead'], 'badge': ['badge', 'begad'], 'badian': ['badian', 'indaba'], 'badigeon': ['badigeon', 'gabioned'], 'badly': ['badly', 'baldy', 'blady'], 'badon': ['badon', 'bando'], 'bae': ['abe', 'bae', 'bea'], 'baeria': ['aberia', 'baeria', 'baiera'], 'baetulus': ['baetulus', 'subulate'], 'baetyl': ['baetyl', 'baylet', 'bleaty'], 'baetylic': ['baetylic', 'biacetyl'], 'bafta': ['abaft', 'bafta'], 'bag': ['bag', 'gab'], 'bagani': ['bagani', 'bangia', 'ibanag'], 'bagel': ['bagel', 'belga', 'gable', 'gleba'], 'bagger': ['bagger', 'beggar'], 'bagnio': ['bagnio', 'gabion', 'gobian'], 'bago': ['bago', 'boga'], 'bagre': ['bagre', 'barge', 'begar', 'rebag'], 'bahar': ['bahar', 'bhara'], 'bahoe': ['bahoe', 'bohea', 'obeah'], 'baht': ['baht', 'bath', 'bhat'], 'baiera': ['aberia', 'baeria', 'baiera'], 'baignet': ['baignet', 'beating'], 'bail': ['albi', 'bail', 'bali'], 'bailage': ['algieba', 'bailage'], 'bailer': ['bailer', 'barile'], 'baillone': ['baillone', 'bonellia'], 'bailment': ['bailment', 'libament'], 'bailor': ['bailor', 'bioral'], 'bailsman': ['bailsman', 'balanism', 'nabalism'], 'bain': ['bain', 'bani', 'iban'], 'baioc': ['baioc', 'cabio', 'cobia'], 'bairam': ['bairam', 'bramia'], 'bairn': ['abrin', 'bairn', 'brain', 'brian', 'rabin'], 'bairnie': ['aribine', 'bairnie', 'iberian'], 'bairnish': ['bairnish', 'bisharin'], 'bais': ['absi', 'bais', 'bias', 'isba'], 'baister': ['baister', 'tribase'], 'baiter': ['baiter', 'barite', 'rebait', 'terbia'], 'baith': ['baith', 'habit'], 'bajocian': ['bajocian', 'jacobian'], 'bakal': ['bakal', 'balak'], 'bakatan': ['bakatan', 'batakan'], 'bake': ['bake', 'beak'], 'baker': ['baker', 'brake', 'break'], 'bakerless': ['bakerless', 'brakeless', 'breakless'], 'bakery': ['bakery', 'barkey'], 'bakie': ['akebi', 'bakie'], 'baku': ['baku', 'kuba'], 'bal': ['alb', 'bal', 'lab'], 'bala': ['alba', 'baal', 'bala'], 'baladine': ['baladine', 'balaenid'], 'balaenid': ['baladine', 'balaenid'], 'balagan': ['balagan', 'bangala'], 'balai': ['balai', 'labia'], 'balak': ['bakal', 'balak'], 'balan': ['alban', 'balan', 'banal', 'laban', 'nabal', 'nabla'], 'balancer': ['balancer', 'barnacle'], 'balangay': ['balangay', 'bangalay'], 'balanic': ['balanic', 'caliban'], 'balanid': ['balanid', 'banilad'], 'balanism': ['bailsman', 'balanism', 'nabalism'], 'balanite': ['albanite', 'balanite', 'nabalite'], 'balanites': ['balanites', 'basaltine', 'stainable'], 'balantidium': ['antialbumid', 'balantidium'], 'balanus': ['balanus', 'nabalus', 'subanal'], 'balas': ['balas', 'balsa', 'basal', 'sabal'], 'balata': ['albata', 'atabal', 'balata'], 'balatron': ['balatron', 'laborant'], 'balaustine': ['balaustine', 'unsatiable'], 'balaustre': ['balaustre', 'saturable'], 'bald': ['bald', 'blad'], 'balden': ['balden', 'bandle'], 'balder': ['balder', 'bardel', 'bedlar', 'bedral', 'belard', 'blader'], 'baldie': ['abdiel', 'baldie'], 'baldish': ['baldish', 'bladish'], 'baldmoney': ['baldmoney', 'molybdena'], 'baldness': ['baldness', 'bandless'], 'baldy': ['badly', 'baldy', 'blady'], 'bale': ['abel', 'able', 'albe', 'bale', 'beal', 'bela', 'blae'], 'balearic': ['balearic', 'cebalrai'], 'baleen': ['baleen', 'enable'], 'balefire': ['afebrile', 'balefire', 'fireable'], 'baleise': ['baleise', 'besaiel'], 'baler': ['abler', 'baler', 'belar', 'blare', 'blear'], 'balete': ['balete', 'belate'], 'bali': ['albi', 'bail', 'bali'], 'baline': ['baline', 'blaine'], 'balinger': ['balinger', 'ringable'], 'balker': ['balker', 'barkle'], 'ballaster': ['ballaster', 'reballast'], 'ballate': ['ballate', 'tabella'], 'balli': ['balli', 'billa'], 'balloter': ['balloter', 'reballot'], 'ballplayer': ['ballplayer', 'preallably'], 'ballroom': ['ballroom', 'moorball'], 'ballweed': ['ballweed', 'weldable'], 'balm': ['balm', 'lamb'], 'balminess': ['balminess', 'lambiness'], 'balmlike': ['balmlike', 'lamblike'], 'balmy': ['balmy', 'lamby'], 'balolo': ['balolo', 'lobola'], 'balonea': ['abalone', 'balonea'], 'balor': ['balor', 'bolar', 'boral', 'labor', 'lobar'], 'balow': ['ablow', 'balow', 'bowla'], 'balsa': ['balas', 'balsa', 'basal', 'sabal'], 'balsam': ['balsam', 'sambal'], 'balsamic': ['balsamic', 'cabalism'], 'balsamo': ['absalom', 'balsamo'], 'balsamy': ['abysmal', 'balsamy'], 'balt': ['balt', 'blat'], 'baltei': ['albeit', 'albite', 'baltei', 'belait', 'betail', 'bletia', 'libate'], 'balter': ['albert', 'balter', 'labret', 'tabler'], 'balteus': ['balteus', 'sublate'], 'baltis': ['baltis', 'bisalt'], 'balu': ['balu', 'baul', 'bual', 'luba'], 'balunda': ['balunda', 'bulanda'], 'baluster': ['baluster', 'rustable'], 'balut': ['balut', 'tubal'], 'bam': ['bam', 'mab'], 'ban': ['ban', 'nab'], 'bana': ['anba', 'bana'], 'banak': ['banak', 'nabak'], 'banal': ['alban', 'balan', 'banal', 'laban', 'nabal', 'nabla'], 'banat': ['banat', 'batan'], 'banca': ['banca', 'caban'], 'bancal': ['bancal', 'blanca'], 'banco': ['bacon', 'banco'], 'banda': ['badan', 'banda'], 'bandage': ['bandage', 'dagbane'], 'bandar': ['bandar', 'raband'], 'bandarlog': ['bandarlog', 'langobard'], 'bande': ['bande', 'benda'], 'bander': ['bander', 'brenda'], 'banderma': ['banderma', 'breadman'], 'banderole': ['banderole', 'bandoleer'], 'bandhook': ['bandhook', 'handbook'], 'bandle': ['balden', 'bandle'], 'bandless': ['baldness', 'bandless'], 'bando': ['badon', 'bando'], 'bandoleer': ['banderole', 'bandoleer'], 'bandor': ['bandor', 'bondar', 'roband'], 'bandore': ['bandore', 'broaden'], 'bane': ['bane', 'bean', 'bena'], 'bangala': ['balagan', 'bangala'], 'bangalay': ['balangay', 'bangalay'], 'bangash': ['bangash', 'nashgab'], 'banger': ['banger', 'engarb', 'graben'], 'banghy': ['banghy', 'hangby'], 'bangia': ['bagani', 'bangia', 'ibanag'], 'bangle': ['bangle', 'bengal'], 'bani': ['bain', 'bani', 'iban'], 'banilad': ['balanid', 'banilad'], 'banisher': ['banisher', 'rebanish'], 'baniva': ['baniva', 'bavian'], 'baniya': ['baniya', 'banyai'], 'banjoist': ['banjoist', 'bostanji'], 'bank': ['bank', 'knab', 'nabk'], 'banker': ['banker', 'barken'], 'banshee': ['banshee', 'benshea'], 'bantam': ['bantam', 'batman'], 'banteng': ['banteng', 'bentang'], 'banyai': ['baniya', 'banyai'], 'banzai': ['banzai', 'zabian'], 'bar': ['bar', 'bra', 'rab'], 'bara': ['arab', 'arba', 'baar', 'bara'], 'barabra': ['barabra', 'barbara'], 'barad': ['barad', 'draba'], 'barb': ['barb', 'brab'], 'barbara': ['barabra', 'barbara'], 'barbe': ['barbe', 'bebar', 'breba', 'rebab'], 'barbed': ['barbed', 'dabber'], 'barbel': ['barbel', 'labber', 'rabble'], 'barbet': ['barbet', 'rabbet', 'tabber'], 'barbette': ['barbette', 'bebatter'], 'barbion': ['barbion', 'rabboni'], 'barbitone': ['barbitone', 'barbotine'], 'barbone': ['barbone', 'bebaron'], 'barbotine': ['barbitone', 'barbotine'], 'barcella': ['barcella', 'caballer'], 'barcoo': ['barcoo', 'baroco'], 'bard': ['bard', 'brad', 'drab'], 'bardel': ['balder', 'bardel', 'bedlar', 'bedral', 'belard', 'blader'], 'bardie': ['abider', 'bardie'], 'bardily': ['bardily', 'rabidly', 'ridably'], 'bardiness': ['bardiness', 'rabidness'], 'barding': ['barding', 'brigand'], 'bardo': ['abord', 'bardo', 'board', 'broad', 'dobra', 'dorab'], 'bardy': ['bardy', 'darby'], 'bare': ['bare', 'bear', 'brae'], 'barefaced': ['barefaced', 'facebread'], 'barefoot': ['barefoot', 'bearfoot'], 'barehanded': ['barehanded', 'bradenhead', 'headbander'], 'barehead': ['barehead', 'braehead'], 'barely': ['barely', 'barley', 'bleary'], 'barer': ['barer', 'rebar'], 'baretta': ['baretta', 'rabatte', 'tabaret'], 'bargainer': ['bargainer', 'rebargain'], 'barge': ['bagre', 'barge', 'begar', 'rebag'], 'bargeer': ['bargeer', 'gerbera'], 'bargeese': ['bargeese', 'begrease'], 'bari': ['abir', 'bari', 'rabi'], 'baric': ['baric', 'carib', 'rabic'], 'barid': ['barid', 'bidar', 'braid', 'rabid'], 'barie': ['barie', 'beira', 'erbia', 'rebia'], 'barile': ['bailer', 'barile'], 'baris': ['baris', 'sabir'], 'barish': ['barish', 'shibar'], 'barit': ['barit', 'ribat'], 'barite': ['baiter', 'barite', 'rebait', 'terbia'], 'baritone': ['abrotine', 'baritone', 'obtainer', 'reobtain'], 'barken': ['banker', 'barken'], 'barker': ['barker', 'braker'], 'barkey': ['bakery', 'barkey'], 'barkle': ['balker', 'barkle'], 'barky': ['barky', 'braky'], 'barley': ['barely', 'barley', 'bleary'], 'barling': ['barling', 'bringal'], 'barm': ['barm', 'bram'], 'barmbrack': ['barmbrack', 'brambrack'], 'barmote': ['barmote', 'bromate'], 'barmy': ['ambry', 'barmy'], 'barn': ['barn', 'bran'], 'barnabite': ['barnabite', 'rabbanite', 'rabbinate'], 'barnacle': ['balancer', 'barnacle'], 'barney': ['barney', 'nearby'], 'barny': ['barny', 'bryan'], 'baroco': ['barcoo', 'baroco'], 'barolo': ['barolo', 'robalo'], 'baron': ['baron', 'boran'], 'baronet': ['baronet', 'reboant'], 'barong': ['barong', 'brogan'], 'barosmin': ['ambrosin', 'barosmin', 'sabromin'], 'barothermograph': ['barothermograph', 'thermobarograph'], 'barotse': ['barotse', 'boaster', 'reboast', 'sorbate'], 'barpost': ['absorpt', 'barpost'], 'barracan': ['barracan', 'barranca'], 'barranca': ['barracan', 'barranca'], 'barrelet': ['barrelet', 'terebral'], 'barret': ['barret', 'barter'], 'barrette': ['barrette', 'batterer'], 'barrio': ['barrio', 'brairo'], 'barsac': ['barsac', 'scarab'], 'barse': ['barse', 'besra', 'saber', 'serab'], 'bart': ['bart', 'brat'], 'barter': ['barret', 'barter'], 'barton': ['barton', 'brotan'], 'bartsia': ['arabist', 'bartsia'], 'barundi': ['barundi', 'unbraid'], 'barvel': ['barvel', 'blaver', 'verbal'], 'barwise': ['barwise', 'swarbie'], 'barye': ['barye', 'beray', 'yerba'], 'baryta': ['baryta', 'taryba'], 'barytine': ['barytine', 'bryanite'], 'baryton': ['baryton', 'brotany'], 'bas': ['bas', 'sab'], 'basal': ['balas', 'balsa', 'basal', 'sabal'], 'basally': ['basally', 'salably'], 'basaltic': ['basaltic', 'cabalist'], 'basaltine': ['balanites', 'basaltine', 'stainable'], 'base': ['base', 'besa', 'sabe', 'seba'], 'basella': ['basella', 'sabella', 'salable'], 'bash': ['bash', 'shab'], 'basial': ['basial', 'blasia'], 'basic': ['bacis', 'basic'], 'basically': ['asyllabic', 'basically'], 'basidium': ['basidium', 'diiambus'], 'basil': ['basil', 'labis'], 'basileus': ['basileus', 'issuable', 'suasible'], 'basilweed': ['basilweed', 'bladewise'], 'basinasal': ['basinasal', 'bassalian'], 'basinet': ['basinet', 'besaint', 'bestain'], 'basion': ['basion', 'bonsai', 'sabino'], 'basiparachromatin': ['basiparachromatin', 'marsipobranchiata'], 'basket': ['basket', 'betask'], 'basketwork': ['basketwork', 'workbasket'], 'basos': ['basos', 'basso'], 'bassalian': ['basinasal', 'bassalian'], 'bassanite': ['bassanite', 'sebastian'], 'basset': ['asbest', 'basset'], 'basso': ['basos', 'basso'], 'bast': ['bast', 'bats', 'stab'], 'basta': ['basta', 'staab'], 'baste': ['baste', 'beast', 'tabes'], 'basten': ['absent', 'basten'], 'baster': ['baster', 'bestar', 'breast'], 'bastille': ['bastille', 'listable'], 'bastion': ['abiston', 'bastion'], 'bastionet': ['bastionet', 'obstinate'], 'bastite': ['bastite', 'batiste', 'bistate'], 'basto': ['basto', 'boast', 'sabot'], 'basuto': ['abouts', 'basuto'], 'bat': ['bat', 'tab'], 'batad': ['abdat', 'batad'], 'batakan': ['bakatan', 'batakan'], 'bataleur': ['bataleur', 'tabulare'], 'batan': ['banat', 'batan'], 'batara': ['artaba', 'batara'], 'batcher': ['batcher', 'berchta', 'brachet'], 'bate': ['abet', 'bate', 'beat', 'beta'], 'batea': ['abate', 'ateba', 'batea', 'beata'], 'batel': ['batel', 'blate', 'bleat', 'table'], 'batement': ['abetment', 'batement'], 'bater': ['abret', 'bater', 'berat'], 'batfowler': ['afterblow', 'batfowler'], 'bath': ['baht', 'bath', 'bhat'], 'bathala': ['baalath', 'bathala'], 'bathe': ['bathe', 'beath'], 'bather': ['bather', 'bertha', 'breath'], 'bathonian': ['bathonian', 'nabothian'], 'batik': ['batik', 'kitab'], 'batino': ['batino', 'oatbin', 'obtain'], 'batis': ['absit', 'batis'], 'batiste': ['bastite', 'batiste', 'bistate'], 'batling': ['batling', 'tabling'], 'batman': ['bantam', 'batman'], 'batophobia': ['batophobia', 'tabophobia'], 'batrachia': ['batrachia', 'brachiata'], 'batrachian': ['batrachian', 'branchiata'], 'bats': ['bast', 'bats', 'stab'], 'battel': ['battel', 'battle', 'tablet'], 'batteler': ['batteler', 'berattle'], 'battening': ['battening', 'bitangent'], 'batter': ['batter', 'bertat', 'tabret', 'tarbet'], 'batterer': ['barrette', 'batterer'], 'battle': ['battel', 'battle', 'tablet'], 'battler': ['battler', 'blatter', 'brattle'], 'battue': ['battue', 'tubate'], 'batule': ['batule', 'betula', 'tabule'], 'batyphone': ['batyphone', 'hypnobate'], 'batzen': ['batzen', 'bezant', 'tanzeb'], 'baud': ['baud', 'buda', 'daub'], 'baul': ['balu', 'baul', 'bual', 'luba'], 'baun': ['baun', 'buna', 'nabu', 'nuba'], 'bauta': ['abuta', 'bauta'], 'bavian': ['baniva', 'bavian'], 'baw': ['baw', 'wab'], 'bawl': ['bawl', 'blaw'], 'bawler': ['bawler', 'brelaw', 'rebawl', 'warble'], 'bay': ['aby', 'bay'], 'baya': ['baya', 'yaba'], 'bayed': ['bayed', 'beady', 'beday'], 'baylet': ['baetyl', 'baylet', 'bleaty'], 'bayonet': ['bayonet', 'betoyan'], 'baze': ['baze', 'ezba'], 'bea': ['abe', 'bae', 'bea'], 'beach': ['bache', 'beach'], 'bead': ['abed', 'bade', 'bead'], 'beaded': ['beaded', 'bedead'], 'beader': ['beader', 'bedare'], 'beadleism': ['beadleism', 'demisable'], 'beadlet': ['beadlet', 'belated'], 'beady': ['bayed', 'beady', 'beday'], 'beagle': ['beagle', 'belage', 'belgae'], 'beak': ['bake', 'beak'], 'beaker': ['beaker', 'berake', 'rebake'], 'beal': ['abel', 'able', 'albe', 'bale', 'beal', 'bela', 'blae'], 'bealing': ['algenib', 'bealing', 'belgian', 'bengali'], 'beam': ['beam', 'bema'], 'beamer': ['ambeer', 'beamer'], 'beamless': ['assemble', 'beamless'], 'beamster': ['beamster', 'bemaster', 'bestream'], 'beamwork': ['beamwork', 'bowmaker'], 'beamy': ['beamy', 'embay', 'maybe'], 'bean': ['bane', 'bean', 'bena'], 'beanfield': ['beanfield', 'definable'], 'beant': ['abnet', 'beant'], 'bear': ['bare', 'bear', 'brae'], 'bearance': ['bearance', 'carabeen'], 'beard': ['ardeb', 'beard', 'bread', 'debar'], 'beardless': ['beardless', 'breadless'], 'beardlessness': ['beardlessness', 'breadlessness'], 'bearer': ['bearer', 'rebear'], 'bearess': ['bearess', 'bessera'], 'bearfoot': ['barefoot', 'bearfoot'], 'bearing': ['bearing', 'begrain', 'brainge', 'rigbane'], 'bearlet': ['bearlet', 'bleater', 'elberta', 'retable'], 'bearm': ['amber', 'bearm', 'bemar', 'bream', 'embar'], 'beast': ['baste', 'beast', 'tabes'], 'beastlily': ['beastlily', 'bestially'], 'beat': ['abet', 'bate', 'beat', 'beta'], 'beata': ['abate', 'ateba', 'batea', 'beata'], 'beater': ['beater', 'berate', 'betear', 'rebate', 'rebeat'], 'beath': ['bathe', 'beath'], 'beating': ['baignet', 'beating'], 'beau': ['aube', 'beau'], 'bebait': ['babite', 'bebait'], 'bebar': ['barbe', 'bebar', 'breba', 'rebab'], 'bebaron': ['barbone', 'bebaron'], 'bebaste': ['bebaste', 'bebeast'], 'bebatter': ['barbette', 'bebatter'], 'bebay': ['abbey', 'bebay'], 'bebeast': ['bebaste', 'bebeast'], 'bebog': ['bebog', 'begob', 'gobbe'], 'becard': ['becard', 'braced'], 'becater': ['becater', 'betrace'], 'because': ['because', 'besauce'], 'becharm': ['becharm', 'brecham', 'chamber'], 'becher': ['becher', 'breech'], 'bechern': ['bechern', 'bencher'], 'bechirp': ['bechirp', 'brephic'], 'becker': ['becker', 'rebeck'], 'beclad': ['beclad', 'cabled'], 'beclart': ['beclart', 'crablet'], 'becloud': ['becloud', 'obclude'], 'becram': ['becram', 'camber', 'crambe'], 'becrimson': ['becrimson', 'scombrine'], 'becry': ['becry', 'bryce'], 'bed': ['bed', 'deb'], 'bedamn': ['bedamn', 'bedman'], 'bedare': ['beader', 'bedare'], 'bedark': ['bedark', 'debark'], 'beday': ['bayed', 'beady', 'beday'], 'bedead': ['beaded', 'bedead'], 'bedel': ['bedel', 'bleed'], 'beden': ['beden', 'deben', 'deneb'], 'bedim': ['bedim', 'imbed'], 'bedip': ['bedip', 'biped'], 'bedismal': ['bedismal', 'semibald'], 'bedlam': ['bedlam', 'beldam', 'blamed'], 'bedlar': ['balder', 'bardel', 'bedlar', 'bedral', 'belard', 'blader'], 'bedless': ['bedless', 'blessed'], 'bedman': ['bedamn', 'bedman'], 'bedoctor': ['bedoctor', 'codebtor'], 'bedog': ['bedog', 'bodge'], 'bedrail': ['bedrail', 'bridale', 'ridable'], 'bedral': ['balder', 'bardel', 'bedlar', 'bedral', 'belard', 'blader'], 'bedrid': ['bedrid', 'bidder'], 'bedrip': ['bedrip', 'prebid'], 'bedrock': ['bedrock', 'brocked'], 'bedroom': ['bedroom', 'boerdom', 'boredom'], 'bedrown': ['bedrown', 'browden'], 'bedrug': ['bedrug', 'budger'], 'bedsick': ['bedsick', 'sickbed'], 'beduck': ['beduck', 'bucked'], 'bedur': ['bedur', 'rebud', 'redub'], 'bedusk': ['bedusk', 'busked'], 'bedust': ['bedust', 'bestud', 'busted'], 'beearn': ['beearn', 'berean'], 'beeman': ['beeman', 'bemean', 'bename'], 'been': ['been', 'bene', 'eben'], 'beer': ['beer', 'bere', 'bree'], 'beest': ['beest', 'beset'], 'beeswing': ['beeswing', 'beswinge'], 'befathered': ['befathered', 'featherbed'], 'befile': ['befile', 'belief'], 'befinger': ['befinger', 'befringe'], 'beflea': ['beflea', 'beleaf'], 'beflour': ['beflour', 'fourble'], 'beflum': ['beflum', 'fumble'], 'befret': ['befret', 'bereft'], 'befringe': ['befinger', 'befringe'], 'begad': ['badge', 'begad'], 'begall': ['begall', 'glebal'], 'begar': ['bagre', 'barge', 'begar', 'rebag'], 'begash': ['begash', 'beshag'], 'begat': ['begat', 'betag'], 'begettal': ['begettal', 'gettable'], 'beggar': ['bagger', 'beggar'], 'beggarer': ['beggarer', 'rebeggar'], 'begin': ['begin', 'being', 'binge'], 'begird': ['begird', 'bridge'], 'beglic': ['beglic', 'belgic'], 'bego': ['bego', 'egbo'], 'begob': ['bebog', 'begob', 'gobbe'], 'begone': ['begone', 'engobe'], 'begrain': ['bearing', 'begrain', 'brainge', 'rigbane'], 'begrease': ['bargeese', 'begrease'], 'behaviorism': ['behaviorism', 'misbehavior'], 'behears': ['behears', 'beshear'], 'behint': ['behint', 'henbit'], 'beholder': ['beholder', 'rebehold'], 'behorn': ['behorn', 'brehon'], 'beid': ['beid', 'bide', 'debi', 'dieb'], 'being': ['begin', 'being', 'binge'], 'beira': ['barie', 'beira', 'erbia', 'rebia'], 'beisa': ['abies', 'beisa'], 'bel': ['bel', 'elb'], 'bela': ['abel', 'able', 'albe', 'bale', 'beal', 'bela', 'blae'], 'belabor': ['belabor', 'borable'], 'belaced': ['belaced', 'debacle'], 'belage': ['beagle', 'belage', 'belgae'], 'belait': ['albeit', 'albite', 'baltei', 'belait', 'betail', 'bletia', 'libate'], 'belam': ['amble', 'belam', 'blame', 'mabel'], 'belar': ['abler', 'baler', 'belar', 'blare', 'blear'], 'belard': ['balder', 'bardel', 'bedlar', 'bedral', 'belard', 'blader'], 'belate': ['balete', 'belate'], 'belated': ['beadlet', 'belated'], 'belaud': ['ablude', 'belaud'], 'beldam': ['bedlam', 'beldam', 'blamed'], 'beleaf': ['beflea', 'beleaf'], 'beleap': ['beleap', 'bepale'], 'belga': ['bagel', 'belga', 'gable', 'gleba'], 'belgae': ['beagle', 'belage', 'belgae'], 'belgian': ['algenib', 'bealing', 'belgian', 'bengali'], 'belgic': ['beglic', 'belgic'], 'belial': ['alible', 'belial', 'labile', 'liable'], 'belief': ['befile', 'belief'], 'belili': ['belili', 'billie'], 'belite': ['belite', 'beltie', 'bietle'], 'belitter': ['belitter', 'tribelet'], 'belive': ['belive', 'beveil'], 'bella': ['bella', 'label'], 'bellied': ['bellied', 'delible'], 'bellona': ['allbone', 'bellona'], 'bellonian': ['bellonian', 'nonliable'], 'bellote': ['bellote', 'lobelet'], 'bellower': ['bellower', 'rebellow'], 'belltail': ['belltail', 'bletilla', 'tillable'], 'bellyer': ['bellyer', 'rebelly'], 'bellypinch': ['bellypinch', 'pinchbelly'], 'beloid': ['beloid', 'boiled', 'bolide'], 'belonger': ['belonger', 'rebelong'], 'belonid': ['belonid', 'boldine'], 'belord': ['belord', 'bordel', 'rebold'], 'below': ['below', 'bowel', 'elbow'], 'belt': ['belt', 'blet'], 'beltane': ['beltane', 'tenable'], 'belter': ['belter', 'elbert', 'treble'], 'beltie': ['belite', 'beltie', 'bietle'], 'beltine': ['beltine', 'tenible'], 'beltir': ['beltir', 'riblet'], 'beltman': ['beltman', 'lambent'], 'belve': ['belve', 'bevel'], 'bema': ['beam', 'bema'], 'bemail': ['bemail', 'lambie'], 'beman': ['beman', 'nambe'], 'bemar': ['amber', 'bearm', 'bemar', 'bream', 'embar'], 'bemaster': ['beamster', 'bemaster', 'bestream'], 'bemaul': ['bemaul', 'blumea'], 'bemeal': ['bemeal', 'meable'], 'bemean': ['beeman', 'bemean', 'bename'], 'bemire': ['bemire', 'bireme'], 'bemitred': ['bemitred', 'timbered'], 'bemoil': ['bemoil', 'mobile'], 'bemole': ['bemole', 'embole'], 'bemusk': ['bemusk', 'embusk'], 'ben': ['ben', 'neb'], 'bena': ['bane', 'bean', 'bena'], 'benacus': ['acubens', 'benacus'], 'bename': ['beeman', 'bemean', 'bename'], 'benami': ['benami', 'bimane'], 'bencher': ['bechern', 'bencher'], 'benchwork': ['benchwork', 'workbench'], 'benda': ['bande', 'benda'], 'bender': ['bender', 'berend', 'rebend'], 'bene': ['been', 'bene', 'eben'], 'benedight': ['benedight', 'benighted'], 'benefiter': ['benefiter', 'rebenefit'], 'bengal': ['bangle', 'bengal'], 'bengali': ['algenib', 'bealing', 'belgian', 'bengali'], 'beni': ['beni', 'bien', 'bine', 'inbe'], 'benighted': ['benedight', 'benighted'], 'beno': ['beno', 'bone', 'ebon'], 'benote': ['benote', 'betone'], 'benshea': ['banshee', 'benshea'], 'benshee': ['benshee', 'shebeen'], 'bentang': ['banteng', 'bentang'], 'benton': ['benton', 'bonnet'], 'benu': ['benu', 'unbe'], 'benward': ['benward', 'brawned'], 'benzantialdoxime': ['antibenzaldoxime', 'benzantialdoxime'], 'benzein': ['benzein', 'benzine'], 'benzine': ['benzein', 'benzine'], 'benzo': ['benzo', 'bonze'], 'benzofluorene': ['benzofluorene', 'fluorobenzene'], 'benzonitrol': ['benzonitrol', 'nitrobenzol'], 'bepale': ['beleap', 'bepale'], 'bepart': ['bepart', 'berapt', 'betrap'], 'bepaste': ['bepaste', 'bespate'], 'bepester': ['bepester', 'prebeset'], 'beplaster': ['beplaster', 'prestable'], 'ber': ['ber', 'reb'], 'berake': ['beaker', 'berake', 'rebake'], 'berapt': ['bepart', 'berapt', 'betrap'], 'berat': ['abret', 'bater', 'berat'], 'berate': ['beater', 'berate', 'betear', 'rebate', 'rebeat'], 'berattle': ['batteler', 'berattle'], 'beraunite': ['beraunite', 'unebriate'], 'beray': ['barye', 'beray', 'yerba'], 'berberi': ['berberi', 'rebribe'], 'berchta': ['batcher', 'berchta', 'brachet'], 'bere': ['beer', 'bere', 'bree'], 'berean': ['beearn', 'berean'], 'bereft': ['befret', 'bereft'], 'berend': ['bender', 'berend', 'rebend'], 'berg': ['berg', 'gerb'], 'bergama': ['bergama', 'megabar'], 'bergamo': ['bergamo', 'embargo'], 'beri': ['beri', 'bier', 'brei', 'ribe'], 'beringed': ['beringed', 'breeding'], 'berinse': ['berinse', 'besiren'], 'berley': ['berley', 'bleery'], 'berlinite': ['berlinite', 'libertine'], 'bermudite': ['bermudite', 'demibrute'], 'bernard': ['bernard', 'brander', 'rebrand'], 'bernese': ['bernese', 'besneer'], 'beroe': ['beroe', 'boree'], 'beroida': ['beroida', 'boreiad'], 'beroll': ['beroll', 'boller'], 'berossos': ['berossos', 'obsessor'], 'beround': ['beround', 'bounder', 'rebound', 'unbored', 'unorbed', 'unrobed'], 'berri': ['berri', 'brier'], 'berried': ['berried', 'briered'], 'berrybush': ['berrybush', 'shrubbery'], 'bersil': ['bersil', 'birsle'], 'bert': ['bert', 'bret'], 'bertat': ['batter', 'bertat', 'tabret', 'tarbet'], 'berth': ['berth', 'breth'], 'bertha': ['bather', 'bertha', 'breath'], 'berther': ['berther', 'herbert'], 'berthing': ['berthing', 'brighten'], 'bertie': ['bertie', 'betire', 'rebite'], 'bertolonia': ['bertolonia', 'borolanite'], 'berust': ['berust', 'buster', 'stuber'], 'bervie': ['bervie', 'brieve'], 'beryllia': ['beryllia', 'reliably'], 'besa': ['base', 'besa', 'sabe', 'seba'], 'besaiel': ['baleise', 'besaiel'], 'besaint': ['basinet', 'besaint', 'bestain'], 'besauce': ['because', 'besauce'], 'bescour': ['bescour', 'buceros', 'obscure'], 'beset': ['beest', 'beset'], 'beshadow': ['beshadow', 'bodewash'], 'beshag': ['begash', 'beshag'], 'beshear': ['behears', 'beshear'], 'beshod': ['beshod', 'debosh'], 'besiren': ['berinse', 'besiren'], 'besit': ['besit', 'betis'], 'beslaver': ['beslaver', 'servable', 'versable'], 'beslime': ['beslime', 'besmile'], 'beslings': ['beslings', 'blessing', 'glibness'], 'beslow': ['beslow', 'bowels'], 'besmile': ['beslime', 'besmile'], 'besneer': ['bernese', 'besneer'], 'besoot': ['besoot', 'bootes'], 'besot': ['besot', 'betso'], 'besoul': ['besoul', 'blouse', 'obelus'], 'besour': ['besour', 'boreus', 'bourse', 'bouser'], 'bespate': ['bepaste', 'bespate'], 'besra': ['barse', 'besra', 'saber', 'serab'], 'bessera': ['bearess', 'bessera'], 'bestain': ['basinet', 'besaint', 'bestain'], 'bestar': ['baster', 'bestar', 'breast'], 'besteer': ['besteer', 'rebeset'], 'bestial': ['astilbe', 'bestial', 'blastie', 'stabile'], 'bestially': ['beastlily', 'bestially'], 'bestiarian': ['antirabies', 'bestiarian'], 'bestiary': ['bestiary', 'sybarite'], 'bestir': ['bestir', 'bister'], 'bestorm': ['bestorm', 'mobster'], 'bestowal': ['bestowal', 'stowable'], 'bestower': ['bestower', 'rebestow'], 'bestraw': ['bestraw', 'wabster'], 'bestream': ['beamster', 'bemaster', 'bestream'], 'bestrew': ['bestrew', 'webster'], 'bestride': ['bestride', 'bistered'], 'bestud': ['bedust', 'bestud', 'busted'], 'beswinge': ['beeswing', 'beswinge'], 'beta': ['abet', 'bate', 'beat', 'beta'], 'betag': ['begat', 'betag'], 'betail': ['albeit', 'albite', 'baltei', 'belait', 'betail', 'bletia', 'libate'], 'betailor': ['betailor', 'laborite', 'orbitale'], 'betask': ['basket', 'betask'], 'betear': ['beater', 'berate', 'betear', 'rebate', 'rebeat'], 'beth': ['beth', 'theb'], 'betire': ['bertie', 'betire', 'rebite'], 'betis': ['besit', 'betis'], 'betone': ['benote', 'betone'], 'betoss': ['betoss', 'bosset'], 'betoya': ['betoya', 'teaboy'], 'betoyan': ['bayonet', 'betoyan'], 'betrace': ['becater', 'betrace'], 'betrail': ['betrail', 'librate', 'triable', 'trilabe'], 'betrap': ['bepart', 'berapt', 'betrap'], 'betrayal': ['betrayal', 'tearably'], 'betrayer': ['betrayer', 'eatberry', 'rebetray', 'teaberry'], 'betread': ['betread', 'debater'], 'betrim': ['betrim', 'timber', 'timbre'], 'betso': ['besot', 'betso'], 'betta': ['betta', 'tabet'], 'bettina': ['bettina', 'tabinet', 'tibetan'], 'betula': ['batule', 'betula', 'tabule'], 'betulin': ['betulin', 'bluntie'], 'beturbaned': ['beturbaned', 'unrabbeted'], 'beveil': ['belive', 'beveil'], 'bevel': ['belve', 'bevel'], 'bever': ['bever', 'breve'], 'bewailer': ['bewailer', 'rebewail'], 'bework': ['bework', 'bowker'], 'bey': ['bey', 'bye'], 'beydom': ['beydom', 'embody'], 'bezant': ['batzen', 'bezant', 'tanzeb'], 'bezzo': ['bezzo', 'bozze'], 'bhakti': ['bhakti', 'khatib'], 'bhandari': ['bhandari', 'hairband'], 'bhar': ['bhar', 'harb'], 'bhara': ['bahar', 'bhara'], 'bhat': ['baht', 'bath', 'bhat'], 'bhima': ['bhima', 'biham'], 'bhotia': ['bhotia', 'tobiah'], 'bhutani': ['bhutani', 'unhabit'], 'biacetyl': ['baetylic', 'biacetyl'], 'bialate': ['baalite', 'bialate', 'labiate'], 'bialveolar': ['bialveolar', 'labiovelar'], 'bianca': ['abanic', 'bianca'], 'bianco': ['bianco', 'bonaci'], 'biangular': ['biangular', 'bulgarian'], 'bias': ['absi', 'bais', 'bias', 'isba'], 'biatomic': ['biatomic', 'moabitic'], 'bible': ['bible', 'blibe'], 'bicarpellary': ['bicarpellary', 'prebacillary'], 'bickern': ['bickern', 'bricken'], 'biclavate': ['activable', 'biclavate'], 'bicorn': ['bicorn', 'bicron'], 'bicornate': ['bicornate', 'carbonite', 'reboantic'], 'bicrenate': ['abenteric', 'bicrenate'], 'bicron': ['bicorn', 'bicron'], 'bicrural': ['bicrural', 'rubrical'], 'bid': ['bid', 'dib'], 'bidar': ['barid', 'bidar', 'braid', 'rabid'], 'bidder': ['bedrid', 'bidder'], 'bide': ['beid', 'bide', 'debi', 'dieb'], 'bident': ['bident', 'indebt'], 'bidented': ['bidented', 'indebted'], 'bider': ['bider', 'bredi', 'bride', 'rebid'], 'bidet': ['bidet', 'debit'], 'biduous': ['biduous', 'dubious'], 'bien': ['beni', 'bien', 'bine', 'inbe'], 'bier': ['beri', 'bier', 'brei', 'ribe'], 'bietle': ['belite', 'beltie', 'bietle'], 'bifer': ['bifer', 'brief', 'fiber'], 'big': ['big', 'gib'], 'biga': ['agib', 'biga', 'gabi'], 'bigamous': ['bigamous', 'subimago'], 'bigener': ['bigener', 'rebegin'], 'bigential': ['bigential', 'tangibile'], 'biggin': ['biggin', 'gibing'], 'bigoted': ['bigoted', 'dogbite'], 'biham': ['bhima', 'biham'], 'bihari': ['bihari', 'habiri'], 'bike': ['bike', 'kibe'], 'bikram': ['bikram', 'imbark'], 'bilaan': ['albian', 'bilaan'], 'bilaterality': ['alterability', 'bilaterality', 'relatability'], 'bilati': ['bilati', 'tibial'], 'bilby': ['bilby', 'libby'], 'bildar': ['bildar', 'bridal', 'ribald'], 'bilge': ['bilge', 'gibel'], 'biliate': ['biliate', 'tibiale'], 'bilinear': ['bilinear', 'liberian'], 'billa': ['balli', 'billa'], 'billboard': ['billboard', 'broadbill'], 'biller': ['biller', 'rebill'], 'billeter': ['billeter', 'rebillet'], 'billie': ['belili', 'billie'], 'bilo': ['bilo', 'boil'], 'bilobated': ['bilobated', 'bobtailed'], 'biltong': ['biltong', 'bolting'], 'bim': ['bim', 'mib'], 'bimane': ['benami', 'bimane'], 'bimodality': ['bimodality', 'myliobatid'], 'bimotors': ['bimotors', 'robotism'], 'bin': ['bin', 'nib'], 'binal': ['albin', 'binal', 'blain'], 'binary': ['binary', 'brainy'], 'binder': ['binder', 'inbred', 'rebind'], 'bindwood': ['bindwood', 'woodbind'], 'bine': ['beni', 'bien', 'bine', 'inbe'], 'binge': ['begin', 'being', 'binge'], 'bino': ['bino', 'bion', 'boni'], 'binocular': ['binocular', 'caliburno', 'colubrina'], 'binomial': ['binomial', 'mobilian'], 'binuclear': ['binuclear', 'incurable'], 'biod': ['biod', 'boid'], 'bion': ['bino', 'bion', 'boni'], 'biopsychological': ['biopsychological', 'psychobiological'], 'biopsychology': ['biopsychology', 'psychobiology'], 'bioral': ['bailor', 'bioral'], 'biorgan': ['biorgan', 'grobian'], 'bios': ['bios', 'bois'], 'biosociological': ['biosociological', 'sociobiological'], 'biota': ['biota', 'ibota'], 'biotics': ['biotics', 'cobitis'], 'bipartile': ['bipartile', 'pretibial'], 'biped': ['bedip', 'biped'], 'bipedal': ['bipedal', 'piebald'], 'bipersonal': ['bipersonal', 'prisonable'], 'bipolar': ['bipolar', 'parboil'], 'biracial': ['biracial', 'cibarial'], 'birchen': ['birchen', 'brichen'], 'bird': ['bird', 'drib'], 'birdeen': ['birdeen', 'inbreed'], 'birdlet': ['birdlet', 'driblet'], 'birdling': ['birdling', 'bridling', 'lingbird'], 'birdman': ['birdman', 'manbird'], 'birdseed': ['birdseed', 'seedbird'], 'birdstone': ['birdstone', 'stonebird'], 'bireme': ['bemire', 'bireme'], 'biretta': ['biretta', 'brattie', 'ratbite'], 'birle': ['birle', 'liber'], 'birma': ['abrim', 'birma'], 'birn': ['birn', 'brin'], 'birny': ['birny', 'briny'], 'biron': ['biron', 'inorb', 'robin'], 'birse': ['birse', 'ribes'], 'birsle': ['bersil', 'birsle'], 'birth': ['birth', 'brith'], 'bis': ['bis', 'sib'], 'bisalt': ['baltis', 'bisalt'], 'bisaltae': ['bisaltae', 'satiable'], 'bisharin': ['bairnish', 'bisharin'], 'bistate': ['bastite', 'batiste', 'bistate'], 'bister': ['bestir', 'bister'], 'bistered': ['bestride', 'bistered'], 'bisti': ['bisti', 'bitis'], 'bisulcate': ['baculites', 'bisulcate'], 'bit': ['bit', 'tib'], 'bitangent': ['battening', 'bitangent'], 'bitemporal': ['bitemporal', 'importable'], 'biter': ['biter', 'tribe'], 'bitis': ['bisti', 'bitis'], 'bito': ['bito', 'obit'], 'bitonality': ['bitonality', 'notability'], 'bittern': ['bittern', 'britten'], 'bitumed': ['bitumed', 'budtime'], 'biurate': ['abiuret', 'aubrite', 'biurate', 'rubiate'], 'biwa': ['biwa', 'wabi'], 'bizarre': ['bizarre', 'brazier'], 'bizet': ['bizet', 'zibet'], 'blabber': ['babbler', 'blabber', 'brabble'], 'blackacre': ['blackacre', 'crackable'], 'blad': ['bald', 'blad'], 'blader': ['balder', 'bardel', 'bedlar', 'bedral', 'belard', 'blader'], 'bladewise': ['basilweed', 'bladewise'], 'bladish': ['baldish', 'bladish'], 'blady': ['badly', 'baldy', 'blady'], 'blae': ['abel', 'able', 'albe', 'bale', 'beal', 'bela', 'blae'], 'blaeberry': ['blaeberry', 'bleaberry'], 'blaeness': ['ableness', 'blaeness', 'sensable'], 'blain': ['albin', 'binal', 'blain'], 'blaine': ['baline', 'blaine'], 'blair': ['blair', 'brail', 'libra'], 'blake': ['blake', 'bleak', 'kabel'], 'blame': ['amble', 'belam', 'blame', 'mabel'], 'blamed': ['bedlam', 'beldam', 'blamed'], 'blamer': ['ambler', 'blamer', 'lamber', 'marble', 'ramble'], 'blaming': ['ambling', 'blaming'], 'blamingly': ['amblingly', 'blamingly'], 'blanca': ['bancal', 'blanca'], 'blare': ['abler', 'baler', 'belar', 'blare', 'blear'], 'blarina': ['blarina', 'branial'], 'blarney': ['blarney', 'renably'], 'blas': ['blas', 'slab'], 'blase': ['blase', 'sable'], 'blasia': ['basial', 'blasia'], 'blastema': ['blastema', 'lambaste'], 'blastemic': ['blastemic', 'cembalist'], 'blaster': ['blaster', 'reblast', 'stabler'], 'blastie': ['astilbe', 'bestial', 'blastie', 'stabile'], 'blasting': ['blasting', 'stabling'], 'blastoderm': ['blastoderm', 'dermoblast'], 'blastogenic': ['blastogenic', 'genoblastic'], 'blastomeric': ['blastomeric', 'meroblastic'], 'blastomycetic': ['blastomycetic', 'cytoblastemic'], 'blastomycetous': ['blastomycetous', 'cytoblastemous'], 'blasty': ['blasty', 'stably'], 'blat': ['balt', 'blat'], 'blate': ['batel', 'blate', 'bleat', 'table'], 'blather': ['blather', 'halbert'], 'blatter': ['battler', 'blatter', 'brattle'], 'blaver': ['barvel', 'blaver', 'verbal'], 'blaw': ['bawl', 'blaw'], 'blay': ['ably', 'blay', 'yalb'], 'blazoner': ['albronze', 'blazoner'], 'bleaberry': ['blaeberry', 'bleaberry'], 'bleach': ['bachel', 'bleach'], 'bleacher': ['bleacher', 'rebleach'], 'bleak': ['blake', 'bleak', 'kabel'], 'bleaky': ['bleaky', 'kabyle'], 'blear': ['abler', 'baler', 'belar', 'blare', 'blear'], 'bleared': ['bleared', 'reblade'], 'bleary': ['barely', 'barley', 'bleary'], 'bleat': ['batel', 'blate', 'bleat', 'table'], 'bleater': ['bearlet', 'bleater', 'elberta', 'retable'], 'bleating': ['bleating', 'tangible'], 'bleaty': ['baetyl', 'baylet', 'bleaty'], 'bleed': ['bedel', 'bleed'], 'bleery': ['berley', 'bleery'], 'blender': ['blender', 'reblend'], 'blendure': ['blendure', 'rebundle'], 'blennoid': ['blennoid', 'blondine'], 'blennoma': ['blennoma', 'nobleman'], 'bleo': ['bleo', 'bole', 'lobe'], 'blepharocera': ['blepharocera', 'reproachable'], 'blessed': ['bedless', 'blessed'], 'blesser': ['blesser', 'rebless'], 'blessing': ['beslings', 'blessing', 'glibness'], 'blet': ['belt', 'blet'], 'bletia': ['albeit', 'albite', 'baltei', 'belait', 'betail', 'bletia', 'libate'], 'bletilla': ['belltail', 'bletilla', 'tillable'], 'blibe': ['bible', 'blibe'], 'blighter': ['blighter', 'therblig'], 'blimy': ['blimy', 'limby'], 'blister': ['blister', 'bristle'], 'blisterwort': ['blisterwort', 'bristlewort'], 'blitter': ['blitter', 'brittle', 'triblet'], 'blo': ['blo', 'lob'], 'bloated': ['bloated', 'lobated'], 'bloater': ['alberto', 'bloater', 'latrobe'], 'bloating': ['bloating', 'obligant'], 'blocker': ['blocker', 'brockle', 'reblock'], 'blonde': ['blonde', 'bolden'], 'blondine': ['blennoid', 'blondine'], 'blood': ['blood', 'boldo'], 'bloodleaf': ['bloodleaf', 'floodable'], 'bloomer': ['bloomer', 'rebloom'], 'bloomy': ['bloomy', 'lomboy'], 'blore': ['blore', 'roble'], 'blosmy': ['blosmy', 'symbol'], 'blot': ['blot', 'bolt'], 'blotless': ['blotless', 'boltless'], 'blotter': ['blotter', 'bottler'], 'blotting': ['blotting', 'bottling'], 'blouse': ['besoul', 'blouse', 'obelus'], 'blow': ['blow', 'bowl'], 'blowback': ['backblow', 'blowback'], 'blower': ['blower', 'bowler', 'reblow', 'worble'], 'blowfly': ['blowfly', 'flyblow'], 'blowing': ['blowing', 'bowling'], 'blowout': ['blowout', 'outblow', 'outbowl'], 'blowup': ['blowup', 'upblow'], 'blowy': ['blowy', 'bowly'], 'blub': ['blub', 'bulb'], 'blubber': ['blubber', 'bubbler'], 'blue': ['blue', 'lube'], 'bluegill': ['bluegill', 'gullible'], 'bluenose': ['bluenose', 'nebulose'], 'bluer': ['bluer', 'brule', 'burel', 'ruble'], 'blues': ['blues', 'bulse'], 'bluffer': ['bluffer', 'rebluff'], 'bluishness': ['bluishness', 'blushiness'], 'bluism': ['bluism', 'limbus'], 'blumea': ['bemaul', 'blumea'], 'blunder': ['blunder', 'bundler'], 'blunderer': ['blunderer', 'reblunder'], 'blunge': ['blunge', 'bungle'], 'blunger': ['blunger', 'bungler'], 'bluntie': ['betulin', 'bluntie'], 'blur': ['blur', 'burl'], 'blushiness': ['bluishness', 'blushiness'], 'bluster': ['bluster', 'brustle', 'bustler'], 'boa': ['abo', 'boa'], 'boar': ['boar', 'bora'], 'board': ['abord', 'bardo', 'board', 'broad', 'dobra', 'dorab'], 'boarder': ['arbored', 'boarder', 'reboard'], 'boardly': ['boardly', 'broadly'], 'boardy': ['boardy', 'boyard', 'byroad'], 'boast': ['basto', 'boast', 'sabot'], 'boaster': ['barotse', 'boaster', 'reboast', 'sorbate'], 'boasting': ['boasting', 'bostangi'], 'boat': ['boat', 'bota', 'toba'], 'boater': ['boater', 'borate', 'rebato'], 'boathouse': ['boathouse', 'houseboat'], 'bobac': ['bobac', 'cabob'], 'bobfly': ['bobfly', 'flobby'], 'bobo': ['bobo', 'boob'], 'bobtailed': ['bilobated', 'bobtailed'], 'bocardo': ['bocardo', 'cordoba'], 'boccale': ['boccale', 'cabocle'], 'bocher': ['bocher', 'broche'], 'bocking': ['bocking', 'kingcob'], 'bod': ['bod', 'dob'], 'bode': ['bode', 'dobe'], 'boden': ['boden', 'boned'], 'boder': ['boder', 'orbed'], 'bodewash': ['beshadow', 'bodewash'], 'bodge': ['bedog', 'bodge'], 'bodhi': ['bodhi', 'dhobi'], 'bodice': ['bodice', 'ceboid'], 'bodier': ['bodier', 'boride', 'brodie'], 'bodle': ['bodle', 'boled', 'lobed'], 'bodo': ['bodo', 'bood', 'doob'], 'body': ['body', 'boyd', 'doby'], 'boer': ['boer', 'bore', 'robe'], 'boerdom': ['bedroom', 'boerdom', 'boredom'], 'boethian': ['boethian', 'nebaioth'], 'bog': ['bog', 'gob'], 'boga': ['bago', 'boga'], 'bogan': ['bogan', 'goban'], 'bogeyman': ['bogeyman', 'moneybag'], 'boggler': ['boggler', 'broggle'], 'boglander': ['boglander', 'longbeard'], 'bogle': ['bogle', 'globe'], 'boglet': ['boglet', 'goblet'], 'bogo': ['bogo', 'gobo'], 'bogue': ['bogue', 'bouge'], 'bogum': ['bogum', 'gumbo'], 'bogy': ['bogy', 'bygo', 'goby'], 'bohea': ['bahoe', 'bohea', 'obeah'], 'boho': ['boho', 'hobo'], 'bohor': ['bohor', 'rohob'], 'boid': ['biod', 'boid'], 'boil': ['bilo', 'boil'], 'boiled': ['beloid', 'boiled', 'bolide'], 'boiler': ['boiler', 'reboil'], 'boilover': ['boilover', 'overboil'], 'bois': ['bios', 'bois'], 'bojo': ['bojo', 'jobo'], 'bolar': ['balor', 'bolar', 'boral', 'labor', 'lobar'], 'bolden': ['blonde', 'bolden'], 'bolderian': ['bolderian', 'ordinable'], 'boldine': ['belonid', 'boldine'], 'boldness': ['boldness', 'bondless'], 'boldo': ['blood', 'boldo'], 'bole': ['bleo', 'bole', 'lobe'], 'boled': ['bodle', 'boled', 'lobed'], 'bolelia': ['bolelia', 'lobelia', 'obelial'], 'bolide': ['beloid', 'boiled', 'bolide'], 'boller': ['beroll', 'boller'], 'bolo': ['bolo', 'bool', 'lobo', 'obol'], 'bolster': ['bolster', 'lobster'], 'bolt': ['blot', 'bolt'], 'boltage': ['boltage', 'globate'], 'bolter': ['bolter', 'orblet', 'reblot', 'rebolt'], 'bolthead': ['bolthead', 'theobald'], 'bolting': ['biltong', 'bolting'], 'boltless': ['blotless', 'boltless'], 'boltonia': ['boltonia', 'lobation', 'oblation'], 'bom': ['bom', 'mob'], 'boma': ['ambo', 'boma'], 'bombable': ['bombable', 'mobbable'], 'bombacaceae': ['bombacaceae', 'cabombaceae'], 'bomber': ['bomber', 'mobber'], 'bon': ['bon', 'nob'], 'bonaci': ['bianco', 'bonaci'], 'bonair': ['bonair', 'borani'], 'bondage': ['bondage', 'dogbane'], 'bondar': ['bandor', 'bondar', 'roband'], 'bondless': ['boldness', 'bondless'], 'bone': ['beno', 'bone', 'ebon'], 'boned': ['boden', 'boned'], 'bonefish': ['bonefish', 'fishbone'], 'boneless': ['boneless', 'noblesse'], 'bonellia': ['baillone', 'bonellia'], 'boner': ['boner', 'borne'], 'boney': ['boney', 'ebony'], 'boni': ['bino', 'bion', 'boni'], 'bonitary': ['bonitary', 'trainboy'], 'bonk': ['bonk', 'knob'], 'bonnet': ['benton', 'bonnet'], 'bonsai': ['basion', 'bonsai', 'sabino'], 'bonus': ['bonus', 'bosun'], 'bony': ['bony', 'byon'], 'bonze': ['benzo', 'bonze'], 'bonzer': ['bonzer', 'bronze'], 'boob': ['bobo', 'boob'], 'bood': ['bodo', 'bood', 'doob'], 'booger': ['booger', 'goober'], 'bookcase': ['bookcase', 'casebook'], 'booker': ['booker', 'brooke', 'rebook'], 'bookland': ['bookland', 'landbook'], 'bookshop': ['bookshop', 'shopbook'], 'bookward': ['bookward', 'woodbark'], 'bookwork': ['bookwork', 'workbook'], 'bool': ['bolo', 'bool', 'lobo', 'obol'], 'booly': ['booly', 'looby'], 'boomingly': ['boomingly', 'myoglobin'], 'boopis': ['boopis', 'obispo'], 'boor': ['boor', 'boro', 'broo'], 'boort': ['boort', 'robot'], 'boost': ['boost', 'boots'], 'bootes': ['besoot', 'bootes'], 'boother': ['boother', 'theorbo'], 'boots': ['boost', 'boots'], 'bop': ['bop', 'pob'], 'bor': ['bor', 'orb', 'rob'], 'bora': ['boar', 'bora'], 'borable': ['belabor', 'borable'], 'boracic': ['boracic', 'braccio'], 'boral': ['balor', 'bolar', 'boral', 'labor', 'lobar'], 'boran': ['baron', 'boran'], 'borani': ['bonair', 'borani'], 'borate': ['boater', 'borate', 'rebato'], 'bord': ['bord', 'brod'], 'bordel': ['belord', 'bordel', 'rebold'], 'bordello': ['bordello', 'doorbell'], 'border': ['border', 'roberd'], 'borderer': ['borderer', 'broderer'], 'bordure': ['bordure', 'bourder'], 'bore': ['boer', 'bore', 'robe'], 'boredom': ['bedroom', 'boerdom', 'boredom'], 'boree': ['beroe', 'boree'], 'boreen': ['boreen', 'enrobe', 'neebor', 'rebone'], 'boreiad': ['beroida', 'boreiad'], 'boreism': ['boreism', 'semiorb'], 'borer': ['borer', 'rerob', 'rober'], 'boreus': ['besour', 'boreus', 'bourse', 'bouser'], 'borg': ['borg', 'brog', 'gorb'], 'boric': ['boric', 'cribo', 'orbic'], 'boride': ['bodier', 'boride', 'brodie'], 'boring': ['boring', 'robing'], 'boringly': ['boringly', 'goblinry'], 'borlase': ['borlase', 'labrose', 'rosabel'], 'borne': ['boner', 'borne'], 'borneo': ['borneo', 'oberon'], 'bornite': ['bornite', 'robinet'], 'boro': ['boor', 'boro', 'broo'], 'borocaine': ['borocaine', 'coenobiar'], 'borofluohydric': ['borofluohydric', 'hydrofluoboric'], 'borolanite': ['bertolonia', 'borolanite'], 'boron': ['boron', 'broon'], 'boronic': ['boronic', 'cobiron'], 'borrower': ['borrower', 'reborrow'], 'borscht': ['borscht', 'bortsch'], 'bort': ['bort', 'brot'], 'bortsch': ['borscht', 'bortsch'], 'bos': ['bos', 'sob'], 'bosc': ['bosc', 'scob'], 'boser': ['boser', 'brose', 'sober'], 'bosn': ['bosn', 'nobs', 'snob'], 'bosselation': ['bosselation', 'eosinoblast'], 'bosset': ['betoss', 'bosset'], 'bostangi': ['boasting', 'bostangi'], 'bostanji': ['banjoist', 'bostanji'], 'bosun': ['bonus', 'bosun'], 'bota': ['boat', 'bota', 'toba'], 'botanical': ['botanical', 'catabolin'], 'botanophilist': ['botanophilist', 'philobotanist'], 'bote': ['bote', 'tobe'], 'botein': ['botein', 'tobine'], 'both': ['both', 'thob'], 'bottler': ['blotter', 'bottler'], 'bottling': ['blotting', 'bottling'], 'bouge': ['bogue', 'bouge'], 'bouget': ['bouget', 'outbeg'], 'bouk': ['bouk', 'kobu'], 'boulder': ['boulder', 'doubler'], 'bouldering': ['bouldering', 'redoubling'], 'boulter': ['boulter', 'trouble'], 'bounden': ['bounden', 'unboned'], 'bounder': ['beround', 'bounder', 'rebound', 'unbored', 'unorbed', 'unrobed'], 'bounding': ['bounding', 'unboding'], 'bourder': ['bordure', 'bourder'], 'bourn': ['bourn', 'bruno'], 'bourse': ['besour', 'boreus', 'bourse', 'bouser'], 'bouser': ['besour', 'boreus', 'bourse', 'bouser'], 'bousy': ['bousy', 'byous'], 'bow': ['bow', 'wob'], 'bowel': ['below', 'bowel', 'elbow'], 'boweled': ['boweled', 'elbowed'], 'bowels': ['beslow', 'bowels'], 'bowery': ['bowery', 'bowyer', 'owerby'], 'bowie': ['bowie', 'woibe'], 'bowker': ['bework', 'bowker'], 'bowl': ['blow', 'bowl'], 'bowla': ['ablow', 'balow', 'bowla'], 'bowler': ['blower', 'bowler', 'reblow', 'worble'], 'bowling': ['blowing', 'bowling'], 'bowly': ['blowy', 'bowly'], 'bowmaker': ['beamwork', 'bowmaker'], 'bowyer': ['bowery', 'bowyer', 'owerby'], 'boxer': ['boxer', 'rebox'], 'boxwork': ['boxwork', 'workbox'], 'boyang': ['boyang', 'yagnob'], 'boyard': ['boardy', 'boyard', 'byroad'], 'boyd': ['body', 'boyd', 'doby'], 'boyship': ['boyship', 'shipboy'], 'bozo': ['bozo', 'zobo'], 'bozze': ['bezzo', 'bozze'], 'bra': ['bar', 'bra', 'rab'], 'brab': ['barb', 'brab'], 'brabble': ['babbler', 'blabber', 'brabble'], 'braca': ['acrab', 'braca'], 'braccio': ['boracic', 'braccio'], 'brace': ['acerb', 'brace', 'caber'], 'braced': ['becard', 'braced'], 'braceleted': ['braceleted', 'celebrated'], 'bracer': ['bracer', 'craber'], 'braces': ['braces', 'scrabe'], 'brachet': ['batcher', 'berchta', 'brachet'], 'brachiata': ['batrachia', 'brachiata'], 'brachiofacial': ['brachiofacial', 'faciobrachial'], 'brachiopode': ['brachiopode', 'cardiophobe'], 'bracon': ['bracon', 'carbon', 'corban'], 'bractea': ['abreact', 'bractea', 'cabaret'], 'bracteal': ['bracteal', 'cartable'], 'bracteiform': ['bacteriform', 'bracteiform'], 'bracteose': ['bracteose', 'obsecrate'], 'brad': ['bard', 'brad', 'drab'], 'bradenhead': ['barehanded', 'bradenhead', 'headbander'], 'brae': ['bare', 'bear', 'brae'], 'braehead': ['barehead', 'braehead'], 'brag': ['brag', 'garb', 'grab'], 'bragi': ['bragi', 'girba'], 'bragless': ['bragless', 'garbless'], 'brahmi': ['brahmi', 'mihrab'], 'brahui': ['brahui', 'habiru'], 'braid': ['barid', 'bidar', 'braid', 'rabid'], 'braider': ['braider', 'rebraid'], 'brail': ['blair', 'brail', 'libra'], 'braille': ['braille', 'liberal'], 'brain': ['abrin', 'bairn', 'brain', 'brian', 'rabin'], 'brainache': ['brainache', 'branchiae'], 'brainge': ['bearing', 'begrain', 'brainge', 'rigbane'], 'brainwater': ['brainwater', 'waterbrain'], 'brainy': ['binary', 'brainy'], 'braird': ['braird', 'briard'], 'brairo': ['barrio', 'brairo'], 'braise': ['braise', 'rabies', 'rebias'], 'brake': ['baker', 'brake', 'break'], 'brakeage': ['brakeage', 'breakage'], 'brakeless': ['bakerless', 'brakeless', 'breakless'], 'braker': ['barker', 'braker'], 'braky': ['barky', 'braky'], 'bram': ['barm', 'bram'], 'brambrack': ['barmbrack', 'brambrack'], 'bramia': ['bairam', 'bramia'], 'bran': ['barn', 'bran'], 'brancher': ['brancher', 'rebranch'], 'branchiae': ['brainache', 'branchiae'], 'branchiata': ['batrachian', 'branchiata'], 'branchiopoda': ['branchiopoda', 'podobranchia'], 'brander': ['bernard', 'brander', 'rebrand'], 'brandi': ['brandi', 'riband'], 'brandisher': ['brandisher', 'rebrandish'], 'branial': ['blarina', 'branial'], 'brankie': ['brankie', 'inbreak'], 'brash': ['brash', 'shrab'], 'brasiletto': ['brasiletto', 'strobilate'], 'brassie': ['brassie', 'rebasis'], 'brat': ['bart', 'brat'], 'brattie': ['biretta', 'brattie', 'ratbite'], 'brattle': ['battler', 'blatter', 'brattle'], 'braunite': ['braunite', 'urbanite', 'urbinate'], 'brave': ['brave', 'breva'], 'bravoite': ['abortive', 'bravoite'], 'brawler': ['brawler', 'warbler'], 'brawling': ['brawling', 'warbling'], 'brawlingly': ['brawlingly', 'warblingly'], 'brawly': ['brawly', 'byrlaw', 'warbly'], 'brawned': ['benward', 'brawned'], 'bray': ['bray', 'yarb'], 'braza': ['braza', 'zabra'], 'braze': ['braze', 'zebra'], 'brazier': ['bizarre', 'brazier'], 'bread': ['ardeb', 'beard', 'bread', 'debar'], 'breadless': ['beardless', 'breadless'], 'breadlessness': ['beardlessness', 'breadlessness'], 'breadman': ['banderma', 'breadman'], 'breadnut': ['breadnut', 'turbaned'], 'breaghe': ['breaghe', 'herbage'], 'break': ['baker', 'brake', 'break'], 'breakage': ['brakeage', 'breakage'], 'breakless': ['bakerless', 'brakeless', 'breakless'], 'breakout': ['breakout', 'outbreak'], 'breakover': ['breakover', 'overbreak'], 'breakstone': ['breakstone', 'stonebreak'], 'breakup': ['breakup', 'upbreak'], 'breakwind': ['breakwind', 'windbreak'], 'bream': ['amber', 'bearm', 'bemar', 'bream', 'embar'], 'breast': ['baster', 'bestar', 'breast'], 'breasting': ['breasting', 'brigantes'], 'breastpin': ['breastpin', 'stepbairn'], 'breastrail': ['arbalister', 'breastrail'], 'breastweed': ['breastweed', 'sweetbread'], 'breath': ['bather', 'bertha', 'breath'], 'breathe': ['breathe', 'rebathe'], 'breba': ['barbe', 'bebar', 'breba', 'rebab'], 'breccia': ['acerbic', 'breccia'], 'brecham': ['becharm', 'brecham', 'chamber'], 'brede': ['brede', 'breed', 'rebed'], 'bredi': ['bider', 'bredi', 'bride', 'rebid'], 'bree': ['beer', 'bere', 'bree'], 'breech': ['becher', 'breech'], 'breed': ['brede', 'breed', 'rebed'], 'breeder': ['breeder', 'rebreed'], 'breeding': ['beringed', 'breeding'], 'brehon': ['behorn', 'brehon'], 'brei': ['beri', 'bier', 'brei', 'ribe'], 'brelaw': ['bawler', 'brelaw', 'rebawl', 'warble'], 'breme': ['breme', 'ember'], 'bremia': ['ambier', 'bremia', 'embira'], 'brenda': ['bander', 'brenda'], 'brephic': ['bechirp', 'brephic'], 'bret': ['bert', 'bret'], 'breth': ['berth', 'breth'], 'breva': ['brave', 'breva'], 'breve': ['bever', 'breve'], 'brewer': ['brewer', 'rebrew'], 'brey': ['brey', 'byre', 'yerb'], 'brian': ['abrin', 'bairn', 'brain', 'brian', 'rabin'], 'briard': ['braird', 'briard'], 'briber': ['briber', 'ribber'], 'brichen': ['birchen', 'brichen'], 'brickel': ['brickel', 'brickle'], 'bricken': ['bickern', 'bricken'], 'brickle': ['brickel', 'brickle'], 'bricole': ['bricole', 'corbeil', 'orbicle'], 'bridal': ['bildar', 'bridal', 'ribald'], 'bridale': ['bedrail', 'bridale', 'ridable'], 'bridally': ['bridally', 'ribaldly'], 'bride': ['bider', 'bredi', 'bride', 'rebid'], 'bridelace': ['bridelace', 'calibered'], 'bridge': ['begird', 'bridge'], 'bridgeward': ['bridgeward', 'drawbridge'], 'bridling': ['birdling', 'bridling', 'lingbird'], 'brief': ['bifer', 'brief', 'fiber'], 'briefless': ['briefless', 'fiberless', 'fibreless'], 'brier': ['berri', 'brier'], 'briered': ['berried', 'briered'], 'brieve': ['bervie', 'brieve'], 'brigade': ['abridge', 'brigade'], 'brigand': ['barding', 'brigand'], 'brigantes': ['breasting', 'brigantes'], 'brighten': ['berthing', 'brighten'], 'brin': ['birn', 'brin'], 'brine': ['brine', 'enrib'], 'bringal': ['barling', 'bringal'], 'bringer': ['bringer', 'rebring'], 'briny': ['birny', 'briny'], 'bristle': ['blister', 'bristle'], 'bristlewort': ['blisterwort', 'bristlewort'], 'brisure': ['brisure', 'bruiser'], 'britannia': ['antiabrin', 'britannia'], 'brith': ['birth', 'brith'], 'brither': ['brither', 'rebirth'], 'britten': ['bittern', 'britten'], 'brittle': ['blitter', 'brittle', 'triblet'], 'broacher': ['broacher', 'rebroach'], 'broad': ['abord', 'bardo', 'board', 'broad', 'dobra', 'dorab'], 'broadbill': ['billboard', 'broadbill'], 'broadcaster': ['broadcaster', 'rebroadcast'], 'broaden': ['bandore', 'broaden'], 'broadhead': ['broadhead', 'headboard'], 'broadly': ['boardly', 'broadly'], 'broadside': ['broadside', 'sideboard'], 'broadspread': ['broadspread', 'spreadboard'], 'broadtail': ['broadtail', 'tailboard'], 'brochan': ['brochan', 'charbon'], 'broche': ['bocher', 'broche'], 'brocho': ['brocho', 'brooch'], 'brocked': ['bedrock', 'brocked'], 'brockle': ['blocker', 'brockle', 'reblock'], 'brod': ['bord', 'brod'], 'broderer': ['borderer', 'broderer'], 'brodie': ['bodier', 'boride', 'brodie'], 'brog': ['borg', 'brog', 'gorb'], 'brogan': ['barong', 'brogan'], 'broggle': ['boggler', 'broggle'], 'brolga': ['brolga', 'gorbal'], 'broma': ['broma', 'rambo'], 'bromate': ['barmote', 'bromate'], 'brome': ['brome', 'omber'], 'brominate': ['brominate', 'tribonema'], 'bromohydrate': ['bromohydrate', 'hydrobromate'], 'bronze': ['bonzer', 'bronze'], 'broo': ['boor', 'boro', 'broo'], 'brooch': ['brocho', 'brooch'], 'brooke': ['booker', 'brooke', 'rebook'], 'broon': ['boron', 'broon'], 'brose': ['boser', 'brose', 'sober'], 'brot': ['bort', 'brot'], 'brotan': ['barton', 'brotan'], 'brotany': ['baryton', 'brotany'], 'broth': ['broth', 'throb'], 'brothelry': ['brothelry', 'brotherly'], 'brotherly': ['brothelry', 'brotherly'], 'browden': ['bedrown', 'browden'], 'browner': ['browner', 'rebrown'], 'browntail': ['browntail', 'wrainbolt'], 'bruce': ['bruce', 'cebur', 'cuber'], 'brucina': ['brucina', 'rubican'], 'bruckle': ['bruckle', 'buckler'], 'brugh': ['brugh', 'burgh'], 'bruin': ['bruin', 'burin', 'inrub'], 'bruiser': ['brisure', 'bruiser'], 'bruke': ['bruke', 'burke'], 'brule': ['bluer', 'brule', 'burel', 'ruble'], 'brulee': ['brulee', 'burele', 'reblue'], 'brumal': ['brumal', 'labrum', 'lumbar', 'umbral'], 'brumalia': ['albarium', 'brumalia'], 'brume': ['brume', 'umber'], 'brumous': ['brumous', 'umbrous'], 'brunellia': ['brunellia', 'unliberal'], 'brunet': ['brunet', 'bunter', 'burnet'], 'bruno': ['bourn', 'bruno'], 'brunt': ['brunt', 'burnt'], 'brush': ['brush', 'shrub'], 'brushed': ['brushed', 'subherd'], 'brusher': ['brusher', 'rebrush'], 'brushland': ['brushland', 'shrubland'], 'brushless': ['brushless', 'shrubless'], 'brushlet': ['brushlet', 'shrublet'], 'brushlike': ['brushlike', 'shrublike'], 'brushwood': ['brushwood', 'shrubwood'], 'brustle': ['bluster', 'brustle', 'bustler'], 'brut': ['brut', 'burt', 'trub', 'turb'], 'bruta': ['bruta', 'tubar'], 'brute': ['brute', 'buret', 'rebut', 'tuber'], 'brutely': ['brutely', 'butlery'], 'bryan': ['barny', 'bryan'], 'bryanite': ['barytine', 'bryanite'], 'bryce': ['becry', 'bryce'], 'bual': ['balu', 'baul', 'bual', 'luba'], 'buba': ['babu', 'buba'], 'bubal': ['babul', 'bubal'], 'bubbler': ['blubber', 'bubbler'], 'buccocervical': ['buccocervical', 'cervicobuccal'], 'bucconasal': ['bucconasal', 'nasobuccal'], 'buceros': ['bescour', 'buceros', 'obscure'], 'buckbush': ['buckbush', 'bushbuck'], 'bucked': ['beduck', 'bucked'], 'buckler': ['bruckle', 'buckler'], 'bucksaw': ['bucksaw', 'sawbuck'], 'bucrane': ['bucrane', 'unbrace'], 'bud': ['bud', 'dub'], 'buda': ['baud', 'buda', 'daub'], 'budder': ['budder', 'redbud'], 'budger': ['bedrug', 'budger'], 'budgeter': ['budgeter', 'rebudget'], 'budtime': ['bitumed', 'budtime'], 'buffer': ['buffer', 'rebuff'], 'buffeter': ['buffeter', 'rebuffet'], 'bugan': ['bugan', 'bunga', 'unbag'], 'bughouse': ['bughouse', 'housebug'], 'bugi': ['bugi', 'guib'], 'bugle': ['bugle', 'bulge'], 'bugler': ['bugler', 'bulger', 'burgle'], 'bugre': ['bugre', 'gebur'], 'builder': ['builder', 'rebuild'], 'buildup': ['buildup', 'upbuild'], 'buirdly': ['buirdly', 'ludibry'], 'bulanda': ['balunda', 'bulanda'], 'bulb': ['blub', 'bulb'], 'bulgarian': ['biangular', 'bulgarian'], 'bulge': ['bugle', 'bulge'], 'bulger': ['bugler', 'bulger', 'burgle'], 'bulimic': ['bulimic', 'umbilic'], 'bulimiform': ['bulimiform', 'umbiliform'], 'bulker': ['bulker', 'rebulk'], 'bulla': ['bulla', 'lulab'], 'bullace': ['bullace', 'cueball'], 'bulletin': ['bulletin', 'unbillet'], 'bullfeast': ['bullfeast', 'stableful'], 'bulse': ['blues', 'bulse'], 'bulter': ['bulter', 'burlet', 'butler'], 'bummler': ['bummler', 'mumbler'], 'bun': ['bun', 'nub'], 'buna': ['baun', 'buna', 'nabu', 'nuba'], 'buncal': ['buncal', 'lucban'], 'buncher': ['buncher', 'rebunch'], 'bunder': ['bunder', 'burden', 'burned', 'unbred'], 'bundle': ['bundle', 'unbled'], 'bundler': ['blunder', 'bundler'], 'bundu': ['bundu', 'unbud', 'undub'], 'bunga': ['bugan', 'bunga', 'unbag'], 'bungle': ['blunge', 'bungle'], 'bungler': ['blunger', 'bungler'], 'bungo': ['bungo', 'unbog'], 'bunk': ['bunk', 'knub'], 'bunter': ['brunet', 'bunter', 'burnet'], 'bunty': ['bunty', 'butyn'], 'bunya': ['bunya', 'unbay'], 'bur': ['bur', 'rub'], 'buran': ['buran', 'unbar', 'urban'], 'burble': ['burble', 'lubber', 'rubble'], 'burbler': ['burbler', 'rubbler'], 'burbly': ['burbly', 'rubbly'], 'burd': ['burd', 'drub'], 'burdalone': ['burdalone', 'unlabored'], 'burden': ['bunder', 'burden', 'burned', 'unbred'], 'burdener': ['burdener', 'reburden'], 'burdie': ['burdie', 'buried', 'rubied'], 'bure': ['bure', 'reub', 'rube'], 'burel': ['bluer', 'brule', 'burel', 'ruble'], 'burele': ['brulee', 'burele', 'reblue'], 'buret': ['brute', 'buret', 'rebut', 'tuber'], 'burfish': ['burfish', 'furbish'], 'burg': ['burg', 'grub'], 'burgh': ['brugh', 'burgh'], 'burgle': ['bugler', 'bulger', 'burgle'], 'burian': ['burian', 'urbian'], 'buried': ['burdie', 'buried', 'rubied'], 'burin': ['bruin', 'burin', 'inrub'], 'burke': ['bruke', 'burke'], 'burl': ['blur', 'burl'], 'burler': ['burler', 'burrel'], 'burlet': ['bulter', 'burlet', 'butler'], 'burletta': ['burletta', 'rebuttal'], 'burmite': ['burmite', 'imbrute', 'terbium'], 'burned': ['bunder', 'burden', 'burned', 'unbred'], 'burner': ['burner', 'reburn'], 'burnet': ['brunet', 'bunter', 'burnet'], 'burnfire': ['burnfire', 'fireburn'], 'burnie': ['burnie', 'rubine'], 'burnisher': ['burnisher', 'reburnish'], 'burnout': ['burnout', 'outburn'], 'burnover': ['burnover', 'overburn'], 'burnsides': ['burnsides', 'sideburns'], 'burnt': ['brunt', 'burnt'], 'burny': ['burny', 'runby'], 'buro': ['buro', 'roub'], 'burrel': ['burler', 'burrel'], 'burro': ['burro', 'robur', 'rubor'], 'bursa': ['abrus', 'bursa', 'subra'], 'bursal': ['bursal', 'labrus'], 'bursate': ['bursate', 'surbate'], 'burse': ['burse', 'rebus', 'suber'], 'burst': ['burst', 'strub'], 'burster': ['burster', 'reburst'], 'burt': ['brut', 'burt', 'trub', 'turb'], 'burut': ['burut', 'trubu'], 'bury': ['bury', 'ruby'], 'bus': ['bus', 'sub'], 'buscarle': ['arbuscle', 'buscarle'], 'bushbuck': ['buckbush', 'bushbuck'], 'busher': ['busher', 'rebush'], 'bushwood': ['bushwood', 'woodbush'], 'busied': ['busied', 'subdie'], 'busked': ['bedusk', 'busked'], 'busman': ['busman', 'subman'], 'bust': ['bust', 'stub'], 'busted': ['bedust', 'bestud', 'busted'], 'buster': ['berust', 'buster', 'stuber'], 'bustic': ['bustic', 'cubist'], 'bustle': ['bustle', 'sublet', 'subtle'], 'bustler': ['bluster', 'brustle', 'bustler'], 'but': ['but', 'tub'], 'bute': ['bute', 'tebu', 'tube'], 'butea': ['butea', 'taube', 'tubae'], 'butein': ['butein', 'butine', 'intube'], 'butic': ['butic', 'cubit'], 'butine': ['butein', 'butine', 'intube'], 'butler': ['bulter', 'burlet', 'butler'], 'butleress': ['butleress', 'tuberless'], 'butlery': ['brutely', 'butlery'], 'buttle': ['buttle', 'tublet'], 'buttoner': ['buttoner', 'rebutton'], 'butyn': ['bunty', 'butyn'], 'buyer': ['buyer', 'rebuy'], 'bye': ['bey', 'bye'], 'byeman': ['byeman', 'byname'], 'byerite': ['byerite', 'ebriety'], 'bygo': ['bogy', 'bygo', 'goby'], 'byname': ['byeman', 'byname'], 'byon': ['bony', 'byon'], 'byous': ['bousy', 'byous'], 'byre': ['brey', 'byre', 'yerb'], 'byrlaw': ['brawly', 'byrlaw', 'warbly'], 'byroad': ['boardy', 'boyard', 'byroad'], 'cab': ['bac', 'cab'], 'caba': ['abac', 'caba'], 'cabaan': ['cabaan', 'cabana', 'canaba'], 'cabala': ['cabala', 'calaba'], 'cabaletta': ['ablactate', 'cabaletta'], 'cabalism': ['balsamic', 'cabalism'], 'cabalist': ['basaltic', 'cabalist'], 'caballer': ['barcella', 'caballer'], 'caban': ['banca', 'caban'], 'cabana': ['cabaan', 'cabana', 'canaba'], 'cabaret': ['abreact', 'bractea', 'cabaret'], 'cabbler': ['cabbler', 'clabber'], 'caber': ['acerb', 'brace', 'caber'], 'cabio': ['baioc', 'cabio', 'cobia'], 'cabiri': ['cabiri', 'caribi'], 'cabirian': ['arabinic', 'cabirian', 'carabini', 'cibarian'], 'cable': ['cable', 'caleb'], 'cabled': ['beclad', 'cabled'], 'cabob': ['bobac', 'cabob'], 'cabocle': ['boccale', 'cabocle'], 'cabombaceae': ['bombacaceae', 'cabombaceae'], 'cabrilla': ['bacillar', 'cabrilla'], 'caca': ['acca', 'caca'], 'cachet': ['cachet', 'chacte'], 'cachou': ['cachou', 'caucho'], 'cackler': ['cackler', 'clacker', 'crackle'], 'cacodaemonic': ['cacodaemonic', 'cacodemoniac'], 'cacodemoniac': ['cacodaemonic', 'cacodemoniac'], 'cacomistle': ['cacomistle', 'cosmetical'], 'cacoxenite': ['cacoxenite', 'excecation'], 'cactaceae': ['cactaceae', 'taccaceae'], 'cactaceous': ['cactaceous', 'taccaceous'], 'cacti': ['cacti', 'ticca'], 'cactoid': ['cactoid', 'octadic'], 'caddice': ['caddice', 'decadic'], 'caddie': ['caddie', 'eddaic'], 'cade': ['cade', 'dace', 'ecad'], 'cadent': ['cadent', 'canted', 'decant'], 'cadential': ['cadential', 'dancalite'], 'cader': ['acred', 'cader', 'cadre', 'cedar'], 'cadet': ['cadet', 'ectad'], 'cadge': ['cadge', 'caged'], 'cadger': ['cadger', 'cradge'], 'cadi': ['acid', 'cadi', 'caid'], 'cadinene': ['cadinene', 'decennia', 'enneadic'], 'cadmia': ['adamic', 'cadmia'], 'cados': ['cados', 'scoad'], 'cadre': ['acred', 'cader', 'cadre', 'cedar'], 'cadua': ['cadua', 'cauda'], 'caduac': ['caduac', 'caduca'], 'caduca': ['caduac', 'caduca'], 'cadus': ['cadus', 'dacus'], 'caeciliae': ['caeciliae', 'ilicaceae'], 'caedmonian': ['caedmonian', 'macedonian'], 'caedmonic': ['caedmonic', 'macedonic'], 'caelum': ['almuce', 'caelum', 'macule'], 'caelus': ['caelus', 'caules', 'clause'], 'caesar': ['ascare', 'caesar', 'resaca'], 'caesarist': ['caesarist', 'staircase'], 'caesura': ['auresca', 'caesura'], 'caffeina': ['affiance', 'caffeina'], 'caged': ['cadge', 'caged'], 'cageling': ['cageling', 'glaceing'], 'cager': ['cager', 'garce', 'grace'], 'cahill': ['achill', 'cahill', 'chilla'], 'cahita': ['cahita', 'ithaca'], 'cahnite': ['cahnite', 'cathine'], 'caid': ['acid', 'cadi', 'caid'], 'caiman': ['amniac', 'caiman', 'maniac'], 'caimito': ['caimito', 'comitia'], 'cain': ['cain', 'inca'], 'cainism': ['cainism', 'misniac'], 'cairba': ['arabic', 'cairba'], 'caird': ['acrid', 'caird', 'carid', 'darci', 'daric', 'dirca'], 'cairene': ['cairene', 'cinerea'], 'cairn': ['cairn', 'crain', 'naric'], 'cairned': ['cairned', 'candier'], 'cairny': ['cairny', 'riancy'], 'cairo': ['cairo', 'oaric'], 'caisson': ['caisson', 'cassino'], 'cajoler': ['cajoler', 'jecoral'], 'caker': ['acker', 'caker', 'crake', 'creak'], 'cakey': ['ackey', 'cakey'], 'cal': ['cal', 'lac'], 'calaba': ['cabala', 'calaba'], 'calamine': ['alcamine', 'analcime', 'calamine', 'camelina'], 'calamint': ['calamint', 'claimant'], 'calamitean': ['calamitean', 'catamenial'], 'calander': ['calander', 'calendar'], 'calandrinae': ['calandrinae', 'calendarian'], 'calas': ['calas', 'casal', 'scala'], 'calash': ['calash', 'lachsa'], 'calathian': ['acanthial', 'calathian'], 'calaverite': ['calaverite', 'lacerative'], 'calcareocorneous': ['calcareocorneous', 'corneocalcareous'], 'calcareosiliceous': ['calcareosiliceous', 'siliceocalcareous'], 'calciner': ['calciner', 'larcenic'], 'calculary': ['calculary', 'calycular'], 'calculative': ['calculative', 'claviculate'], 'calden': ['calden', 'candle', 'lanced'], 'calean': ['anlace', 'calean'], 'caleb': ['cable', 'caleb'], 'caledonia': ['caledonia', 'laodicean'], 'caledonite': ['caledonite', 'celadonite'], 'calendar': ['calander', 'calendar'], 'calendarial': ['calendarial', 'dalecarlian'], 'calendarian': ['calandrinae', 'calendarian'], 'calender': ['calender', 'encradle'], 'calenture': ['calenture', 'crenulate'], 'calepin': ['calepin', 'capelin', 'panicle', 'pelican', 'pinacle'], 'calfkill': ['calfkill', 'killcalf'], 'caliban': ['balanic', 'caliban'], 'caliber': ['caliber', 'calibre'], 'calibered': ['bridelace', 'calibered'], 'calibrate': ['bacterial', 'calibrate'], 'calibre': ['caliber', 'calibre'], 'caliburno': ['binocular', 'caliburno', 'colubrina'], 'calico': ['accoil', 'calico'], 'calidity': ['calidity', 'dialytic'], 'caliga': ['caliga', 'cigala'], 'calinago': ['analogic', 'calinago'], 'calinut': ['calinut', 'lunatic'], 'caliper': ['caliper', 'picarel', 'replica'], 'calipers': ['calipers', 'spiracle'], 'caliphate': ['caliphate', 'hepatical'], 'calite': ['calite', 'laetic', 'tecali'], 'caliver': ['caliver', 'caviler', 'claiver', 'clavier', 'valeric', 'velaric'], 'calk': ['calk', 'lack'], 'calker': ['calker', 'lacker', 'rackle', 'recalk', 'reckla'], 'callboy': ['callboy', 'collyba'], 'caller': ['caller', 'cellar', 'recall'], 'calli': ['calli', 'lilac'], 'calligraphy': ['calligraphy', 'graphically'], 'calliopsis': ['calliopsis', 'lipoclasis'], 'callisection': ['callisection', 'clinoclasite'], 'callitype': ['callitype', 'plicately'], 'callo': ['callo', 'colla', 'local'], 'callosal': ['callosal', 'scallola'], 'callose': ['callose', 'oscella'], 'callosity': ['callosity', 'stoically'], 'callosum': ['callosum', 'mollusca'], 'calluna': ['calluna', 'lacunal'], 'callus': ['callus', 'sulcal'], 'calm': ['calm', 'clam'], 'calmant': ['calmant', 'clamant'], 'calmative': ['calmative', 'clamative'], 'calmer': ['calmer', 'carmel', 'clamer', 'marcel', 'mercal'], 'calmierer': ['calmierer', 'reclaimer'], 'calomba': ['calomba', 'cambalo'], 'calonectria': ['calonectria', 'ectocranial'], 'calor': ['alcor', 'calor', 'carlo', 'carol', 'claro', 'coral'], 'calorie': ['calorie', 'cariole'], 'calorist': ['calorist', 'coralist'], 'calorite': ['calorite', 'erotical', 'loricate'], 'calorize': ['calorize', 'coalizer'], 'calotermes': ['calotermes', 'mesorectal', 'metacresol'], 'calotermitid': ['calotermitid', 'dilatometric'], 'calp': ['calp', 'clap'], 'caltha': ['caltha', 'chalta'], 'caltrop': ['caltrop', 'proctal'], 'calusa': ['ascula', 'calusa', 'casual', 'casula', 'causal'], 'calvaria': ['calvaria', 'clavaria'], 'calvary': ['calvary', 'cavalry'], 'calve': ['calve', 'cavel', 'clave'], 'calver': ['calver', 'carvel', 'claver'], 'calves': ['calves', 'scavel'], 'calycular': ['calculary', 'calycular'], 'calyptratae': ['acalyptrate', 'calyptratae'], 'cam': ['cam', 'mac'], 'camaca': ['camaca', 'macaca'], 'camail': ['amical', 'camail', 'lamaic'], 'caman': ['caman', 'macan'], 'camara': ['acamar', 'camara', 'maraca'], 'cambalo': ['calomba', 'cambalo'], 'camber': ['becram', 'camber', 'crambe'], 'cambrel': ['cambrel', 'clamber', 'cramble'], 'came': ['acme', 'came', 'mace'], 'cameist': ['cameist', 'etacism', 'sematic'], 'camel': ['camel', 'clame', 'cleam', 'macle'], 'camelid': ['camelid', 'decimal', 'declaim', 'medical'], 'camelina': ['alcamine', 'analcime', 'calamine', 'camelina'], 'camelish': ['camelish', 'schalmei'], 'camellus': ['camellus', 'sacellum'], 'cameloid': ['cameloid', 'comedial', 'melodica'], 'cameograph': ['cameograph', 'macrophage'], 'camera': ['acream', 'camera', 'mareca'], 'cameral': ['cameral', 'caramel', 'carmela', 'ceramal', 'reclama'], 'camerate': ['camerate', 'macerate', 'racemate'], 'camerated': ['camerated', 'demarcate'], 'cameration': ['aeromantic', 'cameration', 'maceration', 'racemation'], 'camerina': ['amacrine', 'american', 'camerina', 'cinerama'], 'camerist': ['camerist', 'ceramist', 'matrices'], 'camion': ['camion', 'conima', 'manioc', 'monica'], 'camisado': ['camisado', 'caodaism'], 'camise': ['camise', 'macies'], 'campaign': ['campaign', 'pangamic'], 'campaigner': ['campaigner', 'recampaign'], 'camphire': ['camphire', 'hemicarp'], 'campine': ['campine', 'pemican'], 'campoo': ['campoo', 'capomo'], 'camptonite': ['camptonite', 'pentatomic'], 'camus': ['camus', 'musca', 'scaum', 'sumac'], 'camused': ['camused', 'muscade'], 'canaba': ['cabaan', 'cabana', 'canaba'], 'canadol': ['acnodal', 'canadol', 'locanda'], 'canaille': ['alliance', 'canaille'], 'canape': ['canape', 'panace'], 'canari': ['acinar', 'arnica', 'canari', 'carian', 'carina', 'crania', 'narica'], 'canarin': ['canarin', 'cranian'], 'canariote': ['canariote', 'ceratonia'], 'canary': ['canary', 'cynara'], 'canaut': ['canaut', 'tucana'], 'canceler': ['canceler', 'clarence', 'recancel'], 'cancer': ['cancer', 'crance'], 'cancerate': ['cancerate', 'reactance'], 'canceration': ['anacreontic', 'canceration'], 'cancri': ['cancri', 'carnic', 'cranic'], 'cancroid': ['cancroid', 'draconic'], 'candela': ['candela', 'decanal'], 'candier': ['cairned', 'candier'], 'candiru': ['candiru', 'iracund'], 'candle': ['calden', 'candle', 'lanced'], 'candor': ['candor', 'cardon', 'conrad'], 'candroy': ['candroy', 'dacryon'], 'cane': ['acne', 'cane', 'nace'], 'canel': ['canel', 'clean', 'lance', 'lenca'], 'canelo': ['canelo', 'colane'], 'canephor': ['canephor', 'chaperno', 'chaperon'], 'canephore': ['canephore', 'chaperone'], 'canephroi': ['canephroi', 'parochine'], 'caner': ['caner', 'crane', 'crena', 'nacre', 'rance'], 'canful': ['canful', 'flucan'], 'cangle': ['cangle', 'glance'], 'cangler': ['cangler', 'glancer', 'reclang'], 'cangue': ['cangue', 'uncage'], 'canicola': ['canicola', 'laconica'], 'canid': ['canid', 'cnida', 'danic'], 'canidae': ['aidance', 'canidae'], 'canine': ['canine', 'encina', 'neanic'], 'canis': ['canis', 'scian'], 'canister': ['canister', 'cestrian', 'cisterna', 'irascent'], 'canker': ['canker', 'neckar'], 'cankerworm': ['cankerworm', 'crownmaker'], 'cannel': ['cannel', 'lencan'], 'cannot': ['cannot', 'canton', 'conant', 'nonact'], 'cannulate': ['antelucan', 'cannulate'], 'canny': ['canny', 'nancy'], 'canoe': ['acone', 'canoe', 'ocean'], 'canoeing': ['anogenic', 'canoeing'], 'canoeist': ['canoeist', 'cotesian'], 'canon': ['ancon', 'canon'], 'canonist': ['canonist', 'sanction', 'sonantic'], 'canoodler': ['canoodler', 'coronaled'], 'canroy': ['canroy', 'crayon', 'cyrano', 'nyroca'], 'canso': ['ascon', 'canso', 'oscan'], 'cantabri': ['bactrian', 'cantabri'], 'cantala': ['cantala', 'catalan', 'lantaca'], 'cantalite': ['cantalite', 'lactinate', 'tetanical'], 'cantara': ['cantara', 'nacarat'], 'cantaro': ['cantaro', 'croatan'], 'cantate': ['anteact', 'cantate'], 'canted': ['cadent', 'canted', 'decant'], 'canteen': ['canteen', 'centena'], 'canter': ['canter', 'creant', 'cretan', 'nectar', 'recant', 'tanrec', 'trance'], 'canterer': ['canterer', 'recanter', 'recreant', 'terrance'], 'cantharidae': ['acidanthera', 'cantharidae'], 'cantharis': ['anarchist', 'archsaint', 'cantharis'], 'canthus': ['canthus', 'staunch'], 'cantico': ['cantico', 'catonic', 'taconic'], 'cantilena': ['cantilena', 'lancinate'], 'cantilever': ['cantilever', 'trivalence'], 'cantily': ['anticly', 'cantily'], 'cantina': ['cantina', 'tannaic'], 'cantiness': ['anticness', 'cantiness', 'incessant'], 'cantion': ['actinon', 'cantion', 'contain'], 'cantle': ['cantle', 'cental', 'lancet', 'tancel'], 'canto': ['acton', 'canto', 'octan'], 'canton': ['cannot', 'canton', 'conant', 'nonact'], 'cantonal': ['cantonal', 'connatal'], 'cantor': ['cantor', 'carton', 'contra'], 'cantorian': ['anarcotin', 'cantorian', 'carnation', 'narcotina'], 'cantoris': ['cantoris', 'castorin', 'corsaint'], 'cantred': ['cantred', 'centrad', 'tranced'], 'cantus': ['cantus', 'tuscan', 'uncast'], 'canun': ['canun', 'cunan'], 'cany': ['cany', 'cyan'], 'canyon': ['ancony', 'canyon'], 'caoba': ['bacao', 'caoba'], 'caodaism': ['camisado', 'caodaism'], 'cap': ['cap', 'pac'], 'capable': ['capable', 'pacable'], 'caparison': ['caparison', 'paranosic'], 'cape': ['cape', 'cepa', 'pace'], 'caped': ['caped', 'decap', 'paced'], 'capel': ['capel', 'place'], 'capelin': ['calepin', 'capelin', 'panicle', 'pelican', 'pinacle'], 'capeline': ['capeline', 'pelecani'], 'caper': ['caper', 'crape', 'pacer', 'perca', 'recap'], 'capernaite': ['capernaite', 'paraenetic'], 'capernoited': ['capernoited', 'deprecation'], 'capernoity': ['acetopyrin', 'capernoity'], 'capes': ['capes', 'scape', 'space'], 'caph': ['caph', 'chap'], 'caphite': ['aphetic', 'caphite', 'hepatic'], 'caphtor': ['caphtor', 'toparch'], 'capias': ['capias', 'pisaca'], 'capillament': ['capillament', 'implacental'], 'capillarity': ['capillarity', 'piratically'], 'capital': ['capital', 'palatic'], 'capitan': ['capitan', 'captain'], 'capitate': ['apatetic', 'capitate'], 'capitellar': ['capitellar', 'prelatical'], 'capito': ['atopic', 'capito', 'copita'], 'capitol': ['capitol', 'coalpit', 'optical', 'topical'], 'capomo': ['campoo', 'capomo'], 'capon': ['capon', 'ponca'], 'caponier': ['caponier', 'coprinae', 'procaine'], 'capot': ['capot', 'coapt'], 'capote': ['capote', 'toecap'], 'capreol': ['capreol', 'polacre'], 'capri': ['capri', 'picra', 'rapic'], 'caprid': ['caprid', 'carpid', 'picard'], 'capriote': ['aporetic', 'capriote', 'operatic'], 'capsian': ['capsian', 'caspian', 'nascapi', 'panisca'], 'capstone': ['capstone', 'opencast'], 'capsula': ['capsula', 'pascual', 'scapula'], 'capsular': ['capsular', 'scapular'], 'capsulate': ['aspectual', 'capsulate'], 'capsulated': ['capsulated', 'scapulated'], 'capsule': ['capsule', 'specula', 'upscale'], 'capsulectomy': ['capsulectomy', 'scapulectomy'], 'capsuler': ['capsuler', 'specular'], 'captain': ['capitan', 'captain'], 'captation': ['anaptotic', 'captation'], 'caption': ['caption', 'paction'], 'captious': ['autopsic', 'captious'], 'captor': ['captor', 'copart'], 'capture': ['capture', 'uptrace'], 'car': ['arc', 'car'], 'cara': ['arca', 'cara'], 'carabeen': ['bearance', 'carabeen'], 'carabin': ['arbacin', 'carabin', 'cariban'], 'carabini': ['arabinic', 'cabirian', 'carabini', 'cibarian'], 'caracoli': ['caracoli', 'coracial'], 'caracore': ['acrocera', 'caracore'], 'caragana': ['aracanga', 'caragana'], 'caramel': ['cameral', 'caramel', 'carmela', 'ceramal', 'reclama'], 'caranda': ['anacard', 'caranda'], 'carandas': ['carandas', 'sandarac'], 'carane': ['arcane', 'carane'], 'carangid': ['carangid', 'cardigan'], 'carapine': ['carapine', 'carpaine'], 'caravel': ['caravel', 'lavacre'], 'carbamide': ['carbamide', 'crambidae'], 'carbamine': ['carbamine', 'crambinae'], 'carbamino': ['carbamino', 'macrobian'], 'carbeen': ['carbeen', 'carbene'], 'carbene': ['carbeen', 'carbene'], 'carbo': ['carbo', 'carob', 'coarb', 'cobra'], 'carbohydride': ['carbohydride', 'hydrocarbide'], 'carbon': ['bracon', 'carbon', 'corban'], 'carbonite': ['bicornate', 'carbonite', 'reboantic'], 'carcel': ['carcel', 'cercal'], 'carcinoma': ['carcinoma', 'macaronic'], 'carcinosarcoma': ['carcinosarcoma', 'sarcocarcinoma'], 'carcoon': ['carcoon', 'raccoon'], 'cardel': ['cardel', 'cradle'], 'cardia': ['acarid', 'cardia', 'carida'], 'cardiac': ['arcadic', 'cardiac'], 'cardial': ['cardial', 'radical'], 'cardiant': ['antacrid', 'cardiant', 'radicant', 'tridacna'], 'cardigan': ['carangid', 'cardigan'], 'cardiidae': ['acrididae', 'cardiidae', 'cidaridae'], 'cardin': ['andric', 'cardin', 'rancid'], 'cardinal': ['cardinal', 'clarinda'], 'cardioid': ['cardioid', 'caridoid'], 'cardiophobe': ['brachiopode', 'cardiophobe'], 'cardo': ['cardo', 'draco'], 'cardon': ['candor', 'cardon', 'conrad'], 'cardoon': ['cardoon', 'coronad'], 'care': ['acer', 'acre', 'care', 'crea', 'race'], 'careen': ['careen', 'carene', 'enrace'], 'carene': ['careen', 'carene', 'enrace'], 'carer': ['carer', 'crare', 'racer'], 'carest': ['carest', 'caster', 'recast'], 'caret': ['caret', 'carte', 'cater', 'crate', 'creat', 'creta', 'react', 'recta', 'trace'], 'caretta': ['caretta', 'teacart', 'tearcat'], 'carful': ['carful', 'furcal'], 'carhop': ['carhop', 'paroch'], 'cariama': ['aramaic', 'cariama'], 'carian': ['acinar', 'arnica', 'canari', 'carian', 'carina', 'crania', 'narica'], 'carib': ['baric', 'carib', 'rabic'], 'cariban': ['arbacin', 'carabin', 'cariban'], 'caribi': ['cabiri', 'caribi'], 'carid': ['acrid', 'caird', 'carid', 'darci', 'daric', 'dirca'], 'carida': ['acarid', 'cardia', 'carida'], 'caridea': ['arcidae', 'caridea'], 'caridean': ['caridean', 'dircaean', 'radiance'], 'caridoid': ['cardioid', 'caridoid'], 'carina': ['acinar', 'arnica', 'canari', 'carian', 'carina', 'crania', 'narica'], 'carinal': ['carinal', 'carlina', 'clarain', 'cranial'], 'carinatae': ['acraniate', 'carinatae'], 'carinate': ['anaretic', 'arcanite', 'carinate', 'craniate'], 'carinated': ['carinated', 'eradicant'], 'cariole': ['calorie', 'cariole'], 'carious': ['carious', 'curiosa'], 'carisa': ['carisa', 'sciara'], 'carissa': ['ascaris', 'carissa'], 'cark': ['cark', 'rack'], 'carking': ['arcking', 'carking', 'racking'], 'carkingly': ['carkingly', 'rackingly'], 'carless': ['carless', 'classer', 'reclass'], 'carlet': ['carlet', 'cartel', 'claret', 'rectal', 'talcer'], 'carlie': ['carlie', 'claire', 'eclair', 'erical'], 'carlin': ['carlin', 'clarin', 'crinal'], 'carlina': ['carinal', 'carlina', 'clarain', 'cranial'], 'carlist': ['carlist', 'clarist'], 'carlo': ['alcor', 'calor', 'carlo', 'carol', 'claro', 'coral'], 'carlot': ['carlot', 'crotal'], 'carlylian': ['ancillary', 'carlylian', 'cranially'], 'carman': ['carman', 'marcan'], 'carmel': ['calmer', 'carmel', 'clamer', 'marcel', 'mercal'], 'carmela': ['cameral', 'caramel', 'carmela', 'ceramal', 'reclama'], 'carmele': ['carmele', 'cleamer'], 'carmelite': ['carmelite', 'melicerta'], 'carmeloite': ['carmeloite', 'ectromelia', 'meteorical'], 'carmine': ['armenic', 'carmine', 'ceriman', 'crimean', 'mercian'], 'carminette': ['carminette', 'remittance'], 'carminite': ['antimeric', 'carminite', 'criminate', 'metrician'], 'carmot': ['carmot', 'comart'], 'carnage': ['carnage', 'cranage', 'garance'], 'carnalite': ['carnalite', 'claretian', 'lacertian', 'nectarial'], 'carnate': ['carnate', 'cateran'], 'carnation': ['anarcotin', 'cantorian', 'carnation', 'narcotina'], 'carnationed': ['carnationed', 'dinoceratan'], 'carnelian': ['carnelian', 'encranial'], 'carneol': ['carneol', 'corneal'], 'carneous': ['carneous', 'nacreous'], 'carney': ['carney', 'craney'], 'carnic': ['cancri', 'carnic', 'cranic'], 'carniolan': ['carniolan', 'nonracial'], 'carnose': ['carnose', 'coarsen', 'narcose'], 'carnosity': ['carnosity', 'crayonist'], 'carnotite': ['carnotite', 'cortinate'], 'carnous': ['carnous', 'nacrous', 'narcous'], 'caro': ['acor', 'caro', 'cora', 'orca'], 'caroa': ['acroa', 'caroa'], 'carob': ['carbo', 'carob', 'coarb', 'cobra'], 'caroche': ['caroche', 'coacher', 'recoach'], 'caroid': ['caroid', 'cordia'], 'carol': ['alcor', 'calor', 'carlo', 'carol', 'claro', 'coral'], 'carolan': ['alcoran', 'ancoral', 'carolan'], 'carole': ['carole', 'coaler', 'coelar', 'oracle', 'recoal'], 'carolean': ['carolean', 'lecanora'], 'caroler': ['caroler', 'correal'], 'caroli': ['caroli', 'corial', 'lorica'], 'carolin': ['carolin', 'clarion', 'colarin', 'locrian'], 'carolina': ['carolina', 'conarial'], 'caroline': ['acrolein', 'arecolin', 'caroline', 'colinear', 'cornelia', 'creolian', 'lonicera'], 'carolingian': ['carolingian', 'inorganical'], 'carolus': ['carolus', 'oscular'], 'carom': ['carom', 'coram', 'macro', 'marco'], 'carone': ['carone', 'cornea'], 'caroon': ['caroon', 'corona', 'racoon'], 'carotenoid': ['carotenoid', 'coronadite', 'decoration'], 'carotic': ['acrotic', 'carotic'], 'carotid': ['arctoid', 'carotid', 'dartoic'], 'carotidean': ['arctoidean', 'carotidean', 'cordaitean', 'dinocerata'], 'carotin': ['anticor', 'carotin', 'cortina', 'ontaric'], 'carouse': ['acerous', 'carouse', 'euscaro'], 'carp': ['carp', 'crap'], 'carpaine': ['carapine', 'carpaine'], 'carpel': ['carpel', 'parcel', 'placer'], 'carpellary': ['carpellary', 'parcellary'], 'carpellate': ['carpellate', 'parcellate', 'prelacteal'], 'carpent': ['carpent', 'precant'], 'carpet': ['carpet', 'peract', 'preact'], 'carpholite': ['carpholite', 'proethical'], 'carpid': ['caprid', 'carpid', 'picard'], 'carpiodes': ['carpiodes', 'scorpidae'], 'carpocerite': ['carpocerite', 'reciprocate'], 'carpogonial': ['carpogonial', 'coprolagnia'], 'carpolite': ['carpolite', 'petricola'], 'carpolith': ['carpolith', 'politarch', 'trophical'], 'carposperm': ['carposperm', 'spermocarp'], 'carrot': ['carrot', 'trocar'], 'carroter': ['arrector', 'carroter'], 'carse': ['carse', 'caser', 'ceras', 'scare', 'scrae'], 'carsmith': ['carsmith', 'chartism'], 'cartable': ['bracteal', 'cartable'], 'carte': ['caret', 'carte', 'cater', 'crate', 'creat', 'creta', 'react', 'recta', 'trace'], 'cartel': ['carlet', 'cartel', 'claret', 'rectal', 'talcer'], 'cartelize': ['cartelize', 'zelatrice'], 'carter': ['arrect', 'carter', 'crater', 'recart', 'tracer'], 'cartesian': ['ascertain', 'cartesian', 'cartisane', 'sectarian'], 'cartesianism': ['cartesianism', 'sectarianism'], 'cartier': ['cartier', 'cirrate', 'erratic'], 'cartilage': ['cartilage', 'rectalgia'], 'cartisane': ['ascertain', 'cartesian', 'cartisane', 'sectarian'], 'cartist': ['astrict', 'cartist', 'stratic'], 'carton': ['cantor', 'carton', 'contra'], 'cartoon': ['cartoon', 'coranto'], 'cartoonist': ['cartoonist', 'scortation'], 'carty': ['carty', 'tracy'], 'carua': ['aruac', 'carua'], 'carucal': ['accrual', 'carucal'], 'carucate': ['accurate', 'carucate'], 'carum': ['carum', 'cumar'], 'carve': ['carve', 'crave', 'varec'], 'carvel': ['calver', 'carvel', 'claver'], 'carven': ['carven', 'cavern', 'craven'], 'carver': ['carver', 'craver'], 'carving': ['carving', 'craving'], 'cary': ['cary', 'racy'], 'caryl': ['acryl', 'caryl', 'clary'], 'casabe': ['casabe', 'sabeca'], 'casal': ['calas', 'casal', 'scala'], 'cascade': ['cascade', 'saccade'], 'case': ['case', 'esca'], 'casebook': ['bookcase', 'casebook'], 'caseful': ['caseful', 'fucales'], 'casein': ['casein', 'incase'], 'casel': ['alces', 'casel', 'scale'], 'caser': ['carse', 'caser', 'ceras', 'scare', 'scrae'], 'casern': ['casern', 'rescan'], 'cashable': ['cashable', 'chasable'], 'cashel': ['cashel', 'laches', 'sealch'], 'cask': ['cask', 'sack'], 'casket': ['casket', 'tesack'], 'casking': ['casking', 'sacking'], 'casklike': ['casklike', 'sacklike'], 'casper': ['casper', 'escarp', 'parsec', 'scrape', 'secpar', 'spacer'], 'caspian': ['capsian', 'caspian', 'nascapi', 'panisca'], 'casque': ['casque', 'sacque'], 'casquet': ['acquest', 'casquet'], 'casse': ['casse', 'scase'], 'cassian': ['cassian', 'cassina'], 'cassina': ['cassian', 'cassina'], 'cassino': ['caisson', 'cassino'], 'cassock': ['cassock', 'cossack'], 'cast': ['acts', 'cast', 'scat'], 'castalia': ['castalia', 'sacalait'], 'castalian': ['castalian', 'satanical'], 'caste': ['caste', 'sceat'], 'castelet': ['castelet', 'telecast'], 'caster': ['carest', 'caster', 'recast'], 'castice': ['ascetic', 'castice', 'siccate'], 'castle': ['castle', 'sclate'], 'castoff': ['castoff', 'offcast'], 'castor': ['arctos', 'castor', 'costar', 'scrota'], 'castores': ['castores', 'coassert'], 'castoreum': ['castoreum', 'outscream'], 'castoridae': ['castoridae', 'cestodaria'], 'castorin': ['cantoris', 'castorin', 'corsaint'], 'castra': ['castra', 'tarasc'], 'casual': ['ascula', 'calusa', 'casual', 'casula', 'causal'], 'casuality': ['casuality', 'causality'], 'casually': ['casually', 'causally'], 'casula': ['ascula', 'calusa', 'casual', 'casula', 'causal'], 'cat': ['act', 'cat'], 'catabolin': ['botanical', 'catabolin'], 'catalan': ['cantala', 'catalan', 'lantaca'], 'catalanist': ['anastaltic', 'catalanist'], 'catalase': ['catalase', 'salaceta'], 'catalinite': ['analcitite', 'catalinite'], 'catalogue': ['catalogue', 'coagulate'], 'catalyte': ['catalyte', 'cattleya'], 'catamenial': ['calamitean', 'catamenial'], 'catapultier': ['catapultier', 'particulate'], 'cataria': ['acratia', 'cataria'], 'catcher': ['catcher', 'recatch'], 'catchup': ['catchup', 'upcatch'], 'cate': ['cate', 'teca'], 'catechin': ['atechnic', 'catechin', 'technica'], 'catechism': ['catechism', 'schematic'], 'catechol': ['catechol', 'coachlet'], 'categoric': ['categoric', 'geocratic'], 'catella': ['catella', 'lacteal'], 'catenated': ['catenated', 'decantate'], 'cater': ['caret', 'carte', 'cater', 'crate', 'creat', 'creta', 'react', 'recta', 'trace'], 'cateran': ['carnate', 'cateran'], 'caterer': ['caterer', 'recrate', 'retrace', 'terrace'], 'cateress': ['cateress', 'cerastes'], 'catfish': ['catfish', 'factish'], 'cathari': ['cathari', 'chirata', 'cithara'], 'catharina': ['anthracia', 'antiarcha', 'catharina'], 'cathartae': ['cathartae', 'tracheata'], 'cathepsin': ['cathepsin', 'stephanic'], 'catherine': ['catherine', 'heritance'], 'catheter': ['catheter', 'charette'], 'cathine': ['cahnite', 'cathine'], 'cathinine': ['anchietin', 'cathinine'], 'cathion': ['cathion', 'chatino'], 'cathograph': ['cathograph', 'tachograph'], 'cathole': ['cathole', 'cholate'], 'cathro': ['cathro', 'orchat'], 'cathryn': ['cathryn', 'chantry'], 'cathy': ['cathy', 'cyath', 'yacht'], 'cation': ['action', 'atonic', 'cation'], 'cationic': ['aconitic', 'cationic', 'itaconic'], 'catkin': ['catkin', 'natick'], 'catlin': ['catlin', 'tincal'], 'catlinite': ['catlinite', 'intactile'], 'catmalison': ['catmalison', 'monastical'], 'catoism': ['atomics', 'catoism', 'cosmati', 'osmatic', 'somatic'], 'catonian': ['catonian', 'taconian'], 'catonic': ['cantico', 'catonic', 'taconic'], 'catonism': ['catonism', 'monastic'], 'catoptric': ['catoptric', 'protactic'], 'catpipe': ['apeptic', 'catpipe'], 'catstone': ['catstone', 'constate'], 'catsup': ['catsup', 'upcast'], 'cattail': ['attical', 'cattail'], 'catti': ['attic', 'catti', 'tacit'], 'cattily': ['cattily', 'tacitly'], 'cattiness': ['cattiness', 'tacitness'], 'cattle': ['cattle', 'tectal'], 'cattleya': ['catalyte', 'cattleya'], 'catvine': ['catvine', 'venatic'], 'caucho': ['cachou', 'caucho'], 'cauda': ['cadua', 'cauda'], 'caudle': ['caudle', 'cedula', 'claude'], 'caudodorsal': ['caudodorsal', 'dorsocaudal'], 'caudofemoral': ['caudofemoral', 'femorocaudal'], 'caudolateral': ['caudolateral', 'laterocaudal'], 'caul': ['caul', 'ucal'], 'cauld': ['cauld', 'ducal'], 'caules': ['caelus', 'caules', 'clause'], 'cauliform': ['cauliform', 'formulaic', 'fumarolic'], 'caulinar': ['anicular', 'caulinar'], 'caulis': ['caulis', 'clusia', 'sicula'], 'caulite': ['aleutic', 'auletic', 'caulite', 'lutecia'], 'caulome': ['caulome', 'leucoma'], 'caulomic': ['caulomic', 'coumalic'], 'caulote': ['caulote', 'colutea', 'oculate'], 'caunch': ['caunch', 'cuchan'], 'caurale': ['arcuale', 'caurale'], 'causal': ['ascula', 'calusa', 'casual', 'casula', 'causal'], 'causality': ['casuality', 'causality'], 'causally': ['casually', 'causally'], 'cause': ['cause', 'sauce'], 'causeless': ['causeless', 'sauceless'], 'causer': ['causer', 'saucer'], 'causey': ['causey', 'cayuse'], 'cautelous': ['cautelous', 'lutaceous'], 'cauter': ['acture', 'cauter', 'curate'], 'caution': ['auction', 'caution'], 'cautionary': ['auctionary', 'cautionary'], 'cautioner': ['cautioner', 'cointreau'], 'caval': ['caval', 'clava'], 'cavalry': ['calvary', 'cavalry'], 'cavate': ['cavate', 'caveat', 'vacate'], 'caveat': ['cavate', 'caveat', 'vacate'], 'cavel': ['calve', 'cavel', 'clave'], 'cavern': ['carven', 'cavern', 'craven'], 'cavil': ['cavil', 'lavic'], 'caviler': ['caliver', 'caviler', 'claiver', 'clavier', 'valeric', 'velaric'], 'cavillation': ['cavillation', 'vacillation'], 'cavitate': ['activate', 'cavitate'], 'cavitation': ['activation', 'cavitation'], 'cavitied': ['cavitied', 'vaticide'], 'caw': ['caw', 'wac'], 'cawk': ['cawk', 'wack'], 'cawky': ['cawky', 'wacky'], 'cayapa': ['cayapa', 'pacaya'], 'cayuse': ['causey', 'cayuse'], 'ccoya': ['accoy', 'ccoya'], 'ceanothus': ['ceanothus', 'oecanthus'], 'cearin': ['acerin', 'cearin'], 'cebalrai': ['balearic', 'cebalrai'], 'ceboid': ['bodice', 'ceboid'], 'cebur': ['bruce', 'cebur', 'cuber'], 'cecily': ['cecily', 'cicely'], 'cedar': ['acred', 'cader', 'cadre', 'cedar'], 'cedarn': ['cedarn', 'dancer', 'nacred'], 'cedent': ['cedent', 'decent'], 'ceder': ['ceder', 'cedre', 'cered', 'creed'], 'cedrat': ['cedrat', 'decart', 'redact'], 'cedrate': ['cedrate', 'cerated'], 'cedre': ['ceder', 'cedre', 'cered', 'creed'], 'cedrela': ['cedrela', 'creedal', 'declare'], 'cedrin': ['cedrin', 'cinder', 'crined'], 'cedriret': ['cedriret', 'directer', 'recredit', 'redirect'], 'cedrol': ['cedrol', 'colder', 'cordel'], 'cedron': ['cedron', 'conred'], 'cedrus': ['cedrus', 'cursed'], 'cedry': ['cedry', 'decry'], 'cedula': ['caudle', 'cedula', 'claude'], 'ceilinged': ['ceilinged', 'diligence'], 'celadonite': ['caledonite', 'celadonite'], 'celandine': ['celandine', 'decennial'], 'celarent': ['celarent', 'centrale', 'enclaret'], 'celature': ['celature', 'ulcerate'], 'celebrate': ['celebrate', 'erectable'], 'celebrated': ['braceleted', 'celebrated'], 'celemin': ['celemin', 'melenic'], 'celia': ['alice', 'celia', 'ileac'], 'cellar': ['caller', 'cellar', 'recall'], 'cellaret': ['allecret', 'cellaret'], 'celloid': ['celloid', 'codille', 'collide', 'collied'], 'celloidin': ['celloidin', 'collidine', 'decillion'], 'celsian': ['celsian', 'escalin', 'sanicle', 'secalin'], 'celtiberi': ['celtiberi', 'terebilic'], 'celtis': ['celtis', 'clites'], 'cembalist': ['blastemic', 'cembalist'], 'cementer': ['cementer', 'cerement', 'recement'], 'cendre': ['cendre', 'decern'], 'cenosity': ['cenosity', 'cytosine'], 'cense': ['cense', 'scene', 'sence'], 'censer': ['censer', 'scerne', 'screen', 'secern'], 'censerless': ['censerless', 'screenless'], 'censorial': ['censorial', 'sarcoline'], 'censual': ['censual', 'unscale'], 'censureless': ['censureless', 'recluseness'], 'cental': ['cantle', 'cental', 'lancet', 'tancel'], 'centare': ['centare', 'crenate'], 'centaur': ['centaur', 'untrace'], 'centauri': ['anuretic', 'centauri', 'centuria', 'teucrian'], 'centaury': ['centaury', 'cyanuret'], 'centena': ['canteen', 'centena'], 'centenar': ['centenar', 'entrance'], 'centenier': ['centenier', 'renitence'], 'center': ['center', 'recent', 'tenrec'], 'centered': ['centered', 'decenter', 'decentre', 'recedent'], 'centerer': ['centerer', 'recenter', 'recentre', 'terrence'], 'centermost': ['centermost', 'escortment'], 'centesimal': ['centesimal', 'lemniscate'], 'centiar': ['centiar', 'certain', 'citrean', 'nacrite', 'nectria'], 'centiare': ['aneretic', 'centiare', 'creatine', 'increate', 'iterance'], 'centibar': ['bacterin', 'centibar'], 'centimeter': ['centimeter', 'recitement', 'remittence'], 'centimo': ['centimo', 'entomic', 'tecomin'], 'centimolar': ['centimolar', 'melicraton'], 'centinormal': ['centinormal', 'conterminal', 'nonmetrical'], 'cento': ['cento', 'conte', 'tecon'], 'centrad': ['cantred', 'centrad', 'tranced'], 'centrale': ['celarent', 'centrale', 'enclaret'], 'centranth': ['centranth', 'trenchant'], 'centraxonia': ['centraxonia', 'excarnation'], 'centriole': ['centriole', 'electrion', 'relection'], 'centrodorsal': ['centrodorsal', 'dorsocentral'], 'centroid': ['centroid', 'doctrine'], 'centrolineal': ['centrolineal', 'crenellation'], 'centunculus': ['centunculus', 'unsucculent'], 'centuria': ['anuretic', 'centauri', 'centuria', 'teucrian'], 'centurial': ['centurial', 'lucretian', 'ultranice'], 'centuried': ['centuried', 'unrecited'], 'centurion': ['centurion', 'continuer', 'cornutine'], 'cepa': ['cape', 'cepa', 'pace'], 'cephalin': ['alphenic', 'cephalin'], 'cephalina': ['cephalina', 'epilachna'], 'cephaloid': ['cephaloid', 'pholcidae'], 'cephalomeningitis': ['cephalomeningitis', 'meningocephalitis'], 'cephalometric': ['cephalometric', 'petrochemical'], 'cephalopodous': ['cephalopodous', 'podocephalous'], 'cephas': ['cephas', 'pesach'], 'cepolidae': ['adipocele', 'cepolidae', 'ploceidae'], 'ceps': ['ceps', 'spec'], 'ceptor': ['ceptor', 'copter'], 'ceral': ['ceral', 'clare', 'clear', 'lacer'], 'ceramal': ['cameral', 'caramel', 'carmela', 'ceramal', 'reclama'], 'ceramic': ['ceramic', 'racemic'], 'ceramist': ['camerist', 'ceramist', 'matrices'], 'ceras': ['carse', 'caser', 'ceras', 'scare', 'scrae'], 'cerasein': ['cerasein', 'increase'], 'cerasin': ['arsenic', 'cerasin', 'sarcine'], 'cerastes': ['cateress', 'cerastes'], 'cerata': ['arcate', 'cerata'], 'cerate': ['cerate', 'create', 'ecarte'], 'cerated': ['cedrate', 'cerated'], 'ceratiid': ['ceratiid', 'raticide'], 'ceration': ['actioner', 'anerotic', 'ceration', 'creation', 'reaction'], 'ceratium': ['ceratium', 'muricate'], 'ceratonia': ['canariote', 'ceratonia'], 'ceratosa': ['ceratosa', 'ostracea'], 'ceratothecal': ['ceratothecal', 'chloracetate'], 'cerberic': ['cerberic', 'cerebric'], 'cercal': ['carcel', 'cercal'], 'cerci': ['cerci', 'ceric', 'cicer', 'circe'], 'cercus': ['cercus', 'cruces'], 'cerdonian': ['cerdonian', 'ordinance'], 'cere': ['cere', 'cree'], 'cereal': ['alerce', 'cereal', 'relace'], 'cerealin': ['cerealin', 'cinereal', 'reliance'], 'cerebra': ['cerebra', 'rebrace'], 'cerebric': ['cerberic', 'cerebric'], 'cerebroma': ['cerebroma', 'embraceor'], 'cerebromeningitis': ['cerebromeningitis', 'meningocerebritis'], 'cerebrum': ['cerebrum', 'cumberer'], 'cered': ['ceder', 'cedre', 'cered', 'creed'], 'cerement': ['cementer', 'cerement', 'recement'], 'ceremonial': ['ceremonial', 'neomiracle'], 'ceresin': ['ceresin', 'sincere'], 'cereus': ['cereus', 'ceruse', 'recuse', 'rescue', 'secure'], 'cerevis': ['cerevis', 'scrieve', 'service'], 'ceria': ['acier', 'aeric', 'ceria', 'erica'], 'ceric': ['cerci', 'ceric', 'cicer', 'circe'], 'ceride': ['ceride', 'deicer'], 'cerillo': ['cerillo', 'colleri', 'collier'], 'ceriman': ['armenic', 'carmine', 'ceriman', 'crimean', 'mercian'], 'cerin': ['cerin', 'crine'], 'cerion': ['cerion', 'coiner', 'neroic', 'orcein', 'recoin'], 'ceriops': ['ceriops', 'persico'], 'cerite': ['cerite', 'certie', 'recite', 'tierce'], 'cerium': ['cerium', 'uremic'], 'cernuous': ['cernuous', 'coenurus'], 'cero': ['cero', 'core'], 'ceroma': ['ceroma', 'corema'], 'ceroplast': ['ceroplast', 'precostal'], 'ceroplastic': ['ceroplastic', 'cleistocarp', 'coreplastic'], 'ceroplasty': ['ceroplasty', 'coreplasty'], 'cerotic': ['cerotic', 'orectic'], 'cerotin': ['cerotin', 'cointer', 'cotrine', 'cretion', 'noticer', 'rection'], 'cerous': ['cerous', 'course', 'crouse', 'source'], 'certain': ['centiar', 'certain', 'citrean', 'nacrite', 'nectria'], 'certhia': ['certhia', 'rhaetic', 'theriac'], 'certie': ['cerite', 'certie', 'recite', 'tierce'], 'certifiable': ['certifiable', 'rectifiable'], 'certification': ['certification', 'cretification', 'rectification'], 'certificative': ['certificative', 'rectificative'], 'certificator': ['certificator', 'rectificator'], 'certificatory': ['certificatory', 'rectificatory'], 'certified': ['certified', 'rectified'], 'certifier': ['certifier', 'rectifier'], 'certify': ['certify', 'cretify', 'rectify'], 'certis': ['certis', 'steric'], 'certitude': ['certitude', 'rectitude'], 'certosina': ['atroscine', 'certosina', 'ostracine', 'tinoceras', 'tricosane'], 'certosino': ['certosino', 'cortisone', 'socotrine'], 'cerulean': ['cerulean', 'laurence'], 'ceruminal': ['ceruminal', 'melanuric', 'numerical'], 'ceruse': ['cereus', 'ceruse', 'recuse', 'rescue', 'secure'], 'cervicobuccal': ['buccocervical', 'cervicobuccal'], 'cervicodorsal': ['cervicodorsal', 'dorsocervical'], 'cervicodynia': ['cervicodynia', 'corycavidine'], 'cervicofacial': ['cervicofacial', 'faciocervical'], 'cervicolabial': ['cervicolabial', 'labiocervical'], 'cervicovesical': ['cervicovesical', 'vesicocervical'], 'cervoid': ['cervoid', 'divorce'], 'cervuline': ['cervuline', 'virulence'], 'ceryl': ['ceryl', 'clyer'], 'cerynean': ['ancyrene', 'cerynean'], 'cesare': ['cesare', 'crease', 'recase', 'searce'], 'cesarolite': ['cesarolite', 'esoterical'], 'cesium': ['cesium', 'miscue'], 'cesser': ['cesser', 'recess'], 'cession': ['cession', 'oscines'], 'cessor': ['cessor', 'crosse', 'scorse'], 'cest': ['cest', 'sect'], 'cestodaria': ['castoridae', 'cestodaria'], 'cestrian': ['canister', 'cestrian', 'cisterna', 'irascent'], 'cetane': ['cetane', 'tenace'], 'cetene': ['cetene', 'ectene'], 'ceti': ['ceti', 'cite', 'tice'], 'cetid': ['cetid', 'edict'], 'cetomorphic': ['cetomorphic', 'chemotropic', 'ectomorphic'], 'cetonia': ['acetoin', 'aconite', 'anoetic', 'antoeci', 'cetonia'], 'cetonian': ['cetonian', 'enaction'], 'cetorhinus': ['cetorhinus', 'urosthenic'], 'cetus': ['cetus', 'scute'], 'cevenol': ['cevenol', 'clovene'], 'cevine': ['cevine', 'evince', 'venice'], 'cha': ['ach', 'cha'], 'chab': ['bach', 'chab'], 'chabouk': ['chabouk', 'chakobu'], 'chaco': ['chaco', 'choca', 'coach'], 'chacte': ['cachet', 'chacte'], 'chaenolobus': ['chaenolobus', 'unchoosable'], 'chaeta': ['achate', 'chaeta'], 'chaetites': ['aesthetic', 'chaetites'], 'chaetognath': ['chaetognath', 'gnathotheca'], 'chaetopod': ['chaetopod', 'podotheca'], 'chafer': ['chafer', 'frache'], 'chagan': ['chagan', 'changa'], 'chagrin': ['arching', 'chagrin'], 'chai': ['chai', 'chia'], 'chain': ['chain', 'chian', 'china'], 'chained': ['chained', 'echidna'], 'chainer': ['chainer', 'enchair', 'rechain'], 'chainlet': ['chainlet', 'ethnical'], 'chainman': ['chainman', 'chinaman'], 'chair': ['chair', 'chria'], 'chairer': ['chairer', 'charier'], 'chait': ['aitch', 'chait', 'chati', 'chita', 'taich', 'tchai'], 'chakar': ['chakar', 'chakra', 'charka'], 'chakari': ['chakari', 'chikara', 'kachari'], 'chakobu': ['chabouk', 'chakobu'], 'chakra': ['chakar', 'chakra', 'charka'], 'chalcon': ['chalcon', 'clochan', 'conchal'], 'chalcosine': ['ascolichen', 'chalcosine'], 'chaldron': ['chaldron', 'chlordan', 'chondral'], 'chalet': ['achtel', 'chalet', 'thecal', 'thecla'], 'chalker': ['chalker', 'hackler'], 'chalky': ['chalky', 'hackly'], 'challie': ['alichel', 'challie', 'helical'], 'chalmer': ['chalmer', 'charmel'], 'chalon': ['chalon', 'lochan'], 'chalone': ['chalone', 'cholane'], 'chalta': ['caltha', 'chalta'], 'chamal': ['almach', 'chamal'], 'chamar': ['chamar', 'machar'], 'chamber': ['becharm', 'brecham', 'chamber'], 'chamberer': ['chamberer', 'rechamber'], 'chamian': ['chamian', 'mahican'], 'chamisal': ['chamisal', 'chiasmal'], 'chamiso': ['chamiso', 'chamois'], 'chamite': ['chamite', 'hematic'], 'chamois': ['chamiso', 'chamois'], 'champa': ['champa', 'mapach'], 'champain': ['champain', 'chinampa'], 'chancer': ['chancer', 'chancre'], 'chanchito': ['chanchito', 'nachitoch'], 'chanco': ['chanco', 'concha'], 'chancre': ['chancer', 'chancre'], 'chandu': ['chandu', 'daunch'], 'chane': ['achen', 'chane', 'chena', 'hance'], 'chang': ['chang', 'ganch'], 'changa': ['chagan', 'changa'], 'changer': ['changer', 'genarch'], 'chanidae': ['chanidae', 'hacienda'], 'channeler': ['channeler', 'encharnel'], 'chanst': ['chanst', 'snatch', 'stanch'], 'chant': ['chant', 'natch'], 'chanter': ['chanter', 'rechant'], 'chantey': ['atechny', 'chantey'], 'chantry': ['cathryn', 'chantry'], 'chaos': ['chaos', 'oshac'], 'chaotical': ['acatholic', 'chaotical'], 'chap': ['caph', 'chap'], 'chaparro': ['chaparro', 'parachor'], 'chape': ['chape', 'cheap', 'peach'], 'chaped': ['chaped', 'phecda'], 'chapel': ['chapel', 'lepcha', 'pleach'], 'chapelet': ['chapelet', 'peachlet'], 'chapelmaster': ['chapelmaster', 'spermathecal'], 'chaperno': ['canephor', 'chaperno', 'chaperon'], 'chaperon': ['canephor', 'chaperno', 'chaperon'], 'chaperone': ['canephore', 'chaperone'], 'chaperonless': ['chaperonless', 'proseneschal'], 'chapin': ['apinch', 'chapin', 'phanic'], 'chapiter': ['chapiter', 'phreatic'], 'chaps': ['chaps', 'pasch'], 'chapt': ['chapt', 'pacht', 'patch'], 'chapter': ['chapter', 'patcher', 'repatch'], 'char': ['arch', 'char', 'rach'], 'chara': ['achar', 'chara'], 'charac': ['charac', 'charca'], 'characin': ['anarchic', 'characin'], 'characinoid': ['arachidonic', 'characinoid'], 'charadrii': ['charadrii', 'richardia'], 'charas': ['achras', 'charas'], 'charbon': ['brochan', 'charbon'], 'charca': ['charac', 'charca'], 'chare': ['acher', 'arche', 'chare', 'chera', 'rache', 'reach'], 'charer': ['archer', 'charer', 'rechar'], 'charette': ['catheter', 'charette'], 'charge': ['charge', 'creagh'], 'charier': ['chairer', 'charier'], 'chariot': ['chariot', 'haricot'], 'charioted': ['charioted', 'trochidae'], 'chariotman': ['achromatin', 'chariotman', 'machinator'], 'charism': ['charism', 'chrisma'], 'charisma': ['archaism', 'charisma'], 'chark': ['chark', 'karch'], 'charka': ['chakar', 'chakra', 'charka'], 'charlatanistic': ['antarchistical', 'charlatanistic'], 'charleen': ['charleen', 'charlene'], 'charlene': ['charleen', 'charlene'], 'charles': ['charles', 'clasher'], 'charm': ['charm', 'march'], 'charmel': ['chalmer', 'charmel'], 'charmer': ['charmer', 'marcher', 'remarch'], 'charnel': ['charnel', 'larchen'], 'charon': ['anchor', 'archon', 'charon', 'rancho'], 'charpoy': ['charpoy', 'corypha'], 'chart': ['chart', 'ratch'], 'charter': ['charter', 'ratcher'], 'charterer': ['charterer', 'recharter'], 'charting': ['charting', 'ratching'], 'chartism': ['carsmith', 'chartism'], 'charuk': ['charuk', 'chukar'], 'chary': ['archy', 'chary'], 'chasable': ['cashable', 'chasable'], 'chaser': ['arches', 'chaser', 'eschar', 'recash', 'search'], 'chasma': ['ascham', 'chasma'], 'chaste': ['chaste', 'sachet', 'scathe', 'scheat'], 'chasten': ['chasten', 'sanetch'], 'chastener': ['chastener', 'rechasten'], 'chastity': ['chastity', 'yachtist'], 'chasuble': ['chasuble', 'subchela'], 'chat': ['chat', 'tach'], 'chatelainry': ['chatelainry', 'trachylinae'], 'chati': ['aitch', 'chait', 'chati', 'chita', 'taich', 'tchai'], 'chatino': ['cathion', 'chatino'], 'chatsome': ['chatsome', 'moschate'], 'chatta': ['attach', 'chatta'], 'chattation': ['chattation', 'thanatotic'], 'chattel': ['chattel', 'latchet'], 'chatter': ['chatter', 'ratchet'], 'chattery': ['chattery', 'ratchety', 'trachyte'], 'chatti': ['chatti', 'hattic'], 'chatty': ['chatty', 'tatchy'], 'chatwood': ['chatwood', 'woodchat'], 'chaute': ['chaute', 'chueta'], 'chawan': ['chawan', 'chwana', 'wachna'], 'chawer': ['chawer', 'rechaw'], 'chawk': ['chawk', 'whack'], 'chay': ['achy', 'chay'], 'cheap': ['chape', 'cheap', 'peach'], 'cheapen': ['cheapen', 'peachen'], 'cheapery': ['cheapery', 'peachery'], 'cheapside': ['cheapside', 'sphecidae'], 'cheat': ['cheat', 'tache', 'teach', 'theca'], 'cheatable': ['cheatable', 'teachable'], 'cheatableness': ['cheatableness', 'teachableness'], 'cheater': ['cheater', 'hectare', 'recheat', 'reteach', 'teacher'], 'cheatery': ['cheatery', 'cytherea', 'teachery'], 'cheating': ['cheating', 'teaching'], 'cheatingly': ['cheatingly', 'teachingly'], 'cheatrie': ['cheatrie', 'hetaeric'], 'checker': ['checker', 'recheck'], 'chee': ['chee', 'eche'], 'cheek': ['cheek', 'cheke', 'keech'], 'cheerer': ['cheerer', 'recheer'], 'cheerly': ['cheerly', 'lechery'], 'cheery': ['cheery', 'reechy'], 'cheet': ['cheet', 'hecte'], 'cheir': ['cheir', 'rheic'], 'cheiropodist': ['cheiropodist', 'coeditorship'], 'cheka': ['cheka', 'keach'], 'cheke': ['cheek', 'cheke', 'keech'], 'chela': ['chela', 'lache', 'leach'], 'chelide': ['chelide', 'heliced'], 'chelidon': ['chelidon', 'chelonid', 'delichon'], 'chelidonate': ['chelidonate', 'endothecial'], 'chelodina': ['chelodina', 'hedonical'], 'chelone': ['chelone', 'echelon'], 'chelonid': ['chelidon', 'chelonid', 'delichon'], 'cheloniid': ['cheloniid', 'lichenoid'], 'chemiatrist': ['chemiatrist', 'chrismatite', 'theatricism'], 'chemical': ['alchemic', 'chemical'], 'chemicomechanical': ['chemicomechanical', 'mechanicochemical'], 'chemicophysical': ['chemicophysical', 'physicochemical'], 'chemicovital': ['chemicovital', 'vitochemical'], 'chemiloon': ['chemiloon', 'homocline'], 'chemotaxy': ['chemotaxy', 'myxotheca'], 'chemotropic': ['cetomorphic', 'chemotropic', 'ectomorphic'], 'chena': ['achen', 'chane', 'chena', 'hance'], 'chenica': ['chenica', 'chicane'], 'chenille': ['chenille', 'hellenic'], 'chenopod': ['chenopod', 'ponchoed'], 'chera': ['acher', 'arche', 'chare', 'chera', 'rache', 'reach'], 'chermes': ['chermes', 'schemer'], 'chert': ['chert', 'retch'], 'cherte': ['cherte', 'etcher'], 'chervil': ['chervil', 'chilver'], 'cheson': ['cheson', 'chosen', 'schone'], 'chest': ['chest', 'stech'], 'chestily': ['chestily', 'lecythis'], 'chesty': ['chesty', 'scythe'], 'chet': ['chet', 'etch', 'tche', 'tech'], 'chettik': ['chettik', 'thicket'], 'chetty': ['chetty', 'tetchy'], 'chewer': ['chewer', 'rechew'], 'chewink': ['chewink', 'whicken'], 'chi': ['chi', 'hic', 'ich'], 'chia': ['chai', 'chia'], 'chiam': ['chiam', 'machi', 'micah'], 'chian': ['chain', 'chian', 'china'], 'chiasmal': ['chamisal', 'chiasmal'], 'chiastolite': ['chiastolite', 'heliostatic'], 'chicane': ['chenica', 'chicane'], 'chicle': ['chicle', 'cliche'], 'chid': ['chid', 'dich'], 'chider': ['chider', 'herdic'], 'chidra': ['chidra', 'diarch'], 'chief': ['chief', 'fiche'], 'chield': ['chield', 'childe'], 'chien': ['chien', 'chine', 'niche'], 'chikara': ['chakari', 'chikara', 'kachari'], 'chil': ['chil', 'lich'], 'childe': ['chield', 'childe'], 'chilean': ['chilean', 'echinal', 'nichael'], 'chili': ['chili', 'lichi'], 'chiliasm': ['chiliasm', 'hilasmic', 'machilis'], 'chilla': ['achill', 'cahill', 'chilla'], 'chiloma': ['chiloma', 'malicho'], 'chilopod': ['chilopod', 'pholcoid'], 'chilopoda': ['chilopoda', 'haplodoci'], 'chilostome': ['chilostome', 'schooltime'], 'chilver': ['chervil', 'chilver'], 'chimane': ['chimane', 'machine'], 'chime': ['chime', 'hemic', 'miche'], 'chimer': ['chimer', 'mechir', 'micher'], 'chimera': ['chimera', 'hermaic'], 'chimney': ['chimney', 'hymenic'], 'chimu': ['chimu', 'humic'], 'chin': ['chin', 'inch'], 'china': ['chain', 'chian', 'china'], 'chinaman': ['chainman', 'chinaman'], 'chinampa': ['champain', 'chinampa'], 'chinanta': ['acanthin', 'chinanta'], 'chinar': ['chinar', 'inarch'], 'chine': ['chien', 'chine', 'niche'], 'chined': ['chined', 'inched'], 'chink': ['chink', 'kinch'], 'chinkle': ['chinkle', 'kelchin'], 'chinks': ['chinks', 'skinch'], 'chinoa': ['chinoa', 'noahic'], 'chinotti': ['chinotti', 'tithonic'], 'chint': ['chint', 'nitch'], 'chiolite': ['chiolite', 'eolithic'], 'chionididae': ['chionididae', 'onchidiidae'], 'chiral': ['archil', 'chiral'], 'chirapsia': ['chirapsia', 'pharisaic'], 'chirata': ['cathari', 'chirata', 'cithara'], 'chiro': ['chiro', 'choir', 'ichor'], 'chiromancist': ['chiromancist', 'monarchistic'], 'chiromant': ['chiromant', 'chromatin'], 'chiromantic': ['chiromantic', 'chromatinic'], 'chiromantis': ['anchoritism', 'chiromantis', 'chrismation', 'harmonistic'], 'chirometer': ['chirometer', 'rheometric'], 'chiroplasty': ['chiroplasty', 'polyarchist'], 'chiropter': ['chiropter', 'peritroch'], 'chirosophist': ['chirosophist', 'opisthorchis'], 'chirotes': ['chirotes', 'theorics'], 'chirotype': ['chirotype', 'hypocrite'], 'chirp': ['chirp', 'prich'], 'chirper': ['chirper', 'prerich'], 'chiseler': ['chiseler', 'rechisel'], 'chit': ['chit', 'itch', 'tchi'], 'chita': ['aitch', 'chait', 'chati', 'chita', 'taich', 'tchai'], 'chital': ['chital', 'claith'], 'chitinoid': ['chitinoid', 'dithionic'], 'chitosan': ['atchison', 'chitosan'], 'chitose': ['chitose', 'echoist'], 'chloe': ['chloe', 'choel'], 'chloracetate': ['ceratothecal', 'chloracetate'], 'chloranthy': ['chloranthy', 'rhynchotal'], 'chlorate': ['chlorate', 'trochlea'], 'chlordan': ['chaldron', 'chlordan', 'chondral'], 'chlore': ['chlore', 'choler', 'orchel'], 'chloremia': ['chloremia', 'homerical'], 'chlorinate': ['chlorinate', 'ectorhinal', 'tornachile'], 'chlorite': ['chlorite', 'clothier'], 'chloritic': ['chloritic', 'trochilic'], 'chloroamine': ['chloroamine', 'melanochroi'], 'chloroanaemia': ['aeolharmonica', 'chloroanaemia'], 'chloroanemia': ['chloroanemia', 'choleromania'], 'chloroiodide': ['chloroiodide', 'iodochloride'], 'chloroplatinic': ['chloroplatinic', 'platinochloric'], 'cho': ['cho', 'och'], 'choana': ['aonach', 'choana'], 'choca': ['chaco', 'choca', 'coach'], 'choco': ['choco', 'hocco'], 'choel': ['chloe', 'choel'], 'choenix': ['choenix', 'hexonic'], 'choes': ['choes', 'chose'], 'choiak': ['choiak', 'kochia'], 'choice': ['choice', 'echoic'], 'choil': ['choil', 'choli', 'olchi'], 'choir': ['chiro', 'choir', 'ichor'], 'choirman': ['choirman', 'harmonic', 'omniarch'], 'choker': ['choker', 'hocker'], 'choky': ['choky', 'hocky'], 'chol': ['chol', 'loch'], 'chola': ['chola', 'loach', 'olcha'], 'cholane': ['chalone', 'cholane'], 'cholangioitis': ['angiocholitis', 'cholangioitis'], 'cholanic': ['cholanic', 'colchian'], 'cholate': ['cathole', 'cholate'], 'cholecystoduodenostomy': ['cholecystoduodenostomy', 'duodenocholecystostomy'], 'choler': ['chlore', 'choler', 'orchel'], 'cholera': ['cholera', 'choreal'], 'cholerine': ['cholerine', 'rhinocele'], 'choleromania': ['chloroanemia', 'choleromania'], 'cholesteremia': ['cholesteremia', 'heteroecismal'], 'choli': ['choil', 'choli', 'olchi'], 'choline': ['choline', 'helicon'], 'cholo': ['cholo', 'cohol'], 'chondral': ['chaldron', 'chlordan', 'chondral'], 'chondrite': ['chondrite', 'threnodic'], 'chondroadenoma': ['adenochondroma', 'chondroadenoma'], 'chondroangioma': ['angiochondroma', 'chondroangioma'], 'chondroarthritis': ['arthrochondritis', 'chondroarthritis'], 'chondrocostal': ['chondrocostal', 'costochondral'], 'chondrofibroma': ['chondrofibroma', 'fibrochondroma'], 'chondrolipoma': ['chondrolipoma', 'lipochondroma'], 'chondromyxoma': ['chondromyxoma', 'myxochondroma'], 'chondromyxosarcoma': ['chondromyxosarcoma', 'myxochondrosarcoma'], 'choop': ['choop', 'pooch'], 'chopa': ['chopa', 'phoca', 'poach'], 'chopin': ['chopin', 'phonic'], 'chopine': ['chopine', 'phocine'], 'chora': ['achor', 'chora', 'corah', 'orach', 'roach'], 'choral': ['choral', 'lorcha'], 'chorasmian': ['anachorism', 'chorasmian', 'maraschino'], 'chordal': ['chordal', 'dorlach'], 'chorditis': ['chorditis', 'orchidist'], 'chordotonal': ['chordotonal', 'notochordal'], 'chore': ['chore', 'ocher'], 'chorea': ['chorea', 'ochrea', 'rochea'], 'choreal': ['cholera', 'choreal'], 'choree': ['choree', 'cohere', 'echoer'], 'choreoid': ['choreoid', 'ochidore'], 'choreus': ['choreus', 'chouser', 'rhoecus'], 'choric': ['choric', 'orchic'], 'choriocele': ['choriocele', 'orchiocele'], 'chorioidoretinitis': ['chorioidoretinitis', 'retinochorioiditis'], 'chorism': ['chorism', 'chrisom'], 'chorist': ['chorist', 'ostrich'], 'choristate': ['choristate', 'rheostatic'], 'chorization': ['chorization', 'rhizoctonia', 'zonotrichia'], 'choroid': ['choroid', 'ochroid'], 'chort': ['chort', 'rotch', 'torch'], 'chorten': ['chorten', 'notcher'], 'chorti': ['chorti', 'orthic', 'thoric', 'trochi'], 'chose': ['choes', 'chose'], 'chosen': ['cheson', 'chosen', 'schone'], 'chou': ['chou', 'ouch'], 'chough': ['chough', 'hughoc'], 'choup': ['choup', 'pouch'], 'chous': ['chous', 'hocus'], 'chouser': ['choreus', 'chouser', 'rhoecus'], 'chowder': ['chowder', 'cowherd'], 'chria': ['chair', 'chria'], 'chrism': ['chrism', 'smirch'], 'chrisma': ['charism', 'chrisma'], 'chrismation': ['anchoritism', 'chiromantis', 'chrismation', 'harmonistic'], 'chrismatite': ['chemiatrist', 'chrismatite', 'theatricism'], 'chrisom': ['chorism', 'chrisom'], 'christ': ['christ', 'strich'], 'christen': ['christen', 'snitcher'], 'christener': ['christener', 'rechristen'], 'christian': ['christian', 'christina'], 'christiana': ['arachnitis', 'christiana'], 'christina': ['christian', 'christina'], 'christophe': ['christophe', 'hectorship'], 'chromatician': ['achromatinic', 'chromatician'], 'chromatid': ['chromatid', 'dichromat'], 'chromatin': ['chiromant', 'chromatin'], 'chromatinic': ['chiromantic', 'chromatinic'], 'chromatocyte': ['chromatocyte', 'thoracectomy'], 'chromatoid': ['chromatoid', 'tichodroma'], 'chromatone': ['chromatone', 'enomotarch'], 'chromid': ['chromid', 'richdom'], 'chromidae': ['archidome', 'chromidae'], 'chromite': ['chromite', 'trichome'], 'chromocyte': ['chromocyte', 'cytochrome'], 'chromolithography': ['chromolithography', 'lithochromography'], 'chromophotography': ['chromophotography', 'photochromography'], 'chromophotolithograph': ['chromophotolithograph', 'photochromolithograph'], 'chromopsia': ['chromopsia', 'isocamphor'], 'chromotype': ['chromotype', 'cormophyte', 'ectomorphy'], 'chromotypic': ['chromotypic', 'cormophytic', 'mycotrophic'], 'chronophotograph': ['chronophotograph', 'photochronograph'], 'chronophotographic': ['chronophotographic', 'photochronographic'], 'chronophotography': ['chronophotography', 'photochronography'], 'chrysography': ['chrysography', 'psychorrhagy'], 'chrysolite': ['chrysolite', 'chrysotile'], 'chrysopid': ['chrysopid', 'dysphoric'], 'chrysotile': ['chrysolite', 'chrysotile'], 'chucker': ['chucker', 'rechuck'], 'chueta': ['chaute', 'chueta'], 'chukar': ['charuk', 'chukar'], 'chulan': ['chulan', 'launch', 'nuchal'], 'chum': ['chum', 'much'], 'chumpish': ['chumpish', 'chumship'], 'chumship': ['chumpish', 'chumship'], 'chunari': ['chunari', 'unchair'], 'chunnia': ['chunnia', 'unchain'], 'chuprassie': ['chuprassie', 'haruspices'], 'churl': ['churl', 'lurch'], 'churn': ['churn', 'runch'], 'chut': ['chut', 'tchu', 'utch'], 'chwana': ['chawan', 'chwana', 'wachna'], 'chyak': ['chyak', 'hacky'], 'chylous': ['chylous', 'slouchy'], 'cibarial': ['biracial', 'cibarial'], 'cibarian': ['arabinic', 'cabirian', 'carabini', 'cibarian'], 'cibolan': ['cibolan', 'coalbin'], 'cicala': ['alcaic', 'cicala'], 'cicatrize': ['arcticize', 'cicatrize'], 'cicely': ['cecily', 'cicely'], 'cicer': ['cerci', 'ceric', 'cicer', 'circe'], 'cicerone': ['cicerone', 'croceine'], 'cicindela': ['cicindela', 'cinclidae', 'icelandic'], 'ciclatoun': ['ciclatoun', 'noctiluca'], 'ciconian': ['aniconic', 'ciconian'], 'ciconine': ['ciconine', 'conicine'], 'cidaridae': ['acrididae', 'cardiidae', 'cidaridae'], 'cidaris': ['cidaris', 'sciarid'], 'cider': ['cider', 'cried', 'deric', 'dicer'], 'cigala': ['caliga', 'cigala'], 'cigar': ['cigar', 'craig'], 'cilia': ['cilia', 'iliac'], 'ciliation': ['ciliation', 'coinitial'], 'cilice': ['cilice', 'icicle'], 'cimbia': ['cimbia', 'iambic'], 'cimicidae': ['amicicide', 'cimicidae'], 'cinchonine': ['cinchonine', 'conchinine'], 'cinclidae': ['cicindela', 'cinclidae', 'icelandic'], 'cinder': ['cedrin', 'cinder', 'crined'], 'cinderous': ['cinderous', 'decursion'], 'cindie': ['cindie', 'incide'], 'cine': ['cine', 'nice'], 'cinel': ['cinel', 'cline'], 'cinema': ['anemic', 'cinema', 'iceman'], 'cinematographer': ['cinematographer', 'megachiropteran'], 'cinene': ['cinene', 'nicene'], 'cineole': ['cineole', 'coeline'], 'cinerama': ['amacrine', 'american', 'camerina', 'cinerama'], 'cineration': ['cineration', 'inceration'], 'cinerea': ['cairene', 'cinerea'], 'cinereal': ['cerealin', 'cinereal', 'reliance'], 'cingulum': ['cingulum', 'glucinum'], 'cinnamate': ['antanemic', 'cinnamate'], 'cinnamol': ['cinnamol', 'nonclaim'], 'cinnamon': ['cinnamon', 'mannonic'], 'cinnamoned': ['cinnamoned', 'demicannon'], 'cinque': ['cinque', 'quince'], 'cinter': ['cinter', 'cretin', 'crinet'], 'cinura': ['anuric', 'cinura', 'uranic'], 'cion': ['cion', 'coin', 'icon'], 'cipher': ['cipher', 'rechip'], 'cipo': ['cipo', 'pico'], 'circe': ['cerci', 'ceric', 'cicer', 'circe'], 'circle': ['circle', 'cleric'], 'cirrate': ['cartier', 'cirrate', 'erratic'], 'cirrated': ['cirrated', 'craterid'], 'cirrhotic': ['cirrhotic', 'trichroic'], 'cirrose': ['cirrose', 'crosier'], 'cirsectomy': ['cirsectomy', 'citromyces'], 'cirsoid': ['cirsoid', 'soricid'], 'ciruela': ['auricle', 'ciruela'], 'cise': ['cise', 'sice'], 'cisplatine': ['cisplatine', 'plasticine'], 'cispontine': ['cispontine', 'inspection'], 'cissoidal': ['cissoidal', 'dissocial'], 'cistern': ['cistern', 'increst'], 'cisterna': ['canister', 'cestrian', 'cisterna', 'irascent'], 'cisternal': ['cisternal', 'larcenist'], 'cistvaen': ['cistvaen', 'vesicant'], 'cit': ['cit', 'tic'], 'citadel': ['citadel', 'deltaic', 'dialect', 'edictal', 'lactide'], 'citatory': ['atrocity', 'citatory'], 'cite': ['ceti', 'cite', 'tice'], 'citer': ['citer', 'recti', 'ticer', 'trice'], 'cithara': ['cathari', 'chirata', 'cithara'], 'citharist': ['citharist', 'trachitis'], 'citharoedic': ['citharoedic', 'diachoretic'], 'cither': ['cither', 'thrice'], 'citied': ['citied', 'dietic'], 'citizen': ['citizen', 'zincite'], 'citral': ['citral', 'rictal'], 'citramide': ['citramide', 'diametric', 'matricide'], 'citrange': ['argentic', 'citrange'], 'citrate': ['atretic', 'citrate'], 'citrated': ['citrated', 'tetracid', 'tetradic'], 'citrean': ['centiar', 'certain', 'citrean', 'nacrite', 'nectria'], 'citrene': ['citrene', 'enteric', 'enticer', 'tercine'], 'citreous': ['citreous', 'urticose'], 'citric': ['citric', 'critic'], 'citrin': ['citrin', 'nitric'], 'citrination': ['citrination', 'intrication'], 'citrine': ['citrine', 'crinite', 'inciter', 'neritic'], 'citromyces': ['cirsectomy', 'citromyces'], 'citron': ['citron', 'cortin', 'crotin'], 'citronade': ['citronade', 'endaortic', 'redaction'], 'citronella': ['citronella', 'interlocal'], 'citrus': ['citrus', 'curtis', 'rictus', 'rustic'], 'cive': ['cive', 'vice'], 'civet': ['civet', 'evict'], 'civetone': ['civetone', 'evection'], 'civitan': ['activin', 'civitan'], 'cixo': ['cixo', 'coix'], 'clabber': ['cabbler', 'clabber'], 'clacker': ['cackler', 'clacker', 'crackle'], 'cladine': ['cladine', 'decalin', 'iceland'], 'cladonia': ['cladonia', 'condalia', 'diaconal'], 'cladophyll': ['cladophyll', 'phylloclad'], 'claim': ['claim', 'clima', 'malic'], 'claimant': ['calamint', 'claimant'], 'claimer': ['claimer', 'miracle', 'reclaim'], 'clairce': ['clairce', 'clarice'], 'claire': ['carlie', 'claire', 'eclair', 'erical'], 'claith': ['chital', 'claith'], 'claiver': ['caliver', 'caviler', 'claiver', 'clavier', 'valeric', 'velaric'], 'clam': ['calm', 'clam'], 'clamant': ['calmant', 'clamant'], 'clamative': ['calmative', 'clamative'], 'clamatores': ['clamatores', 'scleromata'], 'clamber': ['cambrel', 'clamber', 'cramble'], 'clame': ['camel', 'clame', 'cleam', 'macle'], 'clamer': ['calmer', 'carmel', 'clamer', 'marcel', 'mercal'], 'clamor': ['clamor', 'colmar'], 'clamorist': ['clamorist', 'crotalism'], 'clangingly': ['clangingly', 'glancingly'], 'clap': ['calp', 'clap'], 'clapper': ['clapper', 'crapple'], 'claquer': ['claquer', 'lacquer'], 'clarain': ['carinal', 'carlina', 'clarain', 'cranial'], 'clare': ['ceral', 'clare', 'clear', 'lacer'], 'clarence': ['canceler', 'clarence', 'recancel'], 'claret': ['carlet', 'cartel', 'claret', 'rectal', 'talcer'], 'claretian': ['carnalite', 'claretian', 'lacertian', 'nectarial'], 'clarice': ['clairce', 'clarice'], 'clarin': ['carlin', 'clarin', 'crinal'], 'clarinda': ['cardinal', 'clarinda'], 'clarion': ['carolin', 'clarion', 'colarin', 'locrian'], 'clarionet': ['alectrion', 'clarionet', 'crotaline', 'locarnite'], 'clarist': ['carlist', 'clarist'], 'claro': ['alcor', 'calor', 'carlo', 'carol', 'claro', 'coral'], 'clary': ['acryl', 'caryl', 'clary'], 'clasher': ['charles', 'clasher'], 'clasp': ['clasp', 'scalp'], 'clasper': ['clasper', 'reclasp', 'scalper'], 'clasping': ['clasping', 'scalping'], 'classed': ['classed', 'declass'], 'classer': ['carless', 'classer', 'reclass'], 'classism': ['classism', 'misclass'], 'classwork': ['classwork', 'crosswalk'], 'clat': ['clat', 'talc'], 'clathrina': ['alchitran', 'clathrina'], 'clathrose': ['clathrose', 'searcloth'], 'clatterer': ['clatterer', 'craterlet'], 'claude': ['caudle', 'cedula', 'claude'], 'claudian': ['claudian', 'dulciana'], 'claudicate': ['aciculated', 'claudicate'], 'clause': ['caelus', 'caules', 'clause'], 'claustral': ['claustral', 'lacustral'], 'clava': ['caval', 'clava'], 'clavacin': ['clavacin', 'vaccinal'], 'clavaria': ['calvaria', 'clavaria'], 'clave': ['calve', 'cavel', 'clave'], 'claver': ['calver', 'carvel', 'claver'], 'claviculate': ['calculative', 'claviculate'], 'clavier': ['caliver', 'caviler', 'claiver', 'clavier', 'valeric', 'velaric'], 'clavis': ['clavis', 'slavic'], 'clay': ['acyl', 'clay', 'lacy'], 'clayer': ['clayer', 'lacery'], 'claytonia': ['acylation', 'claytonia'], 'clead': ['clead', 'decal', 'laced'], 'cleam': ['camel', 'clame', 'cleam', 'macle'], 'cleamer': ['carmele', 'cleamer'], 'clean': ['canel', 'clean', 'lance', 'lenca'], 'cleaner': ['cleaner', 'reclean'], 'cleanly': ['cleanly', 'lancely'], 'cleanout': ['cleanout', 'outlance'], 'cleanse': ['cleanse', 'scalene'], 'cleanup': ['cleanup', 'unplace'], 'clear': ['ceral', 'clare', 'clear', 'lacer'], 'clearable': ['clearable', 'lacerable'], 'clearer': ['clearer', 'reclear'], 'cleat': ['cleat', 'eclat', 'ectal', 'lacet', 'tecla'], 'clefted': ['clefted', 'deflect'], 'cleistocarp': ['ceroplastic', 'cleistocarp', 'coreplastic'], 'cleistogeny': ['cleistogeny', 'lysogenetic'], 'cleoid': ['cleoid', 'coiled', 'docile'], 'cleopatra': ['acropetal', 'cleopatra'], 'cleric': ['circle', 'cleric'], 'clericature': ['clericature', 'recirculate'], 'clerkess': ['clerkess', 'reckless'], 'clerking': ['clerking', 'reckling'], 'clerus': ['clerus', 'cruels'], 'clethra': ['clethra', 'latcher', 'ratchel', 'relatch', 'talcher', 'trachle'], 'cleveite': ['cleveite', 'elective'], 'cliche': ['chicle', 'cliche'], 'clicker': ['clicker', 'crickle'], 'clidastes': ['clidastes', 'discastle'], 'clientage': ['clientage', 'genetical'], 'cliented': ['cliented', 'denticle'], 'cliftonia': ['cliftonia', 'fictional'], 'clima': ['claim', 'clima', 'malic'], 'climber': ['climber', 'reclimb'], 'clime': ['clime', 'melic'], 'cline': ['cinel', 'cline'], 'clinger': ['clinger', 'cringle'], 'clinia': ['anilic', 'clinia'], 'clinicopathological': ['clinicopathological', 'pathologicoclinical'], 'clinium': ['clinium', 'ulminic'], 'clinker': ['clinker', 'crinkle'], 'clinoclase': ['clinoclase', 'oscillance'], 'clinoclasite': ['callisection', 'clinoclasite'], 'clinodome': ['clinodome', 'melodicon', 'monocleid'], 'clinology': ['clinology', 'coolingly'], 'clinometer': ['clinometer', 'recoilment'], 'clinospore': ['clinospore', 'necropolis'], 'clio': ['clio', 'coil', 'coli', 'loci'], 'cliona': ['alnico', 'cliona', 'oilcan'], 'clione': ['clione', 'coelin', 'encoil', 'enolic'], 'clipeus': ['clipeus', 'spicule'], 'clipper': ['clipper', 'cripple'], 'clipse': ['clipse', 'splice'], 'clipsome': ['clipsome', 'polemics'], 'clite': ['clite', 'telic'], 'clites': ['celtis', 'clites'], 'clitia': ['clitia', 'italic'], 'clition': ['clition', 'nilotic'], 'clitoria': ['clitoria', 'loricati'], 'clitoridean': ['clitoridean', 'directional'], 'clitoris': ['clitoris', 'coistril'], 'clive': ['clive', 'velic'], 'cloacinal': ['cloacinal', 'cocillana'], 'cloam': ['cloam', 'comal'], 'cloamen': ['aclemon', 'cloamen'], 'clobber': ['clobber', 'cobbler'], 'clochan': ['chalcon', 'clochan', 'conchal'], 'clocked': ['clocked', 'cockled'], 'clocker': ['clocker', 'cockler'], 'clod': ['clod', 'cold'], 'clodder': ['clodder', 'coddler'], 'cloggy': ['cloggy', 'coggly'], 'cloister': ['cloister', 'coistrel'], 'cloisteral': ['cloisteral', 'sclerotial'], 'cloit': ['cloit', 'lotic'], 'clonicotonic': ['clonicotonic', 'tonicoclonic'], 'clonus': ['clonus', 'consul'], 'clop': ['clop', 'colp'], 'close': ['close', 'socle'], 'closer': ['closer', 'cresol', 'escrol'], 'closter': ['closter', 'costrel'], 'closterium': ['closterium', 'sclerotium'], 'clot': ['clot', 'colt'], 'clothier': ['chlorite', 'clothier'], 'clotho': ['clotho', 'coolth'], 'clotter': ['clotter', 'crottle'], 'cloture': ['cloture', 'clouter'], 'cloud': ['cloud', 'could'], 'clouter': ['cloture', 'clouter'], 'clovene': ['cevenol', 'clovene'], 'clow': ['clow', 'cowl'], 'cloy': ['cloy', 'coly'], 'clue': ['clue', 'luce'], 'clumse': ['clumse', 'muscle'], 'clumsily': ['clumsily', 'scyllium'], 'clumsy': ['clumsy', 'muscly'], 'clunist': ['clunist', 'linctus'], 'clupea': ['alecup', 'clupea'], 'clupeine': ['clupeine', 'pulicene'], 'clusia': ['caulis', 'clusia', 'sicula'], 'clutch': ['clutch', 'cultch'], 'clutter': ['clutter', 'cuttler'], 'clyde': ['clyde', 'decyl'], 'clyer': ['ceryl', 'clyer'], 'clymenia': ['clymenia', 'mycelian'], 'clypeolate': ['clypeolate', 'ptyalocele'], 'clysis': ['clysis', 'lyssic'], 'clysmic': ['clysmic', 'cyclism'], 'cnemial': ['cnemial', 'melanic'], 'cnemis': ['cnemis', 'mnesic'], 'cneorum': ['cneorum', 'corneum'], 'cnicus': ['cnicus', 'succin'], 'cnida': ['canid', 'cnida', 'danic'], 'cnidaria': ['acridian', 'cnidaria'], 'cnidian': ['cnidian', 'indican'], 'cnidophore': ['cnidophore', 'princehood'], 'coach': ['chaco', 'choca', 'coach'], 'coacher': ['caroche', 'coacher', 'recoach'], 'coachlet': ['catechol', 'coachlet'], 'coactor': ['coactor', 'tarocco'], 'coadamite': ['acetamido', 'coadamite'], 'coadnate': ['anecdota', 'coadnate'], 'coadunite': ['coadunite', 'education', 'noctuidae'], 'coagent': ['coagent', 'cognate'], 'coagulate': ['catalogue', 'coagulate'], 'coaita': ['atocia', 'coaita'], 'coal': ['alco', 'coal', 'cola', 'loca'], 'coalbin': ['cibolan', 'coalbin'], 'coaler': ['carole', 'coaler', 'coelar', 'oracle', 'recoal'], 'coalite': ['aloetic', 'coalite'], 'coalition': ['coalition', 'lociation'], 'coalitionist': ['coalitionist', 'solicitation'], 'coalizer': ['calorize', 'coalizer'], 'coalpit': ['capitol', 'coalpit', 'optical', 'topical'], 'coaltitude': ['coaltitude', 'colatitude'], 'coaming': ['coaming', 'macigno'], 'coan': ['coan', 'onca'], 'coapt': ['capot', 'coapt'], 'coarb': ['carbo', 'carob', 'coarb', 'cobra'], 'coarrange': ['arrogance', 'coarrange'], 'coarse': ['acrose', 'coarse'], 'coarsen': ['carnose', 'coarsen', 'narcose'], 'coassert': ['castores', 'coassert'], 'coast': ['ascot', 'coast', 'costa', 'tacso', 'tasco'], 'coastal': ['coastal', 'salacot'], 'coaster': ['coaster', 'recoast'], 'coasting': ['agnostic', 'coasting'], 'coated': ['coated', 'decoat'], 'coater': ['coater', 'recoat'], 'coating': ['coating', 'cotinga'], 'coatroom': ['coatroom', 'morocota'], 'coax': ['coax', 'coxa'], 'cobbler': ['clobber', 'cobbler'], 'cobia': ['baioc', 'cabio', 'cobia'], 'cobiron': ['boronic', 'cobiron'], 'cobitis': ['biotics', 'cobitis'], 'cobra': ['carbo', 'carob', 'coarb', 'cobra'], 'cocaine': ['cocaine', 'oceanic'], 'cocainist': ['cocainist', 'siccation'], 'cocama': ['cocama', 'macaco'], 'cocamine': ['cocamine', 'comacine'], 'cochleare': ['archocele', 'cochleare'], 'cochleitis': ['cochleitis', 'ochlesitic'], 'cocillana': ['cloacinal', 'cocillana'], 'cocker': ['cocker', 'recock'], 'cockily': ['cockily', 'colicky'], 'cockled': ['clocked', 'cockled'], 'cockler': ['clocker', 'cockler'], 'cockup': ['cockup', 'upcock'], 'cocreditor': ['cocreditor', 'codirector'], 'cocurrent': ['cocurrent', 'occurrent', 'uncorrect'], 'cod': ['cod', 'doc'], 'codamine': ['codamine', 'comedian', 'daemonic', 'demoniac'], 'codder': ['codder', 'corded'], 'coddler': ['clodder', 'coddler'], 'code': ['code', 'coed'], 'codebtor': ['bedoctor', 'codebtor'], 'coder': ['coder', 'cored', 'credo'], 'coderive': ['coderive', 'divorcee'], 'codicil': ['codicil', 'dicolic'], 'codille': ['celloid', 'codille', 'collide', 'collied'], 'codirector': ['cocreditor', 'codirector'], 'codium': ['codium', 'mucoid'], 'coed': ['code', 'coed'], 'coeditorship': ['cheiropodist', 'coeditorship'], 'coelar': ['carole', 'coaler', 'coelar', 'oracle', 'recoal'], 'coelata': ['alcoate', 'coelata'], 'coelection': ['coelection', 'entocoelic'], 'coelia': ['aeolic', 'coelia'], 'coelin': ['clione', 'coelin', 'encoil', 'enolic'], 'coeline': ['cineole', 'coeline'], 'coelogyne': ['coelogyne', 'gonyocele'], 'coenactor': ['coenactor', 'croconate'], 'coenobiar': ['borocaine', 'coenobiar'], 'coenurus': ['cernuous', 'coenurus'], 'coestate': ['coestate', 'ecostate'], 'coeternal': ['antrocele', 'coeternal', 'tolerance'], 'coeval': ['alcove', 'coeval', 'volcae'], 'cofaster': ['cofaster', 'forecast'], 'coferment': ['coferment', 'forcement'], 'cogeneric': ['cogeneric', 'concierge'], 'coggly': ['cloggy', 'coggly'], 'cognate': ['coagent', 'cognate'], 'cognatical': ['cognatical', 'galactonic'], 'cognation': ['cognation', 'contagion'], 'cognition': ['cognition', 'incognito'], 'cognominal': ['cognominal', 'gnomonical'], 'cogon': ['cogon', 'congo'], 'cograil': ['argolic', 'cograil'], 'coheir': ['coheir', 'heroic'], 'cohen': ['cohen', 'enoch'], 'cohere': ['choree', 'cohere', 'echoer'], 'cohol': ['cholo', 'cohol'], 'cohune': ['cohune', 'hounce'], 'coif': ['coif', 'fico', 'foci'], 'coign': ['coign', 'incog'], 'coil': ['clio', 'coil', 'coli', 'loci'], 'coiled': ['cleoid', 'coiled', 'docile'], 'coiler': ['coiler', 'recoil'], 'coin': ['cion', 'coin', 'icon'], 'coinclude': ['coinclude', 'undecolic'], 'coiner': ['cerion', 'coiner', 'neroic', 'orcein', 'recoin'], 'coinfer': ['coinfer', 'conifer'], 'coinherence': ['coinherence', 'incoherence'], 'coinherent': ['coinherent', 'incoherent'], 'coinitial': ['ciliation', 'coinitial'], 'coinmate': ['coinmate', 'maconite'], 'coinspire': ['coinspire', 'precision'], 'coinsure': ['coinsure', 'corineus', 'cusinero'], 'cointer': ['cerotin', 'cointer', 'cotrine', 'cretion', 'noticer', 'rection'], 'cointreau': ['cautioner', 'cointreau'], 'coistrel': ['cloister', 'coistrel'], 'coistril': ['clitoris', 'coistril'], 'coix': ['cixo', 'coix'], 'coker': ['coker', 'corke', 'korec'], 'coky': ['coky', 'yock'], 'cola': ['alco', 'coal', 'cola', 'loca'], 'colalgia': ['alogical', 'colalgia'], 'colan': ['colan', 'conal'], 'colane': ['canelo', 'colane'], 'colarin': ['carolin', 'clarion', 'colarin', 'locrian'], 'colate': ['acetol', 'colate', 'locate'], 'colation': ['colation', 'coontail', 'location'], 'colatitude': ['coaltitude', 'colatitude'], 'colchian': ['cholanic', 'colchian'], 'colcine': ['colcine', 'concile', 'conicle'], 'colcothar': ['colcothar', 'ochlocrat'], 'cold': ['clod', 'cold'], 'colder': ['cedrol', 'colder', 'cordel'], 'colectomy': ['colectomy', 'cyclotome'], 'colemanite': ['colemanite', 'melaconite'], 'coleur': ['coleur', 'colure'], 'coleus': ['coleus', 'oscule'], 'coli': ['clio', 'coil', 'coli', 'loci'], 'colias': ['colias', 'scolia', 'social'], 'colicky': ['cockily', 'colicky'], 'colima': ['colima', 'olamic'], 'colin': ['colin', 'nicol'], 'colinear': ['acrolein', 'arecolin', 'caroline', 'colinear', 'cornelia', 'creolian', 'lonicera'], 'colitis': ['colitis', 'solicit'], 'colk': ['colk', 'lock'], 'colla': ['callo', 'colla', 'local'], 'collage': ['alcogel', 'collage'], 'collare': ['collare', 'corella', 'ocellar'], 'collaret': ['collaret', 'corallet'], 'collarino': ['collarino', 'coronilla'], 'collatee': ['collatee', 'ocellate'], 'collationer': ['collationer', 'recollation'], 'collectioner': ['collectioner', 'recollection'], 'collegial': ['collegial', 'gallicole'], 'collegian': ['allogenic', 'collegian'], 'colleri': ['cerillo', 'colleri', 'collier'], 'colleter': ['colleter', 'coteller', 'coterell', 'recollet'], 'colletia': ['colletia', 'teocalli'], 'collide': ['celloid', 'codille', 'collide', 'collied'], 'collidine': ['celloidin', 'collidine', 'decillion'], 'collie': ['collie', 'ocelli'], 'collied': ['celloid', 'codille', 'collide', 'collied'], 'collier': ['cerillo', 'colleri', 'collier'], 'colligate': ['colligate', 'cotillage'], 'colline': ['colline', 'lioncel'], 'collinear': ['collinear', 'coralline'], 'collinsia': ['collinsia', 'isoclinal'], 'collotypy': ['collotypy', 'polycotyl'], 'collusive': ['collusive', 'colluvies'], 'colluvies': ['collusive', 'colluvies'], 'collyba': ['callboy', 'collyba'], 'colmar': ['clamor', 'colmar'], 'colobus': ['colobus', 'subcool'], 'coloenteritis': ['coloenteritis', 'enterocolitis'], 'colombian': ['colombian', 'colombina'], 'colombina': ['colombian', 'colombina'], 'colonalgia': ['colonalgia', 'naological'], 'colonate': ['colonate', 'ecotonal'], 'colonialist': ['colonialist', 'oscillation'], 'coloproctitis': ['coloproctitis', 'proctocolitis'], 'color': ['color', 'corol', 'crool'], 'colored': ['colored', 'croodle', 'decolor'], 'colorer': ['colorer', 'recolor'], 'colorin': ['colorin', 'orcinol'], 'colorman': ['colorman', 'conormal'], 'colp': ['clop', 'colp'], 'colpeurynter': ['colpeurynter', 'counterreply'], 'colpitis': ['colpitis', 'politics', 'psilotic'], 'colporrhagia': ['colporrhagia', 'orographical'], 'colt': ['clot', 'colt'], 'colter': ['colter', 'lector', 'torcel'], 'coltskin': ['coltskin', 'linstock'], 'colubrina': ['binocular', 'caliburno', 'colubrina'], 'columbo': ['columbo', 'coulomb'], 'columbotitanate': ['columbotitanate', 'titanocolumbate'], 'columnated': ['columnated', 'documental'], 'columned': ['columned', 'uncledom'], 'colunar': ['colunar', 'cornual', 'courlan'], 'colure': ['coleur', 'colure'], 'colutea': ['caulote', 'colutea', 'oculate'], 'coly': ['cloy', 'coly'], 'coma': ['coma', 'maco'], 'comacine': ['cocamine', 'comacine'], 'comal': ['cloam', 'comal'], 'coman': ['coman', 'macon', 'manoc'], 'comart': ['carmot', 'comart'], 'comate': ['comate', 'metoac', 'tecoma'], 'combat': ['combat', 'tombac'], 'comber': ['comber', 'recomb'], 'combinedly': ['combinedly', 'molybdenic'], 'comedial': ['cameloid', 'comedial', 'melodica'], 'comedian': ['codamine', 'comedian', 'daemonic', 'demoniac'], 'comediant': ['comediant', 'metaconid'], 'comedist': ['comedist', 'demotics', 'docetism', 'domestic'], 'comedown': ['comedown', 'downcome'], 'comeliness': ['comeliness', 'incomeless'], 'comeling': ['comeling', 'comingle'], 'comenic': ['comenic', 'encomic', 'meconic'], 'comer': ['comer', 'crome'], 'comforter': ['comforter', 'recomfort'], 'comid': ['comid', 'domic'], 'coming': ['coming', 'gnomic'], 'comingle': ['comeling', 'comingle'], 'comintern': ['comintern', 'nonmetric'], 'comitia': ['caimito', 'comitia'], 'comitragedy': ['comitragedy', 'tragicomedy'], 'comity': ['comity', 'myotic'], 'commander': ['commander', 'recommand'], 'commation': ['commation', 'monatomic'], 'commelina': ['commelina', 'melomanic'], 'commender': ['commender', 'recommend'], 'commentarial': ['commentarial', 'manometrical'], 'commination': ['commination', 'monamniotic'], 'commissioner': ['commissioner', 'recommission'], 'commonality': ['ammonolytic', 'commonality'], 'commorient': ['commorient', 'metronomic', 'monometric'], 'compact': ['accompt', 'compact'], 'compacter': ['compacter', 'recompact'], 'company': ['company', 'copyman'], 'compare': ['compare', 'compear'], 'comparition': ['comparition', 'proamniotic'], 'compasser': ['compasser', 'recompass'], 'compear': ['compare', 'compear'], 'compenetrate': ['compenetrate', 'contemperate'], 'competitioner': ['competitioner', 'recompetition'], 'compile': ['compile', 'polemic'], 'compiler': ['compiler', 'complier'], 'complainer': ['complainer', 'procnemial', 'recomplain'], 'complaint': ['complaint', 'compliant'], 'complanate': ['complanate', 'placentoma'], 'compliant': ['complaint', 'compliant'], 'complier': ['compiler', 'complier'], 'compounder': ['compounder', 'recompound'], 'comprehender': ['comprehender', 'recomprehend'], 'compressed': ['compressed', 'decompress'], 'comprise': ['comprise', 'perosmic'], 'compromission': ['compromission', 'procommission'], 'conal': ['colan', 'conal'], 'conamed': ['conamed', 'macedon'], 'conant': ['cannot', 'canton', 'conant', 'nonact'], 'conarial': ['carolina', 'conarial'], 'conarium': ['conarium', 'coumarin'], 'conative': ['conative', 'invocate'], 'concealer': ['concealer', 'reconceal'], 'concent': ['concent', 'connect'], 'concenter': ['concenter', 'reconnect'], 'concentive': ['concentive', 'connective'], 'concertize': ['concertize', 'concretize'], 'concessioner': ['concessioner', 'reconcession'], 'concha': ['chanco', 'concha'], 'conchal': ['chalcon', 'clochan', 'conchal'], 'conchinine': ['cinchonine', 'conchinine'], 'concierge': ['cogeneric', 'concierge'], 'concile': ['colcine', 'concile', 'conicle'], 'concocter': ['concocter', 'reconcoct'], 'concreter': ['concreter', 'reconcert'], 'concretize': ['concertize', 'concretize'], 'concretor': ['concretor', 'conrector'], 'condalia': ['cladonia', 'condalia', 'diaconal'], 'condemner': ['condemner', 'recondemn'], 'condite': ['condite', 'ctenoid'], 'conditioner': ['conditioner', 'recondition'], 'condor': ['condor', 'cordon'], 'conduit': ['conduit', 'duction', 'noctuid'], 'condylomatous': ['condylomatous', 'monodactylous'], 'cone': ['cone', 'once'], 'conepate': ['conepate', 'tepecano'], 'coner': ['coner', 'crone', 'recon'], 'cones': ['cones', 'scone'], 'confesser': ['confesser', 'reconfess'], 'configurationism': ['configurationism', 'misconfiguration'], 'confirmer': ['confirmer', 'reconfirm'], 'confirmor': ['confirmor', 'corniform'], 'conflate': ['conflate', 'falconet'], 'conformer': ['conformer', 'reconform'], 'confounder': ['confounder', 'reconfound'], 'confrere': ['confrere', 'enforcer', 'reconfer'], 'confronter': ['confronter', 'reconfront'], 'congealer': ['congealer', 'recongeal'], 'congeneric': ['congeneric', 'necrogenic'], 'congenerous': ['congenerous', 'necrogenous'], 'congenial': ['congenial', 'goclenian'], 'congo': ['cogon', 'congo'], 'congreet': ['congreet', 'coregent'], 'congreve': ['congreve', 'converge'], 'conical': ['conical', 'laconic'], 'conicine': ['ciconine', 'conicine'], 'conicle': ['colcine', 'concile', 'conicle'], 'conicoid': ['conicoid', 'conoidic'], 'conidium': ['conidium', 'mucinoid', 'oncidium'], 'conifer': ['coinfer', 'conifer'], 'conima': ['camion', 'conima', 'manioc', 'monica'], 'conin': ['conin', 'nonic', 'oncin'], 'conine': ['conine', 'connie', 'ennoic'], 'conjoiner': ['conjoiner', 'reconjoin'], 'conk': ['conk', 'nock'], 'conker': ['conker', 'reckon'], 'conkers': ['conkers', 'snocker'], 'connarite': ['connarite', 'container', 'cotarnine', 'crenation', 'narcotine'], 'connatal': ['cantonal', 'connatal'], 'connation': ['connation', 'nonaction'], 'connature': ['antecornu', 'connature'], 'connect': ['concent', 'connect'], 'connectival': ['connectival', 'conventical'], 'connective': ['concentive', 'connective'], 'connie': ['conine', 'connie', 'ennoic'], 'connoissance': ['connoissance', 'nonaccession'], 'conoidal': ['conoidal', 'dolciano'], 'conoidic': ['conicoid', 'conoidic'], 'conor': ['conor', 'croon', 'ronco'], 'conormal': ['colorman', 'conormal'], 'conoy': ['conoy', 'coony'], 'conrad': ['candor', 'cardon', 'conrad'], 'conrector': ['concretor', 'conrector'], 'conred': ['cedron', 'conred'], 'conringia': ['conringia', 'inorganic'], 'consenter': ['consenter', 'nonsecret', 'reconsent'], 'conservable': ['conservable', 'conversable'], 'conservancy': ['conservancy', 'conversancy'], 'conservant': ['conservant', 'conversant'], 'conservation': ['conservation', 'conversation'], 'conservational': ['conservational', 'conversational'], 'conservationist': ['conservationist', 'conversationist'], 'conservative': ['conservative', 'conversative'], 'conserve': ['conserve', 'converse'], 'conserver': ['conserver', 'converser'], 'considerate': ['considerate', 'desecration'], 'considerative': ['considerative', 'devisceration'], 'considered': ['considered', 'deconsider'], 'considerer': ['considerer', 'reconsider'], 'consigner': ['consigner', 'reconsign'], 'conspiracy': ['conspiracy', 'snipocracy'], 'conspire': ['conspire', 'incorpse'], 'constate': ['catstone', 'constate'], 'constitutionalism': ['constitutionalism', 'misconstitutional'], 'constitutioner': ['constitutioner', 'reconstitution'], 'constrain': ['constrain', 'transonic'], 'constructer': ['constructer', 'reconstruct'], 'constructionism': ['constructionism', 'misconstruction'], 'consul': ['clonus', 'consul'], 'consulage': ['consulage', 'glucosane'], 'consulary': ['consulary', 'cynosural'], 'consulter': ['consulter', 'reconsult'], 'consume': ['consume', 'muscone'], 'consumer': ['consumer', 'mucrones'], 'consute': ['consute', 'contuse'], 'contagion': ['cognation', 'contagion'], 'contain': ['actinon', 'cantion', 'contain'], 'container': ['connarite', 'container', 'cotarnine', 'crenation', 'narcotine'], 'conte': ['cento', 'conte', 'tecon'], 'contemperate': ['compenetrate', 'contemperate'], 'contender': ['contender', 'recontend'], 'conter': ['conter', 'cornet', 'cronet', 'roncet'], 'conterminal': ['centinormal', 'conterminal', 'nonmetrical'], 'contester': ['contester', 'recontest'], 'continual': ['continual', 'inoculant', 'unctional'], 'continued': ['continued', 'unnoticed'], 'continuer': ['centurion', 'continuer', 'cornutine'], 'contise': ['contise', 'noetics', 'section'], 'contline': ['contline', 'nonlicet'], 'contortae': ['contortae', 'crotonate'], 'contour': ['contour', 'cornuto', 'countor', 'crouton'], 'contra': ['cantor', 'carton', 'contra'], 'contracter': ['contracter', 'correctant', 'recontract'], 'contrapose': ['antroscope', 'contrapose'], 'contravene': ['contravene', 'covenanter'], 'contrite': ['contrite', 'tetronic'], 'contrive': ['contrive', 'invector'], 'conturbation': ['conturbation', 'obtruncation'], 'contuse': ['consute', 'contuse'], 'conure': ['conure', 'rounce', 'uncore'], 'conventical': ['connectival', 'conventical'], 'conventioner': ['conventioner', 'reconvention'], 'converge': ['congreve', 'converge'], 'conversable': ['conservable', 'conversable'], 'conversancy': ['conservancy', 'conversancy'], 'conversant': ['conservant', 'conversant'], 'conversation': ['conservation', 'conversation'], 'conversational': ['conservational', 'conversational'], 'conversationist': ['conservationist', 'conversationist'], 'conversative': ['conservative', 'conversative'], 'converse': ['conserve', 'converse'], 'converser': ['conserver', 'converser'], 'converter': ['converter', 'reconvert'], 'convertise': ['convertise', 'ventricose'], 'conveyer': ['conveyer', 'reconvey'], 'conycatcher': ['conycatcher', 'technocracy'], 'conyrine': ['conyrine', 'corynine'], 'cooker': ['cooker', 'recook'], 'cool': ['cool', 'loco'], 'coolant': ['coolant', 'octonal'], 'cooler': ['cooler', 'recool'], 'coolingly': ['clinology', 'coolingly'], 'coolth': ['clotho', 'coolth'], 'coolweed': ['coolweed', 'locoweed'], 'cooly': ['cooly', 'coyol'], 'coonroot': ['coonroot', 'octoroon'], 'coontail': ['colation', 'coontail', 'location'], 'coony': ['conoy', 'coony'], 'coop': ['coop', 'poco'], 'coos': ['coos', 'soco'], 'coost': ['coost', 'scoot'], 'coot': ['coot', 'coto', 'toco'], 'copa': ['copa', 'paco'], 'copable': ['copable', 'placebo'], 'copalite': ['copalite', 'poetical'], 'coparent': ['coparent', 'portance'], 'copart': ['captor', 'copart'], 'copartner': ['copartner', 'procreant'], 'copatain': ['copatain', 'pacation'], 'copehan': ['copehan', 'panoche', 'phocean'], 'copen': ['copen', 'ponce'], 'coperta': ['coperta', 'pectora', 'porcate'], 'copied': ['copied', 'epodic'], 'copis': ['copis', 'pisco'], 'copist': ['copist', 'coptis', 'optics', 'postic'], 'copita': ['atopic', 'capito', 'copita'], 'coplanar': ['coplanar', 'procanal'], 'copleased': ['copleased', 'escaloped'], 'copperer': ['copperer', 'recopper'], 'coppery': ['coppery', 'precopy'], 'copr': ['copr', 'corp', 'crop'], 'coprinae': ['caponier', 'coprinae', 'procaine'], 'coprinus': ['coprinus', 'poncirus'], 'coprolagnia': ['carpogonial', 'coprolagnia'], 'coprophagist': ['coprophagist', 'topographics'], 'coprose': ['coprose', 'scooper'], 'copse': ['copse', 'pecos', 'scope'], 'copter': ['ceptor', 'copter'], 'coptis': ['copist', 'coptis', 'optics', 'postic'], 'copula': ['copula', 'cupola'], 'copular': ['copular', 'croupal', 'cupolar', 'porcula'], 'copulate': ['copulate', 'outplace'], 'copulation': ['copulation', 'poculation'], 'copus': ['copus', 'scoup'], 'copyman': ['company', 'copyman'], 'copyrighter': ['copyrighter', 'recopyright'], 'coque': ['coque', 'ocque'], 'coquitlam': ['coquitlam', 'quamoclit'], 'cor': ['cor', 'cro', 'orc', 'roc'], 'cora': ['acor', 'caro', 'cora', 'orca'], 'coraciae': ['coraciae', 'icacorea'], 'coracial': ['caracoli', 'coracial'], 'coracias': ['coracias', 'rascacio'], 'coradicate': ['coradicate', 'ectocardia'], 'corah': ['achor', 'chora', 'corah', 'orach', 'roach'], 'coraise': ['coraise', 'scoriae'], 'coral': ['alcor', 'calor', 'carlo', 'carol', 'claro', 'coral'], 'coraled': ['acerdol', 'coraled'], 'coralist': ['calorist', 'coralist'], 'corallet': ['collaret', 'corallet'], 'corallian': ['corallian', 'corallina'], 'corallina': ['corallian', 'corallina'], 'coralline': ['collinear', 'coralline'], 'corallite': ['corallite', 'lectorial'], 'coram': ['carom', 'coram', 'macro', 'marco'], 'coranto': ['cartoon', 'coranto'], 'corban': ['bracon', 'carbon', 'corban'], 'corbeil': ['bricole', 'corbeil', 'orbicle'], 'cordaitean': ['arctoidean', 'carotidean', 'cordaitean', 'dinocerata'], 'cordate': ['cordate', 'decator', 'redcoat'], 'corded': ['codder', 'corded'], 'cordel': ['cedrol', 'colder', 'cordel'], 'corder': ['corder', 'record'], 'cordia': ['caroid', 'cordia'], 'cordial': ['cordial', 'dorical'], 'cordicole': ['cordicole', 'crocodile'], 'cordierite': ['cordierite', 'directoire'], 'cordoba': ['bocardo', 'cordoba'], 'cordon': ['condor', 'cordon'], 'core': ['cero', 'core'], 'cored': ['coder', 'cored', 'credo'], 'coregent': ['congreet', 'coregent'], 'coreless': ['coreless', 'sclerose'], 'corella': ['collare', 'corella', 'ocellar'], 'corema': ['ceroma', 'corema'], 'coreplastic': ['ceroplastic', 'cleistocarp', 'coreplastic'], 'coreplasty': ['ceroplasty', 'coreplasty'], 'corer': ['corer', 'crore'], 'coresidual': ['coresidual', 'radiculose'], 'coresign': ['coresign', 'cosigner'], 'corge': ['corge', 'gorce'], 'corgi': ['corgi', 'goric', 'orgic'], 'corial': ['caroli', 'corial', 'lorica'], 'coriamyrtin': ['coriamyrtin', 'criminatory'], 'corin': ['corin', 'noric', 'orcin'], 'corindon': ['corindon', 'nodicorn'], 'corineus': ['coinsure', 'corineus', 'cusinero'], 'corinna': ['corinna', 'cronian'], 'corinne': ['corinne', 'cornein', 'neronic'], 'cork': ['cork', 'rock'], 'corke': ['coker', 'corke', 'korec'], 'corked': ['corked', 'docker', 'redock'], 'corker': ['corker', 'recork', 'rocker'], 'corkiness': ['corkiness', 'rockiness'], 'corking': ['corking', 'rocking'], 'corkish': ['corkish', 'rockish'], 'corkwood': ['corkwood', 'rockwood', 'woodrock'], 'corky': ['corky', 'rocky'], 'corm': ['corm', 'crom'], 'cormophyte': ['chromotype', 'cormophyte', 'ectomorphy'], 'cormophytic': ['chromotypic', 'cormophytic', 'mycotrophic'], 'cornage': ['acrogen', 'cornage'], 'cornea': ['carone', 'cornea'], 'corneal': ['carneol', 'corneal'], 'cornein': ['corinne', 'cornein', 'neronic'], 'cornelia': ['acrolein', 'arecolin', 'caroline', 'colinear', 'cornelia', 'creolian', 'lonicera'], 'cornelius': ['cornelius', 'inclosure', 'reclusion'], 'corneocalcareous': ['calcareocorneous', 'corneocalcareous'], 'cornet': ['conter', 'cornet', 'cronet', 'roncet'], 'corneum': ['cneorum', 'corneum'], 'cornic': ['cornic', 'crocin'], 'cornice': ['cornice', 'crocein'], 'corniform': ['confirmor', 'corniform'], 'cornin': ['cornin', 'rincon'], 'cornish': ['cornish', 'cronish', 'sorchin'], 'cornual': ['colunar', 'cornual', 'courlan'], 'cornuate': ['cornuate', 'courante', 'cuneator', 'outrance'], 'cornuated': ['cornuated', 'undercoat'], 'cornucopiate': ['cornucopiate', 'reoccupation'], 'cornulites': ['cornulites', 'uncloister'], 'cornute': ['cornute', 'counter', 'recount', 'trounce'], 'cornutine': ['centurion', 'continuer', 'cornutine'], 'cornuto': ['contour', 'cornuto', 'countor', 'crouton'], 'corny': ['corny', 'crony'], 'corol': ['color', 'corol', 'crool'], 'corollated': ['corollated', 'decollator'], 'corona': ['caroon', 'corona', 'racoon'], 'coronad': ['cardoon', 'coronad'], 'coronadite': ['carotenoid', 'coronadite', 'decoration'], 'coronal': ['coronal', 'locarno'], 'coronaled': ['canoodler', 'coronaled'], 'coronate': ['coronate', 'octonare', 'otocrane'], 'coronated': ['coronated', 'creodonta'], 'coroner': ['coroner', 'crooner', 'recroon'], 'coronilla': ['collarino', 'coronilla'], 'corp': ['copr', 'corp', 'crop'], 'corporealist': ['corporealist', 'prosectorial'], 'corradiate': ['corradiate', 'cortaderia', 'eradicator'], 'correal': ['caroler', 'correal'], 'correctant': ['contracter', 'correctant', 'recontract'], 'correctioner': ['correctioner', 'recorrection'], 'corrente': ['corrente', 'terceron'], 'correption': ['correption', 'porrection'], 'corrodentia': ['corrodentia', 'recordation'], 'corrupter': ['corrupter', 'recorrupt'], 'corsage': ['corsage', 'socager'], 'corsaint': ['cantoris', 'castorin', 'corsaint'], 'corse': ['corse', 'score'], 'corselet': ['corselet', 'sclerote', 'selector'], 'corset': ['corset', 'cortes', 'coster', 'escort', 'scoter', 'sector'], 'corta': ['actor', 'corta', 'croat', 'rocta', 'taroc', 'troca'], 'cortaderia': ['corradiate', 'cortaderia', 'eradicator'], 'cortes': ['corset', 'cortes', 'coster', 'escort', 'scoter', 'sector'], 'cortical': ['cortical', 'crotalic'], 'cortices': ['cortices', 'cresotic'], 'corticose': ['corticose', 'creosotic'], 'cortin': ['citron', 'cortin', 'crotin'], 'cortina': ['anticor', 'carotin', 'cortina', 'ontaric'], 'cortinate': ['carnotite', 'cortinate'], 'cortisone': ['certosino', 'cortisone', 'socotrine'], 'corton': ['corton', 'croton'], 'corvinae': ['corvinae', 'veronica'], 'cory': ['cory', 'croy'], 'corycavidine': ['cervicodynia', 'corycavidine'], 'corydon': ['corydon', 'croydon'], 'corynine': ['conyrine', 'corynine'], 'corypha': ['charpoy', 'corypha'], 'coryphene': ['coryphene', 'hypercone'], 'cos': ['cos', 'osc', 'soc'], 'cosalite': ['cosalite', 'societal'], 'coset': ['coset', 'estoc', 'scote'], 'cosh': ['cosh', 'scho'], 'cosharer': ['cosharer', 'horsecar'], 'cosigner': ['coresign', 'cosigner'], 'cosine': ['cosine', 'oscine'], 'cosmati': ['atomics', 'catoism', 'cosmati', 'osmatic', 'somatic'], 'cosmetical': ['cacomistle', 'cosmetical'], 'cosmetician': ['cosmetician', 'encomiastic'], 'cosmist': ['cosmist', 'scotism'], 'cossack': ['cassock', 'cossack'], 'cosse': ['cosse', 'secos'], 'cost': ['cost', 'scot'], 'costa': ['ascot', 'coast', 'costa', 'tacso', 'tasco'], 'costar': ['arctos', 'castor', 'costar', 'scrota'], 'costean': ['costean', 'tsoneca'], 'coster': ['corset', 'cortes', 'coster', 'escort', 'scoter', 'sector'], 'costing': ['costing', 'gnostic'], 'costispinal': ['costispinal', 'pansciolist'], 'costmary': ['arctomys', 'costmary', 'mascotry'], 'costochondral': ['chondrocostal', 'costochondral'], 'costosternal': ['costosternal', 'sternocostal'], 'costovertebral': ['costovertebral', 'vertebrocostal'], 'costrel': ['closter', 'costrel'], 'costula': ['costula', 'locusta', 'talcous'], 'costumer': ['costumer', 'customer'], 'cosurety': ['cosurety', 'courtesy'], 'cosustain': ['cosustain', 'scusation'], 'cotarius': ['cotarius', 'octarius', 'suctoria'], 'cotarnine': ['connarite', 'container', 'cotarnine', 'crenation', 'narcotine'], 'cote': ['cote', 'teco'], 'coteline': ['coteline', 'election'], 'coteller': ['colleter', 'coteller', 'coterell', 'recollet'], 'coterell': ['colleter', 'coteller', 'coterell', 'recollet'], 'cotesian': ['canoeist', 'cotesian'], 'coth': ['coth', 'ocht'], 'cotidal': ['cotidal', 'lactoid', 'talcoid'], 'cotillage': ['colligate', 'cotillage'], 'cotillion': ['cotillion', 'octillion'], 'cotinga': ['coating', 'cotinga'], 'cotinus': ['cotinus', 'suction', 'unstoic'], 'cotise': ['cotise', 'oecist'], 'coto': ['coot', 'coto', 'toco'], 'cotranspire': ['cotranspire', 'pornerastic'], 'cotrine': ['cerotin', 'cointer', 'cotrine', 'cretion', 'noticer', 'rection'], 'cotripper': ['cotripper', 'periproct'], 'cotte': ['cotte', 'octet'], 'cotylosaur': ['cotylosaur', 'osculatory'], 'cotype': ['cotype', 'ectopy'], 'coude': ['coude', 'douce'], 'could': ['cloud', 'could'], 'coulisse': ['coulisse', 'leucosis', 'ossicule'], 'coulomb': ['columbo', 'coulomb'], 'coumalic': ['caulomic', 'coumalic'], 'coumarin': ['conarium', 'coumarin'], 'counsel': ['counsel', 'unclose'], 'counter': ['cornute', 'counter', 'recount', 'trounce'], 'counteracter': ['counteracter', 'countercarte'], 'countercarte': ['counteracter', 'countercarte'], 'countercharm': ['countercharm', 'countermarch'], 'counterguard': ['counterguard', 'uncorrugated'], 'counteridea': ['counteridea', 'decurionate'], 'countermarch': ['countercharm', 'countermarch'], 'counterpaled': ['counterpaled', 'counterplead', 'unpercolated'], 'counterpaly': ['counterpaly', 'counterplay'], 'counterplay': ['counterpaly', 'counterplay'], 'counterplead': ['counterpaled', 'counterplead', 'unpercolated'], 'counterreply': ['colpeurynter', 'counterreply'], 'countersale': ['countersale', 'counterseal'], 'countersea': ['countersea', 'nectareous'], 'counterseal': ['countersale', 'counterseal'], 'countershade': ['countershade', 'decantherous'], 'counterstand': ['counterstand', 'uncontrasted'], 'countertail': ['countertail', 'reluctation'], 'countertrades': ['countertrades', 'unstercorated'], 'countervail': ['countervail', 'involucrate'], 'countervair': ['countervair', 'overcurtain', 'recurvation'], 'countor': ['contour', 'cornuto', 'countor', 'crouton'], 'coupe': ['coupe', 'pouce'], 'couper': ['couper', 'croupe', 'poucer', 'recoup'], 'couplement': ['couplement', 'uncomplete'], 'couplet': ['couplet', 'octuple'], 'coupon': ['coupon', 'uncoop'], 'couponed': ['couponed', 'uncooped'], 'courante': ['cornuate', 'courante', 'cuneator', 'outrance'], 'courbaril': ['courbaril', 'orbicular'], 'courlan': ['colunar', 'cornual', 'courlan'], 'cours': ['cours', 'scour'], 'course': ['cerous', 'course', 'crouse', 'source'], 'coursed': ['coursed', 'scoured'], 'courser': ['courser', 'scourer'], 'coursing': ['coursing', 'scouring'], 'court': ['court', 'crout', 'turco'], 'courtesan': ['acentrous', 'courtesan', 'nectarous'], 'courtesy': ['cosurety', 'courtesy'], 'courtier': ['courtier', 'outcrier'], 'courtiership': ['courtiership', 'peritrichous'], 'courtin': ['courtin', 'ruction'], 'courtman': ['courtman', 'turcoman'], 'couter': ['couter', 'croute'], 'couth': ['couth', 'thuoc', 'touch'], 'couthily': ['couthily', 'touchily'], 'couthiness': ['couthiness', 'touchiness'], 'couthless': ['couthless', 'touchless'], 'coutil': ['coutil', 'toluic'], 'covenanter': ['contravene', 'covenanter'], 'coverer': ['coverer', 'recover'], 'coversine': ['coversine', 'vernicose'], 'covert': ['covert', 'vector'], 'covisit': ['covisit', 'ovistic'], 'cowardy': ['cowardy', 'cowyard'], 'cowherd': ['chowder', 'cowherd'], 'cowl': ['clow', 'cowl'], 'cowyard': ['cowardy', 'cowyard'], 'coxa': ['coax', 'coxa'], 'coxite': ['coxite', 'exotic'], 'coyness': ['coyness', 'sycones'], 'coyol': ['cooly', 'coyol'], 'coyote': ['coyote', 'oocyte'], 'craber': ['bracer', 'craber'], 'crabhole': ['bachelor', 'crabhole'], 'crablet': ['beclart', 'crablet'], 'crackable': ['blackacre', 'crackable'], 'crackle': ['cackler', 'clacker', 'crackle'], 'crackmans': ['crackmans', 'cracksman'], 'cracksman': ['crackmans', 'cracksman'], 'cradge': ['cadger', 'cradge'], 'cradle': ['cardel', 'cradle'], 'cradlemate': ['cradlemate', 'malcreated'], 'craig': ['cigar', 'craig'], 'crain': ['cairn', 'crain', 'naric'], 'crake': ['acker', 'caker', 'crake', 'creak'], 'cram': ['cram', 'marc'], 'cramasie': ['cramasie', 'mesaraic'], 'crambe': ['becram', 'camber', 'crambe'], 'crambidae': ['carbamide', 'crambidae'], 'crambinae': ['carbamine', 'crambinae'], 'cramble': ['cambrel', 'clamber', 'cramble'], 'cramper': ['cramper', 'recramp'], 'crampon': ['crampon', 'cropman'], 'cranage': ['carnage', 'cranage', 'garance'], 'crance': ['cancer', 'crance'], 'crane': ['caner', 'crane', 'crena', 'nacre', 'rance'], 'craner': ['craner', 'rancer'], 'craney': ['carney', 'craney'], 'crania': ['acinar', 'arnica', 'canari', 'carian', 'carina', 'crania', 'narica'], 'craniad': ['acridan', 'craniad'], 'cranial': ['carinal', 'carlina', 'clarain', 'cranial'], 'cranially': ['ancillary', 'carlylian', 'cranially'], 'cranian': ['canarin', 'cranian'], 'craniate': ['anaretic', 'arcanite', 'carinate', 'craniate'], 'cranic': ['cancri', 'carnic', 'cranic'], 'craniectomy': ['craniectomy', 'cyanometric'], 'craniognomy': ['craniognomy', 'organonymic'], 'craniota': ['craniota', 'croatian', 'narcotia', 'raincoat'], 'cranker': ['cranker', 'recrank'], 'crap': ['carp', 'crap'], 'crape': ['caper', 'crape', 'pacer', 'perca', 'recap'], 'crappie': ['crappie', 'epicarp'], 'crapple': ['clapper', 'crapple'], 'crappo': ['crappo', 'croppa'], 'craps': ['craps', 'scarp', 'scrap'], 'crapulous': ['crapulous', 'opuscular'], 'crare': ['carer', 'crare', 'racer'], 'crate': ['caret', 'carte', 'cater', 'crate', 'creat', 'creta', 'react', 'recta', 'trace'], 'crateful': ['crateful', 'fulcrate'], 'crater': ['arrect', 'carter', 'crater', 'recart', 'tracer'], 'craterid': ['cirrated', 'craterid'], 'crateriform': ['crateriform', 'terraciform'], 'crateris': ['crateris', 'serratic'], 'craterlet': ['clatterer', 'craterlet'], 'craterous': ['craterous', 'recusator'], 'cratinean': ['cratinean', 'incarnate', 'nectarian'], 'cratometric': ['cratometric', 'metrocratic'], 'crave': ['carve', 'crave', 'varec'], 'craven': ['carven', 'cavern', 'craven'], 'craver': ['carver', 'craver'], 'craving': ['carving', 'craving'], 'crayon': ['canroy', 'crayon', 'cyrano', 'nyroca'], 'crayonist': ['carnosity', 'crayonist'], 'crea': ['acer', 'acre', 'care', 'crea', 'race'], 'creagh': ['charge', 'creagh'], 'creak': ['acker', 'caker', 'crake', 'creak'], 'cream': ['cream', 'macer'], 'creamer': ['amercer', 'creamer'], 'creant': ['canter', 'creant', 'cretan', 'nectar', 'recant', 'tanrec', 'trance'], 'crease': ['cesare', 'crease', 'recase', 'searce'], 'creaser': ['creaser', 'searcer'], 'creasing': ['creasing', 'scirenga'], 'creat': ['caret', 'carte', 'cater', 'crate', 'creat', 'creta', 'react', 'recta', 'trace'], 'creatable': ['creatable', 'traceable'], 'create': ['cerate', 'create', 'ecarte'], 'creatine': ['aneretic', 'centiare', 'creatine', 'increate', 'iterance'], 'creatinine': ['creatinine', 'incinerate'], 'creation': ['actioner', 'anerotic', 'ceration', 'creation', 'reaction'], 'creational': ['creational', 'crotalinae', 'laceration', 'reactional'], 'creationary': ['creationary', 'reactionary'], 'creationism': ['anisometric', 'creationism', 'miscreation', 'ramisection', 'reactionism'], 'creationist': ['creationist', 'reactionist'], 'creative': ['creative', 'reactive'], 'creatively': ['creatively', 'reactively'], 'creativeness': ['creativeness', 'reactiveness'], 'creativity': ['creativity', 'reactivity'], 'creator': ['creator', 'reactor'], 'crebrous': ['crebrous', 'obscurer'], 'credential': ['credential', 'interlaced', 'reclinated'], 'credit': ['credit', 'direct'], 'creditable': ['creditable', 'directable'], 'creditive': ['creditive', 'directive'], 'creditor': ['creditor', 'director'], 'creditorship': ['creditorship', 'directorship'], 'creditress': ['creditress', 'directress'], 'creditrix': ['creditrix', 'directrix'], 'crednerite': ['crednerite', 'interceder'], 'credo': ['coder', 'cored', 'credo'], 'cree': ['cere', 'cree'], 'creed': ['ceder', 'cedre', 'cered', 'creed'], 'creedal': ['cedrela', 'creedal', 'declare'], 'creedalism': ['creedalism', 'misdeclare'], 'creedist': ['creedist', 'desertic', 'discreet', 'discrete'], 'creep': ['creep', 'crepe'], 'creepered': ['creepered', 'predecree'], 'creepie': ['creepie', 'repiece'], 'cremation': ['cremation', 'manticore'], 'cremator': ['cremator', 'mercator'], 'crematorial': ['crematorial', 'mercatorial'], 'cremor': ['cremor', 'cromer'], 'crena': ['caner', 'crane', 'crena', 'nacre', 'rance'], 'crenate': ['centare', 'crenate'], 'crenated': ['crenated', 'decanter', 'nectared'], 'crenation': ['connarite', 'container', 'cotarnine', 'crenation', 'narcotine'], 'crenelate': ['crenelate', 'lanceteer'], 'crenelation': ['crenelation', 'intolerance'], 'crenele': ['crenele', 'encreel'], 'crenellation': ['centrolineal', 'crenellation'], 'crenitic': ['crenitic', 'cretinic'], 'crenology': ['crenology', 'necrology'], 'crenula': ['crenula', 'lucarne', 'nuclear', 'unclear'], 'crenulate': ['calenture', 'crenulate'], 'creodonta': ['coronated', 'creodonta'], 'creolian': ['acrolein', 'arecolin', 'caroline', 'colinear', 'cornelia', 'creolian', 'lonicera'], 'creolin': ['creolin', 'licorne', 'locrine'], 'creosotic': ['corticose', 'creosotic'], 'crepe': ['creep', 'crepe'], 'crepidula': ['crepidula', 'pedicular'], 'crepine': ['crepine', 'increep'], 'crepiness': ['crepiness', 'princesse'], 'crepis': ['crepis', 'cripes', 'persic', 'precis', 'spicer'], 'crepitant': ['crepitant', 'pittancer'], 'crepitation': ['actinopteri', 'crepitation', 'precitation'], 'crepitous': ['crepitous', 'euproctis', 'uroseptic'], 'crepitus': ['crepitus', 'piecrust'], 'crepon': ['crepon', 'procne'], 'crepy': ['crepy', 'cypre', 'percy'], 'cresol': ['closer', 'cresol', 'escrol'], 'cresolin': ['cresolin', 'licensor'], 'cresotic': ['cortices', 'cresotic'], 'cresson': ['cresson', 'crosnes'], 'crestline': ['crestline', 'stenciler'], 'crestmoreite': ['crestmoreite', 'stereometric'], 'creta': ['caret', 'carte', 'cater', 'crate', 'creat', 'creta', 'react', 'recta', 'trace'], 'cretan': ['canter', 'creant', 'cretan', 'nectar', 'recant', 'tanrec', 'trance'], 'crete': ['crete', 'erect'], 'cretification': ['certification', 'cretification', 'rectification'], 'cretify': ['certify', 'cretify', 'rectify'], 'cretin': ['cinter', 'cretin', 'crinet'], 'cretinic': ['crenitic', 'cretinic'], 'cretinoid': ['cretinoid', 'direction'], 'cretion': ['cerotin', 'cointer', 'cotrine', 'cretion', 'noticer', 'rection'], 'cretism': ['cretism', 'metrics'], 'crewer': ['crewer', 'recrew'], 'cribo': ['boric', 'cribo', 'orbic'], 'crickle': ['clicker', 'crickle'], 'cricothyroid': ['cricothyroid', 'thyrocricoid'], 'cried': ['cider', 'cried', 'deric', 'dicer'], 'crier': ['crier', 'ricer'], 'criey': ['criey', 'ricey'], 'crile': ['crile', 'elric', 'relic'], 'crimean': ['armenic', 'carmine', 'ceriman', 'crimean', 'mercian'], 'crimeful': ['crimeful', 'merciful'], 'crimeless': ['crimeless', 'merciless'], 'crimelessness': ['crimelessness', 'mercilessness'], 'criminalese': ['criminalese', 'misreliance'], 'criminate': ['antimeric', 'carminite', 'criminate', 'metrician'], 'criminatory': ['coriamyrtin', 'criminatory'], 'crimpage': ['crimpage', 'pergamic'], 'crinal': ['carlin', 'clarin', 'crinal'], 'crinanite': ['crinanite', 'natricine'], 'crinated': ['crinated', 'dicentra'], 'crine': ['cerin', 'crine'], 'crined': ['cedrin', 'cinder', 'crined'], 'crinet': ['cinter', 'cretin', 'crinet'], 'cringle': ['clinger', 'cringle'], 'crinite': ['citrine', 'crinite', 'inciter', 'neritic'], 'crinkle': ['clinker', 'crinkle'], 'cripes': ['crepis', 'cripes', 'persic', 'precis', 'spicer'], 'cripple': ['clipper', 'cripple'], 'crisp': ['crisp', 'scrip'], 'crispation': ['antipsoric', 'ascription', 'crispation'], 'crisped': ['crisped', 'discerp'], 'crispy': ['crispy', 'cypris'], 'crista': ['crista', 'racist'], 'cristopher': ['cristopher', 'rectorship'], 'criteria': ['criteria', 'triceria'], 'criterion': ['criterion', 'tricerion'], 'criterium': ['criterium', 'tricerium'], 'crith': ['crith', 'richt'], 'critic': ['citric', 'critic'], 'cro': ['cor', 'cro', 'orc', 'roc'], 'croak': ['arock', 'croak'], 'croat': ['actor', 'corta', 'croat', 'rocta', 'taroc', 'troca'], 'croatan': ['cantaro', 'croatan'], 'croatian': ['craniota', 'croatian', 'narcotia', 'raincoat'], 'crocein': ['cornice', 'crocein'], 'croceine': ['cicerone', 'croceine'], 'crocetin': ['crocetin', 'necrotic'], 'crocidolite': ['crocidolite', 'crocodilite'], 'crocin': ['cornic', 'crocin'], 'crocodile': ['cordicole', 'crocodile'], 'crocodilite': ['crocidolite', 'crocodilite'], 'croconate': ['coenactor', 'croconate'], 'crocus': ['crocus', 'succor'], 'crom': ['corm', 'crom'], 'crome': ['comer', 'crome'], 'cromer': ['cremor', 'cromer'], 'crone': ['coner', 'crone', 'recon'], 'cronet': ['conter', 'cornet', 'cronet', 'roncet'], 'cronian': ['corinna', 'cronian'], 'cronish': ['cornish', 'cronish', 'sorchin'], 'crony': ['corny', 'crony'], 'croodle': ['colored', 'croodle', 'decolor'], 'crool': ['color', 'corol', 'crool'], 'croon': ['conor', 'croon', 'ronco'], 'crooner': ['coroner', 'crooner', 'recroon'], 'crop': ['copr', 'corp', 'crop'], 'cropman': ['crampon', 'cropman'], 'croppa': ['crappo', 'croppa'], 'crore': ['corer', 'crore'], 'crosa': ['arcos', 'crosa', 'oscar', 'sacro'], 'crosier': ['cirrose', 'crosier'], 'crosnes': ['cresson', 'crosnes'], 'crosse': ['cessor', 'crosse', 'scorse'], 'crosser': ['crosser', 'recross'], 'crossite': ['crossite', 'crosstie'], 'crossover': ['crossover', 'overcross'], 'crosstie': ['crossite', 'crosstie'], 'crosstied': ['crosstied', 'dissector'], 'crosstree': ['crosstree', 'rectoress'], 'crosswalk': ['classwork', 'crosswalk'], 'crotal': ['carlot', 'crotal'], 'crotalic': ['cortical', 'crotalic'], 'crotalinae': ['creational', 'crotalinae', 'laceration', 'reactional'], 'crotaline': ['alectrion', 'clarionet', 'crotaline', 'locarnite'], 'crotalism': ['clamorist', 'crotalism'], 'crotalo': ['crotalo', 'locator'], 'crotaloid': ['crotaloid', 'doctorial'], 'crotin': ['citron', 'cortin', 'crotin'], 'croton': ['corton', 'croton'], 'crotonate': ['contortae', 'crotonate'], 'crottle': ['clotter', 'crottle'], 'crouchant': ['archcount', 'crouchant'], 'croupal': ['copular', 'croupal', 'cupolar', 'porcula'], 'croupe': ['couper', 'croupe', 'poucer', 'recoup'], 'croupily': ['croupily', 'polyuric'], 'croupiness': ['croupiness', 'percussion', 'supersonic'], 'crouse': ['cerous', 'course', 'crouse', 'source'], 'crout': ['court', 'crout', 'turco'], 'croute': ['couter', 'croute'], 'crouton': ['contour', 'cornuto', 'countor', 'crouton'], 'crowder': ['crowder', 'recrowd'], 'crowned': ['crowned', 'decrown'], 'crowner': ['crowner', 'recrown'], 'crownmaker': ['cankerworm', 'crownmaker'], 'croy': ['cory', 'croy'], 'croydon': ['corydon', 'croydon'], 'cruces': ['cercus', 'cruces'], 'cruciate': ['aceturic', 'cruciate'], 'crudwort': ['crudwort', 'curdwort'], 'cruel': ['cruel', 'lucre', 'ulcer'], 'cruels': ['clerus', 'cruels'], 'cruelty': ['cruelty', 'cutlery'], 'cruet': ['cruet', 'eruct', 'recut', 'truce'], 'cruise': ['cruise', 'crusie'], 'cruisken': ['cruisken', 'unsicker'], 'crunode': ['crunode', 'uncored'], 'crureus': ['crureus', 'surcrue'], 'crurogenital': ['crurogenital', 'genitocrural'], 'cruroinguinal': ['cruroinguinal', 'inguinocrural'], 'crus': ['crus', 'scur'], 'crusado': ['acrodus', 'crusado'], 'crusca': ['crusca', 'curcas'], 'cruse': ['cruse', 'curse', 'sucre'], 'crusher': ['crusher', 'recrush'], 'crusie': ['cruise', 'crusie'], 'crust': ['crust', 'curst'], 'crustate': ['crustate', 'scrutate'], 'crustation': ['crustation', 'scrutation'], 'crustily': ['crustily', 'rusticly'], 'crustiness': ['crustiness', 'rusticness'], 'crusty': ['crusty', 'curtsy'], 'cruth': ['cruth', 'rutch'], 'cryosel': ['cryosel', 'scroyle'], 'cryptodire': ['cryptodire', 'predictory'], 'cryptomeria': ['cryptomeria', 'imprecatory'], 'cryptostomate': ['cryptostomate', 'prostatectomy'], 'ctenidial': ['ctenidial', 'identical'], 'ctenoid': ['condite', 'ctenoid'], 'ctenolium': ['ctenolium', 'monticule'], 'ctenophore': ['ctenophore', 'nectophore'], 'ctetology': ['ctetology', 'tectology'], 'cuailnge': ['cuailnge', 'glaucine'], 'cuarteron': ['cuarteron', 'raconteur'], 'cubanite': ['cubanite', 'incubate'], 'cuber': ['bruce', 'cebur', 'cuber'], 'cubist': ['bustic', 'cubist'], 'cubit': ['butic', 'cubit'], 'cubitale': ['baculite', 'cubitale'], 'cuboidal': ['baculoid', 'cuboidal'], 'cuchan': ['caunch', 'cuchan'], 'cueball': ['bullace', 'cueball'], 'cueman': ['acumen', 'cueman'], 'cuir': ['cuir', 'uric'], 'culebra': ['culebra', 'curable'], 'culet': ['culet', 'lucet'], 'culinary': ['culinary', 'uranylic'], 'culmy': ['culmy', 'cumyl'], 'culpose': ['culpose', 'ploceus', 'upclose'], 'cultch': ['clutch', 'cultch'], 'cultivar': ['cultivar', 'curvital'], 'culturine': ['culturine', 'inculture'], 'cumaean': ['cumaean', 'encauma'], 'cumar': ['carum', 'cumar'], 'cumber': ['cumber', 'cumbre'], 'cumberer': ['cerebrum', 'cumberer'], 'cumbraite': ['bacterium', 'cumbraite'], 'cumbre': ['cumber', 'cumbre'], 'cumic': ['cumic', 'mucic'], 'cumin': ['cumin', 'mucin'], 'cumol': ['cumol', 'locum'], 'cumulite': ['cumulite', 'lutecium'], 'cumyl': ['culmy', 'cumyl'], 'cuna': ['cuna', 'unca'], 'cunan': ['canun', 'cunan'], 'cuneal': ['auncel', 'cuneal', 'lacune', 'launce', 'unlace'], 'cuneator': ['cornuate', 'courante', 'cuneator', 'outrance'], 'cunila': ['cunila', 'lucian', 'lucina', 'uncial'], 'cuon': ['cuon', 'unco'], 'cuorin': ['cuorin', 'uronic'], 'cupid': ['cupid', 'pudic'], 'cupidity': ['cupidity', 'pudicity'], 'cupidone': ['cupidone', 'uncopied'], 'cupola': ['copula', 'cupola'], 'cupolar': ['copular', 'croupal', 'cupolar', 'porcula'], 'cupreous': ['cupreous', 'upcourse'], 'cuprite': ['cuprite', 'picture'], 'curable': ['culebra', 'curable'], 'curate': ['acture', 'cauter', 'curate'], 'curateship': ['curateship', 'pasticheur'], 'curation': ['curation', 'nocturia'], 'curatory': ['curatory', 'outcarry'], 'curcas': ['crusca', 'curcas'], 'curdle': ['curdle', 'curled'], 'curdwort': ['crudwort', 'curdwort'], 'cure': ['cure', 'ecru', 'eruc'], 'curer': ['curer', 'recur'], 'curial': ['curial', 'lauric', 'uracil', 'uralic'], 'curialist': ['curialist', 'rusticial'], 'curie': ['curie', 'ureic'], 'curin': ['curin', 'incur', 'runic'], 'curine': ['curine', 'erucin', 'neuric'], 'curiosa': ['carious', 'curiosa'], 'curite': ['curite', 'teucri', 'uretic'], 'curled': ['curdle', 'curled'], 'curler': ['curler', 'recurl'], 'cursa': ['cursa', 'scaur'], 'cursal': ['cursal', 'sulcar'], 'curse': ['cruse', 'curse', 'sucre'], 'cursed': ['cedrus', 'cursed'], 'curst': ['crust', 'curst'], 'cursus': ['cursus', 'ruscus'], 'curtail': ['curtail', 'trucial'], 'curtailer': ['curtailer', 'recruital', 'reticular'], 'curtain': ['curtain', 'turacin', 'turcian'], 'curtation': ['anticourt', 'curtation', 'ructation'], 'curtilage': ['curtilage', 'cutigeral', 'graticule'], 'curtis': ['citrus', 'curtis', 'rictus', 'rustic'], 'curtise': ['curtise', 'icterus'], 'curtsy': ['crusty', 'curtsy'], 'curvital': ['cultivar', 'curvital'], 'cush': ['cush', 'such'], 'cushionless': ['cushionless', 'slouchiness'], 'cusinero': ['coinsure', 'corineus', 'cusinero'], 'cusk': ['cusk', 'suck'], 'cusp': ['cusp', 'scup'], 'cuspal': ['cuspal', 'placus'], 'custom': ['custom', 'muscot'], 'customer': ['costumer', 'customer'], 'cutheal': ['auchlet', 'cutheal', 'taluche'], 'cutigeral': ['curtilage', 'cutigeral', 'graticule'], 'cutin': ['cutin', 'incut', 'tunic'], 'cutis': ['cutis', 'ictus'], 'cutler': ['cutler', 'reluct'], 'cutleress': ['cutleress', 'lecturess', 'truceless'], 'cutleria': ['arculite', 'cutleria', 'lucretia', 'reticula', 'treculia'], 'cutlery': ['cruelty', 'cutlery'], 'cutlet': ['cutlet', 'cuttle'], 'cutoff': ['cutoff', 'offcut'], 'cutout': ['cutout', 'outcut'], 'cutover': ['cutover', 'overcut'], 'cuttle': ['cutlet', 'cuttle'], 'cuttler': ['clutter', 'cuttler'], 'cutup': ['cutup', 'upcut'], 'cuya': ['cuya', 'yuca'], 'cyamus': ['cyamus', 'muysca'], 'cyan': ['cany', 'cyan'], 'cyanidine': ['cyanidine', 'dicyanine'], 'cyanol': ['alcyon', 'cyanol'], 'cyanole': ['alcyone', 'cyanole'], 'cyanometric': ['craniectomy', 'cyanometric'], 'cyanophycin': ['cyanophycin', 'phycocyanin'], 'cyanuret': ['centaury', 'cyanuret'], 'cyath': ['cathy', 'cyath', 'yacht'], 'cyclamine': ['cyclamine', 'macilency'], 'cyclian': ['cyclian', 'cynical'], 'cyclide': ['cyclide', 'decylic', 'dicycle'], 'cyclism': ['clysmic', 'cyclism'], 'cyclotome': ['colectomy', 'cyclotome'], 'cydonian': ['anodynic', 'cydonian'], 'cylindrite': ['cylindrite', 'indirectly'], 'cylix': ['cylix', 'xylic'], 'cymation': ['cymation', 'myatonic', 'onymatic'], 'cymoid': ['cymoid', 'mycoid'], 'cymometer': ['cymometer', 'mecometry'], 'cymose': ['cymose', 'mycose'], 'cymule': ['cymule', 'lyceum'], 'cynara': ['canary', 'cynara'], 'cynaroid': ['cynaroid', 'dicaryon'], 'cynical': ['cyclian', 'cynical'], 'cynogale': ['acylogen', 'cynogale'], 'cynophilic': ['cynophilic', 'philocynic'], 'cynosural': ['consulary', 'cynosural'], 'cyphonism': ['cyphonism', 'symphonic'], 'cypre': ['crepy', 'cypre', 'percy'], 'cypria': ['cypria', 'picary', 'piracy'], 'cyprian': ['cyprian', 'cyprina'], 'cyprina': ['cyprian', 'cyprina'], 'cyprine': ['cyprine', 'pyrenic'], 'cypris': ['crispy', 'cypris'], 'cyrano': ['canroy', 'crayon', 'cyrano', 'nyroca'], 'cyril': ['cyril', 'lyric'], 'cyrilla': ['cyrilla', 'lyrical'], 'cyrtopia': ['cyrtopia', 'poticary'], 'cyst': ['cyst', 'scyt'], 'cystidean': ['asyndetic', 'cystidean', 'syndicate'], 'cystitis': ['cystitis', 'scytitis'], 'cystoadenoma': ['adenocystoma', 'cystoadenoma'], 'cystofibroma': ['cystofibroma', 'fibrocystoma'], 'cystolith': ['cystolith', 'lithocyst'], 'cystomyxoma': ['cystomyxoma', 'myxocystoma'], 'cystonephrosis': ['cystonephrosis', 'nephrocystosis'], 'cystopyelitis': ['cystopyelitis', 'pyelocystitis'], 'cystotome': ['cystotome', 'cytostome', 'ostectomy'], 'cystourethritis': ['cystourethritis', 'urethrocystitis'], 'cytase': ['cytase', 'stacey'], 'cytherea': ['cheatery', 'cytherea', 'teachery'], 'cytherean': ['cytherean', 'enchytrae'], 'cytisine': ['cytisine', 'syenitic'], 'cytoblastemic': ['blastomycetic', 'cytoblastemic'], 'cytoblastemous': ['blastomycetous', 'cytoblastemous'], 'cytochrome': ['chromocyte', 'cytochrome'], 'cytoid': ['cytoid', 'docity'], 'cytomere': ['cytomere', 'merocyte'], 'cytophil': ['cytophil', 'phycitol'], 'cytosine': ['cenosity', 'cytosine'], 'cytosome': ['cytosome', 'otomyces'], 'cytost': ['cytost', 'scotty'], 'cytostome': ['cystotome', 'cytostome', 'ostectomy'], 'czarian': ['czarian', 'czarina'], 'czarina': ['czarian', 'czarina'], 'da': ['ad', 'da'], 'dab': ['bad', 'dab'], 'dabber': ['barbed', 'dabber'], 'dabbler': ['dabbler', 'drabble'], 'dabitis': ['dabitis', 'dibatis'], 'dablet': ['dablet', 'tabled'], 'dace': ['cade', 'dace', 'ecad'], 'dacelo': ['alcedo', 'dacelo'], 'dacian': ['acnida', 'anacid', 'dacian'], 'dacker': ['arcked', 'dacker'], 'dacryolith': ['dacryolith', 'hydrotical'], 'dacryon': ['candroy', 'dacryon'], 'dactylonomy': ['dactylonomy', 'monodactyly'], 'dactylopteridae': ['dactylopteridae', 'pterodactylidae'], 'dactylopterus': ['dactylopterus', 'pterodactylus'], 'dacus': ['cadus', 'dacus'], 'dad': ['add', 'dad'], 'dada': ['adad', 'adda', 'dada'], 'dadap': ['dadap', 'padda'], 'dade': ['dade', 'dead', 'edda'], 'dadu': ['addu', 'dadu', 'daud', 'duad'], 'dae': ['ade', 'dae'], 'daemon': ['daemon', 'damone', 'modena'], 'daemonic': ['codamine', 'comedian', 'daemonic', 'demoniac'], 'daer': ['ared', 'daer', 'dare', 'dear', 'read'], 'dag': ['dag', 'gad'], 'dagaba': ['badaga', 'dagaba', 'gadaba'], 'dagame': ['dagame', 'damage'], 'dagbane': ['bandage', 'dagbane'], 'dagestan': ['dagestan', 'standage'], 'dagger': ['dagger', 'gadger', 'ragged'], 'daggers': ['daggers', 'seggard'], 'daggle': ['daggle', 'lagged'], 'dago': ['dago', 'goad'], 'dagomba': ['dagomba', 'gambado'], 'dags': ['dags', 'sgad'], 'dah': ['dah', 'dha', 'had'], 'daidle': ['daidle', 'laddie'], 'daikon': ['daikon', 'nodiak'], 'dail': ['dail', 'dali', 'dial', 'laid', 'lida'], 'daily': ['daily', 'lydia'], 'daimen': ['daimen', 'damine', 'maiden', 'median', 'medina'], 'daimio': ['daimio', 'maioid'], 'daimon': ['amidon', 'daimon', 'domain'], 'dain': ['adin', 'andi', 'dain', 'dani', 'dian', 'naid'], 'dairi': ['dairi', 'darii', 'radii'], 'dairy': ['dairy', 'diary', 'yaird'], 'dais': ['dais', 'dasi', 'disa', 'said', 'sida'], 'daisy': ['daisy', 'sayid'], 'daker': ['daker', 'drake', 'kedar', 'radek'], 'dal': ['dal', 'lad'], 'dale': ['dale', 'deal', 'lade', 'lead', 'leda'], 'dalea': ['adela', 'dalea'], 'dalecarlian': ['calendarial', 'dalecarlian'], 'daleman': ['daleman', 'lademan', 'leadman'], 'daler': ['alder', 'daler', 'lader'], 'dalesman': ['dalesman', 'leadsman'], 'dali': ['dail', 'dali', 'dial', 'laid', 'lida'], 'dalle': ['dalle', 'della', 'ladle'], 'dallying': ['dallying', 'ladyling'], 'dalt': ['dalt', 'tald'], 'dalteen': ['dalteen', 'dentale', 'edental'], 'dam': ['dam', 'mad'], 'dama': ['adam', 'dama'], 'damage': ['dagame', 'damage'], 'daman': ['adman', 'daman', 'namda'], 'damara': ['armada', 'damara', 'ramada'], 'dame': ['dame', 'made', 'mead'], 'damewort': ['damewort', 'wardmote'], 'damia': ['amadi', 'damia', 'madia', 'maida'], 'damie': ['amide', 'damie', 'media'], 'damier': ['admire', 'armied', 'damier', 'dimera', 'merida'], 'damine': ['daimen', 'damine', 'maiden', 'median', 'medina'], 'dammer': ['dammer', 'dramme'], 'dammish': ['dammish', 'mahdism'], 'damn': ['damn', 'mand'], 'damnation': ['damnation', 'mandation'], 'damnatory': ['damnatory', 'mandatory'], 'damned': ['damned', 'demand', 'madden'], 'damner': ['damner', 'manred', 'randem', 'remand'], 'damnii': ['amidin', 'damnii'], 'damnous': ['damnous', 'osmunda'], 'damon': ['damon', 'monad', 'nomad'], 'damone': ['daemon', 'damone', 'modena'], 'damonico': ['damonico', 'monoacid'], 'dampen': ['dampen', 'madnep'], 'damper': ['damper', 'ramped'], 'dampish': ['dampish', 'madship', 'phasmid'], 'dan': ['and', 'dan'], 'dana': ['anda', 'dana'], 'danaan': ['ananda', 'danaan'], 'danai': ['danai', 'diana', 'naiad'], 'danainae': ['anadenia', 'danainae'], 'danakil': ['danakil', 'dankali', 'kaldani', 'ladakin'], 'danalite': ['danalite', 'detainal'], 'dancalite': ['cadential', 'dancalite'], 'dance': ['dance', 'decan'], 'dancer': ['cedarn', 'dancer', 'nacred'], 'dancery': ['ardency', 'dancery'], 'dander': ['dander', 'darned', 'nadder'], 'dandle': ['dandle', 'landed'], 'dandler': ['dandler', 'dendral'], 'dane': ['ande', 'dane', 'dean', 'edna'], 'danewort': ['danewort', 'teardown'], 'danger': ['danger', 'gander', 'garden', 'ranged'], 'dangerful': ['dangerful', 'gardenful'], 'dangerless': ['dangerless', 'gardenless'], 'dangle': ['angled', 'dangle', 'englad', 'lagend'], 'dangler': ['dangler', 'gnarled'], 'danglin': ['danglin', 'landing'], 'dani': ['adin', 'andi', 'dain', 'dani', 'dian', 'naid'], 'danian': ['andian', 'danian', 'nidana'], 'danic': ['canid', 'cnida', 'danic'], 'daniel': ['aldine', 'daniel', 'delian', 'denial', 'enalid', 'leadin'], 'daniele': ['adeline', 'daniele', 'delaine'], 'danielic': ['alcidine', 'danielic', 'lecaniid'], 'danio': ['adion', 'danio', 'doina', 'donia'], 'danish': ['danish', 'sandhi'], 'danism': ['danism', 'disman'], 'danite': ['danite', 'detain'], 'dankali': ['danakil', 'dankali', 'kaldani', 'ladakin'], 'danli': ['danli', 'ladin', 'linda', 'nidal'], 'dannie': ['aidenn', 'andine', 'dannie', 'indane'], 'danseuse': ['danseuse', 'sudanese'], 'dantean': ['andante', 'dantean'], 'dantist': ['dantist', 'distant'], 'danuri': ['danuri', 'diurna', 'dunair', 'durain', 'durani', 'durian'], 'dao': ['ado', 'dao', 'oda'], 'daoine': ['daoine', 'oneida'], 'dap': ['dap', 'pad'], 'daphnis': ['daphnis', 'dishpan'], 'dapicho': ['dapicho', 'phacoid'], 'dapple': ['dapple', 'lapped', 'palped'], 'dar': ['dar', 'rad'], 'daraf': ['daraf', 'farad'], 'darby': ['bardy', 'darby'], 'darci': ['acrid', 'caird', 'carid', 'darci', 'daric', 'dirca'], 'dare': ['ared', 'daer', 'dare', 'dear', 'read'], 'dareall': ['ardella', 'dareall'], 'daren': ['andre', 'arend', 'daren', 'redan'], 'darer': ['darer', 'drear'], 'darg': ['darg', 'drag', 'grad'], 'darger': ['darger', 'gerard', 'grader', 'redrag', 'regard'], 'dargo': ['dargo', 'dogra', 'drago'], 'dargsman': ['dargsman', 'dragsman'], 'dari': ['arid', 'dari', 'raid'], 'daric': ['acrid', 'caird', 'carid', 'darci', 'daric', 'dirca'], 'darien': ['darien', 'draine'], 'darii': ['dairi', 'darii', 'radii'], 'darin': ['darin', 'dinar', 'drain', 'indra', 'nadir', 'ranid'], 'daring': ['daring', 'dingar', 'gradin'], 'darius': ['darius', 'radius'], 'darken': ['darken', 'kanred', 'ranked'], 'darkener': ['darkener', 'redarken'], 'darn': ['darn', 'nard', 'rand'], 'darned': ['dander', 'darned', 'nadder'], 'darnel': ['aldern', 'darnel', 'enlard', 'lander', 'lenard', 'randle', 'reland'], 'darner': ['darner', 'darren', 'errand', 'rander', 'redarn'], 'darning': ['darning', 'randing'], 'darrein': ['darrein', 'drainer'], 'darren': ['darner', 'darren', 'errand', 'rander', 'redarn'], 'darshana': ['darshana', 'shardana'], 'darst': ['darst', 'darts', 'strad'], 'dart': ['dart', 'drat'], 'darter': ['darter', 'dartre', 'redart', 'retard', 'retrad', 'tarred', 'trader'], 'darting': ['darting', 'trading'], 'dartle': ['dartle', 'tardle'], 'dartoic': ['arctoid', 'carotid', 'dartoic'], 'dartre': ['darter', 'dartre', 'redart', 'retard', 'retrad', 'tarred', 'trader'], 'dartrose': ['dartrose', 'roadster'], 'darts': ['darst', 'darts', 'strad'], 'daryl': ['daryl', 'lardy', 'lyard'], 'das': ['das', 'sad'], 'dash': ['dash', 'sadh', 'shad'], 'dashed': ['dashed', 'shaded'], 'dasheen': ['dasheen', 'enshade'], 'dasher': ['dasher', 'shader', 'sheard'], 'dashing': ['dashing', 'shading'], 'dashnak': ['dashnak', 'shadkan'], 'dashy': ['dashy', 'shady'], 'dasi': ['dais', 'dasi', 'disa', 'said', 'sida'], 'dasnt': ['dasnt', 'stand'], 'dasturi': ['dasturi', 'rudista'], 'dasya': ['adays', 'dasya'], 'dasyurine': ['dasyurine', 'dysneuria'], 'data': ['adat', 'data'], 'datable': ['albetad', 'datable'], 'dataria': ['dataria', 'radiata'], 'date': ['adet', 'date', 'tade', 'tead', 'teda'], 'dateless': ['dateless', 'detassel'], 'dater': ['dater', 'derat', 'detar', 'drate', 'rated', 'trade', 'tread'], 'datil': ['datil', 'dital', 'tidal', 'tilda'], 'datism': ['amidst', 'datism'], 'daub': ['baud', 'buda', 'daub'], 'dauber': ['dauber', 'redaub'], 'daubster': ['daubster', 'subtread'], 'daud': ['addu', 'dadu', 'daud', 'duad'], 'daunch': ['chandu', 'daunch'], 'daunter': ['daunter', 'unarted', 'unrated', 'untread'], 'dauntless': ['adultness', 'dauntless'], 'daur': ['ardu', 'daur', 'dura'], 'dave': ['dave', 'deva', 'vade', 'veda'], 'daven': ['daven', 'vaned'], 'davy': ['davy', 'vady'], 'daw': ['awd', 'daw', 'wad'], 'dawdler': ['dawdler', 'waddler'], 'dawdling': ['dawdling', 'waddling'], 'dawdlingly': ['dawdlingly', 'waddlingly'], 'dawdy': ['dawdy', 'waddy'], 'dawn': ['dawn', 'wand'], 'dawnlike': ['dawnlike', 'wandlike'], 'dawny': ['dawny', 'wandy'], 'day': ['ady', 'day', 'yad'], 'dayal': ['adlay', 'dayal'], 'dayfly': ['dayfly', 'ladyfy'], 'days': ['days', 'dyas'], 'daysman': ['daysman', 'mandyas'], 'daytime': ['daytime', 'maytide'], 'daywork': ['daywork', 'workday'], 'daze': ['adze', 'daze'], 'de': ['de', 'ed'], 'deacon': ['acnode', 'deacon'], 'deaconship': ['deaconship', 'endophasic'], 'dead': ['dade', 'dead', 'edda'], 'deadborn': ['deadborn', 'endboard'], 'deadener': ['deadener', 'endeared'], 'deadlock': ['deadlock', 'deckload'], 'deaf': ['deaf', 'fade'], 'deair': ['aider', 'deair', 'irade', 'redia'], 'deal': ['dale', 'deal', 'lade', 'lead', 'leda'], 'dealable': ['dealable', 'leadable'], 'dealation': ['atloidean', 'dealation'], 'dealer': ['dealer', 'leader', 'redeal', 'relade', 'relead'], 'dealership': ['dealership', 'leadership'], 'dealing': ['adeling', 'dealing', 'leading'], 'dealt': ['adlet', 'dealt', 'delta', 'lated', 'taled'], 'deaminase': ['deaminase', 'mesadenia'], 'dean': ['ande', 'dane', 'dean', 'edna'], 'deaner': ['deaner', 'endear'], 'deaness': ['deaness', 'edessan'], 'deaquation': ['adequation', 'deaquation'], 'dear': ['ared', 'daer', 'dare', 'dear', 'read'], 'dearie': ['aeried', 'dearie'], 'dearth': ['dearth', 'hatred', 'rathed', 'thread'], 'deary': ['deary', 'deray', 'rayed', 'ready', 'yeard'], 'deash': ['deash', 'hades', 'sadhe', 'shade'], 'deasil': ['aisled', 'deasil', 'ladies', 'sailed'], 'deave': ['deave', 'eaved', 'evade'], 'deb': ['bed', 'deb'], 'debacle': ['belaced', 'debacle'], 'debar': ['ardeb', 'beard', 'bread', 'debar'], 'debark': ['bedark', 'debark'], 'debaser': ['debaser', 'sabered'], 'debater': ['betread', 'debater'], 'deben': ['beden', 'deben', 'deneb'], 'debi': ['beid', 'bide', 'debi', 'dieb'], 'debile': ['debile', 'edible'], 'debit': ['bidet', 'debit'], 'debosh': ['beshod', 'debosh'], 'debrief': ['debrief', 'defiber', 'fibered'], 'debutant': ['debutant', 'unbatted'], 'debutante': ['debutante', 'unabetted'], 'decachord': ['decachord', 'dodecarch'], 'decadic': ['caddice', 'decadic'], 'decal': ['clead', 'decal', 'laced'], 'decalin': ['cladine', 'decalin', 'iceland'], 'decaliter': ['decaliter', 'decalitre'], 'decalitre': ['decaliter', 'decalitre'], 'decameter': ['decameter', 'decametre'], 'decametre': ['decameter', 'decametre'], 'decan': ['dance', 'decan'], 'decanal': ['candela', 'decanal'], 'decani': ['decani', 'decian'], 'decant': ['cadent', 'canted', 'decant'], 'decantate': ['catenated', 'decantate'], 'decanter': ['crenated', 'decanter', 'nectared'], 'decantherous': ['countershade', 'decantherous'], 'decap': ['caped', 'decap', 'paced'], 'decart': ['cedrat', 'decart', 'redact'], 'decastere': ['decastere', 'desecrate'], 'decator': ['cordate', 'decator', 'redcoat'], 'decay': ['acedy', 'decay'], 'deceiver': ['deceiver', 'received'], 'decennia': ['cadinene', 'decennia', 'enneadic'], 'decennial': ['celandine', 'decennial'], 'decent': ['cedent', 'decent'], 'decenter': ['centered', 'decenter', 'decentre', 'recedent'], 'decentre': ['centered', 'decenter', 'decentre', 'recedent'], 'decern': ['cendre', 'decern'], 'decian': ['decani', 'decian'], 'deciatine': ['deciatine', 'diacetine', 'taenicide', 'teniacide'], 'decider': ['decider', 'decried'], 'decillion': ['celloidin', 'collidine', 'decillion'], 'decima': ['amiced', 'decima'], 'decimal': ['camelid', 'decimal', 'declaim', 'medical'], 'decimally': ['decimally', 'medically'], 'decimate': ['decimate', 'medicate'], 'decimation': ['decimation', 'medication'], 'decimator': ['decimator', 'medicator', 'mordicate'], 'decimestrial': ['decimestrial', 'sedimetrical'], 'decimosexto': ['decimosexto', 'sextodecimo'], 'deckel': ['deckel', 'deckle'], 'decker': ['decker', 'redeck'], 'deckle': ['deckel', 'deckle'], 'deckload': ['deadlock', 'deckload'], 'declaim': ['camelid', 'decimal', 'declaim', 'medical'], 'declaimer': ['declaimer', 'demiracle'], 'declaration': ['declaration', 'redactional'], 'declare': ['cedrela', 'creedal', 'declare'], 'declass': ['classed', 'declass'], 'declinate': ['declinate', 'encitadel'], 'declinatory': ['adrenolytic', 'declinatory'], 'decoat': ['coated', 'decoat'], 'decollate': ['decollate', 'ocellated'], 'decollator': ['corollated', 'decollator'], 'decolor': ['colored', 'croodle', 'decolor'], 'decompress': ['compressed', 'decompress'], 'deconsider': ['considered', 'deconsider'], 'decorate': ['decorate', 'ocreated'], 'decoration': ['carotenoid', 'coronadite', 'decoration'], 'decorist': ['decorist', 'sectroid'], 'decream': ['decream', 'racemed'], 'decree': ['decree', 'recede'], 'decreer': ['decreer', 'receder'], 'decreet': ['decreet', 'decrete'], 'decrepit': ['decrepit', 'depicter', 'precited'], 'decrete': ['decreet', 'decrete'], 'decretist': ['decretist', 'trisected'], 'decrial': ['decrial', 'radicel', 'radicle'], 'decried': ['decider', 'decried'], 'decrown': ['crowned', 'decrown'], 'decry': ['cedry', 'decry'], 'decurionate': ['counteridea', 'decurionate'], 'decurrency': ['decurrency', 'recrudency'], 'decursion': ['cinderous', 'decursion'], 'decus': ['decus', 'duces'], 'decyl': ['clyde', 'decyl'], 'decylic': ['cyclide', 'decylic', 'dicycle'], 'dedan': ['dedan', 'denda'], 'dedicant': ['addicent', 'dedicant'], 'dedo': ['dedo', 'dode', 'eddo'], 'deduce': ['deduce', 'deuced'], 'deduct': ['deduct', 'ducted'], 'deem': ['deem', 'deme', 'mede', 'meed'], 'deemer': ['deemer', 'meered', 'redeem', 'remede'], 'deep': ['deep', 'peed'], 'deer': ['deer', 'dere', 'dree', 'rede', 'reed'], 'deerhair': ['deerhair', 'dehairer'], 'deerhorn': ['deerhorn', 'dehorner'], 'deerwood': ['deerwood', 'doorweed'], 'defat': ['defat', 'fated'], 'defaulter': ['defaulter', 'redefault'], 'defeater': ['defeater', 'federate', 'redefeat'], 'defensor': ['defensor', 'foresend'], 'defer': ['defer', 'freed'], 'defial': ['afield', 'defial'], 'defiber': ['debrief', 'defiber', 'fibered'], 'defile': ['defile', 'fidele'], 'defiled': ['defiled', 'fielded'], 'defiler': ['defiler', 'fielder'], 'definable': ['beanfield', 'definable'], 'define': ['define', 'infeed'], 'definer': ['definer', 'refined'], 'deflect': ['clefted', 'deflect'], 'deflesh': ['deflesh', 'fleshed'], 'deflex': ['deflex', 'flexed'], 'deflower': ['deflower', 'flowered'], 'defluent': ['defluent', 'unfelted'], 'defog': ['defog', 'fodge'], 'deforciant': ['deforciant', 'fornicated'], 'deforest': ['deforest', 'forested'], 'deform': ['deform', 'formed'], 'deformer': ['deformer', 'reformed'], 'defray': ['defray', 'frayed'], 'defrost': ['defrost', 'frosted'], 'deg': ['deg', 'ged'], 'degarnish': ['degarnish', 'garnished'], 'degasser': ['degasser', 'dressage'], 'degelation': ['degelation', 'delegation'], 'degrain': ['degrain', 'deraign', 'deringa', 'gradine', 'grained', 'reading'], 'degu': ['degu', 'gude'], 'dehair': ['dehair', 'haired'], 'dehairer': ['deerhair', 'dehairer'], 'dehorn': ['dehorn', 'horned'], 'dehorner': ['deerhorn', 'dehorner'], 'dehors': ['dehors', 'rhodes', 'shoder', 'shored'], 'dehortation': ['dehortation', 'theriodonta'], 'dehusk': ['dehusk', 'husked'], 'deicer': ['ceride', 'deicer'], 'deictical': ['deictical', 'dialectic'], 'deification': ['deification', 'edification'], 'deificatory': ['deificatory', 'edificatory'], 'deifier': ['deifier', 'edifier'], 'deify': ['deify', 'edify'], 'deign': ['deign', 'dinge', 'nidge'], 'deino': ['deino', 'dione', 'edoni'], 'deinocephalia': ['deinocephalia', 'palaeechinoid'], 'deinos': ['deinos', 'donsie', 'inodes', 'onside'], 'deipara': ['deipara', 'paridae'], 'deirdre': ['deirdre', 'derider', 'derride', 'ridered'], 'deism': ['deism', 'disme'], 'deist': ['deist', 'steid'], 'deistic': ['deistic', 'dietics'], 'deistically': ['deistically', 'dialystelic'], 'deity': ['deity', 'tydie'], 'deityship': ['deityship', 'diphysite'], 'del': ['del', 'eld', 'led'], 'delaine': ['adeline', 'daniele', 'delaine'], 'delaminate': ['antemedial', 'delaminate'], 'delapse': ['delapse', 'sepaled'], 'delate': ['delate', 'elated'], 'delater': ['delater', 'related', 'treadle'], 'delator': ['delator', 'leotard'], 'delawn': ['delawn', 'lawned', 'wandle'], 'delay': ['delay', 'leady'], 'delayer': ['delayer', 'layered', 'redelay'], 'delayful': ['delayful', 'feudally'], 'dele': ['dele', 'lede', 'leed'], 'delead': ['delead', 'leaded'], 'delegation': ['degelation', 'delegation'], 'delegatory': ['delegatory', 'derogately'], 'delete': ['delete', 'teedle'], 'delf': ['delf', 'fled'], 'delhi': ['delhi', 'hield'], 'delia': ['adiel', 'delia', 'ideal'], 'delian': ['aldine', 'daniel', 'delian', 'denial', 'enalid', 'leadin'], 'delible': ['bellied', 'delible'], 'delicateness': ['delicateness', 'delicatessen'], 'delicatessen': ['delicateness', 'delicatessen'], 'delichon': ['chelidon', 'chelonid', 'delichon'], 'delict': ['delict', 'deltic'], 'deligation': ['deligation', 'gadolinite', 'gelatinoid'], 'delignate': ['delignate', 'gelatined'], 'delimit': ['delimit', 'limited'], 'delimitation': ['delimitation', 'mniotiltidae'], 'delineator': ['delineator', 'rondeletia'], 'delint': ['delint', 'dentil'], 'delirament': ['delirament', 'derailment'], 'deliriant': ['deliriant', 'draintile', 'interlaid'], 'deliver': ['deliver', 'deviler', 'livered'], 'deliverer': ['deliverer', 'redeliver'], 'della': ['dalle', 'della', 'ladle'], 'deloul': ['deloul', 'duello'], 'delphinius': ['delphinius', 'sulphinide'], 'delta': ['adlet', 'dealt', 'delta', 'lated', 'taled'], 'deltaic': ['citadel', 'deltaic', 'dialect', 'edictal', 'lactide'], 'deltic': ['delict', 'deltic'], 'deluding': ['deluding', 'ungilded'], 'delusion': ['delusion', 'unsoiled'], 'delusionist': ['delusionist', 'indissolute'], 'deluster': ['deluster', 'ulstered'], 'demal': ['demal', 'medal'], 'demand': ['damned', 'demand', 'madden'], 'demander': ['demander', 'redemand'], 'demanding': ['demanding', 'maddening'], 'demandingly': ['demandingly', 'maddeningly'], 'demantoid': ['demantoid', 'dominated'], 'demarcate': ['camerated', 'demarcate'], 'demarcation': ['demarcation', 'democratian'], 'demark': ['demark', 'marked'], 'demast': ['demast', 'masted'], 'deme': ['deem', 'deme', 'mede', 'meed'], 'demean': ['amende', 'demean', 'meaned', 'nadeem'], 'demeanor': ['demeanor', 'enamored'], 'dementia': ['dementia', 'mendaite'], 'demerit': ['demerit', 'dimeter', 'merited', 'mitered'], 'demerol': ['demerol', 'modeler', 'remodel'], 'demetrian': ['demetrian', 'dermatine', 'meandrite', 'minareted'], 'demi': ['demi', 'diem', 'dime', 'mide'], 'demibrute': ['bermudite', 'demibrute'], 'demicannon': ['cinnamoned', 'demicannon'], 'demicanon': ['demicanon', 'dominance'], 'demidog': ['demidog', 'demigod'], 'demigod': ['demidog', 'demigod'], 'demiluster': ['demiluster', 'demilustre'], 'demilustre': ['demiluster', 'demilustre'], 'demiparallel': ['demiparallel', 'imparalleled'], 'demipronation': ['demipronation', 'preadmonition', 'predomination'], 'demiracle': ['declaimer', 'demiracle'], 'demiram': ['demiram', 'mermaid'], 'demirep': ['demirep', 'epiderm', 'impeder', 'remiped'], 'demirobe': ['demirobe', 'embodier'], 'demisable': ['beadleism', 'demisable'], 'demise': ['demise', 'diseme'], 'demit': ['demit', 'timed'], 'demiturned': ['demiturned', 'undertimed'], 'demob': ['demob', 'mobed'], 'democratian': ['demarcation', 'democratian'], 'demolisher': ['demolisher', 'redemolish'], 'demoniac': ['codamine', 'comedian', 'daemonic', 'demoniac'], 'demoniacism': ['demoniacism', 'seminomadic'], 'demonial': ['demonial', 'melanoid'], 'demoniast': ['ademonist', 'demoniast', 'staminode'], 'demonish': ['demonish', 'hedonism'], 'demonism': ['demonism', 'medimnos', 'misnomed'], 'demotics': ['comedist', 'demotics', 'docetism', 'domestic'], 'demotion': ['demotion', 'entomoid', 'moontide'], 'demount': ['demount', 'mounted'], 'demurrer': ['demurrer', 'murderer'], 'demurring': ['demurring', 'murdering'], 'demurringly': ['demurringly', 'murderingly'], 'demy': ['demy', 'emyd'], 'den': ['den', 'end', 'ned'], 'denarius': ['denarius', 'desaurin', 'unraised'], 'denaro': ['denaro', 'orenda'], 'denary': ['denary', 'yander'], 'denat': ['denat', 'entad'], 'denature': ['denature', 'undereat'], 'denda': ['dedan', 'denda'], 'dendral': ['dandler', 'dendral'], 'dendrite': ['dendrite', 'tindered'], 'dendrites': ['dendrites', 'distender', 'redistend'], 'dene': ['dene', 'eden', 'need'], 'deneb': ['beden', 'deben', 'deneb'], 'dengue': ['dengue', 'unedge'], 'denial': ['aldine', 'daniel', 'delian', 'denial', 'enalid', 'leadin'], 'denier': ['denier', 'nereid'], 'denierer': ['denierer', 'reindeer'], 'denigrate': ['argentide', 'denigrate', 'dinergate'], 'denim': ['denim', 'mendi'], 'denis': ['denis', 'snide'], 'denominate': ['denominate', 'emendation'], 'denotable': ['denotable', 'detonable'], 'denotation': ['denotation', 'detonation'], 'denotative': ['denotative', 'detonative'], 'denotive': ['denotive', 'devonite'], 'denouncer': ['denouncer', 'unencored'], 'dense': ['dense', 'needs'], 'denshare': ['denshare', 'seerhand'], 'denshire': ['denshire', 'drisheen'], 'density': ['density', 'destiny'], 'dent': ['dent', 'tend'], 'dental': ['dental', 'tandle'], 'dentale': ['dalteen', 'dentale', 'edental'], 'dentalism': ['dentalism', 'dismantle'], 'dentaria': ['anteriad', 'atridean', 'dentaria'], 'dentatoserrate': ['dentatoserrate', 'serratodentate'], 'dentatosinuate': ['dentatosinuate', 'sinuatodentate'], 'denter': ['denter', 'rented', 'tender'], 'dentex': ['dentex', 'extend'], 'denticle': ['cliented', 'denticle'], 'denticular': ['denticular', 'unarticled'], 'dentil': ['delint', 'dentil'], 'dentilingual': ['dentilingual', 'indulgential', 'linguidental'], 'dentin': ['dentin', 'indent', 'intend', 'tinned'], 'dentinal': ['dentinal', 'teinland', 'tendinal'], 'dentine': ['dentine', 'nineted'], 'dentinitis': ['dentinitis', 'tendinitis'], 'dentinoma': ['dentinoma', 'nominated'], 'dentist': ['dentist', 'distent', 'stinted'], 'dentolabial': ['dentolabial', 'labiodental'], 'dentolingual': ['dentolingual', 'linguodental'], 'denture': ['denture', 'untreed'], 'denudative': ['denudative', 'undeviated'], 'denude': ['denude', 'dudeen'], 'denumeral': ['denumeral', 'undermeal', 'unrealmed'], 'denunciator': ['denunciator', 'underaction'], 'deny': ['deny', 'dyne'], 'deoppilant': ['deoppilant', 'pentaploid'], 'deota': ['deota', 'todea'], 'depa': ['depa', 'peda'], 'depaint': ['depaint', 'inadept', 'painted', 'patined'], 'depart': ['depart', 'parted', 'petard'], 'departition': ['departition', 'partitioned', 'trepidation'], 'departure': ['apertured', 'departure'], 'depas': ['depas', 'sepad', 'spade'], 'depencil': ['depencil', 'penciled', 'pendicle'], 'depender': ['depender', 'redepend'], 'depetticoat': ['depetticoat', 'petticoated'], 'depicter': ['decrepit', 'depicter', 'precited'], 'depiction': ['depiction', 'pectinoid'], 'depilate': ['depilate', 'leptidae', 'pileated'], 'depletion': ['depletion', 'diplotene'], 'deploration': ['deploration', 'periodontal'], 'deploy': ['deploy', 'podley'], 'depoh': ['depoh', 'ephod', 'hoped'], 'depolish': ['depolish', 'polished'], 'deport': ['deport', 'ported', 'redtop'], 'deportation': ['antitorpedo', 'deportation'], 'deposal': ['adelops', 'deposal'], 'deposer': ['deposer', 'reposed'], 'deposit': ['deposit', 'topside'], 'deposition': ['deposition', 'positioned'], 'depositional': ['depositional', 'despoliation'], 'depositure': ['depositure', 'pterideous'], 'deprave': ['deprave', 'pervade'], 'depraver': ['depraver', 'pervader'], 'depravingly': ['depravingly', 'pervadingly'], 'deprecable': ['deprecable', 'precedable'], 'deprecation': ['capernoited', 'deprecation'], 'depreciation': ['depreciation', 'predeication'], 'depressant': ['depressant', 'partedness'], 'deprint': ['deprint', 'printed'], 'deprival': ['deprival', 'prevalid'], 'deprivate': ['deprivate', 'predative'], 'deprive': ['deprive', 'previde'], 'depriver': ['depriver', 'predrive'], 'depurant': ['depurant', 'unparted'], 'depuration': ['depuration', 'portunidae'], 'deraign': ['degrain', 'deraign', 'deringa', 'gradine', 'grained', 'reading'], 'derail': ['ariled', 'derail', 'dialer'], 'derailment': ['delirament', 'derailment'], 'derange': ['derange', 'enraged', 'gardeen', 'gerenda', 'grandee', 'grenade'], 'deranged': ['deranged', 'gardened'], 'deranger': ['deranger', 'gardener'], 'derat': ['dater', 'derat', 'detar', 'drate', 'rated', 'trade', 'tread'], 'derate': ['derate', 'redate'], 'derater': ['derater', 'retrade', 'retread', 'treader'], 'deray': ['deary', 'deray', 'rayed', 'ready', 'yeard'], 'dere': ['deer', 'dere', 'dree', 'rede', 'reed'], 'deregister': ['deregister', 'registered'], 'derelict': ['derelict', 'relicted'], 'deric': ['cider', 'cried', 'deric', 'dicer'], 'derider': ['deirdre', 'derider', 'derride', 'ridered'], 'deringa': ['degrain', 'deraign', 'deringa', 'gradine', 'grained', 'reading'], 'derision': ['derision', 'ironside', 'resinoid', 'sirenoid'], 'derivation': ['derivation', 'ordinative'], 'derivational': ['derivational', 'revalidation'], 'derive': ['derive', 'redive'], 'deriver': ['deriver', 'redrive', 'rivered'], 'derma': ['armed', 'derma', 'dream', 'ramed'], 'dermad': ['dermad', 'madder'], 'dermal': ['dermal', 'marled', 'medlar'], 'dermatic': ['dermatic', 'timecard'], 'dermatine': ['demetrian', 'dermatine', 'meandrite', 'minareted'], 'dermatoneurosis': ['dermatoneurosis', 'neurodermatosis'], 'dermatophone': ['dermatophone', 'herpetomonad'], 'dermoblast': ['blastoderm', 'dermoblast'], 'dermol': ['dermol', 'molder', 'remold'], 'dermosclerite': ['dermosclerite', 'sclerodermite'], 'dern': ['dern', 'rend'], 'derogately': ['delegatory', 'derogately'], 'derogation': ['derogation', 'trogonidae'], 'derout': ['derout', 'detour', 'douter'], 'derride': ['deirdre', 'derider', 'derride', 'ridered'], 'derries': ['derries', 'desirer', 'resider', 'serried'], 'derringer': ['derringer', 'regrinder'], 'derry': ['derry', 'redry', 'ryder'], 'derust': ['derust', 'duster'], 'desalt': ['desalt', 'salted'], 'desand': ['desand', 'sadden', 'sanded'], 'desaurin': ['denarius', 'desaurin', 'unraised'], 'descendant': ['adscendent', 'descendant'], 'descender': ['descender', 'redescend'], 'descent': ['descent', 'scented'], 'description': ['description', 'discerption'], 'desecrate': ['decastere', 'desecrate'], 'desecration': ['considerate', 'desecration'], 'deseed': ['deseed', 'seeded'], 'desertic': ['creedist', 'desertic', 'discreet', 'discrete'], 'desertion': ['desertion', 'detersion'], 'deserver': ['deserver', 'reserved', 'reversed'], 'desex': ['desex', 'sexed'], 'deshabille': ['deshabille', 'shieldable'], 'desi': ['desi', 'ides', 'seid', 'side'], 'desiccation': ['desiccation', 'discoactine'], 'desight': ['desight', 'sighted'], 'design': ['design', 'singed'], 'designer': ['designer', 'redesign', 'resigned'], 'desilver': ['desilver', 'silvered'], 'desirable': ['desirable', 'redisable'], 'desire': ['desire', 'reside'], 'desirer': ['derries', 'desirer', 'resider', 'serried'], 'desirous': ['desirous', 'siderous'], 'desition': ['desition', 'sedition'], 'desma': ['desma', 'mesad'], 'desman': ['amends', 'desman'], 'desmopathy': ['desmopathy', 'phymatodes'], 'desorption': ['desorption', 'priodontes'], 'despair': ['despair', 'pardesi'], 'despairing': ['despairing', 'spinigrade'], 'desperation': ['desperation', 'esperantido'], 'despise': ['despise', 'pedesis'], 'despiser': ['despiser', 'disperse'], 'despoil': ['despoil', 'soliped', 'spoiled'], 'despoiler': ['despoiler', 'leprosied'], 'despoliation': ['depositional', 'despoliation'], 'despot': ['despot', 'posted'], 'despotat': ['despotat', 'postdate'], 'dessert': ['dessert', 'tressed'], 'destain': ['destain', 'instead', 'sainted', 'satined'], 'destine': ['destine', 'edestin'], 'destinism': ['destinism', 'timidness'], 'destiny': ['density', 'destiny'], 'desugar': ['desugar', 'sugared'], 'detail': ['detail', 'dietal', 'dilate', 'edital', 'tailed'], 'detailer': ['detailer', 'elaterid'], 'detain': ['danite', 'detain'], 'detainal': ['danalite', 'detainal'], 'detar': ['dater', 'derat', 'detar', 'drate', 'rated', 'trade', 'tread'], 'detassel': ['dateless', 'detassel'], 'detax': ['detax', 'taxed'], 'detecter': ['detecter', 'redetect'], 'detent': ['detent', 'netted', 'tented'], 'deter': ['deter', 'treed'], 'determinant': ['determinant', 'detrainment'], 'detersion': ['desertion', 'detersion'], 'detest': ['detest', 'tested'], 'dethrone': ['dethrone', 'threnode'], 'detin': ['detin', 'teind', 'tined'], 'detinet': ['detinet', 'dinette'], 'detonable': ['denotable', 'detonable'], 'detonation': ['denotation', 'detonation'], 'detonative': ['denotative', 'detonative'], 'detonator': ['detonator', 'tetraodon'], 'detour': ['derout', 'detour', 'douter'], 'detracter': ['detracter', 'retracted'], 'detraction': ['detraction', 'doctrinate', 'tetarconid'], 'detrain': ['antired', 'detrain', 'randite', 'trained'], 'detrainment': ['determinant', 'detrainment'], 'detrusion': ['detrusion', 'tinderous', 'unstoried'], 'detrusive': ['detrusive', 'divesture', 'servitude'], 'deuce': ['deuce', 'educe'], 'deuced': ['deduce', 'deuced'], 'deul': ['deul', 'duel', 'leud'], 'deva': ['dave', 'deva', 'vade', 'veda'], 'devance': ['devance', 'vendace'], 'develin': ['develin', 'endevil'], 'developer': ['developer', 'redevelop'], 'devil': ['devil', 'divel', 'lived'], 'deviler': ['deliver', 'deviler', 'livered'], 'devisceration': ['considerative', 'devisceration'], 'deviser': ['deviser', 'diverse', 'revised'], 'devitrify': ['devitrify', 'fervidity'], 'devoid': ['devoid', 'voided'], 'devoir': ['devoir', 'voider'], 'devonite': ['denotive', 'devonite'], 'devourer': ['devourer', 'overdure', 'overrude'], 'devow': ['devow', 'vowed'], 'dew': ['dew', 'wed'], 'dewan': ['awned', 'dewan', 'waned'], 'dewater': ['dewater', 'tarweed', 'watered'], 'dewer': ['dewer', 'ewder', 'rewed'], 'dewey': ['dewey', 'weedy'], 'dewily': ['dewily', 'widely', 'wieldy'], 'dewiness': ['dewiness', 'wideness'], 'dewool': ['dewool', 'elwood', 'wooled'], 'deworm': ['deworm', 'wormed'], 'dewy': ['dewy', 'wyde'], 'dextraural': ['dextraural', 'extradural'], 'dextrosinistral': ['dextrosinistral', 'sinistrodextral'], 'dey': ['dey', 'dye', 'yed'], 'deyhouse': ['deyhouse', 'dyehouse'], 'deyship': ['deyship', 'diphyes'], 'dezinc': ['dezinc', 'zendic'], 'dha': ['dah', 'dha', 'had'], 'dhamnoo': ['dhamnoo', 'hoodman', 'manhood'], 'dhan': ['dhan', 'hand'], 'dharna': ['andhra', 'dharna'], 'dheri': ['dheri', 'hider', 'hired'], 'dhobi': ['bodhi', 'dhobi'], 'dhoon': ['dhoon', 'hondo'], 'dhu': ['dhu', 'hud'], 'di': ['di', 'id'], 'diabolist': ['diabolist', 'idioblast'], 'diacetin': ['diacetin', 'indicate'], 'diacetine': ['deciatine', 'diacetine', 'taenicide', 'teniacide'], 'diacetyl': ['diacetyl', 'lyctidae'], 'diachoretic': ['citharoedic', 'diachoretic'], 'diaclase': ['diaclase', 'sidalcea'], 'diaconal': ['cladonia', 'condalia', 'diaconal'], 'diact': ['diact', 'dicta'], 'diadem': ['diadem', 'mediad'], 'diaderm': ['admired', 'diaderm'], 'diaeretic': ['diaeretic', 'icteridae'], 'diagenetic': ['diagenetic', 'digenetica'], 'diageotropism': ['diageotropism', 'geodiatropism'], 'diagonal': ['diagonal', 'ganoidal', 'gonadial'], 'dial': ['dail', 'dali', 'dial', 'laid', 'lida'], 'dialect': ['citadel', 'deltaic', 'dialect', 'edictal', 'lactide'], 'dialectic': ['deictical', 'dialectic'], 'dialector': ['dialector', 'lacertoid'], 'dialer': ['ariled', 'derail', 'dialer'], 'dialin': ['anilid', 'dialin', 'dianil', 'inlaid'], 'dialing': ['dialing', 'gliadin'], 'dialister': ['dialister', 'trailside'], 'diallelon': ['diallelon', 'llandeilo'], 'dialogism': ['dialogism', 'sigmoidal'], 'dialystelic': ['deistically', 'dialystelic'], 'dialytic': ['calidity', 'dialytic'], 'diamagnet': ['agminated', 'diamagnet'], 'diamantine': ['diamantine', 'inanimated'], 'diameter': ['diameter', 'diatreme'], 'diametric': ['citramide', 'diametric', 'matricide'], 'diamide': ['amidide', 'diamide', 'mididae'], 'diamine': ['amidine', 'diamine'], 'diamorphine': ['diamorphine', 'phronimidae'], 'dian': ['adin', 'andi', 'dain', 'dani', 'dian', 'naid'], 'diana': ['danai', 'diana', 'naiad'], 'diander': ['diander', 'drained'], 'diane': ['diane', 'idean'], 'dianetics': ['andesitic', 'dianetics'], 'dianil': ['anilid', 'dialin', 'dianil', 'inlaid'], 'diapensia': ['diapensia', 'diaspinae'], 'diaper': ['diaper', 'paired'], 'diaphote': ['diaphote', 'hepatoid'], 'diaphtherin': ['diaphtherin', 'diphtherian'], 'diapnoic': ['diapnoic', 'pinacoid'], 'diapnotic': ['antipodic', 'diapnotic'], 'diaporthe': ['aphrodite', 'atrophied', 'diaporthe'], 'diarch': ['chidra', 'diarch'], 'diarchial': ['diarchial', 'rachidial'], 'diarchy': ['diarchy', 'hyracid'], 'diarian': ['aridian', 'diarian'], 'diary': ['dairy', 'diary', 'yaird'], 'diascia': ['ascidia', 'diascia'], 'diascope': ['diascope', 'psocidae', 'scopidae'], 'diaspinae': ['diapensia', 'diaspinae'], 'diastem': ['diastem', 'misdate'], 'diastema': ['adamsite', 'diastema'], 'diaster': ['astride', 'diaster', 'disrate', 'restiad', 'staired'], 'diastole': ['diastole', 'isolated', 'sodalite', 'solidate'], 'diastrophic': ['aphrodistic', 'diastrophic'], 'diastrophy': ['diastrophy', 'dystrophia'], 'diatomales': ['diatomales', 'mastoidale', 'mastoideal'], 'diatomean': ['diatomean', 'mantoidea'], 'diatomin': ['diatomin', 'domitian'], 'diatonic': ['actinoid', 'diatonic', 'naticoid'], 'diatreme': ['diameter', 'diatreme'], 'diatropism': ['diatropism', 'prismatoid'], 'dib': ['bid', 'dib'], 'dibatis': ['dabitis', 'dibatis'], 'dibber': ['dibber', 'ribbed'], 'dibbler': ['dibbler', 'dribble'], 'dibrom': ['dibrom', 'morbid'], 'dicaryon': ['cynaroid', 'dicaryon'], 'dicast': ['dicast', 'stadic'], 'dice': ['dice', 'iced'], 'dicentra': ['crinated', 'dicentra'], 'dicer': ['cider', 'cried', 'deric', 'dicer'], 'diceras': ['diceras', 'radices', 'sidecar'], 'dich': ['chid', 'dich'], 'dichroite': ['dichroite', 'erichtoid', 'theriodic'], 'dichromat': ['chromatid', 'dichromat'], 'dichter': ['dichter', 'ditcher'], 'dicolic': ['codicil', 'dicolic'], 'dicolon': ['dicolon', 'dolcino'], 'dicoumarin': ['acridonium', 'dicoumarin'], 'dicta': ['diact', 'dicta'], 'dictaphone': ['dictaphone', 'endopathic'], 'dictational': ['antidotical', 'dictational'], 'dictionary': ['dictionary', 'indicatory'], 'dicyanine': ['cyanidine', 'dicyanine'], 'dicycle': ['cyclide', 'decylic', 'dicycle'], 'dicyema': ['dicyema', 'mediacy'], 'diddle': ['diddle', 'lidded'], 'diddler': ['diddler', 'driddle'], 'didym': ['didym', 'middy'], 'die': ['die', 'ide'], 'dieb': ['beid', 'bide', 'debi', 'dieb'], 'diego': ['diego', 'dogie', 'geoid'], 'dielytra': ['dielytra', 'tileyard'], 'diem': ['demi', 'diem', 'dime', 'mide'], 'dier': ['dier', 'dire', 'reid', 'ride'], 'diesel': ['diesel', 'sedile', 'seidel'], 'diet': ['diet', 'dite', 'edit', 'tide', 'tied'], 'dietal': ['detail', 'dietal', 'dilate', 'edital', 'tailed'], 'dieter': ['dieter', 'tiered'], 'dietic': ['citied', 'dietic'], 'dietics': ['deistic', 'dietics'], 'dig': ['dig', 'gid'], 'digenetica': ['diagenetic', 'digenetica'], 'digeny': ['digeny', 'dyeing'], 'digester': ['digester', 'redigest'], 'digitalein': ['digitalein', 'diligentia'], 'digitation': ['digitation', 'goniatitid'], 'digitonin': ['digitonin', 'indigotin'], 'digredient': ['digredient', 'reddingite'], 'dihalo': ['dihalo', 'haloid'], 'diiambus': ['basidium', 'diiambus'], 'dika': ['dika', 'kaid'], 'dikaryon': ['ankyroid', 'dikaryon'], 'dike': ['dike', 'keid'], 'dilacerate': ['dilacerate', 'lacertidae'], 'dilatant': ['atlantid', 'dilatant'], 'dilate': ['detail', 'dietal', 'dilate', 'edital', 'tailed'], 'dilater': ['dilater', 'lardite', 'redtail'], 'dilatometric': ['calotermitid', 'dilatometric'], 'dilator': ['dilator', 'ortalid'], 'dilatory': ['adroitly', 'dilatory', 'idolatry'], 'diligence': ['ceilinged', 'diligence'], 'diligentia': ['digitalein', 'diligentia'], 'dillue': ['dillue', 'illude'], 'dilluer': ['dilluer', 'illuder'], 'dilo': ['dilo', 'diol', 'doli', 'idol', 'olid'], 'diluent': ['diluent', 'untiled'], 'dilute': ['dilute', 'dultie'], 'diluted': ['diluted', 'luddite'], 'dilutent': ['dilutent', 'untilted', 'untitled'], 'diluvian': ['diluvian', 'induvial'], 'dim': ['dim', 'mid'], 'dimatis': ['amidist', 'dimatis'], 'dimble': ['dimble', 'limbed'], 'dime': ['demi', 'diem', 'dime', 'mide'], 'dimer': ['dimer', 'mider'], 'dimera': ['admire', 'armied', 'damier', 'dimera', 'merida'], 'dimeran': ['adermin', 'amerind', 'dimeran'], 'dimerous': ['dimerous', 'soredium'], 'dimeter': ['demerit', 'dimeter', 'merited', 'mitered'], 'dimetria': ['dimetria', 'mitridae', 'tiremaid', 'triamide'], 'diminisher': ['diminisher', 'rediminish'], 'dimit': ['dimit', 'timid'], 'dimmer': ['dimmer', 'immerd', 'rimmed'], 'dimna': ['dimna', 'manid'], 'dimyarian': ['dimyarian', 'myrianida'], 'din': ['din', 'ind', 'nid'], 'dinah': ['ahind', 'dinah'], 'dinar': ['darin', 'dinar', 'drain', 'indra', 'nadir', 'ranid'], 'dinder': ['dinder', 'ridden', 'rinded'], 'dindle': ['dindle', 'niddle'], 'dine': ['dine', 'enid', 'inde', 'nide'], 'diner': ['diner', 'riden', 'rinde'], 'dinergate': ['argentide', 'denigrate', 'dinergate'], 'dinero': ['dinero', 'dorine'], 'dinette': ['detinet', 'dinette'], 'dineuric': ['dineuric', 'eurindic'], 'dingar': ['daring', 'dingar', 'gradin'], 'dinge': ['deign', 'dinge', 'nidge'], 'dingle': ['dingle', 'elding', 'engild', 'gilden'], 'dingo': ['dingo', 'doing', 'gondi', 'gonid'], 'dingwall': ['dingwall', 'windgall'], 'dingy': ['dingy', 'dying'], 'dinheiro': ['dinheiro', 'hernioid'], 'dinic': ['dinic', 'indic'], 'dining': ['dining', 'indign', 'niding'], 'dink': ['dink', 'kind'], 'dinkey': ['dinkey', 'kidney'], 'dinocerata': ['arctoidean', 'carotidean', 'cordaitean', 'dinocerata'], 'dinoceratan': ['carnationed', 'dinoceratan'], 'dinomic': ['dinomic', 'dominic'], 'dint': ['dint', 'tind'], 'dinus': ['dinus', 'indus', 'nidus'], 'dioeciopolygamous': ['dioeciopolygamous', 'polygamodioecious'], 'diogenite': ['diogenite', 'gideonite'], 'diol': ['dilo', 'diol', 'doli', 'idol', 'olid'], 'dion': ['dion', 'nodi', 'odin'], 'dione': ['deino', 'dione', 'edoni'], 'diopter': ['diopter', 'peridot', 'proetid', 'protide', 'pteroid'], 'dioptra': ['dioptra', 'parotid'], 'dioptral': ['dioptral', 'tripodal'], 'dioptric': ['dioptric', 'tripodic'], 'dioptrical': ['dioptrical', 'tripodical'], 'dioptry': ['dioptry', 'tripody'], 'diorama': ['amaroid', 'diorama'], 'dioramic': ['dioramic', 'dromicia'], 'dioscorein': ['dioscorein', 'dioscorine'], 'dioscorine': ['dioscorein', 'dioscorine'], 'dioscuri': ['dioscuri', 'sciuroid'], 'diose': ['diose', 'idose', 'oside'], 'diosmin': ['diosmin', 'odinism'], 'diosmotic': ['diosmotic', 'sodomitic'], 'diparentum': ['diparentum', 'unimparted'], 'dipetto': ['dipetto', 'diptote'], 'diphase': ['aphides', 'diphase'], 'diphaser': ['diphaser', 'parished', 'raphides', 'sephardi'], 'diphosphate': ['diphosphate', 'phosphatide'], 'diphtherian': ['diaphtherin', 'diphtherian'], 'diphyes': ['deyship', 'diphyes'], 'diphysite': ['deityship', 'diphysite'], 'dipicrate': ['dipicrate', 'patricide', 'pediatric'], 'diplanar': ['diplanar', 'prandial'], 'diplasion': ['aspidinol', 'diplasion'], 'dipleura': ['dipleura', 'epidural'], 'dipleural': ['dipleural', 'preludial'], 'diplocephalus': ['diplocephalus', 'pseudophallic'], 'diploe': ['diploe', 'dipole'], 'diploetic': ['diploetic', 'lepidotic'], 'diplotene': ['depletion', 'diplotene'], 'dipnoan': ['dipnoan', 'nonpaid', 'pandion'], 'dipolar': ['dipolar', 'polarid'], 'dipole': ['diploe', 'dipole'], 'dipsaceous': ['dipsaceous', 'spadiceous'], 'dipter': ['dipter', 'trepid'], 'dipteraceous': ['dipteraceous', 'epiceratodus'], 'dipteral': ['dipteral', 'tripedal'], 'dipterological': ['dipterological', 'pteridological'], 'dipterologist': ['dipterologist', 'pteridologist'], 'dipterology': ['dipterology', 'pteridology'], 'dipteros': ['dipteros', 'portside'], 'diptote': ['dipetto', 'diptote'], 'dirca': ['acrid', 'caird', 'carid', 'darci', 'daric', 'dirca'], 'dircaean': ['caridean', 'dircaean', 'radiance'], 'dire': ['dier', 'dire', 'reid', 'ride'], 'direct': ['credit', 'direct'], 'directable': ['creditable', 'directable'], 'directer': ['cedriret', 'directer', 'recredit', 'redirect'], 'direction': ['cretinoid', 'direction'], 'directional': ['clitoridean', 'directional'], 'directive': ['creditive', 'directive'], 'directly': ['directly', 'tridecyl'], 'directoire': ['cordierite', 'directoire'], 'director': ['creditor', 'director'], 'directorship': ['creditorship', 'directorship'], 'directress': ['creditress', 'directress'], 'directrix': ['creditrix', 'directrix'], 'direly': ['direly', 'idyler'], 'direption': ['direption', 'perdition', 'tropidine'], 'dirge': ['dirge', 'gride', 'redig', 'ridge'], 'dirgelike': ['dirgelike', 'ridgelike'], 'dirgeman': ['dirgeman', 'margined', 'midrange'], 'dirgler': ['dirgler', 'girdler'], 'dirten': ['dirten', 'rident', 'tinder'], 'dis': ['dis', 'sid'], 'disa': ['dais', 'dasi', 'disa', 'said', 'sida'], 'disadventure': ['disadventure', 'unadvertised'], 'disappearer': ['disappearer', 'redisappear'], 'disarmed': ['disarmed', 'misdread'], 'disastimeter': ['disastimeter', 'semistriated'], 'disattire': ['disattire', 'distraite'], 'disbud': ['disbud', 'disdub'], 'disburse': ['disburse', 'subsider'], 'discastle': ['clidastes', 'discastle'], 'discern': ['discern', 'rescind'], 'discerner': ['discerner', 'rescinder'], 'discernment': ['discernment', 'rescindment'], 'discerp': ['crisped', 'discerp'], 'discerption': ['description', 'discerption'], 'disclike': ['disclike', 'sicklied'], 'discoactine': ['desiccation', 'discoactine'], 'discoid': ['discoid', 'disodic'], 'discontinuer': ['discontinuer', 'undiscretion'], 'discounter': ['discounter', 'rediscount'], 'discoverer': ['discoverer', 'rediscover'], 'discreate': ['discreate', 'sericated'], 'discreet': ['creedist', 'desertic', 'discreet', 'discrete'], 'discreetly': ['discreetly', 'discretely'], 'discreetness': ['discreetness', 'discreteness'], 'discrepate': ['discrepate', 'pederastic'], 'discrete': ['creedist', 'desertic', 'discreet', 'discrete'], 'discretely': ['discreetly', 'discretely'], 'discreteness': ['discreetness', 'discreteness'], 'discretion': ['discretion', 'soricident'], 'discriminator': ['discriminator', 'doctrinairism'], 'disculpate': ['disculpate', 'spiculated'], 'discusser': ['discusser', 'rediscuss'], 'discutable': ['discutable', 'subdeltaic', 'subdialect'], 'disdub': ['disbud', 'disdub'], 'disease': ['disease', 'seaside'], 'diseme': ['demise', 'diseme'], 'disenact': ['disenact', 'distance'], 'disendow': ['disendow', 'downside'], 'disentwine': ['disentwine', 'indentwise'], 'disharmony': ['disharmony', 'hydramnios'], 'dishearten': ['dishearten', 'intershade'], 'dished': ['dished', 'eddish'], 'disherent': ['disherent', 'hinderest', 'tenderish'], 'dishling': ['dishling', 'hidlings'], 'dishonor': ['dishonor', 'ironshod'], 'dishorn': ['dishorn', 'dronish'], 'dishpan': ['daphnis', 'dishpan'], 'disilicate': ['disilicate', 'idealistic'], 'disimprove': ['disimprove', 'misprovide'], 'disk': ['disk', 'kids', 'skid'], 'dislocate': ['dislocate', 'lactoside'], 'disman': ['danism', 'disman'], 'dismantle': ['dentalism', 'dismantle'], 'disme': ['deism', 'disme'], 'dismemberer': ['dismemberer', 'disremember'], 'disnature': ['disnature', 'sturnidae', 'truandise'], 'disnest': ['disnest', 'dissent'], 'disodic': ['discoid', 'disodic'], 'disparage': ['disparage', 'grapsidae'], 'disparation': ['disparation', 'tridiapason'], 'dispatcher': ['dispatcher', 'redispatch'], 'dispensable': ['dispensable', 'piebaldness'], 'dispense': ['dispense', 'piedness'], 'disperse': ['despiser', 'disperse'], 'dispetal': ['dispetal', 'pedalist'], 'dispireme': ['dispireme', 'epidermis'], 'displayer': ['displayer', 'redisplay'], 'displeaser': ['displeaser', 'pearlsides'], 'disponee': ['disponee', 'openside'], 'disporum': ['disporum', 'misproud'], 'disprepare': ['disprepare', 'predespair'], 'disrate': ['astride', 'diaster', 'disrate', 'restiad', 'staired'], 'disremember': ['dismemberer', 'disremember'], 'disrepute': ['disrepute', 'redispute'], 'disrespect': ['disrespect', 'disscepter'], 'disrupt': ['disrupt', 'prudist'], 'disscepter': ['disrespect', 'disscepter'], 'disseat': ['disseat', 'sestiad'], 'dissector': ['crosstied', 'dissector'], 'dissent': ['disnest', 'dissent'], 'dissenter': ['dissenter', 'tiredness'], 'dissertate': ['dissertate', 'statesider'], 'disserve': ['disserve', 'dissever'], 'dissever': ['disserve', 'dissever'], 'dissocial': ['cissoidal', 'dissocial'], 'dissolve': ['dissolve', 'voidless'], 'dissoul': ['dissoul', 'dulosis', 'solidus'], 'distale': ['distale', 'salited'], 'distance': ['disenact', 'distance'], 'distant': ['dantist', 'distant'], 'distater': ['distater', 'striated'], 'distender': ['dendrites', 'distender', 'redistend'], 'distent': ['dentist', 'distent', 'stinted'], 'distich': ['distich', 'stichid'], 'distillage': ['distillage', 'sigillated'], 'distiller': ['distiller', 'redistill'], 'distinguisher': ['distinguisher', 'redistinguish'], 'distoma': ['distoma', 'mastoid'], 'distome': ['distome', 'modiste'], 'distrainer': ['distrainer', 'redistrain'], 'distrait': ['distrait', 'triadist'], 'distraite': ['disattire', 'distraite'], 'disturber': ['disturber', 'redisturb'], 'disulphone': ['disulphone', 'unpolished'], 'disuniform': ['disuniform', 'indusiform'], 'dit': ['dit', 'tid'], 'dita': ['adit', 'dita'], 'dital': ['datil', 'dital', 'tidal', 'tilda'], 'ditcher': ['dichter', 'ditcher'], 'dite': ['diet', 'dite', 'edit', 'tide', 'tied'], 'diter': ['diter', 'tired', 'tried'], 'dithionic': ['chitinoid', 'dithionic'], 'ditone': ['ditone', 'intoed'], 'ditrochean': ['achondrite', 'ditrochean', 'ordanchite'], 'diuranate': ['diuranate', 'untiaraed'], 'diurna': ['danuri', 'diurna', 'dunair', 'durain', 'durani', 'durian'], 'diurnation': ['diurnation', 'induration'], 'diurne': ['diurne', 'inured', 'ruined', 'unride'], 'diva': ['avid', 'diva'], 'divan': ['divan', 'viand'], 'divata': ['divata', 'dvaita'], 'divel': ['devil', 'divel', 'lived'], 'diver': ['diver', 'drive'], 'diverge': ['diverge', 'grieved'], 'diverse': ['deviser', 'diverse', 'revised'], 'diverter': ['diverter', 'redivert', 'verditer'], 'divest': ['divest', 'vedist'], 'divesture': ['detrusive', 'divesture', 'servitude'], 'divisionism': ['divisionism', 'misdivision'], 'divorce': ['cervoid', 'divorce'], 'divorcee': ['coderive', 'divorcee'], 'do': ['do', 'od'], 'doable': ['albedo', 'doable'], 'doarium': ['doarium', 'uramido'], 'doat': ['doat', 'toad', 'toda'], 'doater': ['doater', 'toader'], 'doating': ['antigod', 'doating'], 'doatish': ['doatish', 'toadish'], 'dob': ['bod', 'dob'], 'dobe': ['bode', 'dobe'], 'dobra': ['abord', 'bardo', 'board', 'broad', 'dobra', 'dorab'], 'dobrao': ['dobrao', 'doorba'], 'doby': ['body', 'boyd', 'doby'], 'doc': ['cod', 'doc'], 'docetism': ['comedist', 'demotics', 'docetism', 'domestic'], 'docile': ['cleoid', 'coiled', 'docile'], 'docity': ['cytoid', 'docity'], 'docker': ['corked', 'docker', 'redock'], 'doctorial': ['crotaloid', 'doctorial'], 'doctorship': ['doctorship', 'trophodisc'], 'doctrinairism': ['discriminator', 'doctrinairism'], 'doctrinate': ['detraction', 'doctrinate', 'tetarconid'], 'doctrine': ['centroid', 'doctrine'], 'documental': ['columnated', 'documental'], 'dod': ['dod', 'odd'], 'dode': ['dedo', 'dode', 'eddo'], 'dodecarch': ['decachord', 'dodecarch'], 'dodlet': ['dodlet', 'toddle'], 'dodman': ['dodman', 'oddman'], 'doe': ['doe', 'edo', 'ode'], 'doeg': ['doeg', 'doge', 'gode'], 'doer': ['doer', 'redo', 'rode', 'roed'], 'does': ['does', 'dose'], 'doesnt': ['doesnt', 'stoned'], 'dog': ['dog', 'god'], 'dogate': ['dogate', 'dotage', 'togaed'], 'dogbane': ['bondage', 'dogbane'], 'dogbite': ['bigoted', 'dogbite'], 'doge': ['doeg', 'doge', 'gode'], 'dogger': ['dogger', 'gorged'], 'doghead': ['doghead', 'godhead'], 'doghood': ['doghood', 'godhood'], 'dogie': ['diego', 'dogie', 'geoid'], 'dogless': ['dogless', 'glossed', 'godless'], 'doglike': ['doglike', 'godlike'], 'dogly': ['dogly', 'godly', 'goldy'], 'dogra': ['dargo', 'dogra', 'drago'], 'dogship': ['dogship', 'godship'], 'dogstone': ['dogstone', 'stegodon'], 'dogwatch': ['dogwatch', 'watchdog'], 'doina': ['adion', 'danio', 'doina', 'donia'], 'doing': ['dingo', 'doing', 'gondi', 'gonid'], 'doko': ['doko', 'dook'], 'dol': ['dol', 'lod', 'old'], 'dola': ['alod', 'dola', 'load', 'odal'], 'dolcian': ['dolcian', 'nodical'], 'dolciano': ['conoidal', 'dolciano'], 'dolcino': ['dicolon', 'dolcino'], 'dole': ['dole', 'elod', 'lode', 'odel'], 'dolesman': ['dolesman', 'lodesman'], 'doless': ['doless', 'dossel'], 'doli': ['dilo', 'diol', 'doli', 'idol', 'olid'], 'dolia': ['aloid', 'dolia', 'idola'], 'dolina': ['dolina', 'ladino'], 'doline': ['doline', 'indole', 'leonid', 'loined', 'olenid'], 'dolium': ['dolium', 'idolum'], 'dolly': ['dolly', 'lloyd'], 'dolman': ['almond', 'dolman'], 'dolor': ['dolor', 'drool'], 'dolose': ['dolose', 'oodles', 'soodle'], 'dolphin': ['dolphin', 'pinhold'], 'dolt': ['dolt', 'told'], 'dom': ['dom', 'mod'], 'domain': ['amidon', 'daimon', 'domain'], 'domainal': ['domainal', 'domanial'], 'domal': ['domal', 'modal'], 'domanial': ['domainal', 'domanial'], 'dome': ['dome', 'mode', 'moed'], 'domer': ['domer', 'drome'], 'domestic': ['comedist', 'demotics', 'docetism', 'domestic'], 'domic': ['comid', 'domic'], 'domical': ['domical', 'lacmoid'], 'dominance': ['demicanon', 'dominance'], 'dominate': ['dominate', 'nematoid'], 'dominated': ['demantoid', 'dominated'], 'domination': ['admonition', 'domination'], 'dominative': ['admonitive', 'dominative'], 'dominator': ['admonitor', 'dominator'], 'domine': ['domine', 'domnei', 'emodin', 'medino'], 'dominial': ['dominial', 'imolinda', 'limoniad'], 'dominic': ['dinomic', 'dominic'], 'domino': ['domino', 'monoid'], 'domitian': ['diatomin', 'domitian'], 'domnei': ['domine', 'domnei', 'emodin', 'medino'], 'don': ['don', 'nod'], 'donal': ['donal', 'nodal'], 'donar': ['adorn', 'donar', 'drona', 'radon'], 'donated': ['donated', 'nodated'], 'donatiaceae': ['actaeonidae', 'donatiaceae'], 'donatism': ['donatism', 'saintdom'], 'donator': ['donator', 'odorant', 'tornado'], 'done': ['done', 'node'], 'donet': ['donet', 'noted', 'toned'], 'dong': ['dong', 'gond'], 'donga': ['donga', 'gonad'], 'dongola': ['dongola', 'gondola'], 'dongon': ['dongon', 'nongod'], 'donia': ['adion', 'danio', 'doina', 'donia'], 'donna': ['donna', 'nonda'], 'donnert': ['donnert', 'tendron'], 'donnie': ['donnie', 'indone', 'ondine'], 'donor': ['donor', 'rondo'], 'donorship': ['donorship', 'rhodopsin'], 'donsie': ['deinos', 'donsie', 'inodes', 'onside'], 'donum': ['donum', 'mound'], 'doob': ['bodo', 'bood', 'doob'], 'dook': ['doko', 'dook'], 'dool': ['dool', 'lood'], 'dooli': ['dooli', 'iodol'], 'doom': ['doom', 'mood'], 'doomer': ['doomer', 'mooder', 'redoom', 'roomed'], 'dooms': ['dooms', 'sodom'], 'door': ['door', 'odor', 'oord', 'rood'], 'doorba': ['dobrao', 'doorba'], 'doorbell': ['bordello', 'doorbell'], 'doored': ['doored', 'odored'], 'doorframe': ['doorframe', 'reformado'], 'doorless': ['doorless', 'odorless'], 'doorplate': ['doorplate', 'leptodora'], 'doorpost': ['doorpost', 'doorstop'], 'doorstone': ['doorstone', 'roodstone'], 'doorstop': ['doorpost', 'doorstop'], 'doorweed': ['deerwood', 'doorweed'], 'dop': ['dop', 'pod'], 'dopa': ['apod', 'dopa'], 'doper': ['doper', 'pedro', 'pored'], 'dopplerite': ['dopplerite', 'lepidopter'], 'dor': ['dor', 'rod'], 'dora': ['dora', 'orad', 'road'], 'dorab': ['abord', 'bardo', 'board', 'broad', 'dobra', 'dorab'], 'doree': ['doree', 'erode'], 'dori': ['dori', 'roid'], 'doria': ['aroid', 'doria', 'radio'], 'dorian': ['dorian', 'inroad', 'ordain'], 'dorical': ['cordial', 'dorical'], 'dorine': ['dinero', 'dorine'], 'dorlach': ['chordal', 'dorlach'], 'dormancy': ['dormancy', 'mordancy'], 'dormant': ['dormant', 'mordant'], 'dormer': ['dormer', 'remord'], 'dormie': ['dormie', 'moider'], 'dorn': ['dorn', 'rond'], 'dornic': ['dornic', 'nordic'], 'dorothea': ['dorothea', 'theodora'], 'dorp': ['dorp', 'drop', 'prod'], 'dorsel': ['dorsel', 'seldor', 'solder'], 'dorsoapical': ['dorsoapical', 'prosodiacal'], 'dorsocaudal': ['caudodorsal', 'dorsocaudal'], 'dorsocentral': ['centrodorsal', 'dorsocentral'], 'dorsocervical': ['cervicodorsal', 'dorsocervical'], 'dorsolateral': ['dorsolateral', 'laterodorsal'], 'dorsomedial': ['dorsomedial', 'mediodorsal'], 'dorsosacral': ['dorsosacral', 'sacrodorsal'], 'dorsoventrad': ['dorsoventrad', 'ventrodorsad'], 'dorsoventral': ['dorsoventral', 'ventrodorsal'], 'dorsoventrally': ['dorsoventrally', 'ventrodorsally'], 'dos': ['dos', 'ods', 'sod'], 'dosa': ['dosa', 'sado', 'soda'], 'dosage': ['dosage', 'seadog'], 'dose': ['does', 'dose'], 'doser': ['doser', 'rosed'], 'dosimetric': ['dosimetric', 'mediocrist'], 'dossel': ['doless', 'dossel'], 'dosser': ['dosser', 'sordes'], 'dot': ['dot', 'tod'], 'dotage': ['dogate', 'dotage', 'togaed'], 'dote': ['dote', 'tode', 'toed'], 'doter': ['doter', 'tored', 'trode'], 'doty': ['doty', 'tody'], 'doubler': ['boulder', 'doubler'], 'doubter': ['doubter', 'obtrude', 'outbred', 'redoubt'], 'douc': ['douc', 'duco'], 'douce': ['coude', 'douce'], 'doum': ['doum', 'moud', 'odum'], 'doup': ['doup', 'updo'], 'dour': ['dour', 'duro', 'ordu', 'roud'], 'dourine': ['dourine', 'neuroid'], 'dourly': ['dourly', 'lourdy'], 'douser': ['douser', 'soured'], 'douter': ['derout', 'detour', 'douter'], 'dover': ['dover', 'drove', 'vedro'], 'dow': ['dow', 'owd', 'wod'], 'dowager': ['dowager', 'wordage'], 'dower': ['dower', 'rowed'], 'dowl': ['dowl', 'wold'], 'dowlas': ['dowlas', 'oswald'], 'downbear': ['downbear', 'rawboned'], 'downcome': ['comedown', 'downcome'], 'downer': ['downer', 'wonder', 'worden'], 'downingia': ['downingia', 'godwinian'], 'downset': ['downset', 'setdown'], 'downside': ['disendow', 'downside'], 'downtake': ['downtake', 'takedown'], 'downthrow': ['downthrow', 'throwdown'], 'downturn': ['downturn', 'turndown'], 'downward': ['downward', 'drawdown'], 'dowry': ['dowry', 'rowdy', 'wordy'], 'dowser': ['dowser', 'drowse'], 'doxa': ['doxa', 'odax'], 'doyle': ['doyle', 'yodel'], 'dozen': ['dozen', 'zoned'], 'drab': ['bard', 'brad', 'drab'], 'draba': ['barad', 'draba'], 'drabble': ['dabbler', 'drabble'], 'draco': ['cardo', 'draco'], 'draconic': ['cancroid', 'draconic'], 'draconis': ['draconis', 'sardonic'], 'dracontian': ['dracontian', 'octandrian'], 'drafter': ['drafter', 'redraft'], 'drag': ['darg', 'drag', 'grad'], 'draggle': ['draggle', 'raggled'], 'dragline': ['dragline', 'reginald', 'ringlead'], 'dragman': ['dragman', 'grandam', 'grandma'], 'drago': ['dargo', 'dogra', 'drago'], 'dragoman': ['dragoman', 'garamond', 'ondagram'], 'dragonize': ['dragonize', 'organized'], 'dragoon': ['dragoon', 'gadroon'], 'dragoonage': ['dragoonage', 'gadroonage'], 'dragsman': ['dargsman', 'dragsman'], 'drail': ['drail', 'laird', 'larid', 'liard'], 'drain': ['darin', 'dinar', 'drain', 'indra', 'nadir', 'ranid'], 'drainable': ['albardine', 'drainable'], 'drainage': ['drainage', 'gardenia'], 'draine': ['darien', 'draine'], 'drained': ['diander', 'drained'], 'drainer': ['darrein', 'drainer'], 'drainman': ['drainman', 'mandarin'], 'draintile': ['deliriant', 'draintile', 'interlaid'], 'drake': ['daker', 'drake', 'kedar', 'radek'], 'dramme': ['dammer', 'dramme'], 'drang': ['drang', 'grand'], 'drape': ['drape', 'padre'], 'drat': ['dart', 'drat'], 'drate': ['dater', 'derat', 'detar', 'drate', 'rated', 'trade', 'tread'], 'draw': ['draw', 'ward'], 'drawable': ['drawable', 'wardable'], 'drawback': ['backward', 'drawback'], 'drawbore': ['drawbore', 'wardrobe'], 'drawbridge': ['bridgeward', 'drawbridge'], 'drawdown': ['downward', 'drawdown'], 'drawee': ['drawee', 'rewade'], 'drawer': ['drawer', 'redraw', 'reward', 'warder'], 'drawers': ['drawers', 'resward'], 'drawfile': ['drawfile', 'lifeward'], 'drawgate': ['drawgate', 'gateward'], 'drawhead': ['drawhead', 'headward'], 'drawhorse': ['drawhorse', 'shoreward'], 'drawing': ['drawing', 'ginward', 'warding'], 'drawoff': ['drawoff', 'offward'], 'drawout': ['drawout', 'outdraw', 'outward'], 'drawsheet': ['drawsheet', 'watershed'], 'drawstop': ['drawstop', 'postward'], 'dray': ['adry', 'dray', 'yard'], 'drayage': ['drayage', 'yardage'], 'drayman': ['drayman', 'yardman'], 'dread': ['adder', 'dread', 'readd'], 'dreadly': ['dreadly', 'laddery'], 'dream': ['armed', 'derma', 'dream', 'ramed'], 'dreamage': ['dreamage', 'redamage'], 'dreamer': ['dreamer', 'redream'], 'dreamhole': ['dreamhole', 'heloderma'], 'dreamish': ['dreamish', 'semihard'], 'dreamland': ['dreamland', 'raddleman'], 'drear': ['darer', 'drear'], 'dreary': ['dreary', 'yarder'], 'dredge': ['dredge', 'gedder'], 'dree': ['deer', 'dere', 'dree', 'rede', 'reed'], 'dreiling': ['dreiling', 'gridelin'], 'dressage': ['degasser', 'dressage'], 'dresser': ['dresser', 'redress'], 'drib': ['bird', 'drib'], 'dribble': ['dibbler', 'dribble'], 'driblet': ['birdlet', 'driblet'], 'driddle': ['diddler', 'driddle'], 'drier': ['drier', 'rider'], 'driest': ['driest', 'stride'], 'driller': ['driller', 'redrill'], 'drillman': ['drillman', 'mandrill'], 'dringle': ['dringle', 'grindle'], 'drisheen': ['denshire', 'drisheen'], 'drive': ['diver', 'drive'], 'driven': ['driven', 'nervid', 'verdin'], 'drivescrew': ['drivescrew', 'screwdrive'], 'drogue': ['drogue', 'gourde'], 'drolly': ['drolly', 'lordly'], 'drome': ['domer', 'drome'], 'dromicia': ['dioramic', 'dromicia'], 'drona': ['adorn', 'donar', 'drona', 'radon'], 'drone': ['drone', 'ronde'], 'drongo': ['drongo', 'gordon'], 'dronish': ['dishorn', 'dronish'], 'drool': ['dolor', 'drool'], 'drop': ['dorp', 'drop', 'prod'], 'dropsy': ['dropsy', 'dryops'], 'drossel': ['drossel', 'rodless'], 'drove': ['dover', 'drove', 'vedro'], 'drow': ['drow', 'word'], 'drowse': ['dowser', 'drowse'], 'drub': ['burd', 'drub'], 'drugger': ['drugger', 'grudger'], 'druggery': ['druggery', 'grudgery'], 'drungar': ['drungar', 'gurnard'], 'drupe': ['drupe', 'duper', 'perdu', 'prude', 'pured'], 'drusean': ['asunder', 'drusean'], 'dryops': ['dropsy', 'dryops'], 'duad': ['addu', 'dadu', 'daud', 'duad'], 'dual': ['auld', 'dual', 'laud', 'udal'], 'duali': ['duali', 'dulia'], 'dualin': ['dualin', 'ludian', 'unlaid'], 'dualism': ['dualism', 'laudism'], 'dualist': ['dualist', 'laudist'], 'dub': ['bud', 'dub'], 'dubber': ['dubber', 'rubbed'], 'dubious': ['biduous', 'dubious'], 'dubitate': ['dubitate', 'tabitude'], 'ducal': ['cauld', 'ducal'], 'duces': ['decus', 'duces'], 'duckstone': ['duckstone', 'unstocked'], 'duco': ['douc', 'duco'], 'ducted': ['deduct', 'ducted'], 'duction': ['conduit', 'duction', 'noctuid'], 'duculinae': ['duculinae', 'nuculidae'], 'dudeen': ['denude', 'dudeen'], 'dudler': ['dudler', 'ruddle'], 'duel': ['deul', 'duel', 'leud'], 'dueler': ['dueler', 'eluder'], 'dueling': ['dueling', 'indulge'], 'duello': ['deloul', 'duello'], 'duenna': ['duenna', 'undean'], 'duer': ['duer', 'dure', 'rude', 'urde'], 'duffer': ['duffer', 'ruffed'], 'dufter': ['dufter', 'turfed'], 'dug': ['dug', 'gud'], 'duim': ['duim', 'muid'], 'dukery': ['dukery', 'duyker'], 'dulat': ['adult', 'dulat'], 'dulcian': ['dulcian', 'incudal', 'lucanid', 'lucinda'], 'dulciana': ['claudian', 'dulciana'], 'duler': ['duler', 'urled'], 'dulia': ['duali', 'dulia'], 'dullify': ['dullify', 'fluidly'], 'dulosis': ['dissoul', 'dulosis', 'solidus'], 'dulseman': ['dulseman', 'unalmsed'], 'dultie': ['dilute', 'dultie'], 'dum': ['dum', 'mud'], 'duma': ['duma', 'maud'], 'dumaist': ['dumaist', 'stadium'], 'dumontite': ['dumontite', 'unomitted'], 'dumple': ['dumple', 'plumed'], 'dunair': ['danuri', 'diurna', 'dunair', 'durain', 'durani', 'durian'], 'dunal': ['dunal', 'laund', 'lunda', 'ulnad'], 'dunderpate': ['dunderpate', 'undeparted'], 'dune': ['dune', 'nude', 'unde'], 'dungaree': ['dungaree', 'guardeen', 'unagreed', 'underage', 'ungeared'], 'dungeon': ['dungeon', 'negundo'], 'dunger': ['dunger', 'gerund', 'greund', 'nudger'], 'dungol': ['dungol', 'ungold'], 'dungy': ['dungy', 'gundy'], 'dunite': ['dunite', 'united', 'untied'], 'dunlap': ['dunlap', 'upland'], 'dunne': ['dunne', 'unden'], 'dunner': ['dunner', 'undern'], 'dunpickle': ['dunpickle', 'unpickled'], 'dunstable': ['dunstable', 'unblasted', 'unstabled'], 'dunt': ['dunt', 'tund'], 'duny': ['duny', 'undy'], 'duo': ['duo', 'udo'], 'duodenal': ['duodenal', 'unloaded'], 'duodenocholecystostomy': ['cholecystoduodenostomy', 'duodenocholecystostomy'], 'duodenojejunal': ['duodenojejunal', 'jejunoduodenal'], 'duodenopancreatectomy': ['duodenopancreatectomy', 'pancreatoduodenectomy'], 'dup': ['dup', 'pud'], 'duper': ['drupe', 'duper', 'perdu', 'prude', 'pured'], 'dupion': ['dupion', 'unipod'], 'dupla': ['dupla', 'plaud'], 'duplone': ['duplone', 'unpoled'], 'dura': ['ardu', 'daur', 'dura'], 'durain': ['danuri', 'diurna', 'dunair', 'durain', 'durani', 'durian'], 'duramen': ['duramen', 'maunder', 'unarmed'], 'durance': ['durance', 'redunca', 'unraced'], 'durango': ['aground', 'durango'], 'durani': ['danuri', 'diurna', 'dunair', 'durain', 'durani', 'durian'], 'durant': ['durant', 'tundra'], 'durban': ['durban', 'undrab'], 'durdenite': ['durdenite', 'undertide'], 'dure': ['duer', 'dure', 'rude', 'urde'], 'durene': ['durene', 'endure'], 'durenol': ['durenol', 'lounder', 'roundel'], 'durgan': ['durgan', 'undrag'], 'durian': ['danuri', 'diurna', 'dunair', 'durain', 'durani', 'durian'], 'during': ['during', 'ungird'], 'durity': ['durity', 'rudity'], 'durmast': ['durmast', 'mustard'], 'duro': ['dour', 'duro', 'ordu', 'roud'], 'dusken': ['dusken', 'sundek'], 'dust': ['dust', 'stud'], 'duster': ['derust', 'duster'], 'dustin': ['dustin', 'nudist'], 'dustpan': ['dustpan', 'upstand'], 'dusty': ['dusty', 'study'], 'duyker': ['dukery', 'duyker'], 'dvaita': ['divata', 'dvaita'], 'dwale': ['dwale', 'waled', 'weald'], 'dwine': ['dwine', 'edwin', 'wendi', 'widen', 'wined'], 'dyad': ['addy', 'dyad'], 'dyas': ['days', 'dyas'], 'dye': ['dey', 'dye', 'yed'], 'dyehouse': ['deyhouse', 'dyehouse'], 'dyeing': ['digeny', 'dyeing'], 'dyer': ['dyer', 'yerd'], 'dying': ['dingy', 'dying'], 'dynamo': ['dynamo', 'monday'], 'dynamoelectric': ['dynamoelectric', 'electrodynamic'], 'dynamoelectrical': ['dynamoelectrical', 'electrodynamical'], 'dynamotor': ['androtomy', 'dynamotor'], 'dyne': ['deny', 'dyne'], 'dyophone': ['dyophone', 'honeypod'], 'dysluite': ['dysluite', 'sedulity'], 'dysneuria': ['dasyurine', 'dysneuria'], 'dysphoric': ['chrysopid', 'dysphoric'], 'dysphrenia': ['dysphrenia', 'sphyraenid', 'sphyrnidae'], 'dystome': ['dystome', 'modesty'], 'dystrophia': ['diastrophy', 'dystrophia'], 'ea': ['ae', 'ea'], 'each': ['ache', 'each', 'haec'], 'eager': ['agree', 'eager', 'eagre'], 'eagle': ['aegle', 'eagle', 'galee'], 'eagless': ['ageless', 'eagless'], 'eaglet': ['eaglet', 'legate', 'teagle', 'telega'], 'eagre': ['agree', 'eager', 'eagre'], 'ean': ['ean', 'nae', 'nea'], 'ear': ['aer', 'are', 'ear', 'era', 'rea'], 'eared': ['eared', 'erade'], 'earful': ['earful', 'farleu', 'ferula'], 'earing': ['arenig', 'earing', 'gainer', 'reagin', 'regain'], 'earl': ['earl', 'eral', 'lear', 'real'], 'earlap': ['earlap', 'parale'], 'earle': ['areel', 'earle'], 'earlet': ['earlet', 'elater', 'relate'], 'earliness': ['earliness', 'naileress'], 'earlship': ['earlship', 'pearlish'], 'early': ['early', 'layer', 'relay'], 'earn': ['arne', 'earn', 'rane'], 'earner': ['earner', 'ranere'], 'earnest': ['earnest', 'eastern', 'nearest'], 'earnestly': ['earnestly', 'easternly'], 'earnful': ['earnful', 'funeral'], 'earning': ['earning', 'engrain'], 'earplug': ['earplug', 'graupel', 'plaguer'], 'earring': ['earring', 'grainer'], 'earringed': ['earringed', 'grenadier'], 'earshot': ['asthore', 'earshot'], 'eartab': ['abater', 'artabe', 'eartab', 'trabea'], 'earth': ['earth', 'hater', 'heart', 'herat', 'rathe'], 'earthborn': ['abhorrent', 'earthborn'], 'earthed': ['earthed', 'hearted'], 'earthen': ['earthen', 'enheart', 'hearten', 'naether', 'teheran', 'traheen'], 'earthian': ['earthian', 'rhaetian'], 'earthiness': ['earthiness', 'heartiness'], 'earthless': ['earthless', 'heartless'], 'earthling': ['earthling', 'heartling'], 'earthly': ['earthly', 'heartly', 'lathery', 'rathely'], 'earthnut': ['earthnut', 'heartnut'], 'earthpea': ['earthpea', 'heartpea'], 'earthquake': ['earthquake', 'heartquake'], 'earthward': ['earthward', 'heartward'], 'earthy': ['earthy', 'hearty', 'yearth'], 'earwig': ['earwig', 'grewia'], 'earwitness': ['earwitness', 'wateriness'], 'easel': ['easel', 'lease'], 'easement': ['easement', 'estamene'], 'easer': ['easer', 'erase'], 'easily': ['easily', 'elysia'], 'easing': ['easing', 'sangei'], 'east': ['ates', 'east', 'eats', 'sate', 'seat', 'seta'], 'eastabout': ['aetobatus', 'eastabout'], 'eastbound': ['eastbound', 'unboasted'], 'easter': ['asteer', 'easter', 'eastre', 'reseat', 'saeter', 'seater', 'staree', 'teaser', 'teresa'], 'easterling': ['easterling', 'generalist'], 'eastern': ['earnest', 'eastern', 'nearest'], 'easternly': ['earnestly', 'easternly'], 'easting': ['easting', 'gainset', 'genista', 'ingesta', 'seating', 'signate', 'teasing'], 'eastlake': ['alestake', 'eastlake'], 'eastre': ['asteer', 'easter', 'eastre', 'reseat', 'saeter', 'seater', 'staree', 'teaser', 'teresa'], 'easy': ['easy', 'eyas'], 'eat': ['ate', 'eat', 'eta', 'tae', 'tea'], 'eatberry': ['betrayer', 'eatberry', 'rebetray', 'teaberry'], 'eaten': ['eaten', 'enate'], 'eater': ['arete', 'eater', 'teaer'], 'eating': ['eating', 'ingate', 'tangie'], 'eats': ['ates', 'east', 'eats', 'sate', 'seat', 'seta'], 'eave': ['eave', 'evea'], 'eaved': ['deave', 'eaved', 'evade'], 'eaver': ['eaver', 'reave'], 'eaves': ['eaves', 'evase', 'seave'], 'eben': ['been', 'bene', 'eben'], 'ebenales': ['ebenales', 'lebanese'], 'ebon': ['beno', 'bone', 'ebon'], 'ebony': ['boney', 'ebony'], 'ebriety': ['byerite', 'ebriety'], 'eburna': ['eburna', 'unbare', 'unbear', 'urbane'], 'eburnated': ['eburnated', 'underbeat', 'unrebated'], 'eburnian': ['eburnian', 'inurbane'], 'ecad': ['cade', 'dace', 'ecad'], 'ecanda': ['adance', 'ecanda'], 'ecardinal': ['ecardinal', 'lardacein'], 'ecarinate': ['anaeretic', 'ecarinate'], 'ecarte': ['cerate', 'create', 'ecarte'], 'ecaudata': ['acaudate', 'ecaudata'], 'ecclesiasticism': ['ecclesiasticism', 'misecclesiastic'], 'eche': ['chee', 'eche'], 'echelon': ['chelone', 'echelon'], 'echeveria': ['echeveria', 'reachieve'], 'echidna': ['chained', 'echidna'], 'echinal': ['chilean', 'echinal', 'nichael'], 'echinate': ['echinate', 'hecatine'], 'echinital': ['echinital', 'inethical'], 'echis': ['echis', 'shice'], 'echoer': ['choree', 'cohere', 'echoer'], 'echoic': ['choice', 'echoic'], 'echoist': ['chitose', 'echoist'], 'eciton': ['eciton', 'noetic', 'notice', 'octine'], 'eckehart': ['eckehart', 'hacktree'], 'eclair': ['carlie', 'claire', 'eclair', 'erical'], 'eclat': ['cleat', 'eclat', 'ectal', 'lacet', 'tecla'], 'eclipsable': ['eclipsable', 'spliceable'], 'eclipser': ['eclipser', 'pericles', 'resplice'], 'economics': ['economics', 'neocosmic'], 'economism': ['economism', 'monoecism', 'monosemic'], 'economist': ['economist', 'mesotonic'], 'ecorticate': ['ecorticate', 'octaeteric'], 'ecostate': ['coestate', 'ecostate'], 'ecotonal': ['colonate', 'ecotonal'], 'ecotype': ['ecotype', 'ocypete'], 'ecrasite': ['ecrasite', 'sericate'], 'ecru': ['cure', 'ecru', 'eruc'], 'ectad': ['cadet', 'ectad'], 'ectal': ['cleat', 'eclat', 'ectal', 'lacet', 'tecla'], 'ectasis': ['ascites', 'ectasis'], 'ectene': ['cetene', 'ectene'], 'ectental': ['ectental', 'tentacle'], 'ectiris': ['ectiris', 'eristic'], 'ectocardia': ['coradicate', 'ectocardia'], 'ectocranial': ['calonectria', 'ectocranial'], 'ectoglia': ['ectoglia', 'geotical', 'goetical'], 'ectomorph': ['ectomorph', 'topchrome'], 'ectomorphic': ['cetomorphic', 'chemotropic', 'ectomorphic'], 'ectomorphy': ['chromotype', 'cormophyte', 'ectomorphy'], 'ectopia': ['ectopia', 'opacite'], 'ectopy': ['cotype', 'ectopy'], 'ectorhinal': ['chlorinate', 'ectorhinal', 'tornachile'], 'ectosarc': ['ectosarc', 'reaccost'], 'ectrogenic': ['ectrogenic', 'egocentric', 'geocentric'], 'ectromelia': ['carmeloite', 'ectromelia', 'meteorical'], 'ectropion': ['ectropion', 'neotropic'], 'ed': ['de', 'ed'], 'edda': ['dade', 'dead', 'edda'], 'eddaic': ['caddie', 'eddaic'], 'eddish': ['dished', 'eddish'], 'eddo': ['dedo', 'dode', 'eddo'], 'edema': ['adeem', 'ameed', 'edema'], 'eden': ['dene', 'eden', 'need'], 'edental': ['dalteen', 'dentale', 'edental'], 'edentata': ['antedate', 'edentata'], 'edessan': ['deaness', 'edessan'], 'edestan': ['edestan', 'standee'], 'edestin': ['destine', 'edestin'], 'edgar': ['edgar', 'grade'], 'edger': ['edger', 'greed'], 'edgerman': ['edgerman', 'gendarme'], 'edgrew': ['edgrew', 'wedger'], 'edible': ['debile', 'edible'], 'edict': ['cetid', 'edict'], 'edictal': ['citadel', 'deltaic', 'dialect', 'edictal', 'lactide'], 'edification': ['deification', 'edification'], 'edificatory': ['deificatory', 'edificatory'], 'edifier': ['deifier', 'edifier'], 'edify': ['deify', 'edify'], 'edit': ['diet', 'dite', 'edit', 'tide', 'tied'], 'edital': ['detail', 'dietal', 'dilate', 'edital', 'tailed'], 'edith': ['edith', 'ethid'], 'edition': ['edition', 'odinite', 'otidine', 'tineoid'], 'editor': ['editor', 'triode'], 'editorial': ['editorial', 'radiolite'], 'edmund': ['edmund', 'mudden'], 'edna': ['ande', 'dane', 'dean', 'edna'], 'edo': ['doe', 'edo', 'ode'], 'edoni': ['deino', 'dione', 'edoni'], 'education': ['coadunite', 'education', 'noctuidae'], 'educe': ['deuce', 'educe'], 'edward': ['edward', 'wadder', 'warded'], 'edwin': ['dwine', 'edwin', 'wendi', 'widen', 'wined'], 'eel': ['eel', 'lee'], 'eelgrass': ['eelgrass', 'gearless', 'rageless'], 'eelpot': ['eelpot', 'opelet'], 'eelspear': ['eelspear', 'prelease'], 'eely': ['eely', 'yeel'], 'eer': ['eer', 'ere', 'ree'], 'efik': ['efik', 'fike'], 'eft': ['eft', 'fet'], 'egad': ['aged', 'egad', 'gade'], 'egba': ['egba', 'gabe'], 'egbo': ['bego', 'egbo'], 'egeran': ['egeran', 'enrage', 'ergane', 'genear', 'genera'], 'egest': ['egest', 'geest', 'geste'], 'egger': ['egger', 'grege'], 'egghot': ['egghot', 'hogget'], 'eggler': ['eggler', 'legger'], 'eggy': ['eggy', 'yegg'], 'eglantine': ['eglantine', 'inelegant', 'legantine'], 'eglatere': ['eglatere', 'regelate', 'relegate'], 'egma': ['egma', 'game', 'mage'], 'ego': ['ego', 'geo'], 'egocentric': ['ectrogenic', 'egocentric', 'geocentric'], 'egoist': ['egoist', 'stogie'], 'egol': ['egol', 'goel', 'loge', 'ogle', 'oleg'], 'egotheism': ['egotheism', 'eightsome'], 'egret': ['egret', 'greet', 'reget'], 'eh': ['eh', 'he'], 'ehretia': ['ehretia', 'etheria'], 'eident': ['eident', 'endite'], 'eidograph': ['eidograph', 'ideograph'], 'eidology': ['eidology', 'ideology'], 'eighth': ['eighth', 'height'], 'eightsome': ['egotheism', 'eightsome'], 'eigne': ['eigne', 'genie'], 'eileen': ['eileen', 'lienee'], 'ekaha': ['ekaha', 'hakea'], 'eke': ['eke', 'kee'], 'eker': ['eker', 'reek'], 'ekoi': ['ekoi', 'okie'], 'ekron': ['ekron', 'krone'], 'ektene': ['ektene', 'ketene'], 'elabrate': ['elabrate', 'tearable'], 'elaidic': ['aedilic', 'elaidic'], 'elaidin': ['anilide', 'elaidin'], 'elain': ['alien', 'aline', 'anile', 'elain', 'elian', 'laine', 'linea'], 'elaine': ['aileen', 'elaine'], 'elamite': ['alemite', 'elamite'], 'elance': ['elance', 'enlace'], 'eland': ['eland', 'laden', 'lenad'], 'elanet': ['elanet', 'lanete', 'lateen'], 'elanus': ['elanus', 'unseal'], 'elaphomyces': ['elaphomyces', 'mesocephaly'], 'elaphurus': ['elaphurus', 'sulphurea'], 'elapid': ['aliped', 'elapid'], 'elapoid': ['elapoid', 'oedipal'], 'elaps': ['elaps', 'lapse', 'lepas', 'pales', 'salep', 'saple', 'sepal', 'slape', 'spale', 'speal'], 'elapse': ['asleep', 'elapse', 'please'], 'elastic': ['astelic', 'elastic', 'latices'], 'elasticin': ['elasticin', 'inelastic', 'sciential'], 'elastin': ['elastin', 'salient', 'saltine', 'slainte'], 'elastomer': ['elastomer', 'salometer'], 'elate': ['atlee', 'elate'], 'elated': ['delate', 'elated'], 'elater': ['earlet', 'elater', 'relate'], 'elaterid': ['detailer', 'elaterid'], 'elaterin': ['elaterin', 'entailer', 'treenail'], 'elatha': ['althea', 'elatha'], 'elatine': ['elatine', 'lineate'], 'elation': ['alnoite', 'elation', 'toenail'], 'elator': ['elator', 'lorate'], 'elb': ['bel', 'elb'], 'elbert': ['belter', 'elbert', 'treble'], 'elberta': ['bearlet', 'bleater', 'elberta', 'retable'], 'elbow': ['below', 'bowel', 'elbow'], 'elbowed': ['boweled', 'elbowed'], 'eld': ['del', 'eld', 'led'], 'eldin': ['eldin', 'lined'], 'elding': ['dingle', 'elding', 'engild', 'gilden'], 'elean': ['anele', 'elean'], 'election': ['coteline', 'election'], 'elective': ['cleveite', 'elective'], 'elector': ['elector', 'electro'], 'electoral': ['electoral', 'recollate'], 'electra': ['electra', 'treacle'], 'electragy': ['electragy', 'glycerate'], 'electret': ['electret', 'tercelet'], 'electric': ['electric', 'lectrice'], 'electrion': ['centriole', 'electrion', 'relection'], 'electro': ['elector', 'electro'], 'electrodynamic': ['dynamoelectric', 'electrodynamic'], 'electrodynamical': ['dynamoelectrical', 'electrodynamical'], 'electromagnetic': ['electromagnetic', 'magnetoelectric'], 'electromagnetical': ['electromagnetical', 'magnetoelectrical'], 'electrothermic': ['electrothermic', 'thermoelectric'], 'electrothermometer': ['electrothermometer', 'thermoelectrometer'], 'elegant': ['angelet', 'elegant'], 'elegiambus': ['elegiambus', 'iambelegus'], 'elegiast': ['elegiast', 'selagite'], 'elemi': ['elemi', 'meile'], 'elemin': ['elemin', 'meline'], 'elephantic': ['elephantic', 'plancheite'], 'elettaria': ['elettaria', 'retaliate'], 'eleut': ['eleut', 'elute'], 'elevator': ['elevator', 'overlate'], 'elfin': ['elfin', 'nifle'], 'elfishness': ['elfishness', 'fleshiness'], 'elfkin': ['elfkin', 'finkel'], 'elfwort': ['elfwort', 'felwort'], 'eli': ['eli', 'lei', 'lie'], 'elia': ['aiel', 'aile', 'elia'], 'elian': ['alien', 'aline', 'anile', 'elain', 'elian', 'laine', 'linea'], 'elias': ['aisle', 'elias'], 'elicitor': ['elicitor', 'trioleic'], 'eliminand': ['eliminand', 'mindelian'], 'elinor': ['elinor', 'lienor', 'lorien', 'noiler'], 'elinvar': ['elinvar', 'ravelin', 'reanvil', 'valerin'], 'elisha': ['elisha', 'hailse', 'sheila'], 'elisor': ['elisor', 'resoil'], 'elissa': ['elissa', 'lassie'], 'elite': ['elite', 'telei'], 'eliza': ['aizle', 'eliza'], 'elk': ['elk', 'lek'], 'ella': ['alle', 'ella', 'leal'], 'ellagate': ['allegate', 'ellagate'], 'ellenyard': ['ellenyard', 'learnedly'], 'ellick': ['ellick', 'illeck'], 'elliot': ['elliot', 'oillet'], 'elm': ['elm', 'mel'], 'elmer': ['elmer', 'merel', 'merle'], 'elmy': ['elmy', 'yelm'], 'eloah': ['eloah', 'haole'], 'elod': ['dole', 'elod', 'lode', 'odel'], 'eloge': ['eloge', 'golee'], 'elohimic': ['elohimic', 'hemiolic'], 'elohist': ['elohist', 'hostile'], 'eloign': ['eloign', 'gileno', 'legion'], 'eloigner': ['eloigner', 'legioner'], 'eloignment': ['eloignment', 'omnilegent'], 'elon': ['elon', 'enol', 'leno', 'leon', 'lone', 'noel'], 'elonite': ['elonite', 'leonite'], 'elops': ['elops', 'slope', 'spole'], 'elric': ['crile', 'elric', 'relic'], 'els': ['els', 'les'], 'elsa': ['elsa', 'sale', 'seal', 'slae'], 'else': ['else', 'lees', 'seel', 'sele', 'slee'], 'elsin': ['elsin', 'lenis', 'niels', 'silen', 'sline'], 'elt': ['elt', 'let'], 'eluate': ['aulete', 'eluate'], 'eluder': ['dueler', 'eluder'], 'elusion': ['elusion', 'luiseno'], 'elusory': ['elusory', 'yoursel'], 'elute': ['eleut', 'elute'], 'elution': ['elution', 'outline'], 'elutor': ['elutor', 'louter', 'outler'], 'elvan': ['elvan', 'navel', 'venal'], 'elvanite': ['elvanite', 'lavenite'], 'elver': ['elver', 'lever', 'revel'], 'elvet': ['elvet', 'velte'], 'elvira': ['averil', 'elvira'], 'elvis': ['elvis', 'levis', 'slive'], 'elwood': ['dewool', 'elwood', 'wooled'], 'elymi': ['elymi', 'emily', 'limey'], 'elysia': ['easily', 'elysia'], 'elytral': ['alertly', 'elytral'], 'elytrin': ['elytrin', 'inertly', 'trinely'], 'elytroposis': ['elytroposis', 'proteolysis'], 'elytrous': ['elytrous', 'urostyle'], 'em': ['em', 'me'], 'emanate': ['emanate', 'manatee'], 'emanation': ['amnionate', 'anamniote', 'emanation'], 'emanatist': ['emanatist', 'staminate', 'tasmanite'], 'embalmer': ['embalmer', 'emmarble'], 'embar': ['amber', 'bearm', 'bemar', 'bream', 'embar'], 'embargo': ['bergamo', 'embargo'], 'embark': ['embark', 'markeb'], 'embay': ['beamy', 'embay', 'maybe'], 'ember': ['breme', 'ember'], 'embind': ['embind', 'nimbed'], 'embira': ['ambier', 'bremia', 'embira'], 'embodier': ['demirobe', 'embodier'], 'embody': ['beydom', 'embody'], 'embole': ['bemole', 'embole'], 'embraceor': ['cerebroma', 'embraceor'], 'embrail': ['embrail', 'mirabel'], 'embryoid': ['embryoid', 'reimbody'], 'embus': ['embus', 'sebum'], 'embusk': ['bemusk', 'embusk'], 'emcee': ['emcee', 'meece'], 'emeership': ['emeership', 'ephemeris'], 'emend': ['emend', 'mende'], 'emendation': ['denominate', 'emendation'], 'emendator': ['emendator', 'ondameter'], 'emerita': ['emerita', 'emirate'], 'emerse': ['emerse', 'seemer'], 'emersion': ['emersion', 'meriones'], 'emersonian': ['emersonian', 'mansioneer'], 'emesa': ['emesa', 'mease'], 'emigrate': ['emigrate', 'remigate'], 'emigration': ['emigration', 'remigation'], 'emil': ['emil', 'lime', 'mile'], 'emilia': ['emilia', 'mailie'], 'emily': ['elymi', 'emily', 'limey'], 'emim': ['emim', 'mime'], 'emir': ['emir', 'imer', 'mire', 'reim', 'remi', 'riem', 'rime'], 'emirate': ['emerita', 'emirate'], 'emirship': ['emirship', 'imperish'], 'emissary': ['emissary', 'missayer'], 'emit': ['emit', 'item', 'mite', 'time'], 'emitter': ['emitter', 'termite'], 'emm': ['emm', 'mem'], 'emmarble': ['embalmer', 'emmarble'], 'emodin': ['domine', 'domnei', 'emodin', 'medino'], 'emotion': ['emotion', 'moonite'], 'empanel': ['empanel', 'emplane', 'peelman'], 'empathic': ['empathic', 'emphatic'], 'empathically': ['empathically', 'emphatically'], 'emphasis': ['emphasis', 'misshape'], 'emphatic': ['empathic', 'emphatic'], 'emphatically': ['empathically', 'emphatically'], 'empire': ['empire', 'epimer'], 'empiricist': ['empiricist', 'empiristic'], 'empiristic': ['empiricist', 'empiristic'], 'emplane': ['empanel', 'emplane', 'peelman'], 'employer': ['employer', 'polymere'], 'emporia': ['emporia', 'meropia'], 'emporial': ['emporial', 'proemial'], 'emporium': ['emporium', 'pomerium', 'proemium'], 'emprise': ['emprise', 'imprese', 'premise', 'spireme'], 'empt': ['empt', 'temp'], 'emptier': ['emptier', 'impetre'], 'emption': ['emption', 'pimento'], 'emptional': ['emptional', 'palmitone'], 'emptor': ['emptor', 'trompe'], 'empyesis': ['empyesis', 'pyemesis'], 'emu': ['emu', 'ume'], 'emulant': ['almuten', 'emulant'], 'emulation': ['emulation', 'laumonite'], 'emulsion': ['emulsion', 'solenium'], 'emundation': ['emundation', 'mountained'], 'emyd': ['demy', 'emyd'], 'en': ['en', 'ne'], 'enable': ['baleen', 'enable'], 'enabler': ['enabler', 'renable'], 'enaction': ['cetonian', 'enaction'], 'enactor': ['enactor', 'necator', 'orcanet'], 'enactory': ['enactory', 'octenary'], 'enaena': ['aenean', 'enaena'], 'enalid': ['aldine', 'daniel', 'delian', 'denial', 'enalid', 'leadin'], 'enaliornis': ['enaliornis', 'rosaniline'], 'enaluron': ['enaluron', 'neuronal'], 'enam': ['amen', 'enam', 'mane', 'mean', 'name', 'nema'], 'enamel': ['enamel', 'melena'], 'enameling': ['enameling', 'malengine', 'meningeal'], 'enamor': ['enamor', 'monera', 'oreman', 'romane'], 'enamored': ['demeanor', 'enamored'], 'enanthem': ['enanthem', 'menthane'], 'enantiomer': ['enantiomer', 'renominate'], 'enapt': ['enapt', 'paten', 'penta', 'tapen'], 'enarch': ['enarch', 'ranche'], 'enarm': ['enarm', 'namer', 'reman'], 'enarme': ['enarme', 'meaner', 'rename'], 'enarthrosis': ['enarthrosis', 'nearthrosis'], 'enate': ['eaten', 'enate'], 'enatic': ['acetin', 'actine', 'enatic'], 'enation': ['enation', 'etonian'], 'enbrave': ['enbrave', 'verbena'], 'encapsule': ['encapsule', 'pelecanus'], 'encase': ['encase', 'seance', 'seneca'], 'encash': ['encash', 'sanche'], 'encauma': ['cumaean', 'encauma'], 'encaustes': ['acuteness', 'encaustes'], 'encaustic': ['encaustic', 'succinate'], 'encephalomeningitis': ['encephalomeningitis', 'meningoencephalitis'], 'encephalomeningocele': ['encephalomeningocele', 'meningoencephalocele'], 'encephalomyelitis': ['encephalomyelitis', 'myeloencephalitis'], 'enchair': ['chainer', 'enchair', 'rechain'], 'encharge': ['encharge', 'rechange'], 'encharnel': ['channeler', 'encharnel'], 'enchytrae': ['cytherean', 'enchytrae'], 'encina': ['canine', 'encina', 'neanic'], 'encinillo': ['encinillo', 'linolenic'], 'encist': ['encist', 'incest', 'insect', 'scient'], 'encitadel': ['declinate', 'encitadel'], 'enclaret': ['celarent', 'centrale', 'enclaret'], 'enclasp': ['enclasp', 'spancel'], 'enclave': ['enclave', 'levance', 'valence'], 'enclosure': ['enclosure', 'recounsel'], 'encoignure': ['encoignure', 'neurogenic'], 'encoil': ['clione', 'coelin', 'encoil', 'enolic'], 'encomiastic': ['cosmetician', 'encomiastic'], 'encomic': ['comenic', 'encomic', 'meconic'], 'encomium': ['encomium', 'meconium'], 'encoronal': ['encoronal', 'olecranon'], 'encoronate': ['encoronate', 'entocornea'], 'encradle': ['calender', 'encradle'], 'encranial': ['carnelian', 'encranial'], 'encratic': ['acentric', 'encratic', 'nearctic'], 'encratism': ['encratism', 'miscreant'], 'encraty': ['encraty', 'nectary'], 'encreel': ['crenele', 'encreel'], 'encrinital': ['encrinital', 'tricennial'], 'encrisp': ['encrisp', 'pincers'], 'encrust': ['encrust', 'uncrest'], 'encurl': ['encurl', 'lucern'], 'encurtain': ['encurtain', 'runcinate', 'uncertain'], 'encyrtidae': ['encyrtidae', 'nycteridae'], 'end': ['den', 'end', 'ned'], 'endaortic': ['citronade', 'endaortic', 'redaction'], 'endboard': ['deadborn', 'endboard'], 'endear': ['deaner', 'endear'], 'endeared': ['deadener', 'endeared'], 'endearing': ['endearing', 'engrained', 'grenadine'], 'endearingly': ['endearingly', 'engrainedly'], 'endemial': ['endemial', 'madeline'], 'endere': ['endere', 'needer', 'reeden'], 'enderonic': ['enderonic', 'endocrine'], 'endevil': ['develin', 'endevil'], 'endew': ['endew', 'wende'], 'ending': ['ending', 'ginned'], 'endite': ['eident', 'endite'], 'endive': ['endive', 'envied', 'veined'], 'endoarteritis': ['endoarteritis', 'sideronatrite'], 'endocline': ['endocline', 'indolence'], 'endocrine': ['enderonic', 'endocrine'], 'endome': ['endome', 'omened'], 'endopathic': ['dictaphone', 'endopathic'], 'endophasic': ['deaconship', 'endophasic'], 'endoral': ['endoral', 'ladrone', 'leonard'], 'endosarc': ['endosarc', 'secondar'], 'endosome': ['endosome', 'moonseed'], 'endosporium': ['endosporium', 'imponderous'], 'endosteal': ['endosteal', 'leadstone'], 'endothecial': ['chelidonate', 'endothecial'], 'endothelia': ['endothelia', 'ethanediol', 'ethenoidal'], 'endow': ['endow', 'nowed'], 'endura': ['endura', 'neurad', 'undear', 'unread'], 'endurably': ['endurably', 'undryable'], 'endure': ['durene', 'endure'], 'endurer': ['endurer', 'underer'], 'enduring': ['enduring', 'unringed'], 'enduringly': ['enduringly', 'underlying'], 'endwise': ['endwise', 'sinewed'], 'enema': ['ameen', 'amene', 'enema'], 'enemy': ['enemy', 'yemen'], 'energesis': ['energesis', 'regenesis'], 'energeticist': ['energeticist', 'energetistic'], 'energetistic': ['energeticist', 'energetistic'], 'energic': ['energic', 'generic'], 'energical': ['energical', 'generical'], 'energid': ['energid', 'reeding'], 'energist': ['energist', 'steering'], 'energy': ['energy', 'greeny', 'gyrene'], 'enervate': ['enervate', 'venerate'], 'enervation': ['enervation', 'veneration'], 'enervative': ['enervative', 'venerative'], 'enervator': ['enervator', 'renovater', 'venerator'], 'enfilade': ['alfenide', 'enfilade'], 'enfile': ['enfile', 'enlief', 'enlife', 'feline'], 'enflesh': ['enflesh', 'fleshen'], 'enfoil': ['enfoil', 'olefin'], 'enfold': ['enfold', 'folden', 'fondle'], 'enforcer': ['confrere', 'enforcer', 'reconfer'], 'enframe': ['enframe', 'freeman'], 'engaol': ['angelo', 'engaol'], 'engarb': ['banger', 'engarb', 'graben'], 'engaud': ['augend', 'engaud', 'unaged'], 'engild': ['dingle', 'elding', 'engild', 'gilden'], 'engird': ['engird', 'ringed'], 'engirdle': ['engirdle', 'reedling'], 'engirt': ['engirt', 'tinger'], 'englacial': ['angelical', 'englacial', 'galenical'], 'englacially': ['angelically', 'englacially'], 'englad': ['angled', 'dangle', 'englad', 'lagend'], 'englander': ['englander', 'greenland'], 'english': ['english', 'shingle'], 'englisher': ['englisher', 'reshingle'], 'englut': ['englut', 'gluten', 'ungelt'], 'engobe': ['begone', 'engobe'], 'engold': ['engold', 'golden'], 'engrail': ['aligner', 'engrail', 'realign', 'reginal'], 'engrailed': ['engrailed', 'geraldine'], 'engrailment': ['engrailment', 'realignment'], 'engrain': ['earning', 'engrain'], 'engrained': ['endearing', 'engrained', 'grenadine'], 'engrainedly': ['endearingly', 'engrainedly'], 'engram': ['engram', 'german', 'manger'], 'engraphic': ['engraphic', 'preaching'], 'engrave': ['avenger', 'engrave'], 'engross': ['engross', 'grossen'], 'enhat': ['enhat', 'ethan', 'nathe', 'neath', 'thane'], 'enheart': ['earthen', 'enheart', 'hearten', 'naether', 'teheran', 'traheen'], 'enherit': ['enherit', 'etherin', 'neither', 'therein'], 'enhydra': ['enhydra', 'henyard'], 'eniac': ['anice', 'eniac'], 'enicuridae': ['audiencier', 'enicuridae'], 'enid': ['dine', 'enid', 'inde', 'nide'], 'enif': ['enif', 'fine', 'neif', 'nife'], 'enisle': ['enisle', 'ensile', 'senile', 'silene'], 'enlace': ['elance', 'enlace'], 'enlard': ['aldern', 'darnel', 'enlard', 'lander', 'lenard', 'randle', 'reland'], 'enlarge': ['enlarge', 'general', 'gleaner'], 'enleaf': ['enleaf', 'leafen'], 'enlief': ['enfile', 'enlief', 'enlife', 'feline'], 'enlife': ['enfile', 'enlief', 'enlife', 'feline'], 'enlight': ['enlight', 'lighten'], 'enlist': ['enlist', 'listen', 'silent', 'tinsel'], 'enlisted': ['enlisted', 'lintseed'], 'enlister': ['enlister', 'esterlin', 'listener', 'relisten'], 'enmass': ['enmass', 'maness', 'messan'], 'enneadic': ['cadinene', 'decennia', 'enneadic'], 'ennobler': ['ennobler', 'nonrebel'], 'ennoic': ['conine', 'connie', 'ennoic'], 'ennomic': ['ennomic', 'meconin'], 'enoch': ['cohen', 'enoch'], 'enocyte': ['enocyte', 'neocyte'], 'enodal': ['enodal', 'loaden'], 'enoil': ['enoil', 'ileon', 'olein'], 'enol': ['elon', 'enol', 'leno', 'leon', 'lone', 'noel'], 'enolic': ['clione', 'coelin', 'encoil', 'enolic'], 'enomania': ['enomania', 'maeonian'], 'enomotarch': ['chromatone', 'enomotarch'], 'enorganic': ['enorganic', 'ignorance'], 'enorm': ['enorm', 'moner', 'morne'], 'enormous': ['enormous', 'unmorose'], 'enos': ['enos', 'nose'], 'enostosis': ['enostosis', 'sootiness'], 'enow': ['enow', 'owen', 'wone'], 'enphytotic': ['enphytotic', 'entophytic'], 'enrace': ['careen', 'carene', 'enrace'], 'enrage': ['egeran', 'enrage', 'ergane', 'genear', 'genera'], 'enraged': ['derange', 'enraged', 'gardeen', 'gerenda', 'grandee', 'grenade'], 'enragedly': ['enragedly', 'legendary'], 'enrapt': ['arpent', 'enrapt', 'entrap', 'panter', 'parent', 'pretan', 'trepan'], 'enravish': ['enravish', 'ravenish', 'vanisher'], 'enray': ['enray', 'yearn'], 'enrib': ['brine', 'enrib'], 'enrich': ['enrich', 'nicher', 'richen'], 'enring': ['enring', 'ginner'], 'enrive': ['enrive', 'envier', 'veiner', 'verine'], 'enrobe': ['boreen', 'enrobe', 'neebor', 'rebone'], 'enrol': ['enrol', 'loren'], 'enrolled': ['enrolled', 'rondelle'], 'enrough': ['enrough', 'roughen'], 'enruin': ['enruin', 'neurin', 'unrein'], 'enrut': ['enrut', 'tuner', 'urent'], 'ens': ['ens', 'sen'], 'ensaint': ['ensaint', 'stanine'], 'ensate': ['ensate', 'enseat', 'santee', 'sateen', 'senate'], 'ense': ['ense', 'esne', 'nese', 'seen', 'snee'], 'enseam': ['enseam', 'semnae'], 'enseat': ['ensate', 'enseat', 'santee', 'sateen', 'senate'], 'ensepulcher': ['ensepulcher', 'ensepulchre'], 'ensepulchre': ['ensepulcher', 'ensepulchre'], 'enshade': ['dasheen', 'enshade'], 'enshroud': ['enshroud', 'unshored'], 'ensigncy': ['ensigncy', 'syngenic'], 'ensilage': ['ensilage', 'genesial', 'signalee'], 'ensile': ['enisle', 'ensile', 'senile', 'silene'], 'ensilver': ['ensilver', 'sniveler'], 'ensmall': ['ensmall', 'smallen'], 'ensoul': ['ensoul', 'olenus', 'unsole'], 'enspirit': ['enspirit', 'pristine'], 'enstar': ['astern', 'enstar', 'stenar', 'sterna'], 'enstatite': ['enstatite', 'intestate', 'satinette'], 'enstool': ['enstool', 'olonets'], 'enstore': ['enstore', 'estrone', 'storeen', 'tornese'], 'ensue': ['ensue', 'seenu', 'unsee'], 'ensuer': ['ensuer', 'ensure'], 'ensure': ['ensuer', 'ensure'], 'entablature': ['entablature', 'untreatable'], 'entach': ['entach', 'netcha'], 'entad': ['denat', 'entad'], 'entada': ['adnate', 'entada'], 'entail': ['entail', 'tineal'], 'entailer': ['elaterin', 'entailer', 'treenail'], 'ental': ['ental', 'laten', 'leant'], 'entasia': ['anisate', 'entasia'], 'entasis': ['entasis', 'sestian', 'sestina'], 'entelam': ['entelam', 'leetman'], 'enter': ['enter', 'neter', 'renet', 'terne', 'treen'], 'enteral': ['alterne', 'enteral', 'eternal', 'teleran', 'teneral'], 'enterer': ['enterer', 'terrene'], 'enteria': ['enteria', 'trainee', 'triaene'], 'enteric': ['citrene', 'enteric', 'enticer', 'tercine'], 'enterocolitis': ['coloenteritis', 'enterocolitis'], 'enterogastritis': ['enterogastritis', 'gastroenteritis'], 'enteroid': ['enteroid', 'orendite'], 'enteron': ['enteron', 'tenoner'], 'enteropexy': ['enteropexy', 'oxyterpene'], 'entertain': ['entertain', 'tarentine', 'terentian'], 'entheal': ['entheal', 'lethean'], 'enthraldom': ['enthraldom', 'motherland'], 'enthuse': ['enthuse', 'unsheet'], 'entia': ['entia', 'teian', 'tenai', 'tinea'], 'enticer': ['citrene', 'enteric', 'enticer', 'tercine'], 'entincture': ['entincture', 'unreticent'], 'entire': ['entire', 'triene'], 'entirely': ['entirely', 'lientery'], 'entirety': ['entirety', 'eternity'], 'entity': ['entity', 'tinety'], 'entocoelic': ['coelection', 'entocoelic'], 'entocornea': ['encoronate', 'entocornea'], 'entohyal': ['entohyal', 'ethanoyl'], 'entoil': ['entoil', 'lionet'], 'entomeric': ['entomeric', 'intercome', 'morencite'], 'entomic': ['centimo', 'entomic', 'tecomin'], 'entomical': ['entomical', 'melanotic'], 'entomion': ['entomion', 'noontime'], 'entomoid': ['demotion', 'entomoid', 'moontide'], 'entomophily': ['entomophily', 'monophylite'], 'entomotomy': ['entomotomy', 'omentotomy'], 'entoparasite': ['antiprotease', 'entoparasite'], 'entophyte': ['entophyte', 'tenophyte'], 'entophytic': ['enphytotic', 'entophytic'], 'entopic': ['entopic', 'nepotic', 'pentoic'], 'entoplastic': ['entoplastic', 'spinotectal', 'tectospinal', 'tenoplastic'], 'entoretina': ['entoretina', 'tetraonine'], 'entosarc': ['ancestor', 'entosarc'], 'entotic': ['entotic', 'tonetic'], 'entozoa': ['entozoa', 'ozonate'], 'entozoic': ['entozoic', 'enzootic'], 'entrail': ['entrail', 'latiner', 'latrine', 'ratline', 'reliant', 'retinal', 'trenail'], 'entrain': ['entrain', 'teriann'], 'entrance': ['centenar', 'entrance'], 'entrap': ['arpent', 'enrapt', 'entrap', 'panter', 'parent', 'pretan', 'trepan'], 'entreat': ['entreat', 'ratteen', 'tarente', 'ternate', 'tetrane'], 'entreating': ['entreating', 'interagent'], 'entree': ['entree', 'rentee', 'retene'], 'entrepas': ['entrepas', 'septenar'], 'entropion': ['entropion', 'pontonier', 'prenotion'], 'entropium': ['entropium', 'importune'], 'entrust': ['entrust', 'stunter', 'trusten'], 'enumeration': ['enumeration', 'mountaineer'], 'enunciation': ['enunciation', 'incuneation'], 'enunciator': ['enunciator', 'uncreation'], 'enure': ['enure', 'reune'], 'envelope': ['envelope', 'ovenpeel'], 'enverdure': ['enverdure', 'unrevered'], 'envied': ['endive', 'envied', 'veined'], 'envier': ['enrive', 'envier', 'veiner', 'verine'], 'envious': ['envious', 'niveous', 'veinous'], 'envoy': ['envoy', 'nevoy', 'yoven'], 'enwood': ['enwood', 'wooden'], 'enwound': ['enwound', 'unowned'], 'enwrap': ['enwrap', 'pawner', 'repawn'], 'enwrite': ['enwrite', 'retwine'], 'enzootic': ['entozoic', 'enzootic'], 'eoan': ['aeon', 'eoan'], 'eogaean': ['eogaean', 'neogaea'], 'eolithic': ['chiolite', 'eolithic'], 'eon': ['eon', 'neo', 'one'], 'eonism': ['eonism', 'mesion', 'oneism', 'simeon'], 'eophyton': ['eophyton', 'honeypot'], 'eosaurus': ['eosaurus', 'rousseau'], 'eosin': ['eosin', 'noise'], 'eosinoblast': ['bosselation', 'eosinoblast'], 'epacrid': ['epacrid', 'peracid', 'preacid'], 'epacris': ['epacris', 'scrapie', 'serapic'], 'epactal': ['epactal', 'placate'], 'eparch': ['aperch', 'eparch', 'percha', 'preach'], 'eparchial': ['eparchial', 'raphaelic'], 'eparchy': ['eparchy', 'preachy'], 'epha': ['epha', 'heap'], 'epharmonic': ['epharmonic', 'pinachrome'], 'ephemeris': ['emeership', 'ephemeris'], 'ephod': ['depoh', 'ephod', 'hoped'], 'ephor': ['ephor', 'hoper'], 'ephorus': ['ephorus', 'orpheus', 'upshore'], 'epibasal': ['ablepsia', 'epibasal'], 'epibole': ['epibole', 'epilobe'], 'epic': ['epic', 'pice'], 'epical': ['epical', 'piacle', 'plaice'], 'epicarp': ['crappie', 'epicarp'], 'epicentral': ['epicentral', 'parentelic'], 'epiceratodus': ['dipteraceous', 'epiceratodus'], 'epichorial': ['aerophilic', 'epichorial'], 'epicly': ['epicly', 'pyelic'], 'epicostal': ['alopecist', 'altiscope', 'epicostal', 'scapolite'], 'epicotyl': ['epicotyl', 'lipocyte'], 'epicranial': ['epicranial', 'periacinal'], 'epiderm': ['demirep', 'epiderm', 'impeder', 'remiped'], 'epiderma': ['epiderma', 'premedia'], 'epidermal': ['epidermal', 'impleader', 'premedial'], 'epidermis': ['dispireme', 'epidermis'], 'epididymovasostomy': ['epididymovasostomy', 'vasoepididymostomy'], 'epidural': ['dipleura', 'epidural'], 'epigram': ['epigram', 'primage'], 'epilabrum': ['epilabrum', 'impuberal'], 'epilachna': ['cephalina', 'epilachna'], 'epilate': ['epilate', 'epitela', 'pileate'], 'epilation': ['epilation', 'polianite'], 'epilatory': ['epilatory', 'petiolary'], 'epilobe': ['epibole', 'epilobe'], 'epimer': ['empire', 'epimer'], 'epiotic': ['epiotic', 'poietic'], 'epipactis': ['epipactis', 'epipastic'], 'epipastic': ['epipactis', 'epipastic'], 'epiplasm': ['epiplasm', 'palmipes'], 'epiploic': ['epiploic', 'epipolic'], 'epipolic': ['epiploic', 'epipolic'], 'epirotic': ['epirotic', 'periotic'], 'episclera': ['episclera', 'periclase'], 'episematic': ['episematic', 'septicemia'], 'episodal': ['episodal', 'lapidose', 'sepaloid'], 'episodial': ['apsidiole', 'episodial'], 'epistatic': ['epistatic', 'pistacite'], 'episternal': ['alpestrine', 'episternal', 'interlapse', 'presential'], 'episternum': ['episternum', 'uprisement'], 'epistlar': ['epistlar', 'pilaster', 'plaister', 'priestal'], 'epistle': ['epistle', 'septile'], 'epistler': ['epistler', 'spirelet'], 'epistoler': ['epistoler', 'peristole', 'perseitol', 'pistoleer'], 'epistoma': ['epistoma', 'metopias'], 'epistome': ['epistome', 'epsomite'], 'epistroma': ['epistroma', 'peristoma'], 'epitela': ['epilate', 'epitela', 'pileate'], 'epithecal': ['epithecal', 'petechial', 'phacelite'], 'epithecate': ['epithecate', 'petechiate'], 'epithet': ['epithet', 'heptite'], 'epithyme': ['epithyme', 'hemitype'], 'epitomizer': ['epitomizer', 'peritomize'], 'epizoal': ['epizoal', 'lopezia', 'opalize'], 'epoch': ['epoch', 'poche'], 'epodic': ['copied', 'epodic'], 'epornitic': ['epornitic', 'proteinic'], 'epos': ['epos', 'peso', 'pose', 'sope'], 'epsilon': ['epsilon', 'sinople'], 'epsomite': ['epistome', 'epsomite'], 'epulis': ['epulis', 'pileus'], 'epulo': ['epulo', 'loupe'], 'epuloid': ['epuloid', 'euploid'], 'epulosis': ['epulosis', 'pelusios'], 'epulotic': ['epulotic', 'poultice'], 'epural': ['epural', 'perula', 'pleura'], 'epuration': ['epuration', 'eupatorin'], 'equal': ['equal', 'quale', 'queal'], 'equalable': ['aquabelle', 'equalable'], 'equiangle': ['angelique', 'equiangle'], 'equinity': ['equinity', 'inequity'], 'equip': ['equip', 'pique'], 'equitable': ['equitable', 'quietable'], 'equitist': ['equitist', 'quietist'], 'equus': ['equus', 'usque'], 'er': ['er', 're'], 'era': ['aer', 'are', 'ear', 'era', 'rea'], 'erade': ['eared', 'erade'], 'eradicant': ['carinated', 'eradicant'], 'eradicator': ['corradiate', 'cortaderia', 'eradicator'], 'eral': ['earl', 'eral', 'lear', 'real'], 'eranist': ['asterin', 'eranist', 'restain', 'stainer', 'starnie', 'stearin'], 'erase': ['easer', 'erase'], 'erased': ['erased', 'reseda', 'seared'], 'eraser': ['eraser', 'searer'], 'erasmian': ['erasmian', 'raiseman'], 'erasmus': ['assumer', 'erasmus', 'masseur'], 'erastian': ['artesian', 'asterina', 'asternia', 'erastian', 'seatrain'], 'erastus': ['erastus', 'ressaut'], 'erava': ['avera', 'erava'], 'erbia': ['barie', 'beira', 'erbia', 'rebia'], 'erbium': ['erbium', 'imbrue'], 'erd': ['erd', 'red'], 'ere': ['eer', 'ere', 'ree'], 'erect': ['crete', 'erect'], 'erectable': ['celebrate', 'erectable'], 'erecting': ['erecting', 'gentrice'], 'erection': ['erection', 'neoteric', 'nocerite', 'renotice'], 'eremic': ['eremic', 'merice'], 'eremital': ['eremital', 'materiel'], 'erept': ['erept', 'peter', 'petre'], 'ereptic': ['ereptic', 'precite', 'receipt'], 'ereption': ['ereption', 'tropeine'], 'erethic': ['erethic', 'etheric', 'heretic', 'heteric', 'teicher'], 'erethism': ['erethism', 'etherism', 'heterism'], 'erethismic': ['erethismic', 'hetericism'], 'erethistic': ['erethistic', 'hetericist'], 'eretrian': ['arretine', 'eretrian', 'eritrean', 'retainer'], 'erg': ['erg', 'ger', 'reg'], 'ergal': ['argel', 'ergal', 'garle', 'glare', 'lager', 'large', 'regal'], 'ergamine': ['ergamine', 'merginae'], 'ergane': ['egeran', 'enrage', 'ergane', 'genear', 'genera'], 'ergastic': ['agrestic', 'ergastic'], 'ergates': ['ergates', 'gearset', 'geaster'], 'ergoism': ['ergoism', 'ogreism'], 'ergomaniac': ['ergomaniac', 'grecomania'], 'ergon': ['ergon', 'genro', 'goner', 'negro'], 'ergot': ['ergot', 'rotge'], 'ergotamine': ['angiometer', 'ergotamine', 'geometrina'], 'ergotin': ['ergotin', 'genitor', 'negrito', 'ogtiern', 'trigone'], 'ergusia': ['ergusia', 'gerusia', 'sarigue'], 'eria': ['aire', 'eria'], 'erian': ['erian', 'irena', 'reina'], 'eric': ['eric', 'rice'], 'erica': ['acier', 'aeric', 'ceria', 'erica'], 'ericad': ['acider', 'ericad'], 'erical': ['carlie', 'claire', 'eclair', 'erical'], 'erichtoid': ['dichroite', 'erichtoid', 'theriodic'], 'erigenia': ['aegirine', 'erigenia'], 'erigeron': ['erigeron', 'reignore'], 'erik': ['erik', 'kier', 'reki'], 'erineum': ['erineum', 'unireme'], 'erinose': ['erinose', 'roseine'], 'eristalis': ['eristalis', 'serialist'], 'eristic': ['ectiris', 'eristic'], 'eristical': ['eristical', 'realistic'], 'erithacus': ['erithacus', 'eucharist'], 'eritrean': ['arretine', 'eretrian', 'eritrean', 'retainer'], 'erma': ['erma', 'mare', 'rame', 'ream'], 'ermani': ['ermani', 'marine', 'remain'], 'ermines': ['ermines', 'inermes'], 'erne': ['erne', 'neer', 'reen'], 'ernest': ['ernest', 'nester', 'resent', 'streen'], 'ernie': ['ernie', 'ierne', 'irene'], 'ernst': ['ernst', 'stern'], 'erode': ['doree', 'erode'], 'eros': ['eros', 'rose', 'sero', 'sore'], 'erose': ['erose', 'soree'], 'erotesis': ['erotesis', 'isostere'], 'erotic': ['erotic', 'tercio'], 'erotical': ['calorite', 'erotical', 'loricate'], 'eroticism': ['eroticism', 'isometric', 'meroistic', 'trioecism'], 'erotism': ['erotism', 'mortise', 'trisome'], 'erotogenic': ['erotogenic', 'geocronite', 'orogenetic'], 'errabund': ['errabund', 'unbarred'], 'errand': ['darner', 'darren', 'errand', 'rander', 'redarn'], 'errant': ['arrent', 'errant', 'ranter', 'ternar'], 'errantia': ['artarine', 'errantia'], 'erratic': ['cartier', 'cirrate', 'erratic'], 'erratum': ['erratum', 'maturer'], 'erring': ['erring', 'rering', 'ringer'], 'errite': ['errite', 'reiter', 'retier', 'retire', 'tierer'], 'ers': ['ers', 'ser'], 'ersar': ['ersar', 'raser', 'serra'], 'erse': ['erse', 'rees', 'seer', 'sere'], 'erthen': ['erthen', 'henter', 'nether', 'threne'], 'eruc': ['cure', 'ecru', 'eruc'], 'eruciform': ['eruciform', 'urceiform'], 'erucin': ['curine', 'erucin', 'neuric'], 'erucivorous': ['erucivorous', 'overcurious'], 'eruct': ['cruet', 'eruct', 'recut', 'truce'], 'eruction': ['eruction', 'neurotic'], 'erugate': ['erugate', 'guetare'], 'erumpent': ['erumpent', 'untemper'], 'eruption': ['eruption', 'unitrope'], 'erwin': ['erwin', 'rewin', 'winer'], 'eryngium': ['eryngium', 'gynerium'], 'eryon': ['eryon', 'onery'], 'eryops': ['eryops', 'osprey'], 'erythea': ['erythea', 'hetaery', 'yeather'], 'erythrin': ['erythrin', 'tyrrheni'], 'erythrophage': ['erythrophage', 'heterography'], 'erythrophyllin': ['erythrophyllin', 'phylloerythrin'], 'erythropia': ['erythropia', 'pyrotheria'], 'es': ['es', 'se'], 'esca': ['case', 'esca'], 'escalan': ['escalan', 'scalena'], 'escalin': ['celsian', 'escalin', 'sanicle', 'secalin'], 'escaloped': ['copleased', 'escaloped'], 'escapement': ['escapement', 'espacement'], 'escaper': ['escaper', 'respace'], 'escarp': ['casper', 'escarp', 'parsec', 'scrape', 'secpar', 'spacer'], 'eschar': ['arches', 'chaser', 'eschar', 'recash', 'search'], 'eschara': ['asearch', 'eschara'], 'escheator': ['escheator', 'tocharese'], 'escobilla': ['escobilla', 'obeliscal'], 'escolar': ['escolar', 'solacer'], 'escort': ['corset', 'cortes', 'coster', 'escort', 'scoter', 'sector'], 'escortment': ['centermost', 'escortment'], 'escrol': ['closer', 'cresol', 'escrol'], 'escropulo': ['escropulo', 'supercool'], 'esculent': ['esculent', 'unselect'], 'esculin': ['esculin', 'incluse'], 'esere': ['esere', 'reese', 'resee'], 'esexual': ['esexual', 'sexuale'], 'eshin': ['eshin', 'shine'], 'esiphonal': ['esiphonal', 'phaseolin'], 'esker': ['esker', 'keres', 'reesk', 'seker', 'skeer', 'skere'], 'eskualdun': ['eskualdun', 'euskaldun'], 'eskuara': ['eskuara', 'euskara'], 'esne': ['ense', 'esne', 'nese', 'seen', 'snee'], 'esophagogastrostomy': ['esophagogastrostomy', 'gastroesophagostomy'], 'esopus': ['esopus', 'spouse'], 'esoterical': ['cesarolite', 'esoterical'], 'esoterist': ['esoterist', 'trisetose'], 'esotrope': ['esotrope', 'proteose'], 'esotropia': ['aportoise', 'esotropia'], 'espacement': ['escapement', 'espacement'], 'espadon': ['espadon', 'spadone'], 'esparto': ['esparto', 'petrosa', 'seaport'], 'esperantic': ['esperantic', 'interspace'], 'esperantido': ['desperation', 'esperantido'], 'esperantism': ['esperantism', 'strepsinema'], 'esperanto': ['esperanto', 'personate'], 'espial': ['espial', 'lipase', 'pelias'], 'espier': ['espier', 'peiser'], 'espinal': ['espinal', 'pinales', 'spaniel'], 'espino': ['espino', 'sepion'], 'espringal': ['espringal', 'presignal', 'relapsing'], 'esquire': ['esquire', 'risquee'], 'essence': ['essence', 'senesce'], 'essenism': ['essenism', 'messines'], 'essie': ['essie', 'seise'], 'essling': ['essling', 'singles'], 'essoin': ['essoin', 'ossein'], 'essonite': ['essonite', 'ossetine'], 'essorant': ['assentor', 'essorant', 'starnose'], 'estamene': ['easement', 'estamene'], 'esteem': ['esteem', 'mestee'], 'estella': ['estella', 'sellate'], 'ester': ['ester', 'estre', 'reest', 'reset', 'steer', 'stere', 'stree', 'terse', 'tsere'], 'esterlin': ['enlister', 'esterlin', 'listener', 'relisten'], 'esterling': ['esterling', 'steerling'], 'estevin': ['estevin', 'tensive'], 'esth': ['esth', 'hest', 'seth'], 'esther': ['esther', 'hester', 'theres'], 'estivage': ['estivage', 'vegasite'], 'estoc': ['coset', 'estoc', 'scote'], 'estonian': ['estonian', 'nasonite'], 'estop': ['estop', 'stoep', 'stope'], 'estradiol': ['estradiol', 'idolaster'], 'estrange': ['estrange', 'segreant', 'sergeant', 'sternage'], 'estray': ['atresy', 'estray', 'reasty', 'stayer'], 'estre': ['ester', 'estre', 'reest', 'reset', 'steer', 'stere', 'stree', 'terse', 'tsere'], 'estreat': ['estreat', 'restate', 'retaste'], 'estrepe': ['estrepe', 'resteep', 'steeper'], 'estriate': ['estriate', 'treatise'], 'estrin': ['estrin', 'insert', 'sinter', 'sterin', 'triens'], 'estriol': ['estriol', 'torsile'], 'estrogen': ['estrogen', 'gerontes'], 'estrone': ['enstore', 'estrone', 'storeen', 'tornese'], 'estrous': ['estrous', 'oestrus', 'sestuor', 'tussore'], 'estrual': ['arustle', 'estrual', 'saluter', 'saulter'], 'estufa': ['estufa', 'fusate'], 'eta': ['ate', 'eat', 'eta', 'tae', 'tea'], 'etacism': ['cameist', 'etacism', 'sematic'], 'etacist': ['etacist', 'statice'], 'etalon': ['etalon', 'tolane'], 'etamin': ['etamin', 'inmate', 'taimen', 'tamein'], 'etamine': ['amenite', 'etamine', 'matinee'], 'etch': ['chet', 'etch', 'tche', 'tech'], 'etcher': ['cherte', 'etcher'], 'eternal': ['alterne', 'enteral', 'eternal', 'teleran', 'teneral'], 'eternalism': ['eternalism', 'streamline'], 'eternity': ['entirety', 'eternity'], 'etesian': ['etesian', 'senaite'], 'ethal': ['ethal', 'lathe', 'leath'], 'ethan': ['enhat', 'ethan', 'nathe', 'neath', 'thane'], 'ethanal': ['anthela', 'ethanal'], 'ethane': ['ethane', 'taheen'], 'ethanediol': ['endothelia', 'ethanediol', 'ethenoidal'], 'ethanim': ['ethanim', 'hematin'], 'ethanoyl': ['entohyal', 'ethanoyl'], 'ethel': ['ethel', 'lethe'], 'ethenoidal': ['endothelia', 'ethanediol', 'ethenoidal'], 'ether': ['ether', 'rethe', 'theer', 'there', 'three'], 'etheria': ['ehretia', 'etheria'], 'etheric': ['erethic', 'etheric', 'heretic', 'heteric', 'teicher'], 'etherin': ['enherit', 'etherin', 'neither', 'therein'], 'etherion': ['etherion', 'hereinto', 'heronite'], 'etherism': ['erethism', 'etherism', 'heterism'], 'etherization': ['etherization', 'heterization'], 'etherize': ['etherize', 'heterize'], 'ethicism': ['ethicism', 'shemitic'], 'ethicist': ['ethicist', 'thecitis', 'theistic'], 'ethics': ['ethics', 'sethic'], 'ethid': ['edith', 'ethid'], 'ethine': ['ethine', 'theine'], 'ethiop': ['ethiop', 'ophite', 'peitho'], 'ethmoidal': ['ethmoidal', 'oldhamite'], 'ethmosphenoid': ['ethmosphenoid', 'sphenoethmoid'], 'ethmosphenoidal': ['ethmosphenoidal', 'sphenoethmoidal'], 'ethnal': ['ethnal', 'hantle', 'lathen', 'thenal'], 'ethnical': ['chainlet', 'ethnical'], 'ethnological': ['allothogenic', 'ethnological'], 'ethnos': ['ethnos', 'honest'], 'ethography': ['ethography', 'hyetograph'], 'ethologic': ['ethologic', 'theologic'], 'ethological': ['ethological', 'lethologica', 'theological'], 'ethology': ['ethology', 'theology'], 'ethos': ['ethos', 'shote', 'those'], 'ethylic': ['ethylic', 'techily'], 'ethylin': ['ethylin', 'thienyl'], 'etna': ['ante', 'aten', 'etna', 'nate', 'neat', 'taen', 'tane', 'tean'], 'etnean': ['etnean', 'neaten'], 'etonian': ['enation', 'etonian'], 'etruscan': ['etruscan', 'recusant'], 'etta': ['etta', 'tate', 'teat'], 'ettarre': ['ettarre', 'retreat', 'treater'], 'ettle': ['ettle', 'tetel'], 'etua': ['aute', 'etua'], 'euaster': ['austere', 'euaster'], 'eucalypteol': ['eucalypteol', 'eucalyptole'], 'eucalyptole': ['eucalypteol', 'eucalyptole'], 'eucatropine': ['eucatropine', 'neurectopia'], 'eucharis': ['acheirus', 'eucharis'], 'eucharist': ['erithacus', 'eucharist'], 'euchlaena': ['acheulean', 'euchlaena'], 'eulogism': ['eulogism', 'uglisome'], 'eumolpus': ['eumolpus', 'plumeous'], 'eunomia': ['eunomia', 'moineau'], 'eunomy': ['eunomy', 'euonym'], 'euonym': ['eunomy', 'euonym'], 'eupatorin': ['epuration', 'eupatorin'], 'euplastic': ['euplastic', 'spiculate'], 'euploid': ['epuloid', 'euploid'], 'euproctis': ['crepitous', 'euproctis', 'uroseptic'], 'eurindic': ['dineuric', 'eurindic'], 'eurus': ['eurus', 'usure'], 'euscaro': ['acerous', 'carouse', 'euscaro'], 'euskaldun': ['eskualdun', 'euskaldun'], 'euskara': ['eskuara', 'euskara'], 'eusol': ['eusol', 'louse'], 'eutannin': ['eutannin', 'uninnate'], 'eutaxic': ['auxetic', 'eutaxic'], 'eutheria': ['eutheria', 'hauerite'], 'eutropic': ['eutropic', 'outprice'], 'eva': ['ave', 'eva'], 'evade': ['deave', 'eaved', 'evade'], 'evader': ['evader', 'verdea'], 'evadne': ['advene', 'evadne'], 'evan': ['evan', 'nave', 'vane'], 'evanish': ['evanish', 'inshave'], 'evase': ['eaves', 'evase', 'seave'], 'eve': ['eve', 'vee'], 'evea': ['eave', 'evea'], 'evection': ['civetone', 'evection'], 'evejar': ['evejar', 'rajeev'], 'evelyn': ['evelyn', 'evenly'], 'even': ['even', 'neve', 'veen'], 'evener': ['evener', 'veneer'], 'evenly': ['evelyn', 'evenly'], 'evens': ['evens', 'seven'], 'eveque': ['eveque', 'queeve'], 'ever': ['ever', 'reve', 'veer'], 'evert': ['evert', 'revet'], 'everwhich': ['everwhich', 'whichever'], 'everwho': ['everwho', 'however', 'whoever'], 'every': ['every', 'veery'], 'evestar': ['evestar', 'versate'], 'evict': ['civet', 'evict'], 'evil': ['evil', 'levi', 'live', 'veil', 'vile', 'vlei'], 'evildoer': ['evildoer', 'overidle'], 'evilhearted': ['evilhearted', 'vilehearted'], 'evilly': ['evilly', 'lively', 'vilely'], 'evilness': ['evilness', 'liveness', 'veinless', 'vileness', 'vineless'], 'evince': ['cevine', 'evince', 'venice'], 'evisite': ['evisite', 'visitee'], 'evitation': ['evitation', 'novitiate'], 'evocator': ['evocator', 'overcoat'], 'evodia': ['evodia', 'ovidae'], 'evoker': ['evoker', 'revoke'], 'evolver': ['evolver', 'revolve'], 'ewder': ['dewer', 'ewder', 'rewed'], 'ewe': ['ewe', 'wee'], 'ewer': ['ewer', 'were'], 'exacter': ['exacter', 'excreta'], 'exalt': ['exalt', 'latex'], 'exam': ['amex', 'exam', 'xema'], 'examinate': ['examinate', 'exanimate', 'metaxenia'], 'examination': ['examination', 'exanimation'], 'exanimate': ['examinate', 'exanimate', 'metaxenia'], 'exanimation': ['examination', 'exanimation'], 'exasperation': ['exasperation', 'xenoparasite'], 'exaudi': ['adieux', 'exaudi'], 'excarnation': ['centraxonia', 'excarnation'], 'excecation': ['cacoxenite', 'excecation'], 'except': ['except', 'expect'], 'exceptant': ['exceptant', 'expectant'], 'exceptive': ['exceptive', 'expective'], 'excitation': ['excitation', 'intoxicate'], 'excitor': ['excitor', 'xerotic'], 'excreta': ['exacter', 'excreta'], 'excurse': ['excurse', 'excuser'], 'excuser': ['excurse', 'excuser'], 'exert': ['exert', 'exter'], 'exhilarate': ['exhilarate', 'heteraxial'], 'exist': ['exist', 'sixte'], 'exocarp': ['exocarp', 'praecox'], 'exon': ['exon', 'oxen'], 'exordia': ['exordia', 'exradio'], 'exotic': ['coxite', 'exotic'], 'expatiater': ['expatiater', 'expatriate'], 'expatriate': ['expatiater', 'expatriate'], 'expect': ['except', 'expect'], 'expectant': ['exceptant', 'expectant'], 'expective': ['exceptive', 'expective'], 'expirator': ['expirator', 'operatrix'], 'expiree': ['expiree', 'peixere'], 'explicator': ['explicator', 'extropical'], 'expressionism': ['expressionism', 'misexpression'], 'exradio': ['exordia', 'exradio'], 'extend': ['dentex', 'extend'], 'exter': ['exert', 'exter'], 'exterminate': ['antiextreme', 'exterminate'], 'extirpationist': ['extirpationist', 'sextipartition'], 'extra': ['extra', 'retax', 'taxer'], 'extradural': ['dextraural', 'extradural'], 'extropical': ['explicator', 'extropical'], 'exultancy': ['exultancy', 'unexactly'], 'ey': ['ey', 'ye'], 'eyah': ['ahey', 'eyah', 'yeah'], 'eyas': ['easy', 'eyas'], 'eye': ['eye', 'yee'], 'eyed': ['eyed', 'yede'], 'eyen': ['eyen', 'eyne'], 'eyer': ['eyer', 'eyre', 'yere'], 'eyn': ['eyn', 'nye', 'yen'], 'eyne': ['eyen', 'eyne'], 'eyot': ['eyot', 'yote'], 'eyra': ['aery', 'eyra', 'yare', 'year'], 'eyre': ['eyer', 'eyre', 'yere'], 'ezba': ['baze', 'ezba'], 'ezra': ['ezra', 'raze'], 'facebread': ['barefaced', 'facebread'], 'facer': ['facer', 'farce'], 'faciend': ['faciend', 'fancied'], 'facile': ['facile', 'filace'], 'faciobrachial': ['brachiofacial', 'faciobrachial'], 'faciocervical': ['cervicofacial', 'faciocervical'], 'factable': ['factable', 'labefact'], 'factional': ['factional', 'falcation'], 'factish': ['catfish', 'factish'], 'facture': ['facture', 'furcate'], 'facula': ['facula', 'faucal'], 'fade': ['deaf', 'fade'], 'fader': ['fader', 'farde'], 'faery': ['faery', 'freya'], 'fagoter': ['aftergo', 'fagoter'], 'faience': ['faience', 'fiancee'], 'fail': ['alif', 'fail'], 'fain': ['fain', 'naif'], 'fainly': ['fainly', 'naifly'], 'faint': ['faint', 'fanti'], 'fair': ['fair', 'fiar', 'raif'], 'fake': ['fake', 'feak'], 'faker': ['faker', 'freak'], 'fakery': ['fakery', 'freaky'], 'fakir': ['fakir', 'fraik', 'kafir', 'rafik'], 'falcation': ['factional', 'falcation'], 'falco': ['falco', 'focal'], 'falconet': ['conflate', 'falconet'], 'fallback': ['backfall', 'fallback'], 'faller': ['faller', 'refall'], 'fallfish': ['fallfish', 'fishfall'], 'fallible': ['fallible', 'fillable'], 'falling': ['falling', 'fingall'], 'falser': ['falser', 'flaser'], 'faltboat': ['faltboat', 'flatboat'], 'falutin': ['falutin', 'flutina'], 'falx': ['falx', 'flax'], 'fameless': ['fameless', 'selfsame'], 'famelessness': ['famelessness', 'selfsameness'], 'famine': ['famine', 'infame'], 'fancied': ['faciend', 'fancied'], 'fangle': ['fangle', 'flange'], 'fannia': ['fannia', 'fianna'], 'fanti': ['faint', 'fanti'], 'far': ['far', 'fra'], 'farad': ['daraf', 'farad'], 'farce': ['facer', 'farce'], 'farcetta': ['afteract', 'artefact', 'farcetta', 'farctate'], 'farctate': ['afteract', 'artefact', 'farcetta', 'farctate'], 'farde': ['fader', 'farde'], 'fardel': ['alfred', 'fardel'], 'fare': ['fare', 'fear', 'frae', 'rafe'], 'farfel': ['farfel', 'raffle'], 'faring': ['faring', 'frangi'], 'farl': ['farl', 'ralf'], 'farleu': ['earful', 'farleu', 'ferula'], 'farm': ['farm', 'fram'], 'farmable': ['farmable', 'framable'], 'farmer': ['farmer', 'framer'], 'farming': ['farming', 'framing'], 'farnesol': ['farnesol', 'forensal'], 'faro': ['faro', 'fora'], 'farolito': ['farolito', 'footrail'], 'farse': ['farse', 'frase'], 'farset': ['farset', 'faster', 'strafe'], 'farsi': ['farsi', 'sarif'], 'fascio': ['fascio', 'fiasco'], 'fasher': ['afresh', 'fasher', 'ferash'], 'fashioner': ['fashioner', 'refashion'], 'fast': ['fast', 'saft'], 'fasten': ['fasten', 'nefast', 'stefan'], 'fastener': ['fastener', 'fenestra', 'refasten'], 'faster': ['farset', 'faster', 'strafe'], 'fasthold': ['fasthold', 'holdfast'], 'fastland': ['fastland', 'landfast'], 'fat': ['aft', 'fat'], 'fatal': ['aflat', 'fatal'], 'fate': ['atef', 'fate', 'feat'], 'fated': ['defat', 'fated'], 'father': ['father', 'freath', 'hafter'], 'faucal': ['facula', 'faucal'], 'faucet': ['faucet', 'fucate'], 'faulter': ['faulter', 'refutal', 'tearful'], 'faultfind': ['faultfind', 'findfault'], 'faunish': ['faunish', 'nusfiah'], 'faunist': ['faunist', 'fustian', 'infaust'], 'favorer': ['favorer', 'overfar', 'refavor'], 'fayles': ['fayles', 'safely'], 'feague': ['feague', 'feuage'], 'feak': ['fake', 'feak'], 'feal': ['alef', 'feal', 'flea', 'leaf'], 'fealty': ['fealty', 'featly'], 'fear': ['fare', 'fear', 'frae', 'rafe'], 'feastful': ['feastful', 'sufflate'], 'feat': ['atef', 'fate', 'feat'], 'featherbed': ['befathered', 'featherbed'], 'featherer': ['featherer', 'hereafter'], 'featly': ['fealty', 'featly'], 'feckly': ['feckly', 'flecky'], 'fecundate': ['fecundate', 'unfaceted'], 'fecundator': ['fecundator', 'unfactored'], 'federate': ['defeater', 'federate', 'redefeat'], 'feeder': ['feeder', 'refeed'], 'feeding': ['feeding', 'feigned'], 'feel': ['feel', 'flee'], 'feeler': ['feeler', 'refeel', 'reflee'], 'feer': ['feer', 'free', 'reef'], 'feering': ['feering', 'feigner', 'freeing', 'reefing', 'refeign'], 'feetless': ['feetless', 'feteless'], 'fei': ['fei', 'fie', 'ife'], 'feif': ['feif', 'fife'], 'feigned': ['feeding', 'feigned'], 'feigner': ['feering', 'feigner', 'freeing', 'reefing', 'refeign'], 'feil': ['feil', 'file', 'leif', 'lief', 'life'], 'feint': ['feint', 'fient'], 'feis': ['feis', 'fise', 'sife'], 'feist': ['feist', 'stife'], 'felapton': ['felapton', 'pantofle'], 'felid': ['felid', 'field'], 'feline': ['enfile', 'enlief', 'enlife', 'feline'], 'felinity': ['felinity', 'finitely'], 'fels': ['fels', 'self'], 'felt': ['felt', 'flet', 'left'], 'felter': ['felter', 'telfer', 'trefle'], 'felting': ['felting', 'neftgil'], 'feltness': ['feltness', 'leftness'], 'felwort': ['elfwort', 'felwort'], 'feminal': ['feminal', 'inflame'], 'femora': ['femora', 'foamer'], 'femorocaudal': ['caudofemoral', 'femorocaudal'], 'femorotibial': ['femorotibial', 'tibiofemoral'], 'femur': ['femur', 'fumer'], 'fen': ['fen', 'nef'], 'fender': ['fender', 'ferned'], 'fenestra': ['fastener', 'fenestra', 'refasten'], 'feodary': ['feodary', 'foreday'], 'feral': ['feral', 'flare'], 'ferash': ['afresh', 'fasher', 'ferash'], 'feria': ['afire', 'feria'], 'ferine': ['ferine', 'refine'], 'ferison': ['ferison', 'foresin'], 'ferity': ['ferity', 'freity'], 'ferk': ['ferk', 'kerf'], 'ferling': ['ferling', 'flinger', 'refling'], 'ferly': ['ferly', 'flyer', 'refly'], 'fermail': ['fermail', 'fermila'], 'fermenter': ['fermenter', 'referment'], 'fermila': ['fermail', 'fermila'], 'ferned': ['fender', 'ferned'], 'ferri': ['ferri', 'firer', 'freir', 'frier'], 'ferrihydrocyanic': ['ferrihydrocyanic', 'hydroferricyanic'], 'ferrohydrocyanic': ['ferrohydrocyanic', 'hydroferrocyanic'], 'ferry': ['ferry', 'freyr', 'fryer'], 'fertil': ['fertil', 'filter', 'lifter', 'relift', 'trifle'], 'ferula': ['earful', 'farleu', 'ferula'], 'ferule': ['ferule', 'fueler', 'refuel'], 'ferulic': ['ferulic', 'lucifer'], 'fervidity': ['devitrify', 'fervidity'], 'festination': ['festination', 'infestation', 'sinfonietta'], 'fet': ['eft', 'fet'], 'fetal': ['aleft', 'alfet', 'fetal', 'fleta'], 'fetcher': ['fetcher', 'refetch'], 'feteless': ['feetless', 'feteless'], 'fetial': ['fetial', 'filate', 'lafite', 'leafit'], 'fetish': ['fetish', 'fishet'], 'fetor': ['fetor', 'forte', 'ofter'], 'fetter': ['fetter', 'frette'], 'feuage': ['feague', 'feuage'], 'feudalism': ['feudalism', 'sulfamide'], 'feudally': ['delayful', 'feudally'], 'feulamort': ['feulamort', 'formulate'], 'fi': ['fi', 'if'], 'fiance': ['fiance', 'inface'], 'fiancee': ['faience', 'fiancee'], 'fianna': ['fannia', 'fianna'], 'fiar': ['fair', 'fiar', 'raif'], 'fiard': ['fiard', 'fraid'], 'fiasco': ['fascio', 'fiasco'], 'fiber': ['bifer', 'brief', 'fiber'], 'fibered': ['debrief', 'defiber', 'fibered'], 'fiberless': ['briefless', 'fiberless', 'fibreless'], 'fiberware': ['fiberware', 'fibreware'], 'fibreless': ['briefless', 'fiberless', 'fibreless'], 'fibreware': ['fiberware', 'fibreware'], 'fibroadenoma': ['adenofibroma', 'fibroadenoma'], 'fibroangioma': ['angiofibroma', 'fibroangioma'], 'fibrochondroma': ['chondrofibroma', 'fibrochondroma'], 'fibrocystoma': ['cystofibroma', 'fibrocystoma'], 'fibrolipoma': ['fibrolipoma', 'lipofibroma'], 'fibromucous': ['fibromucous', 'mucofibrous'], 'fibromyoma': ['fibromyoma', 'myofibroma'], 'fibromyxoma': ['fibromyxoma', 'myxofibroma'], 'fibromyxosarcoma': ['fibromyxosarcoma', 'myxofibrosarcoma'], 'fibroneuroma': ['fibroneuroma', 'neurofibroma'], 'fibroserous': ['fibroserous', 'serofibrous'], 'fiche': ['chief', 'fiche'], 'fickleness': ['fickleness', 'fleckiness'], 'fickly': ['fickly', 'flicky'], 'fico': ['coif', 'fico', 'foci'], 'fictional': ['cliftonia', 'fictional'], 'ficula': ['ficula', 'fulica'], 'fiddler': ['fiddler', 'flidder'], 'fidele': ['defile', 'fidele'], 'fidget': ['fidget', 'gifted'], 'fidicula': ['fidicula', 'fiducial'], 'fiducial': ['fidicula', 'fiducial'], 'fie': ['fei', 'fie', 'ife'], 'fiedlerite': ['fiedlerite', 'friedelite'], 'field': ['felid', 'field'], 'fielded': ['defiled', 'fielded'], 'fielder': ['defiler', 'fielder'], 'fieldman': ['fieldman', 'inflamed'], 'fiendish': ['fiendish', 'finished'], 'fient': ['feint', 'fient'], 'fiery': ['fiery', 'reify'], 'fife': ['feif', 'fife'], 'fifteener': ['fifteener', 'teneriffe'], 'fifty': ['fifty', 'tiffy'], 'fig': ['fig', 'gif'], 'fighter': ['fighter', 'freight', 'refight'], 'figurate': ['figurate', 'fruitage'], 'fike': ['efik', 'fike'], 'filace': ['facile', 'filace'], 'filago': ['filago', 'gifola'], 'filao': ['filao', 'folia'], 'filar': ['filar', 'flair', 'frail'], 'filate': ['fetial', 'filate', 'lafite', 'leafit'], 'file': ['feil', 'file', 'leif', 'lief', 'life'], 'filelike': ['filelike', 'lifelike'], 'filer': ['filer', 'flier', 'lifer', 'rifle'], 'filet': ['filet', 'flite'], 'fillable': ['fallible', 'fillable'], 'filler': ['filler', 'refill'], 'filo': ['filo', 'foil', 'lifo'], 'filter': ['fertil', 'filter', 'lifter', 'relift', 'trifle'], 'filterer': ['filterer', 'refilter'], 'filthless': ['filthless', 'shelflist'], 'filtrable': ['filtrable', 'flirtable'], 'filtration': ['filtration', 'flirtation'], 'finale': ['afenil', 'finale'], 'finder': ['finder', 'friend', 'redfin', 'refind'], 'findfault': ['faultfind', 'findfault'], 'fine': ['enif', 'fine', 'neif', 'nife'], 'finely': ['finely', 'lenify'], 'finer': ['finer', 'infer'], 'finesser': ['finesser', 'rifeness'], 'fingall': ['falling', 'fingall'], 'finger': ['finger', 'fringe'], 'fingerer': ['fingerer', 'refinger'], 'fingerflower': ['fingerflower', 'fringeflower'], 'fingerless': ['fingerless', 'fringeless'], 'fingerlet': ['fingerlet', 'fringelet'], 'fingu': ['fingu', 'fungi'], 'finical': ['finical', 'lanific'], 'finished': ['fiendish', 'finished'], 'finisher': ['finisher', 'refinish'], 'finitely': ['felinity', 'finitely'], 'finkel': ['elfkin', 'finkel'], 'finlet': ['finlet', 'infelt'], 'finner': ['finner', 'infern'], 'firca': ['afric', 'firca'], 'fire': ['fire', 'reif', 'rife'], 'fireable': ['afebrile', 'balefire', 'fireable'], 'firearm': ['firearm', 'marfire'], 'fireback': ['backfire', 'fireback'], 'fireburn': ['burnfire', 'fireburn'], 'fired': ['fired', 'fried'], 'fireplug': ['fireplug', 'gripeful'], 'firer': ['ferri', 'firer', 'freir', 'frier'], 'fireshaft': ['fireshaft', 'tasheriff'], 'firestone': ['firestone', 'forestine'], 'firetop': ['firetop', 'potifer'], 'firm': ['firm', 'frim'], 'first': ['first', 'frist'], 'firth': ['firth', 'frith'], 'fise': ['feis', 'fise', 'sife'], 'fishbone': ['bonefish', 'fishbone'], 'fisheater': ['fisheater', 'sherifate'], 'fisher': ['fisher', 'sherif'], 'fishery': ['fishery', 'sherify'], 'fishet': ['fetish', 'fishet'], 'fishfall': ['fallfish', 'fishfall'], 'fishlet': ['fishlet', 'leftish'], 'fishpond': ['fishpond', 'pondfish'], 'fishpool': ['fishpool', 'foolship'], 'fishwood': ['fishwood', 'woodfish'], 'fissury': ['fissury', 'russify'], 'fist': ['fist', 'sift'], 'fisted': ['fisted', 'sifted'], 'fister': ['fister', 'resift', 'sifter', 'strife'], 'fisting': ['fisting', 'sifting'], 'fitout': ['fitout', 'outfit'], 'fitter': ['fitter', 'tifter'], 'fixer': ['fixer', 'refix'], 'flageolet': ['flageolet', 'folletage'], 'flair': ['filar', 'flair', 'frail'], 'flamant': ['flamant', 'flatman'], 'flame': ['flame', 'fleam'], 'flamed': ['flamed', 'malfed'], 'flandowser': ['flandowser', 'sandflower'], 'flange': ['fangle', 'flange'], 'flare': ['feral', 'flare'], 'flaser': ['falser', 'flaser'], 'flasher': ['flasher', 'reflash'], 'flatboat': ['faltboat', 'flatboat'], 'flatman': ['flamant', 'flatman'], 'flatwise': ['flatwise', 'saltwife'], 'flaunt': ['flaunt', 'unflat'], 'flax': ['falx', 'flax'], 'flea': ['alef', 'feal', 'flea', 'leaf'], 'fleam': ['flame', 'fleam'], 'fleay': ['fleay', 'leafy'], 'fleche': ['fleche', 'fleech'], 'flecker': ['flecker', 'freckle'], 'fleckiness': ['fickleness', 'fleckiness'], 'flecky': ['feckly', 'flecky'], 'fled': ['delf', 'fled'], 'flee': ['feel', 'flee'], 'fleech': ['fleche', 'fleech'], 'fleer': ['fleer', 'refel'], 'flemish': ['flemish', 'himself'], 'flenser': ['flenser', 'fresnel'], 'flesh': ['flesh', 'shelf'], 'fleshed': ['deflesh', 'fleshed'], 'fleshen': ['enflesh', 'fleshen'], 'flesher': ['flesher', 'herself'], 'fleshful': ['fleshful', 'shelfful'], 'fleshiness': ['elfishness', 'fleshiness'], 'fleshy': ['fleshy', 'shelfy'], 'flet': ['felt', 'flet', 'left'], 'fleta': ['aleft', 'alfet', 'fetal', 'fleta'], 'fleuret': ['fleuret', 'treeful'], 'flew': ['flew', 'welf'], 'flexed': ['deflex', 'flexed'], 'flexured': ['flexured', 'refluxed'], 'flicky': ['fickly', 'flicky'], 'flidder': ['fiddler', 'flidder'], 'flier': ['filer', 'flier', 'lifer', 'rifle'], 'fligger': ['fligger', 'friggle'], 'flinger': ['ferling', 'flinger', 'refling'], 'flingy': ['flingy', 'flying'], 'flirtable': ['filtrable', 'flirtable'], 'flirtation': ['filtration', 'flirtation'], 'flirter': ['flirter', 'trifler'], 'flirting': ['flirting', 'trifling'], 'flirtingly': ['flirtingly', 'triflingly'], 'flit': ['flit', 'lift'], 'flite': ['filet', 'flite'], 'fliting': ['fliting', 'lifting'], 'flitter': ['flitter', 'triflet'], 'flo': ['flo', 'lof'], 'float': ['aloft', 'float', 'flota'], 'floater': ['floater', 'florate', 'refloat'], 'flobby': ['bobfly', 'flobby'], 'flodge': ['flodge', 'fodgel'], 'floe': ['floe', 'fole'], 'flog': ['flog', 'golf'], 'flogger': ['flogger', 'frogleg'], 'floodable': ['bloodleaf', 'floodable'], 'flooder': ['flooder', 'reflood'], 'floodwater': ['floodwater', 'toadflower', 'waterflood'], 'floorer': ['floorer', 'refloor'], 'florate': ['floater', 'florate', 'refloat'], 'florentine': ['florentine', 'nonfertile'], 'floret': ['floret', 'forlet', 'lofter', 'torfel'], 'floria': ['floria', 'foliar'], 'floriate': ['floriate', 'foralite'], 'florican': ['florican', 'fornical'], 'floridan': ['floridan', 'florinda'], 'florinda': ['floridan', 'florinda'], 'flot': ['flot', 'loft'], 'flota': ['aloft', 'float', 'flota'], 'flounder': ['flounder', 'reunfold', 'unfolder'], 'flour': ['flour', 'fluor'], 'flourisher': ['flourisher', 'reflourish'], 'flouting': ['flouting', 'outfling'], 'flow': ['flow', 'fowl', 'wolf'], 'flower': ['flower', 'fowler', 'reflow', 'wolfer'], 'flowered': ['deflower', 'flowered'], 'flowerer': ['flowerer', 'reflower'], 'flowery': ['flowery', 'fowlery'], 'flowing': ['flowing', 'fowling'], 'floyd': ['floyd', 'foldy'], 'fluavil': ['fluavil', 'fluvial', 'vialful'], 'flucan': ['canful', 'flucan'], 'fluctuant': ['fluctuant', 'untactful'], 'flue': ['flue', 'fuel'], 'fluent': ['fluent', 'netful', 'unfelt', 'unleft'], 'fluidly': ['dullify', 'fluidly'], 'flukewort': ['flukewort', 'flutework'], 'fluor': ['flour', 'fluor'], 'fluorate': ['fluorate', 'outflare'], 'fluorinate': ['antifouler', 'fluorinate', 'uniflorate'], 'fluorine': ['fluorine', 'neurofil'], 'fluorobenzene': ['benzofluorene', 'fluorobenzene'], 'flusher': ['flusher', 'reflush'], 'flushing': ['flushing', 'lungfish'], 'fluster': ['fluster', 'restful'], 'flustra': ['flustra', 'starful'], 'flutework': ['flukewort', 'flutework'], 'flutina': ['falutin', 'flutina'], 'fluvial': ['fluavil', 'fluvial', 'vialful'], 'fluxer': ['fluxer', 'reflux'], 'flyblow': ['blowfly', 'flyblow'], 'flyer': ['ferly', 'flyer', 'refly'], 'flying': ['flingy', 'flying'], 'fo': ['fo', 'of'], 'foal': ['foal', 'loaf', 'olaf'], 'foamer': ['femora', 'foamer'], 'focal': ['falco', 'focal'], 'foci': ['coif', 'fico', 'foci'], 'focuser': ['focuser', 'refocus'], 'fodge': ['defog', 'fodge'], 'fodgel': ['flodge', 'fodgel'], 'fogeater': ['fogeater', 'foregate'], 'fogo': ['fogo', 'goof'], 'foil': ['filo', 'foil', 'lifo'], 'foister': ['foister', 'forties'], 'folden': ['enfold', 'folden', 'fondle'], 'folder': ['folder', 'refold'], 'foldy': ['floyd', 'foldy'], 'fole': ['floe', 'fole'], 'folia': ['filao', 'folia'], 'foliar': ['floria', 'foliar'], 'foliature': ['foliature', 'toluifera'], 'folletage': ['flageolet', 'folletage'], 'fomenter': ['fomenter', 'refoment'], 'fondle': ['enfold', 'folden', 'fondle'], 'fondu': ['fondu', 'found'], 'foo': ['foo', 'ofo'], 'fool': ['fool', 'loof', 'olof'], 'foolship': ['fishpool', 'foolship'], 'footer': ['footer', 'refoot'], 'foothot': ['foothot', 'hotfoot'], 'footler': ['footler', 'rooflet'], 'footpad': ['footpad', 'padfoot'], 'footrail': ['farolito', 'footrail'], 'foots': ['foots', 'sfoot', 'stoof'], 'footsore': ['footsore', 'sorefoot'], 'foppish': ['foppish', 'fopship'], 'fopship': ['foppish', 'fopship'], 'for': ['for', 'fro', 'orf'], 'fora': ['faro', 'fora'], 'foralite': ['floriate', 'foralite'], 'foramen': ['foramen', 'foreman'], 'forcemeat': ['aftercome', 'forcemeat'], 'forcement': ['coferment', 'forcement'], 'fore': ['fore', 'froe', 'ofer'], 'forecast': ['cofaster', 'forecast'], 'forecaster': ['forecaster', 'reforecast'], 'forecover': ['forecover', 'overforce'], 'foreday': ['feodary', 'foreday'], 'forefit': ['forefit', 'forfeit'], 'foregate': ['fogeater', 'foregate'], 'foregirth': ['foregirth', 'foreright'], 'forego': ['forego', 'goofer'], 'forel': ['forel', 'rolfe'], 'forelive': ['forelive', 'overfile'], 'foreman': ['foramen', 'foreman'], 'foremean': ['foremean', 'forename'], 'forename': ['foremean', 'forename'], 'forensal': ['farnesol', 'forensal'], 'forensic': ['forensic', 'forinsec'], 'forepart': ['forepart', 'prefator'], 'foreright': ['foregirth', 'foreright'], 'foresend': ['defensor', 'foresend'], 'foresign': ['foresign', 'foresing'], 'foresin': ['ferison', 'foresin'], 'foresing': ['foresign', 'foresing'], 'forest': ['forest', 'forset', 'foster'], 'forestage': ['forestage', 'fosterage'], 'forestal': ['astrofel', 'forestal'], 'forestate': ['forestate', 'foretaste'], 'forested': ['deforest', 'forested'], 'forestem': ['forestem', 'fretsome'], 'forester': ['forester', 'fosterer', 'reforest'], 'forestine': ['firestone', 'forestine'], 'foretaste': ['forestate', 'foretaste'], 'foreutter': ['foreutter', 'outferret'], 'forfeit': ['forefit', 'forfeit'], 'forfeiter': ['forfeiter', 'reforfeit'], 'forgeman': ['forgeman', 'formagen'], 'forinsec': ['forensic', 'forinsec'], 'forint': ['forint', 'fortin'], 'forlet': ['floret', 'forlet', 'lofter', 'torfel'], 'form': ['form', 'from'], 'formagen': ['forgeman', 'formagen'], 'formalin': ['formalin', 'informal', 'laniform'], 'formally': ['formally', 'formylal'], 'formed': ['deform', 'formed'], 'former': ['former', 'reform'], 'formica': ['aciform', 'formica'], 'formicina': ['aciniform', 'formicina'], 'formicoidea': ['aecidioform', 'formicoidea'], 'formin': ['formin', 'inform'], 'forminate': ['forminate', 'fremontia', 'taeniform'], 'formulae': ['formulae', 'fumarole'], 'formulaic': ['cauliform', 'formulaic', 'fumarolic'], 'formulate': ['feulamort', 'formulate'], 'formulator': ['formulator', 'torulaform'], 'formylal': ['formally', 'formylal'], 'fornical': ['florican', 'fornical'], 'fornicated': ['deforciant', 'fornicated'], 'forpit': ['forpit', 'profit'], 'forritsome': ['forritsome', 'ostreiform'], 'forrue': ['forrue', 'fourer', 'fourre', 'furore'], 'forset': ['forest', 'forset', 'foster'], 'forst': ['forst', 'frost'], 'fort': ['fort', 'frot'], 'forte': ['fetor', 'forte', 'ofter'], 'forth': ['forth', 'froth'], 'forthcome': ['forthcome', 'homecroft'], 'forthy': ['forthy', 'frothy'], 'forties': ['foister', 'forties'], 'fortin': ['forint', 'fortin'], 'forward': ['forward', 'froward'], 'forwarder': ['forwarder', 'reforward'], 'forwardly': ['forwardly', 'frowardly'], 'forwardness': ['forwardness', 'frowardness'], 'foster': ['forest', 'forset', 'foster'], 'fosterage': ['forestage', 'fosterage'], 'fosterer': ['forester', 'fosterer', 'reforest'], 'fot': ['fot', 'oft'], 'fou': ['fou', 'ouf'], 'fouler': ['fouler', 'furole'], 'found': ['fondu', 'found'], 'foundationer': ['foundationer', 'refoundation'], 'founder': ['founder', 'refound'], 'foundling': ['foundling', 'unfolding'], 'fourble': ['beflour', 'fourble'], 'fourer': ['forrue', 'fourer', 'fourre', 'furore'], 'fourre': ['forrue', 'fourer', 'fourre', 'furore'], 'fowl': ['flow', 'fowl', 'wolf'], 'fowler': ['flower', 'fowler', 'reflow', 'wolfer'], 'fowlery': ['flowery', 'fowlery'], 'fowling': ['flowing', 'fowling'], 'fra': ['far', 'fra'], 'frache': ['chafer', 'frache'], 'frae': ['fare', 'fear', 'frae', 'rafe'], 'fraghan': ['fraghan', 'harfang'], 'fraid': ['fiard', 'fraid'], 'fraik': ['fakir', 'fraik', 'kafir', 'rafik'], 'frail': ['filar', 'flair', 'frail'], 'fraiser': ['fraiser', 'frasier'], 'fram': ['farm', 'fram'], 'framable': ['farmable', 'framable'], 'frame': ['frame', 'fream'], 'framer': ['farmer', 'framer'], 'framing': ['farming', 'framing'], 'frangi': ['faring', 'frangi'], 'frantic': ['frantic', 'infarct', 'infract'], 'frase': ['farse', 'frase'], 'frasier': ['fraiser', 'frasier'], 'frat': ['frat', 'raft'], 'fratcheous': ['fratcheous', 'housecraft'], 'frater': ['frater', 'rafter'], 'frayed': ['defray', 'frayed'], 'freak': ['faker', 'freak'], 'freaky': ['fakery', 'freaky'], 'fream': ['frame', 'fream'], 'freath': ['father', 'freath', 'hafter'], 'freckle': ['flecker', 'freckle'], 'free': ['feer', 'free', 'reef'], 'freed': ['defer', 'freed'], 'freeing': ['feering', 'feigner', 'freeing', 'reefing', 'refeign'], 'freeman': ['enframe', 'freeman'], 'freer': ['freer', 'refer'], 'fregata': ['fregata', 'raftage'], 'fregatae': ['afterage', 'fregatae'], 'freight': ['fighter', 'freight', 'refight'], 'freir': ['ferri', 'firer', 'freir', 'frier'], 'freit': ['freit', 'refit'], 'freity': ['ferity', 'freity'], 'fremontia': ['forminate', 'fremontia', 'taeniform'], 'frenetic': ['frenetic', 'infecter', 'reinfect'], 'freshener': ['freshener', 'refreshen'], 'fresnel': ['flenser', 'fresnel'], 'fret': ['fret', 'reft', 'tref'], 'fretful': ['fretful', 'truffle'], 'fretsome': ['forestem', 'fretsome'], 'frette': ['fetter', 'frette'], 'freya': ['faery', 'freya'], 'freyr': ['ferry', 'freyr', 'fryer'], 'fried': ['fired', 'fried'], 'friedelite': ['fiedlerite', 'friedelite'], 'friend': ['finder', 'friend', 'redfin', 'refind'], 'frier': ['ferri', 'firer', 'freir', 'frier'], 'friesic': ['friesic', 'serific'], 'friggle': ['fligger', 'friggle'], 'frightener': ['frightener', 'refrighten'], 'frigolabile': ['frigolabile', 'glorifiable'], 'frike': ['frike', 'kefir'], 'frim': ['firm', 'frim'], 'fringe': ['finger', 'fringe'], 'fringeflower': ['fingerflower', 'fringeflower'], 'fringeless': ['fingerless', 'fringeless'], 'fringelet': ['fingerlet', 'fringelet'], 'frist': ['first', 'frist'], 'frit': ['frit', 'rift'], 'frith': ['firth', 'frith'], 'friulian': ['friulian', 'unifilar'], 'fro': ['for', 'fro', 'orf'], 'froe': ['fore', 'froe', 'ofer'], 'frogleg': ['flogger', 'frogleg'], 'from': ['form', 'from'], 'fronter': ['fronter', 'refront'], 'frontonasal': ['frontonasal', 'nasofrontal'], 'frontooccipital': ['frontooccipital', 'occipitofrontal'], 'frontoorbital': ['frontoorbital', 'orbitofrontal'], 'frontoparietal': ['frontoparietal', 'parietofrontal'], 'frontotemporal': ['frontotemporal', 'temporofrontal'], 'frontpiece': ['frontpiece', 'perfection'], 'frost': ['forst', 'frost'], 'frosted': ['defrost', 'frosted'], 'frot': ['fort', 'frot'], 'froth': ['forth', 'froth'], 'frothy': ['forthy', 'frothy'], 'froward': ['forward', 'froward'], 'frowardly': ['forwardly', 'frowardly'], 'frowardness': ['forwardness', 'frowardness'], 'fruitage': ['figurate', 'fruitage'], 'fruitless': ['fruitless', 'resistful'], 'frush': ['frush', 'shurf'], 'frustule': ['frustule', 'sulfuret'], 'fruticulose': ['fruticulose', 'luctiferous'], 'fryer': ['ferry', 'freyr', 'fryer'], 'fucales': ['caseful', 'fucales'], 'fucate': ['faucet', 'fucate'], 'fuel': ['flue', 'fuel'], 'fueler': ['ferule', 'fueler', 'refuel'], 'fuerte': ['fuerte', 'refute'], 'fuirena': ['fuirena', 'unafire'], 'fulcrate': ['crateful', 'fulcrate'], 'fulica': ['ficula', 'fulica'], 'fulmar': ['armful', 'fulmar'], 'fulminatory': ['fulminatory', 'unformality'], 'fulminous': ['fulminous', 'sulfonium'], 'fulwa': ['awful', 'fulwa'], 'fumarole': ['formulae', 'fumarole'], 'fumarolic': ['cauliform', 'formulaic', 'fumarolic'], 'fumble': ['beflum', 'fumble'], 'fumer': ['femur', 'fumer'], 'fundable': ['fundable', 'unfabled'], 'funder': ['funder', 'refund'], 'funebrial': ['funebrial', 'unfriable'], 'funeral': ['earnful', 'funeral'], 'fungal': ['fungal', 'unflag'], 'fungi': ['fingu', 'fungi'], 'funori': ['funori', 'furoin'], 'fur': ['fur', 'urf'], 'fural': ['alfur', 'fural'], 'furan': ['furan', 'unfar'], 'furbish': ['burfish', 'furbish'], 'furbisher': ['furbisher', 'refurbish'], 'furcal': ['carful', 'furcal'], 'furcate': ['facture', 'furcate'], 'furler': ['furler', 'refurl'], 'furnish': ['furnish', 'runfish'], 'furnisher': ['furnisher', 'refurnish'], 'furoin': ['funori', 'furoin'], 'furole': ['fouler', 'furole'], 'furore': ['forrue', 'fourer', 'fourre', 'furore'], 'furstone': ['furstone', 'unforest'], 'fusate': ['estufa', 'fusate'], 'fusteric': ['fusteric', 'scutifer'], 'fustian': ['faunist', 'fustian', 'infaust'], 'gab': ['bag', 'gab'], 'gabbler': ['gabbler', 'grabble'], 'gabe': ['egba', 'gabe'], 'gabelle': ['gabelle', 'gelable'], 'gabelled': ['gabelled', 'geldable'], 'gabi': ['agib', 'biga', 'gabi'], 'gabion': ['bagnio', 'gabion', 'gobian'], 'gabioned': ['badigeon', 'gabioned'], 'gable': ['bagel', 'belga', 'gable', 'gleba'], 'gablock': ['backlog', 'gablock'], 'gaboon': ['abongo', 'gaboon'], 'gad': ['dag', 'gad'], 'gadaba': ['badaga', 'dagaba', 'gadaba'], 'gadder': ['gadder', 'graded'], 'gaddi': ['gaddi', 'gadid'], 'gade': ['aged', 'egad', 'gade'], 'gadger': ['dagger', 'gadger', 'ragged'], 'gadget': ['gadget', 'tagged'], 'gadid': ['gaddi', 'gadid'], 'gadinine': ['gadinine', 'indigena'], 'gadolinite': ['deligation', 'gadolinite', 'gelatinoid'], 'gadroon': ['dragoon', 'gadroon'], 'gadroonage': ['dragoonage', 'gadroonage'], 'gaduin': ['anguid', 'gaduin'], 'gael': ['gael', 'gale', 'geal'], 'gaen': ['agen', 'gaen', 'gane', 'gean', 'gena'], 'gaet': ['gaet', 'gate', 'geat', 'geta'], 'gaetulan': ['angulate', 'gaetulan'], 'gager': ['agger', 'gager', 'regga'], 'gahnite': ['gahnite', 'heating'], 'gahrwali': ['gahrwali', 'garhwali'], 'gaiassa': ['assagai', 'gaiassa'], 'gail': ['gail', 'gali', 'gila', 'glia'], 'gain': ['gain', 'inga', 'naig', 'ngai'], 'gaincall': ['gaincall', 'gallican'], 'gaine': ['angie', 'gaine'], 'gainer': ['arenig', 'earing', 'gainer', 'reagin', 'regain'], 'gainless': ['gainless', 'glassine'], 'gainly': ['gainly', 'laying'], 'gainsayer': ['asynergia', 'gainsayer'], 'gainset': ['easting', 'gainset', 'genista', 'ingesta', 'seating', 'signate', 'teasing'], 'gainstrive': ['gainstrive', 'vinegarist'], 'gainturn': ['gainturn', 'naturing'], 'gaiter': ['gaiter', 'tairge', 'triage'], 'gaize': ['gaize', 'ziega'], 'gaj': ['gaj', 'jag'], 'gal': ['gal', 'lag'], 'gala': ['agal', 'agla', 'alga', 'gala'], 'galactonic': ['cognatical', 'galactonic'], 'galatae': ['galatae', 'galatea'], 'galatea': ['galatae', 'galatea'], 'gale': ['gael', 'gale', 'geal'], 'galea': ['algae', 'galea'], 'galee': ['aegle', 'eagle', 'galee'], 'galei': ['agiel', 'agile', 'galei'], 'galeid': ['algedi', 'galeid'], 'galen': ['agnel', 'angel', 'angle', 'galen', 'genal', 'glean', 'lagen'], 'galena': ['alnage', 'angela', 'galena', 'lagena'], 'galenian': ['alangine', 'angelina', 'galenian'], 'galenic': ['angelic', 'galenic'], 'galenical': ['angelical', 'englacial', 'galenical'], 'galenist': ['galenist', 'genitals', 'stealing'], 'galenite': ['galenite', 'legatine'], 'galeoid': ['galeoid', 'geoidal'], 'galera': ['aglare', 'alegar', 'galera', 'laager'], 'galet': ['aglet', 'galet'], 'galewort': ['galewort', 'waterlog'], 'galey': ['agley', 'galey'], 'galga': ['galga', 'glaga'], 'gali': ['gail', 'gali', 'gila', 'glia'], 'galidia': ['agialid', 'galidia'], 'galik': ['galik', 'glaik'], 'galilean': ['galilean', 'gallinae'], 'galiot': ['galiot', 'latigo'], 'galla': ['algal', 'galla'], 'gallate': ['gallate', 'tallage'], 'gallein': ['gallein', 'galline', 'nigella'], 'galleria': ['allergia', 'galleria'], 'gallery': ['allergy', 'gallery', 'largely', 'regally'], 'galli': ['galli', 'glial'], 'gallican': ['gaincall', 'gallican'], 'gallicole': ['collegial', 'gallicole'], 'gallinae': ['galilean', 'gallinae'], 'galline': ['gallein', 'galline', 'nigella'], 'gallnut': ['gallnut', 'nutgall'], 'galloper': ['galloper', 'regallop'], 'gallotannate': ['gallotannate', 'tannogallate'], 'gallotannic': ['gallotannic', 'tannogallic'], 'gallstone': ['gallstone', 'stonegall'], 'gallybagger': ['gallybagger', 'gallybeggar'], 'gallybeggar': ['gallybagger', 'gallybeggar'], 'galore': ['galore', 'gaoler'], 'galtonia': ['galtonia', 'notalgia'], 'galvanopsychic': ['galvanopsychic', 'psychogalvanic'], 'galvanothermometer': ['galvanothermometer', 'thermogalvanometer'], 'gam': ['gam', 'mag'], 'gamaliel': ['gamaliel', 'melalgia'], 'gamashes': ['gamashes', 'smashage'], 'gamasid': ['gamasid', 'magadis'], 'gambado': ['dagomba', 'gambado'], 'gambier': ['gambier', 'imbarge'], 'gambler': ['gambler', 'gambrel'], 'gambrel': ['gambler', 'gambrel'], 'game': ['egma', 'game', 'mage'], 'gamely': ['gamely', 'gleamy', 'mygale'], 'gamene': ['gamene', 'manege', 'menage'], 'gamete': ['gamete', 'metage'], 'gametogenic': ['gametogenic', 'gamogenetic', 'geomagnetic'], 'gamic': ['gamic', 'magic'], 'gamin': ['gamin', 'mangi'], 'gaming': ['gaming', 'gigman'], 'gamma': ['gamma', 'magma'], 'gammer': ['gammer', 'gramme'], 'gamogenetic': ['gametogenic', 'gamogenetic', 'geomagnetic'], 'gamori': ['gamori', 'gomari', 'gromia'], 'gan': ['gan', 'nag'], 'ganam': ['amang', 'ganam', 'manga'], 'ganch': ['chang', 'ganch'], 'gander': ['danger', 'gander', 'garden', 'ranged'], 'gandul': ['gandul', 'unglad'], 'gane': ['agen', 'gaen', 'gane', 'gean', 'gena'], 'gangan': ['gangan', 'nagnag'], 'ganger': ['ganger', 'grange', 'nagger'], 'ganging': ['ganging', 'nagging'], 'gangism': ['gangism', 'gigsman'], 'ganglioneuron': ['ganglioneuron', 'neuroganglion'], 'gangly': ['gangly', 'naggly'], 'ganguela': ['ganguela', 'language'], 'gangway': ['gangway', 'waygang'], 'ganister': ['astringe', 'ganister', 'gantries'], 'ganoidal': ['diagonal', 'ganoidal', 'gonadial'], 'ganoidean': ['ganoidean', 'indogaean'], 'ganoidian': ['agoniadin', 'anangioid', 'ganoidian'], 'ganosis': ['agnosis', 'ganosis'], 'gansel': ['angles', 'gansel'], 'gant': ['gant', 'gnat', 'tang'], 'ganta': ['ganta', 'tanga'], 'ganton': ['ganton', 'tongan'], 'gantries': ['astringe', 'ganister', 'gantries'], 'gantry': ['gantry', 'gyrant'], 'ganymede': ['ganymede', 'megadyne'], 'ganzie': ['agnize', 'ganzie'], 'gaol': ['gaol', 'goal', 'gola', 'olga'], 'gaoler': ['galore', 'gaoler'], 'gaon': ['agon', 'ango', 'gaon', 'goan', 'gona'], 'gaonic': ['agonic', 'angico', 'gaonic', 'goniac'], 'gapa': ['gapa', 'paga'], 'gape': ['gape', 'page', 'peag', 'pega'], 'gaper': ['gaper', 'grape', 'pager', 'parge'], 'gar': ['gar', 'gra', 'rag'], 'gara': ['agar', 'agra', 'gara', 'raga'], 'garamond': ['dragoman', 'garamond', 'ondagram'], 'garance': ['carnage', 'cranage', 'garance'], 'garb': ['brag', 'garb', 'grab'], 'garbel': ['garbel', 'garble'], 'garble': ['garbel', 'garble'], 'garbless': ['bragless', 'garbless'], 'garce': ['cager', 'garce', 'grace'], 'garcinia': ['agaricin', 'garcinia'], 'gardeen': ['derange', 'enraged', 'gardeen', 'gerenda', 'grandee', 'grenade'], 'garden': ['danger', 'gander', 'garden', 'ranged'], 'gardened': ['deranged', 'gardened'], 'gardener': ['deranger', 'gardener'], 'gardenful': ['dangerful', 'gardenful'], 'gardenia': ['drainage', 'gardenia'], 'gardenin': ['gardenin', 'grenadin'], 'gardenless': ['dangerless', 'gardenless'], 'gare': ['ager', 'agre', 'gare', 'gear', 'rage'], 'gareh': ['gareh', 'gerah'], 'garetta': ['garetta', 'rattage', 'regatta'], 'garewaite': ['garewaite', 'waiterage'], 'garfish': ['garfish', 'ragfish'], 'garget': ['garget', 'tagger'], 'gargety': ['gargety', 'raggety'], 'gargle': ['gargle', 'gregal', 'lagger', 'raggle'], 'garhwali': ['gahrwali', 'garhwali'], 'garial': ['argali', 'garial'], 'garle': ['argel', 'ergal', 'garle', 'glare', 'lager', 'large', 'regal'], 'garment': ['garment', 'margent'], 'garmenture': ['garmenture', 'reargument'], 'garn': ['garn', 'gnar', 'rang'], 'garnel': ['angler', 'arleng', 'garnel', 'largen', 'rangle', 'regnal'], 'garner': ['garner', 'ranger'], 'garnet': ['argent', 'garnet', 'garten', 'tanger'], 'garneter': ['argenter', 'garneter'], 'garnetiferous': ['argentiferous', 'garnetiferous'], 'garnets': ['angster', 'garnets', 'nagster', 'strange'], 'garnett': ['garnett', 'gnatter', 'gratten', 'tergant'], 'garnice': ['anergic', 'garnice', 'garniec', 'geranic', 'grecian'], 'garniec': ['anergic', 'garnice', 'garniec', 'geranic', 'grecian'], 'garnish': ['garnish', 'rashing'], 'garnished': ['degarnish', 'garnished'], 'garnisher': ['garnisher', 'regarnish'], 'garo': ['argo', 'garo', 'gora'], 'garran': ['garran', 'ragnar'], 'garret': ['garret', 'garter', 'grater', 'targer'], 'garreted': ['garreted', 'gartered'], 'garroter': ['garroter', 'regrator'], 'garten': ['argent', 'garnet', 'garten', 'tanger'], 'garter': ['garret', 'garter', 'grater', 'targer'], 'gartered': ['garreted', 'gartered'], 'gartering': ['gartering', 'regrating'], 'garum': ['garum', 'murga'], 'gary': ['gary', 'gray'], 'gas': ['gas', 'sag'], 'gasan': ['gasan', 'sanga'], 'gash': ['gash', 'shag'], 'gasless': ['gasless', 'glasses', 'sagless'], 'gaslit': ['algist', 'gaslit'], 'gasoliner': ['gasoliner', 'seignoral'], 'gasper': ['gasper', 'sparge'], 'gast': ['gast', 'stag'], 'gaster': ['gaster', 'stager'], 'gastrin': ['gastrin', 'staring'], 'gastroenteritis': ['enterogastritis', 'gastroenteritis'], 'gastroesophagostomy': ['esophagogastrostomy', 'gastroesophagostomy'], 'gastrohepatic': ['gastrohepatic', 'hepatogastric'], 'gastronomic': ['gastronomic', 'monogastric'], 'gastropathic': ['gastropathic', 'graphostatic'], 'gastrophrenic': ['gastrophrenic', 'nephrogastric', 'phrenogastric'], 'gastrular': ['gastrular', 'stragular'], 'gat': ['gat', 'tag'], 'gate': ['gaet', 'gate', 'geat', 'geta'], 'gateman': ['gateman', 'magenta', 'magnate', 'magneta'], 'gater': ['gater', 'grate', 'great', 'greta', 'retag', 'targe'], 'gateward': ['drawgate', 'gateward'], 'gateway': ['gateway', 'getaway', 'waygate'], 'gatherer': ['gatherer', 'regather'], 'gator': ['argot', 'gator', 'gotra', 'groat'], 'gatter': ['gatter', 'target'], 'gaucho': ['gaucho', 'guacho'], 'gaufer': ['agrufe', 'gaufer', 'gaufre'], 'gauffer': ['gauffer', 'gauffre'], 'gauffre': ['gauffer', 'gauffre'], 'gaufre': ['agrufe', 'gaufer', 'gaufre'], 'gaul': ['gaul', 'gula'], 'gaulin': ['gaulin', 'lingua'], 'gaulter': ['gaulter', 'tegular'], 'gaum': ['gaum', 'muga'], 'gaun': ['gaun', 'guan', 'guna', 'uang'], 'gaunt': ['gaunt', 'tunga'], 'gaur': ['gaur', 'guar', 'ruga'], 'gaura': ['gaura', 'guara'], 'gaurian': ['anguria', 'gaurian', 'guarani'], 'gave': ['gave', 'vage', 'vega'], 'gavyuti': ['gavyuti', 'vaguity'], 'gaw': ['gaw', 'wag'], 'gawn': ['gawn', 'gnaw', 'wang'], 'gay': ['agy', 'gay'], 'gaz': ['gaz', 'zag'], 'gazel': ['gazel', 'glaze'], 'gazer': ['gazer', 'graze'], 'gazon': ['gazon', 'zogan'], 'gazy': ['gazy', 'zyga'], 'geal': ['gael', 'gale', 'geal'], 'gean': ['agen', 'gaen', 'gane', 'gean', 'gena'], 'gear': ['ager', 'agre', 'gare', 'gear', 'rage'], 'geared': ['agreed', 'geared'], 'gearless': ['eelgrass', 'gearless', 'rageless'], 'gearman': ['gearman', 'manager'], 'gearset': ['ergates', 'gearset', 'geaster'], 'geaster': ['ergates', 'gearset', 'geaster'], 'geat': ['gaet', 'gate', 'geat', 'geta'], 'gebur': ['bugre', 'gebur'], 'ged': ['deg', 'ged'], 'gedder': ['dredge', 'gedder'], 'geest': ['egest', 'geest', 'geste'], 'gegger': ['gegger', 'gregge'], 'geheimrat': ['geheimrat', 'hermitage'], 'gein': ['gein', 'gien'], 'geira': ['geira', 'regia'], 'geison': ['geison', 'isogen'], 'geissospermine': ['geissospermine', 'spermiogenesis'], 'gel': ['gel', 'leg'], 'gelable': ['gabelle', 'gelable'], 'gelasian': ['anglaise', 'gelasian'], 'gelastic': ['gelastic', 'gestical'], 'gelatin': ['atingle', 'gelatin', 'genital', 'langite', 'telinga'], 'gelatinate': ['gelatinate', 'nagatelite'], 'gelatined': ['delignate', 'gelatined'], 'gelatinizer': ['gelatinizer', 'integralize'], 'gelatinoid': ['deligation', 'gadolinite', 'gelatinoid'], 'gelation': ['gelation', 'lagonite', 'legation'], 'gelatose': ['gelatose', 'segolate'], 'geldable': ['gabelled', 'geldable'], 'gelder': ['gelder', 'ledger', 'redleg'], 'gelding': ['gelding', 'ledging'], 'gelid': ['gelid', 'glide'], 'gelidness': ['gelidness', 'glideness'], 'gelosin': ['gelosin', 'lignose'], 'gem': ['gem', 'meg'], 'gemara': ['gemara', 'ramage'], 'gemaric': ['gemaric', 'grimace', 'megaric'], 'gemarist': ['gemarist', 'magister', 'sterigma'], 'gematria': ['gematria', 'maritage'], 'gemul': ['gemul', 'glume'], 'gena': ['agen', 'gaen', 'gane', 'gean', 'gena'], 'genal': ['agnel', 'angel', 'angle', 'galen', 'genal', 'glean', 'lagen'], 'genarch': ['changer', 'genarch'], 'gendarme': ['edgerman', 'gendarme'], 'genear': ['egeran', 'enrage', 'ergane', 'genear', 'genera'], 'geneat': ['geneat', 'negate', 'tegean'], 'genera': ['egeran', 'enrage', 'ergane', 'genear', 'genera'], 'generable': ['generable', 'greenable'], 'general': ['enlarge', 'general', 'gleaner'], 'generalist': ['easterling', 'generalist'], 'generall': ['allergen', 'generall'], 'generation': ['generation', 'renegation'], 'generic': ['energic', 'generic'], 'generical': ['energical', 'generical'], 'genesiac': ['agenesic', 'genesiac'], 'genesial': ['ensilage', 'genesial', 'signalee'], 'genetical': ['clientage', 'genetical'], 'genetta': ['genetta', 'tentage'], 'geneura': ['geneura', 'uneager'], 'geneva': ['avenge', 'geneva', 'vangee'], 'genial': ['algine', 'genial', 'linage'], 'genicular': ['genicular', 'neuralgic'], 'genie': ['eigne', 'genie'], 'genion': ['genion', 'inogen'], 'genipa': ['genipa', 'piegan'], 'genista': ['easting', 'gainset', 'genista', 'ingesta', 'seating', 'signate', 'teasing'], 'genistein': ['genistein', 'gentisein'], 'genital': ['atingle', 'gelatin', 'genital', 'langite', 'telinga'], 'genitals': ['galenist', 'genitals', 'stealing'], 'genitival': ['genitival', 'vigilante'], 'genitocrural': ['crurogenital', 'genitocrural'], 'genitor': ['ergotin', 'genitor', 'negrito', 'ogtiern', 'trigone'], 'genitorial': ['genitorial', 'religation'], 'genitory': ['genitory', 'ortygine'], 'genitourinary': ['genitourinary', 'urinogenitary'], 'geniture': ['geniture', 'guerinet'], 'genizero': ['genizero', 'negroize'], 'genoa': ['agone', 'genoa'], 'genoblastic': ['blastogenic', 'genoblastic'], 'genocidal': ['algedonic', 'genocidal'], 'genom': ['genom', 'gnome'], 'genotypical': ['genotypical', 'ptyalogenic'], 'genre': ['genre', 'green', 'neger', 'reneg'], 'genro': ['ergon', 'genro', 'goner', 'negro'], 'gent': ['gent', 'teng'], 'gentes': ['gentes', 'gesten'], 'genthite': ['genthite', 'teething'], 'gentian': ['antigen', 'gentian'], 'gentianic': ['antigenic', 'gentianic'], 'gentisein': ['genistein', 'gentisein'], 'gentle': ['gentle', 'telegn'], 'gentrice': ['erecting', 'gentrice'], 'genua': ['augen', 'genua'], 'genual': ['genual', 'leguan'], 'genuine': ['genuine', 'ingenue'], 'genus': ['genus', 'negus'], 'geo': ['ego', 'geo'], 'geocentric': ['ectrogenic', 'egocentric', 'geocentric'], 'geocratic': ['categoric', 'geocratic'], 'geocronite': ['erotogenic', 'geocronite', 'orogenetic'], 'geodal': ['algedo', 'geodal'], 'geode': ['geode', 'ogeed'], 'geodiatropism': ['diageotropism', 'geodiatropism'], 'geoduck': ['geoduck', 'goeduck'], 'geohydrology': ['geohydrology', 'hydrogeology'], 'geoid': ['diego', 'dogie', 'geoid'], 'geoidal': ['galeoid', 'geoidal'], 'geoisotherm': ['geoisotherm', 'isogeotherm'], 'geomagnetic': ['gametogenic', 'gamogenetic', 'geomagnetic'], 'geomant': ['geomant', 'magneto', 'megaton', 'montage'], 'geomantic': ['atmogenic', 'geomantic'], 'geometrical': ['geometrical', 'glaciometer'], 'geometrina': ['angiometer', 'ergotamine', 'geometrina'], 'geon': ['geon', 'gone'], 'geonim': ['geonim', 'imogen'], 'georama': ['georama', 'roamage'], 'geotectonic': ['geotectonic', 'tocogenetic'], 'geotic': ['geotic', 'goetic'], 'geotical': ['ectoglia', 'geotical', 'goetical'], 'geotonic': ['geotonic', 'otogenic'], 'geoty': ['geoty', 'goety'], 'ger': ['erg', 'ger', 'reg'], 'gerah': ['gareh', 'gerah'], 'geraldine': ['engrailed', 'geraldine'], 'geranial': ['algerian', 'geranial', 'regalian'], 'geranic': ['anergic', 'garnice', 'garniec', 'geranic', 'grecian'], 'geraniol': ['geraniol', 'regional'], 'geranomorph': ['geranomorph', 'monographer', 'nomographer'], 'geranyl': ['angerly', 'geranyl'], 'gerard': ['darger', 'gerard', 'grader', 'redrag', 'regard'], 'gerastian': ['agrestian', 'gerastian', 'stangeria'], 'geraty': ['geraty', 'gyrate'], 'gerb': ['berg', 'gerb'], 'gerbe': ['gerbe', 'grebe', 'rebeg'], 'gerbera': ['bargeer', 'gerbera'], 'gerenda': ['derange', 'enraged', 'gardeen', 'gerenda', 'grandee', 'grenade'], 'gerendum': ['gerendum', 'unmerged'], 'gerent': ['gerent', 'regent'], 'gerenuk': ['gerenuk', 'greenuk'], 'gerim': ['gerim', 'grime'], 'gerip': ['gerip', 'gripe'], 'german': ['engram', 'german', 'manger'], 'germania': ['germania', 'megarian'], 'germanics': ['germanics', 'screaming'], 'germanification': ['germanification', 'remagnification'], 'germanify': ['germanify', 'remagnify'], 'germanious': ['germanious', 'gramineous', 'marigenous'], 'germanist': ['germanist', 'streaming'], 'germanite': ['germanite', 'germinate', 'gramenite', 'mangerite'], 'germanly': ['germanly', 'germanyl'], 'germanyl': ['germanly', 'germanyl'], 'germinal': ['germinal', 'maligner', 'malinger'], 'germinant': ['germinant', 'minargent'], 'germinate': ['germanite', 'germinate', 'gramenite', 'mangerite'], 'germon': ['germon', 'monger', 'morgen'], 'geronomite': ['geronomite', 'goniometer'], 'geront': ['geront', 'tonger'], 'gerontal': ['argentol', 'gerontal'], 'gerontes': ['estrogen', 'gerontes'], 'gerontic': ['gerontic', 'negrotic'], 'gerontism': ['gerontism', 'monergist'], 'gerres': ['gerres', 'serger'], 'gersum': ['gersum', 'mergus'], 'gerund': ['dunger', 'gerund', 'greund', 'nudger'], 'gerundive': ['gerundive', 'ungrieved'], 'gerusia': ['ergusia', 'gerusia', 'sarigue'], 'gervas': ['gervas', 'graves'], 'gervase': ['gervase', 'greaves', 'servage'], 'ges': ['ges', 'seg'], 'gesan': ['agnes', 'gesan'], 'gesith': ['gesith', 'steigh'], 'gesning': ['gesning', 'ginseng'], 'gest': ['gest', 'steg'], 'gestapo': ['gestapo', 'postage'], 'gestate': ['gestate', 'tagetes'], 'geste': ['egest', 'geest', 'geste'], 'gesten': ['gentes', 'gesten'], 'gestical': ['gelastic', 'gestical'], 'gesticular': ['gesticular', 'scutigeral'], 'gesture': ['gesture', 'guester'], 'get': ['get', 'teg'], 'geta': ['gaet', 'gate', 'geat', 'geta'], 'getaway': ['gateway', 'getaway', 'waygate'], 'gettable': ['begettal', 'gettable'], 'getup': ['getup', 'upget'], 'geyerite': ['geyerite', 'tigereye'], 'ghaist': ['ghaist', 'tagish'], 'ghent': ['ghent', 'thegn'], 'ghosty': ['ghosty', 'hogsty'], 'ghoul': ['ghoul', 'lough'], 'giansar': ['giansar', 'sarangi'], 'giant': ['giant', 'tangi', 'tiang'], 'gib': ['big', 'gib'], 'gibbon': ['gibbon', 'gobbin'], 'gibel': ['bilge', 'gibel'], 'gibing': ['biggin', 'gibing'], 'gid': ['dig', 'gid'], 'gideonite': ['diogenite', 'gideonite'], 'gien': ['gein', 'gien'], 'gienah': ['gienah', 'hangie'], 'gif': ['fig', 'gif'], 'gifola': ['filago', 'gifola'], 'gifted': ['fidget', 'gifted'], 'gigman': ['gaming', 'gigman'], 'gigsman': ['gangism', 'gigsman'], 'gila': ['gail', 'gali', 'gila', 'glia'], 'gilaki': ['gilaki', 'giliak'], 'gilbertese': ['gilbertese', 'selbergite'], 'gilden': ['dingle', 'elding', 'engild', 'gilden'], 'gilder': ['gilder', 'girdle', 'glider', 'regild', 'ridgel'], 'gilding': ['gilding', 'gliding'], 'gileno': ['eloign', 'gileno', 'legion'], 'giles': ['giles', 'gilse'], 'giliak': ['gilaki', 'giliak'], 'giller': ['giller', 'grille', 'regill'], 'gilo': ['gilo', 'goli'], 'gilpy': ['gilpy', 'pigly'], 'gilse': ['giles', 'gilse'], 'gim': ['gim', 'mig'], 'gimel': ['gimel', 'glime'], 'gimmer': ['gimmer', 'grimme', 'megrim'], 'gimper': ['gimper', 'impreg'], 'gin': ['gin', 'ing', 'nig'], 'ginger': ['ginger', 'nigger'], 'gingery': ['gingery', 'niggery'], 'ginglymodi': ['ginglymodi', 'ginglymoid'], 'ginglymoid': ['ginglymodi', 'ginglymoid'], 'gink': ['gink', 'king'], 'ginned': ['ending', 'ginned'], 'ginner': ['enring', 'ginner'], 'ginney': ['ginney', 'nignye'], 'ginseng': ['gesning', 'ginseng'], 'ginward': ['drawing', 'ginward', 'warding'], 'gio': ['gio', 'goi'], 'giornata': ['giornata', 'gratiano'], 'giornatate': ['giornatate', 'tetragonia'], 'gip': ['gip', 'pig'], 'gipper': ['gipper', 'grippe'], 'girandole': ['girandole', 'negroidal'], 'girasole': ['girasole', 'seraglio'], 'girba': ['bragi', 'girba'], 'gird': ['gird', 'grid'], 'girder': ['girder', 'ridger'], 'girding': ['girding', 'ridging'], 'girdingly': ['girdingly', 'ridgingly'], 'girdle': ['gilder', 'girdle', 'glider', 'regild', 'ridgel'], 'girdler': ['dirgler', 'girdler'], 'girdling': ['girdling', 'ridgling'], 'girling': ['girling', 'rigling'], 'girn': ['girn', 'grin', 'ring'], 'girny': ['girny', 'ringy'], 'girondin': ['girondin', 'nonrigid'], 'girsle': ['girsle', 'gisler', 'glires', 'grilse'], 'girt': ['girt', 'grit', 'trig'], 'girth': ['girth', 'grith', 'right'], 'gish': ['gish', 'sigh'], 'gisla': ['gisla', 'ligas', 'sigla'], 'gisler': ['girsle', 'gisler', 'glires', 'grilse'], 'git': ['git', 'tig'], 'gitalin': ['gitalin', 'tailing'], 'gith': ['gith', 'thig'], 'gitksan': ['gitksan', 'skating', 'takings'], 'gittern': ['gittern', 'gritten', 'retting'], 'giustina': ['giustina', 'ignatius'], 'giver': ['giver', 'vergi'], 'glaceing': ['cageling', 'glaceing'], 'glacier': ['glacier', 'gracile'], 'glaciometer': ['geometrical', 'glaciometer'], 'gladdener': ['gladdener', 'glandered', 'regladden'], 'glaga': ['galga', 'glaga'], 'glaik': ['galik', 'glaik'], 'glaiket': ['glaiket', 'taglike'], 'glair': ['argil', 'glair', 'grail'], 'glaireous': ['aligerous', 'glaireous'], 'glaister': ['glaister', 'regalist'], 'glaive': ['glaive', 'vagile'], 'glance': ['cangle', 'glance'], 'glancer': ['cangler', 'glancer', 'reclang'], 'glancingly': ['clangingly', 'glancingly'], 'glandered': ['gladdener', 'glandered', 'regladden'], 'glans': ['glans', 'slang'], 'glare': ['argel', 'ergal', 'garle', 'glare', 'lager', 'large', 'regal'], 'glariness': ['glariness', 'grainless'], 'glary': ['glary', 'gyral'], 'glasser': ['glasser', 'largess'], 'glasses': ['gasless', 'glasses', 'sagless'], 'glassie': ['algesis', 'glassie'], 'glassine': ['gainless', 'glassine'], 'glaucin': ['glaucin', 'glucina'], 'glaucine': ['cuailnge', 'glaucine'], 'glaum': ['algum', 'almug', 'glaum', 'gluma', 'mulga'], 'glaur': ['glaur', 'gular'], 'glaury': ['glaury', 'raguly'], 'glaver': ['glaver', 'gravel'], 'glaze': ['gazel', 'glaze'], 'glazy': ['glazy', 'zygal'], 'gleamy': ['gamely', 'gleamy', 'mygale'], 'glean': ['agnel', 'angel', 'angle', 'galen', 'genal', 'glean', 'lagen'], 'gleaner': ['enlarge', 'general', 'gleaner'], 'gleary': ['argyle', 'gleary'], 'gleba': ['bagel', 'belga', 'gable', 'gleba'], 'glebal': ['begall', 'glebal'], 'glede': ['glede', 'gleed', 'ledge'], 'gledy': ['gledy', 'ledgy'], 'gleed': ['glede', 'gleed', 'ledge'], 'gleeman': ['gleeman', 'melange'], 'glia': ['gail', 'gali', 'gila', 'glia'], 'gliadin': ['dialing', 'gliadin'], 'glial': ['galli', 'glial'], 'glibness': ['beslings', 'blessing', 'glibness'], 'glidder': ['glidder', 'griddle'], 'glide': ['gelid', 'glide'], 'glideness': ['gelidness', 'glideness'], 'glider': ['gilder', 'girdle', 'glider', 'regild', 'ridgel'], 'gliding': ['gilding', 'gliding'], 'glime': ['gimel', 'glime'], 'glink': ['glink', 'kling'], 'glires': ['girsle', 'gisler', 'glires', 'grilse'], 'glisten': ['glisten', 'singlet'], 'glister': ['glister', 'gristle'], 'glitnir': ['glitnir', 'ritling'], 'glitter': ['glitter', 'grittle'], 'gloater': ['argolet', 'gloater', 'legator'], 'gloating': ['gloating', 'goatling'], 'globate': ['boltage', 'globate'], 'globe': ['bogle', 'globe'], 'globin': ['globin', 'goblin', 'lobing'], 'gloea': ['gloea', 'legoa'], 'glome': ['glome', 'golem', 'molge'], 'glomerate': ['algometer', 'glomerate'], 'glore': ['glore', 'ogler'], 'gloria': ['gloria', 'larigo', 'logria'], 'gloriana': ['argolian', 'gloriana'], 'gloriette': ['gloriette', 'rigolette'], 'glorifiable': ['frigolabile', 'glorifiable'], 'glossed': ['dogless', 'glossed', 'godless'], 'glosser': ['glosser', 'regloss'], 'glossitic': ['glossitic', 'logistics'], 'glossohyal': ['glossohyal', 'hyoglossal'], 'glossolabial': ['glossolabial', 'labioglossal'], 'glossolabiolaryngeal': ['glossolabiolaryngeal', 'labioglossolaryngeal'], 'glossolabiopharyngeal': ['glossolabiopharyngeal', 'labioglossopharyngeal'], 'glottid': ['glottid', 'goldtit'], 'glover': ['glover', 'grovel'], 'gloveress': ['gloveress', 'groveless'], 'glow': ['glow', 'gowl'], 'glower': ['glower', 'reglow'], 'gloy': ['gloy', 'logy'], 'glucemia': ['glucemia', 'mucilage'], 'glucina': ['glaucin', 'glucina'], 'glucine': ['glucine', 'lucigen'], 'glucinum': ['cingulum', 'glucinum'], 'glucosane': ['consulage', 'glucosane'], 'glue': ['glue', 'gule', 'luge'], 'gluer': ['gluer', 'gruel', 'luger'], 'gluma': ['algum', 'almug', 'glaum', 'gluma', 'mulga'], 'glume': ['gemul', 'glume'], 'glumose': ['glumose', 'lugsome'], 'gluten': ['englut', 'gluten', 'ungelt'], 'glutin': ['glutin', 'luting', 'ungilt'], 'glutter': ['glutter', 'guttler'], 'glycerate': ['electragy', 'glycerate'], 'glycerinize': ['glycerinize', 'glycerizine'], 'glycerizine': ['glycerinize', 'glycerizine'], 'glycerophosphate': ['glycerophosphate', 'phosphoglycerate'], 'glycocin': ['glycocin', 'glyconic'], 'glyconic': ['glycocin', 'glyconic'], 'glycosine': ['glycosine', 'lysogenic'], 'glycosuria': ['glycosuria', 'graciously'], 'gnaeus': ['gnaeus', 'unsage'], 'gnaphalium': ['gnaphalium', 'phalangium'], 'gnar': ['garn', 'gnar', 'rang'], 'gnarled': ['dangler', 'gnarled'], 'gnash': ['gnash', 'shang'], 'gnat': ['gant', 'gnat', 'tang'], 'gnatho': ['gnatho', 'thonga'], 'gnathotheca': ['chaetognath', 'gnathotheca'], 'gnatling': ['gnatling', 'tangling'], 'gnatter': ['garnett', 'gnatter', 'gratten', 'tergant'], 'gnaw': ['gawn', 'gnaw', 'wang'], 'gnetum': ['gnetum', 'nutmeg'], 'gnome': ['genom', 'gnome'], 'gnomic': ['coming', 'gnomic'], 'gnomist': ['gnomist', 'mosting'], 'gnomonic': ['gnomonic', 'oncoming'], 'gnomonical': ['cognominal', 'gnomonical'], 'gnostic': ['costing', 'gnostic'], 'gnostical': ['gnostical', 'nostalgic'], 'gnu': ['gnu', 'gun'], 'go': ['go', 'og'], 'goa': ['ago', 'goa'], 'goad': ['dago', 'goad'], 'goal': ['gaol', 'goal', 'gola', 'olga'], 'goan': ['agon', 'ango', 'gaon', 'goan', 'gona'], 'goat': ['goat', 'toag', 'toga'], 'goatee': ['goatee', 'goetae'], 'goatlike': ['goatlike', 'togalike'], 'goatling': ['gloating', 'goatling'], 'goatly': ['goatly', 'otalgy'], 'gob': ['bog', 'gob'], 'goban': ['bogan', 'goban'], 'gobbe': ['bebog', 'begob', 'gobbe'], 'gobbin': ['gibbon', 'gobbin'], 'gobelin': ['gobelin', 'gobline', 'ignoble', 'inglobe'], 'gobian': ['bagnio', 'gabion', 'gobian'], 'goblet': ['boglet', 'goblet'], 'goblin': ['globin', 'goblin', 'lobing'], 'gobline': ['gobelin', 'gobline', 'ignoble', 'inglobe'], 'goblinry': ['boringly', 'goblinry'], 'gobo': ['bogo', 'gobo'], 'goby': ['bogy', 'bygo', 'goby'], 'goclenian': ['congenial', 'goclenian'], 'god': ['dog', 'god'], 'goddam': ['goddam', 'mogdad'], 'gode': ['doeg', 'doge', 'gode'], 'godhead': ['doghead', 'godhead'], 'godhood': ['doghood', 'godhood'], 'godless': ['dogless', 'glossed', 'godless'], 'godlike': ['doglike', 'godlike'], 'godling': ['godling', 'lodging'], 'godly': ['dogly', 'godly', 'goldy'], 'godship': ['dogship', 'godship'], 'godwinian': ['downingia', 'godwinian'], 'goeduck': ['geoduck', 'goeduck'], 'goel': ['egol', 'goel', 'loge', 'ogle', 'oleg'], 'goer': ['goer', 'gore', 'ogre'], 'goes': ['goes', 'sego'], 'goetae': ['goatee', 'goetae'], 'goetic': ['geotic', 'goetic'], 'goetical': ['ectoglia', 'geotical', 'goetical'], 'goety': ['geoty', 'goety'], 'goglet': ['goglet', 'toggel', 'toggle'], 'goi': ['gio', 'goi'], 'goidel': ['goidel', 'goldie'], 'goitral': ['goitral', 'larigot', 'ligator'], 'gol': ['gol', 'log'], 'gola': ['gaol', 'goal', 'gola', 'olga'], 'golden': ['engold', 'golden'], 'goldenmouth': ['goldenmouth', 'longmouthed'], 'golder': ['golder', 'lodger'], 'goldie': ['goidel', 'goldie'], 'goldtit': ['glottid', 'goldtit'], 'goldy': ['dogly', 'godly', 'goldy'], 'golee': ['eloge', 'golee'], 'golem': ['glome', 'golem', 'molge'], 'golf': ['flog', 'golf'], 'golfer': ['golfer', 'reflog'], 'goli': ['gilo', 'goli'], 'goliard': ['argolid', 'goliard'], 'golo': ['golo', 'gool'], 'goma': ['goma', 'ogam'], 'gomari': ['gamori', 'gomari', 'gromia'], 'gomart': ['gomart', 'margot'], 'gomphrena': ['gomphrena', 'nephogram'], 'gon': ['gon', 'nog'], 'gona': ['agon', 'ango', 'gaon', 'goan', 'gona'], 'gonad': ['donga', 'gonad'], 'gonadial': ['diagonal', 'ganoidal', 'gonadial'], 'gonal': ['along', 'gonal', 'lango', 'longa', 'nogal'], 'gond': ['dong', 'gond'], 'gondi': ['dingo', 'doing', 'gondi', 'gonid'], 'gondola': ['dongola', 'gondola'], 'gondolier': ['gondolier', 'negroloid'], 'gone': ['geon', 'gone'], 'goner': ['ergon', 'genro', 'goner', 'negro'], 'gonesome': ['gonesome', 'osmogene'], 'gongoresque': ['gongoresque', 'gorgonesque'], 'gonia': ['gonia', 'ngaio', 'nogai'], 'goniac': ['agonic', 'angico', 'gaonic', 'goniac'], 'goniale': ['goniale', 'noilage'], 'goniaster': ['goniaster', 'orangeist'], 'goniatitid': ['digitation', 'goniatitid'], 'gonid': ['dingo', 'doing', 'gondi', 'gonid'], 'gonidia': ['angioid', 'gonidia'], 'gonidiferous': ['gonidiferous', 'indigoferous'], 'goniometer': ['geronomite', 'goniometer'], 'gonomery': ['gonomery', 'merogony'], 'gonosome': ['gonosome', 'mongoose'], 'gonyocele': ['coelogyne', 'gonyocele'], 'gonys': ['gonys', 'songy'], 'goober': ['booger', 'goober'], 'goodyear': ['goodyear', 'goodyera'], 'goodyera': ['goodyear', 'goodyera'], 'goof': ['fogo', 'goof'], 'goofer': ['forego', 'goofer'], 'gool': ['golo', 'gool'], 'gools': ['gools', 'logos'], 'goop': ['goop', 'pogo'], 'gor': ['gor', 'rog'], 'gora': ['argo', 'garo', 'gora'], 'goral': ['algor', 'argol', 'goral', 'largo'], 'goran': ['angor', 'argon', 'goran', 'grano', 'groan', 'nagor', 'orang', 'organ', 'rogan', 'ronga'], 'gorb': ['borg', 'brog', 'gorb'], 'gorbal': ['brolga', 'gorbal'], 'gorce': ['corge', 'gorce'], 'gordian': ['gordian', 'idorgan', 'roading'], 'gordon': ['drongo', 'gordon'], 'gordonia': ['gordonia', 'organoid', 'rigadoon'], 'gore': ['goer', 'gore', 'ogre'], 'gorer': ['gorer', 'roger'], 'gorge': ['gorge', 'grego'], 'gorged': ['dogger', 'gorged'], 'gorger': ['gorger', 'gregor'], 'gorgerin': ['gorgerin', 'ringgoer'], 'gorgonesque': ['gongoresque', 'gorgonesque'], 'goric': ['corgi', 'goric', 'orgic'], 'goring': ['goring', 'gringo'], 'gorse': ['gorse', 'soger'], 'gortonian': ['gortonian', 'organotin'], 'gory': ['gory', 'gyro', 'orgy'], 'gos': ['gos', 'sog'], 'gosain': ['gosain', 'isagon', 'sagoin'], 'gosh': ['gosh', 'shog'], 'gospel': ['gospel', 'spogel'], 'gossipry': ['gossipry', 'gryposis'], 'got': ['got', 'tog'], 'gotra': ['argot', 'gator', 'gotra', 'groat'], 'goup': ['goup', 'ogpu', 'upgo'], 'gourde': ['drogue', 'gourde'], 'gout': ['gout', 'toug'], 'goutish': ['goutish', 'outsigh'], 'gowan': ['gowan', 'wagon', 'wonga'], 'gowdnie': ['gowdnie', 'widgeon'], 'gowl': ['glow', 'gowl'], 'gown': ['gown', 'wong'], 'goyin': ['goyin', 'yogin'], 'gra': ['gar', 'gra', 'rag'], 'grab': ['brag', 'garb', 'grab'], 'grabble': ['gabbler', 'grabble'], 'graben': ['banger', 'engarb', 'graben'], 'grace': ['cager', 'garce', 'grace'], 'gracile': ['glacier', 'gracile'], 'graciously': ['glycosuria', 'graciously'], 'grad': ['darg', 'drag', 'grad'], 'gradation': ['gradation', 'indagator', 'tanagroid'], 'grade': ['edgar', 'grade'], 'graded': ['gadder', 'graded'], 'grader': ['darger', 'gerard', 'grader', 'redrag', 'regard'], 'gradient': ['gradient', 'treading'], 'gradienter': ['gradienter', 'intergrade'], 'gradientia': ['gradientia', 'grantiidae'], 'gradin': ['daring', 'dingar', 'gradin'], 'gradine': ['degrain', 'deraign', 'deringa', 'gradine', 'grained', 'reading'], 'grading': ['grading', 'niggard'], 'graeae': ['aerage', 'graeae'], 'graeme': ['graeme', 'meager', 'meagre'], 'grafter': ['grafter', 'regraft'], 'graian': ['graian', 'nagari'], 'grail': ['argil', 'glair', 'grail'], 'grailer': ['grailer', 'reglair'], 'grain': ['agrin', 'grain'], 'grained': ['degrain', 'deraign', 'deringa', 'gradine', 'grained', 'reading'], 'grainer': ['earring', 'grainer'], 'grainless': ['glariness', 'grainless'], 'graith': ['aright', 'graith'], 'grallina': ['grallina', 'granilla'], 'gralline': ['allergin', 'gralline'], 'grame': ['grame', 'marge', 'regma'], 'gramenite': ['germanite', 'germinate', 'gramenite', 'mangerite'], 'gramineous': ['germanious', 'gramineous', 'marigenous'], 'graminiform': ['graminiform', 'marginiform'], 'graminous': ['graminous', 'ignoramus'], 'gramme': ['gammer', 'gramme'], 'gramophonic': ['gramophonic', 'monographic', 'nomographic', 'phonogramic'], 'gramophonical': ['gramophonical', 'monographical', 'nomographical'], 'gramophonically': ['gramophonically', 'monographically', 'nomographically', 'phonogramically'], 'gramophonist': ['gramophonist', 'monographist'], 'granadine': ['granadine', 'grenadian'], 'granate': ['argante', 'granate', 'tanager'], 'granatum': ['armgaunt', 'granatum'], 'grand': ['drang', 'grand'], 'grandam': ['dragman', 'grandam', 'grandma'], 'grandee': ['derange', 'enraged', 'gardeen', 'gerenda', 'grandee', 'grenade'], 'grandeeism': ['grandeeism', 'renegadism'], 'grandeur': ['grandeur', 'unregard'], 'grandeval': ['grandeval', 'landgrave'], 'grandiose': ['grandiose', 'sargonide'], 'grandma': ['dragman', 'grandam', 'grandma'], 'grandparental': ['grandparental', 'grandpaternal'], 'grandpaternal': ['grandparental', 'grandpaternal'], 'grane': ['anger', 'areng', 'grane', 'range'], 'grange': ['ganger', 'grange', 'nagger'], 'grangousier': ['grangousier', 'gregarinous'], 'granilla': ['grallina', 'granilla'], 'granite': ['angrite', 'granite', 'ingrate', 'tangier', 'tearing', 'tigrean'], 'granivore': ['granivore', 'overgrain'], 'grano': ['angor', 'argon', 'goran', 'grano', 'groan', 'nagor', 'orang', 'organ', 'rogan', 'ronga'], 'granophyre': ['granophyre', 'renography'], 'grantee': ['grantee', 'greaten', 'reagent', 'rentage'], 'granter': ['granter', 'regrant'], 'granth': ['granth', 'thrang'], 'grantiidae': ['gradientia', 'grantiidae'], 'granula': ['angular', 'granula'], 'granule': ['granule', 'unlarge', 'unregal'], 'granulite': ['granulite', 'traguline'], 'grape': ['gaper', 'grape', 'pager', 'parge'], 'graperoot': ['graperoot', 'prorogate'], 'graphical': ['algraphic', 'graphical'], 'graphically': ['calligraphy', 'graphically'], 'graphologic': ['graphologic', 'logographic'], 'graphological': ['graphological', 'logographical'], 'graphology': ['graphology', 'logography'], 'graphometer': ['graphometer', 'meteorgraph'], 'graphophonic': ['graphophonic', 'phonographic'], 'graphostatic': ['gastropathic', 'graphostatic'], 'graphotypic': ['graphotypic', 'pictography', 'typographic'], 'grapsidae': ['disparage', 'grapsidae'], 'grasp': ['grasp', 'sprag'], 'grasper': ['grasper', 'regrasp', 'sparger'], 'grasser': ['grasser', 'regrass'], 'grasshopper': ['grasshopper', 'hoppergrass'], 'grassman': ['grassman', 'mangrass'], 'grat': ['grat', 'trag'], 'grate': ['gater', 'grate', 'great', 'greta', 'retag', 'targe'], 'grateman': ['grateman', 'mangrate', 'mentagra', 'targeman'], 'grater': ['garret', 'garter', 'grater', 'targer'], 'gratiano': ['giornata', 'gratiano'], 'graticule': ['curtilage', 'cutigeral', 'graticule'], 'gratiolin': ['gratiolin', 'largition', 'tailoring'], 'gratis': ['gratis', 'striga'], 'gratten': ['garnett', 'gnatter', 'gratten', 'tergant'], 'graupel': ['earplug', 'graupel', 'plaguer'], 'gravamen': ['gravamen', 'graveman'], 'gravel': ['glaver', 'gravel'], 'graveman': ['gravamen', 'graveman'], 'graves': ['gervas', 'graves'], 'gravure': ['gravure', 'verruga'], 'gray': ['gary', 'gray'], 'grayling': ['grayling', 'ragingly'], 'graze': ['gazer', 'graze'], 'greaser': ['argeers', 'greaser', 'serrage'], 'great': ['gater', 'grate', 'great', 'greta', 'retag', 'targe'], 'greaten': ['grantee', 'greaten', 'reagent', 'rentage'], 'greater': ['greater', 'regrate', 'terrage'], 'greaves': ['gervase', 'greaves', 'servage'], 'grebe': ['gerbe', 'grebe', 'rebeg'], 'grecian': ['anergic', 'garnice', 'garniec', 'geranic', 'grecian'], 'grecomania': ['ergomaniac', 'grecomania'], 'greed': ['edger', 'greed'], 'green': ['genre', 'green', 'neger', 'reneg'], 'greenable': ['generable', 'greenable'], 'greener': ['greener', 'regreen', 'reneger'], 'greenish': ['greenish', 'sheering'], 'greenland': ['englander', 'greenland'], 'greenuk': ['gerenuk', 'greenuk'], 'greeny': ['energy', 'greeny', 'gyrene'], 'greet': ['egret', 'greet', 'reget'], 'greeter': ['greeter', 'regreet'], 'gregal': ['gargle', 'gregal', 'lagger', 'raggle'], 'gregarian': ['gregarian', 'gregarina'], 'gregarina': ['gregarian', 'gregarina'], 'gregarinous': ['grangousier', 'gregarinous'], 'grege': ['egger', 'grege'], 'gregge': ['gegger', 'gregge'], 'grego': ['gorge', 'grego'], 'gregor': ['gorger', 'gregor'], 'greige': ['greige', 'reggie'], 'grein': ['grein', 'inger', 'nigre', 'regin', 'reign', 'ringe'], 'gremial': ['gremial', 'lamiger'], 'gremlin': ['gremlin', 'mingler'], 'grenade': ['derange', 'enraged', 'gardeen', 'gerenda', 'grandee', 'grenade'], 'grenadian': ['granadine', 'grenadian'], 'grenadier': ['earringed', 'grenadier'], 'grenadin': ['gardenin', 'grenadin'], 'grenadine': ['endearing', 'engrained', 'grenadine'], 'greta': ['gater', 'grate', 'great', 'greta', 'retag', 'targe'], 'gretel': ['gretel', 'reglet'], 'greund': ['dunger', 'gerund', 'greund', 'nudger'], 'grewia': ['earwig', 'grewia'], 'grey': ['grey', 'gyre'], 'grid': ['gird', 'grid'], 'griddle': ['glidder', 'griddle'], 'gride': ['dirge', 'gride', 'redig', 'ridge'], 'gridelin': ['dreiling', 'gridelin'], 'grieve': ['grieve', 'regive'], 'grieved': ['diverge', 'grieved'], 'grille': ['giller', 'grille', 'regill'], 'grilse': ['girsle', 'gisler', 'glires', 'grilse'], 'grimace': ['gemaric', 'grimace', 'megaric'], 'grime': ['gerim', 'grime'], 'grimme': ['gimmer', 'grimme', 'megrim'], 'grin': ['girn', 'grin', 'ring'], 'grinder': ['grinder', 'regrind'], 'grindle': ['dringle', 'grindle'], 'gringo': ['goring', 'gringo'], 'grip': ['grip', 'prig'], 'gripe': ['gerip', 'gripe'], 'gripeful': ['fireplug', 'gripeful'], 'griper': ['griper', 'regrip'], 'gripman': ['gripman', 'prigman', 'ramping'], 'grippe': ['gipper', 'grippe'], 'grisounite': ['grisounite', 'grisoutine', 'integrious'], 'grisoutine': ['grisounite', 'grisoutine', 'integrious'], 'grist': ['grist', 'grits', 'strig'], 'gristle': ['glister', 'gristle'], 'grit': ['girt', 'grit', 'trig'], 'grith': ['girth', 'grith', 'right'], 'grits': ['grist', 'grits', 'strig'], 'gritten': ['gittern', 'gritten', 'retting'], 'grittle': ['glitter', 'grittle'], 'grivna': ['grivna', 'raving'], 'grizzel': ['grizzel', 'grizzle'], 'grizzle': ['grizzel', 'grizzle'], 'groan': ['angor', 'argon', 'goran', 'grano', 'groan', 'nagor', 'orang', 'organ', 'rogan', 'ronga'], 'groaner': ['groaner', 'oranger', 'organer'], 'groaning': ['groaning', 'organing'], 'groat': ['argot', 'gator', 'gotra', 'groat'], 'grobian': ['biorgan', 'grobian'], 'groined': ['groined', 'negroid'], 'gromia': ['gamori', 'gomari', 'gromia'], 'groove': ['groove', 'overgo'], 'grope': ['grope', 'porge'], 'groper': ['groper', 'porger'], 'groset': ['groset', 'storge'], 'grossen': ['engross', 'grossen'], 'grot': ['grot', 'trog'], 'grotian': ['grotian', 'trigona'], 'grotto': ['grotto', 'torgot'], 'grounded': ['grounded', 'underdog', 'undergod'], 'grouper': ['grouper', 'regroup'], 'grouse': ['grouse', 'rugose'], 'grousy': ['grousy', 'gyrous'], 'grovel': ['glover', 'grovel'], 'groveless': ['gloveress', 'groveless'], 'growan': ['awrong', 'growan'], 'grower': ['grower', 'regrow'], 'grown': ['grown', 'wrong'], 'grub': ['burg', 'grub'], 'grudge': ['grudge', 'rugged'], 'grudger': ['drugger', 'grudger'], 'grudgery': ['druggery', 'grudgery'], 'grue': ['grue', 'urge'], 'gruel': ['gluer', 'gruel', 'luger'], 'gruelly': ['gruelly', 'gullery'], 'grues': ['grues', 'surge'], 'grun': ['grun', 'rung'], 'grush': ['grush', 'shrug'], 'grusinian': ['grusinian', 'unarising'], 'grutten': ['grutten', 'turgent'], 'gryposis': ['gossipry', 'gryposis'], 'guacho': ['gaucho', 'guacho'], 'guan': ['gaun', 'guan', 'guna', 'uang'], 'guanamine': ['guanamine', 'guineaman'], 'guanine': ['anguine', 'guanine', 'guinean'], 'guar': ['gaur', 'guar', 'ruga'], 'guara': ['gaura', 'guara'], 'guarani': ['anguria', 'gaurian', 'guarani'], 'guarantorship': ['guarantorship', 'uranographist'], 'guardeen': ['dungaree', 'guardeen', 'unagreed', 'underage', 'ungeared'], 'guarder': ['guarder', 'reguard'], 'guatusan': ['augustan', 'guatusan'], 'gud': ['dug', 'gud'], 'gude': ['degu', 'gude'], 'guenon': ['guenon', 'ungone'], 'guepard': ['guepard', 'upgrade'], 'guerdon': ['guerdon', 'undergo', 'ungored'], 'guerdoner': ['guerdoner', 'reundergo', 'undergoer', 'undergore'], 'guerinet': ['geniture', 'guerinet'], 'guester': ['gesture', 'guester'], 'guetar': ['argute', 'guetar', 'rugate', 'tuareg'], 'guetare': ['erugate', 'guetare'], 'guha': ['augh', 'guha'], 'guiana': ['guiana', 'iguana'], 'guib': ['bugi', 'guib'], 'guineaman': ['guanamine', 'guineaman'], 'guinean': ['anguine', 'guanine', 'guinean'], 'guiser': ['guiser', 'sergiu'], 'gul': ['gul', 'lug'], 'gula': ['gaul', 'gula'], 'gulae': ['gulae', 'legua'], 'gular': ['glaur', 'gular'], 'gularis': ['agrilus', 'gularis'], 'gulden': ['gulden', 'lunged'], 'gule': ['glue', 'gule', 'luge'], 'gules': ['gules', 'gusle'], 'gullery': ['gruelly', 'gullery'], 'gullible': ['bluegill', 'gullible'], 'gulonic': ['gulonic', 'unlogic'], 'gulp': ['gulp', 'plug'], 'gulpin': ['gulpin', 'puling'], 'gum': ['gum', 'mug'], 'gumbo': ['bogum', 'gumbo'], 'gumshoe': ['gumshoe', 'hugsome'], 'gumweed': ['gumweed', 'mugweed'], 'gun': ['gnu', 'gun'], 'guna': ['gaun', 'guan', 'guna', 'uang'], 'gunate': ['gunate', 'tangue'], 'gundi': ['gundi', 'undig'], 'gundy': ['dungy', 'gundy'], 'gunk': ['gunk', 'kung'], 'gunl': ['gunl', 'lung'], 'gunnership': ['gunnership', 'unsphering'], 'gunreach': ['gunreach', 'uncharge'], 'gunsel': ['gunsel', 'selung', 'slunge'], 'gunshot': ['gunshot', 'shotgun', 'uhtsong'], 'gunster': ['gunster', 'surgent'], 'gunter': ['gunter', 'gurnet', 'urgent'], 'gup': ['gup', 'pug'], 'gur': ['gur', 'rug'], 'gurgeon': ['gurgeon', 'ungorge'], 'gurgle': ['gurgle', 'lugger', 'ruggle'], 'gurian': ['gurian', 'ugrian'], 'guric': ['guric', 'ugric'], 'gurl': ['gurl', 'lurg'], 'gurnard': ['drungar', 'gurnard'], 'gurnet': ['gunter', 'gurnet', 'urgent'], 'gurt': ['gurt', 'trug'], 'gush': ['gush', 'shug', 'sugh'], 'gusher': ['gusher', 'regush'], 'gusle': ['gules', 'gusle'], 'gust': ['gust', 'stug'], 'gut': ['gut', 'tug'], 'gutless': ['gutless', 'tugless'], 'gutlike': ['gutlike', 'tuglike'], 'gutnish': ['gutnish', 'husting', 'unsight'], 'guttler': ['glutter', 'guttler'], 'guttular': ['guttular', 'guttural'], 'guttural': ['guttular', 'guttural'], 'gweed': ['gweed', 'wedge'], 'gymnasic': ['gymnasic', 'syngamic'], 'gymnastic': ['gymnastic', 'nystagmic'], 'gynandrous': ['androgynus', 'gynandrous'], 'gynerium': ['eryngium', 'gynerium'], 'gynospore': ['gynospore', 'sporogeny'], 'gypsine': ['gypsine', 'pigsney'], 'gyral': ['glary', 'gyral'], 'gyrant': ['gantry', 'gyrant'], 'gyrate': ['geraty', 'gyrate'], 'gyration': ['gyration', 'organity', 'ortygian'], 'gyre': ['grey', 'gyre'], 'gyrene': ['energy', 'greeny', 'gyrene'], 'gyro': ['gory', 'gyro', 'orgy'], 'gyroma': ['gyroma', 'morgay'], 'gyromitra': ['gyromitra', 'migratory'], 'gyrophora': ['gyrophora', 'orography'], 'gyrous': ['grousy', 'gyrous'], 'gyrus': ['gyrus', 'surgy'], 'ha': ['ah', 'ha'], 'haberdine': ['haberdine', 'hebridean'], 'habile': ['habile', 'halebi'], 'habiri': ['bihari', 'habiri'], 'habiru': ['brahui', 'habiru'], 'habit': ['baith', 'habit'], 'habitan': ['abthain', 'habitan'], 'habitat': ['habitat', 'tabitha'], 'habited': ['habited', 'thebaid'], 'habitus': ['habitus', 'ushabti'], 'habnab': ['babhan', 'habnab'], 'hacienda': ['chanidae', 'hacienda'], 'hackin': ['hackin', 'kachin'], 'hackle': ['hackle', 'lekach'], 'hackler': ['chalker', 'hackler'], 'hackly': ['chalky', 'hackly'], 'hacktree': ['eckehart', 'hacktree'], 'hackwood': ['hackwood', 'woodhack'], 'hacky': ['chyak', 'hacky'], 'had': ['dah', 'dha', 'had'], 'hadden': ['hadden', 'handed'], 'hade': ['hade', 'head'], 'hades': ['deash', 'hades', 'sadhe', 'shade'], 'hadji': ['hadji', 'jihad'], 'haec': ['ache', 'each', 'haec'], 'haem': ['ahem', 'haem', 'hame'], 'haet': ['ahet', 'haet', 'hate', 'heat', 'thea'], 'hafgan': ['afghan', 'hafgan'], 'hafter': ['father', 'freath', 'hafter'], 'hageen': ['hageen', 'hangee'], 'hailse': ['elisha', 'hailse', 'sheila'], 'hainan': ['hainan', 'nahani'], 'hair': ['ahir', 'hair'], 'hairband': ['bhandari', 'hairband'], 'haired': ['dehair', 'haired'], 'hairen': ['hairen', 'hernia'], 'hairlet': ['hairlet', 'therial'], 'hairstone': ['hairstone', 'hortensia'], 'hairup': ['hairup', 'rupiah'], 'hak': ['hak', 'kha'], 'hakam': ['hakam', 'makah'], 'hakea': ['ekaha', 'hakea'], 'hakim': ['hakim', 'khami'], 'haku': ['haku', 'kahu'], 'halal': ['allah', 'halal'], 'halbert': ['blather', 'halbert'], 'hale': ['hale', 'heal', 'leah'], 'halebi': ['habile', 'halebi'], 'halenia': ['ainaleh', 'halenia'], 'halesome': ['halesome', 'healsome'], 'halicore': ['halicore', 'heroical'], 'haliotidae': ['aethalioid', 'haliotidae'], 'hallan': ['hallan', 'nallah'], 'hallower': ['hallower', 'rehallow'], 'halma': ['halma', 'hamal'], 'halogeton': ['halogeton', 'theogonal'], 'haloid': ['dihalo', 'haloid'], 'halophile': ['halophile', 'philohela'], 'halophytism': ['halophytism', 'hylopathism'], 'hals': ['hals', 'lash'], 'halse': ['halse', 'leash', 'selah', 'shale', 'sheal', 'shela'], 'halsen': ['halsen', 'hansel', 'lanseh'], 'halt': ['halt', 'lath'], 'halter': ['arthel', 'halter', 'lather', 'thaler'], 'halterbreak': ['halterbreak', 'leatherbark'], 'halting': ['halting', 'lathing', 'thingal'], 'halve': ['halve', 'havel'], 'halver': ['halver', 'lavehr'], 'ham': ['ham', 'mah'], 'hamal': ['halma', 'hamal'], 'hame': ['ahem', 'haem', 'hame'], 'hameil': ['hameil', 'hiemal'], 'hamel': ['hamel', 'hemal'], 'hamfatter': ['aftermath', 'hamfatter'], 'hami': ['hami', 'hima', 'mahi'], 'hamital': ['hamital', 'thalami'], 'hamites': ['atheism', 'hamites'], 'hamlet': ['hamlet', 'malthe'], 'hammerer': ['hammerer', 'rehammer'], 'hamsa': ['hamsa', 'masha', 'shama'], 'hamulites': ['hamulites', 'shulamite'], 'hamus': ['hamus', 'musha'], 'hanaster': ['hanaster', 'sheratan'], 'hance': ['achen', 'chane', 'chena', 'hance'], 'hand': ['dhan', 'hand'], 'handbook': ['bandhook', 'handbook'], 'handed': ['hadden', 'handed'], 'hander': ['hander', 'harden'], 'handicapper': ['handicapper', 'prehandicap'], 'handscrape': ['handscrape', 'scaphander'], 'handstone': ['handstone', 'stonehand'], 'handwork': ['handwork', 'workhand'], 'hangar': ['arghan', 'hangar'], 'hangby': ['banghy', 'hangby'], 'hangee': ['hageen', 'hangee'], 'hanger': ['hanger', 'rehang'], 'hangie': ['gienah', 'hangie'], 'hangnail': ['hangnail', 'langhian'], 'hangout': ['hangout', 'tohunga'], 'hank': ['ankh', 'hank', 'khan'], 'hano': ['hano', 'noah'], 'hans': ['hans', 'nash', 'shan'], 'hansa': ['ahsan', 'hansa', 'hasan'], 'hanse': ['ashen', 'hanse', 'shane', 'shean'], 'hanseatic': ['anchistea', 'hanseatic'], 'hansel': ['halsen', 'hansel', 'lanseh'], 'hant': ['hant', 'tanh', 'than'], 'hantle': ['ethnal', 'hantle', 'lathen', 'thenal'], 'hao': ['aho', 'hao'], 'haole': ['eloah', 'haole'], 'haoma': ['haoma', 'omaha'], 'haori': ['haori', 'iroha'], 'hap': ['hap', 'pah'], 'hapalotis': ['hapalotis', 'sapotilha'], 'hapi': ['hapi', 'pahi'], 'haplodoci': ['chilopoda', 'haplodoci'], 'haplont': ['haplont', 'naphtol'], 'haplosis': ['alphosis', 'haplosis'], 'haply': ['haply', 'phyla'], 'happiest': ['happiest', 'peatship'], 'haptene': ['haptene', 'heptane', 'phenate'], 'haptenic': ['haptenic', 'pantheic', 'pithecan'], 'haptere': ['haptere', 'preheat'], 'haptic': ['haptic', 'pathic'], 'haptics': ['haptics', 'spathic'], 'haptometer': ['amphorette', 'haptometer'], 'haptophoric': ['haptophoric', 'pathophoric'], 'haptophorous': ['haptophorous', 'pathophorous'], 'haptotropic': ['haptotropic', 'protopathic'], 'hapu': ['hapu', 'hupa'], 'harass': ['harass', 'hassar'], 'harb': ['bhar', 'harb'], 'harborer': ['abhorrer', 'harborer'], 'harden': ['hander', 'harden'], 'hardener': ['hardener', 'reharden'], 'hardenite': ['hardenite', 'herniated'], 'hardtail': ['hardtail', 'thaliard'], 'hardy': ['hardy', 'hydra'], 'hare': ['hare', 'hear', 'rhea'], 'harebrain': ['harebrain', 'herbarian'], 'harem': ['harem', 'herma', 'rhema'], 'haremism': ['ashimmer', 'haremism'], 'harfang': ['fraghan', 'harfang'], 'haricot': ['chariot', 'haricot'], 'hark': ['hark', 'khar', 'rakh'], 'harka': ['harka', 'kahar'], 'harlot': ['harlot', 'orthal', 'thoral'], 'harmala': ['harmala', 'marhala'], 'harman': ['amhran', 'harman', 'mahran'], 'harmer': ['harmer', 'reharm'], 'harmine': ['harmine', 'hireman'], 'harmonic': ['choirman', 'harmonic', 'omniarch'], 'harmonical': ['harmonical', 'monarchial'], 'harmonics': ['anorchism', 'harmonics'], 'harmonistic': ['anchoritism', 'chiromantis', 'chrismation', 'harmonistic'], 'harnesser': ['harnesser', 'reharness'], 'harold': ['harold', 'holard'], 'harpa': ['aphra', 'harpa', 'parah'], 'harpings': ['harpings', 'phrasing'], 'harpist': ['harpist', 'traship'], 'harpless': ['harpless', 'splasher'], 'harris': ['arrish', 'harris', 'rarish', 'sirrah'], 'harrower': ['harrower', 'reharrow'], 'hart': ['hart', 'rath', 'tahr', 'thar', 'trah'], 'hartin': ['hartin', 'thrain'], 'hartite': ['hartite', 'rathite'], 'haruspices': ['chuprassie', 'haruspices'], 'harvester': ['harvester', 'reharvest'], 'hasan': ['ahsan', 'hansa', 'hasan'], 'hash': ['hash', 'sahh', 'shah'], 'hasher': ['hasher', 'rehash'], 'hasidic': ['hasidic', 'sahidic'], 'hasidim': ['hasidim', 'maidish'], 'hasky': ['hasky', 'shaky'], 'haslet': ['haslet', 'lesath', 'shelta'], 'hasp': ['hasp', 'pash', 'psha', 'shap'], 'hassar': ['harass', 'hassar'], 'hassel': ['hassel', 'hassle'], 'hassle': ['hassel', 'hassle'], 'haste': ['ashet', 'haste', 'sheat'], 'hasten': ['athens', 'hasten', 'snathe', 'sneath'], 'haster': ['haster', 'hearst', 'hearts'], 'hastilude': ['hastilude', 'lustihead'], 'hastler': ['hastler', 'slather'], 'hasty': ['hasty', 'yasht'], 'hat': ['aht', 'hat', 'tha'], 'hatchery': ['hatchery', 'thearchy'], 'hate': ['ahet', 'haet', 'hate', 'heat', 'thea'], 'hateable': ['hateable', 'heatable'], 'hateful': ['hateful', 'heatful'], 'hateless': ['hateless', 'heatless'], 'hater': ['earth', 'hater', 'heart', 'herat', 'rathe'], 'hati': ['hati', 'thai'], 'hatred': ['dearth', 'hatred', 'rathed', 'thread'], 'hatress': ['hatress', 'shaster'], 'hatt': ['hatt', 'tath', 'that'], 'hattemist': ['hattemist', 'thematist'], 'hatter': ['hatter', 'threat'], 'hattery': ['hattery', 'theatry'], 'hattic': ['chatti', 'hattic'], 'hattock': ['hattock', 'totchka'], 'hau': ['ahu', 'auh', 'hau'], 'hauerite': ['eutheria', 'hauerite'], 'haul': ['haul', 'hula'], 'hauler': ['hauler', 'rehaul'], 'haunt': ['ahunt', 'haunt', 'thuan', 'unhat'], 'haunter': ['haunter', 'nauther', 'unearth', 'unheart', 'urethan'], 'hauntingly': ['hauntingly', 'unhatingly'], 'haurient': ['haurient', 'huterian'], 'havel': ['halve', 'havel'], 'havers': ['havers', 'shaver', 'shrave'], 'haw': ['haw', 'hwa', 'wah', 'wha'], 'hawer': ['hawer', 'whare'], 'hawm': ['hawm', 'wham'], 'hawse': ['hawse', 'shewa', 'whase'], 'hawser': ['hawser', 'rewash', 'washer'], 'hay': ['hay', 'yah'], 'haya': ['ayah', 'haya'], 'hayz': ['hayz', 'hazy'], 'hazarder': ['hazarder', 'rehazard'], 'hazel': ['hazel', 'hazle'], 'hazle': ['hazel', 'hazle'], 'hazy': ['hayz', 'hazy'], 'he': ['eh', 'he'], 'head': ['hade', 'head'], 'headbander': ['barehanded', 'bradenhead', 'headbander'], 'headboard': ['broadhead', 'headboard'], 'header': ['adhere', 'header', 'hedera', 'rehead'], 'headily': ['headily', 'hylidae'], 'headlight': ['headlight', 'lighthead'], 'headlong': ['headlong', 'longhead'], 'headman': ['headman', 'manhead'], 'headmaster': ['headmaster', 'headstream', 'streamhead'], 'headnote': ['headnote', 'notehead'], 'headrail': ['headrail', 'railhead'], 'headrent': ['adherent', 'headrent', 'neatherd', 'threaden'], 'headring': ['headring', 'ringhead'], 'headset': ['headset', 'sethead'], 'headskin': ['headskin', 'nakedish', 'sinkhead'], 'headspring': ['headspring', 'springhead'], 'headstone': ['headstone', 'stonehead'], 'headstream': ['headmaster', 'headstream', 'streamhead'], 'headstrong': ['headstrong', 'stronghead'], 'headward': ['drawhead', 'headward'], 'headwater': ['headwater', 'waterhead'], 'heal': ['hale', 'heal', 'leah'], 'healer': ['healer', 'rehale', 'reheal'], 'healsome': ['halesome', 'healsome'], 'heap': ['epha', 'heap'], 'heaper': ['heaper', 'reheap'], 'heaps': ['heaps', 'pesah', 'phase', 'shape'], 'hear': ['hare', 'hear', 'rhea'], 'hearer': ['hearer', 'rehear'], 'hearken': ['hearken', 'kenareh'], 'hearst': ['haster', 'hearst', 'hearts'], 'heart': ['earth', 'hater', 'heart', 'herat', 'rathe'], 'heartdeep': ['heartdeep', 'preheated'], 'hearted': ['earthed', 'hearted'], 'heartedness': ['heartedness', 'neatherdess'], 'hearten': ['earthen', 'enheart', 'hearten', 'naether', 'teheran', 'traheen'], 'heartener': ['heartener', 'rehearten'], 'heartiness': ['earthiness', 'heartiness'], 'hearting': ['hearting', 'ingather'], 'heartless': ['earthless', 'heartless'], 'heartling': ['earthling', 'heartling'], 'heartly': ['earthly', 'heartly', 'lathery', 'rathely'], 'heartnut': ['earthnut', 'heartnut'], 'heartpea': ['earthpea', 'heartpea'], 'heartquake': ['earthquake', 'heartquake'], 'hearts': ['haster', 'hearst', 'hearts'], 'heartsome': ['heartsome', 'samothere'], 'heartward': ['earthward', 'heartward'], 'heartweed': ['heartweed', 'weathered'], 'hearty': ['earthy', 'hearty', 'yearth'], 'heat': ['ahet', 'haet', 'hate', 'heat', 'thea'], 'heatable': ['hateable', 'heatable'], 'heater': ['heater', 'hereat', 'reheat'], 'heatful': ['hateful', 'heatful'], 'heath': ['heath', 'theah'], 'heating': ['gahnite', 'heating'], 'heatless': ['hateless', 'heatless'], 'heatronic': ['anchorite', 'antechoir', 'heatronic', 'hectorian'], 'heave': ['heave', 'hevea'], 'hebraizer': ['hebraizer', 'herbarize'], 'hebridean': ['haberdine', 'hebridean'], 'hecate': ['achete', 'hecate', 'teache', 'thecae'], 'hecatine': ['echinate', 'hecatine'], 'heckle': ['heckle', 'kechel'], 'hectare': ['cheater', 'hectare', 'recheat', 'reteach', 'teacher'], 'hecte': ['cheet', 'hecte'], 'hector': ['hector', 'rochet', 'tocher', 'troche'], 'hectorian': ['anchorite', 'antechoir', 'heatronic', 'hectorian'], 'hectorship': ['christophe', 'hectorship'], 'hedera': ['adhere', 'header', 'hedera', 'rehead'], 'hedonical': ['chelodina', 'hedonical'], 'hedonism': ['demonish', 'hedonism'], 'heehaw': ['heehaw', 'wahehe'], 'heel': ['heel', 'hele'], 'heeler': ['heeler', 'reheel'], 'heelpost': ['heelpost', 'pesthole'], 'heer': ['heer', 'here'], 'hegari': ['hegari', 'hegira'], 'hegemonic': ['hegemonic', 'hemogenic'], 'hegira': ['hegari', 'hegira'], 'hei': ['hei', 'hie'], 'height': ['eighth', 'height'], 'heightener': ['heightener', 'reheighten'], 'heintzite': ['heintzite', 'hintzeite'], 'heinz': ['heinz', 'hienz'], 'heir': ['heir', 'hire'], 'heirdom': ['heirdom', 'homerid'], 'heirless': ['heirless', 'hireless'], 'hejazi': ['hejazi', 'jeziah'], 'helcosis': ['helcosis', 'ochlesis'], 'helcotic': ['helcotic', 'lochetic', 'ochletic'], 'hele': ['heel', 'hele'], 'heliacal': ['achillea', 'heliacal'], 'heliast': ['heliast', 'thesial'], 'helical': ['alichel', 'challie', 'helical'], 'heliced': ['chelide', 'heliced'], 'helicon': ['choline', 'helicon'], 'heling': ['heling', 'hingle'], 'heliophotography': ['heliophotography', 'photoheliography'], 'helios': ['helios', 'isohel'], 'heliostatic': ['chiastolite', 'heliostatic'], 'heliotactic': ['heliotactic', 'thiolacetic'], 'helium': ['helium', 'humlie'], 'hellcat': ['hellcat', 'tellach'], 'helleborein': ['helleborein', 'helleborine'], 'helleborine': ['helleborein', 'helleborine'], 'hellenic': ['chenille', 'hellenic'], 'helleri': ['helleri', 'hellier'], 'hellicat': ['hellicat', 'lecithal'], 'hellier': ['helleri', 'hellier'], 'helm': ['helm', 'heml'], 'heloderma': ['dreamhole', 'heloderma'], 'helot': ['helot', 'hotel', 'thole'], 'helotize': ['helotize', 'hotelize'], 'helpmeet': ['helpmeet', 'meethelp'], 'hemad': ['ahmed', 'hemad'], 'hemal': ['hamel', 'hemal'], 'hemapod': ['hemapod', 'mophead'], 'hematic': ['chamite', 'hematic'], 'hematin': ['ethanim', 'hematin'], 'hematinic': ['hematinic', 'minchiate'], 'hematolin': ['hematolin', 'maholtine'], 'hematonic': ['hematonic', 'methanoic'], 'hematosin': ['hematosin', 'thomasine'], 'hematoxic': ['hematoxic', 'hexatomic'], 'hematuric': ['hematuric', 'rheumatic'], 'hemiasci': ['hemiasci', 'ischemia'], 'hemiatrophy': ['hemiatrophy', 'hypothermia'], 'hemic': ['chime', 'hemic', 'miche'], 'hemicarp': ['camphire', 'hemicarp'], 'hemicatalepsy': ['hemicatalepsy', 'mesaticephaly'], 'hemiclastic': ['alchemistic', 'hemiclastic'], 'hemicrany': ['hemicrany', 'machinery'], 'hemiholohedral': ['hemiholohedral', 'holohemihedral'], 'hemiolic': ['elohimic', 'hemiolic'], 'hemiparesis': ['hemiparesis', 'phariseeism'], 'hemistater': ['amherstite', 'hemistater'], 'hemiterata': ['hemiterata', 'metatheria'], 'hemitype': ['epithyme', 'hemitype'], 'heml': ['helm', 'heml'], 'hemogenic': ['hegemonic', 'hemogenic'], 'hemol': ['hemol', 'mohel'], 'hemologist': ['hemologist', 'theologism'], 'hemopneumothorax': ['hemopneumothorax', 'pneumohemothorax'], 'henbit': ['behint', 'henbit'], 'hent': ['hent', 'neth', 'then'], 'henter': ['erthen', 'henter', 'nether', 'threne'], 'henyard': ['enhydra', 'henyard'], 'hepar': ['hepar', 'phare', 'raphe'], 'heparin': ['heparin', 'nephria'], 'hepatic': ['aphetic', 'caphite', 'hepatic'], 'hepatica': ['apachite', 'hepatica'], 'hepatical': ['caliphate', 'hepatical'], 'hepatize': ['aphetize', 'hepatize'], 'hepatocolic': ['hepatocolic', 'otocephalic'], 'hepatogastric': ['gastrohepatic', 'hepatogastric'], 'hepatoid': ['diaphote', 'hepatoid'], 'hepatomegalia': ['hepatomegalia', 'megalohepatia'], 'hepatonephric': ['hepatonephric', 'phrenohepatic'], 'hepatostomy': ['hepatostomy', 'somatophyte'], 'hepialid': ['hepialid', 'phialide'], 'heptace': ['heptace', 'tepache'], 'heptad': ['heptad', 'pathed'], 'heptagon': ['heptagon', 'pathogen'], 'heptameron': ['heptameron', 'promethean'], 'heptane': ['haptene', 'heptane', 'phenate'], 'heptaploidy': ['heptaploidy', 'typhlopidae'], 'hepteris': ['hepteris', 'treeship'], 'heptine': ['heptine', 'nephite'], 'heptite': ['epithet', 'heptite'], 'heptorite': ['heptorite', 'tephroite'], 'heptylic': ['heptylic', 'phyletic'], 'her': ['her', 'reh', 'rhe'], 'heraclid': ['heraclid', 'heraldic'], 'heraldic': ['heraclid', 'heraldic'], 'heraldist': ['heraldist', 'tehsildar'], 'herat': ['earth', 'hater', 'heart', 'herat', 'rathe'], 'herbage': ['breaghe', 'herbage'], 'herbarian': ['harebrain', 'herbarian'], 'herbarism': ['herbarism', 'shambrier'], 'herbarize': ['hebraizer', 'herbarize'], 'herbert': ['berther', 'herbert'], 'herbous': ['herbous', 'subhero'], 'herdic': ['chider', 'herdic'], 'here': ['heer', 'here'], 'hereafter': ['featherer', 'hereafter'], 'hereat': ['heater', 'hereat', 'reheat'], 'herein': ['herein', 'inhere'], 'hereinto': ['etherion', 'hereinto', 'heronite'], 'herem': ['herem', 'rheme'], 'heretic': ['erethic', 'etheric', 'heretic', 'heteric', 'teicher'], 'heretically': ['heretically', 'heterically'], 'heretication': ['heretication', 'theoretician'], 'hereto': ['hereto', 'hetero'], 'heritance': ['catherine', 'heritance'], 'herl': ['herl', 'hler', 'lehr'], 'herma': ['harem', 'herma', 'rhema'], 'hermaic': ['chimera', 'hermaic'], 'hermitage': ['geheimrat', 'hermitage'], 'hermo': ['hermo', 'homer', 'horme'], 'herne': ['herne', 'rheen'], 'hernia': ['hairen', 'hernia'], 'hernial': ['hernial', 'inhaler'], 'herniate': ['atherine', 'herniate'], 'herniated': ['hardenite', 'herniated'], 'hernioid': ['dinheiro', 'hernioid'], 'hero': ['hero', 'hoer'], 'herodian': ['herodian', 'ironhead'], 'heroic': ['coheir', 'heroic'], 'heroical': ['halicore', 'heroical'], 'heroin': ['heroin', 'hieron', 'hornie'], 'heroism': ['heroism', 'moreish'], 'heronite': ['etherion', 'hereinto', 'heronite'], 'herophile': ['herophile', 'rheophile'], 'herpes': ['herpes', 'hesper', 'sphere'], 'herpetism': ['herpetism', 'metership', 'metreship', 'temperish'], 'herpetological': ['herpetological', 'pretheological'], 'herpetomonad': ['dermatophone', 'herpetomonad'], 'hers': ['hers', 'resh', 'sher'], 'herse': ['herse', 'sereh', 'sheer', 'shree'], 'hersed': ['hersed', 'sheder'], 'herself': ['flesher', 'herself'], 'hersir': ['hersir', 'sherri'], 'herulian': ['herulian', 'inhauler'], 'hervati': ['athrive', 'hervati'], 'hesitater': ['hesitater', 'hetaerist'], 'hesper': ['herpes', 'hesper', 'sphere'], 'hespera': ['hespera', 'rephase', 'reshape'], 'hesperia': ['hesperia', 'pharisee'], 'hesperian': ['hesperian', 'phrenesia', 'seraphine'], 'hesperid': ['hesperid', 'perished'], 'hesperinon': ['hesperinon', 'prehension'], 'hesperis': ['hesperis', 'seership'], 'hest': ['esth', 'hest', 'seth'], 'hester': ['esther', 'hester', 'theres'], 'het': ['het', 'the'], 'hetaeric': ['cheatrie', 'hetaeric'], 'hetaerist': ['hesitater', 'hetaerist'], 'hetaery': ['erythea', 'hetaery', 'yeather'], 'heteratomic': ['heteratomic', 'theorematic'], 'heteraxial': ['exhilarate', 'heteraxial'], 'heteric': ['erethic', 'etheric', 'heretic', 'heteric', 'teicher'], 'heterically': ['heretically', 'heterically'], 'hetericism': ['erethismic', 'hetericism'], 'hetericist': ['erethistic', 'hetericist'], 'heterism': ['erethism', 'etherism', 'heterism'], 'heterization': ['etherization', 'heterization'], 'heterize': ['etherize', 'heterize'], 'hetero': ['hereto', 'hetero'], 'heterocarpus': ['heterocarpus', 'urethrascope'], 'heteroclite': ['heteroclite', 'heterotelic'], 'heterodromy': ['heterodromy', 'hydrometeor'], 'heteroecismal': ['cholesteremia', 'heteroecismal'], 'heterography': ['erythrophage', 'heterography'], 'heterogynous': ['heterogynous', 'thyreogenous'], 'heterology': ['heterology', 'thereology'], 'heteromeri': ['heteromeri', 'moerithere'], 'heteroousiast': ['autoheterosis', 'heteroousiast'], 'heteropathy': ['heteropathy', 'theotherapy'], 'heteropodal': ['heteropodal', 'prelatehood'], 'heterotelic': ['heteroclite', 'heterotelic'], 'heterotic': ['heterotic', 'theoretic'], 'hetman': ['anthem', 'hetman', 'mentha'], 'hetmanate': ['hetmanate', 'methanate'], 'hetter': ['hetter', 'tether'], 'hevea': ['heave', 'hevea'], 'hevi': ['hevi', 'hive'], 'hewel': ['hewel', 'wheel'], 'hewer': ['hewer', 'wheer', 'where'], 'hewn': ['hewn', 'when'], 'hewt': ['hewt', 'thew', 'whet'], 'hexacid': ['hexacid', 'hexadic'], 'hexadic': ['hexacid', 'hexadic'], 'hexakisoctahedron': ['hexakisoctahedron', 'octakishexahedron'], 'hexakistetrahedron': ['hexakistetrahedron', 'tetrakishexahedron'], 'hexatetrahedron': ['hexatetrahedron', 'tetrahexahedron'], 'hexatomic': ['hematoxic', 'hexatomic'], 'hexonic': ['choenix', 'hexonic'], 'hiant': ['ahint', 'hiant', 'tahin'], 'hiatal': ['hiatal', 'thalia'], 'hibernate': ['hibernate', 'inbreathe'], 'hic': ['chi', 'hic', 'ich'], 'hickwall': ['hickwall', 'wallhick'], 'hidage': ['adighe', 'hidage'], 'hider': ['dheri', 'hider', 'hired'], 'hidling': ['hidling', 'hilding'], 'hidlings': ['dishling', 'hidlings'], 'hidrotic': ['hidrotic', 'trichoid'], 'hie': ['hei', 'hie'], 'hield': ['delhi', 'hield'], 'hiemal': ['hameil', 'hiemal'], 'hienz': ['heinz', 'hienz'], 'hieron': ['heroin', 'hieron', 'hornie'], 'hieros': ['hieros', 'hosier'], 'hight': ['hight', 'thigh'], 'higuero': ['higuero', 'roughie'], 'hilasmic': ['chiliasm', 'hilasmic', 'machilis'], 'hilding': ['hidling', 'hilding'], 'hillside': ['hillside', 'sidehill'], 'hilsa': ['alish', 'hilsa'], 'hilt': ['hilt', 'lith'], 'hima': ['hami', 'hima', 'mahi'], 'himself': ['flemish', 'himself'], 'hinderest': ['disherent', 'hinderest', 'tenderish'], 'hindu': ['hindu', 'hundi', 'unhid'], 'hing': ['hing', 'nigh'], 'hinge': ['hinge', 'neigh'], 'hingle': ['heling', 'hingle'], 'hint': ['hint', 'thin'], 'hinter': ['hinter', 'nither', 'theirn'], 'hintproof': ['hintproof', 'hoofprint'], 'hintzeite': ['heintzite', 'hintzeite'], 'hip': ['hip', 'phi'], 'hipbone': ['hipbone', 'hopbine'], 'hippodamous': ['amphipodous', 'hippodamous'], 'hippolyte': ['hippolyte', 'typophile'], 'hippus': ['hippus', 'uppish'], 'hiram': ['hiram', 'ihram', 'mahri'], 'hircine': ['hircine', 'rheinic'], 'hire': ['heir', 'hire'], 'hired': ['dheri', 'hider', 'hired'], 'hireless': ['heirless', 'hireless'], 'hireman': ['harmine', 'hireman'], 'hiren': ['hiren', 'rhein', 'rhine'], 'hirmos': ['hirmos', 'romish'], 'hirse': ['hirse', 'shier', 'shire'], 'hirsel': ['hirsel', 'hirsle', 'relish'], 'hirsle': ['hirsel', 'hirsle', 'relish'], 'his': ['his', 'hsi', 'shi'], 'hish': ['hish', 'shih'], 'hisn': ['hisn', 'shin', 'sinh'], 'hispa': ['aphis', 'apish', 'hispa', 'saiph', 'spahi'], 'hispanist': ['hispanist', 'saintship'], 'hiss': ['hiss', 'sish'], 'hist': ['hist', 'sith', 'this', 'tshi'], 'histamine': ['histamine', 'semihiant'], 'histie': ['histie', 'shiite'], 'histioid': ['histioid', 'idiotish'], 'histon': ['histon', 'shinto', 'tonish'], 'histonal': ['histonal', 'toshnail'], 'historic': ['historic', 'orchitis'], 'historics': ['historics', 'trichosis'], 'history': ['history', 'toryish'], 'hittable': ['hittable', 'tithable'], 'hitter': ['hitter', 'tither'], 'hive': ['hevi', 'hive'], 'hives': ['hives', 'shive'], 'hler': ['herl', 'hler', 'lehr'], 'ho': ['ho', 'oh'], 'hoar': ['hoar', 'hora'], 'hoard': ['hoard', 'rhoda'], 'hoarse': ['ahorse', 'ashore', 'hoarse', 'shorea'], 'hoarstone': ['anorthose', 'hoarstone'], 'hoast': ['hoast', 'hosta', 'shoat'], 'hobbism': ['hobbism', 'mobbish'], 'hobo': ['boho', 'hobo'], 'hocco': ['choco', 'hocco'], 'hock': ['hock', 'koch'], 'hocker': ['choker', 'hocker'], 'hocky': ['choky', 'hocky'], 'hocus': ['chous', 'hocus'], 'hodiernal': ['hodiernal', 'rhodaline'], 'hoer': ['hero', 'hoer'], 'hogan': ['ahong', 'hogan'], 'hogget': ['egghot', 'hogget'], 'hogmanay': ['hogmanay', 'mahogany'], 'hognut': ['hognut', 'nought'], 'hogsty': ['ghosty', 'hogsty'], 'hoister': ['hoister', 'rehoist'], 'hoit': ['hoit', 'hoti', 'thio'], 'holard': ['harold', 'holard'], 'holconoti': ['holconoti', 'holotonic'], 'holcus': ['holcus', 'lochus', 'slouch'], 'holdfast': ['fasthold', 'holdfast'], 'holdout': ['holdout', 'outhold'], 'holdup': ['holdup', 'uphold'], 'holeman': ['holeman', 'manhole'], 'holey': ['holey', 'hoyle'], 'holiday': ['holiday', 'hyaloid', 'hyoidal'], 'hollandite': ['hollandite', 'hollantide'], 'hollantide': ['hollandite', 'hollantide'], 'hollower': ['hollower', 'rehollow'], 'holmia': ['holmia', 'maholi'], 'holocentrid': ['holocentrid', 'lechriodont'], 'holohemihedral': ['hemiholohedral', 'holohemihedral'], 'holosteric': ['holosteric', 'thiocresol'], 'holotonic': ['holconoti', 'holotonic'], 'holster': ['holster', 'hostler'], 'homage': ['homage', 'ohmage'], 'homarine': ['homarine', 'homerian'], 'homecroft': ['forthcome', 'homecroft'], 'homeogenous': ['homeogenous', 'homogeneous'], 'homeotypic': ['homeotypic', 'mythopoeic'], 'homeotypical': ['homeotypical', 'polymetochia'], 'homer': ['hermo', 'homer', 'horme'], 'homerian': ['homarine', 'homerian'], 'homeric': ['homeric', 'moriche'], 'homerical': ['chloremia', 'homerical'], 'homerid': ['heirdom', 'homerid'], 'homerist': ['homerist', 'isotherm', 'otherism', 'theorism'], 'homiletics': ['homiletics', 'mesolithic'], 'homo': ['homo', 'moho'], 'homocline': ['chemiloon', 'homocline'], 'homogeneous': ['homeogenous', 'homogeneous'], 'homopolic': ['homopolic', 'lophocomi'], 'homopteran': ['homopteran', 'trophonema'], 'homrai': ['homrai', 'mahori', 'mohair'], 'hondo': ['dhoon', 'hondo'], 'honest': ['ethnos', 'honest'], 'honeypod': ['dyophone', 'honeypod'], 'honeypot': ['eophyton', 'honeypot'], 'honorer': ['honorer', 'rehonor'], 'hontous': ['hontous', 'nothous'], 'hoodman': ['dhamnoo', 'hoodman', 'manhood'], 'hoofprint': ['hintproof', 'hoofprint'], 'hooker': ['hooker', 'rehook'], 'hookweed': ['hookweed', 'weedhook'], 'hoop': ['hoop', 'phoo', 'pooh'], 'hooper': ['hooper', 'rehoop'], 'hoot': ['hoot', 'thoo', 'toho'], 'hop': ['hop', 'pho', 'poh'], 'hopbine': ['hipbone', 'hopbine'], 'hopcalite': ['hopcalite', 'phacolite'], 'hope': ['hope', 'peho'], 'hoped': ['depoh', 'ephod', 'hoped'], 'hoper': ['ephor', 'hoper'], 'hoplite': ['hoplite', 'pithole'], 'hoppergrass': ['grasshopper', 'hoppergrass'], 'hoppers': ['hoppers', 'shopper'], 'hora': ['hoar', 'hora'], 'horal': ['horal', 'lohar'], 'hordarian': ['arianrhod', 'hordarian'], 'horizontal': ['horizontal', 'notorhizal'], 'horme': ['hermo', 'homer', 'horme'], 'horned': ['dehorn', 'horned'], 'hornet': ['hornet', 'nother', 'theron', 'throne'], 'hornie': ['heroin', 'hieron', 'hornie'], 'hornpipe': ['hornpipe', 'porphine'], 'horopteric': ['horopteric', 'rheotropic', 'trichopore'], 'horrent': ['horrent', 'norther'], 'horse': ['horse', 'shoer', 'shore'], 'horsecar': ['cosharer', 'horsecar'], 'horseless': ['horseless', 'shoreless'], 'horseman': ['horseman', 'rhamnose', 'shoreman'], 'horser': ['horser', 'shorer'], 'horsetail': ['horsetail', 'isotheral'], 'horseweed': ['horseweed', 'shoreweed'], 'horsewhip': ['horsewhip', 'whoreship'], 'horsewood': ['horsewood', 'woodhorse'], 'horsing': ['horsing', 'shoring'], 'horst': ['horst', 'short'], 'hortensia': ['hairstone', 'hortensia'], 'hortite': ['hortite', 'orthite', 'thorite'], 'hose': ['hose', 'shoe'], 'hosed': ['hosed', 'shode'], 'hosel': ['hosel', 'sheol', 'shole'], 'hoseless': ['hoseless', 'shoeless'], 'hoseman': ['hoseman', 'shoeman'], 'hosier': ['hieros', 'hosier'], 'hospitaler': ['hospitaler', 'trophesial'], 'host': ['host', 'shot', 'thos', 'tosh'], 'hosta': ['hoast', 'hosta', 'shoat'], 'hostager': ['hostager', 'shortage'], 'hoster': ['hoster', 'tosher'], 'hostile': ['elohist', 'hostile'], 'hosting': ['hosting', 'onsight'], 'hostler': ['holster', 'hostler'], 'hostless': ['hostless', 'shotless'], 'hostly': ['hostly', 'toshly'], 'hot': ['hot', 'tho'], 'hotel': ['helot', 'hotel', 'thole'], 'hotelize': ['helotize', 'hotelize'], 'hotfoot': ['foothot', 'hotfoot'], 'hoti': ['hoit', 'hoti', 'thio'], 'hotter': ['hotter', 'tother'], 'hounce': ['cohune', 'hounce'], 'houseboat': ['boathouse', 'houseboat'], 'housebug': ['bughouse', 'housebug'], 'housecraft': ['fratcheous', 'housecraft'], 'housetop': ['housetop', 'pothouse'], 'housewarm': ['housewarm', 'warmhouse'], 'housewear': ['housewear', 'warehouse'], 'housework': ['housework', 'workhouse'], 'hovering': ['hovering', 'overnigh'], 'how': ['how', 'who'], 'howel': ['howel', 'whole'], 'however': ['everwho', 'however', 'whoever'], 'howlet': ['howlet', 'thowel'], 'howso': ['howso', 'woosh'], 'howsomever': ['howsomever', 'whomsoever', 'whosomever'], 'hoya': ['ahoy', 'hoya'], 'hoyle': ['holey', 'hoyle'], 'hsi': ['his', 'hsi', 'shi'], 'huari': ['huari', 'uriah'], 'hubert': ['hubert', 'turbeh'], 'hud': ['dhu', 'hud'], 'hudsonite': ['hudsonite', 'unhoisted'], 'huer': ['huer', 'hure'], 'hug': ['hug', 'ugh'], 'hughes': ['hughes', 'sheugh'], 'hughoc': ['chough', 'hughoc'], 'hugo': ['hugo', 'ough'], 'hugsome': ['gumshoe', 'hugsome'], 'huk': ['huk', 'khu'], 'hula': ['haul', 'hula'], 'hulsean': ['hulsean', 'unleash'], 'hulster': ['hulster', 'hustler', 'sluther'], 'huma': ['ahum', 'huma'], 'human': ['human', 'nahum'], 'humane': ['humane', 'humean'], 'humanics': ['humanics', 'inasmuch'], 'humean': ['humane', 'humean'], 'humeroradial': ['humeroradial', 'radiohumeral'], 'humic': ['chimu', 'humic'], 'humidor': ['humidor', 'rhodium'], 'humlie': ['helium', 'humlie'], 'humor': ['humor', 'mohur'], 'humoralistic': ['humoralistic', 'humoristical'], 'humoristical': ['humoralistic', 'humoristical'], 'hump': ['hump', 'umph'], 'hundi': ['hindu', 'hundi', 'unhid'], 'hunger': ['hunger', 'rehung'], 'hunterian': ['hunterian', 'ruthenian'], 'hup': ['hup', 'phu'], 'hupa': ['hapu', 'hupa'], 'hurdis': ['hurdis', 'rudish'], 'hurdle': ['hurdle', 'hurled'], 'hure': ['huer', 'hure'], 'hurled': ['hurdle', 'hurled'], 'huron': ['huron', 'rohun'], 'hurst': ['hurst', 'trush'], 'hurt': ['hurt', 'ruth'], 'hurter': ['hurter', 'ruther'], 'hurtful': ['hurtful', 'ruthful'], 'hurtfully': ['hurtfully', 'ruthfully'], 'hurtfulness': ['hurtfulness', 'ruthfulness'], 'hurting': ['hurting', 'ungirth', 'unright'], 'hurtingest': ['hurtingest', 'shuttering'], 'hurtle': ['hurtle', 'luther'], 'hurtless': ['hurtless', 'ruthless'], 'hurtlessly': ['hurtlessly', 'ruthlessly'], 'hurtlessness': ['hurtlessness', 'ruthlessness'], 'husbander': ['husbander', 'shabunder'], 'husked': ['dehusk', 'husked'], 'huso': ['huso', 'shou'], 'huspil': ['huspil', 'pulish'], 'husting': ['gutnish', 'husting', 'unsight'], 'hustle': ['hustle', 'sleuth'], 'hustler': ['hulster', 'hustler', 'sluther'], 'huterian': ['haurient', 'huterian'], 'hwa': ['haw', 'hwa', 'wah', 'wha'], 'hyaloid': ['holiday', 'hyaloid', 'hyoidal'], 'hydra': ['hardy', 'hydra'], 'hydramnios': ['disharmony', 'hydramnios'], 'hydrate': ['hydrate', 'thready'], 'hydrazidine': ['anhydridize', 'hydrazidine'], 'hydrazine': ['anhydrize', 'hydrazine'], 'hydriodate': ['hydriodate', 'iodhydrate'], 'hydriodic': ['hydriodic', 'iodhydric'], 'hydriote': ['hydriote', 'thyreoid'], 'hydrobromate': ['bromohydrate', 'hydrobromate'], 'hydrocarbide': ['carbohydride', 'hydrocarbide'], 'hydrocharis': ['hydrocharis', 'hydrorachis'], 'hydroferricyanic': ['ferrihydrocyanic', 'hydroferricyanic'], 'hydroferrocyanic': ['ferrohydrocyanic', 'hydroferrocyanic'], 'hydrofluoboric': ['borofluohydric', 'hydrofluoboric'], 'hydrogeology': ['geohydrology', 'hydrogeology'], 'hydroiodic': ['hydroiodic', 'iodohydric'], 'hydrometeor': ['heterodromy', 'hydrometeor'], 'hydromotor': ['hydromotor', 'orthodromy'], 'hydronephrosis': ['hydronephrosis', 'nephrohydrosis'], 'hydropneumopericardium': ['hydropneumopericardium', 'pneumohydropericardium'], 'hydropneumothorax': ['hydropneumothorax', 'pneumohydrothorax'], 'hydrorachis': ['hydrocharis', 'hydrorachis'], 'hydrosulphate': ['hydrosulphate', 'sulphohydrate'], 'hydrotical': ['dacryolith', 'hydrotical'], 'hydrous': ['hydrous', 'shroudy'], 'hyetograph': ['ethography', 'hyetograph'], 'hylidae': ['headily', 'hylidae'], 'hylist': ['hylist', 'slithy'], 'hyllus': ['hyllus', 'lushly'], 'hylopathism': ['halophytism', 'hylopathism'], 'hymenic': ['chimney', 'hymenic'], 'hymettic': ['hymettic', 'thymetic'], 'hymnologist': ['hymnologist', 'smoothingly'], 'hyoglossal': ['glossohyal', 'hyoglossal'], 'hyoidal': ['holiday', 'hyaloid', 'hyoidal'], 'hyothyreoid': ['hyothyreoid', 'thyreohyoid'], 'hyothyroid': ['hyothyroid', 'thyrohyoid'], 'hypaethron': ['hypaethron', 'hypothenar'], 'hypercone': ['coryphene', 'hypercone'], 'hypergamous': ['hypergamous', 'museography'], 'hypertoxic': ['hypertoxic', 'xerophytic'], 'hypnobate': ['batyphone', 'hypnobate'], 'hypnoetic': ['hypnoetic', 'neophytic'], 'hypnotic': ['hypnotic', 'phytonic', 'pythonic', 'typhonic'], 'hypnotism': ['hypnotism', 'pythonism'], 'hypnotist': ['hypnotist', 'pythonist'], 'hypnotize': ['hypnotize', 'pythonize'], 'hypnotoid': ['hypnotoid', 'pythonoid'], 'hypobole': ['hypobole', 'lyophobe'], 'hypocarp': ['apocryph', 'hypocarp'], 'hypocrite': ['chirotype', 'hypocrite'], 'hypodorian': ['hypodorian', 'radiophony'], 'hypoglottis': ['hypoglottis', 'phytologist'], 'hypomanic': ['amphicyon', 'hypomanic'], 'hypopteron': ['hypopteron', 'phonotyper'], 'hyporadius': ['hyporadius', 'suprahyoid'], 'hyposcleral': ['hyposcleral', 'phylloceras'], 'hyposmia': ['hyposmia', 'phymosia'], 'hypostomatic': ['hypostomatic', 'somatophytic'], 'hypothec': ['hypothec', 'photechy'], 'hypothenar': ['hypaethron', 'hypothenar'], 'hypothermia': ['hemiatrophy', 'hypothermia'], 'hypsiloid': ['hypsiloid', 'syphiloid'], 'hyracid': ['diarchy', 'hyracid'], 'hyssop': ['hyssop', 'phossy', 'sposhy'], 'hysteresial': ['hysteresial', 'hysteriales'], 'hysteria': ['hysteria', 'sheriyat'], 'hysteriales': ['hysteresial', 'hysteriales'], 'hysterolaparotomy': ['hysterolaparotomy', 'laparohysterotomy'], 'hysteromyomectomy': ['hysteromyomectomy', 'myomohysterectomy'], 'hysteropathy': ['hysteropathy', 'hysterophyta'], 'hysterophyta': ['hysteropathy', 'hysterophyta'], 'iamb': ['iamb', 'mabi'], 'iambelegus': ['elegiambus', 'iambelegus'], 'iambic': ['cimbia', 'iambic'], 'ian': ['ani', 'ian'], 'ianus': ['ianus', 'suina'], 'iatraliptics': ['iatraliptics', 'partialistic'], 'iatric': ['iatric', 'tricia'], 'ibad': ['adib', 'ibad'], 'iban': ['bain', 'bani', 'iban'], 'ibanag': ['bagani', 'bangia', 'ibanag'], 'iberian': ['aribine', 'bairnie', 'iberian'], 'ibo': ['ibo', 'obi'], 'ibota': ['biota', 'ibota'], 'icacorea': ['coraciae', 'icacorea'], 'icarian': ['arician', 'icarian'], 'icecap': ['icecap', 'ipecac'], 'iced': ['dice', 'iced'], 'iceland': ['cladine', 'decalin', 'iceland'], 'icelandic': ['cicindela', 'cinclidae', 'icelandic'], 'iceman': ['anemic', 'cinema', 'iceman'], 'ich': ['chi', 'hic', 'ich'], 'ichnolite': ['ichnolite', 'neolithic'], 'ichor': ['chiro', 'choir', 'ichor'], 'icicle': ['cilice', 'icicle'], 'icon': ['cion', 'coin', 'icon'], 'iconian': ['anionic', 'iconian'], 'iconism': ['iconism', 'imsonic', 'miscoin'], 'iconolater': ['iconolater', 'relocation'], 'iconomania': ['iconomania', 'oniomaniac'], 'iconometrical': ['iconometrical', 'intracoelomic'], 'icteridae': ['diaeretic', 'icteridae'], 'icterine': ['icterine', 'reincite'], 'icterus': ['curtise', 'icterus'], 'ictonyx': ['ictonyx', 'oxyntic'], 'ictus': ['cutis', 'ictus'], 'id': ['di', 'id'], 'ida': ['aid', 'ida'], 'idaean': ['adenia', 'idaean'], 'ide': ['die', 'ide'], 'idea': ['aide', 'idea'], 'ideal': ['adiel', 'delia', 'ideal'], 'idealism': ['idealism', 'lamiides'], 'idealistic': ['disilicate', 'idealistic'], 'ideality': ['aedility', 'ideality'], 'idealness': ['idealness', 'leadiness'], 'idean': ['diane', 'idean'], 'ideation': ['ideation', 'iodinate', 'taenioid'], 'identical': ['ctenidial', 'identical'], 'ideograph': ['eidograph', 'ideograph'], 'ideology': ['eidology', 'ideology'], 'ideoplasty': ['ideoplasty', 'stylopidae'], 'ides': ['desi', 'ides', 'seid', 'side'], 'idiasm': ['idiasm', 'simiad'], 'idioblast': ['diabolist', 'idioblast'], 'idiomology': ['idiomology', 'oligomyoid'], 'idioretinal': ['idioretinal', 'litorinidae'], 'idiotish': ['histioid', 'idiotish'], 'idle': ['idle', 'lide', 'lied'], 'idleman': ['idleman', 'melinda'], 'idleset': ['idleset', 'isleted'], 'idlety': ['idlety', 'lydite', 'tidely', 'tidley'], 'idly': ['idly', 'idyl'], 'idocrase': ['idocrase', 'radicose'], 'idoism': ['idoism', 'iodism'], 'idol': ['dilo', 'diol', 'doli', 'idol', 'olid'], 'idola': ['aloid', 'dolia', 'idola'], 'idolaster': ['estradiol', 'idolaster'], 'idolatry': ['adroitly', 'dilatory', 'idolatry'], 'idolum': ['dolium', 'idolum'], 'idoneal': ['adinole', 'idoneal'], 'idorgan': ['gordian', 'idorgan', 'roading'], 'idose': ['diose', 'idose', 'oside'], 'idotea': ['idotea', 'iodate', 'otidae'], 'idryl': ['idryl', 'lyrid'], 'idyl': ['idly', 'idyl'], 'idyler': ['direly', 'idyler'], 'ierne': ['ernie', 'ierne', 'irene'], 'if': ['fi', 'if'], 'ife': ['fei', 'fie', 'ife'], 'igara': ['agria', 'igara'], 'igdyr': ['igdyr', 'ridgy'], 'igloo': ['igloo', 'logoi'], 'ignatius': ['giustina', 'ignatius'], 'igneoaqueous': ['aqueoigneous', 'igneoaqueous'], 'ignicolist': ['ignicolist', 'soliciting'], 'igniter': ['igniter', 'ringite', 'tigrine'], 'ignitor': ['ignitor', 'rioting'], 'ignoble': ['gobelin', 'gobline', 'ignoble', 'inglobe'], 'ignoramus': ['graminous', 'ignoramus'], 'ignorance': ['enorganic', 'ignorance'], 'ignorant': ['ignorant', 'tongrian'], 'ignore': ['ignore', 'region'], 'ignorement': ['ignorement', 'omnigerent'], 'iguana': ['guiana', 'iguana'], 'ihlat': ['ihlat', 'tahil'], 'ihram': ['hiram', 'ihram', 'mahri'], 'ijma': ['ijma', 'jami'], 'ikat': ['atik', 'ikat'], 'ikona': ['ikona', 'konia'], 'ikra': ['ikra', 'kari', 'raki'], 'ila': ['ail', 'ila', 'lai'], 'ileac': ['alice', 'celia', 'ileac'], 'ileon': ['enoil', 'ileon', 'olein'], 'iliac': ['cilia', 'iliac'], 'iliacus': ['acilius', 'iliacus'], 'ilian': ['ilian', 'inial'], 'ilicaceae': ['caeciliae', 'ilicaceae'], 'ilioischiac': ['ilioischiac', 'ischioiliac'], 'iliosacral': ['iliosacral', 'oscillaria'], 'ilk': ['ilk', 'kil'], 'ilka': ['ilka', 'kail', 'kali'], 'ilkane': ['alkine', 'ilkane', 'inlake', 'inleak'], 'illative': ['illative', 'veiltail'], 'illaudatory': ['illaudatory', 'laudatorily'], 'illeck': ['ellick', 'illeck'], 'illinois': ['illinois', 'illision'], 'illision': ['illinois', 'illision'], 'illium': ['illium', 'lilium'], 'illoricated': ['illoricated', 'lacertiloid'], 'illth': ['illth', 'thill'], 'illude': ['dillue', 'illude'], 'illuder': ['dilluer', 'illuder'], 'illy': ['illy', 'lily', 'yill'], 'ilmenite': ['ilmenite', 'melinite', 'menilite'], 'ilongot': ['ilongot', 'tooling'], 'ilot': ['ilot', 'toil'], 'ilya': ['ilya', 'yali'], 'ima': ['aim', 'ami', 'ima'], 'imager': ['imager', 'maigre', 'margie', 'mirage'], 'imaginant': ['animating', 'imaginant'], 'imaginer': ['imaginer', 'migraine'], 'imagist': ['imagist', 'stigmai'], 'imago': ['amigo', 'imago'], 'imam': ['ammi', 'imam', 'maim', 'mima'], 'imaret': ['imaret', 'metria', 'mirate', 'rimate'], 'imbarge': ['gambier', 'imbarge'], 'imbark': ['bikram', 'imbark'], 'imbat': ['ambit', 'imbat'], 'imbed': ['bedim', 'imbed'], 'imbrue': ['erbium', 'imbrue'], 'imbrute': ['burmite', 'imbrute', 'terbium'], 'imer': ['emir', 'imer', 'mire', 'reim', 'remi', 'riem', 'rime'], 'imerina': ['imerina', 'inermia'], 'imitancy': ['imitancy', 'intimacy', 'minacity'], 'immane': ['ammine', 'immane'], 'immanes': ['amenism', 'immanes', 'misname'], 'immaterials': ['immaterials', 'materialism'], 'immerd': ['dimmer', 'immerd', 'rimmed'], 'immersible': ['immersible', 'semilimber'], 'immersion': ['immersion', 'semiminor'], 'immi': ['immi', 'mimi'], 'imogen': ['geonim', 'imogen'], 'imolinda': ['dominial', 'imolinda', 'limoniad'], 'imp': ['imp', 'pim'], 'impaction': ['impaction', 'ptomainic'], 'impages': ['impages', 'mispage'], 'impaint': ['impaint', 'timpani'], 'impair': ['impair', 'pamiri'], 'impala': ['impala', 'malapi'], 'impaler': ['impaler', 'impearl', 'lempira', 'premial'], 'impalsy': ['impalsy', 'misplay'], 'impane': ['impane', 'pieman'], 'impanel': ['impanel', 'maniple'], 'impar': ['impar', 'pamir', 'prima'], 'imparalleled': ['demiparallel', 'imparalleled'], 'imparl': ['imparl', 'primal'], 'impart': ['armpit', 'impart'], 'imparter': ['imparter', 'reimpart'], 'impartial': ['impartial', 'primatial'], 'impaste': ['impaste', 'pastime'], 'impasture': ['impasture', 'septarium'], 'impeach': ['aphemic', 'impeach'], 'impearl': ['impaler', 'impearl', 'lempira', 'premial'], 'impeder': ['demirep', 'epiderm', 'impeder', 'remiped'], 'impedient': ['impedient', 'mendipite'], 'impenetrable': ['impenetrable', 'intemperable'], 'impenetrably': ['impenetrably', 'intemperably'], 'impenetrate': ['impenetrate', 'intemperate'], 'imperant': ['imperant', 'pairment', 'partimen', 'premiant', 'tripeman'], 'imperate': ['imperate', 'premiate'], 'imperish': ['emirship', 'imperish'], 'imperscriptible': ['imperscriptible', 'imprescriptible'], 'impersonate': ['impersonate', 'proseminate'], 'impersonation': ['impersonation', 'prosemination', 'semipronation'], 'impeticos': ['impeticos', 'poeticism'], 'impetre': ['emptier', 'impetre'], 'impetus': ['impetus', 'upsmite'], 'imphee': ['imphee', 'phemie'], 'implacental': ['capillament', 'implacental'], 'implanter': ['implanter', 'reimplant'], 'implate': ['implate', 'palmite'], 'impleader': ['epidermal', 'impleader', 'premedial'], 'implicate': ['ampelitic', 'implicate'], 'impling': ['impling', 'limping'], 'imply': ['imply', 'limpy', 'pilmy'], 'impollute': ['impollute', 'multipole'], 'imponderous': ['endosporium', 'imponderous'], 'imponent': ['imponent', 'pimenton'], 'importable': ['bitemporal', 'importable'], 'importancy': ['importancy', 'patronymic', 'pyromantic'], 'importer': ['importer', 'promerit', 'reimport'], 'importunance': ['importunance', 'unimportance'], 'importunate': ['importunate', 'permutation'], 'importune': ['entropium', 'importune'], 'imposal': ['imposal', 'spiloma'], 'imposer': ['imposer', 'promise', 'semipro'], 'imposter': ['imposter', 'tripsome'], 'imposure': ['imposure', 'premious'], 'imprecatory': ['cryptomeria', 'imprecatory'], 'impreg': ['gimper', 'impreg'], 'imprescriptible': ['imperscriptible', 'imprescriptible'], 'imprese': ['emprise', 'imprese', 'premise', 'spireme'], 'impress': ['impress', 'persism', 'premiss'], 'impresser': ['impresser', 'reimpress'], 'impressibility': ['impressibility', 'permissibility'], 'impressible': ['impressible', 'permissible'], 'impressibleness': ['impressibleness', 'permissibleness'], 'impressibly': ['impressibly', 'permissibly'], 'impression': ['impression', 'permission'], 'impressionism': ['impressionism', 'misimpression'], 'impressive': ['impressive', 'permissive'], 'impressively': ['impressively', 'permissively'], 'impressiveness': ['impressiveness', 'permissiveness'], 'impressure': ['impressure', 'presurmise'], 'imprinter': ['imprinter', 'reimprint'], 'imprisoner': ['imprisoner', 'reimprison'], 'improcreant': ['improcreant', 'preromantic'], 'impship': ['impship', 'pimpish'], 'impuberal': ['epilabrum', 'impuberal'], 'impugnable': ['impugnable', 'plumbagine'], 'impure': ['impure', 'umpire'], 'impuritan': ['impuritan', 'partinium'], 'imputer': ['imputer', 'trumpie'], 'imsonic': ['iconism', 'imsonic', 'miscoin'], 'in': ['in', 'ni'], 'inaction': ['aconitin', 'inaction', 'nicotian'], 'inactivate': ['inactivate', 'vaticinate'], 'inactivation': ['inactivation', 'vaticination'], 'inactive': ['antivice', 'inactive', 'vineatic'], 'inadept': ['depaint', 'inadept', 'painted', 'patined'], 'inaja': ['inaja', 'jaina'], 'inalimental': ['antimallein', 'inalimental'], 'inamorata': ['amatorian', 'inamorata'], 'inane': ['annie', 'inane'], 'inanga': ['angina', 'inanga'], 'inanimate': ['amanitine', 'inanimate'], 'inanimated': ['diamantine', 'inanimated'], 'inapt': ['inapt', 'paint', 'pinta'], 'inaptly': ['inaptly', 'planity', 'ptyalin'], 'inarch': ['chinar', 'inarch'], 'inarm': ['inarm', 'minar'], 'inasmuch': ['humanics', 'inasmuch'], 'inaurate': ['inaurate', 'ituraean'], 'inbe': ['beni', 'bien', 'bine', 'inbe'], 'inbreak': ['brankie', 'inbreak'], 'inbreathe': ['hibernate', 'inbreathe'], 'inbred': ['binder', 'inbred', 'rebind'], 'inbreed': ['birdeen', 'inbreed'], 'inca': ['cain', 'inca'], 'incaic': ['acinic', 'incaic'], 'incarnate': ['cratinean', 'incarnate', 'nectarian'], 'incase': ['casein', 'incase'], 'incast': ['incast', 'nastic'], 'incensation': ['incensation', 'inscenation'], 'incept': ['incept', 'pectin'], 'inceptor': ['inceptor', 'pretonic'], 'inceration': ['cineration', 'inceration'], 'incessant': ['anticness', 'cantiness', 'incessant'], 'incest': ['encist', 'incest', 'insect', 'scient'], 'inch': ['chin', 'inch'], 'inched': ['chined', 'inched'], 'inchoate': ['inchoate', 'noachite'], 'incide': ['cindie', 'incide'], 'incinerate': ['creatinine', 'incinerate'], 'incisal': ['incisal', 'salicin'], 'incision': ['incision', 'inosinic'], 'incisure': ['incisure', 'sciurine'], 'inciter': ['citrine', 'crinite', 'inciter', 'neritic'], 'inclinatorium': ['anticlinorium', 'inclinatorium'], 'inclosure': ['cornelius', 'inclosure', 'reclusion'], 'include': ['include', 'nuclide'], 'incluse': ['esculin', 'incluse'], 'incog': ['coign', 'incog'], 'incognito': ['cognition', 'incognito'], 'incoherence': ['coinherence', 'incoherence'], 'incoherent': ['coinherent', 'incoherent'], 'incomeless': ['comeliness', 'incomeless'], 'incomer': ['incomer', 'moneric'], 'incomputable': ['incomputable', 'uncompatible'], 'incondite': ['incondite', 'nicotined'], 'inconglomerate': ['inconglomerate', 'nongeometrical'], 'inconsistent': ['inconsistent', 'nonscientist'], 'inconsonant': ['inconsonant', 'nonsanction'], 'incontrovertibility': ['incontrovertibility', 'introconvertibility'], 'incontrovertible': ['incontrovertible', 'introconvertible'], 'incorporate': ['incorporate', 'procreation'], 'incorporated': ['adrenotropic', 'incorporated'], 'incorpse': ['conspire', 'incorpse'], 'incrash': ['archsin', 'incrash'], 'increase': ['cerasein', 'increase'], 'increate': ['aneretic', 'centiare', 'creatine', 'increate', 'iterance'], 'incredited': ['incredited', 'indirected'], 'increep': ['crepine', 'increep'], 'increpate': ['anticreep', 'apenteric', 'increpate'], 'increst': ['cistern', 'increst'], 'incruental': ['incruental', 'unicentral'], 'incrustant': ['incrustant', 'scrutinant'], 'incrustate': ['incrustate', 'scaturient', 'scrutinate'], 'incubate': ['cubanite', 'incubate'], 'incudal': ['dulcian', 'incudal', 'lucanid', 'lucinda'], 'incudomalleal': ['incudomalleal', 'malleoincudal'], 'inculcation': ['anticouncil', 'inculcation'], 'inculture': ['culturine', 'inculture'], 'incuneation': ['enunciation', 'incuneation'], 'incur': ['curin', 'incur', 'runic'], 'incurable': ['binuclear', 'incurable'], 'incus': ['incus', 'usnic'], 'incut': ['cutin', 'incut', 'tunic'], 'ind': ['din', 'ind', 'nid'], 'indaba': ['badian', 'indaba'], 'indagator': ['gradation', 'indagator', 'tanagroid'], 'indan': ['indan', 'nandi'], 'indane': ['aidenn', 'andine', 'dannie', 'indane'], 'inde': ['dine', 'enid', 'inde', 'nide'], 'indebt': ['bident', 'indebt'], 'indebted': ['bidented', 'indebted'], 'indefinitude': ['indefinitude', 'unidentified'], 'indent': ['dentin', 'indent', 'intend', 'tinned'], 'indented': ['indented', 'intended'], 'indentedly': ['indentedly', 'intendedly'], 'indenter': ['indenter', 'intender', 'reintend'], 'indentment': ['indentment', 'intendment'], 'indentured': ['indentured', 'underntide'], 'indentwise': ['disentwine', 'indentwise'], 'indeprivable': ['indeprivable', 'predivinable'], 'indesert': ['indesert', 'inserted', 'resident'], 'indiana': ['anidian', 'indiana'], 'indic': ['dinic', 'indic'], 'indican': ['cnidian', 'indican'], 'indicate': ['diacetin', 'indicate'], 'indicatory': ['dictionary', 'indicatory'], 'indicial': ['anilidic', 'indicial'], 'indicter': ['indicter', 'indirect', 'reindict'], 'indies': ['indies', 'inside'], 'indigena': ['gadinine', 'indigena'], 'indigitate': ['indigitate', 'tingitidae'], 'indign': ['dining', 'indign', 'niding'], 'indigoferous': ['gonidiferous', 'indigoferous'], 'indigotin': ['digitonin', 'indigotin'], 'indirect': ['indicter', 'indirect', 'reindict'], 'indirected': ['incredited', 'indirected'], 'indirectly': ['cylindrite', 'indirectly'], 'indiscreet': ['indiscreet', 'indiscrete', 'iridescent'], 'indiscreetly': ['indiscreetly', 'indiscretely', 'iridescently'], 'indiscrete': ['indiscreet', 'indiscrete', 'iridescent'], 'indiscretely': ['indiscreetly', 'indiscretely', 'iridescently'], 'indissolute': ['delusionist', 'indissolute'], 'indite': ['indite', 'tineid'], 'inditer': ['inditer', 'nitride'], 'indogaean': ['ganoidean', 'indogaean'], 'indole': ['doline', 'indole', 'leonid', 'loined', 'olenid'], 'indolence': ['endocline', 'indolence'], 'indoles': ['indoles', 'sondeli'], 'indologist': ['indologist', 'nidologist'], 'indology': ['indology', 'nidology'], 'indone': ['donnie', 'indone', 'ondine'], 'indoors': ['indoors', 'sordino'], 'indorse': ['indorse', 'ordines', 'siredon', 'sordine'], 'indra': ['darin', 'dinar', 'drain', 'indra', 'nadir', 'ranid'], 'indrawn': ['indrawn', 'winnard'], 'induce': ['induce', 'uniced'], 'inducer': ['inducer', 'uncried'], 'indulge': ['dueling', 'indulge'], 'indulgential': ['dentilingual', 'indulgential', 'linguidental'], 'indulger': ['indulger', 'ungirdle'], 'indument': ['indument', 'unminted'], 'indurable': ['indurable', 'unbrailed', 'unridable'], 'indurate': ['indurate', 'turdinae'], 'induration': ['diurnation', 'induration'], 'indus': ['dinus', 'indus', 'nidus'], 'indusiform': ['disuniform', 'indusiform'], 'induviae': ['induviae', 'viduinae'], 'induvial': ['diluvian', 'induvial'], 'inearth': ['anither', 'inearth', 'naither'], 'inelastic': ['elasticin', 'inelastic', 'sciential'], 'inelegant': ['eglantine', 'inelegant', 'legantine'], 'ineludible': ['ineludible', 'unelidible'], 'inept': ['inept', 'pinte'], 'inequity': ['equinity', 'inequity'], 'inerm': ['inerm', 'miner'], 'inermes': ['ermines', 'inermes'], 'inermia': ['imerina', 'inermia'], 'inermous': ['inermous', 'monsieur'], 'inert': ['inert', 'inter', 'niter', 'retin', 'trine'], 'inertance': ['inertance', 'nectarine'], 'inertial': ['inertial', 'linarite'], 'inertly': ['elytrin', 'inertly', 'trinely'], 'inethical': ['echinital', 'inethical'], 'ineunt': ['ineunt', 'untine'], 'inez': ['inez', 'zein'], 'inface': ['fiance', 'inface'], 'infame': ['famine', 'infame'], 'infamy': ['infamy', 'manify'], 'infarct': ['frantic', 'infarct', 'infract'], 'infarction': ['infarction', 'infraction'], 'infaust': ['faunist', 'fustian', 'infaust'], 'infecter': ['frenetic', 'infecter', 'reinfect'], 'infeed': ['define', 'infeed'], 'infelt': ['finlet', 'infelt'], 'infer': ['finer', 'infer'], 'inferable': ['inferable', 'refinable'], 'infern': ['finner', 'infern'], 'inferoanterior': ['anteroinferior', 'inferoanterior'], 'inferoposterior': ['inferoposterior', 'posteroinferior'], 'infestation': ['festination', 'infestation', 'sinfonietta'], 'infester': ['infester', 'reinfest'], 'infidel': ['infidel', 'infield'], 'infield': ['infidel', 'infield'], 'inflame': ['feminal', 'inflame'], 'inflamed': ['fieldman', 'inflamed'], 'inflamer': ['inflamer', 'rifleman'], 'inflatus': ['inflatus', 'stainful'], 'inflicter': ['inflicter', 'reinflict'], 'inform': ['formin', 'inform'], 'informal': ['formalin', 'informal', 'laniform'], 'informer': ['informer', 'reinform', 'reniform'], 'infra': ['infra', 'irfan'], 'infract': ['frantic', 'infarct', 'infract'], 'infraction': ['infarction', 'infraction'], 'infringe': ['infringe', 'refining'], 'ing': ['gin', 'ing', 'nig'], 'inga': ['gain', 'inga', 'naig', 'ngai'], 'ingaevones': ['avignonese', 'ingaevones'], 'ingate': ['eating', 'ingate', 'tangie'], 'ingather': ['hearting', 'ingather'], 'ingenue': ['genuine', 'ingenue'], 'ingenuous': ['ingenuous', 'unigenous'], 'inger': ['grein', 'inger', 'nigre', 'regin', 'reign', 'ringe'], 'ingest': ['ingest', 'signet', 'stinge'], 'ingesta': ['easting', 'gainset', 'genista', 'ingesta', 'seating', 'signate', 'teasing'], 'ingle': ['ingle', 'ligne', 'linge', 'nigel'], 'inglobe': ['gobelin', 'gobline', 'ignoble', 'inglobe'], 'ingomar': ['ingomar', 'moringa', 'roaming'], 'ingram': ['arming', 'ingram', 'margin'], 'ingrate': ['angrite', 'granite', 'ingrate', 'tangier', 'tearing', 'tigrean'], 'ingrow': ['ingrow', 'rowing'], 'ingrowth': ['ingrowth', 'throwing'], 'inguinal': ['inguinal', 'unailing'], 'inguinocrural': ['cruroinguinal', 'inguinocrural'], 'inhabiter': ['inhabiter', 'reinhabit'], 'inhaler': ['hernial', 'inhaler'], 'inhauler': ['herulian', 'inhauler'], 'inhaust': ['auntish', 'inhaust'], 'inhere': ['herein', 'inhere'], 'inhumer': ['inhumer', 'rhenium'], 'inial': ['ilian', 'inial'], 'ink': ['ink', 'kin'], 'inkle': ['inkle', 'liken'], 'inkless': ['inkless', 'kinless'], 'inkling': ['inkling', 'linking'], 'inknot': ['inknot', 'tonkin'], 'inkra': ['inkra', 'krina', 'nakir', 'rinka'], 'inks': ['inks', 'sink', 'skin'], 'inlaid': ['anilid', 'dialin', 'dianil', 'inlaid'], 'inlake': ['alkine', 'ilkane', 'inlake', 'inleak'], 'inlaut': ['inlaut', 'unital'], 'inlaw': ['inlaw', 'liwan'], 'inlay': ['inlay', 'naily'], 'inlayer': ['inlayer', 'nailery'], 'inleak': ['alkine', 'ilkane', 'inlake', 'inleak'], 'inlet': ['inlet', 'linet'], 'inlook': ['inlook', 'koilon'], 'inly': ['inly', 'liny'], 'inmate': ['etamin', 'inmate', 'taimen', 'tamein'], 'inmeats': ['atenism', 'inmeats', 'insteam', 'samnite'], 'inmost': ['inmost', 'monist', 'omnist'], 'innate': ['annite', 'innate', 'tinean'], 'innative': ['innative', 'invinate'], 'innatural': ['innatural', 'triannual'], 'inner': ['inner', 'renin'], 'innerve': ['innerve', 'nervine', 'vernine'], 'innest': ['innest', 'sennit', 'sinnet', 'tennis'], 'innet': ['innet', 'tinne'], 'innominata': ['antinomian', 'innominata'], 'innovate': ['innovate', 'venation'], 'innovationist': ['innovationist', 'nonvisitation'], 'ino': ['ino', 'ion'], 'inobtainable': ['inobtainable', 'nonbilabiate'], 'inocarpus': ['inocarpus', 'unprosaic'], 'inoculant': ['continual', 'inoculant', 'unctional'], 'inocystoma': ['actomyosin', 'inocystoma'], 'inodes': ['deinos', 'donsie', 'inodes', 'onside'], 'inogen': ['genion', 'inogen'], 'inoma': ['amino', 'inoma', 'naomi', 'omani', 'omina'], 'inomyxoma': ['inomyxoma', 'myxoinoma'], 'inone': ['inone', 'oenin'], 'inoperculata': ['inoperculata', 'precautional'], 'inorb': ['biron', 'inorb', 'robin'], 'inorganic': ['conringia', 'inorganic'], 'inorganical': ['carolingian', 'inorganical'], 'inornate': ['anointer', 'inornate', 'nonirate', 'reanoint'], 'inosic': ['inosic', 'sinico'], 'inosinic': ['incision', 'inosinic'], 'inosite': ['inosite', 'sionite'], 'inphase': ['inphase', 'phineas'], 'inpush': ['inpush', 'punish', 'unship'], 'input': ['input', 'punti'], 'inquiet': ['inquiet', 'quinite'], 'inreality': ['inreality', 'linearity'], 'inro': ['inro', 'iron', 'noir', 'nori'], 'inroad': ['dorian', 'inroad', 'ordain'], 'inroader': ['inroader', 'ordainer', 'reordain'], 'inrub': ['bruin', 'burin', 'inrub'], 'inrun': ['inrun', 'inurn'], 'insane': ['insane', 'sienna'], 'insatiably': ['insatiably', 'sanability'], 'inscenation': ['incensation', 'inscenation'], 'inscient': ['inscient', 'nicenist'], 'insculp': ['insculp', 'sculpin'], 'insea': ['anise', 'insea', 'siena', 'sinae'], 'inseam': ['asimen', 'inseam', 'mesian'], 'insect': ['encist', 'incest', 'insect', 'scient'], 'insectan': ['insectan', 'instance'], 'insectile': ['insectile', 'selenitic'], 'insectivora': ['insectivora', 'visceration'], 'insecure': ['insecure', 'sinecure'], 'insee': ['insee', 'seine'], 'inseer': ['inseer', 'nereis', 'seiner', 'serine', 'sirene'], 'insert': ['estrin', 'insert', 'sinter', 'sterin', 'triens'], 'inserted': ['indesert', 'inserted', 'resident'], 'inserter': ['inserter', 'reinsert'], 'insessor': ['insessor', 'rosiness'], 'inset': ['inset', 'neist', 'snite', 'stein', 'stine', 'tsine'], 'insetter': ['insetter', 'interest', 'interset', 'sternite'], 'inshave': ['evanish', 'inshave'], 'inshoot': ['inshoot', 'insooth'], 'inside': ['indies', 'inside'], 'insider': ['insider', 'siderin'], 'insistent': ['insistent', 'tintiness'], 'insister': ['insister', 'reinsist', 'sinister', 'sisterin'], 'insole': ['insole', 'leonis', 'lesion', 'selion'], 'insomnia': ['insomnia', 'simonian'], 'insomniac': ['aniconism', 'insomniac'], 'insooth': ['inshoot', 'insooth'], 'insorb': ['insorb', 'sorbin'], 'insoul': ['insoul', 'linous', 'nilous', 'unsoil'], 'inspection': ['cispontine', 'inspection'], 'inspiriter': ['inspiriter', 'reinspirit'], 'inspissate': ['antisepsis', 'inspissate'], 'inspreith': ['inspreith', 'nephritis', 'phrenitis'], 'installer': ['installer', 'reinstall'], 'instance': ['insectan', 'instance'], 'instanter': ['instanter', 'transient'], 'instar': ['instar', 'santir', 'strain'], 'instate': ['atenist', 'instate', 'satient', 'steatin'], 'instead': ['destain', 'instead', 'sainted', 'satined'], 'insteam': ['atenism', 'inmeats', 'insteam', 'samnite'], 'instep': ['instep', 'spinet'], 'instiller': ['instiller', 'reinstill'], 'instructer': ['instructer', 'intercrust', 'reinstruct'], 'instructional': ['instructional', 'nonaltruistic'], 'insula': ['insula', 'lanius', 'lusian'], 'insulant': ['insulant', 'sultanin'], 'insulse': ['insulse', 'silenus'], 'insult': ['insult', 'sunlit', 'unlist', 'unslit'], 'insulter': ['insulter', 'lustrine', 'reinsult'], 'insunk': ['insunk', 'unskin'], 'insurable': ['insurable', 'sublinear'], 'insurance': ['insurance', 'nuisancer'], 'insurant': ['insurant', 'unstrain'], 'insure': ['insure', 'rusine', 'ursine'], 'insurge': ['insurge', 'resuing'], 'insurgent': ['insurgent', 'unresting'], 'intactile': ['catlinite', 'intactile'], 'intaglio': ['intaglio', 'ligation'], 'intake': ['intake', 'kentia'], 'intaker': ['intaker', 'katrine', 'keratin'], 'intarsia': ['antiaris', 'intarsia'], 'intarsiate': ['intarsiate', 'nestiatria'], 'integral': ['integral', 'teraglin', 'triangle'], 'integralize': ['gelatinizer', 'integralize'], 'integrate': ['argentite', 'integrate'], 'integrative': ['integrative', 'vertiginate', 'vinaigrette'], 'integrious': ['grisounite', 'grisoutine', 'integrious'], 'intemperable': ['impenetrable', 'intemperable'], 'intemperably': ['impenetrably', 'intemperably'], 'intemperate': ['impenetrate', 'intemperate'], 'intemporal': ['intemporal', 'trampoline'], 'intend': ['dentin', 'indent', 'intend', 'tinned'], 'intended': ['indented', 'intended'], 'intendedly': ['indentedly', 'intendedly'], 'intender': ['indenter', 'intender', 'reintend'], 'intendment': ['indentment', 'intendment'], 'intense': ['intense', 'sennite'], 'intent': ['intent', 'tinnet'], 'intently': ['intently', 'nitently'], 'inter': ['inert', 'inter', 'niter', 'retin', 'trine'], 'interactional': ['interactional', 'intercalation'], 'interagent': ['entreating', 'interagent'], 'interally': ['interally', 'reliantly'], 'interastral': ['interastral', 'intertarsal'], 'intercalation': ['interactional', 'intercalation'], 'intercale': ['intercale', 'interlace', 'lacertine', 'reclinate'], 'intercede': ['intercede', 'tridecene'], 'interceder': ['crednerite', 'interceder'], 'intercession': ['intercession', 'recensionist'], 'intercome': ['entomeric', 'intercome', 'morencite'], 'interconal': ['interconal', 'nonrecital'], 'intercrust': ['instructer', 'intercrust', 'reinstruct'], 'interdome': ['interdome', 'mordenite', 'nemertoid'], 'intereat': ['intereat', 'tinetare'], 'interest': ['insetter', 'interest', 'interset', 'sternite'], 'interester': ['interester', 'reinterest'], 'interfering': ['interfering', 'interfinger'], 'interfinger': ['interfering', 'interfinger'], 'intergrade': ['gradienter', 'intergrade'], 'interim': ['interim', 'termini'], 'interimistic': ['interimistic', 'trimesitinic'], 'interlace': ['intercale', 'interlace', 'lacertine', 'reclinate'], 'interlaced': ['credential', 'interlaced', 'reclinated'], 'interlaid': ['deliriant', 'draintile', 'interlaid'], 'interlap': ['interlap', 'repliant', 'triplane'], 'interlapse': ['alpestrine', 'episternal', 'interlapse', 'presential'], 'interlay': ['interlay', 'lyterian'], 'interleaf': ['interleaf', 'reinflate'], 'interleaver': ['interleaver', 'reverential'], 'interlocal': ['citronella', 'interlocal'], 'interlope': ['interlope', 'interpole', 'repletion', 'terpineol'], 'interlot': ['interlot', 'trotline'], 'intermat': ['intermat', 'martinet', 'tetramin'], 'intermatch': ['intermatch', 'thermantic'], 'intermine': ['intermine', 'nemertini', 'terminine'], 'intermorainic': ['intermorainic', 'recrimination'], 'intermutual': ['intermutual', 'ultraminute'], 'intern': ['intern', 'tinner'], 'internality': ['internality', 'itinerantly'], 'internecive': ['internecive', 'reincentive'], 'internee': ['internee', 'retinene'], 'interoceptor': ['interoceptor', 'reprotection'], 'interpause': ['interpause', 'resupinate'], 'interpave': ['interpave', 'prenative'], 'interpeal': ['interpeal', 'interplea'], 'interpellate': ['interpellate', 'pantellerite'], 'interpellation': ['interpellation', 'interpollinate'], 'interphone': ['interphone', 'pinnothere'], 'interplay': ['interplay', 'painterly'], 'interplea': ['interpeal', 'interplea'], 'interplead': ['interplead', 'peridental'], 'interpolar': ['interpolar', 'reniportal'], 'interpolate': ['interpolate', 'triantelope'], 'interpole': ['interlope', 'interpole', 'repletion', 'terpineol'], 'interpollinate': ['interpellation', 'interpollinate'], 'interpone': ['interpone', 'peritenon', 'pinnotere', 'preintone'], 'interposal': ['interposal', 'psalterion'], 'interposure': ['interposure', 'neuropteris'], 'interpreter': ['interpreter', 'reinterpret'], 'interproduce': ['interproduce', 'prereduction'], 'interroom': ['interroom', 'remontoir'], 'interrupter': ['interrupter', 'reinterrupt'], 'intersale': ['intersale', 'larsenite'], 'intersectional': ['intersectional', 'intraselection'], 'interset': ['insetter', 'interest', 'interset', 'sternite'], 'intershade': ['dishearten', 'intershade'], 'intersituate': ['intersituate', 'tenuistriate'], 'intersocial': ['intersocial', 'orleanistic', 'sclerotinia'], 'interspace': ['esperantic', 'interspace'], 'interspecific': ['interspecific', 'prescientific'], 'interspiration': ['interspiration', 'repristination'], 'intersporal': ['intersporal', 'tripersonal'], 'interstation': ['interstation', 'strontianite'], 'intertalk': ['intertalk', 'latterkin'], 'intertarsal': ['interastral', 'intertarsal'], 'interteam': ['antimeter', 'attermine', 'interteam', 'terminate', 'tetramine'], 'intertie': ['intertie', 'retinite'], 'intertone': ['intertone', 'retention'], 'intervascular': ['intervascular', 'vernacularist'], 'intervention': ['intervention', 'introvenient'], 'interverbal': ['interverbal', 'invertebral'], 'interviewer': ['interviewer', 'reinterview'], 'interwed': ['interwed', 'wintered'], 'interwish': ['interwish', 'winterish'], 'interwork': ['interwork', 'tinworker'], 'interwove': ['interwove', 'overtwine'], 'intestate': ['enstatite', 'intestate', 'satinette'], 'intestinovesical': ['intestinovesical', 'vesicointestinal'], 'inthrong': ['inthrong', 'northing'], 'intima': ['intima', 'timani'], 'intimacy': ['imitancy', 'intimacy', 'minacity'], 'intimater': ['intimater', 'traintime'], 'into': ['into', 'nito', 'oint', 'tino'], 'intoed': ['ditone', 'intoed'], 'intolerance': ['crenelation', 'intolerance'], 'intolerating': ['intolerating', 'nitrogelatin'], 'intonate': ['intonate', 'totanine'], 'intonator': ['intonator', 'tortonian'], 'intone': ['intone', 'tenino'], 'intonement': ['intonement', 'omnitenent'], 'intoner': ['intoner', 'ternion'], 'intort': ['intort', 'tornit', 'triton'], 'intoxicate': ['excitation', 'intoxicate'], 'intracoelomic': ['iconometrical', 'intracoelomic'], 'intracosmic': ['intracosmic', 'narcoticism'], 'intracostal': ['intracostal', 'stratonical'], 'intractile': ['intractile', 'triclinate'], 'intrada': ['intrada', 'radiant'], 'intraselection': ['intersectional', 'intraselection'], 'intraseptal': ['intraseptal', 'paternalist', 'prenatalist'], 'intraspinal': ['intraspinal', 'pinnitarsal'], 'intreat': ['intreat', 'iterant', 'nitrate', 'tertian'], 'intrencher': ['intrencher', 'reintrench'], 'intricate': ['intricate', 'triactine'], 'intrication': ['citrination', 'intrication'], 'intrigue': ['intrigue', 'tigurine'], 'introconvertibility': ['incontrovertibility', 'introconvertibility'], 'introconvertible': ['incontrovertible', 'introconvertible'], 'introduce': ['introduce', 'reduction'], 'introit': ['introit', 'nitriot'], 'introitus': ['introitus', 'routinist'], 'introvenient': ['intervention', 'introvenient'], 'intrude': ['intrude', 'turdine', 'untired', 'untried'], 'intruse': ['intruse', 'sturine'], 'intrust': ['intrust', 'sturtin'], 'intube': ['butein', 'butine', 'intube'], 'intue': ['intue', 'unite', 'untie'], 'inula': ['inula', 'luian', 'uinal'], 'inurbane': ['eburnian', 'inurbane'], 'inure': ['inure', 'urine'], 'inured': ['diurne', 'inured', 'ruined', 'unride'], 'inurn': ['inrun', 'inurn'], 'inustion': ['inustion', 'unionist'], 'invader': ['invader', 'ravined', 'viander'], 'invaluable': ['invaluable', 'unvailable'], 'invar': ['invar', 'ravin', 'vanir'], 'invector': ['contrive', 'invector'], 'inveigler': ['inveigler', 'relieving'], 'inventer': ['inventer', 'reinvent', 'ventrine', 'vintener'], 'inventress': ['inventress', 'vintneress'], 'inverness': ['inverness', 'nerviness'], 'inversatile': ['inversatile', 'serviential'], 'inverse': ['inverse', 'versine'], 'invert': ['invert', 'virent'], 'invertase': ['invertase', 'servetian'], 'invertebral': ['interverbal', 'invertebral'], 'inverter': ['inverter', 'reinvert', 'trinerve'], 'investigation': ['investigation', 'tenovaginitis'], 'invinate': ['innative', 'invinate'], 'inviter': ['inviter', 'vitrine'], 'invocate': ['conative', 'invocate'], 'invoker': ['invoker', 'overink'], 'involucrate': ['countervail', 'involucrate'], 'involucre': ['involucre', 'volucrine'], 'inwards': ['inwards', 'sinward'], 'inwith': ['inwith', 'within'], 'iodate': ['idotea', 'iodate', 'otidae'], 'iodhydrate': ['hydriodate', 'iodhydrate'], 'iodhydric': ['hydriodic', 'iodhydric'], 'iodinate': ['ideation', 'iodinate', 'taenioid'], 'iodinium': ['iodinium', 'ionidium'], 'iodism': ['idoism', 'iodism'], 'iodite': ['iodite', 'teioid'], 'iodo': ['iodo', 'ooid'], 'iodocasein': ['iodocasein', 'oniscoidea'], 'iodochloride': ['chloroiodide', 'iodochloride'], 'iodohydric': ['hydroiodic', 'iodohydric'], 'iodol': ['dooli', 'iodol'], 'iodothyrin': ['iodothyrin', 'thyroiodin'], 'iodous': ['iodous', 'odious'], 'ion': ['ino', 'ion'], 'ionidium': ['iodinium', 'ionidium'], 'ionizer': ['ionizer', 'ironize'], 'iota': ['iota', 'tiao'], 'iotacist': ['iotacist', 'taoistic'], 'ipecac': ['icecap', 'ipecac'], 'ipil': ['ipil', 'pili'], 'ipseand': ['ipseand', 'panside', 'pansied'], 'ira': ['air', 'ira', 'ria'], 'iracund': ['candiru', 'iracund'], 'irade': ['aider', 'deair', 'irade', 'redia'], 'iran': ['arni', 'iran', 'nair', 'rain', 'rani'], 'irani': ['irani', 'irian'], 'iranism': ['iranism', 'sirmian'], 'iranist': ['iranist', 'istrian'], 'irascent': ['canister', 'cestrian', 'cisterna', 'irascent'], 'irate': ['arite', 'artie', 'irate', 'retia', 'tarie'], 'irately': ['irately', 'reality'], 'ire': ['ire', 'rie'], 'irena': ['erian', 'irena', 'reina'], 'irene': ['ernie', 'ierne', 'irene'], 'irenic': ['irenic', 'ricine'], 'irenics': ['irenics', 'resinic', 'sericin', 'sirenic'], 'irenicum': ['irenicum', 'muricine'], 'iresine': ['iresine', 'iserine'], 'irfan': ['infra', 'irfan'], 'irgun': ['irgun', 'ruing', 'unrig'], 'irian': ['irani', 'irian'], 'iridal': ['iridal', 'lariid'], 'iridate': ['arietid', 'iridate'], 'iridectomy': ['iridectomy', 'mediocrity'], 'irides': ['irides', 'irised'], 'iridescent': ['indiscreet', 'indiscrete', 'iridescent'], 'iridescently': ['indiscreetly', 'indiscretely', 'iridescently'], 'iridosmium': ['iridosmium', 'osmiridium'], 'irised': ['irides', 'irised'], 'irish': ['irish', 'rishi', 'sirih'], 'irk': ['irk', 'rik'], 'irma': ['amir', 'irma', 'mari', 'mira', 'rami', 'rima'], 'iroha': ['haori', 'iroha'], 'irok': ['irok', 'kori'], 'iron': ['inro', 'iron', 'noir', 'nori'], 'ironclad': ['ironclad', 'rolandic'], 'irone': ['irone', 'norie'], 'ironhead': ['herodian', 'ironhead'], 'ironice': ['ironice', 'oneiric'], 'ironize': ['ionizer', 'ironize'], 'ironshod': ['dishonor', 'ironshod'], 'ironside': ['derision', 'ironside', 'resinoid', 'sirenoid'], 'irradiant': ['irradiant', 'triandria'], 'irrationable': ['irrationable', 'orbitelarian'], 'irredenta': ['irredenta', 'retainder'], 'irrelate': ['irrelate', 'retailer'], 'irrepentance': ['irrepentance', 'pretercanine'], 'irving': ['irving', 'riving', 'virgin'], 'irvingiana': ['irvingiana', 'viraginian'], 'is': ['is', 'si'], 'isabel': ['isabel', 'lesbia'], 'isabella': ['isabella', 'sailable'], 'isagogical': ['isagogical', 'sialagogic'], 'isagon': ['gosain', 'isagon', 'sagoin'], 'isander': ['andries', 'isander', 'sardine'], 'isanthous': ['anhistous', 'isanthous'], 'isatate': ['isatate', 'satiate', 'taetsia'], 'isatic': ['isatic', 'saitic'], 'isatin': ['antisi', 'isatin'], 'isatinic': ['isatinic', 'sinaitic'], 'isaurian': ['anisuria', 'isaurian'], 'isawa': ['isawa', 'waasi'], 'isba': ['absi', 'bais', 'bias', 'isba'], 'iscariot': ['aoristic', 'iscariot'], 'ischemia': ['hemiasci', 'ischemia'], 'ischioiliac': ['ilioischiac', 'ischioiliac'], 'ischiorectal': ['ischiorectal', 'sciotherical'], 'iserine': ['iresine', 'iserine'], 'iseum': ['iseum', 'musie'], 'isiac': ['ascii', 'isiac'], 'isidore': ['isidore', 'osiride'], 'isis': ['isis', 'sisi'], 'islam': ['islam', 'ismal', 'simal'], 'islamic': ['islamic', 'laicism', 'silicam'], 'islamitic': ['islamitic', 'italicism'], 'islandy': ['islandy', 'lindsay'], 'islay': ['islay', 'saily'], 'isle': ['isle', 'lise', 'sile'], 'islet': ['islet', 'istle', 'slite', 'stile'], 'isleta': ['isleta', 'litsea', 'salite', 'stelai'], 'isleted': ['idleset', 'isleted'], 'ism': ['ism', 'sim'], 'ismal': ['islam', 'ismal', 'simal'], 'ismatic': ['ismatic', 'itacism'], 'ismatical': ['ismatical', 'lamaistic'], 'isocamphor': ['chromopsia', 'isocamphor'], 'isoclinal': ['collinsia', 'isoclinal'], 'isocline': ['isocline', 'silicone'], 'isocoumarin': ['acrimonious', 'isocoumarin'], 'isodulcite': ['isodulcite', 'solicitude'], 'isogen': ['geison', 'isogen'], 'isogeotherm': ['geoisotherm', 'isogeotherm'], 'isogon': ['isogon', 'songoi'], 'isogram': ['isogram', 'orgiasm'], 'isohel': ['helios', 'isohel'], 'isoheptane': ['apothesine', 'isoheptane'], 'isolate': ['aeolist', 'isolate'], 'isolated': ['diastole', 'isolated', 'sodalite', 'solidate'], 'isolative': ['isolative', 'soliative'], 'isolde': ['isolde', 'soiled'], 'isomer': ['isomer', 'rimose'], 'isometric': ['eroticism', 'isometric', 'meroistic', 'trioecism'], 'isomorph': ['isomorph', 'moorship'], 'isonitrile': ['isonitrile', 'resilition'], 'isonym': ['isonym', 'myosin', 'simony'], 'isophthalyl': ['isophthalyl', 'lithophysal'], 'isopodan': ['anisopod', 'isopodan'], 'isoptera': ['isoptera', 'septoria'], 'isosaccharic': ['isosaccharic', 'sacroischiac'], 'isostere': ['erotesis', 'isostere'], 'isotac': ['isotac', 'scotia'], 'isotheral': ['horsetail', 'isotheral'], 'isotherm': ['homerist', 'isotherm', 'otherism', 'theorism'], 'isotria': ['isotria', 'oaritis'], 'isotron': ['isotron', 'torsion'], 'isotrope': ['isotrope', 'portoise'], 'isotropism': ['isotropism', 'promitosis'], 'isotropy': ['isotropy', 'porosity'], 'israel': ['israel', 'relais', 'resail', 'sailer', 'serail', 'serial'], 'israeli': ['alisier', 'israeli'], 'israelite': ['israelite', 'resiliate'], 'issuable': ['basileus', 'issuable', 'suasible'], 'issuant': ['issuant', 'sustain'], 'issue': ['issue', 'susie'], 'issuer': ['issuer', 'uresis'], 'ist': ['ist', 'its', 'sit'], 'isthmi': ['isthmi', 'timish'], 'isthmian': ['isthmian', 'smithian'], 'isthmoid': ['isthmoid', 'thomisid'], 'istle': ['islet', 'istle', 'slite', 'stile'], 'istrian': ['iranist', 'istrian'], 'isuret': ['isuret', 'resuit'], 'it': ['it', 'ti'], 'ita': ['ait', 'ati', 'ita', 'tai'], 'itacism': ['ismatic', 'itacism'], 'itaconate': ['acetation', 'itaconate'], 'itaconic': ['aconitic', 'cationic', 'itaconic'], 'itali': ['itali', 'tilia'], 'italian': ['antilia', 'italian'], 'italic': ['clitia', 'italic'], 'italicism': ['islamitic', 'italicism'], 'italite': ['italite', 'letitia', 'tilaite'], 'italon': ['italon', 'lation', 'talion'], 'itaves': ['itaves', 'stevia'], 'itch': ['chit', 'itch', 'tchi'], 'item': ['emit', 'item', 'mite', 'time'], 'iten': ['iten', 'neti', 'tien', 'tine'], 'itenean': ['aniente', 'itenean'], 'iter': ['iter', 'reit', 'rite', 'teri', 'tier', 'tire'], 'iterable': ['iterable', 'liberate'], 'iterance': ['aneretic', 'centiare', 'creatine', 'increate', 'iterance'], 'iterant': ['intreat', 'iterant', 'nitrate', 'tertian'], 'ithaca': ['cahita', 'ithaca'], 'ithacan': ['ithacan', 'tachina'], 'ither': ['ither', 'their'], 'itinerant': ['itinerant', 'nitratine'], 'itinerantly': ['internality', 'itinerantly'], 'itmo': ['itmo', 'moit', 'omit', 'timo'], 'ito': ['ito', 'toi'], 'itoism': ['itoism', 'omitis'], 'itoist': ['itoist', 'otitis'], 'itoland': ['itoland', 'talonid', 'tindalo'], 'itonama': ['amniota', 'itonama'], 'itonia': ['aition', 'itonia'], 'its': ['ist', 'its', 'sit'], 'itself': ['itself', 'stifle'], 'ituraean': ['inaurate', 'ituraean'], 'itza': ['itza', 'tiza', 'zati'], 'iva': ['iva', 'vai', 'via'], 'ivan': ['ivan', 'vain', 'vina'], 'ivorist': ['ivorist', 'visitor'], 'iwaiwa': ['iwaiwa', 'waiwai'], 'ixiama': ['amixia', 'ixiama'], 'ixodic': ['ixodic', 'oxidic'], 'iyo': ['iyo', 'yoi'], 'izar': ['izar', 'zira'], 'jacami': ['jacami', 'jicama'], 'jacobian': ['bajocian', 'jacobian'], 'jag': ['gaj', 'jag'], 'jagir': ['jagir', 'jirga'], 'jagua': ['ajuga', 'jagua'], 'jail': ['jail', 'lija'], 'jailer': ['jailer', 'rejail'], 'jaime': ['jaime', 'jamie'], 'jain': ['jain', 'jina'], 'jaina': ['inaja', 'jaina'], 'jalouse': ['jalouse', 'jealous'], 'jama': ['jama', 'maja'], 'jamesian': ['jamesian', 'jamesina'], 'jamesina': ['jamesian', 'jamesina'], 'jami': ['ijma', 'jami'], 'jamie': ['jaime', 'jamie'], 'jane': ['jane', 'jean'], 'janos': ['janos', 'jason', 'jonas', 'sonja'], 'jantu': ['jantu', 'jaunt', 'junta'], 'januslike': ['januslike', 'seljukian'], 'japonism': ['japonism', 'pajonism'], 'jar': ['jar', 'raj'], 'jara': ['ajar', 'jara', 'raja'], 'jarmo': ['jarmo', 'major'], 'jarnut': ['jarnut', 'jurant'], 'jason': ['janos', 'jason', 'jonas', 'sonja'], 'jat': ['jat', 'taj'], 'jatki': ['jatki', 'tajik'], 'jato': ['jato', 'jota'], 'jaun': ['jaun', 'juan'], 'jaunt': ['jantu', 'jaunt', 'junta'], 'jaup': ['jaup', 'puja'], 'jealous': ['jalouse', 'jealous'], 'jean': ['jane', 'jean'], 'jebusitical': ['jebusitical', 'justiciable'], 'jecoral': ['cajoler', 'jecoral'], 'jeffery': ['jeffery', 'jeffrey'], 'jeffrey': ['jeffery', 'jeffrey'], 'jejunoduodenal': ['duodenojejunal', 'jejunoduodenal'], 'jenine': ['jenine', 'jennie'], 'jennie': ['jenine', 'jennie'], 'jerker': ['jerker', 'rejerk'], 'jerkin': ['jerkin', 'jinker'], 'jeziah': ['hejazi', 'jeziah'], 'jicama': ['jacami', 'jicama'], 'jihad': ['hadji', 'jihad'], 'jina': ['jain', 'jina'], 'jingoist': ['jingoist', 'joisting'], 'jinker': ['jerkin', 'jinker'], 'jirga': ['jagir', 'jirga'], 'jobo': ['bojo', 'jobo'], 'johan': ['johan', 'jonah'], 'join': ['join', 'joni'], 'joinant': ['joinant', 'jotnian'], 'joiner': ['joiner', 'rejoin'], 'jointless': ['jointless', 'joltiness'], 'joisting': ['jingoist', 'joisting'], 'jolter': ['jolter', 'rejolt'], 'joltiness': ['jointless', 'joltiness'], 'jonah': ['johan', 'jonah'], 'jonas': ['janos', 'jason', 'jonas', 'sonja'], 'joni': ['join', 'joni'], 'joom': ['joom', 'mojo'], 'joshi': ['joshi', 'shoji'], 'jota': ['jato', 'jota'], 'jotnian': ['joinant', 'jotnian'], 'journeyer': ['journeyer', 'rejourney'], 'joust': ['joust', 'justo'], 'juan': ['jaun', 'juan'], 'judaic': ['judaic', 'judica'], 'judica': ['judaic', 'judica'], 'jujitsu': ['jujitsu', 'jujuist'], 'jujuist': ['jujitsu', 'jujuist'], 'junta': ['jantu', 'jaunt', 'junta'], 'jurant': ['jarnut', 'jurant'], 'justiciable': ['jebusitical', 'justiciable'], 'justo': ['joust', 'justo'], 'jute': ['jute', 'teju'], 'ka': ['ak', 'ka'], 'kabel': ['blake', 'bleak', 'kabel'], 'kaberu': ['kaberu', 'kubera'], 'kabuli': ['kabuli', 'kiluba'], 'kabyle': ['bleaky', 'kabyle'], 'kachari': ['chakari', 'chikara', 'kachari'], 'kachin': ['hackin', 'kachin'], 'kafir': ['fakir', 'fraik', 'kafir', 'rafik'], 'kaha': ['akha', 'kaha'], 'kahar': ['harka', 'kahar'], 'kahu': ['haku', 'kahu'], 'kaid': ['dika', 'kaid'], 'kaik': ['kaik', 'kaki'], 'kail': ['ilka', 'kail', 'kali'], 'kainga': ['kainga', 'kanagi'], 'kaiwi': ['kaiwi', 'kiwai'], 'kaka': ['akka', 'kaka'], 'kaki': ['kaik', 'kaki'], 'kala': ['akal', 'kala'], 'kalamian': ['kalamian', 'malikana'], 'kaldani': ['danakil', 'dankali', 'kaldani', 'ladakin'], 'kale': ['kale', 'lake', 'leak'], 'kali': ['ilka', 'kail', 'kali'], 'kalo': ['kalo', 'kola', 'loka'], 'kamansi': ['kamansi', 'kamasin'], 'kamares': ['kamares', 'seamark'], 'kamasin': ['kamansi', 'kamasin'], 'kame': ['kame', 'make', 'meak'], 'kamel': ['kamel', 'kemal'], 'kamiya': ['kamiya', 'yakima'], 'kan': ['kan', 'nak'], 'kana': ['akan', 'kana'], 'kanagi': ['kainga', 'kanagi'], 'kanap': ['kanap', 'panak'], 'kanat': ['kanat', 'tanak', 'tanka'], 'kande': ['kande', 'knead', 'naked'], 'kang': ['kang', 'knag'], 'kanga': ['angka', 'kanga'], 'kangani': ['kangani', 'kiangan'], 'kangli': ['kangli', 'laking'], 'kanred': ['darken', 'kanred', 'ranked'], 'kans': ['kans', 'sank'], 'kaolin': ['ankoli', 'kaolin'], 'karch': ['chark', 'karch'], 'karel': ['karel', 'laker'], 'karen': ['anker', 'karen', 'naker'], 'kari': ['ikra', 'kari', 'raki'], 'karite': ['arkite', 'karite'], 'karl': ['karl', 'kral', 'lark'], 'karling': ['karling', 'larking'], 'karma': ['karma', 'krama', 'marka'], 'karo': ['karo', 'kora', 'okra', 'roka'], 'karree': ['karree', 'rerake'], 'karst': ['karst', 'skart', 'stark'], 'karstenite': ['karstenite', 'kersantite'], 'kartel': ['kartel', 'retalk', 'talker'], 'kasa': ['asak', 'kasa', 'saka'], 'kasbah': ['abkhas', 'kasbah'], 'kasha': ['kasha', 'khasa', 'sakha', 'shaka'], 'kashan': ['kashan', 'sankha'], 'kasher': ['kasher', 'shaker'], 'kashi': ['kashi', 'khasi'], 'kasm': ['kasm', 'mask'], 'katar': ['katar', 'takar'], 'kate': ['kate', 'keta', 'take', 'teak'], 'kath': ['kath', 'khat'], 'katharsis': ['katharsis', 'shastraik'], 'katie': ['katie', 'keita'], 'katik': ['katik', 'tikka'], 'katrine': ['intaker', 'katrine', 'keratin'], 'katy': ['katy', 'kyat', 'taky'], 'kavass': ['kavass', 'vakass'], 'kavi': ['kavi', 'kiva'], 'kay': ['kay', 'yak'], 'kayak': ['kayak', 'yakka'], 'kayan': ['kayan', 'yakan'], 'kayo': ['kayo', 'oaky'], 'kea': ['ake', 'kea'], 'keach': ['cheka', 'keach'], 'keawe': ['aweek', 'keawe'], 'kechel': ['heckle', 'kechel'], 'kedar': ['daker', 'drake', 'kedar', 'radek'], 'kee': ['eke', 'kee'], 'keech': ['cheek', 'cheke', 'keech'], 'keel': ['keel', 'kele', 'leek'], 'keen': ['keen', 'knee'], 'keena': ['aknee', 'ankee', 'keena'], 'keep': ['keep', 'peek'], 'keepership': ['keepership', 'shipkeeper'], 'kees': ['kees', 'seek', 'skee'], 'keest': ['keest', 'skeet', 'skete', 'steek'], 'kefir': ['frike', 'kefir'], 'keid': ['dike', 'keid'], 'keita': ['katie', 'keita'], 'keith': ['keith', 'kithe'], 'keitloa': ['keitloa', 'oatlike'], 'kelchin': ['chinkle', 'kelchin'], 'kele': ['keel', 'kele', 'leek'], 'kelima': ['kelima', 'mikael'], 'kelpie': ['kelpie', 'pelike'], 'kelty': ['kelty', 'ketyl'], 'kemal': ['kamel', 'kemal'], 'kemalist': ['kemalist', 'mastlike'], 'kenareh': ['hearken', 'kenareh'], 'kennel': ['kennel', 'nelken'], 'kenotic': ['kenotic', 'ketonic'], 'kent': ['kent', 'knet'], 'kentia': ['intake', 'kentia'], 'kenton': ['kenton', 'nekton'], 'kepi': ['kepi', 'kipe', 'pike'], 'keralite': ['keralite', 'tearlike'], 'kerasin': ['kerasin', 'sarkine'], 'kerat': ['kerat', 'taker'], 'keratin': ['intaker', 'katrine', 'keratin'], 'keratoangioma': ['angiokeratoma', 'keratoangioma'], 'keratosis': ['asterikos', 'keratosis'], 'keres': ['esker', 'keres', 'reesk', 'seker', 'skeer', 'skere'], 'keresan': ['keresan', 'sneaker'], 'kerewa': ['kerewa', 'rewake'], 'kerf': ['ferk', 'kerf'], 'kern': ['kern', 'renk'], 'kersantite': ['karstenite', 'kersantite'], 'kersey': ['kersey', 'skeery'], 'kestrel': ['kestrel', 'skelter'], 'keta': ['kate', 'keta', 'take', 'teak'], 'ketene': ['ektene', 'ketene'], 'keto': ['keto', 'oket', 'toke'], 'ketol': ['ketol', 'loket'], 'ketonic': ['kenotic', 'ketonic'], 'ketu': ['ketu', 'teuk', 'tuke'], 'ketupa': ['ketupa', 'uptake'], 'ketyl': ['kelty', 'ketyl'], 'keup': ['keup', 'puke'], 'keuper': ['keuper', 'peruke'], 'kevan': ['kevan', 'knave'], 'kha': ['hak', 'kha'], 'khami': ['hakim', 'khami'], 'khan': ['ankh', 'hank', 'khan'], 'khar': ['hark', 'khar', 'rakh'], 'khasa': ['kasha', 'khasa', 'sakha', 'shaka'], 'khasi': ['kashi', 'khasi'], 'khat': ['kath', 'khat'], 'khatib': ['bhakti', 'khatib'], 'khila': ['khila', 'kilah'], 'khu': ['huk', 'khu'], 'khula': ['khula', 'kulah'], 'kiangan': ['kangani', 'kiangan'], 'kibe': ['bike', 'kibe'], 'kicker': ['kicker', 'rekick'], 'kickout': ['kickout', 'outkick'], 'kidney': ['dinkey', 'kidney'], 'kids': ['disk', 'kids', 'skid'], 'kiel': ['kiel', 'like'], 'kier': ['erik', 'kier', 'reki'], 'kiku': ['kiku', 'kuki'], 'kikumon': ['kikumon', 'kokumin'], 'kil': ['ilk', 'kil'], 'kilah': ['khila', 'kilah'], 'kiliare': ['airlike', 'kiliare'], 'killcalf': ['calfkill', 'killcalf'], 'killer': ['killer', 'rekill'], 'kiln': ['kiln', 'link'], 'kilnman': ['kilnman', 'linkman'], 'kilo': ['kilo', 'koil', 'koli'], 'kilp': ['kilp', 'klip'], 'kilter': ['kilter', 'kirtle'], 'kilting': ['kilting', 'kitling'], 'kiluba': ['kabuli', 'kiluba'], 'kimberlite': ['kimberlite', 'timberlike'], 'kimnel': ['kimnel', 'milken'], 'kin': ['ink', 'kin'], 'kina': ['akin', 'kina', 'naik'], 'kinase': ['kinase', 'sekani'], 'kinch': ['chink', 'kinch'], 'kind': ['dink', 'kind'], 'kindle': ['kindle', 'linked'], 'kinetomer': ['kinetomer', 'konimeter'], 'king': ['gink', 'king'], 'kingcob': ['bocking', 'kingcob'], 'kingpin': ['kingpin', 'pinking'], 'kingrow': ['kingrow', 'working'], 'kinless': ['inkless', 'kinless'], 'kinship': ['kinship', 'pinkish'], 'kioko': ['kioko', 'kokio'], 'kip': ['kip', 'pik'], 'kipe': ['kepi', 'kipe', 'pike'], 'kirk': ['kirk', 'rikk'], 'kirktown': ['kirktown', 'knitwork'], 'kirn': ['kirn', 'rink'], 'kirsten': ['kirsten', 'kristen', 'stinker'], 'kirsty': ['kirsty', 'skirty'], 'kirtle': ['kilter', 'kirtle'], 'kirve': ['kirve', 'kiver'], 'kish': ['kish', 'shik', 'sikh'], 'kishen': ['kishen', 'neskhi'], 'kisra': ['kisra', 'sikar', 'skair'], 'kissar': ['kissar', 'krasis'], 'kisser': ['kisser', 'rekiss'], 'kist': ['kist', 'skit'], 'kistful': ['kistful', 'lutfisk'], 'kitab': ['batik', 'kitab'], 'kitan': ['kitan', 'takin'], 'kitar': ['kitar', 'krait', 'rakit', 'traik'], 'kitchen': ['kitchen', 'thicken'], 'kitchener': ['kitchener', 'rethicken', 'thickener'], 'kithe': ['keith', 'kithe'], 'kitling': ['kilting', 'kitling'], 'kitlope': ['kitlope', 'potlike', 'toplike'], 'kittel': ['kittel', 'kittle'], 'kittle': ['kittel', 'kittle'], 'kittles': ['kittles', 'skittle'], 'kiva': ['kavi', 'kiva'], 'kiver': ['kirve', 'kiver'], 'kiwai': ['kaiwi', 'kiwai'], 'klan': ['klan', 'lank'], 'klanism': ['klanism', 'silkman'], 'klaus': ['klaus', 'lukas', 'sulka'], 'kleistian': ['kleistian', 'saintlike', 'satinlike'], 'klendusic': ['klendusic', 'unsickled'], 'kling': ['glink', 'kling'], 'klip': ['kilp', 'klip'], 'klop': ['klop', 'polk'], 'knab': ['bank', 'knab', 'nabk'], 'knag': ['kang', 'knag'], 'knap': ['knap', 'pank'], 'knape': ['knape', 'pekan'], 'knar': ['knar', 'kran', 'nark', 'rank'], 'knave': ['kevan', 'knave'], 'knawel': ['knawel', 'wankle'], 'knead': ['kande', 'knead', 'naked'], 'knee': ['keen', 'knee'], 'knet': ['kent', 'knet'], 'knit': ['knit', 'tink'], 'knitter': ['knitter', 'trinket'], 'knitwork': ['kirktown', 'knitwork'], 'knob': ['bonk', 'knob'], 'knot': ['knot', 'tonk'], 'knottiness': ['knottiness', 'stinkstone'], 'knower': ['knower', 'reknow', 'wroken'], 'knub': ['bunk', 'knub'], 'knurly': ['knurly', 'runkly'], 'knut': ['knut', 'tunk'], 'knute': ['knute', 'unket'], 'ko': ['ko', 'ok'], 'koa': ['ako', 'koa', 'oak', 'oka'], 'koali': ['koali', 'koila'], 'kobu': ['bouk', 'kobu'], 'koch': ['hock', 'koch'], 'kochia': ['choiak', 'kochia'], 'koel': ['koel', 'loke'], 'koi': ['koi', 'oki'], 'koil': ['kilo', 'koil', 'koli'], 'koila': ['koali', 'koila'], 'koilon': ['inlook', 'koilon'], 'kokan': ['kokan', 'konak'], 'kokio': ['kioko', 'kokio'], 'kokumin': ['kikumon', 'kokumin'], 'kola': ['kalo', 'kola', 'loka'], 'koli': ['kilo', 'koil', 'koli'], 'kolo': ['kolo', 'look'], 'kome': ['kome', 'moke'], 'komi': ['komi', 'moki'], 'kona': ['kona', 'nako'], 'konak': ['kokan', 'konak'], 'kongo': ['kongo', 'ngoko'], 'kongoni': ['kongoni', 'nooking'], 'konia': ['ikona', 'konia'], 'konimeter': ['kinetomer', 'konimeter'], 'kor': ['kor', 'rok'], 'kora': ['karo', 'kora', 'okra', 'roka'], 'korait': ['korait', 'troika'], 'koran': ['koran', 'krona'], 'korana': ['anorak', 'korana'], 'kore': ['kore', 'roke'], 'korec': ['coker', 'corke', 'korec'], 'korero': ['korero', 'rooker'], 'kori': ['irok', 'kori'], 'korimako': ['korimako', 'koromika'], 'koromika': ['korimako', 'koromika'], 'korwa': ['awork', 'korwa'], 'kory': ['kory', 'roky', 'york'], 'kos': ['kos', 'sok'], 'koso': ['koso', 'skoo', 'sook'], 'kotar': ['kotar', 'tarok'], 'koto': ['koto', 'toko', 'took'], 'kra': ['ark', 'kra'], 'krait': ['kitar', 'krait', 'rakit', 'traik'], 'kraken': ['kraken', 'nekkar'], 'kral': ['karl', 'kral', 'lark'], 'krama': ['karma', 'krama', 'marka'], 'kran': ['knar', 'kran', 'nark', 'rank'], 'kras': ['askr', 'kras', 'sark'], 'krasis': ['kissar', 'krasis'], 'kraut': ['kraut', 'tukra'], 'kreis': ['kreis', 'skier'], 'kreistle': ['kreistle', 'triskele'], 'krepi': ['krepi', 'piker'], 'krina': ['inkra', 'krina', 'nakir', 'rinka'], 'kris': ['kris', 'risk'], 'krishna': ['krishna', 'rankish'], 'kristen': ['kirsten', 'kristen', 'stinker'], 'krona': ['koran', 'krona'], 'krone': ['ekron', 'krone'], 'kroo': ['kroo', 'rook'], 'krosa': ['krosa', 'oskar'], 'kua': ['aku', 'auk', 'kua'], 'kuar': ['kuar', 'raku', 'rauk'], 'kuba': ['baku', 'kuba'], 'kubera': ['kaberu', 'kubera'], 'kuki': ['kiku', 'kuki'], 'kulah': ['khula', 'kulah'], 'kulimit': ['kulimit', 'tilikum'], 'kulm': ['kulm', 'mulk'], 'kuman': ['kuman', 'naumk'], 'kumhar': ['kumhar', 'kumrah'], 'kumrah': ['kumhar', 'kumrah'], 'kunai': ['kunai', 'nikau'], 'kuneste': ['kuneste', 'netsuke'], 'kung': ['gunk', 'kung'], 'kurmi': ['kurmi', 'mukri'], 'kurt': ['kurt', 'turk'], 'kurus': ['kurus', 'ursuk'], 'kusa': ['kusa', 'skua'], 'kusam': ['kusam', 'sumak'], 'kusan': ['ankus', 'kusan'], 'kusha': ['kusha', 'shaku', 'ushak'], 'kutchin': ['kutchin', 'unthick'], 'kutenai': ['kutenai', 'unakite'], 'kyar': ['kyar', 'yark'], 'kyat': ['katy', 'kyat', 'taky'], 'kyle': ['kyle', 'yelk'], 'kylo': ['kylo', 'yolk'], 'kyte': ['kyte', 'tyke'], 'la': ['al', 'la'], 'laager': ['aglare', 'alegar', 'galera', 'laager'], 'laang': ['laang', 'lagan', 'lagna'], 'lab': ['alb', 'bal', 'lab'], 'laban': ['alban', 'balan', 'banal', 'laban', 'nabal', 'nabla'], 'labber': ['barbel', 'labber', 'rabble'], 'labefact': ['factable', 'labefact'], 'label': ['bella', 'label'], 'labeler': ['labeler', 'relabel'], 'labia': ['balai', 'labia'], 'labial': ['abilla', 'labial'], 'labially': ['alliably', 'labially'], 'labiate': ['baalite', 'bialate', 'labiate'], 'labiella': ['alliable', 'labiella'], 'labile': ['alible', 'belial', 'labile', 'liable'], 'labiocervical': ['cervicolabial', 'labiocervical'], 'labiodental': ['dentolabial', 'labiodental'], 'labioglossal': ['glossolabial', 'labioglossal'], 'labioglossolaryngeal': ['glossolabiolaryngeal', 'labioglossolaryngeal'], 'labioglossopharyngeal': ['glossolabiopharyngeal', 'labioglossopharyngeal'], 'labiomental': ['labiomental', 'mentolabial'], 'labionasal': ['labionasal', 'nasolabial'], 'labiovelar': ['bialveolar', 'labiovelar'], 'labis': ['basil', 'labis'], 'labor': ['balor', 'bolar', 'boral', 'labor', 'lobar'], 'laborant': ['balatron', 'laborant'], 'laborism': ['laborism', 'mislabor'], 'laborist': ['laborist', 'strobila'], 'laborite': ['betailor', 'laborite', 'orbitale'], 'labrador': ['labrador', 'larboard'], 'labret': ['albert', 'balter', 'labret', 'tabler'], 'labridae': ['labridae', 'radiable'], 'labrose': ['borlase', 'labrose', 'rosabel'], 'labrum': ['brumal', 'labrum', 'lumbar', 'umbral'], 'labrus': ['bursal', 'labrus'], 'laburnum': ['alburnum', 'laburnum'], 'lac': ['cal', 'lac'], 'lace': ['acle', 'alec', 'lace'], 'laced': ['clead', 'decal', 'laced'], 'laceman': ['laceman', 'manacle'], 'lacepod': ['lacepod', 'pedocal', 'placode'], 'lacer': ['ceral', 'clare', 'clear', 'lacer'], 'lacerable': ['clearable', 'lacerable'], 'lacerate': ['lacerate', 'lacertae'], 'laceration': ['creational', 'crotalinae', 'laceration', 'reactional'], 'lacerative': ['calaverite', 'lacerative'], 'lacertae': ['lacerate', 'lacertae'], 'lacertian': ['carnalite', 'claretian', 'lacertian', 'nectarial'], 'lacertid': ['articled', 'lacertid'], 'lacertidae': ['dilacerate', 'lacertidae'], 'lacertiloid': ['illoricated', 'lacertiloid'], 'lacertine': ['intercale', 'interlace', 'lacertine', 'reclinate'], 'lacertoid': ['dialector', 'lacertoid'], 'lacery': ['clayer', 'lacery'], 'lacet': ['cleat', 'eclat', 'ectal', 'lacet', 'tecla'], 'lache': ['chela', 'lache', 'leach'], 'laches': ['cashel', 'laches', 'sealch'], 'lachrymonasal': ['lachrymonasal', 'nasolachrymal'], 'lachsa': ['calash', 'lachsa'], 'laciness': ['laciness', 'sensical'], 'lacing': ['anglic', 'lacing'], 'lacinia': ['lacinia', 'licania'], 'laciniated': ['acetanilid', 'laciniated', 'teniacidal'], 'lacis': ['lacis', 'salic'], 'lack': ['calk', 'lack'], 'lacker': ['calker', 'lacker', 'rackle', 'recalk', 'reckla'], 'lacmoid': ['domical', 'lacmoid'], 'laconic': ['conical', 'laconic'], 'laconica': ['canicola', 'laconica'], 'laconizer': ['laconizer', 'locarnize'], 'lacquer': ['claquer', 'lacquer'], 'lacquerer': ['lacquerer', 'relacquer'], 'lactarene': ['lactarene', 'nectareal'], 'lactarious': ['alacritous', 'lactarious', 'lactosuria'], 'lactarium': ['lactarium', 'matricula'], 'lactarius': ['australic', 'lactarius'], 'lacteal': ['catella', 'lacteal'], 'lacteous': ['lacteous', 'osculate'], 'lactide': ['citadel', 'deltaic', 'dialect', 'edictal', 'lactide'], 'lactinate': ['cantalite', 'lactinate', 'tetanical'], 'lacto': ['lacto', 'tlaco'], 'lactoid': ['cotidal', 'lactoid', 'talcoid'], 'lactoprotein': ['lactoprotein', 'protectional'], 'lactose': ['alecost', 'lactose', 'scotale', 'talcose'], 'lactoside': ['dislocate', 'lactoside'], 'lactosuria': ['alacritous', 'lactarious', 'lactosuria'], 'lacunal': ['calluna', 'lacunal'], 'lacune': ['auncel', 'cuneal', 'lacune', 'launce', 'unlace'], 'lacustral': ['claustral', 'lacustral'], 'lacwork': ['lacwork', 'warlock'], 'lacy': ['acyl', 'clay', 'lacy'], 'lad': ['dal', 'lad'], 'ladakin': ['danakil', 'dankali', 'kaldani', 'ladakin'], 'ladanum': ['ladanum', 'udalman'], 'ladder': ['ladder', 'raddle'], 'laddery': ['dreadly', 'laddery'], 'laddie': ['daidle', 'laddie'], 'lade': ['dale', 'deal', 'lade', 'lead', 'leda'], 'lademan': ['daleman', 'lademan', 'leadman'], 'laden': ['eland', 'laden', 'lenad'], 'lader': ['alder', 'daler', 'lader'], 'ladies': ['aisled', 'deasil', 'ladies', 'sailed'], 'ladin': ['danli', 'ladin', 'linda', 'nidal'], 'lading': ['angild', 'lading'], 'ladino': ['dolina', 'ladino'], 'ladle': ['dalle', 'della', 'ladle'], 'ladrone': ['endoral', 'ladrone', 'leonard'], 'ladyfy': ['dayfly', 'ladyfy'], 'ladyish': ['ladyish', 'shadily'], 'ladyling': ['dallying', 'ladyling'], 'laet': ['atle', 'laet', 'late', 'leat', 'tael', 'tale', 'teal'], 'laeti': ['alite', 'laeti'], 'laetic': ['calite', 'laetic', 'tecali'], 'lafite': ['fetial', 'filate', 'lafite', 'leafit'], 'lag': ['gal', 'lag'], 'lagan': ['laang', 'lagan', 'lagna'], 'lagen': ['agnel', 'angel', 'angle', 'galen', 'genal', 'glean', 'lagen'], 'lagena': ['alnage', 'angela', 'galena', 'lagena'], 'lagend': ['angled', 'dangle', 'englad', 'lagend'], 'lager': ['argel', 'ergal', 'garle', 'glare', 'lager', 'large', 'regal'], 'lagetto': ['lagetto', 'tagetol'], 'lagged': ['daggle', 'lagged'], 'laggen': ['laggen', 'naggle'], 'lagger': ['gargle', 'gregal', 'lagger', 'raggle'], 'lagna': ['laang', 'lagan', 'lagna'], 'lagniappe': ['appealing', 'lagniappe', 'panplegia'], 'lagonite': ['gelation', 'lagonite', 'legation'], 'lagunero': ['lagunero', 'organule', 'uroglena'], 'lagurus': ['argulus', 'lagurus'], 'lai': ['ail', 'ila', 'lai'], 'laicism': ['islamic', 'laicism', 'silicam'], 'laid': ['dail', 'dali', 'dial', 'laid', 'lida'], 'lain': ['alin', 'anil', 'lain', 'lina', 'nail'], 'laine': ['alien', 'aline', 'anile', 'elain', 'elian', 'laine', 'linea'], 'laiose': ['aeolis', 'laiose'], 'lair': ['aril', 'lair', 'lari', 'liar', 'lira', 'rail', 'rial'], 'lairage': ['lairage', 'railage', 'regalia'], 'laird': ['drail', 'laird', 'larid', 'liard'], 'lairless': ['lairless', 'railless'], 'lairman': ['lairman', 'laminar', 'malarin', 'railman'], 'lairstone': ['lairstone', 'orleanist', 'serotinal'], 'lairy': ['lairy', 'riyal'], 'laitance': ['analcite', 'anticlea', 'laitance'], 'laity': ['laity', 'taily'], 'lak': ['alk', 'lak'], 'lake': ['kale', 'lake', 'leak'], 'lakeless': ['lakeless', 'leakless'], 'laker': ['karel', 'laker'], 'lakie': ['alike', 'lakie'], 'laking': ['kangli', 'laking'], 'lakish': ['lakish', 'shakil'], 'lakota': ['atokal', 'lakota'], 'laky': ['alky', 'laky'], 'lalo': ['lalo', 'lola', 'olla'], 'lalopathy': ['allopathy', 'lalopathy'], 'lam': ['lam', 'mal'], 'lama': ['alma', 'amla', 'lama', 'mala'], 'lamaic': ['amical', 'camail', 'lamaic'], 'lamaism': ['lamaism', 'miasmal'], 'lamaist': ['lamaist', 'lamista'], 'lamaistic': ['ismatical', 'lamaistic'], 'lamanite': ['lamanite', 'laminate'], 'lamany': ['amylan', 'lamany', 'layman'], 'lamb': ['balm', 'lamb'], 'lambaste': ['blastema', 'lambaste'], 'lambent': ['beltman', 'lambent'], 'lamber': ['ambler', 'blamer', 'lamber', 'marble', 'ramble'], 'lambie': ['bemail', 'lambie'], 'lambiness': ['balminess', 'lambiness'], 'lamblike': ['balmlike', 'lamblike'], 'lamby': ['balmy', 'lamby'], 'lame': ['alem', 'alme', 'lame', 'leam', 'male', 'meal', 'mela'], 'lamella': ['lamella', 'malella', 'malleal'], 'lamellose': ['lamellose', 'semolella'], 'lamely': ['lamely', 'mellay'], 'lameness': ['lameness', 'maleness', 'maneless', 'nameless'], 'lament': ['lament', 'manlet', 'mantel', 'mantle', 'mental'], 'lamenter': ['lamenter', 'relament', 'remantle'], 'lamenting': ['alignment', 'lamenting'], 'lameter': ['lameter', 'metaler', 'remetal'], 'lamia': ['alima', 'lamia'], 'lamiger': ['gremial', 'lamiger'], 'lamiides': ['idealism', 'lamiides'], 'lamin': ['lamin', 'liman', 'milan'], 'lamina': ['almain', 'animal', 'lamina', 'manila'], 'laminae': ['laminae', 'melania'], 'laminar': ['lairman', 'laminar', 'malarin', 'railman'], 'laminarin': ['laminarin', 'linamarin'], 'laminarite': ['laminarite', 'terminalia'], 'laminate': ['lamanite', 'laminate'], 'laminated': ['almandite', 'laminated'], 'lamination': ['antimonial', 'lamination'], 'laminboard': ['laminboard', 'lombardian'], 'laminectomy': ['laminectomy', 'metonymical'], 'laminose': ['laminose', 'lemonias', 'semolina'], 'lamish': ['lamish', 'shimal'], 'lamista': ['lamaist', 'lamista'], 'lamiter': ['lamiter', 'marlite'], 'lammer': ['lammer', 'rammel'], 'lammy': ['lammy', 'malmy'], 'lamna': ['alman', 'lamna', 'manal'], 'lamnid': ['lamnid', 'mandil'], 'lamnidae': ['aldamine', 'lamnidae'], 'lamp': ['lamp', 'palm'], 'lampad': ['lampad', 'palmad'], 'lampas': ['lampas', 'plasma'], 'lamper': ['lamper', 'palmer', 'relamp'], 'lampers': ['lampers', 'sampler'], 'lampful': ['lampful', 'palmful'], 'lampist': ['lampist', 'palmist'], 'lampistry': ['lampistry', 'palmistry'], 'lampoon': ['lampoon', 'pomonal'], 'lamprey': ['lamprey', 'palmery'], 'lampyridae': ['lampyridae', 'pyramidale'], 'lamus': ['lamus', 'malus', 'musal', 'slaum'], 'lamut': ['lamut', 'tamul'], 'lan': ['aln', 'lan'], 'lana': ['alan', 'anal', 'lana'], 'lanas': ['alans', 'lanas', 'nasal'], 'lanate': ['anteal', 'lanate', 'teanal'], 'lancaster': ['ancestral', 'lancaster'], 'lancasterian': ['alcantarines', 'lancasterian'], 'lance': ['canel', 'clean', 'lance', 'lenca'], 'lanced': ['calden', 'candle', 'lanced'], 'lancely': ['cleanly', 'lancely'], 'lanceolar': ['lanceolar', 'olecranal'], 'lancer': ['lancer', 'rancel'], 'lances': ['lances', 'senlac'], 'lancet': ['cantle', 'cental', 'lancet', 'tancel'], 'lanceteer': ['crenelate', 'lanceteer'], 'lancinate': ['cantilena', 'lancinate'], 'landbook': ['bookland', 'landbook'], 'landed': ['dandle', 'landed'], 'lander': ['aldern', 'darnel', 'enlard', 'lander', 'lenard', 'randle', 'reland'], 'landfast': ['fastland', 'landfast'], 'landgrave': ['grandeval', 'landgrave'], 'landimere': ['landimere', 'madrilene'], 'landing': ['danglin', 'landing'], 'landlubber': ['landlubber', 'lubberland'], 'landreeve': ['landreeve', 'reeveland'], 'landstorm': ['landstorm', 'transmold'], 'landwash': ['landwash', 'washland'], 'lane': ['alen', 'lane', 'lean', 'lena', 'nael', 'neal'], 'lanete': ['elanet', 'lanete', 'lateen'], 'laney': ['laney', 'layne'], 'langhian': ['hangnail', 'langhian'], 'langi': ['algin', 'align', 'langi', 'liang', 'linga'], 'langite': ['atingle', 'gelatin', 'genital', 'langite', 'telinga'], 'lango': ['along', 'gonal', 'lango', 'longa', 'nogal'], 'langobard': ['bandarlog', 'langobard'], 'language': ['ganguela', 'language'], 'laniate': ['laniate', 'natalie', 'taenial'], 'lanific': ['finical', 'lanific'], 'laniform': ['formalin', 'informal', 'laniform'], 'laniidae': ['aedilian', 'laniidae'], 'lanista': ['lanista', 'santali'], 'lanius': ['insula', 'lanius', 'lusian'], 'lank': ['klan', 'lank'], 'lanket': ['anklet', 'lanket', 'tankle'], 'lanner': ['lanner', 'rannel'], 'lansat': ['aslant', 'lansat', 'natals', 'santal'], 'lanseh': ['halsen', 'hansel', 'lanseh'], 'lantaca': ['cantala', 'catalan', 'lantaca'], 'lanum': ['lanum', 'manul'], 'lao': ['alo', 'lao', 'loa'], 'laodicean': ['caledonia', 'laodicean'], 'laotian': ['ailanto', 'alation', 'laotian', 'notalia'], 'lap': ['alp', 'lap', 'pal'], 'laparohysterotomy': ['hysterolaparotomy', 'laparohysterotomy'], 'laparosplenotomy': ['laparosplenotomy', 'splenolaparotomy'], 'lapidarist': ['lapidarist', 'triapsidal'], 'lapidate': ['lapidate', 'talpidae'], 'lapideon': ['lapideon', 'palinode', 'pedalion'], 'lapidose': ['episodal', 'lapidose', 'sepaloid'], 'lapith': ['lapith', 'tilpah'], 'lapon': ['lapon', 'nopal'], 'lapp': ['lapp', 'palp', 'plap'], 'lappa': ['lappa', 'papal'], 'lapped': ['dapple', 'lapped', 'palped'], 'lapper': ['lapper', 'rappel'], 'lappish': ['lappish', 'shiplap'], 'lapsation': ['apolistan', 'lapsation'], 'lapse': ['elaps', 'lapse', 'lepas', 'pales', 'salep', 'saple', 'sepal', 'slape', 'spale', 'speal'], 'lapsi': ['alisp', 'lapsi'], 'lapsing': ['lapsing', 'sapling'], 'lapstone': ['lapstone', 'pleonast'], 'larboard': ['labrador', 'larboard'], 'larcenic': ['calciner', 'larcenic'], 'larcenist': ['cisternal', 'larcenist'], 'larcenous': ['larcenous', 'senocular'], 'larchen': ['charnel', 'larchen'], 'lardacein': ['ecardinal', 'lardacein'], 'lardite': ['dilater', 'lardite', 'redtail'], 'lardon': ['androl', 'arnold', 'lardon', 'roland', 'ronald'], 'lardy': ['daryl', 'lardy', 'lyard'], 'large': ['argel', 'ergal', 'garle', 'glare', 'lager', 'large', 'regal'], 'largely': ['allergy', 'gallery', 'largely', 'regally'], 'largen': ['angler', 'arleng', 'garnel', 'largen', 'rangle', 'regnal'], 'largeness': ['largeness', 'rangeless', 'regalness'], 'largess': ['glasser', 'largess'], 'largition': ['gratiolin', 'largition', 'tailoring'], 'largo': ['algor', 'argol', 'goral', 'largo'], 'lari': ['aril', 'lair', 'lari', 'liar', 'lira', 'rail', 'rial'], 'lariat': ['altair', 'atrail', 'atrial', 'lariat', 'latria', 'talari'], 'larid': ['drail', 'laird', 'larid', 'liard'], 'laridae': ['ardelia', 'laridae', 'radiale'], 'larigo': ['gloria', 'larigo', 'logria'], 'larigot': ['goitral', 'larigot', 'ligator'], 'lariid': ['iridal', 'lariid'], 'larine': ['arline', 'larine', 'linear', 'nailer', 'renail'], 'lark': ['karl', 'kral', 'lark'], 'larking': ['karling', 'larking'], 'larsenite': ['intersale', 'larsenite'], 'larus': ['larus', 'sural', 'ursal'], 'larva': ['alvar', 'arval', 'larva'], 'larval': ['larval', 'vallar'], 'larvate': ['larvate', 'lavaret', 'travale'], 'larve': ['arvel', 'larve', 'laver', 'ravel', 'velar'], 'larvicide': ['larvicide', 'veridical'], 'laryngopharyngeal': ['laryngopharyngeal', 'pharyngolaryngeal'], 'laryngopharyngitis': ['laryngopharyngitis', 'pharyngolaryngitis'], 'laryngotome': ['laryngotome', 'maternology'], 'laryngotracheotomy': ['laryngotracheotomy', 'tracheolaryngotomy'], 'las': ['las', 'sal', 'sla'], 'lasa': ['alas', 'lasa'], 'lascar': ['lascar', 'rascal', 'sacral', 'scalar'], 'laser': ['arles', 'arsle', 'laser', 'seral', 'slare'], 'lash': ['hals', 'lash'], 'lasi': ['lasi', 'lias', 'lisa', 'sail', 'sial'], 'lasius': ['asilus', 'lasius'], 'lask': ['lask', 'skal'], 'lasket': ['lasket', 'sklate'], 'laspring': ['laspring', 'sparling', 'springal'], 'lasque': ['lasque', 'squeal'], 'lasset': ['lasset', 'tassel'], 'lassie': ['elissa', 'lassie'], 'lasso': ['lasso', 'ossal'], 'lassoer': ['lassoer', 'oarless', 'rosales'], 'last': ['last', 'salt', 'slat'], 'laster': ['laster', 'lastre', 'rastle', 'relast', 'resalt', 'salter', 'slater', 'stelar'], 'lasting': ['anglist', 'lasting', 'salting', 'slating', 'staling'], 'lastly': ['lastly', 'saltly'], 'lastness': ['lastness', 'saltness'], 'lastre': ['laster', 'lastre', 'rastle', 'relast', 'resalt', 'salter', 'slater', 'stelar'], 'lasty': ['lasty', 'salty', 'slaty'], 'lat': ['alt', 'lat', 'tal'], 'lata': ['lata', 'taal', 'tala'], 'latania': ['altaian', 'latania', 'natalia'], 'latcher': ['clethra', 'latcher', 'ratchel', 'relatch', 'talcher', 'trachle'], 'latchet': ['chattel', 'latchet'], 'late': ['atle', 'laet', 'late', 'leat', 'tael', 'tale', 'teal'], 'latebra': ['alberta', 'latebra', 'ratable'], 'lated': ['adlet', 'dealt', 'delta', 'lated', 'taled'], 'lateen': ['elanet', 'lanete', 'lateen'], 'lately': ['lately', 'lealty'], 'laten': ['ental', 'laten', 'leant'], 'latent': ['latent', 'latten', 'nattle', 'talent', 'tantle'], 'latentness': ['latentness', 'tenantless'], 'later': ['alert', 'alter', 'artel', 'later', 'ratel', 'taler', 'telar'], 'latera': ['latera', 'relata'], 'laterad': ['altared', 'laterad'], 'lateralis': ['lateralis', 'stellaria'], 'lateran': ['alatern', 'lateran'], 'laterite': ['laterite', 'literate', 'teretial'], 'laterocaudal': ['caudolateral', 'laterocaudal'], 'laterodorsal': ['dorsolateral', 'laterodorsal'], 'lateroventral': ['lateroventral', 'ventrolateral'], 'latest': ['latest', 'sattle', 'taslet'], 'latex': ['exalt', 'latex'], 'lath': ['halt', 'lath'], 'lathe': ['ethal', 'lathe', 'leath'], 'latheman': ['latheman', 'methanal'], 'lathen': ['ethnal', 'hantle', 'lathen', 'thenal'], 'lather': ['arthel', 'halter', 'lather', 'thaler'], 'lathery': ['earthly', 'heartly', 'lathery', 'rathely'], 'lathing': ['halting', 'lathing', 'thingal'], 'latian': ['antlia', 'latian', 'nalita'], 'latibulize': ['latibulize', 'utilizable'], 'latices': ['astelic', 'elastic', 'latices'], 'laticlave': ['laticlave', 'vacillate'], 'latigo': ['galiot', 'latigo'], 'latimeria': ['latimeria', 'marialite'], 'latin': ['altin', 'latin'], 'latinate': ['antliate', 'latinate'], 'latiner': ['entrail', 'latiner', 'latrine', 'ratline', 'reliant', 'retinal', 'trenail'], 'latinesque': ['latinesque', 'sequential'], 'latinian': ['antinial', 'latinian'], 'latinizer': ['latinizer', 'trinalize'], 'latinus': ['latinus', 'tulisan', 'unalist'], 'lation': ['italon', 'lation', 'talion'], 'latirostres': ['latirostres', 'setirostral'], 'latirus': ['latirus', 'trisula'], 'latish': ['latish', 'tahsil'], 'latite': ['latite', 'tailet', 'tailte', 'talite'], 'latitude': ['altitude', 'latitude'], 'latitudinal': ['altitudinal', 'latitudinal'], 'latitudinarian': ['altitudinarian', 'latitudinarian'], 'latomy': ['latomy', 'tyloma'], 'latona': ['atonal', 'latona'], 'latonian': ['latonian', 'nataloin', 'national'], 'latria': ['altair', 'atrail', 'atrial', 'lariat', 'latria', 'talari'], 'latrine': ['entrail', 'latiner', 'latrine', 'ratline', 'reliant', 'retinal', 'trenail'], 'latris': ['latris', 'strial'], 'latro': ['latro', 'rotal', 'toral'], 'latrobe': ['alberto', 'bloater', 'latrobe'], 'latrobite': ['latrobite', 'trilobate'], 'latrocinium': ['latrocinium', 'tourmalinic'], 'latron': ['latron', 'lontar', 'tornal'], 'latten': ['latent', 'latten', 'nattle', 'talent', 'tantle'], 'latter': ['artlet', 'latter', 'rattle', 'tartle', 'tatler'], 'latterkin': ['intertalk', 'latterkin'], 'lattice': ['lattice', 'tactile'], 'latticinio': ['latticinio', 'licitation'], 'latuka': ['latuka', 'taluka'], 'latus': ['latus', 'sault', 'talus'], 'latvian': ['latvian', 'valiant'], 'laubanite': ['laubanite', 'unlabiate'], 'laud': ['auld', 'dual', 'laud', 'udal'], 'laudation': ['adulation', 'laudation'], 'laudator': ['adulator', 'laudator'], 'laudatorily': ['illaudatory', 'laudatorily'], 'laudatory': ['adulatory', 'laudatory'], 'lauder': ['lauder', 'udaler'], 'laudism': ['dualism', 'laudism'], 'laudist': ['dualist', 'laudist'], 'laumonite': ['emulation', 'laumonite'], 'laun': ['laun', 'luna', 'ulna', 'unal'], 'launce': ['auncel', 'cuneal', 'lacune', 'launce', 'unlace'], 'launch': ['chulan', 'launch', 'nuchal'], 'launcher': ['launcher', 'relaunch'], 'laund': ['dunal', 'laund', 'lunda', 'ulnad'], 'launder': ['launder', 'rundale'], 'laur': ['alur', 'laur', 'lura', 'raul', 'ural'], 'laura': ['aural', 'laura'], 'laurel': ['allure', 'laurel'], 'laureled': ['laureled', 'reallude'], 'laurence': ['cerulean', 'laurence'], 'laurent': ['laurent', 'neutral', 'unalert'], 'laurentide': ['adulterine', 'laurentide'], 'lauric': ['curial', 'lauric', 'uracil', 'uralic'], 'laurin': ['laurin', 'urinal'], 'laurite': ['laurite', 'uralite'], 'laurus': ['laurus', 'ursula'], 'lava': ['aval', 'lava'], 'lavacre': ['caravel', 'lavacre'], 'lavaret': ['larvate', 'lavaret', 'travale'], 'lave': ['lave', 'vale', 'veal', 'vela'], 'laveer': ['laveer', 'leaver', 'reveal', 'vealer'], 'lavehr': ['halver', 'lavehr'], 'lavenite': ['elvanite', 'lavenite'], 'laver': ['arvel', 'larve', 'laver', 'ravel', 'velar'], 'laverania': ['laverania', 'valeriana'], 'lavic': ['cavil', 'lavic'], 'lavinia': ['lavinia', 'vinalia'], 'lavish': ['lavish', 'vishal'], 'lavisher': ['lavisher', 'shrieval'], 'lavolta': ['lavolta', 'vallota'], 'law': ['awl', 'law'], 'lawing': ['lawing', 'waling'], 'lawk': ['lawk', 'walk'], 'lawmonger': ['angleworm', 'lawmonger'], 'lawned': ['delawn', 'lawned', 'wandle'], 'lawner': ['lawner', 'warnel'], 'lawny': ['lawny', 'wanly'], 'lawrie': ['lawrie', 'wailer'], 'lawter': ['lawter', 'walter'], 'lawyer': ['lawyer', 'yawler'], 'laxism': ['laxism', 'smilax'], 'lay': ['aly', 'lay'], 'layer': ['early', 'layer', 'relay'], 'layered': ['delayer', 'layered', 'redelay'], 'layery': ['layery', 'yearly'], 'laying': ['gainly', 'laying'], 'layman': ['amylan', 'lamany', 'layman'], 'layne': ['laney', 'layne'], 'layout': ['layout', 'lutayo', 'outlay'], 'layover': ['layover', 'overlay'], 'layship': ['apishly', 'layship'], 'lazarlike': ['alkalizer', 'lazarlike'], 'laze': ['laze', 'zeal'], 'lea': ['ale', 'lea'], 'leach': ['chela', 'lache', 'leach'], 'leachman': ['leachman', 'mechanal'], 'lead': ['dale', 'deal', 'lade', 'lead', 'leda'], 'leadable': ['dealable', 'leadable'], 'leaded': ['delead', 'leaded'], 'leader': ['dealer', 'leader', 'redeal', 'relade', 'relead'], 'leadership': ['dealership', 'leadership'], 'leadin': ['aldine', 'daniel', 'delian', 'denial', 'enalid', 'leadin'], 'leadiness': ['idealness', 'leadiness'], 'leading': ['adeling', 'dealing', 'leading'], 'leadman': ['daleman', 'lademan', 'leadman'], 'leads': ['leads', 'slade'], 'leadsman': ['dalesman', 'leadsman'], 'leadstone': ['endosteal', 'leadstone'], 'leady': ['delay', 'leady'], 'leaf': ['alef', 'feal', 'flea', 'leaf'], 'leafen': ['enleaf', 'leafen'], 'leafit': ['fetial', 'filate', 'lafite', 'leafit'], 'leafy': ['fleay', 'leafy'], 'leah': ['hale', 'heal', 'leah'], 'leak': ['kale', 'lake', 'leak'], 'leakiness': ['alikeness', 'leakiness'], 'leakless': ['lakeless', 'leakless'], 'leal': ['alle', 'ella', 'leal'], 'lealty': ['lately', 'lealty'], 'leam': ['alem', 'alme', 'lame', 'leam', 'male', 'meal', 'mela'], 'leamer': ['leamer', 'mealer'], 'lean': ['alen', 'lane', 'lean', 'lena', 'nael', 'neal'], 'leander': ['leander', 'learned', 'reladen'], 'leaner': ['arlene', 'leaner'], 'leaning': ['angelin', 'leaning'], 'leant': ['ental', 'laten', 'leant'], 'leap': ['leap', 'lepa', 'pale', 'peal', 'plea'], 'leaper': ['leaper', 'releap', 'repale', 'repeal'], 'leaping': ['apeling', 'leaping'], 'leapt': ['leapt', 'palet', 'patel', 'pelta', 'petal', 'plate', 'pleat', 'tepal'], 'lear': ['earl', 'eral', 'lear', 'real'], 'learn': ['learn', 'renal'], 'learned': ['leander', 'learned', 'reladen'], 'learnedly': ['ellenyard', 'learnedly'], 'learner': ['learner', 'relearn'], 'learnt': ['altern', 'antler', 'learnt', 'rental', 'ternal'], 'leasable': ['leasable', 'sealable'], 'lease': ['easel', 'lease'], 'leaser': ['alerse', 'leaser', 'reales', 'resale', 'reseal', 'sealer'], 'leash': ['halse', 'leash', 'selah', 'shale', 'sheal', 'shela'], 'leasing': ['leasing', 'sealing'], 'least': ['least', 'setal', 'slate', 'stale', 'steal', 'stela', 'tales'], 'leat': ['atle', 'laet', 'late', 'leat', 'tael', 'tale', 'teal'], 'leath': ['ethal', 'lathe', 'leath'], 'leather': ['leather', 'tarheel'], 'leatherbark': ['halterbreak', 'leatherbark'], 'leatherer': ['leatherer', 'releather', 'tarheeler'], 'leatman': ['amental', 'leatman'], 'leaver': ['laveer', 'leaver', 'reveal', 'vealer'], 'leaves': ['leaves', 'sleave'], 'leaving': ['leaving', 'vangeli'], 'leavy': ['leavy', 'vealy'], 'leban': ['leban', 'nable'], 'lebanese': ['ebenales', 'lebanese'], 'lebensraum': ['lebensraum', 'mensurable'], 'lecaniid': ['alcidine', 'danielic', 'lecaniid'], 'lecanora': ['carolean', 'lecanora'], 'lecanoroid': ['lecanoroid', 'olecranoid'], 'lechery': ['cheerly', 'lechery'], 'lechriodont': ['holocentrid', 'lechriodont'], 'lecithal': ['hellicat', 'lecithal'], 'lecontite': ['lecontite', 'nicolette'], 'lector': ['colter', 'lector', 'torcel'], 'lectorial': ['corallite', 'lectorial'], 'lectorship': ['lectorship', 'leptorchis'], 'lectrice': ['electric', 'lectrice'], 'lecturess': ['cutleress', 'lecturess', 'truceless'], 'lecyth': ['lecyth', 'letchy'], 'lecythis': ['chestily', 'lecythis'], 'led': ['del', 'eld', 'led'], 'leda': ['dale', 'deal', 'lade', 'lead', 'leda'], 'lede': ['dele', 'lede', 'leed'], 'leden': ['leden', 'neeld'], 'ledge': ['glede', 'gleed', 'ledge'], 'ledger': ['gelder', 'ledger', 'redleg'], 'ledging': ['gelding', 'ledging'], 'ledgy': ['gledy', 'ledgy'], 'lee': ['eel', 'lee'], 'leed': ['dele', 'lede', 'leed'], 'leek': ['keel', 'kele', 'leek'], 'leep': ['leep', 'peel', 'pele'], 'leepit': ['leepit', 'pelite', 'pielet'], 'leer': ['leer', 'reel'], 'leeringly': ['leeringly', 'reelingly'], 'leerness': ['leerness', 'lessener'], 'lees': ['else', 'lees', 'seel', 'sele', 'slee'], 'leet': ['leet', 'lete', 'teel', 'tele'], 'leetman': ['entelam', 'leetman'], 'leewan': ['leewan', 'weanel'], 'left': ['felt', 'flet', 'left'], 'leftish': ['fishlet', 'leftish'], 'leftness': ['feltness', 'leftness'], 'leg': ['gel', 'leg'], 'legalist': ['legalist', 'stillage'], 'legantine': ['eglantine', 'inelegant', 'legantine'], 'legate': ['eaglet', 'legate', 'teagle', 'telega'], 'legatine': ['galenite', 'legatine'], 'legation': ['gelation', 'lagonite', 'legation'], 'legative': ['legative', 'levigate'], 'legator': ['argolet', 'gloater', 'legator'], 'legendary': ['enragedly', 'legendary'], 'leger': ['leger', 'regle'], 'legger': ['eggler', 'legger'], 'legion': ['eloign', 'gileno', 'legion'], 'legioner': ['eloigner', 'legioner'], 'legionry': ['legionry', 'yeorling'], 'legislator': ['allegorist', 'legislator'], 'legman': ['legman', 'mangel', 'mangle'], 'legoa': ['gloea', 'legoa'], 'legua': ['gulae', 'legua'], 'leguan': ['genual', 'leguan'], 'lehr': ['herl', 'hler', 'lehr'], 'lei': ['eli', 'lei', 'lie'], 'leif': ['feil', 'file', 'leif', 'lief', 'life'], 'leila': ['allie', 'leila', 'lelia'], 'leipoa': ['apiole', 'leipoa'], 'leisten': ['leisten', 'setline', 'tensile'], 'leister': ['leister', 'sterile'], 'leith': ['leith', 'lithe'], 'leitneria': ['leitneria', 'lienteria'], 'lek': ['elk', 'lek'], 'lekach': ['hackle', 'lekach'], 'lekane': ['alkene', 'lekane'], 'lelia': ['allie', 'leila', 'lelia'], 'leman': ['leman', 'lemna'], 'lemma': ['lemma', 'melam'], 'lemna': ['leman', 'lemna'], 'lemnad': ['lemnad', 'menald'], 'lemnian': ['lemnian', 'lineman', 'melanin'], 'lemniscate': ['centesimal', 'lemniscate'], 'lemon': ['lemon', 'melon', 'monel'], 'lemonias': ['laminose', 'lemonias', 'semolina'], 'lemonlike': ['lemonlike', 'melonlike'], 'lemony': ['lemony', 'myelon'], 'lemosi': ['lemosi', 'limose', 'moiles'], 'lempira': ['impaler', 'impearl', 'lempira', 'premial'], 'lemuria': ['lemuria', 'miauler'], 'lemurian': ['lemurian', 'malurine', 'rumelian'], 'lemurinae': ['lemurinae', 'neurilema'], 'lemurine': ['lemurine', 'meruline', 'relumine'], 'lena': ['alen', 'lane', 'lean', 'lena', 'nael', 'neal'], 'lenad': ['eland', 'laden', 'lenad'], 'lenape': ['alpeen', 'lenape', 'pelean'], 'lenard': ['aldern', 'darnel', 'enlard', 'lander', 'lenard', 'randle', 'reland'], 'lenca': ['canel', 'clean', 'lance', 'lenca'], 'lencan': ['cannel', 'lencan'], 'lendee': ['lendee', 'needle'], 'lender': ['lender', 'relend'], 'lendu': ['lendu', 'unled'], 'lengthy': ['lengthy', 'thegnly'], 'lenient': ['lenient', 'tenline'], 'lenify': ['finely', 'lenify'], 'lenis': ['elsin', 'lenis', 'niels', 'silen', 'sline'], 'lenity': ['lenity', 'yetlin'], 'lenny': ['lenny', 'lynne'], 'leno': ['elon', 'enol', 'leno', 'leon', 'lone', 'noel'], 'lenora': ['lenora', 'loaner', 'orlean', 'reloan'], 'lenticel': ['lenticel', 'lenticle'], 'lenticle': ['lenticel', 'lenticle'], 'lentil': ['lentil', 'lintel'], 'lentisc': ['lentisc', 'scintle', 'stencil'], 'lentisco': ['lentisco', 'telsonic'], 'lentiscus': ['lentiscus', 'tunicless'], 'lento': ['lento', 'olent'], 'lentous': ['lentous', 'sultone'], 'lenvoy': ['lenvoy', 'ovenly'], 'leo': ['leo', 'ole'], 'leon': ['elon', 'enol', 'leno', 'leon', 'lone', 'noel'], 'leonard': ['endoral', 'ladrone', 'leonard'], 'leonhardite': ['leonhardite', 'lionhearted'], 'leonid': ['doline', 'indole', 'leonid', 'loined', 'olenid'], 'leonines': ['leonines', 'selenion'], 'leonis': ['insole', 'leonis', 'lesion', 'selion'], 'leonist': ['leonist', 'onliest'], 'leonite': ['elonite', 'leonite'], 'leonotis': ['leonotis', 'oilstone'], 'leoparde': ['leoparde', 'reapdole'], 'leopardite': ['leopardite', 'protelidae'], 'leotard': ['delator', 'leotard'], 'lepa': ['leap', 'lepa', 'pale', 'peal', 'plea'], 'lepanto': ['lepanto', 'nepotal', 'petalon', 'polenta'], 'lepas': ['elaps', 'lapse', 'lepas', 'pales', 'salep', 'saple', 'sepal', 'slape', 'spale', 'speal'], 'lepcha': ['chapel', 'lepcha', 'pleach'], 'leper': ['leper', 'perle', 'repel'], 'leperdom': ['leperdom', 'premodel'], 'lepidopter': ['dopplerite', 'lepidopter'], 'lepidosauria': ['lepidosauria', 'pliosauridae'], 'lepidote': ['lepidote', 'petioled'], 'lepidotic': ['diploetic', 'lepidotic'], 'lepisma': ['ampelis', 'lepisma'], 'leporid': ['leporid', 'leproid'], 'leporis': ['leporis', 'spoiler'], 'lepra': ['lepra', 'paler', 'parel', 'parle', 'pearl', 'perla', 'relap'], 'leproid': ['leporid', 'leproid'], 'leproma': ['leproma', 'palermo', 'pleroma', 'polearm'], 'leprosied': ['despoiler', 'leprosied'], 'leprosis': ['leprosis', 'plerosis'], 'leprous': ['leprous', 'pelorus', 'sporule'], 'leptandra': ['leptandra', 'peltandra'], 'leptidae': ['depilate', 'leptidae', 'pileated'], 'leptiform': ['leptiform', 'peltiform'], 'leptodora': ['doorplate', 'leptodora'], 'leptome': ['leptome', 'poemlet'], 'lepton': ['lepton', 'pentol'], 'leptonema': ['leptonema', 'ptolemean'], 'leptorchis': ['lectorship', 'leptorchis'], 'lepus': ['lepus', 'pulse'], 'ler': ['ler', 'rel'], 'lernaean': ['annealer', 'lernaean', 'reanneal'], 'lerot': ['lerot', 'orlet', 'relot'], 'lerwa': ['lerwa', 'waler'], 'les': ['els', 'les'], 'lesath': ['haslet', 'lesath', 'shelta'], 'lesbia': ['isabel', 'lesbia'], 'lesche': ['lesche', 'sleech'], 'lesion': ['insole', 'leonis', 'lesion', 'selion'], 'lesional': ['lesional', 'solenial'], 'leslie': ['leslie', 'sellie'], 'lessener': ['leerness', 'lessener'], 'lest': ['lest', 'selt'], 'lester': ['lester', 'selter', 'streel'], 'let': ['elt', 'let'], 'letchy': ['lecyth', 'letchy'], 'lete': ['leet', 'lete', 'teel', 'tele'], 'lethargus': ['lethargus', 'slaughter'], 'lethe': ['ethel', 'lethe'], 'lethean': ['entheal', 'lethean'], 'lethologica': ['ethological', 'lethologica', 'theological'], 'letitia': ['italite', 'letitia', 'tilaite'], 'leto': ['leto', 'lote', 'tole'], 'letoff': ['letoff', 'offlet'], 'lett': ['lett', 'telt'], 'letten': ['letten', 'nettle'], 'letterer': ['letterer', 'reletter'], 'lettish': ['lettish', 'thistle'], 'lettrin': ['lettrin', 'trintle'], 'leu': ['leu', 'lue', 'ule'], 'leucadian': ['leucadian', 'lucanidae'], 'leucocism': ['leucocism', 'muscicole'], 'leucoma': ['caulome', 'leucoma'], 'leucosis': ['coulisse', 'leucosis', 'ossicule'], 'leud': ['deul', 'duel', 'leud'], 'leuk': ['leuk', 'luke'], 'leuma': ['amelu', 'leuma', 'ulema'], 'leung': ['leung', 'lunge'], 'levance': ['enclave', 'levance', 'valence'], 'levant': ['levant', 'valent'], 'levanter': ['levanter', 'relevant', 'revelant'], 'levantine': ['levantine', 'valentine'], 'leveler': ['leveler', 'relevel'], 'lever': ['elver', 'lever', 'revel'], 'leverer': ['leverer', 'reveler'], 'levi': ['evil', 'levi', 'live', 'veil', 'vile', 'vlei'], 'levier': ['levier', 'relive', 'reveil', 'revile', 'veiler'], 'levigate': ['legative', 'levigate'], 'levin': ['levin', 'liven'], 'levining': ['levining', 'nievling'], 'levir': ['levir', 'liver', 'livre', 'rivel'], 'levirate': ['levirate', 'relative'], 'levis': ['elvis', 'levis', 'slive'], 'levitation': ['levitation', 'tonalitive', 'velitation'], 'levo': ['levo', 'love', 'velo', 'vole'], 'levyist': ['levyist', 'sylvite'], 'lewd': ['lewd', 'weld'], 'lewis': ['lewis', 'swile'], 'lexia': ['axile', 'lexia'], 'ley': ['ley', 'lye'], 'lhota': ['altho', 'lhota', 'loath'], 'liability': ['alibility', 'liability'], 'liable': ['alible', 'belial', 'labile', 'liable'], 'liana': ['alain', 'alani', 'liana'], 'liang': ['algin', 'align', 'langi', 'liang', 'linga'], 'liar': ['aril', 'lair', 'lari', 'liar', 'lira', 'rail', 'rial'], 'liard': ['drail', 'laird', 'larid', 'liard'], 'lias': ['lasi', 'lias', 'lisa', 'sail', 'sial'], 'liatris': ['liatris', 'trilisa'], 'libament': ['bailment', 'libament'], 'libate': ['albeit', 'albite', 'baltei', 'belait', 'betail', 'bletia', 'libate'], 'libationer': ['libationer', 'liberation'], 'libber': ['libber', 'ribble'], 'libby': ['bilby', 'libby'], 'libellary': ['libellary', 'liberally'], 'liber': ['birle', 'liber'], 'liberal': ['braille', 'liberal'], 'liberally': ['libellary', 'liberally'], 'liberate': ['iterable', 'liberate'], 'liberation': ['libationer', 'liberation'], 'liberator': ['liberator', 'orbitelar'], 'liberian': ['bilinear', 'liberian'], 'libertas': ['abristle', 'libertas'], 'libertine': ['berlinite', 'libertine'], 'libra': ['blair', 'brail', 'libra'], 'librate': ['betrail', 'librate', 'triable', 'trilabe'], 'licania': ['lacinia', 'licania'], 'license': ['license', 'selenic', 'silence'], 'licensed': ['licensed', 'silenced'], 'licenser': ['licenser', 'silencer'], 'licensor': ['cresolin', 'licensor'], 'lich': ['chil', 'lich'], 'lichanos': ['lichanos', 'nicholas'], 'lichenoid': ['cheloniid', 'lichenoid'], 'lichi': ['chili', 'lichi'], 'licitation': ['latticinio', 'licitation'], 'licker': ['licker', 'relick', 'rickle'], 'lickspit': ['lickspit', 'lipstick'], 'licorne': ['creolin', 'licorne', 'locrine'], 'lida': ['dail', 'dali', 'dial', 'laid', 'lida'], 'lidded': ['diddle', 'lidded'], 'lidder': ['lidder', 'riddel', 'riddle'], 'lide': ['idle', 'lide', 'lied'], 'lie': ['eli', 'lei', 'lie'], 'lied': ['idle', 'lide', 'lied'], 'lief': ['feil', 'file', 'leif', 'lief', 'life'], 'lien': ['lien', 'line', 'neil', 'nile'], 'lienal': ['lienal', 'lineal'], 'lienee': ['eileen', 'lienee'], 'lienor': ['elinor', 'lienor', 'lorien', 'noiler'], 'lienteria': ['leitneria', 'lienteria'], 'lientery': ['entirely', 'lientery'], 'lier': ['lier', 'lire', 'rile'], 'lierne': ['lierne', 'reline'], 'lierre': ['lierre', 'relier'], 'liesh': ['liesh', 'shiel'], 'lievaart': ['lievaart', 'varietal'], 'life': ['feil', 'file', 'leif', 'lief', 'life'], 'lifelike': ['filelike', 'lifelike'], 'lifer': ['filer', 'flier', 'lifer', 'rifle'], 'lifeward': ['drawfile', 'lifeward'], 'lifo': ['filo', 'foil', 'lifo'], 'lift': ['flit', 'lift'], 'lifter': ['fertil', 'filter', 'lifter', 'relift', 'trifle'], 'lifting': ['fliting', 'lifting'], 'ligament': ['ligament', 'metaling', 'tegminal'], 'ligas': ['gisla', 'ligas', 'sigla'], 'ligate': ['aiglet', 'ligate', 'taigle', 'tailge'], 'ligation': ['intaglio', 'ligation'], 'ligator': ['goitral', 'larigot', 'ligator'], 'ligature': ['alurgite', 'ligature'], 'lighten': ['enlight', 'lighten'], 'lightener': ['lightener', 'relighten', 'threeling'], 'lighter': ['lighter', 'relight', 'rightle'], 'lighthead': ['headlight', 'lighthead'], 'lightness': ['lightness', 'nightless', 'thingless'], 'ligne': ['ingle', 'ligne', 'linge', 'nigel'], 'lignin': ['lignin', 'lining'], 'lignitic': ['lignitic', 'tiglinic'], 'lignose': ['gelosin', 'lignose'], 'ligroine': ['ligroine', 'religion'], 'ligure': ['ligure', 'reguli'], 'lija': ['jail', 'lija'], 'like': ['kiel', 'like'], 'liken': ['inkle', 'liken'], 'likewise': ['likewise', 'wiselike'], 'lilac': ['calli', 'lilac'], 'lilacky': ['alkylic', 'lilacky'], 'lilium': ['illium', 'lilium'], 'lilt': ['lilt', 'till'], 'lily': ['illy', 'lily', 'yill'], 'lim': ['lim', 'mil'], 'lima': ['amil', 'amli', 'lima', 'mail', 'mali', 'mila'], 'limacina': ['animalic', 'limacina'], 'limacon': ['limacon', 'malonic'], 'liman': ['lamin', 'liman', 'milan'], 'limation': ['limation', 'miltonia'], 'limbat': ['limbat', 'timbal'], 'limbate': ['limbate', 'timable', 'timbale'], 'limbed': ['dimble', 'limbed'], 'limbus': ['bluism', 'limbus'], 'limby': ['blimy', 'limby'], 'lime': ['emil', 'lime', 'mile'], 'limean': ['limean', 'maline', 'melian', 'menial'], 'limeman': ['ammelin', 'limeman'], 'limer': ['limer', 'meril', 'miler'], 'limes': ['limes', 'miles', 'slime', 'smile'], 'limestone': ['limestone', 'melonites', 'milestone'], 'limey': ['elymi', 'emily', 'limey'], 'liminess': ['liminess', 'senilism'], 'limitary': ['limitary', 'military'], 'limitate': ['limitate', 'militate'], 'limitation': ['limitation', 'militation'], 'limited': ['delimit', 'limited'], 'limiter': ['limiter', 'relimit'], 'limitless': ['limitless', 'semistill'], 'limner': ['limner', 'merlin', 'milner'], 'limnetic': ['limnetic', 'milicent'], 'limoniad': ['dominial', 'imolinda', 'limoniad'], 'limosa': ['limosa', 'somali'], 'limose': ['lemosi', 'limose', 'moiles'], 'limp': ['limp', 'pilm', 'plim'], 'limper': ['limper', 'prelim', 'rimple'], 'limping': ['impling', 'limping'], 'limpsy': ['limpsy', 'simply'], 'limpy': ['imply', 'limpy', 'pilmy'], 'limsy': ['limsy', 'slimy', 'smily'], 'lin': ['lin', 'nil'], 'lina': ['alin', 'anil', 'lain', 'lina', 'nail'], 'linaga': ['agnail', 'linaga'], 'linage': ['algine', 'genial', 'linage'], 'linamarin': ['laminarin', 'linamarin'], 'linarite': ['inertial', 'linarite'], 'linchet': ['linchet', 'tinchel'], 'linctus': ['clunist', 'linctus'], 'linda': ['danli', 'ladin', 'linda', 'nidal'], 'lindane': ['annelid', 'lindane'], 'linder': ['linder', 'rindle'], 'lindoite': ['lindoite', 'tolidine'], 'lindsay': ['islandy', 'lindsay'], 'line': ['lien', 'line', 'neil', 'nile'], 'linea': ['alien', 'aline', 'anile', 'elain', 'elian', 'laine', 'linea'], 'lineal': ['lienal', 'lineal'], 'lineament': ['lineament', 'manteline'], 'linear': ['arline', 'larine', 'linear', 'nailer', 'renail'], 'linearity': ['inreality', 'linearity'], 'lineate': ['elatine', 'lineate'], 'lineature': ['lineature', 'rutelinae'], 'linecut': ['linecut', 'tunicle'], 'lined': ['eldin', 'lined'], 'lineman': ['lemnian', 'lineman', 'melanin'], 'linen': ['linen', 'linne'], 'linesman': ['annelism', 'linesman'], 'linet': ['inlet', 'linet'], 'linga': ['algin', 'align', 'langi', 'liang', 'linga'], 'lingbird': ['birdling', 'bridling', 'lingbird'], 'linge': ['ingle', 'ligne', 'linge', 'nigel'], 'linger': ['linger', 'ringle'], 'lingo': ['lingo', 'login'], 'lingtow': ['lingtow', 'twoling'], 'lingua': ['gaulin', 'lingua'], 'lingual': ['lingual', 'lingula'], 'linguidental': ['dentilingual', 'indulgential', 'linguidental'], 'lingula': ['lingual', 'lingula'], 'linguodental': ['dentolingual', 'linguodental'], 'lingy': ['lingy', 'lying'], 'linha': ['linha', 'nihal'], 'lining': ['lignin', 'lining'], 'link': ['kiln', 'link'], 'linked': ['kindle', 'linked'], 'linker': ['linker', 'relink'], 'linking': ['inkling', 'linking'], 'linkman': ['kilnman', 'linkman'], 'links': ['links', 'slink'], 'linnaea': ['alanine', 'linnaea'], 'linnaean': ['annaline', 'linnaean'], 'linne': ['linen', 'linne'], 'linnet': ['linnet', 'linten'], 'lino': ['lino', 'lion', 'loin', 'noil'], 'linolenic': ['encinillo', 'linolenic'], 'linometer': ['linometer', 'nilometer'], 'linopteris': ['linopteris', 'prosilient'], 'linous': ['insoul', 'linous', 'nilous', 'unsoil'], 'linsey': ['linsey', 'lysine'], 'linstock': ['coltskin', 'linstock'], 'lintel': ['lentil', 'lintel'], 'linten': ['linnet', 'linten'], 'lintseed': ['enlisted', 'lintseed'], 'linum': ['linum', 'ulmin'], 'linus': ['linus', 'sunil'], 'liny': ['inly', 'liny'], 'lion': ['lino', 'lion', 'loin', 'noil'], 'lioncel': ['colline', 'lioncel'], 'lionel': ['lionel', 'niello'], 'lionet': ['entoil', 'lionet'], 'lionhearted': ['leonhardite', 'lionhearted'], 'lipa': ['lipa', 'pail', 'pali', 'pial'], 'lipan': ['lipan', 'pinal', 'plain'], 'liparis': ['aprilis', 'liparis'], 'liparite': ['liparite', 'reptilia'], 'liparous': ['liparous', 'pliosaur'], 'lipase': ['espial', 'lipase', 'pelias'], 'lipin': ['lipin', 'pilin'], 'liplet': ['liplet', 'pillet'], 'lipochondroma': ['chondrolipoma', 'lipochondroma'], 'lipoclasis': ['calliopsis', 'lipoclasis'], 'lipocyte': ['epicotyl', 'lipocyte'], 'lipofibroma': ['fibrolipoma', 'lipofibroma'], 'lipolytic': ['lipolytic', 'politicly'], 'lipoma': ['lipoma', 'pimola', 'ploima'], 'lipomyoma': ['lipomyoma', 'myolipoma'], 'lipomyxoma': ['lipomyxoma', 'myxolipoma'], 'liposis': ['liposis', 'pilosis'], 'lipotype': ['lipotype', 'polypite'], 'lippen': ['lippen', 'nipple'], 'lipper': ['lipper', 'ripple'], 'lippia': ['lippia', 'pilpai'], 'lipsanotheca': ['lipsanotheca', 'sphacelation'], 'lipstick': ['lickspit', 'lipstick'], 'liquate': ['liquate', 'tequila'], 'liquidate': ['liquidate', 'qualitied'], 'lira': ['aril', 'lair', 'lari', 'liar', 'lira', 'rail', 'rial'], 'lirate': ['lirate', 'retail', 'retial', 'tailer'], 'liration': ['liration', 'litorina'], 'lire': ['lier', 'lire', 'rile'], 'lis': ['lis', 'sil'], 'lisa': ['lasi', 'lias', 'lisa', 'sail', 'sial'], 'lise': ['isle', 'lise', 'sile'], 'lisere': ['lisere', 'resile'], 'lisk': ['lisk', 'silk', 'skil'], 'lisle': ['lisle', 'selli'], 'lisp': ['lisp', 'slip'], 'lisper': ['lisper', 'pliers', 'sirple', 'spiler'], 'list': ['list', 'silt', 'slit'], 'listable': ['bastille', 'listable'], 'listen': ['enlist', 'listen', 'silent', 'tinsel'], 'listener': ['enlister', 'esterlin', 'listener', 'relisten'], 'lister': ['lister', 'relist'], 'listera': ['aletris', 'alister', 'listera', 'realist', 'saltier'], 'listerian': ['listerian', 'trisilane'], 'listerine': ['listerine', 'resilient'], 'listerize': ['listerize', 'sterilize'], 'listing': ['listing', 'silting'], 'listless': ['listless', 'slitless'], 'lisuarte': ['auletris', 'lisuarte'], 'lit': ['lit', 'til'], 'litas': ['alist', 'litas', 'slait', 'talis'], 'litchi': ['litchi', 'lithic'], 'lite': ['lite', 'teil', 'teli', 'tile'], 'liter': ['liter', 'tiler'], 'literal': ['literal', 'tallier'], 'literary': ['literary', 'trailery'], 'literate': ['laterite', 'literate', 'teretial'], 'literose': ['literose', 'roselite', 'tirolese'], 'lith': ['hilt', 'lith'], 'litharge': ['litharge', 'thirlage'], 'lithe': ['leith', 'lithe'], 'lithectomy': ['lithectomy', 'methylotic'], 'lithic': ['litchi', 'lithic'], 'litho': ['litho', 'thiol', 'tholi'], 'lithochromography': ['chromolithography', 'lithochromography'], 'lithocyst': ['cystolith', 'lithocyst'], 'lithonephria': ['lithonephria', 'philotherian'], 'lithonephrotomy': ['lithonephrotomy', 'nephrolithotomy'], 'lithophane': ['anthophile', 'lithophane'], 'lithophone': ['lithophone', 'thiophenol'], 'lithophotography': ['lithophotography', 'photolithography'], 'lithophysal': ['isophthalyl', 'lithophysal'], 'lithopone': ['lithopone', 'phonolite'], 'lithous': ['lithous', 'loutish'], 'litigate': ['litigate', 'tagilite'], 'litmus': ['litmus', 'tilmus'], 'litorina': ['liration', 'litorina'], 'litorinidae': ['idioretinal', 'litorinidae'], 'litra': ['litra', 'trail', 'trial'], 'litsea': ['isleta', 'litsea', 'salite', 'stelai'], 'litster': ['litster', 'slitter', 'stilter', 'testril'], 'litten': ['litten', 'tinlet'], 'litter': ['litter', 'tilter', 'titler'], 'littery': ['littery', 'tritely'], 'littoral': ['littoral', 'tortilla'], 'lituiform': ['lituiform', 'trifolium'], 'litus': ['litus', 'sluit', 'tulsi'], 'live': ['evil', 'levi', 'live', 'veil', 'vile', 'vlei'], 'lived': ['devil', 'divel', 'lived'], 'livedo': ['livedo', 'olived'], 'liveliness': ['liveliness', 'villeiness'], 'livelong': ['livelong', 'loveling'], 'lively': ['evilly', 'lively', 'vilely'], 'liven': ['levin', 'liven'], 'liveness': ['evilness', 'liveness', 'veinless', 'vileness', 'vineless'], 'liver': ['levir', 'liver', 'livre', 'rivel'], 'livered': ['deliver', 'deviler', 'livered'], 'livery': ['livery', 'verily'], 'livier': ['livier', 'virile'], 'livonian': ['livonian', 'violanin'], 'livre': ['levir', 'liver', 'livre', 'rivel'], 'liwan': ['inlaw', 'liwan'], 'llandeilo': ['diallelon', 'llandeilo'], 'llew': ['llew', 'well'], 'lloyd': ['dolly', 'lloyd'], 'loa': ['alo', 'lao', 'loa'], 'loach': ['chola', 'loach', 'olcha'], 'load': ['alod', 'dola', 'load', 'odal'], 'loaden': ['enodal', 'loaden'], 'loader': ['loader', 'ordeal', 'reload'], 'loading': ['angloid', 'loading'], 'loaf': ['foal', 'loaf', 'olaf'], 'loam': ['loam', 'loma', 'malo', 'mola', 'olam'], 'loaminess': ['loaminess', 'melanosis'], 'loaming': ['almoign', 'loaming'], 'loamy': ['amylo', 'loamy'], 'loaner': ['lenora', 'loaner', 'orlean', 'reloan'], 'loasa': ['alosa', 'loasa', 'oasal'], 'loath': ['altho', 'lhota', 'loath'], 'loather': ['loather', 'rathole'], 'loathly': ['loathly', 'tallyho'], 'lob': ['blo', 'lob'], 'lobar': ['balor', 'bolar', 'boral', 'labor', 'lobar'], 'lobate': ['lobate', 'oblate'], 'lobated': ['bloated', 'lobated'], 'lobately': ['lobately', 'oblately'], 'lobation': ['boltonia', 'lobation', 'oblation'], 'lobe': ['bleo', 'bole', 'lobe'], 'lobed': ['bodle', 'boled', 'lobed'], 'lobelet': ['bellote', 'lobelet'], 'lobelia': ['bolelia', 'lobelia', 'obelial'], 'lobing': ['globin', 'goblin', 'lobing'], 'lobo': ['bolo', 'bool', 'lobo', 'obol'], 'lobola': ['balolo', 'lobola'], 'lobscourse': ['lobscourse', 'lobscouser'], 'lobscouser': ['lobscourse', 'lobscouser'], 'lobster': ['bolster', 'lobster'], 'loca': ['alco', 'coal', 'cola', 'loca'], 'local': ['callo', 'colla', 'local'], 'locanda': ['acnodal', 'canadol', 'locanda'], 'locarnite': ['alectrion', 'clarionet', 'crotaline', 'locarnite'], 'locarnize': ['laconizer', 'locarnize'], 'locarno': ['coronal', 'locarno'], 'locate': ['acetol', 'colate', 'locate'], 'location': ['colation', 'coontail', 'location'], 'locational': ['allocation', 'locational'], 'locator': ['crotalo', 'locator'], 'loch': ['chol', 'loch'], 'lochan': ['chalon', 'lochan'], 'lochetic': ['helcotic', 'lochetic', 'ochletic'], 'lochus': ['holcus', 'lochus', 'slouch'], 'loci': ['clio', 'coil', 'coli', 'loci'], 'lociation': ['coalition', 'lociation'], 'lock': ['colk', 'lock'], 'locker': ['locker', 'relock'], 'lockpin': ['lockpin', 'pinlock'], 'lockram': ['lockram', 'marlock'], 'lockspit': ['lockspit', 'lopstick'], 'lockup': ['lockup', 'uplock'], 'loco': ['cool', 'loco'], 'locoweed': ['coolweed', 'locoweed'], 'locrian': ['carolin', 'clarion', 'colarin', 'locrian'], 'locrine': ['creolin', 'licorne', 'locrine'], 'loculate': ['allocute', 'loculate'], 'loculation': ['allocution', 'loculation'], 'locum': ['cumol', 'locum'], 'locusta': ['costula', 'locusta', 'talcous'], 'lod': ['dol', 'lod', 'old'], 'lode': ['dole', 'elod', 'lode', 'odel'], 'lodesman': ['dolesman', 'lodesman'], 'lodgeman': ['angeldom', 'lodgeman'], 'lodger': ['golder', 'lodger'], 'lodging': ['godling', 'lodging'], 'loess': ['loess', 'soles'], 'loessic': ['loessic', 'ossicle'], 'lof': ['flo', 'lof'], 'loft': ['flot', 'loft'], 'lofter': ['floret', 'forlet', 'lofter', 'torfel'], 'lofty': ['lofty', 'oftly'], 'log': ['gol', 'log'], 'logania': ['alogian', 'logania'], 'logarithm': ['algorithm', 'logarithm'], 'logarithmic': ['algorithmic', 'logarithmic'], 'loge': ['egol', 'goel', 'loge', 'ogle', 'oleg'], 'logger': ['logger', 'roggle'], 'logicalist': ['logicalist', 'logistical'], 'logicist': ['logicist', 'logistic'], 'login': ['lingo', 'login'], 'logistic': ['logicist', 'logistic'], 'logistical': ['logicalist', 'logistical'], 'logistics': ['glossitic', 'logistics'], 'logman': ['amlong', 'logman'], 'logographic': ['graphologic', 'logographic'], 'logographical': ['graphological', 'logographical'], 'logography': ['graphology', 'logography'], 'logoi': ['igloo', 'logoi'], 'logometrical': ['logometrical', 'metrological'], 'logos': ['gools', 'logos'], 'logotypy': ['logotypy', 'typology'], 'logria': ['gloria', 'larigo', 'logria'], 'logy': ['gloy', 'logy'], 'lohar': ['horal', 'lohar'], 'loin': ['lino', 'lion', 'loin', 'noil'], 'loined': ['doline', 'indole', 'leonid', 'loined', 'olenid'], 'loir': ['loir', 'lori', 'roil'], 'lois': ['lois', 'silo', 'siol', 'soil', 'soli'], 'loiter': ['loiter', 'toiler', 'triole'], 'loka': ['kalo', 'kola', 'loka'], 'lokao': ['lokao', 'oolak'], 'loke': ['koel', 'loke'], 'loket': ['ketol', 'loket'], 'lola': ['lalo', 'lola', 'olla'], 'loma': ['loam', 'loma', 'malo', 'mola', 'olam'], 'lomatine': ['lomatine', 'tolamine'], 'lombardian': ['laminboard', 'lombardian'], 'lomboy': ['bloomy', 'lomboy'], 'loment': ['loment', 'melton', 'molten'], 'lomentaria': ['ameliorant', 'lomentaria'], 'lomita': ['lomita', 'tomial'], 'lone': ['elon', 'enol', 'leno', 'leon', 'lone', 'noel'], 'longa': ['along', 'gonal', 'lango', 'longa', 'nogal'], 'longanimous': ['longanimous', 'longimanous'], 'longbeard': ['boglander', 'longbeard'], 'longear': ['argenol', 'longear'], 'longhead': ['headlong', 'longhead'], 'longimanous': ['longanimous', 'longimanous'], 'longimetry': ['longimetry', 'mongrelity'], 'longmouthed': ['goldenmouth', 'longmouthed'], 'longue': ['longue', 'lounge'], 'lonicera': ['acrolein', 'arecolin', 'caroline', 'colinear', 'cornelia', 'creolian', 'lonicera'], 'lontar': ['latron', 'lontar', 'tornal'], 'looby': ['booly', 'looby'], 'lood': ['dool', 'lood'], 'loof': ['fool', 'loof', 'olof'], 'look': ['kolo', 'look'], 'looker': ['looker', 'relook'], 'lookout': ['lookout', 'outlook'], 'loom': ['loom', 'mool'], 'loon': ['loon', 'nolo'], 'loop': ['loop', 'polo', 'pool'], 'looper': ['looper', 'pooler'], 'loopist': ['loopist', 'poloist', 'topsoil'], 'loopy': ['loopy', 'pooly'], 'loosing': ['loosing', 'sinolog'], 'loot': ['loot', 'tool'], 'looter': ['looter', 'retool', 'rootle', 'tooler'], 'lootie': ['lootie', 'oolite'], 'lop': ['lop', 'pol'], 'lope': ['lope', 'olpe', 'pole'], 'loper': ['loper', 'poler'], 'lopezia': ['epizoal', 'lopezia', 'opalize'], 'lophine': ['lophine', 'pinhole'], 'lophocomi': ['homopolic', 'lophocomi'], 'loppet': ['loppet', 'topple'], 'loppy': ['loppy', 'polyp'], 'lopstick': ['lockspit', 'lopstick'], 'loquacious': ['aquicolous', 'loquacious'], 'lora': ['lora', 'oral'], 'lorandite': ['lorandite', 'rodential'], 'lorate': ['elator', 'lorate'], 'lorcha': ['choral', 'lorcha'], 'lordly': ['drolly', 'lordly'], 'lore': ['lore', 'orle', 'role'], 'lored': ['lored', 'older'], 'loren': ['enrol', 'loren'], 'lori': ['loir', 'lori', 'roil'], 'lorica': ['caroli', 'corial', 'lorica'], 'loricate': ['calorite', 'erotical', 'loricate'], 'loricati': ['clitoria', 'loricati'], 'lorien': ['elinor', 'lienor', 'lorien', 'noiler'], 'loro': ['loro', 'olor', 'orlo', 'rool'], 'lose': ['lose', 'sloe', 'sole'], 'loser': ['loser', 'orsel', 'rosel', 'soler'], 'lost': ['lost', 'lots', 'slot'], 'lot': ['lot', 'tol'], 'lota': ['alto', 'lota'], 'lotase': ['lotase', 'osteal', 'solate', 'stolae', 'talose'], 'lote': ['leto', 'lote', 'tole'], 'lotic': ['cloit', 'lotic'], 'lotrite': ['lotrite', 'tortile', 'triolet'], 'lots': ['lost', 'lots', 'slot'], 'lotta': ['lotta', 'total'], 'lotter': ['lotter', 'rottle', 'tolter'], 'lottie': ['lottie', 'toilet', 'tolite'], 'lou': ['lou', 'luo'], 'loud': ['loud', 'ludo'], 'louden': ['louden', 'nodule'], 'lough': ['ghoul', 'lough'], 'lounder': ['durenol', 'lounder', 'roundel'], 'lounge': ['longue', 'lounge'], 'loupe': ['epulo', 'loupe'], 'lourdy': ['dourly', 'lourdy'], 'louse': ['eusol', 'louse'], 'lousy': ['lousy', 'souly'], 'lout': ['lout', 'tolu'], 'louter': ['elutor', 'louter', 'outler'], 'loutish': ['lithous', 'loutish'], 'louty': ['louty', 'outly'], 'louvar': ['louvar', 'ovular'], 'louver': ['louver', 'louvre'], 'louvre': ['louver', 'louvre'], 'lovable': ['lovable', 'volable'], 'lovage': ['lovage', 'volage'], 'love': ['levo', 'love', 'velo', 'vole'], 'loveling': ['livelong', 'loveling'], 'lovely': ['lovely', 'volley'], 'lovering': ['lovering', 'overling'], 'low': ['low', 'lwo', 'owl'], 'lowa': ['alow', 'awol', 'lowa'], 'lowder': ['lowder', 'weldor', 'wordle'], 'lower': ['lower', 'owler', 'rowel'], 'lowerer': ['lowerer', 'relower'], 'lowery': ['lowery', 'owlery', 'rowley', 'yowler'], 'lowish': ['lowish', 'owlish'], 'lowishly': ['lowishly', 'owlishly', 'sillyhow'], 'lowishness': ['lowishness', 'owlishness'], 'lowy': ['lowy', 'owly', 'yowl'], 'loyal': ['alloy', 'loyal'], 'loyalism': ['loyalism', 'lysiloma'], 'loyd': ['loyd', 'odyl'], 'luba': ['balu', 'baul', 'bual', 'luba'], 'lubber': ['burble', 'lubber', 'rubble'], 'lubberland': ['landlubber', 'lubberland'], 'lube': ['blue', 'lube'], 'lucan': ['lucan', 'nucal'], 'lucania': ['lucania', 'luciana'], 'lucanid': ['dulcian', 'incudal', 'lucanid', 'lucinda'], 'lucanidae': ['leucadian', 'lucanidae'], 'lucarne': ['crenula', 'lucarne', 'nuclear', 'unclear'], 'lucban': ['buncal', 'lucban'], 'luce': ['clue', 'luce'], 'luceres': ['luceres', 'recluse'], 'lucern': ['encurl', 'lucern'], 'lucernal': ['lucernal', 'nucellar', 'uncellar'], 'lucet': ['culet', 'lucet'], 'lucia': ['aulic', 'lucia'], 'lucian': ['cunila', 'lucian', 'lucina', 'uncial'], 'luciana': ['lucania', 'luciana'], 'lucifer': ['ferulic', 'lucifer'], 'lucigen': ['glucine', 'lucigen'], 'lucina': ['cunila', 'lucian', 'lucina', 'uncial'], 'lucinda': ['dulcian', 'incudal', 'lucanid', 'lucinda'], 'lucinoid': ['lucinoid', 'oculinid'], 'lucite': ['lucite', 'luetic', 'uletic'], 'lucrative': ['lucrative', 'revictual', 'victualer'], 'lucre': ['cruel', 'lucre', 'ulcer'], 'lucretia': ['arculite', 'cutleria', 'lucretia', 'reticula', 'treculia'], 'lucretian': ['centurial', 'lucretian', 'ultranice'], 'luctiferous': ['fruticulose', 'luctiferous'], 'lucubrate': ['lucubrate', 'tubercula'], 'ludden': ['ludden', 'nuddle'], 'luddite': ['diluted', 'luddite'], 'ludian': ['dualin', 'ludian', 'unlaid'], 'ludibry': ['buirdly', 'ludibry'], 'ludicroserious': ['ludicroserious', 'serioludicrous'], 'ludo': ['loud', 'ludo'], 'lue': ['leu', 'lue', 'ule'], 'lues': ['lues', 'slue'], 'luetic': ['lucite', 'luetic', 'uletic'], 'lug': ['gul', 'lug'], 'luge': ['glue', 'gule', 'luge'], 'luger': ['gluer', 'gruel', 'luger'], 'lugger': ['gurgle', 'lugger', 'ruggle'], 'lugnas': ['lugnas', 'salung'], 'lugsome': ['glumose', 'lugsome'], 'luian': ['inula', 'luian', 'uinal'], 'luiseno': ['elusion', 'luiseno'], 'luite': ['luite', 'utile'], 'lukas': ['klaus', 'lukas', 'sulka'], 'luke': ['leuk', 'luke'], 'lula': ['lula', 'ulla'], 'lulab': ['bulla', 'lulab'], 'lumbar': ['brumal', 'labrum', 'lumbar', 'umbral'], 'lumber': ['lumber', 'rumble', 'umbrel'], 'lumbosacral': ['lumbosacral', 'sacrolumbal'], 'lumine': ['lumine', 'unlime'], 'lump': ['lump', 'plum'], 'lumper': ['lumper', 'plumer', 'replum', 'rumple'], 'lumpet': ['lumpet', 'plumet'], 'lumpiness': ['lumpiness', 'pluminess'], 'lumpy': ['lumpy', 'plumy'], 'luna': ['laun', 'luna', 'ulna', 'unal'], 'lunacy': ['lunacy', 'unclay'], 'lunar': ['lunar', 'ulnar', 'urnal'], 'lunare': ['lunare', 'neural', 'ulnare', 'unreal'], 'lunaria': ['lunaria', 'ulnaria', 'uralian'], 'lunary': ['lunary', 'uranyl'], 'lunatic': ['calinut', 'lunatic'], 'lunation': ['lunation', 'ultonian'], 'lunda': ['dunal', 'laund', 'lunda', 'ulnad'], 'lung': ['gunl', 'lung'], 'lunge': ['leung', 'lunge'], 'lunged': ['gulden', 'lunged'], 'lungfish': ['flushing', 'lungfish'], 'lungsick': ['lungsick', 'suckling'], 'lunisolar': ['lunisolar', 'solilunar'], 'luo': ['lou', 'luo'], 'lupe': ['lupe', 'pelu', 'peul', 'pule'], 'luperci': ['luperci', 'pleuric'], 'lupicide': ['lupicide', 'pediculi', 'pulicide'], 'lupinaster': ['lupinaster', 'palustrine'], 'lupine': ['lupine', 'unpile', 'upline'], 'lupinus': ['lupinus', 'pinulus'], 'lupis': ['lupis', 'pilus'], 'lupous': ['lupous', 'opulus'], 'lura': ['alur', 'laur', 'lura', 'raul', 'ural'], 'lurch': ['churl', 'lurch'], 'lure': ['lure', 'rule'], 'lurer': ['lurer', 'ruler'], 'lurg': ['gurl', 'lurg'], 'luringly': ['luringly', 'rulingly'], 'luscinia': ['luscinia', 'siculian'], 'lush': ['lush', 'shlu', 'shul'], 'lusher': ['lusher', 'shuler'], 'lushly': ['hyllus', 'lushly'], 'lushness': ['lushness', 'shunless'], 'lusian': ['insula', 'lanius', 'lusian'], 'lusk': ['lusk', 'sulk'], 'lusky': ['lusky', 'sulky'], 'lusory': ['lusory', 'sourly'], 'lust': ['lust', 'slut'], 'luster': ['luster', 'result', 'rustle', 'sutler', 'ulster'], 'lusterless': ['lusterless', 'lustreless', 'resultless'], 'lustihead': ['hastilude', 'lustihead'], 'lustreless': ['lusterless', 'lustreless', 'resultless'], 'lustrine': ['insulter', 'lustrine', 'reinsult'], 'lustring': ['lustring', 'rustling'], 'lusty': ['lusty', 'tylus'], 'lutaceous': ['cautelous', 'lutaceous'], 'lutany': ['auntly', 'lutany'], 'lutayo': ['layout', 'lutayo', 'outlay'], 'lute': ['lute', 'tule'], 'luteal': ['alulet', 'luteal'], 'lutecia': ['aleutic', 'auletic', 'caulite', 'lutecia'], 'lutecium': ['cumulite', 'lutecium'], 'lutein': ['lutein', 'untile'], 'lutfisk': ['kistful', 'lutfisk'], 'luther': ['hurtle', 'luther'], 'lutheran': ['lutheran', 'unhalter'], 'lutianoid': ['lutianoid', 'nautiloid'], 'lutianus': ['lutianus', 'nautilus', 'ustulina'], 'luting': ['glutin', 'luting', 'ungilt'], 'lutose': ['lutose', 'solute', 'tousle'], 'lutra': ['lutra', 'ultra'], 'lutrinae': ['lutrinae', 'retinula', 'rutelian', 'tenurial'], 'luxe': ['luxe', 'ulex'], 'lwo': ['low', 'lwo', 'owl'], 'lyam': ['amyl', 'lyam', 'myal'], 'lyard': ['daryl', 'lardy', 'lyard'], 'lyas': ['lyas', 'slay'], 'lycaenid': ['adenylic', 'lycaenid'], 'lyceum': ['cymule', 'lyceum'], 'lycopodium': ['lycopodium', 'polycodium'], 'lyctidae': ['diacetyl', 'lyctidae'], 'lyddite': ['lyddite', 'tiddley'], 'lydia': ['daily', 'lydia'], 'lydite': ['idlety', 'lydite', 'tidely', 'tidley'], 'lye': ['ley', 'lye'], 'lying': ['lingy', 'lying'], 'lymnaeid': ['lymnaeid', 'maidenly', 'medianly'], 'lymphadenia': ['lymphadenia', 'nymphalidae'], 'lymphectasia': ['lymphectasia', 'metaphysical'], 'lymphopenia': ['lymphopenia', 'polyphemian'], 'lynne': ['lenny', 'lynne'], 'lyon': ['lyon', 'only'], 'lyophobe': ['hypobole', 'lyophobe'], 'lyra': ['aryl', 'lyra', 'ryal', 'yarl'], 'lyraid': ['aridly', 'lyraid'], 'lyrate': ['lyrate', 'raylet', 'realty', 'telary'], 'lyre': ['lyre', 'rely'], 'lyric': ['cyril', 'lyric'], 'lyrical': ['cyrilla', 'lyrical'], 'lyrid': ['idryl', 'lyrid'], 'lys': ['lys', 'sly'], 'lysander': ['lysander', 'synedral'], 'lysate': ['alytes', 'astely', 'lysate', 'stealy'], 'lyse': ['lyse', 'sley'], 'lysiloma': ['loyalism', 'lysiloma'], 'lysine': ['linsey', 'lysine'], 'lysogenetic': ['cleistogeny', 'lysogenetic'], 'lysogenic': ['glycosine', 'lysogenic'], 'lyssic': ['clysis', 'lyssic'], 'lyterian': ['interlay', 'lyterian'], 'lyxose': ['lyxose', 'xylose'], 'ma': ['am', 'ma'], 'maam': ['amma', 'maam'], 'mab': ['bam', 'mab'], 'maba': ['amba', 'maba'], 'mabel': ['amble', 'belam', 'blame', 'mabel'], 'mabi': ['iamb', 'mabi'], 'mabolo': ['abloom', 'mabolo'], 'mac': ['cam', 'mac'], 'macaca': ['camaca', 'macaca'], 'macaco': ['cocama', 'macaco'], 'macaglia': ['almaciga', 'macaglia'], 'macan': ['caman', 'macan'], 'macanese': ['macanese', 'maecenas'], 'macao': ['acoma', 'macao'], 'macarism': ['macarism', 'marasmic'], 'macaroni': ['armonica', 'macaroni', 'marocain'], 'macaronic': ['carcinoma', 'macaronic'], 'mace': ['acme', 'came', 'mace'], 'macedon': ['conamed', 'macedon'], 'macedonian': ['caedmonian', 'macedonian'], 'macedonic': ['caedmonic', 'macedonic'], 'macer': ['cream', 'macer'], 'macerate': ['camerate', 'macerate', 'racemate'], 'maceration': ['aeromantic', 'cameration', 'maceration', 'racemation'], 'machar': ['chamar', 'machar'], 'machi': ['chiam', 'machi', 'micah'], 'machilis': ['chiliasm', 'hilasmic', 'machilis'], 'machinator': ['achromatin', 'chariotman', 'machinator'], 'machine': ['chimane', 'machine'], 'machinery': ['hemicrany', 'machinery'], 'macies': ['camise', 'macies'], 'macigno': ['coaming', 'macigno'], 'macilency': ['cyclamine', 'macilency'], 'macle': ['camel', 'clame', 'cleam', 'macle'], 'maclura': ['maclura', 'macular'], 'maco': ['coma', 'maco'], 'macon': ['coman', 'macon', 'manoc'], 'maconite': ['coinmate', 'maconite'], 'macro': ['carom', 'coram', 'macro', 'marco'], 'macrobian': ['carbamino', 'macrobian'], 'macromazia': ['macromazia', 'macrozamia'], 'macrophage': ['cameograph', 'macrophage'], 'macrophotograph': ['macrophotograph', 'photomacrograph'], 'macrotia': ['aromatic', 'macrotia'], 'macrotin': ['macrotin', 'romantic'], 'macrourid': ['macrourid', 'macruroid'], 'macrourus': ['macrourus', 'macrurous'], 'macrozamia': ['macromazia', 'macrozamia'], 'macruroid': ['macrourid', 'macruroid'], 'macrurous': ['macrourus', 'macrurous'], 'mactra': ['mactra', 'tarmac'], 'macular': ['maclura', 'macular'], 'macule': ['almuce', 'caelum', 'macule'], 'maculose': ['maculose', 'somacule'], 'mad': ['dam', 'mad'], 'madden': ['damned', 'demand', 'madden'], 'maddening': ['demanding', 'maddening'], 'maddeningly': ['demandingly', 'maddeningly'], 'madder': ['dermad', 'madder'], 'made': ['dame', 'made', 'mead'], 'madeira': ['adermia', 'madeira'], 'madeiran': ['madeiran', 'marinade'], 'madeline': ['endemial', 'madeline'], 'madi': ['admi', 'amid', 'madi', 'maid'], 'madia': ['amadi', 'damia', 'madia', 'maida'], 'madiga': ['agamid', 'madiga'], 'madman': ['madman', 'nammad'], 'madnep': ['dampen', 'madnep'], 'madrid': ['madrid', 'riddam'], 'madrier': ['admirer', 'madrier', 'married'], 'madrilene': ['landimere', 'madrilene'], 'madrona': ['anadrom', 'madrona', 'mandora', 'monarda', 'roadman'], 'madship': ['dampish', 'madship', 'phasmid'], 'madurese': ['madurese', 'measured'], 'mae': ['ame', 'mae'], 'maecenas': ['macanese', 'maecenas'], 'maenad': ['anadem', 'maenad'], 'maenadism': ['maenadism', 'mandaeism'], 'maeonian': ['enomania', 'maeonian'], 'maestri': ['artemis', 'maestri', 'misrate'], 'maestro': ['maestro', 'tarsome'], 'mag': ['gam', 'mag'], 'magadis': ['gamasid', 'magadis'], 'magani': ['angami', 'magani', 'magian'], 'magas': ['agsam', 'magas'], 'mage': ['egma', 'game', 'mage'], 'magenta': ['gateman', 'magenta', 'magnate', 'magneta'], 'magian': ['angami', 'magani', 'magian'], 'magic': ['gamic', 'magic'], 'magister': ['gemarist', 'magister', 'sterigma'], 'magistrate': ['magistrate', 'sterigmata'], 'magma': ['gamma', 'magma'], 'magnate': ['gateman', 'magenta', 'magnate', 'magneta'], 'magnes': ['magnes', 'semang'], 'magneta': ['gateman', 'magenta', 'magnate', 'magneta'], 'magnetist': ['agistment', 'magnetist'], 'magneto': ['geomant', 'magneto', 'megaton', 'montage'], 'magnetod': ['magnetod', 'megadont'], 'magnetoelectric': ['electromagnetic', 'magnetoelectric'], 'magnetoelectrical': ['electromagnetical', 'magnetoelectrical'], 'magnolia': ['algomian', 'magnolia'], 'magnus': ['magnus', 'musang'], 'magpie': ['magpie', 'piemag'], 'magyar': ['magyar', 'margay'], 'mah': ['ham', 'mah'], 'maha': ['amah', 'maha'], 'mahar': ['amhar', 'mahar', 'mahra'], 'maharani': ['amiranha', 'maharani'], 'mahdism': ['dammish', 'mahdism'], 'mahdist': ['adsmith', 'mahdist'], 'mahi': ['hami', 'hima', 'mahi'], 'mahican': ['chamian', 'mahican'], 'mahogany': ['hogmanay', 'mahogany'], 'maholi': ['holmia', 'maholi'], 'maholtine': ['hematolin', 'maholtine'], 'mahori': ['homrai', 'mahori', 'mohair'], 'mahra': ['amhar', 'mahar', 'mahra'], 'mahran': ['amhran', 'harman', 'mahran'], 'mahri': ['hiram', 'ihram', 'mahri'], 'maia': ['amia', 'maia'], 'maid': ['admi', 'amid', 'madi', 'maid'], 'maida': ['amadi', 'damia', 'madia', 'maida'], 'maiden': ['daimen', 'damine', 'maiden', 'median', 'medina'], 'maidenism': ['maidenism', 'medianism'], 'maidenly': ['lymnaeid', 'maidenly', 'medianly'], 'maidish': ['hasidim', 'maidish'], 'maidism': ['amidism', 'maidism'], 'maigre': ['imager', 'maigre', 'margie', 'mirage'], 'maiidae': ['amiidae', 'maiidae'], 'mail': ['amil', 'amli', 'lima', 'mail', 'mali', 'mila'], 'mailed': ['aldime', 'mailed', 'medial'], 'mailer': ['mailer', 'remail'], 'mailie': ['emilia', 'mailie'], 'maim': ['ammi', 'imam', 'maim', 'mima'], 'main': ['amin', 'main', 'mani', 'mian', 'mina', 'naim'], 'maine': ['amine', 'anime', 'maine', 'manei'], 'mainly': ['amylin', 'mainly'], 'mainour': ['mainour', 'uramino'], 'mainpast': ['mainpast', 'mantispa', 'panamist', 'stampian'], 'mainprise': ['mainprise', 'presimian'], 'mains': ['mains', 'manis'], 'maint': ['maint', 'matin'], 'maintain': ['amanitin', 'maintain'], 'maintainer': ['antimerina', 'maintainer', 'remaintain'], 'maintop': ['maintop', 'ptomain', 'tampion', 'timpano'], 'maioid': ['daimio', 'maioid'], 'maioidean': ['anomiidae', 'maioidean'], 'maire': ['aimer', 'maire', 'marie', 'ramie'], 'maja': ['jama', 'maja'], 'majoon': ['majoon', 'moonja'], 'major': ['jarmo', 'major'], 'makah': ['hakam', 'makah'], 'makassar': ['makassar', 'samskara'], 'make': ['kame', 'make', 'meak'], 'maker': ['maker', 'marek', 'merak'], 'maki': ['akim', 'maki'], 'mako': ['amok', 'mako'], 'mal': ['lam', 'mal'], 'mala': ['alma', 'amla', 'lama', 'mala'], 'malacologist': ['malacologist', 'mastological'], 'malaga': ['agalma', 'malaga'], 'malagma': ['amalgam', 'malagma'], 'malakin': ['alkamin', 'malakin'], 'malanga': ['malanga', 'nagmaal'], 'malapert': ['armplate', 'malapert'], 'malapi': ['impala', 'malapi'], 'malar': ['alarm', 'malar', 'maral', 'marla', 'ramal'], 'malarin': ['lairman', 'laminar', 'malarin', 'railman'], 'malate': ['malate', 'meatal', 'tamale'], 'malcreated': ['cradlemate', 'malcreated'], 'maldonite': ['antimodel', 'maldonite', 'monilated'], 'male': ['alem', 'alme', 'lame', 'leam', 'male', 'meal', 'mela'], 'maleficiation': ['amelification', 'maleficiation'], 'maleic': ['maleic', 'malice', 'melica'], 'maleinoid': ['alimonied', 'maleinoid'], 'malella': ['lamella', 'malella', 'malleal'], 'maleness': ['lameness', 'maleness', 'maneless', 'nameless'], 'malengine': ['enameling', 'malengine', 'meningeal'], 'maleo': ['amole', 'maleo'], 'malfed': ['flamed', 'malfed'], 'malhonest': ['malhonest', 'mashelton'], 'mali': ['amil', 'amli', 'lima', 'mail', 'mali', 'mila'], 'malic': ['claim', 'clima', 'malic'], 'malice': ['maleic', 'malice', 'melica'], 'malicho': ['chiloma', 'malicho'], 'maligner': ['germinal', 'maligner', 'malinger'], 'malikana': ['kalamian', 'malikana'], 'maline': ['limean', 'maline', 'melian', 'menial'], 'malines': ['malines', 'salmine', 'selamin', 'seminal'], 'malinger': ['germinal', 'maligner', 'malinger'], 'malison': ['malison', 'manolis', 'osmanli', 'somnial'], 'malladrite': ['armillated', 'malladrite', 'mallardite'], 'mallardite': ['armillated', 'malladrite', 'mallardite'], 'malleal': ['lamella', 'malella', 'malleal'], 'mallein': ['mallein', 'manille'], 'malleoincudal': ['incudomalleal', 'malleoincudal'], 'malleus': ['amellus', 'malleus'], 'malmaison': ['anomalism', 'malmaison'], 'malmy': ['lammy', 'malmy'], 'malo': ['loam', 'loma', 'malo', 'mola', 'olam'], 'malonic': ['limacon', 'malonic'], 'malonyl': ['allonym', 'malonyl'], 'malope': ['aplome', 'malope'], 'malpoise': ['malpoise', 'semiopal'], 'malposed': ['malposed', 'plasmode'], 'maltase': ['asmalte', 'maltase'], 'malter': ['armlet', 'malter', 'martel'], 'maltese': ['maltese', 'seamlet'], 'malthe': ['hamlet', 'malthe'], 'malurinae': ['malurinae', 'melanuria'], 'malurine': ['lemurian', 'malurine', 'rumelian'], 'malurus': ['malurus', 'ramulus'], 'malus': ['lamus', 'malus', 'musal', 'slaum'], 'mamers': ['mamers', 'sammer'], 'mamo': ['ammo', 'mamo'], 'man': ['man', 'nam'], 'mana': ['anam', 'mana', 'naam', 'nama'], 'manacle': ['laceman', 'manacle'], 'manacus': ['manacus', 'samucan'], 'manage': ['agname', 'manage'], 'manager': ['gearman', 'manager'], 'manal': ['alman', 'lamna', 'manal'], 'manas': ['manas', 'saman'], 'manatee': ['emanate', 'manatee'], 'manatine': ['annamite', 'manatine'], 'manbird': ['birdman', 'manbird'], 'manchester': ['manchester', 'searchment'], 'mand': ['damn', 'mand'], 'mandaeism': ['maenadism', 'mandaeism'], 'mandaite': ['animated', 'mandaite', 'mantidae'], 'mandarin': ['drainman', 'mandarin'], 'mandation': ['damnation', 'mandation'], 'mandatory': ['damnatory', 'mandatory'], 'mande': ['amend', 'mande', 'maned'], 'mandelate': ['aldeament', 'mandelate'], 'mandil': ['lamnid', 'mandil'], 'mandola': ['mandola', 'odalman'], 'mandora': ['anadrom', 'madrona', 'mandora', 'monarda', 'roadman'], 'mandra': ['mandra', 'radman'], 'mandrill': ['drillman', 'mandrill'], 'mandyas': ['daysman', 'mandyas'], 'mane': ['amen', 'enam', 'mane', 'mean', 'name', 'nema'], 'maned': ['amend', 'mande', 'maned'], 'manege': ['gamene', 'manege', 'menage'], 'manei': ['amine', 'anime', 'maine', 'manei'], 'maneless': ['lameness', 'maleness', 'maneless', 'nameless'], 'manent': ['manent', 'netman'], 'manerial': ['almerian', 'manerial'], 'manes': ['manes', 'manse', 'mensa', 'samen', 'senam'], 'maness': ['enmass', 'maness', 'messan'], 'manettia': ['antietam', 'manettia'], 'maney': ['maney', 'yamen'], 'manga': ['amang', 'ganam', 'manga'], 'mangar': ['amgarn', 'mangar', 'marang', 'ragman'], 'mangel': ['legman', 'mangel', 'mangle'], 'mangelin': ['mangelin', 'nameling'], 'manger': ['engram', 'german', 'manger'], 'mangerite': ['germanite', 'germinate', 'gramenite', 'mangerite'], 'mangi': ['gamin', 'mangi'], 'mangle': ['legman', 'mangel', 'mangle'], 'mango': ['among', 'mango'], 'mangrass': ['grassman', 'mangrass'], 'mangrate': ['grateman', 'mangrate', 'mentagra', 'targeman'], 'mangue': ['mangue', 'maunge'], 'manhead': ['headman', 'manhead'], 'manhole': ['holeman', 'manhole'], 'manhood': ['dhamnoo', 'hoodman', 'manhood'], 'mani': ['amin', 'main', 'mani', 'mian', 'mina', 'naim'], 'mania': ['amain', 'amani', 'amnia', 'anima', 'mania'], 'maniable': ['animable', 'maniable'], 'maniac': ['amniac', 'caiman', 'maniac'], 'manic': ['amnic', 'manic'], 'manid': ['dimna', 'manid'], 'manidae': ['adamine', 'manidae'], 'manify': ['infamy', 'manify'], 'manila': ['almain', 'animal', 'lamina', 'manila'], 'manilla': ['alnilam', 'manilla'], 'manille': ['mallein', 'manille'], 'manioc': ['camion', 'conima', 'manioc', 'monica'], 'maniple': ['impanel', 'maniple'], 'manipuri': ['manipuri', 'unimpair'], 'manis': ['mains', 'manis'], 'manist': ['manist', 'mantis', 'matins', 'stamin'], 'manistic': ['actinism', 'manistic'], 'manito': ['atimon', 'manito', 'montia'], 'maniu': ['maniu', 'munia', 'unami'], 'manius': ['animus', 'anisum', 'anusim', 'manius'], 'maniva': ['maniva', 'vimana'], 'manlet': ['lament', 'manlet', 'mantel', 'mantle', 'mental'], 'manna': ['annam', 'manna'], 'mannite': ['mannite', 'tineman'], 'mannonic': ['cinnamon', 'mannonic'], 'mano': ['mano', 'moan', 'mona', 'noam', 'noma', 'oman'], 'manoc': ['coman', 'macon', 'manoc'], 'manolis': ['malison', 'manolis', 'osmanli', 'somnial'], 'manometrical': ['commentarial', 'manometrical'], 'manometry': ['manometry', 'momentary'], 'manor': ['manor', 'moran', 'norma', 'ramon', 'roman'], 'manorial': ['manorial', 'morainal'], 'manorship': ['manorship', 'orphanism'], 'manoscope': ['manoscope', 'moonscape'], 'manred': ['damner', 'manred', 'randem', 'remand'], 'manrent': ['manrent', 'remnant'], 'manrope': ['manrope', 'ropeman'], 'manse': ['manes', 'manse', 'mensa', 'samen', 'senam'], 'manship': ['manship', 'shipman'], 'mansion': ['mansion', 'onanism'], 'mansioneer': ['emersonian', 'mansioneer'], 'manslaughter': ['manslaughter', 'slaughterman'], 'manso': ['manso', 'mason', 'monas'], 'manta': ['atman', 'manta'], 'mantel': ['lament', 'manlet', 'mantel', 'mantle', 'mental'], 'manteline': ['lineament', 'manteline'], 'manter': ['manter', 'marten', 'rament'], 'mantes': ['mantes', 'stamen'], 'manticore': ['cremation', 'manticore'], 'mantidae': ['animated', 'mandaite', 'mantidae'], 'mantis': ['manist', 'mantis', 'matins', 'stamin'], 'mantispa': ['mainpast', 'mantispa', 'panamist', 'stampian'], 'mantissa': ['mantissa', 'satanism'], 'mantle': ['lament', 'manlet', 'mantel', 'mantle', 'mental'], 'manto': ['manto', 'toman'], 'mantodea': ['mantodea', 'nematoda'], 'mantoidea': ['diatomean', 'mantoidea'], 'mantra': ['mantra', 'tarman'], 'mantrap': ['mantrap', 'rampant'], 'mantua': ['anatum', 'mantua', 'tamanu'], 'manual': ['alumna', 'manual'], 'manualism': ['manualism', 'musalmani'], 'manualiter': ['manualiter', 'unmaterial'], 'manuel': ['manuel', 'unlame'], 'manul': ['lanum', 'manul'], 'manuma': ['amunam', 'manuma'], 'manure': ['manure', 'menura'], 'manward': ['manward', 'wardman'], 'manwards': ['manwards', 'wardsman'], 'manway': ['manway', 'wayman'], 'manwise': ['manwise', 'wiseman'], 'many': ['many', 'myna'], 'mao': ['mao', 'oam'], 'maori': ['maori', 'mario', 'moira'], 'map': ['map', 'pam'], 'mapach': ['champa', 'mapach'], 'maple': ['ample', 'maple'], 'mapper': ['mapper', 'pamper', 'pampre'], 'mar': ['arm', 'mar', 'ram'], 'mara': ['amar', 'amra', 'mara', 'rama'], 'marabout': ['marabout', 'marabuto', 'tamboura'], 'marabuto': ['marabout', 'marabuto', 'tamboura'], 'maraca': ['acamar', 'camara', 'maraca'], 'maral': ['alarm', 'malar', 'maral', 'marla', 'ramal'], 'marang': ['amgarn', 'mangar', 'marang', 'ragman'], 'mararie': ['armeria', 'mararie'], 'marasca': ['marasca', 'mascara'], 'maraschino': ['anachorism', 'chorasmian', 'maraschino'], 'marasmic': ['macarism', 'marasmic'], 'marbelize': ['marbelize', 'marbleize'], 'marble': ['ambler', 'blamer', 'lamber', 'marble', 'ramble'], 'marbleize': ['marbelize', 'marbleize'], 'marbler': ['marbler', 'rambler'], 'marbling': ['marbling', 'rambling'], 'marc': ['cram', 'marc'], 'marcan': ['carman', 'marcan'], 'marcel': ['calmer', 'carmel', 'clamer', 'marcel', 'mercal'], 'marcescent': ['marcescent', 'scarcement'], 'march': ['charm', 'march'], 'marcher': ['charmer', 'marcher', 'remarch'], 'marchite': ['athermic', 'marchite', 'rhematic'], 'marchpane': ['marchpane', 'preachman'], 'marci': ['marci', 'mirac'], 'marcionist': ['marcionist', 'romanistic'], 'marcionite': ['marcionite', 'microtinae', 'remication'], 'marco': ['carom', 'coram', 'macro', 'marco'], 'marconi': ['amicron', 'marconi', 'minorca', 'romanic'], 'mare': ['erma', 'mare', 'rame', 'ream'], 'mareca': ['acream', 'camera', 'mareca'], 'marek': ['maker', 'marek', 'merak'], 'marengo': ['marengo', 'megaron'], 'mareotid': ['mareotid', 'mediator'], 'marfik': ['marfik', 'mirfak'], 'marfire': ['firearm', 'marfire'], 'margay': ['magyar', 'margay'], 'marge': ['grame', 'marge', 'regma'], 'margeline': ['margeline', 'regimenal'], 'margent': ['garment', 'margent'], 'margie': ['imager', 'maigre', 'margie', 'mirage'], 'margin': ['arming', 'ingram', 'margin'], 'marginal': ['alarming', 'marginal'], 'marginally': ['alarmingly', 'marginally'], 'marginate': ['armangite', 'marginate'], 'marginated': ['argentamid', 'marginated'], 'margined': ['dirgeman', 'margined', 'midrange'], 'marginiform': ['graminiform', 'marginiform'], 'margot': ['gomart', 'margot'], 'marhala': ['harmala', 'marhala'], 'mari': ['amir', 'irma', 'mari', 'mira', 'rami', 'rima'], 'marialite': ['latimeria', 'marialite'], 'marian': ['airman', 'amarin', 'marian', 'marina', 'mirana'], 'mariana': ['aramina', 'mariana'], 'marianne': ['armenian', 'marianne'], 'marie': ['aimer', 'maire', 'marie', 'ramie'], 'marigenous': ['germanious', 'gramineous', 'marigenous'], 'marilla': ['armilla', 'marilla'], 'marina': ['airman', 'amarin', 'marian', 'marina', 'mirana'], 'marinade': ['madeiran', 'marinade'], 'marinate': ['animater', 'marinate'], 'marine': ['ermani', 'marine', 'remain'], 'marinist': ['marinist', 'mistrain'], 'mario': ['maori', 'mario', 'moira'], 'marion': ['marion', 'romain'], 'mariou': ['mariou', 'oarium'], 'maris': ['maris', 'marsi', 'samir', 'simar'], 'marish': ['marish', 'shamir'], 'marishness': ['marishness', 'marshiness'], 'marist': ['marist', 'matris', 'ramist'], 'maritage': ['gematria', 'maritage'], 'marital': ['marital', 'martial'], 'maritality': ['maritality', 'martiality'], 'maritally': ['maritally', 'martially'], 'marka': ['karma', 'krama', 'marka'], 'markeb': ['embark', 'markeb'], 'marked': ['demark', 'marked'], 'marker': ['marker', 'remark'], 'marketable': ['marketable', 'tablemaker'], 'marketeer': ['marketeer', 'treemaker'], 'marketer': ['marketer', 'remarket'], 'marko': ['marko', 'marok'], 'marla': ['alarm', 'malar', 'maral', 'marla', 'ramal'], 'marled': ['dermal', 'marled', 'medlar'], 'marli': ['armil', 'marli', 'rimal'], 'marline': ['marline', 'mineral', 'ramline'], 'marlite': ['lamiter', 'marlite'], 'marlock': ['lockram', 'marlock'], 'maro': ['amor', 'maro', 'mora', 'omar', 'roam'], 'marocain': ['armonica', 'macaroni', 'marocain'], 'marok': ['marko', 'marok'], 'maronian': ['maronian', 'romanian'], 'maronist': ['maronist', 'romanist'], 'maronite': ['maronite', 'martinoe', 'minorate', 'morenita', 'romanite'], 'marquesan': ['marquesan', 'squareman'], 'marquis': ['asquirm', 'marquis'], 'marree': ['marree', 'reamer'], 'married': ['admirer', 'madrier', 'married'], 'marrot': ['marrot', 'mortar'], 'marrowed': ['marrowed', 'romeward'], 'marryer': ['marryer', 'remarry'], 'mars': ['arms', 'mars'], 'marsh': ['marsh', 'shram'], 'marshaler': ['marshaler', 'remarshal'], 'marshiness': ['marishness', 'marshiness'], 'marshite': ['arthemis', 'marshite', 'meharist'], 'marsi': ['maris', 'marsi', 'samir', 'simar'], 'marsipobranchiata': ['basiparachromatin', 'marsipobranchiata'], 'mart': ['mart', 'tram'], 'martel': ['armlet', 'malter', 'martel'], 'marteline': ['alimenter', 'marteline'], 'marten': ['manter', 'marten', 'rament'], 'martes': ['martes', 'master', 'remast', 'stream'], 'martha': ['amarth', 'martha'], 'martial': ['marital', 'martial'], 'martiality': ['maritality', 'martiality'], 'martially': ['maritally', 'martially'], 'martian': ['martian', 'tamarin'], 'martinet': ['intermat', 'martinet', 'tetramin'], 'martinico': ['martinico', 'mortician'], 'martinoe': ['maronite', 'martinoe', 'minorate', 'morenita', 'romanite'], 'martite': ['martite', 'mitrate'], 'martius': ['martius', 'matsuri', 'maurist'], 'martu': ['martu', 'murat', 'turma'], 'marty': ['marty', 'tryma'], 'maru': ['arum', 'maru', 'mura'], 'mary': ['army', 'mary', 'myra', 'yarm'], 'marylander': ['aldermanry', 'marylander'], 'marysole': ['marysole', 'ramosely'], 'mas': ['mas', 'sam', 'sma'], 'mascara': ['marasca', 'mascara'], 'mascotry': ['arctomys', 'costmary', 'mascotry'], 'masculine': ['masculine', 'semuncial', 'simulance'], 'masculist': ['masculist', 'simulcast'], 'masdeu': ['amused', 'masdeu', 'medusa'], 'mash': ['mash', 'samh', 'sham'], 'masha': ['hamsa', 'masha', 'shama'], 'mashal': ['mashal', 'shamal'], 'mashelton': ['malhonest', 'mashelton'], 'masher': ['masher', 'ramesh', 'shamer'], 'mashy': ['mashy', 'shyam'], 'mask': ['kasm', 'mask'], 'masker': ['masker', 'remask'], 'mason': ['manso', 'mason', 'monas'], 'masoner': ['masoner', 'romanes'], 'masonic': ['anosmic', 'masonic'], 'masonite': ['masonite', 'misatone'], 'maspiter': ['maspiter', 'pastimer', 'primates'], 'masque': ['masque', 'squame', 'squeam'], 'massa': ['amass', 'assam', 'massa', 'samas'], 'masse': ['masse', 'sesma'], 'masser': ['masser', 'remass'], 'masseter': ['masseter', 'seamster'], 'masseur': ['assumer', 'erasmus', 'masseur'], 'massicot': ['acosmist', 'massicot', 'somatics'], 'massiness': ['amissness', 'massiness'], 'masskanne': ['masskanne', 'sneaksman'], 'mast': ['mast', 'mats', 'stam'], 'masted': ['demast', 'masted'], 'master': ['martes', 'master', 'remast', 'stream'], 'masterate': ['masterate', 'metatarse'], 'masterer': ['masterer', 'restream', 'streamer'], 'masterful': ['masterful', 'streamful'], 'masterless': ['masterless', 'streamless'], 'masterlike': ['masterlike', 'streamlike'], 'masterling': ['masterling', 'streamling'], 'masterly': ['masterly', 'myrtales'], 'mastership': ['mastership', 'shipmaster'], 'masterwork': ['masterwork', 'workmaster'], 'masterwort': ['masterwort', 'streamwort'], 'mastery': ['mastery', 'streamy'], 'mastic': ['mastic', 'misact'], 'masticable': ['ablastemic', 'masticable'], 'mastiche': ['mastiche', 'misteach'], 'mastlike': ['kemalist', 'mastlike'], 'mastoid': ['distoma', 'mastoid'], 'mastoidale': ['diatomales', 'mastoidale', 'mastoideal'], 'mastoideal': ['diatomales', 'mastoidale', 'mastoideal'], 'mastological': ['malacologist', 'mastological'], 'mastomenia': ['mastomenia', 'seminomata'], 'mastotomy': ['mastotomy', 'stomatomy'], 'masu': ['masu', 'musa', 'saum'], 'mat': ['amt', 'mat', 'tam'], 'matacan': ['matacan', 'tamanac'], 'matai': ['amati', 'amita', 'matai'], 'matar': ['matar', 'matra', 'trama'], 'matara': ['armata', 'matara', 'tamara'], 'matcher': ['matcher', 'rematch'], 'mate': ['mate', 'meat', 'meta', 'tame', 'team', 'tema'], 'mateless': ['mateless', 'meatless', 'tameless', 'teamless'], 'matelessness': ['matelessness', 'tamelessness'], 'mately': ['mately', 'tamely'], 'mater': ['armet', 'mater', 'merat', 'metra', 'ramet', 'tamer', 'terma', 'trame', 'trema'], 'materialism': ['immaterials', 'materialism'], 'materiel': ['eremital', 'materiel'], 'maternal': ['maternal', 'ramental'], 'maternology': ['laryngotome', 'maternology'], 'mateship': ['aphetism', 'mateship', 'shipmate', 'spithame'], 'matey': ['matey', 'meaty'], 'mathesis': ['mathesis', 'thamesis'], 'mathetic': ['mathetic', 'thematic'], 'matico': ['atomic', 'matico'], 'matin': ['maint', 'matin'], 'matinee': ['amenite', 'etamine', 'matinee'], 'matins': ['manist', 'mantis', 'matins', 'stamin'], 'matra': ['matar', 'matra', 'trama'], 'matral': ['matral', 'tramal'], 'matralia': ['altamira', 'matralia'], 'matrices': ['camerist', 'ceramist', 'matrices'], 'matricide': ['citramide', 'diametric', 'matricide'], 'matricula': ['lactarium', 'matricula'], 'matricular': ['matricular', 'trimacular'], 'matris': ['marist', 'matris', 'ramist'], 'matrocliny': ['matrocliny', 'romanticly'], 'matronism': ['matronism', 'romantism'], 'mats': ['mast', 'mats', 'stam'], 'matsu': ['matsu', 'tamus', 'tsuma'], 'matsuri': ['martius', 'matsuri', 'maurist'], 'matter': ['matter', 'mettar'], 'mattoir': ['mattoir', 'tritoma'], 'maturable': ['maturable', 'metabular'], 'maturation': ['maturation', 'natatorium'], 'maturer': ['erratum', 'maturer'], 'mau': ['aum', 'mau'], 'maud': ['duma', 'maud'], 'maudle': ['almude', 'maudle'], 'mauger': ['mauger', 'murage'], 'maul': ['alum', 'maul'], 'mauler': ['mauler', 'merula', 'ramule'], 'maun': ['maun', 'numa'], 'maund': ['maund', 'munda', 'numda', 'undam', 'unmad'], 'maunder': ['duramen', 'maunder', 'unarmed'], 'maunderer': ['maunderer', 'underream'], 'maunge': ['mangue', 'maunge'], 'maureen': ['maureen', 'menurae'], 'maurice': ['maurice', 'uraemic'], 'maurist': ['martius', 'matsuri', 'maurist'], 'mauser': ['amuser', 'mauser'], 'mavis': ['amvis', 'mavis'], 'maw': ['maw', 'mwa'], 'mawp': ['mawp', 'wamp'], 'may': ['amy', 'may', 'mya', 'yam'], 'maybe': ['beamy', 'embay', 'maybe'], 'mayer': ['mayer', 'reamy'], 'maylike': ['maylike', 'yamilke'], 'mayo': ['amoy', 'mayo'], 'mayor': ['mayor', 'moray'], 'maypoling': ['maypoling', 'pygmalion'], 'maysin': ['maysin', 'minyas', 'mysian'], 'maytide': ['daytime', 'maytide'], 'mazer': ['mazer', 'zerma'], 'mazur': ['mazur', 'murza'], 'mbaya': ['ambay', 'mbaya'], 'me': ['em', 'me'], 'meable': ['bemeal', 'meable'], 'mead': ['dame', 'made', 'mead'], 'meader': ['meader', 'remade'], 'meager': ['graeme', 'meager', 'meagre'], 'meagre': ['graeme', 'meager', 'meagre'], 'meak': ['kame', 'make', 'meak'], 'meal': ['alem', 'alme', 'lame', 'leam', 'male', 'meal', 'mela'], 'mealer': ['leamer', 'mealer'], 'mealiness': ['mealiness', 'messaline'], 'mealy': ['mealy', 'yamel'], 'mean': ['amen', 'enam', 'mane', 'mean', 'name', 'nema'], 'meander': ['amender', 'meander', 'reamend', 'reedman'], 'meandrite': ['demetrian', 'dermatine', 'meandrite', 'minareted'], 'meandrous': ['meandrous', 'roundseam'], 'meaned': ['amende', 'demean', 'meaned', 'nadeem'], 'meaner': ['enarme', 'meaner', 'rename'], 'meanly': ['meanly', 'namely'], 'meant': ['ament', 'meant', 'teman'], 'mease': ['emesa', 'mease'], 'measly': ['measly', 'samely'], 'measuration': ['aeronautism', 'measuration'], 'measure': ['measure', 'reamuse'], 'measured': ['madurese', 'measured'], 'meat': ['mate', 'meat', 'meta', 'tame', 'team', 'tema'], 'meatal': ['malate', 'meatal', 'tamale'], 'meatless': ['mateless', 'meatless', 'tameless', 'teamless'], 'meatman': ['meatman', 'teamman'], 'meatus': ['meatus', 'mutase'], 'meaty': ['matey', 'meaty'], 'mechanal': ['leachman', 'mechanal'], 'mechanicochemical': ['chemicomechanical', 'mechanicochemical'], 'mechanics': ['mechanics', 'mischance'], 'mechir': ['chimer', 'mechir', 'micher'], 'mecometry': ['cymometer', 'mecometry'], 'meconic': ['comenic', 'encomic', 'meconic'], 'meconin': ['ennomic', 'meconin'], 'meconioid': ['meconioid', 'monoeidic'], 'meconium': ['encomium', 'meconium'], 'mecopteron': ['mecopteron', 'protocneme'], 'medal': ['demal', 'medal'], 'medallary': ['alarmedly', 'medallary'], 'mede': ['deem', 'deme', 'mede', 'meed'], 'media': ['amide', 'damie', 'media'], 'mediacy': ['dicyema', 'mediacy'], 'mediad': ['diadem', 'mediad'], 'medial': ['aldime', 'mailed', 'medial'], 'median': ['daimen', 'damine', 'maiden', 'median', 'medina'], 'medianism': ['maidenism', 'medianism'], 'medianly': ['lymnaeid', 'maidenly', 'medianly'], 'mediator': ['mareotid', 'mediator'], 'mediatress': ['mediatress', 'streamside'], 'mediatrice': ['acidimeter', 'mediatrice'], 'medical': ['camelid', 'decimal', 'declaim', 'medical'], 'medically': ['decimally', 'medically'], 'medicate': ['decimate', 'medicate'], 'medication': ['decimation', 'medication'], 'medicator': ['decimator', 'medicator', 'mordicate'], 'medicatory': ['acidometry', 'medicatory', 'radiectomy'], 'medicinal': ['adminicle', 'medicinal'], 'medicophysical': ['medicophysical', 'physicomedical'], 'medimnos': ['demonism', 'medimnos', 'misnomed'], 'medina': ['daimen', 'damine', 'maiden', 'median', 'medina'], 'medino': ['domine', 'domnei', 'emodin', 'medino'], 'mediocrist': ['dosimetric', 'mediocrist'], 'mediocrity': ['iridectomy', 'mediocrity'], 'mediodorsal': ['dorsomedial', 'mediodorsal'], 'medioventral': ['medioventral', 'ventromedial'], 'meditate': ['admittee', 'meditate'], 'meditator': ['meditator', 'trematoid'], 'medlar': ['dermal', 'marled', 'medlar'], 'medusa': ['amused', 'masdeu', 'medusa'], 'medusan': ['medusan', 'sudamen'], 'meece': ['emcee', 'meece'], 'meed': ['deem', 'deme', 'mede', 'meed'], 'meeks': ['meeks', 'smeek'], 'meered': ['deemer', 'meered', 'redeem', 'remede'], 'meet': ['meet', 'mete', 'teem'], 'meeter': ['meeter', 'remeet', 'teemer'], 'meethelp': ['helpmeet', 'meethelp'], 'meeting': ['meeting', 'teeming', 'tegmine'], 'meg': ['gem', 'meg'], 'megabar': ['bergama', 'megabar'], 'megachiropteran': ['cinematographer', 'megachiropteran'], 'megadont': ['magnetod', 'megadont'], 'megadyne': ['ganymede', 'megadyne'], 'megaera': ['megaera', 'reamage'], 'megalodon': ['megalodon', 'moonglade'], 'megalohepatia': ['hepatomegalia', 'megalohepatia'], 'megalophonous': ['megalophonous', 'omphalogenous'], 'megalosplenia': ['megalosplenia', 'splenomegalia'], 'megapod': ['megapod', 'pagedom'], 'megapodius': ['megapodius', 'pseudimago'], 'megarian': ['germania', 'megarian'], 'megaric': ['gemaric', 'grimace', 'megaric'], 'megaron': ['marengo', 'megaron'], 'megaton': ['geomant', 'magneto', 'megaton', 'montage'], 'megmho': ['megmho', 'megohm'], 'megohm': ['megmho', 'megohm'], 'megrim': ['gimmer', 'grimme', 'megrim'], 'mehari': ['mehari', 'meriah'], 'meharist': ['arthemis', 'marshite', 'meharist'], 'meile': ['elemi', 'meile'], 'mein': ['mein', 'mien', 'mine'], 'meio': ['meio', 'oime'], 'mel': ['elm', 'mel'], 'mela': ['alem', 'alme', 'lame', 'leam', 'male', 'meal', 'mela'], 'melaconite': ['colemanite', 'melaconite'], 'melalgia': ['gamaliel', 'melalgia'], 'melam': ['lemma', 'melam'], 'melamine': ['ammeline', 'melamine'], 'melange': ['gleeman', 'melange'], 'melania': ['laminae', 'melania'], 'melanian': ['alemanni', 'melanian'], 'melanic': ['cnemial', 'melanic'], 'melanilin': ['melanilin', 'millennia'], 'melanin': ['lemnian', 'lineman', 'melanin'], 'melanism': ['melanism', 'slimeman'], 'melanite': ['melanite', 'meletian', 'metaline', 'nemalite'], 'melanitic': ['alimentic', 'antilemic', 'melanitic', 'metanilic'], 'melanochroi': ['chloroamine', 'melanochroi'], 'melanogen': ['melanogen', 'melongena'], 'melanoid': ['demonial', 'melanoid'], 'melanorrhea': ['amenorrheal', 'melanorrhea'], 'melanosis': ['loaminess', 'melanosis'], 'melanotic': ['entomical', 'melanotic'], 'melanuria': ['malurinae', 'melanuria'], 'melanuric': ['ceruminal', 'melanuric', 'numerical'], 'melas': ['amsel', 'melas', 'mesal', 'samel'], 'melastoma': ['melastoma', 'metasomal'], 'meldrop': ['meldrop', 'premold'], 'melena': ['enamel', 'melena'], 'melenic': ['celemin', 'melenic'], 'meletian': ['melanite', 'meletian', 'metaline', 'nemalite'], 'meletski': ['meletski', 'stemlike'], 'melian': ['limean', 'maline', 'melian', 'menial'], 'meliatin': ['meliatin', 'timaline'], 'melic': ['clime', 'melic'], 'melica': ['maleic', 'malice', 'melica'], 'melicerta': ['carmelite', 'melicerta'], 'melicraton': ['centimolar', 'melicraton'], 'melinda': ['idleman', 'melinda'], 'meline': ['elemin', 'meline'], 'melinite': ['ilmenite', 'melinite', 'menilite'], 'meliorant': ['meliorant', 'mentorial'], 'melissa': ['aimless', 'melissa', 'seismal'], 'melitose': ['melitose', 'mesolite'], 'mellay': ['lamely', 'mellay'], 'mellit': ['mellit', 'millet'], 'melodia': ['melodia', 'molidae'], 'melodica': ['cameloid', 'comedial', 'melodica'], 'melodicon': ['clinodome', 'melodicon', 'monocleid'], 'melodist': ['melodist', 'modelist'], 'melomanic': ['commelina', 'melomanic'], 'melon': ['lemon', 'melon', 'monel'], 'melongena': ['melanogen', 'melongena'], 'melonist': ['melonist', 'telonism'], 'melonites': ['limestone', 'melonites', 'milestone'], 'melonlike': ['lemonlike', 'melonlike'], 'meloplasty': ['meloplasty', 'myeloplast'], 'melosa': ['melosa', 'salome', 'semola'], 'melotragic': ['algometric', 'melotragic'], 'melotrope': ['melotrope', 'metropole'], 'melter': ['melter', 'remelt'], 'melters': ['melters', 'resmelt', 'smelter'], 'melton': ['loment', 'melton', 'molten'], 'melungeon': ['melungeon', 'nonlegume'], 'mem': ['emm', 'mem'], 'memnon': ['memnon', 'mennom'], 'memo': ['memo', 'mome'], 'memorandist': ['memorandist', 'moderantism', 'semidormant'], 'menage': ['gamene', 'manege', 'menage'], 'menald': ['lemnad', 'menald'], 'menaspis': ['menaspis', 'semispan'], 'mendaite': ['dementia', 'mendaite'], 'mende': ['emend', 'mende'], 'mender': ['mender', 'remend'], 'mendi': ['denim', 'mendi'], 'mendipite': ['impedient', 'mendipite'], 'menial': ['limean', 'maline', 'melian', 'menial'], 'menic': ['menic', 'mince'], 'menilite': ['ilmenite', 'melinite', 'menilite'], 'meningeal': ['enameling', 'malengine', 'meningeal'], 'meningocephalitis': ['cephalomeningitis', 'meningocephalitis'], 'meningocerebritis': ['cerebromeningitis', 'meningocerebritis'], 'meningoencephalitis': ['encephalomeningitis', 'meningoencephalitis'], 'meningoencephalocele': ['encephalomeningocele', 'meningoencephalocele'], 'meningomyelitis': ['meningomyelitis', 'myelomeningitis'], 'meningomyelocele': ['meningomyelocele', 'myelomeningocele'], 'mennom': ['memnon', 'mennom'], 'menostasia': ['anematosis', 'menostasia'], 'mensa': ['manes', 'manse', 'mensa', 'samen', 'senam'], 'mensal': ['anselm', 'mensal'], 'mense': ['mense', 'mesne', 'semen'], 'menstrual': ['menstrual', 'ulsterman'], 'mensurable': ['lebensraum', 'mensurable'], 'mentagra': ['grateman', 'mangrate', 'mentagra', 'targeman'], 'mental': ['lament', 'manlet', 'mantel', 'mantle', 'mental'], 'mentalis': ['mentalis', 'smaltine', 'stileman'], 'mentalize': ['mentalize', 'mentzelia'], 'mentation': ['mentation', 'montanite'], 'mentha': ['anthem', 'hetman', 'mentha'], 'menthane': ['enanthem', 'menthane'], 'mentigerous': ['mentigerous', 'tergeminous'], 'mentolabial': ['labiomental', 'mentolabial'], 'mentor': ['mentor', 'merton', 'termon', 'tormen'], 'mentorial': ['meliorant', 'mentorial'], 'mentzelia': ['mentalize', 'mentzelia'], 'menura': ['manure', 'menura'], 'menurae': ['maureen', 'menurae'], 'menyie': ['menyie', 'yemeni'], 'meo': ['meo', 'moe'], 'mephisto': ['mephisto', 'pithsome'], 'merak': ['maker', 'marek', 'merak'], 'merat': ['armet', 'mater', 'merat', 'metra', 'ramet', 'tamer', 'terma', 'trame', 'trema'], 'meratia': ['ametria', 'artemia', 'meratia', 'ramaite'], 'mercal': ['calmer', 'carmel', 'clamer', 'marcel', 'mercal'], 'mercator': ['cremator', 'mercator'], 'mercatorial': ['crematorial', 'mercatorial'], 'mercian': ['armenic', 'carmine', 'ceriman', 'crimean', 'mercian'], 'merciful': ['crimeful', 'merciful'], 'merciless': ['crimeless', 'merciless'], 'mercilessness': ['crimelessness', 'mercilessness'], 'mere': ['mere', 'reem'], 'merel': ['elmer', 'merel', 'merle'], 'merely': ['merely', 'yelmer'], 'merginae': ['ergamine', 'merginae'], 'mergus': ['gersum', 'mergus'], 'meriah': ['mehari', 'meriah'], 'merice': ['eremic', 'merice'], 'merida': ['admire', 'armied', 'damier', 'dimera', 'merida'], 'meril': ['limer', 'meril', 'miler'], 'meriones': ['emersion', 'meriones'], 'merism': ['merism', 'mermis', 'simmer'], 'merist': ['merist', 'mister', 'smiter'], 'meristem': ['meristem', 'mimester'], 'meristic': ['meristic', 'trimesic', 'trisemic'], 'merit': ['merit', 'miter', 'mitre', 'remit', 'timer'], 'merited': ['demerit', 'dimeter', 'merited', 'mitered'], 'meriter': ['meriter', 'miterer', 'trireme'], 'merle': ['elmer', 'merel', 'merle'], 'merlin': ['limner', 'merlin', 'milner'], 'mermaid': ['demiram', 'mermaid'], 'mermis': ['merism', 'mermis', 'simmer'], 'mero': ['mero', 'more', 'omer', 'rome'], 'meroblastic': ['blastomeric', 'meroblastic'], 'merocyte': ['cytomere', 'merocyte'], 'merogony': ['gonomery', 'merogony'], 'meroistic': ['eroticism', 'isometric', 'meroistic', 'trioecism'], 'merop': ['merop', 'moper', 'proem', 'remop'], 'meropia': ['emporia', 'meropia'], 'meros': ['meros', 'mores', 'morse', 'sermo', 'smore'], 'merosthenic': ['merosthenic', 'microsthene'], 'merostome': ['merostome', 'osmometer'], 'merrow': ['merrow', 'wormer'], 'merse': ['merse', 'smeer'], 'merton': ['mentor', 'merton', 'termon', 'tormen'], 'merula': ['mauler', 'merula', 'ramule'], 'meruline': ['lemurine', 'meruline', 'relumine'], 'mesa': ['asem', 'mesa', 'same', 'seam'], 'mesad': ['desma', 'mesad'], 'mesadenia': ['deaminase', 'mesadenia'], 'mesail': ['amiles', 'asmile', 'mesail', 'mesial', 'samiel'], 'mesal': ['amsel', 'melas', 'mesal', 'samel'], 'mesalike': ['mesalike', 'seamlike'], 'mesaraic': ['cramasie', 'mesaraic'], 'mesaticephaly': ['hemicatalepsy', 'mesaticephaly'], 'mese': ['mese', 'seem', 'seme', 'smee'], 'meshech': ['meshech', 'shechem'], 'mesial': ['amiles', 'asmile', 'mesail', 'mesial', 'samiel'], 'mesian': ['asimen', 'inseam', 'mesian'], 'mesic': ['mesic', 'semic'], 'mesion': ['eonism', 'mesion', 'oneism', 'simeon'], 'mesitae': ['amesite', 'mesitae', 'semitae'], 'mesne': ['mense', 'mesne', 'semen'], 'meso': ['meso', 'mose', 'some'], 'mesobar': ['ambrose', 'mesobar'], 'mesocephaly': ['elaphomyces', 'mesocephaly'], 'mesognathic': ['asthmogenic', 'mesognathic'], 'mesohepar': ['mesohepar', 'semaphore'], 'mesolite': ['melitose', 'mesolite'], 'mesolithic': ['homiletics', 'mesolithic'], 'mesological': ['mesological', 'semological'], 'mesology': ['mesology', 'semology'], 'mesomeric': ['mesomeric', 'microseme', 'semicrome'], 'mesonotum': ['mesonotum', 'momentous'], 'mesorectal': ['calotermes', 'mesorectal', 'metacresol'], 'mesotonic': ['economist', 'mesotonic'], 'mesoventral': ['mesoventral', 'ventromesal'], 'mespil': ['mespil', 'simple'], 'mesropian': ['mesropian', 'promnesia', 'spironema'], 'messalian': ['messalian', 'seminasal'], 'messaline': ['mealiness', 'messaline'], 'messan': ['enmass', 'maness', 'messan'], 'messelite': ['messelite', 'semisteel', 'teleseism'], 'messines': ['essenism', 'messines'], 'messor': ['messor', 'mosser', 'somers'], 'mestee': ['esteem', 'mestee'], 'mester': ['mester', 'restem', 'temser', 'termes'], 'mesua': ['amuse', 'mesua'], 'meta': ['mate', 'meat', 'meta', 'tame', 'team', 'tema'], 'metabular': ['maturable', 'metabular'], 'metaconid': ['comediant', 'metaconid'], 'metacresol': ['calotermes', 'mesorectal', 'metacresol'], 'metage': ['gamete', 'metage'], 'metaler': ['lameter', 'metaler', 'remetal'], 'metaline': ['melanite', 'meletian', 'metaline', 'nemalite'], 'metaling': ['ligament', 'metaling', 'tegminal'], 'metalist': ['metalist', 'smaltite'], 'metallism': ['metallism', 'smalltime'], 'metamer': ['ammeter', 'metamer'], 'metanilic': ['alimentic', 'antilemic', 'melanitic', 'metanilic'], 'metaphor': ['metaphor', 'trophema'], 'metaphoric': ['amphoteric', 'metaphoric'], 'metaphorical': ['metaphorical', 'pharmacolite'], 'metaphysical': ['lymphectasia', 'metaphysical'], 'metaplastic': ['metaplastic', 'palmatisect'], 'metapore': ['ametrope', 'metapore'], 'metasomal': ['melastoma', 'metasomal'], 'metatarse': ['masterate', 'metatarse'], 'metatheria': ['hemiterata', 'metatheria'], 'metatrophic': ['metatrophic', 'metropathic'], 'metaxenia': ['examinate', 'exanimate', 'metaxenia'], 'mete': ['meet', 'mete', 'teem'], 'meteor': ['meteor', 'remote'], 'meteorgraph': ['graphometer', 'meteorgraph'], 'meteorical': ['carmeloite', 'ectromelia', 'meteorical'], 'meteoristic': ['meteoristic', 'meteoritics'], 'meteoritics': ['meteoristic', 'meteoritics'], 'meteoroid': ['meteoroid', 'odiometer'], 'meter': ['meter', 'retem'], 'meterless': ['meterless', 'metreless'], 'metership': ['herpetism', 'metership', 'metreship', 'temperish'], 'methanal': ['latheman', 'methanal'], 'methanate': ['hetmanate', 'methanate'], 'methanoic': ['hematonic', 'methanoic'], 'mether': ['mether', 'themer'], 'method': ['method', 'mothed'], 'methylacetanilide': ['acetmethylanilide', 'methylacetanilide'], 'methylic': ['methylic', 'thymelic'], 'methylotic': ['lithectomy', 'methylotic'], 'metier': ['metier', 'retime', 'tremie'], 'metin': ['metin', 'temin', 'timne'], 'metis': ['metis', 'smite', 'stime', 'times'], 'metoac': ['comate', 'metoac', 'tecoma'], 'metol': ['metol', 'motel'], 'metonymical': ['laminectomy', 'metonymical'], 'metope': ['metope', 'poemet'], 'metopias': ['epistoma', 'metopias'], 'metosteon': ['metosteon', 'tomentose'], 'metra': ['armet', 'mater', 'merat', 'metra', 'ramet', 'tamer', 'terma', 'trame', 'trema'], 'metrectasia': ['metrectasia', 'remasticate'], 'metreless': ['meterless', 'metreless'], 'metreship': ['herpetism', 'metership', 'metreship', 'temperish'], 'metria': ['imaret', 'metria', 'mirate', 'rimate'], 'metrician': ['antimeric', 'carminite', 'criminate', 'metrician'], 'metrics': ['cretism', 'metrics'], 'metrocratic': ['cratometric', 'metrocratic'], 'metrological': ['logometrical', 'metrological'], 'metronome': ['metronome', 'monometer', 'monotreme'], 'metronomic': ['commorient', 'metronomic', 'monometric'], 'metronomical': ['metronomical', 'monometrical'], 'metropathic': ['metatrophic', 'metropathic'], 'metrophlebitis': ['metrophlebitis', 'phlebometritis'], 'metropole': ['melotrope', 'metropole'], 'metroptosia': ['metroptosia', 'prostomiate'], 'metrorrhea': ['arthromere', 'metrorrhea'], 'metrostyle': ['metrostyle', 'stylometer'], 'mettar': ['matter', 'mettar'], 'metusia': ['metusia', 'suimate', 'timaeus'], 'mew': ['mew', 'wem'], 'meward': ['meward', 'warmed'], 'mho': ['mho', 'ohm'], 'mhometer': ['mhometer', 'ohmmeter'], 'miamia': ['amimia', 'miamia'], 'mian': ['amin', 'main', 'mani', 'mian', 'mina', 'naim'], 'miaotse': ['miaotse', 'ostemia'], 'miaotze': ['atomize', 'miaotze'], 'mias': ['mias', 'saim', 'siam', 'sima'], 'miasmal': ['lamaism', 'miasmal'], 'miastor': ['amorist', 'aortism', 'miastor'], 'miaul': ['aumil', 'miaul'], 'miauler': ['lemuria', 'miauler'], 'mib': ['bim', 'mib'], 'mica': ['amic', 'mica'], 'micah': ['chiam', 'machi', 'micah'], 'micate': ['acmite', 'micate'], 'mication': ['amniotic', 'mication'], 'micellar': ['micellar', 'millrace'], 'michael': ['michael', 'micheal'], 'miche': ['chime', 'hemic', 'miche'], 'micheal': ['michael', 'micheal'], 'micher': ['chimer', 'mechir', 'micher'], 'micht': ['micht', 'mitch'], 'micranthropos': ['micranthropos', 'promonarchist'], 'micro': ['micro', 'moric', 'romic'], 'microcephal': ['microcephal', 'prochemical'], 'microcephaly': ['microcephaly', 'pyrochemical'], 'microcinema': ['microcinema', 'microcnemia'], 'microcnemia': ['microcinema', 'microcnemia'], 'microcrith': ['microcrith', 'trichromic'], 'micropetalous': ['micropetalous', 'somatopleuric'], 'microphagy': ['microphagy', 'myographic'], 'microphone': ['microphone', 'neomorphic'], 'microphot': ['microphot', 'morphotic'], 'microphotograph': ['microphotograph', 'photomicrograph'], 'microphotographic': ['microphotographic', 'photomicrographic'], 'microphotography': ['microphotography', 'photomicrography'], 'microphotoscope': ['microphotoscope', 'photomicroscope'], 'micropterous': ['micropterous', 'prosectorium'], 'micropyle': ['micropyle', 'polymeric'], 'microradiometer': ['microradiometer', 'radiomicrometer'], 'microseme': ['mesomeric', 'microseme', 'semicrome'], 'microspectroscope': ['microspectroscope', 'spectromicroscope'], 'microstat': ['microstat', 'stromatic'], 'microsthene': ['merosthenic', 'microsthene'], 'microstome': ['microstome', 'osmometric'], 'microtia': ['amoritic', 'microtia'], 'microtinae': ['marcionite', 'microtinae', 'remication'], 'mid': ['dim', 'mid'], 'midden': ['midden', 'minded'], 'middler': ['middler', 'mildred'], 'middy': ['didym', 'middy'], 'mide': ['demi', 'diem', 'dime', 'mide'], 'mider': ['dimer', 'mider'], 'mididae': ['amidide', 'diamide', 'mididae'], 'midrange': ['dirgeman', 'margined', 'midrange'], 'midstory': ['midstory', 'modistry'], 'miek': ['miek', 'mike'], 'mien': ['mein', 'mien', 'mine'], 'mig': ['gim', 'mig'], 'migraine': ['imaginer', 'migraine'], 'migrate': ['migrate', 'ragtime'], 'migratory': ['gyromitra', 'migratory'], 'mihrab': ['brahmi', 'mihrab'], 'mikael': ['kelima', 'mikael'], 'mike': ['miek', 'mike'], 'mil': ['lim', 'mil'], 'mila': ['amil', 'amli', 'lima', 'mail', 'mali', 'mila'], 'milan': ['lamin', 'liman', 'milan'], 'milden': ['milden', 'mindel'], 'mildness': ['mildness', 'mindless'], 'mildred': ['middler', 'mildred'], 'mile': ['emil', 'lime', 'mile'], 'milepost': ['milepost', 'polemist'], 'miler': ['limer', 'meril', 'miler'], 'miles': ['limes', 'miles', 'slime', 'smile'], 'milesian': ['alienism', 'milesian'], 'milestone': ['limestone', 'melonites', 'milestone'], 'milicent': ['limnetic', 'milicent'], 'military': ['limitary', 'military'], 'militate': ['limitate', 'militate'], 'militation': ['limitation', 'militation'], 'milken': ['kimnel', 'milken'], 'millennia': ['melanilin', 'millennia'], 'miller': ['miller', 'remill'], 'millet': ['mellit', 'millet'], 'milliare': ['milliare', 'ramillie'], 'millrace': ['micellar', 'millrace'], 'milner': ['limner', 'merlin', 'milner'], 'milo': ['milo', 'moil'], 'milsie': ['milsie', 'simile'], 'miltonia': ['limation', 'miltonia'], 'mima': ['ammi', 'imam', 'maim', 'mima'], 'mime': ['emim', 'mime'], 'mimester': ['meristem', 'mimester'], 'mimi': ['immi', 'mimi'], 'mimidae': ['amimide', 'mimidae'], 'mimosa': ['amomis', 'mimosa'], 'min': ['min', 'nim'], 'mina': ['amin', 'main', 'mani', 'mian', 'mina', 'naim'], 'minacity': ['imitancy', 'intimacy', 'minacity'], 'minar': ['inarm', 'minar'], 'minaret': ['minaret', 'raiment', 'tireman'], 'minareted': ['demetrian', 'dermatine', 'meandrite', 'minareted'], 'minargent': ['germinant', 'minargent'], 'minatory': ['minatory', 'romanity'], 'mince': ['menic', 'mince'], 'minchiate': ['hematinic', 'minchiate'], 'mincopie': ['mincopie', 'poimenic'], 'minded': ['midden', 'minded'], 'mindel': ['milden', 'mindel'], 'mindelian': ['eliminand', 'mindelian'], 'minder': ['minder', 'remind'], 'mindless': ['mildness', 'mindless'], 'mine': ['mein', 'mien', 'mine'], 'miner': ['inerm', 'miner'], 'mineral': ['marline', 'mineral', 'ramline'], 'minerva': ['minerva', 'vermian'], 'minerval': ['minerval', 'verminal'], 'mingler': ['gremlin', 'mingler'], 'miniator': ['miniator', 'triamino'], 'minish': ['minish', 'nimshi'], 'minister': ['minister', 'misinter'], 'ministry': ['ministry', 'myristin'], 'minkish': ['minkish', 'nimkish'], 'minnetaree': ['minnetaree', 'nemertinea'], 'minoan': ['amnion', 'minoan', 'nomina'], 'minometer': ['minometer', 'omnimeter'], 'minor': ['minor', 'morin'], 'minorate': ['maronite', 'martinoe', 'minorate', 'morenita', 'romanite'], 'minorca': ['amicron', 'marconi', 'minorca', 'romanic'], 'minos': ['minos', 'osmin', 'simon'], 'minot': ['minot', 'timon', 'tomin'], 'mintage': ['mintage', 'teaming', 'tegmina'], 'minter': ['minter', 'remint', 'termin'], 'minuend': ['minuend', 'unmined'], 'minuet': ['minuet', 'minute'], 'minute': ['minuet', 'minute'], 'minutely': ['minutely', 'untimely'], 'minuter': ['minuter', 'unmiter'], 'minyas': ['maysin', 'minyas', 'mysian'], 'mir': ['mir', 'rim'], 'mira': ['amir', 'irma', 'mari', 'mira', 'rami', 'rima'], 'mirabel': ['embrail', 'mirabel'], 'mirac': ['marci', 'mirac'], 'miracle': ['claimer', 'miracle', 'reclaim'], 'mirage': ['imager', 'maigre', 'margie', 'mirage'], 'mirana': ['airman', 'amarin', 'marian', 'marina', 'mirana'], 'miranha': ['ahriman', 'miranha'], 'mirate': ['imaret', 'metria', 'mirate', 'rimate'], 'mirbane': ['ambrein', 'mirbane'], 'mire': ['emir', 'imer', 'mire', 'reim', 'remi', 'riem', 'rime'], 'mirfak': ['marfik', 'mirfak'], 'mirounga': ['mirounga', 'moringua', 'origanum'], 'miry': ['miry', 'rimy', 'yirm'], 'mirza': ['mirza', 'mizar'], 'misact': ['mastic', 'misact'], 'misadvise': ['admissive', 'misadvise'], 'misagent': ['misagent', 'steaming'], 'misaim': ['misaim', 'misima'], 'misandry': ['misandry', 'myrsinad'], 'misassociation': ['associationism', 'misassociation'], 'misatone': ['masonite', 'misatone'], 'misattend': ['misattend', 'tandemist'], 'misaunter': ['antiserum', 'misaunter'], 'misbehavior': ['behaviorism', 'misbehavior'], 'mischance': ['mechanics', 'mischance'], 'misclass': ['classism', 'misclass'], 'miscoin': ['iconism', 'imsonic', 'miscoin'], 'misconfiguration': ['configurationism', 'misconfiguration'], 'misconstitutional': ['constitutionalism', 'misconstitutional'], 'misconstruction': ['constructionism', 'misconstruction'], 'miscreant': ['encratism', 'miscreant'], 'miscreation': ['anisometric', 'creationism', 'miscreation', 'ramisection', 'reactionism'], 'miscue': ['cesium', 'miscue'], 'misdate': ['diastem', 'misdate'], 'misdaub': ['misdaub', 'submaid'], 'misdeal': ['misdeal', 'mislead'], 'misdealer': ['misdealer', 'misleader', 'misleared'], 'misdeclare': ['creedalism', 'misdeclare'], 'misdiet': ['misdiet', 'misedit', 'mistide'], 'misdivision': ['divisionism', 'misdivision'], 'misdread': ['disarmed', 'misdread'], 'mise': ['mise', 'semi', 'sime'], 'misease': ['misease', 'siamese'], 'misecclesiastic': ['ecclesiasticism', 'misecclesiastic'], 'misedit': ['misdiet', 'misedit', 'mistide'], 'misexpression': ['expressionism', 'misexpression'], 'mishmash': ['mishmash', 'shammish'], 'misima': ['misaim', 'misima'], 'misimpression': ['impressionism', 'misimpression'], 'misinter': ['minister', 'misinter'], 'mislabel': ['mislabel', 'semiball'], 'mislabor': ['laborism', 'mislabor'], 'mislead': ['misdeal', 'mislead'], 'misleader': ['misdealer', 'misleader', 'misleared'], 'mislear': ['mislear', 'realism'], 'misleared': ['misdealer', 'misleader', 'misleared'], 'misname': ['amenism', 'immanes', 'misname'], 'misniac': ['cainism', 'misniac'], 'misnomed': ['demonism', 'medimnos', 'misnomed'], 'misoneism': ['misoneism', 'simeonism'], 'mispage': ['impages', 'mispage'], 'misperception': ['misperception', 'perceptionism'], 'misperform': ['misperform', 'preformism'], 'misphrase': ['misphrase', 'seraphism'], 'misplay': ['impalsy', 'misplay'], 'misplead': ['misplead', 'pedalism'], 'misprisal': ['misprisal', 'spiralism'], 'misproud': ['disporum', 'misproud'], 'misprovide': ['disimprove', 'misprovide'], 'misput': ['misput', 'sumpit'], 'misquotation': ['antimosquito', 'misquotation'], 'misrate': ['artemis', 'maestri', 'misrate'], 'misread': ['misread', 'sidearm'], 'misreform': ['misreform', 'reformism'], 'misrelate': ['misrelate', 'salimeter'], 'misrelation': ['misrelation', 'orientalism', 'relationism'], 'misreliance': ['criminalese', 'misreliance'], 'misreporter': ['misreporter', 'reporterism'], 'misrepresentation': ['misrepresentation', 'representationism'], 'misrepresenter': ['misrepresenter', 'remisrepresent'], 'misrepute': ['misrepute', 'septerium'], 'misrhyme': ['misrhyme', 'shimmery'], 'misrule': ['misrule', 'simuler'], 'missal': ['missal', 'salmis'], 'missayer': ['emissary', 'missayer'], 'misset': ['misset', 'tmesis'], 'misshape': ['emphasis', 'misshape'], 'missioner': ['missioner', 'remission'], 'misspell': ['misspell', 'psellism'], 'missuggestion': ['missuggestion', 'suggestionism'], 'missy': ['missy', 'mysis'], 'mist': ['mist', 'smit', 'stim'], 'misteach': ['mastiche', 'misteach'], 'mister': ['merist', 'mister', 'smiter'], 'mistide': ['misdiet', 'misedit', 'mistide'], 'mistle': ['mistle', 'smilet'], 'mistone': ['mistone', 'moisten'], 'mistradition': ['mistradition', 'traditionism'], 'mistrain': ['marinist', 'mistrain'], 'mistreat': ['mistreat', 'teratism'], 'mistrial': ['mistrial', 'trialism'], 'mistutor': ['mistutor', 'tutorism'], 'misty': ['misty', 'stimy'], 'misunderstander': ['misunderstander', 'remisunderstand'], 'misura': ['misura', 'ramusi'], 'misuser': ['misuser', 'surmise'], 'mitannish': ['mitannish', 'sminthian'], 'mitch': ['micht', 'mitch'], 'mite': ['emit', 'item', 'mite', 'time'], 'mitella': ['mitella', 'tellima'], 'miteproof': ['miteproof', 'timeproof'], 'miter': ['merit', 'miter', 'mitre', 'remit', 'timer'], 'mitered': ['demerit', 'dimeter', 'merited', 'mitered'], 'miterer': ['meriter', 'miterer', 'trireme'], 'mithraic': ['arithmic', 'mithraic', 'mithriac'], 'mithraicist': ['mithraicist', 'mithraistic'], 'mithraistic': ['mithraicist', 'mithraistic'], 'mithriac': ['arithmic', 'mithraic', 'mithriac'], 'mitra': ['mitra', 'tarmi', 'timar', 'tirma'], 'mitral': ['mitral', 'ramtil'], 'mitrate': ['martite', 'mitrate'], 'mitre': ['merit', 'miter', 'mitre', 'remit', 'timer'], 'mitrer': ['mitrer', 'retrim', 'trimer'], 'mitridae': ['dimetria', 'mitridae', 'tiremaid', 'triamide'], 'mixer': ['mixer', 'remix'], 'mizar': ['mirza', 'mizar'], 'mnesic': ['cnemis', 'mnesic'], 'mniaceous': ['acuminose', 'mniaceous'], 'mniotiltidae': ['delimitation', 'mniotiltidae'], 'mnium': ['mnium', 'nummi'], 'mo': ['mo', 'om'], 'moabitic': ['biatomic', 'moabitic'], 'moan': ['mano', 'moan', 'mona', 'noam', 'noma', 'oman'], 'moarian': ['amanori', 'moarian'], 'moat': ['atmo', 'atom', 'moat', 'toma'], 'mob': ['bom', 'mob'], 'mobbable': ['bombable', 'mobbable'], 'mobber': ['bomber', 'mobber'], 'mobbish': ['hobbism', 'mobbish'], 'mobed': ['demob', 'mobed'], 'mobile': ['bemoil', 'mobile'], 'mobilian': ['binomial', 'mobilian'], 'mobocrat': ['mobocrat', 'motorcab'], 'mobship': ['mobship', 'phobism'], 'mobster': ['bestorm', 'mobster'], 'mocker': ['mocker', 'remock'], 'mocmain': ['ammonic', 'mocmain'], 'mod': ['dom', 'mod'], 'modal': ['domal', 'modal'], 'mode': ['dome', 'mode', 'moed'], 'modeler': ['demerol', 'modeler', 'remodel'], 'modelist': ['melodist', 'modelist'], 'modena': ['daemon', 'damone', 'modena'], 'modenese': ['modenese', 'needsome'], 'moderant': ['moderant', 'normated'], 'moderantism': ['memorandist', 'moderantism', 'semidormant'], 'modern': ['modern', 'morned'], 'modernistic': ['modernistic', 'monstricide'], 'modestly': ['modestly', 'styledom'], 'modesty': ['dystome', 'modesty'], 'modiste': ['distome', 'modiste'], 'modistry': ['midstory', 'modistry'], 'modius': ['modius', 'sodium'], 'moe': ['meo', 'moe'], 'moed': ['dome', 'mode', 'moed'], 'moerithere': ['heteromeri', 'moerithere'], 'mogdad': ['goddam', 'mogdad'], 'moha': ['ahom', 'moha'], 'mohair': ['homrai', 'mahori', 'mohair'], 'mohel': ['hemol', 'mohel'], 'mohican': ['mohican', 'monachi'], 'moho': ['homo', 'moho'], 'mohur': ['humor', 'mohur'], 'moider': ['dormie', 'moider'], 'moieter': ['moieter', 'romeite'], 'moiety': ['moiety', 'moyite'], 'moil': ['milo', 'moil'], 'moiles': ['lemosi', 'limose', 'moiles'], 'moineau': ['eunomia', 'moineau'], 'moira': ['maori', 'mario', 'moira'], 'moisten': ['mistone', 'moisten'], 'moistener': ['moistener', 'neoterism'], 'moisture': ['moisture', 'semitour'], 'moit': ['itmo', 'moit', 'omit', 'timo'], 'mojo': ['joom', 'mojo'], 'moke': ['kome', 'moke'], 'moki': ['komi', 'moki'], 'mola': ['loam', 'loma', 'malo', 'mola', 'olam'], 'molar': ['molar', 'moral', 'romal'], 'molarity': ['molarity', 'morality'], 'molary': ['amyrol', 'molary'], 'molder': ['dermol', 'molder', 'remold'], 'moler': ['moler', 'morel'], 'molge': ['glome', 'golem', 'molge'], 'molidae': ['melodia', 'molidae'], 'molinia': ['molinia', 'monilia'], 'mollusca': ['callosum', 'mollusca'], 'moloid': ['moloid', 'oildom'], 'molten': ['loment', 'melton', 'molten'], 'molybdena': ['baldmoney', 'molybdena'], 'molybdenic': ['combinedly', 'molybdenic'], 'mome': ['memo', 'mome'], 'moment': ['moment', 'montem'], 'momentary': ['manometry', 'momentary'], 'momentous': ['mesonotum', 'momentous'], 'momotinae': ['amniotome', 'momotinae'], 'mona': ['mano', 'moan', 'mona', 'noam', 'noma', 'oman'], 'monachi': ['mohican', 'monachi'], 'monactin': ['monactin', 'montanic'], 'monad': ['damon', 'monad', 'nomad'], 'monadic': ['monadic', 'nomadic'], 'monadical': ['monadical', 'nomadical'], 'monadically': ['monadically', 'nomadically'], 'monadina': ['monadina', 'nomadian'], 'monadism': ['monadism', 'nomadism'], 'monaene': ['anemone', 'monaene'], 'monal': ['almon', 'monal'], 'monamniotic': ['commination', 'monamniotic'], 'monanthous': ['anthonomus', 'monanthous'], 'monarch': ['monarch', 'nomarch', 'onmarch'], 'monarchial': ['harmonical', 'monarchial'], 'monarchian': ['anharmonic', 'monarchian'], 'monarchistic': ['chiromancist', 'monarchistic'], 'monarchy': ['monarchy', 'nomarchy'], 'monarda': ['anadrom', 'madrona', 'mandora', 'monarda', 'roadman'], 'monas': ['manso', 'mason', 'monas'], 'monasa': ['monasa', 'samoan'], 'monase': ['monase', 'nosema'], 'monaster': ['monaster', 'monstera', 'nearmost', 'storeman'], 'monastery': ['monastery', 'oysterman'], 'monastic': ['catonism', 'monastic'], 'monastical': ['catmalison', 'monastical'], 'monatomic': ['commation', 'monatomic'], 'monaural': ['anomural', 'monaural'], 'monday': ['dynamo', 'monday'], 'mone': ['mone', 'nome', 'omen'], 'monel': ['lemon', 'melon', 'monel'], 'moner': ['enorm', 'moner', 'morne'], 'monera': ['enamor', 'monera', 'oreman', 'romane'], 'moneral': ['almoner', 'moneral', 'nemoral'], 'monergist': ['gerontism', 'monergist'], 'moneric': ['incomer', 'moneric'], 'monesia': ['monesia', 'osamine', 'osmanie'], 'monetary': ['monetary', 'myronate', 'naometry'], 'money': ['money', 'moyen'], 'moneybag': ['bogeyman', 'moneybag'], 'moneyless': ['moneyless', 'moyenless'], 'monger': ['germon', 'monger', 'morgen'], 'mongler': ['mongler', 'mongrel'], 'mongoose': ['gonosome', 'mongoose'], 'mongrel': ['mongler', 'mongrel'], 'mongrelity': ['longimetry', 'mongrelity'], 'monial': ['monial', 'nomial', 'oilman'], 'monias': ['monias', 'osamin', 'osmina'], 'monica': ['camion', 'conima', 'manioc', 'monica'], 'monilated': ['antimodel', 'maldonite', 'monilated'], 'monilia': ['molinia', 'monilia'], 'monism': ['monism', 'nomism', 'simmon'], 'monist': ['inmost', 'monist', 'omnist'], 'monistic': ['monistic', 'nicotism', 'nomistic'], 'monitory': ['monitory', 'moronity'], 'monitress': ['monitress', 'sermonist'], 'mono': ['mono', 'moon'], 'monoacid': ['damonico', 'monoacid'], 'monoazo': ['monoazo', 'monozoa'], 'monocleid': ['clinodome', 'melodicon', 'monocleid'], 'monoclinous': ['monoclinous', 'monoclonius'], 'monoclonius': ['monoclinous', 'monoclonius'], 'monocracy': ['monocracy', 'nomocracy'], 'monocystidae': ['monocystidae', 'monocystidea'], 'monocystidea': ['monocystidae', 'monocystidea'], 'monodactylous': ['condylomatous', 'monodactylous'], 'monodactyly': ['dactylonomy', 'monodactyly'], 'monodelphia': ['amidophenol', 'monodelphia'], 'monodonta': ['anomodont', 'monodonta'], 'monodram': ['monodram', 'romandom'], 'monoecian': ['monoecian', 'neocomian'], 'monoecism': ['economism', 'monoecism', 'monosemic'], 'monoeidic': ['meconioid', 'monoeidic'], 'monogastric': ['gastronomic', 'monogastric'], 'monogenist': ['monogenist', 'nomogenist'], 'monogenous': ['monogenous', 'nomogenous'], 'monogeny': ['monogeny', 'nomogeny'], 'monogram': ['monogram', 'nomogram'], 'monograph': ['monograph', 'nomograph', 'phonogram'], 'monographer': ['geranomorph', 'monographer', 'nomographer'], 'monographic': ['gramophonic', 'monographic', 'nomographic', 'phonogramic'], 'monographical': ['gramophonical', 'monographical', 'nomographical'], 'monographically': ['gramophonically', 'monographically', 'nomographically', 'phonogramically'], 'monographist': ['gramophonist', 'monographist'], 'monography': ['monography', 'nomography'], 'monoid': ['domino', 'monoid'], 'monological': ['monological', 'nomological'], 'monologist': ['monologist', 'nomologist', 'ontologism'], 'monology': ['monology', 'nomology'], 'monometer': ['metronome', 'monometer', 'monotreme'], 'monometric': ['commorient', 'metronomic', 'monometric'], 'monometrical': ['metronomical', 'monometrical'], 'monomorphic': ['monomorphic', 'morphonomic'], 'monont': ['monont', 'monton'], 'monopathy': ['monopathy', 'pathonomy'], 'monopersulphuric': ['monopersulphuric', 'permonosulphuric'], 'monophote': ['monophote', 'motophone'], 'monophylite': ['entomophily', 'monophylite'], 'monophyllous': ['monophyllous', 'nomophyllous'], 'monoplanist': ['monoplanist', 'postnominal'], 'monopsychism': ['monopsychism', 'psychomonism'], 'monopteral': ['monopteral', 'protonemal'], 'monosemic': ['economism', 'monoecism', 'monosemic'], 'monosodium': ['monosodium', 'omnimodous', 'onosmodium'], 'monotheism': ['monotheism', 'nomotheism'], 'monotheist': ['monotheist', 'thomsonite'], 'monothetic': ['monothetic', 'nomothetic'], 'monotreme': ['metronome', 'monometer', 'monotreme'], 'monotypal': ['monotypal', 'toponymal'], 'monotypic': ['monotypic', 'toponymic'], 'monotypical': ['monotypical', 'toponymical'], 'monozoa': ['monoazo', 'monozoa'], 'monozoic': ['monozoic', 'zoonomic'], 'monroeism': ['monroeism', 'semimoron'], 'monsieur': ['inermous', 'monsieur'], 'monstera': ['monaster', 'monstera', 'nearmost', 'storeman'], 'monstricide': ['modernistic', 'monstricide'], 'montage': ['geomant', 'magneto', 'megaton', 'montage'], 'montagnais': ['antagonism', 'montagnais'], 'montanic': ['monactin', 'montanic'], 'montanite': ['mentation', 'montanite'], 'montem': ['moment', 'montem'], 'montes': ['montes', 'ostmen'], 'montia': ['atimon', 'manito', 'montia'], 'monticule': ['ctenolium', 'monticule'], 'monton': ['monont', 'monton'], 'montu': ['montu', 'mount', 'notum'], 'monture': ['monture', 'mounter', 'remount'], 'monumentary': ['monumentary', 'unmomentary'], 'mood': ['doom', 'mood'], 'mooder': ['doomer', 'mooder', 'redoom', 'roomed'], 'mool': ['loom', 'mool'], 'mools': ['mools', 'sloom'], 'moon': ['mono', 'moon'], 'moonglade': ['megalodon', 'moonglade'], 'moonite': ['emotion', 'moonite'], 'moonja': ['majoon', 'moonja'], 'moonscape': ['manoscope', 'moonscape'], 'moonseed': ['endosome', 'moonseed'], 'moontide': ['demotion', 'entomoid', 'moontide'], 'moop': ['moop', 'pomo'], 'moor': ['moor', 'moro', 'room'], 'moorage': ['moorage', 'roomage'], 'moorball': ['ballroom', 'moorball'], 'moore': ['moore', 'romeo'], 'moorn': ['moorn', 'moron'], 'moorship': ['isomorph', 'moorship'], 'moorup': ['moorup', 'uproom'], 'moorwort': ['moorwort', 'rootworm', 'tomorrow', 'wormroot'], 'moory': ['moory', 'roomy'], 'moost': ['moost', 'smoot'], 'moot': ['moot', 'toom'], 'mooth': ['mooth', 'thoom'], 'mootstead': ['mootstead', 'stomatode'], 'mop': ['mop', 'pom'], 'mopane': ['mopane', 'pomane'], 'mope': ['mope', 'poem', 'pome'], 'moper': ['merop', 'moper', 'proem', 'remop'], 'mophead': ['hemapod', 'mophead'], 'mopish': ['mopish', 'ophism'], 'mopla': ['mopla', 'palmo'], 'mopsy': ['mopsy', 'myops'], 'mora': ['amor', 'maro', 'mora', 'omar', 'roam'], 'morainal': ['manorial', 'morainal'], 'moraine': ['moraine', 'romaine'], 'moral': ['molar', 'moral', 'romal'], 'morality': ['molarity', 'morality'], 'morals': ['morals', 'morsal'], 'moran': ['manor', 'moran', 'norma', 'ramon', 'roman'], 'morat': ['amort', 'morat', 'torma'], 'morate': ['amoret', 'morate'], 'moray': ['mayor', 'moray'], 'morbid': ['dibrom', 'morbid'], 'mordancy': ['dormancy', 'mordancy'], 'mordant': ['dormant', 'mordant'], 'mordenite': ['interdome', 'mordenite', 'nemertoid'], 'mordicate': ['decimator', 'medicator', 'mordicate'], 'more': ['mero', 'more', 'omer', 'rome'], 'moreish': ['heroism', 'moreish'], 'morel': ['moler', 'morel'], 'morencite': ['entomeric', 'intercome', 'morencite'], 'morenita': ['maronite', 'martinoe', 'minorate', 'morenita', 'romanite'], 'moreote': ['moreote', 'oometer'], 'mores': ['meros', 'mores', 'morse', 'sermo', 'smore'], 'morga': ['agrom', 'morga'], 'morganatic': ['actinogram', 'morganatic'], 'morgay': ['gyroma', 'morgay'], 'morgen': ['germon', 'monger', 'morgen'], 'moribund': ['moribund', 'unmorbid'], 'moric': ['micro', 'moric', 'romic'], 'moriche': ['homeric', 'moriche'], 'morin': ['minor', 'morin'], 'moringa': ['ingomar', 'moringa', 'roaming'], 'moringua': ['mirounga', 'moringua', 'origanum'], 'morn': ['morn', 'norm'], 'morne': ['enorm', 'moner', 'morne'], 'morned': ['modern', 'morned'], 'mornless': ['mornless', 'normless'], 'moro': ['moor', 'moro', 'room'], 'morocota': ['coatroom', 'morocota'], 'moron': ['moorn', 'moron'], 'moronic': ['moronic', 'omicron'], 'moronity': ['monitory', 'moronity'], 'morphea': ['amphore', 'morphea'], 'morphonomic': ['monomorphic', 'morphonomic'], 'morphotic': ['microphot', 'morphotic'], 'morphotropic': ['morphotropic', 'protomorphic'], 'morrisean': ['morrisean', 'rosmarine'], 'morsal': ['morals', 'morsal'], 'morse': ['meros', 'mores', 'morse', 'sermo', 'smore'], 'mortacious': ['mortacious', 'urosomatic'], 'mortar': ['marrot', 'mortar'], 'mortician': ['martinico', 'mortician'], 'mortise': ['erotism', 'mortise', 'trisome'], 'morton': ['morton', 'tomorn'], 'mortuarian': ['mortuarian', 'muratorian'], 'mortuary': ['mortuary', 'outmarry'], 'mortuous': ['mortuous', 'tumorous'], 'morus': ['morus', 'mosur'], 'mosaic': ['aosmic', 'mosaic'], 'mosandrite': ['mosandrite', 'tarsonemid'], 'mosasauri': ['amaurosis', 'mosasauri'], 'moschate': ['chatsome', 'moschate'], 'mose': ['meso', 'mose', 'some'], 'mosker': ['mosker', 'smoker'], 'mosser': ['messor', 'mosser', 'somers'], 'moste': ['moste', 'smote'], 'mosting': ['gnomist', 'mosting'], 'mosul': ['mosul', 'mouls', 'solum'], 'mosur': ['morus', 'mosur'], 'mot': ['mot', 'tom'], 'mote': ['mote', 'tome'], 'motel': ['metol', 'motel'], 'motet': ['motet', 'motte', 'totem'], 'mothed': ['method', 'mothed'], 'mother': ['mother', 'thermo'], 'motherland': ['enthraldom', 'motherland'], 'motherward': ['motherward', 'threadworm'], 'motograph': ['motograph', 'photogram'], 'motographic': ['motographic', 'tomographic'], 'motophone': ['monophote', 'motophone'], 'motorcab': ['mobocrat', 'motorcab'], 'motte': ['motet', 'motte', 'totem'], 'moud': ['doum', 'moud', 'odum'], 'moudy': ['moudy', 'yomud'], 'moul': ['moul', 'ulmo'], 'mouls': ['mosul', 'mouls', 'solum'], 'mound': ['donum', 'mound'], 'mount': ['montu', 'mount', 'notum'], 'mountained': ['emundation', 'mountained'], 'mountaineer': ['enumeration', 'mountaineer'], 'mounted': ['demount', 'mounted'], 'mounter': ['monture', 'mounter', 'remount'], 'mousery': ['mousery', 'seymour'], 'mousoni': ['mousoni', 'ominous'], 'mousse': ['mousse', 'smouse'], 'moutan': ['amount', 'moutan', 'outman'], 'mouther': ['mouther', 'theorum'], 'mover': ['mover', 'vomer'], 'moy': ['moy', 'yom'], 'moyen': ['money', 'moyen'], 'moyenless': ['moneyless', 'moyenless'], 'moyite': ['moiety', 'moyite'], 'mru': ['mru', 'rum'], 'mu': ['mu', 'um'], 'muang': ['muang', 'munga'], 'much': ['chum', 'much'], 'mucic': ['cumic', 'mucic'], 'mucilage': ['glucemia', 'mucilage'], 'mucin': ['cumin', 'mucin'], 'mucinoid': ['conidium', 'mucinoid', 'oncidium'], 'mucofibrous': ['fibromucous', 'mucofibrous'], 'mucoid': ['codium', 'mucoid'], 'muconic': ['muconic', 'uncomic'], 'mucor': ['mucor', 'mucro'], 'mucoserous': ['mucoserous', 'seromucous'], 'mucro': ['mucor', 'mucro'], 'mucrones': ['consumer', 'mucrones'], 'mud': ['dum', 'mud'], 'mudar': ['mudar', 'mudra'], 'mudden': ['edmund', 'mudden'], 'mudir': ['mudir', 'murid'], 'mudra': ['mudar', 'mudra'], 'mudstone': ['mudstone', 'unmodest'], 'mug': ['gum', 'mug'], 'muga': ['gaum', 'muga'], 'muggles': ['muggles', 'smuggle'], 'mugweed': ['gumweed', 'mugweed'], 'muid': ['duim', 'muid'], 'muilla': ['allium', 'alulim', 'muilla'], 'muir': ['muir', 'rimu'], 'muishond': ['muishond', 'unmodish'], 'muist': ['muist', 'tuism'], 'mukri': ['kurmi', 'mukri'], 'muleta': ['amulet', 'muleta'], 'mulga': ['algum', 'almug', 'glaum', 'gluma', 'mulga'], 'mulier': ['mulier', 'muriel'], 'mulita': ['mulita', 'ultima'], 'mulk': ['kulm', 'mulk'], 'multani': ['multani', 'talinum'], 'multinervose': ['multinervose', 'volunteerism'], 'multipole': ['impollute', 'multipole'], 'mumbler': ['bummler', 'mumbler'], 'munda': ['maund', 'munda', 'numda', 'undam', 'unmad'], 'mundane': ['mundane', 'unamend', 'unmaned', 'unnamed'], 'munga': ['muang', 'munga'], 'mungo': ['mungo', 'muong'], 'munia': ['maniu', 'munia', 'unami'], 'munity': ['munity', 'mutiny'], 'muong': ['mungo', 'muong'], 'mura': ['arum', 'maru', 'mura'], 'murage': ['mauger', 'murage'], 'mural': ['mural', 'rumal'], 'muralist': ['altruism', 'muralist', 'traulism', 'ultraism'], 'muran': ['muran', 'ruman', 'unarm', 'unram', 'urman'], 'murat': ['martu', 'murat', 'turma'], 'muratorian': ['mortuarian', 'muratorian'], 'murderer': ['demurrer', 'murderer'], 'murdering': ['demurring', 'murdering'], 'murderingly': ['demurringly', 'murderingly'], 'murex': ['murex', 'rumex'], 'murga': ['garum', 'murga'], 'muricate': ['ceratium', 'muricate'], 'muricine': ['irenicum', 'muricine'], 'murid': ['mudir', 'murid'], 'muriel': ['mulier', 'muriel'], 'murine': ['murine', 'nerium'], 'murly': ['murly', 'rumly'], 'murmurer': ['murmurer', 'remurmur'], 'murrain': ['murrain', 'murrina'], 'murrina': ['murrain', 'murrina'], 'murut': ['murut', 'utrum'], 'murza': ['mazur', 'murza'], 'mus': ['mus', 'sum'], 'musa': ['masu', 'musa', 'saum'], 'musal': ['lamus', 'malus', 'musal', 'slaum'], 'musalmani': ['manualism', 'musalmani'], 'musang': ['magnus', 'musang'], 'musar': ['musar', 'ramus', 'rusma', 'surma'], 'musca': ['camus', 'musca', 'scaum', 'sumac'], 'muscade': ['camused', 'muscade'], 'muscarine': ['muscarine', 'sucramine'], 'musci': ['musci', 'music'], 'muscicole': ['leucocism', 'muscicole'], 'muscinae': ['muscinae', 'semuncia'], 'muscle': ['clumse', 'muscle'], 'muscly': ['clumsy', 'muscly'], 'muscone': ['consume', 'muscone'], 'muscot': ['custom', 'muscot'], 'mused': ['mused', 'sedum'], 'museography': ['hypergamous', 'museography'], 'muser': ['muser', 'remus', 'serum'], 'musha': ['hamus', 'musha'], 'music': ['musci', 'music'], 'musicate': ['autecism', 'musicate'], 'musico': ['musico', 'suomic'], 'musie': ['iseum', 'musie'], 'musing': ['musing', 'signum'], 'muslined': ['muslined', 'unmisled', 'unsmiled'], 'musophagine': ['amphigenous', 'musophagine'], 'mussaenda': ['mussaenda', 'unamassed'], 'must': ['must', 'smut', 'stum'], 'mustang': ['mustang', 'stagnum'], 'mustard': ['durmast', 'mustard'], 'muster': ['muster', 'sertum', 'stumer'], 'musterer': ['musterer', 'remuster'], 'mustily': ['mustily', 'mytilus'], 'muta': ['muta', 'taum'], 'mutable': ['atumble', 'mutable'], 'mutant': ['mutant', 'tantum', 'tutman'], 'mutase': ['meatus', 'mutase'], 'mute': ['mute', 'tume'], 'muteness': ['muteness', 'tenesmus'], 'mutescence': ['mutescence', 'tumescence'], 'mutilate': ['mutilate', 'ultimate'], 'mutilation': ['mutilation', 'ultimation'], 'mutiny': ['munity', 'mutiny'], 'mutism': ['mutism', 'summit'], 'mutual': ['mutual', 'umlaut'], 'mutulary': ['mutulary', 'tumulary'], 'muysca': ['cyamus', 'muysca'], 'mwa': ['maw', 'mwa'], 'my': ['my', 'ym'], 'mya': ['amy', 'may', 'mya', 'yam'], 'myal': ['amyl', 'lyam', 'myal'], 'myaria': ['amiray', 'myaria'], 'myatonic': ['cymation', 'myatonic', 'onymatic'], 'mycelia': ['amyelic', 'mycelia'], 'mycelian': ['clymenia', 'mycelian'], 'mycoid': ['cymoid', 'mycoid'], 'mycophagist': ['mycophagist', 'phagocytism'], 'mycose': ['cymose', 'mycose'], 'mycosterol': ['mycosterol', 'sclerotomy'], 'mycotrophic': ['chromotypic', 'cormophytic', 'mycotrophic'], 'mycterism': ['mycterism', 'symmetric'], 'myctodera': ['myctodera', 'radectomy'], 'mydaleine': ['amylidene', 'mydaleine'], 'myeloencephalitis': ['encephalomyelitis', 'myeloencephalitis'], 'myelomeningitis': ['meningomyelitis', 'myelomeningitis'], 'myelomeningocele': ['meningomyelocele', 'myelomeningocele'], 'myelon': ['lemony', 'myelon'], 'myelonal': ['amylenol', 'myelonal'], 'myeloneuritis': ['myeloneuritis', 'neuromyelitis'], 'myeloplast': ['meloplasty', 'myeloplast'], 'mygale': ['gamely', 'gleamy', 'mygale'], 'myitis': ['myitis', 'simity'], 'myliobatid': ['bimodality', 'myliobatid'], 'mymar': ['mymar', 'rammy'], 'myna': ['many', 'myna'], 'myoatrophy': ['amyotrophy', 'myoatrophy'], 'myocolpitis': ['myocolpitis', 'polysomitic'], 'myofibroma': ['fibromyoma', 'myofibroma'], 'myoglobin': ['boomingly', 'myoglobin'], 'myographic': ['microphagy', 'myographic'], 'myographist': ['myographist', 'pythagorism'], 'myolipoma': ['lipomyoma', 'myolipoma'], 'myomohysterectomy': ['hysteromyomectomy', 'myomohysterectomy'], 'myope': ['myope', 'pomey'], 'myoplastic': ['myoplastic', 'polymastic'], 'myoplasty': ['myoplasty', 'polymasty'], 'myopolar': ['myopolar', 'playroom'], 'myops': ['mopsy', 'myops'], 'myosin': ['isonym', 'myosin', 'simony'], 'myosote': ['myosote', 'toysome'], 'myotenotomy': ['myotenotomy', 'tenomyotomy'], 'myotic': ['comity', 'myotic'], 'myra': ['army', 'mary', 'myra', 'yarm'], 'myrcia': ['myrcia', 'myrica'], 'myrialiter': ['myrialiter', 'myrialitre'], 'myrialitre': ['myrialiter', 'myrialitre'], 'myriameter': ['myriameter', 'myriametre'], 'myriametre': ['myriameter', 'myriametre'], 'myrianida': ['dimyarian', 'myrianida'], 'myrica': ['myrcia', 'myrica'], 'myristate': ['myristate', 'tasimetry'], 'myristin': ['ministry', 'myristin'], 'myristone': ['myristone', 'smyrniote'], 'myronate': ['monetary', 'myronate', 'naometry'], 'myrsinad': ['misandry', 'myrsinad'], 'myrtales': ['masterly', 'myrtales'], 'myrtle': ['myrtle', 'termly'], 'mysell': ['mysell', 'smelly'], 'mysian': ['maysin', 'minyas', 'mysian'], 'mysis': ['missy', 'mysis'], 'mysterial': ['mysterial', 'salimetry'], 'mystes': ['mystes', 'system'], 'mythographer': ['mythographer', 'thermography'], 'mythogreen': ['mythogreen', 'thermogeny'], 'mythologer': ['mythologer', 'thermology'], 'mythopoeic': ['homeotypic', 'mythopoeic'], 'mythus': ['mythus', 'thymus'], 'mytilid': ['mytilid', 'timidly'], 'mytilus': ['mustily', 'mytilus'], 'myxochondroma': ['chondromyxoma', 'myxochondroma'], 'myxochondrosarcoma': ['chondromyxosarcoma', 'myxochondrosarcoma'], 'myxocystoma': ['cystomyxoma', 'myxocystoma'], 'myxofibroma': ['fibromyxoma', 'myxofibroma'], 'myxofibrosarcoma': ['fibromyxosarcoma', 'myxofibrosarcoma'], 'myxoinoma': ['inomyxoma', 'myxoinoma'], 'myxolipoma': ['lipomyxoma', 'myxolipoma'], 'myxotheca': ['chemotaxy', 'myxotheca'], 'na': ['an', 'na'], 'naa': ['ana', 'naa'], 'naam': ['anam', 'mana', 'naam', 'nama'], 'nab': ['ban', 'nab'], 'nabak': ['banak', 'nabak'], 'nabal': ['alban', 'balan', 'banal', 'laban', 'nabal', 'nabla'], 'nabalism': ['bailsman', 'balanism', 'nabalism'], 'nabalite': ['albanite', 'balanite', 'nabalite'], 'nabalus': ['balanus', 'nabalus', 'subanal'], 'nabk': ['bank', 'knab', 'nabk'], 'nabla': ['alban', 'balan', 'banal', 'laban', 'nabal', 'nabla'], 'nable': ['leban', 'nable'], 'nabobishly': ['babylonish', 'nabobishly'], 'nabothian': ['bathonian', 'nabothian'], 'nabs': ['nabs', 'snab'], 'nabu': ['baun', 'buna', 'nabu', 'nuba'], 'nacarat': ['cantara', 'nacarat'], 'nace': ['acne', 'cane', 'nace'], 'nachitoch': ['chanchito', 'nachitoch'], 'nacre': ['caner', 'crane', 'crena', 'nacre', 'rance'], 'nacred': ['cedarn', 'dancer', 'nacred'], 'nacreous': ['carneous', 'nacreous'], 'nacrite': ['centiar', 'certain', 'citrean', 'nacrite', 'nectria'], 'nacrous': ['carnous', 'nacrous', 'narcous'], 'nadder': ['dander', 'darned', 'nadder'], 'nadeem': ['amende', 'demean', 'meaned', 'nadeem'], 'nadir': ['darin', 'dinar', 'drain', 'indra', 'nadir', 'ranid'], 'nadorite': ['andorite', 'nadorite', 'ordinate', 'rodentia'], 'nae': ['ean', 'nae', 'nea'], 'nael': ['alen', 'lane', 'lean', 'lena', 'nael', 'neal'], 'naether': ['earthen', 'enheart', 'hearten', 'naether', 'teheran', 'traheen'], 'nag': ['gan', 'nag'], 'nagara': ['angara', 'aranga', 'nagara'], 'nagari': ['graian', 'nagari'], 'nagatelite': ['gelatinate', 'nagatelite'], 'nagger': ['ganger', 'grange', 'nagger'], 'nagging': ['ganging', 'nagging'], 'naggle': ['laggen', 'naggle'], 'naggly': ['gangly', 'naggly'], 'nagmaal': ['malanga', 'nagmaal'], 'nagnag': ['gangan', 'nagnag'], 'nagnail': ['alangin', 'anginal', 'anglian', 'nagnail'], 'nagor': ['angor', 'argon', 'goran', 'grano', 'groan', 'nagor', 'orang', 'organ', 'rogan', 'ronga'], 'nagster': ['angster', 'garnets', 'nagster', 'strange'], 'nagual': ['angula', 'nagual'], 'nahani': ['hainan', 'nahani'], 'nahor': ['nahor', 'norah', 'rohan'], 'nahum': ['human', 'nahum'], 'naiad': ['danai', 'diana', 'naiad'], 'naiant': ['naiant', 'tainan'], 'naias': ['asian', 'naias', 'sanai'], 'naid': ['adin', 'andi', 'dain', 'dani', 'dian', 'naid'], 'naif': ['fain', 'naif'], 'naifly': ['fainly', 'naifly'], 'naig': ['gain', 'inga', 'naig', 'ngai'], 'naik': ['akin', 'kina', 'naik'], 'nail': ['alin', 'anil', 'lain', 'lina', 'nail'], 'nailer': ['arline', 'larine', 'linear', 'nailer', 'renail'], 'naileress': ['earliness', 'naileress'], 'nailery': ['inlayer', 'nailery'], 'nailless': ['nailless', 'sensilla'], 'nailrod': ['nailrod', 'ordinal', 'rinaldo', 'rodinal'], 'nailshop': ['nailshop', 'siphonal'], 'naily': ['inlay', 'naily'], 'naim': ['amin', 'main', 'mani', 'mian', 'mina', 'naim'], 'nain': ['nain', 'nina'], 'naio': ['aion', 'naio'], 'nair': ['arni', 'iran', 'nair', 'rain', 'rani'], 'nairy': ['nairy', 'rainy'], 'nais': ['anis', 'nais', 'nasi', 'nias', 'sain', 'sina'], 'naish': ['naish', 'shina'], 'naither': ['anither', 'inearth', 'naither'], 'naive': ['avine', 'naive', 'vinea'], 'naivete': ['naivete', 'nieveta'], 'nak': ['kan', 'nak'], 'naked': ['kande', 'knead', 'naked'], 'nakedish': ['headskin', 'nakedish', 'sinkhead'], 'naker': ['anker', 'karen', 'naker'], 'nakir': ['inkra', 'krina', 'nakir', 'rinka'], 'nako': ['kona', 'nako'], 'nalita': ['antlia', 'latian', 'nalita'], 'nallah': ['hallan', 'nallah'], 'nam': ['man', 'nam'], 'nama': ['anam', 'mana', 'naam', 'nama'], 'namaz': ['namaz', 'zaman'], 'nambe': ['beman', 'nambe'], 'namda': ['adman', 'daman', 'namda'], 'name': ['amen', 'enam', 'mane', 'mean', 'name', 'nema'], 'nameability': ['amenability', 'nameability'], 'nameable': ['amenable', 'nameable'], 'nameless': ['lameness', 'maleness', 'maneless', 'nameless'], 'nameling': ['mangelin', 'nameling'], 'namely': ['meanly', 'namely'], 'namer': ['enarm', 'namer', 'reman'], 'nammad': ['madman', 'nammad'], 'nan': ['ann', 'nan'], 'nana': ['anan', 'anna', 'nana'], 'nanaimo': ['nanaimo', 'omniana'], 'nancy': ['canny', 'nancy'], 'nandi': ['indan', 'nandi'], 'nane': ['anne', 'nane'], 'nanes': ['nanes', 'senna'], 'nanoid': ['adonin', 'nanoid', 'nonaid'], 'nanosomia': ['nanosomia', 'nosomania'], 'nanpie': ['nanpie', 'pennia', 'pinnae'], 'naological': ['colonalgia', 'naological'], 'naometry': ['monetary', 'myronate', 'naometry'], 'naomi': ['amino', 'inoma', 'naomi', 'omani', 'omina'], 'naoto': ['naoto', 'toona'], 'nap': ['nap', 'pan'], 'napaean': ['anapnea', 'napaean'], 'nape': ['nape', 'neap', 'nepa', 'pane', 'pean'], 'napead': ['napead', 'panade'], 'napery': ['napery', 'pyrena'], 'naphthalize': ['naphthalize', 'phthalazine'], 'naphtol': ['haplont', 'naphtol'], 'napkin': ['napkin', 'pankin'], 'napped': ['append', 'napped'], 'napper': ['napper', 'papern'], 'napron': ['napron', 'nonpar'], 'napthionic': ['antiphonic', 'napthionic'], 'napu': ['napu', 'puan', 'puna'], 'nar': ['arn', 'nar', 'ran'], 'narcaciontes': ['narcaciontes', 'transoceanic'], 'narcose': ['carnose', 'coarsen', 'narcose'], 'narcotia': ['craniota', 'croatian', 'narcotia', 'raincoat'], 'narcoticism': ['intracosmic', 'narcoticism'], 'narcotina': ['anarcotin', 'cantorian', 'carnation', 'narcotina'], 'narcotine': ['connarite', 'container', 'cotarnine', 'crenation', 'narcotine'], 'narcotism': ['narcotism', 'romancist'], 'narcotist': ['narcotist', 'stratonic'], 'narcotize': ['narcotize', 'zirconate'], 'narcous': ['carnous', 'nacrous', 'narcous'], 'nard': ['darn', 'nard', 'rand'], 'nardine': ['adrenin', 'nardine'], 'nardus': ['nardus', 'sundar', 'sundra'], 'nares': ['anser', 'nares', 'rasen', 'snare'], 'nargil': ['nargil', 'raglin'], 'naric': ['cairn', 'crain', 'naric'], 'narica': ['acinar', 'arnica', 'canari', 'carian', 'carina', 'crania', 'narica'], 'nariform': ['nariform', 'raniform'], 'narine': ['narine', 'ranine'], 'nark': ['knar', 'kran', 'nark', 'rank'], 'narration': ['narration', 'tornarian'], 'narthecium': ['anthericum', 'narthecium'], 'nary': ['nary', 'yarn'], 'nasab': ['nasab', 'saban'], 'nasal': ['alans', 'lanas', 'nasal'], 'nasalism': ['nasalism', 'sailsman'], 'nasard': ['nasard', 'sandra'], 'nascapi': ['capsian', 'caspian', 'nascapi', 'panisca'], 'nash': ['hans', 'nash', 'shan'], 'nashgab': ['bangash', 'nashgab'], 'nasi': ['anis', 'nais', 'nasi', 'nias', 'sain', 'sina'], 'nasial': ['anisal', 'nasial', 'salian', 'salina'], 'nasitis': ['nasitis', 'sistani'], 'nasoantral': ['antronasal', 'nasoantral'], 'nasobuccal': ['bucconasal', 'nasobuccal'], 'nasofrontal': ['frontonasal', 'nasofrontal'], 'nasolabial': ['labionasal', 'nasolabial'], 'nasolachrymal': ['lachrymonasal', 'nasolachrymal'], 'nasonite': ['estonian', 'nasonite'], 'nasoorbital': ['nasoorbital', 'orbitonasal'], 'nasopalatal': ['nasopalatal', 'palatonasal'], 'nasoseptal': ['nasoseptal', 'septonasal'], 'nassa': ['nassa', 'sasan'], 'nassidae': ['assidean', 'nassidae'], 'nast': ['nast', 'sant', 'stan'], 'nastic': ['incast', 'nastic'], 'nastily': ['nastily', 'saintly', 'staynil'], 'nasturtion': ['antrustion', 'nasturtion'], 'nasty': ['nasty', 'styan', 'tansy'], 'nasua': ['nasua', 'sauna'], 'nasus': ['nasus', 'susan'], 'nasute': ['nasute', 'nauset', 'unseat'], 'nat': ['ant', 'nat', 'tan'], 'nataka': ['nataka', 'tanaka'], 'natal': ['antal', 'natal'], 'natalia': ['altaian', 'latania', 'natalia'], 'natalie': ['laniate', 'natalie', 'taenial'], 'nataloin': ['latonian', 'nataloin', 'national'], 'natals': ['aslant', 'lansat', 'natals', 'santal'], 'natator': ['arnotta', 'natator'], 'natatorium': ['maturation', 'natatorium'], 'natch': ['chant', 'natch'], 'nate': ['ante', 'aten', 'etna', 'nate', 'neat', 'taen', 'tane', 'tean'], 'nates': ['antes', 'nates', 'stane', 'stean'], 'nathan': ['nathan', 'thanan'], 'nathe': ['enhat', 'ethan', 'nathe', 'neath', 'thane'], 'nather': ['anther', 'nather', 'tharen', 'thenar'], 'natica': ['actian', 'natica', 'tanica'], 'naticiform': ['actiniform', 'naticiform'], 'naticine': ['actinine', 'naticine'], 'natick': ['catkin', 'natick'], 'naticoid': ['actinoid', 'diatonic', 'naticoid'], 'nation': ['anoint', 'nation'], 'national': ['latonian', 'nataloin', 'national'], 'native': ['native', 'navite'], 'natively': ['natively', 'venality'], 'nativist': ['nativist', 'visitant'], 'natr': ['natr', 'rant', 'tarn', 'tran'], 'natricinae': ['natricinae', 'nectarinia'], 'natricine': ['crinanite', 'natricine'], 'natrolite': ['natrolite', 'tentorial'], 'natter': ['attern', 'natter', 'ratten', 'tarten'], 'nattered': ['attender', 'nattered', 'reattend'], 'nattily': ['nattily', 'titanyl'], 'nattle': ['latent', 'latten', 'nattle', 'talent', 'tantle'], 'naturalistic': ['naturalistic', 'unartistical'], 'naturing': ['gainturn', 'naturing'], 'naturism': ['naturism', 'sturmian', 'turanism'], 'naturist': ['antirust', 'naturist'], 'naturistic': ['naturistic', 'unartistic'], 'naturistically': ['naturistically', 'unartistically'], 'nauger': ['nauger', 'raunge', 'ungear'], 'naumk': ['kuman', 'naumk'], 'naunt': ['naunt', 'tunna'], 'nauntle': ['annulet', 'nauntle'], 'nauplius': ['nauplius', 'paulinus'], 'nauset': ['nasute', 'nauset', 'unseat'], 'naut': ['antu', 'aunt', 'naut', 'taun', 'tuan', 'tuna'], 'nauther': ['haunter', 'nauther', 'unearth', 'unheart', 'urethan'], 'nautic': ['anicut', 'nautic', 'ticuna', 'tunica'], 'nautical': ['actinula', 'nautical'], 'nautiloid': ['lutianoid', 'nautiloid'], 'nautilus': ['lutianus', 'nautilus', 'ustulina'], 'naval': ['alvan', 'naval'], 'navalist': ['navalist', 'salivant'], 'navar': ['navar', 'varan', 'varna'], 'nave': ['evan', 'nave', 'vane'], 'navel': ['elvan', 'navel', 'venal'], 'naviculare': ['naviculare', 'uncavalier'], 'navigant': ['navigant', 'vaginant'], 'navigate': ['navigate', 'vaginate'], 'navite': ['native', 'navite'], 'naw': ['awn', 'naw', 'wan'], 'nawt': ['nawt', 'tawn', 'want'], 'nay': ['any', 'nay', 'yan'], 'nayar': ['aryan', 'nayar', 'rayan'], 'nazarite': ['nazarite', 'nazirate', 'triazane'], 'nazi': ['nazi', 'zain'], 'nazim': ['nazim', 'nizam'], 'nazirate': ['nazarite', 'nazirate', 'triazane'], 'nazirite': ['nazirite', 'triazine'], 'ne': ['en', 'ne'], 'nea': ['ean', 'nae', 'nea'], 'neal': ['alen', 'lane', 'lean', 'lena', 'nael', 'neal'], 'neanic': ['canine', 'encina', 'neanic'], 'neap': ['nape', 'neap', 'nepa', 'pane', 'pean'], 'neapolitan': ['antelopian', 'neapolitan', 'panelation'], 'nearby': ['barney', 'nearby'], 'nearctic': ['acentric', 'encratic', 'nearctic'], 'nearest': ['earnest', 'eastern', 'nearest'], 'nearish': ['arshine', 'nearish', 'rhesian', 'sherani'], 'nearly': ['anerly', 'nearly'], 'nearmost': ['monaster', 'monstera', 'nearmost', 'storeman'], 'nearthrosis': ['enarthrosis', 'nearthrosis'], 'neat': ['ante', 'aten', 'etna', 'nate', 'neat', 'taen', 'tane', 'tean'], 'neaten': ['etnean', 'neaten'], 'neath': ['enhat', 'ethan', 'nathe', 'neath', 'thane'], 'neatherd': ['adherent', 'headrent', 'neatherd', 'threaden'], 'neatherdess': ['heartedness', 'neatherdess'], 'neb': ['ben', 'neb'], 'neback': ['backen', 'neback'], 'nebaioth': ['boethian', 'nebaioth'], 'nebalia': ['abelian', 'nebalia'], 'nebelist': ['nebelist', 'stilbene', 'tensible'], 'nebula': ['nebula', 'unable', 'unbale'], 'nebulose': ['bluenose', 'nebulose'], 'necator': ['enactor', 'necator', 'orcanet'], 'necessarian': ['necessarian', 'renaissance'], 'neckar': ['canker', 'neckar'], 'necrogenic': ['congeneric', 'necrogenic'], 'necrogenous': ['congenerous', 'necrogenous'], 'necrology': ['crenology', 'necrology'], 'necropoles': ['necropoles', 'preconsole'], 'necropolis': ['clinospore', 'necropolis'], 'necrotic': ['crocetin', 'necrotic'], 'necrotomic': ['necrotomic', 'oncometric'], 'necrotomy': ['necrotomy', 'normocyte', 'oncometry'], 'nectar': ['canter', 'creant', 'cretan', 'nectar', 'recant', 'tanrec', 'trance'], 'nectareal': ['lactarene', 'nectareal'], 'nectared': ['crenated', 'decanter', 'nectared'], 'nectareous': ['countersea', 'nectareous'], 'nectarial': ['carnalite', 'claretian', 'lacertian', 'nectarial'], 'nectarian': ['cratinean', 'incarnate', 'nectarian'], 'nectaried': ['nectaried', 'tridecane'], 'nectarine': ['inertance', 'nectarine'], 'nectarinia': ['natricinae', 'nectarinia'], 'nectarious': ['nectarious', 'recusation'], 'nectarlike': ['nectarlike', 'trancelike'], 'nectarous': ['acentrous', 'courtesan', 'nectarous'], 'nectary': ['encraty', 'nectary'], 'nectophore': ['ctenophore', 'nectophore'], 'nectria': ['centiar', 'certain', 'citrean', 'nacrite', 'nectria'], 'ned': ['den', 'end', 'ned'], 'nedder': ['nedder', 'redden'], 'neebor': ['boreen', 'enrobe', 'neebor', 'rebone'], 'need': ['dene', 'eden', 'need'], 'needer': ['endere', 'needer', 'reeden'], 'needfire': ['needfire', 'redefine'], 'needily': ['needily', 'yielden'], 'needle': ['lendee', 'needle'], 'needless': ['needless', 'seldseen'], 'needs': ['dense', 'needs'], 'needsome': ['modenese', 'needsome'], 'neeger': ['neeger', 'reenge', 'renege'], 'neeld': ['leden', 'neeld'], 'neep': ['neep', 'peen'], 'neepour': ['neepour', 'neurope'], 'neer': ['erne', 'neer', 'reen'], 'neet': ['neet', 'nete', 'teen'], 'neetup': ['neetup', 'petune'], 'nef': ['fen', 'nef'], 'nefast': ['fasten', 'nefast', 'stefan'], 'neftgil': ['felting', 'neftgil'], 'negate': ['geneat', 'negate', 'tegean'], 'negation': ['antigone', 'negation'], 'negative': ['agentive', 'negative'], 'negativism': ['negativism', 'timesaving'], 'negator': ['negator', 'tronage'], 'negatron': ['argenton', 'negatron'], 'neger': ['genre', 'green', 'neger', 'reneg'], 'neglecter': ['neglecter', 'reneglect'], 'negritian': ['negritian', 'retaining'], 'negrito': ['ergotin', 'genitor', 'negrito', 'ogtiern', 'trigone'], 'negritoid': ['negritoid', 'rodingite'], 'negro': ['ergon', 'genro', 'goner', 'negro'], 'negroid': ['groined', 'negroid'], 'negroidal': ['girandole', 'negroidal'], 'negroize': ['genizero', 'negroize'], 'negroloid': ['gondolier', 'negroloid'], 'negrotic': ['gerontic', 'negrotic'], 'negundo': ['dungeon', 'negundo'], 'negus': ['genus', 'negus'], 'neif': ['enif', 'fine', 'neif', 'nife'], 'neigh': ['hinge', 'neigh'], 'neil': ['lien', 'line', 'neil', 'nile'], 'neiper': ['neiper', 'perine', 'pirene', 'repine'], 'neist': ['inset', 'neist', 'snite', 'stein', 'stine', 'tsine'], 'neither': ['enherit', 'etherin', 'neither', 'therein'], 'nekkar': ['kraken', 'nekkar'], 'nekton': ['kenton', 'nekton'], 'nelken': ['kennel', 'nelken'], 'nelsonite': ['nelsonite', 'solentine'], 'nelumbian': ['nelumbian', 'unminable'], 'nema': ['amen', 'enam', 'mane', 'mean', 'name', 'nema'], 'nemalite': ['melanite', 'meletian', 'metaline', 'nemalite'], 'nematoda': ['mantodea', 'nematoda'], 'nematoid': ['dominate', 'nematoid'], 'nematophyton': ['nematophyton', 'tenontophyma'], 'nemertinea': ['minnetaree', 'nemertinea'], 'nemertini': ['intermine', 'nemertini', 'terminine'], 'nemertoid': ['interdome', 'mordenite', 'nemertoid'], 'nemoral': ['almoner', 'moneral', 'nemoral'], 'nenta': ['anent', 'annet', 'nenta'], 'neo': ['eon', 'neo', 'one'], 'neoarctic': ['accretion', 'anorectic', 'neoarctic'], 'neocomian': ['monoecian', 'neocomian'], 'neocosmic': ['economics', 'neocosmic'], 'neocyte': ['enocyte', 'neocyte'], 'neogaea': ['eogaean', 'neogaea'], 'neogenesis': ['neogenesis', 'noegenesis'], 'neogenetic': ['neogenetic', 'noegenetic'], 'neognathous': ['anthogenous', 'neognathous'], 'neolatry': ['neolatry', 'ornately', 'tyrolean'], 'neolithic': ['ichnolite', 'neolithic'], 'neomiracle': ['ceremonial', 'neomiracle'], 'neomorphic': ['microphone', 'neomorphic'], 'neon': ['neon', 'none'], 'neophilism': ['neophilism', 'philoneism'], 'neophytic': ['hypnoetic', 'neophytic'], 'neoplasm': ['neoplasm', 'pleonasm', 'polesman', 'splenoma'], 'neoplastic': ['neoplastic', 'pleonastic'], 'neorama': ['neorama', 'romaean'], 'neornithes': ['neornithes', 'rhinestone'], 'neossin': ['neossin', 'sension'], 'neoteric': ['erection', 'neoteric', 'nocerite', 'renotice'], 'neoterism': ['moistener', 'neoterism'], 'neotragus': ['argentous', 'neotragus'], 'neotropic': ['ectropion', 'neotropic'], 'neotropical': ['neotropical', 'percolation'], 'neoza': ['neoza', 'ozena'], 'nep': ['nep', 'pen'], 'nepa': ['nape', 'neap', 'nepa', 'pane', 'pean'], 'nepal': ['alpen', 'nepal', 'panel', 'penal', 'plane'], 'nepali': ['alpine', 'nepali', 'penial', 'pineal'], 'neper': ['neper', 'preen', 'repen'], 'nepheloscope': ['nepheloscope', 'phonelescope'], 'nephite': ['heptine', 'nephite'], 'nephogram': ['gomphrena', 'nephogram'], 'nephological': ['nephological', 'phenological'], 'nephologist': ['nephologist', 'phenologist'], 'nephology': ['nephology', 'phenology'], 'nephria': ['heparin', 'nephria'], 'nephric': ['nephric', 'phrenic', 'pincher'], 'nephrite': ['nephrite', 'prehnite', 'trephine'], 'nephritic': ['nephritic', 'phrenitic', 'prehnitic'], 'nephritis': ['inspreith', 'nephritis', 'phrenitis'], 'nephrocardiac': ['nephrocardiac', 'phrenocardiac'], 'nephrocolic': ['nephrocolic', 'phrenocolic'], 'nephrocystosis': ['cystonephrosis', 'nephrocystosis'], 'nephrogastric': ['gastrophrenic', 'nephrogastric', 'phrenogastric'], 'nephrohydrosis': ['hydronephrosis', 'nephrohydrosis'], 'nephrolithotomy': ['lithonephrotomy', 'nephrolithotomy'], 'nephrologist': ['nephrologist', 'phrenologist'], 'nephrology': ['nephrology', 'phrenology'], 'nephropathic': ['nephropathic', 'phrenopathic'], 'nephropathy': ['nephropathy', 'phrenopathy'], 'nephropsidae': ['nephropsidae', 'praesphenoid'], 'nephroptosia': ['nephroptosia', 'prosiphonate'], 'nephropyelitis': ['nephropyelitis', 'pyelonephritis'], 'nephropyosis': ['nephropyosis', 'pyonephrosis'], 'nephrosis': ['nephrosis', 'phronesis'], 'nephrostoma': ['nephrostoma', 'strophomena'], 'nephrotome': ['nephrotome', 'phonometer'], 'nephrotomy': ['nephrotomy', 'phonometry'], 'nepman': ['nepman', 'penman'], 'nepotal': ['lepanto', 'nepotal', 'petalon', 'polenta'], 'nepote': ['nepote', 'pontee', 'poteen'], 'nepotic': ['entopic', 'nepotic', 'pentoic'], 'nereid': ['denier', 'nereid'], 'nereis': ['inseer', 'nereis', 'seiner', 'serine', 'sirene'], 'neri': ['neri', 'rein', 'rine'], 'nerita': ['nerita', 'ratine', 'retain', 'retina', 'tanier'], 'neritic': ['citrine', 'crinite', 'inciter', 'neritic'], 'neritina': ['neritina', 'retinian'], 'neritoid': ['neritoid', 'retinoid'], 'nerium': ['murine', 'nerium'], 'neroic': ['cerion', 'coiner', 'neroic', 'orcein', 'recoin'], 'neronic': ['corinne', 'cornein', 'neronic'], 'nerval': ['nerval', 'vernal'], 'nervate': ['nervate', 'veteran'], 'nervation': ['nervation', 'vernation'], 'nerve': ['nerve', 'never'], 'nervid': ['driven', 'nervid', 'verdin'], 'nervine': ['innerve', 'nervine', 'vernine'], 'nerviness': ['inverness', 'nerviness'], 'nervish': ['nervish', 'shriven'], 'nervulose': ['nervulose', 'unresolve', 'vulnerose'], 'nese': ['ense', 'esne', 'nese', 'seen', 'snee'], 'nesh': ['nesh', 'shen'], 'nesiot': ['nesiot', 'ostein'], 'neskhi': ['kishen', 'neskhi'], 'neslia': ['alsine', 'neslia', 'saline', 'selina', 'silane'], 'nest': ['nest', 'sent', 'sten'], 'nester': ['ernest', 'nester', 'resent', 'streen'], 'nestiatria': ['intarsiate', 'nestiatria'], 'nestlike': ['nestlike', 'skeletin'], 'nestor': ['nestor', 'sterno', 'stoner', 'strone', 'tensor'], 'net': ['net', 'ten'], 'netcha': ['entach', 'netcha'], 'nete': ['neet', 'nete', 'teen'], 'neter': ['enter', 'neter', 'renet', 'terne', 'treen'], 'netful': ['fluent', 'netful', 'unfelt', 'unleft'], 'neth': ['hent', 'neth', 'then'], 'nether': ['erthen', 'henter', 'nether', 'threne'], 'neti': ['iten', 'neti', 'tien', 'tine'], 'netman': ['manent', 'netman'], 'netsuke': ['kuneste', 'netsuke'], 'nettable': ['nettable', 'tentable'], 'nettapus': ['nettapus', 'stepaunt'], 'netted': ['detent', 'netted', 'tented'], 'netter': ['netter', 'retent', 'tenter'], 'nettion': ['nettion', 'tention', 'tontine'], 'nettle': ['letten', 'nettle'], 'nettler': ['nettler', 'ternlet'], 'netty': ['netty', 'tenty'], 'neurad': ['endura', 'neurad', 'undear', 'unread'], 'neural': ['lunare', 'neural', 'ulnare', 'unreal'], 'neuralgic': ['genicular', 'neuralgic'], 'neuralist': ['neuralist', 'ulsterian', 'unrealist'], 'neurectopia': ['eucatropine', 'neurectopia'], 'neuric': ['curine', 'erucin', 'neuric'], 'neurilema': ['lemurinae', 'neurilema'], 'neurin': ['enruin', 'neurin', 'unrein'], 'neurism': ['neurism', 'semiurn'], 'neurite': ['neurite', 'retinue', 'reunite', 'uterine'], 'neuroblast': ['neuroblast', 'unsortable'], 'neurodermatosis': ['dermatoneurosis', 'neurodermatosis'], 'neurofibroma': ['fibroneuroma', 'neurofibroma'], 'neurofil': ['fluorine', 'neurofil'], 'neuroganglion': ['ganglioneuron', 'neuroganglion'], 'neurogenic': ['encoignure', 'neurogenic'], 'neuroid': ['dourine', 'neuroid'], 'neurolysis': ['neurolysis', 'resinously'], 'neuromast': ['anoestrum', 'neuromast'], 'neuromyelitis': ['myeloneuritis', 'neuromyelitis'], 'neuronal': ['enaluron', 'neuronal'], 'neurope': ['neepour', 'neurope'], 'neuropsychological': ['neuropsychological', 'psychoneurological'], 'neuropsychosis': ['neuropsychosis', 'psychoneurosis'], 'neuropteris': ['interposure', 'neuropteris'], 'neurosis': ['neurosis', 'resinous'], 'neurotic': ['eruction', 'neurotic'], 'neurotripsy': ['neurotripsy', 'tripyrenous'], 'neustrian': ['neustrian', 'saturnine', 'sturninae'], 'neuter': ['neuter', 'retune', 'runtee', 'tenure', 'tureen'], 'neuterly': ['neuterly', 'rutylene'], 'neutral': ['laurent', 'neutral', 'unalert'], 'neutralism': ['neutralism', 'trimensual'], 'neutrally': ['neutrally', 'unalertly'], 'neutralness': ['neutralness', 'unalertness'], 'nevada': ['nevada', 'vedana', 'venada'], 'neve': ['even', 'neve', 'veen'], 'never': ['nerve', 'never'], 'nevo': ['nevo', 'oven'], 'nevoy': ['envoy', 'nevoy', 'yoven'], 'nevus': ['nevus', 'venus'], 'new': ['new', 'wen'], 'newar': ['awner', 'newar'], 'newari': ['newari', 'wainer'], 'news': ['news', 'sewn', 'snew'], 'newt': ['newt', 'went'], 'nexus': ['nexus', 'unsex'], 'ngai': ['gain', 'inga', 'naig', 'ngai'], 'ngaio': ['gonia', 'ngaio', 'nogai'], 'ngapi': ['aping', 'ngapi', 'pangi'], 'ngoko': ['kongo', 'ngoko'], 'ni': ['in', 'ni'], 'niagara': ['agrania', 'angaria', 'niagara'], 'nias': ['anis', 'nais', 'nasi', 'nias', 'sain', 'sina'], 'niata': ['anita', 'niata', 'tania'], 'nib': ['bin', 'nib'], 'nibs': ['nibs', 'snib'], 'nibsome': ['nibsome', 'nimbose'], 'nicarao': ['aaronic', 'nicarao', 'ocarina'], 'niccolous': ['niccolous', 'occlusion'], 'nice': ['cine', 'nice'], 'nicene': ['cinene', 'nicene'], 'nicenist': ['inscient', 'nicenist'], 'nicesome': ['nicesome', 'semicone'], 'nichael': ['chilean', 'echinal', 'nichael'], 'niche': ['chien', 'chine', 'niche'], 'nicher': ['enrich', 'nicher', 'richen'], 'nicholas': ['lichanos', 'nicholas'], 'nickel': ['nickel', 'nickle'], 'nickle': ['nickel', 'nickle'], 'nicol': ['colin', 'nicol'], 'nicolas': ['nicolas', 'scaloni'], 'nicolette': ['lecontite', 'nicolette'], 'nicotian': ['aconitin', 'inaction', 'nicotian'], 'nicotianin': ['nicotianin', 'nicotinian'], 'nicotined': ['incondite', 'nicotined'], 'nicotinian': ['nicotianin', 'nicotinian'], 'nicotism': ['monistic', 'nicotism', 'nomistic'], 'nicotize': ['nicotize', 'tonicize'], 'nictate': ['nictate', 'tetanic'], 'nictation': ['antitonic', 'nictation'], 'nid': ['din', 'ind', 'nid'], 'nidal': ['danli', 'ladin', 'linda', 'nidal'], 'nidana': ['andian', 'danian', 'nidana'], 'nidation': ['nidation', 'notidani'], 'niddle': ['dindle', 'niddle'], 'nide': ['dine', 'enid', 'inde', 'nide'], 'nidge': ['deign', 'dinge', 'nidge'], 'nidget': ['nidget', 'tinged'], 'niding': ['dining', 'indign', 'niding'], 'nidologist': ['indologist', 'nidologist'], 'nidology': ['indology', 'nidology'], 'nidularia': ['nidularia', 'uniradial'], 'nidulate': ['nidulate', 'untailed'], 'nidus': ['dinus', 'indus', 'nidus'], 'niello': ['lionel', 'niello'], 'niels': ['elsin', 'lenis', 'niels', 'silen', 'sline'], 'nieve': ['nieve', 'venie'], 'nieveta': ['naivete', 'nieveta'], 'nievling': ['levining', 'nievling'], 'nife': ['enif', 'fine', 'neif', 'nife'], 'nifle': ['elfin', 'nifle'], 'nig': ['gin', 'ing', 'nig'], 'nigel': ['ingle', 'ligne', 'linge', 'nigel'], 'nigella': ['gallein', 'galline', 'nigella'], 'nigerian': ['arginine', 'nigerian'], 'niggard': ['grading', 'niggard'], 'nigger': ['ginger', 'nigger'], 'niggery': ['gingery', 'niggery'], 'nigh': ['hing', 'nigh'], 'night': ['night', 'thing'], 'nightless': ['lightness', 'nightless', 'thingless'], 'nightlike': ['nightlike', 'thinglike'], 'nightly': ['nightly', 'thingly'], 'nightman': ['nightman', 'thingman'], 'nignye': ['ginney', 'nignye'], 'nigori': ['nigori', 'origin'], 'nigre': ['grein', 'inger', 'nigre', 'regin', 'reign', 'ringe'], 'nigrous': ['nigrous', 'rousing', 'souring'], 'nihal': ['linha', 'nihal'], 'nikau': ['kunai', 'nikau'], 'nil': ['lin', 'nil'], 'nile': ['lien', 'line', 'neil', 'nile'], 'nilgai': ['ailing', 'angili', 'nilgai'], 'nilometer': ['linometer', 'nilometer'], 'niloscope': ['niloscope', 'scopoline'], 'nilotic': ['clition', 'nilotic'], 'nilous': ['insoul', 'linous', 'nilous', 'unsoil'], 'nim': ['min', 'nim'], 'nimbed': ['embind', 'nimbed'], 'nimbose': ['nibsome', 'nimbose'], 'nimkish': ['minkish', 'nimkish'], 'nimshi': ['minish', 'nimshi'], 'nina': ['nain', 'nina'], 'ninescore': ['ninescore', 'recension'], 'nineted': ['dentine', 'nineted'], 'ninevite': ['ninevite', 'nivenite'], 'ningpo': ['ningpo', 'pignon'], 'nintu': ['nintu', 'ninut', 'untin'], 'ninut': ['nintu', 'ninut', 'untin'], 'niota': ['niota', 'taino'], 'nip': ['nip', 'pin'], 'nipa': ['nipa', 'pain', 'pani', 'pian', 'pina'], 'nippers': ['nippers', 'snipper'], 'nipple': ['lippen', 'nipple'], 'nipter': ['nipter', 'terpin'], 'nisaean': ['nisaean', 'sinaean'], 'nisqualli': ['nisqualli', 'squillian'], 'nisus': ['nisus', 'sinus'], 'nit': ['nit', 'tin'], 'nitch': ['chint', 'nitch'], 'nitella': ['nitella', 'tellina'], 'nitently': ['intently', 'nitently'], 'niter': ['inert', 'inter', 'niter', 'retin', 'trine'], 'nitered': ['nitered', 'redient', 'teinder'], 'nither': ['hinter', 'nither', 'theirn'], 'nito': ['into', 'nito', 'oint', 'tino'], 'niton': ['niton', 'noint'], 'nitrate': ['intreat', 'iterant', 'nitrate', 'tertian'], 'nitratine': ['itinerant', 'nitratine'], 'nitric': ['citrin', 'nitric'], 'nitride': ['inditer', 'nitride'], 'nitrifaction': ['antifriction', 'nitrifaction'], 'nitriot': ['introit', 'nitriot'], 'nitrobenzol': ['benzonitrol', 'nitrobenzol'], 'nitrogelatin': ['intolerating', 'nitrogelatin'], 'nitrosate': ['nitrosate', 'stationer'], 'nitrous': ['nitrous', 'trusion'], 'nitter': ['nitter', 'tinter'], 'nitty': ['nitty', 'tinty'], 'niue': ['niue', 'unie'], 'nival': ['alvin', 'anvil', 'nival', 'vinal'], 'nivenite': ['ninevite', 'nivenite'], 'niveous': ['envious', 'niveous', 'veinous'], 'nivosity': ['nivosity', 'vinosity'], 'nizam': ['nazim', 'nizam'], 'no': ['no', 'on'], 'noa': ['noa', 'ona'], 'noachite': ['inchoate', 'noachite'], 'noah': ['hano', 'noah'], 'noahic': ['chinoa', 'noahic'], 'noam': ['mano', 'moan', 'mona', 'noam', 'noma', 'oman'], 'nob': ['bon', 'nob'], 'nobleman': ['blennoma', 'nobleman'], 'noblesse': ['boneless', 'noblesse'], 'nobs': ['bosn', 'nobs', 'snob'], 'nocardia': ['nocardia', 'orcadian'], 'nocent': ['nocent', 'nocten'], 'nocerite': ['erection', 'neoteric', 'nocerite', 'renotice'], 'nock': ['conk', 'nock'], 'nocten': ['nocent', 'nocten'], 'noctiluca': ['ciclatoun', 'noctiluca'], 'noctuid': ['conduit', 'duction', 'noctuid'], 'noctuidae': ['coadunite', 'education', 'noctuidae'], 'nocturia': ['curation', 'nocturia'], 'nod': ['don', 'nod'], 'nodal': ['donal', 'nodal'], 'nodated': ['donated', 'nodated'], 'node': ['done', 'node'], 'nodi': ['dion', 'nodi', 'odin'], 'nodiak': ['daikon', 'nodiak'], 'nodical': ['dolcian', 'nodical'], 'nodicorn': ['corindon', 'nodicorn'], 'nodule': ['louden', 'nodule'], 'nodus': ['nodus', 'ounds', 'sound'], 'noegenesis': ['neogenesis', 'noegenesis'], 'noegenetic': ['neogenetic', 'noegenetic'], 'noel': ['elon', 'enol', 'leno', 'leon', 'lone', 'noel'], 'noetic': ['eciton', 'noetic', 'notice', 'octine'], 'noetics': ['contise', 'noetics', 'section'], 'nog': ['gon', 'nog'], 'nogai': ['gonia', 'ngaio', 'nogai'], 'nogal': ['along', 'gonal', 'lango', 'longa', 'nogal'], 'noil': ['lino', 'lion', 'loin', 'noil'], 'noilage': ['goniale', 'noilage'], 'noiler': ['elinor', 'lienor', 'lorien', 'noiler'], 'noint': ['niton', 'noint'], 'noir': ['inro', 'iron', 'noir', 'nori'], 'noise': ['eosin', 'noise'], 'noiseless': ['noiseless', 'selenosis'], 'noisette': ['noisette', 'teosinte'], 'nolo': ['loon', 'nolo'], 'noma': ['mano', 'moan', 'mona', 'noam', 'noma', 'oman'], 'nomad': ['damon', 'monad', 'nomad'], 'nomadian': ['monadina', 'nomadian'], 'nomadic': ['monadic', 'nomadic'], 'nomadical': ['monadical', 'nomadical'], 'nomadically': ['monadically', 'nomadically'], 'nomadism': ['monadism', 'nomadism'], 'nomarch': ['monarch', 'nomarch', 'onmarch'], 'nomarchy': ['monarchy', 'nomarchy'], 'nome': ['mone', 'nome', 'omen'], 'nomeus': ['nomeus', 'unsome'], 'nomial': ['monial', 'nomial', 'oilman'], 'nomina': ['amnion', 'minoan', 'nomina'], 'nominate': ['antinome', 'nominate'], 'nominated': ['dentinoma', 'nominated'], 'nominature': ['nominature', 'numeration'], 'nomism': ['monism', 'nomism', 'simmon'], 'nomismata': ['anatomism', 'nomismata'], 'nomistic': ['monistic', 'nicotism', 'nomistic'], 'nomocracy': ['monocracy', 'nomocracy'], 'nomogenist': ['monogenist', 'nomogenist'], 'nomogenous': ['monogenous', 'nomogenous'], 'nomogeny': ['monogeny', 'nomogeny'], 'nomogram': ['monogram', 'nomogram'], 'nomograph': ['monograph', 'nomograph', 'phonogram'], 'nomographer': ['geranomorph', 'monographer', 'nomographer'], 'nomographic': ['gramophonic', 'monographic', 'nomographic', 'phonogramic'], 'nomographical': ['gramophonical', 'monographical', 'nomographical'], 'nomographically': ['gramophonically', 'monographically', 'nomographically', 'phonogramically'], 'nomography': ['monography', 'nomography'], 'nomological': ['monological', 'nomological'], 'nomologist': ['monologist', 'nomologist', 'ontologism'], 'nomology': ['monology', 'nomology'], 'nomophyllous': ['monophyllous', 'nomophyllous'], 'nomotheism': ['monotheism', 'nomotheism'], 'nomothetic': ['monothetic', 'nomothetic'], 'nona': ['anon', 'nona', 'onan'], 'nonaccession': ['connoissance', 'nonaccession'], 'nonact': ['cannot', 'canton', 'conant', 'nonact'], 'nonaction': ['connation', 'nonaction'], 'nonagent': ['nonagent', 'tannogen'], 'nonaid': ['adonin', 'nanoid', 'nonaid'], 'nonaltruistic': ['instructional', 'nonaltruistic'], 'nonanimal': ['nonanimal', 'nonmanila'], 'nonbilabiate': ['inobtainable', 'nonbilabiate'], 'noncaste': ['noncaste', 'tsonecan'], 'noncereal': ['aleconner', 'noncereal'], 'noncertified': ['noncertified', 'nonrectified'], 'nonclaim': ['cinnamol', 'nonclaim'], 'noncreation': ['noncreation', 'nonreaction'], 'noncreative': ['noncreative', 'nonreactive'], 'noncurantist': ['noncurantist', 'unconstraint'], 'nonda': ['donna', 'nonda'], 'nondesecration': ['nondesecration', 'recondensation'], 'none': ['neon', 'none'], 'nonempirical': ['nonempirical', 'prenominical'], 'nonerudite': ['nonerudite', 'unoriented'], 'nonesuch': ['nonesuch', 'unchosen'], 'nonet': ['nonet', 'tenon'], 'nonfertile': ['florentine', 'nonfertile'], 'nongeometrical': ['inconglomerate', 'nongeometrical'], 'nonglare': ['algernon', 'nonglare'], 'nongod': ['dongon', 'nongod'], 'nonhepatic': ['nonhepatic', 'pantheonic'], 'nonic': ['conin', 'nonic', 'oncin'], 'nonideal': ['anneloid', 'nonideal'], 'nonidealist': ['alstonidine', 'nonidealist'], 'nonirate': ['anointer', 'inornate', 'nonirate', 'reanoint'], 'nonius': ['nonius', 'unison'], 'nonlegato': ['nonlegato', 'ontogenal'], 'nonlegume': ['melungeon', 'nonlegume'], 'nonliable': ['bellonian', 'nonliable'], 'nonlicet': ['contline', 'nonlicet'], 'nonly': ['nonly', 'nonyl', 'nylon'], 'nonmanila': ['nonanimal', 'nonmanila'], 'nonmarital': ['antinormal', 'nonmarital', 'nonmartial'], 'nonmartial': ['antinormal', 'nonmarital', 'nonmartial'], 'nonmatter': ['nonmatter', 'remontant'], 'nonmetric': ['comintern', 'nonmetric'], 'nonmetrical': ['centinormal', 'conterminal', 'nonmetrical'], 'nonmolar': ['nonmolar', 'nonmoral'], 'nonmoral': ['nonmolar', 'nonmoral'], 'nonnat': ['nonnat', 'nontan'], 'nonoriental': ['nonoriental', 'nonrelation'], 'nonpaid': ['dipnoan', 'nonpaid', 'pandion'], 'nonpar': ['napron', 'nonpar'], 'nonparental': ['nonparental', 'nonpaternal'], 'nonpaternal': ['nonparental', 'nonpaternal'], 'nonpearlitic': ['nonpearlitic', 'pratincoline'], 'nonpenal': ['nonpenal', 'nonplane'], 'nonplane': ['nonpenal', 'nonplane'], 'nonracial': ['carniolan', 'nonracial'], 'nonrated': ['nonrated', 'nontrade'], 'nonreaction': ['noncreation', 'nonreaction'], 'nonreactive': ['noncreative', 'nonreactive'], 'nonrebel': ['ennobler', 'nonrebel'], 'nonrecital': ['interconal', 'nonrecital'], 'nonrectified': ['noncertified', 'nonrectified'], 'nonrelation': ['nonoriental', 'nonrelation'], 'nonreserve': ['nonreserve', 'nonreverse'], 'nonreverse': ['nonreserve', 'nonreverse'], 'nonrigid': ['girondin', 'nonrigid'], 'nonsanction': ['inconsonant', 'nonsanction'], 'nonscientist': ['inconsistent', 'nonscientist'], 'nonsecret': ['consenter', 'nonsecret', 'reconsent'], 'nontan': ['nonnat', 'nontan'], 'nontrade': ['nonrated', 'nontrade'], 'nonunited': ['nonunited', 'unintoned'], 'nonuse': ['nonuse', 'unnose'], 'nonvaginal': ['nonvaginal', 'novanglian'], 'nonvisitation': ['innovationist', 'nonvisitation'], 'nonya': ['annoy', 'nonya'], 'nonyl': ['nonly', 'nonyl', 'nylon'], 'nooking': ['kongoni', 'nooking'], 'noontide': ['noontide', 'notioned'], 'noontime': ['entomion', 'noontime'], 'noop': ['noop', 'poon'], 'noose': ['noose', 'osone'], 'nooser': ['nooser', 'seroon', 'sooner'], 'nopal': ['lapon', 'nopal'], 'nope': ['nope', 'open', 'peon', 'pone'], 'nor': ['nor', 'ron'], 'nora': ['nora', 'orna', 'roan'], 'norah': ['nahor', 'norah', 'rohan'], 'norate': ['atoner', 'norate', 'ornate'], 'noration': ['noration', 'ornation', 'orotinan'], 'nordic': ['dornic', 'nordic'], 'nordicity': ['nordicity', 'tyrocidin'], 'noreast': ['noreast', 'rosetan', 'seatron', 'senator', 'treason'], 'nori': ['inro', 'iron', 'noir', 'nori'], 'noria': ['arion', 'noria'], 'noric': ['corin', 'noric', 'orcin'], 'norie': ['irone', 'norie'], 'norite': ['norite', 'orient'], 'norm': ['morn', 'norm'], 'norma': ['manor', 'moran', 'norma', 'ramon', 'roman'], 'normality': ['normality', 'trionymal'], 'normated': ['moderant', 'normated'], 'normless': ['mornless', 'normless'], 'normocyte': ['necrotomy', 'normocyte', 'oncometry'], 'norse': ['norse', 'noser', 'seron', 'snore'], 'norsk': ['norsk', 'snork'], 'north': ['north', 'thorn'], 'norther': ['horrent', 'norther'], 'northing': ['inthrong', 'northing'], 'nosairi': ['nosairi', 'osirian'], 'nose': ['enos', 'nose'], 'nosean': ['nosean', 'oannes'], 'noseless': ['noseless', 'soleness'], 'noselite': ['noselite', 'solenite'], 'nosema': ['monase', 'nosema'], 'noser': ['norse', 'noser', 'seron', 'snore'], 'nosesmart': ['nosesmart', 'storesman'], 'nosism': ['nosism', 'simson'], 'nosomania': ['nanosomia', 'nosomania'], 'nostalgia': ['analogist', 'nostalgia'], 'nostalgic': ['gnostical', 'nostalgic'], 'nostic': ['nostic', 'sintoc', 'tocsin'], 'nostoc': ['nostoc', 'oncost'], 'nosu': ['nosu', 'nous', 'onus'], 'not': ['not', 'ton'], 'notability': ['bitonality', 'notability'], 'notaeal': ['anatole', 'notaeal'], 'notaeum': ['notaeum', 'outname'], 'notal': ['notal', 'ontal', 'talon', 'tolan', 'tonal'], 'notalgia': ['galtonia', 'notalgia'], 'notalia': ['ailanto', 'alation', 'laotian', 'notalia'], 'notan': ['anton', 'notan', 'tonna'], 'notarial': ['notarial', 'rational', 'rotalian'], 'notarially': ['notarially', 'rationally'], 'notariate': ['notariate', 'rationate'], 'notation': ['notation', 'tonation'], 'notator': ['arnotto', 'notator'], 'notcher': ['chorten', 'notcher'], 'note': ['note', 'tone'], 'noted': ['donet', 'noted', 'toned'], 'notehead': ['headnote', 'notehead'], 'noteless': ['noteless', 'toneless'], 'notelessly': ['notelessly', 'tonelessly'], 'notelessness': ['notelessness', 'tonelessness'], 'noter': ['noter', 'tenor', 'toner', 'trone'], 'nother': ['hornet', 'nother', 'theron', 'throne'], 'nothous': ['hontous', 'nothous'], 'notice': ['eciton', 'noetic', 'notice', 'octine'], 'noticer': ['cerotin', 'cointer', 'cotrine', 'cretion', 'noticer', 'rection'], 'notidani': ['nidation', 'notidani'], 'notify': ['notify', 'tonify'], 'notioned': ['noontide', 'notioned'], 'notochordal': ['chordotonal', 'notochordal'], 'notopterus': ['notopterus', 'portentous'], 'notorhizal': ['horizontal', 'notorhizal'], 'nototrema': ['antrotome', 'nototrema'], 'notour': ['notour', 'unroot'], 'notropis': ['notropis', 'positron', 'sorption'], 'notum': ['montu', 'mount', 'notum'], 'notus': ['notus', 'snout', 'stoun', 'tonus'], 'nought': ['hognut', 'nought'], 'noup': ['noup', 'puno', 'upon'], 'nourisher': ['nourisher', 'renourish'], 'nous': ['nosu', 'nous', 'onus'], 'novalia': ['novalia', 'valonia'], 'novanglian': ['nonvaginal', 'novanglian'], 'novem': ['novem', 'venom'], 'novitiate': ['evitation', 'novitiate'], 'now': ['now', 'own', 'won'], 'nowanights': ['nowanights', 'washington'], 'nowed': ['endow', 'nowed'], 'nowhere': ['nowhere', 'whereon'], 'nowise': ['nowise', 'snowie'], 'nowness': ['nowness', 'ownness'], 'nowt': ['nowt', 'town', 'wont'], 'noxa': ['axon', 'noxa', 'oxan'], 'noy': ['noy', 'yon'], 'nozi': ['nozi', 'zion'], 'nu': ['nu', 'un'], 'nub': ['bun', 'nub'], 'nuba': ['baun', 'buna', 'nabu', 'nuba'], 'nubian': ['nubian', 'unbain'], 'nubilate': ['antiblue', 'nubilate'], 'nubile': ['nubile', 'unible'], 'nucal': ['lucan', 'nucal'], 'nucellar': ['lucernal', 'nucellar', 'uncellar'], 'nuchal': ['chulan', 'launch', 'nuchal'], 'nuciferous': ['nuciferous', 'unciferous'], 'nuciform': ['nuciform', 'unciform'], 'nuclear': ['crenula', 'lucarne', 'nuclear', 'unclear'], 'nucleator': ['nucleator', 'recountal'], 'nucleoid': ['nucleoid', 'uncoiled'], 'nuclide': ['include', 'nuclide'], 'nuculid': ['nuculid', 'unlucid'], 'nuculidae': ['duculinae', 'nuculidae'], 'nudate': ['nudate', 'undate'], 'nuddle': ['ludden', 'nuddle'], 'nude': ['dune', 'nude', 'unde'], 'nudeness': ['nudeness', 'unsensed'], 'nudger': ['dunger', 'gerund', 'greund', 'nudger'], 'nudist': ['dustin', 'nudist'], 'nudity': ['nudity', 'untidy'], 'nuisancer': ['insurance', 'nuisancer'], 'numa': ['maun', 'numa'], 'numberer': ['numberer', 'renumber'], 'numda': ['maund', 'munda', 'numda', 'undam', 'unmad'], 'numeration': ['nominature', 'numeration'], 'numerical': ['ceruminal', 'melanuric', 'numerical'], 'numerist': ['numerist', 'terminus'], 'numida': ['numida', 'unmaid'], 'numidae': ['numidae', 'unaimed'], 'nummi': ['mnium', 'nummi'], 'nunciate': ['nunciate', 'uncinate'], 'nuncio': ['nuncio', 'uncoin'], 'nuncioship': ['nuncioship', 'pincushion'], 'nunki': ['nunki', 'unkin'], 'nunlet': ['nunlet', 'tunnel', 'unlent'], 'nunlike': ['nunlike', 'unliken'], 'nunnated': ['nunnated', 'untanned'], 'nunni': ['nunni', 'uninn'], 'nuptial': ['nuptial', 'unplait'], 'nurse': ['nurse', 'resun'], 'nusfiah': ['faunish', 'nusfiah'], 'nut': ['nut', 'tun'], 'nutarian': ['nutarian', 'turanian'], 'nutate': ['attune', 'nutate', 'tauten'], 'nutgall': ['gallnut', 'nutgall'], 'nuthatch': ['nuthatch', 'unthatch'], 'nutlike': ['nutlike', 'tunlike'], 'nutmeg': ['gnetum', 'nutmeg'], 'nutramin': ['nutramin', 'ruminant'], 'nutrice': ['nutrice', 'teucrin'], 'nycteridae': ['encyrtidae', 'nycteridae'], 'nycterine': ['nycterine', 'renitency'], 'nycteris': ['nycteris', 'stycerin'], 'nycturia': ['nycturia', 'tunicary'], 'nye': ['eyn', 'nye', 'yen'], 'nylast': ['nylast', 'stanly'], 'nylon': ['nonly', 'nonyl', 'nylon'], 'nymphalidae': ['lymphadenia', 'nymphalidae'], 'nyroca': ['canroy', 'crayon', 'cyrano', 'nyroca'], 'nystagmic': ['gymnastic', 'nystagmic'], 'oak': ['ako', 'koa', 'oak', 'oka'], 'oaky': ['kayo', 'oaky'], 'oam': ['mao', 'oam'], 'oannes': ['nosean', 'oannes'], 'oar': ['aro', 'oar', 'ora'], 'oared': ['adore', 'oared', 'oread'], 'oaric': ['cairo', 'oaric'], 'oaritis': ['isotria', 'oaritis'], 'oarium': ['mariou', 'oarium'], 'oarless': ['lassoer', 'oarless', 'rosales'], 'oarman': ['oarman', 'ramona'], 'oasal': ['alosa', 'loasa', 'oasal'], 'oasis': ['oasis', 'sosia'], 'oast': ['oast', 'stoa', 'taos'], 'oat': ['oat', 'tao', 'toa'], 'oatbin': ['batino', 'oatbin', 'obtain'], 'oaten': ['atone', 'oaten'], 'oatlike': ['keitloa', 'oatlike'], 'obclude': ['becloud', 'obclude'], 'obeah': ['bahoe', 'bohea', 'obeah'], 'obeisant': ['obeisant', 'sabotine'], 'obelial': ['bolelia', 'lobelia', 'obelial'], 'obeliscal': ['escobilla', 'obeliscal'], 'obelus': ['besoul', 'blouse', 'obelus'], 'oberon': ['borneo', 'oberon'], 'obi': ['ibo', 'obi'], 'obispo': ['boopis', 'obispo'], 'obit': ['bito', 'obit'], 'objectative': ['objectative', 'objectivate'], 'objectivate': ['objectative', 'objectivate'], 'oblate': ['lobate', 'oblate'], 'oblately': ['lobately', 'oblately'], 'oblation': ['boltonia', 'lobation', 'oblation'], 'obligant': ['bloating', 'obligant'], 'obliviality': ['obliviality', 'violability'], 'obol': ['bolo', 'bool', 'lobo', 'obol'], 'obscurant': ['obscurant', 'subcantor'], 'obscurantic': ['obscurantic', 'subnarcotic'], 'obscurantist': ['obscurantist', 'substraction'], 'obscure': ['bescour', 'buceros', 'obscure'], 'obscurer': ['crebrous', 'obscurer'], 'obsecrate': ['bracteose', 'obsecrate'], 'observe': ['observe', 'obverse', 'verbose'], 'obsessor': ['berossos', 'obsessor'], 'obstinate': ['bastionet', 'obstinate'], 'obtain': ['batino', 'oatbin', 'obtain'], 'obtainal': ['ablation', 'obtainal'], 'obtainer': ['abrotine', 'baritone', 'obtainer', 'reobtain'], 'obtrude': ['doubter', 'obtrude', 'outbred', 'redoubt'], 'obtruncation': ['conturbation', 'obtruncation'], 'obturate': ['obturate', 'tabouret'], 'obverse': ['observe', 'obverse', 'verbose'], 'obversely': ['obversely', 'verbosely'], 'ocarina': ['aaronic', 'nicarao', 'ocarina'], 'occasioner': ['occasioner', 'reoccasion'], 'occipitofrontal': ['frontooccipital', 'occipitofrontal'], 'occipitotemporal': ['occipitotemporal', 'temporooccipital'], 'occlusion': ['niccolous', 'occlusion'], 'occurrent': ['cocurrent', 'occurrent', 'uncorrect'], 'ocean': ['acone', 'canoe', 'ocean'], 'oceanet': ['acetone', 'oceanet'], 'oceanic': ['cocaine', 'oceanic'], 'ocellar': ['collare', 'corella', 'ocellar'], 'ocellate': ['collatee', 'ocellate'], 'ocellated': ['decollate', 'ocellated'], 'ocelli': ['collie', 'ocelli'], 'och': ['cho', 'och'], 'ocher': ['chore', 'ocher'], 'ocherous': ['ocherous', 'ochreous'], 'ochidore': ['choreoid', 'ochidore'], 'ochlesis': ['helcosis', 'ochlesis'], 'ochlesitic': ['cochleitis', 'ochlesitic'], 'ochletic': ['helcotic', 'lochetic', 'ochletic'], 'ochlocrat': ['colcothar', 'ochlocrat'], 'ochrea': ['chorea', 'ochrea', 'rochea'], 'ochreous': ['ocherous', 'ochreous'], 'ochroid': ['choroid', 'ochroid'], 'ochroma': ['amchoor', 'ochroma'], 'ocht': ['coth', 'ocht'], 'ocque': ['coque', 'ocque'], 'ocreated': ['decorate', 'ocreated'], 'octadic': ['cactoid', 'octadic'], 'octaeteric': ['ecorticate', 'octaeteric'], 'octakishexahedron': ['hexakisoctahedron', 'octakishexahedron'], 'octan': ['acton', 'canto', 'octan'], 'octandrian': ['dracontian', 'octandrian'], 'octarius': ['cotarius', 'octarius', 'suctoria'], 'octastrophic': ['octastrophic', 'postthoracic'], 'octave': ['avocet', 'octave', 'vocate'], 'octavian': ['octavian', 'octavina', 'vacation'], 'octavina': ['octavian', 'octavina', 'vacation'], 'octenary': ['enactory', 'octenary'], 'octet': ['cotte', 'octet'], 'octillion': ['cotillion', 'octillion'], 'octine': ['eciton', 'noetic', 'notice', 'octine'], 'octometer': ['octometer', 'rectotome', 'tocometer'], 'octonal': ['coolant', 'octonal'], 'octonare': ['coronate', 'octonare', 'otocrane'], 'octonarius': ['acutorsion', 'octonarius'], 'octoroon': ['coonroot', 'octoroon'], 'octuple': ['couplet', 'octuple'], 'ocularist': ['ocularist', 'suctorial'], 'oculate': ['caulote', 'colutea', 'oculate'], 'oculinid': ['lucinoid', 'oculinid'], 'ocypete': ['ecotype', 'ocypete'], 'od': ['do', 'od'], 'oda': ['ado', 'dao', 'oda'], 'odal': ['alod', 'dola', 'load', 'odal'], 'odalman': ['mandola', 'odalman'], 'odax': ['doxa', 'odax'], 'odd': ['dod', 'odd'], 'oddman': ['dodman', 'oddman'], 'ode': ['doe', 'edo', 'ode'], 'odel': ['dole', 'elod', 'lode', 'odel'], 'odin': ['dion', 'nodi', 'odin'], 'odinism': ['diosmin', 'odinism'], 'odinite': ['edition', 'odinite', 'otidine', 'tineoid'], 'odiometer': ['meteoroid', 'odiometer'], 'odious': ['iodous', 'odious'], 'odor': ['door', 'odor', 'oord', 'rood'], 'odorant': ['donator', 'odorant', 'tornado'], 'odored': ['doored', 'odored'], 'odorless': ['doorless', 'odorless'], 'ods': ['dos', 'ods', 'sod'], 'odum': ['doum', 'moud', 'odum'], 'odyl': ['loyd', 'odyl'], 'odylist': ['odylist', 'styloid'], 'oecanthus': ['ceanothus', 'oecanthus'], 'oecist': ['cotise', 'oecist'], 'oedipal': ['elapoid', 'oedipal'], 'oenin': ['inone', 'oenin'], 'oenocarpus': ['oenocarpus', 'uranoscope'], 'oer': ['oer', 'ore', 'roe'], 'oes': ['oes', 'ose', 'soe'], 'oestrian': ['arsonite', 'asterion', 'oestrian', 'rosinate', 'serotina'], 'oestrid': ['oestrid', 'steroid', 'storied'], 'oestridae': ['oestridae', 'ostreidae', 'sorediate'], 'oestrin': ['oestrin', 'tersion'], 'oestriol': ['oestriol', 'rosolite'], 'oestroid': ['oestroid', 'ordosite', 'ostreoid'], 'oestrual': ['oestrual', 'rosulate'], 'oestrum': ['oestrum', 'rosetum'], 'oestrus': ['estrous', 'oestrus', 'sestuor', 'tussore'], 'of': ['fo', 'of'], 'ofer': ['fore', 'froe', 'ofer'], 'offcast': ['castoff', 'offcast'], 'offcut': ['cutoff', 'offcut'], 'offender': ['offender', 'reoffend'], 'offerer': ['offerer', 'reoffer'], 'offlet': ['letoff', 'offlet'], 'offset': ['offset', 'setoff'], 'offuscate': ['offuscate', 'suffocate'], 'offuscation': ['offuscation', 'suffocation'], 'offward': ['drawoff', 'offward'], 'ofo': ['foo', 'ofo'], 'oft': ['fot', 'oft'], 'oftens': ['oftens', 'soften'], 'ofter': ['fetor', 'forte', 'ofter'], 'oftly': ['lofty', 'oftly'], 'og': ['go', 'og'], 'ogam': ['goma', 'ogam'], 'ogeed': ['geode', 'ogeed'], 'ogle': ['egol', 'goel', 'loge', 'ogle', 'oleg'], 'ogler': ['glore', 'ogler'], 'ogpu': ['goup', 'ogpu', 'upgo'], 'ogre': ['goer', 'gore', 'ogre'], 'ogreism': ['ergoism', 'ogreism'], 'ogtiern': ['ergotin', 'genitor', 'negrito', 'ogtiern', 'trigone'], 'oh': ['ho', 'oh'], 'ohm': ['mho', 'ohm'], 'ohmage': ['homage', 'ohmage'], 'ohmmeter': ['mhometer', 'ohmmeter'], 'oilcan': ['alnico', 'cliona', 'oilcan'], 'oilcup': ['oilcup', 'upcoil'], 'oildom': ['moloid', 'oildom'], 'oiler': ['oiler', 'oriel', 'reoil'], 'oillet': ['elliot', 'oillet'], 'oilman': ['monial', 'nomial', 'oilman'], 'oilstone': ['leonotis', 'oilstone'], 'oime': ['meio', 'oime'], 'oinomania': ['oinomania', 'oniomania'], 'oint': ['into', 'nito', 'oint', 'tino'], 'oireachtas': ['oireachtas', 'theocrasia'], 'ok': ['ko', 'ok'], 'oka': ['ako', 'koa', 'oak', 'oka'], 'oket': ['keto', 'oket', 'toke'], 'oki': ['koi', 'oki'], 'okie': ['ekoi', 'okie'], 'okra': ['karo', 'kora', 'okra', 'roka'], 'olaf': ['foal', 'loaf', 'olaf'], 'olam': ['loam', 'loma', 'malo', 'mola', 'olam'], 'olamic': ['colima', 'olamic'], 'olcha': ['chola', 'loach', 'olcha'], 'olchi': ['choil', 'choli', 'olchi'], 'old': ['dol', 'lod', 'old'], 'older': ['lored', 'older'], 'oldhamite': ['ethmoidal', 'oldhamite'], 'ole': ['leo', 'ole'], 'olea': ['aloe', 'olea'], 'olecranal': ['lanceolar', 'olecranal'], 'olecranoid': ['lecanoroid', 'olecranoid'], 'olecranon': ['encoronal', 'olecranon'], 'olefin': ['enfoil', 'olefin'], 'oleg': ['egol', 'goel', 'loge', 'ogle', 'oleg'], 'olein': ['enoil', 'ileon', 'olein'], 'olena': ['alone', 'anole', 'olena'], 'olenid': ['doline', 'indole', 'leonid', 'loined', 'olenid'], 'olent': ['lento', 'olent'], 'olenus': ['ensoul', 'olenus', 'unsole'], 'oleosity': ['oleosity', 'otiosely'], 'olga': ['gaol', 'goal', 'gola', 'olga'], 'oliban': ['albino', 'albion', 'alboin', 'oliban'], 'olibanum': ['olibanum', 'umbonial'], 'olid': ['dilo', 'diol', 'doli', 'idol', 'olid'], 'oligoclase': ['oligoclase', 'sociolegal'], 'oligomyoid': ['idiomology', 'oligomyoid'], 'oligonephria': ['oligonephria', 'oligophrenia'], 'oligonephric': ['oligonephric', 'oligophrenic'], 'oligophrenia': ['oligonephria', 'oligophrenia'], 'oligophrenic': ['oligonephric', 'oligophrenic'], 'oliprance': ['oliprance', 'porcelain'], 'oliva': ['oliva', 'viola'], 'olivaceous': ['olivaceous', 'violaceous'], 'olive': ['olive', 'ovile', 'voile'], 'olived': ['livedo', 'olived'], 'oliver': ['oliver', 'violer', 'virole'], 'olivescent': ['olivescent', 'violescent'], 'olivet': ['olivet', 'violet'], 'olivetan': ['olivetan', 'velation'], 'olivette': ['olivette', 'violette'], 'olivine': ['olivine', 'violine'], 'olla': ['lalo', 'lola', 'olla'], 'olof': ['fool', 'loof', 'olof'], 'olonets': ['enstool', 'olonets'], 'olor': ['loro', 'olor', 'orlo', 'rool'], 'olpe': ['lope', 'olpe', 'pole'], 'olson': ['olson', 'solon'], 'olympian': ['olympian', 'polymnia'], 'om': ['mo', 'om'], 'omaha': ['haoma', 'omaha'], 'oman': ['mano', 'moan', 'mona', 'noam', 'noma', 'oman'], 'omani': ['amino', 'inoma', 'naomi', 'omani', 'omina'], 'omar': ['amor', 'maro', 'mora', 'omar', 'roam'], 'omasitis': ['amitosis', 'omasitis'], 'omber': ['brome', 'omber'], 'omelet': ['omelet', 'telome'], 'omen': ['mone', 'nome', 'omen'], 'omened': ['endome', 'omened'], 'omental': ['omental', 'telamon'], 'omentotomy': ['entomotomy', 'omentotomy'], 'omer': ['mero', 'more', 'omer', 'rome'], 'omicron': ['moronic', 'omicron'], 'omina': ['amino', 'inoma', 'naomi', 'omani', 'omina'], 'ominous': ['mousoni', 'ominous'], 'omit': ['itmo', 'moit', 'omit', 'timo'], 'omitis': ['itoism', 'omitis'], 'omniana': ['nanaimo', 'omniana'], 'omniarch': ['choirman', 'harmonic', 'omniarch'], 'omnigerent': ['ignorement', 'omnigerent'], 'omnilegent': ['eloignment', 'omnilegent'], 'omnimeter': ['minometer', 'omnimeter'], 'omnimodous': ['monosodium', 'omnimodous', 'onosmodium'], 'omnist': ['inmost', 'monist', 'omnist'], 'omnitenent': ['intonement', 'omnitenent'], 'omphalogenous': ['megalophonous', 'omphalogenous'], 'on': ['no', 'on'], 'ona': ['noa', 'ona'], 'onager': ['onager', 'orange'], 'onagra': ['agroan', 'angora', 'anogra', 'arango', 'argoan', 'onagra'], 'onan': ['anon', 'nona', 'onan'], 'onanism': ['mansion', 'onanism'], 'onanistic': ['anconitis', 'antiscion', 'onanistic'], 'onca': ['coan', 'onca'], 'once': ['cone', 'once'], 'oncetta': ['oncetta', 'tectona'], 'onchidiidae': ['chionididae', 'onchidiidae'], 'oncia': ['acoin', 'oncia'], 'oncidium': ['conidium', 'mucinoid', 'oncidium'], 'oncin': ['conin', 'nonic', 'oncin'], 'oncometric': ['necrotomic', 'oncometric'], 'oncometry': ['necrotomy', 'normocyte', 'oncometry'], 'oncoming': ['gnomonic', 'oncoming'], 'oncosimeter': ['oncosimeter', 'semicoronet'], 'oncost': ['nostoc', 'oncost'], 'ondagram': ['dragoman', 'garamond', 'ondagram'], 'ondameter': ['emendator', 'ondameter'], 'ondatra': ['adorant', 'ondatra'], 'ondine': ['donnie', 'indone', 'ondine'], 'ondy': ['ondy', 'yond'], 'one': ['eon', 'neo', 'one'], 'oneida': ['daoine', 'oneida'], 'oneiric': ['ironice', 'oneiric'], 'oneism': ['eonism', 'mesion', 'oneism', 'simeon'], 'oneness': ['oneness', 'senones'], 'oner': ['oner', 'rone'], 'onery': ['eryon', 'onery'], 'oniomania': ['oinomania', 'oniomania'], 'oniomaniac': ['iconomania', 'oniomaniac'], 'oniscidae': ['oniscidae', 'oscinidae', 'sciaenoid'], 'onisciform': ['onisciform', 'somnorific'], 'oniscoidea': ['iodocasein', 'oniscoidea'], 'onkos': ['onkos', 'snook'], 'onlepy': ['onlepy', 'openly'], 'onliest': ['leonist', 'onliest'], 'only': ['lyon', 'only'], 'onmarch': ['monarch', 'nomarch', 'onmarch'], 'onosmodium': ['monosodium', 'omnimodous', 'onosmodium'], 'ons': ['ons', 'son'], 'onset': ['onset', 'seton', 'steno', 'stone'], 'onshore': ['onshore', 'sorehon'], 'onside': ['deinos', 'donsie', 'inodes', 'onside'], 'onsight': ['hosting', 'onsight'], 'ontal': ['notal', 'ontal', 'talon', 'tolan', 'tonal'], 'ontaric': ['anticor', 'carotin', 'cortina', 'ontaric'], 'onto': ['onto', 'oont', 'toon'], 'ontogenal': ['nonlegato', 'ontogenal'], 'ontological': ['ontological', 'tonological'], 'ontologism': ['monologist', 'nomologist', 'ontologism'], 'ontology': ['ontology', 'tonology'], 'onus': ['nosu', 'nous', 'onus'], 'onymal': ['amylon', 'onymal'], 'onymatic': ['cymation', 'myatonic', 'onymatic'], 'onza': ['azon', 'onza', 'ozan'], 'oocyte': ['coyote', 'oocyte'], 'oodles': ['dolose', 'oodles', 'soodle'], 'ooid': ['iodo', 'ooid'], 'oolak': ['lokao', 'oolak'], 'oolite': ['lootie', 'oolite'], 'oometer': ['moreote', 'oometer'], 'oons': ['oons', 'soon'], 'oont': ['onto', 'oont', 'toon'], 'oopak': ['oopak', 'pooka'], 'oord': ['door', 'odor', 'oord', 'rood'], 'opacate': ['opacate', 'peacoat'], 'opacite': ['ectopia', 'opacite'], 'opah': ['opah', 'paho', 'poha'], 'opal': ['alop', 'opal'], 'opalina': ['opalina', 'pianola'], 'opalinine': ['opalinine', 'pleionian'], 'opalize': ['epizoal', 'lopezia', 'opalize'], 'opata': ['opata', 'patao', 'tapoa'], 'opdalite': ['opdalite', 'petaloid'], 'ope': ['ope', 'poe'], 'opelet': ['eelpot', 'opelet'], 'open': ['nope', 'open', 'peon', 'pone'], 'opencast': ['capstone', 'opencast'], 'opener': ['opener', 'reopen', 'repone'], 'openly': ['onlepy', 'openly'], 'openside': ['disponee', 'openside'], 'operable': ['operable', 'ropeable'], 'operae': ['aerope', 'operae'], 'operant': ['operant', 'pronate', 'protean'], 'operatic': ['aporetic', 'capriote', 'operatic'], 'operatical': ['aporetical', 'operatical'], 'operating': ['operating', 'pignorate'], 'operatrix': ['expirator', 'operatrix'], 'opercular': ['opercular', 'preocular'], 'ophidion': ['ophidion', 'ophionid'], 'ophionid': ['ophidion', 'ophionid'], 'ophism': ['mopish', 'ophism'], 'ophite': ['ethiop', 'ophite', 'peitho'], 'opinant': ['opinant', 'pintano'], 'opinator': ['opinator', 'tropaion'], 'opiner': ['opiner', 'orpine', 'ponier'], 'opiniaster': ['opiniaster', 'opiniastre'], 'opiniastre': ['opiniaster', 'opiniastre'], 'opiniatrety': ['opiniatrety', 'petitionary'], 'opisometer': ['opisometer', 'opsiometer'], 'opisthenar': ['opisthenar', 'spheration'], 'opisthorchis': ['chirosophist', 'opisthorchis'], 'oppian': ['oppian', 'papion', 'popian'], 'opposer': ['opposer', 'propose'], 'oppugn': ['oppugn', 'popgun'], 'opsiometer': ['opisometer', 'opsiometer'], 'opsonic': ['opsonic', 'pocosin'], 'opsy': ['opsy', 'posy'], 'opt': ['opt', 'pot', 'top'], 'optable': ['optable', 'potable'], 'optableness': ['optableness', 'potableness'], 'optate': ['aptote', 'optate', 'potate', 'teapot'], 'optation': ['optation', 'potation'], 'optative': ['optative', 'potative'], 'optic': ['optic', 'picot', 'topic'], 'optical': ['capitol', 'coalpit', 'optical', 'topical'], 'optically': ['optically', 'topically'], 'optics': ['copist', 'coptis', 'optics', 'postic'], 'optimal': ['optimal', 'palmito'], 'option': ['option', 'potion'], 'optional': ['antipolo', 'antipool', 'optional'], 'optography': ['optography', 'topography'], 'optological': ['optological', 'topological'], 'optologist': ['optologist', 'topologist'], 'optology': ['optology', 'topology'], 'optometer': ['optometer', 'potometer'], 'optophone': ['optophone', 'topophone'], 'optotype': ['optotype', 'topotype'], 'opulaster': ['opulaster', 'sportulae', 'sporulate'], 'opulus': ['lupous', 'opulus'], 'opuntia': ['opuntia', 'utopian'], 'opus': ['opus', 'soup'], 'opuscular': ['crapulous', 'opuscular'], 'or': ['or', 'ro'], 'ora': ['aro', 'oar', 'ora'], 'orach': ['achor', 'chora', 'corah', 'orach', 'roach'], 'oracle': ['carole', 'coaler', 'coelar', 'oracle', 'recoal'], 'orad': ['dora', 'orad', 'road'], 'oral': ['lora', 'oral'], 'oralist': ['aristol', 'oralist', 'ortalis', 'striola'], 'orality': ['orality', 'tailory'], 'orang': ['angor', 'argon', 'goran', 'grano', 'groan', 'nagor', 'orang', 'organ', 'rogan', 'ronga'], 'orange': ['onager', 'orange'], 'orangeist': ['goniaster', 'orangeist'], 'oranger': ['groaner', 'oranger', 'organer'], 'orangism': ['orangism', 'organism', 'sinogram'], 'orangist': ['orangist', 'organist', 'roasting', 'signator'], 'orangize': ['agonizer', 'orangize', 'organize'], 'orant': ['orant', 'rotan', 'toran', 'trona'], 'oraon': ['aroon', 'oraon'], 'oratress': ['assertor', 'assorter', 'oratress', 'reassort'], 'orb': ['bor', 'orb', 'rob'], 'orbed': ['boder', 'orbed'], 'orbic': ['boric', 'cribo', 'orbic'], 'orbicle': ['bricole', 'corbeil', 'orbicle'], 'orbicular': ['courbaril', 'orbicular'], 'orbitale': ['betailor', 'laborite', 'orbitale'], 'orbitelar': ['liberator', 'orbitelar'], 'orbitelarian': ['irrationable', 'orbitelarian'], 'orbitofrontal': ['frontoorbital', 'orbitofrontal'], 'orbitonasal': ['nasoorbital', 'orbitonasal'], 'orblet': ['bolter', 'orblet', 'reblot', 'rebolt'], 'orbulina': ['orbulina', 'unilobar'], 'orc': ['cor', 'cro', 'orc', 'roc'], 'orca': ['acor', 'caro', 'cora', 'orca'], 'orcadian': ['nocardia', 'orcadian'], 'orcanet': ['enactor', 'necator', 'orcanet'], 'orcein': ['cerion', 'coiner', 'neroic', 'orcein', 'recoin'], 'orchat': ['cathro', 'orchat'], 'orchel': ['chlore', 'choler', 'orchel'], 'orchester': ['orchester', 'orchestre'], 'orchestre': ['orchester', 'orchestre'], 'orchic': ['choric', 'orchic'], 'orchid': ['orchid', 'rhodic'], 'orchidist': ['chorditis', 'orchidist'], 'orchiocele': ['choriocele', 'orchiocele'], 'orchitis': ['historic', 'orchitis'], 'orcin': ['corin', 'noric', 'orcin'], 'orcinol': ['colorin', 'orcinol'], 'ordain': ['dorian', 'inroad', 'ordain'], 'ordainer': ['inroader', 'ordainer', 'reordain'], 'ordainment': ['antimodern', 'ordainment'], 'ordanchite': ['achondrite', 'ditrochean', 'ordanchite'], 'ordeal': ['loader', 'ordeal', 'reload'], 'orderer': ['orderer', 'reorder'], 'ordinable': ['bolderian', 'ordinable'], 'ordinal': ['nailrod', 'ordinal', 'rinaldo', 'rodinal'], 'ordinance': ['cerdonian', 'ordinance'], 'ordinate': ['andorite', 'nadorite', 'ordinate', 'rodentia'], 'ordinative': ['derivation', 'ordinative'], 'ordinator': ['ordinator', 'radiotron'], 'ordines': ['indorse', 'ordines', 'siredon', 'sordine'], 'ordosite': ['oestroid', 'ordosite', 'ostreoid'], 'ordu': ['dour', 'duro', 'ordu', 'roud'], 'ore': ['oer', 'ore', 'roe'], 'oread': ['adore', 'oared', 'oread'], 'oreas': ['arose', 'oreas'], 'orectic': ['cerotic', 'orectic'], 'oreman': ['enamor', 'monera', 'oreman', 'romane'], 'orenda': ['denaro', 'orenda'], 'orendite': ['enteroid', 'orendite'], 'orestean': ['orestean', 'resonate', 'stearone'], 'orf': ['for', 'fro', 'orf'], 'organ': ['angor', 'argon', 'goran', 'grano', 'groan', 'nagor', 'orang', 'organ', 'rogan', 'ronga'], 'organal': ['angolar', 'organal'], 'organer': ['groaner', 'oranger', 'organer'], 'organicism': ['organicism', 'organismic'], 'organicist': ['organicist', 'organistic'], 'organing': ['groaning', 'organing'], 'organism': ['orangism', 'organism', 'sinogram'], 'organismic': ['organicism', 'organismic'], 'organist': ['orangist', 'organist', 'roasting', 'signator'], 'organistic': ['organicist', 'organistic'], 'organity': ['gyration', 'organity', 'ortygian'], 'organize': ['agonizer', 'orangize', 'organize'], 'organized': ['dragonize', 'organized'], 'organoid': ['gordonia', 'organoid', 'rigadoon'], 'organonymic': ['craniognomy', 'organonymic'], 'organotin': ['gortonian', 'organotin'], 'organule': ['lagunero', 'organule', 'uroglena'], 'orgiasm': ['isogram', 'orgiasm'], 'orgiast': ['agistor', 'agrotis', 'orgiast'], 'orgic': ['corgi', 'goric', 'orgic'], 'orgue': ['orgue', 'rogue', 'rouge'], 'orgy': ['gory', 'gyro', 'orgy'], 'oriel': ['oiler', 'oriel', 'reoil'], 'orient': ['norite', 'orient'], 'oriental': ['oriental', 'relation', 'tirolean'], 'orientalism': ['misrelation', 'orientalism', 'relationism'], 'orientalist': ['orientalist', 'relationist'], 'orientate': ['anoterite', 'orientate'], 'origanum': ['mirounga', 'moringua', 'origanum'], 'origin': ['nigori', 'origin'], 'orle': ['lore', 'orle', 'role'], 'orlean': ['lenora', 'loaner', 'orlean', 'reloan'], 'orleanist': ['lairstone', 'orleanist', 'serotinal'], 'orleanistic': ['intersocial', 'orleanistic', 'sclerotinia'], 'orlet': ['lerot', 'orlet', 'relot'], 'orlo': ['loro', 'olor', 'orlo', 'rool'], 'orna': ['nora', 'orna', 'roan'], 'ornamenter': ['ornamenter', 'reornament'], 'ornate': ['atoner', 'norate', 'ornate'], 'ornately': ['neolatry', 'ornately', 'tyrolean'], 'ornation': ['noration', 'ornation', 'orotinan'], 'ornis': ['ornis', 'rosin'], 'orniscopic': ['orniscopic', 'scorpionic'], 'ornithomantic': ['ornithomantic', 'orthantimonic'], 'ornithoptera': ['ornithoptera', 'prototherian'], 'orogenetic': ['erotogenic', 'geocronite', 'orogenetic'], 'orographical': ['colporrhagia', 'orographical'], 'orography': ['gyrophora', 'orography'], 'orotinan': ['noration', 'ornation', 'orotinan'], 'orotund': ['orotund', 'rotundo'], 'orphanism': ['manorship', 'orphanism'], 'orpheon': ['orpheon', 'phorone'], 'orpheus': ['ephorus', 'orpheus', 'upshore'], 'orphical': ['orphical', 'rhopalic'], 'orphism': ['orphism', 'rompish'], 'orphize': ['orphize', 'phiroze'], 'orpine': ['opiner', 'orpine', 'ponier'], 'orsel': ['loser', 'orsel', 'rosel', 'soler'], 'orselle': ['orselle', 'roselle'], 'ort': ['ort', 'rot', 'tor'], 'ortalid': ['dilator', 'ortalid'], 'ortalis': ['aristol', 'oralist', 'ortalis', 'striola'], 'ortet': ['ortet', 'otter', 'toter'], 'orthal': ['harlot', 'orthal', 'thoral'], 'orthantimonic': ['ornithomantic', 'orthantimonic'], 'orthian': ['orthian', 'thorina'], 'orthic': ['chorti', 'orthic', 'thoric', 'trochi'], 'orthite': ['hortite', 'orthite', 'thorite'], 'ortho': ['ortho', 'thoro'], 'orthodromy': ['hydromotor', 'orthodromy'], 'orthogamy': ['orthogamy', 'othygroma'], 'orthogonial': ['orthogonial', 'orthologian'], 'orthologian': ['orthogonial', 'orthologian'], 'orthose': ['orthose', 'reshoot', 'shooter', 'soother'], 'ortiga': ['agrito', 'ortiga'], 'ortstein': ['ortstein', 'tenorist'], 'ortygian': ['gyration', 'organity', 'ortygian'], 'ortygine': ['genitory', 'ortygine'], 'ory': ['ory', 'roy', 'yor'], 'oryx': ['oryx', 'roxy'], 'os': ['os', 'so'], 'osamin': ['monias', 'osamin', 'osmina'], 'osamine': ['monesia', 'osamine', 'osmanie'], 'osc': ['cos', 'osc', 'soc'], 'oscan': ['ascon', 'canso', 'oscan'], 'oscar': ['arcos', 'crosa', 'oscar', 'sacro'], 'oscella': ['callose', 'oscella'], 'oscheal': ['oscheal', 'scholae'], 'oscillance': ['clinoclase', 'oscillance'], 'oscillaria': ['iliosacral', 'oscillaria'], 'oscillation': ['colonialist', 'oscillation'], 'oscin': ['oscin', 'scion', 'sonic'], 'oscine': ['cosine', 'oscine'], 'oscines': ['cession', 'oscines'], 'oscinian': ['oscinian', 'socinian'], 'oscinidae': ['oniscidae', 'oscinidae', 'sciaenoid'], 'oscitant': ['actinost', 'oscitant'], 'oscular': ['carolus', 'oscular'], 'osculate': ['lacteous', 'osculate'], 'osculatory': ['cotylosaur', 'osculatory'], 'oscule': ['coleus', 'oscule'], 'ose': ['oes', 'ose', 'soe'], 'osela': ['alose', 'osela', 'solea'], 'oshac': ['chaos', 'oshac'], 'oside': ['diose', 'idose', 'oside'], 'osier': ['osier', 'serio'], 'osirian': ['nosairi', 'osirian'], 'osiride': ['isidore', 'osiride'], 'oskar': ['krosa', 'oskar'], 'osmanie': ['monesia', 'osamine', 'osmanie'], 'osmanli': ['malison', 'manolis', 'osmanli', 'somnial'], 'osmatic': ['atomics', 'catoism', 'cosmati', 'osmatic', 'somatic'], 'osmatism': ['osmatism', 'somatism'], 'osmerus': ['osmerus', 'smouser'], 'osmin': ['minos', 'osmin', 'simon'], 'osmina': ['monias', 'osamin', 'osmina'], 'osmiridium': ['iridosmium', 'osmiridium'], 'osmogene': ['gonesome', 'osmogene'], 'osmometer': ['merostome', 'osmometer'], 'osmometric': ['microstome', 'osmometric'], 'osmophore': ['osmophore', 'sophomore'], 'osmotactic': ['osmotactic', 'scotomatic'], 'osmunda': ['damnous', 'osmunda'], 'osone': ['noose', 'osone'], 'osprey': ['eryops', 'osprey'], 'ossal': ['lasso', 'ossal'], 'ossein': ['essoin', 'ossein'], 'osselet': ['osselet', 'sestole', 'toeless'], 'ossetian': ['assiento', 'ossetian'], 'ossetine': ['essonite', 'ossetine'], 'ossicle': ['loessic', 'ossicle'], 'ossiculate': ['acleistous', 'ossiculate'], 'ossicule': ['coulisse', 'leucosis', 'ossicule'], 'ossuary': ['ossuary', 'suasory'], 'ostara': ['aroast', 'ostara'], 'osteal': ['lotase', 'osteal', 'solate', 'stolae', 'talose'], 'ostearthritis': ['arthrosteitis', 'ostearthritis'], 'ostectomy': ['cystotome', 'cytostome', 'ostectomy'], 'ostein': ['nesiot', 'ostein'], 'ostemia': ['miaotse', 'ostemia'], 'ostent': ['ostent', 'teston'], 'ostentation': ['ostentation', 'tionontates'], 'ostentous': ['ostentous', 'sostenuto'], 'osteometric': ['osteometric', 'stereotomic'], 'osteometrical': ['osteometrical', 'stereotomical'], 'osteometry': ['osteometry', 'stereotomy'], 'ostic': ['ostic', 'sciot', 'stoic'], 'ostmen': ['montes', 'ostmen'], 'ostracea': ['ceratosa', 'ostracea'], 'ostracean': ['ostracean', 'socratean'], 'ostracine': ['atroscine', 'certosina', 'ostracine', 'tinoceras', 'tricosane'], 'ostracism': ['ostracism', 'socratism'], 'ostracize': ['ostracize', 'socratize'], 'ostracon': ['ostracon', 'socotran'], 'ostraite': ['astroite', 'ostraite', 'storiate'], 'ostreidae': ['oestridae', 'ostreidae', 'sorediate'], 'ostreiform': ['forritsome', 'ostreiform'], 'ostreoid': ['oestroid', 'ordosite', 'ostreoid'], 'ostrich': ['chorist', 'ostrich'], 'oswald': ['dowlas', 'oswald'], 'otalgy': ['goatly', 'otalgy'], 'otaria': ['atorai', 'otaria'], 'otarian': ['aration', 'otarian'], 'otarine': ['otarine', 'torenia'], 'other': ['other', 'thore', 'throe', 'toher'], 'otherism': ['homerist', 'isotherm', 'otherism', 'theorism'], 'otherist': ['otherist', 'theorist'], 'othygroma': ['orthogamy', 'othygroma'], 'otiant': ['otiant', 'titano'], 'otidae': ['idotea', 'iodate', 'otidae'], 'otidine': ['edition', 'odinite', 'otidine', 'tineoid'], 'otiosely': ['oleosity', 'otiosely'], 'otitis': ['itoist', 'otitis'], 'oto': ['oto', 'too'], 'otocephalic': ['hepatocolic', 'otocephalic'], 'otocrane': ['coronate', 'octonare', 'otocrane'], 'otogenic': ['geotonic', 'otogenic'], 'otomian': ['amotion', 'otomian'], 'otomyces': ['cytosome', 'otomyces'], 'ottar': ['ottar', 'tarot', 'torta', 'troat'], 'otter': ['ortet', 'otter', 'toter'], 'otto': ['otto', 'toot', 'toto'], 'otus': ['otus', 'oust', 'suto'], 'otyak': ['otyak', 'tokay'], 'ouch': ['chou', 'ouch'], 'ouf': ['fou', 'ouf'], 'ough': ['hugo', 'ough'], 'ought': ['ought', 'tough'], 'oughtness': ['oughtness', 'toughness'], 'ounds': ['nodus', 'ounds', 'sound'], 'our': ['our', 'uro'], 'ours': ['ours', 'sour'], 'oust': ['otus', 'oust', 'suto'], 'ouster': ['ouster', 'souter', 'touser', 'trouse'], 'out': ['out', 'tou'], 'outarde': ['outarde', 'outdare', 'outread'], 'outban': ['outban', 'unboat'], 'outbar': ['outbar', 'rubato', 'tabour'], 'outbeg': ['bouget', 'outbeg'], 'outblow': ['blowout', 'outblow', 'outbowl'], 'outblunder': ['outblunder', 'untroubled'], 'outbowl': ['blowout', 'outblow', 'outbowl'], 'outbreak': ['breakout', 'outbreak'], 'outbred': ['doubter', 'obtrude', 'outbred', 'redoubt'], 'outburn': ['burnout', 'outburn'], 'outburst': ['outburst', 'subtutor'], 'outbustle': ['outbustle', 'outsubtle'], 'outcarol': ['outcarol', 'taurocol'], 'outcarry': ['curatory', 'outcarry'], 'outcase': ['acetous', 'outcase'], 'outcharm': ['outcharm', 'outmarch'], 'outcrier': ['courtier', 'outcrier'], 'outcut': ['cutout', 'outcut'], 'outdance': ['outdance', 'uncoated'], 'outdare': ['outarde', 'outdare', 'outread'], 'outdraw': ['drawout', 'outdraw', 'outward'], 'outer': ['outer', 'outre', 'route'], 'outerness': ['outerness', 'outreness'], 'outferret': ['foreutter', 'outferret'], 'outfit': ['fitout', 'outfit'], 'outflare': ['fluorate', 'outflare'], 'outfling': ['flouting', 'outfling'], 'outfly': ['outfly', 'toyful'], 'outgoer': ['outgoer', 'rougeot'], 'outgrin': ['outgrin', 'outring', 'routing', 'touring'], 'outhire': ['outhire', 'routhie'], 'outhold': ['holdout', 'outhold'], 'outkick': ['kickout', 'outkick'], 'outlance': ['cleanout', 'outlance'], 'outlay': ['layout', 'lutayo', 'outlay'], 'outleap': ['outleap', 'outpeal'], 'outler': ['elutor', 'louter', 'outler'], 'outlet': ['outlet', 'tutelo'], 'outline': ['elution', 'outline'], 'outlinear': ['outlinear', 'uranolite'], 'outlined': ['outlined', 'untoiled'], 'outlook': ['lookout', 'outlook'], 'outly': ['louty', 'outly'], 'outman': ['amount', 'moutan', 'outman'], 'outmarch': ['outcharm', 'outmarch'], 'outmarry': ['mortuary', 'outmarry'], 'outmaster': ['outmaster', 'outstream'], 'outname': ['notaeum', 'outname'], 'outpaint': ['outpaint', 'putation'], 'outpass': ['outpass', 'passout'], 'outpay': ['outpay', 'tapuyo'], 'outpeal': ['outleap', 'outpeal'], 'outpitch': ['outpitch', 'pitchout'], 'outplace': ['copulate', 'outplace'], 'outprice': ['eutropic', 'outprice'], 'outpromise': ['outpromise', 'peritomous'], 'outrance': ['cornuate', 'courante', 'cuneator', 'outrance'], 'outrate': ['outrate', 'outtear', 'torteau'], 'outre': ['outer', 'outre', 'route'], 'outread': ['outarde', 'outdare', 'outread'], 'outremer': ['outremer', 'urometer'], 'outreness': ['outerness', 'outreness'], 'outring': ['outgrin', 'outring', 'routing', 'touring'], 'outrun': ['outrun', 'runout'], 'outsaint': ['outsaint', 'titanous'], 'outscream': ['castoreum', 'outscream'], 'outsell': ['outsell', 'sellout'], 'outset': ['outset', 'setout'], 'outshake': ['outshake', 'shakeout'], 'outshape': ['outshape', 'taphouse'], 'outshine': ['outshine', 'tinhouse'], 'outshut': ['outshut', 'shutout'], 'outside': ['outside', 'tedious'], 'outsideness': ['outsideness', 'tediousness'], 'outsigh': ['goutish', 'outsigh'], 'outsin': ['outsin', 'ustion'], 'outslide': ['outslide', 'solitude'], 'outsnore': ['outsnore', 'urosteon'], 'outsoler': ['outsoler', 'torulose'], 'outspend': ['outspend', 'unposted'], 'outspit': ['outspit', 'utopist'], 'outspring': ['outspring', 'sprouting'], 'outspurn': ['outspurn', 'portunus'], 'outstair': ['outstair', 'ratitous'], 'outstand': ['outstand', 'standout'], 'outstate': ['outstate', 'outtaste'], 'outstream': ['outmaster', 'outstream'], 'outstreet': ['outstreet', 'tetterous'], 'outsubtle': ['outbustle', 'outsubtle'], 'outtaste': ['outstate', 'outtaste'], 'outtear': ['outrate', 'outtear', 'torteau'], 'outthrough': ['outthrough', 'throughout'], 'outthrow': ['outthrow', 'outworth', 'throwout'], 'outtrail': ['outtrail', 'tutorial'], 'outturn': ['outturn', 'turnout'], 'outturned': ['outturned', 'untutored'], 'outwalk': ['outwalk', 'walkout'], 'outward': ['drawout', 'outdraw', 'outward'], 'outwash': ['outwash', 'washout'], 'outwatch': ['outwatch', 'watchout'], 'outwith': ['outwith', 'without'], 'outwork': ['outwork', 'workout'], 'outworth': ['outthrow', 'outworth', 'throwout'], 'ova': ['avo', 'ova'], 'ovaloid': ['ovaloid', 'ovoidal'], 'ovarial': ['ovarial', 'variola'], 'ovariotubal': ['ovariotubal', 'tuboovarial'], 'ovational': ['avolation', 'ovational'], 'oven': ['nevo', 'oven'], 'ovenly': ['lenvoy', 'ovenly'], 'ovenpeel': ['envelope', 'ovenpeel'], 'over': ['over', 'rove'], 'overaction': ['overaction', 'revocation'], 'overactive': ['overactive', 'revocative'], 'overall': ['allover', 'overall'], 'overblame': ['overblame', 'removable'], 'overblow': ['overblow', 'overbowl'], 'overboil': ['boilover', 'overboil'], 'overbowl': ['overblow', 'overbowl'], 'overbreak': ['breakover', 'overbreak'], 'overburden': ['overburden', 'overburned'], 'overburn': ['burnover', 'overburn'], 'overburned': ['overburden', 'overburned'], 'overcall': ['overcall', 'vocaller'], 'overcare': ['overcare', 'overrace'], 'overcirculate': ['overcirculate', 'uterocervical'], 'overcoat': ['evocator', 'overcoat'], 'overcross': ['crossover', 'overcross'], 'overcup': ['overcup', 'upcover'], 'overcurious': ['erucivorous', 'overcurious'], 'overcurtain': ['countervair', 'overcurtain', 'recurvation'], 'overcut': ['cutover', 'overcut'], 'overdamn': ['overdamn', 'ravendom'], 'overdare': ['overdare', 'overdear', 'overread'], 'overdeal': ['overdeal', 'overlade', 'overlead'], 'overdear': ['overdare', 'overdear', 'overread'], 'overdraw': ['overdraw', 'overward'], 'overdrawer': ['overdrawer', 'overreward'], 'overdrip': ['overdrip', 'provider'], 'overdure': ['devourer', 'overdure', 'overrude'], 'overdust': ['overdust', 'overstud'], 'overedit': ['overedit', 'overtide'], 'overfar': ['favorer', 'overfar', 'refavor'], 'overfile': ['forelive', 'overfile'], 'overfilm': ['overfilm', 'veliform'], 'overflower': ['overflower', 'reoverflow'], 'overforce': ['forecover', 'overforce'], 'overgaiter': ['overgaiter', 'revigorate'], 'overglint': ['overglint', 'revolting'], 'overgo': ['groove', 'overgo'], 'overgrain': ['granivore', 'overgrain'], 'overhate': ['overhate', 'overheat'], 'overheat': ['overhate', 'overheat'], 'overheld': ['overheld', 'verdelho'], 'overidle': ['evildoer', 'overidle'], 'overink': ['invoker', 'overink'], 'overinsist': ['overinsist', 'versionist'], 'overkeen': ['overkeen', 'overknee'], 'overknee': ['overkeen', 'overknee'], 'overlade': ['overdeal', 'overlade', 'overlead'], 'overlast': ['overlast', 'oversalt'], 'overlate': ['elevator', 'overlate'], 'overlay': ['layover', 'overlay'], 'overlead': ['overdeal', 'overlade', 'overlead'], 'overlean': ['overlean', 'valerone'], 'overleg': ['overleg', 'reglove'], 'overlie': ['overlie', 'relievo'], 'overling': ['lovering', 'overling'], 'overlisten': ['overlisten', 'oversilent'], 'overlive': ['overlive', 'overveil'], 'overly': ['overly', 'volery'], 'overmantel': ['overmantel', 'overmantle'], 'overmantle': ['overmantel', 'overmantle'], 'overmaster': ['overmaster', 'overstream'], 'overmean': ['overmean', 'overname'], 'overmerit': ['overmerit', 'overtimer'], 'overname': ['overmean', 'overname'], 'overneat': ['overneat', 'renovate'], 'overnew': ['overnew', 'rewoven'], 'overnigh': ['hovering', 'overnigh'], 'overpaint': ['overpaint', 'pronative'], 'overpass': ['overpass', 'passover'], 'overpet': ['overpet', 'preveto', 'prevote'], 'overpick': ['overpick', 'pickover'], 'overplain': ['overplain', 'parvoline'], 'overply': ['overply', 'plovery'], 'overpointed': ['overpointed', 'predevotion'], 'overpot': ['overpot', 'overtop'], 'overrace': ['overcare', 'overrace'], 'overrate': ['overrate', 'overtare'], 'overread': ['overdare', 'overdear', 'overread'], 'overreward': ['overdrawer', 'overreward'], 'overrude': ['devourer', 'overdure', 'overrude'], 'overrun': ['overrun', 'runover'], 'oversad': ['oversad', 'savored'], 'oversale': ['oversale', 'overseal'], 'oversalt': ['overlast', 'oversalt'], 'oversauciness': ['oversauciness', 'veraciousness'], 'overseal': ['oversale', 'overseal'], 'overseen': ['overseen', 'veronese'], 'overset': ['overset', 'setover'], 'oversilent': ['overlisten', 'oversilent'], 'overslip': ['overslip', 'slipover'], 'overspread': ['overspread', 'spreadover'], 'overstain': ['overstain', 'servation', 'versation'], 'overstir': ['overstir', 'servitor'], 'overstrain': ['overstrain', 'traversion'], 'overstream': ['overmaster', 'overstream'], 'overstrew': ['overstrew', 'overwrest'], 'overstud': ['overdust', 'overstud'], 'overt': ['overt', 'rovet', 'torve', 'trove', 'voter'], 'overtare': ['overrate', 'overtare'], 'overthrow': ['overthrow', 'overwroth'], 'overthwart': ['overthwart', 'thwartover'], 'overtide': ['overedit', 'overtide'], 'overtime': ['overtime', 'remotive'], 'overtimer': ['overmerit', 'overtimer'], 'overtip': ['overtip', 'pivoter'], 'overtop': ['overpot', 'overtop'], 'overtrade': ['overtrade', 'overtread'], 'overtread': ['overtrade', 'overtread'], 'overtrue': ['overtrue', 'overture', 'trouvere'], 'overture': ['overtrue', 'overture', 'trouvere'], 'overturn': ['overturn', 'turnover'], 'overtwine': ['interwove', 'overtwine'], 'overveil': ['overlive', 'overveil'], 'overwalk': ['overwalk', 'walkover'], 'overward': ['overdraw', 'overward'], 'overwrest': ['overstrew', 'overwrest'], 'overwroth': ['overthrow', 'overwroth'], 'ovest': ['ovest', 'stove'], 'ovidae': ['evodia', 'ovidae'], 'ovidian': ['ovidian', 'vidonia'], 'ovile': ['olive', 'ovile', 'voile'], 'ovillus': ['ovillus', 'villous'], 'oviparous': ['apivorous', 'oviparous'], 'ovist': ['ovist', 'visto'], 'ovistic': ['covisit', 'ovistic'], 'ovoidal': ['ovaloid', 'ovoidal'], 'ovular': ['louvar', 'ovular'], 'ow': ['ow', 'wo'], 'owd': ['dow', 'owd', 'wod'], 'owe': ['owe', 'woe'], 'owen': ['enow', 'owen', 'wone'], 'owenism': ['owenism', 'winsome'], 'ower': ['ower', 'wore'], 'owerby': ['bowery', 'bowyer', 'owerby'], 'owl': ['low', 'lwo', 'owl'], 'owler': ['lower', 'owler', 'rowel'], 'owlery': ['lowery', 'owlery', 'rowley', 'yowler'], 'owlet': ['owlet', 'towel'], 'owlish': ['lowish', 'owlish'], 'owlishly': ['lowishly', 'owlishly', 'sillyhow'], 'owlishness': ['lowishness', 'owlishness'], 'owly': ['lowy', 'owly', 'yowl'], 'own': ['now', 'own', 'won'], 'owner': ['owner', 'reown', 'rowen'], 'ownership': ['ownership', 'shipowner'], 'ownness': ['nowness', 'ownness'], 'owser': ['owser', 'resow', 'serow', 'sower', 'swore', 'worse'], 'oxalan': ['axonal', 'oxalan'], 'oxalite': ['aloxite', 'oxalite'], 'oxan': ['axon', 'noxa', 'oxan'], 'oxanic': ['anoxic', 'oxanic'], 'oxazine': ['azoxine', 'oxazine'], 'oxen': ['exon', 'oxen'], 'oxidic': ['ixodic', 'oxidic'], 'oximate': ['oximate', 'toxemia'], 'oxy': ['oxy', 'yox'], 'oxyntic': ['ictonyx', 'oxyntic'], 'oxyphenol': ['oxyphenol', 'xylophone'], 'oxyterpene': ['enteropexy', 'oxyterpene'], 'oyer': ['oyer', 'roey', 'yore'], 'oyster': ['oyster', 'rosety'], 'oysterish': ['oysterish', 'thyreosis'], 'oysterman': ['monastery', 'oysterman'], 'ozan': ['azon', 'onza', 'ozan'], 'ozena': ['neoza', 'ozena'], 'ozonate': ['entozoa', 'ozonate'], 'ozonic': ['ozonic', 'zoonic'], 'ozotype': ['ozotype', 'zootype'], 'paal': ['paal', 'pala'], 'paar': ['apar', 'paar', 'para'], 'pablo': ['pablo', 'polab'], 'pac': ['cap', 'pac'], 'pacable': ['capable', 'pacable'], 'pacation': ['copatain', 'pacation'], 'pacaya': ['cayapa', 'pacaya'], 'pace': ['cape', 'cepa', 'pace'], 'paced': ['caped', 'decap', 'paced'], 'pacer': ['caper', 'crape', 'pacer', 'perca', 'recap'], 'pachnolite': ['pachnolite', 'phonetical'], 'pachometer': ['pachometer', 'phacometer'], 'pacht': ['chapt', 'pacht', 'patch'], 'pachylosis': ['pachylosis', 'phacolysis'], 'pacificist': ['pacificist', 'pacifistic'], 'pacifistic': ['pacificist', 'pacifistic'], 'packer': ['packer', 'repack'], 'paco': ['copa', 'paco'], 'pacolet': ['pacolet', 'polecat'], 'paction': ['caption', 'paction'], 'pactional': ['pactional', 'pactolian', 'placation'], 'pactionally': ['pactionally', 'polyactinal'], 'pactolian': ['pactional', 'pactolian', 'placation'], 'pad': ['dap', 'pad'], 'padda': ['dadap', 'padda'], 'padder': ['padder', 'parded'], 'padfoot': ['footpad', 'padfoot'], 'padle': ['padle', 'paled', 'pedal', 'plead'], 'padre': ['drape', 'padre'], 'padtree': ['padtree', 'predate', 'tapered'], 'paean': ['apnea', 'paean'], 'paeanism': ['paeanism', 'spanemia'], 'paegel': ['paegel', 'paegle', 'pelage'], 'paegle': ['paegel', 'paegle', 'pelage'], 'paga': ['gapa', 'paga'], 'page': ['gape', 'page', 'peag', 'pega'], 'pagedom': ['megapod', 'pagedom'], 'pager': ['gaper', 'grape', 'pager', 'parge'], 'pageship': ['pageship', 'shippage'], 'paginary': ['agrypnia', 'paginary'], 'paguridae': ['paguridae', 'paguridea'], 'paguridea': ['paguridae', 'paguridea'], 'pagurine': ['pagurine', 'perugian'], 'pah': ['hap', 'pah'], 'pahari': ['pahari', 'pariah', 'raphia'], 'pahi': ['hapi', 'pahi'], 'paho': ['opah', 'paho', 'poha'], 'paigle': ['paigle', 'pilage'], 'paik': ['paik', 'pika'], 'pail': ['lipa', 'pail', 'pali', 'pial'], 'paillasse': ['paillasse', 'palliasse'], 'pain': ['nipa', 'pain', 'pani', 'pian', 'pina'], 'painless': ['painless', 'spinales'], 'paint': ['inapt', 'paint', 'pinta'], 'painted': ['depaint', 'inadept', 'painted', 'patined'], 'painter': ['painter', 'pertain', 'pterian', 'repaint'], 'painterly': ['interplay', 'painterly'], 'paintiness': ['antisepsin', 'paintiness'], 'paip': ['paip', 'pipa'], 'pair': ['pair', 'pari', 'pria', 'ripa'], 'paired': ['diaper', 'paired'], 'pairer': ['pairer', 'rapier', 'repair'], 'pairment': ['imperant', 'pairment', 'partimen', 'premiant', 'tripeman'], 'pais': ['apis', 'pais', 'pasi', 'saip'], 'pajonism': ['japonism', 'pajonism'], 'pal': ['alp', 'lap', 'pal'], 'pala': ['paal', 'pala'], 'palaeechinoid': ['deinocephalia', 'palaeechinoid'], 'palaemonid': ['anomaliped', 'palaemonid'], 'palaemonoid': ['adenolipoma', 'palaemonoid'], 'palaeornis': ['palaeornis', 'personalia'], 'palaestrics': ['palaestrics', 'paracelsist'], 'palaic': ['apical', 'palaic'], 'palaite': ['palaite', 'petalia', 'pileata'], 'palame': ['palame', 'palmae', 'pamela'], 'palamite': ['ampliate', 'palamite'], 'palas': ['palas', 'salpa'], 'palate': ['aletap', 'palate', 'platea'], 'palatial': ['palatial', 'palliata'], 'palatic': ['capital', 'palatic'], 'palation': ['palation', 'talapoin'], 'palatonasal': ['nasopalatal', 'palatonasal'], 'palau': ['palau', 'paula'], 'palay': ['palay', 'playa'], 'pale': ['leap', 'lepa', 'pale', 'peal', 'plea'], 'paled': ['padle', 'paled', 'pedal', 'plead'], 'paleness': ['paleness', 'paneless'], 'paleolithy': ['paleolithy', 'polyhalite', 'polythelia'], 'paler': ['lepra', 'paler', 'parel', 'parle', 'pearl', 'perla', 'relap'], 'palermitan': ['palermitan', 'parliament'], 'palermo': ['leproma', 'palermo', 'pleroma', 'polearm'], 'pales': ['elaps', 'lapse', 'lepas', 'pales', 'salep', 'saple', 'sepal', 'slape', 'spale', 'speal'], 'palestral': ['alpestral', 'palestral'], 'palestrian': ['alpestrian', 'palestrian', 'psalterian'], 'palet': ['leapt', 'palet', 'patel', 'pelta', 'petal', 'plate', 'pleat', 'tepal'], 'palette': ['palette', 'peltate'], 'pali': ['lipa', 'pail', 'pali', 'pial'], 'palification': ['palification', 'pontificalia'], 'palinode': ['lapideon', 'palinode', 'pedalion'], 'palinodist': ['palinodist', 'plastinoid'], 'palisade': ['palisade', 'salpidae'], 'palish': ['palish', 'silpha'], 'pallasite': ['aliseptal', 'pallasite'], 'pallette': ['pallette', 'platelet'], 'palliasse': ['paillasse', 'palliasse'], 'palliata': ['palatial', 'palliata'], 'pallone': ['pallone', 'pleonal'], 'palluites': ['palluites', 'pulsatile'], 'palm': ['lamp', 'palm'], 'palmad': ['lampad', 'palmad'], 'palmae': ['palame', 'palmae', 'pamela'], 'palmary': ['palmary', 'palmyra'], 'palmatilobed': ['palmatilobed', 'palmilobated'], 'palmatisect': ['metaplastic', 'palmatisect'], 'palmer': ['lamper', 'palmer', 'relamp'], 'palmery': ['lamprey', 'palmery'], 'palmette': ['palmette', 'template'], 'palmful': ['lampful', 'palmful'], 'palmification': ['amplification', 'palmification'], 'palmilobated': ['palmatilobed', 'palmilobated'], 'palmipes': ['epiplasm', 'palmipes'], 'palmist': ['lampist', 'palmist'], 'palmister': ['palmister', 'prelatism'], 'palmistry': ['lampistry', 'palmistry'], 'palmite': ['implate', 'palmite'], 'palmito': ['optimal', 'palmito'], 'palmitone': ['emptional', 'palmitone'], 'palmo': ['mopla', 'palmo'], 'palmula': ['ampulla', 'palmula'], 'palmy': ['amply', 'palmy'], 'palmyra': ['palmary', 'palmyra'], 'palolo': ['apollo', 'palolo'], 'palp': ['lapp', 'palp', 'plap'], 'palpal': ['appall', 'palpal'], 'palpatory': ['palpatory', 'papolatry'], 'palped': ['dapple', 'lapped', 'palped'], 'palpi': ['palpi', 'pipal'], 'palster': ['palster', 'persalt', 'plaster', 'psalter', 'spartle', 'stapler'], 'palsy': ['palsy', 'splay'], 'palt': ['palt', 'plat'], 'palta': ['aptal', 'palta', 'talpa'], 'palter': ['palter', 'plater'], 'palterer': ['palterer', 'platerer'], 'paltry': ['paltry', 'partly', 'raptly'], 'paludian': ['paludian', 'paludina'], 'paludic': ['paludic', 'pudical'], 'paludina': ['paludian', 'paludina'], 'palus': ['palus', 'pasul'], 'palustral': ['palustral', 'plaustral'], 'palustrine': ['lupinaster', 'palustrine'], 'paly': ['paly', 'play', 'pyal', 'pyla'], 'pam': ['map', 'pam'], 'pamela': ['palame', 'palmae', 'pamela'], 'pamir': ['impar', 'pamir', 'prima'], 'pamiri': ['impair', 'pamiri'], 'pamper': ['mapper', 'pamper', 'pampre'], 'pampre': ['mapper', 'pamper', 'pampre'], 'pan': ['nap', 'pan'], 'panace': ['canape', 'panace'], 'panaceist': ['antispace', 'panaceist'], 'panade': ['napead', 'panade'], 'panak': ['kanap', 'panak'], 'panamist': ['mainpast', 'mantispa', 'panamist', 'stampian'], 'panary': ['panary', 'panyar'], 'panatela': ['panatela', 'plataean'], 'panatrophy': ['apanthropy', 'panatrophy'], 'pancreatoduodenectomy': ['duodenopancreatectomy', 'pancreatoduodenectomy'], 'pandean': ['pandean', 'pannade'], 'pandemia': ['pandemia', 'pedimana'], 'pander': ['pander', 'repand'], 'panderly': ['panderly', 'repandly'], 'pandermite': ['pandermite', 'pentamerid'], 'panderous': ['panderous', 'repandous'], 'pandion': ['dipnoan', 'nonpaid', 'pandion'], 'pandour': ['pandour', 'poduran'], 'pane': ['nape', 'neap', 'nepa', 'pane', 'pean'], 'paned': ['paned', 'penda'], 'panel': ['alpen', 'nepal', 'panel', 'penal', 'plane'], 'panela': ['apneal', 'panela'], 'panelation': ['antelopian', 'neapolitan', 'panelation'], 'paneler': ['paneler', 'repanel', 'replane'], 'paneless': ['paleness', 'paneless'], 'panelist': ['panelist', 'pantelis', 'penalist', 'plastein'], 'pangamic': ['campaign', 'pangamic'], 'pangane': ['pangane', 'pannage'], 'pangen': ['pangen', 'penang'], 'pangene': ['pangene', 'pennage'], 'pangi': ['aping', 'ngapi', 'pangi'], 'pani': ['nipa', 'pain', 'pani', 'pian', 'pina'], 'panicle': ['calepin', 'capelin', 'panicle', 'pelican', 'pinacle'], 'paniculitis': ['paniculitis', 'paulinistic'], 'panisca': ['capsian', 'caspian', 'nascapi', 'panisca'], 'panisic': ['panisic', 'piscian', 'piscina', 'sinapic'], 'pank': ['knap', 'pank'], 'pankin': ['napkin', 'pankin'], 'panman': ['panman', 'pannam'], 'panmug': ['panmug', 'pugman'], 'pannade': ['pandean', 'pannade'], 'pannage': ['pangane', 'pannage'], 'pannam': ['panman', 'pannam'], 'panne': ['panne', 'penna'], 'pannicle': ['pannicle', 'pinnacle'], 'pannus': ['pannus', 'sannup', 'unsnap', 'unspan'], 'panoche': ['copehan', 'panoche', 'phocean'], 'panoistic': ['panoistic', 'piscation'], 'panornithic': ['panornithic', 'rhaponticin'], 'panostitis': ['antiptosis', 'panostitis'], 'panplegia': ['appealing', 'lagniappe', 'panplegia'], 'pansciolist': ['costispinal', 'pansciolist'], 'panse': ['aspen', 'panse', 'snape', 'sneap', 'spane', 'spean'], 'panside': ['ipseand', 'panside', 'pansied'], 'pansied': ['ipseand', 'panside', 'pansied'], 'pansy': ['pansy', 'snapy'], 'pantaleon': ['pantaleon', 'pantalone'], 'pantalone': ['pantaleon', 'pantalone'], 'pantarchy': ['pantarchy', 'pyracanth'], 'pantelis': ['panelist', 'pantelis', 'penalist', 'plastein'], 'pantellerite': ['interpellate', 'pantellerite'], 'panter': ['arpent', 'enrapt', 'entrap', 'panter', 'parent', 'pretan', 'trepan'], 'pantheic': ['haptenic', 'pantheic', 'pithecan'], 'pantheonic': ['nonhepatic', 'pantheonic'], 'pantie': ['pantie', 'patine'], 'panties': ['panties', 'sapient', 'spinate'], 'pantile': ['pantile', 'pentail', 'platine', 'talpine'], 'pantle': ['pantle', 'planet', 'platen'], 'pantler': ['pantler', 'planter', 'replant'], 'pantofle': ['felapton', 'pantofle'], 'pantry': ['pantry', 'trypan'], 'panyar': ['panary', 'panyar'], 'papabot': ['papabot', 'papboat'], 'papal': ['lappa', 'papal'], 'papalistic': ['papalistic', 'papistical'], 'papboat': ['papabot', 'papboat'], 'paper': ['paper', 'rappe'], 'papered': ['papered', 'pradeep'], 'paperer': ['paperer', 'perpera', 'prepare', 'repaper'], 'papern': ['napper', 'papern'], 'papery': ['papery', 'prepay', 'yapper'], 'papillote': ['papillote', 'popliteal'], 'papion': ['oppian', 'papion', 'popian'], 'papisher': ['papisher', 'sapphire'], 'papistical': ['papalistic', 'papistical'], 'papless': ['papless', 'sapples'], 'papolatry': ['palpatory', 'papolatry'], 'papule': ['papule', 'upleap'], 'par': ['par', 'rap'], 'para': ['apar', 'paar', 'para'], 'parablepsia': ['appraisable', 'parablepsia'], 'paracelsist': ['palaestrics', 'paracelsist'], 'parachor': ['chaparro', 'parachor'], 'paracolitis': ['paracolitis', 'piscatorial'], 'paradisaic': ['paradisaic', 'paradisiac'], 'paradisaically': ['paradisaically', 'paradisiacally'], 'paradise': ['paradise', 'sparidae'], 'paradisiac': ['paradisaic', 'paradisiac'], 'paradisiacally': ['paradisaically', 'paradisiacally'], 'parado': ['parado', 'pardao'], 'paraenetic': ['capernaite', 'paraenetic'], 'paragrapher': ['paragrapher', 'reparagraph'], 'parah': ['aphra', 'harpa', 'parah'], 'parale': ['earlap', 'parale'], 'param': ['param', 'parma', 'praam'], 'paramine': ['amperian', 'paramine', 'pearmain'], 'paranephric': ['paranephric', 'paraphrenic'], 'paranephritis': ['paranephritis', 'paraphrenitis'], 'paranosic': ['caparison', 'paranosic'], 'paraphrenic': ['paranephric', 'paraphrenic'], 'paraphrenitis': ['paranephritis', 'paraphrenitis'], 'parasita': ['aspirata', 'parasita'], 'parasite': ['aspirate', 'parasite'], 'parasol': ['asaprol', 'parasol'], 'parasuchian': ['parasuchian', 'unpharasaic'], 'parasyntheton': ['parasyntheton', 'thysanopteran'], 'parate': ['aptera', 'parate', 'patera'], 'parathion': ['parathion', 'phanariot'], 'parazoan': ['parazoan', 'zaparoan'], 'parboil': ['bipolar', 'parboil'], 'parcel': ['carpel', 'parcel', 'placer'], 'parcellary': ['carpellary', 'parcellary'], 'parcellate': ['carpellate', 'parcellate', 'prelacteal'], 'parchesi': ['parchesi', 'seraphic'], 'pard': ['pard', 'prad'], 'pardao': ['parado', 'pardao'], 'parded': ['padder', 'parded'], 'pardesi': ['despair', 'pardesi'], 'pardo': ['adrop', 'pardo'], 'pardoner': ['pardoner', 'preadorn'], 'pare': ['aper', 'pare', 'pear', 'rape', 'reap'], 'parel': ['lepra', 'paler', 'parel', 'parle', 'pearl', 'perla', 'relap'], 'paren': ['arpen', 'paren'], 'parent': ['arpent', 'enrapt', 'entrap', 'panter', 'parent', 'pretan', 'trepan'], 'parental': ['parental', 'paternal', 'prenatal'], 'parentalia': ['parentalia', 'planetaria'], 'parentalism': ['parentalism', 'paternalism'], 'parentality': ['parentality', 'paternality'], 'parentally': ['parentally', 'paternally', 'prenatally'], 'parentelic': ['epicentral', 'parentelic'], 'parenticide': ['parenticide', 'preindicate'], 'parer': ['parer', 'raper'], 'paresis': ['paresis', 'serapis'], 'paretic': ['paretic', 'patrice', 'picrate'], 'parge': ['gaper', 'grape', 'pager', 'parge'], 'pari': ['pair', 'pari', 'pria', 'ripa'], 'pariah': ['pahari', 'pariah', 'raphia'], 'paridae': ['deipara', 'paridae'], 'paries': ['aspire', 'paries', 'praise', 'sirpea', 'spirea'], 'parietal': ['apterial', 'parietal'], 'parietes': ['asperite', 'parietes'], 'parietofrontal': ['frontoparietal', 'parietofrontal'], 'parietosquamosal': ['parietosquamosal', 'squamosoparietal'], 'parietotemporal': ['parietotemporal', 'temporoparietal'], 'parietovisceral': ['parietovisceral', 'visceroparietal'], 'parine': ['parine', 'rapine'], 'paring': ['paring', 'raping'], 'paris': ['paris', 'parsi', 'sarip'], 'parish': ['parish', 'raphis', 'rhapis'], 'parished': ['diphaser', 'parished', 'raphides', 'sephardi'], 'parison': ['parison', 'soprani'], 'parity': ['parity', 'piraty'], 'parkee': ['parkee', 'peaker'], 'parker': ['parker', 'repark'], 'parlatory': ['parlatory', 'portrayal'], 'parle': ['lepra', 'paler', 'parel', 'parle', 'pearl', 'perla', 'relap'], 'parley': ['parley', 'pearly', 'player', 'replay'], 'parliament': ['palermitan', 'parliament'], 'parly': ['parly', 'pylar', 'pyral'], 'parma': ['param', 'parma', 'praam'], 'parmesan': ['parmesan', 'spearman'], 'parnel': ['parnel', 'planer', 'replan'], 'paroch': ['carhop', 'paroch'], 'parochialism': ['aphorismical', 'parochialism'], 'parochine': ['canephroi', 'parochine'], 'parodic': ['parodic', 'picador'], 'paroecism': ['paroecism', 'premosaic'], 'parol': ['parol', 'polar', 'poral', 'proal'], 'parosela': ['parosela', 'psoralea'], 'parosteal': ['parosteal', 'pastorale'], 'parostotic': ['parostotic', 'postaortic'], 'parotia': ['apiator', 'atropia', 'parotia'], 'parotic': ['apricot', 'atropic', 'parotic', 'patrico'], 'parotid': ['dioptra', 'parotid'], 'parotitic': ['parotitic', 'patriotic'], 'parotitis': ['parotitis', 'topiarist'], 'parous': ['parous', 'upsoar'], 'parovarium': ['parovarium', 'vaporarium'], 'parrot': ['parrot', 'raptor'], 'parroty': ['parroty', 'portray', 'tropary'], 'parsable': ['parsable', 'prebasal', 'sparable'], 'parse': ['asper', 'parse', 'prase', 'spaer', 'spare', 'spear'], 'parsec': ['casper', 'escarp', 'parsec', 'scrape', 'secpar', 'spacer'], 'parsee': ['parsee', 'persae', 'persea', 'serape'], 'parser': ['parser', 'rasper', 'sparer'], 'parsi': ['paris', 'parsi', 'sarip'], 'parsley': ['parsley', 'pyrales', 'sparely', 'splayer'], 'parsoned': ['parsoned', 'spadrone'], 'parsonese': ['parsonese', 'preseason'], 'parsonic': ['parsonic', 'scoparin'], 'part': ['part', 'prat', 'rapt', 'tarp', 'trap'], 'partan': ['partan', 'tarpan'], 'parted': ['depart', 'parted', 'petard'], 'partedness': ['depressant', 'partedness'], 'parter': ['parter', 'prater'], 'parthian': ['parthian', 'taphrina'], 'partial': ['partial', 'patrial'], 'partialistic': ['iatraliptics', 'partialistic'], 'particle': ['particle', 'plicater', 'prelatic'], 'particulate': ['catapultier', 'particulate'], 'partigen': ['partigen', 'tapering'], 'partile': ['partile', 'plaiter', 'replait'], 'partimen': ['imperant', 'pairment', 'partimen', 'premiant', 'tripeman'], 'partinium': ['impuritan', 'partinium'], 'partisan': ['aspirant', 'partisan', 'spartina'], 'partite': ['partite', 'tearpit'], 'partitioned': ['departition', 'partitioned', 'trepidation'], 'partitioner': ['partitioner', 'repartition'], 'partlet': ['partlet', 'platter', 'prattle'], 'partly': ['paltry', 'partly', 'raptly'], 'parto': ['aport', 'parto', 'porta'], 'parture': ['parture', 'rapture'], 'party': ['party', 'trypa'], 'parulis': ['parulis', 'spirula', 'uprisal'], 'parure': ['parure', 'uprear'], 'parvoline': ['overplain', 'parvoline'], 'pasan': ['pasan', 'sapan'], 'pasch': ['chaps', 'pasch'], 'pascha': ['pascha', 'scapha'], 'paschite': ['paschite', 'pastiche', 'pistache', 'scaphite'], 'pascual': ['capsula', 'pascual', 'scapula'], 'pash': ['hasp', 'pash', 'psha', 'shap'], 'pasha': ['asaph', 'pasha'], 'pashm': ['pashm', 'phasm'], 'pashto': ['pashto', 'pathos', 'potash'], 'pasi': ['apis', 'pais', 'pasi', 'saip'], 'passer': ['passer', 'repass', 'sparse'], 'passional': ['passional', 'sponsalia'], 'passo': ['passo', 'psoas'], 'passout': ['outpass', 'passout'], 'passover': ['overpass', 'passover'], 'past': ['past', 'spat', 'stap', 'taps'], 'paste': ['paste', 'septa', 'spate'], 'pastel': ['pastel', 'septal', 'staple'], 'paster': ['paster', 'repast', 'trapes'], 'pasterer': ['pasterer', 'strepera'], 'pasteur': ['pasteur', 'pasture', 'upstare'], 'pastiche': ['paschite', 'pastiche', 'pistache', 'scaphite'], 'pasticheur': ['curateship', 'pasticheur'], 'pastil': ['alpist', 'pastil', 'spital'], 'pastile': ['aliptes', 'pastile', 'talipes'], 'pastime': ['impaste', 'pastime'], 'pastimer': ['maspiter', 'pastimer', 'primates'], 'pastophorium': ['amphitropous', 'pastophorium'], 'pastophorus': ['apostrophus', 'pastophorus'], 'pastor': ['asport', 'pastor', 'sproat'], 'pastoral': ['pastoral', 'proatlas'], 'pastorale': ['parosteal', 'pastorale'], 'pastose': ['pastose', 'petasos'], 'pastural': ['pastural', 'spatular'], 'pasture': ['pasteur', 'pasture', 'upstare'], 'pasty': ['pasty', 'patsy'], 'pasul': ['palus', 'pasul'], 'pat': ['apt', 'pat', 'tap'], 'pata': ['atap', 'pata', 'tapa'], 'patao': ['opata', 'patao', 'tapoa'], 'patarin': ['patarin', 'tarapin'], 'patarine': ['patarine', 'tarpeian'], 'patas': ['patas', 'tapas'], 'patch': ['chapt', 'pacht', 'patch'], 'patcher': ['chapter', 'patcher', 'repatch'], 'patchery': ['patchery', 'petchary'], 'pate': ['pate', 'peat', 'tape', 'teap'], 'patel': ['leapt', 'palet', 'patel', 'pelta', 'petal', 'plate', 'pleat', 'tepal'], 'paten': ['enapt', 'paten', 'penta', 'tapen'], 'patener': ['patener', 'pearten', 'petrean', 'terpane'], 'patent': ['patent', 'patten', 'tapnet'], 'pater': ['apert', 'pater', 'peart', 'prate', 'taper', 'terap'], 'patera': ['aptera', 'parate', 'patera'], 'paternal': ['parental', 'paternal', 'prenatal'], 'paternalism': ['parentalism', 'paternalism'], 'paternalist': ['intraseptal', 'paternalist', 'prenatalist'], 'paternality': ['parentality', 'paternality'], 'paternally': ['parentally', 'paternally', 'prenatally'], 'paternoster': ['paternoster', 'prosternate', 'transportee'], 'patesi': ['patesi', 'pietas'], 'pathed': ['heptad', 'pathed'], 'pathic': ['haptic', 'pathic'], 'pathlet': ['pathlet', 'telpath'], 'pathogen': ['heptagon', 'pathogen'], 'pathologicoanatomic': ['anatomicopathologic', 'pathologicoanatomic'], 'pathologicoanatomical': ['anatomicopathological', 'pathologicoanatomical'], 'pathologicoclinical': ['clinicopathological', 'pathologicoclinical'], 'pathonomy': ['monopathy', 'pathonomy'], 'pathophoric': ['haptophoric', 'pathophoric'], 'pathophorous': ['haptophorous', 'pathophorous'], 'pathos': ['pashto', 'pathos', 'potash'], 'pathy': ['pathy', 'typha'], 'patiently': ['patiently', 'platynite'], 'patina': ['aptian', 'patina', 'taipan'], 'patine': ['pantie', 'patine'], 'patined': ['depaint', 'inadept', 'painted', 'patined'], 'patio': ['patio', 'taipo', 'topia'], 'patly': ['aptly', 'patly', 'platy', 'typal'], 'patness': ['aptness', 'patness'], 'pato': ['atop', 'pato'], 'patola': ['patola', 'tapalo'], 'patrial': ['partial', 'patrial'], 'patriarch': ['patriarch', 'phratriac'], 'patrice': ['paretic', 'patrice', 'picrate'], 'patricide': ['dipicrate', 'patricide', 'pediatric'], 'patrico': ['apricot', 'atropic', 'parotic', 'patrico'], 'patrilocal': ['allopatric', 'patrilocal'], 'patriotic': ['parotitic', 'patriotic'], 'patroclinous': ['patroclinous', 'pratincolous'], 'patrol': ['patrol', 'portal', 'tropal'], 'patron': ['patron', 'tarpon'], 'patroness': ['patroness', 'transpose'], 'patronite': ['antitrope', 'patronite', 'tritanope'], 'patronymic': ['importancy', 'patronymic', 'pyromantic'], 'patsy': ['pasty', 'patsy'], 'patte': ['patte', 'tapet'], 'pattee': ['pattee', 'tapete'], 'patten': ['patent', 'patten', 'tapnet'], 'pattener': ['pattener', 'repatent'], 'patterer': ['patterer', 'pretreat'], 'pattern': ['pattern', 'reptant'], 'patterner': ['patterner', 'repattern'], 'patu': ['patu', 'paut', 'tapu'], 'patulent': ['patulent', 'petulant'], 'pau': ['pau', 'pua'], 'paul': ['paul', 'upla'], 'paula': ['palau', 'paula'], 'paulian': ['apulian', 'paulian', 'paulina'], 'paulie': ['alpieu', 'paulie'], 'paulin': ['paulin', 'pulian'], 'paulina': ['apulian', 'paulian', 'paulina'], 'paulinistic': ['paniculitis', 'paulinistic'], 'paulinus': ['nauplius', 'paulinus'], 'paulist': ['paulist', 'stipula'], 'paup': ['paup', 'pupa'], 'paut': ['patu', 'paut', 'tapu'], 'paver': ['paver', 'verpa'], 'pavid': ['pavid', 'vapid'], 'pavidity': ['pavidity', 'vapidity'], 'pavier': ['pavier', 'vipera'], 'pavisor': ['pavisor', 'proavis'], 'paw': ['paw', 'wap'], 'pawner': ['enwrap', 'pawner', 'repawn'], 'pay': ['pay', 'pya', 'yap'], 'payer': ['apery', 'payer', 'repay'], 'payroll': ['payroll', 'polarly'], 'pea': ['ape', 'pea'], 'peach': ['chape', 'cheap', 'peach'], 'peachen': ['cheapen', 'peachen'], 'peachery': ['cheapery', 'peachery'], 'peachlet': ['chapelet', 'peachlet'], 'peacoat': ['opacate', 'peacoat'], 'peag': ['gape', 'page', 'peag', 'pega'], 'peaker': ['parkee', 'peaker'], 'peal': ['leap', 'lepa', 'pale', 'peal', 'plea'], 'pealike': ['apelike', 'pealike'], 'pean': ['nape', 'neap', 'nepa', 'pane', 'pean'], 'pear': ['aper', 'pare', 'pear', 'rape', 'reap'], 'pearl': ['lepra', 'paler', 'parel', 'parle', 'pearl', 'perla', 'relap'], 'pearled': ['pearled', 'pedaler', 'pleader', 'replead'], 'pearlet': ['pearlet', 'pleater', 'prelate', 'ptereal', 'replate', 'repleat'], 'pearlin': ['pearlin', 'plainer', 'praline'], 'pearlish': ['earlship', 'pearlish'], 'pearlsides': ['displeaser', 'pearlsides'], 'pearly': ['parley', 'pearly', 'player', 'replay'], 'pearmain': ['amperian', 'paramine', 'pearmain'], 'peart': ['apert', 'pater', 'peart', 'prate', 'taper', 'terap'], 'pearten': ['patener', 'pearten', 'petrean', 'terpane'], 'peartly': ['apertly', 'peartly', 'platery', 'pteryla', 'taperly'], 'peartness': ['apertness', 'peartness', 'taperness'], 'peasantry': ['peasantry', 'synaptera'], 'peat': ['pate', 'peat', 'tape', 'teap'], 'peatman': ['peatman', 'tapeman'], 'peatship': ['happiest', 'peatship'], 'peccation': ['acception', 'peccation'], 'peckerwood': ['peckerwood', 'woodpecker'], 'pecos': ['copse', 'pecos', 'scope'], 'pectin': ['incept', 'pectin'], 'pectinate': ['pectinate', 'pencatite'], 'pectination': ['antinepotic', 'pectination'], 'pectinatopinnate': ['pectinatopinnate', 'pinnatopectinate'], 'pectinoid': ['depiction', 'pectinoid'], 'pectora': ['coperta', 'pectora', 'porcate'], 'pecunious': ['pecunious', 'puniceous'], 'peda': ['depa', 'peda'], 'pedal': ['padle', 'paled', 'pedal', 'plead'], 'pedaler': ['pearled', 'pedaler', 'pleader', 'replead'], 'pedalier': ['pedalier', 'perlidae'], 'pedalion': ['lapideon', 'palinode', 'pedalion'], 'pedalism': ['misplead', 'pedalism'], 'pedalist': ['dispetal', 'pedalist'], 'pedaliter': ['pedaliter', 'predetail'], 'pedant': ['pedant', 'pentad'], 'pedantess': ['adeptness', 'pedantess'], 'pedantic': ['pedantic', 'pentacid'], 'pedary': ['pedary', 'preday'], 'pederastic': ['discrepate', 'pederastic'], 'pedes': ['pedes', 'speed'], 'pedesis': ['despise', 'pedesis'], 'pedestrial': ['pedestrial', 'pilastered'], 'pediatric': ['dipicrate', 'patricide', 'pediatric'], 'pedicel': ['pedicel', 'pedicle'], 'pedicle': ['pedicel', 'pedicle'], 'pedicular': ['crepidula', 'pedicular'], 'pediculi': ['lupicide', 'pediculi', 'pulicide'], 'pedimana': ['pandemia', 'pedimana'], 'pedocal': ['lacepod', 'pedocal', 'placode'], 'pedometrician': ['pedometrician', 'premedication'], 'pedrail': ['pedrail', 'predial'], 'pedro': ['doper', 'pedro', 'pored'], 'peed': ['deep', 'peed'], 'peek': ['keep', 'peek'], 'peel': ['leep', 'peel', 'pele'], 'peelman': ['empanel', 'emplane', 'peelman'], 'peen': ['neep', 'peen'], 'peerly': ['peerly', 'yelper'], 'pega': ['gape', 'page', 'peag', 'pega'], 'peho': ['hope', 'peho'], 'peiser': ['espier', 'peiser'], 'peitho': ['ethiop', 'ophite', 'peitho'], 'peixere': ['expiree', 'peixere'], 'pekan': ['knape', 'pekan'], 'pelage': ['paegel', 'paegle', 'pelage'], 'pelasgoi': ['pelasgoi', 'spoilage'], 'pele': ['leep', 'peel', 'pele'], 'pelean': ['alpeen', 'lenape', 'pelean'], 'pelecani': ['capeline', 'pelecani'], 'pelecanus': ['encapsule', 'pelecanus'], 'pelias': ['espial', 'lipase', 'pelias'], 'pelican': ['calepin', 'capelin', 'panicle', 'pelican', 'pinacle'], 'pelick': ['pelick', 'pickle'], 'pelides': ['pelides', 'seedlip'], 'pelidnota': ['pelidnota', 'planetoid'], 'pelike': ['kelpie', 'pelike'], 'pelisse': ['pelisse', 'pieless'], 'pelite': ['leepit', 'pelite', 'pielet'], 'pellation': ['pellation', 'pollinate'], 'pellotine': ['pellotine', 'pollenite'], 'pelmet': ['pelmet', 'temple'], 'pelon': ['pelon', 'pleon'], 'pelops': ['pelops', 'peplos'], 'pelorian': ['pelorian', 'peronial', 'proalien'], 'peloric': ['peloric', 'precoil'], 'pelorus': ['leprous', 'pelorus', 'sporule'], 'pelota': ['alepot', 'pelota'], 'pelta': ['leapt', 'palet', 'patel', 'pelta', 'petal', 'plate', 'pleat', 'tepal'], 'peltandra': ['leptandra', 'peltandra'], 'peltast': ['peltast', 'spattle'], 'peltate': ['palette', 'peltate'], 'peltation': ['peltation', 'potential'], 'pelter': ['pelter', 'petrel'], 'peltiform': ['leptiform', 'peltiform'], 'pelting': ['pelting', 'petling'], 'peltry': ['peltry', 'pertly'], 'pelu': ['lupe', 'pelu', 'peul', 'pule'], 'pelusios': ['epulosis', 'pelusios'], 'pelycography': ['pelycography', 'pyrgocephaly'], 'pemican': ['campine', 'pemican'], 'pen': ['nep', 'pen'], 'penal': ['alpen', 'nepal', 'panel', 'penal', 'plane'], 'penalist': ['panelist', 'pantelis', 'penalist', 'plastein'], 'penalty': ['aplenty', 'penalty'], 'penang': ['pangen', 'penang'], 'penates': ['penates', 'septane'], 'pencatite': ['pectinate', 'pencatite'], 'penciled': ['depencil', 'penciled', 'pendicle'], 'pencilry': ['pencilry', 'princely'], 'penda': ['paned', 'penda'], 'pendicle': ['depencil', 'penciled', 'pendicle'], 'pendulant': ['pendulant', 'unplanted'], 'pendular': ['pendular', 'underlap', 'uplander'], 'pendulate': ['pendulate', 'unpleated'], 'pendulation': ['pendulation', 'pennatuloid'], 'pendulum': ['pendulum', 'unlumped', 'unplumed'], 'penetrable': ['penetrable', 'repentable'], 'penetrance': ['penetrance', 'repentance'], 'penetrant': ['penetrant', 'repentant'], 'penial': ['alpine', 'nepali', 'penial', 'pineal'], 'penis': ['penis', 'snipe', 'spine'], 'penitencer': ['penitencer', 'pertinence'], 'penman': ['nepman', 'penman'], 'penna': ['panne', 'penna'], 'pennage': ['pangene', 'pennage'], 'pennate': ['pennate', 'pentane'], 'pennatulid': ['pennatulid', 'pinnulated'], 'pennatuloid': ['pendulation', 'pennatuloid'], 'pennia': ['nanpie', 'pennia', 'pinnae'], 'pennisetum': ['pennisetum', 'septennium'], 'pensioner': ['pensioner', 'repension'], 'pensive': ['pensive', 'vespine'], 'penster': ['penster', 'present', 'serpent', 'strepen'], 'penta': ['enapt', 'paten', 'penta', 'tapen'], 'pentace': ['pentace', 'tepanec'], 'pentacid': ['pedantic', 'pentacid'], 'pentad': ['pedant', 'pentad'], 'pentadecoic': ['adenectopic', 'pentadecoic'], 'pentail': ['pantile', 'pentail', 'platine', 'talpine'], 'pentamerid': ['pandermite', 'pentamerid'], 'pentameroid': ['pentameroid', 'predominate'], 'pentane': ['pennate', 'pentane'], 'pentaploid': ['deoppilant', 'pentaploid'], 'pentathionic': ['antiphonetic', 'pentathionic'], 'pentatomic': ['camptonite', 'pentatomic'], 'pentitol': ['pentitol', 'pointlet'], 'pentoic': ['entopic', 'nepotic', 'pentoic'], 'pentol': ['lepton', 'pentol'], 'pentose': ['pentose', 'posteen'], 'pentyl': ['pentyl', 'plenty'], 'penult': ['penult', 'punlet', 'puntel'], 'peon': ['nope', 'open', 'peon', 'pone'], 'peony': ['peony', 'poney'], 'peopler': ['peopler', 'popeler'], 'peorian': ['apeiron', 'peorian'], 'peplos': ['pelops', 'peplos'], 'peplum': ['peplum', 'pumple'], 'peplus': ['peplus', 'supple'], 'pepo': ['pepo', 'pope'], 'per': ['per', 'rep'], 'peracid': ['epacrid', 'peracid', 'preacid'], 'peract': ['carpet', 'peract', 'preact'], 'peracute': ['peracute', 'preacute'], 'peradventure': ['peradventure', 'preadventure'], 'perakim': ['perakim', 'permiak', 'rampike'], 'peramble': ['peramble', 'preamble'], 'perambulate': ['perambulate', 'preambulate'], 'perambulation': ['perambulation', 'preambulation'], 'perambulatory': ['perambulatory', 'preambulatory'], 'perates': ['perates', 'repaste', 'sperate'], 'perbend': ['perbend', 'prebend'], 'perborate': ['perborate', 'prorebate', 'reprobate'], 'perca': ['caper', 'crape', 'pacer', 'perca', 'recap'], 'percale': ['percale', 'replace'], 'percaline': ['percaline', 'periclean'], 'percent': ['percent', 'precent'], 'percept': ['percept', 'precept'], 'perception': ['perception', 'preception'], 'perceptionism': ['misperception', 'perceptionism'], 'perceptive': ['perceptive', 'preceptive'], 'perceptively': ['perceptively', 'preceptively'], 'perceptual': ['perceptual', 'preceptual'], 'perceptually': ['perceptually', 'preceptually'], 'percha': ['aperch', 'eparch', 'percha', 'preach'], 'perchloric': ['perchloric', 'prechloric'], 'percid': ['percid', 'priced'], 'perclose': ['perclose', 'preclose'], 'percoidea': ['adipocere', 'percoidea'], 'percolate': ['percolate', 'prelocate'], 'percolation': ['neotropical', 'percolation'], 'percompound': ['percompound', 'precompound'], 'percontation': ['percontation', 'pernoctation'], 'perculsion': ['perculsion', 'preclusion'], 'perculsive': ['perculsive', 'preclusive'], 'percurrent': ['percurrent', 'precurrent'], 'percursory': ['percursory', 'precursory'], 'percussion': ['croupiness', 'percussion', 'supersonic'], 'percussioner': ['percussioner', 'repercussion'], 'percussor': ['percussor', 'procuress'], 'percy': ['crepy', 'cypre', 'percy'], 'perdicine': ['perdicine', 'recipiend'], 'perdition': ['direption', 'perdition', 'tropidine'], 'perdu': ['drupe', 'duper', 'perdu', 'prude', 'pured'], 'peregrina': ['peregrina', 'pregainer'], 'pereion': ['pereion', 'pioneer'], 'perendure': ['perendure', 'underpeer'], 'peres': ['peres', 'perse', 'speer', 'spree'], 'perfect': ['perfect', 'prefect'], 'perfected': ['perfected', 'predefect'], 'perfection': ['frontpiece', 'perfection'], 'perfectly': ['perfectly', 'prefectly'], 'perfervid': ['perfervid', 'prefervid'], 'perfoliation': ['perfoliation', 'prefoliation'], 'perforative': ['perforative', 'prefavorite'], 'perform': ['perform', 'preform'], 'performant': ['performant', 'preformant'], 'performative': ['performative', 'preformative'], 'performer': ['performer', 'prereform', 'reperform'], 'pergamic': ['crimpage', 'pergamic'], 'perhaps': ['perhaps', 'prehaps'], 'perhazard': ['perhazard', 'prehazard'], 'peri': ['peri', 'pier', 'ripe'], 'periacinal': ['epicranial', 'periacinal'], 'perianal': ['airplane', 'perianal'], 'perianth': ['perianth', 'triphane'], 'periapt': ['periapt', 'rappite'], 'periaster': ['periaster', 'sparterie'], 'pericardiacophrenic': ['pericardiacophrenic', 'phrenicopericardiac'], 'pericardiopleural': ['pericardiopleural', 'pleuropericardial'], 'perichete': ['perichete', 'perithece'], 'periclase': ['episclera', 'periclase'], 'periclean': ['percaline', 'periclean'], 'pericles': ['eclipser', 'pericles', 'resplice'], 'pericopal': ['pericopal', 'periploca'], 'periculant': ['periculant', 'unprelatic'], 'peridental': ['interplead', 'peridental'], 'peridiastolic': ['peridiastolic', 'periodicalist', 'proidealistic'], 'peridot': ['diopter', 'peridot', 'proetid', 'protide', 'pteroid'], 'perigone': ['perigone', 'pigeoner'], 'peril': ['peril', 'piler', 'plier'], 'perilous': ['perilous', 'uropsile'], 'perimeter': ['perimeter', 'peritreme'], 'perine': ['neiper', 'perine', 'pirene', 'repine'], 'perineovaginal': ['perineovaginal', 'vaginoperineal'], 'periodate': ['periodate', 'proetidae', 'proteidae'], 'periodicalist': ['peridiastolic', 'periodicalist', 'proidealistic'], 'periodontal': ['deploration', 'periodontal'], 'periost': ['periost', 'porites', 'reposit', 'riposte'], 'periosteal': ['periosteal', 'praseolite'], 'periotic': ['epirotic', 'periotic'], 'peripatetic': ['peripatetic', 'precipitate'], 'peripatidae': ['peripatidae', 'peripatidea'], 'peripatidea': ['peripatidae', 'peripatidea'], 'periplaneta': ['periplaneta', 'prepalatine'], 'periploca': ['pericopal', 'periploca'], 'periplus': ['periplus', 'supplier'], 'periportal': ['periportal', 'peritropal'], 'periproct': ['cotripper', 'periproct'], 'peripterous': ['peripterous', 'prepositure'], 'perique': ['perique', 'repique'], 'perirectal': ['perirectal', 'prerecital'], 'periscian': ['periscian', 'precisian'], 'periscopal': ['periscopal', 'sapropelic'], 'perish': ['perish', 'reship'], 'perished': ['hesperid', 'perished'], 'perishment': ['perishment', 'reshipment'], 'perisomal': ['perisomal', 'semipolar'], 'perisome': ['perisome', 'promisee', 'reimpose'], 'perispome': ['perispome', 'preimpose'], 'peristole': ['epistoler', 'peristole', 'perseitol', 'pistoleer'], 'peristoma': ['epistroma', 'peristoma'], 'peristomal': ['peristomal', 'prestomial'], 'peristylos': ['peristylos', 'pterylosis'], 'perit': ['perit', 'retip', 'tripe'], 'perite': ['perite', 'petrie', 'pieter'], 'peritenon': ['interpone', 'peritenon', 'pinnotere', 'preintone'], 'perithece': ['perichete', 'perithece'], 'peritomize': ['epitomizer', 'peritomize'], 'peritomous': ['outpromise', 'peritomous'], 'peritreme': ['perimeter', 'peritreme'], 'peritrichous': ['courtiership', 'peritrichous'], 'peritroch': ['chiropter', 'peritroch'], 'peritropal': ['periportal', 'peritropal'], 'peritropous': ['peritropous', 'proprietous'], 'perkin': ['perkin', 'pinker'], 'perknite': ['perknite', 'peterkin'], 'perla': ['lepra', 'paler', 'parel', 'parle', 'pearl', 'perla', 'relap'], 'perle': ['leper', 'perle', 'repel'], 'perlection': ['perlection', 'prelection'], 'perlidae': ['pedalier', 'perlidae'], 'perlingual': ['perlingual', 'prelingual'], 'perlite': ['perlite', 'reptile'], 'perlitic': ['perlitic', 'triplice'], 'permeameter': ['amperemeter', 'permeameter'], 'permeance': ['permeance', 'premenace'], 'permeant': ['permeant', 'peterman'], 'permeation': ['permeation', 'preominate'], 'permiak': ['perakim', 'permiak', 'rampike'], 'permissibility': ['impressibility', 'permissibility'], 'permissible': ['impressible', 'permissible'], 'permissibleness': ['impressibleness', 'permissibleness'], 'permissibly': ['impressibly', 'permissibly'], 'permission': ['impression', 'permission'], 'permissive': ['impressive', 'permissive'], 'permissively': ['impressively', 'permissively'], 'permissiveness': ['impressiveness', 'permissiveness'], 'permitter': ['permitter', 'pretermit'], 'permixture': ['permixture', 'premixture'], 'permonosulphuric': ['monopersulphuric', 'permonosulphuric'], 'permutation': ['importunate', 'permutation'], 'pernasal': ['pernasal', 'prenasal'], 'pernis': ['pernis', 'respin', 'sniper'], 'pernoctation': ['percontation', 'pernoctation'], 'pernor': ['pernor', 'perron'], 'pernyi': ['pernyi', 'pinery'], 'peronial': ['pelorian', 'peronial', 'proalien'], 'peropus': ['peropus', 'purpose'], 'peroral': ['peroral', 'preoral'], 'perorally': ['perorally', 'preorally'], 'perorate': ['perorate', 'retepora'], 'perosmate': ['perosmate', 'sematrope'], 'perosmic': ['comprise', 'perosmic'], 'perotic': ['perotic', 'proteic', 'tropeic'], 'perpera': ['paperer', 'perpera', 'prepare', 'repaper'], 'perpetualist': ['perpetualist', 'pluriseptate'], 'perplexer': ['perplexer', 'reperplex'], 'perron': ['pernor', 'perron'], 'perry': ['perry', 'pryer'], 'persae': ['parsee', 'persae', 'persea', 'serape'], 'persalt': ['palster', 'persalt', 'plaster', 'psalter', 'spartle', 'stapler'], 'perscribe': ['perscribe', 'prescribe'], 'perse': ['peres', 'perse', 'speer', 'spree'], 'persea': ['parsee', 'persae', 'persea', 'serape'], 'perseid': ['perseid', 'preside'], 'perseitol': ['epistoler', 'peristole', 'perseitol', 'pistoleer'], 'perseity': ['perseity', 'speerity'], 'persian': ['persian', 'prasine', 'saprine'], 'persic': ['crepis', 'cripes', 'persic', 'precis', 'spicer'], 'persico': ['ceriops', 'persico'], 'persism': ['impress', 'persism', 'premiss'], 'persist': ['persist', 'spriest'], 'persistent': ['persistent', 'presentist', 'prettiness'], 'personalia': ['palaeornis', 'personalia'], 'personalistic': ['personalistic', 'pictorialness'], 'personate': ['esperanto', 'personate'], 'personed': ['personed', 'responde'], 'pert': ['pert', 'petr', 'terp'], 'pertain': ['painter', 'pertain', 'pterian', 'repaint'], 'perten': ['perten', 'repent'], 'perthite': ['perthite', 'tephrite'], 'perthitic': ['perthitic', 'tephritic'], 'pertinacity': ['antipyretic', 'pertinacity'], 'pertinence': ['penitencer', 'pertinence'], 'pertly': ['peltry', 'pertly'], 'perturbational': ['perturbational', 'protuberantial'], 'pertussal': ['pertussal', 'supersalt'], 'perty': ['perty', 'typer'], 'peru': ['peru', 'prue', 'pure'], 'perugian': ['pagurine', 'perugian'], 'peruke': ['keuper', 'peruke'], 'perula': ['epural', 'perula', 'pleura'], 'perun': ['perun', 'prune'], 'perusable': ['perusable', 'superable'], 'perusal': ['perusal', 'serpula'], 'peruse': ['peruse', 'respue'], 'pervade': ['deprave', 'pervade'], 'pervader': ['depraver', 'pervader'], 'pervadingly': ['depravingly', 'pervadingly'], 'perverse': ['perverse', 'preserve'], 'perversion': ['perversion', 'preversion'], 'pervious': ['pervious', 'previous', 'viperous'], 'perviously': ['perviously', 'previously', 'viperously'], 'perviousness': ['perviousness', 'previousness', 'viperousness'], 'pesa': ['apse', 'pesa', 'spae'], 'pesach': ['cephas', 'pesach'], 'pesah': ['heaps', 'pesah', 'phase', 'shape'], 'peseta': ['asteep', 'peseta'], 'peso': ['epos', 'peso', 'pose', 'sope'], 'pess': ['pess', 'seps'], 'pessoner': ['pessoner', 'response'], 'pest': ['pest', 'sept', 'spet', 'step'], 'peste': ['peste', 'steep'], 'pester': ['pester', 'preset', 'restep', 'streep'], 'pesthole': ['heelpost', 'pesthole'], 'pesticidal': ['pesticidal', 'septicidal'], 'pestiferous': ['pestiferous', 'septiferous'], 'pestle': ['pestle', 'spleet'], 'petal': ['leapt', 'palet', 'patel', 'pelta', 'petal', 'plate', 'pleat', 'tepal'], 'petalia': ['palaite', 'petalia', 'pileata'], 'petaline': ['petaline', 'tapeline'], 'petalism': ['petalism', 'septimal'], 'petalless': ['petalless', 'plateless', 'pleatless'], 'petallike': ['petallike', 'platelike'], 'petaloid': ['opdalite', 'petaloid'], 'petalon': ['lepanto', 'nepotal', 'petalon', 'polenta'], 'petard': ['depart', 'parted', 'petard'], 'petary': ['petary', 'pratey'], 'petasos': ['pastose', 'petasos'], 'petchary': ['patchery', 'petchary'], 'petechial': ['epithecal', 'petechial', 'phacelite'], 'petechiate': ['epithecate', 'petechiate'], 'peteman': ['peteman', 'tempean'], 'peter': ['erept', 'peter', 'petre'], 'peterkin': ['perknite', 'peterkin'], 'peterman': ['permeant', 'peterman'], 'petiolary': ['epilatory', 'petiolary'], 'petiole': ['petiole', 'pilotee'], 'petioled': ['lepidote', 'petioled'], 'petitionary': ['opiniatrety', 'petitionary'], 'petitioner': ['petitioner', 'repetition'], 'petiveria': ['aperitive', 'petiveria'], 'petling': ['pelting', 'petling'], 'peto': ['peto', 'poet', 'pote', 'tope'], 'petr': ['pert', 'petr', 'terp'], 'petre': ['erept', 'peter', 'petre'], 'petrea': ['petrea', 'repeat', 'retape'], 'petrean': ['patener', 'pearten', 'petrean', 'terpane'], 'petrel': ['pelter', 'petrel'], 'petricola': ['carpolite', 'petricola'], 'petrie': ['perite', 'petrie', 'pieter'], 'petrine': ['petrine', 'terpine'], 'petrochemical': ['cephalometric', 'petrochemical'], 'petrogale': ['petrogale', 'petrolage', 'prolegate'], 'petrographer': ['petrographer', 'pterographer'], 'petrographic': ['petrographic', 'pterographic'], 'petrographical': ['petrographical', 'pterographical'], 'petrographically': ['petrographically', 'pterylographical'], 'petrography': ['petrography', 'pterography', 'typographer'], 'petrol': ['petrol', 'replot'], 'petrolage': ['petrogale', 'petrolage', 'prolegate'], 'petrolean': ['petrolean', 'rantepole'], 'petrolic': ['petrolic', 'plerotic'], 'petrologically': ['petrologically', 'pterylological'], 'petrosa': ['esparto', 'petrosa', 'seaport'], 'petrosal': ['petrosal', 'polestar'], 'petrosquamosal': ['petrosquamosal', 'squamopetrosal'], 'petrous': ['petrous', 'posture', 'proetus', 'proteus', 'septuor', 'spouter'], 'petticoated': ['depetticoat', 'petticoated'], 'petulant': ['patulent', 'petulant'], 'petune': ['neetup', 'petune'], 'peul': ['lupe', 'pelu', 'peul', 'pule'], 'pewy': ['pewy', 'wype'], 'peyote': ['peyote', 'poteye'], 'peyotl': ['peyotl', 'poetly'], 'phacelia': ['acephali', 'phacelia'], 'phacelite': ['epithecal', 'petechial', 'phacelite'], 'phacoid': ['dapicho', 'phacoid'], 'phacolite': ['hopcalite', 'phacolite'], 'phacolysis': ['pachylosis', 'phacolysis'], 'phacometer': ['pachometer', 'phacometer'], 'phaethonic': ['phaethonic', 'theophanic'], 'phaeton': ['phaeton', 'phonate'], 'phagocytism': ['mycophagist', 'phagocytism'], 'phalaecian': ['acephalina', 'phalaecian'], 'phalangium': ['gnaphalium', 'phalangium'], 'phalera': ['phalera', 'raphael'], 'phanariot': ['parathion', 'phanariot'], 'phanerogam': ['anemograph', 'phanerogam'], 'phanerogamic': ['anemographic', 'phanerogamic'], 'phanerogamy': ['anemography', 'phanerogamy'], 'phanic': ['apinch', 'chapin', 'phanic'], 'phano': ['phano', 'pohna'], 'pharaonic': ['anaphoric', 'pharaonic'], 'pharaonical': ['anaphorical', 'pharaonical'], 'phare': ['hepar', 'phare', 'raphe'], 'pharian': ['pharian', 'piranha'], 'pharisaic': ['chirapsia', 'pharisaic'], 'pharisean': ['pharisean', 'seraphina'], 'pharisee': ['hesperia', 'pharisee'], 'phariseeism': ['hemiparesis', 'phariseeism'], 'pharmacolite': ['metaphorical', 'pharmacolite'], 'pharyngolaryngeal': ['laryngopharyngeal', 'pharyngolaryngeal'], 'pharyngolaryngitis': ['laryngopharyngitis', 'pharyngolaryngitis'], 'pharyngorhinitis': ['pharyngorhinitis', 'rhinopharyngitis'], 'phase': ['heaps', 'pesah', 'phase', 'shape'], 'phaseless': ['phaseless', 'shapeless'], 'phaseolin': ['esiphonal', 'phaseolin'], 'phasis': ['aspish', 'phasis'], 'phasm': ['pashm', 'phasm'], 'phasmid': ['dampish', 'madship', 'phasmid'], 'phasmoid': ['phasmoid', 'shopmaid'], 'pheal': ['aleph', 'pheal'], 'pheasant': ['pheasant', 'stephana'], 'phecda': ['chaped', 'phecda'], 'phemie': ['imphee', 'phemie'], 'phenacite': ['phenacite', 'phenicate'], 'phenate': ['haptene', 'heptane', 'phenate'], 'phenetole': ['phenetole', 'telephone'], 'phenic': ['phenic', 'pinche'], 'phenicate': ['phenacite', 'phenicate'], 'phenolic': ['phenolic', 'pinochle'], 'phenological': ['nephological', 'phenological'], 'phenologist': ['nephologist', 'phenologist'], 'phenology': ['nephology', 'phenology'], 'phenosal': ['alphonse', 'phenosal'], 'pheon': ['pheon', 'phone'], 'phi': ['hip', 'phi'], 'phialide': ['hepialid', 'phialide'], 'philobotanist': ['botanophilist', 'philobotanist'], 'philocynic': ['cynophilic', 'philocynic'], 'philohela': ['halophile', 'philohela'], 'philoneism': ['neophilism', 'philoneism'], 'philopoet': ['philopoet', 'photopile'], 'philotheist': ['philotheist', 'theophilist'], 'philotherian': ['lithonephria', 'philotherian'], 'philozoic': ['philozoic', 'zoophilic'], 'philozoist': ['philozoist', 'zoophilist'], 'philter': ['philter', 'thripel'], 'phineas': ['inphase', 'phineas'], 'phiroze': ['orphize', 'phiroze'], 'phit': ['phit', 'pith'], 'phlebometritis': ['metrophlebitis', 'phlebometritis'], 'phleum': ['phleum', 'uphelm'], 'phloretic': ['phloretic', 'plethoric'], 'pho': ['hop', 'pho', 'poh'], 'phobism': ['mobship', 'phobism'], 'phoca': ['chopa', 'phoca', 'poach'], 'phocaean': ['phocaean', 'phocaena'], 'phocaena': ['phocaean', 'phocaena'], 'phocaenine': ['phocaenine', 'phoenicean'], 'phocean': ['copehan', 'panoche', 'phocean'], 'phocian': ['aphonic', 'phocian'], 'phocine': ['chopine', 'phocine'], 'phoenicean': ['phocaenine', 'phoenicean'], 'pholad': ['adolph', 'pholad'], 'pholas': ['alphos', 'pholas'], 'pholcidae': ['cephaloid', 'pholcidae'], 'pholcoid': ['chilopod', 'pholcoid'], 'phonate': ['phaeton', 'phonate'], 'phone': ['pheon', 'phone'], 'phonelescope': ['nepheloscope', 'phonelescope'], 'phonetical': ['pachnolite', 'phonetical'], 'phonetics': ['phonetics', 'sphenotic'], 'phoniatry': ['phoniatry', 'thiopyran'], 'phonic': ['chopin', 'phonic'], 'phonogram': ['monograph', 'nomograph', 'phonogram'], 'phonogramic': ['gramophonic', 'monographic', 'nomographic', 'phonogramic'], 'phonogramically': ['gramophonically', 'monographically', 'nomographically', 'phonogramically'], 'phonographic': ['graphophonic', 'phonographic'], 'phonolite': ['lithopone', 'phonolite'], 'phonometer': ['nephrotome', 'phonometer'], 'phonometry': ['nephrotomy', 'phonometry'], 'phonophote': ['phonophote', 'photophone'], 'phonotyper': ['hypopteron', 'phonotyper'], 'phoo': ['hoop', 'phoo', 'pooh'], 'phorone': ['orpheon', 'phorone'], 'phoronidea': ['phoronidea', 'radiophone'], 'phos': ['phos', 'posh', 'shop', 'soph'], 'phosphatide': ['diphosphate', 'phosphatide'], 'phosphoglycerate': ['glycerophosphate', 'phosphoglycerate'], 'phossy': ['hyssop', 'phossy', 'sposhy'], 'phot': ['phot', 'toph'], 'photechy': ['hypothec', 'photechy'], 'photochromography': ['chromophotography', 'photochromography'], 'photochromolithograph': ['chromophotolithograph', 'photochromolithograph'], 'photochronograph': ['chronophotograph', 'photochronograph'], 'photochronographic': ['chronophotographic', 'photochronographic'], 'photochronography': ['chronophotography', 'photochronography'], 'photogram': ['motograph', 'photogram'], 'photographer': ['photographer', 'rephotograph'], 'photoheliography': ['heliophotography', 'photoheliography'], 'photolithography': ['lithophotography', 'photolithography'], 'photomacrograph': ['macrophotograph', 'photomacrograph'], 'photometer': ['photometer', 'prototheme'], 'photomicrograph': ['microphotograph', 'photomicrograph'], 'photomicrographic': ['microphotographic', 'photomicrographic'], 'photomicrography': ['microphotography', 'photomicrography'], 'photomicroscope': ['microphotoscope', 'photomicroscope'], 'photophone': ['phonophote', 'photophone'], 'photopile': ['philopoet', 'photopile'], 'photostereograph': ['photostereograph', 'stereophotograph'], 'phototelegraph': ['phototelegraph', 'telephotograph'], 'phototelegraphic': ['phototelegraphic', 'telephotographic'], 'phototelegraphy': ['phototelegraphy', 'telephotography'], 'phototypography': ['phototypography', 'phytotopography'], 'phrase': ['phrase', 'seraph', 'shaper', 'sherpa'], 'phraser': ['phraser', 'sharper'], 'phrasing': ['harpings', 'phrasing'], 'phrasy': ['phrasy', 'sharpy'], 'phratriac': ['patriarch', 'phratriac'], 'phreatic': ['chapiter', 'phreatic'], 'phrenesia': ['hesperian', 'phrenesia', 'seraphine'], 'phrenic': ['nephric', 'phrenic', 'pincher'], 'phrenicopericardiac': ['pericardiacophrenic', 'phrenicopericardiac'], 'phrenics': ['phrenics', 'pinscher'], 'phrenitic': ['nephritic', 'phrenitic', 'prehnitic'], 'phrenitis': ['inspreith', 'nephritis', 'phrenitis'], 'phrenocardiac': ['nephrocardiac', 'phrenocardiac'], 'phrenocolic': ['nephrocolic', 'phrenocolic'], 'phrenocostal': ['phrenocostal', 'plastochrone'], 'phrenogastric': ['gastrophrenic', 'nephrogastric', 'phrenogastric'], 'phrenohepatic': ['hepatonephric', 'phrenohepatic'], 'phrenologist': ['nephrologist', 'phrenologist'], 'phrenology': ['nephrology', 'phrenology'], 'phrenopathic': ['nephropathic', 'phrenopathic'], 'phrenopathy': ['nephropathy', 'phrenopathy'], 'phrenosplenic': ['phrenosplenic', 'splenonephric', 'splenophrenic'], 'phronesis': ['nephrosis', 'phronesis'], 'phronimidae': ['diamorphine', 'phronimidae'], 'phthalazine': ['naphthalize', 'phthalazine'], 'phu': ['hup', 'phu'], 'phycitol': ['cytophil', 'phycitol'], 'phycocyanin': ['cyanophycin', 'phycocyanin'], 'phyla': ['haply', 'phyla'], 'phyletic': ['heptylic', 'phyletic'], 'phylloceras': ['hyposcleral', 'phylloceras'], 'phylloclad': ['cladophyll', 'phylloclad'], 'phyllodial': ['phyllodial', 'phylloidal'], 'phylloerythrin': ['erythrophyllin', 'phylloerythrin'], 'phylloidal': ['phyllodial', 'phylloidal'], 'phyllopodous': ['phyllopodous', 'podophyllous'], 'phyma': ['phyma', 'yamph'], 'phymatodes': ['desmopathy', 'phymatodes'], 'phymosia': ['hyposmia', 'phymosia'], 'physa': ['physa', 'shapy'], 'physalite': ['physalite', 'styphelia'], 'physic': ['physic', 'scyphi'], 'physicochemical': ['chemicophysical', 'physicochemical'], 'physicomedical': ['medicophysical', 'physicomedical'], 'physiocrat': ['physiocrat', 'psychotria'], 'physiologicoanatomic': ['anatomicophysiologic', 'physiologicoanatomic'], 'physiopsychological': ['physiopsychological', 'psychophysiological'], 'physiopsychology': ['physiopsychology', 'psychophysiology'], 'phytic': ['phytic', 'pitchy', 'pythic', 'typhic'], 'phytogenesis': ['phytogenesis', 'pythogenesis'], 'phytogenetic': ['phytogenetic', 'pythogenetic'], 'phytogenic': ['phytogenic', 'pythogenic', 'typhogenic'], 'phytogenous': ['phytogenous', 'pythogenous'], 'phytoid': ['phytoid', 'typhoid'], 'phytologist': ['hypoglottis', 'phytologist'], 'phytometer': ['phytometer', 'thermotype'], 'phytometric': ['phytometric', 'thermotypic'], 'phytometry': ['phytometry', 'thermotypy'], 'phytomonas': ['phytomonas', 'somnopathy'], 'phyton': ['phyton', 'python'], 'phytonic': ['hypnotic', 'phytonic', 'pythonic', 'typhonic'], 'phytosis': ['phytosis', 'typhosis'], 'phytotopography': ['phototypography', 'phytotopography'], 'phytozoa': ['phytozoa', 'zoopathy', 'zoophyta'], 'piacle': ['epical', 'piacle', 'plaice'], 'piacular': ['apicular', 'piacular'], 'pial': ['lipa', 'pail', 'pali', 'pial'], 'pialyn': ['alypin', 'pialyn'], 'pian': ['nipa', 'pain', 'pani', 'pian', 'pina'], 'pianiste': ['pianiste', 'pisanite'], 'piannet': ['piannet', 'pinnate'], 'pianola': ['opalina', 'pianola'], 'piaroa': ['aporia', 'piaroa'], 'piast': ['piast', 'stipa', 'tapis'], 'piaster': ['piaster', 'piastre', 'raspite', 'spirate', 'traipse'], 'piastre': ['piaster', 'piastre', 'raspite', 'spirate', 'traipse'], 'picador': ['parodic', 'picador'], 'picae': ['picae', 'picea'], 'pical': ['pical', 'plica'], 'picard': ['caprid', 'carpid', 'picard'], 'picarel': ['caliper', 'picarel', 'replica'], 'picary': ['cypria', 'picary', 'piracy'], 'pice': ['epic', 'pice'], 'picea': ['picae', 'picea'], 'picene': ['picene', 'piecen'], 'picker': ['picker', 'repick'], 'pickle': ['pelick', 'pickle'], 'pickler': ['pickler', 'prickle'], 'pickover': ['overpick', 'pickover'], 'picktooth': ['picktooth', 'toothpick'], 'pico': ['cipo', 'pico'], 'picot': ['optic', 'picot', 'topic'], 'picotah': ['aphotic', 'picotah'], 'picra': ['capri', 'picra', 'rapic'], 'picrate': ['paretic', 'patrice', 'picrate'], 'pictography': ['graphotypic', 'pictography', 'typographic'], 'pictorialness': ['personalistic', 'pictorialness'], 'picture': ['cuprite', 'picture'], 'picudilla': ['picudilla', 'pulicidal'], 'pidan': ['pidan', 'pinda'], 'piebald': ['bipedal', 'piebald'], 'piebaldness': ['dispensable', 'piebaldness'], 'piecen': ['picene', 'piecen'], 'piecer': ['piecer', 'pierce', 'recipe'], 'piecework': ['piecework', 'workpiece'], 'piecrust': ['crepitus', 'piecrust'], 'piedness': ['dispense', 'piedness'], 'piegan': ['genipa', 'piegan'], 'pieless': ['pelisse', 'pieless'], 'pielet': ['leepit', 'pelite', 'pielet'], 'piemag': ['magpie', 'piemag'], 'pieman': ['impane', 'pieman'], 'pien': ['pien', 'pine'], 'piend': ['piend', 'pined'], 'pier': ['peri', 'pier', 'ripe'], 'pierce': ['piecer', 'pierce', 'recipe'], 'piercent': ['piercent', 'prentice'], 'piercer': ['piercer', 'reprice'], 'pierlike': ['pierlike', 'ripelike'], 'piet': ['piet', 'tipe'], 'pietas': ['patesi', 'pietas'], 'pieter': ['perite', 'petrie', 'pieter'], 'pig': ['gip', 'pig'], 'pigeoner': ['perigone', 'pigeoner'], 'pigeontail': ['pigeontail', 'plagionite'], 'pigly': ['gilpy', 'pigly'], 'pignon': ['ningpo', 'pignon'], 'pignorate': ['operating', 'pignorate'], 'pigskin': ['pigskin', 'spiking'], 'pigsney': ['gypsine', 'pigsney'], 'pik': ['kip', 'pik'], 'pika': ['paik', 'pika'], 'pike': ['kepi', 'kipe', 'pike'], 'pikel': ['pikel', 'pikle'], 'piker': ['krepi', 'piker'], 'pikle': ['pikel', 'pikle'], 'pilage': ['paigle', 'pilage'], 'pilar': ['april', 'pilar', 'ripal'], 'pilaster': ['epistlar', 'pilaster', 'plaister', 'priestal'], 'pilastered': ['pedestrial', 'pilastered'], 'pilastric': ['pilastric', 'triplasic'], 'pilate': ['aplite', 'pilate'], 'pileata': ['palaite', 'petalia', 'pileata'], 'pileate': ['epilate', 'epitela', 'pileate'], 'pileated': ['depilate', 'leptidae', 'pileated'], 'piled': ['piled', 'plied'], 'piler': ['peril', 'piler', 'plier'], 'piles': ['piles', 'plies', 'slipe', 'spiel', 'spile'], 'pileus': ['epulis', 'pileus'], 'pili': ['ipil', 'pili'], 'pilin': ['lipin', 'pilin'], 'pillarist': ['pillarist', 'pistillar'], 'pillet': ['liplet', 'pillet'], 'pilm': ['limp', 'pilm', 'plim'], 'pilmy': ['imply', 'limpy', 'pilmy'], 'pilosis': ['liposis', 'pilosis'], 'pilotee': ['petiole', 'pilotee'], 'pilpai': ['lippia', 'pilpai'], 'pilus': ['lupis', 'pilus'], 'pim': ['imp', 'pim'], 'pimelate': ['ampelite', 'pimelate'], 'pimento': ['emption', 'pimento'], 'pimenton': ['imponent', 'pimenton'], 'pimola': ['lipoma', 'pimola', 'ploima'], 'pimpish': ['impship', 'pimpish'], 'pimplous': ['pimplous', 'pompilus', 'populism'], 'pin': ['nip', 'pin'], 'pina': ['nipa', 'pain', 'pani', 'pian', 'pina'], 'pinaces': ['pinaces', 'pincase'], 'pinachrome': ['epharmonic', 'pinachrome'], 'pinacle': ['calepin', 'capelin', 'panicle', 'pelican', 'pinacle'], 'pinacoid': ['diapnoic', 'pinacoid'], 'pinal': ['lipan', 'pinal', 'plain'], 'pinales': ['espinal', 'pinales', 'spaniel'], 'pinaster': ['pinaster', 'pristane'], 'pincase': ['pinaces', 'pincase'], 'pincer': ['pincer', 'prince'], 'pincerlike': ['pincerlike', 'princelike'], 'pincers': ['encrisp', 'pincers'], 'pinchbelly': ['bellypinch', 'pinchbelly'], 'pinche': ['phenic', 'pinche'], 'pincher': ['nephric', 'phrenic', 'pincher'], 'pincushion': ['nuncioship', 'pincushion'], 'pinda': ['pidan', 'pinda'], 'pindari': ['pindari', 'pridian'], 'pine': ['pien', 'pine'], 'pineal': ['alpine', 'nepali', 'penial', 'pineal'], 'pined': ['piend', 'pined'], 'piner': ['piner', 'prine', 'repin', 'ripen'], 'pinery': ['pernyi', 'pinery'], 'pingler': ['pingler', 'pringle'], 'pinhold': ['dolphin', 'pinhold'], 'pinhole': ['lophine', 'pinhole'], 'pinite': ['pinite', 'tiepin'], 'pinker': ['perkin', 'pinker'], 'pinking': ['kingpin', 'pinking'], 'pinkish': ['kinship', 'pinkish'], 'pinlock': ['lockpin', 'pinlock'], 'pinnacle': ['pannicle', 'pinnacle'], 'pinnae': ['nanpie', 'pennia', 'pinnae'], 'pinnate': ['piannet', 'pinnate'], 'pinnatopectinate': ['pectinatopinnate', 'pinnatopectinate'], 'pinnet': ['pinnet', 'tenpin'], 'pinnitarsal': ['intraspinal', 'pinnitarsal'], 'pinnotere': ['interpone', 'peritenon', 'pinnotere', 'preintone'], 'pinnothere': ['interphone', 'pinnothere'], 'pinnula': ['pinnula', 'unplain'], 'pinnulated': ['pennatulid', 'pinnulated'], 'pinochle': ['phenolic', 'pinochle'], 'pinole': ['pinole', 'pleion'], 'pinolia': ['apiolin', 'pinolia'], 'pinscher': ['phrenics', 'pinscher'], 'pinta': ['inapt', 'paint', 'pinta'], 'pintail': ['pintail', 'tailpin'], 'pintano': ['opinant', 'pintano'], 'pinte': ['inept', 'pinte'], 'pinto': ['pinto', 'point'], 'pintura': ['pintura', 'puritan', 'uptrain'], 'pinulus': ['lupinus', 'pinulus'], 'piny': ['piny', 'pyin'], 'pinyl': ['pinyl', 'pliny'], 'pioneer': ['pereion', 'pioneer'], 'pioted': ['pioted', 'podite'], 'pipa': ['paip', 'pipa'], 'pipal': ['palpi', 'pipal'], 'piperno': ['piperno', 'propine'], 'pique': ['equip', 'pique'], 'pir': ['pir', 'rip'], 'piracy': ['cypria', 'picary', 'piracy'], 'piranha': ['pharian', 'piranha'], 'piratess': ['piratess', 'serapist', 'tarsipes'], 'piratically': ['capillarity', 'piratically'], 'piraty': ['parity', 'piraty'], 'pirene': ['neiper', 'perine', 'pirene', 'repine'], 'pirssonite': ['pirssonite', 'trispinose'], 'pisaca': ['capias', 'pisaca'], 'pisan': ['pisan', 'sapin', 'spina'], 'pisanite': ['pianiste', 'pisanite'], 'piscation': ['panoistic', 'piscation'], 'piscatorial': ['paracolitis', 'piscatorial'], 'piscian': ['panisic', 'piscian', 'piscina', 'sinapic'], 'pisciferous': ['pisciferous', 'spiciferous'], 'pisciform': ['pisciform', 'spiciform'], 'piscina': ['panisic', 'piscian', 'piscina', 'sinapic'], 'pisco': ['copis', 'pisco'], 'pise': ['pise', 'sipe'], 'pish': ['pish', 'ship'], 'pisk': ['pisk', 'skip'], 'pisky': ['pisky', 'spiky'], 'pismire': ['pismire', 'primsie'], 'pisonia': ['pisonia', 'sinopia'], 'pist': ['pist', 'spit'], 'pistache': ['paschite', 'pastiche', 'pistache', 'scaphite'], 'pistacite': ['epistatic', 'pistacite'], 'pistareen': ['pistareen', 'sparteine'], 'pistillar': ['pillarist', 'pistillar'], 'pistillary': ['pistillary', 'spiritally'], 'pistle': ['pistle', 'stipel'], 'pistol': ['pistol', 'postil', 'spoilt'], 'pistoleer': ['epistoler', 'peristole', 'perseitol', 'pistoleer'], 'pit': ['pit', 'tip'], 'pita': ['atip', 'pita'], 'pitapat': ['apitpat', 'pitapat'], 'pitarah': ['pitarah', 'taphria'], 'pitcher': ['pitcher', 'repitch'], 'pitchout': ['outpitch', 'pitchout'], 'pitchy': ['phytic', 'pitchy', 'pythic', 'typhic'], 'pith': ['phit', 'pith'], 'pithecan': ['haptenic', 'pantheic', 'pithecan'], 'pithole': ['hoplite', 'pithole'], 'pithsome': ['mephisto', 'pithsome'], 'pitless': ['pitless', 'tipless'], 'pitman': ['pitman', 'tampin', 'tipman'], 'pittancer': ['crepitant', 'pittancer'], 'pittoid': ['pittoid', 'poditti'], 'pityroid': ['pityroid', 'pyritoid'], 'pivoter': ['overtip', 'pivoter'], 'placate': ['epactal', 'placate'], 'placation': ['pactional', 'pactolian', 'placation'], 'place': ['capel', 'place'], 'placebo': ['copable', 'placebo'], 'placentalia': ['analeptical', 'placentalia'], 'placentoma': ['complanate', 'placentoma'], 'placer': ['carpel', 'parcel', 'placer'], 'placode': ['lacepod', 'pedocal', 'placode'], 'placoid': ['placoid', 'podalic', 'podical'], 'placus': ['cuspal', 'placus'], 'plagionite': ['pigeontail', 'plagionite'], 'plague': ['plague', 'upgale'], 'plaguer': ['earplug', 'graupel', 'plaguer'], 'plaice': ['epical', 'piacle', 'plaice'], 'plaid': ['alpid', 'plaid'], 'plaidy': ['adipyl', 'plaidy'], 'plain': ['lipan', 'pinal', 'plain'], 'plainer': ['pearlin', 'plainer', 'praline'], 'plaint': ['plaint', 'pliant'], 'plaister': ['epistlar', 'pilaster', 'plaister', 'priestal'], 'plaited': ['plaited', 'taliped'], 'plaiter': ['partile', 'plaiter', 'replait'], 'planate': ['planate', 'planeta', 'plantae', 'platane'], 'planation': ['planation', 'platonian'], 'plancheite': ['elephantic', 'plancheite'], 'plane': ['alpen', 'nepal', 'panel', 'penal', 'plane'], 'planer': ['parnel', 'planer', 'replan'], 'planera': ['planera', 'preanal'], 'planet': ['pantle', 'planet', 'platen'], 'planeta': ['planate', 'planeta', 'plantae', 'platane'], 'planetabler': ['planetabler', 'replantable'], 'planetaria': ['parentalia', 'planetaria'], 'planetoid': ['pelidnota', 'planetoid'], 'planity': ['inaptly', 'planity', 'ptyalin'], 'planker': ['planker', 'prankle'], 'planta': ['planta', 'platan'], 'plantae': ['planate', 'planeta', 'plantae', 'platane'], 'planter': ['pantler', 'planter', 'replant'], 'plap': ['lapp', 'palp', 'plap'], 'plasher': ['plasher', 'spheral'], 'plasm': ['plasm', 'psalm', 'slamp'], 'plasma': ['lampas', 'plasma'], 'plasmation': ['aminoplast', 'plasmation'], 'plasmic': ['plasmic', 'psalmic'], 'plasmode': ['malposed', 'plasmode'], 'plasmodial': ['plasmodial', 'psalmodial'], 'plasmodic': ['plasmodic', 'psalmodic'], 'plasson': ['plasson', 'sponsal'], 'plastein': ['panelist', 'pantelis', 'penalist', 'plastein'], 'plaster': ['palster', 'persalt', 'plaster', 'psalter', 'spartle', 'stapler'], 'plasterer': ['plasterer', 'replaster'], 'plastery': ['plastery', 'psaltery'], 'plasticine': ['cisplatine', 'plasticine'], 'plastidome': ['plastidome', 'postmedial'], 'plastinoid': ['palinodist', 'plastinoid'], 'plastochrone': ['phrenocostal', 'plastochrone'], 'plat': ['palt', 'plat'], 'plataean': ['panatela', 'plataean'], 'platan': ['planta', 'platan'], 'platane': ['planate', 'planeta', 'plantae', 'platane'], 'plate': ['leapt', 'palet', 'patel', 'pelta', 'petal', 'plate', 'pleat', 'tepal'], 'platea': ['aletap', 'palate', 'platea'], 'plateless': ['petalless', 'plateless', 'pleatless'], 'platelet': ['pallette', 'platelet'], 'platelike': ['petallike', 'platelike'], 'platen': ['pantle', 'planet', 'platen'], 'plater': ['palter', 'plater'], 'platerer': ['palterer', 'platerer'], 'platery': ['apertly', 'peartly', 'platery', 'pteryla', 'taperly'], 'platine': ['pantile', 'pentail', 'platine', 'talpine'], 'platinochloric': ['chloroplatinic', 'platinochloric'], 'platinous': ['platinous', 'pulsation'], 'platode': ['platode', 'tadpole'], 'platoid': ['platoid', 'talpoid'], 'platonian': ['planation', 'platonian'], 'platter': ['partlet', 'platter', 'prattle'], 'platy': ['aptly', 'patly', 'platy', 'typal'], 'platynite': ['patiently', 'platynite'], 'platysternal': ['platysternal', 'transeptally'], 'plaud': ['dupla', 'plaud'], 'plaustral': ['palustral', 'plaustral'], 'play': ['paly', 'play', 'pyal', 'pyla'], 'playa': ['palay', 'playa'], 'player': ['parley', 'pearly', 'player', 'replay'], 'playgoer': ['playgoer', 'pylagore'], 'playroom': ['myopolar', 'playroom'], 'plea': ['leap', 'lepa', 'pale', 'peal', 'plea'], 'pleach': ['chapel', 'lepcha', 'pleach'], 'plead': ['padle', 'paled', 'pedal', 'plead'], 'pleader': ['pearled', 'pedaler', 'pleader', 'replead'], 'please': ['asleep', 'elapse', 'please'], 'pleaser': ['pleaser', 'preseal', 'relapse'], 'pleasure': ['pleasure', 'serpulae'], 'pleasurer': ['pleasurer', 'reperusal'], 'pleasurous': ['asperulous', 'pleasurous'], 'pleat': ['leapt', 'palet', 'patel', 'pelta', 'petal', 'plate', 'pleat', 'tepal'], 'pleater': ['pearlet', 'pleater', 'prelate', 'ptereal', 'replate', 'repleat'], 'pleatless': ['petalless', 'plateless', 'pleatless'], 'plectre': ['plectre', 'prelect'], 'pleion': ['pinole', 'pleion'], 'pleionian': ['opalinine', 'pleionian'], 'plenilunar': ['plenilunar', 'plurennial'], 'plenty': ['pentyl', 'plenty'], 'pleomorph': ['pleomorph', 'prophloem'], 'pleon': ['pelon', 'pleon'], 'pleonal': ['pallone', 'pleonal'], 'pleonasm': ['neoplasm', 'pleonasm', 'polesman', 'splenoma'], 'pleonast': ['lapstone', 'pleonast'], 'pleonastic': ['neoplastic', 'pleonastic'], 'pleroma': ['leproma', 'palermo', 'pleroma', 'polearm'], 'plerosis': ['leprosis', 'plerosis'], 'plerotic': ['petrolic', 'plerotic'], 'plessor': ['plessor', 'preloss'], 'plethora': ['plethora', 'traphole'], 'plethoric': ['phloretic', 'plethoric'], 'pleura': ['epural', 'perula', 'pleura'], 'pleuric': ['luperci', 'pleuric'], 'pleuropericardial': ['pericardiopleural', 'pleuropericardial'], 'pleurotoma': ['pleurotoma', 'tropaeolum'], 'pleurovisceral': ['pleurovisceral', 'visceropleural'], 'pliancy': ['pliancy', 'pycnial'], 'pliant': ['plaint', 'pliant'], 'plica': ['pical', 'plica'], 'plicately': ['callitype', 'plicately'], 'plicater': ['particle', 'plicater', 'prelatic'], 'plicator': ['plicator', 'tropical'], 'plied': ['piled', 'plied'], 'plier': ['peril', 'piler', 'plier'], 'pliers': ['lisper', 'pliers', 'sirple', 'spiler'], 'plies': ['piles', 'plies', 'slipe', 'spiel', 'spile'], 'plighter': ['plighter', 'replight'], 'plim': ['limp', 'pilm', 'plim'], 'pliny': ['pinyl', 'pliny'], 'pliosaur': ['liparous', 'pliosaur'], 'pliosauridae': ['lepidosauria', 'pliosauridae'], 'ploceidae': ['adipocele', 'cepolidae', 'ploceidae'], 'ploceus': ['culpose', 'ploceus', 'upclose'], 'plodder': ['plodder', 'proddle'], 'ploima': ['lipoma', 'pimola', 'ploima'], 'ploration': ['ploration', 'portional', 'prolation'], 'plot': ['plot', 'polt'], 'plotful': ['plotful', 'topfull'], 'plotted': ['plotted', 'pottled'], 'plotter': ['plotter', 'portlet'], 'plousiocracy': ['plousiocracy', 'procaciously'], 'plout': ['plout', 'pluto', 'poult'], 'plouter': ['plouter', 'poulter'], 'plovery': ['overply', 'plovery'], 'plower': ['plower', 'replow'], 'ploy': ['ploy', 'poly'], 'plucker': ['plucker', 'puckrel'], 'plug': ['gulp', 'plug'], 'plum': ['lump', 'plum'], 'pluma': ['ampul', 'pluma'], 'plumbagine': ['impugnable', 'plumbagine'], 'plumbic': ['plumbic', 'upclimb'], 'plumed': ['dumple', 'plumed'], 'plumeous': ['eumolpus', 'plumeous'], 'plumer': ['lumper', 'plumer', 'replum', 'rumple'], 'plumet': ['lumpet', 'plumet'], 'pluminess': ['lumpiness', 'pluminess'], 'plumy': ['lumpy', 'plumy'], 'plunderer': ['plunderer', 'replunder'], 'plunge': ['plunge', 'pungle'], 'plup': ['plup', 'pulp'], 'plurennial': ['plenilunar', 'plurennial'], 'pluriseptate': ['perpetualist', 'pluriseptate'], 'plutean': ['plutean', 'unpetal', 'unpleat'], 'pluteus': ['pluteus', 'pustule'], 'pluto': ['plout', 'pluto', 'poult'], 'pluvine': ['pluvine', 'vulpine'], 'plyer': ['plyer', 'reply'], 'pneumatophony': ['pneumatophony', 'pneumonopathy'], 'pneumohemothorax': ['hemopneumothorax', 'pneumohemothorax'], 'pneumohydropericardium': ['hydropneumopericardium', 'pneumohydropericardium'], 'pneumohydrothorax': ['hydropneumothorax', 'pneumohydrothorax'], 'pneumonopathy': ['pneumatophony', 'pneumonopathy'], 'pneumopyothorax': ['pneumopyothorax', 'pyopneumothorax'], 'poach': ['chopa', 'phoca', 'poach'], 'poachy': ['poachy', 'pochay'], 'poales': ['aslope', 'poales'], 'pob': ['bop', 'pob'], 'pochay': ['poachy', 'pochay'], 'poche': ['epoch', 'poche'], 'pocketer': ['pocketer', 'repocket'], 'poco': ['coop', 'poco'], 'pocosin': ['opsonic', 'pocosin'], 'poculation': ['copulation', 'poculation'], 'pod': ['dop', 'pod'], 'podalic': ['placoid', 'podalic', 'podical'], 'podarthritis': ['podarthritis', 'traditorship'], 'podial': ['podial', 'poliad'], 'podical': ['placoid', 'podalic', 'podical'], 'podiceps': ['podiceps', 'scopiped'], 'podite': ['pioted', 'podite'], 'poditti': ['pittoid', 'poditti'], 'podler': ['podler', 'polder', 'replod'], 'podley': ['deploy', 'podley'], 'podobranchia': ['branchiopoda', 'podobranchia'], 'podocephalous': ['cephalopodous', 'podocephalous'], 'podophyllous': ['phyllopodous', 'podophyllous'], 'podoscaph': ['podoscaph', 'scaphopod'], 'podostomata': ['podostomata', 'stomatopoda'], 'podostomatous': ['podostomatous', 'stomatopodous'], 'podotheca': ['chaetopod', 'podotheca'], 'podura': ['podura', 'uproad'], 'poduran': ['pandour', 'poduran'], 'poe': ['ope', 'poe'], 'poem': ['mope', 'poem', 'pome'], 'poemet': ['metope', 'poemet'], 'poemlet': ['leptome', 'poemlet'], 'poesy': ['poesy', 'posey', 'sepoy'], 'poet': ['peto', 'poet', 'pote', 'tope'], 'poetastrical': ['poetastrical', 'spectatorial'], 'poetical': ['copalite', 'poetical'], 'poeticism': ['impeticos', 'poeticism'], 'poetics': ['poetics', 'septoic'], 'poetly': ['peyotl', 'poetly'], 'poetryless': ['poetryless', 'presystole'], 'pogo': ['goop', 'pogo'], 'poh': ['hop', 'pho', 'poh'], 'poha': ['opah', 'paho', 'poha'], 'pohna': ['phano', 'pohna'], 'poiana': ['anopia', 'aponia', 'poiana'], 'poietic': ['epiotic', 'poietic'], 'poimenic': ['mincopie', 'poimenic'], 'poinder': ['poinder', 'ponerid'], 'point': ['pinto', 'point'], 'pointel': ['pointel', 'pontile', 'topline'], 'pointer': ['pointer', 'protein', 'pterion', 'repoint', 'tropine'], 'pointlet': ['pentitol', 'pointlet'], 'pointrel': ['pointrel', 'terpinol'], 'poisonless': ['poisonless', 'solenopsis'], 'poker': ['poker', 'proke'], 'pol': ['lop', 'pol'], 'polab': ['pablo', 'polab'], 'polacre': ['capreol', 'polacre'], 'polander': ['polander', 'ponderal', 'prenodal'], 'polar': ['parol', 'polar', 'poral', 'proal'], 'polarid': ['dipolar', 'polarid'], 'polarimetry': ['polarimetry', 'premorality', 'temporarily'], 'polaristic': ['polaristic', 'poristical', 'saprolitic'], 'polarly': ['payroll', 'polarly'], 'polder': ['podler', 'polder', 'replod'], 'pole': ['lope', 'olpe', 'pole'], 'polearm': ['leproma', 'palermo', 'pleroma', 'polearm'], 'polecat': ['pacolet', 'polecat'], 'polemic': ['compile', 'polemic'], 'polemics': ['clipsome', 'polemics'], 'polemist': ['milepost', 'polemist'], 'polenta': ['lepanto', 'nepotal', 'petalon', 'polenta'], 'poler': ['loper', 'poler'], 'polesman': ['neoplasm', 'pleonasm', 'polesman', 'splenoma'], 'polestar': ['petrosal', 'polestar'], 'poliad': ['podial', 'poliad'], 'polianite': ['epilation', 'polianite'], 'policyholder': ['policyholder', 'polychloride'], 'polio': ['polio', 'pooli'], 'polis': ['polis', 'spoil'], 'polished': ['depolish', 'polished'], 'polisher': ['polisher', 'repolish'], 'polistes': ['polistes', 'telopsis'], 'politarch': ['carpolith', 'politarch', 'trophical'], 'politicly': ['lipolytic', 'politicly'], 'politics': ['colpitis', 'politics', 'psilotic'], 'polk': ['klop', 'polk'], 'pollenite': ['pellotine', 'pollenite'], 'poller': ['poller', 'repoll'], 'pollinate': ['pellation', 'pollinate'], 'polo': ['loop', 'polo', 'pool'], 'poloist': ['loopist', 'poloist', 'topsoil'], 'polonia': ['apionol', 'polonia'], 'polos': ['polos', 'sloop', 'spool'], 'polt': ['plot', 'polt'], 'poly': ['ploy', 'poly'], 'polyacid': ['polyacid', 'polyadic'], 'polyactinal': ['pactionally', 'polyactinal'], 'polyadic': ['polyacid', 'polyadic'], 'polyarchist': ['chiroplasty', 'polyarchist'], 'polychloride': ['policyholder', 'polychloride'], 'polychroism': ['polychroism', 'polyorchism'], 'polycitral': ['polycitral', 'tropically'], 'polycodium': ['lycopodium', 'polycodium'], 'polycotyl': ['collotypy', 'polycotyl'], 'polyeidic': ['polyeidic', 'polyideic'], 'polyeidism': ['polyeidism', 'polyideism'], 'polyester': ['polyester', 'proselyte'], 'polygamodioecious': ['dioeciopolygamous', 'polygamodioecious'], 'polyhalite': ['paleolithy', 'polyhalite', 'polythelia'], 'polyideic': ['polyeidic', 'polyideic'], 'polyideism': ['polyeidism', 'polyideism'], 'polymastic': ['myoplastic', 'polymastic'], 'polymasty': ['myoplasty', 'polymasty'], 'polymere': ['employer', 'polymere'], 'polymeric': ['micropyle', 'polymeric'], 'polymetochia': ['homeotypical', 'polymetochia'], 'polymnia': ['olympian', 'polymnia'], 'polymyodi': ['polymyodi', 'polymyoid'], 'polymyoid': ['polymyodi', 'polymyoid'], 'polyorchism': ['polychroism', 'polyorchism'], 'polyp': ['loppy', 'polyp'], 'polyphemian': ['lymphopenia', 'polyphemian'], 'polyphonist': ['polyphonist', 'psilophyton'], 'polypite': ['lipotype', 'polypite'], 'polyprene': ['polyprene', 'propylene'], 'polypterus': ['polypterus', 'suppletory'], 'polysomitic': ['myocolpitis', 'polysomitic'], 'polyspore': ['polyspore', 'prosopyle'], 'polythelia': ['paleolithy', 'polyhalite', 'polythelia'], 'polythene': ['polythene', 'telephony'], 'polyuric': ['croupily', 'polyuric'], 'pom': ['mop', 'pom'], 'pomade': ['apedom', 'pomade'], 'pomane': ['mopane', 'pomane'], 'pome': ['mope', 'poem', 'pome'], 'pomeranian': ['pomeranian', 'praenomina'], 'pomerium': ['emporium', 'pomerium', 'proemium'], 'pomey': ['myope', 'pomey'], 'pomo': ['moop', 'pomo'], 'pomonal': ['lampoon', 'pomonal'], 'pompilus': ['pimplous', 'pompilus', 'populism'], 'pomster': ['pomster', 'stomper'], 'ponca': ['capon', 'ponca'], 'ponce': ['copen', 'ponce'], 'ponchoed': ['chenopod', 'ponchoed'], 'poncirus': ['coprinus', 'poncirus'], 'ponderal': ['polander', 'ponderal', 'prenodal'], 'ponderate': ['ponderate', 'predonate'], 'ponderation': ['ponderation', 'predonation'], 'ponderer': ['ponderer', 'reponder'], 'pondfish': ['fishpond', 'pondfish'], 'pone': ['nope', 'open', 'peon', 'pone'], 'ponerid': ['poinder', 'ponerid'], 'poneroid': ['poneroid', 'porodine'], 'poney': ['peony', 'poney'], 'ponica': ['aponic', 'ponica'], 'ponier': ['opiner', 'orpine', 'ponier'], 'pontederia': ['pontederia', 'proteidean'], 'pontee': ['nepote', 'pontee', 'poteen'], 'pontes': ['pontes', 'posnet'], 'ponticular': ['ponticular', 'untropical'], 'pontificalia': ['palification', 'pontificalia'], 'pontile': ['pointel', 'pontile', 'topline'], 'pontonier': ['entropion', 'pontonier', 'prenotion'], 'pontus': ['pontus', 'unspot', 'unstop'], 'pooch': ['choop', 'pooch'], 'pooh': ['hoop', 'phoo', 'pooh'], 'pooka': ['oopak', 'pooka'], 'pool': ['loop', 'polo', 'pool'], 'pooler': ['looper', 'pooler'], 'pooli': ['polio', 'pooli'], 'pooly': ['loopy', 'pooly'], 'poon': ['noop', 'poon'], 'poonac': ['acopon', 'poonac'], 'poonga': ['apogon', 'poonga'], 'poor': ['poor', 'proo'], 'poot': ['poot', 'toop', 'topo'], 'pope': ['pepo', 'pope'], 'popeler': ['peopler', 'popeler'], 'popery': ['popery', 'pyrope'], 'popgun': ['oppugn', 'popgun'], 'popian': ['oppian', 'papion', 'popian'], 'popish': ['popish', 'shippo'], 'popliteal': ['papillote', 'popliteal'], 'poppel': ['poppel', 'popple'], 'popple': ['poppel', 'popple'], 'populism': ['pimplous', 'pompilus', 'populism'], 'populus': ['populus', 'pulpous'], 'poral': ['parol', 'polar', 'poral', 'proal'], 'porcate': ['coperta', 'pectora', 'porcate'], 'porcelain': ['oliprance', 'porcelain'], 'porcelanite': ['porcelanite', 'praelection'], 'porcula': ['copular', 'croupal', 'cupolar', 'porcula'], 'pore': ['pore', 'rope'], 'pored': ['doper', 'pedro', 'pored'], 'porelike': ['porelike', 'ropelike'], 'porer': ['porer', 'prore', 'roper'], 'porge': ['grope', 'porge'], 'porger': ['groper', 'porger'], 'poriness': ['poriness', 'pression', 'ropiness'], 'poring': ['poring', 'roping'], 'poristical': ['polaristic', 'poristical', 'saprolitic'], 'porites': ['periost', 'porites', 'reposit', 'riposte'], 'poritidae': ['poritidae', 'triopidae'], 'porker': ['porker', 'proker'], 'pornerastic': ['cotranspire', 'pornerastic'], 'porodine': ['poneroid', 'porodine'], 'poros': ['poros', 'proso', 'sopor', 'spoor'], 'porosity': ['isotropy', 'porosity'], 'porotic': ['porotic', 'portico'], 'porpentine': ['porpentine', 'prepontine'], 'porphine': ['hornpipe', 'porphine'], 'porphyrous': ['porphyrous', 'pyrophorus'], 'porrection': ['correption', 'porrection'], 'porret': ['porret', 'porter', 'report', 'troper'], 'porta': ['aport', 'parto', 'porta'], 'portail': ['portail', 'toprail'], 'portal': ['patrol', 'portal', 'tropal'], 'portance': ['coparent', 'portance'], 'ported': ['deport', 'ported', 'redtop'], 'portend': ['portend', 'protend'], 'porteno': ['porteno', 'protone'], 'portension': ['portension', 'protension'], 'portent': ['portent', 'torpent'], 'portentous': ['notopterus', 'portentous'], 'porter': ['porret', 'porter', 'report', 'troper'], 'porterage': ['porterage', 'reportage'], 'portership': ['portership', 'pretorship'], 'portfire': ['portfire', 'profiter'], 'portia': ['portia', 'tapiro'], 'portico': ['porotic', 'portico'], 'portify': ['portify', 'torpify'], 'portional': ['ploration', 'portional', 'prolation'], 'portioner': ['portioner', 'reportion'], 'portlet': ['plotter', 'portlet'], 'portly': ['portly', 'protyl', 'tropyl'], 'porto': ['porto', 'proto', 'troop'], 'portoise': ['isotrope', 'portoise'], 'portolan': ['portolan', 'pronotal'], 'portor': ['portor', 'torpor'], 'portray': ['parroty', 'portray', 'tropary'], 'portrayal': ['parlatory', 'portrayal'], 'portside': ['dipteros', 'portside'], 'portsider': ['portsider', 'postrider'], 'portunidae': ['depuration', 'portunidae'], 'portunus': ['outspurn', 'portunus'], 'pory': ['pory', 'pyro', 'ropy'], 'posca': ['posca', 'scopa'], 'pose': ['epos', 'peso', 'pose', 'sope'], 'poser': ['poser', 'prose', 'ropes', 'spore'], 'poseur': ['poseur', 'pouser', 'souper', 'uprose'], 'posey': ['poesy', 'posey', 'sepoy'], 'posh': ['phos', 'posh', 'shop', 'soph'], 'posingly': ['posingly', 'spongily'], 'position': ['position', 'sopition'], 'positional': ['positional', 'spoilation', 'spoliation'], 'positioned': ['deposition', 'positioned'], 'positioner': ['positioner', 'reposition'], 'positron': ['notropis', 'positron', 'sorption'], 'positum': ['positum', 'utopism'], 'posnet': ['pontes', 'posnet'], 'posse': ['posse', 'speos'], 'possessioner': ['possessioner', 'repossession'], 'post': ['post', 'spot', 'stop', 'tops'], 'postage': ['gestapo', 'postage'], 'postaortic': ['parostotic', 'postaortic'], 'postdate': ['despotat', 'postdate'], 'posted': ['despot', 'posted'], 'posteen': ['pentose', 'posteen'], 'poster': ['poster', 'presto', 'repost', 'respot', 'stoper'], 'posterial': ['posterial', 'saprolite'], 'posterior': ['posterior', 'repositor'], 'posterish': ['posterish', 'prothesis', 'sophister', 'storeship', 'tephrosis'], 'posteroinferior': ['inferoposterior', 'posteroinferior'], 'posterosuperior': ['posterosuperior', 'superoposterior'], 'postgenial': ['postgenial', 'spangolite'], 'posthaste': ['posthaste', 'tosephtas'], 'postic': ['copist', 'coptis', 'optics', 'postic'], 'postical': ['postical', 'slipcoat'], 'postil': ['pistol', 'postil', 'spoilt'], 'posting': ['posting', 'stoping'], 'postischial': ['postischial', 'sophistical'], 'postless': ['postless', 'spotless', 'stopless'], 'postlike': ['postlike', 'spotlike'], 'postman': ['postman', 'topsman'], 'postmedial': ['plastidome', 'postmedial'], 'postnaris': ['postnaris', 'sopranist'], 'postnominal': ['monoplanist', 'postnominal'], 'postrider': ['portsider', 'postrider'], 'postsacral': ['postsacral', 'sarcoplast'], 'postsign': ['postsign', 'signpost'], 'postthoracic': ['octastrophic', 'postthoracic'], 'postulata': ['autoplast', 'postulata'], 'postural': ['postural', 'pulsator', 'sportula'], 'posture': ['petrous', 'posture', 'proetus', 'proteus', 'septuor', 'spouter'], 'posturer': ['posturer', 'resprout', 'sprouter'], 'postuterine': ['postuterine', 'pretentious'], 'postwar': ['postwar', 'sapwort'], 'postward': ['drawstop', 'postward'], 'postwoman': ['postwoman', 'womanpost'], 'posy': ['opsy', 'posy'], 'pot': ['opt', 'pot', 'top'], 'potable': ['optable', 'potable'], 'potableness': ['optableness', 'potableness'], 'potash': ['pashto', 'pathos', 'potash'], 'potass': ['potass', 'topass'], 'potate': ['aptote', 'optate', 'potate', 'teapot'], 'potation': ['optation', 'potation'], 'potative': ['optative', 'potative'], 'potator': ['potator', 'taproot'], 'pote': ['peto', 'poet', 'pote', 'tope'], 'poteen': ['nepote', 'pontee', 'poteen'], 'potential': ['peltation', 'potential'], 'poter': ['poter', 'prote', 'repot', 'tepor', 'toper', 'trope'], 'poteye': ['peyote', 'poteye'], 'pothouse': ['housetop', 'pothouse'], 'poticary': ['cyrtopia', 'poticary'], 'potifer': ['firetop', 'potifer'], 'potion': ['option', 'potion'], 'potlatch': ['potlatch', 'tolpatch'], 'potlike': ['kitlope', 'potlike', 'toplike'], 'potmaker': ['potmaker', 'topmaker'], 'potmaking': ['potmaking', 'topmaking'], 'potman': ['potman', 'tampon', 'topman'], 'potometer': ['optometer', 'potometer'], 'potstick': ['potstick', 'tipstock'], 'potstone': ['potstone', 'topstone'], 'pottled': ['plotted', 'pottled'], 'pouce': ['coupe', 'pouce'], 'poucer': ['couper', 'croupe', 'poucer', 'recoup'], 'pouch': ['choup', 'pouch'], 'poulpe': ['poulpe', 'pupelo'], 'poult': ['plout', 'pluto', 'poult'], 'poulter': ['plouter', 'poulter'], 'poultice': ['epulotic', 'poultice'], 'pounce': ['pounce', 'uncope'], 'pounder': ['pounder', 'repound', 'unroped'], 'pour': ['pour', 'roup'], 'pourer': ['pourer', 'repour', 'rouper'], 'pouser': ['poseur', 'pouser', 'souper', 'uprose'], 'pout': ['pout', 'toup'], 'pouter': ['pouter', 'roupet', 'troupe'], 'pow': ['pow', 'wop'], 'powder': ['powder', 'prowed'], 'powderer': ['powderer', 'repowder'], 'powerful': ['powerful', 'upflower'], 'praam': ['param', 'parma', 'praam'], 'practitional': ['antitropical', 'practitional'], 'prad': ['pard', 'prad'], 'pradeep': ['papered', 'pradeep'], 'praecox': ['exocarp', 'praecox'], 'praelabrum': ['praelabrum', 'preambular'], 'praelection': ['porcelanite', 'praelection'], 'praelector': ['praelector', 'receptoral'], 'praenomina': ['pomeranian', 'praenomina'], 'praepostor': ['praepostor', 'pterospora'], 'praesphenoid': ['nephropsidae', 'praesphenoid'], 'praetor': ['praetor', 'prorate'], 'praetorian': ['praetorian', 'reparation'], 'praise': ['aspire', 'paries', 'praise', 'sirpea', 'spirea'], 'praiser': ['aspirer', 'praiser', 'serpari'], 'praising': ['aspiring', 'praising', 'singarip'], 'praisingly': ['aspiringly', 'praisingly'], 'praline': ['pearlin', 'plainer', 'praline'], 'pram': ['pram', 'ramp'], 'prandial': ['diplanar', 'prandial'], 'prankle': ['planker', 'prankle'], 'prase': ['asper', 'parse', 'prase', 'spaer', 'spare', 'spear'], 'praseolite': ['periosteal', 'praseolite'], 'prasine': ['persian', 'prasine', 'saprine'], 'prasinous': ['prasinous', 'psaronius'], 'prasoid': ['prasoid', 'sparoid'], 'prasophagous': ['prasophagous', 'saprophagous'], 'prat': ['part', 'prat', 'rapt', 'tarp', 'trap'], 'prate': ['apert', 'pater', 'peart', 'prate', 'taper', 'terap'], 'prater': ['parter', 'prater'], 'pratey': ['petary', 'pratey'], 'pratfall': ['pratfall', 'trapfall'], 'pratincoline': ['nonpearlitic', 'pratincoline'], 'pratincolous': ['patroclinous', 'pratincolous'], 'prattle': ['partlet', 'platter', 'prattle'], 'prau': ['prau', 'rupa'], 'prawner': ['prawner', 'prewarn'], 'prayer': ['prayer', 'repray'], 'preach': ['aperch', 'eparch', 'percha', 'preach'], 'preacher': ['preacher', 'repreach'], 'preaching': ['engraphic', 'preaching'], 'preachman': ['marchpane', 'preachman'], 'preachy': ['eparchy', 'preachy'], 'preacid': ['epacrid', 'peracid', 'preacid'], 'preact': ['carpet', 'peract', 'preact'], 'preaction': ['preaction', 'precation', 'recaption'], 'preactive': ['preactive', 'precative'], 'preactively': ['preactively', 'precatively'], 'preacute': ['peracute', 'preacute'], 'preadmonition': ['demipronation', 'preadmonition', 'predomination'], 'preadorn': ['pardoner', 'preadorn'], 'preadventure': ['peradventure', 'preadventure'], 'preallably': ['ballplayer', 'preallably'], 'preallow': ['preallow', 'walloper'], 'preamble': ['peramble', 'preamble'], 'preambular': ['praelabrum', 'preambular'], 'preambulate': ['perambulate', 'preambulate'], 'preambulation': ['perambulation', 'preambulation'], 'preambulatory': ['perambulatory', 'preambulatory'], 'preanal': ['planera', 'preanal'], 'prearm': ['prearm', 'ramper'], 'preascitic': ['accipitres', 'preascitic'], 'preauditory': ['preauditory', 'repudiatory'], 'prebacillary': ['bicarpellary', 'prebacillary'], 'prebasal': ['parsable', 'prebasal', 'sparable'], 'prebend': ['perbend', 'prebend'], 'prebeset': ['bepester', 'prebeset'], 'prebid': ['bedrip', 'prebid'], 'precant': ['carpent', 'precant'], 'precantation': ['actinopteran', 'precantation'], 'precast': ['precast', 'spectra'], 'precation': ['preaction', 'precation', 'recaption'], 'precative': ['preactive', 'precative'], 'precatively': ['preactively', 'precatively'], 'precaution': ['precaution', 'unoperatic'], 'precautional': ['inoperculata', 'precautional'], 'precedable': ['deprecable', 'precedable'], 'preceder': ['preceder', 'precreed'], 'precent': ['percent', 'precent'], 'precept': ['percept', 'precept'], 'preception': ['perception', 'preception'], 'preceptive': ['perceptive', 'preceptive'], 'preceptively': ['perceptively', 'preceptively'], 'preceptual': ['perceptual', 'preceptual'], 'preceptually': ['perceptually', 'preceptually'], 'prechloric': ['perchloric', 'prechloric'], 'prechoose': ['prechoose', 'rheoscope'], 'precipitate': ['peripatetic', 'precipitate'], 'precipitator': ['precipitator', 'prepatriotic'], 'precis': ['crepis', 'cripes', 'persic', 'precis', 'spicer'], 'precise': ['precise', 'scripee'], 'precisian': ['periscian', 'precisian'], 'precision': ['coinspire', 'precision'], 'precitation': ['actinopteri', 'crepitation', 'precitation'], 'precite': ['ereptic', 'precite', 'receipt'], 'precited': ['decrepit', 'depicter', 'precited'], 'preclose': ['perclose', 'preclose'], 'preclusion': ['perculsion', 'preclusion'], 'preclusive': ['perculsive', 'preclusive'], 'precoil': ['peloric', 'precoil'], 'precompound': ['percompound', 'precompound'], 'precondense': ['precondense', 'respondence'], 'preconnubial': ['preconnubial', 'pronunciable'], 'preconsole': ['necropoles', 'preconsole'], 'preconsultor': ['preconsultor', 'supercontrol'], 'precontest': ['precontest', 'torpescent'], 'precopy': ['coppery', 'precopy'], 'precostal': ['ceroplast', 'precostal'], 'precredit': ['precredit', 'predirect', 'repredict'], 'precreditor': ['precreditor', 'predirector'], 'precreed': ['preceder', 'precreed'], 'precurrent': ['percurrent', 'precurrent'], 'precursory': ['percursory', 'precursory'], 'precyst': ['precyst', 'sceptry', 'spectry'], 'predata': ['adapter', 'predata', 'readapt'], 'predate': ['padtree', 'predate', 'tapered'], 'predatism': ['predatism', 'spermatid'], 'predative': ['deprivate', 'predative'], 'predator': ['predator', 'protrade', 'teardrop'], 'preday': ['pedary', 'preday'], 'predealer': ['predealer', 'repleader'], 'predecree': ['creepered', 'predecree'], 'predefect': ['perfected', 'predefect'], 'predeication': ['depreciation', 'predeication'], 'prederive': ['prederive', 'redeprive'], 'predespair': ['disprepare', 'predespair'], 'predestine': ['predestine', 'presidente'], 'predetail': ['pedaliter', 'predetail'], 'predevotion': ['overpointed', 'predevotion'], 'predial': ['pedrail', 'predial'], 'prediastolic': ['prediastolic', 'psiloceratid'], 'predication': ['predication', 'procidentia'], 'predictory': ['cryptodire', 'predictory'], 'predirect': ['precredit', 'predirect', 'repredict'], 'predirector': ['precreditor', 'predirector'], 'prediscretion': ['prediscretion', 'redescription'], 'predislike': ['predislike', 'spiderlike'], 'predivinable': ['indeprivable', 'predivinable'], 'predominate': ['pentameroid', 'predominate'], 'predomination': ['demipronation', 'preadmonition', 'predomination'], 'predonate': ['ponderate', 'predonate'], 'predonation': ['ponderation', 'predonation'], 'predoubter': ['predoubter', 'preobtrude'], 'predrive': ['depriver', 'predrive'], 'preen': ['neper', 'preen', 'repen'], 'prefactor': ['aftercrop', 'prefactor'], 'prefator': ['forepart', 'prefator'], 'prefavorite': ['perforative', 'prefavorite'], 'prefect': ['perfect', 'prefect'], 'prefectly': ['perfectly', 'prefectly'], 'prefervid': ['perfervid', 'prefervid'], 'prefiction': ['prefiction', 'proficient'], 'prefoliation': ['perfoliation', 'prefoliation'], 'preform': ['perform', 'preform'], 'preformant': ['performant', 'preformant'], 'preformative': ['performative', 'preformative'], 'preformism': ['misperform', 'preformism'], 'pregainer': ['peregrina', 'pregainer'], 'prehandicap': ['handicapper', 'prehandicap'], 'prehaps': ['perhaps', 'prehaps'], 'prehazard': ['perhazard', 'prehazard'], 'preheal': ['preheal', 'rephael'], 'preheat': ['haptere', 'preheat'], 'preheated': ['heartdeep', 'preheated'], 'prehension': ['hesperinon', 'prehension'], 'prehnite': ['nephrite', 'prehnite', 'trephine'], 'prehnitic': ['nephritic', 'phrenitic', 'prehnitic'], 'prehuman': ['prehuman', 'unhamper'], 'preimpose': ['perispome', 'preimpose'], 'preindicate': ['parenticide', 'preindicate'], 'preinduce': ['preinduce', 'unpierced'], 'preintone': ['interpone', 'peritenon', 'pinnotere', 'preintone'], 'prelabrum': ['prelabrum', 'prelumbar'], 'prelacteal': ['carpellate', 'parcellate', 'prelacteal'], 'prelate': ['pearlet', 'pleater', 'prelate', 'ptereal', 'replate', 'repleat'], 'prelatehood': ['heteropodal', 'prelatehood'], 'prelatic': ['particle', 'plicater', 'prelatic'], 'prelatical': ['capitellar', 'prelatical'], 'prelation': ['prelation', 'rantipole'], 'prelatism': ['palmister', 'prelatism'], 'prelease': ['eelspear', 'prelease'], 'prelect': ['plectre', 'prelect'], 'prelection': ['perlection', 'prelection'], 'prelim': ['limper', 'prelim', 'rimple'], 'prelingual': ['perlingual', 'prelingual'], 'prelocate': ['percolate', 'prelocate'], 'preloss': ['plessor', 'preloss'], 'preludial': ['dipleural', 'preludial'], 'prelumbar': ['prelabrum', 'prelumbar'], 'prelusion': ['prelusion', 'repulsion'], 'prelusive': ['prelusive', 'repulsive'], 'prelusively': ['prelusively', 'repulsively'], 'prelusory': ['prelusory', 'repulsory'], 'premate': ['premate', 'tempera'], 'premedia': ['epiderma', 'premedia'], 'premedial': ['epidermal', 'impleader', 'premedial'], 'premedication': ['pedometrician', 'premedication'], 'premenace': ['permeance', 'premenace'], 'premerit': ['premerit', 'preremit', 'repermit'], 'premial': ['impaler', 'impearl', 'lempira', 'premial'], 'premiant': ['imperant', 'pairment', 'partimen', 'premiant', 'tripeman'], 'premiate': ['imperate', 'premiate'], 'premier': ['premier', 'reprime'], 'premious': ['imposure', 'premious'], 'premise': ['emprise', 'imprese', 'premise', 'spireme'], 'premiss': ['impress', 'persism', 'premiss'], 'premixture': ['permixture', 'premixture'], 'premodel': ['leperdom', 'premodel'], 'premolar': ['premolar', 'premoral'], 'premold': ['meldrop', 'premold'], 'premonetary': ['premonetary', 'pyranometer'], 'premoral': ['premolar', 'premoral'], 'premorality': ['polarimetry', 'premorality', 'temporarily'], 'premosaic': ['paroecism', 'premosaic'], 'premover': ['premover', 'prevomer'], 'premusical': ['premusical', 'superclaim'], 'prenasal': ['pernasal', 'prenasal'], 'prenatal': ['parental', 'paternal', 'prenatal'], 'prenatalist': ['intraseptal', 'paternalist', 'prenatalist'], 'prenatally': ['parentally', 'paternally', 'prenatally'], 'prenative': ['interpave', 'prenative'], 'prender': ['prender', 'prendre'], 'prendre': ['prender', 'prendre'], 'prenodal': ['polander', 'ponderal', 'prenodal'], 'prenominical': ['nonempirical', 'prenominical'], 'prenotice': ['prenotice', 'reception'], 'prenotion': ['entropion', 'pontonier', 'prenotion'], 'prentice': ['piercent', 'prentice'], 'preobtrude': ['predoubter', 'preobtrude'], 'preocular': ['opercular', 'preocular'], 'preominate': ['permeation', 'preominate'], 'preopen': ['preopen', 'propene'], 'preopinion': ['preopinion', 'prionopine'], 'preoption': ['preoption', 'protopine'], 'preoral': ['peroral', 'preoral'], 'preorally': ['perorally', 'preorally'], 'prep': ['prep', 'repp'], 'prepalatine': ['periplaneta', 'prepalatine'], 'prepare': ['paperer', 'perpera', 'prepare', 'repaper'], 'prepatriotic': ['precipitator', 'prepatriotic'], 'prepay': ['papery', 'prepay', 'yapper'], 'preplot': ['preplot', 'toppler'], 'prepollent': ['prepollent', 'propellent'], 'prepontine': ['porpentine', 'prepontine'], 'prepositure': ['peripterous', 'prepositure'], 'prepuce': ['prepuce', 'upcreep'], 'prerational': ['prerational', 'proletarian'], 'prerealization': ['prerealization', 'proletarianize'], 'prereceive': ['prereceive', 'reperceive'], 'prerecital': ['perirectal', 'prerecital'], 'prereduction': ['interproduce', 'prereduction'], 'prerefer': ['prerefer', 'reprefer'], 'prereform': ['performer', 'prereform', 'reperform'], 'preremit': ['premerit', 'preremit', 'repermit'], 'prerental': ['prerental', 'replanter'], 'prerich': ['chirper', 'prerich'], 'preromantic': ['improcreant', 'preromantic'], 'presage': ['asperge', 'presage'], 'presager': ['asperger', 'presager'], 'presay': ['presay', 'speary'], 'prescapular': ['prescapular', 'supercarpal'], 'prescient': ['prescient', 'reinspect'], 'prescientific': ['interspecific', 'prescientific'], 'prescribe': ['perscribe', 'prescribe'], 'prescutal': ['prescutal', 'scalpture'], 'preseal': ['pleaser', 'preseal', 'relapse'], 'preseason': ['parsonese', 'preseason'], 'presell': ['presell', 'respell', 'speller'], 'present': ['penster', 'present', 'serpent', 'strepen'], 'presenter': ['presenter', 'represent'], 'presential': ['alpestrine', 'episternal', 'interlapse', 'presential'], 'presentist': ['persistent', 'presentist', 'prettiness'], 'presentive': ['presentive', 'pretensive', 'vespertine'], 'presentively': ['presentively', 'pretensively'], 'presentiveness': ['presentiveness', 'pretensiveness'], 'presently': ['presently', 'serpently'], 'preserve': ['perverse', 'preserve'], 'preset': ['pester', 'preset', 'restep', 'streep'], 'preshare': ['preshare', 'rephrase'], 'preship': ['preship', 'shipper'], 'preshortage': ['preshortage', 'stereograph'], 'preside': ['perseid', 'preside'], 'presidencia': ['acipenserid', 'presidencia'], 'president': ['president', 'serpentid'], 'presidente': ['predestine', 'presidente'], 'presider': ['presider', 'serriped'], 'presign': ['presign', 'springe'], 'presignal': ['espringal', 'presignal', 'relapsing'], 'presimian': ['mainprise', 'presimian'], 'presley': ['presley', 'sleepry'], 'presser': ['presser', 'repress'], 'pression': ['poriness', 'pression', 'ropiness'], 'pressive': ['pressive', 'viperess'], 'prest': ['prest', 'spret'], 'prestable': ['beplaster', 'prestable'], 'prestant': ['prestant', 'transept'], 'prestate': ['prestate', 'pretaste'], 'presto': ['poster', 'presto', 'repost', 'respot', 'stoper'], 'prestock': ['prestock', 'sprocket'], 'prestomial': ['peristomal', 'prestomial'], 'prestrain': ['prestrain', 'transpire'], 'presume': ['presume', 'supreme'], 'presurmise': ['impressure', 'presurmise'], 'presustain': ['presustain', 'puritaness', 'supersaint'], 'presystole': ['poetryless', 'presystole'], 'pretan': ['arpent', 'enrapt', 'entrap', 'panter', 'parent', 'pretan', 'trepan'], 'pretaste': ['prestate', 'pretaste'], 'pretensive': ['presentive', 'pretensive', 'vespertine'], 'pretensively': ['presentively', 'pretensively'], 'pretensiveness': ['presentiveness', 'pretensiveness'], 'pretentious': ['postuterine', 'pretentious'], 'pretercanine': ['irrepentance', 'pretercanine'], 'preterient': ['preterient', 'triterpene'], 'pretermit': ['permitter', 'pretermit'], 'pretheological': ['herpetological', 'pretheological'], 'pretibial': ['bipartile', 'pretibial'], 'pretonic': ['inceptor', 'pretonic'], 'pretorship': ['portership', 'pretorship'], 'pretrace': ['pretrace', 'recarpet'], 'pretracheal': ['archprelate', 'pretracheal'], 'pretrain': ['pretrain', 'terrapin'], 'pretransmission': ['pretransmission', 'transimpression'], 'pretreat': ['patterer', 'pretreat'], 'prettiness': ['persistent', 'presentist', 'prettiness'], 'prevailer': ['prevailer', 'reprieval'], 'prevalid': ['deprival', 'prevalid'], 'prevention': ['prevention', 'provenient'], 'preversion': ['perversion', 'preversion'], 'preveto': ['overpet', 'preveto', 'prevote'], 'previde': ['deprive', 'previde'], 'previous': ['pervious', 'previous', 'viperous'], 'previously': ['perviously', 'previously', 'viperously'], 'previousness': ['perviousness', 'previousness', 'viperousness'], 'prevoid': ['prevoid', 'provide'], 'prevomer': ['premover', 'prevomer'], 'prevote': ['overpet', 'preveto', 'prevote'], 'prewar': ['prewar', 'rewrap', 'warper'], 'prewarn': ['prawner', 'prewarn'], 'prewhip': ['prewhip', 'whipper'], 'prewrap': ['prewrap', 'wrapper'], 'prexy': ['prexy', 'pyrex'], 'prey': ['prey', 'pyre', 'rype'], 'pria': ['pair', 'pari', 'pria', 'ripa'], 'price': ['price', 'repic'], 'priced': ['percid', 'priced'], 'prich': ['chirp', 'prich'], 'prickfoot': ['prickfoot', 'tickproof'], 'prickle': ['pickler', 'prickle'], 'pride': ['pride', 'pried', 'redip'], 'pridian': ['pindari', 'pridian'], 'pried': ['pride', 'pried', 'redip'], 'prier': ['prier', 'riper'], 'priest': ['priest', 'pteris', 'sprite', 'stripe'], 'priestal': ['epistlar', 'pilaster', 'plaister', 'priestal'], 'priesthood': ['priesthood', 'spritehood'], 'priestless': ['priestless', 'stripeless'], 'prig': ['grip', 'prig'], 'prigman': ['gripman', 'prigman', 'ramping'], 'prima': ['impar', 'pamir', 'prima'], 'primage': ['epigram', 'primage'], 'primal': ['imparl', 'primal'], 'primates': ['maspiter', 'pastimer', 'primates'], 'primatial': ['impartial', 'primatial'], 'primely': ['primely', 'reimply'], 'primeness': ['primeness', 'spenerism'], 'primost': ['primost', 'tropism'], 'primrose': ['primrose', 'promiser'], 'primsie': ['pismire', 'primsie'], 'primus': ['primus', 'purism'], 'prince': ['pincer', 'prince'], 'princehood': ['cnidophore', 'princehood'], 'princeite': ['princeite', 'recipient'], 'princelike': ['pincerlike', 'princelike'], 'princely': ['pencilry', 'princely'], 'princesse': ['crepiness', 'princesse'], 'prine': ['piner', 'prine', 'repin', 'ripen'], 'pringle': ['pingler', 'pringle'], 'printed': ['deprint', 'printed'], 'printer': ['printer', 'reprint'], 'priodontes': ['desorption', 'priodontes'], 'prionopine': ['preopinion', 'prionopine'], 'prisage': ['prisage', 'spairge'], 'prisal': ['prisal', 'spiral'], 'prismatoid': ['diatropism', 'prismatoid'], 'prisometer': ['prisometer', 'spirometer'], 'prisonable': ['bipersonal', 'prisonable'], 'pristane': ['pinaster', 'pristane'], 'pristine': ['enspirit', 'pristine'], 'pristis': ['pristis', 'tripsis'], 'prius': ['prius', 'sirup'], 'proadmission': ['adpromission', 'proadmission'], 'proal': ['parol', 'polar', 'poral', 'proal'], 'proalien': ['pelorian', 'peronial', 'proalien'], 'proamniotic': ['comparition', 'proamniotic'], 'proathletic': ['proathletic', 'prothetical'], 'proatlas': ['pastoral', 'proatlas'], 'proavis': ['pavisor', 'proavis'], 'probationer': ['probationer', 'reprobation'], 'probe': ['probe', 'rebop'], 'procaciously': ['plousiocracy', 'procaciously'], 'procaine': ['caponier', 'coprinae', 'procaine'], 'procanal': ['coplanar', 'procanal'], 'procapital': ['applicator', 'procapital'], 'procedure': ['procedure', 'reproduce'], 'proceeder': ['proceeder', 'reproceed'], 'procellas': ['procellas', 'scalloper'], 'procerite': ['procerite', 'receiptor'], 'procession': ['procession', 'scorpiones'], 'prochemical': ['microcephal', 'prochemical'], 'procidentia': ['predication', 'procidentia'], 'proclaimer': ['proclaimer', 'reproclaim'], 'procne': ['crepon', 'procne'], 'procnemial': ['complainer', 'procnemial', 'recomplain'], 'procommission': ['compromission', 'procommission'], 'procreant': ['copartner', 'procreant'], 'procreate': ['procreate', 'pterocera'], 'procreation': ['incorporate', 'procreation'], 'proctal': ['caltrop', 'proctal'], 'proctitis': ['proctitis', 'protistic', 'tropistic'], 'proctocolitis': ['coloproctitis', 'proctocolitis'], 'procuress': ['percussor', 'procuress'], 'prod': ['dorp', 'drop', 'prod'], 'proddle': ['plodder', 'proddle'], 'proem': ['merop', 'moper', 'proem', 'remop'], 'proemial': ['emporial', 'proemial'], 'proemium': ['emporium', 'pomerium', 'proemium'], 'proethical': ['carpholite', 'proethical'], 'proetid': ['diopter', 'peridot', 'proetid', 'protide', 'pteroid'], 'proetidae': ['periodate', 'proetidae', 'proteidae'], 'proetus': ['petrous', 'posture', 'proetus', 'proteus', 'septuor', 'spouter'], 'proficient': ['prefiction', 'proficient'], 'profit': ['forpit', 'profit'], 'profiter': ['portfire', 'profiter'], 'progeny': ['progeny', 'pyrogen'], 'prohibiter': ['prohibiter', 'reprohibit'], 'proidealistic': ['peridiastolic', 'periodicalist', 'proidealistic'], 'proke': ['poker', 'proke'], 'proker': ['porker', 'proker'], 'prolacrosse': ['prolacrosse', 'sclerospora'], 'prolapse': ['prolapse', 'sapropel'], 'prolation': ['ploration', 'portional', 'prolation'], 'prolegate': ['petrogale', 'petrolage', 'prolegate'], 'proletarian': ['prerational', 'proletarian'], 'proletarianize': ['prerealization', 'proletarianize'], 'proletariat': ['proletariat', 'reptatorial'], 'proletary': ['proletary', 'pyrolater'], 'prolicense': ['prolicense', 'proselenic'], 'prolongate': ['prolongate', 'protogenal'], 'promerit': ['importer', 'promerit', 'reimport'], 'promethean': ['heptameron', 'promethean'], 'promise': ['imposer', 'promise', 'semipro'], 'promisee': ['perisome', 'promisee', 'reimpose'], 'promiser': ['primrose', 'promiser'], 'promitosis': ['isotropism', 'promitosis'], 'promnesia': ['mesropian', 'promnesia', 'spironema'], 'promonarchist': ['micranthropos', 'promonarchist'], 'promote': ['promote', 'protome'], 'pronaos': ['pronaos', 'soprano'], 'pronate': ['operant', 'pronate', 'protean'], 'pronative': ['overpaint', 'pronative'], 'proneur': ['proneur', 'purrone'], 'pronotal': ['portolan', 'pronotal'], 'pronto': ['pronto', 'proton'], 'pronunciable': ['preconnubial', 'pronunciable'], 'proo': ['poor', 'proo'], 'proofer': ['proofer', 'reproof'], 'prop': ['prop', 'ropp'], 'propellent': ['prepollent', 'propellent'], 'propene': ['preopen', 'propene'], 'prophloem': ['pleomorph', 'prophloem'], 'propine': ['piperno', 'propine'], 'propinoic': ['propinoic', 'propionic'], 'propionic': ['propinoic', 'propionic'], 'propitial': ['propitial', 'triplopia'], 'proportioner': ['proportioner', 'reproportion'], 'propose': ['opposer', 'propose'], 'propraetorial': ['propraetorial', 'protoperlaria'], 'proprietous': ['peritropous', 'proprietous'], 'propylene': ['polyprene', 'propylene'], 'propyne': ['propyne', 'pyropen'], 'prorate': ['praetor', 'prorate'], 'proration': ['proration', 'troparion'], 'prore': ['porer', 'prore', 'roper'], 'prorebate': ['perborate', 'prorebate', 'reprobate'], 'proreduction': ['proreduction', 'reproduction'], 'prorevision': ['prorevision', 'provisioner', 'reprovision'], 'prorogate': ['graperoot', 'prorogate'], 'prosaist': ['prosaist', 'protasis'], 'prosateur': ['prosateur', 'pterosaur'], 'prose': ['poser', 'prose', 'ropes', 'spore'], 'prosecretin': ['prosecretin', 'reinspector'], 'prosectorial': ['corporealist', 'prosectorial'], 'prosectorium': ['micropterous', 'prosectorium'], 'proselenic': ['prolicense', 'proselenic'], 'proselyte': ['polyester', 'proselyte'], 'proseminate': ['impersonate', 'proseminate'], 'prosemination': ['impersonation', 'prosemination', 'semipronation'], 'proseneschal': ['chaperonless', 'proseneschal'], 'prosification': ['antisoporific', 'prosification', 'sporification'], 'prosilient': ['linopteris', 'prosilient'], 'prosiphonate': ['nephroptosia', 'prosiphonate'], 'proso': ['poros', 'proso', 'sopor', 'spoor'], 'prosodiacal': ['dorsoapical', 'prosodiacal'], 'prosopyle': ['polyspore', 'prosopyle'], 'prossy': ['prossy', 'spyros'], 'prostatectomy': ['cryptostomate', 'prostatectomy'], 'prosternate': ['paternoster', 'prosternate', 'transportee'], 'prostomiate': ['metroptosia', 'prostomiate'], 'protactic': ['catoptric', 'protactic'], 'protasis': ['prosaist', 'protasis'], 'prote': ['poter', 'prote', 'repot', 'tepor', 'toper', 'trope'], 'protead': ['adopter', 'protead', 'readopt'], 'protean': ['operant', 'pronate', 'protean'], 'protease': ['asterope', 'protease'], 'protectional': ['lactoprotein', 'protectional'], 'proteic': ['perotic', 'proteic', 'tropeic'], 'proteida': ['apteroid', 'proteida'], 'proteidae': ['periodate', 'proetidae', 'proteidae'], 'proteidean': ['pontederia', 'proteidean'], 'protein': ['pointer', 'protein', 'pterion', 'repoint', 'tropine'], 'proteinic': ['epornitic', 'proteinic'], 'proteles': ['proteles', 'serpolet'], 'protelidae': ['leopardite', 'protelidae'], 'protend': ['portend', 'protend'], 'protension': ['portension', 'protension'], 'proteolysis': ['elytroposis', 'proteolysis'], 'proteose': ['esotrope', 'proteose'], 'protest': ['protest', 'spotter'], 'protester': ['protester', 'reprotest'], 'proteus': ['petrous', 'posture', 'proetus', 'proteus', 'septuor', 'spouter'], 'protheca': ['archpoet', 'protheca'], 'prothesis': ['posterish', 'prothesis', 'sophister', 'storeship', 'tephrosis'], 'prothetical': ['proathletic', 'prothetical'], 'prothoracic': ['acrotrophic', 'prothoracic'], 'protide': ['diopter', 'peridot', 'proetid', 'protide', 'pteroid'], 'protist': ['protist', 'tropist'], 'protistic': ['proctitis', 'protistic', 'tropistic'], 'proto': ['porto', 'proto', 'troop'], 'protocneme': ['mecopteron', 'protocneme'], 'protogenal': ['prolongate', 'protogenal'], 'protoma': ['protoma', 'taproom'], 'protomagnesium': ['protomagnesium', 'spermatogonium'], 'protome': ['promote', 'protome'], 'protomorphic': ['morphotropic', 'protomorphic'], 'proton': ['pronto', 'proton'], 'protone': ['porteno', 'protone'], 'protonemal': ['monopteral', 'protonemal'], 'protoparent': ['protoparent', 'protopteran'], 'protopathic': ['haptotropic', 'protopathic'], 'protopathy': ['protopathy', 'protophyta'], 'protoperlaria': ['propraetorial', 'protoperlaria'], 'protophyta': ['protopathy', 'protophyta'], 'protophyte': ['protophyte', 'tropophyte'], 'protophytic': ['protophytic', 'tropophytic'], 'protopine': ['preoption', 'protopine'], 'protopteran': ['protoparent', 'protopteran'], 'protore': ['protore', 'trooper'], 'protosulphide': ['protosulphide', 'sulphoproteid'], 'prototheme': ['photometer', 'prototheme'], 'prototherian': ['ornithoptera', 'prototherian'], 'prototrophic': ['prototrophic', 'trophotropic'], 'protrade': ['predator', 'protrade', 'teardrop'], 'protreaty': ['protreaty', 'reptatory'], 'protuberantial': ['perturbational', 'protuberantial'], 'protyl': ['portly', 'protyl', 'tropyl'], 'provenient': ['prevention', 'provenient'], 'provide': ['prevoid', 'provide'], 'provider': ['overdrip', 'provider'], 'provisioner': ['prorevision', 'provisioner', 'reprovision'], 'prowed': ['powder', 'prowed'], 'prude': ['drupe', 'duper', 'perdu', 'prude', 'pured'], 'prudent': ['prudent', 'prunted', 'uptrend'], 'prudential': ['prudential', 'putredinal'], 'prudist': ['disrupt', 'prudist'], 'prudy': ['prudy', 'purdy', 'updry'], 'prue': ['peru', 'prue', 'pure'], 'prune': ['perun', 'prune'], 'prunted': ['prudent', 'prunted', 'uptrend'], 'prussic': ['prussic', 'scirpus'], 'prut': ['prut', 'turp'], 'pry': ['pry', 'pyr'], 'pryer': ['perry', 'pryer'], 'pryse': ['pryse', 'spyer'], 'psalm': ['plasm', 'psalm', 'slamp'], 'psalmic': ['plasmic', 'psalmic'], 'psalmister': ['psalmister', 'spermalist'], 'psalmodial': ['plasmodial', 'psalmodial'], 'psalmodic': ['plasmodic', 'psalmodic'], 'psaloid': ['psaloid', 'salpoid'], 'psalter': ['palster', 'persalt', 'plaster', 'psalter', 'spartle', 'stapler'], 'psalterian': ['alpestrian', 'palestrian', 'psalterian'], 'psalterion': ['interposal', 'psalterion'], 'psaltery': ['plastery', 'psaltery'], 'psaltress': ['psaltress', 'strapless'], 'psaronius': ['prasinous', 'psaronius'], 'psedera': ['psedera', 'respade'], 'psellism': ['misspell', 'psellism'], 'pseudelytron': ['pseudelytron', 'unproselyted'], 'pseudimago': ['megapodius', 'pseudimago'], 'pseudophallic': ['diplocephalus', 'pseudophallic'], 'psha': ['hasp', 'pash', 'psha', 'shap'], 'psi': ['psi', 'sip'], 'psiloceratid': ['prediastolic', 'psiloceratid'], 'psilophyton': ['polyphonist', 'psilophyton'], 'psilotic': ['colpitis', 'politics', 'psilotic'], 'psittacine': ['antiseptic', 'psittacine'], 'psoadic': ['psoadic', 'scapoid', 'sciapod'], 'psoas': ['passo', 'psoas'], 'psocidae': ['diascope', 'psocidae', 'scopidae'], 'psocine': ['psocine', 'scopine'], 'psora': ['psora', 'sapor', 'sarpo'], 'psoralea': ['parosela', 'psoralea'], 'psoroid': ['psoroid', 'sporoid'], 'psorous': ['psorous', 'soursop', 'sporous'], 'psychobiological': ['biopsychological', 'psychobiological'], 'psychobiology': ['biopsychology', 'psychobiology'], 'psychogalvanic': ['galvanopsychic', 'psychogalvanic'], 'psychomancy': ['psychomancy', 'scyphomancy'], 'psychomonism': ['monopsychism', 'psychomonism'], 'psychoneurological': ['neuropsychological', 'psychoneurological'], 'psychoneurosis': ['neuropsychosis', 'psychoneurosis'], 'psychophysiological': ['physiopsychological', 'psychophysiological'], 'psychophysiology': ['physiopsychology', 'psychophysiology'], 'psychorrhagy': ['chrysography', 'psychorrhagy'], 'psychosomatic': ['psychosomatic', 'somatopsychic'], 'psychotechnology': ['psychotechnology', 'technopsychology'], 'psychotheism': ['psychotheism', 'theopsychism'], 'psychotria': ['physiocrat', 'psychotria'], 'ptelea': ['apelet', 'ptelea'], 'ptereal': ['pearlet', 'pleater', 'prelate', 'ptereal', 'replate', 'repleat'], 'pterian': ['painter', 'pertain', 'pterian', 'repaint'], 'pterideous': ['depositure', 'pterideous'], 'pteridological': ['dipterological', 'pteridological'], 'pteridologist': ['dipterologist', 'pteridologist'], 'pteridology': ['dipterology', 'pteridology'], 'pterion': ['pointer', 'protein', 'pterion', 'repoint', 'tropine'], 'pteris': ['priest', 'pteris', 'sprite', 'stripe'], 'pterocera': ['procreate', 'pterocera'], 'pterodactylidae': ['dactylopteridae', 'pterodactylidae'], 'pterodactylus': ['dactylopterus', 'pterodactylus'], 'pterographer': ['petrographer', 'pterographer'], 'pterographic': ['petrographic', 'pterographic'], 'pterographical': ['petrographical', 'pterographical'], 'pterography': ['petrography', 'pterography', 'typographer'], 'pteroid': ['diopter', 'peridot', 'proetid', 'protide', 'pteroid'], 'pteroma': ['pteroma', 'tempora'], 'pteropus': ['pteropus', 'stoppeur'], 'pterosaur': ['prosateur', 'pterosaur'], 'pterospora': ['praepostor', 'pterospora'], 'pteryla': ['apertly', 'peartly', 'platery', 'pteryla', 'taperly'], 'pterylographical': ['petrographically', 'pterylographical'], 'pterylological': ['petrologically', 'pterylological'], 'pterylosis': ['peristylos', 'pterylosis'], 'ptilota': ['ptilota', 'talipot', 'toptail'], 'ptinus': ['ptinus', 'unspit'], 'ptolemean': ['leptonema', 'ptolemean'], 'ptomain': ['maintop', 'ptomain', 'tampion', 'timpano'], 'ptomainic': ['impaction', 'ptomainic'], 'ptyalin': ['inaptly', 'planity', 'ptyalin'], 'ptyalocele': ['clypeolate', 'ptyalocele'], 'ptyalogenic': ['genotypical', 'ptyalogenic'], 'pu': ['pu', 'up'], 'pua': ['pau', 'pua'], 'puan': ['napu', 'puan', 'puna'], 'publisher': ['publisher', 'republish'], 'puckball': ['puckball', 'pullback'], 'puckrel': ['plucker', 'puckrel'], 'pud': ['dup', 'pud'], 'pudendum': ['pudendum', 'undumped'], 'pudent': ['pudent', 'uptend'], 'pudic': ['cupid', 'pudic'], 'pudical': ['paludic', 'pudical'], 'pudicity': ['cupidity', 'pudicity'], 'puerer': ['puerer', 'purree'], 'puffer': ['puffer', 'repuff'], 'pug': ['gup', 'pug'], 'pugman': ['panmug', 'pugman'], 'puisne': ['puisne', 'supine'], 'puist': ['puist', 'upsit'], 'puja': ['jaup', 'puja'], 'puke': ['keup', 'puke'], 'pule': ['lupe', 'pelu', 'peul', 'pule'], 'pulian': ['paulin', 'pulian'], 'pulicene': ['clupeine', 'pulicene'], 'pulicidal': ['picudilla', 'pulicidal'], 'pulicide': ['lupicide', 'pediculi', 'pulicide'], 'puling': ['gulpin', 'puling'], 'pulish': ['huspil', 'pulish'], 'pullback': ['puckball', 'pullback'], 'pulp': ['plup', 'pulp'], 'pulper': ['pulper', 'purple'], 'pulpiter': ['pulpiter', 'repulpit'], 'pulpous': ['populus', 'pulpous'], 'pulpstone': ['pulpstone', 'unstopple'], 'pulsant': ['pulsant', 'upslant'], 'pulsate': ['pulsate', 'spatule', 'upsteal'], 'pulsatile': ['palluites', 'pulsatile'], 'pulsation': ['platinous', 'pulsation'], 'pulsator': ['postural', 'pulsator', 'sportula'], 'pulse': ['lepus', 'pulse'], 'pulsion': ['pulsion', 'unspoil', 'upsilon'], 'pulvic': ['pulvic', 'vulpic'], 'pumper': ['pumper', 'repump'], 'pumple': ['peplum', 'pumple'], 'puna': ['napu', 'puan', 'puna'], 'puncher': ['puncher', 'unperch'], 'punctilio': ['punctilio', 'unpolitic'], 'puncturer': ['puncturer', 'upcurrent'], 'punger': ['punger', 'repugn'], 'pungle': ['plunge', 'pungle'], 'puniceous': ['pecunious', 'puniceous'], 'punish': ['inpush', 'punish', 'unship'], 'punisher': ['punisher', 'repunish'], 'punishment': ['punishment', 'unshipment'], 'punlet': ['penult', 'punlet', 'puntel'], 'punnet': ['punnet', 'unpent'], 'puno': ['noup', 'puno', 'upon'], 'punta': ['punta', 'unapt', 'untap'], 'puntal': ['puntal', 'unplat'], 'puntel': ['penult', 'punlet', 'puntel'], 'punti': ['input', 'punti'], 'punto': ['punto', 'unpot', 'untop'], 'pupa': ['paup', 'pupa'], 'pupelo': ['poulpe', 'pupelo'], 'purana': ['purana', 'uparna'], 'purdy': ['prudy', 'purdy', 'updry'], 'pure': ['peru', 'prue', 'pure'], 'pured': ['drupe', 'duper', 'perdu', 'prude', 'pured'], 'puree': ['puree', 'rupee'], 'purer': ['purer', 'purre'], 'purine': ['purine', 'unripe', 'uprein'], 'purism': ['primus', 'purism'], 'purist': ['purist', 'spruit', 'uprist', 'upstir'], 'puritan': ['pintura', 'puritan', 'uptrain'], 'puritaness': ['presustain', 'puritaness', 'supersaint'], 'purler': ['purler', 'purrel'], 'purple': ['pulper', 'purple'], 'purpose': ['peropus', 'purpose'], 'purpuroxanthin': ['purpuroxanthin', 'xanthopurpurin'], 'purre': ['purer', 'purre'], 'purree': ['puerer', 'purree'], 'purrel': ['purler', 'purrel'], 'purrone': ['proneur', 'purrone'], 'purse': ['purse', 'resup', 'sprue', 'super'], 'purser': ['purser', 'spruer'], 'purslane': ['purslane', 'serpulan', 'supernal'], 'purslet': ['purslet', 'spurlet', 'spurtle'], 'pursuer': ['pursuer', 'usurper'], 'pursy': ['pursy', 'pyrus', 'syrup'], 'pus': ['pus', 'sup'], 'pushtu': ['pushtu', 'upshut'], 'pustule': ['pluteus', 'pustule'], 'pustulose': ['pustulose', 'stupulose'], 'put': ['put', 'tup'], 'putanism': ['putanism', 'sumpitan'], 'putation': ['outpaint', 'putation'], 'putredinal': ['prudential', 'putredinal'], 'putrid': ['putrid', 'turpid'], 'putridly': ['putridly', 'turpidly'], 'pya': ['pay', 'pya', 'yap'], 'pyal': ['paly', 'play', 'pyal', 'pyla'], 'pycnial': ['pliancy', 'pycnial'], 'pyelic': ['epicly', 'pyelic'], 'pyelitis': ['pyelitis', 'sipylite'], 'pyelocystitis': ['cystopyelitis', 'pyelocystitis'], 'pyelonephritis': ['nephropyelitis', 'pyelonephritis'], 'pyeloureterogram': ['pyeloureterogram', 'ureteropyelogram'], 'pyemesis': ['empyesis', 'pyemesis'], 'pygmalion': ['maypoling', 'pygmalion'], 'pyin': ['piny', 'pyin'], 'pyla': ['paly', 'play', 'pyal', 'pyla'], 'pylades': ['pylades', 'splayed'], 'pylagore': ['playgoer', 'pylagore'], 'pylar': ['parly', 'pylar', 'pyral'], 'pyonephrosis': ['nephropyosis', 'pyonephrosis'], 'pyopneumothorax': ['pneumopyothorax', 'pyopneumothorax'], 'pyosepticemia': ['pyosepticemia', 'septicopyemia'], 'pyosepticemic': ['pyosepticemic', 'septicopyemic'], 'pyr': ['pry', 'pyr'], 'pyracanth': ['pantarchy', 'pyracanth'], 'pyral': ['parly', 'pylar', 'pyral'], 'pyrales': ['parsley', 'pyrales', 'sparely', 'splayer'], 'pyralid': ['pyralid', 'rapidly'], 'pyramidale': ['lampyridae', 'pyramidale'], 'pyranometer': ['premonetary', 'pyranometer'], 'pyre': ['prey', 'pyre', 'rype'], 'pyrena': ['napery', 'pyrena'], 'pyrenic': ['cyprine', 'pyrenic'], 'pyrenoid': ['pyrenoid', 'pyridone', 'pyrodine'], 'pyretogenic': ['pyretogenic', 'pyrogenetic'], 'pyrex': ['prexy', 'pyrex'], 'pyrgocephaly': ['pelycography', 'pyrgocephaly'], 'pyridone': ['pyrenoid', 'pyridone', 'pyrodine'], 'pyrites': ['pyrites', 'sperity'], 'pyritoid': ['pityroid', 'pyritoid'], 'pyro': ['pory', 'pyro', 'ropy'], 'pyroarsenite': ['arsenopyrite', 'pyroarsenite'], 'pyrochemical': ['microcephaly', 'pyrochemical'], 'pyrocomenic': ['pyrocomenic', 'pyromeconic'], 'pyrodine': ['pyrenoid', 'pyridone', 'pyrodine'], 'pyrogen': ['progeny', 'pyrogen'], 'pyrogenetic': ['pyretogenic', 'pyrogenetic'], 'pyrolater': ['proletary', 'pyrolater'], 'pyromantic': ['importancy', 'patronymic', 'pyromantic'], 'pyromeconic': ['pyrocomenic', 'pyromeconic'], 'pyrope': ['popery', 'pyrope'], 'pyropen': ['propyne', 'pyropen'], 'pyrophorus': ['porphyrous', 'pyrophorus'], 'pyrotheria': ['erythropia', 'pyrotheria'], 'pyruline': ['pyruline', 'unripely'], 'pyrus': ['pursy', 'pyrus', 'syrup'], 'pyruvil': ['pyruvil', 'pyvuril'], 'pythagorism': ['myographist', 'pythagorism'], 'pythia': ['pythia', 'typhia'], 'pythic': ['phytic', 'pitchy', 'pythic', 'typhic'], 'pythogenesis': ['phytogenesis', 'pythogenesis'], 'pythogenetic': ['phytogenetic', 'pythogenetic'], 'pythogenic': ['phytogenic', 'pythogenic', 'typhogenic'], 'pythogenous': ['phytogenous', 'pythogenous'], 'python': ['phyton', 'python'], 'pythonic': ['hypnotic', 'phytonic', 'pythonic', 'typhonic'], 'pythonism': ['hypnotism', 'pythonism'], 'pythonist': ['hypnotist', 'pythonist'], 'pythonize': ['hypnotize', 'pythonize'], 'pythonoid': ['hypnotoid', 'pythonoid'], 'pyvuril': ['pyruvil', 'pyvuril'], 'quadrual': ['quadrual', 'quadrula'], 'quadrula': ['quadrual', 'quadrula'], 'quail': ['quail', 'quila'], 'quake': ['quake', 'queak'], 'quale': ['equal', 'quale', 'queal'], 'qualitied': ['liquidate', 'qualitied'], 'quamoclit': ['coquitlam', 'quamoclit'], 'quannet': ['quannet', 'tanquen'], 'quartile': ['quartile', 'requital', 'triequal'], 'quartine': ['antiquer', 'quartine'], 'quata': ['quata', 'taqua'], 'quatrin': ['quatrin', 'tarquin'], 'queak': ['quake', 'queak'], 'queal': ['equal', 'quale', 'queal'], 'queeve': ['eveque', 'queeve'], 'quencher': ['quencher', 'requench'], 'querier': ['querier', 'require'], 'queriman': ['queriman', 'ramequin'], 'querist': ['querist', 'squiret'], 'quernal': ['quernal', 'ranquel'], 'quester': ['quester', 'request'], 'questioner': ['questioner', 'requestion'], 'questor': ['questor', 'torques'], 'quiet': ['quiet', 'quite'], 'quietable': ['equitable', 'quietable'], 'quieter': ['quieter', 'requite'], 'quietist': ['equitist', 'quietist'], 'quietsome': ['quietsome', 'semiquote'], 'quiina': ['quiina', 'quinia'], 'quila': ['quail', 'quila'], 'quiles': ['quiles', 'quisle'], 'quinate': ['antique', 'quinate'], 'quince': ['cinque', 'quince'], 'quinia': ['quiina', 'quinia'], 'quinite': ['inquiet', 'quinite'], 'quinnat': ['quinnat', 'quintan'], 'quinse': ['quinse', 'sequin'], 'quintan': ['quinnat', 'quintan'], 'quintato': ['quintato', 'totaquin'], 'quinze': ['quinze', 'zequin'], 'quirt': ['quirt', 'qurti'], 'quisle': ['quiles', 'quisle'], 'quite': ['quiet', 'quite'], 'quits': ['quits', 'squit'], 'quote': ['quote', 'toque'], 'quoter': ['quoter', 'roquet', 'torque'], 'qurti': ['quirt', 'qurti'], 'ra': ['ar', 'ra'], 'raad': ['adar', 'arad', 'raad', 'rada'], 'raash': ['asarh', 'raash', 'sarah'], 'rab': ['bar', 'bra', 'rab'], 'raband': ['bandar', 'raband'], 'rabatine': ['atabrine', 'rabatine'], 'rabatte': ['baretta', 'rabatte', 'tabaret'], 'rabbanite': ['barnabite', 'rabbanite', 'rabbinate'], 'rabbet': ['barbet', 'rabbet', 'tabber'], 'rabbinate': ['barnabite', 'rabbanite', 'rabbinate'], 'rabble': ['barbel', 'labber', 'rabble'], 'rabboni': ['barbion', 'rabboni'], 'rabi': ['abir', 'bari', 'rabi'], 'rabic': ['baric', 'carib', 'rabic'], 'rabid': ['barid', 'bidar', 'braid', 'rabid'], 'rabidly': ['bardily', 'rabidly', 'ridably'], 'rabidness': ['bardiness', 'rabidness'], 'rabies': ['braise', 'rabies', 'rebias'], 'rabin': ['abrin', 'bairn', 'brain', 'brian', 'rabin'], 'rabinet': ['atebrin', 'rabinet'], 'raccoon': ['carcoon', 'raccoon'], 'race': ['acer', 'acre', 'care', 'crea', 'race'], 'racemate': ['camerate', 'macerate', 'racemate'], 'racemation': ['aeromantic', 'cameration', 'maceration', 'racemation'], 'raceme': ['amerce', 'raceme'], 'racemed': ['decream', 'racemed'], 'racemic': ['ceramic', 'racemic'], 'racer': ['carer', 'crare', 'racer'], 'rach': ['arch', 'char', 'rach'], 'rache': ['acher', 'arche', 'chare', 'chera', 'rache', 'reach'], 'rachel': ['rachel', 'rechal'], 'rachianectes': ['rachianectes', 'rhacianectes'], 'rachidial': ['diarchial', 'rachidial'], 'rachitis': ['architis', 'rachitis'], 'racial': ['alaric', 'racial'], 'racialist': ['racialist', 'satirical'], 'racing': ['arcing', 'racing'], 'racist': ['crista', 'racist'], 'rack': ['cark', 'rack'], 'racker': ['racker', 'rerack'], 'racket': ['racket', 'retack', 'tacker'], 'racking': ['arcking', 'carking', 'racking'], 'rackingly': ['carkingly', 'rackingly'], 'rackle': ['calker', 'lacker', 'rackle', 'recalk', 'reckla'], 'racon': ['acorn', 'acron', 'racon'], 'raconteur': ['cuarteron', 'raconteur'], 'racoon': ['caroon', 'corona', 'racoon'], 'racy': ['cary', 'racy'], 'rad': ['dar', 'rad'], 'rada': ['adar', 'arad', 'raad', 'rada'], 'raddle': ['ladder', 'raddle'], 'raddleman': ['dreamland', 'raddleman'], 'radectomy': ['myctodera', 'radectomy'], 'radek': ['daker', 'drake', 'kedar', 'radek'], 'radiable': ['labridae', 'radiable'], 'radiale': ['ardelia', 'laridae', 'radiale'], 'radian': ['adrian', 'andira', 'andria', 'radian', 'randia'], 'radiance': ['caridean', 'dircaean', 'radiance'], 'radiant': ['intrada', 'radiant'], 'radiata': ['dataria', 'radiata'], 'radical': ['cardial', 'radical'], 'radicant': ['antacrid', 'cardiant', 'radicant', 'tridacna'], 'radicel': ['decrial', 'radicel', 'radicle'], 'radices': ['diceras', 'radices', 'sidecar'], 'radicle': ['decrial', 'radicel', 'radicle'], 'radicose': ['idocrase', 'radicose'], 'radicule': ['auricled', 'radicule'], 'radiculose': ['coresidual', 'radiculose'], 'radiectomy': ['acidometry', 'medicatory', 'radiectomy'], 'radii': ['dairi', 'darii', 'radii'], 'radio': ['aroid', 'doria', 'radio'], 'radioautograph': ['autoradiograph', 'radioautograph'], 'radioautographic': ['autoradiographic', 'radioautographic'], 'radioautography': ['autoradiography', 'radioautography'], 'radiohumeral': ['humeroradial', 'radiohumeral'], 'radiolite': ['editorial', 'radiolite'], 'radiolucent': ['radiolucent', 'reductional'], 'radioman': ['adoniram', 'radioman'], 'radiomicrometer': ['microradiometer', 'radiomicrometer'], 'radiophone': ['phoronidea', 'radiophone'], 'radiophony': ['hypodorian', 'radiophony'], 'radiotelephone': ['radiotelephone', 'teleradiophone'], 'radiotron': ['ordinator', 'radiotron'], 'radish': ['ardish', 'radish'], 'radius': ['darius', 'radius'], 'radman': ['mandra', 'radman'], 'radon': ['adorn', 'donar', 'drona', 'radon'], 'radula': ['adular', 'aludra', 'radula'], 'rafael': ['aflare', 'rafael'], 'rafe': ['fare', 'fear', 'frae', 'rafe'], 'raffee': ['affeer', 'raffee'], 'raffia': ['affair', 'raffia'], 'raffle': ['farfel', 'raffle'], 'rafik': ['fakir', 'fraik', 'kafir', 'rafik'], 'raft': ['frat', 'raft'], 'raftage': ['fregata', 'raftage'], 'rafter': ['frater', 'rafter'], 'rag': ['gar', 'gra', 'rag'], 'raga': ['agar', 'agra', 'gara', 'raga'], 'rage': ['ager', 'agre', 'gare', 'gear', 'rage'], 'rageless': ['eelgrass', 'gearless', 'rageless'], 'ragfish': ['garfish', 'ragfish'], 'ragged': ['dagger', 'gadger', 'ragged'], 'raggee': ['agrege', 'raggee'], 'raggety': ['gargety', 'raggety'], 'raggle': ['gargle', 'gregal', 'lagger', 'raggle'], 'raggled': ['draggle', 'raggled'], 'raggy': ['aggry', 'raggy'], 'ragingly': ['grayling', 'ragingly'], 'raglanite': ['antiglare', 'raglanite'], 'raglet': ['raglet', 'tergal'], 'raglin': ['nargil', 'raglin'], 'ragman': ['amgarn', 'mangar', 'marang', 'ragman'], 'ragnar': ['garran', 'ragnar'], 'ragshag': ['ragshag', 'shagrag'], 'ragtag': ['ragtag', 'tagrag'], 'ragtime': ['migrate', 'ragtime'], 'ragule': ['ragule', 'regula'], 'raguly': ['glaury', 'raguly'], 'raia': ['aira', 'aria', 'raia'], 'raid': ['arid', 'dari', 'raid'], 'raider': ['arride', 'raider'], 'raif': ['fair', 'fiar', 'raif'], 'raiidae': ['ariidae', 'raiidae'], 'rail': ['aril', 'lair', 'lari', 'liar', 'lira', 'rail', 'rial'], 'railage': ['lairage', 'railage', 'regalia'], 'railer': ['railer', 'rerail'], 'railhead': ['headrail', 'railhead'], 'railless': ['lairless', 'railless'], 'railman': ['lairman', 'laminar', 'malarin', 'railman'], 'raiment': ['minaret', 'raiment', 'tireman'], 'rain': ['arni', 'iran', 'nair', 'rain', 'rani'], 'raincoat': ['craniota', 'croatian', 'narcotia', 'raincoat'], 'rainful': ['rainful', 'unfrail'], 'rainspout': ['rainspout', 'supinator'], 'rainy': ['nairy', 'rainy'], 'rais': ['rais', 'sair', 'sari'], 'raise': ['aries', 'arise', 'raise', 'serai'], 'raiseman': ['erasmian', 'raiseman'], 'raiser': ['raiser', 'sierra'], 'raisin': ['raisin', 'sirian'], 'raj': ['jar', 'raj'], 'raja': ['ajar', 'jara', 'raja'], 'rajah': ['ajhar', 'rajah'], 'rajeev': ['evejar', 'rajeev'], 'rake': ['rake', 'reak'], 'rakesteel': ['rakesteel', 'rakestele'], 'rakestele': ['rakesteel', 'rakestele'], 'rakh': ['hark', 'khar', 'rakh'], 'raki': ['ikra', 'kari', 'raki'], 'rakish': ['rakish', 'riksha', 'shikar', 'shikra', 'sikhra'], 'rakit': ['kitar', 'krait', 'rakit', 'traik'], 'raku': ['kuar', 'raku', 'rauk'], 'ralf': ['farl', 'ralf'], 'ralliance': ['alliancer', 'ralliance'], 'ralline': ['ralline', 'renilla'], 'ram': ['arm', 'mar', 'ram'], 'rama': ['amar', 'amra', 'mara', 'rama'], 'ramada': ['armada', 'damara', 'ramada'], 'ramage': ['gemara', 'ramage'], 'ramaite': ['ametria', 'artemia', 'meratia', 'ramaite'], 'ramal': ['alarm', 'malar', 'maral', 'marla', 'ramal'], 'ramanas': ['ramanas', 'sramana'], 'ramate': ['ramate', 'retama'], 'ramble': ['ambler', 'blamer', 'lamber', 'marble', 'ramble'], 'rambler': ['marbler', 'rambler'], 'rambling': ['marbling', 'rambling'], 'rambo': ['broma', 'rambo'], 'rambutan': ['rambutan', 'tamburan'], 'rame': ['erma', 'mare', 'rame', 'ream'], 'ramed': ['armed', 'derma', 'dream', 'ramed'], 'rament': ['manter', 'marten', 'rament'], 'ramental': ['maternal', 'ramental'], 'ramequin': ['queriman', 'ramequin'], 'ramesh': ['masher', 'ramesh', 'shamer'], 'ramet': ['armet', 'mater', 'merat', 'metra', 'ramet', 'tamer', 'terma', 'trame', 'trema'], 'rami': ['amir', 'irma', 'mari', 'mira', 'rami', 'rima'], 'ramie': ['aimer', 'maire', 'marie', 'ramie'], 'ramiferous': ['armiferous', 'ramiferous'], 'ramigerous': ['armigerous', 'ramigerous'], 'ramillie': ['milliare', 'ramillie'], 'ramisection': ['anisometric', 'creationism', 'miscreation', 'ramisection', 'reactionism'], 'ramist': ['marist', 'matris', 'ramist'], 'ramline': ['marline', 'mineral', 'ramline'], 'rammel': ['lammer', 'rammel'], 'rammy': ['mymar', 'rammy'], 'ramon': ['manor', 'moran', 'norma', 'ramon', 'roman'], 'ramona': ['oarman', 'ramona'], 'ramose': ['amores', 'ramose', 'sorema'], 'ramosely': ['marysole', 'ramosely'], 'ramp': ['pram', 'ramp'], 'rampant': ['mantrap', 'rampant'], 'ramped': ['damper', 'ramped'], 'ramper': ['prearm', 'ramper'], 'rampike': ['perakim', 'permiak', 'rampike'], 'ramping': ['gripman', 'prigman', 'ramping'], 'ramsey': ['ramsey', 'smeary'], 'ramson': ['ramson', 'ransom'], 'ramtil': ['mitral', 'ramtil'], 'ramule': ['mauler', 'merula', 'ramule'], 'ramulus': ['malurus', 'ramulus'], 'ramus': ['musar', 'ramus', 'rusma', 'surma'], 'ramusi': ['misura', 'ramusi'], 'ran': ['arn', 'nar', 'ran'], 'rana': ['arna', 'rana'], 'ranales': ['arsenal', 'ranales'], 'rance': ['caner', 'crane', 'crena', 'nacre', 'rance'], 'rancel': ['lancer', 'rancel'], 'rancer': ['craner', 'rancer'], 'ranche': ['enarch', 'ranche'], 'ranchero': ['anchorer', 'ranchero', 'reanchor'], 'rancho': ['anchor', 'archon', 'charon', 'rancho'], 'rancid': ['andric', 'cardin', 'rancid'], 'rand': ['darn', 'nard', 'rand'], 'randan': ['annard', 'randan'], 'randem': ['damner', 'manred', 'randem', 'remand'], 'rander': ['darner', 'darren', 'errand', 'rander', 'redarn'], 'randia': ['adrian', 'andira', 'andria', 'radian', 'randia'], 'randing': ['darning', 'randing'], 'randite': ['antired', 'detrain', 'randite', 'trained'], 'randle': ['aldern', 'darnel', 'enlard', 'lander', 'lenard', 'randle', 'reland'], 'random': ['random', 'rodman'], 'rane': ['arne', 'earn', 'rane'], 'ranere': ['earner', 'ranere'], 'rang': ['garn', 'gnar', 'rang'], 'range': ['anger', 'areng', 'grane', 'range'], 'ranged': ['danger', 'gander', 'garden', 'ranged'], 'rangeless': ['largeness', 'rangeless', 'regalness'], 'ranger': ['garner', 'ranger'], 'rangey': ['anergy', 'rangey'], 'ranginess': ['angriness', 'ranginess'], 'rangle': ['angler', 'arleng', 'garnel', 'largen', 'rangle', 'regnal'], 'rangy': ['angry', 'rangy'], 'rani': ['arni', 'iran', 'nair', 'rain', 'rani'], 'ranid': ['darin', 'dinar', 'drain', 'indra', 'nadir', 'ranid'], 'ranidae': ['araneid', 'ariadne', 'ranidae'], 'raniform': ['nariform', 'raniform'], 'raninae': ['aranein', 'raninae'], 'ranine': ['narine', 'ranine'], 'rank': ['knar', 'kran', 'nark', 'rank'], 'ranked': ['darken', 'kanred', 'ranked'], 'ranker': ['ranker', 'rerank'], 'rankish': ['krishna', 'rankish'], 'rannel': ['lanner', 'rannel'], 'ranquel': ['quernal', 'ranquel'], 'ransom': ['ramson', 'ransom'], 'rant': ['natr', 'rant', 'tarn', 'tran'], 'rantepole': ['petrolean', 'rantepole'], 'ranter': ['arrent', 'errant', 'ranter', 'ternar'], 'rantipole': ['prelation', 'rantipole'], 'ranula': ['alraun', 'alruna', 'ranula'], 'rap': ['par', 'rap'], 'rape': ['aper', 'pare', 'pear', 'rape', 'reap'], 'rapeful': ['rapeful', 'upflare'], 'raper': ['parer', 'raper'], 'raphael': ['phalera', 'raphael'], 'raphaelic': ['eparchial', 'raphaelic'], 'raphe': ['hepar', 'phare', 'raphe'], 'raphia': ['pahari', 'pariah', 'raphia'], 'raphides': ['diphaser', 'parished', 'raphides', 'sephardi'], 'raphis': ['parish', 'raphis', 'rhapis'], 'rapic': ['capri', 'picra', 'rapic'], 'rapid': ['adrip', 'rapid'], 'rapidly': ['pyralid', 'rapidly'], 'rapier': ['pairer', 'rapier', 'repair'], 'rapine': ['parine', 'rapine'], 'raping': ['paring', 'raping'], 'rapparee': ['appearer', 'rapparee', 'reappear'], 'rappe': ['paper', 'rappe'], 'rappel': ['lapper', 'rappel'], 'rappite': ['periapt', 'rappite'], 'rapt': ['part', 'prat', 'rapt', 'tarp', 'trap'], 'raptly': ['paltry', 'partly', 'raptly'], 'raptor': ['parrot', 'raptor'], 'rapture': ['parture', 'rapture'], 'rare': ['rare', 'rear'], 'rarebit': ['arbiter', 'rarebit'], 'rareripe': ['rareripe', 'repairer'], 'rarish': ['arrish', 'harris', 'rarish', 'sirrah'], 'ras': ['ras', 'sar'], 'rasa': ['rasa', 'sara'], 'rascacio': ['coracias', 'rascacio'], 'rascal': ['lascar', 'rascal', 'sacral', 'scalar'], 'rase': ['arse', 'rase', 'sare', 'sear', 'sera'], 'rasen': ['anser', 'nares', 'rasen', 'snare'], 'raser': ['ersar', 'raser', 'serra'], 'rasher': ['rasher', 'sharer'], 'rashing': ['garnish', 'rashing'], 'rashti': ['rashti', 'tarish'], 'rasion': ['arsino', 'rasion', 'sonrai'], 'rasp': ['rasp', 'spar'], 'rasped': ['rasped', 'spader', 'spread'], 'rasper': ['parser', 'rasper', 'sparer'], 'rasping': ['aspring', 'rasping', 'sparing'], 'raspingly': ['raspingly', 'sparingly'], 'raspingness': ['raspingness', 'sparingness'], 'raspite': ['piaster', 'piastre', 'raspite', 'spirate', 'traipse'], 'raspy': ['raspy', 'spary', 'spray'], 'rasse': ['arses', 'rasse'], 'raster': ['arrest', 'astrer', 'raster', 'starer'], 'rastik': ['rastik', 'sarkit', 'straik'], 'rastle': ['laster', 'lastre', 'rastle', 'relast', 'resalt', 'salter', 'slater', 'stelar'], 'rastus': ['rastus', 'tarsus'], 'rat': ['art', 'rat', 'tar', 'tra'], 'rata': ['rata', 'taar', 'tara'], 'ratable': ['alberta', 'latebra', 'ratable'], 'ratal': ['altar', 'artal', 'ratal', 'talar'], 'ratanhia': ['ratanhia', 'rhatania'], 'ratbite': ['biretta', 'brattie', 'ratbite'], 'ratch': ['chart', 'ratch'], 'ratchel': ['clethra', 'latcher', 'ratchel', 'relatch', 'talcher', 'trachle'], 'ratcher': ['charter', 'ratcher'], 'ratchet': ['chatter', 'ratchet'], 'ratchety': ['chattery', 'ratchety', 'trachyte'], 'ratching': ['charting', 'ratching'], 'rate': ['rate', 'tare', 'tear', 'tera'], 'rated': ['dater', 'derat', 'detar', 'drate', 'rated', 'trade', 'tread'], 'ratel': ['alert', 'alter', 'artel', 'later', 'ratel', 'taler', 'telar'], 'rateless': ['rateless', 'tasseler', 'tearless', 'tesseral'], 'ratfish': ['ratfish', 'tashrif'], 'rath': ['hart', 'rath', 'tahr', 'thar', 'trah'], 'rathe': ['earth', 'hater', 'heart', 'herat', 'rathe'], 'rathed': ['dearth', 'hatred', 'rathed', 'thread'], 'rathely': ['earthly', 'heartly', 'lathery', 'rathely'], 'ratherest': ['ratherest', 'shatterer'], 'rathest': ['rathest', 'shatter'], 'rathite': ['hartite', 'rathite'], 'rathole': ['loather', 'rathole'], 'raticidal': ['raticidal', 'triadical'], 'raticide': ['ceratiid', 'raticide'], 'ratine': ['nerita', 'ratine', 'retain', 'retina', 'tanier'], 'rating': ['rating', 'tringa'], 'ratio': ['ariot', 'ratio'], 'ration': ['aroint', 'ration'], 'rationable': ['alboranite', 'rationable'], 'rational': ['notarial', 'rational', 'rotalian'], 'rationale': ['alienator', 'rationale'], 'rationalize': ['rationalize', 'realization'], 'rationally': ['notarially', 'rationally'], 'rationate': ['notariate', 'rationate'], 'ratitae': ['arietta', 'ratitae'], 'ratite': ['attire', 'ratite', 'tertia'], 'ratitous': ['outstair', 'ratitous'], 'ratlike': ['artlike', 'ratlike', 'tarlike'], 'ratline': ['entrail', 'latiner', 'latrine', 'ratline', 'reliant', 'retinal', 'trenail'], 'rattage': ['garetta', 'rattage', 'regatta'], 'rattan': ['rattan', 'tantra', 'tartan'], 'ratteen': ['entreat', 'ratteen', 'tarente', 'ternate', 'tetrane'], 'ratten': ['attern', 'natter', 'ratten', 'tarten'], 'ratti': ['ratti', 'titar', 'trait'], 'rattish': ['athirst', 'rattish', 'tartish'], 'rattle': ['artlet', 'latter', 'rattle', 'tartle', 'tatler'], 'rattles': ['rattles', 'slatter', 'starlet', 'startle'], 'rattlesome': ['rattlesome', 'saltometer'], 'rattly': ['rattly', 'tartly'], 'ratton': ['attorn', 'ratton', 'rottan'], 'rattus': ['astrut', 'rattus', 'stuart'], 'ratwood': ['ratwood', 'tarwood'], 'raught': ['raught', 'tughra'], 'rauk': ['kuar', 'raku', 'rauk'], 'raul': ['alur', 'laur', 'lura', 'raul', 'ural'], 'rauli': ['rauli', 'urali', 'urial'], 'raun': ['raun', 'uran', 'urna'], 'raunge': ['nauger', 'raunge', 'ungear'], 'rave': ['aver', 'rave', 'vare', 'vera'], 'ravel': ['arvel', 'larve', 'laver', 'ravel', 'velar'], 'ravelin': ['elinvar', 'ravelin', 'reanvil', 'valerin'], 'ravelly': ['ravelly', 'valeryl'], 'ravendom': ['overdamn', 'ravendom'], 'ravenelia': ['ravenelia', 'veneralia'], 'ravenish': ['enravish', 'ravenish', 'vanisher'], 'ravi': ['ravi', 'riva', 'vair', 'vari', 'vira'], 'ravigote': ['ravigote', 'rogative'], 'ravin': ['invar', 'ravin', 'vanir'], 'ravine': ['averin', 'ravine'], 'ravined': ['invader', 'ravined', 'viander'], 'raving': ['grivna', 'raving'], 'ravissant': ['ravissant', 'srivatsan'], 'raw': ['raw', 'war'], 'rawboned': ['downbear', 'rawboned'], 'rawish': ['rawish', 'wairsh', 'warish'], 'rax': ['arx', 'rax'], 'ray': ['ary', 'ray', 'yar'], 'raya': ['arya', 'raya'], 'rayan': ['aryan', 'nayar', 'rayan'], 'rayed': ['deary', 'deray', 'rayed', 'ready', 'yeard'], 'raylet': ['lyrate', 'raylet', 'realty', 'telary'], 'rayonnance': ['annoyancer', 'rayonnance'], 'raze': ['ezra', 'raze'], 're': ['er', 're'], 'rea': ['aer', 'are', 'ear', 'era', 'rea'], 'reaal': ['areal', 'reaal'], 'reabandon': ['abandoner', 'reabandon'], 'reabolish': ['abolisher', 'reabolish'], 'reabsent': ['absenter', 'reabsent'], 'reabsorb': ['absorber', 'reabsorb'], 'reaccession': ['accessioner', 'reaccession'], 'reaccomplish': ['accomplisher', 'reaccomplish'], 'reaccord': ['accorder', 'reaccord'], 'reaccost': ['ectosarc', 'reaccost'], 'reach': ['acher', 'arche', 'chare', 'chera', 'rache', 'reach'], 'reachieve': ['echeveria', 'reachieve'], 'react': ['caret', 'carte', 'cater', 'crate', 'creat', 'creta', 'react', 'recta', 'trace'], 'reactance': ['cancerate', 'reactance'], 'reaction': ['actioner', 'anerotic', 'ceration', 'creation', 'reaction'], 'reactional': ['creational', 'crotalinae', 'laceration', 'reactional'], 'reactionary': ['creationary', 'reactionary'], 'reactionism': ['anisometric', 'creationism', 'miscreation', 'ramisection', 'reactionism'], 'reactionist': ['creationist', 'reactionist'], 'reactive': ['creative', 'reactive'], 'reactively': ['creatively', 'reactively'], 'reactiveness': ['creativeness', 'reactiveness'], 'reactivity': ['creativity', 'reactivity'], 'reactor': ['creator', 'reactor'], 'read': ['ared', 'daer', 'dare', 'dear', 'read'], 'readapt': ['adapter', 'predata', 'readapt'], 'readd': ['adder', 'dread', 'readd'], 'readdress': ['addresser', 'readdress'], 'reader': ['reader', 'redare', 'reread'], 'reading': ['degrain', 'deraign', 'deringa', 'gradine', 'grained', 'reading'], 'readjust': ['adjuster', 'readjust'], 'readopt': ['adopter', 'protead', 'readopt'], 'readorn': ['adorner', 'readorn'], 'ready': ['deary', 'deray', 'rayed', 'ready', 'yeard'], 'reaffect': ['affecter', 'reaffect'], 'reaffirm': ['affirmer', 'reaffirm'], 'reafflict': ['afflicter', 'reafflict'], 'reagent': ['grantee', 'greaten', 'reagent', 'rentage'], 'reagin': ['arenig', 'earing', 'gainer', 'reagin', 'regain'], 'reak': ['rake', 'reak'], 'real': ['earl', 'eral', 'lear', 'real'], 'reales': ['alerse', 'leaser', 'reales', 'resale', 'reseal', 'sealer'], 'realest': ['realest', 'reslate', 'resteal', 'stealer', 'teasler'], 'realign': ['aligner', 'engrail', 'realign', 'reginal'], 'realignment': ['engrailment', 'realignment'], 'realism': ['mislear', 'realism'], 'realist': ['aletris', 'alister', 'listera', 'realist', 'saltier'], 'realistic': ['eristical', 'realistic'], 'reality': ['irately', 'reality'], 'realive': ['realive', 'valerie'], 'realization': ['rationalize', 'realization'], 'reallot': ['reallot', 'rotella', 'tallero'], 'reallow': ['allower', 'reallow'], 'reallude': ['laureled', 'reallude'], 'realmlet': ['realmlet', 'tremella'], 'realter': ['alterer', 'realter', 'relater'], 'realtor': ['realtor', 'relator'], 'realty': ['lyrate', 'raylet', 'realty', 'telary'], 'ream': ['erma', 'mare', 'rame', 'ream'], 'reamage': ['megaera', 'reamage'], 'reamass': ['amasser', 'reamass'], 'reamend': ['amender', 'meander', 'reamend', 'reedman'], 'reamer': ['marree', 'reamer'], 'reamuse': ['measure', 'reamuse'], 'reamy': ['mayer', 'reamy'], 'reanchor': ['anchorer', 'ranchero', 'reanchor'], 'reanneal': ['annealer', 'lernaean', 'reanneal'], 'reannex': ['annexer', 'reannex'], 'reannoy': ['annoyer', 'reannoy'], 'reanoint': ['anointer', 'inornate', 'nonirate', 'reanoint'], 'reanswer': ['answerer', 'reanswer'], 'reanvil': ['elinvar', 'ravelin', 'reanvil', 'valerin'], 'reap': ['aper', 'pare', 'pear', 'rape', 'reap'], 'reapdole': ['leoparde', 'reapdole'], 'reappeal': ['appealer', 'reappeal'], 'reappear': ['appearer', 'rapparee', 'reappear'], 'reapplaud': ['applauder', 'reapplaud'], 'reappoint': ['appointer', 'reappoint'], 'reapportion': ['apportioner', 'reapportion'], 'reapprehend': ['apprehender', 'reapprehend'], 'reapproach': ['approacher', 'reapproach'], 'rear': ['rare', 'rear'], 'reargue': ['augerer', 'reargue'], 'reargument': ['garmenture', 'reargument'], 'rearise': ['rearise', 'reraise'], 'rearm': ['armer', 'rearm'], 'rearray': ['arrayer', 'rearray'], 'rearrest': ['arrester', 'rearrest'], 'reascend': ['ascender', 'reascend'], 'reascent': ['reascent', 'sarcenet'], 'reascertain': ['ascertainer', 'reascertain', 'secretarian'], 'reask': ['asker', 'reask', 'saker', 'sekar'], 'reason': ['arseno', 'reason'], 'reassail': ['assailer', 'reassail'], 'reassault': ['assaulter', 'reassault', 'saleratus'], 'reassay': ['assayer', 'reassay'], 'reassent': ['assenter', 'reassent', 'sarsenet'], 'reassert': ['asserter', 'reassert'], 'reassign': ['assigner', 'reassign'], 'reassist': ['assister', 'reassist'], 'reassort': ['assertor', 'assorter', 'oratress', 'reassort'], 'reastonish': ['astonisher', 'reastonish', 'treasonish'], 'reasty': ['atresy', 'estray', 'reasty', 'stayer'], 'reasy': ['reasy', 'resay', 'sayer', 'seary'], 'reattach': ['attacher', 'reattach'], 'reattack': ['attacker', 'reattack'], 'reattain': ['attainer', 'reattain', 'tertiana'], 'reattempt': ['attempter', 'reattempt'], 'reattend': ['attender', 'nattered', 'reattend'], 'reattest': ['attester', 'reattest'], 'reattract': ['attracter', 'reattract'], 'reattraction': ['reattraction', 'retractation'], 'reatus': ['auster', 'reatus'], 'reavail': ['reavail', 'valeria'], 'reave': ['eaver', 'reave'], 'reavoid': ['avodire', 'avoider', 'reavoid'], 'reavouch': ['avoucher', 'reavouch'], 'reavow': ['avower', 'reavow'], 'reawait': ['awaiter', 'reawait'], 'reawaken': ['awakener', 'reawaken'], 'reaward': ['awarder', 'reaward'], 'reb': ['ber', 'reb'], 'rebab': ['barbe', 'bebar', 'breba', 'rebab'], 'reback': ['backer', 'reback'], 'rebag': ['bagre', 'barge', 'begar', 'rebag'], 'rebait': ['baiter', 'barite', 'rebait', 'terbia'], 'rebake': ['beaker', 'berake', 'rebake'], 'reballast': ['ballaster', 'reballast'], 'reballot': ['balloter', 'reballot'], 'reban': ['abner', 'arneb', 'reban'], 'rebanish': ['banisher', 'rebanish'], 'rebar': ['barer', 'rebar'], 'rebargain': ['bargainer', 'rebargain'], 'rebasis': ['brassie', 'rebasis'], 'rebate': ['beater', 'berate', 'betear', 'rebate', 'rebeat'], 'rebater': ['rebater', 'terebra'], 'rebathe': ['breathe', 'rebathe'], 'rebato': ['boater', 'borate', 'rebato'], 'rebawl': ['bawler', 'brelaw', 'rebawl', 'warble'], 'rebear': ['bearer', 'rebear'], 'rebeat': ['beater', 'berate', 'betear', 'rebate', 'rebeat'], 'rebeck': ['becker', 'rebeck'], 'rebed': ['brede', 'breed', 'rebed'], 'rebeg': ['gerbe', 'grebe', 'rebeg'], 'rebeggar': ['beggarer', 'rebeggar'], 'rebegin': ['bigener', 'rebegin'], 'rebehold': ['beholder', 'rebehold'], 'rebellow': ['bellower', 'rebellow'], 'rebelly': ['bellyer', 'rebelly'], 'rebelong': ['belonger', 'rebelong'], 'rebend': ['bender', 'berend', 'rebend'], 'rebenefit': ['benefiter', 'rebenefit'], 'rebeset': ['besteer', 'rebeset'], 'rebestow': ['bestower', 'rebestow'], 'rebetray': ['betrayer', 'eatberry', 'rebetray', 'teaberry'], 'rebewail': ['bewailer', 'rebewail'], 'rebia': ['barie', 'beira', 'erbia', 'rebia'], 'rebias': ['braise', 'rabies', 'rebias'], 'rebid': ['bider', 'bredi', 'bride', 'rebid'], 'rebill': ['biller', 'rebill'], 'rebillet': ['billeter', 'rebillet'], 'rebind': ['binder', 'inbred', 'rebind'], 'rebirth': ['brither', 'rebirth'], 'rebite': ['bertie', 'betire', 'rebite'], 'reblade': ['bleared', 'reblade'], 'reblast': ['blaster', 'reblast', 'stabler'], 'rebleach': ['bleacher', 'rebleach'], 'reblend': ['blender', 'reblend'], 'rebless': ['blesser', 'rebless'], 'reblock': ['blocker', 'brockle', 'reblock'], 'rebloom': ['bloomer', 'rebloom'], 'reblot': ['bolter', 'orblet', 'reblot', 'rebolt'], 'reblow': ['blower', 'bowler', 'reblow', 'worble'], 'reblue': ['brulee', 'burele', 'reblue'], 'rebluff': ['bluffer', 'rebluff'], 'reblunder': ['blunderer', 'reblunder'], 'reboant': ['baronet', 'reboant'], 'reboantic': ['bicornate', 'carbonite', 'reboantic'], 'reboard': ['arbored', 'boarder', 'reboard'], 'reboast': ['barotse', 'boaster', 'reboast', 'sorbate'], 'reboil': ['boiler', 'reboil'], 'rebold': ['belord', 'bordel', 'rebold'], 'rebolt': ['bolter', 'orblet', 'reblot', 'rebolt'], 'rebone': ['boreen', 'enrobe', 'neebor', 'rebone'], 'rebook': ['booker', 'brooke', 'rebook'], 'rebop': ['probe', 'rebop'], 'rebore': ['rebore', 'rerobe'], 'reborrow': ['borrower', 'reborrow'], 'rebound': ['beround', 'bounder', 'rebound', 'unbored', 'unorbed', 'unrobed'], 'rebounder': ['rebounder', 'underrobe'], 'rebox': ['boxer', 'rebox'], 'rebrace': ['cerebra', 'rebrace'], 'rebraid': ['braider', 'rebraid'], 'rebranch': ['brancher', 'rebranch'], 'rebrand': ['bernard', 'brander', 'rebrand'], 'rebrandish': ['brandisher', 'rebrandish'], 'rebreed': ['breeder', 'rebreed'], 'rebrew': ['brewer', 'rebrew'], 'rebribe': ['berberi', 'rebribe'], 'rebring': ['bringer', 'rebring'], 'rebroach': ['broacher', 'rebroach'], 'rebroadcast': ['broadcaster', 'rebroadcast'], 'rebrown': ['browner', 'rebrown'], 'rebrush': ['brusher', 'rebrush'], 'rebud': ['bedur', 'rebud', 'redub'], 'rebudget': ['budgeter', 'rebudget'], 'rebuff': ['buffer', 'rebuff'], 'rebuffet': ['buffeter', 'rebuffet'], 'rebuild': ['builder', 'rebuild'], 'rebulk': ['bulker', 'rebulk'], 'rebunch': ['buncher', 'rebunch'], 'rebundle': ['blendure', 'rebundle'], 'reburden': ['burdener', 'reburden'], 'reburn': ['burner', 'reburn'], 'reburnish': ['burnisher', 'reburnish'], 'reburst': ['burster', 'reburst'], 'rebus': ['burse', 'rebus', 'suber'], 'rebush': ['busher', 'rebush'], 'rebut': ['brute', 'buret', 'rebut', 'tuber'], 'rebute': ['rebute', 'retube'], 'rebuttal': ['burletta', 'rebuttal'], 'rebutton': ['buttoner', 'rebutton'], 'rebuy': ['buyer', 'rebuy'], 'recalk': ['calker', 'lacker', 'rackle', 'recalk', 'reckla'], 'recall': ['caller', 'cellar', 'recall'], 'recampaign': ['campaigner', 'recampaign'], 'recancel': ['canceler', 'clarence', 'recancel'], 'recant': ['canter', 'creant', 'cretan', 'nectar', 'recant', 'tanrec', 'trance'], 'recantation': ['recantation', 'triacontane'], 'recanter': ['canterer', 'recanter', 'recreant', 'terrance'], 'recap': ['caper', 'crape', 'pacer', 'perca', 'recap'], 'recaption': ['preaction', 'precation', 'recaption'], 'recarpet': ['pretrace', 'recarpet'], 'recart': ['arrect', 'carter', 'crater', 'recart', 'tracer'], 'recase': ['cesare', 'crease', 'recase', 'searce'], 'recash': ['arches', 'chaser', 'eschar', 'recash', 'search'], 'recast': ['carest', 'caster', 'recast'], 'recatch': ['catcher', 'recatch'], 'recede': ['decree', 'recede'], 'recedent': ['centered', 'decenter', 'decentre', 'recedent'], 'receder': ['decreer', 'receder'], 'receipt': ['ereptic', 'precite', 'receipt'], 'receiptor': ['procerite', 'receiptor'], 'receivables': ['receivables', 'serviceable'], 'received': ['deceiver', 'received'], 'recement': ['cementer', 'cerement', 'recement'], 'recension': ['ninescore', 'recension'], 'recensionist': ['intercession', 'recensionist'], 'recent': ['center', 'recent', 'tenrec'], 'recenter': ['centerer', 'recenter', 'recentre', 'terrence'], 'recentre': ['centerer', 'recenter', 'recentre', 'terrence'], 'reception': ['prenotice', 'reception'], 'receptoral': ['praelector', 'receptoral'], 'recess': ['cesser', 'recess'], 'rechain': ['chainer', 'enchair', 'rechain'], 'rechal': ['rachel', 'rechal'], 'rechamber': ['chamberer', 'rechamber'], 'rechange': ['encharge', 'rechange'], 'rechant': ['chanter', 'rechant'], 'rechar': ['archer', 'charer', 'rechar'], 'recharter': ['charterer', 'recharter'], 'rechase': ['archsee', 'rechase'], 'rechaser': ['rechaser', 'research', 'searcher'], 'rechasten': ['chastener', 'rechasten'], 'rechaw': ['chawer', 'rechaw'], 'recheat': ['cheater', 'hectare', 'recheat', 'reteach', 'teacher'], 'recheck': ['checker', 'recheck'], 'recheer': ['cheerer', 'recheer'], 'rechew': ['chewer', 'rechew'], 'rechip': ['cipher', 'rechip'], 'rechisel': ['chiseler', 'rechisel'], 'rechristen': ['christener', 'rechristen'], 'rechuck': ['chucker', 'rechuck'], 'recidivous': ['recidivous', 'veridicous'], 'recipe': ['piecer', 'pierce', 'recipe'], 'recipiend': ['perdicine', 'recipiend'], 'recipient': ['princeite', 'recipient'], 'reciprocate': ['carpocerite', 'reciprocate'], 'recirculate': ['clericature', 'recirculate'], 'recision': ['recision', 'soricine'], 'recital': ['article', 'recital'], 'recitativo': ['recitativo', 'victoriate'], 'recite': ['cerite', 'certie', 'recite', 'tierce'], 'recitement': ['centimeter', 'recitement', 'remittence'], 'reckla': ['calker', 'lacker', 'rackle', 'recalk', 'reckla'], 'reckless': ['clerkess', 'reckless'], 'reckling': ['clerking', 'reckling'], 'reckon': ['conker', 'reckon'], 'reclaim': ['claimer', 'miracle', 'reclaim'], 'reclaimer': ['calmierer', 'reclaimer'], 'reclama': ['cameral', 'caramel', 'carmela', 'ceramal', 'reclama'], 'reclang': ['cangler', 'glancer', 'reclang'], 'reclasp': ['clasper', 'reclasp', 'scalper'], 'reclass': ['carless', 'classer', 'reclass'], 'reclean': ['cleaner', 'reclean'], 'reclear': ['clearer', 'reclear'], 'reclimb': ['climber', 'reclimb'], 'reclinate': ['intercale', 'interlace', 'lacertine', 'reclinate'], 'reclinated': ['credential', 'interlaced', 'reclinated'], 'recluse': ['luceres', 'recluse'], 'recluseness': ['censureless', 'recluseness'], 'reclusion': ['cornelius', 'inclosure', 'reclusion'], 'reclusive': ['reclusive', 'versicule'], 'recoach': ['caroche', 'coacher', 'recoach'], 'recoal': ['carole', 'coaler', 'coelar', 'oracle', 'recoal'], 'recoast': ['coaster', 'recoast'], 'recoat': ['coater', 'recoat'], 'recock': ['cocker', 'recock'], 'recoil': ['coiler', 'recoil'], 'recoilment': ['clinometer', 'recoilment'], 'recoin': ['cerion', 'coiner', 'neroic', 'orcein', 'recoin'], 'recoinage': ['aerogenic', 'recoinage'], 'recollate': ['electoral', 'recollate'], 'recollation': ['collationer', 'recollation'], 'recollection': ['collectioner', 'recollection'], 'recollet': ['colleter', 'coteller', 'coterell', 'recollet'], 'recolor': ['colorer', 'recolor'], 'recomb': ['comber', 'recomb'], 'recomfort': ['comforter', 'recomfort'], 'recommand': ['commander', 'recommand'], 'recommend': ['commender', 'recommend'], 'recommission': ['commissioner', 'recommission'], 'recompact': ['compacter', 'recompact'], 'recompass': ['compasser', 'recompass'], 'recompetition': ['competitioner', 'recompetition'], 'recomplain': ['complainer', 'procnemial', 'recomplain'], 'recompound': ['compounder', 'recompound'], 'recomprehend': ['comprehender', 'recomprehend'], 'recon': ['coner', 'crone', 'recon'], 'reconceal': ['concealer', 'reconceal'], 'reconcert': ['concreter', 'reconcert'], 'reconcession': ['concessioner', 'reconcession'], 'reconcoct': ['concocter', 'reconcoct'], 'recondemn': ['condemner', 'recondemn'], 'recondensation': ['nondesecration', 'recondensation'], 'recondition': ['conditioner', 'recondition'], 'reconfer': ['confrere', 'enforcer', 'reconfer'], 'reconfess': ['confesser', 'reconfess'], 'reconfirm': ['confirmer', 'reconfirm'], 'reconform': ['conformer', 'reconform'], 'reconfound': ['confounder', 'reconfound'], 'reconfront': ['confronter', 'reconfront'], 'recongeal': ['congealer', 'recongeal'], 'reconjoin': ['conjoiner', 'reconjoin'], 'reconnect': ['concenter', 'reconnect'], 'reconnoiter': ['reconnoiter', 'reconnoitre'], 'reconnoitre': ['reconnoiter', 'reconnoitre'], 'reconsent': ['consenter', 'nonsecret', 'reconsent'], 'reconsider': ['considerer', 'reconsider'], 'reconsign': ['consigner', 'reconsign'], 'reconstitution': ['constitutioner', 'reconstitution'], 'reconstruct': ['constructer', 'reconstruct'], 'reconsult': ['consulter', 'reconsult'], 'recontend': ['contender', 'recontend'], 'recontest': ['contester', 'recontest'], 'recontinue': ['recontinue', 'unctioneer'], 'recontract': ['contracter', 'correctant', 'recontract'], 'reconvention': ['conventioner', 'reconvention'], 'reconvert': ['converter', 'reconvert'], 'reconvey': ['conveyer', 'reconvey'], 'recook': ['cooker', 'recook'], 'recool': ['cooler', 'recool'], 'recopper': ['copperer', 'recopper'], 'recopyright': ['copyrighter', 'recopyright'], 'record': ['corder', 'record'], 'recordation': ['corrodentia', 'recordation'], 'recork': ['corker', 'recork', 'rocker'], 'recorrection': ['correctioner', 'recorrection'], 'recorrupt': ['corrupter', 'recorrupt'], 'recounsel': ['enclosure', 'recounsel'], 'recount': ['cornute', 'counter', 'recount', 'trounce'], 'recountal': ['nucleator', 'recountal'], 'recoup': ['couper', 'croupe', 'poucer', 'recoup'], 'recourse': ['recourse', 'resource'], 'recover': ['coverer', 'recover'], 'recramp': ['cramper', 'recramp'], 'recrank': ['cranker', 'recrank'], 'recrate': ['caterer', 'recrate', 'retrace', 'terrace'], 'recreant': ['canterer', 'recanter', 'recreant', 'terrance'], 'recredit': ['cedriret', 'directer', 'recredit', 'redirect'], 'recrew': ['crewer', 'recrew'], 'recrimination': ['intermorainic', 'recrimination'], 'recroon': ['coroner', 'crooner', 'recroon'], 'recross': ['crosser', 'recross'], 'recrowd': ['crowder', 'recrowd'], 'recrown': ['crowner', 'recrown'], 'recrudency': ['decurrency', 'recrudency'], 'recruital': ['curtailer', 'recruital', 'reticular'], 'recrush': ['crusher', 'recrush'], 'recta': ['caret', 'carte', 'cater', 'crate', 'creat', 'creta', 'react', 'recta', 'trace'], 'rectal': ['carlet', 'cartel', 'claret', 'rectal', 'talcer'], 'rectalgia': ['cartilage', 'rectalgia'], 'recti': ['citer', 'recti', 'ticer', 'trice'], 'rectifiable': ['certifiable', 'rectifiable'], 'rectification': ['certification', 'cretification', 'rectification'], 'rectificative': ['certificative', 'rectificative'], 'rectificator': ['certificator', 'rectificator'], 'rectificatory': ['certificatory', 'rectificatory'], 'rectified': ['certified', 'rectified'], 'rectifier': ['certifier', 'rectifier'], 'rectify': ['certify', 'cretify', 'rectify'], 'rection': ['cerotin', 'cointer', 'cotrine', 'cretion', 'noticer', 'rection'], 'rectitude': ['certitude', 'rectitude'], 'rectoress': ['crosstree', 'rectoress'], 'rectorship': ['cristopher', 'rectorship'], 'rectotome': ['octometer', 'rectotome', 'tocometer'], 'rectovesical': ['rectovesical', 'vesicorectal'], 'recur': ['curer', 'recur'], 'recurl': ['curler', 'recurl'], 'recurse': ['recurse', 'rescuer', 'securer'], 'recurtain': ['recurtain', 'unerratic'], 'recurvation': ['countervair', 'overcurtain', 'recurvation'], 'recurvous': ['recurvous', 'verrucous'], 'recusance': ['recusance', 'securance'], 'recusant': ['etruscan', 'recusant'], 'recusation': ['nectarious', 'recusation'], 'recusator': ['craterous', 'recusator'], 'recuse': ['cereus', 'ceruse', 'recuse', 'rescue', 'secure'], 'recut': ['cruet', 'eruct', 'recut', 'truce'], 'red': ['erd', 'red'], 'redact': ['cedrat', 'decart', 'redact'], 'redaction': ['citronade', 'endaortic', 'redaction'], 'redactional': ['declaration', 'redactional'], 'redamage': ['dreamage', 'redamage'], 'redan': ['andre', 'arend', 'daren', 'redan'], 'redare': ['reader', 'redare', 'reread'], 'redarken': ['darkener', 'redarken'], 'redarn': ['darner', 'darren', 'errand', 'rander', 'redarn'], 'redart': ['darter', 'dartre', 'redart', 'retard', 'retrad', 'tarred', 'trader'], 'redate': ['derate', 'redate'], 'redaub': ['dauber', 'redaub'], 'redawn': ['andrew', 'redawn', 'wander', 'warden'], 'redbait': ['redbait', 'tribade'], 'redbud': ['budder', 'redbud'], 'redcoat': ['cordate', 'decator', 'redcoat'], 'redden': ['nedder', 'redden'], 'reddingite': ['digredient', 'reddingite'], 'rede': ['deer', 'dere', 'dree', 'rede', 'reed'], 'redeal': ['dealer', 'leader', 'redeal', 'relade', 'relead'], 'redeck': ['decker', 'redeck'], 'redeed': ['redeed', 'reeded'], 'redeem': ['deemer', 'meered', 'redeem', 'remede'], 'redefault': ['defaulter', 'redefault'], 'redefeat': ['defeater', 'federate', 'redefeat'], 'redefine': ['needfire', 'redefine'], 'redeflect': ['redeflect', 'reflected'], 'redelay': ['delayer', 'layered', 'redelay'], 'redeliver': ['deliverer', 'redeliver'], 'redemand': ['demander', 'redemand'], 'redemolish': ['demolisher', 'redemolish'], 'redeny': ['redeny', 'yender'], 'redepend': ['depender', 'redepend'], 'redeprive': ['prederive', 'redeprive'], 'rederivation': ['rederivation', 'veratroidine'], 'redescend': ['descender', 'redescend'], 'redescription': ['prediscretion', 'redescription'], 'redesign': ['designer', 'redesign', 'resigned'], 'redesman': ['redesman', 'seamrend'], 'redetect': ['detecter', 'redetect'], 'redevelop': ['developer', 'redevelop'], 'redfin': ['finder', 'friend', 'redfin', 'refind'], 'redhoop': ['redhoop', 'rhodope'], 'redia': ['aider', 'deair', 'irade', 'redia'], 'redient': ['nitered', 'redient', 'teinder'], 'redig': ['dirge', 'gride', 'redig', 'ridge'], 'redigest': ['digester', 'redigest'], 'rediminish': ['diminisher', 'rediminish'], 'redintegrator': ['redintegrator', 'retrogradient'], 'redip': ['pride', 'pried', 'redip'], 'redirect': ['cedriret', 'directer', 'recredit', 'redirect'], 'redisable': ['desirable', 'redisable'], 'redisappear': ['disappearer', 'redisappear'], 'rediscount': ['discounter', 'rediscount'], 'rediscover': ['discoverer', 'rediscover'], 'rediscuss': ['discusser', 'rediscuss'], 'redispatch': ['dispatcher', 'redispatch'], 'redisplay': ['displayer', 'redisplay'], 'redispute': ['disrepute', 'redispute'], 'redistend': ['dendrites', 'distender', 'redistend'], 'redistill': ['distiller', 'redistill'], 'redistinguish': ['distinguisher', 'redistinguish'], 'redistrain': ['distrainer', 'redistrain'], 'redisturb': ['disturber', 'redisturb'], 'redive': ['derive', 'redive'], 'redivert': ['diverter', 'redivert', 'verditer'], 'redleg': ['gelder', 'ledger', 'redleg'], 'redlegs': ['redlegs', 'sledger'], 'redo': ['doer', 'redo', 'rode', 'roed'], 'redock': ['corked', 'docker', 'redock'], 'redolent': ['redolent', 'rondelet'], 'redoom': ['doomer', 'mooder', 'redoom', 'roomed'], 'redoubling': ['bouldering', 'redoubling'], 'redoubt': ['doubter', 'obtrude', 'outbred', 'redoubt'], 'redound': ['redound', 'rounded', 'underdo'], 'redowa': ['redowa', 'woader'], 'redraft': ['drafter', 'redraft'], 'redrag': ['darger', 'gerard', 'grader', 'redrag', 'regard'], 'redraw': ['drawer', 'redraw', 'reward', 'warder'], 'redrawer': ['redrawer', 'rewarder', 'warderer'], 'redream': ['dreamer', 'redream'], 'redress': ['dresser', 'redress'], 'redrill': ['driller', 'redrill'], 'redrive': ['deriver', 'redrive', 'rivered'], 'redry': ['derry', 'redry', 'ryder'], 'redtail': ['dilater', 'lardite', 'redtail'], 'redtop': ['deport', 'ported', 'redtop'], 'redub': ['bedur', 'rebud', 'redub'], 'reductant': ['reductant', 'traducent', 'truncated'], 'reduction': ['introduce', 'reduction'], 'reductional': ['radiolucent', 'reductional'], 'redue': ['redue', 'urdee'], 'redunca': ['durance', 'redunca', 'unraced'], 'redwithe': ['redwithe', 'withered'], 'redye': ['redye', 'reedy'], 'ree': ['eer', 'ere', 'ree'], 'reechy': ['cheery', 'reechy'], 'reed': ['deer', 'dere', 'dree', 'rede', 'reed'], 'reeded': ['redeed', 'reeded'], 'reeden': ['endere', 'needer', 'reeden'], 'reedily': ['reedily', 'reyield', 'yielder'], 'reeding': ['energid', 'reeding'], 'reedling': ['engirdle', 'reedling'], 'reedman': ['amender', 'meander', 'reamend', 'reedman'], 'reedwork': ['reedwork', 'reworked'], 'reedy': ['redye', 'reedy'], 'reef': ['feer', 'free', 'reef'], 'reefing': ['feering', 'feigner', 'freeing', 'reefing', 'refeign'], 'reek': ['eker', 'reek'], 'reel': ['leer', 'reel'], 'reeler': ['reeler', 'rereel'], 'reelingly': ['leeringly', 'reelingly'], 'reem': ['mere', 'reem'], 'reeming': ['reeming', 'regimen'], 'reen': ['erne', 'neer', 'reen'], 'reenge': ['neeger', 'reenge', 'renege'], 'rees': ['erse', 'rees', 'seer', 'sere'], 'reese': ['esere', 'reese', 'resee'], 'reesk': ['esker', 'keres', 'reesk', 'seker', 'skeer', 'skere'], 'reest': ['ester', 'estre', 'reest', 'reset', 'steer', 'stere', 'stree', 'terse', 'tsere'], 'reester': ['reester', 'steerer'], 'reestle': ['reestle', 'resteel', 'steeler'], 'reesty': ['reesty', 'yester'], 'reet': ['reet', 'teer', 'tree'], 'reetam': ['reetam', 'retame', 'teamer'], 'reeveland': ['landreeve', 'reeveland'], 'refall': ['faller', 'refall'], 'refashion': ['fashioner', 'refashion'], 'refasten': ['fastener', 'fenestra', 'refasten'], 'refavor': ['favorer', 'overfar', 'refavor'], 'refeed': ['feeder', 'refeed'], 'refeel': ['feeler', 'refeel', 'reflee'], 'refeign': ['feering', 'feigner', 'freeing', 'reefing', 'refeign'], 'refel': ['fleer', 'refel'], 'refer': ['freer', 'refer'], 'referment': ['fermenter', 'referment'], 'refetch': ['fetcher', 'refetch'], 'refight': ['fighter', 'freight', 'refight'], 'refill': ['filler', 'refill'], 'refilter': ['filterer', 'refilter'], 'refinable': ['inferable', 'refinable'], 'refind': ['finder', 'friend', 'redfin', 'refind'], 'refine': ['ferine', 'refine'], 'refined': ['definer', 'refined'], 'refiner': ['refiner', 'reinfer'], 'refinger': ['fingerer', 'refinger'], 'refining': ['infringe', 'refining'], 'refinish': ['finisher', 'refinish'], 'refit': ['freit', 'refit'], 'refix': ['fixer', 'refix'], 'reflash': ['flasher', 'reflash'], 'reflected': ['redeflect', 'reflected'], 'reflee': ['feeler', 'refeel', 'reflee'], 'refling': ['ferling', 'flinger', 'refling'], 'refloat': ['floater', 'florate', 'refloat'], 'reflog': ['golfer', 'reflog'], 'reflood': ['flooder', 'reflood'], 'refloor': ['floorer', 'refloor'], 'reflourish': ['flourisher', 'reflourish'], 'reflow': ['flower', 'fowler', 'reflow', 'wolfer'], 'reflower': ['flowerer', 'reflower'], 'reflush': ['flusher', 'reflush'], 'reflux': ['fluxer', 'reflux'], 'refluxed': ['flexured', 'refluxed'], 'refly': ['ferly', 'flyer', 'refly'], 'refocus': ['focuser', 'refocus'], 'refold': ['folder', 'refold'], 'refoment': ['fomenter', 'refoment'], 'refoot': ['footer', 'refoot'], 'reforecast': ['forecaster', 'reforecast'], 'reforest': ['forester', 'fosterer', 'reforest'], 'reforfeit': ['forfeiter', 'reforfeit'], 'reform': ['former', 'reform'], 'reformado': ['doorframe', 'reformado'], 'reformed': ['deformer', 'reformed'], 'reformism': ['misreform', 'reformism'], 'reformist': ['reformist', 'restiform'], 'reforward': ['forwarder', 'reforward'], 'refound': ['founder', 'refound'], 'refoundation': ['foundationer', 'refoundation'], 'refreshen': ['freshener', 'refreshen'], 'refrighten': ['frightener', 'refrighten'], 'refront': ['fronter', 'refront'], 'reft': ['fret', 'reft', 'tref'], 'refuel': ['ferule', 'fueler', 'refuel'], 'refund': ['funder', 'refund'], 'refurbish': ['furbisher', 'refurbish'], 'refurl': ['furler', 'refurl'], 'refurnish': ['furnisher', 'refurnish'], 'refusingly': ['refusingly', 'syringeful'], 'refutal': ['faulter', 'refutal', 'tearful'], 'refute': ['fuerte', 'refute'], 'reg': ['erg', 'ger', 'reg'], 'regain': ['arenig', 'earing', 'gainer', 'reagin', 'regain'], 'regal': ['argel', 'ergal', 'garle', 'glare', 'lager', 'large', 'regal'], 'regalia': ['lairage', 'railage', 'regalia'], 'regalian': ['algerian', 'geranial', 'regalian'], 'regalist': ['glaister', 'regalist'], 'regallop': ['galloper', 'regallop'], 'regally': ['allergy', 'gallery', 'largely', 'regally'], 'regalness': ['largeness', 'rangeless', 'regalness'], 'regard': ['darger', 'gerard', 'grader', 'redrag', 'regard'], 'regarnish': ['garnisher', 'regarnish'], 'regather': ['gatherer', 'regather'], 'regatta': ['garetta', 'rattage', 'regatta'], 'regelate': ['eglatere', 'regelate', 'relegate'], 'regelation': ['regelation', 'relegation'], 'regenesis': ['energesis', 'regenesis'], 'regent': ['gerent', 'regent'], 'reges': ['reges', 'serge'], 'reget': ['egret', 'greet', 'reget'], 'regga': ['agger', 'gager', 'regga'], 'reggie': ['greige', 'reggie'], 'regia': ['geira', 'regia'], 'regild': ['gilder', 'girdle', 'glider', 'regild', 'ridgel'], 'regill': ['giller', 'grille', 'regill'], 'regimen': ['reeming', 'regimen'], 'regimenal': ['margeline', 'regimenal'], 'regin': ['grein', 'inger', 'nigre', 'regin', 'reign', 'ringe'], 'reginal': ['aligner', 'engrail', 'realign', 'reginal'], 'reginald': ['dragline', 'reginald', 'ringlead'], 'region': ['ignore', 'region'], 'regional': ['geraniol', 'regional'], 'registered': ['deregister', 'registered'], 'registerer': ['registerer', 'reregister'], 'regive': ['grieve', 'regive'], 'regladden': ['gladdener', 'glandered', 'regladden'], 'reglair': ['grailer', 'reglair'], 'regle': ['leger', 'regle'], 'reglet': ['gretel', 'reglet'], 'regloss': ['glosser', 'regloss'], 'reglove': ['overleg', 'reglove'], 'reglow': ['glower', 'reglow'], 'regma': ['grame', 'marge', 'regma'], 'regnal': ['angler', 'arleng', 'garnel', 'largen', 'rangle', 'regnal'], 'regraft': ['grafter', 'regraft'], 'regrant': ['granter', 'regrant'], 'regrasp': ['grasper', 'regrasp', 'sparger'], 'regrass': ['grasser', 'regrass'], 'regrate': ['greater', 'regrate', 'terrage'], 'regrating': ['gartering', 'regrating'], 'regrator': ['garroter', 'regrator'], 'regreen': ['greener', 'regreen', 'reneger'], 'regreet': ['greeter', 'regreet'], 'regrind': ['grinder', 'regrind'], 'regrinder': ['derringer', 'regrinder'], 'regrip': ['griper', 'regrip'], 'regroup': ['grouper', 'regroup'], 'regrow': ['grower', 'regrow'], 'reguard': ['guarder', 'reguard'], 'regula': ['ragule', 'regula'], 'regulation': ['regulation', 'urogenital'], 'reguli': ['ligure', 'reguli'], 'regur': ['regur', 'urger'], 'regush': ['gusher', 'regush'], 'reh': ['her', 'reh', 'rhe'], 'rehale': ['healer', 'rehale', 'reheal'], 'rehallow': ['hallower', 'rehallow'], 'rehammer': ['hammerer', 'rehammer'], 'rehang': ['hanger', 'rehang'], 'reharden': ['hardener', 'reharden'], 'reharm': ['harmer', 'reharm'], 'reharness': ['harnesser', 'reharness'], 'reharrow': ['harrower', 'reharrow'], 'reharvest': ['harvester', 'reharvest'], 'rehash': ['hasher', 'rehash'], 'rehaul': ['hauler', 'rehaul'], 'rehazard': ['hazarder', 'rehazard'], 'rehead': ['adhere', 'header', 'hedera', 'rehead'], 'reheal': ['healer', 'rehale', 'reheal'], 'reheap': ['heaper', 'reheap'], 'rehear': ['hearer', 'rehear'], 'rehearser': ['rehearser', 'reshearer'], 'rehearten': ['heartener', 'rehearten'], 'reheat': ['heater', 'hereat', 'reheat'], 'reheel': ['heeler', 'reheel'], 'reheighten': ['heightener', 'reheighten'], 'rehoist': ['hoister', 'rehoist'], 'rehollow': ['hollower', 'rehollow'], 'rehonor': ['honorer', 'rehonor'], 'rehook': ['hooker', 'rehook'], 'rehoop': ['hooper', 'rehoop'], 'rehung': ['hunger', 'rehung'], 'reid': ['dier', 'dire', 'reid', 'ride'], 'reif': ['fire', 'reif', 'rife'], 'reify': ['fiery', 'reify'], 'reign': ['grein', 'inger', 'nigre', 'regin', 'reign', 'ringe'], 'reignore': ['erigeron', 'reignore'], 'reillustrate': ['reillustrate', 'ultrasterile'], 'reim': ['emir', 'imer', 'mire', 'reim', 'remi', 'riem', 'rime'], 'reimbody': ['embryoid', 'reimbody'], 'reimpart': ['imparter', 'reimpart'], 'reimplant': ['implanter', 'reimplant'], 'reimply': ['primely', 'reimply'], 'reimport': ['importer', 'promerit', 'reimport'], 'reimpose': ['perisome', 'promisee', 'reimpose'], 'reimpress': ['impresser', 'reimpress'], 'reimpression': ['reimpression', 'repermission'], 'reimprint': ['imprinter', 'reimprint'], 'reimprison': ['imprisoner', 'reimprison'], 'rein': ['neri', 'rein', 'rine'], 'reina': ['erian', 'irena', 'reina'], 'reincentive': ['internecive', 'reincentive'], 'reincite': ['icterine', 'reincite'], 'reincrudate': ['antireducer', 'reincrudate', 'untraceried'], 'reindeer': ['denierer', 'reindeer'], 'reindict': ['indicter', 'indirect', 'reindict'], 'reindue': ['reindue', 'uredine'], 'reinfect': ['frenetic', 'infecter', 'reinfect'], 'reinfer': ['refiner', 'reinfer'], 'reinfest': ['infester', 'reinfest'], 'reinflate': ['interleaf', 'reinflate'], 'reinflict': ['inflicter', 'reinflict'], 'reinform': ['informer', 'reinform', 'reniform'], 'reinhabit': ['inhabiter', 'reinhabit'], 'reins': ['reins', 'resin', 'rinse', 'risen', 'serin', 'siren'], 'reinsane': ['anserine', 'reinsane'], 'reinsert': ['inserter', 'reinsert'], 'reinsist': ['insister', 'reinsist', 'sinister', 'sisterin'], 'reinspect': ['prescient', 'reinspect'], 'reinspector': ['prosecretin', 'reinspector'], 'reinspirit': ['inspiriter', 'reinspirit'], 'reinstall': ['installer', 'reinstall'], 'reinstation': ['reinstation', 'santorinite'], 'reinstill': ['instiller', 'reinstill'], 'reinstruct': ['instructer', 'intercrust', 'reinstruct'], 'reinsult': ['insulter', 'lustrine', 'reinsult'], 'reintend': ['indenter', 'intender', 'reintend'], 'reinter': ['reinter', 'terrine'], 'reinterest': ['interester', 'reinterest'], 'reinterpret': ['interpreter', 'reinterpret'], 'reinterrupt': ['interrupter', 'reinterrupt'], 'reinterview': ['interviewer', 'reinterview'], 'reintrench': ['intrencher', 'reintrench'], 'reintrude': ['reintrude', 'unretired'], 'reinvent': ['inventer', 'reinvent', 'ventrine', 'vintener'], 'reinvert': ['inverter', 'reinvert', 'trinerve'], 'reinvest': ['reinvest', 'servient'], 'reis': ['reis', 'rise', 'seri', 'sier', 'sire'], 'reit': ['iter', 'reit', 'rite', 'teri', 'tier', 'tire'], 'reiter': ['errite', 'reiter', 'retier', 'retire', 'tierer'], 'reiterable': ['reiterable', 'reliberate'], 'rejail': ['jailer', 'rejail'], 'rejerk': ['jerker', 'rejerk'], 'rejoin': ['joiner', 'rejoin'], 'rejolt': ['jolter', 'rejolt'], 'rejourney': ['journeyer', 'rejourney'], 'reki': ['erik', 'kier', 'reki'], 'rekick': ['kicker', 'rekick'], 'rekill': ['killer', 'rekill'], 'rekiss': ['kisser', 'rekiss'], 'reknit': ['reknit', 'tinker'], 'reknow': ['knower', 'reknow', 'wroken'], 'rel': ['ler', 'rel'], 'relabel': ['labeler', 'relabel'], 'relace': ['alerce', 'cereal', 'relace'], 'relacquer': ['lacquerer', 'relacquer'], 'relade': ['dealer', 'leader', 'redeal', 'relade', 'relead'], 'reladen': ['leander', 'learned', 'reladen'], 'relais': ['israel', 'relais', 'resail', 'sailer', 'serail', 'serial'], 'relament': ['lamenter', 'relament', 'remantle'], 'relamp': ['lamper', 'palmer', 'relamp'], 'reland': ['aldern', 'darnel', 'enlard', 'lander', 'lenard', 'randle', 'reland'], 'relap': ['lepra', 'paler', 'parel', 'parle', 'pearl', 'perla', 'relap'], 'relapse': ['pleaser', 'preseal', 'relapse'], 'relapsing': ['espringal', 'presignal', 'relapsing'], 'relast': ['laster', 'lastre', 'rastle', 'relast', 'resalt', 'salter', 'slater', 'stelar'], 'relata': ['latera', 'relata'], 'relatability': ['alterability', 'bilaterality', 'relatability'], 'relatable': ['alterable', 'relatable'], 'relatch': ['clethra', 'latcher', 'ratchel', 'relatch', 'talcher', 'trachle'], 'relate': ['earlet', 'elater', 'relate'], 'related': ['delater', 'related', 'treadle'], 'relater': ['alterer', 'realter', 'relater'], 'relation': ['oriental', 'relation', 'tirolean'], 'relationism': ['misrelation', 'orientalism', 'relationism'], 'relationist': ['orientalist', 'relationist'], 'relative': ['levirate', 'relative'], 'relativization': ['relativization', 'revitalization'], 'relativize': ['relativize', 'revitalize'], 'relator': ['realtor', 'relator'], 'relaunch': ['launcher', 'relaunch'], 'relay': ['early', 'layer', 'relay'], 'relead': ['dealer', 'leader', 'redeal', 'relade', 'relead'], 'releap': ['leaper', 'releap', 'repale', 'repeal'], 'relearn': ['learner', 'relearn'], 'releather': ['leatherer', 'releather', 'tarheeler'], 'relection': ['centriole', 'electrion', 'relection'], 'relegate': ['eglatere', 'regelate', 'relegate'], 'relegation': ['regelation', 'relegation'], 'relend': ['lender', 'relend'], 'reletter': ['letterer', 'reletter'], 'relevant': ['levanter', 'relevant', 'revelant'], 'relevation': ['relevation', 'revelation'], 'relevator': ['relevator', 'revelator', 'veratrole'], 'relevel': ['leveler', 'relevel'], 'reliably': ['beryllia', 'reliably'], 'reliance': ['cerealin', 'cinereal', 'reliance'], 'reliant': ['entrail', 'latiner', 'latrine', 'ratline', 'reliant', 'retinal', 'trenail'], 'reliantly': ['interally', 'reliantly'], 'reliberate': ['reiterable', 'reliberate'], 'relic': ['crile', 'elric', 'relic'], 'relick': ['licker', 'relick', 'rickle'], 'relicted': ['derelict', 'relicted'], 'relier': ['lierre', 'relier'], 'relieving': ['inveigler', 'relieving'], 'relievo': ['overlie', 'relievo'], 'relift': ['fertil', 'filter', 'lifter', 'relift', 'trifle'], 'religation': ['genitorial', 'religation'], 'relight': ['lighter', 'relight', 'rightle'], 'relighten': ['lightener', 'relighten', 'threeling'], 'religion': ['ligroine', 'religion'], 'relimit': ['limiter', 'relimit'], 'reline': ['lierne', 'reline'], 'relink': ['linker', 'relink'], 'relish': ['hirsel', 'hirsle', 'relish'], 'relishy': ['relishy', 'shirley'], 'relist': ['lister', 'relist'], 'relisten': ['enlister', 'esterlin', 'listener', 'relisten'], 'relive': ['levier', 'relive', 'reveil', 'revile', 'veiler'], 'reload': ['loader', 'ordeal', 'reload'], 'reloan': ['lenora', 'loaner', 'orlean', 'reloan'], 'relocation': ['iconolater', 'relocation'], 'relock': ['locker', 'relock'], 'relook': ['looker', 'relook'], 'relose': ['relose', 'resole'], 'relost': ['relost', 'reslot', 'rostel', 'sterol', 'torsel'], 'relot': ['lerot', 'orlet', 'relot'], 'relower': ['lowerer', 'relower'], 'reluct': ['cutler', 'reluct'], 'reluctation': ['countertail', 'reluctation'], 'relumine': ['lemurine', 'meruline', 'relumine'], 'rely': ['lyre', 'rely'], 'remade': ['meader', 'remade'], 'remagnification': ['germanification', 'remagnification'], 'remagnify': ['germanify', 'remagnify'], 'remail': ['mailer', 'remail'], 'remain': ['ermani', 'marine', 'remain'], 'remains': ['remains', 'seminar'], 'remaintain': ['antimerina', 'maintainer', 'remaintain'], 'reman': ['enarm', 'namer', 'reman'], 'remand': ['damner', 'manred', 'randem', 'remand'], 'remanet': ['remanet', 'remeant', 'treeman'], 'remantle': ['lamenter', 'relament', 'remantle'], 'remap': ['amper', 'remap'], 'remarch': ['charmer', 'marcher', 'remarch'], 'remark': ['marker', 'remark'], 'remarket': ['marketer', 'remarket'], 'remarry': ['marryer', 'remarry'], 'remarshal': ['marshaler', 'remarshal'], 'remask': ['masker', 'remask'], 'remass': ['masser', 'remass'], 'remast': ['martes', 'master', 'remast', 'stream'], 'remasticate': ['metrectasia', 'remasticate'], 'rematch': ['matcher', 'rematch'], 'remeant': ['remanet', 'remeant', 'treeman'], 'remede': ['deemer', 'meered', 'redeem', 'remede'], 'remeet': ['meeter', 'remeet', 'teemer'], 'remelt': ['melter', 'remelt'], 'remend': ['mender', 'remend'], 'remetal': ['lameter', 'metaler', 'remetal'], 'remi': ['emir', 'imer', 'mire', 'reim', 'remi', 'riem', 'rime'], 'remication': ['marcionite', 'microtinae', 'remication'], 'remigate': ['emigrate', 'remigate'], 'remigation': ['emigration', 'remigation'], 'remill': ['miller', 'remill'], 'remind': ['minder', 'remind'], 'remint': ['minter', 'remint', 'termin'], 'remiped': ['demirep', 'epiderm', 'impeder', 'remiped'], 'remisrepresent': ['misrepresenter', 'remisrepresent'], 'remission': ['missioner', 'remission'], 'remisunderstand': ['misunderstander', 'remisunderstand'], 'remit': ['merit', 'miter', 'mitre', 'remit', 'timer'], 'remittal': ['remittal', 'termital'], 'remittance': ['carminette', 'remittance'], 'remittence': ['centimeter', 'recitement', 'remittence'], 'remitter': ['remitter', 'trimeter'], 'remix': ['mixer', 'remix'], 'remnant': ['manrent', 'remnant'], 'remock': ['mocker', 'remock'], 'remodel': ['demerol', 'modeler', 'remodel'], 'remold': ['dermol', 'molder', 'remold'], 'remontant': ['nonmatter', 'remontant'], 'remontoir': ['interroom', 'remontoir'], 'remop': ['merop', 'moper', 'proem', 'remop'], 'remora': ['remora', 'roamer'], 'remord': ['dormer', 'remord'], 'remote': ['meteor', 'remote'], 'remotive': ['overtime', 'remotive'], 'remould': ['remould', 'ruledom'], 'remount': ['monture', 'mounter', 'remount'], 'removable': ['overblame', 'removable'], 'remunerate': ['remunerate', 'renumerate'], 'remuneration': ['remuneration', 'renumeration'], 'remurmur': ['murmurer', 'remurmur'], 'remus': ['muser', 'remus', 'serum'], 'remuster': ['musterer', 'remuster'], 'renable': ['enabler', 'renable'], 'renably': ['blarney', 'renably'], 'renail': ['arline', 'larine', 'linear', 'nailer', 'renail'], 'renaissance': ['necessarian', 'renaissance'], 'renal': ['learn', 'renal'], 'rename': ['enarme', 'meaner', 'rename'], 'renavigate': ['renavigate', 'vegetarian'], 'rend': ['dern', 'rend'], 'rendition': ['rendition', 'trinodine'], 'reneg': ['genre', 'green', 'neger', 'reneg'], 'renegadism': ['grandeeism', 'renegadism'], 'renegation': ['generation', 'renegation'], 'renege': ['neeger', 'reenge', 'renege'], 'reneger': ['greener', 'regreen', 'reneger'], 'reneglect': ['neglecter', 'reneglect'], 'renerve': ['renerve', 'venerer'], 'renes': ['renes', 'sneer'], 'renet': ['enter', 'neter', 'renet', 'terne', 'treen'], 'reniform': ['informer', 'reinform', 'reniform'], 'renilla': ['ralline', 'renilla'], 'renin': ['inner', 'renin'], 'reniportal': ['interpolar', 'reniportal'], 'renish': ['renish', 'shiner', 'shrine'], 'renitence': ['centenier', 'renitence'], 'renitency': ['nycterine', 'renitency'], 'renitent': ['renitent', 'trentine'], 'renk': ['kern', 'renk'], 'rennet': ['rennet', 'tenner'], 'renography': ['granophyre', 'renography'], 'renominate': ['enantiomer', 'renominate'], 'renotation': ['renotation', 'retonation'], 'renotice': ['erection', 'neoteric', 'nocerite', 'renotice'], 'renourish': ['nourisher', 'renourish'], 'renovate': ['overneat', 'renovate'], 'renovater': ['enervator', 'renovater', 'venerator'], 'renown': ['renown', 'wonner'], 'rent': ['rent', 'tern'], 'rentage': ['grantee', 'greaten', 'reagent', 'rentage'], 'rental': ['altern', 'antler', 'learnt', 'rental', 'ternal'], 'rentaler': ['rentaler', 'rerental'], 'rented': ['denter', 'rented', 'tender'], 'rentee': ['entree', 'rentee', 'retene'], 'renter': ['renter', 'rerent'], 'renu': ['renu', 'ruen', 'rune'], 'renumber': ['numberer', 'renumber'], 'renumerate': ['remunerate', 'renumerate'], 'renumeration': ['remuneration', 'renumeration'], 'reobtain': ['abrotine', 'baritone', 'obtainer', 'reobtain'], 'reoccasion': ['occasioner', 'reoccasion'], 'reoccupation': ['cornucopiate', 'reoccupation'], 'reoffend': ['offender', 'reoffend'], 'reoffer': ['offerer', 'reoffer'], 'reoil': ['oiler', 'oriel', 'reoil'], 'reopen': ['opener', 'reopen', 'repone'], 'reordain': ['inroader', 'ordainer', 'reordain'], 'reorder': ['orderer', 'reorder'], 'reordinate': ['reordinate', 'treronidae'], 'reornament': ['ornamenter', 'reornament'], 'reoverflow': ['overflower', 'reoverflow'], 'reown': ['owner', 'reown', 'rowen'], 'rep': ['per', 'rep'], 'repack': ['packer', 'repack'], 'repaint': ['painter', 'pertain', 'pterian', 'repaint'], 'repair': ['pairer', 'rapier', 'repair'], 'repairer': ['rareripe', 'repairer'], 'repale': ['leaper', 'releap', 'repale', 'repeal'], 'repand': ['pander', 'repand'], 'repandly': ['panderly', 'repandly'], 'repandous': ['panderous', 'repandous'], 'repanel': ['paneler', 'repanel', 'replane'], 'repaper': ['paperer', 'perpera', 'prepare', 'repaper'], 'reparagraph': ['paragrapher', 'reparagraph'], 'reparation': ['praetorian', 'reparation'], 'repark': ['parker', 'repark'], 'repartee': ['repartee', 'repeater'], 'repartition': ['partitioner', 'repartition'], 'repass': ['passer', 'repass', 'sparse'], 'repasser': ['asperser', 'repasser'], 'repast': ['paster', 'repast', 'trapes'], 'repaste': ['perates', 'repaste', 'sperate'], 'repasture': ['repasture', 'supertare'], 'repatch': ['chapter', 'patcher', 'repatch'], 'repatent': ['pattener', 'repatent'], 'repattern': ['patterner', 'repattern'], 'repawn': ['enwrap', 'pawner', 'repawn'], 'repay': ['apery', 'payer', 'repay'], 'repeal': ['leaper', 'releap', 'repale', 'repeal'], 'repeat': ['petrea', 'repeat', 'retape'], 'repeater': ['repartee', 'repeater'], 'repel': ['leper', 'perle', 'repel'], 'repen': ['neper', 'preen', 'repen'], 'repension': ['pensioner', 'repension'], 'repent': ['perten', 'repent'], 'repentable': ['penetrable', 'repentable'], 'repentance': ['penetrance', 'repentance'], 'repentant': ['penetrant', 'repentant'], 'reperceive': ['prereceive', 'reperceive'], 'repercussion': ['percussioner', 'repercussion'], 'repercussive': ['repercussive', 'superservice'], 'reperform': ['performer', 'prereform', 'reperform'], 'repermission': ['reimpression', 'repermission'], 'repermit': ['premerit', 'preremit', 'repermit'], 'reperplex': ['perplexer', 'reperplex'], 'reperusal': ['pleasurer', 'reperusal'], 'repetition': ['petitioner', 'repetition'], 'rephael': ['preheal', 'rephael'], 'rephase': ['hespera', 'rephase', 'reshape'], 'rephotograph': ['photographer', 'rephotograph'], 'rephrase': ['preshare', 'rephrase'], 'repic': ['price', 'repic'], 'repick': ['picker', 'repick'], 'repiece': ['creepie', 'repiece'], 'repin': ['piner', 'prine', 'repin', 'ripen'], 'repine': ['neiper', 'perine', 'pirene', 'repine'], 'repiner': ['repiner', 'ripener'], 'repiningly': ['repiningly', 'ripeningly'], 'repique': ['perique', 'repique'], 'repitch': ['pitcher', 'repitch'], 'replace': ['percale', 'replace'], 'replait': ['partile', 'plaiter', 'replait'], 'replan': ['parnel', 'planer', 'replan'], 'replane': ['paneler', 'repanel', 'replane'], 'replant': ['pantler', 'planter', 'replant'], 'replantable': ['planetabler', 'replantable'], 'replanter': ['prerental', 'replanter'], 'replaster': ['plasterer', 'replaster'], 'replate': ['pearlet', 'pleater', 'prelate', 'ptereal', 'replate', 'repleat'], 'replay': ['parley', 'pearly', 'player', 'replay'], 'replead': ['pearled', 'pedaler', 'pleader', 'replead'], 'repleader': ['predealer', 'repleader'], 'repleat': ['pearlet', 'pleater', 'prelate', 'ptereal', 'replate', 'repleat'], 'repleteness': ['repleteness', 'terpeneless'], 'repletion': ['interlope', 'interpole', 'repletion', 'terpineol'], 'repliant': ['interlap', 'repliant', 'triplane'], 'replica': ['caliper', 'picarel', 'replica'], 'replight': ['plighter', 'replight'], 'replod': ['podler', 'polder', 'replod'], 'replot': ['petrol', 'replot'], 'replow': ['plower', 'replow'], 'replum': ['lumper', 'plumer', 'replum', 'rumple'], 'replunder': ['plunderer', 'replunder'], 'reply': ['plyer', 'reply'], 'repocket': ['pocketer', 'repocket'], 'repoint': ['pointer', 'protein', 'pterion', 'repoint', 'tropine'], 'repolish': ['polisher', 'repolish'], 'repoll': ['poller', 'repoll'], 'reponder': ['ponderer', 'reponder'], 'repone': ['opener', 'reopen', 'repone'], 'report': ['porret', 'porter', 'report', 'troper'], 'reportage': ['porterage', 'reportage'], 'reporterism': ['misreporter', 'reporterism'], 'reportion': ['portioner', 'reportion'], 'reposed': ['deposer', 'reposed'], 'reposit': ['periost', 'porites', 'reposit', 'riposte'], 'reposition': ['positioner', 'reposition'], 'repositor': ['posterior', 'repositor'], 'repossession': ['possessioner', 'repossession'], 'repost': ['poster', 'presto', 'repost', 'respot', 'stoper'], 'repot': ['poter', 'prote', 'repot', 'tepor', 'toper', 'trope'], 'repound': ['pounder', 'repound', 'unroped'], 'repour': ['pourer', 'repour', 'rouper'], 'repowder': ['powderer', 'repowder'], 'repp': ['prep', 'repp'], 'repray': ['prayer', 'repray'], 'repreach': ['preacher', 'repreach'], 'repredict': ['precredit', 'predirect', 'repredict'], 'reprefer': ['prerefer', 'reprefer'], 'represent': ['presenter', 'represent'], 'representationism': ['misrepresentation', 'representationism'], 'repress': ['presser', 'repress'], 'repressive': ['repressive', 'respersive'], 'reprice': ['piercer', 'reprice'], 'reprieval': ['prevailer', 'reprieval'], 'reprime': ['premier', 'reprime'], 'reprint': ['printer', 'reprint'], 'reprise': ['reprise', 'respire'], 'repristination': ['interspiration', 'repristination'], 'reproachable': ['blepharocera', 'reproachable'], 'reprobate': ['perborate', 'prorebate', 'reprobate'], 'reprobation': ['probationer', 'reprobation'], 'reproceed': ['proceeder', 'reproceed'], 'reproclaim': ['proclaimer', 'reproclaim'], 'reproduce': ['procedure', 'reproduce'], 'reproduction': ['proreduction', 'reproduction'], 'reprohibit': ['prohibiter', 'reprohibit'], 'reproof': ['proofer', 'reproof'], 'reproportion': ['proportioner', 'reproportion'], 'reprotection': ['interoceptor', 'reprotection'], 'reprotest': ['protester', 'reprotest'], 'reprovision': ['prorevision', 'provisioner', 'reprovision'], 'reps': ['reps', 'resp'], 'reptant': ['pattern', 'reptant'], 'reptatorial': ['proletariat', 'reptatorial'], 'reptatory': ['protreaty', 'reptatory'], 'reptile': ['perlite', 'reptile'], 'reptilia': ['liparite', 'reptilia'], 'republish': ['publisher', 'republish'], 'repudiatory': ['preauditory', 'repudiatory'], 'repuff': ['puffer', 'repuff'], 'repugn': ['punger', 'repugn'], 'repulpit': ['pulpiter', 'repulpit'], 'repulsion': ['prelusion', 'repulsion'], 'repulsive': ['prelusive', 'repulsive'], 'repulsively': ['prelusively', 'repulsively'], 'repulsory': ['prelusory', 'repulsory'], 'repump': ['pumper', 'repump'], 'repunish': ['punisher', 'repunish'], 'reputative': ['reputative', 'vituperate'], 'repute': ['repute', 'uptree'], 'requench': ['quencher', 'requench'], 'request': ['quester', 'request'], 'requestion': ['questioner', 'requestion'], 'require': ['querier', 'require'], 'requital': ['quartile', 'requital', 'triequal'], 'requite': ['quieter', 'requite'], 'rerack': ['racker', 'rerack'], 'rerail': ['railer', 'rerail'], 'reraise': ['rearise', 'reraise'], 'rerake': ['karree', 'rerake'], 'rerank': ['ranker', 'rerank'], 'rerate': ['rerate', 'retare', 'tearer'], 'reread': ['reader', 'redare', 'reread'], 'rereel': ['reeler', 'rereel'], 'reregister': ['registerer', 'reregister'], 'rerent': ['renter', 'rerent'], 'rerental': ['rentaler', 'rerental'], 'rering': ['erring', 'rering', 'ringer'], 'rerise': ['rerise', 'sirree'], 'rerivet': ['rerivet', 'riveter'], 'rerob': ['borer', 'rerob', 'rober'], 'rerobe': ['rebore', 'rerobe'], 'reroll': ['reroll', 'roller'], 'reroof': ['reroof', 'roofer'], 'reroot': ['reroot', 'rooter', 'torero'], 'rerow': ['rerow', 'rower'], 'rerun': ['rerun', 'runer'], 'resaca': ['ascare', 'caesar', 'resaca'], 'resack': ['resack', 'sacker', 'screak'], 'resail': ['israel', 'relais', 'resail', 'sailer', 'serail', 'serial'], 'resale': ['alerse', 'leaser', 'reales', 'resale', 'reseal', 'sealer'], 'resalt': ['laster', 'lastre', 'rastle', 'relast', 'resalt', 'salter', 'slater', 'stelar'], 'resanction': ['resanction', 'sanctioner'], 'resaw': ['resaw', 'sawer', 'seraw', 'sware', 'swear', 'warse'], 'resawer': ['resawer', 'reswear', 'swearer'], 'resay': ['reasy', 'resay', 'sayer', 'seary'], 'rescan': ['casern', 'rescan'], 'rescind': ['discern', 'rescind'], 'rescinder': ['discerner', 'rescinder'], 'rescindment': ['discernment', 'rescindment'], 'rescratch': ['rescratch', 'scratcher'], 'rescuable': ['rescuable', 'securable'], 'rescue': ['cereus', 'ceruse', 'recuse', 'rescue', 'secure'], 'rescuer': ['recurse', 'rescuer', 'securer'], 'reseal': ['alerse', 'leaser', 'reales', 'resale', 'reseal', 'sealer'], 'reseam': ['reseam', 'seamer'], 'research': ['rechaser', 'research', 'searcher'], 'reseat': ['asteer', 'easter', 'eastre', 'reseat', 'saeter', 'seater', 'staree', 'teaser', 'teresa'], 'resect': ['resect', 'screet', 'secret'], 'resection': ['resection', 'secretion'], 'resectional': ['resectional', 'secretional'], 'reseda': ['erased', 'reseda', 'seared'], 'resee': ['esere', 'reese', 'resee'], 'reseed': ['reseed', 'seeder'], 'reseek': ['reseek', 'seeker'], 'resell': ['resell', 'seller'], 'resend': ['resend', 'sender'], 'resene': ['resene', 'serene'], 'resent': ['ernest', 'nester', 'resent', 'streen'], 'reservable': ['reservable', 'reversable'], 'reserval': ['reserval', 'reversal', 'slaverer'], 'reserve': ['reserve', 'resever', 'reverse', 'severer'], 'reserved': ['deserver', 'reserved', 'reversed'], 'reservedly': ['reservedly', 'reversedly'], 'reserveful': ['reserveful', 'reverseful'], 'reserveless': ['reserveless', 'reverseless'], 'reserver': ['reserver', 'reverser'], 'reservist': ['reservist', 'reversist'], 'reset': ['ester', 'estre', 'reest', 'reset', 'steer', 'stere', 'stree', 'terse', 'tsere'], 'resever': ['reserve', 'resever', 'reverse', 'severer'], 'resew': ['resew', 'sewer', 'sweer'], 'resex': ['resex', 'xeres'], 'resh': ['hers', 'resh', 'sher'], 'reshape': ['hespera', 'rephase', 'reshape'], 'reshare': ['reshare', 'reshear', 'shearer'], 'resharpen': ['resharpen', 'sharpener'], 'reshear': ['reshare', 'reshear', 'shearer'], 'reshearer': ['rehearser', 'reshearer'], 'reshift': ['reshift', 'shifter'], 'reshingle': ['englisher', 'reshingle'], 'reship': ['perish', 'reship'], 'reshipment': ['perishment', 'reshipment'], 'reshoot': ['orthose', 'reshoot', 'shooter', 'soother'], 'reshoulder': ['reshoulder', 'shoulderer'], 'reshower': ['reshower', 'showerer'], 'reshun': ['reshun', 'rushen'], 'reshunt': ['reshunt', 'shunter'], 'reshut': ['reshut', 'suther', 'thurse', 'tusher'], 'reside': ['desire', 'reside'], 'resident': ['indesert', 'inserted', 'resident'], 'resider': ['derries', 'desirer', 'resider', 'serried'], 'residua': ['residua', 'ursidae'], 'resift': ['fister', 'resift', 'sifter', 'strife'], 'resigh': ['resigh', 'sigher'], 'resign': ['resign', 'resing', 'signer', 'singer'], 'resignal': ['resignal', 'seringal', 'signaler'], 'resigned': ['designer', 'redesign', 'resigned'], 'resile': ['lisere', 'resile'], 'resiliate': ['israelite', 'resiliate'], 'resilient': ['listerine', 'resilient'], 'resilition': ['isonitrile', 'resilition'], 'resilver': ['resilver', 'silverer', 'sliverer'], 'resin': ['reins', 'resin', 'rinse', 'risen', 'serin', 'siren'], 'resina': ['arisen', 'arsine', 'resina', 'serian'], 'resinate': ['arsenite', 'resinate', 'teresian', 'teresina'], 'resing': ['resign', 'resing', 'signer', 'singer'], 'resinic': ['irenics', 'resinic', 'sericin', 'sirenic'], 'resinize': ['resinize', 'sirenize'], 'resink': ['resink', 'reskin', 'sinker'], 'resinlike': ['resinlike', 'sirenlike'], 'resinoid': ['derision', 'ironside', 'resinoid', 'sirenoid'], 'resinol': ['resinol', 'serolin'], 'resinous': ['neurosis', 'resinous'], 'resinously': ['neurolysis', 'resinously'], 'resiny': ['resiny', 'sireny'], 'resist': ['resist', 'restis', 'sister'], 'resistable': ['assertible', 'resistable'], 'resistance': ['resistance', 'senatrices'], 'resistful': ['fruitless', 'resistful'], 'resisting': ['resisting', 'sistering'], 'resistless': ['resistless', 'sisterless'], 'resize': ['resize', 'seizer'], 'resketch': ['resketch', 'sketcher'], 'reskin': ['resink', 'reskin', 'sinker'], 'reslash': ['reslash', 'slasher'], 'reslate': ['realest', 'reslate', 'resteal', 'stealer', 'teasler'], 'reslay': ['reslay', 'slayer'], 'reslot': ['relost', 'reslot', 'rostel', 'sterol', 'torsel'], 'resmell': ['resmell', 'smeller'], 'resmelt': ['melters', 'resmelt', 'smelter'], 'resmooth': ['resmooth', 'romeshot', 'smoother'], 'resnap': ['resnap', 'respan', 'snaper'], 'resnatch': ['resnatch', 'snatcher', 'stancher'], 'resoak': ['arkose', 'resoak', 'soaker'], 'resoap': ['resoap', 'soaper'], 'resoften': ['resoften', 'softener'], 'resoil': ['elisor', 'resoil'], 'resojourn': ['resojourn', 'sojourner'], 'resolder': ['resolder', 'solderer'], 'resole': ['relose', 'resole'], 'resolicit': ['resolicit', 'soliciter'], 'resolution': ['resolution', 'solutioner'], 'resonate': ['orestean', 'resonate', 'stearone'], 'resort': ['resort', 'roster', 'sorter', 'storer'], 'resorter': ['resorter', 'restorer', 'retrorse'], 'resound': ['resound', 'sounder', 'unrosed'], 'resource': ['recourse', 'resource'], 'resow': ['owser', 'resow', 'serow', 'sower', 'swore', 'worse'], 'resp': ['reps', 'resp'], 'respace': ['escaper', 'respace'], 'respade': ['psedera', 'respade'], 'respan': ['resnap', 'respan', 'snaper'], 'respeak': ['respeak', 'speaker'], 'respect': ['respect', 'scepter', 'specter'], 'respectless': ['respectless', 'scepterless'], 'respell': ['presell', 'respell', 'speller'], 'respersive': ['repressive', 'respersive'], 'respin': ['pernis', 'respin', 'sniper'], 'respiration': ['respiration', 'retinispora'], 'respire': ['reprise', 'respire'], 'respirit': ['respirit', 'spiriter'], 'respite': ['respite', 'septier'], 'resplend': ['resplend', 'splender'], 'resplice': ['eclipser', 'pericles', 'resplice'], 'responde': ['personed', 'responde'], 'respondence': ['precondense', 'respondence'], 'responsal': ['apronless', 'responsal'], 'response': ['pessoner', 'response'], 'respot': ['poster', 'presto', 'repost', 'respot', 'stoper'], 'respray': ['respray', 'sprayer'], 'respread': ['respread', 'spreader'], 'respring': ['respring', 'springer'], 'resprout': ['posturer', 'resprout', 'sprouter'], 'respue': ['peruse', 'respue'], 'resqueak': ['resqueak', 'squeaker'], 'ressaut': ['erastus', 'ressaut'], 'rest': ['rest', 'sert', 'stre'], 'restack': ['restack', 'stacker'], 'restaff': ['restaff', 'staffer'], 'restain': ['asterin', 'eranist', 'restain', 'stainer', 'starnie', 'stearin'], 'restake': ['restake', 'sakeret'], 'restamp': ['restamp', 'stamper'], 'restart': ['restart', 'starter'], 'restate': ['estreat', 'restate', 'retaste'], 'resteal': ['realest', 'reslate', 'resteal', 'stealer', 'teasler'], 'resteel': ['reestle', 'resteel', 'steeler'], 'resteep': ['estrepe', 'resteep', 'steeper'], 'restem': ['mester', 'restem', 'temser', 'termes'], 'restep': ['pester', 'preset', 'restep', 'streep'], 'restful': ['fluster', 'restful'], 'restiad': ['astride', 'diaster', 'disrate', 'restiad', 'staired'], 'restiffen': ['restiffen', 'stiffener'], 'restiform': ['reformist', 'restiform'], 'resting': ['resting', 'stinger'], 'restio': ['restio', 'sorite', 'sortie', 'triose'], 'restis': ['resist', 'restis', 'sister'], 'restitch': ['restitch', 'stitcher'], 'restive': ['restive', 'servite'], 'restock': ['restock', 'stocker'], 'restorer': ['resorter', 'restorer', 'retrorse'], 'restow': ['restow', 'stower', 'towser', 'worset'], 'restowal': ['restowal', 'sealwort'], 'restraighten': ['restraighten', 'straightener'], 'restrain': ['restrain', 'strainer', 'transire'], 'restraint': ['restraint', 'retransit', 'trainster', 'transiter'], 'restream': ['masterer', 'restream', 'streamer'], 'restrengthen': ['restrengthen', 'strengthener'], 'restress': ['restress', 'stresser'], 'restretch': ['restretch', 'stretcher'], 'restring': ['restring', 'ringster', 'stringer'], 'restrip': ['restrip', 'striper'], 'restrive': ['restrive', 'reverist'], 'restuff': ['restuff', 'stuffer'], 'resty': ['resty', 'strey'], 'restyle': ['restyle', 'tersely'], 'resucceed': ['resucceed', 'succeeder'], 'resuck': ['resuck', 'sucker'], 'resue': ['resue', 'reuse'], 'resuffer': ['resuffer', 'sufferer'], 'resuggest': ['resuggest', 'suggester'], 'resuing': ['insurge', 'resuing'], 'resuit': ['isuret', 'resuit'], 'result': ['luster', 'result', 'rustle', 'sutler', 'ulster'], 'resulting': ['resulting', 'ulstering'], 'resultless': ['lusterless', 'lustreless', 'resultless'], 'resummon': ['resummon', 'summoner'], 'resun': ['nurse', 'resun'], 'resup': ['purse', 'resup', 'sprue', 'super'], 'resuperheat': ['resuperheat', 'superheater'], 'resupinate': ['interpause', 'resupinate'], 'resupination': ['resupination', 'uranospinite'], 'resupport': ['resupport', 'supporter'], 'resuppose': ['resuppose', 'superpose'], 'resupposition': ['resupposition', 'superposition'], 'resuppress': ['resuppress', 'suppresser'], 'resurrender': ['resurrender', 'surrenderer'], 'resurround': ['resurround', 'surrounder'], 'resuspect': ['resuspect', 'suspecter'], 'resuspend': ['resuspend', 'suspender', 'unpressed'], 'reswallow': ['reswallow', 'swallower'], 'resward': ['drawers', 'resward'], 'reswarm': ['reswarm', 'swarmer'], 'reswear': ['resawer', 'reswear', 'swearer'], 'resweat': ['resweat', 'sweater'], 'resweep': ['resweep', 'sweeper'], 'reswell': ['reswell', 'sweller'], 'reswill': ['reswill', 'swiller'], 'retable': ['bearlet', 'bleater', 'elberta', 'retable'], 'retack': ['racket', 'retack', 'tacker'], 'retag': ['gater', 'grate', 'great', 'greta', 'retag', 'targe'], 'retail': ['lirate', 'retail', 'retial', 'tailer'], 'retailer': ['irrelate', 'retailer'], 'retain': ['nerita', 'ratine', 'retain', 'retina', 'tanier'], 'retainal': ['retainal', 'telarian'], 'retainder': ['irredenta', 'retainder'], 'retainer': ['arretine', 'eretrian', 'eritrean', 'retainer'], 'retaining': ['negritian', 'retaining'], 'retaliate': ['elettaria', 'retaliate'], 'retalk': ['kartel', 'retalk', 'talker'], 'retama': ['ramate', 'retama'], 'retame': ['reetam', 'retame', 'teamer'], 'retan': ['antre', 'arent', 'retan', 'terna'], 'retape': ['petrea', 'repeat', 'retape'], 'retard': ['darter', 'dartre', 'redart', 'retard', 'retrad', 'tarred', 'trader'], 'retardent': ['retardent', 'tetrander'], 'retare': ['rerate', 'retare', 'tearer'], 'retaste': ['estreat', 'restate', 'retaste'], 'retax': ['extra', 'retax', 'taxer'], 'retaxation': ['retaxation', 'tetraxonia'], 'retch': ['chert', 'retch'], 'reteach': ['cheater', 'hectare', 'recheat', 'reteach', 'teacher'], 'retelegraph': ['retelegraph', 'telegrapher'], 'retell': ['retell', 'teller'], 'retem': ['meter', 'retem'], 'retemper': ['retemper', 'temperer'], 'retempt': ['retempt', 'tempter'], 'retenant': ['retenant', 'tenanter'], 'retender': ['retender', 'tenderer'], 'retene': ['entree', 'rentee', 'retene'], 'retent': ['netter', 'retent', 'tenter'], 'retention': ['intertone', 'retention'], 'retepora': ['perorate', 'retepora'], 'retest': ['retest', 'setter', 'street', 'tester'], 'rethank': ['rethank', 'thanker'], 'rethatch': ['rethatch', 'thatcher'], 'rethaw': ['rethaw', 'thawer', 'wreath'], 'rethe': ['ether', 'rethe', 'theer', 'there', 'three'], 'retheness': ['retheness', 'thereness', 'threeness'], 'rethicken': ['kitchener', 'rethicken', 'thickener'], 'rethink': ['rethink', 'thinker'], 'rethrash': ['rethrash', 'thrasher'], 'rethread': ['rethread', 'threader'], 'rethreaten': ['rethreaten', 'threatener'], 'rethresh': ['rethresh', 'thresher'], 'rethrill': ['rethrill', 'thriller'], 'rethrow': ['rethrow', 'thrower'], 'rethrust': ['rethrust', 'thruster'], 'rethunder': ['rethunder', 'thunderer'], 'retia': ['arite', 'artie', 'irate', 'retia', 'tarie'], 'retial': ['lirate', 'retail', 'retial', 'tailer'], 'reticent': ['reticent', 'tencteri'], 'reticket': ['reticket', 'ticketer'], 'reticula': ['arculite', 'cutleria', 'lucretia', 'reticula', 'treculia'], 'reticular': ['curtailer', 'recruital', 'reticular'], 'retier': ['errite', 'reiter', 'retier', 'retire', 'tierer'], 'retighten': ['retighten', 'tightener'], 'retill': ['retill', 'rillet', 'tiller'], 'retimber': ['retimber', 'timberer'], 'retime': ['metier', 'retime', 'tremie'], 'retin': ['inert', 'inter', 'niter', 'retin', 'trine'], 'retina': ['nerita', 'ratine', 'retain', 'retina', 'tanier'], 'retinal': ['entrail', 'latiner', 'latrine', 'ratline', 'reliant', 'retinal', 'trenail'], 'retinalite': ['retinalite', 'trilineate'], 'retinene': ['internee', 'retinene'], 'retinian': ['neritina', 'retinian'], 'retinispora': ['respiration', 'retinispora'], 'retinite': ['intertie', 'retinite'], 'retinker': ['retinker', 'tinkerer'], 'retinochorioiditis': ['chorioidoretinitis', 'retinochorioiditis'], 'retinoid': ['neritoid', 'retinoid'], 'retinue': ['neurite', 'retinue', 'reunite', 'uterine'], 'retinula': ['lutrinae', 'retinula', 'rutelian', 'tenurial'], 'retinular': ['retinular', 'trineural'], 'retip': ['perit', 'retip', 'tripe'], 'retiral': ['retiral', 'retrial', 'trailer'], 'retire': ['errite', 'reiter', 'retier', 'retire', 'tierer'], 'retirer': ['retirer', 'terrier'], 'retistene': ['retistene', 'serinette'], 'retoast': ['retoast', 'rosetta', 'stoater', 'toaster'], 'retold': ['retold', 'rodlet'], 'retomb': ['retomb', 'trombe'], 'retonation': ['renotation', 'retonation'], 'retool': ['looter', 'retool', 'rootle', 'tooler'], 'retooth': ['retooth', 'toother'], 'retort': ['retort', 'retrot', 'rotter'], 'retoss': ['retoss', 'tosser'], 'retouch': ['retouch', 'toucher'], 'retour': ['retour', 'router', 'tourer'], 'retrace': ['caterer', 'recrate', 'retrace', 'terrace'], 'retrack': ['retrack', 'tracker'], 'retractation': ['reattraction', 'retractation'], 'retracted': ['detracter', 'retracted'], 'retraction': ['retraction', 'triaconter'], 'retrad': ['darter', 'dartre', 'redart', 'retard', 'retrad', 'tarred', 'trader'], 'retrade': ['derater', 'retrade', 'retread', 'treader'], 'retradition': ['retradition', 'traditioner'], 'retrain': ['arterin', 'retrain', 'terrain', 'trainer'], 'retral': ['retral', 'terral'], 'retramp': ['retramp', 'tramper'], 'retransform': ['retransform', 'transformer'], 'retransit': ['restraint', 'retransit', 'trainster', 'transiter'], 'retransplant': ['retransplant', 'transplanter'], 'retransport': ['retransport', 'transporter'], 'retravel': ['retravel', 'revertal', 'traveler'], 'retread': ['derater', 'retrade', 'retread', 'treader'], 'retreat': ['ettarre', 'retreat', 'treater'], 'retree': ['retree', 'teerer'], 'retrench': ['retrench', 'trencher'], 'retrial': ['retiral', 'retrial', 'trailer'], 'retrim': ['mitrer', 'retrim', 'trimer'], 'retrocaecal': ['accelerator', 'retrocaecal'], 'retrogradient': ['redintegrator', 'retrogradient'], 'retrorse': ['resorter', 'restorer', 'retrorse'], 'retrot': ['retort', 'retrot', 'rotter'], 'retrue': ['retrue', 'ureter'], 'retrust': ['retrust', 'truster'], 'retry': ['retry', 'terry'], 'retter': ['retter', 'terret'], 'retting': ['gittern', 'gritten', 'retting'], 'retube': ['rebute', 'retube'], 'retuck': ['retuck', 'tucker'], 'retune': ['neuter', 'retune', 'runtee', 'tenure', 'tureen'], 'returf': ['returf', 'rufter'], 'return': ['return', 'turner'], 'retuse': ['retuse', 'tereus'], 'retwine': ['enwrite', 'retwine'], 'retwist': ['retwist', 'twister'], 'retzian': ['retzian', 'terzina'], 'reub': ['bure', 'reub', 'rube'], 'reundergo': ['guerdoner', 'reundergo', 'undergoer', 'undergore'], 'reune': ['enure', 'reune'], 'reunfold': ['flounder', 'reunfold', 'unfolder'], 'reunify': ['reunify', 'unfiery'], 'reunionist': ['reunionist', 'sturionine'], 'reunite': ['neurite', 'retinue', 'reunite', 'uterine'], 'reunpack': ['reunpack', 'unpacker'], 'reuphold': ['reuphold', 'upholder'], 'reupholster': ['reupholster', 'upholsterer'], 'reuplift': ['reuplift', 'uplifter'], 'reuse': ['resue', 'reuse'], 'reutter': ['reutter', 'utterer'], 'revacate': ['acervate', 'revacate'], 'revalidation': ['derivational', 'revalidation'], 'revamp': ['revamp', 'vamper'], 'revarnish': ['revarnish', 'varnisher'], 'reve': ['ever', 'reve', 'veer'], 'reveal': ['laveer', 'leaver', 'reveal', 'vealer'], 'reveil': ['levier', 'relive', 'reveil', 'revile', 'veiler'], 'revel': ['elver', 'lever', 'revel'], 'revelant': ['levanter', 'relevant', 'revelant'], 'revelation': ['relevation', 'revelation'], 'revelator': ['relevator', 'revelator', 'veratrole'], 'reveler': ['leverer', 'reveler'], 'revenant': ['revenant', 'venerant'], 'revend': ['revend', 'vender'], 'revender': ['revender', 'reverend'], 'reveneer': ['reveneer', 'veneerer'], 'revent': ['revent', 'venter'], 'revenue': ['revenue', 'unreeve'], 'rever': ['rever', 'verre'], 'reverend': ['revender', 'reverend'], 'reverential': ['interleaver', 'reverential'], 'reverist': ['restrive', 'reverist'], 'revers': ['revers', 'server', 'verser'], 'reversable': ['reservable', 'reversable'], 'reversal': ['reserval', 'reversal', 'slaverer'], 'reverse': ['reserve', 'resever', 'reverse', 'severer'], 'reversed': ['deserver', 'reserved', 'reversed'], 'reversedly': ['reservedly', 'reversedly'], 'reverseful': ['reserveful', 'reverseful'], 'reverseless': ['reserveless', 'reverseless'], 'reverser': ['reserver', 'reverser'], 'reversewise': ['reversewise', 'revieweress'], 'reversi': ['reversi', 'reviser'], 'reversion': ['reversion', 'versioner'], 'reversist': ['reservist', 'reversist'], 'revertal': ['retravel', 'revertal', 'traveler'], 'revest': ['revest', 'servet', 'sterve', 'verset', 'vester'], 'revet': ['evert', 'revet'], 'revete': ['revete', 'tervee'], 'revictual': ['lucrative', 'revictual', 'victualer'], 'review': ['review', 'viewer'], 'revieweress': ['reversewise', 'revieweress'], 'revigorate': ['overgaiter', 'revigorate'], 'revile': ['levier', 'relive', 'reveil', 'revile', 'veiler'], 'reviling': ['reviling', 'vierling'], 'revisal': ['revisal', 'virales'], 'revise': ['revise', 'siever'], 'revised': ['deviser', 'diverse', 'revised'], 'reviser': ['reversi', 'reviser'], 'revision': ['revision', 'visioner'], 'revisit': ['revisit', 'visiter'], 'revisitant': ['revisitant', 'transitive'], 'revitalization': ['relativization', 'revitalization'], 'revitalize': ['relativize', 'revitalize'], 'revocation': ['overaction', 'revocation'], 'revocative': ['overactive', 'revocative'], 'revoke': ['evoker', 'revoke'], 'revolting': ['overglint', 'revolting'], 'revolute': ['revolute', 'truelove'], 'revolve': ['evolver', 'revolve'], 'revomit': ['revomit', 'vomiter'], 'revote': ['revote', 'vetoer'], 'revuist': ['revuist', 'stuiver'], 'rewade': ['drawee', 'rewade'], 'rewager': ['rewager', 'wagerer'], 'rewake': ['kerewa', 'rewake'], 'rewaken': ['rewaken', 'wakener'], 'rewall': ['rewall', 'waller'], 'rewallow': ['rewallow', 'wallower'], 'reward': ['drawer', 'redraw', 'reward', 'warder'], 'rewarder': ['redrawer', 'rewarder', 'warderer'], 'rewarm': ['rewarm', 'warmer'], 'rewarn': ['rewarn', 'warner', 'warren'], 'rewash': ['hawser', 'rewash', 'washer'], 'rewater': ['rewater', 'waterer'], 'rewave': ['rewave', 'weaver'], 'rewax': ['rewax', 'waxer'], 'reweaken': ['reweaken', 'weakener'], 'rewear': ['rewear', 'warree', 'wearer'], 'rewed': ['dewer', 'ewder', 'rewed'], 'reweigh': ['reweigh', 'weigher'], 'reweld': ['reweld', 'welder'], 'rewet': ['rewet', 'tewer', 'twere'], 'rewhirl': ['rewhirl', 'whirler'], 'rewhisper': ['rewhisper', 'whisperer'], 'rewhiten': ['rewhiten', 'whitener'], 'rewiden': ['rewiden', 'widener'], 'rewin': ['erwin', 'rewin', 'winer'], 'rewind': ['rewind', 'winder'], 'rewish': ['rewish', 'wisher'], 'rewithdraw': ['rewithdraw', 'withdrawer'], 'reword': ['reword', 'worder'], 'rework': ['rework', 'worker'], 'reworked': ['reedwork', 'reworked'], 'rewound': ['rewound', 'unrowed', 'wounder'], 'rewoven': ['overnew', 'rewoven'], 'rewrap': ['prewar', 'rewrap', 'warper'], 'reyield': ['reedily', 'reyield', 'yielder'], 'rhacianectes': ['rachianectes', 'rhacianectes'], 'rhaetian': ['earthian', 'rhaetian'], 'rhaetic': ['certhia', 'rhaetic', 'theriac'], 'rhamnose': ['horseman', 'rhamnose', 'shoreman'], 'rhamnoside': ['admonisher', 'rhamnoside'], 'rhapis': ['parish', 'raphis', 'rhapis'], 'rhapontic': ['anthropic', 'rhapontic'], 'rhaponticin': ['panornithic', 'rhaponticin'], 'rhason': ['rhason', 'sharon', 'shoran'], 'rhatania': ['ratanhia', 'rhatania'], 'rhe': ['her', 'reh', 'rhe'], 'rhea': ['hare', 'hear', 'rhea'], 'rheen': ['herne', 'rheen'], 'rheic': ['cheir', 'rheic'], 'rhein': ['hiren', 'rhein', 'rhine'], 'rheinic': ['hircine', 'rheinic'], 'rhema': ['harem', 'herma', 'rhema'], 'rhematic': ['athermic', 'marchite', 'rhematic'], 'rheme': ['herem', 'rheme'], 'rhemist': ['rhemist', 'smither'], 'rhenium': ['inhumer', 'rhenium'], 'rheometric': ['chirometer', 'rheometric'], 'rheophile': ['herophile', 'rheophile'], 'rheoscope': ['prechoose', 'rheoscope'], 'rheostatic': ['choristate', 'rheostatic'], 'rheotactic': ['rheotactic', 'theocratic'], 'rheotan': ['another', 'athenor', 'rheotan'], 'rheotropic': ['horopteric', 'rheotropic', 'trichopore'], 'rhesian': ['arshine', 'nearish', 'rhesian', 'sherani'], 'rhesus': ['rhesus', 'suresh'], 'rhetor': ['rhetor', 'rother'], 'rhetoricals': ['rhetoricals', 'trochlearis'], 'rhetorize': ['rhetorize', 'theorizer'], 'rheumatic': ['hematuric', 'rheumatic'], 'rhine': ['hiren', 'rhein', 'rhine'], 'rhinestone': ['neornithes', 'rhinestone'], 'rhineura': ['rhineura', 'unhairer'], 'rhinocele': ['cholerine', 'rhinocele'], 'rhinopharyngitis': ['pharyngorhinitis', 'rhinopharyngitis'], 'rhipidate': ['rhipidate', 'thripidae'], 'rhizoctonia': ['chorization', 'rhizoctonia', 'zonotrichia'], 'rhoda': ['hoard', 'rhoda'], 'rhodaline': ['hodiernal', 'rhodaline'], 'rhodanthe': ['rhodanthe', 'thornhead'], 'rhodeose': ['rhodeose', 'seerhood'], 'rhodes': ['dehors', 'rhodes', 'shoder', 'shored'], 'rhodic': ['orchid', 'rhodic'], 'rhodite': ['rhodite', 'theroid'], 'rhodium': ['humidor', 'rhodium'], 'rhodope': ['redhoop', 'rhodope'], 'rhodopsin': ['donorship', 'rhodopsin'], 'rhoecus': ['choreus', 'chouser', 'rhoecus'], 'rhopalic': ['orphical', 'rhopalic'], 'rhus': ['rhus', 'rush'], 'rhynchotal': ['chloranthy', 'rhynchotal'], 'rhyton': ['rhyton', 'thorny'], 'ria': ['air', 'ira', 'ria'], 'rial': ['aril', 'lair', 'lari', 'liar', 'lira', 'rail', 'rial'], 'riancy': ['cairny', 'riancy'], 'riant': ['riant', 'tairn', 'tarin', 'train'], 'riata': ['arati', 'atria', 'riata', 'tarai', 'tiara'], 'ribald': ['bildar', 'bridal', 'ribald'], 'ribaldly': ['bridally', 'ribaldly'], 'riband': ['brandi', 'riband'], 'ribat': ['barit', 'ribat'], 'ribbed': ['dibber', 'ribbed'], 'ribber': ['briber', 'ribber'], 'ribble': ['libber', 'ribble'], 'ribbon': ['ribbon', 'robbin'], 'ribe': ['beri', 'bier', 'brei', 'ribe'], 'ribes': ['birse', 'ribes'], 'riblet': ['beltir', 'riblet'], 'ribroast': ['arborist', 'ribroast'], 'ribspare': ['ribspare', 'sparerib'], 'rice': ['eric', 'rice'], 'ricer': ['crier', 'ricer'], 'ricey': ['criey', 'ricey'], 'richardia': ['charadrii', 'richardia'], 'richdom': ['chromid', 'richdom'], 'richen': ['enrich', 'nicher', 'richen'], 'riches': ['riches', 'shicer'], 'richt': ['crith', 'richt'], 'ricine': ['irenic', 'ricine'], 'ricinoleate': ['arenicolite', 'ricinoleate'], 'rickets': ['rickets', 'sticker'], 'rickle': ['licker', 'relick', 'rickle'], 'rictal': ['citral', 'rictal'], 'rictus': ['citrus', 'curtis', 'rictus', 'rustic'], 'ridable': ['bedrail', 'bridale', 'ridable'], 'ridably': ['bardily', 'rabidly', 'ridably'], 'riddam': ['madrid', 'riddam'], 'riddance': ['adendric', 'riddance'], 'riddel': ['lidder', 'riddel', 'riddle'], 'ridden': ['dinder', 'ridden', 'rinded'], 'riddle': ['lidder', 'riddel', 'riddle'], 'ride': ['dier', 'dire', 'reid', 'ride'], 'rideau': ['auride', 'rideau'], 'riden': ['diner', 'riden', 'rinde'], 'rident': ['dirten', 'rident', 'tinder'], 'rider': ['drier', 'rider'], 'ridered': ['deirdre', 'derider', 'derride', 'ridered'], 'ridge': ['dirge', 'gride', 'redig', 'ridge'], 'ridgel': ['gilder', 'girdle', 'glider', 'regild', 'ridgel'], 'ridgelike': ['dirgelike', 'ridgelike'], 'ridger': ['girder', 'ridger'], 'ridging': ['girding', 'ridging'], 'ridgingly': ['girdingly', 'ridgingly'], 'ridgling': ['girdling', 'ridgling'], 'ridgy': ['igdyr', 'ridgy'], 'rie': ['ire', 'rie'], 'riem': ['emir', 'imer', 'mire', 'reim', 'remi', 'riem', 'rime'], 'rife': ['fire', 'reif', 'rife'], 'rifeness': ['finesser', 'rifeness'], 'rifle': ['filer', 'flier', 'lifer', 'rifle'], 'rifleman': ['inflamer', 'rifleman'], 'rift': ['frit', 'rift'], 'rigadoon': ['gordonia', 'organoid', 'rigadoon'], 'rigation': ['rigation', 'trigonia'], 'rigbane': ['bearing', 'begrain', 'brainge', 'rigbane'], 'right': ['girth', 'grith', 'right'], 'rightle': ['lighter', 'relight', 'rightle'], 'rigling': ['girling', 'rigling'], 'rigolette': ['gloriette', 'rigolette'], 'rik': ['irk', 'rik'], 'rikisha': ['rikisha', 'shikari'], 'rikk': ['kirk', 'rikk'], 'riksha': ['rakish', 'riksha', 'shikar', 'shikra', 'sikhra'], 'rile': ['lier', 'lire', 'rile'], 'rillet': ['retill', 'rillet', 'tiller'], 'rillett': ['rillett', 'trillet'], 'rillock': ['rillock', 'rollick'], 'rim': ['mir', 'rim'], 'rima': ['amir', 'irma', 'mari', 'mira', 'rami', 'rima'], 'rimal': ['armil', 'marli', 'rimal'], 'rimate': ['imaret', 'metria', 'mirate', 'rimate'], 'rime': ['emir', 'imer', 'mire', 'reim', 'remi', 'riem', 'rime'], 'rimmed': ['dimmer', 'immerd', 'rimmed'], 'rimose': ['isomer', 'rimose'], 'rimple': ['limper', 'prelim', 'rimple'], 'rimu': ['muir', 'rimu'], 'rimula': ['rimula', 'uramil'], 'rimy': ['miry', 'rimy', 'yirm'], 'rinaldo': ['nailrod', 'ordinal', 'rinaldo', 'rodinal'], 'rinceau': ['aneuric', 'rinceau'], 'rincon': ['cornin', 'rincon'], 'rinde': ['diner', 'riden', 'rinde'], 'rinded': ['dinder', 'ridden', 'rinded'], 'rindle': ['linder', 'rindle'], 'rine': ['neri', 'rein', 'rine'], 'ring': ['girn', 'grin', 'ring'], 'ringable': ['balinger', 'ringable'], 'ringe': ['grein', 'inger', 'nigre', 'regin', 'reign', 'ringe'], 'ringed': ['engird', 'ringed'], 'ringer': ['erring', 'rering', 'ringer'], 'ringgoer': ['gorgerin', 'ringgoer'], 'ringhead': ['headring', 'ringhead'], 'ringite': ['igniter', 'ringite', 'tigrine'], 'ringle': ['linger', 'ringle'], 'ringlead': ['dragline', 'reginald', 'ringlead'], 'ringlet': ['ringlet', 'tingler', 'tringle'], 'ringster': ['restring', 'ringster', 'stringer'], 'ringtail': ['ringtail', 'trailing'], 'ringy': ['girny', 'ringy'], 'rink': ['kirn', 'rink'], 'rinka': ['inkra', 'krina', 'nakir', 'rinka'], 'rinse': ['reins', 'resin', 'rinse', 'risen', 'serin', 'siren'], 'rio': ['rio', 'roi'], 'riot': ['riot', 'roit', 'trio'], 'rioting': ['ignitor', 'rioting'], 'rip': ['pir', 'rip'], 'ripa': ['pair', 'pari', 'pria', 'ripa'], 'ripal': ['april', 'pilar', 'ripal'], 'ripe': ['peri', 'pier', 'ripe'], 'ripelike': ['pierlike', 'ripelike'], 'ripen': ['piner', 'prine', 'repin', 'ripen'], 'ripener': ['repiner', 'ripener'], 'ripeningly': ['repiningly', 'ripeningly'], 'riper': ['prier', 'riper'], 'ripgut': ['ripgut', 'upgirt'], 'ripost': ['ripost', 'triops', 'tripos'], 'riposte': ['periost', 'porites', 'reposit', 'riposte'], 'rippet': ['rippet', 'tipper'], 'ripple': ['lipper', 'ripple'], 'ripplet': ['ripplet', 'tippler', 'tripple'], 'ripup': ['ripup', 'uprip'], 'rise': ['reis', 'rise', 'seri', 'sier', 'sire'], 'risen': ['reins', 'resin', 'rinse', 'risen', 'serin', 'siren'], 'rishi': ['irish', 'rishi', 'sirih'], 'risk': ['kris', 'risk'], 'risky': ['risky', 'sirky'], 'risper': ['risper', 'sprier'], 'risque': ['risque', 'squire'], 'risquee': ['esquire', 'risquee'], 'rissel': ['rissel', 'rissle'], 'rissle': ['rissel', 'rissle'], 'rissoa': ['aissor', 'rissoa'], 'rist': ['rist', 'stir'], 'rit': ['rit', 'tri'], 'rita': ['airt', 'rita', 'tari', 'tiar'], 'rite': ['iter', 'reit', 'rite', 'teri', 'tier', 'tire'], 'riteless': ['riteless', 'tireless'], 'ritelessness': ['ritelessness', 'tirelessness'], 'ritling': ['glitnir', 'ritling'], 'ritualize': ['ritualize', 'uralitize'], 'riva': ['ravi', 'riva', 'vair', 'vari', 'vira'], 'rivage': ['argive', 'rivage'], 'rival': ['rival', 'viral'], 'rive': ['rive', 'veri', 'vier', 'vire'], 'rivel': ['levir', 'liver', 'livre', 'rivel'], 'riven': ['riven', 'viner'], 'rivered': ['deriver', 'redrive', 'rivered'], 'rivet': ['rivet', 'tirve', 'tiver'], 'riveter': ['rerivet', 'riveter'], 'rivetless': ['rivetless', 'silvester'], 'riving': ['irving', 'riving', 'virgin'], 'rivingly': ['rivingly', 'virginly'], 'rivose': ['rivose', 'virose'], 'riyal': ['lairy', 'riyal'], 'ro': ['or', 'ro'], 'roach': ['achor', 'chora', 'corah', 'orach', 'roach'], 'road': ['dora', 'orad', 'road'], 'roadability': ['adorability', 'roadability'], 'roadable': ['adorable', 'roadable'], 'roader': ['adorer', 'roader'], 'roading': ['gordian', 'idorgan', 'roading'], 'roadite': ['roadite', 'toadier'], 'roadman': ['anadrom', 'madrona', 'mandora', 'monarda', 'roadman'], 'roadster': ['dartrose', 'roadster'], 'roam': ['amor', 'maro', 'mora', 'omar', 'roam'], 'roamage': ['georama', 'roamage'], 'roamer': ['remora', 'roamer'], 'roaming': ['ingomar', 'moringa', 'roaming'], 'roan': ['nora', 'orna', 'roan'], 'roast': ['astor', 'roast'], 'roastable': ['astrolabe', 'roastable'], 'roasting': ['orangist', 'organist', 'roasting', 'signator'], 'rob': ['bor', 'orb', 'rob'], 'robalo': ['barolo', 'robalo'], 'roband': ['bandor', 'bondar', 'roband'], 'robbin': ['ribbon', 'robbin'], 'robe': ['boer', 'bore', 'robe'], 'rober': ['borer', 'rerob', 'rober'], 'roberd': ['border', 'roberd'], 'roberta': ['arboret', 'roberta', 'taborer'], 'robin': ['biron', 'inorb', 'robin'], 'robinet': ['bornite', 'robinet'], 'robing': ['boring', 'robing'], 'roble': ['blore', 'roble'], 'robot': ['boort', 'robot'], 'robotian': ['abortion', 'robotian'], 'robotism': ['bimotors', 'robotism'], 'robur': ['burro', 'robur', 'rubor'], 'roc': ['cor', 'cro', 'orc', 'roc'], 'rochea': ['chorea', 'ochrea', 'rochea'], 'rochet': ['hector', 'rochet', 'tocher', 'troche'], 'rock': ['cork', 'rock'], 'rocker': ['corker', 'recork', 'rocker'], 'rocketer': ['rocketer', 'rocktree'], 'rockiness': ['corkiness', 'rockiness'], 'rocking': ['corking', 'rocking'], 'rockish': ['corkish', 'rockish'], 'rocktree': ['rocketer', 'rocktree'], 'rockwood': ['corkwood', 'rockwood', 'woodrock'], 'rocky': ['corky', 'rocky'], 'rocta': ['actor', 'corta', 'croat', 'rocta', 'taroc', 'troca'], 'rod': ['dor', 'rod'], 'rode': ['doer', 'redo', 'rode', 'roed'], 'rodentia': ['andorite', 'nadorite', 'ordinate', 'rodentia'], 'rodential': ['lorandite', 'rodential'], 'rodinal': ['nailrod', 'ordinal', 'rinaldo', 'rodinal'], 'rodingite': ['negritoid', 'rodingite'], 'rodless': ['drossel', 'rodless'], 'rodlet': ['retold', 'rodlet'], 'rodman': ['random', 'rodman'], 'rodney': ['rodney', 'yonder'], 'roe': ['oer', 'ore', 'roe'], 'roed': ['doer', 'redo', 'rode', 'roed'], 'roey': ['oyer', 'roey', 'yore'], 'rog': ['gor', 'rog'], 'rogan': ['angor', 'argon', 'goran', 'grano', 'groan', 'nagor', 'orang', 'organ', 'rogan', 'ronga'], 'rogative': ['ravigote', 'rogative'], 'roger': ['gorer', 'roger'], 'roggle': ['logger', 'roggle'], 'rogue': ['orgue', 'rogue', 'rouge'], 'rohan': ['nahor', 'norah', 'rohan'], 'rohob': ['bohor', 'rohob'], 'rohun': ['huron', 'rohun'], 'roi': ['rio', 'roi'], 'roid': ['dori', 'roid'], 'roil': ['loir', 'lori', 'roil'], 'roister': ['roister', 'storier'], 'roit': ['riot', 'roit', 'trio'], 'rok': ['kor', 'rok'], 'roka': ['karo', 'kora', 'okra', 'roka'], 'roke': ['kore', 'roke'], 'rokey': ['rokey', 'yoker'], 'roky': ['kory', 'roky', 'york'], 'roland': ['androl', 'arnold', 'lardon', 'roland', 'ronald'], 'rolandic': ['ironclad', 'rolandic'], 'role': ['lore', 'orle', 'role'], 'rolfe': ['forel', 'rolfe'], 'roller': ['reroll', 'roller'], 'rollick': ['rillock', 'rollick'], 'romaean': ['neorama', 'romaean'], 'romain': ['marion', 'romain'], 'romaine': ['moraine', 'romaine'], 'romal': ['molar', 'moral', 'romal'], 'roman': ['manor', 'moran', 'norma', 'ramon', 'roman'], 'romancist': ['narcotism', 'romancist'], 'romancy': ['acronym', 'romancy'], 'romandom': ['monodram', 'romandom'], 'romane': ['enamor', 'monera', 'oreman', 'romane'], 'romanes': ['masoner', 'romanes'], 'romanian': ['maronian', 'romanian'], 'romanic': ['amicron', 'marconi', 'minorca', 'romanic'], 'romanist': ['maronist', 'romanist'], 'romanistic': ['marcionist', 'romanistic'], 'romanite': ['maronite', 'martinoe', 'minorate', 'morenita', 'romanite'], 'romanity': ['minatory', 'romanity'], 'romanly': ['almonry', 'romanly'], 'romantic': ['macrotin', 'romantic'], 'romanticly': ['matrocliny', 'romanticly'], 'romantism': ['matronism', 'romantism'], 'rome': ['mero', 'more', 'omer', 'rome'], 'romeite': ['moieter', 'romeite'], 'romeo': ['moore', 'romeo'], 'romero': ['romero', 'roomer'], 'romeshot': ['resmooth', 'romeshot', 'smoother'], 'romeward': ['marrowed', 'romeward'], 'romic': ['micro', 'moric', 'romic'], 'romish': ['hirmos', 'romish'], 'rompish': ['orphism', 'rompish'], 'ron': ['nor', 'ron'], 'ronald': ['androl', 'arnold', 'lardon', 'roland', 'ronald'], 'roncet': ['conter', 'cornet', 'cronet', 'roncet'], 'ronco': ['conor', 'croon', 'ronco'], 'rond': ['dorn', 'rond'], 'rondache': ['anchored', 'rondache'], 'ronde': ['drone', 'ronde'], 'rondeau': ['rondeau', 'unoared'], 'rondel': ['rondel', 'rondle'], 'rondelet': ['redolent', 'rondelet'], 'rondeletia': ['delineator', 'rondeletia'], 'rondelle': ['enrolled', 'rondelle'], 'rondle': ['rondel', 'rondle'], 'rondo': ['donor', 'rondo'], 'rondure': ['rondure', 'rounder', 'unorder'], 'rone': ['oner', 'rone'], 'ronga': ['angor', 'argon', 'goran', 'grano', 'groan', 'nagor', 'orang', 'organ', 'rogan', 'ronga'], 'rood': ['door', 'odor', 'oord', 'rood'], 'roodstone': ['doorstone', 'roodstone'], 'roofer': ['reroof', 'roofer'], 'rooflet': ['footler', 'rooflet'], 'rook': ['kroo', 'rook'], 'rooker': ['korero', 'rooker'], 'rool': ['loro', 'olor', 'orlo', 'rool'], 'room': ['moor', 'moro', 'room'], 'roomage': ['moorage', 'roomage'], 'roomed': ['doomer', 'mooder', 'redoom', 'roomed'], 'roomer': ['romero', 'roomer'], 'roomlet': ['roomlet', 'tremolo'], 'roomstead': ['astrodome', 'roomstead'], 'roomward': ['roomward', 'wardroom'], 'roomy': ['moory', 'roomy'], 'roost': ['roost', 'torso'], 'root': ['root', 'roto', 'toro'], 'rooter': ['reroot', 'rooter', 'torero'], 'rootle': ['looter', 'retool', 'rootle', 'tooler'], 'rootlet': ['rootlet', 'tootler'], 'rootworm': ['moorwort', 'rootworm', 'tomorrow', 'wormroot'], 'rope': ['pore', 'rope'], 'ropeable': ['operable', 'ropeable'], 'ropelike': ['porelike', 'ropelike'], 'ropeman': ['manrope', 'ropeman'], 'roper': ['porer', 'prore', 'roper'], 'ropes': ['poser', 'prose', 'ropes', 'spore'], 'ropiness': ['poriness', 'pression', 'ropiness'], 'roping': ['poring', 'roping'], 'ropp': ['prop', 'ropp'], 'ropy': ['pory', 'pyro', 'ropy'], 'roquet': ['quoter', 'roquet', 'torque'], 'rosa': ['asor', 'rosa', 'soar', 'sora'], 'rosabel': ['borlase', 'labrose', 'rosabel'], 'rosal': ['rosal', 'solar', 'soral'], 'rosales': ['lassoer', 'oarless', 'rosales'], 'rosalie': ['rosalie', 'seriola'], 'rosaniline': ['enaliornis', 'rosaniline'], 'rosated': ['rosated', 'torsade'], 'rose': ['eros', 'rose', 'sero', 'sore'], 'roseal': ['roseal', 'solera'], 'rosed': ['doser', 'rosed'], 'rosehead': ['rosehead', 'sorehead'], 'roseine': ['erinose', 'roseine'], 'rosel': ['loser', 'orsel', 'rosel', 'soler'], 'roselite': ['literose', 'roselite', 'tirolese'], 'roselle': ['orselle', 'roselle'], 'roseola': ['aerosol', 'roseola'], 'roset': ['roset', 'rotse', 'soter', 'stero', 'store', 'torse'], 'rosetan': ['noreast', 'rosetan', 'seatron', 'senator', 'treason'], 'rosetime': ['rosetime', 'timorese', 'tiresome'], 'rosetta': ['retoast', 'rosetta', 'stoater', 'toaster'], 'rosette': ['rosette', 'tetrose'], 'rosetum': ['oestrum', 'rosetum'], 'rosety': ['oyster', 'rosety'], 'rosin': ['ornis', 'rosin'], 'rosinate': ['arsonite', 'asterion', 'oestrian', 'rosinate', 'serotina'], 'rosine': ['rosine', 'senior', 'soneri'], 'rosiness': ['insessor', 'rosiness'], 'rosmarine': ['morrisean', 'rosmarine'], 'rosolite': ['oestriol', 'rosolite'], 'rosorial': ['rosorial', 'sororial'], 'rossite': ['rossite', 'sorites'], 'rostel': ['relost', 'reslot', 'rostel', 'sterol', 'torsel'], 'roster': ['resort', 'roster', 'sorter', 'storer'], 'rostra': ['rostra', 'sartor'], 'rostrate': ['rostrate', 'trostera'], 'rosulate': ['oestrual', 'rosulate'], 'rosy': ['rosy', 'sory'], 'rot': ['ort', 'rot', 'tor'], 'rota': ['rota', 'taro', 'tora'], 'rotacism': ['acrotism', 'rotacism'], 'rotal': ['latro', 'rotal', 'toral'], 'rotala': ['aortal', 'rotala'], 'rotalian': ['notarial', 'rational', 'rotalian'], 'rotan': ['orant', 'rotan', 'toran', 'trona'], 'rotanev': ['rotanev', 'venator'], 'rotarian': ['rotarian', 'tornaria'], 'rotate': ['rotate', 'tetrao'], 'rotch': ['chort', 'rotch', 'torch'], 'rote': ['rote', 'tore'], 'rotella': ['reallot', 'rotella', 'tallero'], 'rotge': ['ergot', 'rotge'], 'rother': ['rhetor', 'rother'], 'roto': ['root', 'roto', 'toro'], 'rotse': ['roset', 'rotse', 'soter', 'stero', 'store', 'torse'], 'rottan': ['attorn', 'ratton', 'rottan'], 'rotten': ['rotten', 'terton'], 'rotter': ['retort', 'retrot', 'rotter'], 'rottle': ['lotter', 'rottle', 'tolter'], 'rotula': ['rotula', 'torula'], 'rotulian': ['rotulian', 'uranotil'], 'rotuliform': ['rotuliform', 'toruliform'], 'rotulus': ['rotulus', 'torulus'], 'rotund': ['rotund', 'untrod'], 'rotunda': ['rotunda', 'tandour'], 'rotundate': ['rotundate', 'unrotated'], 'rotundifoliate': ['rotundifoliate', 'titanofluoride'], 'rotundo': ['orotund', 'rotundo'], 'roub': ['buro', 'roub'], 'roud': ['dour', 'duro', 'ordu', 'roud'], 'rouge': ['orgue', 'rogue', 'rouge'], 'rougeot': ['outgoer', 'rougeot'], 'roughen': ['enrough', 'roughen'], 'roughie': ['higuero', 'roughie'], 'rouky': ['rouky', 'yurok'], 'roulade': ['roulade', 'urodela'], 'rounce': ['conure', 'rounce', 'uncore'], 'rounded': ['redound', 'rounded', 'underdo'], 'roundel': ['durenol', 'lounder', 'roundel'], 'rounder': ['rondure', 'rounder', 'unorder'], 'roundhead': ['roundhead', 'unhoarded'], 'roundseam': ['meandrous', 'roundseam'], 'roundup': ['roundup', 'unproud'], 'roup': ['pour', 'roup'], 'rouper': ['pourer', 'repour', 'rouper'], 'roupet': ['pouter', 'roupet', 'troupe'], 'rousedness': ['rousedness', 'souredness'], 'rouser': ['rouser', 'sourer'], 'rousing': ['nigrous', 'rousing', 'souring'], 'rousseau': ['eosaurus', 'rousseau'], 'roust': ['roust', 'rusot', 'stour', 'sutor', 'torus'], 'rouster': ['rouster', 'trouser'], 'rousting': ['rousting', 'stouring'], 'rout': ['rout', 'toru', 'tour'], 'route': ['outer', 'outre', 'route'], 'router': ['retour', 'router', 'tourer'], 'routh': ['routh', 'throu'], 'routhie': ['outhire', 'routhie'], 'routine': ['routine', 'tueiron'], 'routing': ['outgrin', 'outring', 'routing', 'touring'], 'routinist': ['introitus', 'routinist'], 'rove': ['over', 'rove'], 'rovet': ['overt', 'rovet', 'torve', 'trove', 'voter'], 'row': ['row', 'wro'], 'rowdily': ['rowdily', 'wordily'], 'rowdiness': ['rowdiness', 'wordiness'], 'rowdy': ['dowry', 'rowdy', 'wordy'], 'rowed': ['dower', 'rowed'], 'rowel': ['lower', 'owler', 'rowel'], 'rowelhead': ['rowelhead', 'wheelroad'], 'rowen': ['owner', 'reown', 'rowen'], 'rower': ['rerow', 'rower'], 'rowet': ['rowet', 'tower', 'wrote'], 'rowing': ['ingrow', 'rowing'], 'rowlet': ['rowlet', 'trowel', 'wolter'], 'rowley': ['lowery', 'owlery', 'rowley', 'yowler'], 'roxy': ['oryx', 'roxy'], 'roy': ['ory', 'roy', 'yor'], 'royalist': ['royalist', 'solitary'], 'royet': ['royet', 'toyer'], 'royt': ['royt', 'ryot', 'tory', 'troy', 'tyro'], 'rua': ['aru', 'rua', 'ura'], 'ruana': ['anura', 'ruana'], 'rub': ['bur', 'rub'], 'rubasse': ['rubasse', 'surbase'], 'rubato': ['outbar', 'rubato', 'tabour'], 'rubbed': ['dubber', 'rubbed'], 'rubble': ['burble', 'lubber', 'rubble'], 'rubbler': ['burbler', 'rubbler'], 'rubbly': ['burbly', 'rubbly'], 'rube': ['bure', 'reub', 'rube'], 'rubella': ['rubella', 'rulable'], 'rubescent': ['rubescent', 'subcenter'], 'rubiate': ['abiuret', 'aubrite', 'biurate', 'rubiate'], 'rubiator': ['rubiator', 'torrubia'], 'rubican': ['brucina', 'rubican'], 'rubied': ['burdie', 'buried', 'rubied'], 'rubification': ['rubification', 'urbification'], 'rubify': ['rubify', 'urbify'], 'rubine': ['burnie', 'rubine'], 'ruble': ['bluer', 'brule', 'burel', 'ruble'], 'rubor': ['burro', 'robur', 'rubor'], 'rubrical': ['bicrural', 'rubrical'], 'ruby': ['bury', 'ruby'], 'ructation': ['anticourt', 'curtation', 'ructation'], 'ruction': ['courtin', 'ruction'], 'rud': ['rud', 'urd'], 'rudas': ['rudas', 'sudra'], 'ruddle': ['dudler', 'ruddle'], 'rude': ['duer', 'dure', 'rude', 'urde'], 'rudish': ['hurdis', 'rudish'], 'rudista': ['dasturi', 'rudista'], 'rudity': ['durity', 'rudity'], 'rue': ['rue', 'ure'], 'ruen': ['renu', 'ruen', 'rune'], 'ruffed': ['duffer', 'ruffed'], 'rufter': ['returf', 'rufter'], 'rug': ['gur', 'rug'], 'ruga': ['gaur', 'guar', 'ruga'], 'rugate': ['argute', 'guetar', 'rugate', 'tuareg'], 'rugged': ['grudge', 'rugged'], 'ruggle': ['gurgle', 'lugger', 'ruggle'], 'rugose': ['grouse', 'rugose'], 'ruinate': ['ruinate', 'taurine', 'uranite', 'urinate'], 'ruination': ['ruination', 'urination'], 'ruinator': ['ruinator', 'urinator'], 'ruined': ['diurne', 'inured', 'ruined', 'unride'], 'ruing': ['irgun', 'ruing', 'unrig'], 'ruinous': ['ruinous', 'urinous'], 'ruinousness': ['ruinousness', 'urinousness'], 'rulable': ['rubella', 'rulable'], 'rule': ['lure', 'rule'], 'ruledom': ['remould', 'ruledom'], 'ruler': ['lurer', 'ruler'], 'ruling': ['ruling', 'urling'], 'rulingly': ['luringly', 'rulingly'], 'rum': ['mru', 'rum'], 'rumal': ['mural', 'rumal'], 'ruman': ['muran', 'ruman', 'unarm', 'unram', 'urman'], 'rumble': ['lumber', 'rumble', 'umbrel'], 'rumelian': ['lemurian', 'malurine', 'rumelian'], 'rumex': ['murex', 'rumex'], 'ruminant': ['nutramin', 'ruminant'], 'ruminator': ['antirumor', 'ruminator'], 'rumly': ['murly', 'rumly'], 'rumple': ['lumper', 'plumer', 'replum', 'rumple'], 'run': ['run', 'urn'], 'runback': ['backrun', 'runback'], 'runby': ['burny', 'runby'], 'runch': ['churn', 'runch'], 'runcinate': ['encurtain', 'runcinate', 'uncertain'], 'rundale': ['launder', 'rundale'], 'rundi': ['rundi', 'unrid'], 'rundlet': ['rundlet', 'trundle'], 'rune': ['renu', 'ruen', 'rune'], 'runed': ['runed', 'under', 'unred'], 'runer': ['rerun', 'runer'], 'runfish': ['furnish', 'runfish'], 'rung': ['grun', 'rung'], 'runic': ['curin', 'incur', 'runic'], 'runically': ['runically', 'unlyrical'], 'runite': ['runite', 'triune', 'uniter', 'untire'], 'runkly': ['knurly', 'runkly'], 'runlet': ['runlet', 'turnel'], 'runnet': ['runnet', 'tunner', 'unrent'], 'runout': ['outrun', 'runout'], 'runover': ['overrun', 'runover'], 'runt': ['runt', 'trun', 'turn'], 'runted': ['runted', 'tunder', 'turned'], 'runtee': ['neuter', 'retune', 'runtee', 'tenure', 'tureen'], 'runway': ['runway', 'unwary'], 'rupa': ['prau', 'rupa'], 'rupee': ['puree', 'rupee'], 'rupestrian': ['rupestrian', 'supertrain'], 'rupiah': ['hairup', 'rupiah'], 'rural': ['rural', 'urlar'], 'rus': ['rus', 'sur', 'urs'], 'rusa': ['rusa', 'saur', 'sura', 'ursa', 'usar'], 'ruscus': ['cursus', 'ruscus'], 'ruse': ['ruse', 'suer', 'sure', 'user'], 'rush': ['rhus', 'rush'], 'rushen': ['reshun', 'rushen'], 'rusine': ['insure', 'rusine', 'ursine'], 'rusma': ['musar', 'ramus', 'rusma', 'surma'], 'rusot': ['roust', 'rusot', 'stour', 'sutor', 'torus'], 'russelia': ['russelia', 'siruelas'], 'russet': ['russet', 'tusser'], 'russify': ['fissury', 'russify'], 'russine': ['russine', 'serinus', 'sunrise'], 'rustable': ['baluster', 'rustable'], 'rustic': ['citrus', 'curtis', 'rictus', 'rustic'], 'rusticial': ['curialist', 'rusticial'], 'rusticly': ['crustily', 'rusticly'], 'rusticness': ['crustiness', 'rusticness'], 'rustle': ['luster', 'result', 'rustle', 'sutler', 'ulster'], 'rustling': ['lustring', 'rustling'], 'rustly': ['rustly', 'sultry'], 'rut': ['rut', 'tur'], 'ruta': ['ruta', 'taur'], 'rutch': ['cruth', 'rutch'], 'rutelian': ['lutrinae', 'retinula', 'rutelian', 'tenurial'], 'rutelinae': ['lineature', 'rutelinae'], 'ruth': ['hurt', 'ruth'], 'ruthenian': ['hunterian', 'ruthenian'], 'ruther': ['hurter', 'ruther'], 'ruthful': ['hurtful', 'ruthful'], 'ruthfully': ['hurtfully', 'ruthfully'], 'ruthfulness': ['hurtfulness', 'ruthfulness'], 'ruthless': ['hurtless', 'ruthless'], 'ruthlessly': ['hurtlessly', 'ruthlessly'], 'ruthlessness': ['hurtlessness', 'ruthlessness'], 'rutilant': ['rutilant', 'turntail'], 'rutinose': ['rutinose', 'tursenoi'], 'rutter': ['rutter', 'turret'], 'rutyl': ['rutyl', 'truly'], 'rutylene': ['neuterly', 'rutylene'], 'ryal': ['aryl', 'lyra', 'ryal', 'yarl'], 'ryder': ['derry', 'redry', 'ryder'], 'rye': ['rye', 'yer'], 'ryen': ['ryen', 'yern'], 'ryot': ['royt', 'ryot', 'tory', 'troy', 'tyro'], 'rype': ['prey', 'pyre', 'rype'], 'rytina': ['rytina', 'trainy', 'tyrian'], 'sa': ['as', 'sa'], 'saa': ['asa', 'saa'], 'saan': ['anas', 'ansa', 'saan'], 'sab': ['bas', 'sab'], 'saba': ['abas', 'saba'], 'sabal': ['balas', 'balsa', 'basal', 'sabal'], 'saban': ['nasab', 'saban'], 'sabanut': ['sabanut', 'sabutan', 'tabanus'], 'sabe': ['base', 'besa', 'sabe', 'seba'], 'sabeca': ['casabe', 'sabeca'], 'sabella': ['basella', 'sabella', 'salable'], 'sabelli': ['sabelli', 'sebilla'], 'sabellid': ['sabellid', 'slidable'], 'saber': ['barse', 'besra', 'saber', 'serab'], 'sabered': ['debaser', 'sabered'], 'sabian': ['sabian', 'sabina'], 'sabina': ['sabian', 'sabina'], 'sabino': ['basion', 'bonsai', 'sabino'], 'sabir': ['baris', 'sabir'], 'sable': ['blase', 'sable'], 'saboraim': ['ambrosia', 'saboraim'], 'sabot': ['basto', 'boast', 'sabot'], 'sabotine': ['obeisant', 'sabotine'], 'sabromin': ['ambrosin', 'barosmin', 'sabromin'], 'sabulite': ['sabulite', 'suitable'], 'sabutan': ['sabanut', 'sabutan', 'tabanus'], 'sacalait': ['castalia', 'sacalait'], 'saccade': ['cascade', 'saccade'], 'saccomyian': ['saccomyian', 'saccomyina'], 'saccomyina': ['saccomyian', 'saccomyina'], 'sacculoutricular': ['sacculoutricular', 'utriculosaccular'], 'sacellum': ['camellus', 'sacellum'], 'sachem': ['sachem', 'schema'], 'sachet': ['chaste', 'sachet', 'scathe', 'scheat'], 'sacian': ['ascian', 'sacian', 'scania', 'sicana'], 'sack': ['cask', 'sack'], 'sackbut': ['sackbut', 'subtack'], 'sacken': ['sacken', 'skance'], 'sacker': ['resack', 'sacker', 'screak'], 'sacking': ['casking', 'sacking'], 'sacklike': ['casklike', 'sacklike'], 'sacque': ['casque', 'sacque'], 'sacral': ['lascar', 'rascal', 'sacral', 'scalar'], 'sacrification': ['sacrification', 'scarification'], 'sacrificator': ['sacrificator', 'scarificator'], 'sacripant': ['sacripant', 'spartanic'], 'sacro': ['arcos', 'crosa', 'oscar', 'sacro'], 'sacrodorsal': ['dorsosacral', 'sacrodorsal'], 'sacroischiac': ['isosaccharic', 'sacroischiac'], 'sacrolumbal': ['lumbosacral', 'sacrolumbal'], 'sacrovertebral': ['sacrovertebral', 'vertebrosacral'], 'sad': ['das', 'sad'], 'sadden': ['desand', 'sadden', 'sanded'], 'saddling': ['addlings', 'saddling'], 'sadh': ['dash', 'sadh', 'shad'], 'sadhe': ['deash', 'hades', 'sadhe', 'shade'], 'sadic': ['asdic', 'sadic'], 'sadie': ['aides', 'aside', 'sadie'], 'sadiron': ['sadiron', 'sardoin'], 'sado': ['dosa', 'sado', 'soda'], 'sadr': ['sadr', 'sard'], 'saeima': ['asemia', 'saeima'], 'saernaite': ['arseniate', 'saernaite'], 'saeter': ['asteer', 'easter', 'eastre', 'reseat', 'saeter', 'seater', 'staree', 'teaser', 'teresa'], 'saeume': ['amusee', 'saeume'], 'safar': ['safar', 'saraf'], 'safely': ['fayles', 'safely'], 'saft': ['fast', 'saft'], 'sag': ['gas', 'sag'], 'sagai': ['sagai', 'saiga'], 'sagene': ['sagene', 'senega'], 'sagger': ['sagger', 'seggar'], 'sagless': ['gasless', 'glasses', 'sagless'], 'sago': ['sago', 'soga'], 'sagoin': ['gosain', 'isagon', 'sagoin'], 'sagra': ['argas', 'sagra'], 'sah': ['ash', 'sah', 'sha'], 'saharic': ['arachis', 'asiarch', 'saharic'], 'sahh': ['hash', 'sahh', 'shah'], 'sahidic': ['hasidic', 'sahidic'], 'sahme': ['sahme', 'shame'], 'saho': ['saho', 'shoa'], 'sai': ['sai', 'sia'], 'saic': ['acis', 'asci', 'saic'], 'said': ['dais', 'dasi', 'disa', 'said', 'sida'], 'saidi': ['saidi', 'saiid'], 'saiga': ['sagai', 'saiga'], 'saiid': ['saidi', 'saiid'], 'sail': ['lasi', 'lias', 'lisa', 'sail', 'sial'], 'sailable': ['isabella', 'sailable'], 'sailage': ['algesia', 'sailage'], 'sailed': ['aisled', 'deasil', 'ladies', 'sailed'], 'sailer': ['israel', 'relais', 'resail', 'sailer', 'serail', 'serial'], 'sailing': ['aisling', 'sailing'], 'sailoring': ['sailoring', 'signorial'], 'sailsman': ['nasalism', 'sailsman'], 'saily': ['islay', 'saily'], 'saim': ['mias', 'saim', 'siam', 'sima'], 'sain': ['anis', 'nais', 'nasi', 'nias', 'sain', 'sina'], 'sainfoin': ['sainfoin', 'sinfonia'], 'saint': ['saint', 'satin', 'stain'], 'saintdom': ['donatism', 'saintdom'], 'sainted': ['destain', 'instead', 'sainted', 'satined'], 'saintless': ['saintless', 'saltiness', 'slatiness', 'stainless'], 'saintlike': ['kleistian', 'saintlike', 'satinlike'], 'saintly': ['nastily', 'saintly', 'staynil'], 'saintship': ['hispanist', 'saintship'], 'saip': ['apis', 'pais', 'pasi', 'saip'], 'saiph': ['aphis', 'apish', 'hispa', 'saiph', 'spahi'], 'sair': ['rais', 'sair', 'sari'], 'saite': ['saite', 'taise'], 'saithe': ['saithe', 'tashie', 'teaish'], 'saitic': ['isatic', 'saitic'], 'saivism': ['saivism', 'sivaism'], 'sak': ['ask', 'sak'], 'saka': ['asak', 'kasa', 'saka'], 'sake': ['sake', 'seak'], 'sakeen': ['sakeen', 'sekane'], 'sakel': ['alkes', 'sakel', 'slake'], 'saker': ['asker', 'reask', 'saker', 'sekar'], 'sakeret': ['restake', 'sakeret'], 'sakha': ['kasha', 'khasa', 'sakha', 'shaka'], 'saki': ['saki', 'siak', 'sika'], 'sal': ['las', 'sal', 'sla'], 'salable': ['basella', 'sabella', 'salable'], 'salably': ['basally', 'salably'], 'salaceta': ['catalase', 'salaceta'], 'salacot': ['coastal', 'salacot'], 'salading': ['salading', 'salangid'], 'salago': ['aglaos', 'salago'], 'salamandarin': ['salamandarin', 'salamandrian', 'salamandrina'], 'salamandrian': ['salamandarin', 'salamandrian', 'salamandrina'], 'salamandrina': ['salamandarin', 'salamandrian', 'salamandrina'], 'salangid': ['salading', 'salangid'], 'salariat': ['alastair', 'salariat'], 'salat': ['atlas', 'salat', 'salta'], 'salay': ['asyla', 'salay', 'sayal'], 'sale': ['elsa', 'sale', 'seal', 'slae'], 'salele': ['salele', 'sallee'], 'salep': ['elaps', 'lapse', 'lepas', 'pales', 'salep', 'saple', 'sepal', 'slape', 'spale', 'speal'], 'saleratus': ['assaulter', 'reassault', 'saleratus'], 'salian': ['anisal', 'nasial', 'salian', 'salina'], 'salic': ['lacis', 'salic'], 'salicin': ['incisal', 'salicin'], 'salicylide': ['salicylide', 'scylliidae'], 'salience': ['salience', 'secaline'], 'salient': ['elastin', 'salient', 'saltine', 'slainte'], 'salimeter': ['misrelate', 'salimeter'], 'salimetry': ['mysterial', 'salimetry'], 'salina': ['anisal', 'nasial', 'salian', 'salina'], 'saline': ['alsine', 'neslia', 'saline', 'selina', 'silane'], 'salinoterreous': ['salinoterreous', 'soliterraneous'], 'salite': ['isleta', 'litsea', 'salite', 'stelai'], 'salited': ['distale', 'salited'], 'saliva': ['saliva', 'salvia'], 'salivan': ['salivan', 'slavian'], 'salivant': ['navalist', 'salivant'], 'salivate': ['salivate', 'vestalia'], 'salle': ['salle', 'sella'], 'sallee': ['salele', 'sallee'], 'sallet': ['sallet', 'stella', 'talles'], 'sallow': ['sallow', 'swallo'], 'salm': ['alms', 'salm', 'slam'], 'salma': ['salma', 'samal'], 'salmine': ['malines', 'salmine', 'selamin', 'seminal'], 'salmis': ['missal', 'salmis'], 'salmo': ['salmo', 'somal'], 'salmonsite': ['assoilment', 'salmonsite'], 'salome': ['melosa', 'salome', 'semola'], 'salometer': ['elastomer', 'salometer'], 'salon': ['salon', 'sloan', 'solan'], 'saloon': ['alonso', 'alsoon', 'saloon'], 'salp': ['salp', 'slap'], 'salpa': ['palas', 'salpa'], 'salpidae': ['palisade', 'salpidae'], 'salpoid': ['psaloid', 'salpoid'], 'salt': ['last', 'salt', 'slat'], 'salta': ['atlas', 'salat', 'salta'], 'saltary': ['astylar', 'saltary'], 'saltation': ['saltation', 'stational'], 'salted': ['desalt', 'salted'], 'saltee': ['ateles', 'saltee', 'sealet', 'stelae', 'teasel'], 'salter': ['laster', 'lastre', 'rastle', 'relast', 'resalt', 'salter', 'slater', 'stelar'], 'saltern': ['saltern', 'starnel', 'sternal'], 'saltery': ['saltery', 'stearyl'], 'saltier': ['aletris', 'alister', 'listera', 'realist', 'saltier'], 'saltine': ['elastin', 'salient', 'saltine', 'slainte'], 'saltiness': ['saintless', 'saltiness', 'slatiness', 'stainless'], 'salting': ['anglist', 'lasting', 'salting', 'slating', 'staling'], 'saltish': ['saltish', 'slatish'], 'saltly': ['lastly', 'saltly'], 'saltness': ['lastness', 'saltness'], 'saltometer': ['rattlesome', 'saltometer'], 'saltus': ['saltus', 'tussal'], 'saltwife': ['flatwise', 'saltwife'], 'salty': ['lasty', 'salty', 'slaty'], 'salung': ['lugnas', 'salung'], 'salute': ['salute', 'setula'], 'saluter': ['arustle', 'estrual', 'saluter', 'saulter'], 'salva': ['salva', 'valsa', 'vasal'], 'salve': ['salve', 'selva', 'slave', 'valse'], 'salver': ['salver', 'serval', 'slaver', 'versal'], 'salvia': ['saliva', 'salvia'], 'salvy': ['salvy', 'sylva'], 'sam': ['mas', 'sam', 'sma'], 'samal': ['salma', 'samal'], 'saman': ['manas', 'saman'], 'samani': ['samani', 'samian'], 'samaritan': ['samaritan', 'sarmatian'], 'samas': ['amass', 'assam', 'massa', 'samas'], 'sambal': ['balsam', 'sambal'], 'sambo': ['ambos', 'sambo'], 'same': ['asem', 'mesa', 'same', 'seam'], 'samel': ['amsel', 'melas', 'mesal', 'samel'], 'samely': ['measly', 'samely'], 'samen': ['manes', 'manse', 'mensa', 'samen', 'senam'], 'samh': ['mash', 'samh', 'sham'], 'samian': ['samani', 'samian'], 'samiel': ['amiles', 'asmile', 'mesail', 'mesial', 'samiel'], 'samir': ['maris', 'marsi', 'samir', 'simar'], 'samisen': ['samisen', 'samsien'], 'samish': ['samish', 'sisham'], 'samite': ['samite', 'semita', 'tamise', 'teaism'], 'sammer': ['mamers', 'sammer'], 'sammier': ['amerism', 'asimmer', 'sammier'], 'samnani': ['ananism', 'samnani'], 'samnite': ['atenism', 'inmeats', 'insteam', 'samnite'], 'samoan': ['monasa', 'samoan'], 'samothere': ['heartsome', 'samothere'], 'samoyed': ['samoyed', 'someday'], 'samphire': ['samphire', 'seraphim'], 'sampi': ['apism', 'sampi'], 'sampler': ['lampers', 'sampler'], 'samsien': ['samisen', 'samsien'], 'samskara': ['makassar', 'samskara'], 'samucan': ['manacus', 'samucan'], 'samuel': ['amelus', 'samuel'], 'sanability': ['insatiably', 'sanability'], 'sanai': ['asian', 'naias', 'sanai'], 'sanand': ['sanand', 'sandan'], 'sanche': ['encash', 'sanche'], 'sanct': ['sanct', 'scant'], 'sanction': ['canonist', 'sanction', 'sonantic'], 'sanctioner': ['resanction', 'sanctioner'], 'sanctity': ['sanctity', 'scantity'], 'sandak': ['sandak', 'skanda'], 'sandan': ['sanand', 'sandan'], 'sandarac': ['carandas', 'sandarac'], 'sandawe': ['sandawe', 'weasand'], 'sanded': ['desand', 'sadden', 'sanded'], 'sanderling': ['sanderling', 'slandering'], 'sandflower': ['flandowser', 'sandflower'], 'sandhi': ['danish', 'sandhi'], 'sandra': ['nasard', 'sandra'], 'sandworm': ['sandworm', 'swordman', 'wordsman'], 'sane': ['anes', 'sane', 'sean'], 'sanetch': ['chasten', 'sanetch'], 'sang': ['sang', 'snag'], 'sanga': ['gasan', 'sanga'], 'sangar': ['argans', 'sangar'], 'sangei': ['easing', 'sangei'], 'sanger': ['angers', 'sanger', 'serang'], 'sangrel': ['sangrel', 'snagrel'], 'sanhita': ['ashanti', 'sanhita', 'shaitan', 'thasian'], 'sanicle': ['celsian', 'escalin', 'sanicle', 'secalin'], 'sanies': ['anesis', 'anseis', 'sanies', 'sansei', 'sasine'], 'sanious': ['sanious', 'suasion'], 'sanitate': ['astatine', 'sanitate'], 'sanitize': ['sanitize', 'satinize'], 'sanity': ['sanity', 'satiny'], 'sank': ['kans', 'sank'], 'sankha': ['kashan', 'sankha'], 'sannup': ['pannus', 'sannup', 'unsnap', 'unspan'], 'sanpoil': ['sanpoil', 'spaniol'], 'sansei': ['anesis', 'anseis', 'sanies', 'sansei', 'sasine'], 'sansi': ['sansi', 'sasin'], 'sant': ['nast', 'sant', 'stan'], 'santa': ['santa', 'satan'], 'santal': ['aslant', 'lansat', 'natals', 'santal'], 'santali': ['lanista', 'santali'], 'santalin': ['annalist', 'santalin'], 'santee': ['ensate', 'enseat', 'santee', 'sateen', 'senate'], 'santiago': ['agonista', 'santiago'], 'santimi': ['animist', 'santimi'], 'santir': ['instar', 'santir', 'strain'], 'santon': ['santon', 'sonant', 'stanno'], 'santorinite': ['reinstation', 'santorinite'], 'sap': ['asp', 'sap', 'spa'], 'sapan': ['pasan', 'sapan'], 'sapek': ['sapek', 'speak'], 'saperda': ['aspread', 'saperda'], 'saphena': ['aphanes', 'saphena'], 'sapid': ['sapid', 'spaid'], 'sapient': ['panties', 'sapient', 'spinate'], 'sapiential': ['antilipase', 'sapiential'], 'sapin': ['pisan', 'sapin', 'spina'], 'sapinda': ['anapsid', 'sapinda'], 'saple': ['elaps', 'lapse', 'lepas', 'pales', 'salep', 'saple', 'sepal', 'slape', 'spale', 'speal'], 'sapling': ['lapsing', 'sapling'], 'sapo': ['asop', 'sapo', 'soap'], 'sapor': ['psora', 'sapor', 'sarpo'], 'saporous': ['asporous', 'saporous'], 'sapota': ['sapota', 'taposa'], 'sapotilha': ['hapalotis', 'sapotilha'], 'sapphire': ['papisher', 'sapphire'], 'sapples': ['papless', 'sapples'], 'sapremia': ['aspermia', 'sapremia'], 'sapremic': ['aspermic', 'sapremic'], 'saprine': ['persian', 'prasine', 'saprine'], 'saprolite': ['posterial', 'saprolite'], 'saprolitic': ['polaristic', 'poristical', 'saprolitic'], 'sapropel': ['prolapse', 'sapropel'], 'sapropelic': ['periscopal', 'sapropelic'], 'saprophagous': ['prasophagous', 'saprophagous'], 'sapwort': ['postwar', 'sapwort'], 'sar': ['ras', 'sar'], 'sara': ['rasa', 'sara'], 'saraad': ['saraad', 'sarada'], 'sarada': ['saraad', 'sarada'], 'saraf': ['safar', 'saraf'], 'sarah': ['asarh', 'raash', 'sarah'], 'saran': ['ansar', 'saran', 'sarna'], 'sarangi': ['giansar', 'sarangi'], 'sarcenet': ['reascent', 'sarcenet'], 'sarcine': ['arsenic', 'cerasin', 'sarcine'], 'sarcitis': ['sarcitis', 'triassic'], 'sarcle': ['sarcle', 'scaler', 'sclera'], 'sarcoadenoma': ['adenosarcoma', 'sarcoadenoma'], 'sarcocarcinoma': ['carcinosarcoma', 'sarcocarcinoma'], 'sarcoid': ['sarcoid', 'scaroid'], 'sarcoline': ['censorial', 'sarcoline'], 'sarcolite': ['alectoris', 'sarcolite', 'sclerotia', 'sectorial'], 'sarcoplast': ['postsacral', 'sarcoplast'], 'sarcotic': ['acrostic', 'sarcotic', 'socratic'], 'sard': ['sadr', 'sard'], 'sardian': ['andrias', 'sardian', 'sarinda'], 'sardine': ['andries', 'isander', 'sardine'], 'sardoin': ['sadiron', 'sardoin'], 'sardonic': ['draconis', 'sardonic'], 'sare': ['arse', 'rase', 'sare', 'sear', 'sera'], 'sargonide': ['grandiose', 'sargonide'], 'sari': ['rais', 'sair', 'sari'], 'sarif': ['farsi', 'sarif'], 'sarigue': ['ergusia', 'gerusia', 'sarigue'], 'sarinda': ['andrias', 'sardian', 'sarinda'], 'sarip': ['paris', 'parsi', 'sarip'], 'sark': ['askr', 'kras', 'sark'], 'sarkine': ['kerasin', 'sarkine'], 'sarkit': ['rastik', 'sarkit', 'straik'], 'sarmatian': ['samaritan', 'sarmatian'], 'sarment': ['sarment', 'smarten'], 'sarmentous': ['sarmentous', 'tarsonemus'], 'sarna': ['ansar', 'saran', 'sarna'], 'sarod': ['sarod', 'sorda'], 'saron': ['arson', 'saron', 'sonar'], 'saronic': ['arsonic', 'saronic'], 'sarpo': ['psora', 'sapor', 'sarpo'], 'sarra': ['arras', 'sarra'], 'sarsenet': ['assenter', 'reassent', 'sarsenet'], 'sarsi': ['arsis', 'sarsi'], 'sart': ['sart', 'star', 'stra', 'tars', 'tsar'], 'sartain': ['artisan', 'astrain', 'sartain', 'tsarina'], 'sartish': ['sartish', 'shastri'], 'sartor': ['rostra', 'sartor'], 'sasan': ['nassa', 'sasan'], 'sasin': ['sansi', 'sasin'], 'sasine': ['anesis', 'anseis', 'sanies', 'sansei', 'sasine'], 'sat': ['ast', 'sat'], 'satan': ['santa', 'satan'], 'satanical': ['castalian', 'satanical'], 'satanism': ['mantissa', 'satanism'], 'sate': ['ates', 'east', 'eats', 'sate', 'seat', 'seta'], 'sateen': ['ensate', 'enseat', 'santee', 'sateen', 'senate'], 'sateless': ['sateless', 'seatless'], 'satelles': ['satelles', 'tessella'], 'satellite': ['satellite', 'telestial'], 'satiable': ['bisaltae', 'satiable'], 'satiate': ['isatate', 'satiate', 'taetsia'], 'satieno': ['aeonist', 'asiento', 'satieno'], 'satient': ['atenist', 'instate', 'satient', 'steatin'], 'satin': ['saint', 'satin', 'stain'], 'satine': ['satine', 'tisane'], 'satined': ['destain', 'instead', 'sainted', 'satined'], 'satinette': ['enstatite', 'intestate', 'satinette'], 'satinite': ['satinite', 'sittinae'], 'satinize': ['sanitize', 'satinize'], 'satinlike': ['kleistian', 'saintlike', 'satinlike'], 'satiny': ['sanity', 'satiny'], 'satire': ['satire', 'striae'], 'satirical': ['racialist', 'satirical'], 'satirist': ['satirist', 'tarsitis'], 'satrae': ['astare', 'satrae'], 'satrapic': ['aspartic', 'satrapic'], 'satron': ['asnort', 'satron'], 'sattle': ['latest', 'sattle', 'taslet'], 'sattva': ['sattva', 'tavast'], 'saturable': ['balaustre', 'saturable'], 'saturation': ['saturation', 'titanosaur'], 'saturator': ['saturator', 'tartarous'], 'saturn': ['saturn', 'unstar'], 'saturnale': ['alaternus', 'saturnale'], 'saturnalia': ['australian', 'saturnalia'], 'saturnia': ['asturian', 'austrian', 'saturnia'], 'saturnine': ['neustrian', 'saturnine', 'sturninae'], 'saturnism': ['saturnism', 'surmisant'], 'satyr': ['satyr', 'stary', 'stray', 'trasy'], 'satyrlike': ['satyrlike', 'streakily'], 'sauce': ['cause', 'sauce'], 'sauceless': ['causeless', 'sauceless'], 'sauceline': ['sauceline', 'seleucian'], 'saucer': ['causer', 'saucer'], 'sauger': ['sauger', 'usager'], 'saugh': ['agush', 'saugh'], 'saul': ['saul', 'sula'], 'sauld': ['aldus', 'sauld'], 'sault': ['latus', 'sault', 'talus'], 'saulter': ['arustle', 'estrual', 'saluter', 'saulter'], 'saum': ['masu', 'musa', 'saum'], 'sauna': ['nasua', 'sauna'], 'saur': ['rusa', 'saur', 'sura', 'ursa', 'usar'], 'saura': ['arusa', 'saura', 'usara'], 'saurian': ['saurian', 'suriana'], 'saury': ['saury', 'surya'], 'sausage': ['assuage', 'sausage'], 'saut': ['saut', 'tasu', 'utas'], 'sauve': ['sauve', 'suave'], 'save': ['aves', 'save', 'vase'], 'savin': ['savin', 'sivan'], 'saviour': ['saviour', 'various'], 'savor': ['savor', 'sorva'], 'savored': ['oversad', 'savored'], 'saw': ['saw', 'swa', 'was'], 'sawah': ['awash', 'sawah'], 'sawali': ['aswail', 'sawali'], 'sawback': ['backsaw', 'sawback'], 'sawbuck': ['bucksaw', 'sawbuck'], 'sawer': ['resaw', 'sawer', 'seraw', 'sware', 'swear', 'warse'], 'sawing': ['aswing', 'sawing'], 'sawish': ['sawish', 'siwash'], 'sawn': ['sawn', 'snaw', 'swan'], 'sawt': ['sawt', 'staw', 'swat', 'taws', 'twas', 'wast'], 'sawyer': ['sawyer', 'swayer'], 'saxe': ['axes', 'saxe', 'seax'], 'saxten': ['saxten', 'sextan'], 'say': ['say', 'yas'], 'sayal': ['asyla', 'salay', 'sayal'], 'sayer': ['reasy', 'resay', 'sayer', 'seary'], 'sayid': ['daisy', 'sayid'], 'scabbler': ['scabbler', 'scrabble'], 'scabies': ['abscise', 'scabies'], 'scaddle': ['scaddle', 'scalded'], 'scaean': ['anaces', 'scaean'], 'scala': ['calas', 'casal', 'scala'], 'scalar': ['lascar', 'rascal', 'sacral', 'scalar'], 'scalded': ['scaddle', 'scalded'], 'scale': ['alces', 'casel', 'scale'], 'scalena': ['escalan', 'scalena'], 'scalene': ['cleanse', 'scalene'], 'scaler': ['sarcle', 'scaler', 'sclera'], 'scallola': ['callosal', 'scallola'], 'scalloper': ['procellas', 'scalloper'], 'scaloni': ['nicolas', 'scaloni'], 'scalp': ['clasp', 'scalp'], 'scalper': ['clasper', 'reclasp', 'scalper'], 'scalping': ['clasping', 'scalping'], 'scalpture': ['prescutal', 'scalpture'], 'scaly': ['aclys', 'scaly'], 'scambler': ['scambler', 'scramble'], 'scampish': ['scampish', 'scaphism'], 'scania': ['ascian', 'sacian', 'scania', 'sicana'], 'scant': ['sanct', 'scant'], 'scantity': ['sanctity', 'scantity'], 'scantle': ['asclent', 'scantle'], 'scape': ['capes', 'scape', 'space'], 'scapeless': ['scapeless', 'spaceless'], 'scapha': ['pascha', 'scapha'], 'scaphander': ['handscrape', 'scaphander'], 'scaphism': ['scampish', 'scaphism'], 'scaphite': ['paschite', 'pastiche', 'pistache', 'scaphite'], 'scaphopod': ['podoscaph', 'scaphopod'], 'scapoid': ['psoadic', 'scapoid', 'sciapod'], 'scapolite': ['alopecist', 'altiscope', 'epicostal', 'scapolite'], 'scappler': ['scappler', 'scrapple'], 'scapula': ['capsula', 'pascual', 'scapula'], 'scapular': ['capsular', 'scapular'], 'scapulated': ['capsulated', 'scapulated'], 'scapulectomy': ['capsulectomy', 'scapulectomy'], 'scarab': ['barsac', 'scarab'], 'scarcement': ['marcescent', 'scarcement'], 'scare': ['carse', 'caser', 'ceras', 'scare', 'scrae'], 'scarification': ['sacrification', 'scarification'], 'scarificator': ['sacrificator', 'scarificator'], 'scarily': ['scarily', 'scraily'], 'scarlet': ['scarlet', 'sclater'], 'scarn': ['scarn', 'scran'], 'scaroid': ['sarcoid', 'scaroid'], 'scarp': ['craps', 'scarp', 'scrap'], 'scarping': ['scarping', 'scraping'], 'scart': ['scart', 'scrat'], 'scarth': ['scarth', 'scrath', 'starch'], 'scary': ['ascry', 'scary', 'scray'], 'scase': ['casse', 'scase'], 'scat': ['acts', 'cast', 'scat'], 'scathe': ['chaste', 'sachet', 'scathe', 'scheat'], 'scatterer': ['scatterer', 'streetcar'], 'scaturient': ['incrustate', 'scaturient', 'scrutinate'], 'scaum': ['camus', 'musca', 'scaum', 'sumac'], 'scaur': ['cursa', 'scaur'], 'scaut': ['scaut', 'scuta'], 'scavel': ['calves', 'scavel'], 'scawl': ['scawl', 'sclaw'], 'sceat': ['caste', 'sceat'], 'scene': ['cense', 'scene', 'sence'], 'scenery': ['scenery', 'screeny'], 'scented': ['descent', 'scented'], 'scepter': ['respect', 'scepter', 'specter'], 'sceptered': ['sceptered', 'spectered'], 'scepterless': ['respectless', 'scepterless'], 'sceptral': ['sceptral', 'scraplet', 'spectral'], 'sceptry': ['precyst', 'sceptry', 'spectry'], 'scerne': ['censer', 'scerne', 'screen', 'secern'], 'schalmei': ['camelish', 'schalmei'], 'scheat': ['chaste', 'sachet', 'scathe', 'scheat'], 'schema': ['sachem', 'schema'], 'schematic': ['catechism', 'schematic'], 'scheme': ['scheme', 'smeech'], 'schemer': ['chermes', 'schemer'], 'scho': ['cosh', 'scho'], 'scholae': ['oscheal', 'scholae'], 'schone': ['cheson', 'chosen', 'schone'], 'schooltime': ['chilostome', 'schooltime'], 'schout': ['schout', 'scouth'], 'schute': ['schute', 'tusche'], 'sciaenoid': ['oniscidae', 'oscinidae', 'sciaenoid'], 'scian': ['canis', 'scian'], 'sciapod': ['psoadic', 'scapoid', 'sciapod'], 'sciara': ['carisa', 'sciara'], 'sciarid': ['cidaris', 'sciarid'], 'sciatic': ['ascitic', 'sciatic'], 'sciatical': ['ascitical', 'sciatical'], 'scient': ['encist', 'incest', 'insect', 'scient'], 'sciential': ['elasticin', 'inelastic', 'sciential'], 'scillitan': ['scillitan', 'scintilla'], 'scintilla': ['scillitan', 'scintilla'], 'scintle': ['lentisc', 'scintle', 'stencil'], 'scion': ['oscin', 'scion', 'sonic'], 'sciot': ['ostic', 'sciot', 'stoic'], 'sciotherical': ['ischiorectal', 'sciotherical'], 'scious': ['scious', 'socius'], 'scirenga': ['creasing', 'scirenga'], 'scirpus': ['prussic', 'scirpus'], 'scissortail': ['scissortail', 'solaristics'], 'sciurine': ['incisure', 'sciurine'], 'sciuroid': ['dioscuri', 'sciuroid'], 'sclate': ['castle', 'sclate'], 'sclater': ['scarlet', 'sclater'], 'sclaw': ['scawl', 'sclaw'], 'sclera': ['sarcle', 'scaler', 'sclera'], 'sclere': ['sclere', 'screel'], 'scleria': ['scleria', 'sercial'], 'sclerite': ['sclerite', 'silcrete'], 'sclerodermite': ['dermosclerite', 'sclerodermite'], 'scleromata': ['clamatores', 'scleromata'], 'sclerose': ['coreless', 'sclerose'], 'sclerospora': ['prolacrosse', 'sclerospora'], 'sclerote': ['corselet', 'sclerote', 'selector'], 'sclerotia': ['alectoris', 'sarcolite', 'sclerotia', 'sectorial'], 'sclerotial': ['cloisteral', 'sclerotial'], 'sclerotinia': ['intersocial', 'orleanistic', 'sclerotinia'], 'sclerotium': ['closterium', 'sclerotium'], 'sclerotomy': ['mycosterol', 'sclerotomy'], 'scoad': ['cados', 'scoad'], 'scob': ['bosc', 'scob'], 'scobicular': ['scobicular', 'scrobicula'], 'scolia': ['colias', 'scolia', 'social'], 'scolion': ['scolion', 'solonic'], 'scombrine': ['becrimson', 'scombrine'], 'scone': ['cones', 'scone'], 'scooper': ['coprose', 'scooper'], 'scoot': ['coost', 'scoot'], 'scopa': ['posca', 'scopa'], 'scoparin': ['parsonic', 'scoparin'], 'scope': ['copse', 'pecos', 'scope'], 'scopidae': ['diascope', 'psocidae', 'scopidae'], 'scopine': ['psocine', 'scopine'], 'scopiped': ['podiceps', 'scopiped'], 'scopoline': ['niloscope', 'scopoline'], 'scorbutical': ['scorbutical', 'subcortical'], 'scorbutically': ['scorbutically', 'subcortically'], 'score': ['corse', 'score'], 'scorer': ['scorer', 'sorcer'], 'scoriae': ['coraise', 'scoriae'], 'scorpidae': ['carpiodes', 'scorpidae'], 'scorpiones': ['procession', 'scorpiones'], 'scorpionic': ['orniscopic', 'scorpionic'], 'scorse': ['cessor', 'crosse', 'scorse'], 'scortation': ['cartoonist', 'scortation'], 'scot': ['cost', 'scot'], 'scotale': ['alecost', 'lactose', 'scotale', 'talcose'], 'scote': ['coset', 'estoc', 'scote'], 'scoter': ['corset', 'cortes', 'coster', 'escort', 'scoter', 'sector'], 'scotia': ['isotac', 'scotia'], 'scotism': ['cosmist', 'scotism'], 'scotomatic': ['osmotactic', 'scotomatic'], 'scotty': ['cytost', 'scotty'], 'scoup': ['copus', 'scoup'], 'scour': ['cours', 'scour'], 'scoured': ['coursed', 'scoured'], 'scourer': ['courser', 'scourer'], 'scourge': ['scourge', 'scrouge'], 'scourger': ['scourger', 'scrouger'], 'scouring': ['coursing', 'scouring'], 'scouth': ['schout', 'scouth'], 'scrabble': ['scabbler', 'scrabble'], 'scrabe': ['braces', 'scrabe'], 'scrae': ['carse', 'caser', 'ceras', 'scare', 'scrae'], 'scraily': ['scarily', 'scraily'], 'scramble': ['scambler', 'scramble'], 'scran': ['scarn', 'scran'], 'scrap': ['craps', 'scarp', 'scrap'], 'scrape': ['casper', 'escarp', 'parsec', 'scrape', 'secpar', 'spacer'], 'scrapie': ['epacris', 'scrapie', 'serapic'], 'scraping': ['scarping', 'scraping'], 'scraplet': ['sceptral', 'scraplet', 'spectral'], 'scrapple': ['scappler', 'scrapple'], 'scrat': ['scart', 'scrat'], 'scratcher': ['rescratch', 'scratcher'], 'scrath': ['scarth', 'scrath', 'starch'], 'scray': ['ascry', 'scary', 'scray'], 'screak': ['resack', 'sacker', 'screak'], 'screaming': ['germanics', 'screaming'], 'screamy': ['armscye', 'screamy'], 'scree': ['scree', 'secre'], 'screel': ['sclere', 'screel'], 'screen': ['censer', 'scerne', 'screen', 'secern'], 'screenless': ['censerless', 'screenless'], 'screeny': ['scenery', 'screeny'], 'screet': ['resect', 'screet', 'secret'], 'screwdrive': ['drivescrew', 'screwdrive'], 'scrieve': ['cerevis', 'scrieve', 'service'], 'scrike': ['scrike', 'sicker'], 'scrip': ['crisp', 'scrip'], 'scripee': ['precise', 'scripee'], 'scripula': ['scripula', 'spicular'], 'scrobicula': ['scobicular', 'scrobicula'], 'scrota': ['arctos', 'castor', 'costar', 'scrota'], 'scrouge': ['scourge', 'scrouge'], 'scrouger': ['scourger', 'scrouger'], 'scrout': ['scrout', 'scruto'], 'scroyle': ['cryosel', 'scroyle'], 'scruf': ['scruf', 'scurf'], 'scruffle': ['scruffle', 'scuffler'], 'scruple': ['scruple', 'sculper'], 'scrutate': ['crustate', 'scrutate'], 'scrutation': ['crustation', 'scrutation'], 'scrutinant': ['incrustant', 'scrutinant'], 'scrutinate': ['incrustate', 'scaturient', 'scrutinate'], 'scruto': ['scrout', 'scruto'], 'scudi': ['scudi', 'sudic'], 'scuffler': ['scruffle', 'scuffler'], 'sculper': ['scruple', 'sculper'], 'sculpin': ['insculp', 'sculpin'], 'scup': ['cusp', 'scup'], 'scur': ['crus', 'scur'], 'scurf': ['scruf', 'scurf'], 'scusation': ['cosustain', 'scusation'], 'scuta': ['scaut', 'scuta'], 'scutal': ['scutal', 'suclat'], 'scute': ['cetus', 'scute'], 'scutifer': ['fusteric', 'scutifer'], 'scutigeral': ['gesticular', 'scutigeral'], 'scutula': ['auscult', 'scutula'], 'scye': ['scye', 'syce'], 'scylliidae': ['salicylide', 'scylliidae'], 'scyllium': ['clumsily', 'scyllium'], 'scyphi': ['physic', 'scyphi'], 'scyphomancy': ['psychomancy', 'scyphomancy'], 'scyt': ['cyst', 'scyt'], 'scythe': ['chesty', 'scythe'], 'scytitis': ['cystitis', 'scytitis'], 'se': ['es', 'se'], 'sea': ['aes', 'ase', 'sea'], 'seadog': ['dosage', 'seadog'], 'seagirt': ['seagirt', 'strigae'], 'seah': ['seah', 'shea'], 'seak': ['sake', 'seak'], 'seal': ['elsa', 'sale', 'seal', 'slae'], 'sealable': ['leasable', 'sealable'], 'sealch': ['cashel', 'laches', 'sealch'], 'sealer': ['alerse', 'leaser', 'reales', 'resale', 'reseal', 'sealer'], 'sealet': ['ateles', 'saltee', 'sealet', 'stelae', 'teasel'], 'sealing': ['leasing', 'sealing'], 'sealwort': ['restowal', 'sealwort'], 'seam': ['asem', 'mesa', 'same', 'seam'], 'seamanite': ['anamesite', 'seamanite'], 'seamark': ['kamares', 'seamark'], 'seamer': ['reseam', 'seamer'], 'seamlet': ['maltese', 'seamlet'], 'seamlike': ['mesalike', 'seamlike'], 'seamrend': ['redesman', 'seamrend'], 'seamster': ['masseter', 'seamster'], 'seamus': ['assume', 'seamus'], 'sean': ['anes', 'sane', 'sean'], 'seance': ['encase', 'seance', 'seneca'], 'seaplane': ['seaplane', 'spelaean'], 'seaport': ['esparto', 'petrosa', 'seaport'], 'sear': ['arse', 'rase', 'sare', 'sear', 'sera'], 'searce': ['cesare', 'crease', 'recase', 'searce'], 'searcer': ['creaser', 'searcer'], 'search': ['arches', 'chaser', 'eschar', 'recash', 'search'], 'searcher': ['rechaser', 'research', 'searcher'], 'searchment': ['manchester', 'searchment'], 'searcloth': ['clathrose', 'searcloth'], 'seared': ['erased', 'reseda', 'seared'], 'searer': ['eraser', 'searer'], 'searing': ['searing', 'seringa'], 'seary': ['reasy', 'resay', 'sayer', 'seary'], 'seaside': ['disease', 'seaside'], 'seat': ['ates', 'east', 'eats', 'sate', 'seat', 'seta'], 'seated': ['seated', 'sedate'], 'seater': ['asteer', 'easter', 'eastre', 'reseat', 'saeter', 'seater', 'staree', 'teaser', 'teresa'], 'seating': ['easting', 'gainset', 'genista', 'ingesta', 'seating', 'signate', 'teasing'], 'seatless': ['sateless', 'seatless'], 'seatrain': ['artesian', 'asterina', 'asternia', 'erastian', 'seatrain'], 'seatron': ['noreast', 'rosetan', 'seatron', 'senator', 'treason'], 'seave': ['eaves', 'evase', 'seave'], 'seax': ['axes', 'saxe', 'seax'], 'seba': ['base', 'besa', 'sabe', 'seba'], 'sebastian': ['bassanite', 'sebastian'], 'sebilla': ['sabelli', 'sebilla'], 'sebum': ['embus', 'sebum'], 'secalin': ['celsian', 'escalin', 'sanicle', 'secalin'], 'secaline': ['salience', 'secaline'], 'secant': ['ascent', 'secant', 'stance'], 'secern': ['censer', 'scerne', 'screen', 'secern'], 'secernent': ['secernent', 'sentencer'], 'secondar': ['endosarc', 'secondar'], 'secos': ['cosse', 'secos'], 'secpar': ['casper', 'escarp', 'parsec', 'scrape', 'secpar', 'spacer'], 'secre': ['scree', 'secre'], 'secret': ['resect', 'screet', 'secret'], 'secretarian': ['ascertainer', 'reascertain', 'secretarian'], 'secretion': ['resection', 'secretion'], 'secretional': ['resectional', 'secretional'], 'sect': ['cest', 'sect'], 'sectarian': ['ascertain', 'cartesian', 'cartisane', 'sectarian'], 'sectarianism': ['cartesianism', 'sectarianism'], 'section': ['contise', 'noetics', 'section'], 'sectism': ['sectism', 'smectis'], 'sector': ['corset', 'cortes', 'coster', 'escort', 'scoter', 'sector'], 'sectorial': ['alectoris', 'sarcolite', 'sclerotia', 'sectorial'], 'sectroid': ['decorist', 'sectroid'], 'securable': ['rescuable', 'securable'], 'securance': ['recusance', 'securance'], 'secure': ['cereus', 'ceruse', 'recuse', 'rescue', 'secure'], 'securer': ['recurse', 'rescuer', 'securer'], 'sedan': ['sedan', 'snead'], 'sedanier': ['arsedine', 'arsenide', 'sedanier', 'siderean'], 'sedat': ['sedat', 'stade', 'stead'], 'sedate': ['seated', 'sedate'], 'sedation': ['astonied', 'sedation'], 'sederunt': ['sederunt', 'underset', 'undesert', 'unrested'], 'sedile': ['diesel', 'sedile', 'seidel'], 'sedimetric': ['sedimetric', 'semidirect'], 'sedimetrical': ['decimestrial', 'sedimetrical'], 'sedition': ['desition', 'sedition'], 'sedulity': ['dysluite', 'sedulity'], 'sedum': ['mused', 'sedum'], 'seedbird': ['birdseed', 'seedbird'], 'seeded': ['deseed', 'seeded'], 'seeder': ['reseed', 'seeder'], 'seedlip': ['pelides', 'seedlip'], 'seeing': ['seeing', 'signee'], 'seek': ['kees', 'seek', 'skee'], 'seeker': ['reseek', 'seeker'], 'seel': ['else', 'lees', 'seel', 'sele', 'slee'], 'seem': ['mese', 'seem', 'seme', 'smee'], 'seemer': ['emerse', 'seemer'], 'seen': ['ense', 'esne', 'nese', 'seen', 'snee'], 'seenu': ['ensue', 'seenu', 'unsee'], 'seer': ['erse', 'rees', 'seer', 'sere'], 'seerband': ['seerband', 'serabend'], 'seerhand': ['denshare', 'seerhand'], 'seerhood': ['rhodeose', 'seerhood'], 'seership': ['hesperis', 'seership'], 'seething': ['seething', 'sheeting'], 'seg': ['ges', 'seg'], 'seggar': ['sagger', 'seggar'], 'seggard': ['daggers', 'seggard'], 'sego': ['goes', 'sego'], 'segolate': ['gelatose', 'segolate'], 'segreant': ['estrange', 'segreant', 'sergeant', 'sternage'], 'seid': ['desi', 'ides', 'seid', 'side'], 'seidel': ['diesel', 'sedile', 'seidel'], 'seignioral': ['seignioral', 'seignorial'], 'seignoral': ['gasoliner', 'seignoral'], 'seignorial': ['seignioral', 'seignorial'], 'seine': ['insee', 'seine'], 'seiner': ['inseer', 'nereis', 'seiner', 'serine', 'sirene'], 'seise': ['essie', 'seise'], 'seism': ['seism', 'semis'], 'seismal': ['aimless', 'melissa', 'seismal'], 'seismotic': ['seismotic', 'societism'], 'seit': ['seit', 'site'], 'seizable': ['seizable', 'sizeable'], 'seizer': ['resize', 'seizer'], 'sekane': ['sakeen', 'sekane'], 'sekani': ['kinase', 'sekani'], 'sekar': ['asker', 'reask', 'saker', 'sekar'], 'seker': ['esker', 'keres', 'reesk', 'seker', 'skeer', 'skere'], 'selagite': ['elegiast', 'selagite'], 'selah': ['halse', 'leash', 'selah', 'shale', 'sheal', 'shela'], 'selamin': ['malines', 'salmine', 'selamin', 'seminal'], 'selbergite': ['gilbertese', 'selbergite'], 'seldor': ['dorsel', 'seldor', 'solder'], 'seldseen': ['needless', 'seldseen'], 'sele': ['else', 'lees', 'seel', 'sele', 'slee'], 'selector': ['corselet', 'sclerote', 'selector'], 'selenic': ['license', 'selenic', 'silence'], 'selenion': ['leonines', 'selenion'], 'selenitic': ['insectile', 'selenitic'], 'selenium': ['selenium', 'semilune', 'seminule'], 'selenosis': ['noiseless', 'selenosis'], 'seleucian': ['sauceline', 'seleucian'], 'self': ['fels', 'self'], 'selfsame': ['fameless', 'selfsame'], 'selfsameness': ['famelessness', 'selfsameness'], 'selictar': ['altrices', 'selictar'], 'selina': ['alsine', 'neslia', 'saline', 'selina', 'silane'], 'selion': ['insole', 'leonis', 'lesion', 'selion'], 'seljukian': ['januslike', 'seljukian'], 'sella': ['salle', 'sella'], 'sellably': ['sellably', 'syllable'], 'sellate': ['estella', 'sellate'], 'seller': ['resell', 'seller'], 'selli': ['lisle', 'selli'], 'sellie': ['leslie', 'sellie'], 'sellout': ['outsell', 'sellout'], 'selt': ['lest', 'selt'], 'selter': ['lester', 'selter', 'streel'], 'selung': ['gunsel', 'selung', 'slunge'], 'selva': ['salve', 'selva', 'slave', 'valse'], 'semang': ['magnes', 'semang'], 'semantic': ['amnestic', 'semantic'], 'semaphore': ['mesohepar', 'semaphore'], 'sematic': ['cameist', 'etacism', 'sematic'], 'sematrope': ['perosmate', 'sematrope'], 'seme': ['mese', 'seem', 'seme', 'smee'], 'semen': ['mense', 'mesne', 'semen'], 'semeostoma': ['semeostoma', 'semostomae'], 'semi': ['mise', 'semi', 'sime'], 'semiarch': ['semiarch', 'smachrie'], 'semibald': ['bedismal', 'semibald'], 'semiball': ['mislabel', 'semiball'], 'semic': ['mesic', 'semic'], 'semicircle': ['semicircle', 'semicleric'], 'semicleric': ['semicircle', 'semicleric'], 'semicone': ['nicesome', 'semicone'], 'semicoronet': ['oncosimeter', 'semicoronet'], 'semicrome': ['mesomeric', 'microseme', 'semicrome'], 'semidirect': ['sedimetric', 'semidirect'], 'semidormant': ['memorandist', 'moderantism', 'semidormant'], 'semihard': ['dreamish', 'semihard'], 'semihiant': ['histamine', 'semihiant'], 'semilimber': ['immersible', 'semilimber'], 'semilunar': ['semilunar', 'unrealism'], 'semilune': ['selenium', 'semilune', 'seminule'], 'semiminor': ['immersion', 'semiminor'], 'semimoron': ['monroeism', 'semimoron'], 'seminal': ['malines', 'salmine', 'selamin', 'seminal'], 'seminar': ['remains', 'seminar'], 'seminasal': ['messalian', 'seminasal'], 'seminomadic': ['demoniacism', 'seminomadic'], 'seminomata': ['mastomenia', 'seminomata'], 'seminule': ['selenium', 'semilune', 'seminule'], 'semiopal': ['malpoise', 'semiopal'], 'semiorb': ['boreism', 'semiorb'], 'semiovaloid': ['semiovaloid', 'semiovoidal'], 'semiovoidal': ['semiovaloid', 'semiovoidal'], 'semipolar': ['perisomal', 'semipolar'], 'semipro': ['imposer', 'promise', 'semipro'], 'semipronation': ['impersonation', 'prosemination', 'semipronation'], 'semiquote': ['quietsome', 'semiquote'], 'semirotund': ['semirotund', 'unmortised'], 'semis': ['seism', 'semis'], 'semispan': ['menaspis', 'semispan'], 'semisteel': ['messelite', 'semisteel', 'teleseism'], 'semistill': ['limitless', 'semistill'], 'semistriated': ['disastimeter', 'semistriated'], 'semita': ['samite', 'semita', 'tamise', 'teaism'], 'semitae': ['amesite', 'mesitae', 'semitae'], 'semitour': ['moisture', 'semitour'], 'semiurban': ['semiurban', 'submarine'], 'semiurn': ['neurism', 'semiurn'], 'semivector': ['semivector', 'viscometer'], 'semnae': ['enseam', 'semnae'], 'semola': ['melosa', 'salome', 'semola'], 'semolella': ['lamellose', 'semolella'], 'semolina': ['laminose', 'lemonias', 'semolina'], 'semological': ['mesological', 'semological'], 'semology': ['mesology', 'semology'], 'semostomae': ['semeostoma', 'semostomae'], 'sempiternous': ['sempiternous', 'supermoisten'], 'semuncia': ['muscinae', 'semuncia'], 'semuncial': ['masculine', 'semuncial', 'simulance'], 'sen': ['ens', 'sen'], 'senaite': ['etesian', 'senaite'], 'senam': ['manes', 'manse', 'mensa', 'samen', 'senam'], 'senarius': ['anuresis', 'senarius'], 'senate': ['ensate', 'enseat', 'santee', 'sateen', 'senate'], 'senator': ['noreast', 'rosetan', 'seatron', 'senator', 'treason'], 'senatorian': ['arsenation', 'senatorian', 'sonneratia'], 'senatrices': ['resistance', 'senatrices'], 'sence': ['cense', 'scene', 'sence'], 'senci': ['senci', 'since'], 'send': ['send', 'sned'], 'sender': ['resend', 'sender'], 'seneca': ['encase', 'seance', 'seneca'], 'senega': ['sagene', 'senega'], 'senesce': ['essence', 'senesce'], 'senile': ['enisle', 'ensile', 'senile', 'silene'], 'senilism': ['liminess', 'senilism'], 'senior': ['rosine', 'senior', 'soneri'], 'senlac': ['lances', 'senlac'], 'senna': ['nanes', 'senna'], 'sennit': ['innest', 'sennit', 'sinnet', 'tennis'], 'sennite': ['intense', 'sennite'], 'senocular': ['larcenous', 'senocular'], 'senones': ['oneness', 'senones'], 'sensable': ['ableness', 'blaeness', 'sensable'], 'sensatorial': ['assertional', 'sensatorial'], 'sensical': ['laciness', 'sensical'], 'sensilia': ['sensilia', 'silesian'], 'sensilla': ['nailless', 'sensilla'], 'sension': ['neossin', 'sension'], 'sensuism': ['sensuism', 'senusism'], 'sent': ['nest', 'sent', 'sten'], 'sentencer': ['secernent', 'sentencer'], 'sentition': ['sentition', 'tenonitis'], 'senusism': ['sensuism', 'senusism'], 'sepad': ['depas', 'sepad', 'spade'], 'sepal': ['elaps', 'lapse', 'lepas', 'pales', 'salep', 'saple', 'sepal', 'slape', 'spale', 'speal'], 'sepaled': ['delapse', 'sepaled'], 'sepaloid': ['episodal', 'lapidose', 'sepaloid'], 'separable': ['separable', 'spareable'], 'separate': ['asperate', 'separate'], 'separation': ['anisoptera', 'asperation', 'separation'], 'sephardi': ['diphaser', 'parished', 'raphides', 'sephardi'], 'sephen': ['sephen', 'sphene'], 'sepian': ['sepian', 'spinae'], 'sepic': ['sepic', 'spice'], 'sepion': ['espino', 'sepion'], 'sepoy': ['poesy', 'posey', 'sepoy'], 'seps': ['pess', 'seps'], 'sepsis': ['sepsis', 'speiss'], 'sept': ['pest', 'sept', 'spet', 'step'], 'septa': ['paste', 'septa', 'spate'], 'septal': ['pastel', 'septal', 'staple'], 'septane': ['penates', 'septane'], 'septarium': ['impasture', 'septarium'], 'septenar': ['entrepas', 'septenar'], 'septennium': ['pennisetum', 'septennium'], 'septentrio': ['septentrio', 'tripestone'], 'septerium': ['misrepute', 'septerium'], 'septi': ['septi', 'spite', 'stipe'], 'septicemia': ['episematic', 'septicemia'], 'septicidal': ['pesticidal', 'septicidal'], 'septicopyemia': ['pyosepticemia', 'septicopyemia'], 'septicopyemic': ['pyosepticemic', 'septicopyemic'], 'septier': ['respite', 'septier'], 'septiferous': ['pestiferous', 'septiferous'], 'septile': ['epistle', 'septile'], 'septimal': ['petalism', 'septimal'], 'septocosta': ['septocosta', 'statoscope'], 'septoic': ['poetics', 'septoic'], 'septonasal': ['nasoseptal', 'septonasal'], 'septoria': ['isoptera', 'septoria'], 'septum': ['septum', 'upstem'], 'septuor': ['petrous', 'posture', 'proetus', 'proteus', 'septuor', 'spouter'], 'sequential': ['latinesque', 'sequential'], 'sequin': ['quinse', 'sequin'], 'ser': ['ers', 'ser'], 'sera': ['arse', 'rase', 'sare', 'sear', 'sera'], 'serab': ['barse', 'besra', 'saber', 'serab'], 'serabend': ['seerband', 'serabend'], 'seraglio': ['girasole', 'seraglio'], 'serai': ['aries', 'arise', 'raise', 'serai'], 'serail': ['israel', 'relais', 'resail', 'sailer', 'serail', 'serial'], 'seral': ['arles', 'arsle', 'laser', 'seral', 'slare'], 'serang': ['angers', 'sanger', 'serang'], 'serape': ['parsee', 'persae', 'persea', 'serape'], 'seraph': ['phrase', 'seraph', 'shaper', 'sherpa'], 'seraphic': ['parchesi', 'seraphic'], 'seraphim': ['samphire', 'seraphim'], 'seraphina': ['pharisean', 'seraphina'], 'seraphine': ['hesperian', 'phrenesia', 'seraphine'], 'seraphism': ['misphrase', 'seraphism'], 'serapic': ['epacris', 'scrapie', 'serapic'], 'serapis': ['paresis', 'serapis'], 'serapist': ['piratess', 'serapist', 'tarsipes'], 'serau': ['serau', 'urase'], 'seraw': ['resaw', 'sawer', 'seraw', 'sware', 'swear', 'warse'], 'sercial': ['scleria', 'sercial'], 'sere': ['erse', 'rees', 'seer', 'sere'], 'serean': ['serean', 'serena'], 'sereh': ['herse', 'sereh', 'sheer', 'shree'], 'serena': ['serean', 'serena'], 'serenata': ['arsenate', 'serenata'], 'serene': ['resene', 'serene'], 'serenoa': ['arenose', 'serenoa'], 'serge': ['reges', 'serge'], 'sergeant': ['estrange', 'segreant', 'sergeant', 'sternage'], 'sergei': ['sergei', 'sieger'], 'serger': ['gerres', 'serger'], 'serging': ['serging', 'snigger'], 'sergiu': ['guiser', 'sergiu'], 'seri': ['reis', 'rise', 'seri', 'sier', 'sire'], 'serial': ['israel', 'relais', 'resail', 'sailer', 'serail', 'serial'], 'serialist': ['eristalis', 'serialist'], 'serian': ['arisen', 'arsine', 'resina', 'serian'], 'sericate': ['ecrasite', 'sericate'], 'sericated': ['discreate', 'sericated'], 'sericin': ['irenics', 'resinic', 'sericin', 'sirenic'], 'serific': ['friesic', 'serific'], 'serin': ['reins', 'resin', 'rinse', 'risen', 'serin', 'siren'], 'serine': ['inseer', 'nereis', 'seiner', 'serine', 'sirene'], 'serinette': ['retistene', 'serinette'], 'seringa': ['searing', 'seringa'], 'seringal': ['resignal', 'seringal', 'signaler'], 'serinus': ['russine', 'serinus', 'sunrise'], 'serio': ['osier', 'serio'], 'seriola': ['rosalie', 'seriola'], 'serioludicrous': ['ludicroserious', 'serioludicrous'], 'sermo': ['meros', 'mores', 'morse', 'sermo', 'smore'], 'sermonist': ['monitress', 'sermonist'], 'sero': ['eros', 'rose', 'sero', 'sore'], 'serofibrous': ['fibroserous', 'serofibrous'], 'serolin': ['resinol', 'serolin'], 'seromucous': ['mucoserous', 'seromucous'], 'seron': ['norse', 'noser', 'seron', 'snore'], 'seroon': ['nooser', 'seroon', 'sooner'], 'seroot': ['seroot', 'sooter', 'torose'], 'serotina': ['arsonite', 'asterion', 'oestrian', 'rosinate', 'serotina'], 'serotinal': ['lairstone', 'orleanist', 'serotinal'], 'serotine': ['serotine', 'torinese'], 'serous': ['serous', 'souser'], 'serow': ['owser', 'resow', 'serow', 'sower', 'swore', 'worse'], 'serpari': ['aspirer', 'praiser', 'serpari'], 'serpent': ['penster', 'present', 'serpent', 'strepen'], 'serpentian': ['serpentian', 'serpentina'], 'serpentid': ['president', 'serpentid'], 'serpentina': ['serpentian', 'serpentina'], 'serpentinous': ['serpentinous', 'supertension'], 'serpently': ['presently', 'serpently'], 'serpiginous': ['serpiginous', 'spinigerous'], 'serpolet': ['proteles', 'serpolet'], 'serpula': ['perusal', 'serpula'], 'serpulae': ['pleasure', 'serpulae'], 'serpulan': ['purslane', 'serpulan', 'supernal'], 'serpulidae': ['serpulidae', 'superideal'], 'serpuline': ['serpuline', 'superline'], 'serra': ['ersar', 'raser', 'serra'], 'serrage': ['argeers', 'greaser', 'serrage'], 'serran': ['serran', 'snarer'], 'serrano': ['serrano', 'sornare'], 'serratic': ['crateris', 'serratic'], 'serratodentate': ['dentatoserrate', 'serratodentate'], 'serrature': ['serrature', 'treasurer'], 'serried': ['derries', 'desirer', 'resider', 'serried'], 'serriped': ['presider', 'serriped'], 'sert': ['rest', 'sert', 'stre'], 'serta': ['aster', 'serta', 'stare', 'strae', 'tarse', 'teras'], 'sertum': ['muster', 'sertum', 'stumer'], 'serum': ['muser', 'remus', 'serum'], 'serut': ['serut', 'strue', 'turse', 'uster'], 'servable': ['beslaver', 'servable', 'versable'], 'servage': ['gervase', 'greaves', 'servage'], 'serval': ['salver', 'serval', 'slaver', 'versal'], 'servant': ['servant', 'versant'], 'servation': ['overstain', 'servation', 'versation'], 'serve': ['serve', 'sever', 'verse'], 'server': ['revers', 'server', 'verser'], 'servet': ['revest', 'servet', 'sterve', 'verset', 'vester'], 'servetian': ['invertase', 'servetian'], 'servian': ['servian', 'vansire'], 'service': ['cerevis', 'scrieve', 'service'], 'serviceable': ['receivables', 'serviceable'], 'servient': ['reinvest', 'servient'], 'serviential': ['inversatile', 'serviential'], 'servilize': ['servilize', 'silverize'], 'servite': ['restive', 'servite'], 'servitor': ['overstir', 'servitor'], 'servitude': ['detrusive', 'divesture', 'servitude'], 'servo': ['servo', 'verso'], 'sesma': ['masse', 'sesma'], 'sestertium': ['sestertium', 'trusteeism'], 'sestet': ['sestet', 'testes', 'tsetse'], 'sestiad': ['disseat', 'sestiad'], 'sestian': ['entasis', 'sestian', 'sestina'], 'sestina': ['entasis', 'sestian', 'sestina'], 'sestole': ['osselet', 'sestole', 'toeless'], 'sestuor': ['estrous', 'oestrus', 'sestuor', 'tussore'], 'sesuto': ['sesuto', 'setous'], 'seta': ['ates', 'east', 'eats', 'sate', 'seat', 'seta'], 'setae': ['setae', 'tease'], 'setal': ['least', 'setal', 'slate', 'stale', 'steal', 'stela', 'tales'], 'setaria': ['asarite', 'asteria', 'atresia', 'setaria'], 'setback': ['backset', 'setback'], 'setdown': ['downset', 'setdown'], 'seth': ['esth', 'hest', 'seth'], 'sethead': ['headset', 'sethead'], 'sethian': ['sethian', 'sthenia'], 'sethic': ['ethics', 'sethic'], 'setibo': ['setibo', 'sobeit'], 'setirostral': ['latirostres', 'setirostral'], 'setline': ['leisten', 'setline', 'tensile'], 'setoff': ['offset', 'setoff'], 'seton': ['onset', 'seton', 'steno', 'stone'], 'setous': ['sesuto', 'setous'], 'setout': ['outset', 'setout'], 'setover': ['overset', 'setover'], 'sett': ['sett', 'stet', 'test'], 'settable': ['settable', 'testable'], 'settaine': ['anisette', 'atestine', 'settaine'], 'settee': ['settee', 'testee'], 'setter': ['retest', 'setter', 'street', 'tester'], 'setting': ['setting', 'testing'], 'settler': ['settler', 'sterlet', 'trestle'], 'settlor': ['settlor', 'slotter'], 'setula': ['salute', 'setula'], 'setup': ['setup', 'stupe', 'upset'], 'setwall': ['setwall', 'swallet'], 'seven': ['evens', 'seven'], 'sevener': ['sevener', 'veneres'], 'sever': ['serve', 'sever', 'verse'], 'severer': ['reserve', 'resever', 'reverse', 'severer'], 'sew': ['sew', 'wes'], 'sewed': ['sewed', 'swede'], 'sewer': ['resew', 'sewer', 'sweer'], 'sewered': ['sewered', 'sweered'], 'sewing': ['sewing', 'swinge'], 'sewn': ['news', 'sewn', 'snew'], 'sewround': ['sewround', 'undersow'], 'sexed': ['desex', 'sexed'], 'sextan': ['saxten', 'sextan'], 'sextipartition': ['extirpationist', 'sextipartition'], 'sextodecimo': ['decimosexto', 'sextodecimo'], 'sextry': ['sextry', 'xyster'], 'sexuale': ['esexual', 'sexuale'], 'sey': ['sey', 'sye', 'yes'], 'seymour': ['mousery', 'seymour'], 'sfoot': ['foots', 'sfoot', 'stoof'], 'sgad': ['dags', 'sgad'], 'sha': ['ash', 'sah', 'sha'], 'shab': ['bash', 'shab'], 'shabbily': ['babishly', 'shabbily'], 'shabbiness': ['babishness', 'shabbiness'], 'shabunder': ['husbander', 'shabunder'], 'shad': ['dash', 'sadh', 'shad'], 'shade': ['deash', 'hades', 'sadhe', 'shade'], 'shaded': ['dashed', 'shaded'], 'shader': ['dasher', 'shader', 'sheard'], 'shadily': ['ladyish', 'shadily'], 'shading': ['dashing', 'shading'], 'shadkan': ['dashnak', 'shadkan'], 'shady': ['dashy', 'shady'], 'shafting': ['shafting', 'tangfish'], 'shag': ['gash', 'shag'], 'shagrag': ['ragshag', 'shagrag'], 'shah': ['hash', 'sahh', 'shah'], 'shahi': ['shahi', 'shiah'], 'shaitan': ['ashanti', 'sanhita', 'shaitan', 'thasian'], 'shaivism': ['shaivism', 'shivaism'], 'shaka': ['kasha', 'khasa', 'sakha', 'shaka'], 'shakeout': ['outshake', 'shakeout'], 'shaker': ['kasher', 'shaker'], 'shakil': ['lakish', 'shakil'], 'shaku': ['kusha', 'shaku', 'ushak'], 'shaky': ['hasky', 'shaky'], 'shale': ['halse', 'leash', 'selah', 'shale', 'sheal', 'shela'], 'shalt': ['shalt', 'slath'], 'sham': ['mash', 'samh', 'sham'], 'shama': ['hamsa', 'masha', 'shama'], 'shamable': ['baalshem', 'shamable'], 'shamal': ['mashal', 'shamal'], 'shaman': ['ashman', 'shaman'], 'shamba': ['ambash', 'shamba'], 'shambrier': ['herbarism', 'shambrier'], 'shambu': ['ambush', 'shambu'], 'shame': ['sahme', 'shame'], 'shamer': ['masher', 'ramesh', 'shamer'], 'shamir': ['marish', 'shamir'], 'shammish': ['mishmash', 'shammish'], 'shan': ['hans', 'nash', 'shan'], 'shane': ['ashen', 'hanse', 'shane', 'shean'], 'shang': ['gnash', 'shang'], 'shant': ['shant', 'snath'], 'shap': ['hasp', 'pash', 'psha', 'shap'], 'shape': ['heaps', 'pesah', 'phase', 'shape'], 'shapeless': ['phaseless', 'shapeless'], 'shaper': ['phrase', 'seraph', 'shaper', 'sherpa'], 'shapometer': ['atmosphere', 'shapometer'], 'shapy': ['physa', 'shapy'], 'shardana': ['darshana', 'shardana'], 'share': ['asher', 'share', 'shear'], 'shareman': ['shareman', 'shearman'], 'sharer': ['rasher', 'sharer'], 'sharesman': ['sharesman', 'shearsman'], 'shargar': ['shargar', 'sharrag'], 'shari': ['ashir', 'shari'], 'sharon': ['rhason', 'sharon', 'shoran'], 'sharp': ['sharp', 'shrap'], 'sharpener': ['resharpen', 'sharpener'], 'sharper': ['phraser', 'sharper'], 'sharpy': ['phrasy', 'sharpy'], 'sharrag': ['shargar', 'sharrag'], 'shasta': ['shasta', 'tassah'], 'shaster': ['hatress', 'shaster'], 'shastraik': ['katharsis', 'shastraik'], 'shastri': ['sartish', 'shastri'], 'shat': ['shat', 'tash'], 'shatter': ['rathest', 'shatter'], 'shatterer': ['ratherest', 'shatterer'], 'shattering': ['shattering', 'straighten'], 'shauri': ['shauri', 'surahi'], 'shave': ['shave', 'sheva'], 'shavee': ['shavee', 'sheave'], 'shaver': ['havers', 'shaver', 'shrave'], 'shavery': ['shavery', 'shravey'], 'shaw': ['shaw', 'wash'], 'shawano': ['shawano', 'washoan'], 'shawl': ['shawl', 'walsh'], 'shawy': ['shawy', 'washy'], 'shay': ['ashy', 'shay'], 'shea': ['seah', 'shea'], 'sheal': ['halse', 'leash', 'selah', 'shale', 'sheal', 'shela'], 'shean': ['ashen', 'hanse', 'shane', 'shean'], 'shear': ['asher', 'share', 'shear'], 'shearbill': ['shearbill', 'shillaber'], 'sheard': ['dasher', 'shader', 'sheard'], 'shearer': ['reshare', 'reshear', 'shearer'], 'shearman': ['shareman', 'shearman'], 'shearsman': ['sharesman', 'shearsman'], 'sheat': ['ashet', 'haste', 'sheat'], 'sheave': ['shavee', 'sheave'], 'shebeen': ['benshee', 'shebeen'], 'shechem': ['meshech', 'shechem'], 'sheder': ['hersed', 'sheder'], 'sheely': ['sheely', 'sheyle'], 'sheer': ['herse', 'sereh', 'sheer', 'shree'], 'sheering': ['greenish', 'sheering'], 'sheet': ['sheet', 'these'], 'sheeter': ['sheeter', 'therese'], 'sheeting': ['seething', 'sheeting'], 'sheila': ['elisha', 'hailse', 'sheila'], 'shela': ['halse', 'leash', 'selah', 'shale', 'sheal', 'shela'], 'shelf': ['flesh', 'shelf'], 'shelfful': ['fleshful', 'shelfful'], 'shelflist': ['filthless', 'shelflist'], 'shelfy': ['fleshy', 'shelfy'], 'shelta': ['haslet', 'lesath', 'shelta'], 'shelty': ['shelty', 'thysel'], 'shelve': ['shelve', 'shevel'], 'shemitic': ['ethicism', 'shemitic'], 'shen': ['nesh', 'shen'], 'sheol': ['hosel', 'sheol', 'shole'], 'sher': ['hers', 'resh', 'sher'], 'sherani': ['arshine', 'nearish', 'rhesian', 'sherani'], 'sheratan': ['hanaster', 'sheratan'], 'sheriat': ['atheris', 'sheriat'], 'sherif': ['fisher', 'sherif'], 'sherifate': ['fisheater', 'sherifate'], 'sherify': ['fishery', 'sherify'], 'sheriyat': ['hysteria', 'sheriyat'], 'sherpa': ['phrase', 'seraph', 'shaper', 'sherpa'], 'sherri': ['hersir', 'sherri'], 'sheugh': ['hughes', 'sheugh'], 'sheva': ['shave', 'sheva'], 'shevel': ['shelve', 'shevel'], 'shevri': ['shevri', 'shiver', 'shrive'], 'shewa': ['hawse', 'shewa', 'whase'], 'sheyle': ['sheely', 'sheyle'], 'shi': ['his', 'hsi', 'shi'], 'shiah': ['shahi', 'shiah'], 'shibar': ['barish', 'shibar'], 'shice': ['echis', 'shice'], 'shicer': ['riches', 'shicer'], 'shide': ['shide', 'shied', 'sidhe'], 'shied': ['shide', 'shied', 'sidhe'], 'shiel': ['liesh', 'shiel'], 'shieldable': ['deshabille', 'shieldable'], 'shier': ['hirse', 'shier', 'shire'], 'shiest': ['shiest', 'thesis'], 'shifter': ['reshift', 'shifter'], 'shih': ['hish', 'shih'], 'shiite': ['histie', 'shiite'], 'shik': ['kish', 'shik', 'sikh'], 'shikar': ['rakish', 'riksha', 'shikar', 'shikra', 'sikhra'], 'shikara': ['shikara', 'sikhara'], 'shikari': ['rikisha', 'shikari'], 'shikra': ['rakish', 'riksha', 'shikar', 'shikra', 'sikhra'], 'shillaber': ['shearbill', 'shillaber'], 'shimal': ['lamish', 'shimal'], 'shimmery': ['misrhyme', 'shimmery'], 'shin': ['hisn', 'shin', 'sinh'], 'shina': ['naish', 'shina'], 'shine': ['eshin', 'shine'], 'shiner': ['renish', 'shiner', 'shrine'], 'shingle': ['english', 'shingle'], 'shinto': ['histon', 'shinto', 'tonish'], 'shinty': ['shinty', 'snithy'], 'ship': ['pish', 'ship'], 'shipboy': ['boyship', 'shipboy'], 'shipkeeper': ['keepership', 'shipkeeper'], 'shiplap': ['lappish', 'shiplap'], 'shipman': ['manship', 'shipman'], 'shipmaster': ['mastership', 'shipmaster'], 'shipmate': ['aphetism', 'mateship', 'shipmate', 'spithame'], 'shipowner': ['ownership', 'shipowner'], 'shippage': ['pageship', 'shippage'], 'shipper': ['preship', 'shipper'], 'shippo': ['popish', 'shippo'], 'shipward': ['shipward', 'wardship'], 'shipwork': ['shipwork', 'workship'], 'shipworm': ['shipworm', 'wormship'], 'shire': ['hirse', 'shier', 'shire'], 'shirker': ['shirker', 'skirreh'], 'shirley': ['relishy', 'shirley'], 'shirty': ['shirty', 'thyris'], 'shirvan': ['shirvan', 'varnish'], 'shita': ['shita', 'thais'], 'shivaism': ['shaivism', 'shivaism'], 'shive': ['hives', 'shive'], 'shiver': ['shevri', 'shiver', 'shrive'], 'shlu': ['lush', 'shlu', 'shul'], 'sho': ['sho', 'soh'], 'shoa': ['saho', 'shoa'], 'shoal': ['shoal', 'shola'], 'shoat': ['hoast', 'hosta', 'shoat'], 'shockable': ['shockable', 'shoeblack'], 'shode': ['hosed', 'shode'], 'shoder': ['dehors', 'rhodes', 'shoder', 'shored'], 'shoe': ['hose', 'shoe'], 'shoeblack': ['shockable', 'shoeblack'], 'shoebrush': ['shoebrush', 'shorebush'], 'shoeless': ['hoseless', 'shoeless'], 'shoeman': ['hoseman', 'shoeman'], 'shoer': ['horse', 'shoer', 'shore'], 'shog': ['gosh', 'shog'], 'shoji': ['joshi', 'shoji'], 'shola': ['shoal', 'shola'], 'shole': ['hosel', 'sheol', 'shole'], 'shoo': ['shoo', 'soho'], 'shoot': ['shoot', 'sooth', 'sotho', 'toosh'], 'shooter': ['orthose', 'reshoot', 'shooter', 'soother'], 'shooting': ['shooting', 'soothing'], 'shop': ['phos', 'posh', 'shop', 'soph'], 'shopbook': ['bookshop', 'shopbook'], 'shopmaid': ['phasmoid', 'shopmaid'], 'shopper': ['hoppers', 'shopper'], 'shopwork': ['shopwork', 'workshop'], 'shoran': ['rhason', 'sharon', 'shoran'], 'shore': ['horse', 'shoer', 'shore'], 'shorea': ['ahorse', 'ashore', 'hoarse', 'shorea'], 'shorebush': ['shoebrush', 'shorebush'], 'shored': ['dehors', 'rhodes', 'shoder', 'shored'], 'shoreless': ['horseless', 'shoreless'], 'shoreman': ['horseman', 'rhamnose', 'shoreman'], 'shorer': ['horser', 'shorer'], 'shoreward': ['drawhorse', 'shoreward'], 'shoreweed': ['horseweed', 'shoreweed'], 'shoring': ['horsing', 'shoring'], 'short': ['horst', 'short'], 'shortage': ['hostager', 'shortage'], 'shorten': ['shorten', 'threnos'], 'shot': ['host', 'shot', 'thos', 'tosh'], 'shote': ['ethos', 'shote', 'those'], 'shotgun': ['gunshot', 'shotgun', 'uhtsong'], 'shotless': ['hostless', 'shotless'], 'shotstar': ['shotstar', 'starshot'], 'shou': ['huso', 'shou'], 'shoulderer': ['reshoulder', 'shoulderer'], 'shout': ['shout', 'south'], 'shouter': ['shouter', 'souther'], 'shouting': ['shouting', 'southing'], 'shover': ['shover', 'shrove'], 'showerer': ['reshower', 'showerer'], 'shrab': ['brash', 'shrab'], 'shram': ['marsh', 'shram'], 'shrap': ['sharp', 'shrap'], 'shrave': ['havers', 'shaver', 'shrave'], 'shravey': ['shavery', 'shravey'], 'shree': ['herse', 'sereh', 'sheer', 'shree'], 'shrewly': ['shrewly', 'welshry'], 'shriek': ['shriek', 'shrike'], 'shrieval': ['lavisher', 'shrieval'], 'shrike': ['shriek', 'shrike'], 'shrine': ['renish', 'shiner', 'shrine'], 'shrite': ['shrite', 'theirs'], 'shrive': ['shevri', 'shiver', 'shrive'], 'shriven': ['nervish', 'shriven'], 'shroudy': ['hydrous', 'shroudy'], 'shrove': ['shover', 'shrove'], 'shrub': ['brush', 'shrub'], 'shrubbery': ['berrybush', 'shrubbery'], 'shrubland': ['brushland', 'shrubland'], 'shrubless': ['brushless', 'shrubless'], 'shrublet': ['brushlet', 'shrublet'], 'shrublike': ['brushlike', 'shrublike'], 'shrubwood': ['brushwood', 'shrubwood'], 'shrug': ['grush', 'shrug'], 'shu': ['shu', 'ush'], 'shuba': ['shuba', 'subah'], 'shug': ['gush', 'shug', 'sugh'], 'shul': ['lush', 'shlu', 'shul'], 'shulamite': ['hamulites', 'shulamite'], 'shuler': ['lusher', 'shuler'], 'shunless': ['lushness', 'shunless'], 'shunter': ['reshunt', 'shunter'], 'shure': ['shure', 'usher'], 'shurf': ['frush', 'shurf'], 'shut': ['shut', 'thus', 'tush'], 'shutness': ['shutness', 'thusness'], 'shutout': ['outshut', 'shutout'], 'shuttering': ['hurtingest', 'shuttering'], 'shyam': ['mashy', 'shyam'], 'si': ['is', 'si'], 'sia': ['sai', 'sia'], 'siak': ['saki', 'siak', 'sika'], 'sial': ['lasi', 'lias', 'lisa', 'sail', 'sial'], 'sialagogic': ['isagogical', 'sialagogic'], 'sialic': ['sialic', 'silica'], 'sialid': ['asilid', 'sialid'], 'sialidae': ['asilidae', 'sialidae'], 'siam': ['mias', 'saim', 'siam', 'sima'], 'siamese': ['misease', 'siamese'], 'sib': ['bis', 'sib'], 'sibyl': ['sibyl', 'sybil'], 'sibylla': ['sibylla', 'syllabi'], 'sicana': ['ascian', 'sacian', 'scania', 'sicana'], 'sicani': ['anisic', 'sicani', 'sinaic'], 'sicarius': ['acrisius', 'sicarius'], 'siccate': ['ascetic', 'castice', 'siccate'], 'siccation': ['cocainist', 'siccation'], 'sice': ['cise', 'sice'], 'sicel': ['sicel', 'slice'], 'sicilian': ['anisilic', 'sicilian'], 'sickbed': ['bedsick', 'sickbed'], 'sicker': ['scrike', 'sicker'], 'sickerly': ['sickerly', 'slickery'], 'sickle': ['sickle', 'skelic'], 'sickler': ['sickler', 'slicker'], 'sicklied': ['disclike', 'sicklied'], 'sickling': ['sickling', 'slicking'], 'sicula': ['caulis', 'clusia', 'sicula'], 'siculian': ['luscinia', 'siculian'], 'sid': ['dis', 'sid'], 'sida': ['dais', 'dasi', 'disa', 'said', 'sida'], 'sidalcea': ['diaclase', 'sidalcea'], 'side': ['desi', 'ides', 'seid', 'side'], 'sidearm': ['misread', 'sidearm'], 'sideboard': ['broadside', 'sideboard'], 'sideburns': ['burnsides', 'sideburns'], 'sidecar': ['diceras', 'radices', 'sidecar'], 'sidehill': ['hillside', 'sidehill'], 'siderean': ['arsedine', 'arsenide', 'sedanier', 'siderean'], 'siderin': ['insider', 'siderin'], 'sideronatrite': ['endoarteritis', 'sideronatrite'], 'siderous': ['desirous', 'siderous'], 'sidership': ['sidership', 'spiderish'], 'sidesway': ['sidesway', 'sideways'], 'sidetrack': ['sidetrack', 'trackside'], 'sidewalk': ['sidewalk', 'walkside'], 'sideway': ['sideway', 'wayside'], 'sideways': ['sidesway', 'sideways'], 'sidhe': ['shide', 'shied', 'sidhe'], 'sidle': ['sidle', 'slide'], 'sidler': ['sidler', 'slider'], 'sidling': ['sidling', 'sliding'], 'sidlingly': ['sidlingly', 'slidingly'], 'sieger': ['sergei', 'sieger'], 'siena': ['anise', 'insea', 'siena', 'sinae'], 'sienna': ['insane', 'sienna'], 'sier': ['reis', 'rise', 'seri', 'sier', 'sire'], 'sierra': ['raiser', 'sierra'], 'siesta': ['siesta', 'tassie'], 'siever': ['revise', 'siever'], 'sife': ['feis', 'fise', 'sife'], 'sift': ['fist', 'sift'], 'sifted': ['fisted', 'sifted'], 'sifter': ['fister', 'resift', 'sifter', 'strife'], 'sifting': ['fisting', 'sifting'], 'sigh': ['gish', 'sigh'], 'sigher': ['resigh', 'sigher'], 'sighted': ['desight', 'sighted'], 'sightlily': ['sightlily', 'slightily'], 'sightliness': ['sightliness', 'slightiness'], 'sightly': ['sightly', 'slighty'], 'sigillated': ['distillage', 'sigillated'], 'sigla': ['gisla', 'ligas', 'sigla'], 'sigmatism': ['astigmism', 'sigmatism'], 'sigmoidal': ['dialogism', 'sigmoidal'], 'sign': ['sign', 'sing', 'snig'], 'signable': ['signable', 'singable'], 'signalee': ['ensilage', 'genesial', 'signalee'], 'signaler': ['resignal', 'seringal', 'signaler'], 'signalese': ['agileness', 'signalese'], 'signally': ['signally', 'singally', 'slangily'], 'signary': ['signary', 'syringa'], 'signate': ['easting', 'gainset', 'genista', 'ingesta', 'seating', 'signate', 'teasing'], 'signator': ['orangist', 'organist', 'roasting', 'signator'], 'signee': ['seeing', 'signee'], 'signer': ['resign', 'resing', 'signer', 'singer'], 'signet': ['ingest', 'signet', 'stinge'], 'signorial': ['sailoring', 'signorial'], 'signpost': ['postsign', 'signpost'], 'signum': ['musing', 'signum'], 'sika': ['saki', 'siak', 'sika'], 'sikar': ['kisra', 'sikar', 'skair'], 'siket': ['siket', 'skite'], 'sikh': ['kish', 'shik', 'sikh'], 'sikhara': ['shikara', 'sikhara'], 'sikhra': ['rakish', 'riksha', 'shikar', 'shikra', 'sikhra'], 'sil': ['lis', 'sil'], 'silane': ['alsine', 'neslia', 'saline', 'selina', 'silane'], 'silas': ['silas', 'sisal'], 'silcrete': ['sclerite', 'silcrete'], 'sile': ['isle', 'lise', 'sile'], 'silen': ['elsin', 'lenis', 'niels', 'silen', 'sline'], 'silence': ['license', 'selenic', 'silence'], 'silenced': ['licensed', 'silenced'], 'silencer': ['licenser', 'silencer'], 'silene': ['enisle', 'ensile', 'senile', 'silene'], 'silent': ['enlist', 'listen', 'silent', 'tinsel'], 'silently': ['silently', 'tinselly'], 'silenus': ['insulse', 'silenus'], 'silesian': ['sensilia', 'silesian'], 'silica': ['sialic', 'silica'], 'silicam': ['islamic', 'laicism', 'silicam'], 'silicane': ['silicane', 'silicean'], 'silicean': ['silicane', 'silicean'], 'siliceocalcareous': ['calcareosiliceous', 'siliceocalcareous'], 'silicoaluminate': ['aluminosilicate', 'silicoaluminate'], 'silicone': ['isocline', 'silicone'], 'silicotitanate': ['silicotitanate', 'titanosilicate'], 'silicotungstate': ['silicotungstate', 'tungstosilicate'], 'silicotungstic': ['silicotungstic', 'tungstosilicic'], 'silk': ['lisk', 'silk', 'skil'], 'silkaline': ['silkaline', 'snaillike'], 'silkman': ['klanism', 'silkman'], 'silkness': ['silkness', 'sinkless', 'skinless'], 'silly': ['silly', 'silyl'], 'sillyhow': ['lowishly', 'owlishly', 'sillyhow'], 'silo': ['lois', 'silo', 'siol', 'soil', 'soli'], 'silpha': ['palish', 'silpha'], 'silt': ['list', 'silt', 'slit'], 'silting': ['listing', 'silting'], 'siltlike': ['siltlike', 'slitlike'], 'silva': ['silva', 'slavi'], 'silver': ['silver', 'sliver'], 'silvered': ['desilver', 'silvered'], 'silverer': ['resilver', 'silverer', 'sliverer'], 'silverize': ['servilize', 'silverize'], 'silverlike': ['silverlike', 'sliverlike'], 'silverwood': ['silverwood', 'woodsilver'], 'silvery': ['silvery', 'slivery'], 'silvester': ['rivetless', 'silvester'], 'silyl': ['silly', 'silyl'], 'sim': ['ism', 'sim'], 'sima': ['mias', 'saim', 'siam', 'sima'], 'simal': ['islam', 'ismal', 'simal'], 'simar': ['maris', 'marsi', 'samir', 'simar'], 'sime': ['mise', 'semi', 'sime'], 'simeon': ['eonism', 'mesion', 'oneism', 'simeon'], 'simeonism': ['misoneism', 'simeonism'], 'simiad': ['idiasm', 'simiad'], 'simile': ['milsie', 'simile'], 'simity': ['myitis', 'simity'], 'simling': ['simling', 'smiling'], 'simmer': ['merism', 'mermis', 'simmer'], 'simmon': ['monism', 'nomism', 'simmon'], 'simon': ['minos', 'osmin', 'simon'], 'simonian': ['insomnia', 'simonian'], 'simonist': ['simonist', 'sintoism'], 'simony': ['isonym', 'myosin', 'simony'], 'simple': ['mespil', 'simple'], 'simpleton': ['simpleton', 'spoilment'], 'simplicist': ['simplicist', 'simplistic'], 'simplistic': ['simplicist', 'simplistic'], 'simply': ['limpsy', 'simply'], 'simson': ['nosism', 'simson'], 'simulance': ['masculine', 'semuncial', 'simulance'], 'simulcast': ['masculist', 'simulcast'], 'simuler': ['misrule', 'simuler'], 'sina': ['anis', 'nais', 'nasi', 'nias', 'sain', 'sina'], 'sinae': ['anise', 'insea', 'siena', 'sinae'], 'sinaean': ['nisaean', 'sinaean'], 'sinaic': ['anisic', 'sicani', 'sinaic'], 'sinaitic': ['isatinic', 'sinaitic'], 'sinal': ['sinal', 'slain', 'snail'], 'sinapic': ['panisic', 'piscian', 'piscina', 'sinapic'], 'since': ['senci', 'since'], 'sincere': ['ceresin', 'sincere'], 'sinecure': ['insecure', 'sinecure'], 'sinew': ['sinew', 'swine', 'wisen'], 'sinewed': ['endwise', 'sinewed'], 'sinewy': ['sinewy', 'swiney'], 'sinfonia': ['sainfoin', 'sinfonia'], 'sinfonietta': ['festination', 'infestation', 'sinfonietta'], 'sing': ['sign', 'sing', 'snig'], 'singable': ['signable', 'singable'], 'singally': ['signally', 'singally', 'slangily'], 'singarip': ['aspiring', 'praising', 'singarip'], 'singed': ['design', 'singed'], 'singer': ['resign', 'resing', 'signer', 'singer'], 'single': ['single', 'slinge'], 'singler': ['singler', 'slinger'], 'singles': ['essling', 'singles'], 'singlet': ['glisten', 'singlet'], 'sinh': ['hisn', 'shin', 'sinh'], 'sinico': ['inosic', 'sinico'], 'sinister': ['insister', 'reinsist', 'sinister', 'sisterin'], 'sinistrodextral': ['dextrosinistral', 'sinistrodextral'], 'sink': ['inks', 'sink', 'skin'], 'sinker': ['resink', 'reskin', 'sinker'], 'sinkhead': ['headskin', 'nakedish', 'sinkhead'], 'sinkless': ['silkness', 'sinkless', 'skinless'], 'sinklike': ['sinklike', 'skinlike'], 'sinnet': ['innest', 'sennit', 'sinnet', 'tennis'], 'sinoatrial': ['sinoatrial', 'solitarian'], 'sinogram': ['orangism', 'organism', 'sinogram'], 'sinolog': ['loosing', 'sinolog'], 'sinopia': ['pisonia', 'sinopia'], 'sinople': ['epsilon', 'sinople'], 'sinter': ['estrin', 'insert', 'sinter', 'sterin', 'triens'], 'sinto': ['sinto', 'stion'], 'sintoc': ['nostic', 'sintoc', 'tocsin'], 'sintoism': ['simonist', 'sintoism'], 'sintu': ['sintu', 'suint'], 'sinuatodentate': ['dentatosinuate', 'sinuatodentate'], 'sinuose': ['sinuose', 'suiones'], 'sinus': ['nisus', 'sinus'], 'sinward': ['inwards', 'sinward'], 'siol': ['lois', 'silo', 'siol', 'soil', 'soli'], 'sionite': ['inosite', 'sionite'], 'sip': ['psi', 'sip'], 'sipe': ['pise', 'sipe'], 'siper': ['siper', 'spier', 'spire'], 'siphonal': ['nailshop', 'siphonal'], 'siphuncle': ['siphuncle', 'uncleship'], 'sipling': ['sipling', 'spiling'], 'sipylite': ['pyelitis', 'sipylite'], 'sir': ['sir', 'sri'], 'sire': ['reis', 'rise', 'seri', 'sier', 'sire'], 'siredon': ['indorse', 'ordines', 'siredon', 'sordine'], 'siren': ['reins', 'resin', 'rinse', 'risen', 'serin', 'siren'], 'sirene': ['inseer', 'nereis', 'seiner', 'serine', 'sirene'], 'sirenic': ['irenics', 'resinic', 'sericin', 'sirenic'], 'sirenize': ['resinize', 'sirenize'], 'sirenlike': ['resinlike', 'sirenlike'], 'sirenoid': ['derision', 'ironside', 'resinoid', 'sirenoid'], 'sireny': ['resiny', 'sireny'], 'sirian': ['raisin', 'sirian'], 'sirih': ['irish', 'rishi', 'sirih'], 'sirky': ['risky', 'sirky'], 'sirmian': ['iranism', 'sirmian'], 'sirpea': ['aspire', 'paries', 'praise', 'sirpea', 'spirea'], 'sirple': ['lisper', 'pliers', 'sirple', 'spiler'], 'sirrah': ['arrish', 'harris', 'rarish', 'sirrah'], 'sirree': ['rerise', 'sirree'], 'siruelas': ['russelia', 'siruelas'], 'sirup': ['prius', 'sirup'], 'siruper': ['siruper', 'upriser'], 'siryan': ['siryan', 'syrian'], 'sis': ['sis', 'ssi'], 'sisal': ['silas', 'sisal'], 'sish': ['hiss', 'sish'], 'sisham': ['samish', 'sisham'], 'sisi': ['isis', 'sisi'], 'sisseton': ['sisseton', 'stenosis'], 'sistani': ['nasitis', 'sistani'], 'sister': ['resist', 'restis', 'sister'], 'sisterin': ['insister', 'reinsist', 'sinister', 'sisterin'], 'sistering': ['resisting', 'sistering'], 'sisterless': ['resistless', 'sisterless'], 'sistrum': ['sistrum', 'trismus'], 'sit': ['ist', 'its', 'sit'], 'sita': ['atis', 'sita', 'tsia'], 'sitao': ['sitao', 'staio'], 'sitar': ['arist', 'astir', 'sitar', 'stair', 'stria', 'tarsi', 'tisar', 'trias'], 'sitch': ['sitch', 'stchi', 'stich'], 'site': ['seit', 'site'], 'sith': ['hist', 'sith', 'this', 'tshi'], 'sithens': ['sithens', 'thissen'], 'sitient': ['sitient', 'sittine'], 'sitology': ['sitology', 'tsiology'], 'sittinae': ['satinite', 'sittinae'], 'sittine': ['sitient', 'sittine'], 'situal': ['situal', 'situla', 'tulasi'], 'situate': ['situate', 'usitate'], 'situla': ['situal', 'situla', 'tulasi'], 'situs': ['situs', 'suist'], 'siva': ['avis', 'siva', 'visa'], 'sivaism': ['saivism', 'sivaism'], 'sivan': ['savin', 'sivan'], 'siwan': ['siwan', 'swain'], 'siwash': ['sawish', 'siwash'], 'sixte': ['exist', 'sixte'], 'sixty': ['sixty', 'xysti'], 'sizeable': ['seizable', 'sizeable'], 'sizeman': ['sizeman', 'zamenis'], 'skair': ['kisra', 'sikar', 'skair'], 'skal': ['lask', 'skal'], 'skance': ['sacken', 'skance'], 'skanda': ['sandak', 'skanda'], 'skart': ['karst', 'skart', 'stark'], 'skat': ['skat', 'task'], 'skate': ['skate', 'stake', 'steak'], 'skater': ['skater', 'staker', 'strake', 'streak', 'tasker'], 'skating': ['gitksan', 'skating', 'takings'], 'skean': ['skean', 'snake', 'sneak'], 'skee': ['kees', 'seek', 'skee'], 'skeel': ['skeel', 'sleek'], 'skeeling': ['skeeling', 'sleeking'], 'skeely': ['skeely', 'sleeky'], 'skeen': ['skeen', 'skene'], 'skeer': ['esker', 'keres', 'reesk', 'seker', 'skeer', 'skere'], 'skeery': ['kersey', 'skeery'], 'skeet': ['keest', 'skeet', 'skete', 'steek'], 'skeeter': ['skeeter', 'teskere'], 'skeletin': ['nestlike', 'skeletin'], 'skelic': ['sickle', 'skelic'], 'skelp': ['skelp', 'spelk'], 'skelter': ['kestrel', 'skelter'], 'skene': ['skeen', 'skene'], 'skeo': ['skeo', 'soke'], 'skeptic': ['skeptic', 'spicket'], 'skere': ['esker', 'keres', 'reesk', 'seker', 'skeer', 'skere'], 'sketcher': ['resketch', 'sketcher'], 'skete': ['keest', 'skeet', 'skete', 'steek'], 'skey': ['skey', 'skye'], 'skid': ['disk', 'kids', 'skid'], 'skier': ['kreis', 'skier'], 'skil': ['lisk', 'silk', 'skil'], 'skin': ['inks', 'sink', 'skin'], 'skinch': ['chinks', 'skinch'], 'skinless': ['silkness', 'sinkless', 'skinless'], 'skinlike': ['sinklike', 'skinlike'], 'skip': ['pisk', 'skip'], 'skippel': ['skippel', 'skipple'], 'skipple': ['skippel', 'skipple'], 'skirmish': ['skirmish', 'smirkish'], 'skirreh': ['shirker', 'skirreh'], 'skirret': ['skirret', 'skirter', 'striker'], 'skirt': ['skirt', 'stirk'], 'skirter': ['skirret', 'skirter', 'striker'], 'skirting': ['skirting', 'striking'], 'skirtingly': ['skirtingly', 'strikingly'], 'skirty': ['kirsty', 'skirty'], 'skit': ['kist', 'skit'], 'skite': ['siket', 'skite'], 'skiter': ['skiter', 'strike'], 'skittle': ['kittles', 'skittle'], 'sklate': ['lasket', 'sklate'], 'sklater': ['sklater', 'stalker'], 'sklinter': ['sklinter', 'strinkle'], 'skoal': ['skoal', 'sloka'], 'skoo': ['koso', 'skoo', 'sook'], 'skua': ['kusa', 'skua'], 'skun': ['skun', 'sunk'], 'skye': ['skey', 'skye'], 'sla': ['las', 'sal', 'sla'], 'slab': ['blas', 'slab'], 'slacken': ['slacken', 'snackle'], 'slade': ['leads', 'slade'], 'slae': ['elsa', 'sale', 'seal', 'slae'], 'slain': ['sinal', 'slain', 'snail'], 'slainte': ['elastin', 'salient', 'saltine', 'slainte'], 'slait': ['alist', 'litas', 'slait', 'talis'], 'slake': ['alkes', 'sakel', 'slake'], 'slam': ['alms', 'salm', 'slam'], 'slamp': ['plasm', 'psalm', 'slamp'], 'slandering': ['sanderling', 'slandering'], 'slane': ['ansel', 'slane'], 'slang': ['glans', 'slang'], 'slangily': ['signally', 'singally', 'slangily'], 'slangish': ['slangish', 'slashing'], 'slangishly': ['slangishly', 'slashingly'], 'slangster': ['slangster', 'strangles'], 'slap': ['salp', 'slap'], 'slape': ['elaps', 'lapse', 'lepas', 'pales', 'salep', 'saple', 'sepal', 'slape', 'spale', 'speal'], 'slare': ['arles', 'arsle', 'laser', 'seral', 'slare'], 'slasher': ['reslash', 'slasher'], 'slashing': ['slangish', 'slashing'], 'slashingly': ['slangishly', 'slashingly'], 'slat': ['last', 'salt', 'slat'], 'slate': ['least', 'setal', 'slate', 'stale', 'steal', 'stela', 'tales'], 'slater': ['laster', 'lastre', 'rastle', 'relast', 'resalt', 'salter', 'slater', 'stelar'], 'slath': ['shalt', 'slath'], 'slather': ['hastler', 'slather'], 'slatiness': ['saintless', 'saltiness', 'slatiness', 'stainless'], 'slating': ['anglist', 'lasting', 'salting', 'slating', 'staling'], 'slatish': ['saltish', 'slatish'], 'slatter': ['rattles', 'slatter', 'starlet', 'startle'], 'slaty': ['lasty', 'salty', 'slaty'], 'slaughter': ['lethargus', 'slaughter'], 'slaughterman': ['manslaughter', 'slaughterman'], 'slaum': ['lamus', 'malus', 'musal', 'slaum'], 'slave': ['salve', 'selva', 'slave', 'valse'], 'slaver': ['salver', 'serval', 'slaver', 'versal'], 'slaverer': ['reserval', 'reversal', 'slaverer'], 'slavey': ['slavey', 'sylvae'], 'slavi': ['silva', 'slavi'], 'slavian': ['salivan', 'slavian'], 'slavic': ['clavis', 'slavic'], 'slavonic': ['slavonic', 'volscian'], 'slay': ['lyas', 'slay'], 'slayer': ['reslay', 'slayer'], 'sleave': ['leaves', 'sleave'], 'sledger': ['redlegs', 'sledger'], 'slee': ['else', 'lees', 'seel', 'sele', 'slee'], 'sleech': ['lesche', 'sleech'], 'sleek': ['skeel', 'sleek'], 'sleeking': ['skeeling', 'sleeking'], 'sleeky': ['skeely', 'sleeky'], 'sleep': ['sleep', 'speel'], 'sleepless': ['sleepless', 'speelless'], 'sleepry': ['presley', 'sleepry'], 'sleet': ['sleet', 'slete', 'steel', 'stele'], 'sleetiness': ['sleetiness', 'steeliness'], 'sleeting': ['sleeting', 'steeling'], 'sleetproof': ['sleetproof', 'steelproof'], 'sleety': ['sleety', 'steely'], 'slept': ['slept', 'spelt', 'splet'], 'slete': ['sleet', 'slete', 'steel', 'stele'], 'sleuth': ['hustle', 'sleuth'], 'slew': ['slew', 'wels'], 'slewing': ['slewing', 'swingle'], 'sley': ['lyse', 'sley'], 'slice': ['sicel', 'slice'], 'slicht': ['slicht', 'slitch'], 'slicken': ['slicken', 'snickle'], 'slicker': ['sickler', 'slicker'], 'slickery': ['sickerly', 'slickery'], 'slicking': ['sickling', 'slicking'], 'slidable': ['sabellid', 'slidable'], 'slidden': ['slidden', 'sniddle'], 'slide': ['sidle', 'slide'], 'slider': ['sidler', 'slider'], 'sliding': ['sidling', 'sliding'], 'slidingly': ['sidlingly', 'slidingly'], 'slifter': ['slifter', 'stifler'], 'slightily': ['sightlily', 'slightily'], 'slightiness': ['sightliness', 'slightiness'], 'slighty': ['sightly', 'slighty'], 'slime': ['limes', 'miles', 'slime', 'smile'], 'slimeman': ['melanism', 'slimeman'], 'slimer': ['slimer', 'smiler'], 'slimy': ['limsy', 'slimy', 'smily'], 'sline': ['elsin', 'lenis', 'niels', 'silen', 'sline'], 'slinge': ['single', 'slinge'], 'slinger': ['singler', 'slinger'], 'slink': ['links', 'slink'], 'slip': ['lisp', 'slip'], 'slipcoat': ['postical', 'slipcoat'], 'slipe': ['piles', 'plies', 'slipe', 'spiel', 'spile'], 'slipover': ['overslip', 'slipover'], 'slipway': ['slipway', 'waspily'], 'slit': ['list', 'silt', 'slit'], 'slitch': ['slicht', 'slitch'], 'slite': ['islet', 'istle', 'slite', 'stile'], 'slithy': ['hylist', 'slithy'], 'slitless': ['listless', 'slitless'], 'slitlike': ['siltlike', 'slitlike'], 'slitted': ['slitted', 'stilted'], 'slitter': ['litster', 'slitter', 'stilter', 'testril'], 'slitty': ['slitty', 'stilty'], 'slive': ['elvis', 'levis', 'slive'], 'sliver': ['silver', 'sliver'], 'sliverer': ['resilver', 'silverer', 'sliverer'], 'sliverlike': ['silverlike', 'sliverlike'], 'slivery': ['silvery', 'slivery'], 'sloan': ['salon', 'sloan', 'solan'], 'slod': ['slod', 'sold'], 'sloe': ['lose', 'sloe', 'sole'], 'sloka': ['skoal', 'sloka'], 'slone': ['slone', 'solen'], 'sloo': ['sloo', 'solo', 'sool'], 'sloom': ['mools', 'sloom'], 'sloop': ['polos', 'sloop', 'spool'], 'slope': ['elops', 'slope', 'spole'], 'sloper': ['sloper', 'splore'], 'slot': ['lost', 'lots', 'slot'], 'slote': ['slote', 'stole'], 'sloted': ['sloted', 'stoled'], 'slotter': ['settlor', 'slotter'], 'slouch': ['holcus', 'lochus', 'slouch'], 'slouchiness': ['cushionless', 'slouchiness'], 'slouchy': ['chylous', 'slouchy'], 'slovenian': ['slovenian', 'venosinal'], 'slow': ['slow', 'sowl'], 'slud': ['slud', 'suld'], 'slue': ['lues', 'slue'], 'sluit': ['litus', 'sluit', 'tulsi'], 'slunge': ['gunsel', 'selung', 'slunge'], 'slurp': ['slurp', 'spurl'], 'slut': ['lust', 'slut'], 'sluther': ['hulster', 'hustler', 'sluther'], 'slutter': ['slutter', 'trustle'], 'sly': ['lys', 'sly'], 'sma': ['mas', 'sam', 'sma'], 'smachrie': ['semiarch', 'smachrie'], 'smallen': ['ensmall', 'smallen'], 'smalltime': ['metallism', 'smalltime'], 'smaltine': ['mentalis', 'smaltine', 'stileman'], 'smaltite': ['metalist', 'smaltite'], 'smart': ['smart', 'stram'], 'smarten': ['sarment', 'smarten'], 'smashage': ['gamashes', 'smashage'], 'smeary': ['ramsey', 'smeary'], 'smectis': ['sectism', 'smectis'], 'smee': ['mese', 'seem', 'seme', 'smee'], 'smeech': ['scheme', 'smeech'], 'smeek': ['meeks', 'smeek'], 'smeer': ['merse', 'smeer'], 'smeeth': ['smeeth', 'smethe'], 'smeller': ['resmell', 'smeller'], 'smelly': ['mysell', 'smelly'], 'smelter': ['melters', 'resmelt', 'smelter'], 'smethe': ['smeeth', 'smethe'], 'smilax': ['laxism', 'smilax'], 'smile': ['limes', 'miles', 'slime', 'smile'], 'smiler': ['slimer', 'smiler'], 'smilet': ['mistle', 'smilet'], 'smiling': ['simling', 'smiling'], 'smily': ['limsy', 'slimy', 'smily'], 'sminthian': ['mitannish', 'sminthian'], 'smirch': ['chrism', 'smirch'], 'smirkish': ['skirmish', 'smirkish'], 'smit': ['mist', 'smit', 'stim'], 'smite': ['metis', 'smite', 'stime', 'times'], 'smiter': ['merist', 'mister', 'smiter'], 'smither': ['rhemist', 'smither'], 'smithian': ['isthmian', 'smithian'], 'smoker': ['mosker', 'smoker'], 'smoot': ['moost', 'smoot'], 'smoother': ['resmooth', 'romeshot', 'smoother'], 'smoothingly': ['hymnologist', 'smoothingly'], 'smore': ['meros', 'mores', 'morse', 'sermo', 'smore'], 'smote': ['moste', 'smote'], 'smother': ['smother', 'thermos'], 'smouse': ['mousse', 'smouse'], 'smouser': ['osmerus', 'smouser'], 'smuggle': ['muggles', 'smuggle'], 'smut': ['must', 'smut', 'stum'], 'smyrniot': ['smyrniot', 'tyronism'], 'smyrniote': ['myristone', 'smyrniote'], 'snab': ['nabs', 'snab'], 'snackle': ['slacken', 'snackle'], 'snag': ['sang', 'snag'], 'snagrel': ['sangrel', 'snagrel'], 'snail': ['sinal', 'slain', 'snail'], 'snaillike': ['silkaline', 'snaillike'], 'snaily': ['anisyl', 'snaily'], 'snaith': ['snaith', 'tahsin'], 'snake': ['skean', 'snake', 'sneak'], 'snap': ['snap', 'span'], 'snape': ['aspen', 'panse', 'snape', 'sneap', 'spane', 'spean'], 'snaper': ['resnap', 'respan', 'snaper'], 'snapless': ['snapless', 'spanless'], 'snapy': ['pansy', 'snapy'], 'snare': ['anser', 'nares', 'rasen', 'snare'], 'snarer': ['serran', 'snarer'], 'snaste': ['assent', 'snaste'], 'snatch': ['chanst', 'snatch', 'stanch'], 'snatchable': ['snatchable', 'stanchable'], 'snatcher': ['resnatch', 'snatcher', 'stancher'], 'snath': ['shant', 'snath'], 'snathe': ['athens', 'hasten', 'snathe', 'sneath'], 'snaw': ['sawn', 'snaw', 'swan'], 'snead': ['sedan', 'snead'], 'sneak': ['skean', 'snake', 'sneak'], 'sneaker': ['keresan', 'sneaker'], 'sneaksman': ['masskanne', 'sneaksman'], 'sneap': ['aspen', 'panse', 'snape', 'sneap', 'spane', 'spean'], 'sneath': ['athens', 'hasten', 'snathe', 'sneath'], 'sneathe': ['sneathe', 'thesean'], 'sned': ['send', 'sned'], 'snee': ['ense', 'esne', 'nese', 'seen', 'snee'], 'sneer': ['renes', 'sneer'], 'snew': ['news', 'sewn', 'snew'], 'snib': ['nibs', 'snib'], 'snickle': ['slicken', 'snickle'], 'sniddle': ['slidden', 'sniddle'], 'snide': ['denis', 'snide'], 'snig': ['sign', 'sing', 'snig'], 'snigger': ['serging', 'snigger'], 'snip': ['snip', 'spin'], 'snipe': ['penis', 'snipe', 'spine'], 'snipebill': ['snipebill', 'spinebill'], 'snipelike': ['snipelike', 'spinelike'], 'sniper': ['pernis', 'respin', 'sniper'], 'snipocracy': ['conspiracy', 'snipocracy'], 'snipper': ['nippers', 'snipper'], 'snippet': ['snippet', 'stippen'], 'snipy': ['snipy', 'spiny'], 'snitcher': ['christen', 'snitcher'], 'snite': ['inset', 'neist', 'snite', 'stein', 'stine', 'tsine'], 'snithy': ['shinty', 'snithy'], 'sniveler': ['ensilver', 'sniveler'], 'snively': ['snively', 'sylvine'], 'snob': ['bosn', 'nobs', 'snob'], 'snocker': ['conkers', 'snocker'], 'snod': ['snod', 'sond'], 'snoek': ['snoek', 'snoke', 'soken'], 'snog': ['snog', 'song'], 'snoke': ['snoek', 'snoke', 'soken'], 'snook': ['onkos', 'snook'], 'snoop': ['snoop', 'spoon'], 'snooper': ['snooper', 'spooner'], 'snoopy': ['snoopy', 'spoony'], 'snoot': ['snoot', 'stoon'], 'snore': ['norse', 'noser', 'seron', 'snore'], 'snorer': ['snorer', 'sorner'], 'snoring': ['snoring', 'sorning'], 'snork': ['norsk', 'snork'], 'snotter': ['snotter', 'stentor', 'torsten'], 'snout': ['notus', 'snout', 'stoun', 'tonus'], 'snouter': ['snouter', 'tonsure', 'unstore'], 'snow': ['snow', 'sown'], 'snowie': ['nowise', 'snowie'], 'snowish': ['snowish', 'whisson'], 'snowy': ['snowy', 'wyson'], 'snug': ['snug', 'sung'], 'snup': ['snup', 'spun'], 'snurp': ['snurp', 'spurn'], 'snurt': ['snurt', 'turns'], 'so': ['os', 'so'], 'soak': ['asok', 'soak', 'soka'], 'soaker': ['arkose', 'resoak', 'soaker'], 'soally': ['soally', 'sollya'], 'soam': ['amos', 'soam', 'soma'], 'soap': ['asop', 'sapo', 'soap'], 'soaper': ['resoap', 'soaper'], 'soar': ['asor', 'rosa', 'soar', 'sora'], 'sob': ['bos', 'sob'], 'sobeit': ['setibo', 'sobeit'], 'sober': ['boser', 'brose', 'sober'], 'sobralite': ['sobralite', 'strobilae'], 'soc': ['cos', 'osc', 'soc'], 'socager': ['corsage', 'socager'], 'social': ['colias', 'scolia', 'social'], 'socialite': ['aeolistic', 'socialite'], 'societal': ['cosalite', 'societal'], 'societism': ['seismotic', 'societism'], 'socinian': ['oscinian', 'socinian'], 'sociobiological': ['biosociological', 'sociobiological'], 'sociolegal': ['oligoclase', 'sociolegal'], 'socius': ['scious', 'socius'], 'socle': ['close', 'socle'], 'soco': ['coos', 'soco'], 'socotran': ['ostracon', 'socotran'], 'socotrine': ['certosino', 'cortisone', 'socotrine'], 'socratean': ['ostracean', 'socratean'], 'socratic': ['acrostic', 'sarcotic', 'socratic'], 'socratical': ['acrostical', 'socratical'], 'socratically': ['acrostically', 'socratically'], 'socraticism': ['acrosticism', 'socraticism'], 'socratism': ['ostracism', 'socratism'], 'socratize': ['ostracize', 'socratize'], 'sod': ['dos', 'ods', 'sod'], 'soda': ['dosa', 'sado', 'soda'], 'sodalite': ['diastole', 'isolated', 'sodalite', 'solidate'], 'sodium': ['modius', 'sodium'], 'sodom': ['dooms', 'sodom'], 'sodomitic': ['diosmotic', 'sodomitic'], 'soe': ['oes', 'ose', 'soe'], 'soft': ['soft', 'stof'], 'soften': ['oftens', 'soften'], 'softener': ['resoften', 'softener'], 'sog': ['gos', 'sog'], 'soga': ['sago', 'soga'], 'soger': ['gorse', 'soger'], 'soh': ['sho', 'soh'], 'soho': ['shoo', 'soho'], 'soil': ['lois', 'silo', 'siol', 'soil', 'soli'], 'soiled': ['isolde', 'soiled'], 'sojourner': ['resojourn', 'sojourner'], 'sok': ['kos', 'sok'], 'soka': ['asok', 'soak', 'soka'], 'soke': ['skeo', 'soke'], 'soken': ['snoek', 'snoke', 'soken'], 'sola': ['also', 'sola'], 'solacer': ['escolar', 'solacer'], 'solan': ['salon', 'sloan', 'solan'], 'solar': ['rosal', 'solar', 'soral'], 'solaristics': ['scissortail', 'solaristics'], 'solate': ['lotase', 'osteal', 'solate', 'stolae', 'talose'], 'sold': ['slod', 'sold'], 'solder': ['dorsel', 'seldor', 'solder'], 'solderer': ['resolder', 'solderer'], 'soldi': ['soldi', 'solid'], 'soldo': ['soldo', 'solod'], 'sole': ['lose', 'sloe', 'sole'], 'solea': ['alose', 'osela', 'solea'], 'solecist': ['solecist', 'solstice'], 'solen': ['slone', 'solen'], 'soleness': ['noseless', 'soleness'], 'solenial': ['lesional', 'solenial'], 'solenite': ['noselite', 'solenite'], 'solenium': ['emulsion', 'solenium'], 'solenopsis': ['poisonless', 'solenopsis'], 'solent': ['solent', 'stolen', 'telson'], 'solentine': ['nelsonite', 'solentine'], 'soler': ['loser', 'orsel', 'rosel', 'soler'], 'solera': ['roseal', 'solera'], 'soles': ['loess', 'soles'], 'soli': ['lois', 'silo', 'siol', 'soil', 'soli'], 'soliative': ['isolative', 'soliative'], 'solicit': ['colitis', 'solicit'], 'solicitation': ['coalitionist', 'solicitation'], 'soliciter': ['resolicit', 'soliciter'], 'soliciting': ['ignicolist', 'soliciting'], 'solicitude': ['isodulcite', 'solicitude'], 'solid': ['soldi', 'solid'], 'solidate': ['diastole', 'isolated', 'sodalite', 'solidate'], 'solidus': ['dissoul', 'dulosis', 'solidus'], 'solilunar': ['lunisolar', 'solilunar'], 'soliped': ['despoil', 'soliped', 'spoiled'], 'solitarian': ['sinoatrial', 'solitarian'], 'solitary': ['royalist', 'solitary'], 'soliterraneous': ['salinoterreous', 'soliterraneous'], 'solitude': ['outslide', 'solitude'], 'sollya': ['soally', 'sollya'], 'solmizate': ['solmizate', 'zealotism'], 'solo': ['sloo', 'solo', 'sool'], 'solod': ['soldo', 'solod'], 'solon': ['olson', 'solon'], 'solonic': ['scolion', 'solonic'], 'soloth': ['soloth', 'tholos'], 'solotink': ['solotink', 'solotnik'], 'solotnik': ['solotink', 'solotnik'], 'solstice': ['solecist', 'solstice'], 'solum': ['mosul', 'mouls', 'solum'], 'solute': ['lutose', 'solute', 'tousle'], 'solutioner': ['resolution', 'solutioner'], 'soma': ['amos', 'soam', 'soma'], 'somacule': ['maculose', 'somacule'], 'somal': ['salmo', 'somal'], 'somali': ['limosa', 'somali'], 'somasthenia': ['anhematosis', 'somasthenia'], 'somatic': ['atomics', 'catoism', 'cosmati', 'osmatic', 'somatic'], 'somatics': ['acosmist', 'massicot', 'somatics'], 'somatism': ['osmatism', 'somatism'], 'somatophyte': ['hepatostomy', 'somatophyte'], 'somatophytic': ['hypostomatic', 'somatophytic'], 'somatopleuric': ['micropetalous', 'somatopleuric'], 'somatopsychic': ['psychosomatic', 'somatopsychic'], 'somatosplanchnic': ['somatosplanchnic', 'splanchnosomatic'], 'somatous': ['astomous', 'somatous'], 'somber': ['somber', 'sombre'], 'sombre': ['somber', 'sombre'], 'some': ['meso', 'mose', 'some'], 'someday': ['samoyed', 'someday'], 'somers': ['messor', 'mosser', 'somers'], 'somnambule': ['somnambule', 'summonable'], 'somnial': ['malison', 'manolis', 'osmanli', 'somnial'], 'somnopathy': ['phytomonas', 'somnopathy'], 'somnorific': ['onisciform', 'somnorific'], 'son': ['ons', 'son'], 'sonant': ['santon', 'sonant', 'stanno'], 'sonantic': ['canonist', 'sanction', 'sonantic'], 'sonar': ['arson', 'saron', 'sonar'], 'sonatina': ['ansation', 'sonatina'], 'sond': ['snod', 'sond'], 'sondation': ['anisodont', 'sondation'], 'sondeli': ['indoles', 'sondeli'], 'soneri': ['rosine', 'senior', 'soneri'], 'song': ['snog', 'song'], 'songoi': ['isogon', 'songoi'], 'songy': ['gonys', 'songy'], 'sonic': ['oscin', 'scion', 'sonic'], 'sonja': ['janos', 'jason', 'jonas', 'sonja'], 'sonneratia': ['arsenation', 'senatorian', 'sonneratia'], 'sonnet': ['sonnet', 'stonen', 'tenson'], 'sonnetwise': ['sonnetwise', 'swinestone'], 'sonrai': ['arsino', 'rasion', 'sonrai'], 'sontag': ['sontag', 'tongas'], 'soodle': ['dolose', 'oodles', 'soodle'], 'sook': ['koso', 'skoo', 'sook'], 'sool': ['sloo', 'solo', 'sool'], 'soon': ['oons', 'soon'], 'sooner': ['nooser', 'seroon', 'sooner'], 'sooter': ['seroot', 'sooter', 'torose'], 'sooth': ['shoot', 'sooth', 'sotho', 'toosh'], 'soother': ['orthose', 'reshoot', 'shooter', 'soother'], 'soothing': ['shooting', 'soothing'], 'sootiness': ['enostosis', 'sootiness'], 'sooty': ['sooty', 'soyot'], 'sope': ['epos', 'peso', 'pose', 'sope'], 'soph': ['phos', 'posh', 'shop', 'soph'], 'sophister': ['posterish', 'prothesis', 'sophister', 'storeship', 'tephrosis'], 'sophistical': ['postischial', 'sophistical'], 'sophomore': ['osmophore', 'sophomore'], 'sopition': ['position', 'sopition'], 'sopor': ['poros', 'proso', 'sopor', 'spoor'], 'soprani': ['parison', 'soprani'], 'sopranist': ['postnaris', 'sopranist'], 'soprano': ['pronaos', 'soprano'], 'sora': ['asor', 'rosa', 'soar', 'sora'], 'sorabian': ['abrasion', 'sorabian'], 'soral': ['rosal', 'solar', 'soral'], 'sorbate': ['barotse', 'boaster', 'reboast', 'sorbate'], 'sorbin': ['insorb', 'sorbin'], 'sorcer': ['scorer', 'sorcer'], 'sorchin': ['cornish', 'cronish', 'sorchin'], 'sorda': ['sarod', 'sorda'], 'sordes': ['dosser', 'sordes'], 'sordine': ['indorse', 'ordines', 'siredon', 'sordine'], 'sordino': ['indoors', 'sordino'], 'sore': ['eros', 'rose', 'sero', 'sore'], 'soredia': ['ardoise', 'aroides', 'soredia'], 'sorediate': ['oestridae', 'ostreidae', 'sorediate'], 'soredium': ['dimerous', 'soredium'], 'soree': ['erose', 'soree'], 'sorefoot': ['footsore', 'sorefoot'], 'sorehead': ['rosehead', 'sorehead'], 'sorehon': ['onshore', 'sorehon'], 'sorema': ['amores', 'ramose', 'sorema'], 'soricid': ['cirsoid', 'soricid'], 'soricident': ['discretion', 'soricident'], 'soricine': ['recision', 'soricine'], 'sorite': ['restio', 'sorite', 'sortie', 'triose'], 'sorites': ['rossite', 'sorites'], 'sornare': ['serrano', 'sornare'], 'sorner': ['snorer', 'sorner'], 'sorning': ['snoring', 'sorning'], 'sororial': ['rosorial', 'sororial'], 'sorption': ['notropis', 'positron', 'sorption'], 'sortable': ['sortable', 'storable'], 'sorted': ['sorted', 'strode'], 'sorter': ['resort', 'roster', 'sorter', 'storer'], 'sortie': ['restio', 'sorite', 'sortie', 'triose'], 'sortilegus': ['sortilegus', 'strigulose'], 'sortiment': ['sortiment', 'trimstone'], 'sortly': ['sortly', 'styrol'], 'sorty': ['sorty', 'story', 'stroy'], 'sorva': ['savor', 'sorva'], 'sory': ['rosy', 'sory'], 'sosia': ['oasis', 'sosia'], 'sostenuto': ['ostentous', 'sostenuto'], 'soter': ['roset', 'rotse', 'soter', 'stero', 'store', 'torse'], 'soterial': ['soterial', 'striolae'], 'sotho': ['shoot', 'sooth', 'sotho', 'toosh'], 'sotie': ['sotie', 'toise'], 'sotnia': ['sotnia', 'tinosa'], 'sotol': ['sotol', 'stool'], 'sots': ['sots', 'toss'], 'sotter': ['sotter', 'testor'], 'soucar': ['acorus', 'soucar'], 'souchet': ['souchet', 'techous', 'tousche'], 'souly': ['lousy', 'souly'], 'soum': ['soum', 'sumo'], 'soumansite': ['soumansite', 'stamineous'], 'sound': ['nodus', 'ounds', 'sound'], 'sounder': ['resound', 'sounder', 'unrosed'], 'soup': ['opus', 'soup'], 'souper': ['poseur', 'pouser', 'souper', 'uprose'], 'sour': ['ours', 'sour'], 'source': ['cerous', 'course', 'crouse', 'source'], 'soured': ['douser', 'soured'], 'souredness': ['rousedness', 'souredness'], 'souren': ['souren', 'unsore', 'ursone'], 'sourer': ['rouser', 'sourer'], 'souring': ['nigrous', 'rousing', 'souring'], 'sourly': ['lusory', 'sourly'], 'soursop': ['psorous', 'soursop', 'sporous'], 'soury': ['soury', 'yours'], 'souser': ['serous', 'souser'], 'souter': ['ouster', 'souter', 'touser', 'trouse'], 'souterrain': ['souterrain', 'ternarious', 'trouserian'], 'south': ['shout', 'south'], 'souther': ['shouter', 'souther'], 'southerland': ['southerland', 'southlander'], 'southing': ['shouting', 'southing'], 'southlander': ['southerland', 'southlander'], 'soviet': ['soviet', 'sovite'], 'sovite': ['soviet', 'sovite'], 'sowdones': ['sowdones', 'woodness'], 'sowel': ['sowel', 'sowle'], 'sower': ['owser', 'resow', 'serow', 'sower', 'swore', 'worse'], 'sowl': ['slow', 'sowl'], 'sowle': ['sowel', 'sowle'], 'sown': ['snow', 'sown'], 'sowt': ['sowt', 'stow', 'swot', 'wots'], 'soyot': ['sooty', 'soyot'], 'spa': ['asp', 'sap', 'spa'], 'space': ['capes', 'scape', 'space'], 'spaceless': ['scapeless', 'spaceless'], 'spacer': ['casper', 'escarp', 'parsec', 'scrape', 'secpar', 'spacer'], 'spade': ['depas', 'sepad', 'spade'], 'spader': ['rasped', 'spader', 'spread'], 'spadiceous': ['dipsaceous', 'spadiceous'], 'spadone': ['espadon', 'spadone'], 'spadonic': ['spadonic', 'spondaic', 'spondiac'], 'spadrone': ['parsoned', 'spadrone'], 'spae': ['apse', 'pesa', 'spae'], 'spaer': ['asper', 'parse', 'prase', 'spaer', 'spare', 'spear'], 'spahi': ['aphis', 'apish', 'hispa', 'saiph', 'spahi'], 'spaid': ['sapid', 'spaid'], 'spaik': ['askip', 'spaik'], 'spairge': ['prisage', 'spairge'], 'spalacine': ['asclepian', 'spalacine'], 'spale': ['elaps', 'lapse', 'lepas', 'pales', 'salep', 'saple', 'sepal', 'slape', 'spale', 'speal'], 'spalt': ['spalt', 'splat'], 'span': ['snap', 'span'], 'spancel': ['enclasp', 'spancel'], 'spane': ['aspen', 'panse', 'snape', 'sneap', 'spane', 'spean'], 'spanemia': ['paeanism', 'spanemia'], 'spangler': ['spangler', 'sprangle'], 'spangolite': ['postgenial', 'spangolite'], 'spaniel': ['espinal', 'pinales', 'spaniel'], 'spaniol': ['sanpoil', 'spaniol'], 'spanless': ['snapless', 'spanless'], 'spar': ['rasp', 'spar'], 'sparable': ['parsable', 'prebasal', 'sparable'], 'spare': ['asper', 'parse', 'prase', 'spaer', 'spare', 'spear'], 'spareable': ['separable', 'spareable'], 'sparely': ['parsley', 'pyrales', 'sparely', 'splayer'], 'sparer': ['parser', 'rasper', 'sparer'], 'sparerib': ['ribspare', 'sparerib'], 'sparge': ['gasper', 'sparge'], 'sparger': ['grasper', 'regrasp', 'sparger'], 'sparidae': ['paradise', 'sparidae'], 'sparing': ['aspring', 'rasping', 'sparing'], 'sparingly': ['raspingly', 'sparingly'], 'sparingness': ['raspingness', 'sparingness'], 'sparling': ['laspring', 'sparling', 'springal'], 'sparoid': ['prasoid', 'sparoid'], 'sparse': ['passer', 'repass', 'sparse'], 'spart': ['spart', 'sprat', 'strap', 'traps'], 'spartanic': ['sacripant', 'spartanic'], 'sparteine': ['pistareen', 'sparteine'], 'sparterie': ['periaster', 'sparterie'], 'spartina': ['aspirant', 'partisan', 'spartina'], 'spartle': ['palster', 'persalt', 'plaster', 'psalter', 'spartle', 'stapler'], 'spary': ['raspy', 'spary', 'spray'], 'spat': ['past', 'spat', 'stap', 'taps'], 'spate': ['paste', 'septa', 'spate'], 'spathal': ['asphalt', 'spathal', 'taplash'], 'spathe': ['spathe', 'thapes'], 'spathic': ['haptics', 'spathic'], 'spatling': ['spatling', 'stapling'], 'spatter': ['spatter', 'tapster'], 'spattering': ['spattering', 'tapestring'], 'spattle': ['peltast', 'spattle'], 'spatular': ['pastural', 'spatular'], 'spatule': ['pulsate', 'spatule', 'upsteal'], 'spave': ['spave', 'vespa'], 'speak': ['sapek', 'speak'], 'speaker': ['respeak', 'speaker'], 'speal': ['elaps', 'lapse', 'lepas', 'pales', 'salep', 'saple', 'sepal', 'slape', 'spale', 'speal'], 'spean': ['aspen', 'panse', 'snape', 'sneap', 'spane', 'spean'], 'spear': ['asper', 'parse', 'prase', 'spaer', 'spare', 'spear'], 'spearman': ['parmesan', 'spearman'], 'spearmint': ['spearmint', 'spermatin'], 'speary': ['presay', 'speary'], 'spec': ['ceps', 'spec'], 'spectatorial': ['poetastrical', 'spectatorial'], 'specter': ['respect', 'scepter', 'specter'], 'spectered': ['sceptered', 'spectered'], 'spectra': ['precast', 'spectra'], 'spectral': ['sceptral', 'scraplet', 'spectral'], 'spectromicroscope': ['microspectroscope', 'spectromicroscope'], 'spectrotelescope': ['spectrotelescope', 'telespectroscope'], 'spectrous': ['spectrous', 'susceptor', 'suspector'], 'spectry': ['precyst', 'sceptry', 'spectry'], 'specula': ['capsule', 'specula', 'upscale'], 'specular': ['capsuler', 'specular'], 'speed': ['pedes', 'speed'], 'speel': ['sleep', 'speel'], 'speelless': ['sleepless', 'speelless'], 'speer': ['peres', 'perse', 'speer', 'spree'], 'speerity': ['perseity', 'speerity'], 'speiss': ['sepsis', 'speiss'], 'spelaean': ['seaplane', 'spelaean'], 'spelk': ['skelp', 'spelk'], 'speller': ['presell', 'respell', 'speller'], 'spelt': ['slept', 'spelt', 'splet'], 'spenerism': ['primeness', 'spenerism'], 'speos': ['posse', 'speos'], 'sperate': ['perates', 'repaste', 'sperate'], 'sperity': ['pyrites', 'sperity'], 'sperling': ['sperling', 'springle'], 'spermalist': ['psalmister', 'spermalist'], 'spermathecal': ['chapelmaster', 'spermathecal'], 'spermatid': ['predatism', 'spermatid'], 'spermatin': ['spearmint', 'spermatin'], 'spermatogonium': ['protomagnesium', 'spermatogonium'], 'spermatozoic': ['spermatozoic', 'zoospermatic'], 'spermiogenesis': ['geissospermine', 'spermiogenesis'], 'spermocarp': ['carposperm', 'spermocarp'], 'spet': ['pest', 'sept', 'spet', 'step'], 'spew': ['spew', 'swep'], 'sphacelation': ['lipsanotheca', 'sphacelation'], 'sphecidae': ['cheapside', 'sphecidae'], 'sphene': ['sephen', 'sphene'], 'sphenoethmoid': ['ethmosphenoid', 'sphenoethmoid'], 'sphenoethmoidal': ['ethmosphenoidal', 'sphenoethmoidal'], 'sphenotic': ['phonetics', 'sphenotic'], 'spheral': ['plasher', 'spheral'], 'spheration': ['opisthenar', 'spheration'], 'sphere': ['herpes', 'hesper', 'sphere'], 'sphery': ['sphery', 'sypher'], 'sphyraenid': ['dysphrenia', 'sphyraenid', 'sphyrnidae'], 'sphyrnidae': ['dysphrenia', 'sphyraenid', 'sphyrnidae'], 'spica': ['aspic', 'spica'], 'spicate': ['aseptic', 'spicate'], 'spice': ['sepic', 'spice'], 'spicer': ['crepis', 'cripes', 'persic', 'precis', 'spicer'], 'spiciferous': ['pisciferous', 'spiciferous'], 'spiciform': ['pisciform', 'spiciform'], 'spicket': ['skeptic', 'spicket'], 'spicular': ['scripula', 'spicular'], 'spiculate': ['euplastic', 'spiculate'], 'spiculated': ['disculpate', 'spiculated'], 'spicule': ['clipeus', 'spicule'], 'spider': ['spider', 'spired', 'spried'], 'spiderish': ['sidership', 'spiderish'], 'spiderlike': ['predislike', 'spiderlike'], 'spiel': ['piles', 'plies', 'slipe', 'spiel', 'spile'], 'spier': ['siper', 'spier', 'spire'], 'spikelet': ['spikelet', 'steplike'], 'spiking': ['pigskin', 'spiking'], 'spiky': ['pisky', 'spiky'], 'spile': ['piles', 'plies', 'slipe', 'spiel', 'spile'], 'spiler': ['lisper', 'pliers', 'sirple', 'spiler'], 'spiling': ['sipling', 'spiling'], 'spiloma': ['imposal', 'spiloma'], 'spilt': ['spilt', 'split'], 'spin': ['snip', 'spin'], 'spina': ['pisan', 'sapin', 'spina'], 'spinae': ['sepian', 'spinae'], 'spinales': ['painless', 'spinales'], 'spinate': ['panties', 'sapient', 'spinate'], 'spindled': ['spindled', 'splendid'], 'spindler': ['spindler', 'splinder'], 'spine': ['penis', 'snipe', 'spine'], 'spinebill': ['snipebill', 'spinebill'], 'spinel': ['spinel', 'spline'], 'spinelike': ['snipelike', 'spinelike'], 'spinet': ['instep', 'spinet'], 'spinigerous': ['serpiginous', 'spinigerous'], 'spinigrade': ['despairing', 'spinigrade'], 'spinoid': ['spinoid', 'spionid'], 'spinoneural': ['spinoneural', 'unipersonal'], 'spinotectal': ['entoplastic', 'spinotectal', 'tectospinal', 'tenoplastic'], 'spiny': ['snipy', 'spiny'], 'spionid': ['spinoid', 'spionid'], 'spiracle': ['calipers', 'spiracle'], 'spiracula': ['auriscalp', 'spiracula'], 'spiral': ['prisal', 'spiral'], 'spiralism': ['misprisal', 'spiralism'], 'spiraloid': ['spiraloid', 'sporidial'], 'spiran': ['spiran', 'sprain'], 'spirant': ['spirant', 'spraint'], 'spirate': ['piaster', 'piastre', 'raspite', 'spirate', 'traipse'], 'spire': ['siper', 'spier', 'spire'], 'spirea': ['aspire', 'paries', 'praise', 'sirpea', 'spirea'], 'spired': ['spider', 'spired', 'spried'], 'spirelet': ['epistler', 'spirelet'], 'spireme': ['emprise', 'imprese', 'premise', 'spireme'], 'spiritally': ['pistillary', 'spiritally'], 'spiriter': ['respirit', 'spiriter'], 'spirometer': ['prisometer', 'spirometer'], 'spironema': ['mesropian', 'promnesia', 'spironema'], 'spirt': ['spirt', 'sprit', 'stirp', 'strip'], 'spirula': ['parulis', 'spirula', 'uprisal'], 'spit': ['pist', 'spit'], 'spital': ['alpist', 'pastil', 'spital'], 'spite': ['septi', 'spite', 'stipe'], 'spithame': ['aphetism', 'mateship', 'shipmate', 'spithame'], 'spitter': ['spitter', 'tipster'], 'splairge': ['aspergil', 'splairge'], 'splanchnosomatic': ['somatosplanchnic', 'splanchnosomatic'], 'splasher': ['harpless', 'splasher'], 'splat': ['spalt', 'splat'], 'splay': ['palsy', 'splay'], 'splayed': ['pylades', 'splayed'], 'splayer': ['parsley', 'pyrales', 'sparely', 'splayer'], 'spleet': ['pestle', 'spleet'], 'splender': ['resplend', 'splender'], 'splendid': ['spindled', 'splendid'], 'splenium': ['splenium', 'unsimple'], 'splenolaparotomy': ['laparosplenotomy', 'splenolaparotomy'], 'splenoma': ['neoplasm', 'pleonasm', 'polesman', 'splenoma'], 'splenomegalia': ['megalosplenia', 'splenomegalia'], 'splenonephric': ['phrenosplenic', 'splenonephric', 'splenophrenic'], 'splenophrenic': ['phrenosplenic', 'splenonephric', 'splenophrenic'], 'splet': ['slept', 'spelt', 'splet'], 'splice': ['clipse', 'splice'], 'spliceable': ['eclipsable', 'spliceable'], 'splinder': ['spindler', 'splinder'], 'spline': ['spinel', 'spline'], 'split': ['spilt', 'split'], 'splitter': ['splitter', 'striplet'], 'splore': ['sloper', 'splore'], 'spogel': ['gospel', 'spogel'], 'spoil': ['polis', 'spoil'], 'spoilage': ['pelasgoi', 'spoilage'], 'spoilation': ['positional', 'spoilation', 'spoliation'], 'spoiled': ['despoil', 'soliped', 'spoiled'], 'spoiler': ['leporis', 'spoiler'], 'spoilment': ['simpleton', 'spoilment'], 'spoilt': ['pistol', 'postil', 'spoilt'], 'spole': ['elops', 'slope', 'spole'], 'spoliation': ['positional', 'spoilation', 'spoliation'], 'spondaic': ['spadonic', 'spondaic', 'spondiac'], 'spondiac': ['spadonic', 'spondaic', 'spondiac'], 'spongily': ['posingly', 'spongily'], 'sponsal': ['plasson', 'sponsal'], 'sponsalia': ['passional', 'sponsalia'], 'spool': ['polos', 'sloop', 'spool'], 'spoon': ['snoop', 'spoon'], 'spooner': ['snooper', 'spooner'], 'spoony': ['snoopy', 'spoony'], 'spoonyism': ['spoonyism', 'symposion'], 'spoor': ['poros', 'proso', 'sopor', 'spoor'], 'spoot': ['spoot', 'stoop'], 'sporangia': ['agapornis', 'sporangia'], 'spore': ['poser', 'prose', 'ropes', 'spore'], 'sporidial': ['spiraloid', 'sporidial'], 'sporification': ['antisoporific', 'prosification', 'sporification'], 'sporogeny': ['gynospore', 'sporogeny'], 'sporoid': ['psoroid', 'sporoid'], 'sporotrichum': ['sporotrichum', 'trichosporum'], 'sporous': ['psorous', 'soursop', 'sporous'], 'sporozoic': ['sporozoic', 'zoosporic'], 'sport': ['sport', 'strop'], 'sporter': ['sporter', 'strepor'], 'sportula': ['postural', 'pulsator', 'sportula'], 'sportulae': ['opulaster', 'sportulae', 'sporulate'], 'sporulate': ['opulaster', 'sportulae', 'sporulate'], 'sporule': ['leprous', 'pelorus', 'sporule'], 'sposhy': ['hyssop', 'phossy', 'sposhy'], 'spot': ['post', 'spot', 'stop', 'tops'], 'spotless': ['postless', 'spotless', 'stopless'], 'spotlessness': ['spotlessness', 'stoplessness'], 'spotlike': ['postlike', 'spotlike'], 'spottedly': ['spottedly', 'spotteldy'], 'spotteldy': ['spottedly', 'spotteldy'], 'spotter': ['protest', 'spotter'], 'spouse': ['esopus', 'spouse'], 'spout': ['spout', 'stoup'], 'spouter': ['petrous', 'posture', 'proetus', 'proteus', 'septuor', 'spouter'], 'sprag': ['grasp', 'sprag'], 'sprain': ['spiran', 'sprain'], 'spraint': ['spirant', 'spraint'], 'sprangle': ['spangler', 'sprangle'], 'sprat': ['spart', 'sprat', 'strap', 'traps'], 'spray': ['raspy', 'spary', 'spray'], 'sprayer': ['respray', 'sprayer'], 'spread': ['rasped', 'spader', 'spread'], 'spreadboard': ['broadspread', 'spreadboard'], 'spreader': ['respread', 'spreader'], 'spreadover': ['overspread', 'spreadover'], 'spree': ['peres', 'perse', 'speer', 'spree'], 'spret': ['prest', 'spret'], 'spried': ['spider', 'spired', 'spried'], 'sprier': ['risper', 'sprier'], 'spriest': ['persist', 'spriest'], 'springal': ['laspring', 'sparling', 'springal'], 'springe': ['presign', 'springe'], 'springer': ['respring', 'springer'], 'springhead': ['headspring', 'springhead'], 'springhouse': ['springhouse', 'surgeonship'], 'springle': ['sperling', 'springle'], 'sprit': ['spirt', 'sprit', 'stirp', 'strip'], 'sprite': ['priest', 'pteris', 'sprite', 'stripe'], 'spritehood': ['priesthood', 'spritehood'], 'sproat': ['asport', 'pastor', 'sproat'], 'sprocket': ['prestock', 'sprocket'], 'sprout': ['sprout', 'stroup', 'stupor'], 'sprouter': ['posturer', 'resprout', 'sprouter'], 'sprouting': ['outspring', 'sprouting'], 'sprue': ['purse', 'resup', 'sprue', 'super'], 'spruer': ['purser', 'spruer'], 'spruit': ['purist', 'spruit', 'uprist', 'upstir'], 'spun': ['snup', 'spun'], 'spunkie': ['spunkie', 'unspike'], 'spuriae': ['spuriae', 'uparise', 'upraise'], 'spurl': ['slurp', 'spurl'], 'spurlet': ['purslet', 'spurlet', 'spurtle'], 'spurn': ['snurp', 'spurn'], 'spurt': ['spurt', 'turps'], 'spurtive': ['spurtive', 'upstrive'], 'spurtle': ['purslet', 'spurlet', 'spurtle'], 'sputa': ['sputa', 'staup', 'stupa'], 'sputumary': ['sputumary', 'sumptuary'], 'sputumous': ['sputumous', 'sumptuous'], 'spyer': ['pryse', 'spyer'], 'spyros': ['prossy', 'spyros'], 'squail': ['squail', 'squali'], 'squali': ['squail', 'squali'], 'squamatine': ['antimasque', 'squamatine'], 'squame': ['masque', 'squame', 'squeam'], 'squameous': ['squameous', 'squeamous'], 'squamopetrosal': ['petrosquamosal', 'squamopetrosal'], 'squamosoparietal': ['parietosquamosal', 'squamosoparietal'], 'squareman': ['marquesan', 'squareman'], 'squeaker': ['resqueak', 'squeaker'], 'squeal': ['lasque', 'squeal'], 'squeam': ['masque', 'squame', 'squeam'], 'squeamous': ['squameous', 'squeamous'], 'squillian': ['nisqualli', 'squillian'], 'squire': ['risque', 'squire'], 'squiret': ['querist', 'squiret'], 'squit': ['quits', 'squit'], 'sramana': ['ramanas', 'sramana'], 'sri': ['sir', 'sri'], 'srivatsan': ['ravissant', 'srivatsan'], 'ssi': ['sis', 'ssi'], 'ssu': ['ssu', 'sus'], 'staab': ['basta', 'staab'], 'stab': ['bast', 'bats', 'stab'], 'stabile': ['astilbe', 'bestial', 'blastie', 'stabile'], 'stable': ['ablest', 'stable', 'tables'], 'stableful': ['bullfeast', 'stableful'], 'stabler': ['blaster', 'reblast', 'stabler'], 'stabling': ['blasting', 'stabling'], 'stably': ['blasty', 'stably'], 'staccato': ['staccato', 'stoccata'], 'stacey': ['cytase', 'stacey'], 'stacher': ['stacher', 'thraces'], 'stacker': ['restack', 'stacker'], 'stackman': ['stackman', 'tacksman'], 'stacy': ['stacy', 'styca'], 'stade': ['sedat', 'stade', 'stead'], 'stadic': ['dicast', 'stadic'], 'stadium': ['dumaist', 'stadium'], 'staffer': ['restaff', 'staffer'], 'stag': ['gast', 'stag'], 'stager': ['gaster', 'stager'], 'stagily': ['stagily', 'stygial'], 'stagnation': ['antagonist', 'stagnation'], 'stagnum': ['mustang', 'stagnum'], 'stain': ['saint', 'satin', 'stain'], 'stainable': ['balanites', 'basaltine', 'stainable'], 'stainer': ['asterin', 'eranist', 'restain', 'stainer', 'starnie', 'stearin'], 'stainful': ['inflatus', 'stainful'], 'stainless': ['saintless', 'saltiness', 'slatiness', 'stainless'], 'staio': ['sitao', 'staio'], 'stair': ['arist', 'astir', 'sitar', 'stair', 'stria', 'tarsi', 'tisar', 'trias'], 'staircase': ['caesarist', 'staircase'], 'staired': ['astride', 'diaster', 'disrate', 'restiad', 'staired'], 'staithman': ['staithman', 'thanatism'], 'staiver': ['staiver', 'taivers'], 'stake': ['skate', 'stake', 'steak'], 'staker': ['skater', 'staker', 'strake', 'streak', 'tasker'], 'stalagmitic': ['stalagmitic', 'stigmatical'], 'stale': ['least', 'setal', 'slate', 'stale', 'steal', 'stela', 'tales'], 'staling': ['anglist', 'lasting', 'salting', 'slating', 'staling'], 'stalker': ['sklater', 'stalker'], 'staller': ['staller', 'stellar'], 'stam': ['mast', 'mats', 'stam'], 'stamen': ['mantes', 'stamen'], 'stamin': ['manist', 'mantis', 'matins', 'stamin'], 'stamina': ['amanist', 'stamina'], 'staminal': ['staminal', 'tailsman', 'talisman'], 'staminate': ['emanatist', 'staminate', 'tasmanite'], 'stamineous': ['soumansite', 'stamineous'], 'staminode': ['ademonist', 'demoniast', 'staminode'], 'stammer': ['stammer', 'stremma'], 'stampede': ['stampede', 'stepdame'], 'stamper': ['restamp', 'stamper'], 'stampian': ['mainpast', 'mantispa', 'panamist', 'stampian'], 'stan': ['nast', 'sant', 'stan'], 'stance': ['ascent', 'secant', 'stance'], 'stanch': ['chanst', 'snatch', 'stanch'], 'stanchable': ['snatchable', 'stanchable'], 'stancher': ['resnatch', 'snatcher', 'stancher'], 'stand': ['dasnt', 'stand'], 'standage': ['dagestan', 'standage'], 'standee': ['edestan', 'standee'], 'stander': ['stander', 'sternad'], 'standout': ['outstand', 'standout'], 'standstill': ['standstill', 'stillstand'], 'stane': ['antes', 'nates', 'stane', 'stean'], 'stang': ['angst', 'stang', 'tangs'], 'stangeria': ['agrestian', 'gerastian', 'stangeria'], 'stanine': ['ensaint', 'stanine'], 'stanly': ['nylast', 'stanly'], 'stanno': ['santon', 'sonant', 'stanno'], 'stap': ['past', 'spat', 'stap', 'taps'], 'staple': ['pastel', 'septal', 'staple'], 'stapler': ['palster', 'persalt', 'plaster', 'psalter', 'spartle', 'stapler'], 'stapling': ['spatling', 'stapling'], 'star': ['sart', 'star', 'stra', 'tars', 'tsar'], 'starch': ['scarth', 'scrath', 'starch'], 'stardom': ['stardom', 'tsardom'], 'stare': ['aster', 'serta', 'stare', 'strae', 'tarse', 'teras'], 'staree': ['asteer', 'easter', 'eastre', 'reseat', 'saeter', 'seater', 'staree', 'teaser', 'teresa'], 'starer': ['arrest', 'astrer', 'raster', 'starer'], 'starful': ['flustra', 'starful'], 'staring': ['gastrin', 'staring'], 'staringly': ['staringly', 'strayling'], 'stark': ['karst', 'skart', 'stark'], 'starky': ['starky', 'straky'], 'starlet': ['rattles', 'slatter', 'starlet', 'startle'], 'starlit': ['starlit', 'trisalt'], 'starlite': ['starlite', 'taistrel'], 'starnel': ['saltern', 'starnel', 'sternal'], 'starnie': ['asterin', 'eranist', 'restain', 'stainer', 'starnie', 'stearin'], 'starnose': ['assentor', 'essorant', 'starnose'], 'starship': ['starship', 'tsarship'], 'starshot': ['shotstar', 'starshot'], 'starter': ['restart', 'starter'], 'startle': ['rattles', 'slatter', 'starlet', 'startle'], 'starve': ['starve', 'staver', 'strave', 'tavers', 'versta'], 'starwise': ['starwise', 'waitress'], 'stary': ['satyr', 'stary', 'stray', 'trasy'], 'stases': ['assets', 'stases'], 'stasis': ['assist', 'stasis'], 'statable': ['statable', 'tastable'], 'state': ['state', 'taste', 'tates', 'testa'], 'stated': ['stated', 'tasted'], 'stateful': ['stateful', 'tasteful'], 'statefully': ['statefully', 'tastefully'], 'statefulness': ['statefulness', 'tastefulness'], 'stateless': ['stateless', 'tasteless'], 'statelich': ['athletics', 'statelich'], 'stately': ['stately', 'stylate'], 'statement': ['statement', 'testament'], 'stater': ['stater', 'taster', 'testar'], 'statesider': ['dissertate', 'statesider'], 'static': ['static', 'sticta'], 'statice': ['etacist', 'statice'], 'stational': ['saltation', 'stational'], 'stationarily': ['antiroyalist', 'stationarily'], 'stationer': ['nitrosate', 'stationer'], 'statoscope': ['septocosta', 'statoscope'], 'statue': ['astute', 'statue'], 'stature': ['stature', 'stauter'], 'staumer': ['staumer', 'strumae'], 'staun': ['staun', 'suant'], 'staunch': ['canthus', 'staunch'], 'staup': ['sputa', 'staup', 'stupa'], 'staurion': ['staurion', 'sutorian'], 'stauter': ['stature', 'stauter'], 'stave': ['stave', 'vesta'], 'staver': ['starve', 'staver', 'strave', 'tavers', 'versta'], 'staw': ['sawt', 'staw', 'swat', 'taws', 'twas', 'wast'], 'stawn': ['stawn', 'wasnt'], 'stayable': ['stayable', 'teasably'], 'stayed': ['stayed', 'steady'], 'stayer': ['atresy', 'estray', 'reasty', 'stayer'], 'staynil': ['nastily', 'saintly', 'staynil'], 'stchi': ['sitch', 'stchi', 'stich'], 'stead': ['sedat', 'stade', 'stead'], 'steady': ['stayed', 'steady'], 'steak': ['skate', 'stake', 'steak'], 'steal': ['least', 'setal', 'slate', 'stale', 'steal', 'stela', 'tales'], 'stealer': ['realest', 'reslate', 'resteal', 'stealer', 'teasler'], 'stealing': ['galenist', 'genitals', 'stealing'], 'stealy': ['alytes', 'astely', 'lysate', 'stealy'], 'steam': ['steam', 'stema'], 'steaming': ['misagent', 'steaming'], 'stean': ['antes', 'nates', 'stane', 'stean'], 'stearic': ['atresic', 'stearic'], 'stearin': ['asterin', 'eranist', 'restain', 'stainer', 'starnie', 'stearin'], 'stearone': ['orestean', 'resonate', 'stearone'], 'stearyl': ['saltery', 'stearyl'], 'steatin': ['atenist', 'instate', 'satient', 'steatin'], 'steatoma': ['atmostea', 'steatoma'], 'steatornis': ['steatornis', 'treasonist'], 'stech': ['chest', 'stech'], 'steek': ['keest', 'skeet', 'skete', 'steek'], 'steel': ['sleet', 'slete', 'steel', 'stele'], 'steeler': ['reestle', 'resteel', 'steeler'], 'steeliness': ['sleetiness', 'steeliness'], 'steeling': ['sleeting', 'steeling'], 'steelproof': ['sleetproof', 'steelproof'], 'steely': ['sleety', 'steely'], 'steen': ['steen', 'teens', 'tense'], 'steep': ['peste', 'steep'], 'steeper': ['estrepe', 'resteep', 'steeper'], 'steepy': ['steepy', 'typees'], 'steer': ['ester', 'estre', 'reest', 'reset', 'steer', 'stere', 'stree', 'terse', 'tsere'], 'steerer': ['reester', 'steerer'], 'steering': ['energist', 'steering'], 'steerling': ['esterling', 'steerling'], 'steeve': ['steeve', 'vestee'], 'stefan': ['fasten', 'nefast', 'stefan'], 'steg': ['gest', 'steg'], 'stegodon': ['dogstone', 'stegodon'], 'steid': ['deist', 'steid'], 'steigh': ['gesith', 'steigh'], 'stein': ['inset', 'neist', 'snite', 'stein', 'stine', 'tsine'], 'stela': ['least', 'setal', 'slate', 'stale', 'steal', 'stela', 'tales'], 'stelae': ['ateles', 'saltee', 'sealet', 'stelae', 'teasel'], 'stelai': ['isleta', 'litsea', 'salite', 'stelai'], 'stelar': ['laster', 'lastre', 'rastle', 'relast', 'resalt', 'salter', 'slater', 'stelar'], 'stele': ['sleet', 'slete', 'steel', 'stele'], 'stella': ['sallet', 'stella', 'talles'], 'stellar': ['staller', 'stellar'], 'stellaria': ['lateralis', 'stellaria'], 'stema': ['steam', 'stema'], 'stemlike': ['meletski', 'stemlike'], 'sten': ['nest', 'sent', 'sten'], 'stenar': ['astern', 'enstar', 'stenar', 'sterna'], 'stencil': ['lentisc', 'scintle', 'stencil'], 'stenciler': ['crestline', 'stenciler'], 'stenion': ['stenion', 'tension'], 'steno': ['onset', 'seton', 'steno', 'stone'], 'stenopaic': ['aspection', 'stenopaic'], 'stenosis': ['sisseton', 'stenosis'], 'stenotic': ['stenotic', 'tonetics'], 'stentor': ['snotter', 'stentor', 'torsten'], 'step': ['pest', 'sept', 'spet', 'step'], 'stepaunt': ['nettapus', 'stepaunt'], 'stepbairn': ['breastpin', 'stepbairn'], 'stepdame': ['stampede', 'stepdame'], 'stephana': ['pheasant', 'stephana'], 'stephanic': ['cathepsin', 'stephanic'], 'steplike': ['spikelet', 'steplike'], 'sterculia': ['sterculia', 'urticales'], 'stere': ['ester', 'estre', 'reest', 'reset', 'steer', 'stere', 'stree', 'terse', 'tsere'], 'stereograph': ['preshortage', 'stereograph'], 'stereometric': ['crestmoreite', 'stereometric'], 'stereophotograph': ['photostereograph', 'stereophotograph'], 'stereotelescope': ['stereotelescope', 'telestereoscope'], 'stereotomic': ['osteometric', 'stereotomic'], 'stereotomical': ['osteometrical', 'stereotomical'], 'stereotomy': ['osteometry', 'stereotomy'], 'steric': ['certis', 'steric'], 'sterigma': ['gemarist', 'magister', 'sterigma'], 'sterigmata': ['magistrate', 'sterigmata'], 'sterile': ['leister', 'sterile'], 'sterilize': ['listerize', 'sterilize'], 'sterin': ['estrin', 'insert', 'sinter', 'sterin', 'triens'], 'sterlet': ['settler', 'sterlet', 'trestle'], 'stern': ['ernst', 'stern'], 'sterna': ['astern', 'enstar', 'stenar', 'sterna'], 'sternad': ['stander', 'sternad'], 'sternage': ['estrange', 'segreant', 'sergeant', 'sternage'], 'sternal': ['saltern', 'starnel', 'sternal'], 'sternalis': ['sternalis', 'trainless'], 'sternite': ['insetter', 'interest', 'interset', 'sternite'], 'sterno': ['nestor', 'sterno', 'stoner', 'strone', 'tensor'], 'sternocostal': ['costosternal', 'sternocostal'], 'sternovertebral': ['sternovertebral', 'vertebrosternal'], 'stero': ['roset', 'rotse', 'soter', 'stero', 'store', 'torse'], 'steroid': ['oestrid', 'steroid', 'storied'], 'sterol': ['relost', 'reslot', 'rostel', 'sterol', 'torsel'], 'stert': ['stert', 'stret', 'trest'], 'sterve': ['revest', 'servet', 'sterve', 'verset', 'vester'], 'stet': ['sett', 'stet', 'test'], 'stevan': ['stevan', 'svante'], 'stevel': ['stevel', 'svelte'], 'stevia': ['itaves', 'stevia'], 'stew': ['stew', 'west'], 'stewart': ['stewart', 'swatter'], 'stewed': ['stewed', 'wedset'], 'stewy': ['stewy', 'westy'], 'stey': ['stey', 'yest'], 'sthenia': ['sethian', 'sthenia'], 'stich': ['sitch', 'stchi', 'stich'], 'stichid': ['distich', 'stichid'], 'sticker': ['rickets', 'sticker'], 'stickler': ['stickler', 'strickle'], 'sticta': ['static', 'sticta'], 'stife': ['feist', 'stife'], 'stiffener': ['restiffen', 'stiffener'], 'stifle': ['itself', 'stifle'], 'stifler': ['slifter', 'stifler'], 'stigmai': ['imagist', 'stigmai'], 'stigmatical': ['stalagmitic', 'stigmatical'], 'stilbene': ['nebelist', 'stilbene', 'tensible'], 'stile': ['islet', 'istle', 'slite', 'stile'], 'stileman': ['mentalis', 'smaltine', 'stileman'], 'stillage': ['legalist', 'stillage'], 'stiller': ['stiller', 'trellis'], 'stillstand': ['standstill', 'stillstand'], 'stilted': ['slitted', 'stilted'], 'stilter': ['litster', 'slitter', 'stilter', 'testril'], 'stilty': ['slitty', 'stilty'], 'stim': ['mist', 'smit', 'stim'], 'stime': ['metis', 'smite', 'stime', 'times'], 'stimulancy': ['stimulancy', 'unmystical'], 'stimy': ['misty', 'stimy'], 'stine': ['inset', 'neist', 'snite', 'stein', 'stine', 'tsine'], 'stinge': ['ingest', 'signet', 'stinge'], 'stinger': ['resting', 'stinger'], 'stinker': ['kirsten', 'kristen', 'stinker'], 'stinkstone': ['knottiness', 'stinkstone'], 'stinted': ['dentist', 'distent', 'stinted'], 'stion': ['sinto', 'stion'], 'stipa': ['piast', 'stipa', 'tapis'], 'stipe': ['septi', 'spite', 'stipe'], 'stipel': ['pistle', 'stipel'], 'stippen': ['snippet', 'stippen'], 'stipula': ['paulist', 'stipula'], 'stir': ['rist', 'stir'], 'stirk': ['skirt', 'stirk'], 'stirp': ['spirt', 'sprit', 'stirp', 'strip'], 'stitcher': ['restitch', 'stitcher'], 'stiver': ['stiver', 'strive', 'verist'], 'stoa': ['oast', 'stoa', 'taos'], 'stoach': ['stoach', 'stocah'], 'stoat': ['stoat', 'toast'], 'stoater': ['retoast', 'rosetta', 'stoater', 'toaster'], 'stocah': ['stoach', 'stocah'], 'stoccata': ['staccato', 'stoccata'], 'stocker': ['restock', 'stocker'], 'stoep': ['estop', 'stoep', 'stope'], 'stof': ['soft', 'stof'], 'stog': ['stog', 'togs'], 'stogie': ['egoist', 'stogie'], 'stoic': ['ostic', 'sciot', 'stoic'], 'stoically': ['callosity', 'stoically'], 'stoker': ['stoker', 'stroke'], 'stolae': ['lotase', 'osteal', 'solate', 'stolae', 'talose'], 'stole': ['slote', 'stole'], 'stoled': ['sloted', 'stoled'], 'stolen': ['solent', 'stolen', 'telson'], 'stoma': ['atmos', 'stoma', 'tomas'], 'stomatode': ['mootstead', 'stomatode'], 'stomatomy': ['mastotomy', 'stomatomy'], 'stomatopoda': ['podostomata', 'stomatopoda'], 'stomatopodous': ['podostomatous', 'stomatopodous'], 'stomper': ['pomster', 'stomper'], 'stone': ['onset', 'seton', 'steno', 'stone'], 'stonebird': ['birdstone', 'stonebird'], 'stonebreak': ['breakstone', 'stonebreak'], 'stoned': ['doesnt', 'stoned'], 'stonegall': ['gallstone', 'stonegall'], 'stonehand': ['handstone', 'stonehand'], 'stonehead': ['headstone', 'stonehead'], 'stonen': ['sonnet', 'stonen', 'tenson'], 'stoner': ['nestor', 'sterno', 'stoner', 'strone', 'tensor'], 'stonewood': ['stonewood', 'woodstone'], 'stong': ['stong', 'tongs'], 'stonker': ['stonker', 'storken'], 'stoof': ['foots', 'sfoot', 'stoof'], 'stool': ['sotol', 'stool'], 'stoon': ['snoot', 'stoon'], 'stoop': ['spoot', 'stoop'], 'stop': ['post', 'spot', 'stop', 'tops'], 'stopback': ['backstop', 'stopback'], 'stope': ['estop', 'stoep', 'stope'], 'stoper': ['poster', 'presto', 'repost', 'respot', 'stoper'], 'stoping': ['posting', 'stoping'], 'stopless': ['postless', 'spotless', 'stopless'], 'stoplessness': ['spotlessness', 'stoplessness'], 'stoppeur': ['pteropus', 'stoppeur'], 'storable': ['sortable', 'storable'], 'storage': ['storage', 'tagsore'], 'store': ['roset', 'rotse', 'soter', 'stero', 'store', 'torse'], 'storeen': ['enstore', 'estrone', 'storeen', 'tornese'], 'storeman': ['monaster', 'monstera', 'nearmost', 'storeman'], 'storer': ['resort', 'roster', 'sorter', 'storer'], 'storeship': ['posterish', 'prothesis', 'sophister', 'storeship', 'tephrosis'], 'storesman': ['nosesmart', 'storesman'], 'storge': ['groset', 'storge'], 'storiate': ['astroite', 'ostraite', 'storiate'], 'storied': ['oestrid', 'steroid', 'storied'], 'storier': ['roister', 'storier'], 'stork': ['stork', 'torsk'], 'storken': ['stonker', 'storken'], 'storm': ['storm', 'strom'], 'stormwind': ['stormwind', 'windstorm'], 'story': ['sorty', 'story', 'stroy'], 'stot': ['stot', 'tost'], 'stotter': ['stotter', 'stretto'], 'stoun': ['notus', 'snout', 'stoun', 'tonus'], 'stoup': ['spout', 'stoup'], 'stour': ['roust', 'rusot', 'stour', 'sutor', 'torus'], 'stouring': ['rousting', 'stouring'], 'stoutly': ['stoutly', 'tylotus'], 'stove': ['ovest', 'stove'], 'stover': ['stover', 'strove'], 'stow': ['sowt', 'stow', 'swot', 'wots'], 'stowable': ['bestowal', 'stowable'], 'stower': ['restow', 'stower', 'towser', 'worset'], 'stra': ['sart', 'star', 'stra', 'tars', 'tsar'], 'strad': ['darst', 'darts', 'strad'], 'stradine': ['stradine', 'strained', 'tarnside'], 'strae': ['aster', 'serta', 'stare', 'strae', 'tarse', 'teras'], 'strafe': ['farset', 'faster', 'strafe'], 'stragular': ['gastrular', 'stragular'], 'straighten': ['shattering', 'straighten'], 'straightener': ['restraighten', 'straightener'], 'straightup': ['straightup', 'upstraight'], 'straik': ['rastik', 'sarkit', 'straik'], 'strain': ['instar', 'santir', 'strain'], 'strained': ['stradine', 'strained', 'tarnside'], 'strainer': ['restrain', 'strainer', 'transire'], 'strainerman': ['strainerman', 'transmarine'], 'straint': ['straint', 'transit', 'tristan'], 'strait': ['artist', 'strait', 'strati'], 'strake': ['skater', 'staker', 'strake', 'streak', 'tasker'], 'straky': ['starky', 'straky'], 'stram': ['smart', 'stram'], 'strange': ['angster', 'garnets', 'nagster', 'strange'], 'strangles': ['slangster', 'strangles'], 'strap': ['spart', 'sprat', 'strap', 'traps'], 'strapless': ['psaltress', 'strapless'], 'strata': ['astart', 'strata'], 'strategi': ['strategi', 'strigate'], 'strath': ['strath', 'thrast'], 'strati': ['artist', 'strait', 'strati'], 'stratic': ['astrict', 'cartist', 'stratic'], 'stratonic': ['narcotist', 'stratonic'], 'stratonical': ['intracostal', 'stratonical'], 'strave': ['starve', 'staver', 'strave', 'tavers', 'versta'], 'straw': ['straw', 'swart', 'warst'], 'strawy': ['strawy', 'swarty'], 'stray': ['satyr', 'stary', 'stray', 'trasy'], 'strayling': ['staringly', 'strayling'], 'stre': ['rest', 'sert', 'stre'], 'streak': ['skater', 'staker', 'strake', 'streak', 'tasker'], 'streakily': ['satyrlike', 'streakily'], 'stream': ['martes', 'master', 'remast', 'stream'], 'streamer': ['masterer', 'restream', 'streamer'], 'streamful': ['masterful', 'streamful'], 'streamhead': ['headmaster', 'headstream', 'streamhead'], 'streaming': ['germanist', 'streaming'], 'streamless': ['masterless', 'streamless'], 'streamlike': ['masterlike', 'streamlike'], 'streamline': ['eternalism', 'streamline'], 'streamling': ['masterling', 'streamling'], 'streamside': ['mediatress', 'streamside'], 'streamwort': ['masterwort', 'streamwort'], 'streamy': ['mastery', 'streamy'], 'stree': ['ester', 'estre', 'reest', 'reset', 'steer', 'stere', 'stree', 'terse', 'tsere'], 'streek': ['streek', 'streke'], 'streel': ['lester', 'selter', 'streel'], 'streen': ['ernest', 'nester', 'resent', 'streen'], 'streep': ['pester', 'preset', 'restep', 'streep'], 'street': ['retest', 'setter', 'street', 'tester'], 'streetcar': ['scatterer', 'streetcar'], 'streke': ['streek', 'streke'], 'strelitz': ['strelitz', 'streltzi'], 'streltzi': ['strelitz', 'streltzi'], 'stremma': ['stammer', 'stremma'], 'strengthener': ['restrengthen', 'strengthener'], 'strepen': ['penster', 'present', 'serpent', 'strepen'], 'strepera': ['pasterer', 'strepera'], 'strepor': ['sporter', 'strepor'], 'strepsinema': ['esperantism', 'strepsinema'], 'streptothricosis': ['streptothricosis', 'streptotrichosis'], 'streptotrichosis': ['streptothricosis', 'streptotrichosis'], 'stresser': ['restress', 'stresser'], 'stret': ['stert', 'stret', 'trest'], 'stretcher': ['restretch', 'stretcher'], 'stretcherman': ['stretcherman', 'trenchmaster'], 'stretto': ['stotter', 'stretto'], 'strew': ['strew', 'trews', 'wrest'], 'strewer': ['strewer', 'wrester'], 'strey': ['resty', 'strey'], 'streyne': ['streyne', 'styrene', 'yestern'], 'stria': ['arist', 'astir', 'sitar', 'stair', 'stria', 'tarsi', 'tisar', 'trias'], 'striae': ['satire', 'striae'], 'strial': ['latris', 'strial'], 'striatal': ['altarist', 'striatal'], 'striate': ['artiste', 'striate'], 'striated': ['distater', 'striated'], 'strich': ['christ', 'strich'], 'strickle': ['stickler', 'strickle'], 'stride': ['driest', 'stride'], 'strife': ['fister', 'resift', 'sifter', 'strife'], 'strig': ['grist', 'grits', 'strig'], 'striga': ['gratis', 'striga'], 'strigae': ['seagirt', 'strigae'], 'strigate': ['strategi', 'strigate'], 'striges': ['striges', 'tigress'], 'strigulose': ['sortilegus', 'strigulose'], 'strike': ['skiter', 'strike'], 'striker': ['skirret', 'skirter', 'striker'], 'striking': ['skirting', 'striking'], 'strikingly': ['skirtingly', 'strikingly'], 'stringer': ['restring', 'ringster', 'stringer'], 'strinkle': ['sklinter', 'strinkle'], 'striola': ['aristol', 'oralist', 'ortalis', 'striola'], 'striolae': ['soterial', 'striolae'], 'strip': ['spirt', 'sprit', 'stirp', 'strip'], 'stripe': ['priest', 'pteris', 'sprite', 'stripe'], 'stripeless': ['priestless', 'stripeless'], 'striper': ['restrip', 'striper'], 'striplet': ['splitter', 'striplet'], 'strippit': ['strippit', 'trippist'], 'strit': ['strit', 'trist'], 'strive': ['stiver', 'strive', 'verist'], 'stroam': ['stroam', 'stroma'], 'strobila': ['laborist', 'strobila'], 'strobilae': ['sobralite', 'strobilae'], 'strobilate': ['brasiletto', 'strobilate'], 'strode': ['sorted', 'strode'], 'stroke': ['stoker', 'stroke'], 'strom': ['storm', 'strom'], 'stroma': ['stroam', 'stroma'], 'stromatic': ['microstat', 'stromatic'], 'strone': ['nestor', 'sterno', 'stoner', 'strone', 'tensor'], 'stronghead': ['headstrong', 'stronghead'], 'strontian': ['strontian', 'trisonant'], 'strontianite': ['interstation', 'strontianite'], 'strop': ['sport', 'strop'], 'strophaic': ['actorship', 'strophaic'], 'strophiolate': ['strophiolate', 'theatropolis'], 'strophomena': ['nephrostoma', 'strophomena'], 'strounge': ['strounge', 'sturgeon'], 'stroup': ['sprout', 'stroup', 'stupor'], 'strove': ['stover', 'strove'], 'strow': ['strow', 'worst'], 'stroy': ['sorty', 'story', 'stroy'], 'strub': ['burst', 'strub'], 'struck': ['struck', 'trucks'], 'strue': ['serut', 'strue', 'turse', 'uster'], 'strumae': ['staumer', 'strumae'], 'strut': ['strut', 'sturt', 'trust'], 'struth': ['struth', 'thrust'], 'struthian': ['struthian', 'unathirst'], 'stu': ['stu', 'ust'], 'stuart': ['astrut', 'rattus', 'stuart'], 'stub': ['bust', 'stub'], 'stuber': ['berust', 'buster', 'stuber'], 'stud': ['dust', 'stud'], 'studdie': ['studdie', 'studied'], 'student': ['student', 'stunted'], 'studia': ['aditus', 'studia'], 'studied': ['studdie', 'studied'], 'study': ['dusty', 'study'], 'stue': ['stue', 'suet'], 'stuffer': ['restuff', 'stuffer'], 'stug': ['gust', 'stug'], 'stuiver': ['revuist', 'stuiver'], 'stum': ['must', 'smut', 'stum'], 'stumer': ['muster', 'sertum', 'stumer'], 'stumper': ['stumper', 'sumpter'], 'stun': ['stun', 'sunt', 'tsun'], 'stunner': ['stunner', 'unstern'], 'stunted': ['student', 'stunted'], 'stunter': ['entrust', 'stunter', 'trusten'], 'stupa': ['sputa', 'staup', 'stupa'], 'stupe': ['setup', 'stupe', 'upset'], 'stupor': ['sprout', 'stroup', 'stupor'], 'stuprate': ['stuprate', 'upstater'], 'stupulose': ['pustulose', 'stupulose'], 'sturdiness': ['sturdiness', 'undistress'], 'sturgeon': ['strounge', 'sturgeon'], 'sturine': ['intruse', 'sturine'], 'sturionine': ['reunionist', 'sturionine'], 'sturmian': ['naturism', 'sturmian', 'turanism'], 'sturnidae': ['disnature', 'sturnidae', 'truandise'], 'sturninae': ['neustrian', 'saturnine', 'sturninae'], 'sturnus': ['sturnus', 'untruss'], 'sturt': ['strut', 'sturt', 'trust'], 'sturtin': ['intrust', 'sturtin'], 'stut': ['stut', 'tuts'], 'stutter': ['stutter', 'tutster'], 'styan': ['nasty', 'styan', 'tansy'], 'styca': ['stacy', 'styca'], 'stycerin': ['nycteris', 'stycerin'], 'stygial': ['stagily', 'stygial'], 'stylate': ['stately', 'stylate'], 'styledom': ['modestly', 'styledom'], 'stylite': ['stylite', 'testily'], 'styloid': ['odylist', 'styloid'], 'stylometer': ['metrostyle', 'stylometer'], 'stylopidae': ['ideoplasty', 'stylopidae'], 'styphelia': ['physalite', 'styphelia'], 'styrene': ['streyne', 'styrene', 'yestern'], 'styrol': ['sortly', 'styrol'], 'stythe': ['stythe', 'tethys'], 'styx': ['styx', 'xyst'], 'suability': ['suability', 'usability'], 'suable': ['suable', 'usable'], 'sualocin': ['sualocin', 'unsocial'], 'suant': ['staun', 'suant'], 'suasible': ['basileus', 'issuable', 'suasible'], 'suasion': ['sanious', 'suasion'], 'suasory': ['ossuary', 'suasory'], 'suave': ['sauve', 'suave'], 'sub': ['bus', 'sub'], 'subah': ['shuba', 'subah'], 'subalpine': ['subalpine', 'unspiable'], 'subanal': ['balanus', 'nabalus', 'subanal'], 'subcaecal': ['accusable', 'subcaecal'], 'subcantor': ['obscurant', 'subcantor'], 'subcapsular': ['subcapsular', 'subscapular'], 'subcenter': ['rubescent', 'subcenter'], 'subchela': ['chasuble', 'subchela'], 'subcool': ['colobus', 'subcool'], 'subcortical': ['scorbutical', 'subcortical'], 'subcortically': ['scorbutically', 'subcortically'], 'subdealer': ['subdealer', 'subleader'], 'subdean': ['subdean', 'unbased'], 'subdeltaic': ['discutable', 'subdeltaic', 'subdialect'], 'subdialect': ['discutable', 'subdeltaic', 'subdialect'], 'subdie': ['busied', 'subdie'], 'suber': ['burse', 'rebus', 'suber'], 'subessential': ['subessential', 'suitableness'], 'subherd': ['brushed', 'subherd'], 'subhero': ['herbous', 'subhero'], 'subhuman': ['subhuman', 'unambush'], 'subimago': ['bigamous', 'subimago'], 'sublanate': ['sublanate', 'unsatable'], 'sublate': ['balteus', 'sublate'], 'sublative': ['sublative', 'vestibula'], 'subleader': ['subdealer', 'subleader'], 'sublet': ['bustle', 'sublet', 'subtle'], 'sublinear': ['insurable', 'sublinear'], 'sublumbar': ['sublumbar', 'subumbral'], 'submaid': ['misdaub', 'submaid'], 'subman': ['busman', 'subman'], 'submarine': ['semiurban', 'submarine'], 'subnarcotic': ['obscurantic', 'subnarcotic'], 'subnitrate': ['subnitrate', 'subtertian'], 'subnote': ['subnote', 'subtone', 'unbesot'], 'suboval': ['suboval', 'subvola'], 'subpeltate': ['subpeltate', 'upsettable'], 'subplat': ['subplat', 'upblast'], 'subra': ['abrus', 'bursa', 'subra'], 'subscapular': ['subcapsular', 'subscapular'], 'subserve': ['subserve', 'subverse'], 'subsider': ['disburse', 'subsider'], 'substernal': ['substernal', 'turbanless'], 'substraction': ['obscurantist', 'substraction'], 'subtack': ['sackbut', 'subtack'], 'subterraneal': ['subterraneal', 'unarrestable'], 'subtertian': ['subnitrate', 'subtertian'], 'subtle': ['bustle', 'sublet', 'subtle'], 'subtone': ['subnote', 'subtone', 'unbesot'], 'subtread': ['daubster', 'subtread'], 'subtutor': ['outburst', 'subtutor'], 'subulate': ['baetulus', 'subulate'], 'subumbral': ['sublumbar', 'subumbral'], 'subverse': ['subserve', 'subverse'], 'subvola': ['suboval', 'subvola'], 'succade': ['accused', 'succade'], 'succeeder': ['resucceed', 'succeeder'], 'succin': ['cnicus', 'succin'], 'succinate': ['encaustic', 'succinate'], 'succor': ['crocus', 'succor'], 'such': ['cush', 'such'], 'suck': ['cusk', 'suck'], 'sucker': ['resuck', 'sucker'], 'suckling': ['lungsick', 'suckling'], 'suclat': ['scutal', 'suclat'], 'sucramine': ['muscarine', 'sucramine'], 'sucre': ['cruse', 'curse', 'sucre'], 'suction': ['cotinus', 'suction', 'unstoic'], 'suctional': ['suctional', 'sulcation', 'unstoical'], 'suctoria': ['cotarius', 'octarius', 'suctoria'], 'suctorial': ['ocularist', 'suctorial'], 'sud': ['sud', 'uds'], 'sudamen': ['medusan', 'sudamen'], 'sudan': ['sudan', 'unsad'], 'sudanese': ['danseuse', 'sudanese'], 'sudani': ['sudani', 'unsaid'], 'sudation': ['adustion', 'sudation'], 'sudic': ['scudi', 'sudic'], 'sudra': ['rudas', 'sudra'], 'sue': ['sue', 'use'], 'suer': ['ruse', 'suer', 'sure', 'user'], 'suet': ['stue', 'suet'], 'sufferer': ['resuffer', 'sufferer'], 'sufflate': ['feastful', 'sufflate'], 'suffocate': ['offuscate', 'suffocate'], 'suffocation': ['offuscation', 'suffocation'], 'sugamo': ['amusgo', 'sugamo'], 'sugan': ['agnus', 'angus', 'sugan'], 'sugar': ['argus', 'sugar'], 'sugared': ['desugar', 'sugared'], 'sugarlike': ['arguslike', 'sugarlike'], 'suggester': ['resuggest', 'suggester'], 'suggestionism': ['missuggestion', 'suggestionism'], 'sugh': ['gush', 'shug', 'sugh'], 'suidae': ['asideu', 'suidae'], 'suimate': ['metusia', 'suimate', 'timaeus'], 'suina': ['ianus', 'suina'], 'suint': ['sintu', 'suint'], 'suiones': ['sinuose', 'suiones'], 'suist': ['situs', 'suist'], 'suitable': ['sabulite', 'suitable'], 'suitableness': ['subessential', 'suitableness'], 'suitor': ['suitor', 'tursio'], 'sula': ['saul', 'sula'], 'sulcal': ['callus', 'sulcal'], 'sulcar': ['cursal', 'sulcar'], 'sulcation': ['suctional', 'sulcation', 'unstoical'], 'suld': ['slud', 'suld'], 'sulfamide': ['feudalism', 'sulfamide'], 'sulfonium': ['fulminous', 'sulfonium'], 'sulfuret': ['frustule', 'sulfuret'], 'sulk': ['lusk', 'sulk'], 'sulka': ['klaus', 'lukas', 'sulka'], 'sulky': ['lusky', 'sulky'], 'sulphinide': ['delphinius', 'sulphinide'], 'sulphohydrate': ['hydrosulphate', 'sulphohydrate'], 'sulphoproteid': ['protosulphide', 'sulphoproteid'], 'sulphurea': ['elaphurus', 'sulphurea'], 'sultan': ['sultan', 'unsalt'], 'sultane': ['sultane', 'unslate'], 'sultanian': ['annualist', 'sultanian'], 'sultanin': ['insulant', 'sultanin'], 'sultone': ['lentous', 'sultone'], 'sultry': ['rustly', 'sultry'], 'sum': ['mus', 'sum'], 'sumac': ['camus', 'musca', 'scaum', 'sumac'], 'sumak': ['kusam', 'sumak'], 'sumatra': ['artamus', 'sumatra'], 'sumerian': ['aneurism', 'arsenium', 'sumerian'], 'sumitro': ['sumitro', 'tourism'], 'summit': ['mutism', 'summit'], 'summonable': ['somnambule', 'summonable'], 'summoner': ['resummon', 'summoner'], 'sumo': ['soum', 'sumo'], 'sumpit': ['misput', 'sumpit'], 'sumpitan': ['putanism', 'sumpitan'], 'sumpter': ['stumper', 'sumpter'], 'sumptuary': ['sputumary', 'sumptuary'], 'sumptuous': ['sputumous', 'sumptuous'], 'sunbeamed': ['sunbeamed', 'unembased'], 'sundar': ['nardus', 'sundar', 'sundra'], 'sundek': ['dusken', 'sundek'], 'sundra': ['nardus', 'sundar', 'sundra'], 'sung': ['snug', 'sung'], 'sunil': ['linus', 'sunil'], 'sunk': ['skun', 'sunk'], 'sunlighted': ['sunlighted', 'unslighted'], 'sunlit': ['insult', 'sunlit', 'unlist', 'unslit'], 'sunni': ['sunni', 'unsin'], 'sunray': ['sunray', 'surnay', 'synura'], 'sunrise': ['russine', 'serinus', 'sunrise'], 'sunshade': ['sunshade', 'unsashed'], 'sunt': ['stun', 'sunt', 'tsun'], 'sunup': ['sunup', 'upsun'], 'sunweed': ['sunweed', 'unsewed'], 'suomic': ['musico', 'suomic'], 'sup': ['pus', 'sup'], 'supa': ['apus', 'supa', 'upas'], 'super': ['purse', 'resup', 'sprue', 'super'], 'superable': ['perusable', 'superable'], 'supercarpal': ['prescapular', 'supercarpal'], 'superclaim': ['premusical', 'superclaim'], 'supercontrol': ['preconsultor', 'supercontrol'], 'supercool': ['escropulo', 'supercool'], 'superheater': ['resuperheat', 'superheater'], 'superideal': ['serpulidae', 'superideal'], 'superintender': ['superintender', 'unenterprised'], 'superline': ['serpuline', 'superline'], 'supermoisten': ['sempiternous', 'supermoisten'], 'supernacular': ['supernacular', 'supranuclear'], 'supernal': ['purslane', 'serpulan', 'supernal'], 'superoanterior': ['anterosuperior', 'superoanterior'], 'superoposterior': ['posterosuperior', 'superoposterior'], 'superpose': ['resuppose', 'superpose'], 'superposition': ['resupposition', 'superposition'], 'supersaint': ['presustain', 'puritaness', 'supersaint'], 'supersalt': ['pertussal', 'supersalt'], 'superservice': ['repercussive', 'superservice'], 'supersonic': ['croupiness', 'percussion', 'supersonic'], 'supertare': ['repasture', 'supertare'], 'supertension': ['serpentinous', 'supertension'], 'supertotal': ['supertotal', 'tetraplous'], 'supertrain': ['rupestrian', 'supertrain'], 'supinator': ['rainspout', 'supinator'], 'supine': ['puisne', 'supine'], 'supper': ['supper', 'uppers'], 'supple': ['peplus', 'supple'], 'suppletory': ['polypterus', 'suppletory'], 'supplier': ['periplus', 'supplier'], 'supporter': ['resupport', 'supporter'], 'suppresser': ['resuppress', 'suppresser'], 'suprahyoid': ['hyporadius', 'suprahyoid'], 'supranuclear': ['supernacular', 'supranuclear'], 'supreme': ['presume', 'supreme'], 'sur': ['rus', 'sur', 'urs'], 'sura': ['rusa', 'saur', 'sura', 'ursa', 'usar'], 'surah': ['ashur', 'surah'], 'surahi': ['shauri', 'surahi'], 'sural': ['larus', 'sural', 'ursal'], 'surat': ['astur', 'surat', 'sutra'], 'surbase': ['rubasse', 'surbase'], 'surbate': ['bursate', 'surbate'], 'surcrue': ['crureus', 'surcrue'], 'sure': ['ruse', 'suer', 'sure', 'user'], 'suresh': ['rhesus', 'suresh'], 'surette': ['surette', 'trustee'], 'surge': ['grues', 'surge'], 'surgent': ['gunster', 'surgent'], 'surgeonship': ['springhouse', 'surgeonship'], 'surgy': ['gyrus', 'surgy'], 'suriana': ['saurian', 'suriana'], 'surinam': ['surinam', 'uranism'], 'surma': ['musar', 'ramus', 'rusma', 'surma'], 'surmisant': ['saturnism', 'surmisant'], 'surmise': ['misuser', 'surmise'], 'surnap': ['surnap', 'unspar'], 'surnay': ['sunray', 'surnay', 'synura'], 'surprisement': ['surprisement', 'trumperiness'], 'surrenderer': ['resurrender', 'surrenderer'], 'surrogate': ['surrogate', 'urogaster'], 'surrounder': ['resurround', 'surrounder'], 'surya': ['saury', 'surya'], 'sus': ['ssu', 'sus'], 'susan': ['nasus', 'susan'], 'suscept': ['suscept', 'suspect'], 'susceptible': ['susceptible', 'suspectible'], 'susceptor': ['spectrous', 'susceptor', 'suspector'], 'susie': ['issue', 'susie'], 'suspect': ['suscept', 'suspect'], 'suspecter': ['resuspect', 'suspecter'], 'suspectible': ['susceptible', 'suspectible'], 'suspector': ['spectrous', 'susceptor', 'suspector'], 'suspender': ['resuspend', 'suspender', 'unpressed'], 'sustain': ['issuant', 'sustain'], 'suther': ['reshut', 'suther', 'thurse', 'tusher'], 'sutler': ['luster', 'result', 'rustle', 'sutler', 'ulster'], 'suto': ['otus', 'oust', 'suto'], 'sutor': ['roust', 'rusot', 'stour', 'sutor', 'torus'], 'sutorian': ['staurion', 'sutorian'], 'sutorious': ['sutorious', 'ustorious'], 'sutra': ['astur', 'surat', 'sutra'], 'suttin': ['suttin', 'tunist'], 'suture': ['suture', 'uterus'], 'svante': ['stevan', 'svante'], 'svelte': ['stevel', 'svelte'], 'swa': ['saw', 'swa', 'was'], 'swage': ['swage', 'wages'], 'swain': ['siwan', 'swain'], 'swale': ['swale', 'sweal', 'wasel'], 'swaler': ['swaler', 'warsel', 'warsle'], 'swallet': ['setwall', 'swallet'], 'swallo': ['sallow', 'swallo'], 'swallower': ['reswallow', 'swallower'], 'swami': ['aswim', 'swami'], 'swan': ['sawn', 'snaw', 'swan'], 'swap': ['swap', 'wasp'], 'swarbie': ['barwise', 'swarbie'], 'sware': ['resaw', 'sawer', 'seraw', 'sware', 'swear', 'warse'], 'swarmer': ['reswarm', 'swarmer'], 'swart': ['straw', 'swart', 'warst'], 'swarty': ['strawy', 'swarty'], 'swarve': ['swarve', 'swaver'], 'swat': ['sawt', 'staw', 'swat', 'taws', 'twas', 'wast'], 'swath': ['swath', 'whats'], 'swathe': ['swathe', 'sweath'], 'swati': ['swati', 'waist'], 'swatter': ['stewart', 'swatter'], 'swaver': ['swarve', 'swaver'], 'sway': ['sway', 'ways', 'yaws'], 'swayer': ['sawyer', 'swayer'], 'sweal': ['swale', 'sweal', 'wasel'], 'swear': ['resaw', 'sawer', 'seraw', 'sware', 'swear', 'warse'], 'swearer': ['resawer', 'reswear', 'swearer'], 'sweat': ['awest', 'sweat', 'tawse', 'waste'], 'sweater': ['resweat', 'sweater'], 'sweatful': ['sweatful', 'wasteful'], 'sweath': ['swathe', 'sweath'], 'sweatily': ['sweatily', 'tileways'], 'sweatless': ['sweatless', 'wasteless'], 'sweatproof': ['sweatproof', 'wasteproof'], 'swede': ['sewed', 'swede'], 'sweep': ['sweep', 'weeps'], 'sweeper': ['resweep', 'sweeper'], 'sweer': ['resew', 'sewer', 'sweer'], 'sweered': ['sewered', 'sweered'], 'sweet': ['sweet', 'weste'], 'sweetbread': ['breastweed', 'sweetbread'], 'sweller': ['reswell', 'sweller'], 'swelter': ['swelter', 'wrestle'], 'swep': ['spew', 'swep'], 'swertia': ['swertia', 'waister'], 'swile': ['lewis', 'swile'], 'swiller': ['reswill', 'swiller'], 'swindle': ['swindle', 'windles'], 'swine': ['sinew', 'swine', 'wisen'], 'swinestone': ['sonnetwise', 'swinestone'], 'swiney': ['sinewy', 'swiney'], 'swingback': ['backswing', 'swingback'], 'swinge': ['sewing', 'swinge'], 'swingle': ['slewing', 'swingle'], 'swingtree': ['swingtree', 'westering'], 'swipy': ['swipy', 'wispy'], 'swire': ['swire', 'wiser'], 'swith': ['swith', 'whist', 'whits', 'wisht'], 'swithe': ['swithe', 'whites'], 'swither': ['swither', 'whister', 'withers'], 'swoon': ['swoon', 'woons'], 'swordman': ['sandworm', 'swordman', 'wordsman'], 'swordmanship': ['swordmanship', 'wordsmanship'], 'swore': ['owser', 'resow', 'serow', 'sower', 'swore', 'worse'], 'swot': ['sowt', 'stow', 'swot', 'wots'], 'sybarite': ['bestiary', 'sybarite'], 'sybil': ['sibyl', 'sybil'], 'syce': ['scye', 'syce'], 'sycones': ['coyness', 'sycones'], 'syconoid': ['syconoid', 'syodicon'], 'sye': ['sey', 'sye', 'yes'], 'syenitic': ['cytisine', 'syenitic'], 'syllabi': ['sibylla', 'syllabi'], 'syllable': ['sellably', 'syllable'], 'sylva': ['salvy', 'sylva'], 'sylvae': ['slavey', 'sylvae'], 'sylvine': ['snively', 'sylvine'], 'sylvite': ['levyist', 'sylvite'], 'symbol': ['blosmy', 'symbol'], 'symmetric': ['mycterism', 'symmetric'], 'sympathy': ['sympathy', 'symphyta'], 'symphonic': ['cyphonism', 'symphonic'], 'symphyta': ['sympathy', 'symphyta'], 'symposion': ['spoonyism', 'symposion'], 'synapse': ['synapse', 'yapness'], 'synaptera': ['peasantry', 'synaptera'], 'syncopator': ['antroscopy', 'syncopator'], 'syndicate': ['asyndetic', 'cystidean', 'syndicate'], 'synedral': ['lysander', 'synedral'], 'syngamic': ['gymnasic', 'syngamic'], 'syngenic': ['ensigncy', 'syngenic'], 'synura': ['sunray', 'surnay', 'synura'], 'syodicon': ['syconoid', 'syodicon'], 'sypher': ['sphery', 'sypher'], 'syphiloid': ['hypsiloid', 'syphiloid'], 'syrian': ['siryan', 'syrian'], 'syringa': ['signary', 'syringa'], 'syringeful': ['refusingly', 'syringeful'], 'syrup': ['pursy', 'pyrus', 'syrup'], 'system': ['mystes', 'system'], 'systole': ['systole', 'toyless'], 'ta': ['at', 'ta'], 'taa': ['ata', 'taa'], 'taal': ['lata', 'taal', 'tala'], 'taar': ['rata', 'taar', 'tara'], 'tab': ['bat', 'tab'], 'tabanus': ['sabanut', 'sabutan', 'tabanus'], 'tabaret': ['baretta', 'rabatte', 'tabaret'], 'tabber': ['barbet', 'rabbet', 'tabber'], 'tabella': ['ballate', 'tabella'], 'tabes': ['baste', 'beast', 'tabes'], 'tabet': ['betta', 'tabet'], 'tabinet': ['bettina', 'tabinet', 'tibetan'], 'tabira': ['arabit', 'tabira'], 'tabitha': ['habitat', 'tabitha'], 'tabitude': ['dubitate', 'tabitude'], 'table': ['batel', 'blate', 'bleat', 'table'], 'tabled': ['dablet', 'tabled'], 'tablemaker': ['marketable', 'tablemaker'], 'tabler': ['albert', 'balter', 'labret', 'tabler'], 'tables': ['ablest', 'stable', 'tables'], 'tablet': ['battel', 'battle', 'tablet'], 'tabletary': ['tabletary', 'treatably'], 'tabling': ['batling', 'tabling'], 'tabophobia': ['batophobia', 'tabophobia'], 'tabor': ['abort', 'tabor'], 'taborer': ['arboret', 'roberta', 'taborer'], 'taboret': ['abettor', 'taboret'], 'taborin': ['abortin', 'taborin'], 'tabour': ['outbar', 'rubato', 'tabour'], 'tabouret': ['obturate', 'tabouret'], 'tabret': ['batter', 'bertat', 'tabret', 'tarbet'], 'tabu': ['abut', 'tabu', 'tuba'], 'tabula': ['ablaut', 'tabula'], 'tabulare': ['bataleur', 'tabulare'], 'tabule': ['batule', 'betula', 'tabule'], 'taccaceae': ['cactaceae', 'taccaceae'], 'taccaceous': ['cactaceous', 'taccaceous'], 'tach': ['chat', 'tach'], 'tache': ['cheat', 'tache', 'teach', 'theca'], 'tacheless': ['tacheless', 'teachless'], 'tachina': ['ithacan', 'tachina'], 'tachinidae': ['anthicidae', 'tachinidae'], 'tachograph': ['cathograph', 'tachograph'], 'tacit': ['attic', 'catti', 'tacit'], 'tacitly': ['cattily', 'tacitly'], 'tacitness': ['cattiness', 'tacitness'], 'taciturn': ['taciturn', 'urticant'], 'tacker': ['racket', 'retack', 'tacker'], 'tacksman': ['stackman', 'tacksman'], 'taconian': ['catonian', 'taconian'], 'taconic': ['cantico', 'catonic', 'taconic'], 'tacso': ['ascot', 'coast', 'costa', 'tacso', 'tasco'], 'tacsonia': ['acontias', 'tacsonia'], 'tactile': ['lattice', 'tactile'], 'tade': ['adet', 'date', 'tade', 'tead', 'teda'], 'tadpole': ['platode', 'tadpole'], 'tae': ['ate', 'eat', 'eta', 'tae', 'tea'], 'tael': ['atle', 'laet', 'late', 'leat', 'tael', 'tale', 'teal'], 'taen': ['ante', 'aten', 'etna', 'nate', 'neat', 'taen', 'tane', 'tean'], 'taenia': ['aetian', 'antiae', 'taenia'], 'taeniada': ['anatidae', 'taeniada'], 'taenial': ['laniate', 'natalie', 'taenial'], 'taenian': ['ananite', 'anatine', 'taenian'], 'taenicide': ['deciatine', 'diacetine', 'taenicide', 'teniacide'], 'taeniform': ['forminate', 'fremontia', 'taeniform'], 'taenioid': ['ideation', 'iodinate', 'taenioid'], 'taetsia': ['isatate', 'satiate', 'taetsia'], 'tag': ['gat', 'tag'], 'tagetes': ['gestate', 'tagetes'], 'tagetol': ['lagetto', 'tagetol'], 'tagged': ['gadget', 'tagged'], 'tagger': ['garget', 'tagger'], 'tagilite': ['litigate', 'tagilite'], 'tagish': ['ghaist', 'tagish'], 'taglike': ['glaiket', 'taglike'], 'tagrag': ['ragtag', 'tagrag'], 'tagsore': ['storage', 'tagsore'], 'taheen': ['ethane', 'taheen'], 'tahil': ['ihlat', 'tahil'], 'tahin': ['ahint', 'hiant', 'tahin'], 'tahr': ['hart', 'rath', 'tahr', 'thar', 'trah'], 'tahsil': ['latish', 'tahsil'], 'tahsin': ['snaith', 'tahsin'], 'tai': ['ait', 'ati', 'ita', 'tai'], 'taich': ['aitch', 'chait', 'chati', 'chita', 'taich', 'tchai'], 'taigle': ['aiglet', 'ligate', 'taigle', 'tailge'], 'tail': ['alit', 'tail', 'tali'], 'tailage': ['agalite', 'tailage', 'taliage'], 'tailboard': ['broadtail', 'tailboard'], 'tailed': ['detail', 'dietal', 'dilate', 'edital', 'tailed'], 'tailer': ['lirate', 'retail', 'retial', 'tailer'], 'tailet': ['latite', 'tailet', 'tailte', 'talite'], 'tailge': ['aiglet', 'ligate', 'taigle', 'tailge'], 'tailing': ['gitalin', 'tailing'], 'taille': ['taille', 'telial'], 'tailoring': ['gratiolin', 'largition', 'tailoring'], 'tailorman': ['antimoral', 'tailorman'], 'tailory': ['orality', 'tailory'], 'tailpin': ['pintail', 'tailpin'], 'tailsman': ['staminal', 'tailsman', 'talisman'], 'tailte': ['latite', 'tailet', 'tailte', 'talite'], 'taily': ['laity', 'taily'], 'taimen': ['etamin', 'inmate', 'taimen', 'tamein'], 'tain': ['aint', 'anti', 'tain', 'tina'], 'tainan': ['naiant', 'tainan'], 'taino': ['niota', 'taino'], 'taint': ['taint', 'tanti', 'tinta', 'titan'], 'tainture': ['tainture', 'unattire'], 'taipan': ['aptian', 'patina', 'taipan'], 'taipo': ['patio', 'taipo', 'topia'], 'tairge': ['gaiter', 'tairge', 'triage'], 'tairn': ['riant', 'tairn', 'tarin', 'train'], 'taise': ['saite', 'taise'], 'taistrel': ['starlite', 'taistrel'], 'taistril': ['taistril', 'trialist'], 'taivers': ['staiver', 'taivers'], 'taj': ['jat', 'taj'], 'tajik': ['jatki', 'tajik'], 'takar': ['katar', 'takar'], 'take': ['kate', 'keta', 'take', 'teak'], 'takedown': ['downtake', 'takedown'], 'taker': ['kerat', 'taker'], 'takin': ['kitan', 'takin'], 'takings': ['gitksan', 'skating', 'takings'], 'taky': ['katy', 'kyat', 'taky'], 'tal': ['alt', 'lat', 'tal'], 'tala': ['lata', 'taal', 'tala'], 'talapoin': ['palation', 'talapoin'], 'talar': ['altar', 'artal', 'ratal', 'talar'], 'talari': ['altair', 'atrail', 'atrial', 'lariat', 'latria', 'talari'], 'talc': ['clat', 'talc'], 'talcer': ['carlet', 'cartel', 'claret', 'rectal', 'talcer'], 'talcher': ['clethra', 'latcher', 'ratchel', 'relatch', 'talcher', 'trachle'], 'talcoid': ['cotidal', 'lactoid', 'talcoid'], 'talcose': ['alecost', 'lactose', 'scotale', 'talcose'], 'talcous': ['costula', 'locusta', 'talcous'], 'tald': ['dalt', 'tald'], 'tale': ['atle', 'laet', 'late', 'leat', 'tael', 'tale', 'teal'], 'taled': ['adlet', 'dealt', 'delta', 'lated', 'taled'], 'talent': ['latent', 'latten', 'nattle', 'talent', 'tantle'], 'taler': ['alert', 'alter', 'artel', 'later', 'ratel', 'taler', 'telar'], 'tales': ['least', 'setal', 'slate', 'stale', 'steal', 'stela', 'tales'], 'tali': ['alit', 'tail', 'tali'], 'taliage': ['agalite', 'tailage', 'taliage'], 'taligrade': ['taligrade', 'tragedial'], 'talinum': ['multani', 'talinum'], 'talion': ['italon', 'lation', 'talion'], 'taliped': ['plaited', 'taliped'], 'talipedic': ['talipedic', 'talpicide'], 'talipes': ['aliptes', 'pastile', 'talipes'], 'talipot': ['ptilota', 'talipot', 'toptail'], 'talis': ['alist', 'litas', 'slait', 'talis'], 'talisman': ['staminal', 'tailsman', 'talisman'], 'talite': ['latite', 'tailet', 'tailte', 'talite'], 'talker': ['kartel', 'retalk', 'talker'], 'tallage': ['gallate', 'tallage'], 'tallero': ['reallot', 'rotella', 'tallero'], 'talles': ['sallet', 'stella', 'talles'], 'talliage': ['allagite', 'alligate', 'talliage'], 'tallier': ['literal', 'tallier'], 'tallyho': ['loathly', 'tallyho'], 'talon': ['notal', 'ontal', 'talon', 'tolan', 'tonal'], 'taloned': ['taloned', 'toledan'], 'talonid': ['itoland', 'talonid', 'tindalo'], 'talose': ['lotase', 'osteal', 'solate', 'stolae', 'talose'], 'talpa': ['aptal', 'palta', 'talpa'], 'talpicide': ['talipedic', 'talpicide'], 'talpidae': ['lapidate', 'talpidae'], 'talpine': ['pantile', 'pentail', 'platine', 'talpine'], 'talpoid': ['platoid', 'talpoid'], 'taluche': ['auchlet', 'cutheal', 'taluche'], 'taluka': ['latuka', 'taluka'], 'talus': ['latus', 'sault', 'talus'], 'tam': ['amt', 'mat', 'tam'], 'tama': ['atma', 'tama'], 'tamale': ['malate', 'meatal', 'tamale'], 'tamanac': ['matacan', 'tamanac'], 'tamanaca': ['atacaman', 'tamanaca'], 'tamanoir': ['animator', 'tamanoir'], 'tamanu': ['anatum', 'mantua', 'tamanu'], 'tamara': ['armata', 'matara', 'tamara'], 'tamarao': ['tamarao', 'tamaroa'], 'tamarin': ['martian', 'tamarin'], 'tamaroa': ['tamarao', 'tamaroa'], 'tambor': ['tambor', 'tromba'], 'tamboura': ['marabout', 'marabuto', 'tamboura'], 'tambourer': ['arboretum', 'tambourer'], 'tambreet': ['ambrette', 'tambreet'], 'tamburan': ['rambutan', 'tamburan'], 'tame': ['mate', 'meat', 'meta', 'tame', 'team', 'tema'], 'tamein': ['etamin', 'inmate', 'taimen', 'tamein'], 'tameless': ['mateless', 'meatless', 'tameless', 'teamless'], 'tamelessness': ['matelessness', 'tamelessness'], 'tamely': ['mately', 'tamely'], 'tamer': ['armet', 'mater', 'merat', 'metra', 'ramet', 'tamer', 'terma', 'trame', 'trema'], 'tamise': ['samite', 'semita', 'tamise', 'teaism'], 'tampin': ['pitman', 'tampin', 'tipman'], 'tampion': ['maintop', 'ptomain', 'tampion', 'timpano'], 'tampioned': ['ademption', 'tampioned'], 'tampon': ['potman', 'tampon', 'topman'], 'tamul': ['lamut', 'tamul'], 'tamus': ['matsu', 'tamus', 'tsuma'], 'tan': ['ant', 'nat', 'tan'], 'tana': ['anat', 'anta', 'tana'], 'tanach': ['acanth', 'anchat', 'tanach'], 'tanager': ['argante', 'granate', 'tanager'], 'tanagridae': ['tanagridae', 'tangaridae'], 'tanagrine': ['argentina', 'tanagrine'], 'tanagroid': ['gradation', 'indagator', 'tanagroid'], 'tanak': ['kanat', 'tanak', 'tanka'], 'tanaka': ['nataka', 'tanaka'], 'tanala': ['atalan', 'tanala'], 'tanan': ['annat', 'tanan'], 'tanbur': ['tanbur', 'turban'], 'tancel': ['cantle', 'cental', 'lancet', 'tancel'], 'tanchoir': ['anorthic', 'anthroic', 'tanchoir'], 'tandemist': ['misattend', 'tandemist'], 'tandle': ['dental', 'tandle'], 'tandour': ['rotunda', 'tandour'], 'tane': ['ante', 'aten', 'etna', 'nate', 'neat', 'taen', 'tane', 'tean'], 'tang': ['gant', 'gnat', 'tang'], 'tanga': ['ganta', 'tanga'], 'tangaridae': ['tanagridae', 'tangaridae'], 'tangelo': ['angelot', 'tangelo'], 'tanger': ['argent', 'garnet', 'garten', 'tanger'], 'tangerine': ['argentine', 'tangerine'], 'tangfish': ['shafting', 'tangfish'], 'tangi': ['giant', 'tangi', 'tiang'], 'tangibile': ['bigential', 'tangibile'], 'tangible': ['bleating', 'tangible'], 'tangie': ['eating', 'ingate', 'tangie'], 'tangier': ['angrite', 'granite', 'ingrate', 'tangier', 'tearing', 'tigrean'], 'tangle': ['tangle', 'telang'], 'tangling': ['gnatling', 'tangling'], 'tango': ['tango', 'tonga'], 'tangs': ['angst', 'stang', 'tangs'], 'tangue': ['gunate', 'tangue'], 'tangum': ['tangum', 'tugman'], 'tangun': ['tangun', 'tungan'], 'tanh': ['hant', 'tanh', 'than'], 'tanha': ['atnah', 'tanha', 'thana'], 'tania': ['anita', 'niata', 'tania'], 'tanica': ['actian', 'natica', 'tanica'], 'tanier': ['nerita', 'ratine', 'retain', 'retina', 'tanier'], 'tanist': ['astint', 'tanist'], 'tanitic': ['tanitic', 'titanic'], 'tanka': ['kanat', 'tanak', 'tanka'], 'tankle': ['anklet', 'lanket', 'tankle'], 'tanling': ['antling', 'tanling'], 'tannaic': ['cantina', 'tannaic'], 'tannase': ['annates', 'tannase'], 'tannogallate': ['gallotannate', 'tannogallate'], 'tannogallic': ['gallotannic', 'tannogallic'], 'tannogen': ['nonagent', 'tannogen'], 'tanproof': ['antproof', 'tanproof'], 'tanquen': ['quannet', 'tanquen'], 'tanrec': ['canter', 'creant', 'cretan', 'nectar', 'recant', 'tanrec', 'trance'], 'tansy': ['nasty', 'styan', 'tansy'], 'tantalean': ['antenatal', 'atlantean', 'tantalean'], 'tantalic': ['atlantic', 'tantalic'], 'tantalite': ['atlantite', 'tantalite'], 'tantara': ['tantara', 'tartana'], 'tantarara': ['tantarara', 'tarantara'], 'tanti': ['taint', 'tanti', 'tinta', 'titan'], 'tantle': ['latent', 'latten', 'nattle', 'talent', 'tantle'], 'tantra': ['rattan', 'tantra', 'tartan'], 'tantrism': ['tantrism', 'transmit'], 'tantum': ['mutant', 'tantum', 'tutman'], 'tanzeb': ['batzen', 'bezant', 'tanzeb'], 'tao': ['oat', 'tao', 'toa'], 'taoistic': ['iotacist', 'taoistic'], 'taos': ['oast', 'stoa', 'taos'], 'tap': ['apt', 'pat', 'tap'], 'tapa': ['atap', 'pata', 'tapa'], 'tapalo': ['patola', 'tapalo'], 'tapas': ['patas', 'tapas'], 'tape': ['pate', 'peat', 'tape', 'teap'], 'tapeline': ['petaline', 'tapeline'], 'tapeman': ['peatman', 'tapeman'], 'tapen': ['enapt', 'paten', 'penta', 'tapen'], 'taper': ['apert', 'pater', 'peart', 'prate', 'taper', 'terap'], 'tapered': ['padtree', 'predate', 'tapered'], 'tapering': ['partigen', 'tapering'], 'taperly': ['apertly', 'peartly', 'platery', 'pteryla', 'taperly'], 'taperness': ['apertness', 'peartness', 'taperness'], 'tapestring': ['spattering', 'tapestring'], 'tapestry': ['tapestry', 'tryptase'], 'tapet': ['patte', 'tapet'], 'tapete': ['pattee', 'tapete'], 'taphouse': ['outshape', 'taphouse'], 'taphria': ['pitarah', 'taphria'], 'taphrina': ['parthian', 'taphrina'], 'tapir': ['atrip', 'tapir'], 'tapiro': ['portia', 'tapiro'], 'tapirus': ['tapirus', 'upstair'], 'tapis': ['piast', 'stipa', 'tapis'], 'taplash': ['asphalt', 'spathal', 'taplash'], 'tapmost': ['tapmost', 'topmast'], 'tapnet': ['patent', 'patten', 'tapnet'], 'tapoa': ['opata', 'patao', 'tapoa'], 'taposa': ['sapota', 'taposa'], 'taproom': ['protoma', 'taproom'], 'taproot': ['potator', 'taproot'], 'taps': ['past', 'spat', 'stap', 'taps'], 'tapster': ['spatter', 'tapster'], 'tapu': ['patu', 'paut', 'tapu'], 'tapuyo': ['outpay', 'tapuyo'], 'taqua': ['quata', 'taqua'], 'tar': ['art', 'rat', 'tar', 'tra'], 'tara': ['rata', 'taar', 'tara'], 'taraf': ['taraf', 'tarfa'], 'tarai': ['arati', 'atria', 'riata', 'tarai', 'tiara'], 'taranchi': ['taranchi', 'thracian'], 'tarantara': ['tantarara', 'tarantara'], 'tarapin': ['patarin', 'tarapin'], 'tarasc': ['castra', 'tarasc'], 'tarbet': ['batter', 'bertat', 'tabret', 'tarbet'], 'tardle': ['dartle', 'tardle'], 'tardy': ['tardy', 'trady'], 'tare': ['rate', 'tare', 'tear', 'tera'], 'tarente': ['entreat', 'ratteen', 'tarente', 'ternate', 'tetrane'], 'tarentine': ['entertain', 'tarentine', 'terentian'], 'tarfa': ['taraf', 'tarfa'], 'targe': ['gater', 'grate', 'great', 'greta', 'retag', 'targe'], 'targeman': ['grateman', 'mangrate', 'mentagra', 'targeman'], 'targer': ['garret', 'garter', 'grater', 'targer'], 'target': ['gatter', 'target'], 'targetman': ['targetman', 'termagant'], 'targum': ['artgum', 'targum'], 'tarheel': ['leather', 'tarheel'], 'tarheeler': ['leatherer', 'releather', 'tarheeler'], 'tari': ['airt', 'rita', 'tari', 'tiar'], 'tarie': ['arite', 'artie', 'irate', 'retia', 'tarie'], 'tarin': ['riant', 'tairn', 'tarin', 'train'], 'tarish': ['rashti', 'tarish'], 'tarletan': ['alterant', 'tarletan'], 'tarlike': ['artlike', 'ratlike', 'tarlike'], 'tarmac': ['mactra', 'tarmac'], 'tarman': ['mantra', 'tarman'], 'tarmi': ['mitra', 'tarmi', 'timar', 'tirma'], 'tarn': ['natr', 'rant', 'tarn', 'tran'], 'tarnal': ['antral', 'tarnal'], 'tarnish': ['tarnish', 'trishna'], 'tarnside': ['stradine', 'strained', 'tarnside'], 'taro': ['rota', 'taro', 'tora'], 'taroc': ['actor', 'corta', 'croat', 'rocta', 'taroc', 'troca'], 'tarocco': ['coactor', 'tarocco'], 'tarok': ['kotar', 'tarok'], 'tarot': ['ottar', 'tarot', 'torta', 'troat'], 'tarp': ['part', 'prat', 'rapt', 'tarp', 'trap'], 'tarpan': ['partan', 'tarpan'], 'tarpaulin': ['tarpaulin', 'unpartial'], 'tarpeian': ['patarine', 'tarpeian'], 'tarpon': ['patron', 'tarpon'], 'tarquin': ['quatrin', 'tarquin'], 'tarragon': ['arrogant', 'tarragon'], 'tarred': ['darter', 'dartre', 'redart', 'retard', 'retrad', 'tarred', 'trader'], 'tarrer': ['tarrer', 'terrar'], 'tarriance': ['antiracer', 'tarriance'], 'tarrie': ['arriet', 'tarrie'], 'tars': ['sart', 'star', 'stra', 'tars', 'tsar'], 'tarsal': ['astral', 'tarsal'], 'tarsale': ['alaster', 'tarsale'], 'tarsalgia': ['astragali', 'tarsalgia'], 'tarse': ['aster', 'serta', 'stare', 'strae', 'tarse', 'teras'], 'tarsi': ['arist', 'astir', 'sitar', 'stair', 'stria', 'tarsi', 'tisar', 'trias'], 'tarsia': ['arista', 'tarsia'], 'tarsier': ['astrier', 'tarsier'], 'tarsipes': ['piratess', 'serapist', 'tarsipes'], 'tarsitis': ['satirist', 'tarsitis'], 'tarsome': ['maestro', 'tarsome'], 'tarsonemid': ['mosandrite', 'tarsonemid'], 'tarsonemus': ['sarmentous', 'tarsonemus'], 'tarsus': ['rastus', 'tarsus'], 'tartan': ['rattan', 'tantra', 'tartan'], 'tartana': ['tantara', 'tartana'], 'tartaret': ['tartaret', 'tartrate'], 'tartarin': ['tartarin', 'triratna'], 'tartarous': ['saturator', 'tartarous'], 'tarten': ['attern', 'natter', 'ratten', 'tarten'], 'tartish': ['athirst', 'rattish', 'tartish'], 'tartle': ['artlet', 'latter', 'rattle', 'tartle', 'tatler'], 'tartlet': ['tartlet', 'tattler'], 'tartly': ['rattly', 'tartly'], 'tartrate': ['tartaret', 'tartrate'], 'taruma': ['taruma', 'trauma'], 'tarve': ['avert', 'tarve', 'taver', 'trave'], 'tarweed': ['dewater', 'tarweed', 'watered'], 'tarwood': ['ratwood', 'tarwood'], 'taryba': ['baryta', 'taryba'], 'tasco': ['ascot', 'coast', 'costa', 'tacso', 'tasco'], 'tash': ['shat', 'tash'], 'tasheriff': ['fireshaft', 'tasheriff'], 'tashie': ['saithe', 'tashie', 'teaish'], 'tashrif': ['ratfish', 'tashrif'], 'tasian': ['astian', 'tasian'], 'tasimetry': ['myristate', 'tasimetry'], 'task': ['skat', 'task'], 'tasker': ['skater', 'staker', 'strake', 'streak', 'tasker'], 'taslet': ['latest', 'sattle', 'taslet'], 'tasmanite': ['emanatist', 'staminate', 'tasmanite'], 'tassah': ['shasta', 'tassah'], 'tasse': ['asset', 'tasse'], 'tassel': ['lasset', 'tassel'], 'tasseler': ['rateless', 'tasseler', 'tearless', 'tesseral'], 'tasser': ['assert', 'tasser'], 'tassie': ['siesta', 'tassie'], 'tastable': ['statable', 'tastable'], 'taste': ['state', 'taste', 'tates', 'testa'], 'tasted': ['stated', 'tasted'], 'tasteful': ['stateful', 'tasteful'], 'tastefully': ['statefully', 'tastefully'], 'tastefulness': ['statefulness', 'tastefulness'], 'tasteless': ['stateless', 'tasteless'], 'taster': ['stater', 'taster', 'testar'], 'tasu': ['saut', 'tasu', 'utas'], 'tatar': ['attar', 'tatar'], 'tatarize': ['tatarize', 'zaratite'], 'tatchy': ['chatty', 'tatchy'], 'tate': ['etta', 'tate', 'teat'], 'tater': ['atter', 'tater', 'teart', 'tetra', 'treat'], 'tates': ['state', 'taste', 'tates', 'testa'], 'tath': ['hatt', 'tath', 'that'], 'tatian': ['attain', 'tatian'], 'tatler': ['artlet', 'latter', 'rattle', 'tartle', 'tatler'], 'tatterly': ['tatterly', 'tattlery'], 'tattler': ['tartlet', 'tattler'], 'tattlery': ['tatterly', 'tattlery'], 'tatu': ['tatu', 'taut'], 'tau': ['tau', 'tua', 'uta'], 'taube': ['butea', 'taube', 'tubae'], 'taula': ['aluta', 'taula'], 'taum': ['muta', 'taum'], 'taun': ['antu', 'aunt', 'naut', 'taun', 'tuan', 'tuna'], 'taungthu': ['taungthu', 'untaught'], 'taupe': ['taupe', 'upeat'], 'taupo': ['apout', 'taupo'], 'taur': ['ruta', 'taur'], 'taurean': ['taurean', 'uranate'], 'tauric': ['tauric', 'uratic', 'urtica'], 'taurine': ['ruinate', 'taurine', 'uranite', 'urinate'], 'taurocol': ['outcarol', 'taurocol'], 'taut': ['tatu', 'taut'], 'tauten': ['attune', 'nutate', 'tauten'], 'tautomeric': ['autometric', 'tautomeric'], 'tautomery': ['autometry', 'tautomery'], 'tav': ['tav', 'vat'], 'tavast': ['sattva', 'tavast'], 'tave': ['tave', 'veta'], 'taver': ['avert', 'tarve', 'taver', 'trave'], 'tavers': ['starve', 'staver', 'strave', 'tavers', 'versta'], 'tavert': ['tavert', 'vatter'], 'tavola': ['tavola', 'volata'], 'taw': ['taw', 'twa', 'wat'], 'tawa': ['awat', 'tawa'], 'tawer': ['tawer', 'water', 'wreat'], 'tawery': ['tawery', 'watery'], 'tawite': ['tawite', 'tawtie', 'twaite'], 'tawn': ['nawt', 'tawn', 'want'], 'tawny': ['tawny', 'wanty'], 'taws': ['sawt', 'staw', 'swat', 'taws', 'twas', 'wast'], 'tawse': ['awest', 'sweat', 'tawse', 'waste'], 'tawtie': ['tawite', 'tawtie', 'twaite'], 'taxed': ['detax', 'taxed'], 'taxer': ['extra', 'retax', 'taxer'], 'tay': ['tay', 'yat'], 'tayer': ['tayer', 'teary'], 'tchai': ['aitch', 'chait', 'chati', 'chita', 'taich', 'tchai'], 'tche': ['chet', 'etch', 'tche', 'tech'], 'tchi': ['chit', 'itch', 'tchi'], 'tchu': ['chut', 'tchu', 'utch'], 'tchwi': ['tchwi', 'wicht', 'witch'], 'tea': ['ate', 'eat', 'eta', 'tae', 'tea'], 'teaberry': ['betrayer', 'eatberry', 'rebetray', 'teaberry'], 'teaboy': ['betoya', 'teaboy'], 'teacart': ['caretta', 'teacart', 'tearcat'], 'teach': ['cheat', 'tache', 'teach', 'theca'], 'teachable': ['cheatable', 'teachable'], 'teachableness': ['cheatableness', 'teachableness'], 'teache': ['achete', 'hecate', 'teache', 'thecae'], 'teacher': ['cheater', 'hectare', 'recheat', 'reteach', 'teacher'], 'teachery': ['cheatery', 'cytherea', 'teachery'], 'teaching': ['cheating', 'teaching'], 'teachingly': ['cheatingly', 'teachingly'], 'teachless': ['tacheless', 'teachless'], 'tead': ['adet', 'date', 'tade', 'tead', 'teda'], 'teaer': ['arete', 'eater', 'teaer'], 'teagle': ['eaglet', 'legate', 'teagle', 'telega'], 'teaish': ['saithe', 'tashie', 'teaish'], 'teaism': ['samite', 'semita', 'tamise', 'teaism'], 'teak': ['kate', 'keta', 'take', 'teak'], 'teal': ['atle', 'laet', 'late', 'leat', 'tael', 'tale', 'teal'], 'team': ['mate', 'meat', 'meta', 'tame', 'team', 'tema'], 'teamer': ['reetam', 'retame', 'teamer'], 'teaming': ['mintage', 'teaming', 'tegmina'], 'teamless': ['mateless', 'meatless', 'tameless', 'teamless'], 'teamman': ['meatman', 'teamman'], 'teamster': ['teamster', 'trametes'], 'tean': ['ante', 'aten', 'etna', 'nate', 'neat', 'taen', 'tane', 'tean'], 'teanal': ['anteal', 'lanate', 'teanal'], 'teap': ['pate', 'peat', 'tape', 'teap'], 'teapot': ['aptote', 'optate', 'potate', 'teapot'], 'tear': ['rate', 'tare', 'tear', 'tera'], 'tearable': ['elabrate', 'tearable'], 'tearably': ['betrayal', 'tearably'], 'tearcat': ['caretta', 'teacart', 'tearcat'], 'teardown': ['danewort', 'teardown'], 'teardrop': ['predator', 'protrade', 'teardrop'], 'tearer': ['rerate', 'retare', 'tearer'], 'tearful': ['faulter', 'refutal', 'tearful'], 'tearing': ['angrite', 'granite', 'ingrate', 'tangier', 'tearing', 'tigrean'], 'tearless': ['rateless', 'tasseler', 'tearless', 'tesseral'], 'tearlike': ['keralite', 'tearlike'], 'tearpit': ['partite', 'tearpit'], 'teart': ['atter', 'tater', 'teart', 'tetra', 'treat'], 'teary': ['tayer', 'teary'], 'teasably': ['stayable', 'teasably'], 'tease': ['setae', 'tease'], 'teasel': ['ateles', 'saltee', 'sealet', 'stelae', 'teasel'], 'teaser': ['asteer', 'easter', 'eastre', 'reseat', 'saeter', 'seater', 'staree', 'teaser', 'teresa'], 'teasing': ['easting', 'gainset', 'genista', 'ingesta', 'seating', 'signate', 'teasing'], 'teasler': ['realest', 'reslate', 'resteal', 'stealer', 'teasler'], 'teasy': ['teasy', 'yeast'], 'teat': ['etta', 'tate', 'teat'], 'teather': ['teather', 'theater', 'thereat'], 'tebu': ['bute', 'tebu', 'tube'], 'teca': ['cate', 'teca'], 'tecali': ['calite', 'laetic', 'tecali'], 'tech': ['chet', 'etch', 'tche', 'tech'], 'techily': ['ethylic', 'techily'], 'technica': ['atechnic', 'catechin', 'technica'], 'technocracy': ['conycatcher', 'technocracy'], 'technopsychology': ['psychotechnology', 'technopsychology'], 'techous': ['souchet', 'techous', 'tousche'], 'techy': ['techy', 'tyche'], 'tecla': ['cleat', 'eclat', 'ectal', 'lacet', 'tecla'], 'teco': ['cote', 'teco'], 'tecoma': ['comate', 'metoac', 'tecoma'], 'tecomin': ['centimo', 'entomic', 'tecomin'], 'tecon': ['cento', 'conte', 'tecon'], 'tectal': ['cattle', 'tectal'], 'tectology': ['ctetology', 'tectology'], 'tectona': ['oncetta', 'tectona'], 'tectospinal': ['entoplastic', 'spinotectal', 'tectospinal', 'tenoplastic'], 'tecuma': ['acetum', 'tecuma'], 'tecuna': ['tecuna', 'uncate'], 'teda': ['adet', 'date', 'tade', 'tead', 'teda'], 'tedious': ['outside', 'tedious'], 'tediousness': ['outsideness', 'tediousness'], 'teedle': ['delete', 'teedle'], 'teel': ['leet', 'lete', 'teel', 'tele'], 'teem': ['meet', 'mete', 'teem'], 'teemer': ['meeter', 'remeet', 'teemer'], 'teeming': ['meeting', 'teeming', 'tegmine'], 'teems': ['teems', 'temse'], 'teen': ['neet', 'nete', 'teen'], 'teens': ['steen', 'teens', 'tense'], 'teer': ['reet', 'teer', 'tree'], 'teerer': ['retree', 'teerer'], 'teest': ['teest', 'teste'], 'teet': ['teet', 'tete'], 'teeter': ['teeter', 'terete'], 'teeth': ['teeth', 'theet'], 'teething': ['genthite', 'teething'], 'teg': ['get', 'teg'], 'tegean': ['geneat', 'negate', 'tegean'], 'tegmina': ['mintage', 'teaming', 'tegmina'], 'tegminal': ['ligament', 'metaling', 'tegminal'], 'tegmine': ['meeting', 'teeming', 'tegmine'], 'tegular': ['gaulter', 'tegular'], 'teheran': ['earthen', 'enheart', 'hearten', 'naether', 'teheran', 'traheen'], 'tehsildar': ['heraldist', 'tehsildar'], 'teian': ['entia', 'teian', 'tenai', 'tinea'], 'teicher': ['erethic', 'etheric', 'heretic', 'heteric', 'teicher'], 'teil': ['lite', 'teil', 'teli', 'tile'], 'teind': ['detin', 'teind', 'tined'], 'teinder': ['nitered', 'redient', 'teinder'], 'teinland': ['dentinal', 'teinland', 'tendinal'], 'teioid': ['iodite', 'teioid'], 'teju': ['jute', 'teju'], 'telamon': ['omental', 'telamon'], 'telang': ['tangle', 'telang'], 'telar': ['alert', 'alter', 'artel', 'later', 'ratel', 'taler', 'telar'], 'telarian': ['retainal', 'telarian'], 'telary': ['lyrate', 'raylet', 'realty', 'telary'], 'tele': ['leet', 'lete', 'teel', 'tele'], 'telecast': ['castelet', 'telecast'], 'telega': ['eaglet', 'legate', 'teagle', 'telega'], 'telegn': ['gentle', 'telegn'], 'telegrapher': ['retelegraph', 'telegrapher'], 'telei': ['elite', 'telei'], 'telephone': ['phenetole', 'telephone'], 'telephony': ['polythene', 'telephony'], 'telephotograph': ['phototelegraph', 'telephotograph'], 'telephotographic': ['phototelegraphic', 'telephotographic'], 'telephotography': ['phototelegraphy', 'telephotography'], 'teleradiophone': ['radiotelephone', 'teleradiophone'], 'teleran': ['alterne', 'enteral', 'eternal', 'teleran', 'teneral'], 'teleseism': ['messelite', 'semisteel', 'teleseism'], 'telespectroscope': ['spectrotelescope', 'telespectroscope'], 'telestereoscope': ['stereotelescope', 'telestereoscope'], 'telestial': ['satellite', 'telestial'], 'telestic': ['telestic', 'testicle'], 'telfer': ['felter', 'telfer', 'trefle'], 'teli': ['lite', 'teil', 'teli', 'tile'], 'telial': ['taille', 'telial'], 'telic': ['clite', 'telic'], 'telinga': ['atingle', 'gelatin', 'genital', 'langite', 'telinga'], 'tellach': ['hellcat', 'tellach'], 'teller': ['retell', 'teller'], 'tellima': ['mitella', 'tellima'], 'tellina': ['nitella', 'tellina'], 'tellurian': ['tellurian', 'unliteral'], 'telome': ['omelet', 'telome'], 'telonism': ['melonist', 'telonism'], 'telopsis': ['polistes', 'telopsis'], 'telpath': ['pathlet', 'telpath'], 'telson': ['solent', 'stolen', 'telson'], 'telsonic': ['lentisco', 'telsonic'], 'telt': ['lett', 'telt'], 'tema': ['mate', 'meat', 'meta', 'tame', 'team', 'tema'], 'teman': ['ament', 'meant', 'teman'], 'temin': ['metin', 'temin', 'timne'], 'temp': ['empt', 'temp'], 'tempean': ['peteman', 'tempean'], 'temper': ['temper', 'tempre'], 'tempera': ['premate', 'tempera'], 'temperer': ['retemper', 'temperer'], 'temperish': ['herpetism', 'metership', 'metreship', 'temperish'], 'templar': ['templar', 'trample'], 'template': ['palmette', 'template'], 'temple': ['pelmet', 'temple'], 'tempora': ['pteroma', 'tempora'], 'temporarily': ['polarimetry', 'premorality', 'temporarily'], 'temporofrontal': ['frontotemporal', 'temporofrontal'], 'temporooccipital': ['occipitotemporal', 'temporooccipital'], 'temporoparietal': ['parietotemporal', 'temporoparietal'], 'tempre': ['temper', 'tempre'], 'tempter': ['retempt', 'tempter'], 'temse': ['teems', 'temse'], 'temser': ['mester', 'restem', 'temser', 'termes'], 'temulent': ['temulent', 'unmettle'], 'ten': ['net', 'ten'], 'tenable': ['beltane', 'tenable'], 'tenace': ['cetane', 'tenace'], 'tenai': ['entia', 'teian', 'tenai', 'tinea'], 'tenanter': ['retenant', 'tenanter'], 'tenantless': ['latentness', 'tenantless'], 'tencteri': ['reticent', 'tencteri'], 'tend': ['dent', 'tend'], 'tender': ['denter', 'rented', 'tender'], 'tenderer': ['retender', 'tenderer'], 'tenderish': ['disherent', 'hinderest', 'tenderish'], 'tendinal': ['dentinal', 'teinland', 'tendinal'], 'tendinitis': ['dentinitis', 'tendinitis'], 'tendour': ['tendour', 'unroted'], 'tendril': ['tendril', 'trindle'], 'tendron': ['donnert', 'tendron'], 'teneral': ['alterne', 'enteral', 'eternal', 'teleran', 'teneral'], 'teneriffe': ['fifteener', 'teneriffe'], 'tenesmus': ['muteness', 'tenesmus'], 'teng': ['gent', 'teng'], 'tengu': ['tengu', 'unget'], 'teniacidal': ['acetanilid', 'laciniated', 'teniacidal'], 'teniacide': ['deciatine', 'diacetine', 'taenicide', 'teniacide'], 'tenible': ['beltine', 'tenible'], 'tenino': ['intone', 'tenino'], 'tenline': ['lenient', 'tenline'], 'tenner': ['rennet', 'tenner'], 'tennis': ['innest', 'sennit', 'sinnet', 'tennis'], 'tenomyotomy': ['myotenotomy', 'tenomyotomy'], 'tenon': ['nonet', 'tenon'], 'tenoner': ['enteron', 'tenoner'], 'tenonian': ['annotine', 'tenonian'], 'tenonitis': ['sentition', 'tenonitis'], 'tenontophyma': ['nematophyton', 'tenontophyma'], 'tenophyte': ['entophyte', 'tenophyte'], 'tenoplastic': ['entoplastic', 'spinotectal', 'tectospinal', 'tenoplastic'], 'tenor': ['noter', 'tenor', 'toner', 'trone'], 'tenorist': ['ortstein', 'tenorist'], 'tenovaginitis': ['investigation', 'tenovaginitis'], 'tenpin': ['pinnet', 'tenpin'], 'tenrec': ['center', 'recent', 'tenrec'], 'tense': ['steen', 'teens', 'tense'], 'tensible': ['nebelist', 'stilbene', 'tensible'], 'tensile': ['leisten', 'setline', 'tensile'], 'tension': ['stenion', 'tension'], 'tensional': ['alstonine', 'tensional'], 'tensive': ['estevin', 'tensive'], 'tenson': ['sonnet', 'stonen', 'tenson'], 'tensor': ['nestor', 'sterno', 'stoner', 'strone', 'tensor'], 'tentable': ['nettable', 'tentable'], 'tentacle': ['ectental', 'tentacle'], 'tentage': ['genetta', 'tentage'], 'tentation': ['attention', 'tentation'], 'tentative': ['attentive', 'tentative'], 'tentatively': ['attentively', 'tentatively'], 'tentativeness': ['attentiveness', 'tentativeness'], 'tented': ['detent', 'netted', 'tented'], 'tenter': ['netter', 'retent', 'tenter'], 'tention': ['nettion', 'tention', 'tontine'], 'tentorial': ['natrolite', 'tentorial'], 'tenty': ['netty', 'tenty'], 'tenuiroster': ['tenuiroster', 'urosternite'], 'tenuistriate': ['intersituate', 'tenuistriate'], 'tenure': ['neuter', 'retune', 'runtee', 'tenure', 'tureen'], 'tenurial': ['lutrinae', 'retinula', 'rutelian', 'tenurial'], 'teocalli': ['colletia', 'teocalli'], 'teosinte': ['noisette', 'teosinte'], 'tepache': ['heptace', 'tepache'], 'tepal': ['leapt', 'palet', 'patel', 'pelta', 'petal', 'plate', 'pleat', 'tepal'], 'tepanec': ['pentace', 'tepanec'], 'tepecano': ['conepate', 'tepecano'], 'tephrite': ['perthite', 'tephrite'], 'tephritic': ['perthitic', 'tephritic'], 'tephroite': ['heptorite', 'tephroite'], 'tephrosis': ['posterish', 'prothesis', 'sophister', 'storeship', 'tephrosis'], 'tepor': ['poter', 'prote', 'repot', 'tepor', 'toper', 'trope'], 'tequila': ['liquate', 'tequila'], 'tera': ['rate', 'tare', 'tear', 'tera'], 'teraglin': ['integral', 'teraglin', 'triangle'], 'terap': ['apert', 'pater', 'peart', 'prate', 'taper', 'terap'], 'teras': ['aster', 'serta', 'stare', 'strae', 'tarse', 'teras'], 'teratism': ['mistreat', 'teratism'], 'terbia': ['baiter', 'barite', 'rebait', 'terbia'], 'terbium': ['burmite', 'imbrute', 'terbium'], 'tercelet': ['electret', 'tercelet'], 'terceron': ['corrente', 'terceron'], 'tercia': ['acrite', 'arcite', 'tercia', 'triace', 'tricae'], 'tercine': ['citrene', 'enteric', 'enticer', 'tercine'], 'tercio': ['erotic', 'tercio'], 'terebilic': ['celtiberi', 'terebilic'], 'terebinthian': ['terebinthian', 'terebinthina'], 'terebinthina': ['terebinthian', 'terebinthina'], 'terebra': ['rebater', 'terebra'], 'terebral': ['barrelet', 'terebral'], 'terentian': ['entertain', 'tarentine', 'terentian'], 'teresa': ['asteer', 'easter', 'eastre', 'reseat', 'saeter', 'seater', 'staree', 'teaser', 'teresa'], 'teresian': ['arsenite', 'resinate', 'teresian', 'teresina'], 'teresina': ['arsenite', 'resinate', 'teresian', 'teresina'], 'terete': ['teeter', 'terete'], 'teretial': ['laterite', 'literate', 'teretial'], 'tereus': ['retuse', 'tereus'], 'tergal': ['raglet', 'tergal'], 'tergant': ['garnett', 'gnatter', 'gratten', 'tergant'], 'tergeminous': ['mentigerous', 'tergeminous'], 'teri': ['iter', 'reit', 'rite', 'teri', 'tier', 'tire'], 'teriann': ['entrain', 'teriann'], 'terma': ['armet', 'mater', 'merat', 'metra', 'ramet', 'tamer', 'terma', 'trame', 'trema'], 'termagant': ['targetman', 'termagant'], 'termes': ['mester', 'restem', 'temser', 'termes'], 'termin': ['minter', 'remint', 'termin'], 'terminal': ['terminal', 'tramline'], 'terminalia': ['laminarite', 'terminalia'], 'terminate': ['antimeter', 'attermine', 'interteam', 'terminate', 'tetramine'], 'termini': ['interim', 'termini'], 'terminine': ['intermine', 'nemertini', 'terminine'], 'terminus': ['numerist', 'terminus'], 'termital': ['remittal', 'termital'], 'termite': ['emitter', 'termite'], 'termly': ['myrtle', 'termly'], 'termon': ['mentor', 'merton', 'termon', 'tormen'], 'termor': ['termor', 'tremor'], 'tern': ['rent', 'tern'], 'terna': ['antre', 'arent', 'retan', 'terna'], 'ternal': ['altern', 'antler', 'learnt', 'rental', 'ternal'], 'ternar': ['arrent', 'errant', 'ranter', 'ternar'], 'ternarious': ['souterrain', 'ternarious', 'trouserian'], 'ternate': ['entreat', 'ratteen', 'tarente', 'ternate', 'tetrane'], 'terne': ['enter', 'neter', 'renet', 'terne', 'treen'], 'ternion': ['intoner', 'ternion'], 'ternlet': ['nettler', 'ternlet'], 'terp': ['pert', 'petr', 'terp'], 'terpane': ['patener', 'pearten', 'petrean', 'terpane'], 'terpeneless': ['repleteness', 'terpeneless'], 'terpin': ['nipter', 'terpin'], 'terpine': ['petrine', 'terpine'], 'terpineol': ['interlope', 'interpole', 'repletion', 'terpineol'], 'terpinol': ['pointrel', 'terpinol'], 'terrace': ['caterer', 'recrate', 'retrace', 'terrace'], 'terraciform': ['crateriform', 'terraciform'], 'terrage': ['greater', 'regrate', 'terrage'], 'terrain': ['arterin', 'retrain', 'terrain', 'trainer'], 'terral': ['retral', 'terral'], 'terrance': ['canterer', 'recanter', 'recreant', 'terrance'], 'terrapin': ['pretrain', 'terrapin'], 'terrar': ['tarrer', 'terrar'], 'terrence': ['centerer', 'recenter', 'recentre', 'terrence'], 'terrene': ['enterer', 'terrene'], 'terret': ['retter', 'terret'], 'terri': ['terri', 'tirer', 'trier'], 'terrier': ['retirer', 'terrier'], 'terrine': ['reinter', 'terrine'], 'terron': ['terron', 'treron', 'troner'], 'terry': ['retry', 'terry'], 'terse': ['ester', 'estre', 'reest', 'reset', 'steer', 'stere', 'stree', 'terse', 'tsere'], 'tersely': ['restyle', 'tersely'], 'tersion': ['oestrin', 'tersion'], 'tertia': ['attire', 'ratite', 'tertia'], 'tertian': ['intreat', 'iterant', 'nitrate', 'tertian'], 'tertiana': ['attainer', 'reattain', 'tertiana'], 'terton': ['rotten', 'terton'], 'tervee': ['revete', 'tervee'], 'terzina': ['retzian', 'terzina'], 'terzo': ['terzo', 'tozer'], 'tesack': ['casket', 'tesack'], 'teskere': ['skeeter', 'teskere'], 'tessella': ['satelles', 'tessella'], 'tesseral': ['rateless', 'tasseler', 'tearless', 'tesseral'], 'test': ['sett', 'stet', 'test'], 'testa': ['state', 'taste', 'tates', 'testa'], 'testable': ['settable', 'testable'], 'testament': ['statement', 'testament'], 'testar': ['stater', 'taster', 'testar'], 'teste': ['teest', 'teste'], 'tested': ['detest', 'tested'], 'testee': ['settee', 'testee'], 'tester': ['retest', 'setter', 'street', 'tester'], 'testes': ['sestet', 'testes', 'tsetse'], 'testicle': ['telestic', 'testicle'], 'testicular': ['testicular', 'trisulcate'], 'testily': ['stylite', 'testily'], 'testing': ['setting', 'testing'], 'teston': ['ostent', 'teston'], 'testor': ['sotter', 'testor'], 'testril': ['litster', 'slitter', 'stilter', 'testril'], 'testy': ['testy', 'tyste'], 'tetanic': ['nictate', 'tetanic'], 'tetanical': ['cantalite', 'lactinate', 'tetanical'], 'tetanoid': ['antidote', 'tetanoid'], 'tetanus': ['tetanus', 'unstate', 'untaste'], 'tetarconid': ['detraction', 'doctrinate', 'tetarconid'], 'tetard': ['tetard', 'tetrad'], 'tetchy': ['chetty', 'tetchy'], 'tete': ['teet', 'tete'], 'tetel': ['ettle', 'tetel'], 'tether': ['hetter', 'tether'], 'tethys': ['stythe', 'tethys'], 'tetra': ['atter', 'tater', 'teart', 'tetra', 'treat'], 'tetracid': ['citrated', 'tetracid', 'tetradic'], 'tetrad': ['tetard', 'tetrad'], 'tetradic': ['citrated', 'tetracid', 'tetradic'], 'tetragonia': ['giornatate', 'tetragonia'], 'tetrahexahedron': ['hexatetrahedron', 'tetrahexahedron'], 'tetrakishexahedron': ['hexakistetrahedron', 'tetrakishexahedron'], 'tetralin': ['tetralin', 'triental'], 'tetramin': ['intermat', 'martinet', 'tetramin'], 'tetramine': ['antimeter', 'attermine', 'interteam', 'terminate', 'tetramine'], 'tetrander': ['retardent', 'tetrander'], 'tetrandrous': ['tetrandrous', 'unrostrated'], 'tetrane': ['entreat', 'ratteen', 'tarente', 'ternate', 'tetrane'], 'tetrao': ['rotate', 'tetrao'], 'tetraodon': ['detonator', 'tetraodon'], 'tetraonine': ['entoretina', 'tetraonine'], 'tetraplous': ['supertotal', 'tetraplous'], 'tetrasporic': ['tetrasporic', 'triceratops'], 'tetraxonia': ['retaxation', 'tetraxonia'], 'tetrical': ['tetrical', 'tractile'], 'tetricous': ['tetricous', 'toreutics'], 'tetronic': ['contrite', 'tetronic'], 'tetrose': ['rosette', 'tetrose'], 'tetterous': ['outstreet', 'tetterous'], 'teucri': ['curite', 'teucri', 'uretic'], 'teucrian': ['anuretic', 'centauri', 'centuria', 'teucrian'], 'teucrin': ['nutrice', 'teucrin'], 'teuk': ['ketu', 'teuk', 'tuke'], 'tew': ['tew', 'wet'], 'tewa': ['tewa', 'twae', 'weta'], 'tewel': ['tewel', 'tweel'], 'tewer': ['rewet', 'tewer', 'twere'], 'tewit': ['tewit', 'twite'], 'tewly': ['tewly', 'wetly'], 'tha': ['aht', 'hat', 'tha'], 'thai': ['hati', 'thai'], 'thais': ['shita', 'thais'], 'thalami': ['hamital', 'thalami'], 'thaler': ['arthel', 'halter', 'lather', 'thaler'], 'thalia': ['hiatal', 'thalia'], 'thaliard': ['hardtail', 'thaliard'], 'thamesis': ['mathesis', 'thamesis'], 'than': ['hant', 'tanh', 'than'], 'thana': ['atnah', 'tanha', 'thana'], 'thanan': ['nathan', 'thanan'], 'thanatism': ['staithman', 'thanatism'], 'thanatotic': ['chattation', 'thanatotic'], 'thane': ['enhat', 'ethan', 'nathe', 'neath', 'thane'], 'thanker': ['rethank', 'thanker'], 'thapes': ['spathe', 'thapes'], 'thar': ['hart', 'rath', 'tahr', 'thar', 'trah'], 'tharen': ['anther', 'nather', 'tharen', 'thenar'], 'tharm': ['tharm', 'thram'], 'thasian': ['ashanti', 'sanhita', 'shaitan', 'thasian'], 'that': ['hatt', 'tath', 'that'], 'thatcher': ['rethatch', 'thatcher'], 'thaw': ['thaw', 'wath', 'what'], 'thawer': ['rethaw', 'thawer', 'wreath'], 'the': ['het', 'the'], 'thea': ['ahet', 'haet', 'hate', 'heat', 'thea'], 'theah': ['heath', 'theah'], 'thearchy': ['hatchery', 'thearchy'], 'theat': ['theat', 'theta'], 'theater': ['teather', 'theater', 'thereat'], 'theatricism': ['chemiatrist', 'chrismatite', 'theatricism'], 'theatropolis': ['strophiolate', 'theatropolis'], 'theatry': ['hattery', 'theatry'], 'theb': ['beth', 'theb'], 'thebaid': ['habited', 'thebaid'], 'theca': ['cheat', 'tache', 'teach', 'theca'], 'thecae': ['achete', 'hecate', 'teache', 'thecae'], 'thecal': ['achtel', 'chalet', 'thecal', 'thecla'], 'thecasporal': ['archapostle', 'thecasporal'], 'thecata': ['attache', 'thecata'], 'thecitis': ['ethicist', 'thecitis', 'theistic'], 'thecla': ['achtel', 'chalet', 'thecal', 'thecla'], 'theer': ['ether', 'rethe', 'theer', 'there', 'three'], 'theet': ['teeth', 'theet'], 'thegn': ['ghent', 'thegn'], 'thegnly': ['lengthy', 'thegnly'], 'theine': ['ethine', 'theine'], 'their': ['ither', 'their'], 'theirn': ['hinter', 'nither', 'theirn'], 'theirs': ['shrite', 'theirs'], 'theism': ['theism', 'themis'], 'theist': ['theist', 'thetis'], 'theistic': ['ethicist', 'thecitis', 'theistic'], 'thema': ['ahmet', 'thema'], 'thematic': ['mathetic', 'thematic'], 'thematist': ['hattemist', 'thematist'], 'themer': ['mether', 'themer'], 'themis': ['theism', 'themis'], 'themistian': ['antitheism', 'themistian'], 'then': ['hent', 'neth', 'then'], 'thenal': ['ethnal', 'hantle', 'lathen', 'thenal'], 'thenar': ['anther', 'nather', 'tharen', 'thenar'], 'theobald': ['bolthead', 'theobald'], 'theocrasia': ['oireachtas', 'theocrasia'], 'theocrat': ['theocrat', 'trochate'], 'theocratic': ['rheotactic', 'theocratic'], 'theodora': ['dorothea', 'theodora'], 'theodore': ['theodore', 'treehood'], 'theogonal': ['halogeton', 'theogonal'], 'theologic': ['ethologic', 'theologic'], 'theological': ['ethological', 'lethologica', 'theological'], 'theologism': ['hemologist', 'theologism'], 'theology': ['ethology', 'theology'], 'theophanic': ['phaethonic', 'theophanic'], 'theophilist': ['philotheist', 'theophilist'], 'theopsychism': ['psychotheism', 'theopsychism'], 'theorbo': ['boother', 'theorbo'], 'theorematic': ['heteratomic', 'theorematic'], 'theoretic': ['heterotic', 'theoretic'], 'theoretician': ['heretication', 'theoretician'], 'theorician': ['antiheroic', 'theorician'], 'theorics': ['chirotes', 'theorics'], 'theorism': ['homerist', 'isotherm', 'otherism', 'theorism'], 'theorist': ['otherist', 'theorist'], 'theorizer': ['rhetorize', 'theorizer'], 'theorum': ['mouther', 'theorum'], 'theotherapy': ['heteropathy', 'theotherapy'], 'therblig': ['blighter', 'therblig'], 'there': ['ether', 'rethe', 'theer', 'there', 'three'], 'thereas': ['thereas', 'theresa'], 'thereat': ['teather', 'theater', 'thereat'], 'therein': ['enherit', 'etherin', 'neither', 'therein'], 'thereness': ['retheness', 'thereness', 'threeness'], 'thereology': ['heterology', 'thereology'], 'theres': ['esther', 'hester', 'theres'], 'theresa': ['thereas', 'theresa'], 'therese': ['sheeter', 'therese'], 'therewithal': ['therewithal', 'whitleather'], 'theriac': ['certhia', 'rhaetic', 'theriac'], 'therial': ['hairlet', 'therial'], 'theriodic': ['dichroite', 'erichtoid', 'theriodic'], 'theriodonta': ['dehortation', 'theriodonta'], 'thermantic': ['intermatch', 'thermantic'], 'thermo': ['mother', 'thermo'], 'thermobarograph': ['barothermograph', 'thermobarograph'], 'thermoelectric': ['electrothermic', 'thermoelectric'], 'thermoelectrometer': ['electrothermometer', 'thermoelectrometer'], 'thermogalvanometer': ['galvanothermometer', 'thermogalvanometer'], 'thermogeny': ['mythogreen', 'thermogeny'], 'thermography': ['mythographer', 'thermography'], 'thermology': ['mythologer', 'thermology'], 'thermos': ['smother', 'thermos'], 'thermotype': ['phytometer', 'thermotype'], 'thermotypic': ['phytometric', 'thermotypic'], 'thermotypy': ['phytometry', 'thermotypy'], 'theroid': ['rhodite', 'theroid'], 'theron': ['hornet', 'nother', 'theron', 'throne'], 'thersitical': ['thersitical', 'trachelitis'], 'these': ['sheet', 'these'], 'thesean': ['sneathe', 'thesean'], 'thesial': ['heliast', 'thesial'], 'thesis': ['shiest', 'thesis'], 'theta': ['theat', 'theta'], 'thetical': ['athletic', 'thetical'], 'thetis': ['theist', 'thetis'], 'thew': ['hewt', 'thew', 'whet'], 'they': ['they', 'yeth'], 'theyre': ['theyre', 'yether'], 'thicken': ['kitchen', 'thicken'], 'thickener': ['kitchener', 'rethicken', 'thickener'], 'thicket': ['chettik', 'thicket'], 'thienyl': ['ethylin', 'thienyl'], 'thig': ['gith', 'thig'], 'thigh': ['hight', 'thigh'], 'thill': ['illth', 'thill'], 'thin': ['hint', 'thin'], 'thing': ['night', 'thing'], 'thingal': ['halting', 'lathing', 'thingal'], 'thingless': ['lightness', 'nightless', 'thingless'], 'thinglet': ['thinglet', 'thlinget'], 'thinglike': ['nightlike', 'thinglike'], 'thingly': ['nightly', 'thingly'], 'thingman': ['nightman', 'thingman'], 'thinker': ['rethink', 'thinker'], 'thio': ['hoit', 'hoti', 'thio'], 'thiocresol': ['holosteric', 'thiocresol'], 'thiol': ['litho', 'thiol', 'tholi'], 'thiolacetic': ['heliotactic', 'thiolacetic'], 'thiophenol': ['lithophone', 'thiophenol'], 'thiopyran': ['phoniatry', 'thiopyran'], 'thirlage': ['litharge', 'thirlage'], 'this': ['hist', 'sith', 'this', 'tshi'], 'thissen': ['sithens', 'thissen'], 'thistle': ['lettish', 'thistle'], 'thlinget': ['thinglet', 'thlinget'], 'tho': ['hot', 'tho'], 'thob': ['both', 'thob'], 'thole': ['helot', 'hotel', 'thole'], 'tholi': ['litho', 'thiol', 'tholi'], 'tholos': ['soloth', 'tholos'], 'thomaean': ['amaethon', 'thomaean'], 'thomasine': ['hematosin', 'thomasine'], 'thomisid': ['isthmoid', 'thomisid'], 'thomsonite': ['monotheist', 'thomsonite'], 'thonder': ['thonder', 'thorned'], 'thonga': ['gnatho', 'thonga'], 'thoo': ['hoot', 'thoo', 'toho'], 'thoom': ['mooth', 'thoom'], 'thoracectomy': ['chromatocyte', 'thoracectomy'], 'thoracic': ['thoracic', 'tocharic', 'trochaic'], 'thoral': ['harlot', 'orthal', 'thoral'], 'thore': ['other', 'thore', 'throe', 'toher'], 'thoric': ['chorti', 'orthic', 'thoric', 'trochi'], 'thorina': ['orthian', 'thorina'], 'thorite': ['hortite', 'orthite', 'thorite'], 'thorn': ['north', 'thorn'], 'thorned': ['thonder', 'thorned'], 'thornhead': ['rhodanthe', 'thornhead'], 'thorny': ['rhyton', 'thorny'], 'thoro': ['ortho', 'thoro'], 'thort': ['thort', 'troth'], 'thos': ['host', 'shot', 'thos', 'tosh'], 'those': ['ethos', 'shote', 'those'], 'thowel': ['howlet', 'thowel'], 'thraces': ['stacher', 'thraces'], 'thracian': ['taranchi', 'thracian'], 'thraep': ['thraep', 'threap'], 'thrain': ['hartin', 'thrain'], 'thram': ['tharm', 'thram'], 'thrang': ['granth', 'thrang'], 'thrasher': ['rethrash', 'thrasher'], 'thrast': ['strath', 'thrast'], 'thraw': ['thraw', 'warth', 'whart', 'wrath'], 'thread': ['dearth', 'hatred', 'rathed', 'thread'], 'threaden': ['adherent', 'headrent', 'neatherd', 'threaden'], 'threader': ['rethread', 'threader'], 'threadworm': ['motherward', 'threadworm'], 'thready': ['hydrate', 'thready'], 'threap': ['thraep', 'threap'], 'threat': ['hatter', 'threat'], 'threatener': ['rethreaten', 'threatener'], 'three': ['ether', 'rethe', 'theer', 'there', 'three'], 'threeling': ['lightener', 'relighten', 'threeling'], 'threeness': ['retheness', 'thereness', 'threeness'], 'threne': ['erthen', 'henter', 'nether', 'threne'], 'threnode': ['dethrone', 'threnode'], 'threnodic': ['chondrite', 'threnodic'], 'threnos': ['shorten', 'threnos'], 'thresher': ['rethresh', 'thresher'], 'thrice': ['cither', 'thrice'], 'thriller': ['rethrill', 'thriller'], 'thripel': ['philter', 'thripel'], 'thripidae': ['rhipidate', 'thripidae'], 'throat': ['athort', 'throat'], 'throb': ['broth', 'throb'], 'throe': ['other', 'thore', 'throe', 'toher'], 'thronal': ['althorn', 'anthrol', 'thronal'], 'throne': ['hornet', 'nother', 'theron', 'throne'], 'throu': ['routh', 'throu'], 'throughout': ['outthrough', 'throughout'], 'throw': ['throw', 'whort', 'worth', 'wroth'], 'throwdown': ['downthrow', 'throwdown'], 'thrower': ['rethrow', 'thrower'], 'throwing': ['ingrowth', 'throwing'], 'throwout': ['outthrow', 'outworth', 'throwout'], 'thrum': ['thrum', 'thurm'], 'thrust': ['struth', 'thrust'], 'thruster': ['rethrust', 'thruster'], 'thuan': ['ahunt', 'haunt', 'thuan', 'unhat'], 'thulr': ['thulr', 'thurl'], 'thunderbearing': ['thunderbearing', 'underbreathing'], 'thunderer': ['rethunder', 'thunderer'], 'thundering': ['thundering', 'underthing'], 'thuoc': ['couth', 'thuoc', 'touch'], 'thurl': ['thulr', 'thurl'], 'thurm': ['thrum', 'thurm'], 'thurse': ['reshut', 'suther', 'thurse', 'tusher'], 'thurt': ['thurt', 'truth'], 'thus': ['shut', 'thus', 'tush'], 'thusness': ['shutness', 'thusness'], 'thwacker': ['thwacker', 'whatreck'], 'thwartover': ['overthwart', 'thwartover'], 'thymelic': ['methylic', 'thymelic'], 'thymetic': ['hymettic', 'thymetic'], 'thymus': ['mythus', 'thymus'], 'thyreogenous': ['heterogynous', 'thyreogenous'], 'thyreohyoid': ['hyothyreoid', 'thyreohyoid'], 'thyreoid': ['hydriote', 'thyreoid'], 'thyreoidal': ['thyreoidal', 'thyroideal'], 'thyreosis': ['oysterish', 'thyreosis'], 'thyris': ['shirty', 'thyris'], 'thyrocricoid': ['cricothyroid', 'thyrocricoid'], 'thyrogenic': ['thyrogenic', 'trichogyne'], 'thyrohyoid': ['hyothyroid', 'thyrohyoid'], 'thyroideal': ['thyreoidal', 'thyroideal'], 'thyroiodin': ['iodothyrin', 'thyroiodin'], 'thyroprivic': ['thyroprivic', 'vitrophyric'], 'thysanopteran': ['parasyntheton', 'thysanopteran'], 'thysel': ['shelty', 'thysel'], 'ti': ['it', 'ti'], 'tiang': ['giant', 'tangi', 'tiang'], 'tiao': ['iota', 'tiao'], 'tiar': ['airt', 'rita', 'tari', 'tiar'], 'tiara': ['arati', 'atria', 'riata', 'tarai', 'tiara'], 'tiarella': ['arillate', 'tiarella'], 'tib': ['bit', 'tib'], 'tibetan': ['bettina', 'tabinet', 'tibetan'], 'tibial': ['bilati', 'tibial'], 'tibiale': ['biliate', 'tibiale'], 'tibiofemoral': ['femorotibial', 'tibiofemoral'], 'tic': ['cit', 'tic'], 'ticca': ['cacti', 'ticca'], 'tice': ['ceti', 'cite', 'tice'], 'ticer': ['citer', 'recti', 'ticer', 'trice'], 'tichodroma': ['chromatoid', 'tichodroma'], 'ticketer': ['reticket', 'ticketer'], 'tickler': ['tickler', 'trickle'], 'tickproof': ['prickfoot', 'tickproof'], 'ticuna': ['anicut', 'nautic', 'ticuna', 'tunica'], 'ticunan': ['ticunan', 'tunican'], 'tid': ['dit', 'tid'], 'tidal': ['datil', 'dital', 'tidal', 'tilda'], 'tiddley': ['lyddite', 'tiddley'], 'tide': ['diet', 'dite', 'edit', 'tide', 'tied'], 'tidely': ['idlety', 'lydite', 'tidely', 'tidley'], 'tiding': ['tiding', 'tingid'], 'tidley': ['idlety', 'lydite', 'tidely', 'tidley'], 'tied': ['diet', 'dite', 'edit', 'tide', 'tied'], 'tien': ['iten', 'neti', 'tien', 'tine'], 'tiepin': ['pinite', 'tiepin'], 'tier': ['iter', 'reit', 'rite', 'teri', 'tier', 'tire'], 'tierce': ['cerite', 'certie', 'recite', 'tierce'], 'tiered': ['dieter', 'tiered'], 'tierer': ['errite', 'reiter', 'retier', 'retire', 'tierer'], 'tiffy': ['fifty', 'tiffy'], 'tifter': ['fitter', 'tifter'], 'tig': ['git', 'tig'], 'tigella': ['tigella', 'tillage'], 'tiger': ['tiger', 'tigre'], 'tigereye': ['geyerite', 'tigereye'], 'tightener': ['retighten', 'tightener'], 'tiglinic': ['lignitic', 'tiglinic'], 'tigre': ['tiger', 'tigre'], 'tigrean': ['angrite', 'granite', 'ingrate', 'tangier', 'tearing', 'tigrean'], 'tigress': ['striges', 'tigress'], 'tigrine': ['igniter', 'ringite', 'tigrine'], 'tigurine': ['intrigue', 'tigurine'], 'tikka': ['katik', 'tikka'], 'tikur': ['tikur', 'turki'], 'til': ['lit', 'til'], 'tilaite': ['italite', 'letitia', 'tilaite'], 'tilda': ['datil', 'dital', 'tidal', 'tilda'], 'tilde': ['tilde', 'tiled'], 'tile': ['lite', 'teil', 'teli', 'tile'], 'tiled': ['tilde', 'tiled'], 'tiler': ['liter', 'tiler'], 'tilery': ['tilery', 'tilyer'], 'tileways': ['sweatily', 'tileways'], 'tileyard': ['dielytra', 'tileyard'], 'tilia': ['itali', 'tilia'], 'tilikum': ['kulimit', 'tilikum'], 'till': ['lilt', 'till'], 'tillable': ['belltail', 'bletilla', 'tillable'], 'tillaea': ['alalite', 'tillaea'], 'tillage': ['tigella', 'tillage'], 'tiller': ['retill', 'rillet', 'tiller'], 'tilmus': ['litmus', 'tilmus'], 'tilpah': ['lapith', 'tilpah'], 'tilter': ['litter', 'tilter', 'titler'], 'tilting': ['tilting', 'titling', 'tlingit'], 'tiltup': ['tiltup', 'uptilt'], 'tilyer': ['tilery', 'tilyer'], 'timable': ['limbate', 'timable', 'timbale'], 'timaeus': ['metusia', 'suimate', 'timaeus'], 'timaline': ['meliatin', 'timaline'], 'timani': ['intima', 'timani'], 'timar': ['mitra', 'tarmi', 'timar', 'tirma'], 'timbal': ['limbat', 'timbal'], 'timbale': ['limbate', 'timable', 'timbale'], 'timber': ['betrim', 'timber', 'timbre'], 'timbered': ['bemitred', 'timbered'], 'timberer': ['retimber', 'timberer'], 'timberlike': ['kimberlite', 'timberlike'], 'timbre': ['betrim', 'timber', 'timbre'], 'time': ['emit', 'item', 'mite', 'time'], 'timecard': ['dermatic', 'timecard'], 'timed': ['demit', 'timed'], 'timeproof': ['miteproof', 'timeproof'], 'timer': ['merit', 'miter', 'mitre', 'remit', 'timer'], 'times': ['metis', 'smite', 'stime', 'times'], 'timesaving': ['negativism', 'timesaving'], 'timework': ['timework', 'worktime'], 'timid': ['dimit', 'timid'], 'timidly': ['mytilid', 'timidly'], 'timidness': ['destinism', 'timidness'], 'timish': ['isthmi', 'timish'], 'timne': ['metin', 'temin', 'timne'], 'timo': ['itmo', 'moit', 'omit', 'timo'], 'timon': ['minot', 'timon', 'tomin'], 'timorese': ['rosetime', 'timorese', 'tiresome'], 'timpani': ['impaint', 'timpani'], 'timpano': ['maintop', 'ptomain', 'tampion', 'timpano'], 'tin': ['nit', 'tin'], 'tina': ['aint', 'anti', 'tain', 'tina'], 'tincal': ['catlin', 'tincal'], 'tinchel': ['linchet', 'tinchel'], 'tinctorial': ['tinctorial', 'trinoctial'], 'tind': ['dint', 'tind'], 'tindal': ['antlid', 'tindal'], 'tindalo': ['itoland', 'talonid', 'tindalo'], 'tinder': ['dirten', 'rident', 'tinder'], 'tindered': ['dendrite', 'tindered'], 'tinderous': ['detrusion', 'tinderous', 'unstoried'], 'tine': ['iten', 'neti', 'tien', 'tine'], 'tinea': ['entia', 'teian', 'tenai', 'tinea'], 'tineal': ['entail', 'tineal'], 'tinean': ['annite', 'innate', 'tinean'], 'tined': ['detin', 'teind', 'tined'], 'tineid': ['indite', 'tineid'], 'tineman': ['mannite', 'tineman'], 'tineoid': ['edition', 'odinite', 'otidine', 'tineoid'], 'tinetare': ['intereat', 'tinetare'], 'tinety': ['entity', 'tinety'], 'tinged': ['nidget', 'tinged'], 'tinger': ['engirt', 'tinger'], 'tingid': ['tiding', 'tingid'], 'tingitidae': ['indigitate', 'tingitidae'], 'tingler': ['ringlet', 'tingler', 'tringle'], 'tinhouse': ['outshine', 'tinhouse'], 'tink': ['knit', 'tink'], 'tinker': ['reknit', 'tinker'], 'tinkerer': ['retinker', 'tinkerer'], 'tinkler': ['tinkler', 'trinkle'], 'tinlet': ['litten', 'tinlet'], 'tinne': ['innet', 'tinne'], 'tinned': ['dentin', 'indent', 'intend', 'tinned'], 'tinner': ['intern', 'tinner'], 'tinnet': ['intent', 'tinnet'], 'tino': ['into', 'nito', 'oint', 'tino'], 'tinoceras': ['atroscine', 'certosina', 'ostracine', 'tinoceras', 'tricosane'], 'tinosa': ['sotnia', 'tinosa'], 'tinsel': ['enlist', 'listen', 'silent', 'tinsel'], 'tinselly': ['silently', 'tinselly'], 'tinta': ['taint', 'tanti', 'tinta', 'titan'], 'tintage': ['attinge', 'tintage'], 'tinter': ['nitter', 'tinter'], 'tintie': ['tintie', 'titien'], 'tintiness': ['insistent', 'tintiness'], 'tinty': ['nitty', 'tinty'], 'tinworker': ['interwork', 'tinworker'], 'tionontates': ['ostentation', 'tionontates'], 'tip': ['pit', 'tip'], 'tipe': ['piet', 'tipe'], 'tipful': ['tipful', 'uplift'], 'tipless': ['pitless', 'tipless'], 'tipman': ['pitman', 'tampin', 'tipman'], 'tipper': ['rippet', 'tipper'], 'tippler': ['ripplet', 'tippler', 'tripple'], 'tipster': ['spitter', 'tipster'], 'tipstock': ['potstick', 'tipstock'], 'tipula': ['tipula', 'tulipa'], 'tiralee': ['atelier', 'tiralee'], 'tire': ['iter', 'reit', 'rite', 'teri', 'tier', 'tire'], 'tired': ['diter', 'tired', 'tried'], 'tiredly': ['tiredly', 'triedly'], 'tiredness': ['dissenter', 'tiredness'], 'tireless': ['riteless', 'tireless'], 'tirelessness': ['ritelessness', 'tirelessness'], 'tiremaid': ['dimetria', 'mitridae', 'tiremaid', 'triamide'], 'tireman': ['minaret', 'raiment', 'tireman'], 'tirer': ['terri', 'tirer', 'trier'], 'tiresmith': ['tiresmith', 'tritheism'], 'tiresome': ['rosetime', 'timorese', 'tiresome'], 'tirma': ['mitra', 'tarmi', 'timar', 'tirma'], 'tirolean': ['oriental', 'relation', 'tirolean'], 'tirolese': ['literose', 'roselite', 'tirolese'], 'tirve': ['rivet', 'tirve', 'tiver'], 'tisane': ['satine', 'tisane'], 'tisar': ['arist', 'astir', 'sitar', 'stair', 'stria', 'tarsi', 'tisar', 'trias'], 'titan': ['taint', 'tanti', 'tinta', 'titan'], 'titaness': ['antistes', 'titaness'], 'titanic': ['tanitic', 'titanic'], 'titano': ['otiant', 'titano'], 'titanocolumbate': ['columbotitanate', 'titanocolumbate'], 'titanofluoride': ['rotundifoliate', 'titanofluoride'], 'titanosaur': ['saturation', 'titanosaur'], 'titanosilicate': ['silicotitanate', 'titanosilicate'], 'titanous': ['outsaint', 'titanous'], 'titanyl': ['nattily', 'titanyl'], 'titar': ['ratti', 'titar', 'trait'], 'titer': ['titer', 'titre', 'trite'], 'tithable': ['hittable', 'tithable'], 'tither': ['hitter', 'tither'], 'tithonic': ['chinotti', 'tithonic'], 'titien': ['tintie', 'titien'], 'titleboard': ['titleboard', 'trilobated'], 'titler': ['litter', 'tilter', 'titler'], 'titling': ['tilting', 'titling', 'tlingit'], 'titrate': ['attrite', 'titrate'], 'titration': ['attrition', 'titration'], 'titre': ['titer', 'titre', 'trite'], 'tiver': ['rivet', 'tirve', 'tiver'], 'tiza': ['itza', 'tiza', 'zati'], 'tlaco': ['lacto', 'tlaco'], 'tlingit': ['tilting', 'titling', 'tlingit'], 'tmesis': ['misset', 'tmesis'], 'toa': ['oat', 'tao', 'toa'], 'toad': ['doat', 'toad', 'toda'], 'toader': ['doater', 'toader'], 'toadflower': ['floodwater', 'toadflower', 'waterflood'], 'toadier': ['roadite', 'toadier'], 'toadish': ['doatish', 'toadish'], 'toady': ['toady', 'today'], 'toadyish': ['toadyish', 'todayish'], 'toag': ['goat', 'toag', 'toga'], 'toast': ['stoat', 'toast'], 'toaster': ['retoast', 'rosetta', 'stoater', 'toaster'], 'toba': ['boat', 'bota', 'toba'], 'tobe': ['bote', 'tobe'], 'tobiah': ['bhotia', 'tobiah'], 'tobine': ['botein', 'tobine'], 'toccata': ['attacco', 'toccata'], 'tocharese': ['escheator', 'tocharese'], 'tocharian': ['archontia', 'tocharian'], 'tocharic': ['thoracic', 'tocharic', 'trochaic'], 'tocher': ['hector', 'rochet', 'tocher', 'troche'], 'toco': ['coot', 'coto', 'toco'], 'tocogenetic': ['geotectonic', 'tocogenetic'], 'tocometer': ['octometer', 'rectotome', 'tocometer'], 'tocsin': ['nostic', 'sintoc', 'tocsin'], 'tod': ['dot', 'tod'], 'toda': ['doat', 'toad', 'toda'], 'today': ['toady', 'today'], 'todayish': ['toadyish', 'todayish'], 'toddle': ['dodlet', 'toddle'], 'tode': ['dote', 'tode', 'toed'], 'todea': ['deota', 'todea'], 'tody': ['doty', 'tody'], 'toecap': ['capote', 'toecap'], 'toed': ['dote', 'tode', 'toed'], 'toeless': ['osselet', 'sestole', 'toeless'], 'toenail': ['alnoite', 'elation', 'toenail'], 'tog': ['got', 'tog'], 'toga': ['goat', 'toag', 'toga'], 'togaed': ['dogate', 'dotage', 'togaed'], 'togalike': ['goatlike', 'togalike'], 'toggel': ['goglet', 'toggel', 'toggle'], 'toggle': ['goglet', 'toggel', 'toggle'], 'togs': ['stog', 'togs'], 'toher': ['other', 'thore', 'throe', 'toher'], 'toho': ['hoot', 'thoo', 'toho'], 'tohunga': ['hangout', 'tohunga'], 'toi': ['ito', 'toi'], 'toil': ['ilot', 'toil'], 'toiler': ['loiter', 'toiler', 'triole'], 'toilet': ['lottie', 'toilet', 'tolite'], 'toiletry': ['toiletry', 'tyrolite'], 'toise': ['sotie', 'toise'], 'tokay': ['otyak', 'tokay'], 'toke': ['keto', 'oket', 'toke'], 'toko': ['koto', 'toko', 'took'], 'tol': ['lot', 'tol'], 'tolamine': ['lomatine', 'tolamine'], 'tolan': ['notal', 'ontal', 'talon', 'tolan', 'tonal'], 'tolane': ['etalon', 'tolane'], 'told': ['dolt', 'told'], 'tole': ['leto', 'lote', 'tole'], 'toledan': ['taloned', 'toledan'], 'toledo': ['toledo', 'toodle'], 'tolerance': ['antrocele', 'coeternal', 'tolerance'], 'tolerancy': ['alectryon', 'tolerancy'], 'tolidine': ['lindoite', 'tolidine'], 'tolite': ['lottie', 'toilet', 'tolite'], 'tollery': ['tollery', 'trolley'], 'tolly': ['tolly', 'tolyl'], 'tolpatch': ['potlatch', 'tolpatch'], 'tolsey': ['tolsey', 'tylose'], 'tolter': ['lotter', 'rottle', 'tolter'], 'tolu': ['lout', 'tolu'], 'toluic': ['coutil', 'toluic'], 'toluifera': ['foliature', 'toluifera'], 'tolyl': ['tolly', 'tolyl'], 'tom': ['mot', 'tom'], 'toma': ['atmo', 'atom', 'moat', 'toma'], 'toman': ['manto', 'toman'], 'tomas': ['atmos', 'stoma', 'tomas'], 'tombac': ['combat', 'tombac'], 'tome': ['mote', 'tome'], 'tomentose': ['metosteon', 'tomentose'], 'tomial': ['lomita', 'tomial'], 'tomin': ['minot', 'timon', 'tomin'], 'tomographic': ['motographic', 'tomographic'], 'tomorn': ['morton', 'tomorn'], 'tomorrow': ['moorwort', 'rootworm', 'tomorrow', 'wormroot'], 'ton': ['not', 'ton'], 'tonal': ['notal', 'ontal', 'talon', 'tolan', 'tonal'], 'tonalitive': ['levitation', 'tonalitive', 'velitation'], 'tonation': ['notation', 'tonation'], 'tone': ['note', 'tone'], 'toned': ['donet', 'noted', 'toned'], 'toneless': ['noteless', 'toneless'], 'tonelessly': ['notelessly', 'tonelessly'], 'tonelessness': ['notelessness', 'tonelessness'], 'toner': ['noter', 'tenor', 'toner', 'trone'], 'tonetic': ['entotic', 'tonetic'], 'tonetics': ['stenotic', 'tonetics'], 'tonga': ['tango', 'tonga'], 'tongan': ['ganton', 'tongan'], 'tongas': ['sontag', 'tongas'], 'tonger': ['geront', 'tonger'], 'tongrian': ['ignorant', 'tongrian'], 'tongs': ['stong', 'tongs'], 'tonicize': ['nicotize', 'tonicize'], 'tonicoclonic': ['clonicotonic', 'tonicoclonic'], 'tonify': ['notify', 'tonify'], 'tonish': ['histon', 'shinto', 'tonish'], 'tonk': ['knot', 'tonk'], 'tonkin': ['inknot', 'tonkin'], 'tonna': ['anton', 'notan', 'tonna'], 'tonological': ['ontological', 'tonological'], 'tonology': ['ontology', 'tonology'], 'tonsorial': ['tonsorial', 'torsional'], 'tonsure': ['snouter', 'tonsure', 'unstore'], 'tonsured': ['tonsured', 'unsorted', 'unstored'], 'tontine': ['nettion', 'tention', 'tontine'], 'tonus': ['notus', 'snout', 'stoun', 'tonus'], 'tony': ['tony', 'yont'], 'too': ['oto', 'too'], 'toodle': ['toledo', 'toodle'], 'took': ['koto', 'toko', 'took'], 'tool': ['loot', 'tool'], 'tooler': ['looter', 'retool', 'rootle', 'tooler'], 'tooling': ['ilongot', 'tooling'], 'toom': ['moot', 'toom'], 'toon': ['onto', 'oont', 'toon'], 'toona': ['naoto', 'toona'], 'toop': ['poot', 'toop', 'topo'], 'toosh': ['shoot', 'sooth', 'sotho', 'toosh'], 'toot': ['otto', 'toot', 'toto'], 'toother': ['retooth', 'toother'], 'toothpick': ['picktooth', 'toothpick'], 'tootler': ['rootlet', 'tootler'], 'top': ['opt', 'pot', 'top'], 'toparch': ['caphtor', 'toparch'], 'topass': ['potass', 'topass'], 'topchrome': ['ectomorph', 'topchrome'], 'tope': ['peto', 'poet', 'pote', 'tope'], 'toper': ['poter', 'prote', 'repot', 'tepor', 'toper', 'trope'], 'topfull': ['plotful', 'topfull'], 'toph': ['phot', 'toph'], 'tophus': ['tophus', 'upshot'], 'topia': ['patio', 'taipo', 'topia'], 'topiarist': ['parotitis', 'topiarist'], 'topic': ['optic', 'picot', 'topic'], 'topical': ['capitol', 'coalpit', 'optical', 'topical'], 'topically': ['optically', 'topically'], 'toplike': ['kitlope', 'potlike', 'toplike'], 'topline': ['pointel', 'pontile', 'topline'], 'topmaker': ['potmaker', 'topmaker'], 'topmaking': ['potmaking', 'topmaking'], 'topman': ['potman', 'tampon', 'topman'], 'topmast': ['tapmost', 'topmast'], 'topo': ['poot', 'toop', 'topo'], 'topographics': ['coprophagist', 'topographics'], 'topography': ['optography', 'topography'], 'topological': ['optological', 'topological'], 'topologist': ['optologist', 'topologist'], 'topology': ['optology', 'topology'], 'toponymal': ['monotypal', 'toponymal'], 'toponymic': ['monotypic', 'toponymic'], 'toponymical': ['monotypical', 'toponymical'], 'topophone': ['optophone', 'topophone'], 'topotype': ['optotype', 'topotype'], 'topple': ['loppet', 'topple'], 'toppler': ['preplot', 'toppler'], 'toprail': ['portail', 'toprail'], 'tops': ['post', 'spot', 'stop', 'tops'], 'topsail': ['apostil', 'topsail'], 'topside': ['deposit', 'topside'], 'topsman': ['postman', 'topsman'], 'topsoil': ['loopist', 'poloist', 'topsoil'], 'topstone': ['potstone', 'topstone'], 'toptail': ['ptilota', 'talipot', 'toptail'], 'toque': ['quote', 'toque'], 'tor': ['ort', 'rot', 'tor'], 'tora': ['rota', 'taro', 'tora'], 'toral': ['latro', 'rotal', 'toral'], 'toran': ['orant', 'rotan', 'toran', 'trona'], 'torbanite': ['abortient', 'torbanite'], 'torcel': ['colter', 'lector', 'torcel'], 'torch': ['chort', 'rotch', 'torch'], 'tore': ['rote', 'tore'], 'tored': ['doter', 'tored', 'trode'], 'torenia': ['otarine', 'torenia'], 'torero': ['reroot', 'rooter', 'torero'], 'toreutics': ['tetricous', 'toreutics'], 'torfel': ['floret', 'forlet', 'lofter', 'torfel'], 'torgot': ['grotto', 'torgot'], 'toric': ['toric', 'troic'], 'torinese': ['serotine', 'torinese'], 'torma': ['amort', 'morat', 'torma'], 'tormen': ['mentor', 'merton', 'termon', 'tormen'], 'tormina': ['amintor', 'tormina'], 'torn': ['torn', 'tron'], 'tornachile': ['chlorinate', 'ectorhinal', 'tornachile'], 'tornado': ['donator', 'odorant', 'tornado'], 'tornal': ['latron', 'lontar', 'tornal'], 'tornaria': ['rotarian', 'tornaria'], 'tornarian': ['narration', 'tornarian'], 'tornese': ['enstore', 'estrone', 'storeen', 'tornese'], 'torney': ['torney', 'tyrone'], 'tornit': ['intort', 'tornit', 'triton'], 'tornus': ['tornus', 'unsort'], 'toro': ['root', 'roto', 'toro'], 'torose': ['seroot', 'sooter', 'torose'], 'torpent': ['portent', 'torpent'], 'torpescent': ['precontest', 'torpescent'], 'torpid': ['torpid', 'tripod'], 'torpify': ['portify', 'torpify'], 'torpor': ['portor', 'torpor'], 'torque': ['quoter', 'roquet', 'torque'], 'torques': ['questor', 'torques'], 'torrubia': ['rubiator', 'torrubia'], 'torsade': ['rosated', 'torsade'], 'torse': ['roset', 'rotse', 'soter', 'stero', 'store', 'torse'], 'torsel': ['relost', 'reslot', 'rostel', 'sterol', 'torsel'], 'torsile': ['estriol', 'torsile'], 'torsion': ['isotron', 'torsion'], 'torsional': ['tonsorial', 'torsional'], 'torsk': ['stork', 'torsk'], 'torso': ['roost', 'torso'], 'torsten': ['snotter', 'stentor', 'torsten'], 'tort': ['tort', 'trot'], 'torta': ['ottar', 'tarot', 'torta', 'troat'], 'torteau': ['outrate', 'outtear', 'torteau'], 'torticone': ['torticone', 'tritocone'], 'tortile': ['lotrite', 'tortile', 'triolet'], 'tortilla': ['littoral', 'tortilla'], 'tortonian': ['intonator', 'tortonian'], 'tortrices': ['tortrices', 'trisector'], 'torture': ['torture', 'trouter', 'tutorer'], 'toru': ['rout', 'toru', 'tour'], 'torula': ['rotula', 'torula'], 'torulaform': ['formulator', 'torulaform'], 'toruliform': ['rotuliform', 'toruliform'], 'torulose': ['outsoler', 'torulose'], 'torulus': ['rotulus', 'torulus'], 'torus': ['roust', 'rusot', 'stour', 'sutor', 'torus'], 'torve': ['overt', 'rovet', 'torve', 'trove', 'voter'], 'tory': ['royt', 'ryot', 'tory', 'troy', 'tyro'], 'toryish': ['history', 'toryish'], 'toryism': ['toryism', 'trisomy'], 'tosephtas': ['posthaste', 'tosephtas'], 'tosh': ['host', 'shot', 'thos', 'tosh'], 'tosher': ['hoster', 'tosher'], 'toshly': ['hostly', 'toshly'], 'toshnail': ['histonal', 'toshnail'], 'toss': ['sots', 'toss'], 'tosser': ['retoss', 'tosser'], 'tossily': ['tossily', 'tylosis'], 'tossup': ['tossup', 'uptoss'], 'tost': ['stot', 'tost'], 'total': ['lotta', 'total'], 'totanine': ['intonate', 'totanine'], 'totaquin': ['quintato', 'totaquin'], 'totchka': ['hattock', 'totchka'], 'totem': ['motet', 'motte', 'totem'], 'toter': ['ortet', 'otter', 'toter'], 'tother': ['hotter', 'tother'], 'toto': ['otto', 'toot', 'toto'], 'toty': ['toty', 'tyto'], 'tou': ['out', 'tou'], 'toucan': ['toucan', 'tucano', 'uncoat'], 'touch': ['couth', 'thuoc', 'touch'], 'toucher': ['retouch', 'toucher'], 'touchily': ['couthily', 'touchily'], 'touchiness': ['couthiness', 'touchiness'], 'touching': ['touching', 'ungothic'], 'touchless': ['couthless', 'touchless'], 'toug': ['gout', 'toug'], 'tough': ['ought', 'tough'], 'toughness': ['oughtness', 'toughness'], 'toup': ['pout', 'toup'], 'tour': ['rout', 'toru', 'tour'], 'tourer': ['retour', 'router', 'tourer'], 'touring': ['outgrin', 'outring', 'routing', 'touring'], 'tourism': ['sumitro', 'tourism'], 'touristy': ['touristy', 'yttrious'], 'tourmalinic': ['latrocinium', 'tourmalinic'], 'tournamental': ['tournamental', 'ultramontane'], 'tourte': ['tourte', 'touter'], 'tousche': ['souchet', 'techous', 'tousche'], 'touser': ['ouster', 'souter', 'touser', 'trouse'], 'tousle': ['lutose', 'solute', 'tousle'], 'touter': ['tourte', 'touter'], 'tovaria': ['aviator', 'tovaria'], 'tow': ['tow', 'two', 'wot'], 'towel': ['owlet', 'towel'], 'tower': ['rowet', 'tower', 'wrote'], 'town': ['nowt', 'town', 'wont'], 'towned': ['towned', 'wonted'], 'towser': ['restow', 'stower', 'towser', 'worset'], 'towy': ['towy', 'yowt'], 'toxemia': ['oximate', 'toxemia'], 'toy': ['toy', 'yot'], 'toyer': ['royet', 'toyer'], 'toyful': ['outfly', 'toyful'], 'toyless': ['systole', 'toyless'], 'toysome': ['myosote', 'toysome'], 'tozer': ['terzo', 'tozer'], 'tra': ['art', 'rat', 'tar', 'tra'], 'trabea': ['abater', 'artabe', 'eartab', 'trabea'], 'trace': ['caret', 'carte', 'cater', 'crate', 'creat', 'creta', 'react', 'recta', 'trace'], 'traceable': ['creatable', 'traceable'], 'tracer': ['arrect', 'carter', 'crater', 'recart', 'tracer'], 'tracheata': ['cathartae', 'tracheata'], 'trachelitis': ['thersitical', 'trachelitis'], 'tracheolaryngotomy': ['laryngotracheotomy', 'tracheolaryngotomy'], 'trachinoid': ['anhidrotic', 'trachinoid'], 'trachitis': ['citharist', 'trachitis'], 'trachle': ['clethra', 'latcher', 'ratchel', 'relatch', 'talcher', 'trachle'], 'trachoma': ['achromat', 'trachoma'], 'trachylinae': ['chatelainry', 'trachylinae'], 'trachyte': ['chattery', 'ratchety', 'trachyte'], 'tracker': ['retrack', 'tracker'], 'trackside': ['sidetrack', 'trackside'], 'tractator': ['attractor', 'tractator'], 'tractile': ['tetrical', 'tractile'], 'tracy': ['carty', 'tracy'], 'trade': ['dater', 'derat', 'detar', 'drate', 'rated', 'trade', 'tread'], 'trader': ['darter', 'dartre', 'redart', 'retard', 'retrad', 'tarred', 'trader'], 'trading': ['darting', 'trading'], 'tradite': ['attired', 'tradite'], 'traditioner': ['retradition', 'traditioner'], 'traditionism': ['mistradition', 'traditionism'], 'traditorship': ['podarthritis', 'traditorship'], 'traducent': ['reductant', 'traducent', 'truncated'], 'trady': ['tardy', 'trady'], 'trag': ['grat', 'trag'], 'tragedial': ['taligrade', 'tragedial'], 'tragicomedy': ['comitragedy', 'tragicomedy'], 'tragulina': ['tragulina', 'triangula'], 'traguline': ['granulite', 'traguline'], 'trah': ['hart', 'rath', 'tahr', 'thar', 'trah'], 'traheen': ['earthen', 'enheart', 'hearten', 'naether', 'teheran', 'traheen'], 'traik': ['kitar', 'krait', 'rakit', 'traik'], 'trail': ['litra', 'trail', 'trial'], 'trailer': ['retiral', 'retrial', 'trailer'], 'trailery': ['literary', 'trailery'], 'trailing': ['ringtail', 'trailing'], 'trailside': ['dialister', 'trailside'], 'train': ['riant', 'tairn', 'tarin', 'train'], 'trainable': ['albertina', 'trainable'], 'trainage': ['antiager', 'trainage'], 'trainboy': ['bonitary', 'trainboy'], 'trained': ['antired', 'detrain', 'randite', 'trained'], 'trainee': ['enteria', 'trainee', 'triaene'], 'trainer': ['arterin', 'retrain', 'terrain', 'trainer'], 'trainless': ['sternalis', 'trainless'], 'trainster': ['restraint', 'retransit', 'trainster', 'transiter'], 'traintime': ['intimater', 'traintime'], 'trainy': ['rytina', 'trainy', 'tyrian'], 'traipse': ['piaster', 'piastre', 'raspite', 'spirate', 'traipse'], 'trait': ['ratti', 'titar', 'trait'], 'tram': ['mart', 'tram'], 'trama': ['matar', 'matra', 'trama'], 'tramal': ['matral', 'tramal'], 'trame': ['armet', 'mater', 'merat', 'metra', 'ramet', 'tamer', 'terma', 'trame', 'trema'], 'trametes': ['teamster', 'trametes'], 'tramline': ['terminal', 'tramline'], 'tramper': ['retramp', 'tramper'], 'trample': ['templar', 'trample'], 'trampoline': ['intemporal', 'trampoline'], 'tran': ['natr', 'rant', 'tarn', 'tran'], 'trance': ['canter', 'creant', 'cretan', 'nectar', 'recant', 'tanrec', 'trance'], 'tranced': ['cantred', 'centrad', 'tranced'], 'trancelike': ['nectarlike', 'trancelike'], 'trankum': ['trankum', 'turkman'], 'transamination': ['transamination', 'transanimation'], 'transanimation': ['transamination', 'transanimation'], 'transept': ['prestant', 'transept'], 'transeptally': ['platysternal', 'transeptally'], 'transformer': ['retransform', 'transformer'], 'transfuge': ['afterguns', 'transfuge'], 'transient': ['instanter', 'transient'], 'transigent': ['astringent', 'transigent'], 'transimpression': ['pretransmission', 'transimpression'], 'transire': ['restrain', 'strainer', 'transire'], 'transit': ['straint', 'transit', 'tristan'], 'transiter': ['restraint', 'retransit', 'trainster', 'transiter'], 'transitive': ['revisitant', 'transitive'], 'transmarine': ['strainerman', 'transmarine'], 'transmit': ['tantrism', 'transmit'], 'transmold': ['landstorm', 'transmold'], 'transoceanic': ['narcaciontes', 'transoceanic'], 'transonic': ['constrain', 'transonic'], 'transpire': ['prestrain', 'transpire'], 'transplanter': ['retransplant', 'transplanter'], 'transportee': ['paternoster', 'prosternate', 'transportee'], 'transporter': ['retransport', 'transporter'], 'transpose': ['patroness', 'transpose'], 'transposer': ['transposer', 'transprose'], 'transprose': ['transposer', 'transprose'], 'trap': ['part', 'prat', 'rapt', 'tarp', 'trap'], 'trapa': ['apart', 'trapa'], 'trapes': ['paster', 'repast', 'trapes'], 'trapfall': ['pratfall', 'trapfall'], 'traphole': ['plethora', 'traphole'], 'trappean': ['apparent', 'trappean'], 'traps': ['spart', 'sprat', 'strap', 'traps'], 'traship': ['harpist', 'traship'], 'trasy': ['satyr', 'stary', 'stray', 'trasy'], 'traulism': ['altruism', 'muralist', 'traulism', 'ultraism'], 'trauma': ['taruma', 'trauma'], 'travale': ['larvate', 'lavaret', 'travale'], 'trave': ['avert', 'tarve', 'taver', 'trave'], 'travel': ['travel', 'varlet'], 'traveler': ['retravel', 'revertal', 'traveler'], 'traversion': ['overstrain', 'traversion'], 'travertine': ['travertine', 'trinervate'], 'travoy': ['travoy', 'votary'], 'tray': ['arty', 'atry', 'tray'], 'treacle': ['electra', 'treacle'], 'tread': ['dater', 'derat', 'detar', 'drate', 'rated', 'trade', 'tread'], 'treader': ['derater', 'retrade', 'retread', 'treader'], 'treading': ['gradient', 'treading'], 'treadle': ['delater', 'related', 'treadle'], 'treason': ['noreast', 'rosetan', 'seatron', 'senator', 'treason'], 'treasonish': ['astonisher', 'reastonish', 'treasonish'], 'treasonist': ['steatornis', 'treasonist'], 'treasonous': ['anoestrous', 'treasonous'], 'treasurer': ['serrature', 'treasurer'], 'treat': ['atter', 'tater', 'teart', 'tetra', 'treat'], 'treatably': ['tabletary', 'treatably'], 'treatee': ['ateeter', 'treatee'], 'treater': ['ettarre', 'retreat', 'treater'], 'treatise': ['estriate', 'treatise'], 'treaty': ['attery', 'treaty', 'yatter'], 'treble': ['belter', 'elbert', 'treble'], 'treculia': ['arculite', 'cutleria', 'lucretia', 'reticula', 'treculia'], 'tree': ['reet', 'teer', 'tree'], 'treed': ['deter', 'treed'], 'treeful': ['fleuret', 'treeful'], 'treehood': ['theodore', 'treehood'], 'treemaker': ['marketeer', 'treemaker'], 'treeman': ['remanet', 'remeant', 'treeman'], 'treen': ['enter', 'neter', 'renet', 'terne', 'treen'], 'treenail': ['elaterin', 'entailer', 'treenail'], 'treeship': ['hepteris', 'treeship'], 'tref': ['fret', 'reft', 'tref'], 'trefle': ['felter', 'telfer', 'trefle'], 'trellis': ['stiller', 'trellis'], 'trema': ['armet', 'mater', 'merat', 'metra', 'ramet', 'tamer', 'terma', 'trame', 'trema'], 'trematoid': ['meditator', 'trematoid'], 'tremella': ['realmlet', 'tremella'], 'tremie': ['metier', 'retime', 'tremie'], 'tremolo': ['roomlet', 'tremolo'], 'tremor': ['termor', 'tremor'], 'trenail': ['entrail', 'latiner', 'latrine', 'ratline', 'reliant', 'retinal', 'trenail'], 'trenchant': ['centranth', 'trenchant'], 'trencher': ['retrench', 'trencher'], 'trenchmaster': ['stretcherman', 'trenchmaster'], 'trenchwise': ['trenchwise', 'winchester'], 'trentine': ['renitent', 'trentine'], 'trepan': ['arpent', 'enrapt', 'entrap', 'panter', 'parent', 'pretan', 'trepan'], 'trephine': ['nephrite', 'prehnite', 'trephine'], 'trepid': ['dipter', 'trepid'], 'trepidation': ['departition', 'partitioned', 'trepidation'], 'treron': ['terron', 'treron', 'troner'], 'treronidae': ['reordinate', 'treronidae'], 'tressed': ['dessert', 'tressed'], 'tressful': ['tressful', 'turfless'], 'tressour': ['tressour', 'trousers'], 'trest': ['stert', 'stret', 'trest'], 'trestle': ['settler', 'sterlet', 'trestle'], 'trevor': ['trevor', 'trover'], 'trews': ['strew', 'trews', 'wrest'], 'trey': ['trey', 'tyre'], 'tri': ['rit', 'tri'], 'triable': ['betrail', 'librate', 'triable', 'trilabe'], 'triace': ['acrite', 'arcite', 'tercia', 'triace', 'tricae'], 'triacid': ['arctiid', 'triacid', 'triadic'], 'triacontane': ['recantation', 'triacontane'], 'triaconter': ['retraction', 'triaconter'], 'triactine': ['intricate', 'triactine'], 'triadic': ['arctiid', 'triacid', 'triadic'], 'triadical': ['raticidal', 'triadical'], 'triadist': ['distrait', 'triadist'], 'triaene': ['enteria', 'trainee', 'triaene'], 'triage': ['gaiter', 'tairge', 'triage'], 'trial': ['litra', 'trail', 'trial'], 'trialism': ['mistrial', 'trialism'], 'trialist': ['taistril', 'trialist'], 'triamide': ['dimetria', 'mitridae', 'tiremaid', 'triamide'], 'triamino': ['miniator', 'triamino'], 'triandria': ['irradiant', 'triandria'], 'triangle': ['integral', 'teraglin', 'triangle'], 'triangula': ['tragulina', 'triangula'], 'triannual': ['innatural', 'triannual'], 'triannulate': ['antineutral', 'triannulate'], 'triantelope': ['interpolate', 'triantelope'], 'triapsidal': ['lapidarist', 'triapsidal'], 'triareal': ['arterial', 'triareal'], 'trias': ['arist', 'astir', 'sitar', 'stair', 'stria', 'tarsi', 'tisar', 'trias'], 'triassic': ['sarcitis', 'triassic'], 'triazane': ['nazarite', 'nazirate', 'triazane'], 'triazine': ['nazirite', 'triazine'], 'tribade': ['redbait', 'tribade'], 'tribase': ['baister', 'tribase'], 'tribe': ['biter', 'tribe'], 'tribelet': ['belitter', 'tribelet'], 'triblet': ['blitter', 'brittle', 'triblet'], 'tribonema': ['brominate', 'tribonema'], 'tribuna': ['arbutin', 'tribuna'], 'tribunal': ['tribunal', 'turbinal', 'untribal'], 'tribunate': ['tribunate', 'turbinate'], 'tribune': ['tribune', 'tuberin', 'turbine'], 'tricae': ['acrite', 'arcite', 'tercia', 'triace', 'tricae'], 'trice': ['citer', 'recti', 'ticer', 'trice'], 'tricennial': ['encrinital', 'tricennial'], 'triceratops': ['tetrasporic', 'triceratops'], 'triceria': ['criteria', 'triceria'], 'tricerion': ['criterion', 'tricerion'], 'tricerium': ['criterium', 'tricerium'], 'trichinous': ['trichinous', 'unhistoric'], 'trichogyne': ['thyrogenic', 'trichogyne'], 'trichoid': ['hidrotic', 'trichoid'], 'trichomanes': ['anchoretism', 'trichomanes'], 'trichome': ['chromite', 'trichome'], 'trichopore': ['horopteric', 'rheotropic', 'trichopore'], 'trichosis': ['historics', 'trichosis'], 'trichosporum': ['sporotrichum', 'trichosporum'], 'trichroic': ['cirrhotic', 'trichroic'], 'trichroism': ['trichroism', 'triorchism'], 'trichromic': ['microcrith', 'trichromic'], 'tricia': ['iatric', 'tricia'], 'trickle': ['tickler', 'trickle'], 'triclinate': ['intractile', 'triclinate'], 'tricolumnar': ['tricolumnar', 'ultramicron'], 'tricosane': ['atroscine', 'certosina', 'ostracine', 'tinoceras', 'tricosane'], 'tridacna': ['antacrid', 'cardiant', 'radicant', 'tridacna'], 'tridecane': ['nectaried', 'tridecane'], 'tridecene': ['intercede', 'tridecene'], 'tridecyl': ['directly', 'tridecyl'], 'tridiapason': ['disparation', 'tridiapason'], 'tried': ['diter', 'tired', 'tried'], 'triedly': ['tiredly', 'triedly'], 'triene': ['entire', 'triene'], 'triens': ['estrin', 'insert', 'sinter', 'sterin', 'triens'], 'triental': ['tetralin', 'triental'], 'triequal': ['quartile', 'requital', 'triequal'], 'trier': ['terri', 'tirer', 'trier'], 'trifle': ['fertil', 'filter', 'lifter', 'relift', 'trifle'], 'trifler': ['flirter', 'trifler'], 'triflet': ['flitter', 'triflet'], 'trifling': ['flirting', 'trifling'], 'triflingly': ['flirtingly', 'triflingly'], 'trifolium': ['lituiform', 'trifolium'], 'trig': ['girt', 'grit', 'trig'], 'trigona': ['grotian', 'trigona'], 'trigone': ['ergotin', 'genitor', 'negrito', 'ogtiern', 'trigone'], 'trigonia': ['rigation', 'trigonia'], 'trigonid': ['trigonid', 'tringoid'], 'trigyn': ['trigyn', 'trying'], 'trilabe': ['betrail', 'librate', 'triable', 'trilabe'], 'trilineate': ['retinalite', 'trilineate'], 'trilisa': ['liatris', 'trilisa'], 'trillet': ['rillett', 'trillet'], 'trilobate': ['latrobite', 'trilobate'], 'trilobated': ['titleboard', 'trilobated'], 'trimacular': ['matricular', 'trimacular'], 'trimensual': ['neutralism', 'trimensual'], 'trimer': ['mitrer', 'retrim', 'trimer'], 'trimesic': ['meristic', 'trimesic', 'trisemic'], 'trimesitinic': ['interimistic', 'trimesitinic'], 'trimesyl': ['trimesyl', 'tylerism'], 'trimeter': ['remitter', 'trimeter'], 'trimstone': ['sortiment', 'trimstone'], 'trinalize': ['latinizer', 'trinalize'], 'trindle': ['tendril', 'trindle'], 'trine': ['inert', 'inter', 'niter', 'retin', 'trine'], 'trinely': ['elytrin', 'inertly', 'trinely'], 'trinervate': ['travertine', 'trinervate'], 'trinerve': ['inverter', 'reinvert', 'trinerve'], 'trineural': ['retinular', 'trineural'], 'tringa': ['rating', 'tringa'], 'tringle': ['ringlet', 'tingler', 'tringle'], 'tringoid': ['trigonid', 'tringoid'], 'trinket': ['knitter', 'trinket'], 'trinkle': ['tinkler', 'trinkle'], 'trinoctial': ['tinctorial', 'trinoctial'], 'trinodine': ['rendition', 'trinodine'], 'trintle': ['lettrin', 'trintle'], 'trio': ['riot', 'roit', 'trio'], 'triode': ['editor', 'triode'], 'trioecism': ['eroticism', 'isometric', 'meroistic', 'trioecism'], 'triole': ['loiter', 'toiler', 'triole'], 'trioleic': ['elicitor', 'trioleic'], 'triolet': ['lotrite', 'tortile', 'triolet'], 'trionymal': ['normality', 'trionymal'], 'triopidae': ['poritidae', 'triopidae'], 'triops': ['ripost', 'triops', 'tripos'], 'triorchism': ['trichroism', 'triorchism'], 'triose': ['restio', 'sorite', 'sortie', 'triose'], 'tripe': ['perit', 'retip', 'tripe'], 'tripedal': ['dipteral', 'tripedal'], 'tripel': ['tripel', 'triple'], 'tripeman': ['imperant', 'pairment', 'partimen', 'premiant', 'tripeman'], 'tripersonal': ['intersporal', 'tripersonal'], 'tripestone': ['septentrio', 'tripestone'], 'triphane': ['perianth', 'triphane'], 'triplane': ['interlap', 'repliant', 'triplane'], 'triplasian': ['airplanist', 'triplasian'], 'triplasic': ['pilastric', 'triplasic'], 'triple': ['tripel', 'triple'], 'triplice': ['perlitic', 'triplice'], 'triplopia': ['propitial', 'triplopia'], 'tripod': ['torpid', 'tripod'], 'tripodal': ['dioptral', 'tripodal'], 'tripodic': ['dioptric', 'tripodic'], 'tripodical': ['dioptrical', 'tripodical'], 'tripody': ['dioptry', 'tripody'], 'tripos': ['ripost', 'triops', 'tripos'], 'trippist': ['strippit', 'trippist'], 'tripple': ['ripplet', 'tippler', 'tripple'], 'tripsis': ['pristis', 'tripsis'], 'tripsome': ['imposter', 'tripsome'], 'tripudiant': ['antiputrid', 'tripudiant'], 'tripyrenous': ['neurotripsy', 'tripyrenous'], 'triratna': ['tartarin', 'triratna'], 'trireme': ['meriter', 'miterer', 'trireme'], 'trisalt': ['starlit', 'trisalt'], 'trisected': ['decretist', 'trisected'], 'trisector': ['tortrices', 'trisector'], 'trisemic': ['meristic', 'trimesic', 'trisemic'], 'trisetose': ['esoterist', 'trisetose'], 'trishna': ['tarnish', 'trishna'], 'trisilane': ['listerian', 'trisilane'], 'triskele': ['kreistle', 'triskele'], 'trismus': ['sistrum', 'trismus'], 'trisome': ['erotism', 'mortise', 'trisome'], 'trisomy': ['toryism', 'trisomy'], 'trisonant': ['strontian', 'trisonant'], 'trispinose': ['pirssonite', 'trispinose'], 'trist': ['strit', 'trist'], 'tristan': ['straint', 'transit', 'tristan'], 'trisula': ['latirus', 'trisula'], 'trisulcate': ['testicular', 'trisulcate'], 'tritanope': ['antitrope', 'patronite', 'tritanope'], 'tritanopic': ['antitropic', 'tritanopic'], 'trite': ['titer', 'titre', 'trite'], 'tritely': ['littery', 'tritely'], 'triterpene': ['preterient', 'triterpene'], 'tritheism': ['tiresmith', 'tritheism'], 'trithionate': ['anorthitite', 'trithionate'], 'tritocone': ['torticone', 'tritocone'], 'tritoma': ['mattoir', 'tritoma'], 'triton': ['intort', 'tornit', 'triton'], 'triune': ['runite', 'triune', 'uniter', 'untire'], 'trivalence': ['cantilever', 'trivalence'], 'trivial': ['trivial', 'vitrail'], 'trivialist': ['trivialist', 'vitrailist'], 'troat': ['ottar', 'tarot', 'torta', 'troat'], 'troca': ['actor', 'corta', 'croat', 'rocta', 'taroc', 'troca'], 'trocar': ['carrot', 'trocar'], 'trochaic': ['thoracic', 'tocharic', 'trochaic'], 'trochate': ['theocrat', 'trochate'], 'troche': ['hector', 'rochet', 'tocher', 'troche'], 'trochi': ['chorti', 'orthic', 'thoric', 'trochi'], 'trochidae': ['charioted', 'trochidae'], 'trochila': ['acrolith', 'trochila'], 'trochilic': ['chloritic', 'trochilic'], 'trochlea': ['chlorate', 'trochlea'], 'trochlearis': ['rhetoricals', 'trochlearis'], 'trode': ['doter', 'tored', 'trode'], 'trog': ['grot', 'trog'], 'trogonidae': ['derogation', 'trogonidae'], 'troiades': ['asteroid', 'troiades'], 'troic': ['toric', 'troic'], 'troika': ['korait', 'troika'], 'trolley': ['tollery', 'trolley'], 'tromba': ['tambor', 'tromba'], 'trombe': ['retomb', 'trombe'], 'trompe': ['emptor', 'trompe'], 'tron': ['torn', 'tron'], 'trona': ['orant', 'rotan', 'toran', 'trona'], 'tronage': ['negator', 'tronage'], 'trone': ['noter', 'tenor', 'toner', 'trone'], 'troner': ['terron', 'treron', 'troner'], 'troop': ['porto', 'proto', 'troop'], 'trooper': ['protore', 'trooper'], 'tropaeolum': ['pleurotoma', 'tropaeolum'], 'tropaion': ['opinator', 'tropaion'], 'tropal': ['patrol', 'portal', 'tropal'], 'troparion': ['proration', 'troparion'], 'tropary': ['parroty', 'portray', 'tropary'], 'trope': ['poter', 'prote', 'repot', 'tepor', 'toper', 'trope'], 'tropeic': ['perotic', 'proteic', 'tropeic'], 'tropeine': ['ereption', 'tropeine'], 'troper': ['porret', 'porter', 'report', 'troper'], 'trophema': ['metaphor', 'trophema'], 'trophesial': ['hospitaler', 'trophesial'], 'trophical': ['carpolith', 'politarch', 'trophical'], 'trophodisc': ['doctorship', 'trophodisc'], 'trophonema': ['homopteran', 'trophonema'], 'trophotropic': ['prototrophic', 'trophotropic'], 'tropical': ['plicator', 'tropical'], 'tropically': ['polycitral', 'tropically'], 'tropidine': ['direption', 'perdition', 'tropidine'], 'tropine': ['pointer', 'protein', 'pterion', 'repoint', 'tropine'], 'tropism': ['primost', 'tropism'], 'tropist': ['protist', 'tropist'], 'tropistic': ['proctitis', 'protistic', 'tropistic'], 'tropophyte': ['protophyte', 'tropophyte'], 'tropophytic': ['protophytic', 'tropophytic'], 'tropyl': ['portly', 'protyl', 'tropyl'], 'trostera': ['rostrate', 'trostera'], 'trot': ['tort', 'trot'], 'troth': ['thort', 'troth'], 'trotline': ['interlot', 'trotline'], 'trouble': ['boulter', 'trouble'], 'troughy': ['troughy', 'yoghurt'], 'trounce': ['cornute', 'counter', 'recount', 'trounce'], 'troupe': ['pouter', 'roupet', 'troupe'], 'trouse': ['ouster', 'souter', 'touser', 'trouse'], 'trouser': ['rouster', 'trouser'], 'trouserian': ['souterrain', 'ternarious', 'trouserian'], 'trousers': ['tressour', 'trousers'], 'trout': ['trout', 'tutor'], 'trouter': ['torture', 'trouter', 'tutorer'], 'troutless': ['troutless', 'tutorless'], 'trouty': ['trouty', 'tryout', 'tutory'], 'trouvere': ['overtrue', 'overture', 'trouvere'], 'trove': ['overt', 'rovet', 'torve', 'trove', 'voter'], 'trover': ['trevor', 'trover'], 'trow': ['trow', 'wort'], 'trowel': ['rowlet', 'trowel', 'wolter'], 'troy': ['royt', 'ryot', 'tory', 'troy', 'tyro'], 'truandise': ['disnature', 'sturnidae', 'truandise'], 'truant': ['truant', 'turtan'], 'trub': ['brut', 'burt', 'trub', 'turb'], 'trubu': ['burut', 'trubu'], 'truce': ['cruet', 'eruct', 'recut', 'truce'], 'truceless': ['cutleress', 'lecturess', 'truceless'], 'trucial': ['curtail', 'trucial'], 'trucks': ['struck', 'trucks'], 'truculent': ['truculent', 'unclutter'], 'truelove': ['revolute', 'truelove'], 'truffle': ['fretful', 'truffle'], 'trug': ['gurt', 'trug'], 'truistical': ['altruistic', 'truistical', 'ultraistic'], 'truly': ['rutyl', 'truly'], 'trumperiness': ['surprisement', 'trumperiness'], 'trumpie': ['imputer', 'trumpie'], 'trun': ['runt', 'trun', 'turn'], 'truncated': ['reductant', 'traducent', 'truncated'], 'trundle': ['rundlet', 'trundle'], 'trush': ['hurst', 'trush'], 'trusion': ['nitrous', 'trusion'], 'trust': ['strut', 'sturt', 'trust'], 'trustee': ['surette', 'trustee'], 'trusteeism': ['sestertium', 'trusteeism'], 'trusten': ['entrust', 'stunter', 'trusten'], 'truster': ['retrust', 'truster'], 'trustle': ['slutter', 'trustle'], 'truth': ['thurt', 'truth'], 'trying': ['trigyn', 'trying'], 'tryma': ['marty', 'tryma'], 'tryout': ['trouty', 'tryout', 'tutory'], 'trypa': ['party', 'trypa'], 'trypan': ['pantry', 'trypan'], 'tryptase': ['tapestry', 'tryptase'], 'tsar': ['sart', 'star', 'stra', 'tars', 'tsar'], 'tsardom': ['stardom', 'tsardom'], 'tsarina': ['artisan', 'astrain', 'sartain', 'tsarina'], 'tsarship': ['starship', 'tsarship'], 'tsatlee': ['atelets', 'tsatlee'], 'tsere': ['ester', 'estre', 'reest', 'reset', 'steer', 'stere', 'stree', 'terse', 'tsere'], 'tsetse': ['sestet', 'testes', 'tsetse'], 'tshi': ['hist', 'sith', 'this', 'tshi'], 'tsia': ['atis', 'sita', 'tsia'], 'tsine': ['inset', 'neist', 'snite', 'stein', 'stine', 'tsine'], 'tsiology': ['sitology', 'tsiology'], 'tsoneca': ['costean', 'tsoneca'], 'tsonecan': ['noncaste', 'tsonecan'], 'tsuga': ['agust', 'tsuga'], 'tsuma': ['matsu', 'tamus', 'tsuma'], 'tsun': ['stun', 'sunt', 'tsun'], 'tu': ['tu', 'ut'], 'tua': ['tau', 'tua', 'uta'], 'tuan': ['antu', 'aunt', 'naut', 'taun', 'tuan', 'tuna'], 'tuareg': ['argute', 'guetar', 'rugate', 'tuareg'], 'tuarn': ['arnut', 'tuarn', 'untar'], 'tub': ['but', 'tub'], 'tuba': ['abut', 'tabu', 'tuba'], 'tubae': ['butea', 'taube', 'tubae'], 'tubal': ['balut', 'tubal'], 'tubar': ['bruta', 'tubar'], 'tubate': ['battue', 'tubate'], 'tube': ['bute', 'tebu', 'tube'], 'tuber': ['brute', 'buret', 'rebut', 'tuber'], 'tubercula': ['lucubrate', 'tubercula'], 'tuberin': ['tribune', 'tuberin', 'turbine'], 'tuberless': ['butleress', 'tuberless'], 'tublet': ['buttle', 'tublet'], 'tuboovarial': ['ovariotubal', 'tuboovarial'], 'tucana': ['canaut', 'tucana'], 'tucano': ['toucan', 'tucano', 'uncoat'], 'tuchun': ['tuchun', 'uncuth'], 'tucker': ['retuck', 'tucker'], 'tue': ['tue', 'ute'], 'tueiron': ['routine', 'tueiron'], 'tug': ['gut', 'tug'], 'tughra': ['raught', 'tughra'], 'tugless': ['gutless', 'tugless'], 'tuglike': ['gutlike', 'tuglike'], 'tugman': ['tangum', 'tugman'], 'tuism': ['muist', 'tuism'], 'tuke': ['ketu', 'teuk', 'tuke'], 'tukra': ['kraut', 'tukra'], 'tulare': ['tulare', 'uretal'], 'tulasi': ['situal', 'situla', 'tulasi'], 'tulchan': ['tulchan', 'unlatch'], 'tule': ['lute', 'tule'], 'tulipa': ['tipula', 'tulipa'], 'tulisan': ['latinus', 'tulisan', 'unalist'], 'tulsi': ['litus', 'sluit', 'tulsi'], 'tumbler': ['tumbler', 'tumbrel'], 'tumbrel': ['tumbler', 'tumbrel'], 'tume': ['mute', 'tume'], 'tumescence': ['mutescence', 'tumescence'], 'tumorous': ['mortuous', 'tumorous'], 'tumulary': ['mutulary', 'tumulary'], 'tun': ['nut', 'tun'], 'tuna': ['antu', 'aunt', 'naut', 'taun', 'tuan', 'tuna'], 'tunable': ['abluent', 'tunable'], 'tunbellied': ['tunbellied', 'unbilleted'], 'tunca': ['tunca', 'unact'], 'tund': ['dunt', 'tund'], 'tunder': ['runted', 'tunder', 'turned'], 'tundra': ['durant', 'tundra'], 'tuner': ['enrut', 'tuner', 'urent'], 'tunga': ['gaunt', 'tunga'], 'tungan': ['tangun', 'tungan'], 'tungate': ['tungate', 'tutenag'], 'tungo': ['tungo', 'ungot'], 'tungstosilicate': ['silicotungstate', 'tungstosilicate'], 'tungstosilicic': ['silicotungstic', 'tungstosilicic'], 'tunic': ['cutin', 'incut', 'tunic'], 'tunica': ['anicut', 'nautic', 'ticuna', 'tunica'], 'tunican': ['ticunan', 'tunican'], 'tunicary': ['nycturia', 'tunicary'], 'tunicle': ['linecut', 'tunicle'], 'tunicless': ['lentiscus', 'tunicless'], 'tunist': ['suttin', 'tunist'], 'tunk': ['knut', 'tunk'], 'tunker': ['tunker', 'turken'], 'tunlike': ['nutlike', 'tunlike'], 'tunna': ['naunt', 'tunna'], 'tunnel': ['nunlet', 'tunnel', 'unlent'], 'tunnelman': ['annulment', 'tunnelman'], 'tunner': ['runnet', 'tunner', 'unrent'], 'tunnor': ['tunnor', 'untorn'], 'tuno': ['tuno', 'unto'], 'tup': ['put', 'tup'], 'tur': ['rut', 'tur'], 'turacin': ['curtain', 'turacin', 'turcian'], 'turanian': ['nutarian', 'turanian'], 'turanism': ['naturism', 'sturmian', 'turanism'], 'turb': ['brut', 'burt', 'trub', 'turb'], 'turban': ['tanbur', 'turban'], 'turbaned': ['breadnut', 'turbaned'], 'turbanless': ['substernal', 'turbanless'], 'turbeh': ['hubert', 'turbeh'], 'turbinal': ['tribunal', 'turbinal', 'untribal'], 'turbinate': ['tribunate', 'turbinate'], 'turbine': ['tribune', 'tuberin', 'turbine'], 'turbined': ['turbined', 'underbit'], 'turcian': ['curtain', 'turacin', 'turcian'], 'turco': ['court', 'crout', 'turco'], 'turcoman': ['courtman', 'turcoman'], 'turdinae': ['indurate', 'turdinae'], 'turdine': ['intrude', 'turdine', 'untired', 'untried'], 'tureen': ['neuter', 'retune', 'runtee', 'tenure', 'tureen'], 'turfed': ['dufter', 'turfed'], 'turfen': ['turfen', 'unfret'], 'turfless': ['tressful', 'turfless'], 'turgent': ['grutten', 'turgent'], 'turk': ['kurt', 'turk'], 'turken': ['tunker', 'turken'], 'turki': ['tikur', 'turki'], 'turkman': ['trankum', 'turkman'], 'turma': ['martu', 'murat', 'turma'], 'turn': ['runt', 'trun', 'turn'], 'turndown': ['downturn', 'turndown'], 'turned': ['runted', 'tunder', 'turned'], 'turnel': ['runlet', 'turnel'], 'turner': ['return', 'turner'], 'turnhall': ['turnhall', 'unthrall'], 'turnout': ['outturn', 'turnout'], 'turnover': ['overturn', 'turnover'], 'turnpin': ['turnpin', 'unprint'], 'turns': ['snurt', 'turns'], 'turntail': ['rutilant', 'turntail'], 'turnup': ['turnup', 'upturn'], 'turp': ['prut', 'turp'], 'turpid': ['putrid', 'turpid'], 'turpidly': ['putridly', 'turpidly'], 'turps': ['spurt', 'turps'], 'turret': ['rutter', 'turret'], 'turricula': ['turricula', 'utricular'], 'turse': ['serut', 'strue', 'turse', 'uster'], 'tursenoi': ['rutinose', 'tursenoi'], 'tursio': ['suitor', 'tursio'], 'turtan': ['truant', 'turtan'], 'tuscan': ['cantus', 'tuscan', 'uncast'], 'tusche': ['schute', 'tusche'], 'tush': ['shut', 'thus', 'tush'], 'tusher': ['reshut', 'suther', 'thurse', 'tusher'], 'tussal': ['saltus', 'tussal'], 'tusser': ['russet', 'tusser'], 'tussore': ['estrous', 'oestrus', 'sestuor', 'tussore'], 'tutelo': ['outlet', 'tutelo'], 'tutenag': ['tungate', 'tutenag'], 'tutman': ['mutant', 'tantum', 'tutman'], 'tutor': ['trout', 'tutor'], 'tutorer': ['torture', 'trouter', 'tutorer'], 'tutorial': ['outtrail', 'tutorial'], 'tutorism': ['mistutor', 'tutorism'], 'tutorless': ['troutless', 'tutorless'], 'tutory': ['trouty', 'tryout', 'tutory'], 'tuts': ['stut', 'tuts'], 'tutster': ['stutter', 'tutster'], 'twa': ['taw', 'twa', 'wat'], 'twae': ['tewa', 'twae', 'weta'], 'twain': ['atwin', 'twain', 'witan'], 'twaite': ['tawite', 'tawtie', 'twaite'], 'twal': ['twal', 'walt'], 'twas': ['sawt', 'staw', 'swat', 'taws', 'twas', 'wast'], 'twat': ['twat', 'watt'], 'twee': ['twee', 'weet'], 'tweel': ['tewel', 'tweel'], 'twere': ['rewet', 'tewer', 'twere'], 'twi': ['twi', 'wit'], 'twigsome': ['twigsome', 'wegotism'], 'twin': ['twin', 'wint'], 'twiner': ['twiner', 'winter'], 'twingle': ['twingle', 'welting', 'winglet'], 'twinkle': ['twinkle', 'winklet'], 'twinkler': ['twinkler', 'wrinklet'], 'twinter': ['twinter', 'written'], 'twire': ['twire', 'write'], 'twister': ['retwist', 'twister'], 'twitchety': ['twitchety', 'witchetty'], 'twite': ['tewit', 'twite'], 'two': ['tow', 'two', 'wot'], 'twoling': ['lingtow', 'twoling'], 'tyche': ['techy', 'tyche'], 'tydie': ['deity', 'tydie'], 'tye': ['tye', 'yet'], 'tyke': ['kyte', 'tyke'], 'tylerism': ['trimesyl', 'tylerism'], 'tyloma': ['latomy', 'tyloma'], 'tylose': ['tolsey', 'tylose'], 'tylosis': ['tossily', 'tylosis'], 'tylotus': ['stoutly', 'tylotus'], 'tylus': ['lusty', 'tylus'], 'typal': ['aptly', 'patly', 'platy', 'typal'], 'typees': ['steepy', 'typees'], 'typer': ['perty', 'typer'], 'typha': ['pathy', 'typha'], 'typhia': ['pythia', 'typhia'], 'typhic': ['phytic', 'pitchy', 'pythic', 'typhic'], 'typhlopidae': ['heptaploidy', 'typhlopidae'], 'typhoean': ['anophyte', 'typhoean'], 'typhogenic': ['phytogenic', 'pythogenic', 'typhogenic'], 'typhoid': ['phytoid', 'typhoid'], 'typhonian': ['antiphony', 'typhonian'], 'typhonic': ['hypnotic', 'phytonic', 'pythonic', 'typhonic'], 'typhosis': ['phytosis', 'typhosis'], 'typica': ['atypic', 'typica'], 'typographer': ['petrography', 'pterography', 'typographer'], 'typographic': ['graphotypic', 'pictography', 'typographic'], 'typology': ['logotypy', 'typology'], 'typophile': ['hippolyte', 'typophile'], 'tyre': ['trey', 'tyre'], 'tyrian': ['rytina', 'trainy', 'tyrian'], 'tyro': ['royt', 'ryot', 'tory', 'troy', 'tyro'], 'tyrocidin': ['nordicity', 'tyrocidin'], 'tyrolean': ['neolatry', 'ornately', 'tyrolean'], 'tyrolite': ['toiletry', 'tyrolite'], 'tyrone': ['torney', 'tyrone'], 'tyronism': ['smyrniot', 'tyronism'], 'tyrosine': ['tyrosine', 'tyrsenoi'], 'tyrrheni': ['erythrin', 'tyrrheni'], 'tyrsenoi': ['tyrosine', 'tyrsenoi'], 'tyste': ['testy', 'tyste'], 'tyto': ['toty', 'tyto'], 'uang': ['gaun', 'guan', 'guna', 'uang'], 'ucal': ['caul', 'ucal'], 'udal': ['auld', 'dual', 'laud', 'udal'], 'udaler': ['lauder', 'udaler'], 'udalman': ['ladanum', 'udalman'], 'udo': ['duo', 'udo'], 'uds': ['sud', 'uds'], 'ugh': ['hug', 'ugh'], 'uglisome': ['eulogism', 'uglisome'], 'ugrian': ['gurian', 'ugrian'], 'ugric': ['guric', 'ugric'], 'uhtsong': ['gunshot', 'shotgun', 'uhtsong'], 'uinal': ['inula', 'luian', 'uinal'], 'uinta': ['uinta', 'uniat'], 'ulcer': ['cruel', 'lucre', 'ulcer'], 'ulcerate': ['celature', 'ulcerate'], 'ulcerous': ['ulcerous', 'urceolus'], 'ule': ['leu', 'lue', 'ule'], 'ulema': ['amelu', 'leuma', 'ulema'], 'uletic': ['lucite', 'luetic', 'uletic'], 'ulex': ['luxe', 'ulex'], 'ulla': ['lula', 'ulla'], 'ulling': ['ulling', 'ungill'], 'ulmin': ['linum', 'ulmin'], 'ulminic': ['clinium', 'ulminic'], 'ulmo': ['moul', 'ulmo'], 'ulna': ['laun', 'luna', 'ulna', 'unal'], 'ulnad': ['dunal', 'laund', 'lunda', 'ulnad'], 'ulnar': ['lunar', 'ulnar', 'urnal'], 'ulnare': ['lunare', 'neural', 'ulnare', 'unreal'], 'ulnaria': ['lunaria', 'ulnaria', 'uralian'], 'ulotrichi': ['ulotrichi', 'urolithic'], 'ulster': ['luster', 'result', 'rustle', 'sutler', 'ulster'], 'ulstered': ['deluster', 'ulstered'], 'ulsterian': ['neuralist', 'ulsterian', 'unrealist'], 'ulstering': ['resulting', 'ulstering'], 'ulsterman': ['menstrual', 'ulsterman'], 'ultima': ['mulita', 'ultima'], 'ultimate': ['mutilate', 'ultimate'], 'ultimation': ['mutilation', 'ultimation'], 'ultonian': ['lunation', 'ultonian'], 'ultra': ['lutra', 'ultra'], 'ultrabasic': ['arcubalist', 'ultrabasic'], 'ultraism': ['altruism', 'muralist', 'traulism', 'ultraism'], 'ultraist': ['altruist', 'ultraist'], 'ultraistic': ['altruistic', 'truistical', 'ultraistic'], 'ultramicron': ['tricolumnar', 'ultramicron'], 'ultraminute': ['intermutual', 'ultraminute'], 'ultramontane': ['tournamental', 'ultramontane'], 'ultranice': ['centurial', 'lucretian', 'ultranice'], 'ultrasterile': ['reillustrate', 'ultrasterile'], 'ulua': ['aulu', 'ulua'], 'ulva': ['ulva', 'uval'], 'um': ['mu', 'um'], 'umbel': ['umbel', 'umble'], 'umbellar': ['umbellar', 'umbrella'], 'umber': ['brume', 'umber'], 'umbilic': ['bulimic', 'umbilic'], 'umbiliform': ['bulimiform', 'umbiliform'], 'umble': ['umbel', 'umble'], 'umbonial': ['olibanum', 'umbonial'], 'umbral': ['brumal', 'labrum', 'lumbar', 'umbral'], 'umbrel': ['lumber', 'rumble', 'umbrel'], 'umbrella': ['umbellar', 'umbrella'], 'umbrous': ['brumous', 'umbrous'], 'ume': ['emu', 'ume'], 'umlaut': ['mutual', 'umlaut'], 'umph': ['hump', 'umph'], 'umpire': ['impure', 'umpire'], 'un': ['nu', 'un'], 'unabetted': ['debutante', 'unabetted'], 'unabhorred': ['unabhorred', 'unharbored'], 'unable': ['nebula', 'unable', 'unbale'], 'unaccumulate': ['acutenaculum', 'unaccumulate'], 'unact': ['tunca', 'unact'], 'unadherent': ['unadherent', 'underneath', 'underthane'], 'unadmire': ['unadmire', 'underaim'], 'unadmired': ['unadmired', 'undermaid'], 'unadored': ['unadored', 'unroaded'], 'unadvertised': ['disadventure', 'unadvertised'], 'unafire': ['fuirena', 'unafire'], 'unaged': ['augend', 'engaud', 'unaged'], 'unagreed': ['dungaree', 'guardeen', 'unagreed', 'underage', 'ungeared'], 'unailing': ['inguinal', 'unailing'], 'unaimed': ['numidae', 'unaimed'], 'unaisled': ['unaisled', 'unsailed'], 'unakite': ['kutenai', 'unakite'], 'unal': ['laun', 'luna', 'ulna', 'unal'], 'unalarming': ['unalarming', 'unmarginal'], 'unalert': ['laurent', 'neutral', 'unalert'], 'unalertly': ['neutrally', 'unalertly'], 'unalertness': ['neutralness', 'unalertness'], 'unalimentary': ['anteluminary', 'unalimentary'], 'unalist': ['latinus', 'tulisan', 'unalist'], 'unallotted': ['unallotted', 'untotalled'], 'unalmsed': ['dulseman', 'unalmsed'], 'unaltered': ['unaltered', 'unrelated'], 'unaltering': ['unaltering', 'unrelating'], 'unamassed': ['mussaenda', 'unamassed'], 'unambush': ['subhuman', 'unambush'], 'unamenability': ['unamenability', 'unnameability'], 'unamenable': ['unamenable', 'unnameable'], 'unamenableness': ['unamenableness', 'unnameableness'], 'unamenably': ['unamenably', 'unnameably'], 'unamend': ['mundane', 'unamend', 'unmaned', 'unnamed'], 'unami': ['maniu', 'munia', 'unami'], 'unapt': ['punta', 'unapt', 'untap'], 'unarising': ['grusinian', 'unarising'], 'unarm': ['muran', 'ruman', 'unarm', 'unram', 'urman'], 'unarmed': ['duramen', 'maunder', 'unarmed'], 'unarray': ['unarray', 'yaruran'], 'unarrestable': ['subterraneal', 'unarrestable'], 'unarrested': ['unarrested', 'unserrated'], 'unarted': ['daunter', 'unarted', 'unrated', 'untread'], 'unarticled': ['denticular', 'unarticled'], 'unartistic': ['naturistic', 'unartistic'], 'unartistical': ['naturalistic', 'unartistical'], 'unartistically': ['naturistically', 'unartistically'], 'unary': ['anury', 'unary', 'unray'], 'unastray': ['auntsary', 'unastray'], 'unathirst': ['struthian', 'unathirst'], 'unattire': ['tainture', 'unattire'], 'unattuned': ['unattuned', 'untaunted'], 'unaverted': ['adventure', 'unaverted'], 'unavertible': ['unavertible', 'unveritable'], 'unbag': ['bugan', 'bunga', 'unbag'], 'unbain': ['nubian', 'unbain'], 'unbale': ['nebula', 'unable', 'unbale'], 'unbar': ['buran', 'unbar', 'urban'], 'unbare': ['eburna', 'unbare', 'unbear', 'urbane'], 'unbarred': ['errabund', 'unbarred'], 'unbased': ['subdean', 'unbased'], 'unbaste': ['unbaste', 'unbeast'], 'unbatted': ['debutant', 'unbatted'], 'unbay': ['bunya', 'unbay'], 'unbe': ['benu', 'unbe'], 'unbear': ['eburna', 'unbare', 'unbear', 'urbane'], 'unbearded': ['unbearded', 'unbreaded'], 'unbeast': ['unbaste', 'unbeast'], 'unbeavered': ['unbeavered', 'unbereaved'], 'unbelied': ['unbelied', 'unedible'], 'unbereaved': ['unbeavered', 'unbereaved'], 'unbesot': ['subnote', 'subtone', 'unbesot'], 'unbias': ['anubis', 'unbias'], 'unbillet': ['bulletin', 'unbillet'], 'unbilleted': ['tunbellied', 'unbilleted'], 'unblasted': ['dunstable', 'unblasted', 'unstabled'], 'unbled': ['bundle', 'unbled'], 'unboasted': ['eastbound', 'unboasted'], 'unboat': ['outban', 'unboat'], 'unboding': ['bounding', 'unboding'], 'unbog': ['bungo', 'unbog'], 'unboiled': ['unboiled', 'unilobed'], 'unboned': ['bounden', 'unboned'], 'unborder': ['unborder', 'underorb'], 'unbored': ['beround', 'bounder', 'rebound', 'unbored', 'unorbed', 'unrobed'], 'unboweled': ['unboweled', 'unelbowed'], 'unbrace': ['bucrane', 'unbrace'], 'unbraceleted': ['unbraceleted', 'uncelebrated'], 'unbraid': ['barundi', 'unbraid'], 'unbrailed': ['indurable', 'unbrailed', 'unridable'], 'unbreaded': ['unbearded', 'unbreaded'], 'unbred': ['bunder', 'burden', 'burned', 'unbred'], 'unbribed': ['unbribed', 'unribbed'], 'unbrief': ['unbrief', 'unfiber'], 'unbriefed': ['unbriefed', 'unfibered'], 'unbroiled': ['unbroiled', 'underboil'], 'unbrushed': ['unbrushed', 'underbush'], 'unbud': ['bundu', 'unbud', 'undub'], 'unburden': ['unburden', 'unburned'], 'unburned': ['unburden', 'unburned'], 'unbuttered': ['unbuttered', 'unrebutted'], 'unca': ['cuna', 'unca'], 'uncage': ['cangue', 'uncage'], 'uncambered': ['uncambered', 'unembraced'], 'uncamerated': ['uncamerated', 'unmacerated'], 'uncapable': ['uncapable', 'unpacable'], 'uncaptious': ['uncaptious', 'usucaption'], 'uncarted': ['uncarted', 'uncrated', 'underact', 'untraced'], 'uncartooned': ['uncartooned', 'uncoronated'], 'uncase': ['uncase', 'usance'], 'uncask': ['uncask', 'unsack'], 'uncasked': ['uncasked', 'unsacked'], 'uncast': ['cantus', 'tuscan', 'uncast'], 'uncatalogued': ['uncatalogued', 'uncoagulated'], 'uncate': ['tecuna', 'uncate'], 'uncaused': ['uncaused', 'unsauced'], 'uncavalier': ['naviculare', 'uncavalier'], 'uncelebrated': ['unbraceleted', 'uncelebrated'], 'uncellar': ['lucernal', 'nucellar', 'uncellar'], 'uncenter': ['uncenter', 'unrecent'], 'uncertain': ['encurtain', 'runcinate', 'uncertain'], 'uncertifiable': ['uncertifiable', 'unrectifiable'], 'uncertified': ['uncertified', 'unrectified'], 'unchain': ['chunnia', 'unchain'], 'unchair': ['chunari', 'unchair'], 'unchalked': ['unchalked', 'unhackled'], 'uncharge': ['gunreach', 'uncharge'], 'uncharm': ['uncharm', 'unmarch'], 'uncharming': ['uncharming', 'unmarching'], 'uncharred': ['uncharred', 'underarch'], 'uncheat': ['uncheat', 'unteach'], 'uncheating': ['uncheating', 'unteaching'], 'unchoked': ['unchoked', 'unhocked'], 'unchoosable': ['chaenolobus', 'unchoosable'], 'unchosen': ['nonesuch', 'unchosen'], 'uncial': ['cunila', 'lucian', 'lucina', 'uncial'], 'unciferous': ['nuciferous', 'unciferous'], 'unciform': ['nuciform', 'unciform'], 'uncinate': ['nunciate', 'uncinate'], 'unclaimed': ['unclaimed', 'undecimal', 'unmedical'], 'unclay': ['lunacy', 'unclay'], 'unclead': ['unclead', 'unlaced'], 'unclear': ['crenula', 'lucarne', 'nuclear', 'unclear'], 'uncleared': ['uncleared', 'undeclare'], 'uncledom': ['columned', 'uncledom'], 'uncleship': ['siphuncle', 'uncleship'], 'uncloister': ['cornulites', 'uncloister'], 'unclose': ['counsel', 'unclose'], 'unclutter': ['truculent', 'unclutter'], 'unco': ['cuon', 'unco'], 'uncoagulated': ['uncatalogued', 'uncoagulated'], 'uncoat': ['toucan', 'tucano', 'uncoat'], 'uncoated': ['outdance', 'uncoated'], 'uncoiled': ['nucleoid', 'uncoiled'], 'uncoin': ['nuncio', 'uncoin'], 'uncollapsed': ['uncollapsed', 'unscalloped'], 'uncolored': ['uncolored', 'undercool'], 'uncomic': ['muconic', 'uncomic'], 'uncompatible': ['incomputable', 'uncompatible'], 'uncomplaint': ['uncomplaint', 'uncompliant'], 'uncomplete': ['couplement', 'uncomplete'], 'uncompliant': ['uncomplaint', 'uncompliant'], 'unconcerted': ['unconcerted', 'unconcreted'], 'unconcreted': ['unconcerted', 'unconcreted'], 'unconservable': ['unconservable', 'unconversable'], 'unconstraint': ['noncurantist', 'unconstraint'], 'uncontrasted': ['counterstand', 'uncontrasted'], 'unconversable': ['unconservable', 'unconversable'], 'uncoop': ['coupon', 'uncoop'], 'uncooped': ['couponed', 'uncooped'], 'uncope': ['pounce', 'uncope'], 'uncopied': ['cupidone', 'uncopied'], 'uncore': ['conure', 'rounce', 'uncore'], 'uncored': ['crunode', 'uncored'], 'uncorked': ['uncorked', 'unrocked'], 'uncoronated': ['uncartooned', 'uncoronated'], 'uncorrect': ['cocurrent', 'occurrent', 'uncorrect'], 'uncorrugated': ['counterguard', 'uncorrugated'], 'uncorseted': ['uncorseted', 'unescorted'], 'uncostumed': ['uncostumed', 'uncustomed'], 'uncoursed': ['uncoursed', 'unscoured'], 'uncouth': ['uncouth', 'untouch'], 'uncoverable': ['uncoverable', 'unrevocable'], 'uncradled': ['uncradled', 'underclad'], 'uncrated': ['uncarted', 'uncrated', 'underact', 'untraced'], 'uncreased': ['uncreased', 'undercase'], 'uncreatable': ['uncreatable', 'untraceable'], 'uncreatableness': ['uncreatableness', 'untraceableness'], 'uncreation': ['enunciator', 'uncreation'], 'uncreative': ['uncreative', 'unreactive'], 'uncredited': ['uncredited', 'undirected'], 'uncrest': ['encrust', 'uncrest'], 'uncrested': ['uncrested', 'undersect'], 'uncried': ['inducer', 'uncried'], 'uncrooked': ['uncrooked', 'undercook'], 'uncrude': ['uncrude', 'uncured'], 'unctional': ['continual', 'inoculant', 'unctional'], 'unctioneer': ['recontinue', 'unctioneer'], 'uncured': ['uncrude', 'uncured'], 'uncustomed': ['uncostumed', 'uncustomed'], 'uncuth': ['tuchun', 'uncuth'], 'undam': ['maund', 'munda', 'numda', 'undam', 'unmad'], 'undangered': ['undangered', 'underanged', 'ungardened'], 'undarken': ['undarken', 'unranked'], 'undashed': ['undashed', 'unshaded'], 'undate': ['nudate', 'undate'], 'unde': ['dune', 'nude', 'unde'], 'undean': ['duenna', 'undean'], 'undear': ['endura', 'neurad', 'undear', 'unread'], 'undeceiver': ['undeceiver', 'unreceived'], 'undecimal': ['unclaimed', 'undecimal', 'unmedical'], 'undeclare': ['uncleared', 'undeclare'], 'undecolic': ['coinclude', 'undecolic'], 'undecorated': ['undecorated', 'undercoated'], 'undefiled': ['undefiled', 'unfielded'], 'undeified': ['undeified', 'unedified'], 'undelible': ['undelible', 'unlibeled'], 'undelight': ['undelight', 'unlighted'], 'undelude': ['undelude', 'uneluded'], 'undeluding': ['undeluding', 'unindulged'], 'undemanded': ['undemanded', 'unmaddened'], 'unden': ['dunne', 'unden'], 'undeparted': ['dunderpate', 'undeparted'], 'undepraved': ['undepraved', 'unpervaded'], 'under': ['runed', 'under', 'unred'], 'underact': ['uncarted', 'uncrated', 'underact', 'untraced'], 'underacted': ['underacted', 'unredacted'], 'underaction': ['denunciator', 'underaction'], 'underage': ['dungaree', 'guardeen', 'unagreed', 'underage', 'ungeared'], 'underaid': ['underaid', 'unraided'], 'underaim': ['unadmire', 'underaim'], 'underanged': ['undangered', 'underanged', 'ungardened'], 'underarch': ['uncharred', 'underarch'], 'underarm': ['underarm', 'unmarred'], 'underbake': ['underbake', 'underbeak'], 'underbeak': ['underbake', 'underbeak'], 'underbeat': ['eburnated', 'underbeat', 'unrebated'], 'underbit': ['turbined', 'underbit'], 'underboil': ['unbroiled', 'underboil'], 'underbreathing': ['thunderbearing', 'underbreathing'], 'underbrush': ['underbrush', 'undershrub'], 'underbush': ['unbrushed', 'underbush'], 'undercase': ['uncreased', 'undercase'], 'underchap': ['underchap', 'unparched'], 'underclad': ['uncradled', 'underclad'], 'undercoat': ['cornuated', 'undercoat'], 'undercoated': ['undecorated', 'undercoated'], 'undercook': ['uncrooked', 'undercook'], 'undercool': ['uncolored', 'undercool'], 'undercut': ['undercut', 'unreduct'], 'underdead': ['underdead', 'undreaded'], 'underdig': ['underdig', 'ungirded', 'unridged'], 'underdive': ['underdive', 'underived'], 'underdo': ['redound', 'rounded', 'underdo'], 'underdoer': ['underdoer', 'unordered'], 'underdog': ['grounded', 'underdog', 'undergod'], 'underdown': ['underdown', 'undrowned'], 'underdrag': ['underdrag', 'undergrad'], 'underdraw': ['underdraw', 'underward'], 'undereat': ['denature', 'undereat'], 'underer': ['endurer', 'underer'], 'underfiend': ['underfiend', 'unfriended'], 'underfill': ['underfill', 'unfrilled'], 'underfire': ['underfire', 'unferried'], 'underflow': ['underflow', 'wonderful'], 'underfur': ['underfur', 'unfurred'], 'undergo': ['guerdon', 'undergo', 'ungored'], 'undergod': ['grounded', 'underdog', 'undergod'], 'undergoer': ['guerdoner', 'reundergo', 'undergoer', 'undergore'], 'undergore': ['guerdoner', 'reundergo', 'undergoer', 'undergore'], 'undergown': ['undergown', 'unwronged'], 'undergrad': ['underdrag', 'undergrad'], 'undergrade': ['undergrade', 'unregarded'], 'underheat': ['underheat', 'unearthed'], 'underhonest': ['underhonest', 'unshortened'], 'underhorse': ['underhorse', 'undershore'], 'underived': ['underdive', 'underived'], 'underkind': ['underkind', 'unkindred'], 'underlap': ['pendular', 'underlap', 'uplander'], 'underleaf': ['underleaf', 'unfederal'], 'underlease': ['underlease', 'unreleased'], 'underlegate': ['underlegate', 'unrelegated'], 'underlid': ['underlid', 'unriddle'], 'underlive': ['underlive', 'unreviled'], 'underlying': ['enduringly', 'underlying'], 'undermade': ['undermade', 'undreamed'], 'undermaid': ['unadmired', 'undermaid'], 'undermaker': ['undermaker', 'unremarked'], 'undermaster': ['undermaster', 'understream'], 'undermeal': ['denumeral', 'undermeal', 'unrealmed'], 'undermine': ['undermine', 'unermined'], 'undermost': ['undermost', 'unstormed'], 'undermotion': ['undermotion', 'unmonitored'], 'undern': ['dunner', 'undern'], 'underneath': ['unadherent', 'underneath', 'underthane'], 'undernote': ['undernote', 'undertone'], 'undernoted': ['undernoted', 'undertoned'], 'underntide': ['indentured', 'underntide'], 'underorb': ['unborder', 'underorb'], 'underpay': ['underpay', 'unprayed'], 'underpeer': ['perendure', 'underpeer'], 'underpick': ['underpick', 'unpricked'], 'underpier': ['underpier', 'underripe'], 'underpile': ['underpile', 'unreplied'], 'underpose': ['underpose', 'unreposed'], 'underpuke': ['underpuke', 'unperuked'], 'underream': ['maunderer', 'underream'], 'underripe': ['underpier', 'underripe'], 'underrobe': ['rebounder', 'underrobe'], 'undersap': ['undersap', 'unparsed', 'unrasped', 'unspared', 'unspread'], 'undersea': ['undersea', 'unerased', 'unseared'], 'underseam': ['underseam', 'unsmeared'], 'undersect': ['uncrested', 'undersect'], 'underserve': ['underserve', 'underverse', 'undeserver', 'unreserved', 'unreversed'], 'underset': ['sederunt', 'underset', 'undesert', 'unrested'], 'undershapen': ['undershapen', 'unsharpened'], 'undershore': ['underhorse', 'undershore'], 'undershrub': ['underbrush', 'undershrub'], 'underside': ['underside', 'undesired'], 'undersoil': ['undersoil', 'unsoldier'], 'undersow': ['sewround', 'undersow'], 'underspar': ['underspar', 'unsparred'], 'understain': ['understain', 'unstrained'], 'understand': ['understand', 'unstranded'], 'understream': ['undermaster', 'understream'], 'underthane': ['unadherent', 'underneath', 'underthane'], 'underthing': ['thundering', 'underthing'], 'undertide': ['durdenite', 'undertide'], 'undertime': ['undertime', 'unmerited'], 'undertimed': ['demiturned', 'undertimed'], 'undertitle': ['undertitle', 'unlittered'], 'undertone': ['undernote', 'undertone'], 'undertoned': ['undernoted', 'undertoned'], 'undertow': ['undertow', 'untrowed'], 'undertread': ['undertread', 'unretarded'], 'undertutor': ['undertutor', 'untortured'], 'underverse': ['underserve', 'underverse', 'undeserver', 'unreserved', 'unreversed'], 'underwage': ['underwage', 'unwagered'], 'underward': ['underdraw', 'underward'], 'underwarp': ['underwarp', 'underwrap'], 'underwave': ['underwave', 'unwavered'], 'underwrap': ['underwarp', 'underwrap'], 'undesert': ['sederunt', 'underset', 'undesert', 'unrested'], 'undeserve': ['undeserve', 'unsevered'], 'undeserver': ['underserve', 'underverse', 'undeserver', 'unreserved', 'unreversed'], 'undesign': ['undesign', 'unsigned', 'unsinged'], 'undesired': ['underside', 'undesired'], 'undeviated': ['denudative', 'undeviated'], 'undieted': ['undieted', 'unedited'], 'undig': ['gundi', 'undig'], 'undirect': ['undirect', 'untriced'], 'undirected': ['uncredited', 'undirected'], 'undiscerned': ['undiscerned', 'unrescinded'], 'undiscretion': ['discontinuer', 'undiscretion'], 'undistress': ['sturdiness', 'undistress'], 'undiverse': ['undiverse', 'unrevised'], 'undog': ['undog', 'ungod'], 'undrab': ['durban', 'undrab'], 'undrag': ['durgan', 'undrag'], 'undrape': ['undrape', 'unpared', 'unraped'], 'undreaded': ['underdead', 'undreaded'], 'undreamed': ['undermade', 'undreamed'], 'undrowned': ['underdown', 'undrowned'], 'undrugged': ['undrugged', 'ungrudged'], 'undryable': ['endurably', 'undryable'], 'undub': ['bundu', 'unbud', 'undub'], 'undumped': ['pudendum', 'undumped'], 'undy': ['duny', 'undy'], 'uneager': ['geneura', 'uneager'], 'unearned': ['unearned', 'unneared'], 'unearnest': ['unearnest', 'uneastern'], 'unearth': ['haunter', 'nauther', 'unearth', 'unheart', 'urethan'], 'unearthed': ['underheat', 'unearthed'], 'unearthly': ['unearthly', 'urethylan'], 'uneastern': ['unearnest', 'uneastern'], 'uneath': ['uneath', 'unhate'], 'unebriate': ['beraunite', 'unebriate'], 'unedge': ['dengue', 'unedge'], 'unedible': ['unbelied', 'unedible'], 'unedified': ['undeified', 'unedified'], 'unedited': ['undieted', 'unedited'], 'unelapsed': ['unelapsed', 'unpleased'], 'unelated': ['antelude', 'unelated'], 'unelbowed': ['unboweled', 'unelbowed'], 'unelidible': ['ineludible', 'unelidible'], 'uneluded': ['undelude', 'uneluded'], 'unembased': ['sunbeamed', 'unembased'], 'unembraced': ['uncambered', 'unembraced'], 'unenabled': ['unenabled', 'unendable'], 'unencored': ['denouncer', 'unencored'], 'unendable': ['unenabled', 'unendable'], 'unending': ['unending', 'unginned'], 'unenervated': ['unenervated', 'unvenerated'], 'unenlisted': ['unenlisted', 'unlistened', 'untinseled'], 'unenterprised': ['superintender', 'unenterprised'], 'unenviable': ['unenviable', 'unveniable'], 'unenvied': ['unenvied', 'unveined'], 'unequitable': ['unequitable', 'unquietable'], 'unerased': ['undersea', 'unerased', 'unseared'], 'unermined': ['undermine', 'unermined'], 'unerratic': ['recurtain', 'unerratic'], 'unerupted': ['unerupted', 'unreputed'], 'unescorted': ['uncorseted', 'unescorted'], 'unevil': ['unevil', 'unlive', 'unveil'], 'unexactly': ['exultancy', 'unexactly'], 'unexceptable': ['unexceptable', 'unexpectable'], 'unexcepted': ['unexcepted', 'unexpected'], 'unexcepting': ['unexcepting', 'unexpecting'], 'unexpectable': ['unexceptable', 'unexpectable'], 'unexpected': ['unexcepted', 'unexpected'], 'unexpecting': ['unexcepting', 'unexpecting'], 'unfabled': ['fundable', 'unfabled'], 'unfaceted': ['fecundate', 'unfaceted'], 'unfactional': ['afunctional', 'unfactional'], 'unfactored': ['fecundator', 'unfactored'], 'unfainting': ['antifungin', 'unfainting'], 'unfallible': ['unfallible', 'unfillable'], 'unfar': ['furan', 'unfar'], 'unfarmed': ['unfarmed', 'unframed'], 'unfederal': ['underleaf', 'unfederal'], 'unfeeding': ['unfeeding', 'unfeigned'], 'unfeeling': ['unfeeling', 'unfleeing'], 'unfeigned': ['unfeeding', 'unfeigned'], 'unfelt': ['fluent', 'netful', 'unfelt', 'unleft'], 'unfelted': ['defluent', 'unfelted'], 'unferried': ['underfire', 'unferried'], 'unfiber': ['unbrief', 'unfiber'], 'unfibered': ['unbriefed', 'unfibered'], 'unfielded': ['undefiled', 'unfielded'], 'unfiend': ['unfiend', 'unfined'], 'unfiery': ['reunify', 'unfiery'], 'unfillable': ['unfallible', 'unfillable'], 'unfined': ['unfiend', 'unfined'], 'unfired': ['unfired', 'unfried'], 'unflag': ['fungal', 'unflag'], 'unflat': ['flaunt', 'unflat'], 'unfleeing': ['unfeeling', 'unfleeing'], 'unfloured': ['unfloured', 'unfoldure'], 'unfolder': ['flounder', 'reunfold', 'unfolder'], 'unfolding': ['foundling', 'unfolding'], 'unfoldure': ['unfloured', 'unfoldure'], 'unforest': ['furstone', 'unforest'], 'unforested': ['unforested', 'unfostered'], 'unformality': ['fulminatory', 'unformality'], 'unforward': ['unforward', 'unfroward'], 'unfostered': ['unforested', 'unfostered'], 'unfrail': ['rainful', 'unfrail'], 'unframed': ['unfarmed', 'unframed'], 'unfret': ['turfen', 'unfret'], 'unfriable': ['funebrial', 'unfriable'], 'unfried': ['unfired', 'unfried'], 'unfriended': ['underfiend', 'unfriended'], 'unfriending': ['unfriending', 'uninfringed'], 'unfrilled': ['underfill', 'unfrilled'], 'unfroward': ['unforward', 'unfroward'], 'unfurl': ['unfurl', 'urnful'], 'unfurred': ['underfur', 'unfurred'], 'ungaite': ['ungaite', 'unitage'], 'unganged': ['unganged', 'unnagged'], 'ungardened': ['undangered', 'underanged', 'ungardened'], 'ungarnish': ['ungarnish', 'unsharing'], 'ungear': ['nauger', 'raunge', 'ungear'], 'ungeared': ['dungaree', 'guardeen', 'unagreed', 'underage', 'ungeared'], 'ungelt': ['englut', 'gluten', 'ungelt'], 'ungenerable': ['ungenerable', 'ungreenable'], 'unget': ['tengu', 'unget'], 'ungilded': ['deluding', 'ungilded'], 'ungill': ['ulling', 'ungill'], 'ungilt': ['glutin', 'luting', 'ungilt'], 'unginned': ['unending', 'unginned'], 'ungird': ['during', 'ungird'], 'ungirded': ['underdig', 'ungirded', 'unridged'], 'ungirdle': ['indulger', 'ungirdle'], 'ungirt': ['ungirt', 'untrig'], 'ungirth': ['hurting', 'ungirth', 'unright'], 'ungirthed': ['ungirthed', 'unrighted'], 'unglad': ['gandul', 'unglad'], 'unglued': ['unglued', 'unguled'], 'ungod': ['undog', 'ungod'], 'ungold': ['dungol', 'ungold'], 'ungone': ['guenon', 'ungone'], 'ungored': ['guerdon', 'undergo', 'ungored'], 'ungorge': ['gurgeon', 'ungorge'], 'ungot': ['tungo', 'ungot'], 'ungothic': ['touching', 'ungothic'], 'ungraphic': ['ungraphic', 'uparching'], 'ungreenable': ['ungenerable', 'ungreenable'], 'ungrieved': ['gerundive', 'ungrieved'], 'ungroined': ['ungroined', 'unignored'], 'ungrudged': ['undrugged', 'ungrudged'], 'ungual': ['ungual', 'ungula'], 'ungueal': ['ungueal', 'ungulae'], 'ungula': ['ungual', 'ungula'], 'ungulae': ['ungueal', 'ungulae'], 'unguled': ['unglued', 'unguled'], 'ungulp': ['ungulp', 'unplug'], 'unhabit': ['bhutani', 'unhabit'], 'unhackled': ['unchalked', 'unhackled'], 'unhairer': ['rhineura', 'unhairer'], 'unhalsed': ['unhalsed', 'unlashed', 'unshaled'], 'unhalted': ['unhalted', 'unlathed'], 'unhalter': ['lutheran', 'unhalter'], 'unhaltered': ['unhaltered', 'unlathered'], 'unhamper': ['prehuman', 'unhamper'], 'unharbored': ['unabhorred', 'unharbored'], 'unhasped': ['unhasped', 'unphased', 'unshaped'], 'unhat': ['ahunt', 'haunt', 'thuan', 'unhat'], 'unhate': ['uneath', 'unhate'], 'unhatingly': ['hauntingly', 'unhatingly'], 'unhayed': ['unhayed', 'unheady'], 'unheady': ['unhayed', 'unheady'], 'unhearsed': ['unhearsed', 'unsheared'], 'unheart': ['haunter', 'nauther', 'unearth', 'unheart', 'urethan'], 'unhid': ['hindu', 'hundi', 'unhid'], 'unhistoric': ['trichinous', 'unhistoric'], 'unhittable': ['unhittable', 'untithable'], 'unhoarded': ['roundhead', 'unhoarded'], 'unhocked': ['unchoked', 'unhocked'], 'unhoisted': ['hudsonite', 'unhoisted'], 'unhorse': ['unhorse', 'unshore'], 'unhose': ['unhose', 'unshoe'], 'unhosed': ['unhosed', 'unshoed'], 'unhurt': ['unhurt', 'unruth'], 'uniat': ['uinta', 'uniat'], 'uniate': ['auntie', 'uniate'], 'unible': ['nubile', 'unible'], 'uniced': ['induce', 'uniced'], 'unicentral': ['incruental', 'unicentral'], 'unideal': ['aliunde', 'unideal'], 'unidentified': ['indefinitude', 'unidentified'], 'unidly': ['unidly', 'yildun'], 'unie': ['niue', 'unie'], 'unifilar': ['friulian', 'unifilar'], 'uniflorate': ['antifouler', 'fluorinate', 'uniflorate'], 'unigenous': ['ingenuous', 'unigenous'], 'unignored': ['ungroined', 'unignored'], 'unilobar': ['orbulina', 'unilobar'], 'unilobed': ['unboiled', 'unilobed'], 'unimedial': ['aluminide', 'unimedial'], 'unimpair': ['manipuri', 'unimpair'], 'unimparted': ['diparentum', 'unimparted'], 'unimportance': ['importunance', 'unimportance'], 'unimpressible': ['unimpressible', 'unpermissible'], 'unimpressive': ['unimpressive', 'unpermissive'], 'unindented': ['unindented', 'unintended'], 'unindulged': ['undeluding', 'unindulged'], 'uninervate': ['aventurine', 'uninervate'], 'uninfringed': ['unfriending', 'uninfringed'], 'uningested': ['uningested', 'unsigneted'], 'uninn': ['nunni', 'uninn'], 'uninnate': ['eutannin', 'uninnate'], 'uninodal': ['annuloid', 'uninodal'], 'unintended': ['unindented', 'unintended'], 'unintoned': ['nonunited', 'unintoned'], 'uninured': ['uninured', 'unruined'], 'unionist': ['inustion', 'unionist'], 'unipersonal': ['spinoneural', 'unipersonal'], 'unipod': ['dupion', 'unipod'], 'uniradial': ['nidularia', 'uniradial'], 'unireme': ['erineum', 'unireme'], 'uniserrate': ['arseniuret', 'uniserrate'], 'unison': ['nonius', 'unison'], 'unitage': ['ungaite', 'unitage'], 'unital': ['inlaut', 'unital'], 'unite': ['intue', 'unite', 'untie'], 'united': ['dunite', 'united', 'untied'], 'uniter': ['runite', 'triune', 'uniter', 'untire'], 'unitiveness': ['unitiveness', 'unsensitive'], 'unitrope': ['eruption', 'unitrope'], 'univied': ['univied', 'viduine'], 'unket': ['knute', 'unket'], 'unkilned': ['unkilned', 'unlinked'], 'unkin': ['nunki', 'unkin'], 'unkindred': ['underkind', 'unkindred'], 'unlabiate': ['laubanite', 'unlabiate'], 'unlabored': ['burdalone', 'unlabored'], 'unlace': ['auncel', 'cuneal', 'lacune', 'launce', 'unlace'], 'unlaced': ['unclead', 'unlaced'], 'unlade': ['unlade', 'unlead'], 'unlaid': ['dualin', 'ludian', 'unlaid'], 'unlame': ['manuel', 'unlame'], 'unlapped': ['unlapped', 'unpalped'], 'unlarge': ['granule', 'unlarge', 'unregal'], 'unlashed': ['unhalsed', 'unlashed', 'unshaled'], 'unlasting': ['unlasting', 'unslating'], 'unlatch': ['tulchan', 'unlatch'], 'unlathed': ['unhalted', 'unlathed'], 'unlathered': ['unhaltered', 'unlathered'], 'unlay': ['unlay', 'yulan'], 'unlead': ['unlade', 'unlead'], 'unleasable': ['unleasable', 'unsealable'], 'unleased': ['unleased', 'unsealed'], 'unleash': ['hulsean', 'unleash'], 'unled': ['lendu', 'unled'], 'unleft': ['fluent', 'netful', 'unfelt', 'unleft'], 'unlent': ['nunlet', 'tunnel', 'unlent'], 'unlevied': ['unlevied', 'unveiled'], 'unlibeled': ['undelible', 'unlibeled'], 'unliberal': ['brunellia', 'unliberal'], 'unlicensed': ['unlicensed', 'unsilenced'], 'unlighted': ['undelight', 'unlighted'], 'unliken': ['nunlike', 'unliken'], 'unlime': ['lumine', 'unlime'], 'unlinked': ['unkilned', 'unlinked'], 'unlist': ['insult', 'sunlit', 'unlist', 'unslit'], 'unlistened': ['unenlisted', 'unlistened', 'untinseled'], 'unlit': ['unlit', 'until'], 'unliteral': ['tellurian', 'unliteral'], 'unlittered': ['undertitle', 'unlittered'], 'unlive': ['unevil', 'unlive', 'unveil'], 'unloaded': ['duodenal', 'unloaded'], 'unloaden': ['unloaden', 'unloaned'], 'unloader': ['unloader', 'urodelan'], 'unloaned': ['unloaden', 'unloaned'], 'unlodge': ['unlodge', 'unogled'], 'unlogic': ['gulonic', 'unlogic'], 'unlooped': ['unlooped', 'unpooled'], 'unlooted': ['unlooted', 'untooled'], 'unlost': ['unlost', 'unslot'], 'unlowered': ['unlowered', 'unroweled'], 'unlucid': ['nuculid', 'unlucid'], 'unlumped': ['pendulum', 'unlumped', 'unplumed'], 'unlured': ['unlured', 'unruled'], 'unlyrical': ['runically', 'unlyrical'], 'unmacerated': ['uncamerated', 'unmacerated'], 'unmad': ['maund', 'munda', 'numda', 'undam', 'unmad'], 'unmadded': ['addendum', 'unmadded'], 'unmaddened': ['undemanded', 'unmaddened'], 'unmaid': ['numida', 'unmaid'], 'unmail': ['alumni', 'unmail'], 'unmailed': ['adlumine', 'unmailed'], 'unmaned': ['mundane', 'unamend', 'unmaned', 'unnamed'], 'unmantle': ['unmantle', 'unmental'], 'unmarch': ['uncharm', 'unmarch'], 'unmarching': ['uncharming', 'unmarching'], 'unmarginal': ['unalarming', 'unmarginal'], 'unmarred': ['underarm', 'unmarred'], 'unmashed': ['unmashed', 'unshamed'], 'unmate': ['unmate', 'untame', 'unteam'], 'unmated': ['unmated', 'untamed'], 'unmaterial': ['manualiter', 'unmaterial'], 'unmeated': ['unmeated', 'unteamed'], 'unmedical': ['unclaimed', 'undecimal', 'unmedical'], 'unmeet': ['unmeet', 'unteem'], 'unmemoired': ['unmemoired', 'unmemoried'], 'unmemoried': ['unmemoired', 'unmemoried'], 'unmental': ['unmantle', 'unmental'], 'unmerged': ['gerendum', 'unmerged'], 'unmerited': ['undertime', 'unmerited'], 'unmettle': ['temulent', 'unmettle'], 'unminable': ['nelumbian', 'unminable'], 'unmined': ['minuend', 'unmined'], 'unminted': ['indument', 'unminted'], 'unmisled': ['muslined', 'unmisled', 'unsmiled'], 'unmiter': ['minuter', 'unmiter'], 'unmodest': ['mudstone', 'unmodest'], 'unmodish': ['muishond', 'unmodish'], 'unmomentary': ['monumentary', 'unmomentary'], 'unmonitored': ['undermotion', 'unmonitored'], 'unmorbid': ['moribund', 'unmorbid'], 'unmorose': ['enormous', 'unmorose'], 'unmortised': ['semirotund', 'unmortised'], 'unmotived': ['unmotived', 'unvomited'], 'unmystical': ['stimulancy', 'unmystical'], 'unnagged': ['unganged', 'unnagged'], 'unnail': ['alnuin', 'unnail'], 'unnameability': ['unamenability', 'unnameability'], 'unnameable': ['unamenable', 'unnameable'], 'unnameableness': ['unamenableness', 'unnameableness'], 'unnameably': ['unamenably', 'unnameably'], 'unnamed': ['mundane', 'unamend', 'unmaned', 'unnamed'], 'unnational': ['annulation', 'unnational'], 'unnative': ['unnative', 'venutian'], 'unneared': ['unearned', 'unneared'], 'unnest': ['unnest', 'unsent'], 'unnetted': ['unnetted', 'untented'], 'unnose': ['nonuse', 'unnose'], 'unnoted': ['unnoted', 'untoned'], 'unnoticed': ['continued', 'unnoticed'], 'unoared': ['rondeau', 'unoared'], 'unogled': ['unlodge', 'unogled'], 'unomitted': ['dumontite', 'unomitted'], 'unoperatic': ['precaution', 'unoperatic'], 'unorbed': ['beround', 'bounder', 'rebound', 'unbored', 'unorbed', 'unrobed'], 'unorder': ['rondure', 'rounder', 'unorder'], 'unordered': ['underdoer', 'unordered'], 'unoriented': ['nonerudite', 'unoriented'], 'unown': ['unown', 'unwon'], 'unowned': ['enwound', 'unowned'], 'unpacable': ['uncapable', 'unpacable'], 'unpacker': ['reunpack', 'unpacker'], 'unpaired': ['unpaired', 'unrepaid'], 'unpale': ['unpale', 'uplane'], 'unpalped': ['unlapped', 'unpalped'], 'unpanel': ['unpanel', 'unpenal'], 'unparceled': ['unparceled', 'unreplaced'], 'unparched': ['underchap', 'unparched'], 'unpared': ['undrape', 'unpared', 'unraped'], 'unparsed': ['undersap', 'unparsed', 'unrasped', 'unspared', 'unspread'], 'unparted': ['depurant', 'unparted'], 'unpartial': ['tarpaulin', 'unpartial'], 'unpenal': ['unpanel', 'unpenal'], 'unpenetrable': ['unpenetrable', 'unrepentable'], 'unpent': ['punnet', 'unpent'], 'unperch': ['puncher', 'unperch'], 'unpercolated': ['counterpaled', 'counterplead', 'unpercolated'], 'unpermissible': ['unimpressible', 'unpermissible'], 'unpermissive': ['unimpressive', 'unpermissive'], 'unperuked': ['underpuke', 'unperuked'], 'unpervaded': ['undepraved', 'unpervaded'], 'unpetal': ['plutean', 'unpetal', 'unpleat'], 'unpharasaic': ['parasuchian', 'unpharasaic'], 'unphased': ['unhasped', 'unphased', 'unshaped'], 'unphrased': ['unphrased', 'unsharped'], 'unpickled': ['dunpickle', 'unpickled'], 'unpierced': ['preinduce', 'unpierced'], 'unpile': ['lupine', 'unpile', 'upline'], 'unpiled': ['unpiled', 'unplied'], 'unplace': ['cleanup', 'unplace'], 'unplain': ['pinnula', 'unplain'], 'unplait': ['nuptial', 'unplait'], 'unplanted': ['pendulant', 'unplanted'], 'unplat': ['puntal', 'unplat'], 'unpleased': ['unelapsed', 'unpleased'], 'unpleat': ['plutean', 'unpetal', 'unpleat'], 'unpleated': ['pendulate', 'unpleated'], 'unplied': ['unpiled', 'unplied'], 'unplug': ['ungulp', 'unplug'], 'unplumed': ['pendulum', 'unlumped', 'unplumed'], 'unpoled': ['duplone', 'unpoled'], 'unpolished': ['disulphone', 'unpolished'], 'unpolitic': ['punctilio', 'unpolitic'], 'unpooled': ['unlooped', 'unpooled'], 'unposted': ['outspend', 'unposted'], 'unpot': ['punto', 'unpot', 'untop'], 'unprayed': ['underpay', 'unprayed'], 'unprelatic': ['periculant', 'unprelatic'], 'unpressed': ['resuspend', 'suspender', 'unpressed'], 'unpricked': ['underpick', 'unpricked'], 'unprint': ['turnpin', 'unprint'], 'unprosaic': ['inocarpus', 'unprosaic'], 'unproselyted': ['pseudelytron', 'unproselyted'], 'unproud': ['roundup', 'unproud'], 'unpursued': ['unpursued', 'unusurped'], 'unpursuing': ['unpursuing', 'unusurping'], 'unquietable': ['unequitable', 'unquietable'], 'unrabbeted': ['beturbaned', 'unrabbeted'], 'unraced': ['durance', 'redunca', 'unraced'], 'unraided': ['underaid', 'unraided'], 'unraised': ['denarius', 'desaurin', 'unraised'], 'unram': ['muran', 'ruman', 'unarm', 'unram', 'urman'], 'unranked': ['undarken', 'unranked'], 'unraped': ['undrape', 'unpared', 'unraped'], 'unrasped': ['undersap', 'unparsed', 'unrasped', 'unspared', 'unspread'], 'unrated': ['daunter', 'unarted', 'unrated', 'untread'], 'unravel': ['unravel', 'venular'], 'unray': ['anury', 'unary', 'unray'], 'unrayed': ['unrayed', 'unready'], 'unreactive': ['uncreative', 'unreactive'], 'unread': ['endura', 'neurad', 'undear', 'unread'], 'unready': ['unrayed', 'unready'], 'unreal': ['lunare', 'neural', 'ulnare', 'unreal'], 'unrealism': ['semilunar', 'unrealism'], 'unrealist': ['neuralist', 'ulsterian', 'unrealist'], 'unrealmed': ['denumeral', 'undermeal', 'unrealmed'], 'unrebated': ['eburnated', 'underbeat', 'unrebated'], 'unrebutted': ['unbuttered', 'unrebutted'], 'unreceived': ['undeceiver', 'unreceived'], 'unrecent': ['uncenter', 'unrecent'], 'unrecited': ['centuried', 'unrecited'], 'unrectifiable': ['uncertifiable', 'unrectifiable'], 'unrectified': ['uncertified', 'unrectified'], 'unred': ['runed', 'under', 'unred'], 'unredacted': ['underacted', 'unredacted'], 'unreduct': ['undercut', 'unreduct'], 'unreeve': ['revenue', 'unreeve'], 'unreeving': ['unreeving', 'unveering'], 'unregal': ['granule', 'unlarge', 'unregal'], 'unregard': ['grandeur', 'unregard'], 'unregarded': ['undergrade', 'unregarded'], 'unrein': ['enruin', 'neurin', 'unrein'], 'unreinstated': ['unreinstated', 'unstraitened'], 'unrelated': ['unaltered', 'unrelated'], 'unrelating': ['unaltering', 'unrelating'], 'unreleased': ['underlease', 'unreleased'], 'unrelegated': ['underlegate', 'unrelegated'], 'unremarked': ['undermaker', 'unremarked'], 'unrent': ['runnet', 'tunner', 'unrent'], 'unrented': ['unrented', 'untender'], 'unrepaid': ['unpaired', 'unrepaid'], 'unrepentable': ['unpenetrable', 'unrepentable'], 'unrepined': ['unrepined', 'unripened'], 'unrepining': ['unrepining', 'unripening'], 'unreplaced': ['unparceled', 'unreplaced'], 'unreplied': ['underpile', 'unreplied'], 'unreposed': ['underpose', 'unreposed'], 'unreputed': ['unerupted', 'unreputed'], 'unrescinded': ['undiscerned', 'unrescinded'], 'unrescued': ['unrescued', 'unsecured'], 'unreserved': ['underserve', 'underverse', 'undeserver', 'unreserved', 'unreversed'], 'unresisted': ['unresisted', 'unsistered'], 'unresolve': ['nervulose', 'unresolve', 'vulnerose'], 'unrespect': ['unrespect', 'unscepter', 'unsceptre'], 'unrespected': ['unrespected', 'unsceptered'], 'unrested': ['sederunt', 'underset', 'undesert', 'unrested'], 'unresting': ['insurgent', 'unresting'], 'unretarded': ['undertread', 'unretarded'], 'unreticent': ['entincture', 'unreticent'], 'unretired': ['reintrude', 'unretired'], 'unrevered': ['enverdure', 'unrevered'], 'unreversed': ['underserve', 'underverse', 'undeserver', 'unreserved', 'unreversed'], 'unreviled': ['underlive', 'unreviled'], 'unrevised': ['undiverse', 'unrevised'], 'unrevocable': ['uncoverable', 'unrevocable'], 'unribbed': ['unbribed', 'unribbed'], 'unrich': ['unrich', 'urchin'], 'unrid': ['rundi', 'unrid'], 'unridable': ['indurable', 'unbrailed', 'unridable'], 'unriddle': ['underlid', 'unriddle'], 'unride': ['diurne', 'inured', 'ruined', 'unride'], 'unridged': ['underdig', 'ungirded', 'unridged'], 'unrig': ['irgun', 'ruing', 'unrig'], 'unright': ['hurting', 'ungirth', 'unright'], 'unrighted': ['ungirthed', 'unrighted'], 'unring': ['unring', 'urning'], 'unringed': ['enduring', 'unringed'], 'unripe': ['purine', 'unripe', 'uprein'], 'unripely': ['pyruline', 'unripely'], 'unripened': ['unrepined', 'unripened'], 'unripening': ['unrepining', 'unripening'], 'unroaded': ['unadored', 'unroaded'], 'unrobed': ['beround', 'bounder', 'rebound', 'unbored', 'unorbed', 'unrobed'], 'unrocked': ['uncorked', 'unrocked'], 'unroot': ['notour', 'unroot'], 'unroped': ['pounder', 'repound', 'unroped'], 'unrosed': ['resound', 'sounder', 'unrosed'], 'unrostrated': ['tetrandrous', 'unrostrated'], 'unrotated': ['rotundate', 'unrotated'], 'unroted': ['tendour', 'unroted'], 'unroused': ['unroused', 'unsoured'], 'unrouted': ['unrouted', 'untoured'], 'unrowed': ['rewound', 'unrowed', 'wounder'], 'unroweled': ['unlowered', 'unroweled'], 'unroyalist': ['unroyalist', 'unsolitary'], 'unruined': ['uninured', 'unruined'], 'unruled': ['unlured', 'unruled'], 'unrun': ['unrun', 'unurn'], 'unruth': ['unhurt', 'unruth'], 'unsack': ['uncask', 'unsack'], 'unsacked': ['uncasked', 'unsacked'], 'unsacred': ['unsacred', 'unscared'], 'unsad': ['sudan', 'unsad'], 'unsadden': ['unsadden', 'unsanded'], 'unsage': ['gnaeus', 'unsage'], 'unsaid': ['sudani', 'unsaid'], 'unsailed': ['unaisled', 'unsailed'], 'unsaint': ['antisun', 'unsaint', 'unsatin', 'unstain'], 'unsainted': ['unsainted', 'unstained'], 'unsalt': ['sultan', 'unsalt'], 'unsalted': ['unsalted', 'unslated', 'unstaled'], 'unsanded': ['unsadden', 'unsanded'], 'unsardonic': ['andronicus', 'unsardonic'], 'unsashed': ['sunshade', 'unsashed'], 'unsatable': ['sublanate', 'unsatable'], 'unsatiable': ['balaustine', 'unsatiable'], 'unsatin': ['antisun', 'unsaint', 'unsatin', 'unstain'], 'unsauced': ['uncaused', 'unsauced'], 'unscale': ['censual', 'unscale'], 'unscalloped': ['uncollapsed', 'unscalloped'], 'unscaly': ['ancylus', 'unscaly'], 'unscared': ['unsacred', 'unscared'], 'unscepter': ['unrespect', 'unscepter', 'unsceptre'], 'unsceptered': ['unrespected', 'unsceptered'], 'unsceptre': ['unrespect', 'unscepter', 'unsceptre'], 'unscoured': ['uncoursed', 'unscoured'], 'unseal': ['elanus', 'unseal'], 'unsealable': ['unleasable', 'unsealable'], 'unsealed': ['unleased', 'unsealed'], 'unseared': ['undersea', 'unerased', 'unseared'], 'unseat': ['nasute', 'nauset', 'unseat'], 'unseated': ['unseated', 'unsedate', 'unteased'], 'unsecured': ['unrescued', 'unsecured'], 'unsedate': ['unseated', 'unsedate', 'unteased'], 'unsee': ['ensue', 'seenu', 'unsee'], 'unseethed': ['unseethed', 'unsheeted'], 'unseizable': ['unseizable', 'unsizeable'], 'unselect': ['esculent', 'unselect'], 'unsensed': ['nudeness', 'unsensed'], 'unsensitive': ['unitiveness', 'unsensitive'], 'unsent': ['unnest', 'unsent'], 'unsepulcher': ['unsepulcher', 'unsepulchre'], 'unsepulchre': ['unsepulcher', 'unsepulchre'], 'unserrated': ['unarrested', 'unserrated'], 'unserved': ['unserved', 'unversed'], 'unset': ['unset', 'usent'], 'unsevered': ['undeserve', 'unsevered'], 'unsewed': ['sunweed', 'unsewed'], 'unsex': ['nexus', 'unsex'], 'unshaded': ['undashed', 'unshaded'], 'unshaled': ['unhalsed', 'unlashed', 'unshaled'], 'unshamed': ['unmashed', 'unshamed'], 'unshaped': ['unhasped', 'unphased', 'unshaped'], 'unsharing': ['ungarnish', 'unsharing'], 'unsharped': ['unphrased', 'unsharped'], 'unsharpened': ['undershapen', 'unsharpened'], 'unsheared': ['unhearsed', 'unsheared'], 'unsheet': ['enthuse', 'unsheet'], 'unsheeted': ['unseethed', 'unsheeted'], 'unship': ['inpush', 'punish', 'unship'], 'unshipment': ['punishment', 'unshipment'], 'unshoe': ['unhose', 'unshoe'], 'unshoed': ['unhosed', 'unshoed'], 'unshore': ['unhorse', 'unshore'], 'unshored': ['enshroud', 'unshored'], 'unshortened': ['underhonest', 'unshortened'], 'unsicker': ['cruisken', 'unsicker'], 'unsickled': ['klendusic', 'unsickled'], 'unsight': ['gutnish', 'husting', 'unsight'], 'unsignable': ['unsignable', 'unsingable'], 'unsigned': ['undesign', 'unsigned', 'unsinged'], 'unsigneted': ['uningested', 'unsigneted'], 'unsilenced': ['unlicensed', 'unsilenced'], 'unsimple': ['splenium', 'unsimple'], 'unsin': ['sunni', 'unsin'], 'unsingable': ['unsignable', 'unsingable'], 'unsinged': ['undesign', 'unsigned', 'unsinged'], 'unsistered': ['unresisted', 'unsistered'], 'unsizeable': ['unseizable', 'unsizeable'], 'unskin': ['insunk', 'unskin'], 'unslate': ['sultane', 'unslate'], 'unslated': ['unsalted', 'unslated', 'unstaled'], 'unslating': ['unlasting', 'unslating'], 'unslept': ['unslept', 'unspelt'], 'unslighted': ['sunlighted', 'unslighted'], 'unslit': ['insult', 'sunlit', 'unlist', 'unslit'], 'unslot': ['unlost', 'unslot'], 'unsmeared': ['underseam', 'unsmeared'], 'unsmiled': ['muslined', 'unmisled', 'unsmiled'], 'unsnap': ['pannus', 'sannup', 'unsnap', 'unspan'], 'unsnatch': ['unsnatch', 'unstanch'], 'unsnow': ['unsnow', 'unsown'], 'unsocial': ['sualocin', 'unsocial'], 'unsoil': ['insoul', 'linous', 'nilous', 'unsoil'], 'unsoiled': ['delusion', 'unsoiled'], 'unsoldier': ['undersoil', 'unsoldier'], 'unsole': ['ensoul', 'olenus', 'unsole'], 'unsolitary': ['unroyalist', 'unsolitary'], 'unsomber': ['unsomber', 'unsombre'], 'unsombre': ['unsomber', 'unsombre'], 'unsome': ['nomeus', 'unsome'], 'unsore': ['souren', 'unsore', 'ursone'], 'unsort': ['tornus', 'unsort'], 'unsortable': ['neuroblast', 'unsortable'], 'unsorted': ['tonsured', 'unsorted', 'unstored'], 'unsoured': ['unroused', 'unsoured'], 'unsown': ['unsnow', 'unsown'], 'unspan': ['pannus', 'sannup', 'unsnap', 'unspan'], 'unspar': ['surnap', 'unspar'], 'unspared': ['undersap', 'unparsed', 'unrasped', 'unspared', 'unspread'], 'unsparred': ['underspar', 'unsparred'], 'unspecterlike': ['unspecterlike', 'unspectrelike'], 'unspectrelike': ['unspecterlike', 'unspectrelike'], 'unsped': ['unsped', 'upsend'], 'unspelt': ['unslept', 'unspelt'], 'unsphering': ['gunnership', 'unsphering'], 'unspiable': ['subalpine', 'unspiable'], 'unspike': ['spunkie', 'unspike'], 'unspit': ['ptinus', 'unspit'], 'unspoil': ['pulsion', 'unspoil', 'upsilon'], 'unspot': ['pontus', 'unspot', 'unstop'], 'unspread': ['undersap', 'unparsed', 'unrasped', 'unspared', 'unspread'], 'unstabled': ['dunstable', 'unblasted', 'unstabled'], 'unstain': ['antisun', 'unsaint', 'unsatin', 'unstain'], 'unstained': ['unsainted', 'unstained'], 'unstaled': ['unsalted', 'unslated', 'unstaled'], 'unstanch': ['unsnatch', 'unstanch'], 'unstar': ['saturn', 'unstar'], 'unstatable': ['unstatable', 'untastable'], 'unstate': ['tetanus', 'unstate', 'untaste'], 'unstateable': ['unstateable', 'untasteable'], 'unstated': ['unstated', 'untasted'], 'unstating': ['unstating', 'untasting'], 'unstayed': ['unstayed', 'unsteady'], 'unsteady': ['unstayed', 'unsteady'], 'unstercorated': ['countertrades', 'unstercorated'], 'unstern': ['stunner', 'unstern'], 'unstocked': ['duckstone', 'unstocked'], 'unstoic': ['cotinus', 'suction', 'unstoic'], 'unstoical': ['suctional', 'sulcation', 'unstoical'], 'unstop': ['pontus', 'unspot', 'unstop'], 'unstopple': ['pulpstone', 'unstopple'], 'unstore': ['snouter', 'tonsure', 'unstore'], 'unstored': ['tonsured', 'unsorted', 'unstored'], 'unstoried': ['detrusion', 'tinderous', 'unstoried'], 'unstormed': ['undermost', 'unstormed'], 'unstrain': ['insurant', 'unstrain'], 'unstrained': ['understain', 'unstrained'], 'unstraitened': ['unreinstated', 'unstraitened'], 'unstranded': ['understand', 'unstranded'], 'unstrewed': ['unstrewed', 'unwrested'], 'unsucculent': ['centunculus', 'unsucculent'], 'unsued': ['unsued', 'unused'], 'unsusceptible': ['unsusceptible', 'unsuspectible'], 'unsusceptive': ['unsusceptive', 'unsuspective'], 'unsuspectible': ['unsusceptible', 'unsuspectible'], 'unsuspective': ['unsusceptive', 'unsuspective'], 'untactful': ['fluctuant', 'untactful'], 'untailed': ['nidulate', 'untailed'], 'untame': ['unmate', 'untame', 'unteam'], 'untamed': ['unmated', 'untamed'], 'untanned': ['nunnated', 'untanned'], 'untap': ['punta', 'unapt', 'untap'], 'untar': ['arnut', 'tuarn', 'untar'], 'untastable': ['unstatable', 'untastable'], 'untaste': ['tetanus', 'unstate', 'untaste'], 'untasteable': ['unstateable', 'untasteable'], 'untasted': ['unstated', 'untasted'], 'untasting': ['unstating', 'untasting'], 'untaught': ['taungthu', 'untaught'], 'untaunted': ['unattuned', 'untaunted'], 'unteach': ['uncheat', 'unteach'], 'unteaching': ['uncheating', 'unteaching'], 'unteam': ['unmate', 'untame', 'unteam'], 'unteamed': ['unmeated', 'unteamed'], 'unteased': ['unseated', 'unsedate', 'unteased'], 'unteem': ['unmeet', 'unteem'], 'untemper': ['erumpent', 'untemper'], 'untender': ['unrented', 'untender'], 'untented': ['unnetted', 'untented'], 'unthatch': ['nuthatch', 'unthatch'], 'unthick': ['kutchin', 'unthick'], 'unthrall': ['turnhall', 'unthrall'], 'untiaraed': ['diuranate', 'untiaraed'], 'untidy': ['nudity', 'untidy'], 'untie': ['intue', 'unite', 'untie'], 'untied': ['dunite', 'united', 'untied'], 'until': ['unlit', 'until'], 'untile': ['lutein', 'untile'], 'untiled': ['diluent', 'untiled'], 'untilted': ['dilutent', 'untilted', 'untitled'], 'untimely': ['minutely', 'untimely'], 'untin': ['nintu', 'ninut', 'untin'], 'untine': ['ineunt', 'untine'], 'untinseled': ['unenlisted', 'unlistened', 'untinseled'], 'untirable': ['untirable', 'untriable'], 'untire': ['runite', 'triune', 'uniter', 'untire'], 'untired': ['intrude', 'turdine', 'untired', 'untried'], 'untithable': ['unhittable', 'untithable'], 'untitled': ['dilutent', 'untilted', 'untitled'], 'unto': ['tuno', 'unto'], 'untoiled': ['outlined', 'untoiled'], 'untoned': ['unnoted', 'untoned'], 'untooled': ['unlooted', 'untooled'], 'untop': ['punto', 'unpot', 'untop'], 'untorn': ['tunnor', 'untorn'], 'untortured': ['undertutor', 'untortured'], 'untotalled': ['unallotted', 'untotalled'], 'untouch': ['uncouth', 'untouch'], 'untoured': ['unrouted', 'untoured'], 'untrace': ['centaur', 'untrace'], 'untraceable': ['uncreatable', 'untraceable'], 'untraceableness': ['uncreatableness', 'untraceableness'], 'untraced': ['uncarted', 'uncrated', 'underact', 'untraced'], 'untraceried': ['antireducer', 'reincrudate', 'untraceried'], 'untradeable': ['untradeable', 'untreadable'], 'untrain': ['antirun', 'untrain', 'urinant'], 'untread': ['daunter', 'unarted', 'unrated', 'untread'], 'untreadable': ['untradeable', 'untreadable'], 'untreatable': ['entablature', 'untreatable'], 'untreed': ['denture', 'untreed'], 'untriable': ['untirable', 'untriable'], 'untribal': ['tribunal', 'turbinal', 'untribal'], 'untriced': ['undirect', 'untriced'], 'untried': ['intrude', 'turdine', 'untired', 'untried'], 'untrig': ['ungirt', 'untrig'], 'untrod': ['rotund', 'untrod'], 'untropical': ['ponticular', 'untropical'], 'untroubled': ['outblunder', 'untroubled'], 'untrowed': ['undertow', 'untrowed'], 'untruss': ['sturnus', 'untruss'], 'untutored': ['outturned', 'untutored'], 'unurn': ['unrun', 'unurn'], 'unused': ['unsued', 'unused'], 'unusurped': ['unpursued', 'unusurped'], 'unusurping': ['unpursuing', 'unusurping'], 'unvailable': ['invaluable', 'unvailable'], 'unveering': ['unreeving', 'unveering'], 'unveil': ['unevil', 'unlive', 'unveil'], 'unveiled': ['unlevied', 'unveiled'], 'unveined': ['unenvied', 'unveined'], 'unvenerated': ['unenervated', 'unvenerated'], 'unveniable': ['unenviable', 'unveniable'], 'unveritable': ['unavertible', 'unveritable'], 'unversed': ['unserved', 'unversed'], 'unvessel': ['unvessel', 'usselven'], 'unvest': ['unvest', 'venust'], 'unvomited': ['unmotived', 'unvomited'], 'unwagered': ['underwage', 'unwagered'], 'unwan': ['unwan', 'wunna'], 'unware': ['unware', 'wauner'], 'unwarp': ['unwarp', 'unwrap'], 'unwary': ['runway', 'unwary'], 'unwavered': ['underwave', 'unwavered'], 'unwept': ['unwept', 'upwent'], 'unwon': ['unown', 'unwon'], 'unwrap': ['unwarp', 'unwrap'], 'unwrested': ['unstrewed', 'unwrested'], 'unwronged': ['undergown', 'unwronged'], 'unyoung': ['unyoung', 'youngun'], 'unze': ['unze', 'zenu'], 'up': ['pu', 'up'], 'uparching': ['ungraphic', 'uparching'], 'uparise': ['spuriae', 'uparise', 'upraise'], 'uparna': ['purana', 'uparna'], 'upas': ['apus', 'supa', 'upas'], 'upblast': ['subplat', 'upblast'], 'upblow': ['blowup', 'upblow'], 'upbreak': ['breakup', 'upbreak'], 'upbuild': ['buildup', 'upbuild'], 'upcast': ['catsup', 'upcast'], 'upcatch': ['catchup', 'upcatch'], 'upclimb': ['plumbic', 'upclimb'], 'upclose': ['culpose', 'ploceus', 'upclose'], 'upcock': ['cockup', 'upcock'], 'upcoil': ['oilcup', 'upcoil'], 'upcourse': ['cupreous', 'upcourse'], 'upcover': ['overcup', 'upcover'], 'upcreep': ['prepuce', 'upcreep'], 'upcurrent': ['puncturer', 'upcurrent'], 'upcut': ['cutup', 'upcut'], 'updo': ['doup', 'updo'], 'updraw': ['updraw', 'upward'], 'updry': ['prudy', 'purdy', 'updry'], 'upeat': ['taupe', 'upeat'], 'upflare': ['rapeful', 'upflare'], 'upflower': ['powerful', 'upflower'], 'upgale': ['plague', 'upgale'], 'upget': ['getup', 'upget'], 'upgirt': ['ripgut', 'upgirt'], 'upgo': ['goup', 'ogpu', 'upgo'], 'upgrade': ['guepard', 'upgrade'], 'uphelm': ['phleum', 'uphelm'], 'uphold': ['holdup', 'uphold'], 'upholder': ['reuphold', 'upholder'], 'upholsterer': ['reupholster', 'upholsterer'], 'upla': ['paul', 'upla'], 'upland': ['dunlap', 'upland'], 'uplander': ['pendular', 'underlap', 'uplander'], 'uplane': ['unpale', 'uplane'], 'upleap': ['papule', 'upleap'], 'uplift': ['tipful', 'uplift'], 'uplifter': ['reuplift', 'uplifter'], 'upline': ['lupine', 'unpile', 'upline'], 'uplock': ['lockup', 'uplock'], 'upon': ['noup', 'puno', 'upon'], 'uppers': ['supper', 'uppers'], 'uppish': ['hippus', 'uppish'], 'upraise': ['spuriae', 'uparise', 'upraise'], 'uprear': ['parure', 'uprear'], 'uprein': ['purine', 'unripe', 'uprein'], 'uprip': ['ripup', 'uprip'], 'uprisal': ['parulis', 'spirula', 'uprisal'], 'uprisement': ['episternum', 'uprisement'], 'upriser': ['siruper', 'upriser'], 'uprist': ['purist', 'spruit', 'uprist', 'upstir'], 'uproad': ['podura', 'uproad'], 'uproom': ['moorup', 'uproom'], 'uprose': ['poseur', 'pouser', 'souper', 'uprose'], 'upscale': ['capsule', 'specula', 'upscale'], 'upseal': ['apulse', 'upseal'], 'upsend': ['unsped', 'upsend'], 'upset': ['setup', 'stupe', 'upset'], 'upsettable': ['subpeltate', 'upsettable'], 'upsetter': ['upsetter', 'upstreet'], 'upshore': ['ephorus', 'orpheus', 'upshore'], 'upshot': ['tophus', 'upshot'], 'upshut': ['pushtu', 'upshut'], 'upsilon': ['pulsion', 'unspoil', 'upsilon'], 'upsit': ['puist', 'upsit'], 'upslant': ['pulsant', 'upslant'], 'upsmite': ['impetus', 'upsmite'], 'upsoar': ['parous', 'upsoar'], 'upstair': ['tapirus', 'upstair'], 'upstand': ['dustpan', 'upstand'], 'upstare': ['pasteur', 'pasture', 'upstare'], 'upstater': ['stuprate', 'upstater'], 'upsteal': ['pulsate', 'spatule', 'upsteal'], 'upstem': ['septum', 'upstem'], 'upstir': ['purist', 'spruit', 'uprist', 'upstir'], 'upstraight': ['straightup', 'upstraight'], 'upstreet': ['upsetter', 'upstreet'], 'upstrive': ['spurtive', 'upstrive'], 'upsun': ['sunup', 'upsun'], 'upsway': ['upsway', 'upways'], 'uptake': ['ketupa', 'uptake'], 'uptend': ['pudent', 'uptend'], 'uptilt': ['tiltup', 'uptilt'], 'uptoss': ['tossup', 'uptoss'], 'uptrace': ['capture', 'uptrace'], 'uptrain': ['pintura', 'puritan', 'uptrain'], 'uptree': ['repute', 'uptree'], 'uptrend': ['prudent', 'prunted', 'uptrend'], 'upturn': ['turnup', 'upturn'], 'upward': ['updraw', 'upward'], 'upwarp': ['upwarp', 'upwrap'], 'upways': ['upsway', 'upways'], 'upwent': ['unwept', 'upwent'], 'upwind': ['upwind', 'windup'], 'upwrap': ['upwarp', 'upwrap'], 'ura': ['aru', 'rua', 'ura'], 'uracil': ['curial', 'lauric', 'uracil', 'uralic'], 'uraemic': ['maurice', 'uraemic'], 'uraeus': ['aureus', 'uraeus'], 'ural': ['alur', 'laur', 'lura', 'raul', 'ural'], 'urali': ['rauli', 'urali', 'urial'], 'uralian': ['lunaria', 'ulnaria', 'uralian'], 'uralic': ['curial', 'lauric', 'uracil', 'uralic'], 'uralite': ['laurite', 'uralite'], 'uralitize': ['ritualize', 'uralitize'], 'uramido': ['doarium', 'uramido'], 'uramil': ['rimula', 'uramil'], 'uramino': ['mainour', 'uramino'], 'uran': ['raun', 'uran', 'urna'], 'uranate': ['taurean', 'uranate'], 'urania': ['anuria', 'urania'], 'uranic': ['anuric', 'cinura', 'uranic'], 'uranine': ['aneurin', 'uranine'], 'uranism': ['surinam', 'uranism'], 'uranite': ['ruinate', 'taurine', 'uranite', 'urinate'], 'uranographist': ['guarantorship', 'uranographist'], 'uranolite': ['outlinear', 'uranolite'], 'uranoscope': ['oenocarpus', 'uranoscope'], 'uranospinite': ['resupination', 'uranospinite'], 'uranotil': ['rotulian', 'uranotil'], 'uranous': ['anurous', 'uranous'], 'uranyl': ['lunary', 'uranyl'], 'uranylic': ['culinary', 'uranylic'], 'urari': ['aurir', 'urari'], 'urase': ['serau', 'urase'], 'uratic': ['tauric', 'uratic', 'urtica'], 'urazine': ['azurine', 'urazine'], 'urban': ['buran', 'unbar', 'urban'], 'urbane': ['eburna', 'unbare', 'unbear', 'urbane'], 'urbanite': ['braunite', 'urbanite', 'urbinate'], 'urbian': ['burian', 'urbian'], 'urbification': ['rubification', 'urbification'], 'urbify': ['rubify', 'urbify'], 'urbinate': ['braunite', 'urbanite', 'urbinate'], 'urceiform': ['eruciform', 'urceiform'], 'urceole': ['urceole', 'urocele'], 'urceolina': ['aleuronic', 'urceolina'], 'urceolus': ['ulcerous', 'urceolus'], 'urchin': ['unrich', 'urchin'], 'urd': ['rud', 'urd'], 'urde': ['duer', 'dure', 'rude', 'urde'], 'urdee': ['redue', 'urdee'], 'ure': ['rue', 'ure'], 'ureal': ['alure', 'ureal'], 'uredine': ['reindue', 'uredine'], 'ureic': ['curie', 'ureic'], 'uremia': ['aumrie', 'uremia'], 'uremic': ['cerium', 'uremic'], 'urena': ['urena', 'urnae'], 'urent': ['enrut', 'tuner', 'urent'], 'uresis': ['issuer', 'uresis'], 'uretal': ['tulare', 'uretal'], 'ureter': ['retrue', 'ureter'], 'ureteropyelogram': ['pyeloureterogram', 'ureteropyelogram'], 'urethan': ['haunter', 'nauther', 'unearth', 'unheart', 'urethan'], 'urethrascope': ['heterocarpus', 'urethrascope'], 'urethrocystitis': ['cystourethritis', 'urethrocystitis'], 'urethylan': ['unearthly', 'urethylan'], 'uretic': ['curite', 'teucri', 'uretic'], 'urf': ['fur', 'urf'], 'urge': ['grue', 'urge'], 'urgent': ['gunter', 'gurnet', 'urgent'], 'urger': ['regur', 'urger'], 'uria': ['arui', 'uria'], 'uriah': ['huari', 'uriah'], 'urial': ['rauli', 'urali', 'urial'], 'urian': ['aurin', 'urian'], 'uric': ['cuir', 'uric'], 'urinal': ['laurin', 'urinal'], 'urinant': ['antirun', 'untrain', 'urinant'], 'urinate': ['ruinate', 'taurine', 'uranite', 'urinate'], 'urination': ['ruination', 'urination'], 'urinator': ['ruinator', 'urinator'], 'urine': ['inure', 'urine'], 'urinogenitary': ['genitourinary', 'urinogenitary'], 'urinous': ['ruinous', 'urinous'], 'urinousness': ['ruinousness', 'urinousness'], 'urite': ['urite', 'uteri'], 'urlar': ['rural', 'urlar'], 'urled': ['duler', 'urled'], 'urling': ['ruling', 'urling'], 'urman': ['muran', 'ruman', 'unarm', 'unram', 'urman'], 'urn': ['run', 'urn'], 'urna': ['raun', 'uran', 'urna'], 'urnae': ['urena', 'urnae'], 'urnal': ['lunar', 'ulnar', 'urnal'], 'urnful': ['unfurl', 'urnful'], 'urning': ['unring', 'urning'], 'uro': ['our', 'uro'], 'urocele': ['urceole', 'urocele'], 'urodela': ['roulade', 'urodela'], 'urodelan': ['unloader', 'urodelan'], 'urogaster': ['surrogate', 'urogaster'], 'urogenital': ['regulation', 'urogenital'], 'uroglena': ['lagunero', 'organule', 'uroglena'], 'urolithic': ['ulotrichi', 'urolithic'], 'urometer': ['outremer', 'urometer'], 'uronic': ['cuorin', 'uronic'], 'uropsile': ['perilous', 'uropsile'], 'uroseptic': ['crepitous', 'euproctis', 'uroseptic'], 'urosomatic': ['mortacious', 'urosomatic'], 'urosteon': ['outsnore', 'urosteon'], 'urosternite': ['tenuiroster', 'urosternite'], 'urosthenic': ['cetorhinus', 'urosthenic'], 'urostyle': ['elytrous', 'urostyle'], 'urs': ['rus', 'sur', 'urs'], 'ursa': ['rusa', 'saur', 'sura', 'ursa', 'usar'], 'ursal': ['larus', 'sural', 'ursal'], 'ursidae': ['residua', 'ursidae'], 'ursine': ['insure', 'rusine', 'ursine'], 'ursone': ['souren', 'unsore', 'ursone'], 'ursuk': ['kurus', 'ursuk'], 'ursula': ['laurus', 'ursula'], 'urtica': ['tauric', 'uratic', 'urtica'], 'urticales': ['sterculia', 'urticales'], 'urticant': ['taciturn', 'urticant'], 'urticose': ['citreous', 'urticose'], 'usability': ['suability', 'usability'], 'usable': ['suable', 'usable'], 'usager': ['sauger', 'usager'], 'usance': ['uncase', 'usance'], 'usar': ['rusa', 'saur', 'sura', 'ursa', 'usar'], 'usara': ['arusa', 'saura', 'usara'], 'use': ['sue', 'use'], 'usent': ['unset', 'usent'], 'user': ['ruse', 'suer', 'sure', 'user'], 'ush': ['shu', 'ush'], 'ushabti': ['habitus', 'ushabti'], 'ushak': ['kusha', 'shaku', 'ushak'], 'usher': ['shure', 'usher'], 'usitate': ['situate', 'usitate'], 'usnic': ['incus', 'usnic'], 'usque': ['equus', 'usque'], 'usselven': ['unvessel', 'usselven'], 'ust': ['stu', 'ust'], 'uster': ['serut', 'strue', 'turse', 'uster'], 'ustion': ['outsin', 'ustion'], 'ustorious': ['sutorious', 'ustorious'], 'ustulina': ['lutianus', 'nautilus', 'ustulina'], 'usucaption': ['uncaptious', 'usucaption'], 'usure': ['eurus', 'usure'], 'usurper': ['pursuer', 'usurper'], 'ut': ['tu', 'ut'], 'uta': ['tau', 'tua', 'uta'], 'utas': ['saut', 'tasu', 'utas'], 'utch': ['chut', 'tchu', 'utch'], 'ute': ['tue', 'ute'], 'uteri': ['urite', 'uteri'], 'uterine': ['neurite', 'retinue', 'reunite', 'uterine'], 'uterocervical': ['overcirculate', 'uterocervical'], 'uterus': ['suture', 'uterus'], 'utile': ['luite', 'utile'], 'utilizable': ['latibulize', 'utilizable'], 'utopian': ['opuntia', 'utopian'], 'utopism': ['positum', 'utopism'], 'utopist': ['outspit', 'utopist'], 'utricular': ['turricula', 'utricular'], 'utriculosaccular': ['sacculoutricular', 'utriculosaccular'], 'utrum': ['murut', 'utrum'], 'utterer': ['reutter', 'utterer'], 'uva': ['uva', 'vau'], 'uval': ['ulva', 'uval'], 'uveal': ['uveal', 'value'], 'uviol': ['uviol', 'vouli'], 'vacate': ['cavate', 'caveat', 'vacate'], 'vacation': ['octavian', 'octavina', 'vacation'], 'vacationer': ['acervation', 'vacationer'], 'vaccinal': ['clavacin', 'vaccinal'], 'vacillate': ['laticlave', 'vacillate'], 'vacillation': ['cavillation', 'vacillation'], 'vacuolate': ['autoclave', 'vacuolate'], 'vade': ['dave', 'deva', 'vade', 'veda'], 'vady': ['davy', 'vady'], 'vage': ['gave', 'vage', 'vega'], 'vagile': ['glaive', 'vagile'], 'vaginant': ['navigant', 'vaginant'], 'vaginate': ['navigate', 'vaginate'], 'vaginoabdominal': ['abdominovaginal', 'vaginoabdominal'], 'vaginoperineal': ['perineovaginal', 'vaginoperineal'], 'vaginovesical': ['vaginovesical', 'vesicovaginal'], 'vaguity': ['gavyuti', 'vaguity'], 'vai': ['iva', 'vai', 'via'], 'vail': ['vail', 'vali', 'vial', 'vila'], 'vain': ['ivan', 'vain', 'vina'], 'vair': ['ravi', 'riva', 'vair', 'vari', 'vira'], 'vakass': ['kavass', 'vakass'], 'vale': ['lave', 'vale', 'veal', 'vela'], 'valence': ['enclave', 'levance', 'valence'], 'valencia': ['valencia', 'valiance'], 'valent': ['levant', 'valent'], 'valentine': ['levantine', 'valentine'], 'valeria': ['reavail', 'valeria'], 'valeriana': ['laverania', 'valeriana'], 'valeric': ['caliver', 'caviler', 'claiver', 'clavier', 'valeric', 'velaric'], 'valerie': ['realive', 'valerie'], 'valerin': ['elinvar', 'ravelin', 'reanvil', 'valerin'], 'valerone': ['overlean', 'valerone'], 'valeryl': ['ravelly', 'valeryl'], 'valeur': ['valeur', 'valuer'], 'vali': ['vail', 'vali', 'vial', 'vila'], 'valiance': ['valencia', 'valiance'], 'valiant': ['latvian', 'valiant'], 'valine': ['alevin', 'alvine', 'valine', 'veinal', 'venial', 'vineal'], 'vallar': ['larval', 'vallar'], 'vallidom': ['vallidom', 'villadom'], 'vallota': ['lavolta', 'vallota'], 'valonia': ['novalia', 'valonia'], 'valor': ['valor', 'volar'], 'valsa': ['salva', 'valsa', 'vasal'], 'valse': ['salve', 'selva', 'slave', 'valse'], 'value': ['uveal', 'value'], 'valuer': ['valeur', 'valuer'], 'vamper': ['revamp', 'vamper'], 'vane': ['evan', 'nave', 'vane'], 'vaned': ['daven', 'vaned'], 'vangee': ['avenge', 'geneva', 'vangee'], 'vangeli': ['leaving', 'vangeli'], 'vanir': ['invar', 'ravin', 'vanir'], 'vanisher': ['enravish', 'ravenish', 'vanisher'], 'vansire': ['servian', 'vansire'], 'vapid': ['pavid', 'vapid'], 'vapidity': ['pavidity', 'vapidity'], 'vaporarium': ['parovarium', 'vaporarium'], 'vara': ['avar', 'vara'], 'varan': ['navar', 'varan', 'varna'], 'vare': ['aver', 'rave', 'vare', 'vera'], 'varec': ['carve', 'crave', 'varec'], 'vari': ['ravi', 'riva', 'vair', 'vari', 'vira'], 'variate': ['variate', 'vateria'], 'varices': ['varices', 'viscera'], 'varicula': ['avicular', 'varicula'], 'variegator': ['arrogative', 'variegator'], 'varier': ['arrive', 'varier'], 'varietal': ['lievaart', 'varietal'], 'variola': ['ovarial', 'variola'], 'various': ['saviour', 'various'], 'varlet': ['travel', 'varlet'], 'varletry': ['varletry', 'veratryl'], 'varna': ['navar', 'varan', 'varna'], 'varnish': ['shirvan', 'varnish'], 'varnisher': ['revarnish', 'varnisher'], 'varsha': ['avshar', 'varsha'], 'vasal': ['salva', 'valsa', 'vasal'], 'vase': ['aves', 'save', 'vase'], 'vasoepididymostomy': ['epididymovasostomy', 'vasoepididymostomy'], 'vat': ['tav', 'vat'], 'vateria': ['variate', 'vateria'], 'vaticide': ['cavitied', 'vaticide'], 'vaticinate': ['inactivate', 'vaticinate'], 'vaticination': ['inactivation', 'vaticination'], 'vatter': ['tavert', 'vatter'], 'vau': ['uva', 'vau'], 'vaudois': ['avidous', 'vaudois'], 'veal': ['lave', 'vale', 'veal', 'vela'], 'vealer': ['laveer', 'leaver', 'reveal', 'vealer'], 'vealiness': ['aliveness', 'vealiness'], 'vealy': ['leavy', 'vealy'], 'vector': ['covert', 'vector'], 'veda': ['dave', 'deva', 'vade', 'veda'], 'vedaic': ['advice', 'vedaic'], 'vedaism': ['adevism', 'vedaism'], 'vedana': ['nevada', 'vedana', 'venada'], 'vedanta': ['vedanta', 'vetanda'], 'vedantism': ['adventism', 'vedantism'], 'vedantist': ['adventist', 'vedantist'], 'vedist': ['divest', 'vedist'], 'vedro': ['dover', 'drove', 'vedro'], 'vee': ['eve', 'vee'], 'veen': ['even', 'neve', 'veen'], 'veer': ['ever', 'reve', 'veer'], 'veery': ['every', 'veery'], 'vega': ['gave', 'vage', 'vega'], 'vegasite': ['estivage', 'vegasite'], 'vegetarian': ['renavigate', 'vegetarian'], 'vei': ['vei', 'vie'], 'veil': ['evil', 'levi', 'live', 'veil', 'vile', 'vlei'], 'veiler': ['levier', 'relive', 'reveil', 'revile', 'veiler'], 'veiltail': ['illative', 'veiltail'], 'vein': ['vein', 'vine'], 'veinal': ['alevin', 'alvine', 'valine', 'veinal', 'venial', 'vineal'], 'veined': ['endive', 'envied', 'veined'], 'veiner': ['enrive', 'envier', 'veiner', 'verine'], 'veinless': ['evilness', 'liveness', 'veinless', 'vileness', 'vineless'], 'veinlet': ['veinlet', 'vinelet'], 'veinous': ['envious', 'niveous', 'veinous'], 'veinstone': ['veinstone', 'vonsenite'], 'veinwise': ['veinwise', 'vinewise'], 'vela': ['lave', 'vale', 'veal', 'vela'], 'velar': ['arvel', 'larve', 'laver', 'ravel', 'velar'], 'velaric': ['caliver', 'caviler', 'claiver', 'clavier', 'valeric', 'velaric'], 'velation': ['olivetan', 'velation'], 'velic': ['clive', 'velic'], 'veliform': ['overfilm', 'veliform'], 'velitation': ['levitation', 'tonalitive', 'velitation'], 'velo': ['levo', 'love', 'velo', 'vole'], 'velte': ['elvet', 'velte'], 'venada': ['nevada', 'vedana', 'venada'], 'venal': ['elvan', 'navel', 'venal'], 'venality': ['natively', 'venality'], 'venatic': ['catvine', 'venatic'], 'venation': ['innovate', 'venation'], 'venator': ['rotanev', 'venator'], 'venatorial': ['venatorial', 'venoatrial'], 'vendace': ['devance', 'vendace'], 'vender': ['revend', 'vender'], 'veneer': ['evener', 'veneer'], 'veneerer': ['reveneer', 'veneerer'], 'veneralia': ['ravenelia', 'veneralia'], 'venerant': ['revenant', 'venerant'], 'venerate': ['enervate', 'venerate'], 'veneration': ['enervation', 'veneration'], 'venerative': ['enervative', 'venerative'], 'venerator': ['enervator', 'renovater', 'venerator'], 'venerer': ['renerve', 'venerer'], 'veneres': ['sevener', 'veneres'], 'veneti': ['veneti', 'venite'], 'venetian': ['aventine', 'venetian'], 'venial': ['alevin', 'alvine', 'valine', 'veinal', 'venial', 'vineal'], 'venice': ['cevine', 'evince', 'venice'], 'venie': ['nieve', 'venie'], 'venite': ['veneti', 'venite'], 'venoatrial': ['venatorial', 'venoatrial'], 'venom': ['novem', 'venom'], 'venosinal': ['slovenian', 'venosinal'], 'venter': ['revent', 'venter'], 'ventrad': ['ventrad', 'verdant'], 'ventricose': ['convertise', 'ventricose'], 'ventrine': ['inventer', 'reinvent', 'ventrine', 'vintener'], 'ventrodorsad': ['dorsoventrad', 'ventrodorsad'], 'ventrodorsal': ['dorsoventral', 'ventrodorsal'], 'ventrodorsally': ['dorsoventrally', 'ventrodorsally'], 'ventrolateral': ['lateroventral', 'ventrolateral'], 'ventromedial': ['medioventral', 'ventromedial'], 'ventromesal': ['mesoventral', 'ventromesal'], 'venular': ['unravel', 'venular'], 'venus': ['nevus', 'venus'], 'venust': ['unvest', 'venust'], 'venutian': ['unnative', 'venutian'], 'vera': ['aver', 'rave', 'vare', 'vera'], 'veraciousness': ['oversauciness', 'veraciousness'], 'veratroidine': ['rederivation', 'veratroidine'], 'veratrole': ['relevator', 'revelator', 'veratrole'], 'veratryl': ['varletry', 'veratryl'], 'verbal': ['barvel', 'blaver', 'verbal'], 'verbality': ['verbality', 'veritably'], 'verbatim': ['ambivert', 'verbatim'], 'verbena': ['enbrave', 'verbena'], 'verberate': ['verberate', 'vertebrae'], 'verbose': ['observe', 'obverse', 'verbose'], 'verbosely': ['obversely', 'verbosely'], 'verdant': ['ventrad', 'verdant'], 'verdea': ['evader', 'verdea'], 'verdelho': ['overheld', 'verdelho'], 'verdin': ['driven', 'nervid', 'verdin'], 'verditer': ['diverter', 'redivert', 'verditer'], 'vergi': ['giver', 'vergi'], 'veri': ['rive', 'veri', 'vier', 'vire'], 'veridical': ['larvicide', 'veridical'], 'veridicous': ['recidivous', 'veridicous'], 'verily': ['livery', 'verily'], 'verine': ['enrive', 'envier', 'veiner', 'verine'], 'verism': ['verism', 'vermis'], 'verist': ['stiver', 'strive', 'verist'], 'veritable': ['avertible', 'veritable'], 'veritably': ['verbality', 'veritably'], 'vermian': ['minerva', 'vermian'], 'verminal': ['minerval', 'verminal'], 'vermis': ['verism', 'vermis'], 'vernacularist': ['intervascular', 'vernacularist'], 'vernal': ['nerval', 'vernal'], 'vernation': ['nervation', 'vernation'], 'vernicose': ['coversine', 'vernicose'], 'vernine': ['innerve', 'nervine', 'vernine'], 'veronese': ['overseen', 'veronese'], 'veronica': ['corvinae', 'veronica'], 'verpa': ['paver', 'verpa'], 'verre': ['rever', 'verre'], 'verrucous': ['recurvous', 'verrucous'], 'verruga': ['gravure', 'verruga'], 'versable': ['beslaver', 'servable', 'versable'], 'versal': ['salver', 'serval', 'slaver', 'versal'], 'versant': ['servant', 'versant'], 'versate': ['evestar', 'versate'], 'versation': ['overstain', 'servation', 'versation'], 'verse': ['serve', 'sever', 'verse'], 'verser': ['revers', 'server', 'verser'], 'verset': ['revest', 'servet', 'sterve', 'verset', 'vester'], 'versicule': ['reclusive', 'versicule'], 'versine': ['inverse', 'versine'], 'versioner': ['reversion', 'versioner'], 'versionist': ['overinsist', 'versionist'], 'verso': ['servo', 'verso'], 'versta': ['starve', 'staver', 'strave', 'tavers', 'versta'], 'vertebrae': ['verberate', 'vertebrae'], 'vertebrocostal': ['costovertebral', 'vertebrocostal'], 'vertebrosacral': ['sacrovertebral', 'vertebrosacral'], 'vertebrosternal': ['sternovertebral', 'vertebrosternal'], 'vertiginate': ['integrative', 'vertiginate', 'vinaigrette'], 'vesicant': ['cistvaen', 'vesicant'], 'vesicoabdominal': ['abdominovesical', 'vesicoabdominal'], 'vesicocervical': ['cervicovesical', 'vesicocervical'], 'vesicointestinal': ['intestinovesical', 'vesicointestinal'], 'vesicorectal': ['rectovesical', 'vesicorectal'], 'vesicovaginal': ['vaginovesical', 'vesicovaginal'], 'vespa': ['spave', 'vespa'], 'vespertine': ['presentive', 'pretensive', 'vespertine'], 'vespine': ['pensive', 'vespine'], 'vesta': ['stave', 'vesta'], 'vestalia': ['salivate', 'vestalia'], 'vestee': ['steeve', 'vestee'], 'vester': ['revest', 'servet', 'sterve', 'verset', 'vester'], 'vestibula': ['sublative', 'vestibula'], 'veta': ['tave', 'veta'], 'vetanda': ['vedanta', 'vetanda'], 'veteran': ['nervate', 'veteran'], 'veto': ['veto', 'voet', 'vote'], 'vetoer': ['revote', 'vetoer'], 'via': ['iva', 'vai', 'via'], 'vial': ['vail', 'vali', 'vial', 'vila'], 'vialful': ['fluavil', 'fluvial', 'vialful'], 'viand': ['divan', 'viand'], 'viander': ['invader', 'ravined', 'viander'], 'viatic': ['avitic', 'viatic'], 'viatica': ['aviatic', 'viatica'], 'vibrate': ['vibrate', 'vrbaite'], 'vicar': ['vicar', 'vraic'], 'vice': ['cive', 'vice'], 'vicegeral': ['vicegeral', 'viceregal'], 'viceregal': ['vicegeral', 'viceregal'], 'victoriate': ['recitativo', 'victoriate'], 'victrola': ['victrola', 'vortical'], 'victualer': ['lucrative', 'revictual', 'victualer'], 'vidonia': ['ovidian', 'vidonia'], 'viduinae': ['induviae', 'viduinae'], 'viduine': ['univied', 'viduine'], 'vie': ['vei', 'vie'], 'vienna': ['avenin', 'vienna'], 'vier': ['rive', 'veri', 'vier', 'vire'], 'vierling': ['reviling', 'vierling'], 'view': ['view', 'wive'], 'viewer': ['review', 'viewer'], 'vigilante': ['genitival', 'vigilante'], 'vigor': ['vigor', 'virgo'], 'vila': ['vail', 'vali', 'vial', 'vila'], 'vile': ['evil', 'levi', 'live', 'veil', 'vile', 'vlei'], 'vilehearted': ['evilhearted', 'vilehearted'], 'vilely': ['evilly', 'lively', 'vilely'], 'vileness': ['evilness', 'liveness', 'veinless', 'vileness', 'vineless'], 'villadom': ['vallidom', 'villadom'], 'villeiness': ['liveliness', 'villeiness'], 'villous': ['ovillus', 'villous'], 'vimana': ['maniva', 'vimana'], 'vina': ['ivan', 'vain', 'vina'], 'vinaigrette': ['integrative', 'vertiginate', 'vinaigrette'], 'vinaigrous': ['vinaigrous', 'viraginous'], 'vinal': ['alvin', 'anvil', 'nival', 'vinal'], 'vinalia': ['lavinia', 'vinalia'], 'vinata': ['avanti', 'vinata'], 'vinculate': ['vinculate', 'vulcanite'], 'vine': ['vein', 'vine'], 'vinea': ['avine', 'naive', 'vinea'], 'vineal': ['alevin', 'alvine', 'valine', 'veinal', 'venial', 'vineal'], 'vineatic': ['antivice', 'inactive', 'vineatic'], 'vinegarist': ['gainstrive', 'vinegarist'], 'vineless': ['evilness', 'liveness', 'veinless', 'vileness', 'vineless'], 'vinelet': ['veinlet', 'vinelet'], 'viner': ['riven', 'viner'], 'vinewise': ['veinwise', 'vinewise'], 'vinosity': ['nivosity', 'vinosity'], 'vintener': ['inventer', 'reinvent', 'ventrine', 'vintener'], 'vintneress': ['inventress', 'vintneress'], 'viola': ['oliva', 'viola'], 'violability': ['obliviality', 'violability'], 'violaceous': ['olivaceous', 'violaceous'], 'violanin': ['livonian', 'violanin'], 'violational': ['avolitional', 'violational'], 'violer': ['oliver', 'violer', 'virole'], 'violescent': ['olivescent', 'violescent'], 'violet': ['olivet', 'violet'], 'violette': ['olivette', 'violette'], 'violine': ['olivine', 'violine'], 'vipera': ['pavier', 'vipera'], 'viperess': ['pressive', 'viperess'], 'viperian': ['viperian', 'viperina'], 'viperina': ['viperian', 'viperina'], 'viperous': ['pervious', 'previous', 'viperous'], 'viperously': ['perviously', 'previously', 'viperously'], 'viperousness': ['perviousness', 'previousness', 'viperousness'], 'vira': ['ravi', 'riva', 'vair', 'vari', 'vira'], 'viraginian': ['irvingiana', 'viraginian'], 'viraginous': ['vinaigrous', 'viraginous'], 'viral': ['rival', 'viral'], 'virales': ['revisal', 'virales'], 'vire': ['rive', 'veri', 'vier', 'vire'], 'virent': ['invert', 'virent'], 'virgate': ['virgate', 'vitrage'], 'virgin': ['irving', 'riving', 'virgin'], 'virginly': ['rivingly', 'virginly'], 'virgo': ['vigor', 'virgo'], 'virile': ['livier', 'virile'], 'virole': ['oliver', 'violer', 'virole'], 'virose': ['rivose', 'virose'], 'virtual': ['virtual', 'vitular'], 'virtuose': ['virtuose', 'vitreous'], 'virulence': ['cervuline', 'virulence'], 'visa': ['avis', 'siva', 'visa'], 'viscera': ['varices', 'viscera'], 'visceration': ['insectivora', 'visceration'], 'visceroparietal': ['parietovisceral', 'visceroparietal'], 'visceropleural': ['pleurovisceral', 'visceropleural'], 'viscometer': ['semivector', 'viscometer'], 'viscontal': ['viscontal', 'volcanist'], 'vishal': ['lavish', 'vishal'], 'visioner': ['revision', 'visioner'], 'visit': ['visit', 'vitis'], 'visitant': ['nativist', 'visitant'], 'visitee': ['evisite', 'visitee'], 'visiter': ['revisit', 'visiter'], 'visitor': ['ivorist', 'visitor'], 'vistal': ['vistal', 'vitals'], 'visto': ['ovist', 'visto'], 'vitals': ['vistal', 'vitals'], 'vitis': ['visit', 'vitis'], 'vitochemical': ['chemicovital', 'vitochemical'], 'vitrage': ['virgate', 'vitrage'], 'vitrail': ['trivial', 'vitrail'], 'vitrailist': ['trivialist', 'vitrailist'], 'vitrain': ['vitrain', 'vitrina'], 'vitrean': ['avertin', 'vitrean'], 'vitreous': ['virtuose', 'vitreous'], 'vitrina': ['vitrain', 'vitrina'], 'vitrine': ['inviter', 'vitrine'], 'vitrophyric': ['thyroprivic', 'vitrophyric'], 'vitular': ['virtual', 'vitular'], 'vituperate': ['reputative', 'vituperate'], 'vlei': ['evil', 'levi', 'live', 'veil', 'vile', 'vlei'], 'vocaller': ['overcall', 'vocaller'], 'vocate': ['avocet', 'octave', 'vocate'], 'voet': ['veto', 'voet', 'vote'], 'voeten': ['voeten', 'voteen'], 'vogue': ['vogue', 'vouge'], 'voided': ['devoid', 'voided'], 'voider': ['devoir', 'voider'], 'voidless': ['dissolve', 'voidless'], 'voile': ['olive', 'ovile', 'voile'], 'volable': ['lovable', 'volable'], 'volage': ['lovage', 'volage'], 'volar': ['valor', 'volar'], 'volata': ['tavola', 'volata'], 'volatic': ['volatic', 'voltaic'], 'volcae': ['alcove', 'coeval', 'volcae'], 'volcanist': ['viscontal', 'volcanist'], 'vole': ['levo', 'love', 'velo', 'vole'], 'volery': ['overly', 'volery'], 'volitate': ['volitate', 'voltaite'], 'volley': ['lovely', 'volley'], 'volscian': ['slavonic', 'volscian'], 'volta': ['volta', 'votal'], 'voltaic': ['volatic', 'voltaic'], 'voltaite': ['volitate', 'voltaite'], 'volucrine': ['involucre', 'volucrine'], 'volunteerism': ['multinervose', 'volunteerism'], 'vomer': ['mover', 'vomer'], 'vomiter': ['revomit', 'vomiter'], 'vonsenite': ['veinstone', 'vonsenite'], 'vortical': ['victrola', 'vortical'], 'votal': ['volta', 'votal'], 'votary': ['travoy', 'votary'], 'vote': ['veto', 'voet', 'vote'], 'voteen': ['voeten', 'voteen'], 'voter': ['overt', 'rovet', 'torve', 'trove', 'voter'], 'vouge': ['vogue', 'vouge'], 'vouli': ['uviol', 'vouli'], 'vowed': ['devow', 'vowed'], 'vowel': ['vowel', 'wolve'], 'vraic': ['vicar', 'vraic'], 'vrbaite': ['vibrate', 'vrbaite'], 'vulcanite': ['vinculate', 'vulcanite'], 'vulnerose': ['nervulose', 'unresolve', 'vulnerose'], 'vulpic': ['pulvic', 'vulpic'], 'vulpine': ['pluvine', 'vulpine'], 'wa': ['aw', 'wa'], 'waag': ['awag', 'waag'], 'waasi': ['isawa', 'waasi'], 'wab': ['baw', 'wab'], 'wabi': ['biwa', 'wabi'], 'wabster': ['bestraw', 'wabster'], 'wac': ['caw', 'wac'], 'wachna': ['chawan', 'chwana', 'wachna'], 'wack': ['cawk', 'wack'], 'wacker': ['awreck', 'wacker'], 'wacky': ['cawky', 'wacky'], 'wad': ['awd', 'daw', 'wad'], 'wadder': ['edward', 'wadder', 'warded'], 'waddler': ['dawdler', 'waddler'], 'waddling': ['dawdling', 'waddling'], 'waddlingly': ['dawdlingly', 'waddlingly'], 'waddy': ['dawdy', 'waddy'], 'wadna': ['adawn', 'wadna'], 'wadset': ['wadset', 'wasted'], 'wae': ['awe', 'wae', 'wea'], 'waeg': ['waeg', 'wage', 'wega'], 'waer': ['waer', 'ware', 'wear'], 'waesome': ['awesome', 'waesome'], 'wag': ['gaw', 'wag'], 'wage': ['waeg', 'wage', 'wega'], 'wagerer': ['rewager', 'wagerer'], 'wages': ['swage', 'wages'], 'waggel': ['waggel', 'waggle'], 'waggle': ['waggel', 'waggle'], 'wagnerite': ['wagnerite', 'winterage'], 'wagon': ['gowan', 'wagon', 'wonga'], 'wah': ['haw', 'hwa', 'wah', 'wha'], 'wahehe': ['heehaw', 'wahehe'], 'wail': ['wail', 'wali'], 'wailer': ['lawrie', 'wailer'], 'wain': ['awin', 'wain'], 'wainer': ['newari', 'wainer'], 'wairsh': ['rawish', 'wairsh', 'warish'], 'waist': ['swati', 'waist'], 'waister': ['swertia', 'waister'], 'waiterage': ['garewaite', 'waiterage'], 'waitress': ['starwise', 'waitress'], 'waiwai': ['iwaiwa', 'waiwai'], 'wake': ['wake', 'weak', 'weka'], 'wakener': ['rewaken', 'wakener'], 'waker': ['waker', 'wreak'], 'wakes': ['askew', 'wakes'], 'wale': ['wale', 'weal'], 'waled': ['dwale', 'waled', 'weald'], 'waler': ['lerwa', 'waler'], 'wali': ['wail', 'wali'], 'waling': ['lawing', 'waling'], 'walk': ['lawk', 'walk'], 'walkout': ['outwalk', 'walkout'], 'walkover': ['overwalk', 'walkover'], 'walkside': ['sidewalk', 'walkside'], 'waller': ['rewall', 'waller'], 'wallet': ['wallet', 'wellat'], 'wallhick': ['hickwall', 'wallhick'], 'walloper': ['preallow', 'walloper'], 'wallower': ['rewallow', 'wallower'], 'walsh': ['shawl', 'walsh'], 'walt': ['twal', 'walt'], 'walter': ['lawter', 'walter'], 'wame': ['wame', 'weam'], 'wamp': ['mawp', 'wamp'], 'wan': ['awn', 'naw', 'wan'], 'wand': ['dawn', 'wand'], 'wander': ['andrew', 'redawn', 'wander', 'warden'], 'wandle': ['delawn', 'lawned', 'wandle'], 'wandlike': ['dawnlike', 'wandlike'], 'wandy': ['dawny', 'wandy'], 'wane': ['anew', 'wane', 'wean'], 'waned': ['awned', 'dewan', 'waned'], 'wang': ['gawn', 'gnaw', 'wang'], 'wanghee': ['wanghee', 'whangee'], 'wangler': ['wangler', 'wrangle'], 'waning': ['awning', 'waning'], 'wankle': ['knawel', 'wankle'], 'wanly': ['lawny', 'wanly'], 'want': ['nawt', 'tawn', 'want'], 'wanty': ['tawny', 'wanty'], 'wany': ['awny', 'wany', 'yawn'], 'wap': ['paw', 'wap'], 'war': ['raw', 'war'], 'warble': ['bawler', 'brelaw', 'rebawl', 'warble'], 'warbler': ['brawler', 'warbler'], 'warbling': ['brawling', 'warbling'], 'warblingly': ['brawlingly', 'warblingly'], 'warbly': ['brawly', 'byrlaw', 'warbly'], 'ward': ['draw', 'ward'], 'wardable': ['drawable', 'wardable'], 'warded': ['edward', 'wadder', 'warded'], 'warden': ['andrew', 'redawn', 'wander', 'warden'], 'warder': ['drawer', 'redraw', 'reward', 'warder'], 'warderer': ['redrawer', 'rewarder', 'warderer'], 'warding': ['drawing', 'ginward', 'warding'], 'wardman': ['manward', 'wardman'], 'wardmote': ['damewort', 'wardmote'], 'wardrobe': ['drawbore', 'wardrobe'], 'wardroom': ['roomward', 'wardroom'], 'wardship': ['shipward', 'wardship'], 'wardsman': ['manwards', 'wardsman'], 'ware': ['waer', 'ware', 'wear'], 'warehouse': ['housewear', 'warehouse'], 'warf': ['warf', 'wraf'], 'warish': ['rawish', 'wairsh', 'warish'], 'warlock': ['lacwork', 'warlock'], 'warmed': ['meward', 'warmed'], 'warmer': ['rewarm', 'warmer'], 'warmhouse': ['housewarm', 'warmhouse'], 'warmish': ['warmish', 'wishram'], 'warn': ['warn', 'wran'], 'warnel': ['lawner', 'warnel'], 'warner': ['rewarn', 'warner', 'warren'], 'warp': ['warp', 'wrap'], 'warper': ['prewar', 'rewrap', 'warper'], 'warree': ['rewear', 'warree', 'wearer'], 'warren': ['rewarn', 'warner', 'warren'], 'warri': ['warri', 'wirra'], 'warse': ['resaw', 'sawer', 'seraw', 'sware', 'swear', 'warse'], 'warsel': ['swaler', 'warsel', 'warsle'], 'warsle': ['swaler', 'warsel', 'warsle'], 'warst': ['straw', 'swart', 'warst'], 'warth': ['thraw', 'warth', 'whart', 'wrath'], 'warua': ['warua', 'waura'], 'warve': ['warve', 'waver'], 'wary': ['awry', 'wary'], 'was': ['saw', 'swa', 'was'], 'wasel': ['swale', 'sweal', 'wasel'], 'wash': ['shaw', 'wash'], 'washen': ['washen', 'whenas'], 'washer': ['hawser', 'rewash', 'washer'], 'washington': ['nowanights', 'washington'], 'washland': ['landwash', 'washland'], 'washoan': ['shawano', 'washoan'], 'washout': ['outwash', 'washout'], 'washy': ['shawy', 'washy'], 'wasnt': ['stawn', 'wasnt'], 'wasp': ['swap', 'wasp'], 'waspily': ['slipway', 'waspily'], 'wast': ['sawt', 'staw', 'swat', 'taws', 'twas', 'wast'], 'waste': ['awest', 'sweat', 'tawse', 'waste'], 'wasted': ['wadset', 'wasted'], 'wasteful': ['sweatful', 'wasteful'], 'wasteless': ['sweatless', 'wasteless'], 'wasteproof': ['sweatproof', 'wasteproof'], 'wastrel': ['wastrel', 'wrastle'], 'wat': ['taw', 'twa', 'wat'], 'watchdog': ['dogwatch', 'watchdog'], 'watchout': ['outwatch', 'watchout'], 'water': ['tawer', 'water', 'wreat'], 'waterbrain': ['brainwater', 'waterbrain'], 'watered': ['dewater', 'tarweed', 'watered'], 'waterer': ['rewater', 'waterer'], 'waterflood': ['floodwater', 'toadflower', 'waterflood'], 'waterhead': ['headwater', 'waterhead'], 'wateriness': ['earwitness', 'wateriness'], 'waterlog': ['galewort', 'waterlog'], 'watershed': ['drawsheet', 'watershed'], 'watery': ['tawery', 'watery'], 'wath': ['thaw', 'wath', 'what'], 'watt': ['twat', 'watt'], 'wauf': ['awfu', 'wauf'], 'wauner': ['unware', 'wauner'], 'waura': ['warua', 'waura'], 'waver': ['warve', 'waver'], 'waxer': ['rewax', 'waxer'], 'way': ['way', 'yaw'], 'wayback': ['backway', 'wayback'], 'waygang': ['gangway', 'waygang'], 'waygate': ['gateway', 'getaway', 'waygate'], 'wayman': ['manway', 'wayman'], 'ways': ['sway', 'ways', 'yaws'], 'wayside': ['sideway', 'wayside'], 'wea': ['awe', 'wae', 'wea'], 'weak': ['wake', 'weak', 'weka'], 'weakener': ['reweaken', 'weakener'], 'weakliness': ['weakliness', 'weaselskin'], 'weal': ['wale', 'weal'], 'weald': ['dwale', 'waled', 'weald'], 'weam': ['wame', 'weam'], 'wean': ['anew', 'wane', 'wean'], 'weanel': ['leewan', 'weanel'], 'wear': ['waer', 'ware', 'wear'], 'wearer': ['rewear', 'warree', 'wearer'], 'weasand': ['sandawe', 'weasand'], 'weaselskin': ['weakliness', 'weaselskin'], 'weather': ['weather', 'whereat', 'wreathe'], 'weathered': ['heartweed', 'weathered'], 'weaver': ['rewave', 'weaver'], 'webster': ['bestrew', 'webster'], 'wed': ['dew', 'wed'], 'wede': ['wede', 'weed'], 'wedge': ['gweed', 'wedge'], 'wedger': ['edgrew', 'wedger'], 'wedset': ['stewed', 'wedset'], 'wee': ['ewe', 'wee'], 'weed': ['wede', 'weed'], 'weedhook': ['hookweed', 'weedhook'], 'weedy': ['dewey', 'weedy'], 'ween': ['ween', 'wene'], 'weeps': ['sweep', 'weeps'], 'weet': ['twee', 'weet'], 'wega': ['waeg', 'wage', 'wega'], 'wegotism': ['twigsome', 'wegotism'], 'weigher': ['reweigh', 'weigher'], 'weir': ['weir', 'weri', 'wire'], 'weirangle': ['weirangle', 'wierangle'], 'weird': ['weird', 'wired', 'wride', 'wried'], 'weka': ['wake', 'weak', 'weka'], 'weld': ['lewd', 'weld'], 'weldable': ['ballweed', 'weldable'], 'welder': ['reweld', 'welder'], 'weldor': ['lowder', 'weldor', 'wordle'], 'welf': ['flew', 'welf'], 'welkin': ['welkin', 'winkel', 'winkle'], 'well': ['llew', 'well'], 'wellat': ['wallet', 'wellat'], 'wels': ['slew', 'wels'], 'welshry': ['shrewly', 'welshry'], 'welting': ['twingle', 'welting', 'winglet'], 'wem': ['mew', 'wem'], 'wen': ['new', 'wen'], 'wende': ['endew', 'wende'], 'wendi': ['dwine', 'edwin', 'wendi', 'widen', 'wined'], 'wene': ['ween', 'wene'], 'went': ['newt', 'went'], 'were': ['ewer', 'were'], 'weri': ['weir', 'weri', 'wire'], 'werther': ['werther', 'wherret'], 'wes': ['sew', 'wes'], 'weskit': ['weskit', 'wisket'], 'west': ['stew', 'west'], 'weste': ['sweet', 'weste'], 'westering': ['swingtree', 'westering'], 'westy': ['stewy', 'westy'], 'wet': ['tew', 'wet'], 'weta': ['tewa', 'twae', 'weta'], 'wetly': ['tewly', 'wetly'], 'wey': ['wey', 'wye', 'yew'], 'wha': ['haw', 'hwa', 'wah', 'wha'], 'whack': ['chawk', 'whack'], 'whale': ['whale', 'wheal'], 'wham': ['hawm', 'wham'], 'whame': ['whame', 'wheam'], 'whangee': ['wanghee', 'whangee'], 'whare': ['hawer', 'whare'], 'whart': ['thraw', 'warth', 'whart', 'wrath'], 'whase': ['hawse', 'shewa', 'whase'], 'what': ['thaw', 'wath', 'what'], 'whatreck': ['thwacker', 'whatreck'], 'whats': ['swath', 'whats'], 'wheal': ['whale', 'wheal'], 'wheam': ['whame', 'wheam'], 'wheat': ['awhet', 'wheat'], 'wheatear': ['aweather', 'wheatear'], 'wheedle': ['wheedle', 'wheeled'], 'wheel': ['hewel', 'wheel'], 'wheeled': ['wheedle', 'wheeled'], 'wheelroad': ['rowelhead', 'wheelroad'], 'wheer': ['hewer', 'wheer', 'where'], 'whein': ['whein', 'whine'], 'when': ['hewn', 'when'], 'whenas': ['washen', 'whenas'], 'whenso': ['whenso', 'whosen'], 'where': ['hewer', 'wheer', 'where'], 'whereat': ['weather', 'whereat', 'wreathe'], 'whereon': ['nowhere', 'whereon'], 'wherret': ['werther', 'wherret'], 'wherrit': ['wherrit', 'whirret', 'writher'], 'whet': ['hewt', 'thew', 'whet'], 'whichever': ['everwhich', 'whichever'], 'whicken': ['chewink', 'whicken'], 'whilter': ['whilter', 'whirtle'], 'whine': ['whein', 'whine'], 'whipper': ['prewhip', 'whipper'], 'whirler': ['rewhirl', 'whirler'], 'whirret': ['wherrit', 'whirret', 'writher'], 'whirtle': ['whilter', 'whirtle'], 'whisperer': ['rewhisper', 'whisperer'], 'whisson': ['snowish', 'whisson'], 'whist': ['swith', 'whist', 'whits', 'wisht'], 'whister': ['swither', 'whister', 'withers'], 'whit': ['whit', 'with'], 'white': ['white', 'withe'], 'whiten': ['whiten', 'withen'], 'whitener': ['rewhiten', 'whitener'], 'whitepot': ['whitepot', 'whitetop'], 'whites': ['swithe', 'whites'], 'whitetop': ['whitepot', 'whitetop'], 'whitewood': ['whitewood', 'withewood'], 'whitleather': ['therewithal', 'whitleather'], 'whitmanese': ['anthemwise', 'whitmanese'], 'whits': ['swith', 'whist', 'whits', 'wisht'], 'whity': ['whity', 'withy'], 'who': ['how', 'who'], 'whoever': ['everwho', 'however', 'whoever'], 'whole': ['howel', 'whole'], 'whomsoever': ['howsomever', 'whomsoever', 'whosomever'], 'whoreship': ['horsewhip', 'whoreship'], 'whort': ['throw', 'whort', 'worth', 'wroth'], 'whosen': ['whenso', 'whosen'], 'whosomever': ['howsomever', 'whomsoever', 'whosomever'], 'wicht': ['tchwi', 'wicht', 'witch'], 'widdle': ['widdle', 'wilded'], 'widely': ['dewily', 'widely', 'wieldy'], 'widen': ['dwine', 'edwin', 'wendi', 'widen', 'wined'], 'widener': ['rewiden', 'widener'], 'wideness': ['dewiness', 'wideness'], 'widgeon': ['gowdnie', 'widgeon'], 'wieldy': ['dewily', 'widely', 'wieldy'], 'wierangle': ['weirangle', 'wierangle'], 'wigan': ['awing', 'wigan'], 'wiggler': ['wiggler', 'wriggle'], 'wilded': ['widdle', 'wilded'], 'wildness': ['wildness', 'windless'], 'winchester': ['trenchwise', 'winchester'], 'windbreak': ['breakwind', 'windbreak'], 'winder': ['rewind', 'winder'], 'windgall': ['dingwall', 'windgall'], 'windles': ['swindle', 'windles'], 'windless': ['wildness', 'windless'], 'windstorm': ['stormwind', 'windstorm'], 'windup': ['upwind', 'windup'], 'wined': ['dwine', 'edwin', 'wendi', 'widen', 'wined'], 'winer': ['erwin', 'rewin', 'winer'], 'winglet': ['twingle', 'welting', 'winglet'], 'winkel': ['welkin', 'winkel', 'winkle'], 'winkle': ['welkin', 'winkel', 'winkle'], 'winklet': ['twinkle', 'winklet'], 'winnard': ['indrawn', 'winnard'], 'winnel': ['winnel', 'winnle'], 'winnle': ['winnel', 'winnle'], 'winsome': ['owenism', 'winsome'], 'wint': ['twin', 'wint'], 'winter': ['twiner', 'winter'], 'winterage': ['wagnerite', 'winterage'], 'wintered': ['interwed', 'wintered'], 'winterish': ['interwish', 'winterish'], 'winze': ['winze', 'wizen'], 'wips': ['wips', 'wisp'], 'wire': ['weir', 'weri', 'wire'], 'wired': ['weird', 'wired', 'wride', 'wried'], 'wirer': ['wirer', 'wrier'], 'wirra': ['warri', 'wirra'], 'wiselike': ['likewise', 'wiselike'], 'wiseman': ['manwise', 'wiseman'], 'wisen': ['sinew', 'swine', 'wisen'], 'wiser': ['swire', 'wiser'], 'wisewoman': ['wisewoman', 'womanwise'], 'wisher': ['rewish', 'wisher'], 'wishmay': ['wishmay', 'yahwism'], 'wishram': ['warmish', 'wishram'], 'wisht': ['swith', 'whist', 'whits', 'wisht'], 'wisket': ['weskit', 'wisket'], 'wisp': ['wips', 'wisp'], 'wispy': ['swipy', 'wispy'], 'wit': ['twi', 'wit'], 'witan': ['atwin', 'twain', 'witan'], 'witch': ['tchwi', 'wicht', 'witch'], 'witchetty': ['twitchety', 'witchetty'], 'with': ['whit', 'with'], 'withdrawer': ['rewithdraw', 'withdrawer'], 'withe': ['white', 'withe'], 'withen': ['whiten', 'withen'], 'wither': ['wither', 'writhe'], 'withered': ['redwithe', 'withered'], 'withering': ['withering', 'wrightine'], 'withers': ['swither', 'whister', 'withers'], 'withewood': ['whitewood', 'withewood'], 'within': ['inwith', 'within'], 'without': ['outwith', 'without'], 'withy': ['whity', 'withy'], 'wive': ['view', 'wive'], 'wiver': ['wiver', 'wrive'], 'wizen': ['winze', 'wizen'], 'wo': ['ow', 'wo'], 'woader': ['redowa', 'woader'], 'wob': ['bow', 'wob'], 'wod': ['dow', 'owd', 'wod'], 'woe': ['owe', 'woe'], 'woibe': ['bowie', 'woibe'], 'wold': ['dowl', 'wold'], 'wolf': ['flow', 'fowl', 'wolf'], 'wolfer': ['flower', 'fowler', 'reflow', 'wolfer'], 'wolter': ['rowlet', 'trowel', 'wolter'], 'wolve': ['vowel', 'wolve'], 'womanpost': ['postwoman', 'womanpost'], 'womanwise': ['wisewoman', 'womanwise'], 'won': ['now', 'own', 'won'], 'wonder': ['downer', 'wonder', 'worden'], 'wonderful': ['underflow', 'wonderful'], 'wone': ['enow', 'owen', 'wone'], 'wong': ['gown', 'wong'], 'wonga': ['gowan', 'wagon', 'wonga'], 'wonner': ['renown', 'wonner'], 'wont': ['nowt', 'town', 'wont'], 'wonted': ['towned', 'wonted'], 'woodbark': ['bookward', 'woodbark'], 'woodbind': ['bindwood', 'woodbind'], 'woodbush': ['bushwood', 'woodbush'], 'woodchat': ['chatwood', 'woodchat'], 'wooden': ['enwood', 'wooden'], 'woodfish': ['fishwood', 'woodfish'], 'woodhack': ['hackwood', 'woodhack'], 'woodhorse': ['horsewood', 'woodhorse'], 'woodness': ['sowdones', 'woodness'], 'woodpecker': ['peckerwood', 'woodpecker'], 'woodrock': ['corkwood', 'rockwood', 'woodrock'], 'woodsilver': ['silverwood', 'woodsilver'], 'woodstone': ['stonewood', 'woodstone'], 'woodworm': ['woodworm', 'wormwood'], 'wooled': ['dewool', 'elwood', 'wooled'], 'woons': ['swoon', 'woons'], 'woosh': ['howso', 'woosh'], 'wop': ['pow', 'wop'], 'worble': ['blower', 'bowler', 'reblow', 'worble'], 'word': ['drow', 'word'], 'wordage': ['dowager', 'wordage'], 'worden': ['downer', 'wonder', 'worden'], 'worder': ['reword', 'worder'], 'wordily': ['rowdily', 'wordily'], 'wordiness': ['rowdiness', 'wordiness'], 'wordle': ['lowder', 'weldor', 'wordle'], 'wordsman': ['sandworm', 'swordman', 'wordsman'], 'wordsmanship': ['swordmanship', 'wordsmanship'], 'wordy': ['dowry', 'rowdy', 'wordy'], 'wore': ['ower', 'wore'], 'workbasket': ['basketwork', 'workbasket'], 'workbench': ['benchwork', 'workbench'], 'workbook': ['bookwork', 'workbook'], 'workbox': ['boxwork', 'workbox'], 'workday': ['daywork', 'workday'], 'worker': ['rework', 'worker'], 'workhand': ['handwork', 'workhand'], 'workhouse': ['housework', 'workhouse'], 'working': ['kingrow', 'working'], 'workmaster': ['masterwork', 'workmaster'], 'workout': ['outwork', 'workout'], 'workpiece': ['piecework', 'workpiece'], 'workship': ['shipwork', 'workship'], 'workshop': ['shopwork', 'workshop'], 'worktime': ['timework', 'worktime'], 'wormed': ['deworm', 'wormed'], 'wormer': ['merrow', 'wormer'], 'wormroot': ['moorwort', 'rootworm', 'tomorrow', 'wormroot'], 'wormship': ['shipworm', 'wormship'], 'wormwood': ['woodworm', 'wormwood'], 'worse': ['owser', 'resow', 'serow', 'sower', 'swore', 'worse'], 'worset': ['restow', 'stower', 'towser', 'worset'], 'worst': ['strow', 'worst'], 'wort': ['trow', 'wort'], 'worth': ['throw', 'whort', 'worth', 'wroth'], 'worthful': ['worthful', 'wrothful'], 'worthily': ['worthily', 'wrothily'], 'worthiness': ['worthiness', 'wrothiness'], 'worthy': ['worthy', 'wrothy'], 'wot': ['tow', 'two', 'wot'], 'wots': ['sowt', 'stow', 'swot', 'wots'], 'wounder': ['rewound', 'unrowed', 'wounder'], 'woy': ['woy', 'yow'], 'wraf': ['warf', 'wraf'], 'wrainbolt': ['browntail', 'wrainbolt'], 'wraitly': ['wraitly', 'wrytail'], 'wran': ['warn', 'wran'], 'wrangle': ['wangler', 'wrangle'], 'wrap': ['warp', 'wrap'], 'wrapper': ['prewrap', 'wrapper'], 'wrastle': ['wastrel', 'wrastle'], 'wrath': ['thraw', 'warth', 'whart', 'wrath'], 'wreak': ['waker', 'wreak'], 'wreat': ['tawer', 'water', 'wreat'], 'wreath': ['rethaw', 'thawer', 'wreath'], 'wreathe': ['weather', 'whereat', 'wreathe'], 'wrest': ['strew', 'trews', 'wrest'], 'wrester': ['strewer', 'wrester'], 'wrestle': ['swelter', 'wrestle'], 'wride': ['weird', 'wired', 'wride', 'wried'], 'wried': ['weird', 'wired', 'wride', 'wried'], 'wrier': ['wirer', 'wrier'], 'wriggle': ['wiggler', 'wriggle'], 'wrightine': ['withering', 'wrightine'], 'wrinklet': ['twinkler', 'wrinklet'], 'write': ['twire', 'write'], 'writhe': ['wither', 'writhe'], 'writher': ['wherrit', 'whirret', 'writher'], 'written': ['twinter', 'written'], 'wrive': ['wiver', 'wrive'], 'wro': ['row', 'wro'], 'wroken': ['knower', 'reknow', 'wroken'], 'wrong': ['grown', 'wrong'], 'wrote': ['rowet', 'tower', 'wrote'], 'wroth': ['throw', 'whort', 'worth', 'wroth'], 'wrothful': ['worthful', 'wrothful'], 'wrothily': ['worthily', 'wrothily'], 'wrothiness': ['worthiness', 'wrothiness'], 'wrothy': ['worthy', 'wrothy'], 'wrytail': ['wraitly', 'wrytail'], 'wunna': ['unwan', 'wunna'], 'wyde': ['dewy', 'wyde'], 'wye': ['wey', 'wye', 'yew'], 'wype': ['pewy', 'wype'], 'wyson': ['snowy', 'wyson'], 'xanthein': ['xanthein', 'xanthine'], 'xanthine': ['xanthein', 'xanthine'], 'xanthopurpurin': ['purpuroxanthin', 'xanthopurpurin'], 'xema': ['amex', 'exam', 'xema'], 'xenia': ['axine', 'xenia'], 'xenial': ['alexin', 'xenial'], 'xenoparasite': ['exasperation', 'xenoparasite'], 'xeres': ['resex', 'xeres'], 'xerophytic': ['hypertoxic', 'xerophytic'], 'xerotic': ['excitor', 'xerotic'], 'xylic': ['cylix', 'xylic'], 'xylitone': ['xylitone', 'xylonite'], 'xylonite': ['xylitone', 'xylonite'], 'xylophone': ['oxyphenol', 'xylophone'], 'xylose': ['lyxose', 'xylose'], 'xyst': ['styx', 'xyst'], 'xyster': ['sextry', 'xyster'], 'xysti': ['sixty', 'xysti'], 'ya': ['ay', 'ya'], 'yaba': ['baya', 'yaba'], 'yabber': ['babery', 'yabber'], 'yacht': ['cathy', 'cyath', 'yacht'], 'yachtist': ['chastity', 'yachtist'], 'yad': ['ady', 'day', 'yad'], 'yaff': ['affy', 'yaff'], 'yagnob': ['boyang', 'yagnob'], 'yah': ['hay', 'yah'], 'yahwism': ['wishmay', 'yahwism'], 'yair': ['airy', 'yair'], 'yaird': ['dairy', 'diary', 'yaird'], 'yak': ['kay', 'yak'], 'yakan': ['kayan', 'yakan'], 'yakima': ['kamiya', 'yakima'], 'yakka': ['kayak', 'yakka'], 'yalb': ['ably', 'blay', 'yalb'], 'yali': ['ilya', 'yali'], 'yalla': ['allay', 'yalla'], 'yallaer': ['allayer', 'yallaer'], 'yam': ['amy', 'may', 'mya', 'yam'], 'yamel': ['mealy', 'yamel'], 'yamen': ['maney', 'yamen'], 'yamilke': ['maylike', 'yamilke'], 'yamph': ['phyma', 'yamph'], 'yan': ['any', 'nay', 'yan'], 'yana': ['anay', 'yana'], 'yander': ['denary', 'yander'], 'yap': ['pay', 'pya', 'yap'], 'yapness': ['synapse', 'yapness'], 'yapper': ['papery', 'prepay', 'yapper'], 'yapster': ['atrepsy', 'yapster'], 'yar': ['ary', 'ray', 'yar'], 'yarb': ['bray', 'yarb'], 'yard': ['adry', 'dray', 'yard'], 'yardage': ['drayage', 'yardage'], 'yarder': ['dreary', 'yarder'], 'yardman': ['drayman', 'yardman'], 'yare': ['aery', 'eyra', 'yare', 'year'], 'yark': ['kyar', 'yark'], 'yarl': ['aryl', 'lyra', 'ryal', 'yarl'], 'yarm': ['army', 'mary', 'myra', 'yarm'], 'yarn': ['nary', 'yarn'], 'yarr': ['arry', 'yarr'], 'yarrow': ['arrowy', 'yarrow'], 'yaruran': ['unarray', 'yaruran'], 'yas': ['say', 'yas'], 'yasht': ['hasty', 'yasht'], 'yat': ['tay', 'yat'], 'yate': ['yate', 'yeat', 'yeta'], 'yatter': ['attery', 'treaty', 'yatter'], 'yaw': ['way', 'yaw'], 'yawler': ['lawyer', 'yawler'], 'yawn': ['awny', 'wany', 'yawn'], 'yaws': ['sway', 'ways', 'yaws'], 'ye': ['ey', 'ye'], 'yea': ['aye', 'yea'], 'yeah': ['ahey', 'eyah', 'yeah'], 'year': ['aery', 'eyra', 'yare', 'year'], 'yeard': ['deary', 'deray', 'rayed', 'ready', 'yeard'], 'yearly': ['layery', 'yearly'], 'yearn': ['enray', 'yearn'], 'yearth': ['earthy', 'hearty', 'yearth'], 'yeast': ['teasy', 'yeast'], 'yeat': ['yate', 'yeat', 'yeta'], 'yeather': ['erythea', 'hetaery', 'yeather'], 'yed': ['dey', 'dye', 'yed'], 'yede': ['eyed', 'yede'], 'yee': ['eye', 'yee'], 'yeel': ['eely', 'yeel'], 'yees': ['yees', 'yese'], 'yegg': ['eggy', 'yegg'], 'yelk': ['kyle', 'yelk'], 'yelm': ['elmy', 'yelm'], 'yelmer': ['merely', 'yelmer'], 'yelper': ['peerly', 'yelper'], 'yemen': ['enemy', 'yemen'], 'yemeni': ['menyie', 'yemeni'], 'yen': ['eyn', 'nye', 'yen'], 'yender': ['redeny', 'yender'], 'yeo': ['yeo', 'yoe'], 'yeorling': ['legionry', 'yeorling'], 'yer': ['rye', 'yer'], 'yerb': ['brey', 'byre', 'yerb'], 'yerba': ['barye', 'beray', 'yerba'], 'yerd': ['dyer', 'yerd'], 'yere': ['eyer', 'eyre', 'yere'], 'yern': ['ryen', 'yern'], 'yes': ['sey', 'sye', 'yes'], 'yese': ['yees', 'yese'], 'yest': ['stey', 'yest'], 'yester': ['reesty', 'yester'], 'yestern': ['streyne', 'styrene', 'yestern'], 'yet': ['tye', 'yet'], 'yeta': ['yate', 'yeat', 'yeta'], 'yeth': ['they', 'yeth'], 'yether': ['theyre', 'yether'], 'yetlin': ['lenity', 'yetlin'], 'yew': ['wey', 'wye', 'yew'], 'yielden': ['needily', 'yielden'], 'yielder': ['reedily', 'reyield', 'yielder'], 'yildun': ['unidly', 'yildun'], 'yill': ['illy', 'lily', 'yill'], 'yirm': ['miry', 'rimy', 'yirm'], 'ym': ['my', 'ym'], 'yock': ['coky', 'yock'], 'yodel': ['doyle', 'yodel'], 'yoe': ['yeo', 'yoe'], 'yoghurt': ['troughy', 'yoghurt'], 'yogin': ['goyin', 'yogin'], 'yoi': ['iyo', 'yoi'], 'yoker': ['rokey', 'yoker'], 'yolk': ['kylo', 'yolk'], 'yom': ['moy', 'yom'], 'yomud': ['moudy', 'yomud'], 'yon': ['noy', 'yon'], 'yond': ['ondy', 'yond'], 'yonder': ['rodney', 'yonder'], 'yont': ['tony', 'yont'], 'yor': ['ory', 'roy', 'yor'], 'yore': ['oyer', 'roey', 'yore'], 'york': ['kory', 'roky', 'york'], 'yot': ['toy', 'yot'], 'yote': ['eyot', 'yote'], 'youngun': ['unyoung', 'youngun'], 'yours': ['soury', 'yours'], 'yoursel': ['elusory', 'yoursel'], 'yoven': ['envoy', 'nevoy', 'yoven'], 'yow': ['woy', 'yow'], 'yowl': ['lowy', 'owly', 'yowl'], 'yowler': ['lowery', 'owlery', 'rowley', 'yowler'], 'yowt': ['towy', 'yowt'], 'yox': ['oxy', 'yox'], 'yttrious': ['touristy', 'yttrious'], 'yuca': ['cuya', 'yuca'], 'yuckel': ['yuckel', 'yuckle'], 'yuckle': ['yuckel', 'yuckle'], 'yulan': ['unlay', 'yulan'], 'yurok': ['rouky', 'yurok'], 'zabian': ['banzai', 'zabian'], 'zabra': ['braza', 'zabra'], 'zacate': ['azteca', 'zacate'], 'zad': ['adz', 'zad'], 'zag': ['gaz', 'zag'], 'zain': ['nazi', 'zain'], 'zaman': ['namaz', 'zaman'], 'zamenis': ['sizeman', 'zamenis'], 'zaparoan': ['parazoan', 'zaparoan'], 'zaratite': ['tatarize', 'zaratite'], 'zati': ['itza', 'tiza', 'zati'], 'zeal': ['laze', 'zeal'], 'zealotism': ['solmizate', 'zealotism'], 'zebra': ['braze', 'zebra'], 'zein': ['inez', 'zein'], 'zelanian': ['annalize', 'zelanian'], 'zelatrice': ['cartelize', 'zelatrice'], 'zemmi': ['zemmi', 'zimme'], 'zendic': ['dezinc', 'zendic'], 'zenick': ['zenick', 'zincke'], 'zenu': ['unze', 'zenu'], 'zequin': ['quinze', 'zequin'], 'zerda': ['adzer', 'zerda'], 'zerma': ['mazer', 'zerma'], 'ziarat': ['atazir', 'ziarat'], 'zibet': ['bizet', 'zibet'], 'ziega': ['gaize', 'ziega'], 'zimme': ['zemmi', 'zimme'], 'zincite': ['citizen', 'zincite'], 'zincke': ['zenick', 'zincke'], 'zinco': ['zinco', 'zonic'], 'zion': ['nozi', 'zion'], 'zira': ['izar', 'zira'], 'zirconate': ['narcotize', 'zirconate'], 'zoa': ['azo', 'zoa'], 'zoanthidae': ['zoanthidae', 'zoanthidea'], 'zoanthidea': ['zoanthidae', 'zoanthidea'], 'zoarite': ['azorite', 'zoarite'], 'zobo': ['bozo', 'zobo'], 'zoeal': ['azole', 'zoeal'], 'zogan': ['gazon', 'zogan'], 'zolotink': ['zolotink', 'zolotnik'], 'zolotnik': ['zolotink', 'zolotnik'], 'zonaria': ['arizona', 'azorian', 'zonaria'], 'zoned': ['dozen', 'zoned'], 'zonic': ['zinco', 'zonic'], 'zonotrichia': ['chorization', 'rhizoctonia', 'zonotrichia'], 'zoonal': ['alonzo', 'zoonal'], 'zoonic': ['ozonic', 'zoonic'], 'zoonomic': ['monozoic', 'zoonomic'], 'zoopathy': ['phytozoa', 'zoopathy', 'zoophyta'], 'zoophilic': ['philozoic', 'zoophilic'], 'zoophilist': ['philozoist', 'zoophilist'], 'zoophyta': ['phytozoa', 'zoopathy', 'zoophyta'], 'zoospermatic': ['spermatozoic', 'zoospermatic'], 'zoosporic': ['sporozoic', 'zoosporic'], 'zootype': ['ozotype', 'zootype'], 'zyga': ['gazy', 'zyga'], 'zygal': ['glazy', 'zygal']} ================================================ FILE: strings/autocomplete_using_trie.py ================================================ from __future__ import annotations END = "#" class Trie: def __init__(self) -> None: self._trie: dict = {} def insert_word(self, text: str) -> None: trie = self._trie for char in text: if char not in trie: trie[char] = {} trie = trie[char] trie[END] = True def find_word(self, prefix: str) -> tuple | list: trie = self._trie for char in prefix: if char in trie: trie = trie[char] else: return [] return self._elements(trie) def _elements(self, d: dict) -> tuple: result = [] for c, v in d.items(): sub_result = [" "] if c == END else [(c + s) for s in self._elements(v)] result.extend(sub_result) return tuple(result) trie = Trie() words = ("depart", "detergent", "daring", "dog", "deer", "deal") for word in words: trie.insert_word(word) def autocomplete_using_trie(string: str) -> tuple: """ >>> trie = Trie() >>> for word in words: ... trie.insert_word(word) ... >>> matches = autocomplete_using_trie("de") >>> "detergent " in matches True >>> "dog " in matches False """ suffixes = trie.find_word(string) return tuple(string + word for word in suffixes) def main() -> None: print(autocomplete_using_trie("de")) if __name__ == "__main__": import doctest doctest.testmod() main() ================================================ FILE: strings/barcode_validator.py ================================================ """ https://en.wikipedia.org/wiki/Check_digit#Algorithms """ def get_check_digit(barcode: int) -> int: """ Returns the last digit of barcode by excluding the last digit first and then computing to reach the actual last digit from the remaining 12 digits. >>> get_check_digit(8718452538119) 9 >>> get_check_digit(87184523) 5 >>> get_check_digit(87193425381086) 9 >>> [get_check_digit(x) for x in range(0, 100, 10)] [0, 7, 4, 1, 8, 5, 2, 9, 6, 3] """ barcode //= 10 # exclude the last digit checker = False s = 0 # extract and check each digit while barcode != 0: mult = 1 if checker else 3 s += mult * (barcode % 10) barcode //= 10 checker = not checker return (10 - (s % 10)) % 10 def is_valid(barcode: int) -> bool: """ Checks for length of barcode and last-digit Returns boolean value of validity of barcode >>> is_valid(8718452538119) True >>> is_valid(87184525) False >>> is_valid(87193425381089) False >>> is_valid(0) False >>> is_valid(dwefgiweuf) Traceback (most recent call last): ... NameError: name 'dwefgiweuf' is not defined """ return len(str(barcode)) == 13 and get_check_digit(barcode) == barcode % 10 def get_barcode(barcode: str) -> int: """ Returns the barcode as an integer >>> get_barcode("8718452538119") 8718452538119 >>> get_barcode("dwefgiweuf") Traceback (most recent call last): ... ValueError: Barcode 'dwefgiweuf' has alphabetic characters. """ if str(barcode).isalpha(): msg = f"Barcode '{barcode}' has alphabetic characters." raise ValueError(msg) elif int(barcode) < 0: raise ValueError("The entered barcode has a negative value. Try again.") else: return int(barcode) if __name__ == "__main__": import doctest doctest.testmod() """ Enter a barcode. """ barcode = get_barcode(input("Barcode: ").strip()) if is_valid(barcode): print(f"'{barcode}' is a valid barcode.") else: print(f"'{barcode}' is NOT a valid barcode.") ================================================ FILE: strings/bitap_string_match.py ================================================ """ Bitap exact string matching https://en.wikipedia.org/wiki/Bitap_algorithm Searches for a pattern inside text, and returns the index of the first occurrence of the pattern. Both text and pattern consist of lowercase alphabetical characters only. Complexity: O(m*n) n = length of text m = length of pattern Python doctests can be run using this command: python3 -m doctest -v bitap_string_match.py """ def bitap_string_match(text: str, pattern: str) -> int: """ Retrieves the index of the first occurrence of pattern in text. Args: text: A string consisting only of lowercase alphabetical characters. pattern: A string consisting only of lowercase alphabetical characters. Returns: int: The index where pattern first occurs. Return -1 if not found. >>> bitap_string_match('abdabababc', 'ababc') 5 >>> bitap_string_match('aaaaaaaaaaaaaaaaaa', 'a') 0 >>> bitap_string_match('zxywsijdfosdfnso', 'zxywsijdfosdfnso') 0 >>> bitap_string_match('abdabababc', '') 0 >>> bitap_string_match('abdabababc', 'c') 9 >>> bitap_string_match('abdabababc', 'fofosdfo') -1 >>> bitap_string_match('abdab', 'fofosdfo') -1 """ if not pattern: return 0 m = len(pattern) if m > len(text): return -1 # Initial state of bit string 1110 state = ~1 # Bit = 0 if character appears at index, and 1 otherwise pattern_mask: list[int] = [~0] * 27 # 1111 for i, char in enumerate(pattern): # For the pattern mask for this character, set the bit to 0 for each i # the character appears. pattern_index: int = ord(char) - ord("a") pattern_mask[pattern_index] &= ~(1 << i) for i, char in enumerate(text): text_index = ord(char) - ord("a") # If this character does not appear in pattern, it's pattern mask is 1111. # Performing a bitwise OR between state and 1111 will reset the state to 1111 # and start searching the start of pattern again. state |= pattern_mask[text_index] state <<= 1 # If the mth bit (counting right to left) of the state is 0, then we have # found pattern in text if (state & (1 << m)) == 0: return i - m + 1 return -1 if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: strings/boyer_moore_search.py ================================================ """ The algorithm finds the pattern in given text using following rule. The bad-character rule considers the mismatched character in Text. The next occurrence of that character to the left in Pattern is found, If the mismatched character occurs to the left in Pattern, a shift is proposed that aligns text block and pattern. If the mismatched character does not occur to the left in Pattern, a shift is proposed that moves the entirety of Pattern past the point of mismatch in the text. If there is no mismatch then the pattern matches with text block. Time Complexity : O(n/m) n=length of main string m=length of pattern string """ class BoyerMooreSearch: """ Example usage: bms = BoyerMooreSearch(text="ABAABA", pattern="AB") positions = bms.bad_character_heuristic() where 'positions' contain the locations where the pattern was matched. """ def __init__(self, text: str, pattern: str): self.text, self.pattern = text, pattern self.textLen, self.patLen = len(text), len(pattern) def match_in_pattern(self, char: str) -> int: """ Finds the index of char in pattern in reverse order. Parameters : char (chr): character to be searched Returns : i (int): index of char from last in pattern -1 (int): if char is not found in pattern >>> bms = BoyerMooreSearch(text="ABAABA", pattern="AB") >>> bms.match_in_pattern("B") 1 """ for i in range(self.patLen - 1, -1, -1): if char == self.pattern[i]: return i return -1 def mismatch_in_text(self, current_pos: int) -> int: """ Find the index of mis-matched character in text when compared with pattern from last. Parameters : current_pos (int): current index position of text Returns : i (int): index of mismatched char from last in text -1 (int): if there is no mismatch between pattern and text block >>> bms = BoyerMooreSearch(text="ABAABA", pattern="AB") >>> bms.mismatch_in_text(2) 3 """ for i in range(self.patLen - 1, -1, -1): if self.pattern[i] != self.text[current_pos + i]: return current_pos + i return -1 def bad_character_heuristic(self) -> list[int]: """ Finds the positions of the pattern location. >>> bms = BoyerMooreSearch(text="ABAABA", pattern="AB") >>> bms.bad_character_heuristic() [0, 3] """ positions = [] for i in range(self.textLen - self.patLen + 1): mismatch_index = self.mismatch_in_text(i) if mismatch_index == -1: positions.append(i) else: match_index = self.match_in_pattern(self.text[mismatch_index]) i = ( mismatch_index - match_index ) # shifting index lgtm [py/multiple-definition] return positions if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: strings/camel_case_to_snake_case.py ================================================ def camel_to_snake_case(input_str: str) -> str: """ Transforms a camelCase (or PascalCase) string to snake_case >>> camel_to_snake_case("someRandomString") 'some_random_string' >>> camel_to_snake_case("SomeRandomStr#ng") 'some_random_str_ng' >>> camel_to_snake_case("123someRandom123String123") '123_some_random_123_string_123' >>> camel_to_snake_case("123SomeRandom123String123") '123_some_random_123_string_123' >>> camel_to_snake_case(123) Traceback (most recent call last): ... ValueError: Expected string as input, found """ # check for invalid input type if not isinstance(input_str, str): msg = f"Expected string as input, found {type(input_str)}" raise ValueError(msg) snake_str = "" for index, char in enumerate(input_str): if char.isupper(): snake_str += "_" + char.lower() # if char is lowercase but proceeded by a digit: elif input_str[index - 1].isdigit() and char.islower(): snake_str += "_" + char # if char is a digit proceeded by a letter: elif input_str[index - 1].isalpha() and char.isnumeric(): snake_str += "_" + char.lower() # if char is not alphanumeric: elif not char.isalnum(): snake_str += "_" else: snake_str += char # remove leading underscore if snake_str[0] == "_": snake_str = snake_str[1:] return snake_str if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: strings/can_string_be_rearranged_as_palindrome.py ================================================ # Created by susmith98 from collections import Counter from timeit import timeit # Problem Description: # Check if characters of the given string can be rearranged to form a palindrome. # Counter is faster for long strings and non-Counter is faster for short strings. def can_string_be_rearranged_as_palindrome_counter( input_str: str = "", ) -> bool: """ A Palindrome is a String that reads the same forward as it does backwards. Examples of Palindromes mom, dad, malayalam >>> can_string_be_rearranged_as_palindrome_counter("Momo") True >>> can_string_be_rearranged_as_palindrome_counter("Mother") False >>> can_string_be_rearranged_as_palindrome_counter("Father") False >>> can_string_be_rearranged_as_palindrome_counter("A man a plan a canal Panama") True """ return sum(c % 2 for c in Counter(input_str.replace(" ", "").lower()).values()) < 2 def can_string_be_rearranged_as_palindrome(input_str: str = "") -> bool: """ A Palindrome is a String that reads the same forward as it does backwards. Examples of Palindromes mom, dad, malayalam >>> can_string_be_rearranged_as_palindrome("Momo") True >>> can_string_be_rearranged_as_palindrome("Mother") False >>> can_string_be_rearranged_as_palindrome("Father") False >>> can_string_be_rearranged_as_palindrome_counter("A man a plan a canal Panama") True """ if len(input_str) == 0: return True lower_case_input_str = input_str.replace(" ", "").lower() # character_freq_dict: Stores the frequency of every character in the input string character_freq_dict: dict[str, int] = {} for character in lower_case_input_str: character_freq_dict[character] = character_freq_dict.get(character, 0) + 1 """ Above line of code is equivalent to: 1) Getting the frequency of current character till previous index >>> character_freq = character_freq_dict.get(character, 0) 2) Incrementing the frequency of current character by 1 >>> character_freq = character_freq + 1 3) Updating the frequency of current character >>> character_freq_dict[character] = character_freq """ """ OBSERVATIONS: Even length palindrome -> Every character appears even no.of times. Odd length palindrome -> Every character appears even no.of times except for one character. LOGIC: Step 1: We'll count number of characters that appear odd number of times i.e oddChar Step 2:If we find more than 1 character that appears odd number of times, It is not possible to rearrange as a palindrome """ odd_char = 0 for character_count in character_freq_dict.values(): if character_count % 2: odd_char += 1 return not odd_char > 1 def benchmark(input_str: str = "") -> None: """ Benchmark code for comparing above 2 functions """ print("\nFor string = ", input_str, ":") print( "> can_string_be_rearranged_as_palindrome_counter()", "\tans =", can_string_be_rearranged_as_palindrome_counter(input_str), "\ttime =", timeit( "z.can_string_be_rearranged_as_palindrome_counter(z.check_str)", setup="import __main__ as z", ), "seconds", ) print( "> can_string_be_rearranged_as_palindrome()", "\tans =", can_string_be_rearranged_as_palindrome(input_str), "\ttime =", timeit( "z.can_string_be_rearranged_as_palindrome(z.check_str)", setup="import __main__ as z", ), "seconds", ) if __name__ == "__main__": check_str = input( "Enter string to determine if it can be rearranged as a palindrome or not: " ).strip() benchmark(check_str) status = can_string_be_rearranged_as_palindrome_counter(check_str) print(f"{check_str} can {'' if status else 'not '}be rearranged as a palindrome") ================================================ FILE: strings/capitalize.py ================================================ def capitalize(sentence: str) -> str: """ Capitalizes the first letter of a sentence or word. >>> capitalize("hello world") 'Hello world' >>> capitalize("123 hello world") '123 hello world' >>> capitalize(" hello world") ' hello world' >>> capitalize("a") 'A' >>> capitalize("") '' """ if not sentence: return "" # Capitalize the first character if it's a lowercase letter # Concatenate the capitalized character with the rest of the string return sentence[0].upper() + sentence[1:] if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: strings/check_anagrams.py ================================================ """ wiki: https://en.wikipedia.org/wiki/Anagram """ from collections import defaultdict def check_anagrams(first_str: str, second_str: str) -> bool: """ Two strings are anagrams if they are made up of the same letters but are arranged differently (ignoring the case). >>> check_anagrams('Silent', 'Listen') True >>> check_anagrams('This is a string', 'Is this a string') True >>> check_anagrams('This is a string', 'Is this a string') True >>> check_anagrams('There', 'Their') False """ first_str = first_str.lower().strip() second_str = second_str.lower().strip() # Remove whitespace first_str = first_str.replace(" ", "") second_str = second_str.replace(" ", "") # Strings of different lengths are not anagrams if len(first_str) != len(second_str): return False # Default values for count should be 0 count: defaultdict[str, int] = defaultdict(int) # For each character in input strings, # increment count in the corresponding for i in range(len(first_str)): count[first_str[i]] += 1 count[second_str[i]] -= 1 return all(_count == 0 for _count in count.values()) if __name__ == "__main__": from doctest import testmod testmod() input_a = input("Enter the first string ").strip() input_b = input("Enter the second string ").strip() status = check_anagrams(input_a, input_b) print(f"{input_a} and {input_b} are {'' if status else 'not '}anagrams.") ================================================ FILE: strings/count_vowels.py ================================================ def count_vowels(s: str) -> int: """ Count the number of vowels in a given string. :param s: Input string to count vowels in. :return: Number of vowels in the input string. Examples: >>> count_vowels("hello world") 3 >>> count_vowels("HELLO WORLD") 3 >>> count_vowels("123 hello world") 3 >>> count_vowels("") 0 >>> count_vowels("a quick brown fox") 5 >>> count_vowels("the quick BROWN fox") 5 >>> count_vowels("PYTHON") 1 """ if not isinstance(s, str): raise TypeError("Input must be a string") vowels = "aeiouAEIOU" return sum(1 for char in s if char in vowels) if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: strings/credit_card_validator.py ================================================ """ Functions for testing the validity of credit card numbers. https://en.wikipedia.org/wiki/Luhn_algorithm """ def validate_initial_digits(credit_card_number: str) -> bool: """ Function to validate initial digits of a given credit card number. >>> valid = "4111111111111111 41111111111111 34 35 37 412345 523456 634567" >>> all(validate_initial_digits(cc) for cc in valid.split()) True >>> invalid = "14 25 76 32323 36111111111111" >>> all(validate_initial_digits(cc) is False for cc in invalid.split()) True """ return credit_card_number.startswith(("34", "35", "37", "4", "5", "6")) def luhn_validation(credit_card_number: str) -> bool: """ Function to luhn algorithm validation for a given credit card number. >>> luhn_validation('4111111111111111') True >>> luhn_validation('36111111111111') True >>> luhn_validation('41111111111111') False """ cc_number = credit_card_number total = 0 half_len = len(cc_number) - 2 for i in range(half_len, -1, -2): # double the value of every second digit digit = int(cc_number[i]) digit *= 2 # If doubling of a number results in a two digit number # i.e greater than 9(e.g., 6 x 2 = 12), # then add the digits of the product (e.g., 12: 1 + 2 = 3, 15: 1 + 5 = 6), # to get a single digit number. if digit > 9: digit %= 10 digit += 1 cc_number = cc_number[:i] + str(digit) + cc_number[i + 1 :] total += digit # Sum up the remaining digits for i in range(len(cc_number) - 1, -1, -2): total += int(cc_number[i]) return total % 10 == 0 def validate_credit_card_number(credit_card_number: str) -> bool: """ Function to validate the given credit card number. >>> validate_credit_card_number('4111111111111111') 4111111111111111 is a valid credit card number. True >>> validate_credit_card_number('helloworld$') helloworld$ is an invalid credit card number because it has nonnumerical characters. False >>> validate_credit_card_number('32323') 32323 is an invalid credit card number because of its length. False >>> validate_credit_card_number('32323323233232332323') 32323323233232332323 is an invalid credit card number because of its length. False >>> validate_credit_card_number('36111111111111') 36111111111111 is an invalid credit card number because of its first two digits. False >>> validate_credit_card_number('41111111111111') 41111111111111 is an invalid credit card number because it fails the Luhn check. False """ error_message = f"{credit_card_number} is an invalid credit card number because" if not credit_card_number.isdigit(): print(f"{error_message} it has nonnumerical characters.") return False if not 13 <= len(credit_card_number) <= 16: print(f"{error_message} of its length.") return False if not validate_initial_digits(credit_card_number): print(f"{error_message} of its first two digits.") return False if not luhn_validation(credit_card_number): print(f"{error_message} it fails the Luhn check.") return False print(f"{credit_card_number} is a valid credit card number.") return True if __name__ == "__main__": import doctest doctest.testmod() validate_credit_card_number("4111111111111111") validate_credit_card_number("32323") ================================================ FILE: strings/damerau_levenshtein_distance.py ================================================ """ This script is a implementation of the Damerau-Levenshtein distance algorithm. It's an algorithm that measures the edit distance between two string sequences More information about this algorithm can be found in this wikipedia article: https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance """ def damerau_levenshtein_distance(first_string: str, second_string: str) -> int: """ Implements the Damerau-Levenshtein distance algorithm that measures the edit distance between two strings. Parameters: first_string: The first string to compare second_string: The second string to compare Returns: distance: The edit distance between the first and second strings >>> damerau_levenshtein_distance("cat", "cut") 1 >>> damerau_levenshtein_distance("kitten", "sitting") 3 >>> damerau_levenshtein_distance("hello", "world") 4 >>> damerau_levenshtein_distance("book", "back") 2 >>> damerau_levenshtein_distance("container", "containment") 3 >>> damerau_levenshtein_distance("container", "containment") 3 """ # Create a dynamic programming matrix to store the distances dp_matrix = [[0] * (len(second_string) + 1) for _ in range(len(first_string) + 1)] # Initialize the matrix for i in range(len(first_string) + 1): dp_matrix[i][0] = i for j in range(len(second_string) + 1): dp_matrix[0][j] = j # Fill the matrix for i, first_char in enumerate(first_string, start=1): for j, second_char in enumerate(second_string, start=1): cost = int(first_char != second_char) dp_matrix[i][j] = min( dp_matrix[i - 1][j] + 1, # Deletion dp_matrix[i][j - 1] + 1, # Insertion dp_matrix[i - 1][j - 1] + cost, # Substitution ) if ( i > 1 and j > 1 and first_string[i - 1] == second_string[j - 2] and first_string[i - 2] == second_string[j - 1] ): # Transposition dp_matrix[i][j] = min(dp_matrix[i][j], dp_matrix[i - 2][j - 2] + cost) return dp_matrix[-1][-1] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: strings/detecting_english_programmatically.py ================================================ import os from string import ascii_letters LETTERS_AND_SPACE = ascii_letters + " \t\n" def load_dictionary() -> dict[str, None]: path = os.path.split(os.path.realpath(__file__)) english_words: dict[str, None] = {} with open(path[0] + "/dictionary.txt") as dictionary_file: for word in dictionary_file.read().split("\n"): english_words[word] = None return english_words ENGLISH_WORDS = load_dictionary() def get_english_count(message: str) -> float: message = message.upper() message = remove_non_letters(message) possible_words = message.split() matches = len([word for word in possible_words if word in ENGLISH_WORDS]) return float(matches) / len(possible_words) def remove_non_letters(message: str) -> str: """ >>> remove_non_letters("Hi! how are you?") 'Hi how are you' >>> remove_non_letters("P^y%t)h@o*n") 'Python' >>> remove_non_letters("1+1=2") '' >>> remove_non_letters("www.google.com/") 'wwwgooglecom' >>> remove_non_letters("") '' """ return "".join(symbol for symbol in message if symbol in LETTERS_AND_SPACE) def is_english( message: str, word_percentage: int = 20, letter_percentage: int = 85 ) -> bool: """ >>> is_english('Hello World') True >>> is_english('llold HorWd') False """ words_match = get_english_count(message) * 100 >= word_percentage num_letters = len(remove_non_letters(message)) message_letters_percentage = (float(num_letters) / len(message)) * 100 letters_match = message_letters_percentage >= letter_percentage return words_match and letters_match if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: strings/dictionary.txt ================================================ AARHUS AARON ABABA ABACK ABAFT ABANDON ABANDONED ABANDONING ABANDONMENT ABANDONS ABASE ABASED ABASEMENT ABASEMENTS ABASES ABASH ABASHED ABASHES ABASHING ABASING ABATE ABATED ABATEMENT ABATEMENTS ABATER ABATES ABATING ABBA ABBE ABBEY ABBEYS ABBOT ABBOTS ABBOTT ABBREVIATE ABBREVIATED ABBREVIATES ABBREVIATING ABBREVIATION ABBREVIATIONS ABBY ABDOMEN ABDOMENS ABDOMINAL ABDUCT ABDUCTED ABDUCTION ABDUCTIONS ABDUCTOR ABDUCTORS ABDUCTS ABE ABED ABEL ABELIAN ABELSON ABERDEEN ABERNATHY ABERRANT ABERRATION ABERRATIONS ABET ABETS ABETTED ABETTER ABETTING ABEYANCE ABHOR ABHORRED ABHORRENT ABHORRER ABHORRING ABHORS ABIDE ABIDED ABIDES ABIDING ABIDJAN ABIGAIL ABILENE ABILITIES ABILITY ABJECT ABJECTION ABJECTIONS ABJECTLY ABJECTNESS ABJURE ABJURED ABJURES ABJURING ABLATE ABLATED ABLATES ABLATING ABLATION ABLATIVE ABLAZE ABLE ABLER ABLEST ABLY ABNER ABNORMAL ABNORMALITIES ABNORMALITY ABNORMALLY ABO ABOARD ABODE ABODES ABOLISH ABOLISHED ABOLISHER ABOLISHERS ABOLISHES ABOLISHING ABOLISHMENT ABOLISHMENTS ABOLITION ABOLITIONIST ABOLITIONISTS ABOMINABLE ABOMINATE ABORIGINAL ABORIGINE ABORIGINES ABORT ABORTED ABORTING ABORTION ABORTIONS ABORTIVE ABORTIVELY ABORTS ABOS ABOUND ABOUNDED ABOUNDING ABOUNDS ABOUT ABOVE ABOVEBOARD ABOVEGROUND ABOVEMENTIONED ABRADE ABRADED ABRADES ABRADING ABRAHAM ABRAM ABRAMS ABRAMSON ABRASION ABRASIONS ABRASIVE ABREACTION ABREACTIONS ABREAST ABRIDGE ABRIDGED ABRIDGES ABRIDGING ABRIDGMENT ABROAD ABROGATE ABROGATED ABROGATES ABROGATING ABRUPT ABRUPTLY ABRUPTNESS ABSCESS ABSCESSED ABSCESSES ABSCISSA ABSCISSAS ABSCOND ABSCONDED ABSCONDING ABSCONDS ABSENCE ABSENCES ABSENT ABSENTED ABSENTEE ABSENTEEISM ABSENTEES ABSENTIA ABSENTING ABSENTLY ABSENTMINDED ABSENTS ABSINTHE ABSOLUTE ABSOLUTELY ABSOLUTENESS ABSOLUTES ABSOLUTION ABSOLVE ABSOLVED ABSOLVES ABSOLVING ABSORB ABSORBED ABSORBENCY ABSORBENT ABSORBER ABSORBING ABSORBS ABSORPTION ABSORPTIONS ABSORPTIVE ABSTAIN ABSTAINED ABSTAINER ABSTAINING ABSTAINS ABSTENTION ABSTENTIONS ABSTINENCE ABSTRACT ABSTRACTED ABSTRACTING ABSTRACTION ABSTRACTIONISM ABSTRACTIONIST ABSTRACTIONS ABSTRACTLY ABSTRACTNESS ABSTRACTOR ABSTRACTORS ABSTRACTS ABSTRUSE ABSTRUSENESS ABSURD ABSURDITIES ABSURDITY ABSURDLY ABU ABUNDANCE ABUNDANT ABUNDANTLY ABUSE ABUSED ABUSES ABUSING ABUSIVE ABUT ABUTMENT ABUTS ABUTTED ABUTTER ABUTTERS ABUTTING ABYSMAL ABYSMALLY ABYSS ABYSSES ABYSSINIA ABYSSINIAN ABYSSINIANS ACACIA ACADEMIA ACADEMIC ACADEMICALLY ACADEMICS ACADEMIES ACADEMY ACADIA ACAPULCO ACCEDE ACCEDED ACCEDES ACCELERATE ACCELERATED ACCELERATES ACCELERATING ACCELERATION ACCELERATIONS ACCELERATOR ACCELERATORS ACCELEROMETER ACCELEROMETERS ACCENT ACCENTED ACCENTING ACCENTS ACCENTUAL ACCENTUATE ACCENTUATED ACCENTUATES ACCENTUATING ACCENTUATION ACCEPT ACCEPTABILITY ACCEPTABLE ACCEPTABLY ACCEPTANCE ACCEPTANCES ACCEPTED ACCEPTER ACCEPTERS ACCEPTING ACCEPTOR ACCEPTORS ACCEPTS ACCESS ACCESSED ACCESSES ACCESSIBILITY ACCESSIBLE ACCESSIBLY ACCESSING ACCESSION ACCESSIONS ACCESSORIES ACCESSORS ACCESSORY ACCIDENT ACCIDENTAL ACCIDENTALLY ACCIDENTLY ACCIDENTS ACCLAIM ACCLAIMED ACCLAIMING ACCLAIMS ACCLAMATION ACCLIMATE ACCLIMATED ACCLIMATES ACCLIMATING ACCLIMATIZATION ACCLIMATIZED ACCOLADE ACCOLADES ACCOMMODATE ACCOMMODATED ACCOMMODATES ACCOMMODATING ACCOMMODATION ACCOMMODATIONS ACCOMPANIED ACCOMPANIES ACCOMPANIMENT ACCOMPANIMENTS ACCOMPANIST ACCOMPANISTS ACCOMPANY ACCOMPANYING ACCOMPLICE ACCOMPLICES ACCOMPLISH ACCOMPLISHED ACCOMPLISHER ACCOMPLISHERS ACCOMPLISHES ACCOMPLISHING ACCOMPLISHMENT ACCOMPLISHMENTS ACCORD ACCORDANCE ACCORDED ACCORDER ACCORDERS ACCORDING ACCORDINGLY ACCORDION ACCORDIONS ACCORDS ACCOST ACCOSTED ACCOSTING ACCOSTS ACCOUNT ACCOUNTABILITY ACCOUNTABLE ACCOUNTABLY ACCOUNTANCY ACCOUNTANT ACCOUNTANTS ACCOUNTED ACCOUNTING ACCOUNTS ACCRA ACCREDIT ACCREDITATION ACCREDITATIONS ACCREDITED ACCRETION ACCRETIONS ACCRUE ACCRUED ACCRUES ACCRUING ACCULTURATE ACCULTURATED ACCULTURATES ACCULTURATING ACCULTURATION ACCUMULATE ACCUMULATED ACCUMULATES ACCUMULATING ACCUMULATION ACCUMULATIONS ACCUMULATOR ACCUMULATORS ACCURACIES ACCURACY ACCURATE ACCURATELY ACCURATENESS ACCURSED ACCUSAL ACCUSATION ACCUSATIONS ACCUSATIVE ACCUSE ACCUSED ACCUSER ACCUSES ACCUSING ACCUSINGLY ACCUSTOM ACCUSTOMED ACCUSTOMING ACCUSTOMS ACE ACES ACETATE ACETONE ACETYLENE ACHAEAN ACHAEANS ACHE ACHED ACHES ACHIEVABLE ACHIEVE ACHIEVED ACHIEVEMENT ACHIEVEMENTS ACHIEVER ACHIEVERS ACHIEVES ACHIEVING ACHILLES ACHING ACID ACIDIC ACIDITIES ACIDITY ACIDLY ACIDS ACIDULOUS ACKERMAN ACKLEY ACKNOWLEDGE ACKNOWLEDGEABLE ACKNOWLEDGED ACKNOWLEDGEMENT ACKNOWLEDGEMENTS ACKNOWLEDGER ACKNOWLEDGERS ACKNOWLEDGES ACKNOWLEDGING ACKNOWLEDGMENT ACKNOWLEDGMENTS ACME ACNE ACOLYTE ACOLYTES ACORN ACORNS ACOUSTIC ACOUSTICAL ACOUSTICALLY ACOUSTICIAN ACOUSTICS ACQUAINT ACQUAINTANCE ACQUAINTANCES ACQUAINTED ACQUAINTING ACQUAINTS ACQUIESCE ACQUIESCED ACQUIESCENCE ACQUIESCENT ACQUIESCES ACQUIESCING ACQUIRABLE ACQUIRE ACQUIRED ACQUIRES ACQUIRING ACQUISITION ACQUISITIONS ACQUISITIVE ACQUISITIVENESS ACQUIT ACQUITS ACQUITTAL ACQUITTED ACQUITTER ACQUITTING ACRE ACREAGE ACRES ACRID ACRIMONIOUS ACRIMONY ACROBAT ACROBATIC ACROBATICS ACROBATS ACRONYM ACRONYMS ACROPOLIS ACROSS ACRYLIC ACT ACTA ACTAEON ACTED ACTING ACTINIUM ACTINOMETER ACTINOMETERS ACTION ACTIONS ACTIVATE ACTIVATED ACTIVATES ACTIVATING ACTIVATION ACTIVATIONS ACTIVATOR ACTIVATORS ACTIVE ACTIVELY ACTIVISM ACTIVIST ACTIVISTS ACTIVITIES ACTIVITY ACTON ACTOR ACTORS ACTRESS ACTRESSES ACTS ACTUAL ACTUALITIES ACTUALITY ACTUALIZATION ACTUALLY ACTUALS ACTUARIAL ACTUARIALLY ACTUATE ACTUATED ACTUATES ACTUATING ACTUATOR ACTUATORS ACUITY ACUMEN ACUTE ACUTELY ACUTENESS ACYCLIC ACYCLICALLY ADA ADAGE ADAGES ADAGIO ADAGIOS ADAIR ADAM ADAMANT ADAMANTLY ADAMS ADAMSON ADAPT ADAPTABILITY ADAPTABLE ADAPTATION ADAPTATIONS ADAPTED ADAPTER ADAPTERS ADAPTING ADAPTIVE ADAPTIVELY ADAPTOR ADAPTORS ADAPTS ADD ADDED ADDEND ADDENDA ADDENDUM ADDER ADDERS ADDICT ADDICTED ADDICTING ADDICTION ADDICTIONS ADDICTS ADDING ADDIS ADDISON ADDITION ADDITIONAL ADDITIONALLY ADDITIONS ADDITIVE ADDITIVES ADDITIVITY ADDRESS ADDRESSABILITY ADDRESSABLE ADDRESSED ADDRESSEE ADDRESSEES ADDRESSER ADDRESSERS ADDRESSES ADDRESSING ADDRESSOGRAPH ADDS ADDUCE ADDUCED ADDUCES ADDUCIBLE ADDUCING ADDUCT ADDUCTED ADDUCTING ADDUCTION ADDUCTOR ADDUCTS ADELAIDE ADELE ADELIA ADEN ADEPT ADEQUACIES ADEQUACY ADEQUATE ADEQUATELY ADHERE ADHERED ADHERENCE ADHERENT ADHERENTS ADHERER ADHERERS ADHERES ADHERING ADHESION ADHESIONS ADHESIVE ADHESIVES ADIABATIC ADIABATICALLY ADIEU ADIRONDACK ADIRONDACKS ADJACENCY ADJACENT ADJECTIVE ADJECTIVES ADJOIN ADJOINED ADJOINING ADJOINS ADJOURN ADJOURNED ADJOURNING ADJOURNMENT ADJOURNS ADJUDGE ADJUDGED ADJUDGES ADJUDGING ADJUDICATE ADJUDICATED ADJUDICATES ADJUDICATING ADJUDICATION ADJUDICATIONS ADJUNCT ADJUNCTS ADJURE ADJURED ADJURES ADJURING ADJUST ADJUSTABLE ADJUSTABLY ADJUSTED ADJUSTER ADJUSTERS ADJUSTING ADJUSTMENT ADJUSTMENTS ADJUSTOR ADJUSTORS ADJUSTS ADJUTANT ADJUTANTS ADKINS ADLER ADLERIAN ADMINISTER ADMINISTERED ADMINISTERING ADMINISTERINGS ADMINISTERS ADMINISTRABLE ADMINISTRATE ADMINISTRATION ADMINISTRATIONS ADMINISTRATIVE ADMINISTRATIVELY ADMINISTRATOR ADMINISTRATORS ADMIRABLE ADMIRABLY ADMIRAL ADMIRALS ADMIRALTY ADMIRATION ADMIRATIONS ADMIRE ADMIRED ADMIRER ADMIRERS ADMIRES ADMIRING ADMIRINGLY ADMISSIBILITY ADMISSIBLE ADMISSION ADMISSIONS ADMIT ADMITS ADMITTANCE ADMITTED ADMITTEDLY ADMITTER ADMITTERS ADMITTING ADMIX ADMIXED ADMIXES ADMIXTURE ADMONISH ADMONISHED ADMONISHES ADMONISHING ADMONISHMENT ADMONISHMENTS ADMONITION ADMONITIONS ADO ADOBE ADOLESCENCE ADOLESCENT ADOLESCENTS ADOLPH ADOLPHUS ADONIS ADOPT ADOPTED ADOPTER ADOPTERS ADOPTING ADOPTION ADOPTIONS ADOPTIVE ADOPTS ADORABLE ADORATION ADORE ADORED ADORES ADORN ADORNED ADORNMENT ADORNMENTS ADORNS ADRENAL ADRENALINE ADRIAN ADRIATIC ADRIENNE ADRIFT ADROIT ADROITNESS ADS ADSORB ADSORBED ADSORBING ADSORBS ADSORPTION ADULATE ADULATING ADULATION ADULT ADULTERATE ADULTERATED ADULTERATES ADULTERATING ADULTERER ADULTERERS ADULTEROUS ADULTEROUSLY ADULTERY ADULTHOOD ADULTS ADUMBRATE ADUMBRATED ADUMBRATES ADUMBRATING ADUMBRATION ADVANCE ADVANCED ADVANCEMENT ADVANCEMENTS ADVANCES ADVANCING ADVANTAGE ADVANTAGED ADVANTAGEOUS ADVANTAGEOUSLY ADVANTAGES ADVENT ADVENTIST ADVENTISTS ADVENTITIOUS ADVENTURE ADVENTURED ADVENTURER ADVENTURERS ADVENTURES ADVENTURING ADVENTUROUS ADVERB ADVERBIAL ADVERBS ADVERSARIES ADVERSARY ADVERSE ADVERSELY ADVERSITIES ADVERSITY ADVERT ADVERTISE ADVERTISED ADVERTISEMENT ADVERTISEMENTS ADVERTISER ADVERTISERS ADVERTISES ADVERTISING ADVICE ADVISABILITY ADVISABLE ADVISABLY ADVISE ADVISED ADVISEDLY ADVISEE ADVISEES ADVISEMENT ADVISEMENTS ADVISER ADVISERS ADVISES ADVISING ADVISOR ADVISORS ADVISORY ADVOCACY ADVOCATE ADVOCATED ADVOCATES ADVOCATING AEGEAN AEGIS AENEAS AENEID AEOLUS AERATE AERATED AERATES AERATING AERATION AERATOR AERATORS AERIAL AERIALS AEROACOUSTIC AEROBACTER AEROBIC AEROBICS AERODYNAMIC AERODYNAMICS AERONAUTIC AERONAUTICAL AERONAUTICS AEROSOL AEROSOLIZE AEROSOLS AEROSPACE AESCHYLUS AESOP AESTHETIC AESTHETICALLY AESTHETICS AFAR AFFABLE AFFAIR AFFAIRS AFFECT AFFECTATION AFFECTATIONS AFFECTED AFFECTING AFFECTINGLY AFFECTION AFFECTIONATE AFFECTIONATELY AFFECTIONS AFFECTIVE AFFECTS AFFERENT AFFIANCED AFFIDAVIT AFFIDAVITS AFFILIATE AFFILIATED AFFILIATES AFFILIATING AFFILIATION AFFILIATIONS AFFINITIES AFFINITY AFFIRM AFFIRMATION AFFIRMATIONS AFFIRMATIVE AFFIRMATIVELY AFFIRMED AFFIRMING AFFIRMS AFFIX AFFIXED AFFIXES AFFIXING AFFLICT AFFLICTED AFFLICTING AFFLICTION AFFLICTIONS AFFLICTIVE AFFLICTS AFFLUENCE AFFLUENT AFFORD AFFORDABLE AFFORDED AFFORDING AFFORDS AFFRICATE AFFRICATES AFFRIGHT AFFRONT AFFRONTED AFFRONTING AFFRONTS AFGHAN AFGHANISTAN AFGHANS AFICIONADO AFIELD AFIRE AFLAME AFLOAT AFOOT AFORE AFOREMENTIONED AFORESAID AFORETHOUGHT AFOUL AFRAID AFRESH AFRICA AFRICAN AFRICANIZATION AFRICANIZATIONS AFRICANIZE AFRICANIZED AFRICANIZES AFRICANIZING AFRICANS AFRIKAANS AFRIKANER AFRIKANERS AFT AFTER AFTEREFFECT AFTERGLOW AFTERIMAGE AFTERLIFE AFTERMATH AFTERMOST AFTERNOON AFTERNOONS AFTERSHOCK AFTERSHOCKS AFTERTHOUGHT AFTERTHOUGHTS AFTERWARD AFTERWARDS AGAIN AGAINST AGAMEMNON AGAPE AGAR AGATE AGATES AGATHA AGE AGED AGEE AGELESS AGENCIES AGENCY AGENDA AGENDAS AGENT AGENTS AGER AGERS AGES AGGIE AGGIES AGGLOMERATE AGGLOMERATED AGGLOMERATES AGGLOMERATION AGGLUTINATE AGGLUTINATED AGGLUTINATES AGGLUTINATING AGGLUTINATION AGGLUTININ AGGLUTININS AGGRANDIZE AGGRAVATE AGGRAVATED AGGRAVATES AGGRAVATION AGGREGATE AGGREGATED AGGREGATELY AGGREGATES AGGREGATING AGGREGATION AGGREGATIONS AGGRESSION AGGRESSIONS AGGRESSIVE AGGRESSIVELY AGGRESSIVENESS AGGRESSOR AGGRESSORS AGGRIEVE AGGRIEVED AGGRIEVES AGGRIEVING AGHAST AGILE AGILELY AGILITY AGING AGITATE AGITATED AGITATES AGITATING AGITATION AGITATIONS AGITATOR AGITATORS AGLEAM AGLOW AGNES AGNEW AGNOSTIC AGNOSTICS AGO AGOG AGONIES AGONIZE AGONIZED AGONIZES AGONIZING AGONIZINGLY AGONY AGRARIAN AGREE AGREEABLE AGREEABLY AGREED AGREEING AGREEMENT AGREEMENTS AGREER AGREERS AGREES AGRICOLA AGRICULTURAL AGRICULTURALLY AGRICULTURE AGUE AGWAY AHEAD AHMADABAD AHMEDABAD AID AIDA AIDE AIDED AIDES AIDING AIDS AIKEN AIL AILEEN AILERON AILERONS AILING AILMENT AILMENTS AIM AIMED AIMER AIMERS AIMING AIMLESS AIMLESSLY AIMS AINU AINUS AIR AIRBAG AIRBAGS AIRBORNE AIRBUS AIRCRAFT AIRDROP AIRDROPS AIRED AIREDALE AIRER AIRERS AIRES AIRFARE AIRFIELD AIRFIELDS AIRFLOW AIRFOIL AIRFOILS AIRFRAME AIRFRAMES AIRILY AIRING AIRINGS AIRLESS AIRLIFT AIRLIFTS AIRLINE AIRLINER AIRLINES AIRLOCK AIRLOCKS AIRMAIL AIRMAILS AIRMAN AIRMEN AIRPLANE AIRPLANES AIRPORT AIRPORTS AIRS AIRSHIP AIRSHIPS AIRSPACE AIRSPEED AIRSTRIP AIRSTRIPS AIRTIGHT AIRWAY AIRWAYS AIRY AISLE AITKEN AJAR AJAX AKERS AKIMBO AKIN AKRON ALABAMA ALABAMANS ALABAMIAN ALABASTER ALACRITY ALADDIN ALAMEDA ALAMO ALAMOS ALAN ALAR ALARM ALARMED ALARMING ALARMINGLY ALARMIST ALARMS ALAS ALASKA ALASKAN ALASTAIR ALBA ALBACORE ALBANIA ALBANIAN ALBANIANS ALBANY ALBATROSS ALBEIT ALBERICH ALBERT ALBERTA ALBERTO ALBRECHT ALBRIGHT ALBUM ALBUMIN ALBUMS ALBUQUERQUE ALCESTIS ALCHEMY ALCIBIADES ALCMENA ALCOA ALCOHOL ALCOHOLIC ALCOHOLICS ALCOHOLISM ALCOHOLS ALCOTT ALCOVE ALCOVES ALDEBARAN ALDEN ALDER ALDERMAN ALDERMEN ALDRICH ALE ALEC ALECK ALEE ALERT ALERTED ALERTEDLY ALERTER ALERTERS ALERTING ALERTLY ALERTNESS ALERTS ALEUT ALEUTIAN ALEX ALEXANDER ALEXANDRA ALEXANDRE ALEXANDRIA ALEXANDRINE ALEXEI ALEXIS ALFA ALFALFA ALFONSO ALFRED ALFREDO ALFRESCO ALGA ALGAE ALGAECIDE ALGEBRA ALGEBRAIC ALGEBRAICALLY ALGEBRAS ALGENIB ALGER ALGERIA ALGERIAN ALGIERS ALGINATE ALGOL ALGOL ALGONQUIAN ALGONQUIN ALGORITHM ALGORITHMIC ALGORITHMICALLY ALGORITHMS ALHAMBRA ALI ALIAS ALIASED ALIASES ALIASING ALIBI ALIBIS ALICE ALICIA ALIEN ALIENATE ALIENATED ALIENATES ALIENATING ALIENATION ALIENS ALIGHT ALIGN ALIGNED ALIGNING ALIGNMENT ALIGNMENTS ALIGNS ALIKE ALIMENT ALIMENTS ALIMONY ALISON ALISTAIR ALIVE ALKALI ALKALINE ALKALIS ALKALOID ALKALOIDS ALKYL ALL ALLAH ALLAN ALLAY ALLAYED ALLAYING ALLAYS ALLEGATION ALLEGATIONS ALLEGE ALLEGED ALLEGEDLY ALLEGES ALLEGHENIES ALLEGHENY ALLEGIANCE ALLEGIANCES ALLEGING ALLEGORIC ALLEGORICAL ALLEGORICALLY ALLEGORIES ALLEGORY ALLEGRA ALLEGRETTO ALLEGRETTOS ALLELE ALLELES ALLEMANDE ALLEN ALLENDALE ALLENTOWN ALLERGIC ALLERGIES ALLERGY ALLEVIATE ALLEVIATED ALLEVIATES ALLEVIATING ALLEVIATION ALLEY ALLEYS ALLEYWAY ALLEYWAYS ALLIANCE ALLIANCES ALLIED ALLIES ALLIGATOR ALLIGATORS ALLIS ALLISON ALLITERATION ALLITERATIONS ALLITERATIVE ALLOCATABLE ALLOCATE ALLOCATED ALLOCATES ALLOCATING ALLOCATION ALLOCATIONS ALLOCATOR ALLOCATORS ALLOPHONE ALLOPHONES ALLOPHONIC ALLOT ALLOTMENT ALLOTMENTS ALLOTS ALLOTTED ALLOTTER ALLOTTING ALLOW ALLOWABLE ALLOWABLY ALLOWANCE ALLOWANCES ALLOWED ALLOWING ALLOWS ALLOY ALLOYS ALLSTATE ALLUDE ALLUDED ALLUDES ALLUDING ALLURE ALLUREMENT ALLURING ALLUSION ALLUSIONS ALLUSIVE ALLUSIVENESS ALLY ALLYING ALLYN ALMA ALMADEN ALMANAC ALMANACS ALMIGHTY ALMOND ALMONDS ALMONER ALMOST ALMS ALMSMAN ALNICO ALOE ALOES ALOFT ALOHA ALONE ALONENESS ALONG ALONGSIDE ALOOF ALOOFNESS ALOUD ALPERT ALPHA ALPHABET ALPHABETIC ALPHABETICAL ALPHABETICALLY ALPHABETICS ALPHABETIZE ALPHABETIZED ALPHABETIZES ALPHABETIZING ALPHABETS ALPHANUMERIC ALPHERATZ ALPHONSE ALPINE ALPS ALREADY ALSATIAN ALSATIANS ALSO ALSOP ALTAIR ALTAR ALTARS ALTER ALTERABLE ALTERATION ALTERATIONS ALTERCATION ALTERCATIONS ALTERED ALTERER ALTERERS ALTERING ALTERNATE ALTERNATED ALTERNATELY ALTERNATES ALTERNATING ALTERNATION ALTERNATIONS ALTERNATIVE ALTERNATIVELY ALTERNATIVES ALTERNATOR ALTERNATORS ALTERS ALTHAEA ALTHOUGH ALTITUDE ALTITUDES ALTOGETHER ALTON ALTOS ALTRUISM ALTRUIST ALTRUISTIC ALTRUISTICALLY ALUM ALUMINUM ALUMNA ALUMNAE ALUMNI ALUMNUS ALUNDUM ALVA ALVAREZ ALVEOLAR ALVEOLI ALVEOLUS ALVIN ALWAYS ALYSSA AMADEUS AMAIN AMALGAM AMALGAMATE AMALGAMATED AMALGAMATES AMALGAMATING AMALGAMATION AMALGAMS AMANDA AMANUENSIS AMARETTO AMARILLO AMASS AMASSED AMASSES AMASSING AMATEUR AMATEURISH AMATEURISHNESS AMATEURISM AMATEURS AMATORY AMAZE AMAZED AMAZEDLY AMAZEMENT AMAZER AMAZERS AMAZES AMAZING AMAZINGLY AMAZON AMAZONS AMBASSADOR AMBASSADORS AMBER AMBIANCE AMBIDEXTROUS AMBIDEXTROUSLY AMBIENT AMBIGUITIES AMBIGUITY AMBIGUOUS AMBIGUOUSLY AMBITION AMBITIONS AMBITIOUS AMBITIOUSLY AMBIVALENCE AMBIVALENT AMBIVALENTLY AMBLE AMBLED AMBLER AMBLES AMBLING AMBROSIAL AMBULANCE AMBULANCES AMBULATORY AMBUSCADE AMBUSH AMBUSHED AMBUSHES AMDAHL AMELIA AMELIORATE AMELIORATED AMELIORATING AMELIORATION AMEN AMENABLE AMEND AMENDED AMENDING AMENDMENT AMENDMENTS AMENDS AMENITIES AMENITY AMENORRHEA AMERADA AMERICA AMERICAN AMERICANA AMERICANISM AMERICANIZATION AMERICANIZATIONS AMERICANIZE AMERICANIZER AMERICANIZERS AMERICANIZES AMERICANS AMERICAS AMERICIUM AMES AMHARIC AMHERST AMIABLE AMICABLE AMICABLY AMID AMIDE AMIDST AMIGA AMIGO AMINO AMISS AMITY AMMAN AMMERMAN AMMO AMMONIA AMMONIAC AMMONIUM AMMUNITION AMNESTY AMOCO AMOEBA AMOEBAE AMOEBAS AMOK AMONG AMONGST AMONTILLADO AMORAL AMORALITY AMORIST AMOROUS AMORPHOUS AMORPHOUSLY AMORTIZE AMORTIZED AMORTIZES AMORTIZING AMOS AMOUNT AMOUNTED AMOUNTER AMOUNTERS AMOUNTING AMOUNTS AMOUR AMPERAGE AMPERE AMPERES AMPERSAND AMPERSANDS AMPEX AMPHETAMINE AMPHETAMINES AMPHIBIAN AMPHIBIANS AMPHIBIOUS AMPHIBIOUSLY AMPHIBOLOGY AMPHITHEATER AMPHITHEATERS AMPLE AMPLIFICATION AMPLIFIED AMPLIFIER AMPLIFIERS AMPLIFIES AMPLIFY AMPLIFYING AMPLITUDE AMPLITUDES AMPLY AMPOULE AMPOULES AMPUTATE AMPUTATED AMPUTATES AMPUTATING AMSTERDAM AMTRAK AMULET AMULETS AMUSE AMUSED AMUSEDLY AMUSEMENT AMUSEMENTS AMUSER AMUSERS AMUSES AMUSING AMUSINGLY AMY AMYL ANABAPTIST ANABAPTISTS ANABEL ANACHRONISM ANACHRONISMS ANACHRONISTICALLY ANACONDA ANACONDAS ANACREON ANAEROBIC ANAGRAM ANAGRAMS ANAHEIM ANAL ANALECTS ANALOG ANALOGICAL ANALOGIES ANALOGOUS ANALOGOUSLY ANALOGUE ANALOGUES ANALOGY ANALYSES ANALYSIS ANALYST ANALYSTS ANALYTIC ANALYTICAL ANALYTICALLY ANALYTICITIES ANALYTICITY ANALYZABLE ANALYZE ANALYZED ANALYZER ANALYZERS ANALYZES ANALYZING ANAPHORA ANAPHORIC ANAPHORICALLY ANAPLASMOSIS ANARCHIC ANARCHICAL ANARCHISM ANARCHIST ANARCHISTS ANARCHY ANASTASIA ANASTOMOSES ANASTOMOSIS ANASTOMOTIC ANATHEMA ANATOLE ANATOLIA ANATOLIAN ANATOMIC ANATOMICAL ANATOMICALLY ANATOMY ANCESTOR ANCESTORS ANCESTRAL ANCESTRY ANCHOR ANCHORAGE ANCHORAGES ANCHORED ANCHORING ANCHORITE ANCHORITISM ANCHORS ANCHOVIES ANCHOVY ANCIENT ANCIENTLY ANCIENTS ANCILLARY AND ANDALUSIA ANDALUSIAN ANDALUSIANS ANDEAN ANDERS ANDERSEN ANDERSON ANDES ANDING ANDORRA ANDOVER ANDRE ANDREA ANDREI ANDREW ANDREWS ANDROMACHE ANDROMEDA ANDY ANECDOTAL ANECDOTE ANECDOTES ANECHOIC ANEMIA ANEMIC ANEMOMETER ANEMOMETERS ANEMOMETRY ANEMONE ANESTHESIA ANESTHETIC ANESTHETICALLY ANESTHETICS ANESTHETIZE ANESTHETIZED ANESTHETIZES ANESTHETIZING ANEW ANGEL ANGELA ANGELENO ANGELENOS ANGELES ANGELIC ANGELICA ANGELINA ANGELINE ANGELO ANGELS ANGER ANGERED ANGERING ANGERS ANGIE ANGIOGRAPHY ANGLE ANGLED ANGLER ANGLERS ANGLES ANGLIA ANGLICAN ANGLICANISM ANGLICANIZE ANGLICANIZES ANGLICANS ANGLING ANGLO ANGLOPHILIA ANGLOPHOBIA ANGOLA ANGORA ANGRIER ANGRIEST ANGRILY ANGRY ANGST ANGSTROM ANGUISH ANGUISHED ANGULAR ANGULARLY ANGUS ANHEUSER ANHYDROUS ANHYDROUSLY ANILINE ANIMAL ANIMALS ANIMATE ANIMATED ANIMATEDLY ANIMATELY ANIMATENESS ANIMATES ANIMATING ANIMATION ANIMATIONS ANIMATOR ANIMATORS ANIMISM ANIMIZED ANIMOSITY ANION ANIONIC ANIONS ANISE ANISEIKONIC ANISOTROPIC ANISOTROPY ANITA ANKARA ANKLE ANKLES ANN ANNA ANNAL ANNALIST ANNALISTIC ANNALS ANNAPOLIS ANNE ANNETTE ANNEX ANNEXATION ANNEXED ANNEXES ANNEXING ANNIE ANNIHILATE ANNIHILATED ANNIHILATES ANNIHILATING ANNIHILATION ANNIVERSARIES ANNIVERSARY ANNOTATE ANNOTATED ANNOTATES ANNOTATING ANNOTATION ANNOTATIONS ANNOUNCE ANNOUNCED ANNOUNCEMENT ANNOUNCEMENTS ANNOUNCER ANNOUNCERS ANNOUNCES ANNOUNCING ANNOY ANNOYANCE ANNOYANCES ANNOYED ANNOYER ANNOYERS ANNOYING ANNOYINGLY ANNOYS ANNUAL ANNUALLY ANNUALS ANNUITY ANNUL ANNULAR ANNULI ANNULLED ANNULLING ANNULMENT ANNULMENTS ANNULS ANNULUS ANNUM ANNUNCIATE ANNUNCIATED ANNUNCIATES ANNUNCIATING ANNUNCIATOR ANNUNCIATORS ANODE ANODES ANODIZE ANODIZED ANODIZES ANOINT ANOINTED ANOINTING ANOINTS ANOMALIES ANOMALOUS ANOMALOUSLY ANOMALY ANOMIC ANOMIE ANON ANONYMITY ANONYMOUS ANONYMOUSLY ANOREXIA ANOTHER ANSELM ANSELMO ANSI ANSWER ANSWERABLE ANSWERED ANSWERER ANSWERERS ANSWERING ANSWERS ANT ANTAEUS ANTAGONISM ANTAGONISMS ANTAGONIST ANTAGONISTIC ANTAGONISTICALLY ANTAGONISTS ANTAGONIZE ANTAGONIZED ANTAGONIZES ANTAGONIZING ANTARCTIC ANTARCTICA ANTARES ANTE ANTEATER ANTEATERS ANTECEDENT ANTECEDENTS ANTEDATE ANTELOPE ANTELOPES ANTENNA ANTENNAE ANTENNAS ANTERIOR ANTHEM ANTHEMS ANTHER ANTHOLOGIES ANTHOLOGY ANTHONY ANTHRACITE ANTHROPOLOGICAL ANTHROPOLOGICALLY ANTHROPOLOGIST ANTHROPOLOGISTS ANTHROPOLOGY ANTHROPOMORPHIC ANTHROPOMORPHICALLY ANTI ANTIBACTERIAL ANTIBIOTIC ANTIBIOTICS ANTIBODIES ANTIBODY ANTIC ANTICIPATE ANTICIPATED ANTICIPATES ANTICIPATING ANTICIPATION ANTICIPATIONS ANTICIPATORY ANTICOAGULATION ANTICOMPETITIVE ANTICS ANTIDISESTABLISHMENTARIANISM ANTIDOTE ANTIDOTES ANTIETAM ANTIFORMANT ANTIFUNDAMENTALIST ANTIGEN ANTIGENS ANTIGONE ANTIHISTORICAL ANTILLES ANTIMICROBIAL ANTIMONY ANTINOMIAN ANTINOMY ANTIOCH ANTIPATHY ANTIPHONAL ANTIPODE ANTIPODES ANTIQUARIAN ANTIQUARIANS ANTIQUATE ANTIQUATED ANTIQUE ANTIQUES ANTIQUITIES ANTIQUITY ANTIREDEPOSITION ANTIRESONANCE ANTIRESONATOR ANTISEMITIC ANTISEMITISM ANTISEPTIC ANTISERA ANTISERUM ANTISLAVERY ANTISOCIAL ANTISUBMARINE ANTISYMMETRIC ANTISYMMETRY ANTITHESIS ANTITHETICAL ANTITHYROID ANTITOXIN ANTITOXINS ANTITRUST ANTLER ANTLERED ANTOINE ANTOINETTE ANTON ANTONIO ANTONOVICS ANTONY ANTS ANTWERP ANUS ANVIL ANVILS ANXIETIES ANXIETY ANXIOUS ANXIOUSLY ANY ANYBODY ANYHOW ANYMORE ANYONE ANYPLACE ANYTHING ANYTIME ANYWAY ANYWHERE AORTA APACE APACHES APALACHICOLA APART APARTMENT APARTMENTS APATHETIC APATHY APE APED APERIODIC APERIODICITY APERTURE APES APETALOUS APEX APHASIA APHASIC APHELION APHID APHIDS APHONIC APHORISM APHORISMS APHRODITE APIARIES APIARY APICAL APIECE APING APISH APLENTY APLOMB APOCALYPSE APOCALYPTIC APOCRYPHA APOCRYPHAL APOGEE APOGEES APOLLINAIRE APOLLO APOLLONIAN APOLOGETIC APOLOGETICALLY APOLOGIA APOLOGIES APOLOGIST APOLOGISTS APOLOGIZE APOLOGIZED APOLOGIZES APOLOGIZING APOLOGY APOSTATE APOSTLE APOSTLES APOSTOLIC APOSTROPHE APOSTROPHES APOTHECARY APOTHEGM APOTHEOSES APOTHEOSIS APPALACHIA APPALACHIAN APPALACHIANS APPALL APPALLED APPALLING APPALLINGLY APPALOOSAS APPANAGE APPARATUS APPAREL APPARELED APPARENT APPARENTLY APPARITION APPARITIONS APPEAL APPEALED APPEALER APPEALERS APPEALING APPEALINGLY APPEALS APPEAR APPEARANCE APPEARANCES APPEARED APPEARER APPEARERS APPEARING APPEARS APPEASE APPEASED APPEASEMENT APPEASES APPEASING APPELLANT APPELLANTS APPELLATE APPELLATION APPEND APPENDAGE APPENDAGES APPENDED APPENDER APPENDERS APPENDICES APPENDICITIS APPENDING APPENDIX APPENDIXES APPENDS APPERTAIN APPERTAINS APPETITE APPETITES APPETIZER APPETIZING APPIA APPIAN APPLAUD APPLAUDED APPLAUDING APPLAUDS APPLAUSE APPLE APPLEBY APPLEJACK APPLES APPLETON APPLIANCE APPLIANCES APPLICABILITY APPLICABLE APPLICANT APPLICANTS APPLICATION APPLICATIONS APPLICATIVE APPLICATIVELY APPLICATOR APPLICATORS APPLIED APPLIER APPLIERS APPLIES APPLIQUE APPLY APPLYING APPOINT APPOINTED APPOINTEE APPOINTEES APPOINTER APPOINTERS APPOINTING APPOINTIVE APPOINTMENT APPOINTMENTS APPOINTS APPOMATTOX APPORTION APPORTIONED APPORTIONING APPORTIONMENT APPORTIONMENTS APPORTIONS APPOSITE APPRAISAL APPRAISALS APPRAISE APPRAISED APPRAISER APPRAISERS APPRAISES APPRAISING APPRAISINGLY APPRECIABLE APPRECIABLY APPRECIATE APPRECIATED APPRECIATES APPRECIATING APPRECIATION APPRECIATIONS APPRECIATIVE APPRECIATIVELY APPREHEND APPREHENDED APPREHENSIBLE APPREHENSION APPREHENSIONS APPREHENSIVE APPREHENSIVELY APPREHENSIVENESS APPRENTICE APPRENTICED APPRENTICES APPRENTICESHIP APPRISE APPRISED APPRISES APPRISING APPROACH APPROACHABILITY APPROACHABLE APPROACHED APPROACHER APPROACHERS APPROACHES APPROACHING APPROBATE APPROBATION APPROPRIATE APPROPRIATED APPROPRIATELY APPROPRIATENESS APPROPRIATES APPROPRIATING APPROPRIATION APPROPRIATIONS APPROPRIATOR APPROPRIATORS APPROVAL APPROVALS APPROVE APPROVED APPROVER APPROVERS APPROVES APPROVING APPROVINGLY APPROXIMATE APPROXIMATED APPROXIMATELY APPROXIMATES APPROXIMATING APPROXIMATION APPROXIMATIONS APPURTENANCE APPURTENANCES APRICOT APRICOTS APRIL APRILS APRON APRONS APROPOS APSE APSIS APT APTITUDE APTITUDES APTLY APTNESS AQUA AQUARIA AQUARIUM AQUARIUS AQUATIC AQUEDUCT AQUEDUCTS AQUEOUS AQUIFER AQUIFERS AQUILA AQUINAS ARAB ARABESQUE ARABIA ARABIAN ARABIANIZE ARABIANIZES ARABIANS ARABIC ARABICIZE ARABICIZES ARABLE ARABS ARABY ARACHNE ARACHNID ARACHNIDS ARAMCO ARAPAHO ARBITER ARBITERS ARBITRARILY ARBITRARINESS ARBITRARY ARBITRATE ARBITRATED ARBITRATES ARBITRATING ARBITRATION ARBITRATOR ARBITRATORS ARBOR ARBOREAL ARBORS ARC ARCADE ARCADED ARCADES ARCADIA ARCADIAN ARCANE ARCED ARCH ARCHAIC ARCHAICALLY ARCHAICNESS ARCHAISM ARCHAIZE ARCHANGEL ARCHANGELS ARCHBISHOP ARCHDIOCESE ARCHDIOCESES ARCHED ARCHENEMY ARCHEOLOGICAL ARCHEOLOGIST ARCHEOLOGY ARCHER ARCHERS ARCHERY ARCHES ARCHETYPE ARCHFOOL ARCHIBALD ARCHIE ARCHIMEDES ARCHING ARCHIPELAGO ARCHIPELAGOES ARCHITECT ARCHITECTONIC ARCHITECTS ARCHITECTURAL ARCHITECTURALLY ARCHITECTURE ARCHITECTURES ARCHIVAL ARCHIVE ARCHIVED ARCHIVER ARCHIVERS ARCHIVES ARCHIVING ARCHIVIST ARCHLY ARCING ARCLIKE ARCO ARCS ARCSINE ARCTANGENT ARCTIC ARCTURUS ARDEN ARDENT ARDENTLY ARDOR ARDUOUS ARDUOUSLY ARDUOUSNESS ARE AREA AREAS ARENA ARENAS AREQUIPA ARES ARGENTINA ARGENTINIAN ARGIVE ARGO ARGON ARGONAUT ARGONAUTS ARGONNE ARGOS ARGOT ARGUABLE ARGUABLY ARGUE ARGUED ARGUER ARGUERS ARGUES ARGUING ARGUMENT ARGUMENTATION ARGUMENTATIVE ARGUMENTS ARGUS ARIADNE ARIANISM ARIANIST ARIANISTS ARID ARIDITY ARIES ARIGHT ARISE ARISEN ARISER ARISES ARISING ARISINGS ARISTOCRACY ARISTOCRAT ARISTOCRATIC ARISTOCRATICALLY ARISTOCRATS ARISTOTELIAN ARISTOTLE ARITHMETIC ARITHMETICAL ARITHMETICALLY ARITHMETICS ARITHMETIZE ARITHMETIZED ARITHMETIZES ARIZONA ARK ARKANSAN ARKANSAS ARLEN ARLENE ARLINGTON ARM ARMADA ARMADILLO ARMADILLOS ARMAGEDDON ARMAGNAC ARMAMENT ARMAMENTS ARMATA ARMCHAIR ARMCHAIRS ARMCO ARMED ARMENIA ARMENIAN ARMER ARMERS ARMFUL ARMHOLE ARMIES ARMING ARMISTICE ARMLOAD ARMONK ARMOR ARMORED ARMORER ARMORY ARMOUR ARMPIT ARMPITS ARMS ARMSTRONG ARMY ARNOLD AROMA AROMAS AROMATIC AROSE AROUND AROUSAL AROUSE AROUSED AROUSES AROUSING ARPA ARPANET ARPANET ARPEGGIO ARPEGGIOS ARRACK ARRAGON ARRAIGN ARRAIGNED ARRAIGNING ARRAIGNMENT ARRAIGNMENTS ARRAIGNS ARRANGE ARRANGED ARRANGEMENT ARRANGEMENTS ARRANGER ARRANGERS ARRANGES ARRANGING ARRANT ARRAY ARRAYED ARRAYS ARREARS ARREST ARRESTED ARRESTER ARRESTERS ARRESTING ARRESTINGLY ARRESTOR ARRESTORS ARRESTS ARRHENIUS ARRIVAL ARRIVALS ARRIVE ARRIVED ARRIVES ARRIVING ARROGANCE ARROGANT ARROGANTLY ARROGATE ARROGATED ARROGATES ARROGATING ARROGATION ARROW ARROWED ARROWHEAD ARROWHEADS ARROWS ARROYO ARROYOS ARSENAL ARSENALS ARSENIC ARSINE ARSON ART ARTEMIA ARTEMIS ARTERIAL ARTERIES ARTERIOLAR ARTERIOLE ARTERIOLES ARTERIOSCLEROSIS ARTERY ARTFUL ARTFULLY ARTFULNESS ARTHRITIS ARTHROPOD ARTHROPODS ARTHUR ARTICHOKE ARTICHOKES ARTICLE ARTICLES ARTICULATE ARTICULATED ARTICULATELY ARTICULATENESS ARTICULATES ARTICULATING ARTICULATION ARTICULATIONS ARTICULATOR ARTICULATORS ARTICULATORY ARTIE ARTIFACT ARTIFACTS ARTIFICE ARTIFICER ARTIFICES ARTIFICIAL ARTIFICIALITIES ARTIFICIALITY ARTIFICIALLY ARTIFICIALNESS ARTILLERIST ARTILLERY ARTISAN ARTISANS ARTIST ARTISTIC ARTISTICALLY ARTISTRY ARTISTS ARTLESS ARTS ARTURO ARTWORK ARUBA ARYAN ARYANS ASBESTOS ASCEND ASCENDANCY ASCENDANT ASCENDED ASCENDENCY ASCENDENT ASCENDER ASCENDERS ASCENDING ASCENDS ASCENSION ASCENSIONS ASCENT ASCERTAIN ASCERTAINABLE ASCERTAINED ASCERTAINING ASCERTAINS ASCETIC ASCETICISM ASCETICS ASCII ASCOT ASCRIBABLE ASCRIBE ASCRIBED ASCRIBES ASCRIBING ASCRIPTION ASEPTIC ASH ASHAMED ASHAMEDLY ASHEN ASHER ASHES ASHEVILLE ASHLAND ASHLEY ASHMAN ASHMOLEAN ASHORE ASHTRAY ASHTRAYS ASIA ASIAN ASIANS ASIATIC ASIATICIZATION ASIATICIZATIONS ASIATICIZE ASIATICIZES ASIATICS ASIDE ASILOMAR ASININE ASK ASKANCE ASKED ASKER ASKERS ASKEW ASKING ASKS ASLEEP ASOCIAL ASP ASPARAGUS ASPECT ASPECTS ASPEN ASPERSION ASPERSIONS ASPHALT ASPHYXIA ASPIC ASPIRANT ASPIRANTS ASPIRATE ASPIRATED ASPIRATES ASPIRATING ASPIRATION ASPIRATIONS ASPIRATOR ASPIRATORS ASPIRE ASPIRED ASPIRES ASPIRIN ASPIRING ASPIRINS ASS ASSAIL ASSAILANT ASSAILANTS ASSAILED ASSAILING ASSAILS ASSAM ASSASSIN ASSASSINATE ASSASSINATED ASSASSINATES ASSASSINATING ASSASSINATION ASSASSINATIONS ASSASSINS ASSAULT ASSAULTED ASSAULTING ASSAULTS ASSAY ASSAYED ASSAYING ASSEMBLAGE ASSEMBLAGES ASSEMBLE ASSEMBLED ASSEMBLER ASSEMBLERS ASSEMBLES ASSEMBLIES ASSEMBLING ASSEMBLY ASSENT ASSENTED ASSENTER ASSENTING ASSENTS ASSERT ASSERTED ASSERTER ASSERTERS ASSERTING ASSERTION ASSERTIONS ASSERTIVE ASSERTIVELY ASSERTIVENESS ASSERTS ASSES ASSESS ASSESSED ASSESSES ASSESSING ASSESSMENT ASSESSMENTS ASSESSOR ASSESSORS ASSET ASSETS ASSIDUITY ASSIDUOUS ASSIDUOUSLY ASSIGN ASSIGNABLE ASSIGNED ASSIGNEE ASSIGNEES ASSIGNER ASSIGNERS ASSIGNING ASSIGNMENT ASSIGNMENTS ASSIGNS ASSIMILATE ASSIMILATED ASSIMILATES ASSIMILATING ASSIMILATION ASSIMILATIONS ASSIST ASSISTANCE ASSISTANCES ASSISTANT ASSISTANTS ASSISTANTSHIP ASSISTANTSHIPS ASSISTED ASSISTING ASSISTS ASSOCIATE ASSOCIATED ASSOCIATES ASSOCIATING ASSOCIATION ASSOCIATIONAL ASSOCIATIONS ASSOCIATIVE ASSOCIATIVELY ASSOCIATIVITY ASSOCIATOR ASSOCIATORS ASSONANCE ASSONANT ASSORT ASSORTED ASSORTMENT ASSORTMENTS ASSORTS ASSUAGE ASSUAGED ASSUAGES ASSUME ASSUMED ASSUMES ASSUMING ASSUMPTION ASSUMPTIONS ASSURANCE ASSURANCES ASSURE ASSURED ASSUREDLY ASSURER ASSURERS ASSURES ASSURING ASSURINGLY ASSYRIA ASSYRIAN ASSYRIANIZE ASSYRIANIZES ASSYRIOLOGY ASTAIRE ASTAIRES ASTARTE ASTATINE ASTER ASTERISK ASTERISKS ASTEROID ASTEROIDAL ASTEROIDS ASTERS ASTHMA ASTON ASTONISH ASTONISHED ASTONISHES ASTONISHING ASTONISHINGLY ASTONISHMENT ASTOR ASTORIA ASTOUND ASTOUNDED ASTOUNDING ASTOUNDS ASTRAL ASTRAY ASTRIDE ASTRINGENCY ASTRINGENT ASTROLOGY ASTRONAUT ASTRONAUTICS ASTRONAUTS ASTRONOMER ASTRONOMERS ASTRONOMICAL ASTRONOMICALLY ASTRONOMY ASTROPHYSICAL ASTROPHYSICS ASTUTE ASTUTELY ASTUTENESS ASUNCION ASUNDER ASYLUM ASYMMETRIC ASYMMETRICALLY ASYMMETRY ASYMPTOMATICALLY ASYMPTOTE ASYMPTOTES ASYMPTOTIC ASYMPTOTICALLY ASYNCHRONISM ASYNCHRONOUS ASYNCHRONOUSLY ASYNCHRONY ATALANTA ATARI ATAVISTIC ATCHISON ATE ATEMPORAL ATHABASCAN ATHEISM ATHEIST ATHEISTIC ATHEISTS ATHENA ATHENIAN ATHENIANS ATHENS ATHEROSCLEROSIS ATHLETE ATHLETES ATHLETIC ATHLETICISM ATHLETICS ATKINS ATKINSON ATLANTA ATLANTIC ATLANTICA ATLANTIS ATLAS ATMOSPHERE ATMOSPHERES ATMOSPHERIC ATOLL ATOLLS ATOM ATOMIC ATOMICALLY ATOMICS ATOMIZATION ATOMIZE ATOMIZED ATOMIZES ATOMIZING ATOMS ATONAL ATONALLY ATONE ATONED ATONEMENT ATONES ATOP ATREUS ATROCIOUS ATROCIOUSLY ATROCITIES ATROCITY ATROPHIC ATROPHIED ATROPHIES ATROPHY ATROPHYING ATROPOS ATTACH ATTACHE ATTACHED ATTACHER ATTACHERS ATTACHES ATTACHING ATTACHMENT ATTACHMENTS ATTACK ATTACKABLE ATTACKED ATTACKER ATTACKERS ATTACKING ATTACKS ATTAIN ATTAINABLE ATTAINABLY ATTAINED ATTAINER ATTAINERS ATTAINING ATTAINMENT ATTAINMENTS ATTAINS ATTEMPT ATTEMPTED ATTEMPTER ATTEMPTERS ATTEMPTING ATTEMPTS ATTEND ATTENDANCE ATTENDANCES ATTENDANT ATTENDANTS ATTENDED ATTENDEE ATTENDEES ATTENDER ATTENDERS ATTENDING ATTENDS ATTENTION ATTENTIONAL ATTENTIONALITY ATTENTIONS ATTENTIVE ATTENTIVELY ATTENTIVENESS ATTENUATE ATTENUATED ATTENUATES ATTENUATING ATTENUATION ATTENUATOR ATTENUATORS ATTEST ATTESTED ATTESTING ATTESTS ATTIC ATTICA ATTICS ATTIRE ATTIRED ATTIRES ATTIRING ATTITUDE ATTITUDES ATTITUDINAL ATTLEE ATTORNEY ATTORNEYS ATTRACT ATTRACTED ATTRACTING ATTRACTION ATTRACTIONS ATTRACTIVE ATTRACTIVELY ATTRACTIVENESS ATTRACTOR ATTRACTORS ATTRACTS ATTRIBUTABLE ATTRIBUTE ATTRIBUTED ATTRIBUTES ATTRIBUTING ATTRIBUTION ATTRIBUTIONS ATTRIBUTIVE ATTRIBUTIVELY ATTRITION ATTUNE ATTUNED ATTUNES ATTUNING ATWATER ATWOOD ATYPICAL ATYPICALLY AUBERGE AUBREY AUBURN AUCKLAND AUCTION AUCTIONEER AUCTIONEERS AUDACIOUS AUDACIOUSLY AUDACIOUSNESS AUDACITY AUDIBLE AUDIBLY AUDIENCE AUDIENCES AUDIO AUDIOGRAM AUDIOGRAMS AUDIOLOGICAL AUDIOLOGIST AUDIOLOGISTS AUDIOLOGY AUDIOMETER AUDIOMETERS AUDIOMETRIC AUDIOMETRY AUDIT AUDITED AUDITING AUDITION AUDITIONED AUDITIONING AUDITIONS AUDITOR AUDITORIUM AUDITORS AUDITORY AUDITS AUDREY AUDUBON AUERBACH AUGEAN AUGER AUGERS AUGHT AUGMENT AUGMENTATION AUGMENTED AUGMENTING AUGMENTS AUGUR AUGURS AUGUST AUGUSTA AUGUSTAN AUGUSTINE AUGUSTLY AUGUSTNESS AUGUSTUS AUNT AUNTS AURA AURAL AURALLY AURAS AURELIUS AUREOLE AUREOMYCIN AURIGA AURORA AUSCHWITZ AUSCULTATE AUSCULTATED AUSCULTATES AUSCULTATING AUSCULTATION AUSCULTATIONS AUSPICE AUSPICES AUSPICIOUS AUSPICIOUSLY AUSTERE AUSTERELY AUSTERITY AUSTIN AUSTRALIA AUSTRALIAN AUSTRALIANIZE AUSTRALIANIZES AUSTRALIS AUSTRIA AUSTRIAN AUSTRIANIZE AUSTRIANIZES AUTHENTIC AUTHENTICALLY AUTHENTICATE AUTHENTICATED AUTHENTICATES AUTHENTICATING AUTHENTICATION AUTHENTICATIONS AUTHENTICATOR AUTHENTICATORS AUTHENTICITY AUTHOR AUTHORED AUTHORING AUTHORITARIAN AUTHORITARIANISM AUTHORITATIVE AUTHORITATIVELY AUTHORITIES AUTHORITY AUTHORIZATION AUTHORIZATIONS AUTHORIZE AUTHORIZED AUTHORIZER AUTHORIZERS AUTHORIZES AUTHORIZING AUTHORS AUTHORSHIP AUTISM AUTISTIC AUTO AUTOBIOGRAPHIC AUTOBIOGRAPHICAL AUTOBIOGRAPHIES AUTOBIOGRAPHY AUTOCOLLIMATOR AUTOCORRELATE AUTOCORRELATION AUTOCRACIES AUTOCRACY AUTOCRAT AUTOCRATIC AUTOCRATICALLY AUTOCRATS AUTODECREMENT AUTODECREMENTED AUTODECREMENTS AUTODIALER AUTOFLUORESCENCE AUTOGRAPH AUTOGRAPHED AUTOGRAPHING AUTOGRAPHS AUTOINCREMENT AUTOINCREMENTED AUTOINCREMENTS AUTOINDEX AUTOINDEXING AUTOMATA AUTOMATE AUTOMATED AUTOMATES AUTOMATIC AUTOMATICALLY AUTOMATING AUTOMATION AUTOMATON AUTOMOBILE AUTOMOBILES AUTOMOTIVE AUTONAVIGATOR AUTONAVIGATORS AUTONOMIC AUTONOMOUS AUTONOMOUSLY AUTONOMY AUTOPILOT AUTOPILOTS AUTOPSIED AUTOPSIES AUTOPSY AUTOREGRESSIVE AUTOS AUTOSUGGESTIBILITY AUTOTRANSFORMER AUTUMN AUTUMNAL AUTUMNS AUXILIARIES AUXILIARY AVAIL AVAILABILITIES AVAILABILITY AVAILABLE AVAILABLY AVAILED AVAILER AVAILERS AVAILING AVAILS AVALANCHE AVALANCHED AVALANCHES AVALANCHING AVANT AVARICE AVARICIOUS AVARICIOUSLY AVENGE AVENGED AVENGER AVENGES AVENGING AVENTINE AVENTINO AVENUE AVENUES AVER AVERAGE AVERAGED AVERAGES AVERAGING AVERNUS AVERRED AVERRER AVERRING AVERS AVERSE AVERSION AVERSIONS AVERT AVERTED AVERTING AVERTS AVERY AVESTA AVIAN AVIARIES AVIARY AVIATION AVIATOR AVIATORS AVID AVIDITY AVIDLY AVIGNON AVIONIC AVIONICS AVIS AVIV AVOCADO AVOCADOS AVOCATION AVOCATIONS AVOGADRO AVOID AVOIDABLE AVOIDABLY AVOIDANCE AVOIDED AVOIDER AVOIDERS AVOIDING AVOIDS AVON AVOUCH AVOW AVOWAL AVOWED AVOWS AWAIT AWAITED AWAITING AWAITS AWAKE AWAKEN AWAKENED AWAKENING AWAKENS AWAKES AWAKING AWARD AWARDED AWARDER AWARDERS AWARDING AWARDS AWARE AWARENESS AWASH AWAY AWE AWED AWESOME AWFUL AWFULLY AWFULNESS AWHILE AWKWARD AWKWARDLY AWKWARDNESS AWL AWLS AWNING AWNINGS AWOKE AWRY AXED AXEL AXER AXERS AXES AXIAL AXIALLY AXING AXIOLOGICAL AXIOM AXIOMATIC AXIOMATICALLY AXIOMATIZATION AXIOMATIZATIONS AXIOMATIZE AXIOMATIZED AXIOMATIZES AXIOMATIZING AXIOMS AXIS AXLE AXLES AXOLOTL AXOLOTLS AXON AXONS AYE AYERS AYES AYLESBURY AZALEA AZALEAS AZERBAIJAN AZIMUTH AZIMUTHS AZORES AZTEC AZTECAN AZURE BABBAGE BABBLE BABBLED BABBLES BABBLING BABCOCK BABE BABEL BABELIZE BABELIZES BABES BABIED BABIES BABKA BABOON BABOONS BABUL BABY BABYHOOD BABYING BABYISH BABYLON BABYLONIAN BABYLONIANS BABYLONIZE BABYLONIZES BABYSIT BABYSITTING BACCALAUREATE BACCHUS BACH BACHELOR BACHELORS BACILLI BACILLUS BACK BACKACHE BACKACHES BACKARROW BACKBEND BACKBENDS BACKBOARD BACKBONE BACKBONES BACKDROP BACKDROPS BACKED BACKER BACKERS BACKFILL BACKFIRING BACKGROUND BACKGROUNDS BACKHAND BACKING BACKLASH BACKLOG BACKLOGGED BACKLOGS BACKORDER BACKPACK BACKPACKS BACKPLANE BACKPLANES BACKPLATE BACKS BACKSCATTER BACKSCATTERED BACKSCATTERING BACKSCATTERS BACKSIDE BACKSLASH BACKSLASHES BACKSPACE BACKSPACED BACKSPACES BACKSPACING BACKSTAGE BACKSTAIRS BACKSTITCH BACKSTITCHED BACKSTITCHES BACKSTITCHING BACKSTOP BACKTRACK BACKTRACKED BACKTRACKER BACKTRACKERS BACKTRACKING BACKTRACKS BACKUP BACKUPS BACKUS BACKWARD BACKWARDNESS BACKWARDS BACKWATER BACKWATERS BACKWOODS BACKYARD BACKYARDS BACON BACTERIA BACTERIAL BACTERIUM BAD BADE BADEN BADGE BADGER BADGERED BADGERING BADGERS BADGES BADLANDS BADLY BADMINTON BADNESS BAFFIN BAFFLE BAFFLED BAFFLER BAFFLERS BAFFLING BAG BAGATELLE BAGATELLES BAGEL BAGELS BAGGAGE BAGGED BAGGER BAGGERS BAGGING BAGGY BAGHDAD BAGLEY BAGPIPE BAGPIPES BAGRODIA BAGRODIAS BAGS BAH BAHAMA BAHAMAS BAHREIN BAIL BAILEY BAILEYS BAILIFF BAILIFFS BAILING BAIRD BAIRDI BAIRN BAIT BAITED BAITER BAITING BAITS BAJA BAKE BAKED BAKELITE BAKER BAKERIES BAKERS BAKERSFIELD BAKERY BAKES BAKHTIARI BAKING BAKLAVA BAKU BALALAIKA BALALAIKAS BALANCE BALANCED BALANCER BALANCERS BALANCES BALANCING BALBOA BALCONIES BALCONY BALD BALDING BALDLY BALDNESS BALDWIN BALE BALEFUL BALER BALES BALFOUR BALI BALINESE BALK BALKAN BALKANIZATION BALKANIZATIONS BALKANIZE BALKANIZED BALKANIZES BALKANIZING BALKANS BALKED BALKINESS BALKING BALKS BALKY BALL BALLAD BALLADS BALLARD BALLARDS BALLAST BALLASTS BALLED BALLER BALLERINA BALLERINAS BALLERS BALLET BALLETS BALLGOWN BALLING BALLISTIC BALLISTICS BALLOON BALLOONED BALLOONER BALLOONERS BALLOONING BALLOONS BALLOT BALLOTS BALLPARK BALLPARKS BALLPLAYER BALLPLAYERS BALLROOM BALLROOMS BALLS BALLYHOO BALM BALMS BALMY BALSA BALSAM BALTIC BALTIMORE BALTIMOREAN BALUSTRADE BALUSTRADES BALZAC BAMAKO BAMBERGER BAMBI BAMBOO BAN BANACH BANAL BANALLY BANANA BANANAS BANBURY BANCROFT BAND BANDAGE BANDAGED BANDAGES BANDAGING BANDED BANDIED BANDIES BANDING BANDIT BANDITS BANDPASS BANDS BANDSTAND BANDSTANDS BANDWAGON BANDWAGONS BANDWIDTH BANDWIDTHS BANDY BANDYING BANE BANEFUL BANG BANGED BANGING BANGLADESH BANGLE BANGLES BANGOR BANGS BANGUI BANISH BANISHED BANISHES BANISHING BANISHMENT BANISTER BANISTERS BANJO BANJOS BANK BANKED BANKER BANKERS BANKING BANKRUPT BANKRUPTCIES BANKRUPTCY BANKRUPTED BANKRUPTING BANKRUPTS BANKS BANNED BANNER BANNERS BANNING BANQUET BANQUETING BANQUETINGS BANQUETS BANS BANSHEE BANSHEES BANTAM BANTER BANTERED BANTERING BANTERS BANTU BANTUS BAPTISM BAPTISMAL BAPTISMS BAPTIST BAPTISTE BAPTISTERY BAPTISTRIES BAPTISTRY BAPTISTS BAPTIZE BAPTIZED BAPTIZES BAPTIZING BAR BARB BARBADOS BARBARA BARBARIAN BARBARIANS BARBARIC BARBARISM BARBARITIES BARBARITY BARBAROUS BARBAROUSLY BARBECUE BARBECUED BARBECUES BARBED BARBELL BARBELLS BARBER BARBITAL BARBITURATE BARBITURATES BARBOUR BARBS BARCELONA BARCLAY BARD BARDS BARE BARED BAREFACED BAREFOOT BAREFOOTED BARELY BARENESS BARER BARES BAREST BARFLIES BARFLY BARGAIN BARGAINED BARGAINING BARGAINS BARGE BARGES BARGING BARHOP BARING BARITONE BARITONES BARIUM BARK BARKED BARKER BARKERS BARKING BARKS BARLEY BARLOW BARN BARNABAS BARNARD BARNES BARNET BARNETT BARNEY BARNHARD BARNS BARNSTORM BARNSTORMED BARNSTORMING BARNSTORMS BARNUM BARNYARD BARNYARDS BAROMETER BAROMETERS BAROMETRIC BARON BARONESS BARONIAL BARONIES BARONS BARONY BAROQUE BAROQUENESS BARR BARRACK BARRACKS BARRAGE BARRAGES BARRED BARREL BARRELLED BARRELLING BARRELS BARREN BARRENNESS BARRETT BARRICADE BARRICADES BARRIER BARRIERS BARRING BARRINGER BARRINGTON BARRON BARROW BARRY BARRYMORE BARRYMORES BARS BARSTOW BART BARTENDER BARTENDERS BARTER BARTERED BARTERING BARTERS BARTH BARTHOLOMEW BARTLETT BARTOK BARTON BASAL BASALT BASCOM BASE BASEBALL BASEBALLS BASEBAND BASEBOARD BASEBOARDS BASED BASEL BASELESS BASELINE BASELINES BASELY BASEMAN BASEMENT BASEMENTS BASENESS BASER BASES BASH BASHED BASHES BASHFUL BASHFULNESS BASHING BASIC BASIC BASIC BASICALLY BASICS BASIE BASIL BASIN BASING BASINS BASIS BASK BASKED BASKET BASKETBALL BASKETBALLS BASKETS BASKING BASQUE BASS BASSES BASSET BASSETT BASSINET BASSINETS BASTARD BASTARDS BASTE BASTED BASTES BASTING BASTION BASTIONS BAT BATAVIA BATCH BATCHED BATCHELDER BATCHES BATEMAN BATES BATH BATHE BATHED BATHER BATHERS BATHES BATHING BATHOS BATHROBE BATHROBES BATHROOM BATHROOMS BATHS BATHTUB BATHTUBS BATHURST BATISTA BATON BATONS BATOR BATS BATTALION BATTALIONS BATTED BATTELLE BATTEN BATTENS BATTER BATTERED BATTERIES BATTERING BATTERS BATTERY BATTING BATTLE BATTLED BATTLEFIELD BATTLEFIELDS BATTLEFRONT BATTLEFRONTS BATTLEGROUND BATTLEGROUNDS BATTLEMENT BATTLEMENTS BATTLER BATTLERS BATTLES BATTLESHIP BATTLESHIPS BATTLING BAUBLE BAUBLES BAUD BAUDELAIRE BAUER BAUHAUS BAUSCH BAUXITE BAVARIA BAVARIAN BAWDY BAWL BAWLED BAWLING BAWLS BAXTER BAY BAYDA BAYED BAYES BAYESIAN BAYING BAYLOR BAYONET BAYONETS BAYONNE BAYOU BAYOUS BAYPORT BAYREUTH BAYS BAZAAR BAZAARS BEACH BEACHED BEACHES BEACHHEAD BEACHHEADS BEACHING BEACON BEACONS BEAD BEADED BEADING BEADLE BEADLES BEADS BEADY BEAGLE BEAGLES BEAK BEAKED BEAKER BEAKERS BEAKS BEAM BEAMED BEAMER BEAMERS BEAMING BEAMS BEAN BEANBAG BEANED BEANER BEANERS BEANING BEANS BEAR BEARABLE BEARABLY BEARD BEARDED BEARDLESS BEARDS BEARDSLEY BEARER BEARERS BEARING BEARINGS BEARISH BEARS BEAST BEASTLY BEASTS BEAT BEATABLE BEATABLY BEATEN BEATER BEATERS BEATIFIC BEATIFICATION BEATIFY BEATING BEATINGS BEATITUDE BEATITUDES BEATNIK BEATNIKS BEATRICE BEATS BEAU BEAUCHAMPS BEAUJOLAIS BEAUMONT BEAUREGARD BEAUS BEAUTEOUS BEAUTEOUSLY BEAUTIES BEAUTIFICATIONS BEAUTIFIED BEAUTIFIER BEAUTIFIERS BEAUTIFIES BEAUTIFUL BEAUTIFULLY BEAUTIFY BEAUTIFYING BEAUTY BEAVER BEAVERS BEAVERTON BECALM BECALMED BECALMING BECALMS BECAME BECAUSE BECHTEL BECK BECKER BECKMAN BECKON BECKONED BECKONING BECKONS BECKY BECOME BECOMES BECOMING BECOMINGLY BED BEDAZZLE BEDAZZLED BEDAZZLEMENT BEDAZZLES BEDAZZLING BEDBUG BEDBUGS BEDDED BEDDER BEDDERS BEDDING BEDEVIL BEDEVILED BEDEVILING BEDEVILS BEDFAST BEDFORD BEDLAM BEDPOST BEDPOSTS BEDRAGGLE BEDRAGGLED BEDRIDDEN BEDROCK BEDROOM BEDROOMS BEDS BEDSIDE BEDSPREAD BEDSPREADS BEDSPRING BEDSPRINGS BEDSTEAD BEDSTEADS BEDTIME BEE BEEBE BEECH BEECHAM BEECHEN BEECHER BEEF BEEFED BEEFER BEEFERS BEEFING BEEFS BEEFSTEAK BEEFY BEEHIVE BEEHIVES BEEN BEEP BEEPS BEER BEERS BEES BEET BEETHOVEN BEETLE BEETLED BEETLES BEETLING BEETS BEFALL BEFALLEN BEFALLING BEFALLS BEFELL BEFIT BEFITS BEFITTED BEFITTING BEFOG BEFOGGED BEFOGGING BEFORE BEFOREHAND BEFOUL BEFOULED BEFOULING BEFOULS BEFRIEND BEFRIENDED BEFRIENDING BEFRIENDS BEFUDDLE BEFUDDLED BEFUDDLES BEFUDDLING BEG BEGAN BEGET BEGETS BEGETTING BEGGAR BEGGARLY BEGGARS BEGGARY BEGGED BEGGING BEGIN BEGINNER BEGINNERS BEGINNING BEGINNINGS BEGINS BEGOT BEGOTTEN BEGRUDGE BEGRUDGED BEGRUDGES BEGRUDGING BEGRUDGINGLY BEGS BEGUILE BEGUILED BEGUILES BEGUILING BEGUN BEHALF BEHAVE BEHAVED BEHAVES BEHAVING BEHAVIOR BEHAVIORAL BEHAVIORALLY BEHAVIORISM BEHAVIORISTIC BEHAVIORS BEHEAD BEHEADING BEHELD BEHEMOTH BEHEMOTHS BEHEST BEHIND BEHOLD BEHOLDEN BEHOLDER BEHOLDERS BEHOLDING BEHOLDS BEHOOVE BEHOOVES BEIGE BEIJING BEING BEINGS BEIRUT BELA BELABOR BELABORED BELABORING BELABORS BELATED BELATEDLY BELAY BELAYED BELAYING BELAYS BELCH BELCHED BELCHES BELCHING BELFAST BELFRIES BELFRY BELGIAN BELGIANS BELGIUM BELGRADE BELIE BELIED BELIEF BELIEFS BELIES BELIEVABLE BELIEVABLY BELIEVE BELIEVED BELIEVER BELIEVERS BELIEVES BELIEVING BELITTLE BELITTLED BELITTLES BELITTLING BELIZE BELL BELLA BELLAMY BELLATRIX BELLBOY BELLBOYS BELLE BELLES BELLEVILLE BELLHOP BELLHOPS BELLICOSE BELLICOSITY BELLIES BELLIGERENCE BELLIGERENT BELLIGERENTLY BELLIGERENTS BELLINGHAM BELLINI BELLMAN BELLMEN BELLOVIN BELLOW BELLOWED BELLOWING BELLOWS BELLS BELLUM BELLWETHER BELLWETHERS BELLWOOD BELLY BELLYACHE BELLYFULL BELMONT BELOIT BELONG BELONGED BELONGING BELONGINGS BELONGS BELOVED BELOW BELSHAZZAR BELT BELTED BELTING BELTON BELTS BELTSVILLE BELUSHI BELY BELYING BEMOAN BEMOANED BEMOANING BEMOANS BEN BENARES BENCH BENCHED BENCHES BENCHMARK BENCHMARKING BENCHMARKS BEND BENDABLE BENDER BENDERS BENDING BENDIX BENDS BENEATH BENEDICT BENEDICTINE BENEDICTION BENEDICTIONS BENEDIKT BENEFACTOR BENEFACTORS BENEFICENCE BENEFICENCES BENEFICENT BENEFICIAL BENEFICIALLY BENEFICIARIES BENEFICIARY BENEFIT BENEFITED BENEFITING BENEFITS BENEFITTED BENEFITTING BENELUX BENEVOLENCE BENEVOLENT BENGAL BENGALI BENIGHTED BENIGN BENIGNLY BENJAMIN BENNETT BENNINGTON BENNY BENSON BENT BENTHAM BENTLEY BENTLEYS BENTON BENZ BENZEDRINE BENZENE BEOGRAD BEOWULF BEQUEATH BEQUEATHAL BEQUEATHED BEQUEATHING BEQUEATHS BEQUEST BEQUESTS BERATE BERATED BERATES BERATING BEREA BEREAVE BEREAVED BEREAVEMENT BEREAVEMENTS BEREAVES BEREAVING BEREFT BERENICES BERESFORD BERET BERETS BERGEN BERGLAND BERGLUND BERGMAN BERGSON BERGSTEN BERGSTROM BERIBBONED BERIBERI BERINGER BERKELEY BERKELIUM BERKOWITZ BERKSHIRE BERKSHIRES BERLIN BERLINER BERLINERS BERLINIZE BERLINIZES BERLIOZ BERLITZ BERMAN BERMUDA BERN BERNADINE BERNARD BERNARDINE BERNARDINO BERNARDO BERNE BERNET BERNHARD BERNICE BERNIE BERNIECE BERNINI BERNOULLI BERNSTEIN BERRA BERRIES BERRY BERSERK BERT BERTH BERTHA BERTHS BERTIE BERTRAM BERTRAND BERWICK BERYL BERYLLIUM BESEECH BESEECHES BESEECHING BESET BESETS BESETTING BESIDE BESIDES BESIEGE BESIEGED BESIEGER BESIEGERS BESIEGING BESMIRCH BESMIRCHED BESMIRCHES BESMIRCHING BESOTTED BESOTTER BESOTTING BESOUGHT BESPEAK BESPEAKS BESPECTACLED BESPOKE BESS BESSEL BESSEMER BESSEMERIZE BESSEMERIZES BESSIE BEST BESTED BESTIAL BESTING BESTIR BESTIRRING BESTOW BESTOWAL BESTOWED BESTS BESTSELLER BESTSELLERS BESTSELLING BET BETA BETATRON BETEL BETELGEUSE BETHESDA BETHLEHEM BETIDE BETRAY BETRAYAL BETRAYED BETRAYER BETRAYING BETRAYS BETROTH BETROTHAL BETROTHED BETS BETSEY BETSY BETTE BETTER BETTERED BETTERING BETTERMENT BETTERMENTS BETTERS BETTIES BETTING BETTY BETWEEN BETWIXT BEVEL BEVELED BEVELING BEVELS BEVERAGE BEVERAGES BEVERLY BEVY BEWAIL BEWAILED BEWAILING BEWAILS BEWARE BEWHISKERED BEWILDER BEWILDERED BEWILDERING BEWILDERINGLY BEWILDERMENT BEWILDERS BEWITCH BEWITCHED BEWITCHES BEWITCHING BEYOND BHUTAN BIALYSTOK BIANCO BIANNUAL BIAS BIASED BIASES BIASING BIB BIBBED BIBBING BIBLE BIBLES BIBLICAL BIBLICALLY BIBLIOGRAPHIC BIBLIOGRAPHICAL BIBLIOGRAPHIES BIBLIOGRAPHY BIBLIOPHILE BIBS BICAMERAL BICARBONATE BICENTENNIAL BICEP BICEPS BICKER BICKERED BICKERING BICKERS BICONCAVE BICONNECTED BICONVEX BICYCLE BICYCLED BICYCLER BICYCLERS BICYCLES BICYCLING BID BIDDABLE BIDDEN BIDDER BIDDERS BIDDIES BIDDING BIDDLE BIDDY BIDE BIDIRECTIONAL BIDS BIEN BIENNIAL BIENNIUM BIENVILLE BIER BIERCE BIFOCAL BIFOCALS BIFURCATE BIG BIGELOW BIGGER BIGGEST BIGGS BIGHT BIGHTS BIGNESS BIGOT BIGOTED BIGOTRY BIGOTS BIHARMONIC BIJECTION BIJECTIONS BIJECTIVE BIJECTIVELY BIKE BIKES BIKING BIKINI BIKINIS BILABIAL BILATERAL BILATERALLY BILBAO BILBO BILE BILGE BILGES BILINEAR BILINGUAL BILK BILKED BILKING BILKS BILL BILLBOARD BILLBOARDS BILLED BILLER BILLERS BILLET BILLETED BILLETING BILLETS BILLIARD BILLIARDS BILLIE BILLIKEN BILLIKENS BILLING BILLINGS BILLION BILLIONS BILLIONTH BILLOW BILLOWED BILLOWS BILLS BILTMORE BIMETALLIC BIMETALLISM BIMINI BIMODAL BIMOLECULAR BIMONTHLIES BIMONTHLY BIN BINARIES BINARY BINAURAL BIND BINDER BINDERS BINDING BINDINGS BINDS BING BINGE BINGES BINGHAM BINGHAMTON BINGO BINI BINOCULAR BINOCULARS BINOMIAL BINS BINUCLEAR BIOCHEMICAL BIOCHEMIST BIOCHEMISTRY BIOFEEDBACK BIOGRAPHER BIOGRAPHERS BIOGRAPHIC BIOGRAPHICAL BIOGRAPHICALLY BIOGRAPHIES BIOGRAPHY BIOLOGICAL BIOLOGICALLY BIOLOGIST BIOLOGISTS BIOLOGY BIOMEDICAL BIOMEDICINE BIOPHYSICAL BIOPHYSICIST BIOPHYSICS BIOPSIES BIOPSY BIOSCIENCE BIOSPHERE BIOSTATISTIC BIOSYNTHESIZE BIOTA BIOTIC BIPARTISAN BIPARTITE BIPED BIPEDS BIPLANE BIPLANES BIPOLAR BIRACIAL BIRCH BIRCHEN BIRCHES BIRD BIRDBATH BIRDBATHS BIRDIE BIRDIED BIRDIES BIRDLIKE BIRDS BIREFRINGENCE BIREFRINGENT BIRGIT BIRMINGHAM BIRMINGHAMIZE BIRMINGHAMIZES BIRTH BIRTHDAY BIRTHDAYS BIRTHED BIRTHPLACE BIRTHPLACES BIRTHRIGHT BIRTHRIGHTS BIRTHS BISCAYNE BISCUIT BISCUITS BISECT BISECTED BISECTING BISECTION BISECTIONS BISECTOR BISECTORS BISECTS BISHOP BISHOPS BISMARCK BISMARK BISMUTH BISON BISONS BISQUE BISQUES BISSAU BISTABLE BISTATE BIT BITCH BITCHES BITE BITER BITERS BITES BITING BITINGLY BITMAP BITNET BITS BITTEN BITTER BITTERER BITTEREST BITTERLY BITTERNESS BITTERNUT BITTERROOT BITTERS BITTERSWEET BITUMEN BITUMINOUS BITWISE BIVALVE BIVALVES BIVARIATE BIVOUAC BIVOUACS BIWEEKLY BIZARRE BIZET BLAB BLABBED BLABBERMOUTH BLABBERMOUTHS BLABBING BLABS BLACK BLACKBERRIES BLACKBERRY BLACKBIRD BLACKBIRDS BLACKBOARD BLACKBOARDS BLACKBURN BLACKED BLACKEN BLACKENED BLACKENING BLACKENS BLACKER BLACKEST BLACKFEET BLACKFOOT BLACKFOOTS BLACKING BLACKJACK BLACKJACKS BLACKLIST BLACKLISTED BLACKLISTING BLACKLISTS BLACKLY BLACKMAIL BLACKMAILED BLACKMAILER BLACKMAILERS BLACKMAILING BLACKMAILS BLACKMAN BLACKMER BLACKNESS BLACKOUT BLACKOUTS BLACKS BLACKSMITH BLACKSMITHS BLACKSTONE BLACKWELL BLACKWELLS BLADDER BLADDERS BLADE BLADES BLAINE BLAIR BLAKE BLAKEY BLAMABLE BLAME BLAMED BLAMELESS BLAMELESSNESS BLAMER BLAMERS BLAMES BLAMEWORTHY BLAMING BLANCH BLANCHARD BLANCHE BLANCHED BLANCHES BLANCHING BLAND BLANDLY BLANDNESS BLANK BLANKED BLANKER BLANKEST BLANKET BLANKETED BLANKETER BLANKETERS BLANKETING BLANKETS BLANKING BLANKLY BLANKNESS BLANKS BLANTON BLARE BLARED BLARES BLARING BLASE BLASPHEME BLASPHEMED BLASPHEMES BLASPHEMIES BLASPHEMING BLASPHEMOUS BLASPHEMOUSLY BLASPHEMOUSNESS BLASPHEMY BLAST BLASTED BLASTER BLASTERS BLASTING BLASTS BLATANT BLATANTLY BLATZ BLAZE BLAZED BLAZER BLAZERS BLAZES BLAZING BLEACH BLEACHED BLEACHER BLEACHERS BLEACHES BLEACHING BLEAK BLEAKER BLEAKLY BLEAKNESS BLEAR BLEARY BLEAT BLEATING BLEATS BLED BLEED BLEEDER BLEEDING BLEEDINGS BLEEDS BLEEKER BLEMISH BLEMISHES BLEND BLENDED BLENDER BLENDING BLENDS BLENHEIM BLESS BLESSED BLESSING BLESSINGS BLEW BLIGHT BLIGHTED BLIMP BLIMPS BLIND BLINDED BLINDER BLINDERS BLINDFOLD BLINDFOLDED BLINDFOLDING BLINDFOLDS BLINDING BLINDINGLY BLINDLY BLINDNESS BLINDS BLINK BLINKED BLINKER BLINKERS BLINKING BLINKS BLINN BLIP BLIPS BLISS BLISSFUL BLISSFULLY BLISTER BLISTERED BLISTERING BLISTERS BLITHE BLITHELY BLITZ BLITZES BLITZKRIEG BLIZZARD BLIZZARDS BLOAT BLOATED BLOATER BLOATING BLOATS BLOB BLOBS BLOC BLOCH BLOCK BLOCKADE BLOCKADED BLOCKADES BLOCKADING BLOCKAGE BLOCKAGES BLOCKED BLOCKER BLOCKERS BLOCKHOUSE BLOCKHOUSES BLOCKING BLOCKS BLOCS BLOKE BLOKES BLOMBERG BLOMQUIST BLOND BLONDE BLONDES BLONDS BLOOD BLOODBATH BLOODED BLOODHOUND BLOODHOUNDS BLOODIED BLOODIEST BLOODLESS BLOODS BLOODSHED BLOODSHOT BLOODSTAIN BLOODSTAINED BLOODSTAINS BLOODSTREAM BLOODY BLOOM BLOOMED BLOOMERS BLOOMFIELD BLOOMING BLOOMINGTON BLOOMS BLOOPER BLOSSOM BLOSSOMED BLOSSOMS BLOT BLOTS BLOTTED BLOTTING BLOUSE BLOUSES BLOW BLOWER BLOWERS BLOWFISH BLOWING BLOWN BLOWOUT BLOWS BLOWUP BLUBBER BLUDGEON BLUDGEONED BLUDGEONING BLUDGEONS BLUE BLUEBERRIES BLUEBERRY BLUEBIRD BLUEBIRDS BLUEBONNET BLUEBONNETS BLUEFISH BLUENESS BLUEPRINT BLUEPRINTS BLUER BLUES BLUEST BLUESTOCKING BLUFF BLUFFING BLUFFS BLUING BLUISH BLUM BLUMENTHAL BLUNDER BLUNDERBUSS BLUNDERED BLUNDERING BLUNDERINGS BLUNDERS BLUNT BLUNTED BLUNTER BLUNTEST BLUNTING BLUNTLY BLUNTNESS BLUNTS BLUR BLURB BLURRED BLURRING BLURRY BLURS BLURT BLURTED BLURTING BLURTS BLUSH BLUSHED BLUSHES BLUSHING BLUSTER BLUSTERED BLUSTERING BLUSTERS BLUSTERY BLYTHE BOA BOAR BOARD BOARDED BOARDER BOARDERS BOARDING BOARDINGHOUSE BOARDINGHOUSES BOARDS BOARSH BOAST BOASTED BOASTER BOASTERS BOASTFUL BOASTFULLY BOASTING BOASTINGS BOASTS BOAT BOATER BOATERS BOATHOUSE BOATHOUSES BOATING BOATLOAD BOATLOADS BOATMAN BOATMEN BOATS BOATSMAN BOATSMEN BOATSWAIN BOATSWAINS BOATYARD BOATYARDS BOB BOBBED BOBBIE BOBBIN BOBBING BOBBINS BOBBSEY BOBBY BOBOLINK BOBOLINKS BOBROW BOBS BOBWHITE BOBWHITES BOCA BODE BODENHEIM BODES BODICE BODIED BODIES BODILY BODLEIAN BODY BODYBUILDER BODYBUILDERS BODYBUILDING BODYGUARD BODYGUARDS BODYWEIGHT BOEING BOEOTIA BOEOTIAN BOER BOERS BOG BOGART BOGARTIAN BOGEYMEN BOGGED BOGGLE BOGGLED BOGGLES BOGGLING BOGOTA BOGS BOGUS BOHEME BOHEMIA BOHEMIAN BOHEMIANISM BOHR BOIL BOILED BOILER BOILERPLATE BOILERS BOILING BOILS BOIS BOISE BOISTEROUS BOISTEROUSLY BOLD BOLDER BOLDEST BOLDFACE BOLDLY BOLDNESS BOLIVIA BOLIVIAN BOLL BOLOGNA BOLSHEVIK BOLSHEVIKS BOLSHEVISM BOLSHEVIST BOLSHEVISTIC BOLSHOI BOLSTER BOLSTERED BOLSTERING BOLSTERS BOLT BOLTED BOLTING BOLTON BOLTS BOLTZMANN BOMB BOMBARD BOMBARDED BOMBARDING BOMBARDMENT BOMBARDS BOMBAST BOMBASTIC BOMBAY BOMBED BOMBER BOMBERS BOMBING BOMBINGS BOMBPROOF BOMBS BONANZA BONANZAS BONAPARTE BONAVENTURE BOND BONDAGE BONDED BONDER BONDERS BONDING BONDS BONDSMAN BONDSMEN BONE BONED BONER BONERS BONES BONFIRE BONFIRES BONG BONHAM BONIFACE BONING BONN BONNET BONNETED BONNETS BONNEVILLE BONNIE BONNY BONTEMPO BONUS BONUSES BONY BOO BOOB BOOBOO BOOBY BOOK BOOKCASE BOOKCASES BOOKED BOOKER BOOKERS BOOKIE BOOKIES BOOKING BOOKINGS BOOKISH BOOKKEEPER BOOKKEEPERS BOOKKEEPING BOOKLET BOOKLETS BOOKMARK BOOKS BOOKSELLER BOOKSELLERS BOOKSHELF BOOKSHELVES BOOKSTORE BOOKSTORES BOOKWORM BOOLEAN BOOLEANS BOOM BOOMED BOOMERANG BOOMERANGS BOOMING BOOMS BOON BOONE BOONTON BOOR BOORISH BOORS BOOS BOOST BOOSTED BOOSTER BOOSTING BOOSTS BOOT BOOTABLE BOOTED BOOTES BOOTH BOOTHS BOOTING BOOTLE BOOTLEG BOOTLEGGED BOOTLEGGER BOOTLEGGERS BOOTLEGGING BOOTLEGS BOOTS BOOTSTRAP BOOTSTRAPPED BOOTSTRAPPING BOOTSTRAPS BOOTY BOOZE BORATE BORATES BORAX BORDEAUX BORDELLO BORDELLOS BORDEN BORDER BORDERED BORDERING BORDERINGS BORDERLAND BORDERLANDS BORDERLINE BORDERS BORE BOREALIS BOREAS BORED BOREDOM BORER BORES BORG BORIC BORING BORIS BORN BORNE BORNEO BORON BOROUGH BOROUGHS BORROUGHS BORROW BORROWED BORROWER BORROWERS BORROWING BORROWS BOSCH BOSE BOSOM BOSOMS BOSPORUS BOSS BOSSED BOSSES BOSTITCH BOSTON BOSTONIAN BOSTONIANS BOSUN BOSWELL BOSWELLIZE BOSWELLIZES BOTANICAL BOTANIST BOTANISTS BOTANY BOTCH BOTCHED BOTCHER BOTCHERS BOTCHES BOTCHING BOTH BOTHER BOTHERED BOTHERING BOTHERS BOTHERSOME BOTSWANA BOTTLE BOTTLED BOTTLENECK BOTTLENECKS BOTTLER BOTTLERS BOTTLES BOTTLING BOTTOM BOTTOMED BOTTOMING BOTTOMLESS BOTTOMS BOTULINUS BOTULISM BOUCHER BOUFFANT BOUGH BOUGHS BOUGHT BOULDER BOULDERS BOULEVARD BOULEVARDS BOUNCE BOUNCED BOUNCER BOUNCES BOUNCING BOUNCY BOUND BOUNDARIES BOUNDARY BOUNDED BOUNDEN BOUNDING BOUNDLESS BOUNDLESSNESS BOUNDS BOUNTEOUS BOUNTEOUSLY BOUNTIES BOUNTIFUL BOUNTY BOUQUET BOUQUETS BOURBAKI BOURBON BOURGEOIS BOURGEOISIE BOURNE BOUSTROPHEDON BOUSTROPHEDONIC BOUT BOUTIQUE BOUTS BOUVIER BOVINE BOVINES BOW BOWDITCH BOWDLERIZE BOWDLERIZED BOWDLERIZES BOWDLERIZING BOWDOIN BOWED BOWEL BOWELS BOWEN BOWER BOWERS BOWES BOWING BOWL BOWLED BOWLER BOWLERS BOWLINE BOWLINES BOWLING BOWLS BOWMAN BOWS BOWSTRING BOWSTRINGS BOX BOXCAR BOXCARS BOXED BOXER BOXERS BOXES BOXFORD BOXING BOXTOP BOXTOPS BOXWOOD BOY BOYCE BOYCOTT BOYCOTTED BOYCOTTS BOYD BOYFRIEND BOYFRIENDS BOYHOOD BOYISH BOYISHNESS BOYLE BOYLSTON BOYS BRA BRACE BRACED BRACELET BRACELETS BRACES BRACING BRACKET BRACKETED BRACKETING BRACKETS BRACKISH BRADBURY BRADFORD BRADLEY BRADSHAW BRADY BRAE BRAES BRAG BRAGG BRAGGED BRAGGER BRAGGING BRAGS BRAHMAPUTRA BRAHMS BRAHMSIAN BRAID BRAIDED BRAIDING BRAIDS BRAILLE BRAIN BRAINARD BRAINARDS BRAINCHILD BRAINED BRAINING BRAINS BRAINSTEM BRAINSTEMS BRAINSTORM BRAINSTORMS BRAINWASH BRAINWASHED BRAINWASHES BRAINWASHING BRAINY BRAKE BRAKED BRAKEMAN BRAKES BRAKING BRAMBLE BRAMBLES BRAMBLY BRAN BRANCH BRANCHED BRANCHES BRANCHING BRANCHINGS BRANCHVILLE BRAND BRANDED BRANDEIS BRANDEL BRANDENBURG BRANDING BRANDISH BRANDISHES BRANDISHING BRANDON BRANDS BRANDT BRANDY BRANDYWINE BRANIFF BRANNON BRAS BRASH BRASHLY BRASHNESS BRASILIA BRASS BRASSES BRASSIERE BRASSTOWN BRASSY BRAT BRATS BRAUN BRAVADO BRAVE BRAVED BRAVELY BRAVENESS BRAVER BRAVERY BRAVES BRAVEST BRAVING BRAVO BRAVOS BRAWL BRAWLER BRAWLING BRAWN BRAY BRAYED BRAYER BRAYING BRAYS BRAZE BRAZED BRAZEN BRAZENLY BRAZENNESS BRAZES BRAZIER BRAZIERS BRAZIL BRAZILIAN BRAZING BRAZZAVILLE BREACH BREACHED BREACHER BREACHERS BREACHES BREACHING BREAD BREADBOARD BREADBOARDS BREADBOX BREADBOXES BREADED BREADING BREADS BREADTH BREADWINNER BREADWINNERS BREAK BREAKABLE BREAKABLES BREAKAGE BREAKAWAY BREAKDOWN BREAKDOWNS BREAKER BREAKERS BREAKFAST BREAKFASTED BREAKFASTER BREAKFASTERS BREAKFASTING BREAKFASTS BREAKING BREAKPOINT BREAKPOINTS BREAKS BREAKTHROUGH BREAKTHROUGHES BREAKTHROUGHS BREAKUP BREAKWATER BREAKWATERS BREAST BREASTED BREASTS BREASTWORK BREASTWORKS BREATH BREATHABLE BREATHE BREATHED BREATHER BREATHERS BREATHES BREATHING BREATHLESS BREATHLESSLY BREATHS BREATHTAKING BREATHTAKINGLY BREATHY BRED BREECH BREECHES BREED BREEDER BREEDING BREEDS BREEZE BREEZES BREEZILY BREEZY BREMEN BREMSSTRAHLUNG BRENDA BRENDAN BRENNAN BRENNER BRENT BRESENHAM BREST BRETHREN BRETON BRETONS BRETT BREVE BREVET BREVETED BREVETING BREVETS BREVITY BREW BREWED BREWER BREWERIES BREWERS BREWERY BREWING BREWS BREWSTER BRIAN BRIAR BRIARS BRIBE BRIBED BRIBER BRIBERS BRIBERY BRIBES BRIBING BRICE BRICK BRICKBAT BRICKED BRICKER BRICKLAYER BRICKLAYERS BRICKLAYING BRICKS BRIDAL BRIDE BRIDEGROOM BRIDES BRIDESMAID BRIDESMAIDS BRIDEWELL BRIDGE BRIDGEABLE BRIDGED BRIDGEHEAD BRIDGEHEADS BRIDGEPORT BRIDGES BRIDGET BRIDGETOWN BRIDGEWATER BRIDGEWORK BRIDGING BRIDLE BRIDLED BRIDLES BRIDLING BRIE BRIEF BRIEFCASE BRIEFCASES BRIEFED BRIEFER BRIEFEST BRIEFING BRIEFINGS BRIEFLY BRIEFNESS BRIEFS BRIEN BRIER BRIG BRIGADE BRIGADES BRIGADIER BRIGADIERS BRIGADOON BRIGANTINE BRIGGS BRIGHAM BRIGHT BRIGHTEN BRIGHTENED BRIGHTENER BRIGHTENERS BRIGHTENING BRIGHTENS BRIGHTER BRIGHTEST BRIGHTLY BRIGHTNESS BRIGHTON BRIGS BRILLIANCE BRILLIANCY BRILLIANT BRILLIANTLY BRILLOUIN BRIM BRIMFUL BRIMMED BRIMMING BRIMSTONE BRINDISI BRINDLE BRINDLED BRINE BRING BRINGER BRINGERS BRINGING BRINGS BRINK BRINKLEY BRINKMANSHIP BRINY BRISBANE BRISK BRISKER BRISKLY BRISKNESS BRISTLE BRISTLED BRISTLES BRISTLING BRISTOL BRITAIN BRITANNIC BRITANNICA BRITCHES BRITISH BRITISHER BRITISHLY BRITON BRITONS BRITTANY BRITTEN BRITTLE BRITTLENESS BROACH BROACHED BROACHES BROACHING BROAD BROADBAND BROADCAST BROADCASTED BROADCASTER BROADCASTERS BROADCASTING BROADCASTINGS BROADCASTS BROADEN BROADENED BROADENER BROADENERS BROADENING BROADENINGS BROADENS BROADER BROADEST BROADLY BROADNESS BROADSIDE BROADWAY BROCADE BROCADED BROCCOLI BROCHURE BROCHURES BROCK BROGLIE BROIL BROILED BROILER BROILERS BROILING BROILS BROKE BROKEN BROKENLY BROKENNESS BROKER BROKERAGE BROKERS BROMFIELD BROMIDE BROMIDES BROMINE BROMLEY BRONCHI BRONCHIAL BRONCHIOLE BRONCHIOLES BRONCHITIS BRONCHUS BRONTOSAURUS BRONX BRONZE BRONZED BRONZES BROOCH BROOCHES BROOD BROODER BROODING BROODS BROOK BROOKDALE BROOKE BROOKED BROOKFIELD BROOKHAVEN BROOKLINE BROOKLYN BROOKMONT BROOKS BROOM BROOMS BROOMSTICK BROOMSTICKS BROTH BROTHEL BROTHELS BROTHER BROTHERHOOD BROTHERLINESS BROTHERLY BROTHERS BROUGHT BROW BROWBEAT BROWBEATEN BROWBEATING BROWBEATS BROWN BROWNE BROWNED BROWNELL BROWNER BROWNEST BROWNIAN BROWNIE BROWNIES BROWNING BROWNISH BROWNNESS BROWNS BROWS BROWSE BROWSING BRUCE BRUCKNER BRUEGEL BRUISE BRUISED BRUISES BRUISING BRUMIDI BRUNCH BRUNCHES BRUNETTE BRUNHILDE BRUNO BRUNSWICK BRUNT BRUSH BRUSHED BRUSHES BRUSHFIRE BRUSHFIRES BRUSHING BRUSHLIKE BRUSHY BRUSQUE BRUSQUELY BRUSSELS BRUTAL BRUTALITIES BRUTALITY BRUTALIZE BRUTALIZED BRUTALIZES BRUTALIZING BRUTALLY BRUTE BRUTES BRUTISH BRUXELLES BRYAN BRYANT BRYCE BRYN BUBBLE BUBBLED BUBBLES BUBBLING BUBBLY BUCHANAN BUCHAREST BUCHENWALD BUCHWALD BUCK BUCKBOARD BUCKBOARDS BUCKED BUCKET BUCKETS BUCKING BUCKLE BUCKLED BUCKLER BUCKLES BUCKLEY BUCKLING BUCKNELL BUCKS BUCKSHOT BUCKSKIN BUCKSKINS BUCKWHEAT BUCKY BUCOLIC BUD BUDAPEST BUDD BUDDED BUDDHA BUDDHISM BUDDHIST BUDDHISTS BUDDIES BUDDING BUDDY BUDGE BUDGED BUDGES BUDGET BUDGETARY BUDGETED BUDGETER BUDGETERS BUDGETING BUDGETS BUDGING BUDS BUDWEISER BUDWEISERS BUEHRING BUENA BUENOS BUFF BUFFALO BUFFALOES BUFFER BUFFERED BUFFERING BUFFERS BUFFET BUFFETED BUFFETING BUFFETINGS BUFFETS BUFFOON BUFFOONS BUFFS BUG BUGABOO BUGATTI BUGEYED BUGGED BUGGER BUGGERS BUGGIES BUGGING BUGGY BUGLE BUGLED BUGLER BUGLES BUGLING BUGS BUICK BUILD BUILDER BUILDERS BUILDING BUILDINGS BUILDS BUILDUP BUILDUPS BUILT BUILTIN BUJUMBURA BULB BULBA BULBS BULGARIA BULGARIAN BULGE BULGED BULGING BULK BULKED BULKHEAD BULKHEADS BULKS BULKY BULL BULLDOG BULLDOGS BULLDOZE BULLDOZED BULLDOZER BULLDOZES BULLDOZING BULLED BULLET BULLETIN BULLETINS BULLETS BULLFROG BULLIED BULLIES BULLING BULLION BULLISH BULLOCK BULLS BULLSEYE BULLY BULLYING BULWARK BUM BUMBLE BUMBLEBEE BUMBLEBEES BUMBLED BUMBLER BUMBLERS BUMBLES BUMBLING BUMBRY BUMMED BUMMING BUMP BUMPED BUMPER BUMPERS BUMPING BUMPS BUMPTIOUS BUMPTIOUSLY BUMPTIOUSNESS BUMS BUN BUNCH BUNCHED BUNCHES BUNCHING BUNDESTAG BUNDLE BUNDLED BUNDLES BUNDLING BUNDOORA BUNDY BUNGALOW BUNGALOWS BUNGLE BUNGLED BUNGLER BUNGLERS BUNGLES BUNGLING BUNION BUNIONS BUNK BUNKER BUNKERED BUNKERS BUNKHOUSE BUNKHOUSES BUNKMATE BUNKMATES BUNKS BUNNIES BUNNY BUNS BUNSEN BUNT BUNTED BUNTER BUNTERS BUNTING BUNTS BUNYAN BUOY BUOYANCY BUOYANT BUOYED BUOYS BURBANK BURCH BURDEN BURDENED BURDENING BURDENS BURDENSOME BUREAU BUREAUCRACIES BUREAUCRACY BUREAUCRAT BUREAUCRATIC BUREAUCRATS BUREAUS BURGEON BURGEONED BURGEONING BURGESS BURGESSES BURGHER BURGHERS BURGLAR BURGLARIES BURGLARIZE BURGLARIZED BURGLARIZES BURGLARIZING BURGLARPROOF BURGLARPROOFED BURGLARPROOFING BURGLARPROOFS BURGLARS BURGLARY BURGUNDIAN BURGUNDIES BURGUNDY BURIAL BURIED BURIES BURKE BURKES BURL BURLESQUE BURLESQUES BURLINGAME BURLINGTON BURLY BURMA BURMESE BURN BURNE BURNED BURNER BURNERS BURNES BURNETT BURNHAM BURNING BURNINGLY BURNINGS BURNISH BURNISHED BURNISHES BURNISHING BURNS BURNSIDE BURNSIDES BURNT BURNTLY BURNTNESS BURP BURPED BURPING BURPS BURR BURROUGHS BURROW BURROWED BURROWER BURROWING BURROWS BURRS BURSA BURSITIS BURST BURSTINESS BURSTING BURSTS BURSTY BURT BURTON BURTT BURUNDI BURY BURYING BUS BUSBOY BUSBOYS BUSCH BUSED BUSES BUSH BUSHEL BUSHELS BUSHES BUSHING BUSHNELL BUSHWHACK BUSHWHACKED BUSHWHACKING BUSHWHACKS BUSHY BUSIED BUSIER BUSIEST BUSILY BUSINESS BUSINESSES BUSINESSLIKE BUSINESSMAN BUSINESSMEN BUSING BUSS BUSSED BUSSES BUSSING BUST BUSTARD BUSTARDS BUSTED BUSTER BUSTLE BUSTLING BUSTS BUSY BUT BUTANE BUTCHER BUTCHERED BUTCHERS BUTCHERY BUTLER BUTLERS BUTT BUTTE BUTTED BUTTER BUTTERBALL BUTTERCUP BUTTERED BUTTERER BUTTERERS BUTTERFAT BUTTERFIELD BUTTERFLIES BUTTERFLY BUTTERING BUTTERMILK BUTTERNUT BUTTERS BUTTERY BUTTES BUTTING BUTTOCK BUTTOCKS BUTTON BUTTONED BUTTONHOLE BUTTONHOLES BUTTONING BUTTONS BUTTRESS BUTTRESSED BUTTRESSES BUTTRESSING BUTTRICK BUTTS BUTYL BUTYRATE BUXOM BUXTEHUDE BUXTON BUY BUYER BUYERS BUYING BUYS BUZZ BUZZARD BUZZARDS BUZZED BUZZER BUZZES BUZZING BUZZWORD BUZZWORDS BUZZY BYE BYERS BYGONE BYLAW BYLAWS BYLINE BYLINES BYPASS BYPASSED BYPASSES BYPASSING BYPRODUCT BYPRODUCTS BYRD BYRNE BYRON BYRONIC BYRONISM BYRONIZE BYRONIZES BYSTANDER BYSTANDERS BYTE BYTES BYWAY BYWAYS BYWORD BYWORDS BYZANTINE BYZANTINIZE BYZANTINIZES BYZANTIUM CAB CABAL CABANA CABARET CABBAGE CABBAGES CABDRIVER CABIN CABINET CABINETS CABINS CABLE CABLED CABLES CABLING CABOOSE CABOT CABS CACHE CACHED CACHES CACHING CACKLE CACKLED CACKLER CACKLES CACKLING CACTI CACTUS CADAVER CADENCE CADENCED CADILLAC CADILLACS CADRES CADY CAESAR CAESARIAN CAESARIZE CAESARIZES CAFE CAFES CAFETERIA CAGE CAGED CAGER CAGERS CAGES CAGING CAHILL CAIMAN CAIN CAINE CAIRN CAIRO CAJOLE CAJOLED CAJOLES CAJOLING CAJUN CAJUNS CAKE CAKED CAKES CAKING CALAIS CALAMITIES CALAMITOUS CALAMITY CALCEOLARIA CALCIFY CALCIUM CALCOMP CALCOMP CALCOMP CALCULATE CALCULATED CALCULATES CALCULATING CALCULATION CALCULATIONS CALCULATIVE CALCULATOR CALCULATORS CALCULI CALCULUS CALCUTTA CALDER CALDERA CALDWELL CALEB CALENDAR CALENDARS CALF CALFSKIN CALGARY CALHOUN CALIBER CALIBERS CALIBRATE CALIBRATED CALIBRATES CALIBRATING CALIBRATION CALIBRATIONS CALICO CALIFORNIA CALIFORNIAN CALIFORNIANS CALIGULA CALIPH CALIPHS CALKINS CALL CALLABLE CALLAGHAN CALLAHAN CALLAN CALLED CALLER CALLERS CALLING CALLIOPE CALLISTO CALLOUS CALLOUSED CALLOUSLY CALLOUSNESS CALLS CALLUS CALM CALMED CALMER CALMEST CALMING CALMINGLY CALMLY CALMNESS CALMS CALORIC CALORIE CALORIES CALORIMETER CALORIMETRIC CALORIMETRY CALTECH CALUMNY CALVARY CALVE CALVERT CALVES CALVIN CALVINIST CALVINIZE CALVINIZES CALYPSO CAM CAMBODIA CAMBRIAN CAMBRIDGE CAMDEN CAME CAMEL CAMELOT CAMELS CAMEMBERT CAMERA CAMERAMAN CAMERAMEN CAMERAS CAMERON CAMEROON CAMEROUN CAMILLA CAMILLE CAMINO CAMOUFLAGE CAMOUFLAGED CAMOUFLAGES CAMOUFLAGING CAMP CAMPAIGN CAMPAIGNED CAMPAIGNER CAMPAIGNERS CAMPAIGNING CAMPAIGNS CAMPBELL CAMPBELLSPORT CAMPED CAMPER CAMPERS CAMPFIRE CAMPGROUND CAMPING CAMPS CAMPSITE CAMPUS CAMPUSES CAN CANAAN CANADA CANADIAN CANADIANIZATION CANADIANIZATIONS CANADIANIZE CANADIANIZES CANADIANS CANAL CANALS CANARIES CANARY CANAVERAL CANBERRA CANCEL CANCELED CANCELING CANCELLATION CANCELLATIONS CANCELS CANCER CANCEROUS CANCERS CANDACE CANDID CANDIDACY CANDIDATE CANDIDATES CANDIDE CANDIDLY CANDIDNESS CANDIED CANDIES CANDLE CANDLELIGHT CANDLER CANDLES CANDLESTICK CANDLESTICKS CANDLEWICK CANDOR CANDY CANE CANER CANFIELD CANINE CANIS CANISTER CANKER CANKERWORM CANNABIS CANNED CANNEL CANNER CANNERS CANNERY CANNIBAL CANNIBALIZE CANNIBALIZED CANNIBALIZES CANNIBALIZING CANNIBALS CANNING CANNISTER CANNISTERS CANNON CANNONBALL CANNONS CANNOT CANNY CANOE CANOES CANOGA CANON CANONIC CANONICAL CANONICALIZATION CANONICALIZE CANONICALIZED CANONICALIZES CANONICALIZING CANONICALLY CANONICALS CANONS CANOPUS CANOPY CANS CANT CANTABRIGIAN CANTALOUPE CANTANKEROUS CANTANKEROUSLY CANTEEN CANTERBURY CANTILEVER CANTO CANTON CANTONESE CANTONS CANTOR CANTORS CANUTE CANVAS CANVASES CANVASS CANVASSED CANVASSER CANVASSERS CANVASSES CANVASSING CANYON CANYONS CAP CAPABILITIES CAPABILITY CAPABLE CAPABLY CAPACIOUS CAPACIOUSLY CAPACIOUSNESS CAPACITANCE CAPACITANCES CAPACITIES CAPACITIVE CAPACITOR CAPACITORS CAPACITY CAPE CAPER CAPERS CAPES CAPET CAPETOWN CAPILLARY CAPISTRANO CAPITA CAPITAL CAPITALISM CAPITALIST CAPITALISTS CAPITALIZATION CAPITALIZATIONS CAPITALIZE CAPITALIZED CAPITALIZER CAPITALIZERS CAPITALIZES CAPITALIZING CAPITALLY CAPITALS CAPITAN CAPITOL CAPITOLINE CAPITOLS CAPPED CAPPING CAPPY CAPRICE CAPRICIOUS CAPRICIOUSLY CAPRICIOUSNESS CAPRICORN CAPS CAPSICUM CAPSTAN CAPSTONE CAPSULE CAPTAIN CAPTAINED CAPTAINING CAPTAINS CAPTION CAPTIONS CAPTIVATE CAPTIVATED CAPTIVATES CAPTIVATING CAPTIVATION CAPTIVE CAPTIVES CAPTIVITY CAPTOR CAPTORS CAPTURE CAPTURED CAPTURER CAPTURERS CAPTURES CAPTURING CAPUTO CAPYBARA CAR CARACAS CARAMEL CARAVAN CARAVANS CARAWAY CARBOHYDRATE CARBOLIC CARBOLOY CARBON CARBONATE CARBONATES CARBONATION CARBONDALE CARBONE CARBONES CARBONIC CARBONIZATION CARBONIZE CARBONIZED CARBONIZER CARBONIZERS CARBONIZES CARBONIZING CARBONS CARBORUNDUM CARBUNCLE CARCASS CARCASSES CARCINOGEN CARCINOGENIC CARCINOMA CARD CARDBOARD CARDER CARDIAC CARDIFF CARDINAL CARDINALITIES CARDINALITY CARDINALLY CARDINALS CARDIOD CARDIOLOGY CARDIOVASCULAR CARDS CARE CARED CAREEN CAREER CAREERS CAREFREE CAREFUL CAREFULLY CAREFULNESS CARELESS CARELESSLY CARELESSNESS CARES CARESS CARESSED CARESSER CARESSES CARESSING CARET CARETAKER CAREY CARGILL CARGO CARGOES CARIB CARIBBEAN CARIBOU CARICATURE CARING CARL CARLA CARLETON CARLETONIAN CARLIN CARLISLE CARLO CARLOAD CARLSBAD CARLSBADS CARLSON CARLTON CARLYLE CARMELA CARMEN CARMICHAEL CARNAGE CARNAL CARNATION CARNEGIE CARNIVAL CARNIVALS CARNIVOROUS CARNIVOROUSLY CAROL CAROLINA CAROLINAS CAROLINE CAROLINGIAN CAROLINIAN CAROLINIANS CAROLS CAROLYN CARP CARPATHIA CARPATHIANS CARPENTER CARPENTERS CARPENTRY CARPET CARPETED CARPETING CARPETS CARPORT CARR CARRARA CARRIAGE CARRIAGES CARRIE CARRIED CARRIER CARRIERS CARRIES CARRION CARROLL CARROT CARROTS CARRUTHERS CARRY CARRYING CARRYOVER CARRYOVERS CARS CARSON CART CARTED CARTEL CARTER CARTERS CARTESIAN CARTHAGE CARTHAGINIAN CARTILAGE CARTING CARTOGRAPHER CARTOGRAPHIC CARTOGRAPHY CARTON CARTONS CARTOON CARTOONS CARTRIDGE CARTRIDGES CARTS CARTWHEEL CARTY CARUSO CARVE CARVED CARVER CARVES CARVING CARVINGS CASANOVA CASCADABLE CASCADE CASCADED CASCADES CASCADING CASE CASED CASEMENT CASEMENTS CASES CASEWORK CASEY CASH CASHED CASHER CASHERS CASHES CASHEW CASHIER CASHIERS CASHING CASHMERE CASING CASINGS CASINO CASK CASKET CASKETS CASKS CASPIAN CASSANDRA CASSEROLE CASSEROLES CASSETTE CASSIOPEIA CASSITE CASSITES CASSIUS CASSOCK CAST CASTE CASTER CASTERS CASTES CASTIGATE CASTILLO CASTING CASTLE CASTLED CASTLES CASTOR CASTRO CASTROISM CASTS CASUAL CASUALLY CASUALNESS CASUALS CASUALTIES CASUALTY CAT CATACLYSMIC CATALAN CATALINA CATALOG CATALOGED CATALOGER CATALOGING CATALOGS CATALONIA CATALYST CATALYSTS CATALYTIC CATAPULT CATARACT CATASTROPHE CATASTROPHES CATASTROPHIC CATAWBA CATCH CATCHABLE CATCHER CATCHERS CATCHES CATCHING CATEGORICAL CATEGORICALLY CATEGORIES CATEGORIZATION CATEGORIZE CATEGORIZED CATEGORIZER CATEGORIZERS CATEGORIZES CATEGORIZING CATEGORY CATER CATERED CATERER CATERING CATERPILLAR CATERPILLARS CATERS CATHEDRAL CATHEDRALS CATHERINE CATHERWOOD CATHETER CATHETERS CATHODE CATHODES CATHOLIC CATHOLICISM CATHOLICISMS CATHOLICS CATHY CATLIKE CATNIP CATS CATSKILL CATSKILLS CATSUP CATTAIL CATTLE CATTLEMAN CATTLEMEN CAUCASIAN CAUCASIANS CAUCASUS CAUCHY CAUCUS CAUGHT CAULDRON CAULDRONS CAULIFLOWER CAULK CAUSAL CAUSALITY CAUSALLY CAUSATION CAUSATIONS CAUSE CAUSED CAUSER CAUSES CAUSEWAY CAUSEWAYS CAUSING CAUSTIC CAUSTICLY CAUSTICS CAUTION CAUTIONED CAUTIONER CAUTIONERS CAUTIONING CAUTIONINGS CAUTIONS CAUTIOUS CAUTIOUSLY CAUTIOUSNESS CAVALIER CAVALIERLY CAVALIERNESS CAVALRY CAVE CAVEAT CAVEATS CAVED CAVEMAN CAVEMEN CAVENDISH CAVERN CAVERNOUS CAVERNS CAVES CAVIAR CAVIL CAVINESS CAVING CAVITIES CAVITY CAW CAWING CAYLEY CAYUGA CEASE CEASED CEASELESS CEASELESSLY CEASELESSNESS CEASES CEASING CECIL CECILIA CECROPIA CEDAR CEDE CEDED CEDING CEDRIC CEILING CEILINGS CELANESE CELEBES CELEBRATE CELEBRATED CELEBRATES CELEBRATING CELEBRATION CELEBRATIONS CELEBRITIES CELEBRITY CELERITY CELERY CELESTE CELESTIAL CELESTIALLY CELIA CELL CELLAR CELLARS CELLED CELLIST CELLISTS CELLOPHANE CELLS CELLULAR CELLULOSE CELSIUS CELT CELTIC CELTICIZE CELTICIZES CEMENT CEMENTED CEMENTING CEMENTS CEMETERIES CEMETERY CENOZOIC CENSOR CENSORED CENSORING CENSORS CENSORSHIP CENSURE CENSURED CENSURER CENSURES CENSUS CENSUSES CENT CENTAUR CENTENARY CENTENNIAL CENTER CENTERED CENTERING CENTERPIECE CENTERPIECES CENTERS CENTIGRADE CENTIMETER CENTIMETERS CENTIPEDE CENTIPEDES CENTRAL CENTRALIA CENTRALISM CENTRALIST CENTRALIZATION CENTRALIZE CENTRALIZED CENTRALIZES CENTRALIZING CENTRALLY CENTREX CENTREX CENTRIFUGAL CENTRIFUGE CENTRIPETAL CENTRIST CENTROID CENTS CENTURIES CENTURY CEPHEUS CERAMIC CERBERUS CEREAL CEREALS CEREBELLUM CEREBRAL CEREMONIAL CEREMONIALLY CEREMONIALNESS CEREMONIES CEREMONY CERES CERN CERTAIN CERTAINLY CERTAINTIES CERTAINTY CERTIFIABLE CERTIFICATE CERTIFICATES CERTIFICATION CERTIFICATIONS CERTIFIED CERTIFIER CERTIFIERS CERTIFIES CERTIFY CERTIFYING CERVANTES CESARE CESSATION CESSATIONS CESSNA CETUS CEYLON CEZANNE CEZANNES CHABLIS CHABLISES CHAD CHADWICK CHAFE CHAFER CHAFF CHAFFER CHAFFEY CHAFFING CHAFING CHAGRIN CHAIN CHAINED CHAINING CHAINS CHAIR CHAIRED CHAIRING CHAIRLADY CHAIRMAN CHAIRMEN CHAIRPERSON CHAIRPERSONS CHAIRS CHAIRWOMAN CHAIRWOMEN CHALICE CHALICES CHALK CHALKED CHALKING CHALKS CHALLENGE CHALLENGED CHALLENGER CHALLENGERS CHALLENGES CHALLENGING CHALMERS CHAMBER CHAMBERED CHAMBERLAIN CHAMBERLAINS CHAMBERMAID CHAMBERS CHAMELEON CHAMPAGNE CHAMPAIGN CHAMPION CHAMPIONED CHAMPIONING CHAMPIONS CHAMPIONSHIP CHAMPIONSHIPS CHAMPLAIN CHANCE CHANCED CHANCELLOR CHANCELLORSVILLE CHANCERY CHANCES CHANCING CHANDELIER CHANDELIERS CHANDIGARH CHANG CHANGE CHANGEABILITY CHANGEABLE CHANGEABLY CHANGED CHANGEOVER CHANGER CHANGERS CHANGES CHANGING CHANNEL CHANNELED CHANNELING CHANNELLED CHANNELLER CHANNELLERS CHANNELLING CHANNELS CHANNING CHANT CHANTED CHANTER CHANTICLEER CHANTICLEERS CHANTILLY CHANTING CHANTS CHAO CHAOS CHAOTIC CHAP CHAPEL CHAPELS CHAPERON CHAPERONE CHAPERONED CHAPLAIN CHAPLAINS CHAPLIN CHAPMAN CHAPS CHAPTER CHAPTERS CHAR CHARACTER CHARACTERISTIC CHARACTERISTICALLY CHARACTERISTICS CHARACTERIZABLE CHARACTERIZATION CHARACTERIZATIONS CHARACTERIZE CHARACTERIZED CHARACTERIZER CHARACTERIZERS CHARACTERIZES CHARACTERIZING CHARACTERS CHARCOAL CHARCOALED CHARGE CHARGEABLE CHARGED CHARGER CHARGERS CHARGES CHARGING CHARIOT CHARIOTS CHARISMA CHARISMATIC CHARITABLE CHARITABLENESS CHARITIES CHARITY CHARLEMAGNE CHARLEMAGNES CHARLES CHARLESTON CHARLEY CHARLIE CHARLOTTE CHARLOTTESVILLE CHARM CHARMED CHARMER CHARMERS CHARMING CHARMINGLY CHARMS CHARON CHARS CHART CHARTA CHARTABLE CHARTED CHARTER CHARTERED CHARTERING CHARTERS CHARTING CHARTINGS CHARTRES CHARTREUSE CHARTS CHARYBDIS CHASE CHASED CHASER CHASERS CHASES CHASING CHASM CHASMS CHASSIS CHASTE CHASTELY CHASTENESS CHASTISE CHASTISED CHASTISER CHASTISERS CHASTISES CHASTISING CHASTITY CHAT CHATEAU CHATEAUS CHATHAM CHATTAHOOCHEE CHATTANOOGA CHATTEL CHATTER CHATTERED CHATTERER CHATTERING CHATTERS CHATTING CHATTY CHAUCER CHAUFFEUR CHAUFFEURED CHAUNCEY CHAUTAUQUA CHEAP CHEAPEN CHEAPENED CHEAPENING CHEAPENS CHEAPER CHEAPEST CHEAPLY CHEAPNESS CHEAT CHEATED CHEATER CHEATERS CHEATING CHEATS CHECK CHECKABLE CHECKBOOK CHECKBOOKS CHECKED CHECKER CHECKERBOARD CHECKERBOARDED CHECKERBOARDING CHECKERS CHECKING CHECKLIST CHECKOUT CHECKPOINT CHECKPOINTS CHECKS CHECKSUM CHECKSUMMED CHECKSUMMING CHECKSUMS CHECKUP CHEEK CHEEKBONE CHEEKS CHEEKY CHEER CHEERED CHEERER CHEERFUL CHEERFULLY CHEERFULNESS CHEERILY CHEERINESS CHEERING CHEERLEADER CHEERLESS CHEERLESSLY CHEERLESSNESS CHEERS CHEERY CHEESE CHEESECLOTH CHEESES CHEESY CHEETAH CHEF CHEFS CHEKHOV CHELSEA CHEMICAL CHEMICALLY CHEMICALS CHEMISE CHEMIST CHEMISTRIES CHEMISTRY CHEMISTS CHEN CHENEY CHENG CHERISH CHERISHED CHERISHES CHERISHING CHERITON CHEROKEE CHEROKEES CHERRIES CHERRY CHERUB CHERUBIM CHERUBS CHERYL CHESAPEAKE CHESHIRE CHESS CHEST CHESTER CHESTERFIELD CHESTERTON CHESTNUT CHESTNUTS CHESTS CHEVROLET CHEVY CHEW CHEWED CHEWER CHEWERS CHEWING CHEWS CHEYENNE CHEYENNES CHIANG CHIC CHICAGO CHICAGOAN CHICAGOANS CHICANA CHICANAS CHICANERY CHICANO CHICANOS CHICK CHICKADEE CHICKADEES CHICKASAWS CHICKEN CHICKENS CHICKS CHIDE CHIDED CHIDES CHIDING CHIEF CHIEFLY CHIEFS CHIEFTAIN CHIEFTAINS CHIFFON CHILD CHILDBIRTH CHILDHOOD CHILDISH CHILDISHLY CHILDISHNESS CHILDLIKE CHILDREN CHILE CHILEAN CHILES CHILI CHILL CHILLED CHILLER CHILLERS CHILLIER CHILLINESS CHILLING CHILLINGLY CHILLS CHILLY CHIME CHIMERA CHIMES CHIMNEY CHIMNEYS CHIMPANZEE CHIN CHINA CHINAMAN CHINAMEN CHINAS CHINATOWN CHINESE CHING CHINK CHINKED CHINKS CHINNED CHINNER CHINNERS CHINNING CHINOOK CHINS CHINTZ CHIP CHIPMUNK CHIPMUNKS CHIPPENDALE CHIPPEWA CHIPS CHIROPRACTOR CHIRP CHIRPED CHIRPING CHIRPS CHISEL CHISELED CHISELER CHISELS CHISHOLM CHIT CHIVALROUS CHIVALROUSLY CHIVALROUSNESS CHIVALRY CHLOE CHLORINE CHLOROFORM CHLOROPHYLL CHLOROPLAST CHLOROPLASTS CHOCK CHOCKS CHOCOLATE CHOCOLATES CHOCTAW CHOCTAWS CHOICE CHOICES CHOICEST CHOIR CHOIRS CHOKE CHOKED CHOKER CHOKERS CHOKES CHOKING CHOLERA CHOMSKY CHOOSE CHOOSER CHOOSERS CHOOSES CHOOSING CHOP CHOPIN CHOPPED CHOPPER CHOPPERS CHOPPING CHOPPY CHOPS CHORAL CHORD CHORDATE CHORDED CHORDING CHORDS CHORE CHOREOGRAPH CHOREOGRAPHY CHORES CHORING CHORTLE CHORUS CHORUSED CHORUSES CHOSE CHOSEN CHOU CHOWDER CHRIS CHRIST CHRISTEN CHRISTENDOM CHRISTENED CHRISTENING CHRISTENS CHRISTENSEN CHRISTENSON CHRISTIAN CHRISTIANA CHRISTIANITY CHRISTIANIZATION CHRISTIANIZATIONS CHRISTIANIZE CHRISTIANIZER CHRISTIANIZERS CHRISTIANIZES CHRISTIANIZING CHRISTIANS CHRISTIANSEN CHRISTIANSON CHRISTIE CHRISTINA CHRISTINE CHRISTLIKE CHRISTMAS CHRISTOFFEL CHRISTOPH CHRISTOPHER CHRISTY CHROMATOGRAM CHROMATOGRAPH CHROMATOGRAPHY CHROME CHROMIUM CHROMOSPHERE CHRONIC CHRONICLE CHRONICLED CHRONICLER CHRONICLERS CHRONICLES CHRONOGRAPH CHRONOGRAPHY CHRONOLOGICAL CHRONOLOGICALLY CHRONOLOGIES CHRONOLOGY CHRYSANTHEMUM CHRYSLER CHUBBIER CHUBBIEST CHUBBINESS CHUBBY CHUCK CHUCKLE CHUCKLED CHUCKLES CHUCKS CHUM CHUNGKING CHUNK CHUNKS CHUNKY CHURCH CHURCHES CHURCHGOER CHURCHGOING CHURCHILL CHURCHILLIAN CHURCHLY CHURCHMAN CHURCHMEN CHURCHWOMAN CHURCHWOMEN CHURCHYARD CHURCHYARDS CHURN CHURNED CHURNING CHURNS CHUTE CHUTES CHUTZPAH CICADA CICERO CICERONIAN CICERONIANIZE CICERONIANIZES CIDER CIGAR CIGARETTE CIGARETTES CIGARS CILIA CINCINNATI CINDER CINDERELLA CINDERS CINDY CINEMA CINEMATIC CINERAMA CINNAMON CIPHER CIPHERS CIPHERTEXT CIPHERTEXTS CIRCA CIRCE CIRCLE CIRCLED CIRCLES CIRCLET CIRCLING CIRCUIT CIRCUITOUS CIRCUITOUSLY CIRCUITRY CIRCUITS CIRCULANT CIRCULAR CIRCULARITY CIRCULARLY CIRCULATE CIRCULATED CIRCULATES CIRCULATING CIRCULATION CIRCUMCISE CIRCUMCISION CIRCUMFERENCE CIRCUMFLEX CIRCUMLOCUTION CIRCUMLOCUTIONS CIRCUMNAVIGATE CIRCUMNAVIGATED CIRCUMNAVIGATES CIRCUMPOLAR CIRCUMSCRIBE CIRCUMSCRIBED CIRCUMSCRIBING CIRCUMSCRIPTION CIRCUMSPECT CIRCUMSPECTION CIRCUMSPECTLY CIRCUMSTANCE CIRCUMSTANCED CIRCUMSTANCES CIRCUMSTANTIAL CIRCUMSTANTIALLY CIRCUMVENT CIRCUMVENTABLE CIRCUMVENTED CIRCUMVENTING CIRCUMVENTS CIRCUS CIRCUSES CISTERN CISTERNS CITADEL CITADELS CITATION CITATIONS CITE CITED CITES CITIES CITING CITIZEN CITIZENS CITIZENSHIP CITROEN CITRUS CITY CITYSCAPE CITYWIDE CIVET CIVIC CIVICS CIVIL CIVILIAN CIVILIANS CIVILITY CIVILIZATION CIVILIZATIONS CIVILIZE CIVILIZED CIVILIZES CIVILIZING CIVILLY CLAD CLADDING CLAIM CLAIMABLE CLAIMANT CLAIMANTS CLAIMED CLAIMING CLAIMS CLAIRE CLAIRVOYANT CLAIRVOYANTLY CLAM CLAMBER CLAMBERED CLAMBERING CLAMBERS CLAMOR CLAMORED CLAMORING CLAMOROUS CLAMORS CLAMP CLAMPED CLAMPING CLAMPS CLAMS CLAN CLANDESTINE CLANG CLANGED CLANGING CLANGS CLANK CLANNISH CLAP CLAPBOARD CLAPEYRON CLAPPING CLAPS CLARA CLARE CLAREMONT CLARENCE CLARENDON CLARIFICATION CLARIFICATIONS CLARIFIED CLARIFIES CLARIFY CLARIFYING CLARINET CLARITY CLARK CLARKE CLARRIDGE CLASH CLASHED CLASHES CLASHING CLASP CLASPED CLASPING CLASPS CLASS CLASSED CLASSES CLASSIC CLASSICAL CLASSICALLY CLASSICS CLASSIFIABLE CLASSIFICATION CLASSIFICATIONS CLASSIFIED CLASSIFIER CLASSIFIERS CLASSIFIES CLASSIFY CLASSIFYING CLASSMATE CLASSMATES CLASSROOM CLASSROOMS CLASSY CLATTER CLATTERED CLATTERING CLAUDE CLAUDIA CLAUDIO CLAUS CLAUSE CLAUSEN CLAUSES CLAUSIUS CLAUSTROPHOBIA CLAUSTROPHOBIC CLAW CLAWED CLAWING CLAWS CLAY CLAYS CLAYTON CLEAN CLEANED CLEANER CLEANERS CLEANEST CLEANING CLEANLINESS CLEANLY CLEANNESS CLEANS CLEANSE CLEANSED CLEANSER CLEANSERS CLEANSES CLEANSING CLEANUP CLEAR CLEARANCE CLEARANCES CLEARED CLEARER CLEAREST CLEARING CLEARINGS CLEARLY CLEARNESS CLEARS CLEARWATER CLEAVAGE CLEAVE CLEAVED CLEAVER CLEAVERS CLEAVES CLEAVING CLEFT CLEFTS CLEMENCY CLEMENS CLEMENT CLEMENTE CLEMSON CLENCH CLENCHED CLENCHES CLERGY CLERGYMAN CLERGYMEN CLERICAL CLERK CLERKED CLERKING CLERKS CLEVELAND CLEVER CLEVERER CLEVEREST CLEVERLY CLEVERNESS CLICHE CLICHES CLICK CLICKED CLICKING CLICKS CLIENT CLIENTELE CLIENTS CLIFF CLIFFORD CLIFFS CLIFTON CLIMATE CLIMATES CLIMATIC CLIMATICALLY CLIMATOLOGY CLIMAX CLIMAXED CLIMAXES CLIMB CLIMBED CLIMBER CLIMBERS CLIMBING CLIMBS CLIME CLIMES CLINCH CLINCHED CLINCHER CLINCHES CLING CLINGING CLINGS CLINIC CLINICAL CLINICALLY CLINICIAN CLINICS CLINK CLINKED CLINKER CLINT CLINTON CLIO CLIP CLIPBOARD CLIPPED CLIPPER CLIPPERS CLIPPING CLIPPINGS CLIPS CLIQUE CLIQUES CLITORIS CLIVE CLOAK CLOAKROOM CLOAKS CLOBBER CLOBBERED CLOBBERING CLOBBERS CLOCK CLOCKED CLOCKER CLOCKERS CLOCKING CLOCKINGS CLOCKS CLOCKWATCHER CLOCKWISE CLOCKWORK CLOD CLODS CLOG CLOGGED CLOGGING CLOGS CLOISTER CLOISTERS CLONE CLONED CLONES CLONING CLOSE CLOSED CLOSELY CLOSENESS CLOSENESSES CLOSER CLOSERS CLOSES CLOSEST CLOSET CLOSETED CLOSETS CLOSEUP CLOSING CLOSURE CLOSURES CLOT CLOTH CLOTHE CLOTHED CLOTHES CLOTHESHORSE CLOTHESLINE CLOTHING CLOTHO CLOTTING CLOTURE CLOUD CLOUDBURST CLOUDED CLOUDIER CLOUDIEST CLOUDINESS CLOUDING CLOUDLESS CLOUDS CLOUDY CLOUT CLOVE CLOVER CLOVES CLOWN CLOWNING CLOWNS CLUB CLUBBED CLUBBING CLUBHOUSE CLUBROOM CLUBS CLUCK CLUCKED CLUCKING CLUCKS CLUE CLUES CLUJ CLUMP CLUMPED CLUMPING CLUMPS CLUMSILY CLUMSINESS CLUMSY CLUNG CLUSTER CLUSTERED CLUSTERING CLUSTERINGS CLUSTERS CLUTCH CLUTCHED CLUTCHES CLUTCHING CLUTTER CLUTTERED CLUTTERING CLUTTERS CLYDE CLYTEMNESTRA COACH COACHED COACHER COACHES COACHING COACHMAN COACHMEN COAGULATE COAL COALESCE COALESCED COALESCES COALESCING COALITION COALS COARSE COARSELY COARSEN COARSENED COARSENESS COARSER COARSEST COAST COASTAL COASTED COASTER COASTERS COASTING COASTLINE COASTS COAT COATED COATES COATING COATINGS COATS COATTAIL COAUTHOR COAX COAXED COAXER COAXES COAXIAL COAXING COBALT COBB COBBLE COBBLER COBBLERS COBBLESTONE COBOL COBOL COBRA COBWEB COBWEBS COCA COCAINE COCHISE COCHRAN COCHRANE COCK COCKED COCKING COCKPIT COCKROACH COCKS COCKTAIL COCKTAILS COCKY COCO COCOA COCONUT COCONUTS COCOON COCOONS COD CODDINGTON CODDLE CODE CODED CODEINE CODER CODERS CODES CODEWORD CODEWORDS CODFISH CODICIL CODIFICATION CODIFICATIONS CODIFIED CODIFIER CODIFIERS CODIFIES CODIFY CODIFYING CODING CODINGS CODPIECE CODY COED COEDITOR COEDUCATION COEFFICIENT COEFFICIENTS COEQUAL COERCE COERCED COERCES COERCIBLE COERCING COERCION COERCIVE COEXIST COEXISTED COEXISTENCE COEXISTING COEXISTS COFACTOR COFFEE COFFEECUP COFFEEPOT COFFEES COFFER COFFERS COFFEY COFFIN COFFINS COFFMAN COG COGENT COGENTLY COGITATE COGITATED COGITATES COGITATING COGITATION COGNAC COGNITION COGNITIVE COGNITIVELY COGNIZANCE COGNIZANT COGS COHABITATION COHABITATIONS COHEN COHERE COHERED COHERENCE COHERENT COHERENTLY COHERES COHERING COHESION COHESIVE COHESIVELY COHESIVENESS COHN COHORT COIL COILED COILING COILS COIN COINAGE COINCIDE COINCIDED COINCIDENCE COINCIDENCES COINCIDENT COINCIDENTAL COINCIDES COINCIDING COINED COINER COINING COINS COKE COKES COLANDER COLBY COLD COLDER COLDEST COLDLY COLDNESS COLDS COLE COLEMAN COLERIDGE COLETTE COLGATE COLICKY COLIFORM COLISEUM COLLABORATE COLLABORATED COLLABORATES COLLABORATING COLLABORATION COLLABORATIONS COLLABORATIVE COLLABORATOR COLLABORATORS COLLAGEN COLLAPSE COLLAPSED COLLAPSES COLLAPSIBLE COLLAPSING COLLAR COLLARBONE COLLARED COLLARING COLLARS COLLATE COLLATERAL COLLEAGUE COLLEAGUES COLLECT COLLECTED COLLECTIBLE COLLECTING COLLECTION COLLECTIONS COLLECTIVE COLLECTIVELY COLLECTIVES COLLECTOR COLLECTORS COLLECTS COLLEGE COLLEGES COLLEGIAN COLLEGIATE COLLIDE COLLIDED COLLIDES COLLIDING COLLIE COLLIER COLLIES COLLINS COLLISION COLLISIONS COLLOIDAL COLLOQUIA COLLOQUIAL COLLOQUIUM COLLOQUY COLLUSION COLOGNE COLOMBIA COLOMBIAN COLOMBIANS COLOMBO COLON COLONEL COLONELS COLONIAL COLONIALLY COLONIALS COLONIES COLONIST COLONISTS COLONIZATION COLONIZE COLONIZED COLONIZER COLONIZERS COLONIZES COLONIZING COLONS COLONY COLOR COLORADO COLORED COLORER COLORERS COLORFUL COLORING COLORINGS COLORLESS COLORS COLOSSAL COLOSSEUM COLT COLTS COLUMBIA COLUMBIAN COLUMBUS COLUMN COLUMNIZE COLUMNIZED COLUMNIZES COLUMNIZING COLUMNS COMANCHE COMB COMBAT COMBATANT COMBATANTS COMBATED COMBATING COMBATIVE COMBATS COMBED COMBER COMBERS COMBINATION COMBINATIONAL COMBINATIONS COMBINATOR COMBINATORIAL COMBINATORIALLY COMBINATORIC COMBINATORICS COMBINATORS COMBINE COMBINED COMBINES COMBING COMBINGS COMBINING COMBS COMBUSTIBLE COMBUSTION COMDEX COME COMEBACK COMEDIAN COMEDIANS COMEDIC COMEDIES COMEDY COMELINESS COMELY COMER COMERS COMES COMESTIBLE COMET COMETARY COMETS COMFORT COMFORTABILITIES COMFORTABILITY COMFORTABLE COMFORTABLY COMFORTED COMFORTER COMFORTERS COMFORTING COMFORTINGLY COMFORTS COMIC COMICAL COMICALLY COMICS COMINFORM COMING COMINGS COMMA COMMAND COMMANDANT COMMANDANTS COMMANDED COMMANDEER COMMANDER COMMANDERS COMMANDING COMMANDINGLY COMMANDMENT COMMANDMENTS COMMANDO COMMANDS COMMAS COMMEMORATE COMMEMORATED COMMEMORATES COMMEMORATING COMMEMORATION COMMEMORATIVE COMMENCE COMMENCED COMMENCEMENT COMMENCEMENTS COMMENCES COMMENCING COMMEND COMMENDATION COMMENDATIONS COMMENDED COMMENDING COMMENDS COMMENSURATE COMMENT COMMENTARIES COMMENTARY COMMENTATOR COMMENTATORS COMMENTED COMMENTING COMMENTS COMMERCE COMMERCIAL COMMERCIALLY COMMERCIALNESS COMMERCIALS COMMISSION COMMISSIONED COMMISSIONER COMMISSIONERS COMMISSIONING COMMISSIONS COMMIT COMMITMENT COMMITMENTS COMMITS COMMITTED COMMITTEE COMMITTEEMAN COMMITTEEMEN COMMITTEES COMMITTEEWOMAN COMMITTEEWOMEN COMMITTING COMMODITIES COMMODITY COMMODORE COMMODORES COMMON COMMONALITIES COMMONALITY COMMONER COMMONERS COMMONEST COMMONLY COMMONNESS COMMONPLACE COMMONPLACES COMMONS COMMONWEALTH COMMONWEALTHS COMMOTION COMMUNAL COMMUNALLY COMMUNE COMMUNES COMMUNICANT COMMUNICANTS COMMUNICATE COMMUNICATED COMMUNICATES COMMUNICATING COMMUNICATION COMMUNICATIONS COMMUNICATIVE COMMUNICATOR COMMUNICATORS COMMUNION COMMUNIST COMMUNISTS COMMUNITIES COMMUNITY COMMUTATIVE COMMUTATIVITY COMMUTE COMMUTED COMMUTER COMMUTERS COMMUTES COMMUTING COMPACT COMPACTED COMPACTER COMPACTEST COMPACTING COMPACTION COMPACTLY COMPACTNESS COMPACTOR COMPACTORS COMPACTS COMPANIES COMPANION COMPANIONABLE COMPANIONS COMPANIONSHIP COMPANY COMPARABILITY COMPARABLE COMPARABLY COMPARATIVE COMPARATIVELY COMPARATIVES COMPARATOR COMPARATORS COMPARE COMPARED COMPARES COMPARING COMPARISON COMPARISONS COMPARTMENT COMPARTMENTALIZE COMPARTMENTALIZED COMPARTMENTALIZES COMPARTMENTALIZING COMPARTMENTED COMPARTMENTS COMPASS COMPASSION COMPASSIONATE COMPASSIONATELY COMPATIBILITIES COMPATIBILITY COMPATIBLE COMPATIBLES COMPATIBLY COMPEL COMPELLED COMPELLING COMPELLINGLY COMPELS COMPENDIUM COMPENSATE COMPENSATED COMPENSATES COMPENSATING COMPENSATION COMPENSATIONS COMPENSATORY COMPETE COMPETED COMPETENCE COMPETENCY COMPETENT COMPETENTLY COMPETES COMPETING COMPETITION COMPETITIONS COMPETITIVE COMPETITIVELY COMPETITOR COMPETITORS COMPILATION COMPILATIONS COMPILE COMPILED COMPILER COMPILERS COMPILES COMPILING COMPLACENCY COMPLAIN COMPLAINED COMPLAINER COMPLAINERS COMPLAINING COMPLAINS COMPLAINT COMPLAINTS COMPLEMENT COMPLEMENTARY COMPLEMENTED COMPLEMENTER COMPLEMENTERS COMPLEMENTING COMPLEMENTS COMPLETE COMPLETED COMPLETELY COMPLETENESS COMPLETES COMPLETING COMPLETION COMPLETIONS COMPLEX COMPLEXES COMPLEXION COMPLEXITIES COMPLEXITY COMPLEXLY COMPLIANCE COMPLIANT COMPLICATE COMPLICATED COMPLICATES COMPLICATING COMPLICATION COMPLICATIONS COMPLICATOR COMPLICATORS COMPLICITY COMPLIED COMPLIMENT COMPLIMENTARY COMPLIMENTED COMPLIMENTER COMPLIMENTERS COMPLIMENTING COMPLIMENTS COMPLY COMPLYING COMPONENT COMPONENTRY COMPONENTS COMPONENTWISE COMPOSE COMPOSED COMPOSEDLY COMPOSER COMPOSERS COMPOSES COMPOSING COMPOSITE COMPOSITES COMPOSITION COMPOSITIONAL COMPOSITIONS COMPOST COMPOSURE COMPOUND COMPOUNDED COMPOUNDING COMPOUNDS COMPREHEND COMPREHENDED COMPREHENDING COMPREHENDS COMPREHENSIBILITY COMPREHENSIBLE COMPREHENSION COMPREHENSIVE COMPREHENSIVELY COMPRESS COMPRESSED COMPRESSES COMPRESSIBLE COMPRESSING COMPRESSION COMPRESSIVE COMPRESSOR COMPRISE COMPRISED COMPRISES COMPRISING COMPROMISE COMPROMISED COMPROMISER COMPROMISERS COMPROMISES COMPROMISING COMPROMISINGLY COMPTON COMPTROLLER COMPTROLLERS COMPULSION COMPULSIONS COMPULSIVE COMPULSORY COMPUNCTION COMPUSERVE COMPUTABILITY COMPUTABLE COMPUTATION COMPUTATIONAL COMPUTATIONALLY COMPUTATIONS COMPUTE COMPUTED COMPUTER COMPUTERIZE COMPUTERIZED COMPUTERIZES COMPUTERIZING COMPUTERS COMPUTES COMPUTING COMRADE COMRADELY COMRADES COMRADESHIP CON CONAKRY CONANT CONCATENATE CONCATENATED CONCATENATES CONCATENATING CONCATENATION CONCATENATIONS CONCAVE CONCEAL CONCEALED CONCEALER CONCEALERS CONCEALING CONCEALMENT CONCEALS CONCEDE CONCEDED CONCEDES CONCEDING CONCEIT CONCEITED CONCEITS CONCEIVABLE CONCEIVABLY CONCEIVE CONCEIVED CONCEIVES CONCEIVING CONCENTRATE CONCENTRATED CONCENTRATES CONCENTRATING CONCENTRATION CONCENTRATIONS CONCENTRATOR CONCENTRATORS CONCENTRIC CONCEPT CONCEPTION CONCEPTIONS CONCEPTS CONCEPTUAL CONCEPTUALIZATION CONCEPTUALIZATIONS CONCEPTUALIZE CONCEPTUALIZED CONCEPTUALIZES CONCEPTUALIZING CONCEPTUALLY CONCERN CONCERNED CONCERNEDLY CONCERNING CONCERNS CONCERT CONCERTED CONCERTMASTER CONCERTO CONCERTS CONCESSION CONCESSIONS CONCILIATE CONCILIATORY CONCISE CONCISELY CONCISENESS CONCLAVE CONCLUDE CONCLUDED CONCLUDES CONCLUDING CONCLUSION CONCLUSIONS CONCLUSIVE CONCLUSIVELY CONCOCT CONCOMITANT CONCORD CONCORDANT CONCORDE CONCORDIA CONCOURSE CONCRETE CONCRETELY CONCRETENESS CONCRETES CONCRETION CONCUBINE CONCUR CONCURRED CONCURRENCE CONCURRENCIES CONCURRENCY CONCURRENT CONCURRENTLY CONCURRING CONCURS CONCUSSION CONDEMN CONDEMNATION CONDEMNATIONS CONDEMNED CONDEMNER CONDEMNERS CONDEMNING CONDEMNS CONDENSATION CONDENSE CONDENSED CONDENSER CONDENSES CONDENSING CONDESCEND CONDESCENDING CONDITION CONDITIONAL CONDITIONALLY CONDITIONALS CONDITIONED CONDITIONER CONDITIONERS CONDITIONING CONDITIONS CONDOM CONDONE CONDONED CONDONES CONDONING CONDUCE CONDUCIVE CONDUCIVENESS CONDUCT CONDUCTANCE CONDUCTED CONDUCTING CONDUCTION CONDUCTIVE CONDUCTIVITY CONDUCTOR CONDUCTORS CONDUCTS CONDUIT CONE CONES CONESTOGA CONFECTIONERY CONFEDERACY CONFEDERATE CONFEDERATES CONFEDERATION CONFEDERATIONS CONFER CONFEREE CONFERENCE CONFERENCES CONFERRED CONFERRER CONFERRERS CONFERRING CONFERS CONFESS CONFESSED CONFESSES CONFESSING CONFESSION CONFESSIONS CONFESSOR CONFESSORS CONFIDANT CONFIDANTS CONFIDE CONFIDED CONFIDENCE CONFIDENCES CONFIDENT CONFIDENTIAL CONFIDENTIALITY CONFIDENTIALLY CONFIDENTLY CONFIDES CONFIDING CONFIDINGLY CONFIGURABLE CONFIGURATION CONFIGURATIONS CONFIGURE CONFIGURED CONFIGURES CONFIGURING CONFINE CONFINED CONFINEMENT CONFINEMENTS CONFINER CONFINES CONFINING CONFIRM CONFIRMATION CONFIRMATIONS CONFIRMATORY CONFIRMED CONFIRMING CONFIRMS CONFISCATE CONFISCATED CONFISCATES CONFISCATING CONFISCATION CONFISCATIONS CONFLAGRATION CONFLICT CONFLICTED CONFLICTING CONFLICTS CONFLUENT CONFOCAL CONFORM CONFORMAL CONFORMANCE CONFORMED CONFORMING CONFORMITY CONFORMS CONFOUND CONFOUNDED CONFOUNDING CONFOUNDS CONFRONT CONFRONTATION CONFRONTATIONS CONFRONTED CONFRONTER CONFRONTERS CONFRONTING CONFRONTS CONFUCIAN CONFUCIANISM CONFUCIUS CONFUSE CONFUSED CONFUSER CONFUSERS CONFUSES CONFUSING CONFUSINGLY CONFUSION CONFUSIONS CONGENIAL CONGENIALLY CONGENITAL CONGEST CONGESTED CONGESTION CONGESTIVE CONGLOMERATE CONGO CONGOLESE CONGRATULATE CONGRATULATED CONGRATULATION CONGRATULATIONS CONGRATULATORY CONGREGATE CONGREGATED CONGREGATES CONGREGATING CONGREGATION CONGREGATIONS CONGRESS CONGRESSES CONGRESSIONAL CONGRESSIONALLY CONGRESSMAN CONGRESSMEN CONGRESSWOMAN CONGRESSWOMEN CONGRUENCE CONGRUENT CONIC CONIFER CONIFEROUS CONJECTURE CONJECTURED CONJECTURES CONJECTURING CONJOINED CONJUGAL CONJUGATE CONJUNCT CONJUNCTED CONJUNCTION CONJUNCTIONS CONJUNCTIVE CONJUNCTIVELY CONJUNCTS CONJUNCTURE CONJURE CONJURED CONJURER CONJURES CONJURING CONKLIN CONLEY CONNALLY CONNECT CONNECTED CONNECTEDNESS CONNECTICUT CONNECTING CONNECTION CONNECTIONLESS CONNECTIONS CONNECTIVE CONNECTIVES CONNECTIVITY CONNECTOR CONNECTORS CONNECTS CONNELLY CONNER CONNIE CONNIVANCE CONNIVE CONNOISSEUR CONNOISSEURS CONNORS CONNOTATION CONNOTATIVE CONNOTE CONNOTED CONNOTES CONNOTING CONNUBIAL CONQUER CONQUERABLE CONQUERED CONQUERER CONQUERERS CONQUERING CONQUEROR CONQUERORS CONQUERS CONQUEST CONQUESTS CONRAD CONRAIL CONSCIENCE CONSCIENCES CONSCIENTIOUS CONSCIENTIOUSLY CONSCIOUS CONSCIOUSLY CONSCIOUSNESS CONSCRIPT CONSCRIPTION CONSECRATE CONSECRATION CONSECUTIVE CONSECUTIVELY CONSENSUAL CONSENSUS CONSENT CONSENTED CONSENTER CONSENTERS CONSENTING CONSENTS CONSEQUENCE CONSEQUENCES CONSEQUENT CONSEQUENTIAL CONSEQUENTIALITIES CONSEQUENTIALITY CONSEQUENTLY CONSEQUENTS CONSERVATION CONSERVATIONIST CONSERVATIONISTS CONSERVATIONS CONSERVATISM CONSERVATIVE CONSERVATIVELY CONSERVATIVES CONSERVATOR CONSERVE CONSERVED CONSERVES CONSERVING CONSIDER CONSIDERABLE CONSIDERABLY CONSIDERATE CONSIDERATELY CONSIDERATION CONSIDERATIONS CONSIDERED CONSIDERING CONSIDERS CONSIGN CONSIGNED CONSIGNING CONSIGNS CONSIST CONSISTED CONSISTENCY CONSISTENT CONSISTENTLY CONSISTING CONSISTS CONSOLABLE CONSOLATION CONSOLATIONS CONSOLE CONSOLED CONSOLER CONSOLERS CONSOLES CONSOLIDATE CONSOLIDATED CONSOLIDATES CONSOLIDATING CONSOLIDATION CONSOLING CONSOLINGLY CONSONANT CONSONANTS CONSORT CONSORTED CONSORTING CONSORTIUM CONSORTS CONSPICUOUS CONSPICUOUSLY CONSPIRACIES CONSPIRACY CONSPIRATOR CONSPIRATORS CONSPIRE CONSPIRED CONSPIRES CONSPIRING CONSTABLE CONSTABLES CONSTANCE CONSTANCY CONSTANT CONSTANTINE CONSTANTINOPLE CONSTANTLY CONSTANTS CONSTELLATION CONSTELLATIONS CONSTERNATION CONSTITUENCIES CONSTITUENCY CONSTITUENT CONSTITUENTS CONSTITUTE CONSTITUTED CONSTITUTES CONSTITUTING CONSTITUTION CONSTITUTIONAL CONSTITUTIONALITY CONSTITUTIONALLY CONSTITUTIONS CONSTITUTIVE CONSTRAIN CONSTRAINED CONSTRAINING CONSTRAINS CONSTRAINT CONSTRAINTS CONSTRICT CONSTRUCT CONSTRUCTED CONSTRUCTIBILITY CONSTRUCTIBLE CONSTRUCTING CONSTRUCTION CONSTRUCTIONS CONSTRUCTIVE CONSTRUCTIVELY CONSTRUCTOR CONSTRUCTORS CONSTRUCTS CONSTRUE CONSTRUED CONSTRUING CONSUL CONSULAR CONSULATE CONSULATES CONSULS CONSULT CONSULTANT CONSULTANTS CONSULTATION CONSULTATIONS CONSULTATIVE CONSULTED CONSULTING CONSULTS CONSUMABLE CONSUME CONSUMED CONSUMER CONSUMERS CONSUMES CONSUMING CONSUMMATE CONSUMMATED CONSUMMATELY CONSUMMATION CONSUMPTION CONSUMPTIONS CONSUMPTIVE CONSUMPTIVELY CONTACT CONTACTED CONTACTING CONTACTS CONTAGION CONTAGIOUS CONTAGIOUSLY CONTAIN CONTAINABLE CONTAINED CONTAINER CONTAINERS CONTAINING CONTAINMENT CONTAINMENTS CONTAINS CONTAMINATE CONTAMINATED CONTAMINATES CONTAMINATING CONTAMINATION CONTEMPLATE CONTEMPLATED CONTEMPLATES CONTEMPLATING CONTEMPLATION CONTEMPLATIONS CONTEMPLATIVE CONTEMPORARIES CONTEMPORARINESS CONTEMPORARY CONTEMPT CONTEMPTIBLE CONTEMPTUOUS CONTEMPTUOUSLY CONTEND CONTENDED CONTENDER CONTENDERS CONTENDING CONTENDS CONTENT CONTENTED CONTENTING CONTENTION CONTENTIONS CONTENTLY CONTENTMENT CONTENTS CONTEST CONTESTABLE CONTESTANT CONTESTED CONTESTER CONTESTERS CONTESTING CONTESTS CONTEXT CONTEXTS CONTEXTUAL CONTEXTUALLY CONTIGUITY CONTIGUOUS CONTIGUOUSLY CONTINENT CONTINENTAL CONTINENTALLY CONTINENTS CONTINGENCIES CONTINGENCY CONTINGENT CONTINGENTS CONTINUAL CONTINUALLY CONTINUANCE CONTINUANCES CONTINUATION CONTINUATIONS CONTINUE CONTINUED CONTINUES CONTINUING CONTINUITIES CONTINUITY CONTINUOUS CONTINUOUSLY CONTINUUM CONTORTIONS CONTOUR CONTOURED CONTOURING CONTOURS CONTRABAND CONTRACEPTION CONTRACEPTIVE CONTRACT CONTRACTED CONTRACTING CONTRACTION CONTRACTIONS CONTRACTOR CONTRACTORS CONTRACTS CONTRACTUAL CONTRACTUALLY CONTRADICT CONTRADICTED CONTRADICTING CONTRADICTION CONTRADICTIONS CONTRADICTORY CONTRADICTS CONTRADISTINCTION CONTRADISTINCTIONS CONTRAPOSITIVE CONTRAPOSITIVES CONTRAPTION CONTRAPTIONS CONTRARINESS CONTRARY CONTRAST CONTRASTED CONTRASTER CONTRASTERS CONTRASTING CONTRASTINGLY CONTRASTS CONTRIBUTE CONTRIBUTED CONTRIBUTES CONTRIBUTING CONTRIBUTION CONTRIBUTIONS CONTRIBUTOR CONTRIBUTORILY CONTRIBUTORS CONTRIBUTORY CONTRITE CONTRITION CONTRIVANCE CONTRIVANCES CONTRIVE CONTRIVED CONTRIVER CONTRIVES CONTRIVING CONTROL CONTROLLABILITY CONTROLLABLE CONTROLLABLY CONTROLLED CONTROLLER CONTROLLERS CONTROLLING CONTROLS CONTROVERSIAL CONTROVERSIES CONTROVERSY CONTROVERTIBLE CONTUMACIOUS CONTUMACY CONUNDRUM CONUNDRUMS CONVAIR CONVALESCENT CONVECT CONVENE CONVENED CONVENES CONVENIENCE CONVENIENCES CONVENIENT CONVENIENTLY CONVENING CONVENT CONVENTION CONVENTIONAL CONVENTIONALLY CONVENTIONS CONVENTS CONVERGE CONVERGED CONVERGENCE CONVERGENT CONVERGES CONVERGING CONVERSANT CONVERSANTLY CONVERSATION CONVERSATIONAL CONVERSATIONALLY CONVERSATIONS CONVERSE CONVERSED CONVERSELY CONVERSES CONVERSING CONVERSION CONVERSIONS CONVERT CONVERTED CONVERTER CONVERTERS CONVERTIBILITY CONVERTIBLE CONVERTING CONVERTS CONVEX CONVEY CONVEYANCE CONVEYANCES CONVEYED CONVEYER CONVEYERS CONVEYING CONVEYOR CONVEYS CONVICT CONVICTED CONVICTING CONVICTION CONVICTIONS CONVICTS CONVINCE CONVINCED CONVINCER CONVINCERS CONVINCES CONVINCING CONVINCINGLY CONVIVIAL CONVOKE CONVOLUTED CONVOLUTION CONVOY CONVOYED CONVOYING CONVOYS CONVULSE CONVULSION CONVULSIONS CONWAY COO COOING COOK COOKBOOK COOKE COOKED COOKERY COOKIE COOKIES COOKING COOKS COOKY COOL COOLED COOLER COOLERS COOLEST COOLEY COOLIDGE COOLIE COOLIES COOLING COOLLY COOLNESS COOLS COON COONS COOP COOPED COOPER COOPERATE COOPERATED COOPERATES COOPERATING COOPERATION COOPERATIONS COOPERATIVE COOPERATIVELY COOPERATIVES COOPERATOR COOPERATORS COOPERS COOPS COORDINATE COORDINATED COORDINATES COORDINATING COORDINATION COORDINATIONS COORDINATOR COORDINATORS COORS COP COPE COPED COPELAND COPENHAGEN COPERNICAN COPERNICUS COPES COPIED COPIER COPIERS COPIES COPING COPINGS COPIOUS COPIOUSLY COPIOUSNESS COPLANAR COPPER COPPERFIELD COPPERHEAD COPPERS COPRA COPROCESSOR COPS COPSE COPY COPYING COPYRIGHT COPYRIGHTABLE COPYRIGHTED COPYRIGHTS COPYWRITER COQUETTE CORAL CORBETT CORCORAN CORD CORDED CORDER CORDIAL CORDIALITY CORDIALLY CORDS CORE CORED CORER CORERS CORES COREY CORIANDER CORING CORINTH CORINTHIAN CORINTHIANIZE CORINTHIANIZES CORINTHIANS CORIOLANUS CORK CORKED CORKER CORKERS CORKING CORKS CORKSCREW CORMORANT CORN CORNEA CORNELIA CORNELIAN CORNELIUS CORNELL CORNER CORNERED CORNERS CORNERSTONE CORNERSTONES CORNET CORNFIELD CORNFIELDS CORNING CORNISH CORNMEAL CORNS CORNSTARCH CORNUCOPIA CORNWALL CORNWALLIS CORNY COROLLARIES COROLLARY CORONADO CORONARIES CORONARY CORONATION CORONER CORONET CORONETS COROUTINE COROUTINES CORPORAL CORPORALS CORPORATE CORPORATELY CORPORATION CORPORATIONS CORPS CORPSE CORPSES CORPULENT CORPUS CORPUSCULAR CORRAL CORRECT CORRECTABLE CORRECTED CORRECTING CORRECTION CORRECTIONS CORRECTIVE CORRECTIVELY CORRECTIVES CORRECTLY CORRECTNESS CORRECTOR CORRECTS CORRELATE CORRELATED CORRELATES CORRELATING CORRELATION CORRELATIONS CORRELATIVE CORRESPOND CORRESPONDED CORRESPONDENCE CORRESPONDENCES CORRESPONDENT CORRESPONDENTS CORRESPONDING CORRESPONDINGLY CORRESPONDS CORRIDOR CORRIDORS CORRIGENDA CORRIGENDUM CORRIGIBLE CORROBORATE CORROBORATED CORROBORATES CORROBORATING CORROBORATION CORROBORATIONS CORROBORATIVE CORRODE CORROSION CORROSIVE CORRUGATE CORRUPT CORRUPTED CORRUPTER CORRUPTIBLE CORRUPTING CORRUPTION CORRUPTIONS CORRUPTS CORSET CORSICA CORSICAN CORTEX CORTEZ CORTICAL CORTLAND CORVALLIS CORVUS CORYDORAS COSGROVE COSINE COSINES COSMETIC COSMETICS COSMIC COSMOLOGY COSMOPOLITAN COSMOS COSPONSOR COSSACK COST COSTA COSTED COSTELLO COSTING COSTLY COSTS COSTUME COSTUMED COSTUMER COSTUMES COSTUMING COSY COT COTANGENT COTILLION COTS COTTAGE COTTAGER COTTAGES COTTON COTTONMOUTH COTTONS COTTONSEED COTTONWOOD COTTRELL COTYLEDON COTYLEDONS COUCH COUCHED COUCHES COUCHING COUGAR COUGH COUGHED COUGHING COUGHS COULD COULOMB COULTER COUNCIL COUNCILLOR COUNCILLORS COUNCILMAN COUNCILMEN COUNCILS COUNCILWOMAN COUNCILWOMEN COUNSEL COUNSELED COUNSELING COUNSELLED COUNSELLING COUNSELLOR COUNSELLORS COUNSELOR COUNSELORS COUNSELS COUNT COUNTABLE COUNTABLY COUNTED COUNTENANCE COUNTER COUNTERACT COUNTERACTED COUNTERACTING COUNTERACTIVE COUNTERARGUMENT COUNTERATTACK COUNTERBALANCE COUNTERCLOCKWISE COUNTERED COUNTEREXAMPLE COUNTEREXAMPLES COUNTERFEIT COUNTERFEITED COUNTERFEITER COUNTERFEITING COUNTERFLOW COUNTERING COUNTERINTUITIVE COUNTERMAN COUNTERMEASURE COUNTERMEASURES COUNTERMEN COUNTERPART COUNTERPARTS COUNTERPOINT COUNTERPOINTING COUNTERPOISE COUNTERPRODUCTIVE COUNTERPROPOSAL COUNTERREVOLUTION COUNTERS COUNTERSINK COUNTERSUNK COUNTESS COUNTIES COUNTING COUNTLESS COUNTRIES COUNTRY COUNTRYMAN COUNTRYMEN COUNTRYSIDE COUNTRYWIDE COUNTS COUNTY COUNTYWIDE COUPLE COUPLED COUPLER COUPLERS COUPLES COUPLING COUPLINGS COUPON COUPONS COURAGE COURAGEOUS COURAGEOUSLY COURIER COURIERS COURSE COURSED COURSER COURSES COURSING COURT COURTED COURTEOUS COURTEOUSLY COURTER COURTERS COURTESAN COURTESIES COURTESY COURTHOUSE COURTHOUSES COURTIER COURTIERS COURTING COURTLY COURTNEY COURTROOM COURTROOMS COURTS COURTSHIP COURTYARD COURTYARDS COUSIN COUSINS COVALENT COVARIANT COVE COVENANT COVENANTS COVENT COVENTRY COVER COVERABLE COVERAGE COVERED COVERING COVERINGS COVERLET COVERLETS COVERS COVERT COVERTLY COVES COVET COVETED COVETING COVETOUS COVETOUSNESS COVETS COW COWAN COWARD COWARDICE COWARDLY COWBOY COWBOYS COWED COWER COWERED COWERER COWERERS COWERING COWERINGLY COWERS COWHERD COWHIDE COWING COWL COWLICK COWLING COWLS COWORKER COWS COWSLIP COWSLIPS COYOTE COYOTES COYPU COZIER COZINESS COZY CRAB CRABAPPLE CRABS CRACK CRACKED CRACKER CRACKERS CRACKING CRACKLE CRACKLED CRACKLES CRACKLING CRACKPOT CRACKS CRADLE CRADLED CRADLES CRAFT CRAFTED CRAFTER CRAFTINESS CRAFTING CRAFTS CRAFTSMAN CRAFTSMEN CRAFTSPEOPLE CRAFTSPERSON CRAFTY CRAG CRAGGY CRAGS CRAIG CRAM CRAMER CRAMMING CRAMP CRAMPS CRAMS CRANBERRIES CRANBERRY CRANDALL CRANE CRANES CRANFORD CRANIA CRANIUM CRANK CRANKCASE CRANKED CRANKIER CRANKIEST CRANKILY CRANKING CRANKS CRANKSHAFT CRANKY CRANNY CRANSTON CRASH CRASHED CRASHER CRASHERS CRASHES CRASHING CRASS CRATE CRATER CRATERS CRATES CRAVAT CRAVATS CRAVE CRAVED CRAVEN CRAVES CRAVING CRAWFORD CRAWL CRAWLED CRAWLER CRAWLERS CRAWLING CRAWLS CRAY CRAYON CRAYS CRAZE CRAZED CRAZES CRAZIER CRAZIEST CRAZILY CRAZINESS CRAZING CRAZY CREAK CREAKED CREAKING CREAKS CREAKY CREAM CREAMED CREAMER CREAMERS CREAMERY CREAMING CREAMS CREAMY CREASE CREASED CREASES CREASING CREATE CREATED CREATES CREATING CREATION CREATIONS CREATIVE CREATIVELY CREATIVENESS CREATIVITY CREATOR CREATORS CREATURE CREATURES CREDENCE CREDENTIAL CREDIBILITY CREDIBLE CREDIBLY CREDIT CREDITABLE CREDITABLY CREDITED CREDITING CREDITOR CREDITORS CREDITS CREDULITY CREDULOUS CREDULOUSNESS CREE CREED CREEDS CREEK CREEKS CREEP CREEPER CREEPERS CREEPING CREEPS CREEPY CREIGHTON CREMATE CREMATED CREMATES CREMATING CREMATION CREMATIONS CREMATORY CREOLE CREON CREPE CREPT CRESCENT CRESCENTS CREST CRESTED CRESTFALLEN CRESTS CRESTVIEW CRETACEOUS CRETACEOUSLY CRETAN CRETE CRETIN CREVICE CREVICES CREW CREWCUT CREWED CREWING CREWS CRIB CRIBS CRICKET CRICKETS CRIED CRIER CRIERS CRIES CRIME CRIMEA CRIMEAN CRIMES CRIMINAL CRIMINALLY CRIMINALS CRIMINATE CRIMSON CRIMSONING CRINGE CRINGED CRINGES CRINGING CRIPPLE CRIPPLED CRIPPLES CRIPPLING CRISES CRISIS CRISP CRISPIN CRISPLY CRISPNESS CRISSCROSS CRITERIA CRITERION CRITIC CRITICAL CRITICALLY CRITICISM CRITICISMS CRITICIZE CRITICIZED CRITICIZES CRITICIZING CRITICS CRITIQUE CRITIQUES CRITIQUING CRITTER CROAK CROAKED CROAKING CROAKS CROATIA CROATIAN CROCHET CROCHETS CROCK CROCKERY CROCKETT CROCKS CROCODILE CROCUS CROFT CROIX CROMWELL CROMWELLIAN CROOK CROOKED CROOKS CROP CROPPED CROPPER CROPPERS CROPPING CROPS CROSBY CROSS CROSSABLE CROSSBAR CROSSBARS CROSSED CROSSER CROSSERS CROSSES CROSSING CROSSINGS CROSSLY CROSSOVER CROSSOVERS CROSSPOINT CROSSROAD CROSSTALK CROSSWALK CROSSWORD CROSSWORDS CROTCH CROTCHETY CROUCH CROUCHED CROUCHING CROW CROWD CROWDED CROWDER CROWDING CROWDS CROWED CROWING CROWLEY CROWN CROWNED CROWNING CROWNS CROWS CROYDON CRUCIAL CRUCIALLY CRUCIBLE CRUCIFIED CRUCIFIES CRUCIFIX CRUCIFIXION CRUCIFY CRUCIFYING CRUD CRUDDY CRUDE CRUDELY CRUDENESS CRUDER CRUDEST CRUEL CRUELER CRUELEST CRUELLY CRUELTY CRUICKSHANK CRUISE CRUISER CRUISERS CRUISES CRUISING CRUMB CRUMBLE CRUMBLED CRUMBLES CRUMBLING CRUMBLY CRUMBS CRUMMY CRUMPLE CRUMPLED CRUMPLES CRUMPLING CRUNCH CRUNCHED CRUNCHES CRUNCHIER CRUNCHIEST CRUNCHING CRUNCHY CRUSADE CRUSADER CRUSADERS CRUSADES CRUSADING CRUSH CRUSHABLE CRUSHED CRUSHER CRUSHERS CRUSHES CRUSHING CRUSHINGLY CRUSOE CRUST CRUSTACEAN CRUSTACEANS CRUSTS CRUTCH CRUTCHES CRUX CRUXES CRUZ CRY CRYING CRYOGENIC CRYPT CRYPTANALYSIS CRYPTANALYST CRYPTANALYTIC CRYPTIC CRYPTOGRAM CRYPTOGRAPHER CRYPTOGRAPHIC CRYPTOGRAPHICALLY CRYPTOGRAPHY CRYPTOLOGIST CRYPTOLOGY CRYSTAL CRYSTALLINE CRYSTALLIZE CRYSTALLIZED CRYSTALLIZES CRYSTALLIZING CRYSTALS CUB CUBA CUBAN CUBANIZE CUBANIZES CUBANS CUBBYHOLE CUBE CUBED CUBES CUBIC CUBS CUCKOO CUCKOOS CUCUMBER CUCUMBERS CUDDLE CUDDLED CUDDLY CUDGEL CUDGELS CUE CUED CUES CUFF CUFFLINK CUFFS CUISINE CULBERTSON CULINARY CULL CULLED CULLER CULLING CULLS CULMINATE CULMINATED CULMINATES CULMINATING CULMINATION CULPA CULPABLE CULPRIT CULPRITS CULT CULTIVABLE CULTIVATE CULTIVATED CULTIVATES CULTIVATING CULTIVATION CULTIVATIONS CULTIVATOR CULTIVATORS CULTS CULTURAL CULTURALLY CULTURE CULTURED CULTURES CULTURING CULVER CULVERS CUMBERLAND CUMBERSOME CUMMINGS CUMMINS CUMULATIVE CUMULATIVELY CUNARD CUNNILINGUS CUNNING CUNNINGHAM CUNNINGLY CUP CUPBOARD CUPBOARDS CUPERTINO CUPFUL CUPID CUPPED CUPPING CUPS CURABLE CURABLY CURB CURBING CURBS CURD CURDLE CURE CURED CURES CURFEW CURFEWS CURING CURIOSITIES CURIOSITY CURIOUS CURIOUSER CURIOUSEST CURIOUSLY CURL CURLED CURLER CURLERS CURLICUE CURLING CURLS CURLY CURRAN CURRANT CURRANTS CURRENCIES CURRENCY CURRENT CURRENTLY CURRENTNESS CURRENTS CURRICULAR CURRICULUM CURRICULUMS CURRIED CURRIES CURRY CURRYING CURS CURSE CURSED CURSES CURSING CURSIVE CURSOR CURSORILY CURSORS CURSORY CURT CURTAIL CURTAILED CURTAILS CURTAIN CURTAINED CURTAINS CURTATE CURTIS CURTLY CURTNESS CURTSIES CURTSY CURVACEOUS CURVATURE CURVE CURVED CURVES CURVILINEAR CURVING CUSHING CUSHION CUSHIONED CUSHIONING CUSHIONS CUSHMAN CUSP CUSPS CUSTARD CUSTER CUSTODIAL CUSTODIAN CUSTODIANS CUSTODY CUSTOM CUSTOMARILY CUSTOMARY CUSTOMER CUSTOMERS CUSTOMIZABLE CUSTOMIZATION CUSTOMIZATIONS CUSTOMIZE CUSTOMIZED CUSTOMIZER CUSTOMIZERS CUSTOMIZES CUSTOMIZING CUSTOMS CUT CUTANEOUS CUTBACK CUTE CUTEST CUTLASS CUTLET CUTOFF CUTOUT CUTOVER CUTS CUTTER CUTTERS CUTTHROAT CUTTING CUTTINGLY CUTTINGS CUTTLEFISH CUVIER CUZCO CYANAMID CYANIDE CYBERNETIC CYBERNETICS CYBERSPACE CYCLADES CYCLE CYCLED CYCLES CYCLIC CYCLICALLY CYCLING CYCLOID CYCLOIDAL CYCLOIDS CYCLONE CYCLONES CYCLOPS CYCLOTRON CYCLOTRONS CYGNUS CYLINDER CYLINDERS CYLINDRICAL CYMBAL CYMBALS CYNIC CYNICAL CYNICALLY CYNTHIA CYPRESS CYPRIAN CYPRIOT CYPRUS CYRIL CYRILLIC CYRUS CYST CYSTS CYTOLOGY CYTOPLASM CZAR CZECH CZECHIZATION CZECHIZATIONS CZECHOSLOVAKIA CZERNIAK DABBLE DABBLED DABBLER DABBLES DABBLING DACCA DACRON DACTYL DACTYLIC DAD DADA DADAISM DADAIST DADAISTIC DADDY DADE DADS DAEDALUS DAEMON DAEMONS DAFFODIL DAFFODILS DAGGER DAHL DAHLIA DAHOMEY DAILEY DAILIES DAILY DAIMLER DAINTILY DAINTINESS DAINTY DAIRY DAIRYLEA DAISIES DAISY DAKAR DAKOTA DALE DALES DALEY DALHOUSIE DALI DALLAS DALTON DALY DALZELL DAM DAMAGE DAMAGED DAMAGER DAMAGERS DAMAGES DAMAGING DAMASCUS DAMASK DAME DAMMING DAMN DAMNATION DAMNED DAMNING DAMNS DAMOCLES DAMON DAMP DAMPEN DAMPENS DAMPER DAMPING DAMPNESS DAMS DAMSEL DAMSELS DAN DANA DANBURY DANCE DANCED DANCER DANCERS DANCES DANCING DANDELION DANDELIONS DANDY DANE DANES DANGER DANGEROUS DANGEROUSLY DANGERS DANGLE DANGLED DANGLES DANGLING DANIEL DANIELS DANIELSON DANISH DANIZATION DANIZATIONS DANIZE DANIZES DANNY DANTE DANUBE DANUBIAN DANVILLE DANZIG DAPHNE DAR DARE DARED DARER DARERS DARES DARESAY DARING DARINGLY DARIUS DARK DARKEN DARKER DARKEST DARKLY DARKNESS DARKROOM DARLENE DARLING DARLINGS DARLINGTON DARN DARNED DARNER DARNING DARNS DARPA DARRELL DARROW DARRY DART DARTED DARTER DARTING DARTMOUTH DARTS DARWIN DARWINIAN DARWINISM DARWINISTIC DARWINIZE DARWINIZES DASH DASHBOARD DASHED DASHER DASHERS DASHES DASHING DASHINGLY DATA DATABASE DATABASES DATAGRAM DATAGRAMS DATAMATION DATAMEDIA DATE DATED DATELINE DATER DATES DATING DATIVE DATSUN DATUM DAUGHERTY DAUGHTER DAUGHTERLY DAUGHTERS DAUNT DAUNTED DAUNTLESS DAVE DAVID DAVIDSON DAVIE DAVIES DAVINICH DAVIS DAVISON DAVY DAWN DAWNED DAWNING DAWNS DAWSON DAY DAYBREAK DAYDREAM DAYDREAMING DAYDREAMS DAYLIGHT DAYLIGHTS DAYS DAYTIME DAYTON DAYTONA DAZE DAZED DAZZLE DAZZLED DAZZLER DAZZLES DAZZLING DAZZLINGLY DEACON DEACONS DEACTIVATE DEAD DEADEN DEADLINE DEADLINES DEADLOCK DEADLOCKED DEADLOCKING DEADLOCKS DEADLY DEADNESS DEADWOOD DEAF DEAFEN DEAFER DEAFEST DEAFNESS DEAL DEALER DEALERS DEALERSHIP DEALING DEALINGS DEALLOCATE DEALLOCATED DEALLOCATING DEALLOCATION DEALLOCATIONS DEALS DEALT DEAN DEANE DEANNA DEANS DEAR DEARBORN DEARER DEAREST DEARLY DEARNESS DEARTH DEARTHS DEATH DEATHBED DEATHLY DEATHS DEBACLE DEBAR DEBASE DEBATABLE DEBATE DEBATED DEBATER DEBATERS DEBATES DEBATING DEBAUCH DEBAUCHERY DEBBIE DEBBY DEBILITATE DEBILITATED DEBILITATES DEBILITATING DEBILITY DEBIT DEBITED DEBORAH DEBRA DEBRIEF DEBRIS DEBT DEBTOR DEBTS DEBUG DEBUGGED DEBUGGER DEBUGGERS DEBUGGING DEBUGS DEBUNK DEBUSSY DEBUTANTE DEC DECADE DECADENCE DECADENT DECADENTLY DECADES DECAL DECATHLON DECATUR DECAY DECAYED DECAYING DECAYS DECCA DECEASE DECEASED DECEASES DECEASING DECEDENT DECEIT DECEITFUL DECEITFULLY DECEITFULNESS DECEIVE DECEIVED DECEIVER DECEIVERS DECEIVES DECEIVING DECELERATE DECELERATED DECELERATES DECELERATING DECELERATION DECEMBER DECEMBERS DECENCIES DECENCY DECENNIAL DECENT DECENTLY DECENTRALIZATION DECENTRALIZED DECEPTION DECEPTIONS DECEPTIVE DECEPTIVELY DECERTIFY DECIBEL DECIDABILITY DECIDABLE DECIDE DECIDED DECIDEDLY DECIDES DECIDING DECIDUOUS DECIMAL DECIMALS DECIMATE DECIMATED DECIMATES DECIMATING DECIMATION DECIPHER DECIPHERED DECIPHERER DECIPHERING DECIPHERS DECISION DECISIONS DECISIVE DECISIVELY DECISIVENESS DECK DECKED DECKER DECKING DECKINGS DECKS DECLARATION DECLARATIONS DECLARATIVE DECLARATIVELY DECLARATIVES DECLARATOR DECLARATORY DECLARE DECLARED DECLARER DECLARERS DECLARES DECLARING DECLASSIFY DECLINATION DECLINATIONS DECLINE DECLINED DECLINER DECLINERS DECLINES DECLINING DECNET DECODE DECODED DECODER DECODERS DECODES DECODING DECODINGS DECOLLETAGE DECOLLIMATE DECOMPILE DECOMPOSABILITY DECOMPOSABLE DECOMPOSE DECOMPOSED DECOMPOSES DECOMPOSING DECOMPOSITION DECOMPOSITIONS DECOMPRESS DECOMPRESSION DECORATE DECORATED DECORATES DECORATING DECORATION DECORATIONS DECORATIVE DECORUM DECOUPLE DECOUPLED DECOUPLES DECOUPLING DECOY DECOYS DECREASE DECREASED DECREASES DECREASING DECREASINGLY DECREE DECREED DECREEING DECREES DECREMENT DECREMENTED DECREMENTING DECREMENTS DECRYPT DECRYPTED DECRYPTING DECRYPTION DECRYPTS DECSTATION DECSYSTEM DECTAPE DEDICATE DEDICATED DEDICATES DEDICATING DEDICATION DEDUCE DEDUCED DEDUCER DEDUCES DEDUCIBLE DEDUCING DEDUCT DEDUCTED DEDUCTIBLE DEDUCTING DEDUCTION DEDUCTIONS DEDUCTIVE DEE DEED DEEDED DEEDING DEEDS DEEM DEEMED DEEMING DEEMPHASIZE DEEMPHASIZED DEEMPHASIZES DEEMPHASIZING DEEMS DEEP DEEPEN DEEPENED DEEPENING DEEPENS DEEPER DEEPEST DEEPLY DEEPS DEER DEERE DEFACE DEFAULT DEFAULTED DEFAULTER DEFAULTING DEFAULTS DEFEAT DEFEATED DEFEATING DEFEATS DEFECATE DEFECT DEFECTED DEFECTING DEFECTION DEFECTIONS DEFECTIVE DEFECTS DEFEND DEFENDANT DEFENDANTS DEFENDED DEFENDER DEFENDERS DEFENDING DEFENDS DEFENESTRATE DEFENESTRATED DEFENESTRATES DEFENESTRATING DEFENESTRATION DEFENSE DEFENSELESS DEFENSES DEFENSIBLE DEFENSIVE DEFER DEFERENCE DEFERMENT DEFERMENTS DEFERRABLE DEFERRED DEFERRER DEFERRERS DEFERRING DEFERS DEFIANCE DEFIANT DEFIANTLY DEFICIENCIES DEFICIENCY DEFICIENT DEFICIT DEFICITS DEFIED DEFIES DEFILE DEFILING DEFINABLE DEFINE DEFINED DEFINER DEFINES DEFINING DEFINITE DEFINITELY DEFINITENESS DEFINITION DEFINITIONAL DEFINITIONS DEFINITIVE DEFLATE DEFLATER DEFLECT DEFOCUS DEFOE DEFOREST DEFORESTATION DEFORM DEFORMATION DEFORMATIONS DEFORMED DEFORMITIES DEFORMITY DEFRAUD DEFRAY DEFROST DEFTLY DEFUNCT DEFY DEFYING DEGENERACY DEGENERATE DEGENERATED DEGENERATES DEGENERATING DEGENERATION DEGENERATIVE DEGRADABLE DEGRADATION DEGRADATIONS DEGRADE DEGRADED DEGRADES DEGRADING DEGREE DEGREES DEHUMIDIFY DEHYDRATE DEIFY DEIGN DEIGNED DEIGNING DEIGNS DEIMOS DEIRDRE DEIRDRES DEITIES DEITY DEJECTED DEJECTEDLY DEKALB DEKASTERE DEL DELANEY DELANO DELAWARE DELAY DELAYED DELAYING DELAYS DELEGATE DELEGATED DELEGATES DELEGATING DELEGATION DELEGATIONS DELETE DELETED DELETER DELETERIOUS DELETES DELETING DELETION DELETIONS DELFT DELHI DELIA DELIBERATE DELIBERATED DELIBERATELY DELIBERATENESS DELIBERATES DELIBERATING DELIBERATION DELIBERATIONS DELIBERATIVE DELIBERATOR DELIBERATORS DELICACIES DELICACY DELICATE DELICATELY DELICATESSEN DELICIOUS DELICIOUSLY DELIGHT DELIGHTED DELIGHTEDLY DELIGHTFUL DELIGHTFULLY DELIGHTING DELIGHTS DELILAH DELIMIT DELIMITATION DELIMITED DELIMITER DELIMITERS DELIMITING DELIMITS DELINEAMENT DELINEATE DELINEATED DELINEATES DELINEATING DELINEATION DELINQUENCY DELINQUENT DELIRIOUS DELIRIOUSLY DELIRIUM DELIVER DELIVERABLE DELIVERABLES DELIVERANCE DELIVERED DELIVERER DELIVERERS DELIVERIES DELIVERING DELIVERS DELIVERY DELL DELLA DELLS DELLWOOD DELMARVA DELPHI DELPHIC DELPHICALLY DELPHINUS DELTA DELTAS DELUDE DELUDED DELUDES DELUDING DELUGE DELUGED DELUGES DELUSION DELUSIONS DELUXE DELVE DELVES DELVING DEMAGNIFY DEMAGOGUE DEMAND DEMANDED DEMANDER DEMANDING DEMANDINGLY DEMANDS DEMARCATE DEMEANOR DEMENTED DEMERIT DEMETER DEMIGOD DEMISE DEMO DEMOCRACIES DEMOCRACY DEMOCRAT DEMOCRATIC DEMOCRATICALLY DEMOCRATS DEMODULATE DEMODULATOR DEMOGRAPHIC DEMOLISH DEMOLISHED DEMOLISHES DEMOLITION DEMON DEMONIAC DEMONIC DEMONS DEMONSTRABLE DEMONSTRATE DEMONSTRATED DEMONSTRATES DEMONSTRATING DEMONSTRATION DEMONSTRATIONS DEMONSTRATIVE DEMONSTRATIVELY DEMONSTRATOR DEMONSTRATORS DEMORALIZE DEMORALIZED DEMORALIZES DEMORALIZING DEMORGAN DEMOTE DEMOUNTABLE DEMPSEY DEMULTIPLEX DEMULTIPLEXED DEMULTIPLEXER DEMULTIPLEXERS DEMULTIPLEXING DEMUR DEMYTHOLOGIZE DEN DENATURE DENEB DENEBOLA DENEEN DENIABLE DENIAL DENIALS DENIED DENIER DENIES DENIGRATE DENIGRATED DENIGRATES DENIGRATING DENIZEN DENMARK DENNIS DENNY DENOMINATE DENOMINATION DENOMINATIONS DENOMINATOR DENOMINATORS DENOTABLE DENOTATION DENOTATIONAL DENOTATIONALLY DENOTATIONS DENOTATIVE DENOTE DENOTED DENOTES DENOTING DENOUNCE DENOUNCED DENOUNCES DENOUNCING DENS DENSE DENSELY DENSENESS DENSER DENSEST DENSITIES DENSITY DENT DENTAL DENTALLY DENTED DENTING DENTIST DENTISTRY DENTISTS DENTON DENTS DENTURE DENUDE DENUMERABLE DENUNCIATE DENUNCIATION DENVER DENY DENYING DEODORANT DEOXYRIBONUCLEIC DEPART DEPARTED DEPARTING DEPARTMENT DEPARTMENTAL DEPARTMENTS DEPARTS DEPARTURE DEPARTURES DEPEND DEPENDABILITY DEPENDABLE DEPENDABLY DEPENDED DEPENDENCE DEPENDENCIES DEPENDENCY DEPENDENT DEPENDENTLY DEPENDENTS DEPENDING DEPENDS DEPICT DEPICTED DEPICTING DEPICTS DEPLETE DEPLETED DEPLETES DEPLETING DEPLETION DEPLETIONS DEPLORABLE DEPLORE DEPLORED DEPLORES DEPLORING DEPLOY DEPLOYED DEPLOYING DEPLOYMENT DEPLOYMENTS DEPLOYS DEPORT DEPORTATION DEPORTEE DEPORTMENT DEPOSE DEPOSED DEPOSES DEPOSIT DEPOSITARY DEPOSITED DEPOSITING DEPOSITION DEPOSITIONS DEPOSITOR DEPOSITORS DEPOSITORY DEPOSITS DEPOT DEPOTS DEPRAVE DEPRAVED DEPRAVITY DEPRECATE DEPRECIATE DEPRECIATED DEPRECIATES DEPRECIATION DEPRESS DEPRESSED DEPRESSES DEPRESSING DEPRESSION DEPRESSIONS DEPRIVATION DEPRIVATIONS DEPRIVE DEPRIVED DEPRIVES DEPRIVING DEPTH DEPTHS DEPUTIES DEPUTY DEQUEUE DEQUEUED DEQUEUES DEQUEUING DERAIL DERAILED DERAILING DERAILS DERBY DERBYSHIRE DEREFERENCE DEREGULATE DEREGULATED DEREK DERIDE DERISION DERIVABLE DERIVATION DERIVATIONS DERIVATIVE DERIVATIVES DERIVE DERIVED DERIVES DERIVING DEROGATORY DERRICK DERRIERE DERVISH DES DESCARTES DESCEND DESCENDANT DESCENDANTS DESCENDED DESCENDENT DESCENDER DESCENDERS DESCENDING DESCENDS DESCENT DESCENTS DESCRIBABLE DESCRIBE DESCRIBED DESCRIBER DESCRIBES DESCRIBING DESCRIPTION DESCRIPTIONS DESCRIPTIVE DESCRIPTIVELY DESCRIPTIVES DESCRIPTOR DESCRIPTORS DESCRY DESECRATE DESEGREGATE DESERT DESERTED DESERTER DESERTERS DESERTING DESERTION DESERTIONS DESERTS DESERVE DESERVED DESERVES DESERVING DESERVINGLY DESERVINGS DESIDERATA DESIDERATUM DESIGN DESIGNATE DESIGNATED DESIGNATES DESIGNATING DESIGNATION DESIGNATIONS DESIGNATOR DESIGNATORS DESIGNED DESIGNER DESIGNERS DESIGNING DESIGNS DESIRABILITY DESIRABLE DESIRABLY DESIRE DESIRED DESIRES DESIRING DESIROUS DESIST DESK DESKS DESKTOP DESMOND DESOLATE DESOLATELY DESOLATION DESOLATIONS DESPAIR DESPAIRED DESPAIRING DESPAIRINGLY DESPAIRS DESPATCH DESPATCHED DESPERADO DESPERATE DESPERATELY DESPERATION DESPICABLE DESPISE DESPISED DESPISES DESPISING DESPITE DESPOIL DESPONDENT DESPOT DESPOTIC DESPOTISM DESPOTS DESSERT DESSERTS DESSICATE DESTABILIZE DESTINATION DESTINATIONS DESTINE DESTINED DESTINIES DESTINY DESTITUTE DESTITUTION DESTROY DESTROYED DESTROYER DESTROYERS DESTROYING DESTROYS DESTRUCT DESTRUCTION DESTRUCTIONS DESTRUCTIVE DESTRUCTIVELY DESTRUCTIVENESS DESTRUCTOR DESTUFF DESTUFFING DESTUFFS DESUETUDE DESULTORY DESYNCHRONIZE DETACH DETACHED DETACHER DETACHES DETACHING DETACHMENT DETACHMENTS DETAIL DETAILED DETAILING DETAILS DETAIN DETAINED DETAINING DETAINS DETECT DETECTABLE DETECTABLY DETECTED DETECTING DETECTION DETECTIONS DETECTIVE DETECTIVES DETECTOR DETECTORS DETECTS DETENTE DETENTION DETER DETERGENT DETERIORATE DETERIORATED DETERIORATES DETERIORATING DETERIORATION DETERMINABLE DETERMINACY DETERMINANT DETERMINANTS DETERMINATE DETERMINATELY DETERMINATION DETERMINATIONS DETERMINATIVE DETERMINE DETERMINED DETERMINER DETERMINERS DETERMINES DETERMINING DETERMINISM DETERMINISTIC DETERMINISTICALLY DETERRED DETERRENT DETERRING DETEST DETESTABLE DETESTED DETOUR DETRACT DETRACTOR DETRACTORS DETRACTS DETRIMENT DETRIMENTAL DETROIT DEUCE DEUS DEUTERIUM DEUTSCH DEVASTATE DEVASTATED DEVASTATES DEVASTATING DEVASTATION DEVELOP DEVELOPED DEVELOPER DEVELOPERS DEVELOPING DEVELOPMENT DEVELOPMENTAL DEVELOPMENTS DEVELOPS DEVIANT DEVIANTS DEVIATE DEVIATED DEVIATES DEVIATING DEVIATION DEVIATIONS DEVICE DEVICES DEVIL DEVILISH DEVILISHLY DEVILS DEVIOUS DEVISE DEVISED DEVISES DEVISING DEVISINGS DEVOID DEVOLVE DEVON DEVONSHIRE DEVOTE DEVOTED DEVOTEDLY DEVOTEE DEVOTEES DEVOTES DEVOTING DEVOTION DEVOTIONS DEVOUR DEVOURED DEVOURER DEVOURS DEVOUT DEVOUTLY DEVOUTNESS DEW DEWDROP DEWDROPS DEWEY DEWITT DEWY DEXEDRINE DEXTERITY DHABI DIABETES DIABETIC DIABOLIC DIACHRONIC DIACRITICAL DIADEM DIAGNOSABLE DIAGNOSE DIAGNOSED DIAGNOSES DIAGNOSING DIAGNOSIS DIAGNOSTIC DIAGNOSTICIAN DIAGNOSTICS DIAGONAL DIAGONALLY DIAGONALS DIAGRAM DIAGRAMMABLE DIAGRAMMATIC DIAGRAMMATICALLY DIAGRAMMED DIAGRAMMER DIAGRAMMERS DIAGRAMMING DIAGRAMS DIAL DIALECT DIALECTIC DIALECTS DIALED DIALER DIALERS DIALING DIALOG DIALOGS DIALOGUE DIALOGUES DIALS DIALUP DIALYSIS DIAMAGNETIC DIAMETER DIAMETERS DIAMETRIC DIAMETRICALLY DIAMOND DIAMONDS DIANA DIANE DIANNE DIAPER DIAPERS DIAPHRAGM DIAPHRAGMS DIARIES DIARRHEA DIARY DIATRIBE DIATRIBES DIBBLE DICE DICHOTOMIZE DICHOTOMY DICKENS DICKERSON DICKINSON DICKSON DICKY DICTATE DICTATED DICTATES DICTATING DICTATION DICTATIONS DICTATOR DICTATORIAL DICTATORS DICTATORSHIP DICTION DICTIONARIES DICTIONARY DICTUM DICTUMS DID DIDACTIC DIDDLE DIDO DIE DIEBOLD DIED DIEGO DIEHARD DIELECTRIC DIELECTRICS DIEM DIES DIESEL DIET DIETARY DIETER DIETERS DIETETIC DIETICIAN DIETITIAN DIETITIANS DIETRICH DIETS DIETZ DIFFER DIFFERED DIFFERENCE DIFFERENCES DIFFERENT DIFFERENTIABLE DIFFERENTIAL DIFFERENTIALS DIFFERENTIATE DIFFERENTIATED DIFFERENTIATES DIFFERENTIATING DIFFERENTIATION DIFFERENTIATIONS DIFFERENTIATORS DIFFERENTLY DIFFERER DIFFERERS DIFFERING DIFFERS DIFFICULT DIFFICULTIES DIFFICULTLY DIFFICULTY DIFFRACT DIFFUSE DIFFUSED DIFFUSELY DIFFUSER DIFFUSERS DIFFUSES DIFFUSIBLE DIFFUSING DIFFUSION DIFFUSIONS DIFFUSIVE DIG DIGEST DIGESTED DIGESTIBLE DIGESTING DIGESTION DIGESTIVE DIGESTS DIGGER DIGGERS DIGGING DIGGINGS DIGIT DIGITAL DIGITALIS DIGITALLY DIGITIZATION DIGITIZE DIGITIZED DIGITIZES DIGITIZING DIGITS DIGNIFIED DIGNIFY DIGNITARY DIGNITIES DIGNITY DIGRAM DIGRESS DIGRESSED DIGRESSES DIGRESSING DIGRESSION DIGRESSIONS DIGRESSIVE DIGS DIHEDRAL DIJKSTRA DIJON DIKE DIKES DILAPIDATE DILATATION DILATE DILATED DILATES DILATING DILATION DILDO DILEMMA DILEMMAS DILIGENCE DILIGENT DILIGENTLY DILL DILLON DILOGARITHM DILUTE DILUTED DILUTES DILUTING DILUTION DIM DIMAGGIO DIME DIMENSION DIMENSIONAL DIMENSIONALITY DIMENSIONALLY DIMENSIONED DIMENSIONING DIMENSIONS DIMES DIMINISH DIMINISHED DIMINISHES DIMINISHING DIMINUTION DIMINUTIVE DIMLY DIMMED DIMMER DIMMERS DIMMEST DIMMING DIMNESS DIMPLE DIMS DIN DINAH DINE DINED DINER DINERS DINES DING DINGHY DINGINESS DINGO DINGY DINING DINNER DINNERS DINNERTIME DINNERWARE DINOSAUR DINT DIOCLETIAN DIODE DIODES DIOGENES DION DIONYSIAN DIONYSUS DIOPHANTINE DIOPTER DIORAMA DIOXIDE DIP DIPHTHERIA DIPHTHONG DIPLOMA DIPLOMACY DIPLOMAS DIPLOMAT DIPLOMATIC DIPLOMATS DIPOLE DIPPED DIPPER DIPPERS DIPPING DIPPINGS DIPS DIRAC DIRE DIRECT DIRECTED DIRECTING DIRECTION DIRECTIONAL DIRECTIONALITY DIRECTIONALLY DIRECTIONS DIRECTIVE DIRECTIVES DIRECTLY DIRECTNESS DIRECTOR DIRECTORATE DIRECTORIES DIRECTORS DIRECTORY DIRECTRICES DIRECTRIX DIRECTS DIRGE DIRGES DIRICHLET DIRT DIRTIER DIRTIEST DIRTILY DIRTINESS DIRTS DIRTY DIS DISABILITIES DISABILITY DISABLE DISABLED DISABLER DISABLERS DISABLES DISABLING DISADVANTAGE DISADVANTAGEOUS DISADVANTAGES DISAFFECTED DISAFFECTION DISAGREE DISAGREEABLE DISAGREED DISAGREEING DISAGREEMENT DISAGREEMENTS DISAGREES DISALLOW DISALLOWED DISALLOWING DISALLOWS DISAMBIGUATE DISAMBIGUATED DISAMBIGUATES DISAMBIGUATING DISAMBIGUATION DISAMBIGUATIONS DISAPPEAR DISAPPEARANCE DISAPPEARANCES DISAPPEARED DISAPPEARING DISAPPEARS DISAPPOINT DISAPPOINTED DISAPPOINTING DISAPPOINTMENT DISAPPOINTMENTS DISAPPROVAL DISAPPROVE DISAPPROVED DISAPPROVES DISARM DISARMAMENT DISARMED DISARMING DISARMS DISASSEMBLE DISASSEMBLED DISASSEMBLES DISASSEMBLING DISASSEMBLY DISASTER DISASTERS DISASTROUS DISASTROUSLY DISBAND DISBANDED DISBANDING DISBANDS DISBURSE DISBURSED DISBURSEMENT DISBURSEMENTS DISBURSES DISBURSING DISC DISCARD DISCARDED DISCARDING DISCARDS DISCERN DISCERNED DISCERNIBILITY DISCERNIBLE DISCERNIBLY DISCERNING DISCERNINGLY DISCERNMENT DISCERNS DISCHARGE DISCHARGED DISCHARGES DISCHARGING DISCIPLE DISCIPLES DISCIPLINARY DISCIPLINE DISCIPLINED DISCIPLINES DISCIPLINING DISCLAIM DISCLAIMED DISCLAIMER DISCLAIMS DISCLOSE DISCLOSED DISCLOSES DISCLOSING DISCLOSURE DISCLOSURES DISCOMFORT DISCONCERT DISCONCERTING DISCONCERTINGLY DISCONNECT DISCONNECTED DISCONNECTING DISCONNECTION DISCONNECTS DISCONTENT DISCONTENTED DISCONTINUANCE DISCONTINUE DISCONTINUED DISCONTINUES DISCONTINUITIES DISCONTINUITY DISCONTINUOUS DISCORD DISCORDANT DISCOUNT DISCOUNTED DISCOUNTING DISCOUNTS DISCOURAGE DISCOURAGED DISCOURAGEMENT DISCOURAGES DISCOURAGING DISCOURSE DISCOURSES DISCOVER DISCOVERED DISCOVERER DISCOVERERS DISCOVERIES DISCOVERING DISCOVERS DISCOVERY DISCREDIT DISCREDITED DISCREET DISCREETLY DISCREPANCIES DISCREPANCY DISCRETE DISCRETELY DISCRETENESS DISCRETION DISCRETIONARY DISCRIMINANT DISCRIMINATE DISCRIMINATED DISCRIMINATES DISCRIMINATING DISCRIMINATION DISCRIMINATORY DISCS DISCUSS DISCUSSANT DISCUSSED DISCUSSES DISCUSSING DISCUSSION DISCUSSIONS DISDAIN DISDAINING DISDAINS DISEASE DISEASED DISEASES DISEMBOWEL DISENGAGE DISENGAGED DISENGAGES DISENGAGING DISENTANGLE DISENTANGLING DISFIGURE DISFIGURED DISFIGURES DISFIGURING DISGORGE DISGRACE DISGRACED DISGRACEFUL DISGRACEFULLY DISGRACES DISGRUNTLE DISGRUNTLED DISGUISE DISGUISED DISGUISES DISGUST DISGUSTED DISGUSTEDLY DISGUSTFUL DISGUSTING DISGUSTINGLY DISGUSTS DISH DISHEARTEN DISHEARTENING DISHED DISHES DISHEVEL DISHING DISHONEST DISHONESTLY DISHONESTY DISHONOR DISHONORABLE DISHONORED DISHONORING DISHONORS DISHWASHER DISHWASHERS DISHWASHING DISHWATER DISILLUSION DISILLUSIONED DISILLUSIONING DISILLUSIONMENT DISILLUSIONMENTS DISINCLINED DISINGENUOUS DISINTERESTED DISINTERESTEDNESS DISJOINT DISJOINTED DISJOINTLY DISJOINTNESS DISJUNCT DISJUNCTION DISJUNCTIONS DISJUNCTIVE DISJUNCTIVELY DISJUNCTS DISK DISKETTE DISKETTES DISKS DISLIKE DISLIKED DISLIKES DISLIKING DISLOCATE DISLOCATED DISLOCATES DISLOCATING DISLOCATION DISLOCATIONS DISLODGE DISLODGED DISMAL DISMALLY DISMAY DISMAYED DISMAYING DISMEMBER DISMEMBERED DISMEMBERMENT DISMEMBERS DISMISS DISMISSAL DISMISSALS DISMISSED DISMISSER DISMISSERS DISMISSES DISMISSING DISMOUNT DISMOUNTED DISMOUNTING DISMOUNTS DISNEY DISNEYLAND DISOBEDIENCE DISOBEDIENT DISOBEY DISOBEYED DISOBEYING DISOBEYS DISORDER DISORDERED DISORDERLY DISORDERS DISORGANIZED DISOWN DISOWNED DISOWNING DISOWNS DISPARAGE DISPARATE DISPARITIES DISPARITY DISPASSIONATE DISPATCH DISPATCHED DISPATCHER DISPATCHERS DISPATCHES DISPATCHING DISPEL DISPELL DISPELLED DISPELLING DISPELS DISPENSARY DISPENSATION DISPENSE DISPENSED DISPENSER DISPENSERS DISPENSES DISPENSING DISPERSAL DISPERSE DISPERSED DISPERSES DISPERSING DISPERSION DISPERSIONS DISPLACE DISPLACED DISPLACEMENT DISPLACEMENTS DISPLACES DISPLACING DISPLAY DISPLAYABLE DISPLAYED DISPLAYER DISPLAYING DISPLAYS DISPLEASE DISPLEASED DISPLEASES DISPLEASING DISPLEASURE DISPOSABLE DISPOSAL DISPOSALS DISPOSE DISPOSED DISPOSER DISPOSES DISPOSING DISPOSITION DISPOSITIONS DISPOSSESSED DISPROPORTIONATE DISPROVE DISPROVED DISPROVES DISPROVING DISPUTE DISPUTED DISPUTER DISPUTERS DISPUTES DISPUTING DISQUALIFICATION DISQUALIFIED DISQUALIFIES DISQUALIFY DISQUALIFYING DISQUIET DISQUIETING DISRAELI DISREGARD DISREGARDED DISREGARDING DISREGARDS DISRESPECTFUL DISRUPT DISRUPTED DISRUPTING DISRUPTION DISRUPTIONS DISRUPTIVE DISRUPTS DISSATISFACTION DISSATISFACTIONS DISSATISFACTORY DISSATISFIED DISSECT DISSECTS DISSEMBLE DISSEMINATE DISSEMINATED DISSEMINATES DISSEMINATING DISSEMINATION DISSENSION DISSENSIONS DISSENT DISSENTED DISSENTER DISSENTERS DISSENTING DISSENTS DISSERTATION DISSERTATIONS DISSERVICE DISSIDENT DISSIDENTS DISSIMILAR DISSIMILARITIES DISSIMILARITY DISSIPATE DISSIPATED DISSIPATES DISSIPATING DISSIPATION DISSOCIATE DISSOCIATED DISSOCIATES DISSOCIATING DISSOCIATION DISSOLUTION DISSOLUTIONS DISSOLVE DISSOLVED DISSOLVES DISSOLVING DISSONANT DISSUADE DISTAFF DISTAL DISTALLY DISTANCE DISTANCES DISTANT DISTANTLY DISTASTE DISTASTEFUL DISTASTEFULLY DISTASTES DISTEMPER DISTEMPERED DISTEMPERS DISTILL DISTILLATION DISTILLED DISTILLER DISTILLERS DISTILLERY DISTILLING DISTILLS DISTINCT DISTINCTION DISTINCTIONS DISTINCTIVE DISTINCTIVELY DISTINCTIVENESS DISTINCTLY DISTINCTNESS DISTINGUISH DISTINGUISHABLE DISTINGUISHED DISTINGUISHES DISTINGUISHING DISTORT DISTORTED DISTORTING DISTORTION DISTORTIONS DISTORTS DISTRACT DISTRACTED DISTRACTING DISTRACTION DISTRACTIONS DISTRACTS DISTRAUGHT DISTRESS DISTRESSED DISTRESSES DISTRESSING DISTRIBUTE DISTRIBUTED DISTRIBUTES DISTRIBUTING DISTRIBUTION DISTRIBUTIONAL DISTRIBUTIONS DISTRIBUTIVE DISTRIBUTIVITY DISTRIBUTOR DISTRIBUTORS DISTRICT DISTRICTS DISTRUST DISTRUSTED DISTURB DISTURBANCE DISTURBANCES DISTURBED DISTURBER DISTURBING DISTURBINGLY DISTURBS DISUSE DITCH DITCHES DITHER DITTO DITTY DITZEL DIURNAL DIVAN DIVANS DIVE DIVED DIVER DIVERGE DIVERGED DIVERGENCE DIVERGENCES DIVERGENT DIVERGES DIVERGING DIVERS DIVERSE DIVERSELY DIVERSIFICATION DIVERSIFIED DIVERSIFIES DIVERSIFY DIVERSIFYING DIVERSION DIVERSIONARY DIVERSIONS DIVERSITIES DIVERSITY DIVERT DIVERTED DIVERTING DIVERTS DIVES DIVEST DIVESTED DIVESTING DIVESTITURE DIVESTS DIVIDE DIVIDED DIVIDEND DIVIDENDS DIVIDER DIVIDERS DIVIDES DIVIDING DIVINE DIVINELY DIVINER DIVING DIVINING DIVINITIES DIVINITY DIVISIBILITY DIVISIBLE DIVISION DIVISIONAL DIVISIONS DIVISIVE DIVISOR DIVISORS DIVORCE DIVORCED DIVORCEE DIVULGE DIVULGED DIVULGES DIVULGING DIXIE DIXIECRATS DIXIELAND DIXON DIZZINESS DIZZY DJAKARTA DMITRI DNIEPER DOBBIN DOBBS DOBERMAN DOC DOCILE DOCK DOCKED DOCKET DOCKS DOCKSIDE DOCKYARD DOCTOR DOCTORAL DOCTORATE DOCTORATES DOCTORED DOCTORS DOCTRINAIRE DOCTRINAL DOCTRINE DOCTRINES DOCUMENT DOCUMENTARIES DOCUMENTARY DOCUMENTATION DOCUMENTATIONS DOCUMENTED DOCUMENTER DOCUMENTERS DOCUMENTING DOCUMENTS DODD DODECAHEDRA DODECAHEDRAL DODECAHEDRON DODGE DODGED DODGER DODGERS DODGING DODINGTON DODSON DOE DOER DOERS DOES DOG DOGE DOGGED DOGGEDLY DOGGEDNESS DOGGING DOGHOUSE DOGMA DOGMAS DOGMATIC DOGMATISM DOGS DOGTOWN DOHERTY DOING DOINGS DOLAN DOLDRUM DOLE DOLED DOLEFUL DOLEFULLY DOLES DOLL DOLLAR DOLLARS DOLLIES DOLLS DOLLY DOLORES DOLPHIN DOLPHINS DOMAIN DOMAINS DOME DOMED DOMENICO DOMES DOMESDAY DOMESTIC DOMESTICALLY DOMESTICATE DOMESTICATED DOMESTICATES DOMESTICATING DOMESTICATION DOMICILE DOMINANCE DOMINANT DOMINANTLY DOMINATE DOMINATED DOMINATES DOMINATING DOMINATION DOMINEER DOMINEERING DOMINGO DOMINIC DOMINICAN DOMINICANS DOMINICK DOMINION DOMINIQUE DOMINO DON DONAHUE DONALD DONALDSON DONATE DONATED DONATES DONATING DONATION DONE DONECK DONKEY DONKEYS DONNA DONNELLY DONNER DONNYBROOK DONOR DONOVAN DONS DOODLE DOOLEY DOOLITTLE DOOM DOOMED DOOMING DOOMS DOOMSDAY DOOR DOORBELL DOORKEEPER DOORMAN DOORMEN DOORS DOORSTEP DOORSTEPS DOORWAY DOORWAYS DOPE DOPED DOPER DOPERS DOPES DOPING DOPPLER DORA DORADO DORCAS DORCHESTER DOREEN DORIA DORIC DORICIZE DORICIZES DORIS DORMANT DORMITORIES DORMITORY DOROTHEA DOROTHY DORSET DORTMUND DOSAGE DOSE DOSED DOSES DOSSIER DOSSIERS DOSTOEVSKY DOT DOTE DOTED DOTES DOTING DOTINGLY DOTS DOTTED DOTTING DOUBLE DOUBLED DOUBLEDAY DOUBLEHEADER DOUBLER DOUBLERS DOUBLES DOUBLET DOUBLETON DOUBLETS DOUBLING DOUBLOON DOUBLY DOUBT DOUBTABLE DOUBTED DOUBTER DOUBTERS DOUBTFUL DOUBTFULLY DOUBTING DOUBTLESS DOUBTLESSLY DOUBTS DOUG DOUGH DOUGHERTY DOUGHNUT DOUGHNUTS DOUGLAS DOUGLASS DOVE DOVER DOVES DOVETAIL DOW DOWAGER DOWEL DOWLING DOWN DOWNCAST DOWNED DOWNERS DOWNEY DOWNFALL DOWNFALLEN DOWNGRADE DOWNHILL DOWNING DOWNLINK DOWNLINKS DOWNLOAD DOWNLOADED DOWNLOADING DOWNLOADS DOWNPLAY DOWNPLAYED DOWNPLAYING DOWNPLAYS DOWNPOUR DOWNRIGHT DOWNS DOWNSIDE DOWNSTAIRS DOWNSTREAM DOWNTOWN DOWNTOWNS DOWNTRODDEN DOWNTURN DOWNWARD DOWNWARDS DOWNY DOWRY DOYLE DOZE DOZED DOZEN DOZENS DOZENTH DOZES DOZING DRAB DRACO DRACONIAN DRAFT DRAFTED DRAFTEE DRAFTER DRAFTERS DRAFTING DRAFTS DRAFTSMAN DRAFTSMEN DRAFTY DRAG DRAGGED DRAGGING DRAGNET DRAGON DRAGONFLY DRAGONHEAD DRAGONS DRAGOON DRAGOONED DRAGOONS DRAGS DRAIN DRAINAGE DRAINED DRAINER DRAINING DRAINS DRAKE DRAM DRAMA DRAMAMINE DRAMAS DRAMATIC DRAMATICALLY DRAMATICS DRAMATIST DRAMATISTS DRANK DRAPE DRAPED DRAPER DRAPERIES DRAPERS DRAPERY DRAPES DRASTIC DRASTICALLY DRAUGHT DRAUGHTS DRAVIDIAN DRAW DRAWBACK DRAWBACKS DRAWBRIDGE DRAWBRIDGES DRAWER DRAWERS DRAWING DRAWINGS DRAWL DRAWLED DRAWLING DRAWLS DRAWN DRAWNLY DRAWNNESS DRAWS DREAD DREADED DREADFUL DREADFULLY DREADING DREADNOUGHT DREADS DREAM DREAMBOAT DREAMED DREAMER DREAMERS DREAMILY DREAMING DREAMLIKE DREAMS DREAMT DREAMY DREARINESS DREARY DREDGE DREGS DRENCH DRENCHED DRENCHES DRENCHING DRESS DRESSED DRESSER DRESSERS DRESSES DRESSING DRESSINGS DRESSMAKER DRESSMAKERS DREW DREXEL DREYFUSS DRIED DRIER DRIERS DRIES DRIEST DRIFT DRIFTED DRIFTER DRIFTERS DRIFTING DRIFTS DRILL DRILLED DRILLER DRILLING DRILLS DRILY DRINK DRINKABLE DRINKER DRINKERS DRINKING DRINKS DRIP DRIPPING DRIPPY DRIPS DRISCOLL DRIVE DRIVEN DRIVER DRIVERS DRIVES DRIVEWAY DRIVEWAYS DRIVING DRIZZLE DRIZZLY DROLL DROMEDARY DRONE DRONES DROOL DROOP DROOPED DROOPING DROOPS DROOPY DROP DROPLET DROPOUT DROPPED DROPPER DROPPERS DROPPING DROPPINGS DROPS DROSOPHILA DROUGHT DROUGHTS DROVE DROVER DROVERS DROVES DROWN DROWNED DROWNING DROWNINGS DROWNS DROWSINESS DROWSY DRUBBING DRUDGE DRUDGERY DRUG DRUGGIST DRUGGISTS DRUGS DRUGSTORE DRUM DRUMHEAD DRUMMED DRUMMER DRUMMERS DRUMMING DRUMMOND DRUMS DRUNK DRUNKARD DRUNKARDS DRUNKEN DRUNKENNESS DRUNKER DRUNKLY DRUNKS DRURY DRY DRYDEN DRYING DRYLY DUAL DUALISM DUALITIES DUALITY DUANE DUB DUBBED DUBHE DUBIOUS DUBIOUSLY DUBIOUSNESS DUBLIN DUBS DUBUQUE DUCHESS DUCHESSES DUCHY DUCK DUCKED DUCKING DUCKLING DUCKS DUCT DUCTS DUD DUDLEY DUE DUEL DUELING DUELS DUES DUET DUFFY DUG DUGAN DUKE DUKES DULL DULLED DULLER DULLES DULLEST DULLING DULLNESS DULLS DULLY DULUTH DULY DUMB DUMBBELL DUMBBELLS DUMBER DUMBEST DUMBLY DUMBNESS DUMMIES DUMMY DUMP DUMPED DUMPER DUMPING DUMPS DUMPTY DUNBAR DUNCAN DUNCE DUNCES DUNDEE DUNE DUNEDIN DUNES DUNG DUNGEON DUNGEONS DUNHAM DUNK DUNKIRK DUNLAP DUNLOP DUNN DUNNE DUPE DUPLEX DUPLICABLE DUPLICATE DUPLICATED DUPLICATES DUPLICATING DUPLICATION DUPLICATIONS DUPLICATOR DUPLICATORS DUPLICITY DUPONT DUPONT DUPONTS DUPONTS DUQUESNE DURABILITIES DURABILITY DURABLE DURABLY DURANGO DURATION DURATIONS DURER DURERS DURESS DURHAM DURING DURKEE DURKIN DURRELL DURWARD DUSENBERG DUSENBURY DUSK DUSKINESS DUSKY DUSSELDORF DUST DUSTBIN DUSTED DUSTER DUSTERS DUSTIER DUSTIEST DUSTIN DUSTING DUSTS DUSTY DUTCH DUTCHESS DUTCHMAN DUTCHMEN DUTIES DUTIFUL DUTIFULLY DUTIFULNESS DUTTON DUTY DVORAK DWARF DWARFED DWARFS DWARVES DWELL DWELLED DWELLER DWELLERS DWELLING DWELLINGS DWELLS DWELT DWIGHT DWINDLE DWINDLED DWINDLING DWYER DYAD DYADIC DYE DYED DYEING DYER DYERS DYES DYING DYKE DYLAN DYNAMIC DYNAMICALLY DYNAMICS DYNAMISM DYNAMITE DYNAMITED DYNAMITES DYNAMITING DYNAMO DYNASTIC DYNASTIES DYNASTY DYNE DYSENTERY DYSPEPTIC DYSTROPHY EACH EAGAN EAGER EAGERLY EAGERNESS EAGLE EAGLES EAR EARDRUM EARED EARL EARLIER EARLIEST EARLINESS EARLS EARLY EARMARK EARMARKED EARMARKING EARMARKINGS EARMARKS EARN EARNED EARNER EARNERS EARNEST EARNESTLY EARNESTNESS EARNING EARNINGS EARNS EARP EARPHONE EARRING EARRINGS EARS EARSPLITTING EARTH EARTHEN EARTHENWARE EARTHLINESS EARTHLING EARTHLY EARTHMAN EARTHMEN EARTHMOVER EARTHQUAKE EARTHQUAKES EARTHS EARTHWORM EARTHWORMS EARTHY EASE EASED EASEL EASEMENT EASEMENTS EASES EASIER EASIEST EASILY EASINESS EASING EAST EASTBOUND EASTER EASTERN EASTERNER EASTERNERS EASTERNMOST EASTHAMPTON EASTLAND EASTMAN EASTWARD EASTWARDS EASTWICK EASTWOOD EASY EASYGOING EAT EATEN EATER EATERS EATING EATINGS EATON EATS EAVES EAVESDROP EAVESDROPPED EAVESDROPPER EAVESDROPPERS EAVESDROPPING EAVESDROPS EBB EBBING EBBS EBEN EBONY ECCENTRIC ECCENTRICITIES ECCENTRICITY ECCENTRICS ECCLES ECCLESIASTICAL ECHELON ECHO ECHOED ECHOES ECHOING ECLECTIC ECLIPSE ECLIPSED ECLIPSES ECLIPSING ECLIPTIC ECOLE ECOLOGY ECONOMETRIC ECONOMETRICA ECONOMIC ECONOMICAL ECONOMICALLY ECONOMICS ECONOMIES ECONOMIST ECONOMISTS ECONOMIZE ECONOMIZED ECONOMIZER ECONOMIZERS ECONOMIZES ECONOMIZING ECONOMY ECOSYSTEM ECSTASY ECSTATIC ECUADOR ECUADORIAN EDDIE EDDIES EDDY EDEN EDENIZATION EDENIZATIONS EDENIZE EDENIZES EDGAR EDGE EDGED EDGERTON EDGES EDGEWATER EDGEWOOD EDGING EDIBLE EDICT EDICTS EDIFICE EDIFICES EDINBURGH EDISON EDIT EDITED EDITH EDITING EDITION EDITIONS EDITOR EDITORIAL EDITORIALLY EDITORIALS EDITORS EDITS EDMONDS EDMONDSON EDMONTON EDMUND EDNA EDSGER EDUARD EDUARDO EDUCABLE EDUCATE EDUCATED EDUCATES EDUCATING EDUCATION EDUCATIONAL EDUCATIONALLY EDUCATIONS EDUCATOR EDUCATORS EDWARD EDWARDIAN EDWARDINE EDWARDS EDWIN EDWINA EEL EELGRASS EELS EERIE EERILY EFFECT EFFECTED EFFECTING EFFECTIVE EFFECTIVELY EFFECTIVENESS EFFECTOR EFFECTORS EFFECTS EFFECTUALLY EFFECTUATE EFFEMINATE EFFICACY EFFICIENCIES EFFICIENCY EFFICIENT EFFICIENTLY EFFIE EFFIGY EFFORT EFFORTLESS EFFORTLESSLY EFFORTLESSNESS EFFORTS EGALITARIAN EGAN EGG EGGED EGGHEAD EGGING EGGPLANT EGGS EGGSHELL EGO EGOCENTRIC EGOS EGOTISM EGOTIST EGYPT EGYPTIAN EGYPTIANIZATION EGYPTIANIZATIONS EGYPTIANIZE EGYPTIANIZES EGYPTIANS EGYPTIZE EGYPTIZES EGYPTOLOGY EHRLICH EICHMANN EIFFEL EIGENFUNCTION EIGENSTATE EIGENVALUE EIGENVALUES EIGENVECTOR EIGHT EIGHTEEN EIGHTEENS EIGHTEENTH EIGHTFOLD EIGHTH EIGHTHES EIGHTIES EIGHTIETH EIGHTS EIGHTY EILEEN EINSTEIN EINSTEINIAN EIRE EISENHOWER EISNER EITHER EJACULATE EJACULATED EJACULATES EJACULATING EJACULATION EJACULATIONS EJECT EJECTED EJECTING EJECTS EKBERG EKE EKED EKES EKSTROM EKTACHROME ELABORATE ELABORATED ELABORATELY ELABORATENESS ELABORATES ELABORATING ELABORATION ELABORATIONS ELABORATORS ELAINE ELAPSE ELAPSED ELAPSES ELAPSING ELASTIC ELASTICALLY ELASTICITY ELBA ELBOW ELBOWING ELBOWS ELDER ELDERLY ELDERS ELDEST ELDON ELEANOR ELEAZAR ELECT ELECTED ELECTING ELECTION ELECTIONS ELECTIVE ELECTIVES ELECTOR ELECTORAL ELECTORATE ELECTORS ELECTRA ELECTRIC ELECTRICAL ELECTRICALLY ELECTRICALNESS ELECTRICIAN ELECTRICITY ELECTRIFICATION ELECTRIFY ELECTRIFYING ELECTRO ELECTROCARDIOGRAM ELECTROCARDIOGRAPH ELECTROCUTE ELECTROCUTED ELECTROCUTES ELECTROCUTING ELECTROCUTION ELECTROCUTIONS ELECTRODE ELECTRODES ELECTROENCEPHALOGRAM ELECTROENCEPHALOGRAPH ELECTROENCEPHALOGRAPHY ELECTROLYSIS ELECTROLYTE ELECTROLYTES ELECTROLYTIC ELECTROMAGNETIC ELECTROMECHANICAL ELECTRON ELECTRONIC ELECTRONICALLY ELECTRONICS ELECTRONS ELECTROPHORESIS ELECTROPHORUS ELECTS ELEGANCE ELEGANT ELEGANTLY ELEGY ELEMENT ELEMENTAL ELEMENTALS ELEMENTARY ELEMENTS ELENA ELEPHANT ELEPHANTS ELEVATE ELEVATED ELEVATES ELEVATION ELEVATOR ELEVATORS ELEVEN ELEVENS ELEVENTH ELF ELGIN ELI ELICIT ELICITED ELICITING ELICITS ELIDE ELIGIBILITY ELIGIBLE ELIJAH ELIMINATE ELIMINATED ELIMINATES ELIMINATING ELIMINATION ELIMINATIONS ELIMINATOR ELIMINATORS ELINOR ELIOT ELISABETH ELISHA ELISION ELITE ELITIST ELIZABETH ELIZABETHAN ELIZABETHANIZE ELIZABETHANIZES ELIZABETHANS ELK ELKHART ELKS ELLA ELLEN ELLIE ELLIOT ELLIOTT ELLIPSE ELLIPSES ELLIPSIS ELLIPSOID ELLIPSOIDAL ELLIPSOIDS ELLIPTIC ELLIPTICAL ELLIPTICALLY ELLIS ELLISON ELLSWORTH ELLWOOD ELM ELMER ELMHURST ELMIRA ELMS ELMSFORD ELOISE ELOPE ELOQUENCE ELOQUENT ELOQUENTLY ELROY ELSE ELSEVIER ELSEWHERE ELSIE ELSINORE ELTON ELUCIDATE ELUCIDATED ELUCIDATES ELUCIDATING ELUCIDATION ELUDE ELUDED ELUDES ELUDING ELUSIVE ELUSIVELY ELUSIVENESS ELVES ELVIS ELY ELYSEE ELYSEES ELYSIUM EMACIATE EMACIATED EMACS EMANATE EMANATING EMANCIPATE EMANCIPATION EMANUEL EMASCULATE EMBALM EMBARGO EMBARGOES EMBARK EMBARKED EMBARKS EMBARRASS EMBARRASSED EMBARRASSES EMBARRASSING EMBARRASSMENT EMBASSIES EMBASSY EMBED EMBEDDED EMBEDDING EMBEDS EMBELLISH EMBELLISHED EMBELLISHES EMBELLISHING EMBELLISHMENT EMBELLISHMENTS EMBER EMBEZZLE EMBLEM EMBODIED EMBODIES EMBODIMENT EMBODIMENTS EMBODY EMBODYING EMBOLDEN EMBRACE EMBRACED EMBRACES EMBRACING EMBROIDER EMBROIDERED EMBROIDERIES EMBROIDERS EMBROIDERY EMBROIL EMBRYO EMBRYOLOGY EMBRYOS EMERALD EMERALDS EMERGE EMERGED EMERGENCE EMERGENCIES EMERGENCY EMERGENT EMERGES EMERGING EMERITUS EMERSON EMERY EMIGRANT EMIGRANTS EMIGRATE EMIGRATED EMIGRATES EMIGRATING EMIGRATION EMIL EMILE EMILIO EMILY EMINENCE EMINENT EMINENTLY EMISSARY EMISSION EMIT EMITS EMITTED EMITTER EMITTING EMMA EMMANUEL EMMETT EMORY EMOTION EMOTIONAL EMOTIONALLY EMOTIONS EMPATHY EMPEROR EMPERORS EMPHASES EMPHASIS EMPHASIZE EMPHASIZED EMPHASIZES EMPHASIZING EMPHATIC EMPHATICALLY EMPIRE EMPIRES EMPIRICAL EMPIRICALLY EMPIRICIST EMPIRICISTS EMPLOY EMPLOYABLE EMPLOYED EMPLOYEE EMPLOYEES EMPLOYER EMPLOYERS EMPLOYING EMPLOYMENT EMPLOYMENTS EMPLOYS EMPORIUM EMPOWER EMPOWERED EMPOWERING EMPOWERS EMPRESS EMPTIED EMPTIER EMPTIES EMPTIEST EMPTILY EMPTINESS EMPTY EMPTYING EMULATE EMULATED EMULATES EMULATING EMULATION EMULATIONS EMULATOR EMULATORS ENABLE ENABLED ENABLER ENABLERS ENABLES ENABLING ENACT ENACTED ENACTING ENACTMENT ENACTS ENAMEL ENAMELED ENAMELING ENAMELS ENCAMP ENCAMPED ENCAMPING ENCAMPS ENCAPSULATE ENCAPSULATED ENCAPSULATES ENCAPSULATING ENCAPSULATION ENCASED ENCHANT ENCHANTED ENCHANTER ENCHANTING ENCHANTMENT ENCHANTRESS ENCHANTS ENCIPHER ENCIPHERED ENCIPHERING ENCIPHERS ENCIRCLE ENCIRCLED ENCIRCLES ENCLOSE ENCLOSED ENCLOSES ENCLOSING ENCLOSURE ENCLOSURES ENCODE ENCODED ENCODER ENCODERS ENCODES ENCODING ENCODINGS ENCOMPASS ENCOMPASSED ENCOMPASSES ENCOMPASSING ENCORE ENCOUNTER ENCOUNTERED ENCOUNTERING ENCOUNTERS ENCOURAGE ENCOURAGED ENCOURAGEMENT ENCOURAGEMENTS ENCOURAGES ENCOURAGING ENCOURAGINGLY ENCROACH ENCRUST ENCRYPT ENCRYPTED ENCRYPTING ENCRYPTION ENCRYPTIONS ENCRYPTS ENCUMBER ENCUMBERED ENCUMBERING ENCUMBERS ENCYCLOPEDIA ENCYCLOPEDIAS ENCYCLOPEDIC END ENDANGER ENDANGERED ENDANGERING ENDANGERS ENDEAR ENDEARED ENDEARING ENDEARS ENDEAVOR ENDEAVORED ENDEAVORING ENDEAVORS ENDED ENDEMIC ENDER ENDERS ENDGAME ENDICOTT ENDING ENDINGS ENDLESS ENDLESSLY ENDLESSNESS ENDORSE ENDORSED ENDORSEMENT ENDORSES ENDORSING ENDOW ENDOWED ENDOWING ENDOWMENT ENDOWMENTS ENDOWS ENDPOINT ENDS ENDURABLE ENDURABLY ENDURANCE ENDURE ENDURED ENDURES ENDURING ENDURINGLY ENEMA ENEMAS ENEMIES ENEMY ENERGETIC ENERGIES ENERGIZE ENERGY ENERVATE ENFEEBLE ENFIELD ENFORCE ENFORCEABLE ENFORCED ENFORCEMENT ENFORCER ENFORCERS ENFORCES ENFORCING ENFRANCHISE ENG ENGAGE ENGAGED ENGAGEMENT ENGAGEMENTS ENGAGES ENGAGING ENGAGINGLY ENGEL ENGELS ENGENDER ENGENDERED ENGENDERING ENGENDERS ENGINE ENGINEER ENGINEERED ENGINEERING ENGINEERS ENGINES ENGLAND ENGLANDER ENGLANDERS ENGLE ENGLEWOOD ENGLISH ENGLISHIZE ENGLISHIZES ENGLISHMAN ENGLISHMEN ENGRAVE ENGRAVED ENGRAVER ENGRAVES ENGRAVING ENGRAVINGS ENGROSS ENGROSSED ENGROSSING ENGULF ENHANCE ENHANCED ENHANCEMENT ENHANCEMENTS ENHANCES ENHANCING ENID ENIGMA ENIGMATIC ENJOIN ENJOINED ENJOINING ENJOINS ENJOY ENJOYABLE ENJOYABLY ENJOYED ENJOYING ENJOYMENT ENJOYS ENLARGE ENLARGED ENLARGEMENT ENLARGEMENTS ENLARGER ENLARGERS ENLARGES ENLARGING ENLIGHTEN ENLIGHTENED ENLIGHTENING ENLIGHTENMENT ENLIST ENLISTED ENLISTMENT ENLISTS ENLIVEN ENLIVENED ENLIVENING ENLIVENS ENMITIES ENMITY ENNOBLE ENNOBLED ENNOBLES ENNOBLING ENNUI ENOCH ENORMITIES ENORMITY ENORMOUS ENORMOUSLY ENOS ENOUGH ENQUEUE ENQUEUED ENQUEUES ENQUIRE ENQUIRED ENQUIRER ENQUIRES ENQUIRY ENRAGE ENRAGED ENRAGES ENRAGING ENRAPTURE ENRICH ENRICHED ENRICHES ENRICHING ENRICO ENROLL ENROLLED ENROLLING ENROLLMENT ENROLLMENTS ENROLLS ENSEMBLE ENSEMBLES ENSIGN ENSIGNS ENSLAVE ENSLAVED ENSLAVES ENSLAVING ENSNARE ENSNARED ENSNARES ENSNARING ENSOLITE ENSUE ENSUED ENSUES ENSUING ENSURE ENSURED ENSURER ENSURERS ENSURES ENSURING ENTAIL ENTAILED ENTAILING ENTAILS ENTANGLE ENTER ENTERED ENTERING ENTERPRISE ENTERPRISES ENTERPRISING ENTERS ENTERTAIN ENTERTAINED ENTERTAINER ENTERTAINERS ENTERTAINING ENTERTAININGLY ENTERTAINMENT ENTERTAINMENTS ENTERTAINS ENTHUSIASM ENTHUSIASMS ENTHUSIAST ENTHUSIASTIC ENTHUSIASTICALLY ENTHUSIASTS ENTICE ENTICED ENTICER ENTICERS ENTICES ENTICING ENTIRE ENTIRELY ENTIRETIES ENTIRETY ENTITIES ENTITLE ENTITLED ENTITLES ENTITLING ENTITY ENTOMB ENTRANCE ENTRANCED ENTRANCES ENTRAP ENTREAT ENTREATED ENTREATY ENTREE ENTRENCH ENTRENCHED ENTRENCHES ENTRENCHING ENTREPRENEUR ENTREPRENEURIAL ENTREPRENEURS ENTRIES ENTROPY ENTRUST ENTRUSTED ENTRUSTING ENTRUSTS ENTRY ENUMERABLE ENUMERATE ENUMERATED ENUMERATES ENUMERATING ENUMERATION ENUMERATIVE ENUMERATOR ENUMERATORS ENUNCIATION ENVELOP ENVELOPE ENVELOPED ENVELOPER ENVELOPES ENVELOPING ENVELOPS ENVIED ENVIES ENVIOUS ENVIOUSLY ENVIOUSNESS ENVIRON ENVIRONING ENVIRONMENT ENVIRONMENTAL ENVIRONMENTS ENVIRONS ENVISAGE ENVISAGED ENVISAGES ENVISION ENVISIONED ENVISIONING ENVISIONS ENVOY ENVOYS ENVY ENZYME EOCENE EPAULET EPAULETS EPHEMERAL EPHESIAN EPHESIANS EPHESUS EPHRAIM EPIC EPICENTER EPICS EPICUREAN EPICURIZE EPICURIZES EPICURUS EPIDEMIC EPIDEMICS EPIDERMIS EPIGRAM EPILEPTIC EPILOGUE EPIPHANY EPISCOPAL EPISCOPALIAN EPISCOPALIANIZE EPISCOPALIANIZES EPISODE EPISODES EPISTEMOLOGICAL EPISTEMOLOGY EPISTLE EPISTLES EPITAPH EPITAPHS EPITAXIAL EPITAXIALLY EPITHET EPITHETS EPITOMIZE EPITOMIZED EPITOMIZES EPITOMIZING EPOCH EPOCHS EPSILON EPSOM EPSTEIN EQUAL EQUALED EQUALING EQUALITIES EQUALITY EQUALIZATION EQUALIZE EQUALIZED EQUALIZER EQUALIZERS EQUALIZES EQUALIZING EQUALLY EQUALS EQUATE EQUATED EQUATES EQUATING EQUATION EQUATIONS EQUATOR EQUATORIAL EQUATORS EQUESTRIAN EQUIDISTANT EQUILATERAL EQUILIBRATE EQUILIBRIA EQUILIBRIUM EQUILIBRIUMS EQUINOX EQUIP EQUIPMENT EQUIPOISE EQUIPPED EQUIPPING EQUIPS EQUITABLE EQUITABLY EQUITY EQUIVALENCE EQUIVALENCES EQUIVALENT EQUIVALENTLY EQUIVALENTS EQUIVOCAL EQUIVOCALLY ERA ERADICATE ERADICATED ERADICATES ERADICATING ERADICATION ERAS ERASABLE ERASE ERASED ERASER ERASERS ERASES ERASING ERASMUS ERASTUS ERASURE ERATO ERATOSTHENES ERE ERECT ERECTED ERECTING ERECTION ERECTIONS ERECTOR ERECTORS ERECTS ERG ERGO ERGODIC ERIC ERICH ERICKSON ERICSSON ERIE ERIK ERIKSON ERIS ERLANG ERLENMEYER ERLENMEYERS ERMINE ERMINES ERNE ERNEST ERNESTINE ERNIE ERNST ERODE EROS EROSION EROTIC EROTICA ERR ERRAND ERRANT ERRATA ERRATIC ERRATUM ERRED ERRING ERRINGLY ERROL ERRONEOUS ERRONEOUSLY ERRONEOUSNESS ERROR ERRORS ERRS ERSATZ ERSKINE ERUDITE ERUPT ERUPTION ERVIN ERWIN ESCALATE ESCALATED ESCALATES ESCALATING ESCALATION ESCAPABLE ESCAPADE ESCAPADES ESCAPE ESCAPED ESCAPEE ESCAPEES ESCAPES ESCAPING ESCHERICHIA ESCHEW ESCHEWED ESCHEWING ESCHEWS ESCORT ESCORTED ESCORTING ESCORTS ESCROW ESKIMO ESKIMOIZED ESKIMOIZEDS ESKIMOS ESMARK ESOTERIC ESPAGNOL ESPECIAL ESPECIALLY ESPIONAGE ESPOSITO ESPOUSE ESPOUSED ESPOUSES ESPOUSING ESPRIT ESPY ESQUIRE ESQUIRES ESSAY ESSAYED ESSAYS ESSEN ESSENCE ESSENCES ESSENIZE ESSENIZES ESSENTIAL ESSENTIALLY ESSENTIALS ESSEX ESTABLISH ESTABLISHED ESTABLISHES ESTABLISHING ESTABLISHMENT ESTABLISHMENTS ESTATE ESTATES ESTEEM ESTEEMED ESTEEMING ESTEEMS ESTELLA ESTES ESTHER ESTHETICS ESTIMATE ESTIMATED ESTIMATES ESTIMATING ESTIMATION ESTIMATIONS ESTONIA ESTONIAN ETCH ETCHING ETERNAL ETERNALLY ETERNITIES ETERNITY ETHAN ETHEL ETHER ETHEREAL ETHEREALLY ETHERNET ETHERNETS ETHERS ETHIC ETHICAL ETHICALLY ETHICS ETHIOPIA ETHIOPIANS ETHNIC ETIQUETTE ETRURIA ETRUSCAN ETYMOLOGY EUCALYPTUS EUCHARIST EUCLID EUCLIDEAN EUGENE EUGENIA EULER EULERIAN EUMENIDES EUNICE EUNUCH EUNUCHS EUPHEMISM EUPHEMISMS EUPHORIA EUPHORIC EUPHRATES EURASIA EURASIAN EUREKA EURIPIDES EUROPA EUROPE EUROPEAN EUROPEANIZATION EUROPEANIZATIONS EUROPEANIZE EUROPEANIZED EUROPEANIZES EUROPEANS EURYDICE EUTERPE EUTHANASIA EVA EVACUATE EVACUATED EVACUATION EVADE EVADED EVADES EVADING EVALUATE EVALUATED EVALUATES EVALUATING EVALUATION EVALUATIONS EVALUATIVE EVALUATOR EVALUATORS EVANGELINE EVANS EVANSTON EVANSVILLE EVAPORATE EVAPORATED EVAPORATING EVAPORATION EVAPORATIVE EVASION EVASIVE EVE EVELYN EVEN EVENED EVENHANDED EVENHANDEDLY EVENHANDEDNESS EVENING EVENINGS EVENLY EVENNESS EVENS EVENSEN EVENT EVENTFUL EVENTFULLY EVENTS EVENTUAL EVENTUALITIES EVENTUALITY EVENTUALLY EVER EVEREADY EVEREST EVERETT EVERGLADE EVERGLADES EVERGREEN EVERHART EVERLASTING EVERLASTINGLY EVERMORE EVERY EVERYBODY EVERYDAY EVERYONE EVERYTHING EVERYWHERE EVICT EVICTED EVICTING EVICTION EVICTIONS EVICTS EVIDENCE EVIDENCED EVIDENCES EVIDENCING EVIDENT EVIDENTLY EVIL EVILLER EVILLY EVILS EVINCE EVINCED EVINCES EVOKE EVOKED EVOKES EVOKING EVOLUTE EVOLUTES EVOLUTION EVOLUTIONARY EVOLUTIONS EVOLVE EVOLVED EVOLVES EVOLVING EWE EWEN EWES EWING EXACERBATE EXACERBATED EXACERBATES EXACERBATING EXACERBATION EXACERBATIONS EXACT EXACTED EXACTING EXACTINGLY EXACTION EXACTIONS EXACTITUDE EXACTLY EXACTNESS EXACTS EXAGGERATE EXAGGERATED EXAGGERATES EXAGGERATING EXAGGERATION EXAGGERATIONS EXALT EXALTATION EXALTED EXALTING EXALTS EXAM EXAMINATION EXAMINATIONS EXAMINE EXAMINED EXAMINER EXAMINERS EXAMINES EXAMINING EXAMPLE EXAMPLES EXAMS EXASPERATE EXASPERATED EXASPERATES EXASPERATING EXASPERATION EXCAVATE EXCAVATED EXCAVATES EXCAVATING EXCAVATION EXCAVATIONS EXCEED EXCEEDED EXCEEDING EXCEEDINGLY EXCEEDS EXCEL EXCELLED EXCELLENCE EXCELLENCES EXCELLENCY EXCELLENT EXCELLENTLY EXCELLING EXCELS EXCEPT EXCEPTED EXCEPTING EXCEPTION EXCEPTIONABLE EXCEPTIONAL EXCEPTIONALLY EXCEPTIONS EXCEPTS EXCERPT EXCERPTED EXCERPTS EXCESS EXCESSES EXCESSIVE EXCESSIVELY EXCHANGE EXCHANGEABLE EXCHANGED EXCHANGES EXCHANGING EXCHEQUER EXCHEQUERS EXCISE EXCISED EXCISES EXCISING EXCISION EXCITABLE EXCITATION EXCITATIONS EXCITE EXCITED EXCITEDLY EXCITEMENT EXCITES EXCITING EXCITINGLY EXCITON EXCLAIM EXCLAIMED EXCLAIMER EXCLAIMERS EXCLAIMING EXCLAIMS EXCLAMATION EXCLAMATIONS EXCLAMATORY EXCLUDE EXCLUDED EXCLUDES EXCLUDING EXCLUSION EXCLUSIONARY EXCLUSIONS EXCLUSIVE EXCLUSIVELY EXCLUSIVENESS EXCLUSIVITY EXCOMMUNICATE EXCOMMUNICATED EXCOMMUNICATES EXCOMMUNICATING EXCOMMUNICATION EXCRETE EXCRETED EXCRETES EXCRETING EXCRETION EXCRETIONS EXCRETORY EXCRUCIATE EXCURSION EXCURSIONS EXCUSABLE EXCUSABLY EXCUSE EXCUSED EXCUSES EXCUSING EXEC EXECUTABLE EXECUTE EXECUTED EXECUTES EXECUTING EXECUTION EXECUTIONAL EXECUTIONER EXECUTIONS EXECUTIVE EXECUTIVES EXECUTOR EXECUTORS EXEMPLAR EXEMPLARY EXEMPLIFICATION EXEMPLIFIED EXEMPLIFIER EXEMPLIFIERS EXEMPLIFIES EXEMPLIFY EXEMPLIFYING EXEMPT EXEMPTED EXEMPTING EXEMPTION EXEMPTS EXERCISE EXERCISED EXERCISER EXERCISERS EXERCISES EXERCISING EXERT EXERTED EXERTING EXERTION EXERTIONS EXERTS EXETER EXHALE EXHALED EXHALES EXHALING EXHAUST EXHAUSTED EXHAUSTEDLY EXHAUSTING EXHAUSTION EXHAUSTIVE EXHAUSTIVELY EXHAUSTS EXHIBIT EXHIBITED EXHIBITING EXHIBITION EXHIBITIONS EXHIBITOR EXHIBITORS EXHIBITS EXHILARATE EXHORT EXHORTATION EXHORTATIONS EXHUME EXIGENCY EXILE EXILED EXILES EXILING EXIST EXISTED EXISTENCE EXISTENT EXISTENTIAL EXISTENTIALISM EXISTENTIALIST EXISTENTIALISTS EXISTENTIALLY EXISTING EXISTS EXIT EXITED EXITING EXITS EXODUS EXORBITANT EXORBITANTLY EXORCISM EXORCIST EXOSKELETON EXOTIC EXPAND EXPANDABLE EXPANDED EXPANDER EXPANDERS EXPANDING EXPANDS EXPANSE EXPANSES EXPANSIBLE EXPANSION EXPANSIONISM EXPANSIONS EXPANSIVE EXPECT EXPECTANCY EXPECTANT EXPECTANTLY EXPECTATION EXPECTATIONS EXPECTED EXPECTEDLY EXPECTING EXPECTINGLY EXPECTS EXPEDIENCY EXPEDIENT EXPEDIENTLY EXPEDITE EXPEDITED EXPEDITES EXPEDITING EXPEDITION EXPEDITIONS EXPEDITIOUS EXPEDITIOUSLY EXPEL EXPELLED EXPELLING EXPELS EXPEND EXPENDABLE EXPENDED EXPENDING EXPENDITURE EXPENDITURES EXPENDS EXPENSE EXPENSES EXPENSIVE EXPENSIVELY EXPERIENCE EXPERIENCED EXPERIENCES EXPERIENCING EXPERIMENT EXPERIMENTAL EXPERIMENTALLY EXPERIMENTATION EXPERIMENTATIONS EXPERIMENTED EXPERIMENTER EXPERIMENTERS EXPERIMENTING EXPERIMENTS EXPERT EXPERTISE EXPERTLY EXPERTNESS EXPERTS EXPIRATION EXPIRATIONS EXPIRE EXPIRED EXPIRES EXPIRING EXPLAIN EXPLAINABLE EXPLAINED EXPLAINER EXPLAINERS EXPLAINING EXPLAINS EXPLANATION EXPLANATIONS EXPLANATORY EXPLETIVE EXPLICIT EXPLICITLY EXPLICITNESS EXPLODE EXPLODED EXPLODES EXPLODING EXPLOIT EXPLOITABLE EXPLOITATION EXPLOITATIONS EXPLOITED EXPLOITER EXPLOITERS EXPLOITING EXPLOITS EXPLORATION EXPLORATIONS EXPLORATORY EXPLORE EXPLORED EXPLORER EXPLORERS EXPLORES EXPLORING EXPLOSION EXPLOSIONS EXPLOSIVE EXPLOSIVELY EXPLOSIVES EXPONENT EXPONENTIAL EXPONENTIALLY EXPONENTIALS EXPONENTIATE EXPONENTIATED EXPONENTIATES EXPONENTIATING EXPONENTIATION EXPONENTIATIONS EXPONENTS EXPORT EXPORTATION EXPORTED EXPORTER EXPORTERS EXPORTING EXPORTS EXPOSE EXPOSED EXPOSER EXPOSERS EXPOSES EXPOSING EXPOSITION EXPOSITIONS EXPOSITORY EXPOSURE EXPOSURES EXPOUND EXPOUNDED EXPOUNDER EXPOUNDING EXPOUNDS EXPRESS EXPRESSED EXPRESSES EXPRESSIBILITY EXPRESSIBLE EXPRESSIBLY EXPRESSING EXPRESSION EXPRESSIONS EXPRESSIVE EXPRESSIVELY EXPRESSIVENESS EXPRESSLY EXPULSION EXPUNGE EXPUNGED EXPUNGES EXPUNGING EXPURGATE EXQUISITE EXQUISITELY EXQUISITENESS EXTANT EXTEMPORANEOUS EXTEND EXTENDABLE EXTENDED EXTENDING EXTENDS EXTENSIBILITY EXTENSIBLE EXTENSION EXTENSIONS EXTENSIVE EXTENSIVELY EXTENT EXTENTS EXTENUATE EXTENUATED EXTENUATING EXTENUATION EXTERIOR EXTERIORS EXTERMINATE EXTERMINATED EXTERMINATES EXTERMINATING EXTERMINATION EXTERNAL EXTERNALLY EXTINCT EXTINCTION EXTINGUISH EXTINGUISHED EXTINGUISHER EXTINGUISHES EXTINGUISHING EXTIRPATE EXTOL EXTORT EXTORTED EXTORTION EXTRA EXTRACT EXTRACTED EXTRACTING EXTRACTION EXTRACTIONS EXTRACTOR EXTRACTORS EXTRACTS EXTRACURRICULAR EXTRAMARITAL EXTRANEOUS EXTRANEOUSLY EXTRANEOUSNESS EXTRAORDINARILY EXTRAORDINARINESS EXTRAORDINARY EXTRAPOLATE EXTRAPOLATED EXTRAPOLATES EXTRAPOLATING EXTRAPOLATION EXTRAPOLATIONS EXTRAS EXTRATERRESTRIAL EXTRAVAGANCE EXTRAVAGANT EXTRAVAGANTLY EXTRAVAGANZA EXTREMAL EXTREME EXTREMELY EXTREMES EXTREMIST EXTREMISTS EXTREMITIES EXTREMITY EXTRICATE EXTRINSIC EXTROVERT EXUBERANCE EXULT EXULTATION EXXON EYE EYEBALL EYEBROW EYEBROWS EYED EYEFUL EYEGLASS EYEGLASSES EYEING EYELASH EYELID EYELIDS EYEPIECE EYEPIECES EYER EYERS EYES EYESIGHT EYEWITNESS EYEWITNESSES EYING EZEKIEL EZRA FABER FABIAN FABLE FABLED FABLES FABRIC FABRICATE FABRICATED FABRICATES FABRICATING FABRICATION FABRICS FABULOUS FABULOUSLY FACADE FACADED FACADES FACE FACED FACES FACET FACETED FACETS FACIAL FACILE FACILELY FACILITATE FACILITATED FACILITATES FACILITATING FACILITIES FACILITY FACING FACINGS FACSIMILE FACSIMILES FACT FACTION FACTIONS FACTIOUS FACTO FACTOR FACTORED FACTORIAL FACTORIES FACTORING FACTORIZATION FACTORIZATIONS FACTORS FACTORY FACTS FACTUAL FACTUALLY FACULTIES FACULTY FADE FADED FADEOUT FADER FADERS FADES FADING FAFNIR FAG FAGIN FAGS FAHEY FAHRENHEIT FAHRENHEITS FAIL FAILED FAILING FAILINGS FAILS FAILSOFT FAILURE FAILURES FAIN FAINT FAINTED FAINTER FAINTEST FAINTING FAINTLY FAINTNESS FAINTS FAIR FAIRBANKS FAIRCHILD FAIRER FAIREST FAIRFAX FAIRFIELD FAIRIES FAIRING FAIRLY FAIRMONT FAIRNESS FAIRPORT FAIRS FAIRVIEW FAIRY FAIRYLAND FAITH FAITHFUL FAITHFULLY FAITHFULNESS FAITHLESS FAITHLESSLY FAITHLESSNESS FAITHS FAKE FAKED FAKER FAKES FAKING FALCON FALCONER FALCONS FALK FALKLAND FALKLANDS FALL FALLACIES FALLACIOUS FALLACY FALLEN FALLIBILITY FALLIBLE FALLING FALLOPIAN FALLOUT FALLOW FALLS FALMOUTH FALSE FALSEHOOD FALSEHOODS FALSELY FALSENESS FALSIFICATION FALSIFIED FALSIFIES FALSIFY FALSIFYING FALSITY FALSTAFF FALTER FALTERED FALTERS FAME FAMED FAMES FAMILIAL FAMILIAR FAMILIARITIES FAMILIARITY FAMILIARIZATION FAMILIARIZE FAMILIARIZED FAMILIARIZES FAMILIARIZING FAMILIARLY FAMILIARNESS FAMILIES FAMILISM FAMILY FAMINE FAMINES FAMISH FAMOUS FAMOUSLY FAN FANATIC FANATICISM FANATICS FANCIED FANCIER FANCIERS FANCIES FANCIEST FANCIFUL FANCIFULLY FANCILY FANCINESS FANCY FANCYING FANFARE FANFOLD FANG FANGLED FANGS FANNED FANNIES FANNING FANNY FANOUT FANS FANTASIES FANTASIZE FANTASTIC FANTASY FAQ FAR FARAD FARADAY FARAWAY FARBER FARCE FARCES FARE FARED FARES FAREWELL FAREWELLS FARFETCHED FARGO FARINA FARING FARKAS FARLEY FARM FARMED FARMER FARMERS FARMHOUSE FARMHOUSES FARMING FARMINGTON FARMLAND FARMS FARMYARD FARMYARDS FARNSWORTH FARRELL FARSIGHTED FARTHER FARTHEST FARTHING FASCICLE FASCINATE FASCINATED FASCINATES FASCINATING FASCINATION FASCISM FASCIST FASHION FASHIONABLE FASHIONABLY FASHIONED FASHIONING FASHIONS FAST FASTED FASTEN FASTENED FASTENER FASTENERS FASTENING FASTENINGS FASTENS FASTER FASTEST FASTIDIOUS FASTING FASTNESS FASTS FAT FATAL FATALITIES FATALITY FATALLY FATALS FATE FATED FATEFUL FATES FATHER FATHERED FATHERLAND FATHERLY FATHERS FATHOM FATHOMED FATHOMING FATHOMS FATIGUE FATIGUED FATIGUES FATIGUING FATIMA FATNESS FATS FATTEN FATTENED FATTENER FATTENERS FATTENING FATTENS FATTER FATTEST FATTY FAUCET FAULKNER FAULKNERIAN FAULT FAULTED FAULTING FAULTLESS FAULTLESSLY FAULTS FAULTY FAUN FAUNA FAUNTLEROY FAUST FAUSTIAN FAUSTUS FAVOR FAVORABLE FAVORABLY FAVORED FAVORER FAVORING FAVORITE FAVORITES FAVORITISM FAVORS FAWKES FAWN FAWNED FAWNING FAWNS FAYETTE FAYETTEVILLE FAZE FEAR FEARED FEARFUL FEARFULLY FEARING FEARLESS FEARLESSLY FEARLESSNESS FEARS FEARSOME FEASIBILITY FEASIBLE FEAST FEASTED FEASTING FEASTS FEAT FEATHER FEATHERBED FEATHERBEDDING FEATHERED FEATHERER FEATHERERS FEATHERING FEATHERMAN FEATHERS FEATHERWEIGHT FEATHERY FEATS FEATURE FEATURED FEATURES FEATURING FEBRUARIES FEBRUARY FECUND FED FEDDERS FEDERAL FEDERALIST FEDERALLY FEDERALS FEDERATION FEDORA FEE FEEBLE FEEBLENESS FEEBLER FEEBLEST FEEBLY FEED FEEDBACK FEEDER FEEDERS FEEDING FEEDINGS FEEDS FEEL FEELER FEELERS FEELING FEELINGLY FEELINGS FEELS FEENEY FEES FEET FEIGN FEIGNED FEIGNING FELDER FELDMAN FELICE FELICIA FELICITIES FELICITY FELINE FELIX FELL FELLATIO FELLED FELLING FELLINI FELLOW FELLOWS FELLOWSHIP FELLOWSHIPS FELON FELONIOUS FELONY FELT FELTS FEMALE FEMALES FEMININE FEMININITY FEMINISM FEMINIST FEMUR FEMURS FEN FENCE FENCED FENCER FENCERS FENCES FENCING FEND FENTON FENWICK FERBER FERDINAND FERDINANDO FERGUSON FERMAT FERMENT FERMENTATION FERMENTATIONS FERMENTED FERMENTING FERMENTS FERMI FERN FERNANDO FERNS FEROCIOUS FEROCIOUSLY FEROCIOUSNESS FEROCITY FERREIRA FERRER FERRET FERRIED FERRIES FERRITE FERRY FERTILE FERTILELY FERTILITY FERTILIZATION FERTILIZE FERTILIZED FERTILIZER FERTILIZERS FERTILIZES FERTILIZING FERVENT FERVENTLY FERVOR FERVORS FESS FESTIVAL FESTIVALS FESTIVE FESTIVELY FESTIVITIES FESTIVITY FETAL FETCH FETCHED FETCHES FETCHING FETCHINGLY FETID FETISH FETTER FETTERED FETTERS FETTLE FETUS FEUD FEUDAL FEUDALISM FEUDS FEVER FEVERED FEVERISH FEVERISHLY FEVERS FEW FEWER FEWEST FEWNESS FIANCE FIANCEE FIASCO FIAT FIB FIBBING FIBER FIBERGLAS FIBERS FIBONACCI FIBROSITIES FIBROSITY FIBROUS FIBROUSLY FICKLE FICKLENESS FICTION FICTIONAL FICTIONALLY FICTIONS FICTITIOUS FICTITIOUSLY FIDDLE FIDDLED FIDDLER FIDDLES FIDDLESTICK FIDDLESTICKS FIDDLING FIDEL FIDELITY FIDGET FIDUCIAL FIEF FIEFDOM FIELD FIELDED FIELDER FIELDERS FIELDING FIELDS FIELDWORK FIEND FIENDISH FIERCE FIERCELY FIERCENESS FIERCER FIERCEST FIERY FIFE FIFTEEN FIFTEENS FIFTEENTH FIFTH FIFTIES FIFTIETH FIFTY FIG FIGARO FIGHT FIGHTER FIGHTERS FIGHTING FIGHTS FIGS FIGURATIVE FIGURATIVELY FIGURE FIGURED FIGURES FIGURING FIGURINGS FIJI FIJIAN FIJIANS FILAMENT FILAMENTS FILE FILED FILENAME FILENAMES FILER FILES FILIAL FILIBUSTER FILING FILINGS FILIPINO FILIPINOS FILIPPO FILL FILLABLE FILLED FILLER FILLERS FILLING FILLINGS FILLMORE FILLS FILLY FILM FILMED FILMING FILMS FILTER FILTERED FILTERING FILTERS FILTH FILTHIER FILTHIEST FILTHINESS FILTHY FIN FINAL FINALITY FINALIZATION FINALIZE FINALIZED FINALIZES FINALIZING FINALLY FINALS FINANCE FINANCED FINANCES FINANCIAL FINANCIALLY FINANCIER FINANCIERS FINANCING FIND FINDER FINDERS FINDING FINDINGS FINDS FINE FINED FINELY FINENESS FINER FINES FINESSE FINESSED FINESSING FINEST FINGER FINGERED FINGERING FINGERINGS FINGERNAIL FINGERPRINT FINGERPRINTS FINGERS FINGERTIP FINICKY FINING FINISH FINISHED FINISHER FINISHERS FINISHES FINISHING FINITE FINITELY FINITENESS FINK FINLAND FINLEY FINN FINNEGAN FINNISH FINNS FINNY FINS FIORELLO FIORI FIR FIRE FIREARM FIREARMS FIREBOAT FIREBREAK FIREBUG FIRECRACKER FIRED FIREFLIES FIREFLY FIREHOUSE FIRELIGHT FIREMAN FIREMEN FIREPLACE FIREPLACES FIREPOWER FIREPROOF FIRER FIRERS FIRES FIRESIDE FIRESTONE FIREWALL FIREWOOD FIREWORKS FIRING FIRINGS FIRM FIRMAMENT FIRMED FIRMER FIRMEST FIRMING FIRMLY FIRMNESS FIRMS FIRMWARE FIRST FIRSTHAND FIRSTLY FIRSTS FISCAL FISCALLY FISCHBEIN FISCHER FISH FISHED FISHER FISHERMAN FISHERMEN FISHERS FISHERY FISHES FISHING FISHKILL FISHMONGER FISHPOND FISHY FISK FISKE FISSION FISSURE FISSURED FIST FISTED FISTICUFF FISTS FIT FITCH FITCHBURG FITFUL FITFULLY FITLY FITNESS FITS FITTED FITTER FITTERS FITTING FITTINGLY FITTINGS FITZGERALD FITZPATRICK FITZROY FIVE FIVEFOLD FIVES FIX FIXATE FIXATED FIXATES FIXATING FIXATION FIXATIONS FIXED FIXEDLY FIXEDNESS FIXER FIXERS FIXES FIXING FIXINGS FIXTURE FIXTURES FIZEAU FIZZLE FIZZLED FLABBERGAST FLABBERGASTED FLACK FLAG FLAGELLATE FLAGGED FLAGGING FLAGLER FLAGPOLE FLAGRANT FLAGRANTLY FLAGS FLAGSTAFF FLAIL FLAIR FLAK FLAKE FLAKED FLAKES FLAKING FLAKY FLAM FLAMBOYANT FLAME FLAMED FLAMER FLAMERS FLAMES FLAMING FLAMMABLE FLANAGAN FLANDERS FLANK FLANKED FLANKER FLANKING FLANKS FLANNEL FLANNELS FLAP FLAPS FLARE FLARED FLARES FLARING FLASH FLASHBACK FLASHED FLASHER FLASHERS FLASHES FLASHING FLASHLIGHT FLASHLIGHTS FLASHY FLASK FLAT FLATBED FLATLY FLATNESS FLATS FLATTEN FLATTENED FLATTENING FLATTER FLATTERED FLATTERER FLATTERING FLATTERY FLATTEST FLATULENT FLATUS FLATWORM FLAUNT FLAUNTED FLAUNTING FLAUNTS FLAVOR FLAVORED FLAVORING FLAVORINGS FLAVORS FLAW FLAWED FLAWLESS FLAWLESSLY FLAWS FLAX FLAXEN FLEA FLEAS FLED FLEDERMAUS FLEDGED FLEDGLING FLEDGLINGS FLEE FLEECE FLEECES FLEECY FLEEING FLEES FLEET FLEETEST FLEETING FLEETLY FLEETNESS FLEETS FLEISCHMAN FLEISHER FLEMING FLEMINGS FLEMISH FLEMISHED FLEMISHES FLEMISHING FLESH FLESHED FLESHES FLESHING FLESHLY FLESHY FLETCHER FLETCHERIZE FLETCHERIZES FLEW FLEX FLEXIBILITIES FLEXIBILITY FLEXIBLE FLEXIBLY FLICK FLICKED FLICKER FLICKERING FLICKING FLICKS FLIER FLIERS FLIES FLIGHT FLIGHTS FLIMSY FLINCH FLINCHED FLINCHES FLINCHING FLING FLINGS FLINT FLINTY FLIP FLIPFLOP FLIPPED FLIPS FLIRT FLIRTATION FLIRTATIOUS FLIRTED FLIRTING FLIRTS FLIT FLITTING FLO FLOAT FLOATED FLOATER FLOATING FLOATS FLOCK FLOCKED FLOCKING FLOCKS FLOG FLOGGING FLOOD FLOODED FLOODING FLOODLIGHT FLOODLIT FLOODS FLOOR FLOORED FLOORING FLOORINGS FLOORS FLOP FLOPPIES FLOPPILY FLOPPING FLOPPY FLOPS FLORA FLORAL FLORENCE FLORENTINE FLORID FLORIDA FLORIDIAN FLORIDIANS FLORIN FLORIST FLOSS FLOSSED FLOSSES FLOSSING FLOTATION FLOTILLA FLOUNDER FLOUNDERED FLOUNDERING FLOUNDERS FLOUR FLOURED FLOURISH FLOURISHED FLOURISHES FLOURISHING FLOW FLOWCHART FLOWCHARTING FLOWCHARTS FLOWED FLOWER FLOWERED FLOWERINESS FLOWERING FLOWERPOT FLOWERS FLOWERY FLOWING FLOWN FLOWS FLOYD FLU FLUCTUATE FLUCTUATES FLUCTUATING FLUCTUATION FLUCTUATIONS FLUE FLUENCY FLUENT FLUENTLY FLUFF FLUFFIER FLUFFIEST FLUFFY FLUID FLUIDITY FLUIDLY FLUIDS FLUKE FLUNG FLUNKED FLUORESCE FLUORESCENT FLURRIED FLURRY FLUSH FLUSHED FLUSHES FLUSHING FLUTE FLUTED FLUTING FLUTTER FLUTTERED FLUTTERING FLUTTERS FLUX FLY FLYABLE FLYER FLYERS FLYING FLYNN FOAL FOAM FOAMED FOAMING FOAMS FOAMY FOB FOBBING FOCAL FOCALLY FOCI FOCUS FOCUSED FOCUSES FOCUSING FOCUSSED FODDER FOE FOES FOG FOGARTY FOGGED FOGGIER FOGGIEST FOGGILY FOGGING FOGGY FOGS FOGY FOIBLE FOIL FOILED FOILING FOILS FOIST FOLD FOLDED FOLDER FOLDERS FOLDING FOLDOUT FOLDS FOLEY FOLIAGE FOLK FOLKLORE FOLKS FOLKSONG FOLKSY FOLLIES FOLLOW FOLLOWED FOLLOWER FOLLOWERS FOLLOWING FOLLOWINGS FOLLOWS FOLLY FOLSOM FOMALHAUT FOND FONDER FONDLE FONDLED FONDLES FONDLING FONDLY FONDNESS FONT FONTAINE FONTAINEBLEAU FONTANA FONTS FOOD FOODS FOODSTUFF FOODSTUFFS FOOL FOOLED FOOLHARDY FOOLING FOOLISH FOOLISHLY FOOLISHNESS FOOLPROOF FOOLS FOOT FOOTAGE FOOTBALL FOOTBALLS FOOTBRIDGE FOOTE FOOTED FOOTER FOOTERS FOOTFALL FOOTHILL FOOTHOLD FOOTING FOOTMAN FOOTNOTE FOOTNOTES FOOTPATH FOOTPRINT FOOTPRINTS FOOTSTEP FOOTSTEPS FOR FORAGE FORAGED FORAGES FORAGING FORAY FORAYS FORBADE FORBEAR FORBEARANCE FORBEARS FORBES FORBID FORBIDDEN FORBIDDING FORBIDS FORCE FORCED FORCEFUL FORCEFULLY FORCEFULNESS FORCER FORCES FORCIBLE FORCIBLY FORCING FORD FORDHAM FORDS FORE FOREARM FOREARMS FOREBODING FORECAST FORECASTED FORECASTER FORECASTERS FORECASTING FORECASTLE FORECASTS FOREFATHER FOREFATHERS FOREFINGER FOREFINGERS FOREGO FOREGOES FOREGOING FOREGONE FOREGROUND FOREHEAD FOREHEADS FOREIGN FOREIGNER FOREIGNERS FOREIGNS FOREMAN FOREMOST FORENOON FORENSIC FORERUNNERS FORESEE FORESEEABLE FORESEEN FORESEES FORESIGHT FORESIGHTED FOREST FORESTALL FORESTALLED FORESTALLING FORESTALLMENT FORESTALLS FORESTED FORESTER FORESTERS FORESTRY FORESTS FORETELL FORETELLING FORETELLS FORETOLD FOREVER FOREWARN FOREWARNED FOREWARNING FOREWARNINGS FOREWARNS FORFEIT FORFEITED FORFEITURE FORGAVE FORGE FORGED FORGER FORGERIES FORGERY FORGES FORGET FORGETFUL FORGETFULNESS FORGETS FORGETTABLE FORGETTABLY FORGETTING FORGING FORGIVABLE FORGIVABLY FORGIVE FORGIVEN FORGIVENESS FORGIVES FORGIVING FORGIVINGLY FORGOT FORGOTTEN FORK FORKED FORKING FORKLIFT FORKS FORLORN FORLORNLY FORM FORMAL FORMALISM FORMALISMS FORMALITIES FORMALITY FORMALIZATION FORMALIZATIONS FORMALIZE FORMALIZED FORMALIZES FORMALIZING FORMALLY FORMANT FORMANTS FORMAT FORMATION FORMATIONS FORMATIVE FORMATIVELY FORMATS FORMATTED FORMATTER FORMATTERS FORMATTING FORMED FORMER FORMERLY FORMICA FORMICAS FORMIDABLE FORMING FORMOSA FORMOSAN FORMS FORMULA FORMULAE FORMULAS FORMULATE FORMULATED FORMULATES FORMULATING FORMULATION FORMULATIONS FORMULATOR FORMULATORS FORNICATION FORREST FORSAKE FORSAKEN FORSAKES FORSAKING FORSYTHE FORT FORTE FORTESCUE FORTH FORTHCOMING FORTHRIGHT FORTHWITH FORTIER FORTIES FORTIETH FORTIFICATION FORTIFICATIONS FORTIFIED FORTIFIES FORTIFY FORTIFYING FORTIORI FORTITUDE FORTNIGHT FORTNIGHTLY FORTRAN FORTRAN FORTRESS FORTRESSES FORTS FORTUITOUS FORTUITOUSLY FORTUNATE FORTUNATELY FORTUNE FORTUNES FORTY FORUM FORUMS FORWARD FORWARDED FORWARDER FORWARDING FORWARDNESS FORWARDS FOSS FOSSIL FOSTER FOSTERED FOSTERING FOSTERS FOUGHT FOUL FOULED FOULEST FOULING FOULLY FOULMOUTH FOULNESS FOULS FOUND FOUNDATION FOUNDATIONS FOUNDED FOUNDER FOUNDERED FOUNDERS FOUNDING FOUNDLING FOUNDRIES FOUNDRY FOUNDS FOUNT FOUNTAIN FOUNTAINS FOUNTS FOUR FOURFOLD FOURIER FOURS FOURSCORE FOURSOME FOURSQUARE FOURTEEN FOURTEENS FOURTEENTH FOURTH FOWL FOWLER FOWLS FOX FOXES FOXHALL FRACTION FRACTIONAL FRACTIONALLY FRACTIONS FRACTURE FRACTURED FRACTURES FRACTURING FRAGILE FRAGMENT FRAGMENTARY FRAGMENTATION FRAGMENTED FRAGMENTING FRAGMENTS FRAGRANCE FRAGRANCES FRAGRANT FRAGRANTLY FRAIL FRAILEST FRAILTY FRAME FRAMED FRAMER FRAMES FRAMEWORK FRAMEWORKS FRAMING FRAN FRANC FRANCAISE FRANCE FRANCES FRANCESCA FRANCESCO FRANCHISE FRANCHISES FRANCIE FRANCINE FRANCIS FRANCISCAN FRANCISCANS FRANCISCO FRANCIZE FRANCIZES FRANCO FRANCOIS FRANCOISE FRANCS FRANK FRANKED FRANKEL FRANKER FRANKEST FRANKFORT FRANKFURT FRANKIE FRANKING FRANKLINIZATION FRANKLINIZATIONS FRANKLY FRANKNESS FRANKS FRANNY FRANTIC FRANTICALLY FRANZ FRASER FRATERNAL FRATERNALLY FRATERNITIES FRATERNITY FRAU FRAUD FRAUDS FRAUDULENT FRAUGHT FRAY FRAYED FRAYING FRAYNE FRAYS FRAZIER FRAZZLE FREAK FREAKISH FREAKS FRECKLE FRECKLED FRECKLES FRED FREDDIE FREDDY FREDERIC FREDERICK FREDERICKS FREDERICKSBURG FREDERICO FREDERICTON FREDHOLM FREDRICK FREDRICKSON FREE FREED FREEDMAN FREEDOM FREEDOMS FREEING FREEINGS FREELY FREEMAN FREEMASON FREEMASONRY FREEMASONS FREENESS FREEPORT FREER FREES FREEST FREESTYLE FREETOWN FREEWAY FREEWHEEL FREEZE FREEZER FREEZERS FREEZES FREEZING FREIDA FREIGHT FREIGHTED FREIGHTER FREIGHTERS FREIGHTING FREIGHTS FRENCH FRENCHIZE FRENCHIZES FRENCHMAN FRENCHMEN FRENETIC FRENZIED FRENZY FREON FREQUENCIES FREQUENCY FREQUENT FREQUENTED FREQUENTER FREQUENTERS FREQUENTING FREQUENTLY FREQUENTS FRESCO FRESCOES FRESH FRESHEN FRESHENED FRESHENER FRESHENERS FRESHENING FRESHENS FRESHER FRESHEST FRESHLY FRESHMAN FRESHMEN FRESHNESS FRESHWATER FRESNEL FRESNO FRET FRETFUL FRETFULLY FRETFULNESS FREUD FREUDIAN FREUDIANISM FREUDIANISMS FREUDIANS FREY FREYA FRIAR FRIARS FRICATIVE FRICATIVES FRICK FRICTION FRICTIONLESS FRICTIONS FRIDAY FRIDAYS FRIED FRIEDMAN FRIEDRICH FRIEND FRIENDLESS FRIENDLIER FRIENDLIEST FRIENDLINESS FRIENDLY FRIENDS FRIENDSHIP FRIENDSHIPS FRIES FRIESLAND FRIEZE FRIEZES FRIGATE FRIGATES FRIGGA FRIGHT FRIGHTEN FRIGHTENED FRIGHTENING FRIGHTENINGLY FRIGHTENS FRIGHTFUL FRIGHTFULLY FRIGHTFULNESS FRIGID FRIGIDAIRE FRILL FRILLS FRINGE FRINGED FRISBEE FRISIA FRISIAN FRISK FRISKED FRISKING FRISKS FRISKY FRITO FRITTER FRITZ FRIVOLITY FRIVOLOUS FRIVOLOUSLY FRO FROCK FROCKS FROG FROGS FROLIC FROLICS FROM FRONT FRONTAGE FRONTAL FRONTED FRONTIER FRONTIERS FRONTIERSMAN FRONTIERSMEN FRONTING FRONTS FROST FROSTBELT FROSTBITE FROSTBITTEN FROSTED FROSTING FROSTS FROSTY FROTH FROTHING FROTHY FROWN FROWNED FROWNING FROWNS FROZE FROZEN FROZENLY FRUEHAUF FRUGAL FRUGALLY FRUIT FRUITFUL FRUITFULLY FRUITFULNESS FRUITION FRUITLESS FRUITLESSLY FRUITS FRUSTRATE FRUSTRATED FRUSTRATES FRUSTRATING FRUSTRATION FRUSTRATIONS FRY FRYE FUCHS FUCHSIA FUDGE FUEL FUELED FUELING FUELS FUGITIVE FUGITIVES FUGUE FUJI FUJITSU FULBRIGHT FULBRIGHTS FULCRUM FULFILL FULFILLED FULFILLING FULFILLMENT FULFILLMENTS FULFILLS FULL FULLER FULLERTON FULLEST FULLNESS FULLY FULMINATE FULTON FUMBLE FUMBLED FUMBLING FUME FUMED FUMES FUMING FUN FUNCTION FUNCTIONAL FUNCTIONALITIES FUNCTIONALITY FUNCTIONALLY FUNCTIONALS FUNCTIONARY FUNCTIONED FUNCTIONING FUNCTIONS FUNCTOR FUNCTORS FUND FUNDAMENTAL FUNDAMENTALLY FUNDAMENTALS FUNDED FUNDER FUNDERS FUNDING FUNDS FUNERAL FUNERALS FUNEREAL FUNGAL FUNGI FUNGIBLE FUNGICIDE FUNGUS FUNK FUNNEL FUNNELED FUNNELING FUNNELS FUNNIER FUNNIEST FUNNILY FUNNINESS FUNNY FUR FURIES FURIOUS FURIOUSER FURIOUSLY FURLONG FURLOUGH FURMAN FURNACE FURNACES FURNISH FURNISHED FURNISHES FURNISHING FURNISHINGS FURNITURE FURRIER FURROW FURROWED FURROWS FURRY FURS FURTHER FURTHERED FURTHERING FURTHERMORE FURTHERMOST FURTHERS FURTHEST FURTIVE FURTIVELY FURTIVENESS FURY FUSE FUSED FUSES FUSING FUSION FUSS FUSSING FUSSY FUTILE FUTILITY FUTURE FUTURES FUTURISTIC FUZZ FUZZIER FUZZINESS FUZZY GAB GABARDINE GABBING GABERONES GABLE GABLED GABLER GABLES GABON GABORONE GABRIEL GABRIELLE GAD GADFLY GADGET GADGETRY GADGETS GAELIC GAELICIZATION GAELICIZATIONS GAELICIZE GAELICIZES GAG GAGGED GAGGING GAGING GAGS GAIETIES GAIETY GAIL GAILY GAIN GAINED GAINER GAINERS GAINES GAINESVILLE GAINFUL GAINING GAINS GAIT GAITED GAITER GAITERS GAITHERSBURG GALACTIC GALAHAD GALAPAGOS GALATEA GALATEAN GALATEANS GALATIA GALATIANS GALAXIES GALAXY GALBREATH GALE GALEN GALILEAN GALILEE GALILEO GALL GALLAGHER GALLANT GALLANTLY GALLANTRY GALLANTS GALLED GALLERIED GALLERIES GALLERY GALLEY GALLEYS GALLING GALLON GALLONS GALLOP GALLOPED GALLOPER GALLOPING GALLOPS GALLOWAY GALLOWS GALLS GALLSTONE GALLUP GALOIS GALT GALVESTON GALVIN GALWAY GAMBIA GAMBIT GAMBLE GAMBLED GAMBLER GAMBLERS GAMBLES GAMBLING GAMBOL GAME GAMED GAMELY GAMENESS GAMES GAMING GAMMA GANDER GANDHI GANDHIAN GANG GANGES GANGLAND GANGLING GANGPLANK GANGRENE GANGS GANGSTER GANGSTERS GANNETT GANTRY GANYMEDE GAP GAPE GAPED GAPES GAPING GAPS GARAGE GARAGED GARAGES GARB GARBAGE GARBAGES GARBED GARBLE GARBLED GARCIA GARDEN GARDENED GARDENER GARDENERS GARDENING GARDENS GARDNER GARFIELD GARFUNKEL GARGANTUAN GARGLE GARGLED GARGLES GARGLING GARIBALDI GARLAND GARLANDED GARLIC GARMENT GARMENTS GARNER GARNERED GARNETT GARNISH GARRETT GARRISON GARRISONED GARRISONIAN GARRY GARTER GARTERS GARTH GARVEY GARY GAS GASCONY GASEOUS GASEOUSLY GASES GASH GASHES GASKET GASLIGHT GASOLINE GASP GASPED GASPEE GASPING GASPS GASSED GASSER GASSET GASSING GASSINGS GASSY GASTON GASTRIC GASTROINTESTINAL GASTRONOME GASTRONOMY GATE GATED GATES GATEWAY GATEWAYS GATHER GATHERED GATHERER GATHERERS GATHERING GATHERINGS GATHERS GATING GATLINBURG GATOR GATSBY GAUCHE GAUDINESS GAUDY GAUGE GAUGED GAUGES GAUGUIN GAUL GAULLE GAULS GAUNT GAUNTLEY GAUNTNESS GAUSSIAN GAUTAMA GAUZE GAVE GAVEL GAVIN GAWK GAWKY GAY GAYER GAYEST GAYETY GAYLOR GAYLORD GAYLY GAYNESS GAYNOR GAZE GAZED GAZELLE GAZER GAZERS GAZES GAZETTE GAZING GEAR GEARED GEARING GEARS GEARY GECKO GEESE GEHRIG GEIGER GEIGY GEISHA GEL GELATIN GELATINE GELATINOUS GELD GELLED GELLING GELS GEM GEMINI GEMINID GEMMA GEMS GENDER GENDERS GENE GENEALOGY GENERAL GENERALIST GENERALISTS GENERALITIES GENERALITY GENERALIZATION GENERALIZATIONS GENERALIZE GENERALIZED GENERALIZER GENERALIZERS GENERALIZES GENERALIZING GENERALLY GENERALS GENERATE GENERATED GENERATES GENERATING GENERATION GENERATIONS GENERATIVE GENERATOR GENERATORS GENERIC GENERICALLY GENEROSITIES GENEROSITY GENEROUS GENEROUSLY GENEROUSNESS GENES GENESCO GENESIS GENETIC GENETICALLY GENEVA GENEVIEVE GENIAL GENIALLY GENIE GENIUS GENIUSES GENOA GENRE GENRES GENT GENTEEL GENTILE GENTLE GENTLEMAN GENTLEMANLY GENTLEMEN GENTLENESS GENTLER GENTLEST GENTLEWOMAN GENTLY GENTRY GENUINE GENUINELY GENUINENESS GENUS GEOCENTRIC GEODESIC GEODESY GEODETIC GEOFF GEOFFREY GEOGRAPHER GEOGRAPHIC GEOGRAPHICAL GEOGRAPHICALLY GEOGRAPHY GEOLOGICAL GEOLOGIST GEOLOGISTS GEOLOGY GEOMETRIC GEOMETRICAL GEOMETRICALLY GEOMETRICIAN GEOMETRIES GEOMETRY GEOPHYSICAL GEOPHYSICS GEORGE GEORGES GEORGETOWN GEORGIA GEORGIAN GEORGIANS GEOSYNCHRONOUS GERALD GERALDINE GERANIUM GERARD GERBER GERBIL GERHARD GERHARDT GERIATRIC GERM GERMAN GERMANE GERMANIA GERMANIC GERMANS GERMANTOWN GERMANY GERMICIDE GERMINAL GERMINATE GERMINATED GERMINATES GERMINATING GERMINATION GERMS GEROME GERRY GERSHWIN GERSHWINS GERTRUDE GERUND GESTAPO GESTURE GESTURED GESTURES GESTURING GET GETAWAY GETS GETTER GETTERS GETTING GETTY GETTYSBURG GEYSER GHANA GHANIAN GHASTLY GHENT GHETTO GHOST GHOSTED GHOSTLY GHOSTS GIACOMO GIANT GIANTS GIBBERISH GIBBONS GIBBS GIBBY GIBRALTAR GIBSON GIDDINESS GIDDINGS GIDDY GIDEON GIFFORD GIFT GIFTED GIFTS GIG GIGABIT GIGABITS GIGABYTE GIGABYTES GIGACYCLE GIGAHERTZ GIGANTIC GIGAVOLT GIGAWATT GIGGLE GIGGLED GIGGLES GIGGLING GIL GILBERTSON GILCHRIST GILD GILDED GILDING GILDS GILEAD GILES GILKSON GILL GILLESPIE GILLETTE GILLIGAN GILLS GILMORE GILT GIMBEL GIMMICK GIMMICKS GIN GINA GINGER GINGERBREAD GINGERLY GINGHAM GINGHAMS GINN GINO GINS GINSBERG GINSBURG GIOCONDA GIORGIO GIOVANNI GIPSIES GIPSY GIRAFFE GIRAFFES GIRD GIRDER GIRDERS GIRDLE GIRL GIRLFRIEND GIRLIE GIRLISH GIRLS GIRT GIRTH GIST GIULIANO GIUSEPPE GIVE GIVEAWAY GIVEN GIVER GIVERS GIVES GIVING GLACIAL GLACIER GLACIERS GLAD GLADDEN GLADDER GLADDEST GLADE GLADIATOR GLADLY GLADNESS GLADSTONE GLADYS GLAMOR GLAMOROUS GLAMOUR GLANCE GLANCED GLANCES GLANCING GLAND GLANDS GLANDULAR GLARE GLARED GLARES GLARING GLARINGLY GLASGOW GLASS GLASSED GLASSES GLASSY GLASWEGIAN GLAUCOMA GLAZE GLAZED GLAZER GLAZES GLAZING GLEAM GLEAMED GLEAMING GLEAMS GLEAN GLEANED GLEANER GLEANING GLEANINGS GLEANS GLEASON GLEE GLEEFUL GLEEFULLY GLEES GLEN GLENDA GLENDALE GLENN GLENS GLIDDEN GLIDE GLIDED GLIDER GLIDERS GLIDES GLIMMER GLIMMERED GLIMMERING GLIMMERS GLIMPSE GLIMPSED GLIMPSES GLINT GLINTED GLINTING GLINTS GLISTEN GLISTENED GLISTENING GLISTENS GLITCH GLITTER GLITTERED GLITTERING GLITTERS GLOAT GLOBAL GLOBALLY GLOBE GLOBES GLOBULAR GLOBULARITY GLOOM GLOOMILY GLOOMY GLORIA GLORIANA GLORIES GLORIFICATION GLORIFIED GLORIFIES GLORIFY GLORIOUS GLORIOUSLY GLORY GLORYING GLOSS GLOSSARIES GLOSSARY GLOSSED GLOSSES GLOSSING GLOSSY GLOTTAL GLOUCESTER GLOVE GLOVED GLOVER GLOVERS GLOVES GLOVING GLOW GLOWED GLOWER GLOWERS GLOWING GLOWINGLY GLOWS GLUE GLUED GLUES GLUING GLUT GLUTTON GLYNN GNASH GNAT GNATS GNAW GNAWED GNAWING GNAWS GNOME GNOMON GNU GOA GOAD GOADED GOAL GOALS GOAT GOATEE GOATEES GOATS GOBBLE GOBBLED GOBBLER GOBBLERS GOBBLES GOBI GOBLET GOBLETS GOBLIN GOBLINS GOD GODDARD GODDESS GODDESSES GODFATHER GODFREY GODHEAD GODLIKE GODLY GODMOTHER GODMOTHERS GODOT GODPARENT GODS GODSEND GODSON GODWIN GODZILLA GOES GOETHE GOFF GOGGLES GOGH GOING GOINGS GOLD GOLDA GOLDBERG GOLDEN GOLDENLY GOLDENNESS GOLDENROD GOLDFIELD GOLDFISH GOLDING GOLDMAN GOLDS GOLDSMITH GOLDSTEIN GOLDSTINE GOLDWATER GOLETA GOLF GOLFER GOLFERS GOLFING GOLIATH GOLLY GOMEZ GONDOLA GONE GONER GONG GONGS GONZALES GONZALEZ GOOD GOODBY GOODBYE GOODE GOODIES GOODLY GOODMAN GOODNESS GOODRICH GOODS GOODWILL GOODWIN GOODY GOODYEAR GOOF GOOFED GOOFS GOOFY GOOSE GOPHER GORDIAN GORDON GORE GOREN GORGE GORGEOUS GORGEOUSLY GORGES GORGING GORHAM GORILLA GORILLAS GORKY GORTON GORY GOSH GOSPEL GOSPELERS GOSPELS GOSSIP GOSSIPED GOSSIPING GOSSIPS GOT GOTHAM GOTHIC GOTHICALLY GOTHICISM GOTHICIZE GOTHICIZED GOTHICIZER GOTHICIZERS GOTHICIZES GOTHICIZING GOTO GOTOS GOTTEN GOTTFRIED GOUCHER GOUDA GOUGE GOUGED GOUGES GOUGING GOULD GOURD GOURMET GOUT GOVERN GOVERNANCE GOVERNED GOVERNESS GOVERNING GOVERNMENT GOVERNMENTAL GOVERNMENTALLY GOVERNMENTS GOVERNOR GOVERNORS GOVERNS GOWN GOWNED GOWNS GRAB GRABBED GRABBER GRABBERS GRABBING GRABBINGS GRABS GRACE GRACED GRACEFUL GRACEFULLY GRACEFULNESS GRACES GRACIE GRACING GRACIOUS GRACIOUSLY GRACIOUSNESS GRAD GRADATION GRADATIONS GRADE GRADED GRADER GRADERS GRADES GRADIENT GRADIENTS GRADING GRADINGS GRADUAL GRADUALLY GRADUATE GRADUATED GRADUATES GRADUATING GRADUATION GRADUATIONS GRADY GRAFF GRAFT GRAFTED GRAFTER GRAFTING GRAFTON GRAFTS GRAHAM GRAHAMS GRAIL GRAIN GRAINED GRAINING GRAINS GRAM GRAMMAR GRAMMARIAN GRAMMARS GRAMMATIC GRAMMATICAL GRAMMATICALLY GRAMS GRANARIES GRANARY GRAND GRANDCHILD GRANDCHILDREN GRANDDAUGHTER GRANDER GRANDEST GRANDEUR GRANDFATHER GRANDFATHERS GRANDIOSE GRANDLY GRANDMA GRANDMOTHER GRANDMOTHERS GRANDNEPHEW GRANDNESS GRANDNIECE GRANDPA GRANDPARENT GRANDS GRANDSON GRANDSONS GRANDSTAND GRANGE GRANITE GRANNY GRANOLA GRANT GRANTED GRANTEE GRANTER GRANTING GRANTOR GRANTS GRANULARITY GRANULATE GRANULATED GRANULATES GRANULATING GRANVILLE GRAPE GRAPEFRUIT GRAPES GRAPEVINE GRAPH GRAPHED GRAPHIC GRAPHICAL GRAPHICALLY GRAPHICS GRAPHING GRAPHITE GRAPHS GRAPPLE GRAPPLED GRAPPLING GRASP GRASPABLE GRASPED GRASPING GRASPINGLY GRASPS GRASS GRASSED GRASSERS GRASSES GRASSIER GRASSIEST GRASSLAND GRASSY GRATE GRATED GRATEFUL GRATEFULLY GRATEFULNESS GRATER GRATES GRATIFICATION GRATIFIED GRATIFY GRATIFYING GRATING GRATINGS GRATIS GRATITUDE GRATUITIES GRATUITOUS GRATUITOUSLY GRATUITOUSNESS GRATUITY GRAVE GRAVEL GRAVELLY GRAVELY GRAVEN GRAVENESS GRAVER GRAVES GRAVEST GRAVESTONE GRAVEYARD GRAVITATE GRAVITATION GRAVITATIONAL GRAVITY GRAVY GRAY GRAYED GRAYER GRAYEST GRAYING GRAYNESS GRAYSON GRAZE GRAZED GRAZER GRAZING GREASE GREASED GREASES GREASY GREAT GREATER GREATEST GREATLY GREATNESS GRECIAN GRECIANIZE GRECIANIZES GREECE GREED GREEDILY GREEDINESS GREEDY GREEK GREEKIZE GREEKIZES GREEKS GREEN GREENBELT GREENBERG GREENBLATT GREENBRIAR GREENE GREENER GREENERY GREENEST GREENFELD GREENFIELD GREENGROCER GREENHOUSE GREENHOUSES GREENING GREENISH GREENLAND GREENLY GREENNESS GREENS GREENSBORO GREENSVILLE GREENTREE GREENVILLE GREENWARE GREENWICH GREER GREET GREETED GREETER GREETING GREETINGS GREETS GREG GREGARIOUS GREGG GREGORIAN GREGORY GRENADE GRENADES GRENDEL GRENIER GRENOBLE GRENVILLE GRESHAM GRETA GRETCHEN GREW GREY GREYEST GREYHOUND GREYING GRID GRIDDLE GRIDIRON GRIDS GRIEF GRIEFS GRIEVANCE GRIEVANCES GRIEVE GRIEVED GRIEVER GRIEVERS GRIEVES GRIEVING GRIEVINGLY GRIEVOUS GRIEVOUSLY GRIFFITH GRILL GRILLED GRILLING GRILLS GRIM GRIMACE GRIMALDI GRIME GRIMED GRIMES GRIMLY GRIMM GRIMNESS GRIN GRIND GRINDER GRINDERS GRINDING GRINDINGS GRINDS GRINDSTONE GRINDSTONES GRINNING GRINS GRIP GRIPE GRIPED GRIPES GRIPING GRIPPED GRIPPING GRIPPINGLY GRIPS GRIS GRISLY GRIST GRISWOLD GRIT GRITS GRITTY GRIZZLY GROAN GROANED GROANER GROANERS GROANING GROANS GROCER GROCERIES GROCERS GROCERY GROGGY GROIN GROOM GROOMED GROOMING GROOMS GROOT GROOVE GROOVED GROOVES GROPE GROPED GROPES GROPING GROSS GROSSED GROSSER GROSSES GROSSEST GROSSET GROSSING GROSSLY GROSSMAN GROSSNESS GROSVENOR GROTESQUE GROTESQUELY GROTESQUES GROTON GROTTO GROTTOS GROUND GROUNDED GROUNDER GROUNDERS GROUNDING GROUNDS GROUNDWORK GROUP GROUPED GROUPING GROUPINGS GROUPS GROUSE GROVE GROVEL GROVELED GROVELING GROVELS GROVER GROVERS GROVES GROW GROWER GROWERS GROWING GROWL GROWLED GROWLING GROWLS GROWN GROWNUP GROWNUPS GROWS GROWTH GROWTHS GRUB GRUBBY GRUBS GRUDGE GRUDGES GRUDGINGLY GRUESOME GRUFF GRUFFLY GRUMBLE GRUMBLED GRUMBLES GRUMBLING GRUMMAN GRUNT GRUNTED GRUNTING GRUNTS GRUSKY GRUYERE GUADALUPE GUAM GUANO GUARANTEE GUARANTEED GUARANTEEING GUARANTEER GUARANTEERS GUARANTEES GUARANTY GUARD GUARDED GUARDEDLY GUARDHOUSE GUARDIA GUARDIAN GUARDIANS GUARDIANSHIP GUARDING GUARDS GUATEMALA GUATEMALAN GUBERNATORIAL GUELPH GUENTHER GUERRILLA GUERRILLAS GUESS GUESSED GUESSES GUESSING GUESSWORK GUEST GUESTS GUGGENHEIM GUHLEMAN GUIANA GUIDANCE GUIDE GUIDEBOOK GUIDEBOOKS GUIDED GUIDELINE GUIDELINES GUIDES GUIDING GUILD GUILDER GUILDERS GUILE GUILFORD GUILT GUILTIER GUILTIEST GUILTILY GUILTINESS GUILTLESS GUILTLESSLY GUILTY GUINEA GUINEVERE GUISE GUISES GUITAR GUITARS GUJARAT GUJARATI GULCH GULCHES GULF GULFS GULL GULLAH GULLED GULLIES GULLING GULLS GULLY GULP GULPED GULPS GUM GUMMING GUMPTION GUMS GUN GUNDERSON GUNFIRE GUNMAN GUNMEN GUNNAR GUNNED GUNNER GUNNERS GUNNERY GUNNING GUNNY GUNPLAY GUNPOWDER GUNS GUNSHOT GUNTHER GURGLE GURKHA GURU GUS GUSH GUSHED GUSHER GUSHES GUSHING GUST GUSTAFSON GUSTAV GUSTAVE GUSTAVUS GUSTO GUSTS GUSTY GUT GUTENBERG GUTHRIE GUTS GUTSY GUTTER GUTTERED GUTTERS GUTTING GUTTURAL GUY GUYANA GUYED GUYER GUYERS GUYING GUYS GWEN GWYN GYMNASIUM GYMNASIUMS GYMNAST GYMNASTIC GYMNASTICS GYMNASTS GYPSIES GYPSY GYRO GYROCOMPASS GYROSCOPE GYROSCOPES HAAG HAAS HABEAS HABERMAN HABIB HABIT HABITAT HABITATION HABITATIONS HABITATS HABITS HABITUAL HABITUALLY HABITUALNESS HACK HACKED HACKER HACKERS HACKETT HACKING HACKNEYED HACKS HACKSAW HAD HADAMARD HADDAD HADDOCK HADES HADLEY HADRIAN HAFIZ HAG HAGEN HAGER HAGGARD HAGGARDLY HAGGLE HAGSTROM HAGUE HAHN HAIFA HAIL HAILED HAILING HAILS HAILSTONE HAILSTORM HAINES HAIR HAIRCUT HAIRCUTS HAIRIER HAIRINESS HAIRLESS HAIRPIN HAIRS HAIRY HAITI HAITIAN HAL HALCYON HALE HALER HALEY HALF HALFHEARTED HALFWAY HALIFAX HALL HALLEY HALLINAN HALLMARK HALLMARKS HALLOW HALLOWED HALLOWEEN HALLS HALLUCINATE HALLWAY HALLWAYS HALOGEN HALPERN HALSEY HALSTEAD HALT HALTED HALTER HALTERS HALTING HALTINGLY HALTS HALVE HALVED HALVERS HALVERSON HALVES HALVING HAM HAMAL HAMBURG HAMBURGER HAMBURGERS HAMEY HAMILTON HAMILTONIAN HAMILTONIANS HAMLET HAMLETS HAMLIN HAMMER HAMMERED HAMMERING HAMMERS HAMMETT HAMMING HAMMOCK HAMMOCKS HAMMOND HAMPER HAMPERED HAMPERS HAMPSHIRE HAMPTON HAMS HAMSTER HAN HANCOCK HAND HANDBAG HANDBAGS HANDBOOK HANDBOOKS HANDCUFF HANDCUFFED HANDCUFFING HANDCUFFS HANDED HANDEL HANDFUL HANDFULS HANDGUN HANDICAP HANDICAPPED HANDICAPS HANDIER HANDIEST HANDILY HANDINESS HANDING HANDIWORK HANDKERCHIEF HANDKERCHIEFS HANDLE HANDLED HANDLER HANDLERS HANDLES HANDLING HANDMAID HANDOUT HANDS HANDSHAKE HANDSHAKES HANDSHAKING HANDSOME HANDSOMELY HANDSOMENESS HANDSOMER HANDSOMEST HANDWRITING HANDWRITTEN HANDY HANEY HANFORD HANG HANGAR HANGARS HANGED HANGER HANGERS HANGING HANGMAN HANGMEN HANGOUT HANGOVER HANGOVERS HANGS HANKEL HANLEY HANLON HANNA HANNAH HANNIBAL HANOI HANOVER HANOVERIAN HANOVERIANIZE HANOVERIANIZES HANOVERIZE HANOVERIZES HANS HANSEL HANSEN HANSON HANUKKAH HAP HAPGOOD HAPHAZARD HAPHAZARDLY HAPHAZARDNESS HAPLESS HAPLESSLY HAPLESSNESS HAPLY HAPPEN HAPPENED HAPPENING HAPPENINGS HAPPENS HAPPIER HAPPIEST HAPPILY HAPPINESS HAPPY HAPSBURG HARASS HARASSED HARASSES HARASSING HARASSMENT HARBIN HARBINGER HARBOR HARBORED HARBORING HARBORS HARCOURT HARD HARDBOILED HARDCOPY HARDEN HARDER HARDEST HARDHAT HARDIN HARDINESS HARDING HARDLY HARDNESS HARDSCRABBLE HARDSHIP HARDSHIPS HARDWARE HARDWIRED HARDWORKING HARDY HARE HARELIP HAREM HARES HARK HARKEN HARLAN HARLEM HARLEY HARLOT HARLOTS HARM HARMED HARMFUL HARMFULLY HARMFULNESS HARMING HARMLESS HARMLESSLY HARMLESSNESS HARMON HARMONIC HARMONICS HARMONIES HARMONIOUS HARMONIOUSLY HARMONIOUSNESS HARMONIST HARMONISTIC HARMONISTICALLY HARMONIZE HARMONY HARMS HARNESS HARNESSED HARNESSING HAROLD HARP HARPER HARPERS HARPING HARPY HARRIED HARRIER HARRIET HARRIMAN HARRINGTON HARRIS HARRISBURG HARRISON HARRISONBURG HARROW HARROWED HARROWING HARROWS HARRY HARSH HARSHER HARSHLY HARSHNESS HART HARTFORD HARTLEY HARTMAN HARVARD HARVARDIZE HARVARDIZES HARVEST HARVESTED HARVESTER HARVESTING HARVESTS HARVEY HARVEYIZE HARVEYIZES HARVEYS HAS HASH HASHED HASHER HASHES HASHING HASHISH HASKELL HASKINS HASSLE HASTE HASTEN HASTENED HASTENING HASTENS HASTILY HASTINESS HASTINGS HASTY HAT HATCH HATCHED HATCHET HATCHETS HATCHING HATCHURE HATE HATED HATEFUL HATEFULLY HATEFULNESS HATER HATES HATFIELD HATHAWAY HATING HATRED HATS HATTERAS HATTIE HATTIESBURG HATTIZE HATTIZES HAUGEN HAUGHTILY HAUGHTINESS HAUGHTY HAUL HAULED HAULER HAULING HAULS HAUNCH HAUNCHES HAUNT HAUNTED HAUNTER HAUNTING HAUNTS HAUSA HAUSDORFF HAUSER HAVANA HAVE HAVEN HAVENS HAVES HAVILLAND HAVING HAVOC HAWAII HAWAIIAN HAWK HAWKED HAWKER HAWKERS HAWKINS HAWKS HAWLEY HAWTHORNE HAY HAYDEN HAYDN HAYES HAYING HAYNES HAYS HAYSTACK HAYWARD HAYWOOD HAZARD HAZARDOUS HAZARDS HAZE HAZEL HAZES HAZINESS HAZY HEAD HEADACHE HEADACHES HEADED HEADER HEADERS HEADGEAR HEADING HEADINGS HEADLAND HEADLANDS HEADLIGHT HEADLINE HEADLINED HEADLINES HEADLINING HEADLONG HEADMASTER HEADPHONE HEADQUARTERS HEADROOM HEADS HEADSET HEADWAY HEAL HEALED HEALER HEALERS HEALEY HEALING HEALS HEALTH HEALTHFUL HEALTHFULLY HEALTHFULNESS HEALTHIER HEALTHIEST HEALTHILY HEALTHINESS HEALTHY HEALY HEAP HEAPED HEAPING HEAPS HEAR HEARD HEARER HEARERS HEARING HEARINGS HEARKEN HEARS HEARSAY HEARST HEART HEARTBEAT HEARTBREAK HEARTEN HEARTIEST HEARTILY HEARTINESS HEARTLESS HEARTS HEARTWOOD HEARTY HEAT HEATABLE HEATED HEATEDLY HEATER HEATERS HEATH HEATHEN HEATHER HEATHKIT HEATHMAN HEATING HEATS HEAVE HEAVED HEAVEN HEAVENLY HEAVENS HEAVER HEAVERS HEAVES HEAVIER HEAVIEST HEAVILY HEAVINESS HEAVING HEAVY HEAVYWEIGHT HEBE HEBRAIC HEBRAICIZE HEBRAICIZES HEBREW HEBREWS HEBRIDES HECATE HECK HECKLE HECKMAN HECTIC HECUBA HEDDA HEDGE HEDGED HEDGEHOG HEDGEHOGS HEDGES HEDONISM HEDONIST HEED HEEDED HEEDLESS HEEDLESSLY HEEDLESSNESS HEEDS HEEL HEELED HEELERS HEELING HEELS HEFTY HEGEL HEGELIAN HEGELIANIZE HEGELIANIZES HEGEMONY HEIDEGGER HEIDELBERG HEIFER HEIGHT HEIGHTEN HEIGHTENED HEIGHTENING HEIGHTENS HEIGHTS HEINE HEINLEIN HEINOUS HEINOUSLY HEINRICH HEINZ HEINZE HEIR HEIRESS HEIRESSES HEIRS HEISENBERG HEISER HELD HELEN HELENA HELENE HELGA HELICAL HELICOPTER HELIOCENTRIC HELIOPOLIS HELIUM HELIX HELL HELLENIC HELLENIZATION HELLENIZATIONS HELLENIZE HELLENIZED HELLENIZES HELLENIZING HELLESPONT HELLFIRE HELLISH HELLMAN HELLO HELLS HELM HELMET HELMETS HELMHOLTZ HELMSMAN HELMUT HELP HELPED HELPER HELPERS HELPFUL HELPFULLY HELPFULNESS HELPING HELPLESS HELPLESSLY HELPLESSNESS HELPMATE HELPS HELSINKI HELVETICA HEM HEMINGWAY HEMISPHERE HEMISPHERES HEMLOCK HEMLOCKS HEMOGLOBIN HEMORRHOID HEMOSTAT HEMOSTATS HEMP HEMPEN HEMPSTEAD HEMS HEN HENCE HENCEFORTH HENCHMAN HENCHMEN HENDERSON HENDRICK HENDRICKS HENDRICKSON HENDRIX HENLEY HENNESSEY HENNESSY HENNING HENPECK HENRI HENRIETTA HENS HEPATITIS HEPBURN HER HERA HERACLITUS HERALD HERALDED HERALDING HERALDS HERB HERBERT HERBIVORE HERBIVOROUS HERBS HERCULEAN HERCULES HERD HERDED HERDER HERDING HERDS HERE HEREABOUT HEREABOUTS HEREAFTER HEREBY HEREDITARY HEREDITY HEREFORD HEREIN HEREINAFTER HEREOF HERES HERESY HERETIC HERETICS HERETO HERETOFORE HEREUNDER HEREWITH HERITAGE HERITAGES HERKIMER HERMAN HERMANN HERMES HERMETIC HERMETICALLY HERMIT HERMITE HERMITIAN HERMITS HERMOSA HERNANDEZ HERO HERODOTUS HEROES HEROIC HEROICALLY HEROICS HEROIN HEROINE HEROINES HEROISM HERON HERONS HERPES HERR HERRING HERRINGS HERRINGTON HERS HERSCHEL HERSELF HERSEY HERSHEL HERSHEY HERTZ HERTZOG HESITANT HESITANTLY HESITATE HESITATED HESITATES HESITATING HESITATINGLY HESITATION HESITATIONS HESPERUS HESS HESSE HESSIAN HESSIANS HESTER HETEROGENEITY HETEROGENEOUS HETEROGENEOUSLY HETEROGENEOUSNESS HETEROGENOUS HETEROSEXUAL HETMAN HETTIE HETTY HEUBLEIN HEURISTIC HEURISTICALLY HEURISTICS HEUSEN HEUSER HEW HEWED HEWER HEWETT HEWITT HEWLETT HEWS HEX HEXADECIMAL HEXAGON HEXAGONAL HEXAGONALLY HEXAGONS HEY HEYWOOD HIATT HIAWATHA HIBBARD HIBERNATE HIBERNIA HICK HICKEY HICKEYS HICKMAN HICKOK HICKORY HICKS HID HIDDEN HIDE HIDEOUS HIDEOUSLY HIDEOUSNESS HIDEOUT HIDEOUTS HIDES HIDING HIERARCHAL HIERARCHIC HIERARCHICAL HIERARCHICALLY HIERARCHIES HIERARCHY HIERONYMUS HIGGINS HIGH HIGHER HIGHEST HIGHFIELD HIGHLAND HIGHLANDER HIGHLANDS HIGHLIGHT HIGHLIGHTED HIGHLIGHTING HIGHLIGHTS HIGHLY HIGHNESS HIGHNESSES HIGHWAY HIGHWAYMAN HIGHWAYMEN HIGHWAYS HIJACK HIJACKED HIKE HIKED HIKER HIKES HIKING HILARIOUS HILARIOUSLY HILARITY HILBERT HILDEBRAND HILL HILLARY HILLBILLY HILLCREST HILLEL HILLOCK HILLS HILLSBORO HILLSDALE HILLSIDE HILLSIDES HILLTOP HILLTOPS HILT HILTON HILTS HIM HIMALAYA HIMALAYAS HIMMLER HIMSELF HIND HINDER HINDERED HINDERING HINDERS HINDI HINDRANCE HINDRANCES HINDSIGHT HINDU HINDUISM HINDUS HINDUSTAN HINES HINGE HINGED HINGES HINKLE HINMAN HINSDALE HINT HINTED HINTING HINTS HIP HIPPO HIPPOCRATES HIPPOCRATIC HIPPOPOTAMUS HIPS HIRAM HIRE HIRED HIRER HIRERS HIRES HIREY HIRING HIRINGS HIROSHI HIROSHIMA HIRSCH HIS HISPANIC HISPANICIZE HISPANICIZES HISPANICS HISS HISSED HISSES HISSING HISTOGRAM HISTOGRAMS HISTORIAN HISTORIANS HISTORIC HISTORICAL HISTORICALLY HISTORIES HISTORY HIT HITACHI HITCH HITCHCOCK HITCHED HITCHHIKE HITCHHIKED HITCHHIKER HITCHHIKERS HITCHHIKES HITCHHIKING HITCHING HITHER HITHERTO HITLER HITLERIAN HITLERISM HITLERITE HITLERITES HITS HITTER HITTERS HITTING HIVE HOAGLAND HOAR HOARD HOARDER HOARDING HOARINESS HOARSE HOARSELY HOARSENESS HOARY HOBART HOBBES HOBBIES HOBBLE HOBBLED HOBBLES HOBBLING HOBBS HOBBY HOBBYHORSE HOBBYIST HOBBYISTS HOBDAY HOBOKEN HOCKEY HODGEPODGE HODGES HODGKIN HOE HOES HOFF HOFFMAN HOG HOGGING HOGS HOIST HOISTED HOISTING HOISTS HOKAN HOLBROOK HOLCOMB HOLD HOLDEN HOLDER HOLDERS HOLDING HOLDINGS HOLDS HOLE HOLED HOLES HOLIDAY HOLIDAYS HOLIES HOLINESS HOLISTIC HOLLAND HOLLANDAISE HOLLANDER HOLLERITH HOLLINGSWORTH HOLLISTER HOLLOW HOLLOWAY HOLLOWED HOLLOWING HOLLOWLY HOLLOWNESS HOLLOWS HOLLY HOLLYWOOD HOLLYWOODIZE HOLLYWOODIZES HOLM HOLMAN HOLMDEL HOLMES HOLOCAUST HOLOCENE HOLOGRAM HOLOGRAMS HOLST HOLSTEIN HOLY HOLYOKE HOLZMAN HOM HOMAGE HOME HOMED HOMELESS HOMELY HOMEMADE HOMEMAKER HOMEMAKERS HOMEOMORPHIC HOMEOMORPHISM HOMEOMORPHISMS HOMEOPATH HOMEOWNER HOMER HOMERIC HOMERS HOMES HOMESICK HOMESICKNESS HOMESPUN HOMESTEAD HOMESTEADER HOMESTEADERS HOMESTEADS HOMEWARD HOMEWARDS HOMEWORK HOMICIDAL HOMICIDE HOMING HOMO HOMOGENEITIES HOMOGENEITY HOMOGENEOUS HOMOGENEOUSLY HOMOGENEOUSNESS HOMOMORPHIC HOMOMORPHISM HOMOMORPHISMS HOMOSEXUAL HONDA HONDO HONDURAS HONE HONED HONER HONES HONEST HONESTLY HONESTY HONEY HONEYBEE HONEYCOMB HONEYCOMBED HONEYDEW HONEYMOON HONEYMOONED HONEYMOONER HONEYMOONERS HONEYMOONING HONEYMOONS HONEYSUCKLE HONEYWELL HONING HONOLULU HONOR HONORABLE HONORABLENESS HONORABLY HONORARIES HONORARIUM HONORARY HONORED HONORER HONORING HONORS HONSHU HOOD HOODED HOODLUM HOODS HOODWINK HOODWINKED HOODWINKING HOODWINKS HOOF HOOFS HOOK HOOKED HOOKER HOOKERS HOOKING HOOKS HOOKUP HOOKUPS HOOP HOOPER HOOPS HOOSIER HOOSIERIZE HOOSIERIZES HOOT HOOTED HOOTER HOOTING HOOTS HOOVER HOOVERIZE HOOVERIZES HOOVES HOP HOPE HOPED HOPEFUL HOPEFULLY HOPEFULNESS HOPEFULS HOPELESS HOPELESSLY HOPELESSNESS HOPES HOPI HOPING HOPKINS HOPKINSIAN HOPPER HOPPERS HOPPING HOPS HORACE HORATIO HORDE HORDES HORIZON HORIZONS HORIZONTAL HORIZONTALLY HORMONE HORMONES HORN HORNBLOWER HORNED HORNET HORNETS HORNS HORNY HOROWITZ HORRENDOUS HORRENDOUSLY HORRIBLE HORRIBLENESS HORRIBLY HORRID HORRIDLY HORRIFIED HORRIFIES HORRIFY HORRIFYING HORROR HORRORS HORSE HORSEBACK HORSEFLESH HORSEFLY HORSEMAN HORSEPLAY HORSEPOWER HORSES HORSESHOE HORSESHOER HORTICULTURE HORTON HORUS HOSE HOSES HOSPITABLE HOSPITABLY HOSPITAL HOSPITALITY HOSPITALIZE HOSPITALIZED HOSPITALIZES HOSPITALIZING HOSPITALS HOST HOSTAGE HOSTAGES HOSTED HOSTESS HOSTESSES HOSTILE HOSTILELY HOSTILITIES HOSTILITY HOSTING HOSTS HOT HOTEL HOTELS HOTLY HOTNESS HOTTENTOT HOTTER HOTTEST HOUDAILLE HOUDINI HOUGHTON HOUND HOUNDED HOUNDING HOUNDS HOUR HOURGLASS HOURLY HOURS HOUSE HOUSEBOAT HOUSEBROKEN HOUSED HOUSEFLIES HOUSEFLY HOUSEHOLD HOUSEHOLDER HOUSEHOLDERS HOUSEHOLDS HOUSEKEEPER HOUSEKEEPERS HOUSEKEEPING HOUSES HOUSETOP HOUSETOPS HOUSEWIFE HOUSEWIFELY HOUSEWIVES HOUSEWORK HOUSING HOUSTON HOVEL HOVELS HOVER HOVERED HOVERING HOVERS HOW HOWARD HOWE HOWELL HOWEVER HOWL HOWLED HOWLER HOWLING HOWLS HOYT HROTHGAR HUB HUBBARD HUBBELL HUBER HUBERT HUBRIS HUBS HUCK HUDDLE HUDDLED HUDDLING HUDSON HUE HUES HUEY HUFFMAN HUG HUGE HUGELY HUGENESS HUGGING HUGGINS HUGH HUGHES HUGO HUH HULL HULLS HUM HUMAN HUMANE HUMANELY HUMANENESS HUMANITARIAN HUMANITIES HUMANITY HUMANLY HUMANNESS HUMANS HUMBLE HUMBLED HUMBLENESS HUMBLER HUMBLEST HUMBLING HUMBLY HUMBOLDT HUMBUG HUME HUMERUS HUMID HUMIDIFICATION HUMIDIFIED HUMIDIFIER HUMIDIFIERS HUMIDIFIES HUMIDIFY HUMIDIFYING HUMIDITY HUMIDLY HUMILIATE HUMILIATED HUMILIATES HUMILIATING HUMILIATION HUMILIATIONS HUMILITY HUMMED HUMMEL HUMMING HUMMINGBIRD HUMOR HUMORED HUMORER HUMORERS HUMORING HUMOROUS HUMOROUSLY HUMOROUSNESS HUMORS HUMP HUMPBACK HUMPED HUMPHREY HUMPTY HUMS HUN HUNCH HUNCHED HUNCHES HUNDRED HUNDREDFOLD HUNDREDS HUNDREDTH HUNG HUNGARIAN HUNGARY HUNGER HUNGERED HUNGERING HUNGERS HUNGRIER HUNGRIEST HUNGRILY HUNGRY HUNK HUNKS HUNS HUNT HUNTED HUNTER HUNTERS HUNTING HUNTINGTON HUNTLEY HUNTS HUNTSMAN HUNTSVILLE HURD HURDLE HURL HURLED HURLER HURLERS HURLING HURON HURONS HURRAH HURRICANE HURRICANES HURRIED HURRIEDLY HURRIES HURRY HURRYING HURST HURT HURTING HURTLE HURTLING HURTS HURWITZ HUSBAND HUSBANDRY HUSBANDS HUSH HUSHED HUSHES HUSHING HUSK HUSKED HUSKER HUSKINESS HUSKING HUSKS HUSKY HUSTLE HUSTLED HUSTLER HUSTLES HUSTLING HUSTON HUT HUTCH HUTCHINS HUTCHINSON HUTCHISON HUTS HUXLEY HUXTABLE HYACINTH HYADES HYANNIS HYBRID HYDE HYDRA HYDRANT HYDRAULIC HYDRO HYDRODYNAMIC HYDRODYNAMICS HYDROGEN HYDROGENS HYENA HYGIENE HYMAN HYMEN HYMN HYMNS HYPER HYPERBOLA HYPERBOLIC HYPERTEXT HYPHEN HYPHENATE HYPHENS HYPNOSIS HYPNOTIC HYPOCRISIES HYPOCRISY HYPOCRITE HYPOCRITES HYPODERMIC HYPODERMICS HYPOTHESES HYPOTHESIS HYPOTHESIZE HYPOTHESIZED HYPOTHESIZER HYPOTHESIZES HYPOTHESIZING HYPOTHETICAL HYPOTHETICALLY HYSTERESIS HYSTERICAL HYSTERICALLY IAN IBERIA IBERIAN IBEX IBID IBIS IBN IBSEN ICARUS ICE ICEBERG ICEBERGS ICEBOX ICED ICELAND ICELANDIC ICES ICICLE ICINESS ICING ICINGS ICON ICONOCLASM ICONOCLAST ICONS ICOSAHEDRA ICOSAHEDRAL ICOSAHEDRON ICY IDA IDAHO IDEA IDEAL IDEALISM IDEALISTIC IDEALIZATION IDEALIZATIONS IDEALIZE IDEALIZED IDEALIZES IDEALIZING IDEALLY IDEALS IDEAS IDEM IDEMPOTENCY IDEMPOTENT IDENTICAL IDENTICALLY IDENTIFIABLE IDENTIFIABLY IDENTIFICATION IDENTIFICATIONS IDENTIFIED IDENTIFIER IDENTIFIERS IDENTIFIES IDENTIFY IDENTIFYING IDENTITIES IDENTITY IDEOLOGICAL IDEOLOGICALLY IDEOLOGY IDIOCY IDIOM IDIOSYNCRASIES IDIOSYNCRASY IDIOSYNCRATIC IDIOT IDIOTIC IDIOTS IDLE IDLED IDLENESS IDLER IDLERS IDLES IDLEST IDLING IDLY IDOL IDOLATRY IDOLS IFNI IGLOO IGNITE IGNITION IGNOBLE IGNOMINIOUS IGNORAMUS IGNORANCE IGNORANT IGNORANTLY IGNORE IGNORED IGNORES IGNORING IGOR IKE ILIAD ILIADIZE ILIADIZES ILL ILLEGAL ILLEGALITIES ILLEGALITY ILLEGALLY ILLEGITIMATE ILLICIT ILLICITLY ILLINOIS ILLITERACY ILLITERATE ILLNESS ILLNESSES ILLOGICAL ILLOGICALLY ILLS ILLUMINATE ILLUMINATED ILLUMINATES ILLUMINATING ILLUMINATION ILLUMINATIONS ILLUSION ILLUSIONS ILLUSIVE ILLUSIVELY ILLUSORY ILLUSTRATE ILLUSTRATED ILLUSTRATES ILLUSTRATING ILLUSTRATION ILLUSTRATIONS ILLUSTRATIVE ILLUSTRATIVELY ILLUSTRATOR ILLUSTRATORS ILLUSTRIOUS ILLUSTRIOUSNESS ILLY ILONA ILYUSHIN IMAGE IMAGEN IMAGERY IMAGES IMAGINABLE IMAGINABLY IMAGINARY IMAGINATION IMAGINATIONS IMAGINATIVE IMAGINATIVELY IMAGINE IMAGINED IMAGINES IMAGING IMAGINING IMAGININGS IMBALANCE IMBALANCES IMBECILE IMBIBE IMBRIUM IMITATE IMITATED IMITATES IMITATING IMITATION IMITATIONS IMITATIVE IMMACULATE IMMACULATELY IMMATERIAL IMMATERIALLY IMMATURE IMMATURITY IMMEDIACIES IMMEDIACY IMMEDIATE IMMEDIATELY IMMEMORIAL IMMENSE IMMENSELY IMMERSE IMMERSED IMMERSES IMMERSION IMMIGRANT IMMIGRANTS IMMIGRATE IMMIGRATED IMMIGRATES IMMIGRATING IMMIGRATION IMMINENT IMMINENTLY IMMODERATE IMMODEST IMMORAL IMMORTAL IMMORTALITY IMMORTALLY IMMOVABILITY IMMOVABLE IMMOVABLY IMMUNE IMMUNITIES IMMUNITY IMMUNIZATION IMMUTABLE IMP IMPACT IMPACTED IMPACTING IMPACTION IMPACTOR IMPACTORS IMPACTS IMPAIR IMPAIRED IMPAIRING IMPAIRS IMPALE IMPART IMPARTED IMPARTIAL IMPARTIALLY IMPARTS IMPASSE IMPASSIVE IMPATIENCE IMPATIENT IMPATIENTLY IMPEACH IMPEACHABLE IMPEACHED IMPEACHMENT IMPECCABLE IMPEDANCE IMPEDANCES IMPEDE IMPEDED IMPEDES IMPEDIMENT IMPEDIMENTS IMPEDING IMPEL IMPELLED IMPELLING IMPEND IMPENDING IMPENETRABILITY IMPENETRABLE IMPENETRABLY IMPERATIVE IMPERATIVELY IMPERATIVES IMPERCEIVABLE IMPERCEPTIBLE IMPERFECT IMPERFECTION IMPERFECTIONS IMPERFECTLY IMPERIAL IMPERIALISM IMPERIALIST IMPERIALISTS IMPERIL IMPERILED IMPERIOUS IMPERIOUSLY IMPERMANENCE IMPERMANENT IMPERMEABLE IMPERMISSIBLE IMPERSONAL IMPERSONALLY IMPERSONATE IMPERSONATED IMPERSONATES IMPERSONATING IMPERSONATION IMPERSONATIONS IMPERTINENT IMPERTINENTLY IMPERVIOUS IMPERVIOUSLY IMPETUOUS IMPETUOUSLY IMPETUS IMPINGE IMPINGED IMPINGES IMPINGING IMPIOUS IMPLACABLE IMPLANT IMPLANTED IMPLANTING IMPLANTS IMPLAUSIBLE IMPLEMENT IMPLEMENTABLE IMPLEMENTATION IMPLEMENTATIONS IMPLEMENTED IMPLEMENTER IMPLEMENTING IMPLEMENTOR IMPLEMENTORS IMPLEMENTS IMPLICANT IMPLICANTS IMPLICATE IMPLICATED IMPLICATES IMPLICATING IMPLICATION IMPLICATIONS IMPLICIT IMPLICITLY IMPLICITNESS IMPLIED IMPLIES IMPLORE IMPLORED IMPLORING IMPLY IMPLYING IMPOLITE IMPORT IMPORTANCE IMPORTANT IMPORTANTLY IMPORTATION IMPORTED IMPORTER IMPORTERS IMPORTING IMPORTS IMPOSE IMPOSED IMPOSES IMPOSING IMPOSITION IMPOSITIONS IMPOSSIBILITIES IMPOSSIBILITY IMPOSSIBLE IMPOSSIBLY IMPOSTOR IMPOSTORS IMPOTENCE IMPOTENCY IMPOTENT IMPOUND IMPOVERISH IMPOVERISHED IMPOVERISHMENT IMPRACTICABLE IMPRACTICAL IMPRACTICALITY IMPRACTICALLY IMPRECISE IMPRECISELY IMPRECISION IMPREGNABLE IMPREGNATE IMPRESS IMPRESSED IMPRESSER IMPRESSES IMPRESSIBLE IMPRESSING IMPRESSION IMPRESSIONABLE IMPRESSIONIST IMPRESSIONISTIC IMPRESSIONS IMPRESSIVE IMPRESSIVELY IMPRESSIVENESS IMPRESSMENT IMPRIMATUR IMPRINT IMPRINTED IMPRINTING IMPRINTS IMPRISON IMPRISONED IMPRISONING IMPRISONMENT IMPRISONMENTS IMPRISONS IMPROBABILITY IMPROBABLE IMPROMPTU IMPROPER IMPROPERLY IMPROPRIETY IMPROVE IMPROVED IMPROVEMENT IMPROVEMENTS IMPROVES IMPROVING IMPROVISATION IMPROVISATIONAL IMPROVISATIONS IMPROVISE IMPROVISED IMPROVISER IMPROVISERS IMPROVISES IMPROVISING IMPRUDENT IMPS IMPUDENT IMPUDENTLY IMPUGN IMPULSE IMPULSES IMPULSION IMPULSIVE IMPUNITY IMPURE IMPURITIES IMPURITY IMPUTE IMPUTED INABILITY INACCESSIBLE INACCURACIES INACCURACY INACCURATE INACTION INACTIVATE INACTIVE INACTIVITY INADEQUACIES INADEQUACY INADEQUATE INADEQUATELY INADEQUATENESS INADMISSIBILITY INADMISSIBLE INADVERTENT INADVERTENTLY INADVISABLE INALIENABLE INALTERABLE INANE INANIMATE INANIMATELY INANNA INAPPLICABLE INAPPROACHABLE INAPPROPRIATE INAPPROPRIATENESS INASMUCH INATTENTION INAUDIBLE INAUGURAL INAUGURATE INAUGURATED INAUGURATING INAUGURATION INAUSPICIOUS INBOARD INBOUND INBREED INCA INCALCULABLE INCANDESCENT INCANTATION INCAPABLE INCAPACITATE INCAPACITATING INCARCERATE INCARNATION INCARNATIONS INCAS INCENDIARIES INCENDIARY INCENSE INCENSED INCENSES INCENTIVE INCENTIVES INCEPTION INCESSANT INCESSANTLY INCEST INCESTUOUS INCH INCHED INCHES INCHING INCIDENCE INCIDENT INCIDENTAL INCIDENTALLY INCIDENTALS INCIDENTS INCINERATE INCIPIENT INCISIVE INCITE INCITED INCITEMENT INCITES INCITING INCLEMENT INCLINATION INCLINATIONS INCLINE INCLINED INCLINES INCLINING INCLOSE INCLOSED INCLOSES INCLOSING INCLUDE INCLUDED INCLUDES INCLUDING INCLUSION INCLUSIONS INCLUSIVE INCLUSIVELY INCLUSIVENESS INCOHERENCE INCOHERENT INCOHERENTLY INCOME INCOMES INCOMING INCOMMENSURABLE INCOMMENSURATE INCOMMUNICABLE INCOMPARABLE INCOMPARABLY INCOMPATIBILITIES INCOMPATIBILITY INCOMPATIBLE INCOMPATIBLY INCOMPETENCE INCOMPETENT INCOMPETENTS INCOMPLETE INCOMPLETELY INCOMPLETENESS INCOMPREHENSIBILITY INCOMPREHENSIBLE INCOMPREHENSIBLY INCOMPREHENSION INCOMPRESSIBLE INCOMPUTABLE INCONCEIVABLE INCONCLUSIVE INCONGRUITY INCONGRUOUS INCONSEQUENTIAL INCONSEQUENTIALLY INCONSIDERABLE INCONSIDERATE INCONSIDERATELY INCONSIDERATENESS INCONSISTENCIES INCONSISTENCY INCONSISTENT INCONSISTENTLY INCONSPICUOUS INCONTESTABLE INCONTROVERTIBLE INCONTROVERTIBLY INCONVENIENCE INCONVENIENCED INCONVENIENCES INCONVENIENCING INCONVENIENT INCONVENIENTLY INCONVERTIBLE INCORPORATE INCORPORATED INCORPORATES INCORPORATING INCORPORATION INCORRECT INCORRECTLY INCORRECTNESS INCORRIGIBLE INCREASE INCREASED INCREASES INCREASING INCREASINGLY INCREDIBLE INCREDIBLY INCREDULITY INCREDULOUS INCREDULOUSLY INCREMENT INCREMENTAL INCREMENTALLY INCREMENTED INCREMENTER INCREMENTING INCREMENTS INCRIMINATE INCUBATE INCUBATED INCUBATES INCUBATING INCUBATION INCUBATOR INCUBATORS INCULCATE INCUMBENT INCUR INCURABLE INCURRED INCURRING INCURS INCURSION INDEBTED INDEBTEDNESS INDECENT INDECIPHERABLE INDECISION INDECISIVE INDEED INDEFATIGABLE INDEFENSIBLE INDEFINITE INDEFINITELY INDEFINITENESS INDELIBLE INDEMNIFY INDEMNITY INDENT INDENTATION INDENTATIONS INDENTED INDENTING INDENTS INDENTURE INDEPENDENCE INDEPENDENT INDEPENDENTLY INDESCRIBABLE INDESTRUCTIBLE INDETERMINACIES INDETERMINACY INDETERMINATE INDETERMINATELY INDEX INDEXABLE INDEXED INDEXES INDEXING INDIA INDIAN INDIANA INDIANAPOLIS INDIANS INDICATE INDICATED INDICATES INDICATING INDICATION INDICATIONS INDICATIVE INDICATOR INDICATORS INDICES INDICT INDICTMENT INDICTMENTS INDIES INDIFFERENCE INDIFFERENT INDIFFERENTLY INDIGENOUS INDIGENOUSLY INDIGENOUSNESS INDIGESTIBLE INDIGESTION INDIGNANT INDIGNANTLY INDIGNATION INDIGNITIES INDIGNITY INDIGO INDIRA INDIRECT INDIRECTED INDIRECTING INDIRECTION INDIRECTIONS INDIRECTLY INDIRECTS INDISCREET INDISCRETION INDISCRIMINATE INDISCRIMINATELY INDISPENSABILITY INDISPENSABLE INDISPENSABLY INDISPUTABLE INDISTINCT INDISTINGUISHABLE INDIVIDUAL INDIVIDUALISM INDIVIDUALISTIC INDIVIDUALITY INDIVIDUALIZE INDIVIDUALIZED INDIVIDUALIZES INDIVIDUALIZING INDIVIDUALLY INDIVIDUALS INDIVISIBILITY INDIVISIBLE INDO INDOCHINA INDOCHINESE INDOCTRINATE INDOCTRINATED INDOCTRINATES INDOCTRINATING INDOCTRINATION INDOEUROPEAN INDOLENT INDOLENTLY INDOMITABLE INDONESIA INDONESIAN INDOOR INDOORS INDUBITABLE INDUCE INDUCED INDUCEMENT INDUCEMENTS INDUCER INDUCES INDUCING INDUCT INDUCTANCE INDUCTANCES INDUCTED INDUCTEE INDUCTING INDUCTION INDUCTIONS INDUCTIVE INDUCTIVELY INDUCTOR INDUCTORS INDUCTS INDULGE INDULGED INDULGENCE INDULGENCES INDULGENT INDULGING INDUS INDUSTRIAL INDUSTRIALISM INDUSTRIALIST INDUSTRIALISTS INDUSTRIALIZATION INDUSTRIALIZED INDUSTRIALLY INDUSTRIALS INDUSTRIES INDUSTRIOUS INDUSTRIOUSLY INDUSTRIOUSNESS INDUSTRY INDY INEFFECTIVE INEFFECTIVELY INEFFECTIVENESS INEFFECTUAL INEFFICIENCIES INEFFICIENCY INEFFICIENT INEFFICIENTLY INELEGANT INELIGIBLE INEPT INEQUALITIES INEQUALITY INEQUITABLE INEQUITY INERT INERTIA INERTIAL INERTLY INERTNESS INESCAPABLE INESCAPABLY INESSENTIAL INESTIMABLE INEVITABILITIES INEVITABILITY INEVITABLE INEVITABLY INEXACT INEXCUSABLE INEXCUSABLY INEXHAUSTIBLE INEXORABLE INEXORABLY INEXPENSIVE INEXPENSIVELY INEXPERIENCE INEXPERIENCED INEXPLICABLE INFALLIBILITY INFALLIBLE INFALLIBLY INFAMOUS INFAMOUSLY INFAMY INFANCY INFANT INFANTILE INFANTRY INFANTRYMAN INFANTRYMEN INFANTS INFARCT INFATUATE INFEASIBLE INFECT INFECTED INFECTING INFECTION INFECTIONS INFECTIOUS INFECTIOUSLY INFECTIVE INFECTS INFER INFERENCE INFERENCES INFERENTIAL INFERIOR INFERIORITY INFERIORS INFERNAL INFERNALLY INFERNO INFERNOS INFERRED INFERRING INFERS INFERTILE INFEST INFESTED INFESTING INFESTS INFIDEL INFIDELITY INFIDELS INFIGHTING INFILTRATE INFINITE INFINITELY INFINITENESS INFINITESIMAL INFINITIVE INFINITIVES INFINITUDE INFINITUM INFINITY INFIRM INFIRMARY INFIRMITY INFIX INFLAME INFLAMED INFLAMMABLE INFLAMMATION INFLAMMATORY INFLATABLE INFLATE INFLATED INFLATER INFLATES INFLATING INFLATION INFLATIONARY INFLEXIBILITY INFLEXIBLE INFLICT INFLICTED INFLICTING INFLICTS INFLOW INFLUENCE INFLUENCED INFLUENCES INFLUENCING INFLUENTIAL INFLUENTIALLY INFLUENZA INFORM INFORMAL INFORMALITY INFORMALLY INFORMANT INFORMANTS INFORMATICA INFORMATION INFORMATIONAL INFORMATIVE INFORMATIVELY INFORMED INFORMER INFORMERS INFORMING INFORMS INFRA INFRARED INFRASTRUCTURE INFREQUENT INFREQUENTLY INFRINGE INFRINGED INFRINGEMENT INFRINGEMENTS INFRINGES INFRINGING INFURIATE INFURIATED INFURIATES INFURIATING INFURIATION INFUSE INFUSED INFUSES INFUSING INFUSION INFUSIONS INGENIOUS INGENIOUSLY INGENIOUSNESS INGENUITY INGENUOUS INGERSOLL INGEST INGESTION INGLORIOUS INGOT INGRAM INGRATE INGRATIATE INGRATITUDE INGREDIENT INGREDIENTS INGROWN INHABIT INHABITABLE INHABITANCE INHABITANT INHABITANTS INHABITED INHABITING INHABITS INHALE INHALED INHALER INHALES INHALING INHERE INHERENT INHERENTLY INHERES INHERIT INHERITABLE INHERITANCE INHERITANCES INHERITED INHERITING INHERITOR INHERITORS INHERITRESS INHERITRESSES INHERITRICES INHERITRIX INHERITS INHIBIT INHIBITED INHIBITING INHIBITION INHIBITIONS INHIBITOR INHIBITORS INHIBITORY INHIBITS INHOMOGENEITIES INHOMOGENEITY INHOMOGENEOUS INHOSPITABLE INHUMAN INHUMANE INIMICAL INIMITABLE INIQUITIES INIQUITY INITIAL INITIALED INITIALING INITIALIZATION INITIALIZATIONS INITIALIZE INITIALIZED INITIALIZER INITIALIZERS INITIALIZES INITIALIZING INITIALLY INITIALS INITIATE INITIATED INITIATES INITIATING INITIATION INITIATIONS INITIATIVE INITIATIVES INITIATOR INITIATORS INJECT INJECTED INJECTING INJECTION INJECTIONS INJECTIVE INJECTS INJUDICIOUS INJUN INJUNCTION INJUNCTIONS INJUNS INJURE INJURED INJURES INJURIES INJURING INJURIOUS INJURY INJUSTICE INJUSTICES INK INKED INKER INKERS INKING INKINGS INKLING INKLINGS INKS INLAID INLAND INLAY INLET INLETS INLINE INMAN INMATE INMATES INN INNARDS INNATE INNATELY INNER INNERMOST INNING INNINGS INNOCENCE INNOCENT INNOCENTLY INNOCENTS INNOCUOUS INNOCUOUSLY INNOCUOUSNESS INNOVATE INNOVATION INNOVATIONS INNOVATIVE INNS INNUENDO INNUMERABILITY INNUMERABLE INNUMERABLY INOCULATE INOPERABLE INOPERATIVE INOPPORTUNE INORDINATE INORDINATELY INORGANIC INPUT INPUTS INQUEST INQUIRE INQUIRED INQUIRER INQUIRERS INQUIRES INQUIRIES INQUIRING INQUIRY INQUISITION INQUISITIONS INQUISITIVE INQUISITIVELY INQUISITIVENESS INROAD INROADS INSANE INSANELY INSANITY INSATIABLE INSCRIBE INSCRIBED INSCRIBES INSCRIBING INSCRIPTION INSCRIPTIONS INSCRUTABLE INSECT INSECTICIDE INSECTS INSECURE INSECURELY INSEMINATE INSENSIBLE INSENSITIVE INSENSITIVELY INSENSITIVITY INSEPARABLE INSERT INSERTED INSERTING INSERTION INSERTIONS INSERTS INSET INSIDE INSIDER INSIDERS INSIDES INSIDIOUS INSIDIOUSLY INSIDIOUSNESS INSIGHT INSIGHTFUL INSIGHTS INSIGNIA INSIGNIFICANCE INSIGNIFICANT INSINCERE INSINCERITY INSINUATE INSINUATED INSINUATES INSINUATING INSINUATION INSINUATIONS INSIPID INSIST INSISTED INSISTENCE INSISTENT INSISTENTLY INSISTING INSISTS INSOFAR INSOLENCE INSOLENT INSOLENTLY INSOLUBLE INSOLVABLE INSOLVENT INSOMNIA INSOMNIAC INSPECT INSPECTED INSPECTING INSPECTION INSPECTIONS INSPECTOR INSPECTORS INSPECTS INSPIRATION INSPIRATIONS INSPIRE INSPIRED INSPIRER INSPIRES INSPIRING INSTABILITIES INSTABILITY INSTALL INSTALLATION INSTALLATIONS INSTALLED INSTALLER INSTALLERS INSTALLING INSTALLMENT INSTALLMENTS INSTALLS INSTANCE INSTANCES INSTANT INSTANTANEOUS INSTANTANEOUSLY INSTANTER INSTANTIATE INSTANTIATED INSTANTIATES INSTANTIATING INSTANTIATION INSTANTIATIONS INSTANTLY INSTANTS INSTEAD INSTIGATE INSTIGATED INSTIGATES INSTIGATING INSTIGATOR INSTIGATORS INSTILL INSTINCT INSTINCTIVE INSTINCTIVELY INSTINCTS INSTINCTUAL INSTITUTE INSTITUTED INSTITUTER INSTITUTERS INSTITUTES INSTITUTING INSTITUTION INSTITUTIONAL INSTITUTIONALIZE INSTITUTIONALIZED INSTITUTIONALIZES INSTITUTIONALIZING INSTITUTIONALLY INSTITUTIONS INSTRUCT INSTRUCTED INSTRUCTING INSTRUCTION INSTRUCTIONAL INSTRUCTIONS INSTRUCTIVE INSTRUCTIVELY INSTRUCTOR INSTRUCTORS INSTRUCTS INSTRUMENT INSTRUMENTAL INSTRUMENTALIST INSTRUMENTALISTS INSTRUMENTALLY INSTRUMENTALS INSTRUMENTATION INSTRUMENTED INSTRUMENTING INSTRUMENTS INSUBORDINATE INSUFFERABLE INSUFFICIENT INSUFFICIENTLY INSULAR INSULATE INSULATED INSULATES INSULATING INSULATION INSULATOR INSULATORS INSULIN INSULT INSULTED INSULTING INSULTS INSUPERABLE INSUPPORTABLE INSURANCE INSURE INSURED INSURER INSURERS INSURES INSURGENT INSURGENTS INSURING INSURMOUNTABLE INSURRECTION INSURRECTIONS INTACT INTANGIBLE INTANGIBLES INTEGER INTEGERS INTEGRABLE INTEGRAL INTEGRALS INTEGRAND INTEGRATE INTEGRATED INTEGRATES INTEGRATING INTEGRATION INTEGRATIONS INTEGRATIVE INTEGRITY INTEL INTELLECT INTELLECTS INTELLECTUAL INTELLECTUALLY INTELLECTUALS INTELLIGENCE INTELLIGENT INTELLIGENTLY INTELLIGENTSIA INTELLIGIBILITY INTELLIGIBLE INTELLIGIBLY INTELSAT INTEMPERATE INTEND INTENDED INTENDING INTENDS INTENSE INTENSELY INTENSIFICATION INTENSIFIED INTENSIFIER INTENSIFIERS INTENSIFIES INTENSIFY INTENSIFYING INTENSITIES INTENSITY INTENSIVE INTENSIVELY INTENT INTENTION INTENTIONAL INTENTIONALLY INTENTIONED INTENTIONS INTENTLY INTENTNESS INTENTS INTER INTERACT INTERACTED INTERACTING INTERACTION INTERACTIONS INTERACTIVE INTERACTIVELY INTERACTIVITY INTERACTS INTERCEPT INTERCEPTED INTERCEPTING INTERCEPTION INTERCEPTOR INTERCEPTS INTERCHANGE INTERCHANGEABILITY INTERCHANGEABLE INTERCHANGEABLY INTERCHANGED INTERCHANGER INTERCHANGES INTERCHANGING INTERCHANGINGS INTERCHANNEL INTERCITY INTERCOM INTERCOMMUNICATE INTERCOMMUNICATED INTERCOMMUNICATES INTERCOMMUNICATING INTERCOMMUNICATION INTERCONNECT INTERCONNECTED INTERCONNECTING INTERCONNECTION INTERCONNECTIONS INTERCONNECTS INTERCONTINENTAL INTERCOURSE INTERDATA INTERDEPENDENCE INTERDEPENDENCIES INTERDEPENDENCY INTERDEPENDENT INTERDICT INTERDICTION INTERDISCIPLINARY INTEREST INTERESTED INTERESTING INTERESTINGLY INTERESTS INTERFACE INTERFACED INTERFACER INTERFACES INTERFACING INTERFERE INTERFERED INTERFERENCE INTERFERENCES INTERFERES INTERFERING INTERFERINGLY INTERFEROMETER INTERFEROMETRIC INTERFEROMETRY INTERFRAME INTERGROUP INTERIM INTERIOR INTERIORS INTERJECT INTERLACE INTERLACED INTERLACES INTERLACING INTERLEAVE INTERLEAVED INTERLEAVES INTERLEAVING INTERLINK INTERLINKED INTERLINKS INTERLISP INTERMEDIARY INTERMEDIATE INTERMEDIATES INTERMINABLE INTERMINGLE INTERMINGLED INTERMINGLES INTERMINGLING INTERMISSION INTERMITTENT INTERMITTENTLY INTERMIX INTERMIXED INTERMODULE INTERN INTERNAL INTERNALIZE INTERNALIZED INTERNALIZES INTERNALIZING INTERNALLY INTERNALS INTERNATIONAL INTERNATIONALITY INTERNATIONALLY INTERNED INTERNET INTERNET INTERNETWORK INTERNING INTERNS INTERNSHIP INTEROFFICE INTERPERSONAL INTERPLAY INTERPOL INTERPOLATE INTERPOLATED INTERPOLATES INTERPOLATING INTERPOLATION INTERPOLATIONS INTERPOSE INTERPOSED INTERPOSES INTERPOSING INTERPRET INTERPRETABLE INTERPRETATION INTERPRETATIONS INTERPRETED INTERPRETER INTERPRETERS INTERPRETING INTERPRETIVE INTERPRETIVELY INTERPRETS INTERPROCESS INTERRELATE INTERRELATED INTERRELATES INTERRELATING INTERRELATION INTERRELATIONS INTERRELATIONSHIP INTERRELATIONSHIPS INTERROGATE INTERROGATED INTERROGATES INTERROGATING INTERROGATION INTERROGATIONS INTERROGATIVE INTERRUPT INTERRUPTED INTERRUPTIBLE INTERRUPTING INTERRUPTION INTERRUPTIONS INTERRUPTIVE INTERRUPTS INTERSECT INTERSECTED INTERSECTING INTERSECTION INTERSECTIONS INTERSECTS INTERSPERSE INTERSPERSED INTERSPERSES INTERSPERSING INTERSPERSION INTERSTAGE INTERSTATE INTERTWINE INTERTWINED INTERTWINES INTERTWINING INTERVAL INTERVALS INTERVENE INTERVENED INTERVENES INTERVENING INTERVENTION INTERVENTIONS INTERVIEW INTERVIEWED INTERVIEWEE INTERVIEWER INTERVIEWERS INTERVIEWING INTERVIEWS INTERWOVEN INTESTATE INTESTINAL INTESTINE INTESTINES INTIMACY INTIMATE INTIMATED INTIMATELY INTIMATING INTIMATION INTIMATIONS INTIMIDATE INTIMIDATED INTIMIDATES INTIMIDATING INTIMIDATION INTO INTOLERABLE INTOLERABLY INTOLERANCE INTOLERANT INTONATION INTONATIONS INTONE INTOXICANT INTOXICATE INTOXICATED INTOXICATING INTOXICATION INTRACTABILITY INTRACTABLE INTRACTABLY INTRAGROUP INTRALINE INTRAMURAL INTRAMUSCULAR INTRANSIGENT INTRANSITIVE INTRANSITIVELY INTRAOFFICE INTRAPROCESS INTRASTATE INTRAVENOUS INTREPID INTRICACIES INTRICACY INTRICATE INTRICATELY INTRIGUE INTRIGUED INTRIGUES INTRIGUING INTRINSIC INTRINSICALLY INTRODUCE INTRODUCED INTRODUCES INTRODUCING INTRODUCTION INTRODUCTIONS INTRODUCTORY INTROSPECT INTROSPECTION INTROSPECTIONS INTROSPECTIVE INTROVERT INTROVERTED INTRUDE INTRUDED INTRUDER INTRUDERS INTRUDES INTRUDING INTRUSION INTRUSIONS INTRUST INTUBATE INTUBATED INTUBATES INTUBATION INTUITION INTUITIONIST INTUITIONS INTUITIVE INTUITIVELY INUNDATE INVADE INVADED INVADER INVADERS INVADES INVADING INVALID INVALIDATE INVALIDATED INVALIDATES INVALIDATING INVALIDATION INVALIDATIONS INVALIDITIES INVALIDITY INVALIDLY INVALIDS INVALUABLE INVARIABLE INVARIABLY INVARIANCE INVARIANT INVARIANTLY INVARIANTS INVASION INVASIONS INVECTIVE INVENT INVENTED INVENTING INVENTION INVENTIONS INVENTIVE INVENTIVELY INVENTIVENESS INVENTOR INVENTORIES INVENTORS INVENTORY INVENTS INVERNESS INVERSE INVERSELY INVERSES INVERSION INVERSIONS INVERT INVERTEBRATE INVERTEBRATES INVERTED INVERTER INVERTERS INVERTIBLE INVERTING INVERTS INVEST INVESTED INVESTIGATE INVESTIGATED INVESTIGATES INVESTIGATING INVESTIGATION INVESTIGATIONS INVESTIGATIVE INVESTIGATOR INVESTIGATORS INVESTIGATORY INVESTING INVESTMENT INVESTMENTS INVESTOR INVESTORS INVESTS INVETERATE INVIGORATE INVINCIBLE INVISIBILITY INVISIBLE INVISIBLY INVITATION INVITATIONS INVITE INVITED INVITES INVITING INVOCABLE INVOCATION INVOCATIONS INVOICE INVOICED INVOICES INVOICING INVOKE INVOKED INVOKER INVOKES INVOKING INVOLUNTARILY INVOLUNTARY INVOLVE INVOLVED INVOLVEMENT INVOLVEMENTS INVOLVES INVOLVING INWARD INWARDLY INWARDNESS INWARDS IODINE ION IONIAN IONIANS IONICIZATION IONICIZATIONS IONICIZE IONICIZES IONOSPHERE IONOSPHERIC IONS IOTA IOWA IRA IRAN IRANIAN IRANIANS IRANIZE IRANIZES IRAQ IRAQI IRAQIS IRATE IRATELY IRATENESS IRE IRELAND IRENE IRES IRIS IRISH IRISHIZE IRISHIZES IRISHMAN IRISHMEN IRK IRKED IRKING IRKS IRKSOME IRMA IRON IRONED IRONIC IRONICAL IRONICALLY IRONIES IRONING IRONINGS IRONS IRONY IROQUOIS IRRADIATE IRRATIONAL IRRATIONALLY IRRATIONALS IRRAWADDY IRRECONCILABLE IRRECOVERABLE IRREDUCIBLE IRREDUCIBLY IRREFLEXIVE IRREFUTABLE IRREGULAR IRREGULARITIES IRREGULARITY IRREGULARLY IRREGULARS IRRELEVANCE IRRELEVANCES IRRELEVANT IRRELEVANTLY IRREPLACEABLE IRREPRESSIBLE IRREPRODUCIBILITY IRREPRODUCIBLE IRRESISTIBLE IRRESPECTIVE IRRESPECTIVELY IRRESPONSIBLE IRRESPONSIBLY IRRETRIEVABLY IRREVERENT IRREVERSIBILITY IRREVERSIBLE IRREVERSIBLY IRREVOCABLE IRREVOCABLY IRRIGATE IRRIGATED IRRIGATES IRRIGATING IRRIGATION IRRITABLE IRRITANT IRRITATE IRRITATED IRRITATES IRRITATING IRRITATION IRRITATIONS IRVIN IRVINE IRVING IRWIN ISAAC ISAACS ISAACSON ISABEL ISABELLA ISADORE ISAIAH ISFAHAN ISING ISIS ISLAM ISLAMABAD ISLAMIC ISLAMIZATION ISLAMIZATIONS ISLAMIZE ISLAMIZES ISLAND ISLANDER ISLANDERS ISLANDIA ISLANDS ISLE ISLES ISLET ISLETS ISOLATE ISOLATED ISOLATES ISOLATING ISOLATION ISOLATIONS ISOLDE ISOMETRIC ISOMORPHIC ISOMORPHICALLY ISOMORPHISM ISOMORPHISMS ISOTOPE ISOTOPES ISRAEL ISRAELI ISRAELIS ISRAELITE ISRAELITES ISRAELITIZE ISRAELITIZES ISSUANCE ISSUE ISSUED ISSUER ISSUERS ISSUES ISSUING ISTANBUL ISTHMUS ISTVAN ITALIAN ITALIANIZATION ITALIANIZATIONS ITALIANIZE ITALIANIZER ITALIANIZERS ITALIANIZES ITALIANS ITALIC ITALICIZE ITALICIZED ITALICS ITALY ITCH ITCHES ITCHING ITEL ITEM ITEMIZATION ITEMIZATIONS ITEMIZE ITEMIZED ITEMIZES ITEMIZING ITEMS ITERATE ITERATED ITERATES ITERATING ITERATION ITERATIONS ITERATIVE ITERATIVELY ITERATOR ITERATORS ITHACA ITHACAN ITINERARIES ITINERARY ITO ITS ITSELF IVAN IVANHOE IVERSON IVIES IVORY IVY IZAAK IZVESTIA JAB JABBED JABBING JABLONSKY JABS JACK JACKASS JACKET JACKETED JACKETS JACKIE JACKING JACKKNIFE JACKMAN JACKPOT JACKSON JACKSONIAN JACKSONS JACKSONVILLE JACKY JACOB JACOBEAN JACOBI JACOBIAN JACOBINIZE JACOBITE JACOBS JACOBSEN JACOBSON JACOBUS JACOBY JACQUELINE JACQUES JADE JADED JAEGER JAGUAR JAIL JAILED JAILER JAILERS JAILING JAILS JAIME JAKARTA JAKE JAKES JAM JAMAICA JAMAICAN JAMES JAMESON JAMESTOWN JAMMED JAMMING JAMS JANE JANEIRO JANESVILLE JANET JANICE JANIS JANITOR JANITORS JANOS JANSEN JANSENIST JANUARIES JANUARY JANUS JAPAN JAPANESE JAPANIZATION JAPANIZATIONS JAPANIZE JAPANIZED JAPANIZES JAPANIZING JAR JARGON JARRED JARRING JARRINGLY JARS JARVIN JASON JASTROW JAUNDICE JAUNT JAUNTINESS JAUNTS JAUNTY JAVA JAVANESE JAVELIN JAVELINS JAW JAWBONE JAWS JAY JAYCEE JAYCEES JAZZ JAZZY JEALOUS JEALOUSIES JEALOUSLY JEALOUSY JEAN JEANNE JEANNIE JEANS JED JEEP JEEPS JEER JEERS JEFF JEFFERSON JEFFERSONIAN JEFFERSONIANS JEFFREY JEHOVAH JELLIES JELLO JELLY JELLYFISH JENKINS JENNIE JENNIFER JENNINGS JENNY JENSEN JEOPARDIZE JEOPARDIZED JEOPARDIZES JEOPARDIZING JEOPARDY JEREMIAH JEREMY JERES JERICHO JERK JERKED JERKINESS JERKING JERKINGS JERKS JERKY JEROBOAM JEROME JERRY JERSEY JERSEYS JERUSALEM JESSE JESSICA JESSIE JESSY JEST JESTED JESTER JESTING JESTS JESUIT JESUITISM JESUITIZE JESUITIZED JESUITIZES JESUITIZING JESUITS JESUS JET JETLINER JETS JETTED JETTING JEW JEWEL JEWELED JEWELER JEWELL JEWELLED JEWELRIES JEWELRY JEWELS JEWETT JEWISH JEWISHNESS JEWS JIFFY JIG JIGS JIGSAW JILL JIM JIMENEZ JIMMIE JINGLE JINGLED JINGLING JINNY JITTER JITTERBUG JITTERY JOAN JOANNA JOANNE JOAQUIN JOB JOBREL JOBS JOCKEY JOCKSTRAP JOCUND JODY JOE JOEL JOES JOG JOGGING JOGS JOHANN JOHANNA JOHANNES JOHANNESBURG JOHANSEN JOHANSON JOHN JOHNNIE JOHNNY JOHNS JOHNSEN JOHNSON JOHNSTON JOHNSTOWN JOIN JOINED JOINER JOINERS JOINING JOINS JOINT JOINTLY JOINTS JOKE JOKED JOKER JOKERS JOKES JOKING JOKINGLY JOLIET JOLLA JOLLY JOLT JOLTED JOLTING JOLTS JON JONAS JONATHAN JONATHANIZATION JONATHANIZATIONS JONES JONESES JONQUIL JOPLIN JORDAN JORDANIAN JORGE JORGENSEN JORGENSON JOSE JOSEF JOSEPH JOSEPHINE JOSEPHSON JOSEPHUS JOSHUA JOSIAH JOSTLE JOSTLED JOSTLES JOSTLING JOT JOTS JOTTED JOTTING JOULE JOURNAL JOURNALISM JOURNALIST JOURNALISTS JOURNALIZE JOURNALIZED JOURNALIZES JOURNALIZING JOURNALS JOURNEY JOURNEYED JOURNEYING JOURNEYINGS JOURNEYMAN JOURNEYMEN JOURNEYS JOUST JOUSTED JOUSTING JOUSTS JOVANOVICH JOVE JOVIAL JOVIAN JOY JOYCE JOYFUL JOYFULLY JOYOUS JOYOUSLY JOYOUSNESS JOYRIDE JOYS JOYSTICK JUAN JUANITA JUBAL JUBILEE JUDAICA JUDAISM JUDAS JUDD JUDDER JUDDERED JUDDERING JUDDERS JUDE JUDEA JUDGE JUDGED JUDGES JUDGING JUDGMENT JUDGMENTS JUDICIAL JUDICIARY JUDICIOUS JUDICIOUSLY JUDITH JUDO JUDSON JUDY JUG JUGGLE JUGGLER JUGGLERS JUGGLES JUGGLING JUGOSLAVIA JUGS JUICE JUICES JUICIEST JUICY JUKES JULES JULIA JULIAN JULIE JULIES JULIET JULIO JULIUS JULY JUMBLE JUMBLED JUMBLES JUMBO JUMP JUMPED JUMPER JUMPERS JUMPING JUMPS JUMPY JUNCTION JUNCTIONS JUNCTURE JUNCTURES JUNE JUNEAU JUNES JUNG JUNGIAN JUNGLE JUNGLES JUNIOR JUNIORS JUNIPER JUNK JUNKER JUNKERS JUNKS JUNKY JUNO JUNTA JUPITER JURA JURAS JURASSIC JURE JURIES JURISDICTION JURISDICTIONS JURISPRUDENCE JURIST JUROR JURORS JURY JUST JUSTICE JUSTICES JUSTIFIABLE JUSTIFIABLY JUSTIFICATION JUSTIFICATIONS JUSTIFIED JUSTIFIER JUSTIFIERS JUSTIFIES JUSTIFY JUSTIFYING JUSTINE JUSTINIAN JUSTLY JUSTNESS JUT JUTISH JUTLAND JUTTING JUVENILE JUVENILES JUXTAPOSE JUXTAPOSED JUXTAPOSES JUXTAPOSING KABUKI KABUL KADDISH KAFKA KAFKAESQUE KAHN KAJAR KALAMAZOO KALI KALMUK KAMCHATKA KAMIKAZE KAMIKAZES KAMPALA KAMPUCHEA KANARESE KANE KANGAROO KANJI KANKAKEE KANNADA KANSAS KANT KANTIAN KAPLAN KAPPA KARACHI KARAMAZOV KARATE KAREN KARL KAROL KARP KASHMIR KASKASKIA KATE KATHARINE KATHERINE KATHLEEN KATHY KATIE KATMANDU KATOWICE KATZ KAUFFMAN KAUFMAN KAY KEATON KEATS KEEGAN KEEL KEELED KEELING KEELS KEEN KEENAN KEENER KEENEST KEENLY KEENNESS KEEP KEEPER KEEPERS KEEPING KEEPS KEITH KELLER KELLEY KELLOGG KELLY KELSEY KELVIN KEMP KEN KENDALL KENILWORTH KENNAN KENNECOTT KENNEDY KENNEL KENNELS KENNETH KENNEY KENNING KENNY KENOSHA KENSINGTON KENT KENTON KENTUCKY KENYA KENYON KEPLER KEPT KERCHIEF KERCHIEFS KERMIT KERN KERNEL KERNELS KERNIGHAN KEROSENE KEROUAC KERR KESSLER KETCHUP KETTERING KETTLE KETTLES KEVIN KEWASKUM KEWAUNEE KEY KEYBOARD KEYBOARDS KEYED KEYES KEYHOLE KEYING KEYNES KEYNESIAN KEYNOTE KEYPAD KEYPADS KEYS KEYSTROKE KEYSTROKES KEYWORD KEYWORDS KHARTOUM KHMER KHRUSHCHEV KHRUSHCHEVS KICK KICKAPOO KICKED KICKER KICKERS KICKING KICKOFF KICKS KID KIDDE KIDDED KIDDIE KIDDING KIDNAP KIDNAPPER KIDNAPPERS KIDNAPPING KIDNAPPINGS KIDNAPS KIDNEY KIDNEYS KIDS KIEFFER KIEL KIEV KIEWIT KIGALI KIKUYU KILGORE KILIMANJARO KILL KILLEBREW KILLED KILLER KILLERS KILLING KILLINGLY KILLINGS KILLJOY KILLS KILOBIT KILOBITS KILOBLOCK KILOBYTE KILOBYTES KILOGRAM KILOGRAMS KILOHERTZ KILOHM KILOJOULE KILOMETER KILOMETERS KILOTON KILOVOLT KILOWATT KILOWORD KIM KIMBALL KIMBERLY KIMONO KIN KIND KINDER KINDERGARTEN KINDEST KINDHEARTED KINDLE KINDLED KINDLES KINDLING KINDLY KINDNESS KINDRED KINDS KINETIC KING KINGDOM KINGDOMS KINGLY KINGPIN KINGS KINGSBURY KINGSLEY KINGSTON KINGSTOWN KINGWOOD KINK KINKY KINNEY KINNICKINNIC KINSEY KINSHASHA KINSHIP KINSMAN KIOSK KIOWA KIPLING KIRBY KIRCHNER KIRCHOFF KIRK KIRKLAND KIRKPATRICK KIRKWOOD KIROV KISS KISSED KISSER KISSERS KISSES KISSING KIT KITAKYUSHU KITCHEN KITCHENETTE KITCHENS KITE KITED KITES KITING KITS KITTEN KITTENISH KITTENS KITTY KIWANIS KLAN KLAUS KLAXON KLEIN KLEINROCK KLINE KLUDGE KLUDGES KLUX KLYSTRON KNACK KNAPP KNAPSACK KNAPSACKS KNAUER KNAVE KNAVES KNEAD KNEADS KNEE KNEECAP KNEED KNEEING KNEEL KNEELED KNEELING KNEELS KNEES KNELL KNELLS KNELT KNEW KNICKERBOCKER KNICKERBOCKERS KNIFE KNIFED KNIFES KNIFING KNIGHT KNIGHTED KNIGHTHOOD KNIGHTING KNIGHTLY KNIGHTS KNIGHTSBRIDGE KNIT KNITS KNIVES KNOB KNOBELOCH KNOBS KNOCK KNOCKDOWN KNOCKED KNOCKER KNOCKERS KNOCKING KNOCKOUT KNOCKS KNOLL KNOLLS KNOSSOS KNOT KNOTS KNOTT KNOTTED KNOTTING KNOW KNOWABLE KNOWER KNOWHOW KNOWING KNOWINGLY KNOWLEDGE KNOWLEDGEABLE KNOWLES KNOWLTON KNOWN KNOWS KNOX KNOXVILLE KNUCKLE KNUCKLED KNUCKLES KNUDSEN KNUDSON KNUTH KNUTSEN KNUTSON KOALA KOBAYASHI KOCH KOCHAB KODACHROME KODAK KODIAK KOENIG KOENIGSBERG KOHLER KONG KONRAD KOPPERS KORAN KOREA KOREAN KOREANS KOSHER KOVACS KOWALEWSKI KOWALSKI KOWLOON KOWTOW KRAEMER KRAKATOA KRAKOW KRAMER KRAUSE KREBS KREMLIN KRESGE KRIEGER KRISHNA KRISTIN KRONECKER KRUEGER KRUGER KRUSE KUALA KUDO KUENNING KUHN KUMAR KURD KURDISH KURT KUWAIT KUWAITI KYOTO LAB LABAN LABEL LABELED LABELING LABELLED LABELLER LABELLERS LABELLING LABELS LABOR LABORATORIES LABORATORY LABORED LABORER LABORERS LABORING LABORINGS LABORIOUS LABORIOUSLY LABORS LABRADOR LABS LABYRINTH LABYRINTHS LAC LACE LACED LACERATE LACERATED LACERATES LACERATING LACERATION LACERATIONS LACERTA LACES LACEY LACHESIS LACING LACK LACKAWANNA LACKED LACKEY LACKING LACKS LACQUER LACQUERED LACQUERS LACROSSE LACY LAD LADDER LADEN LADIES LADING LADLE LADS LADY LADYLIKE LAFAYETTE LAG LAGER LAGERS LAGOON LAGOONS LAGOS LAGRANGE LAGRANGIAN LAGS LAGUERRE LAGUNA LAHORE LAID LAIDLAW LAIN LAIR LAIRS LAISSEZ LAKE LAKEHURST LAKES LAKEWOOD LAMAR LAMARCK LAMB LAMBDA LAMBDAS LAMBERT LAMBS LAME LAMED LAMELY LAMENESS LAMENT LAMENTABLE LAMENTATION LAMENTATIONS LAMENTED LAMENTING LAMENTS LAMES LAMINAR LAMING LAMP LAMPLIGHT LAMPOON LAMPORT LAMPREY LAMPS LANA LANCASHIRE LANCASTER LANCE LANCED LANCELOT LANCER LANCES LAND LANDED LANDER LANDERS LANDFILL LANDING LANDINGS LANDIS LANDLADIES LANDLADY LANDLORD LANDLORDS LANDMARK LANDMARKS LANDOWNER LANDOWNERS LANDS LANDSCAPE LANDSCAPED LANDSCAPES LANDSCAPING LANDSLIDE LANDWEHR LANE LANES LANG LANGE LANGELAND LANGFORD LANGLEY LANGMUIR LANGUAGE LANGUAGES LANGUID LANGUIDLY LANGUIDNESS LANGUISH LANGUISHED LANGUISHES LANGUISHING LANKA LANSING LANTERN LANTERNS LAO LAOCOON LAOS LAOTIAN LAOTIANS LAP LAPEL LAPELS LAPLACE LAPLACIAN LAPPING LAPS LAPSE LAPSED LAPSES LAPSING LARAMIE LARD LARDER LAREDO LARES LARGE LARGELY LARGENESS LARGER LARGEST LARK LARKIN LARKS LARRY LARS LARSEN LARSON LARVA LARVAE LARYNX LASCIVIOUS LASER LASERS LASH LASHED LASHES LASHING LASHINGS LASS LASSES LASSO LAST LASTED LASTING LASTLY LASTS LASZLO LATCH LATCHED LATCHES LATCHING LATE LATELY LATENCY LATENESS LATENT LATER LATERAL LATERALLY LATERAN LATEST LATEX LATHE LATHROP LATIN LATINATE LATINITY LATINIZATION LATINIZATIONS LATINIZE LATINIZED LATINIZER LATINIZERS LATINIZES LATINIZING LATITUDE LATITUDES LATRINE LATRINES LATROBE LATTER LATTERLY LATTICE LATTICES LATTIMER LATVIA LAUDABLE LAUDERDALE LAUE LAUGH LAUGHABLE LAUGHABLY LAUGHED LAUGHING LAUGHINGLY LAUGHINGSTOCK LAUGHLIN LAUGHS LAUGHTER LAUNCH LAUNCHED LAUNCHER LAUNCHES LAUNCHING LAUNCHINGS LAUNDER LAUNDERED LAUNDERER LAUNDERING LAUNDERINGS LAUNDERS LAUNDROMAT LAUNDROMATS LAUNDRY LAUREATE LAUREL LAURELS LAUREN LAURENCE LAURENT LAURENTIAN LAURIE LAUSANNE LAVA LAVATORIES LAVATORY LAVENDER LAVISH LAVISHED LAVISHING LAVISHLY LAVOISIER LAW LAWBREAKER LAWFORD LAWFUL LAWFULLY LAWGIVER LAWLESS LAWLESSNESS LAWN LAWNS LAWRENCE LAWRENCEVILLE LAWS LAWSON LAWSUIT LAWSUITS LAWYER LAWYERS LAX LAXATIVE LAY LAYER LAYERED LAYERING LAYERS LAYING LAYMAN LAYMEN LAYOFF LAYOFFS LAYOUT LAYOUTS LAYS LAYTON LAZARUS LAZED LAZIER LAZIEST LAZILY LAZINESS LAZING LAZY LAZYBONES LEAD LEADED LEADEN LEADER LEADERS LEADERSHIP LEADERSHIPS LEADING LEADINGS LEADS LEAF LEAFED LEAFIEST LEAFING LEAFLESS LEAFLET LEAFLETS LEAFY LEAGUE LEAGUED LEAGUER LEAGUERS LEAGUES LEAK LEAKAGE LEAKAGES LEAKED LEAKING LEAKS LEAKY LEAN LEANDER LEANED LEANER LEANEST LEANING LEANNESS LEANS LEAP LEAPED LEAPFROG LEAPING LEAPS LEAPT LEAR LEARN LEARNED LEARNER LEARNERS LEARNING LEARNS LEARY LEASE LEASED LEASES LEASH LEASHES LEASING LEAST LEATHER LEATHERED LEATHERN LEATHERNECK LEATHERS LEAVE LEAVED LEAVEN LEAVENED LEAVENING LEAVENWORTH LEAVES LEAVING LEAVINGS LEBANESE LEBANON LEBESGUE LECHERY LECTURE LECTURED LECTURER LECTURERS LECTURES LECTURING LED LEDGE LEDGER LEDGERS LEDGES LEE LEECH LEECHES LEEDS LEEK LEER LEERY LEES LEEUWENHOEK LEEWARD LEEWAY LEFT LEFTIST LEFTISTS LEFTMOST LEFTOVER LEFTOVERS LEFTWARD LEG LEGACIES LEGACY LEGAL LEGALITY LEGALIZATION LEGALIZE LEGALIZED LEGALIZES LEGALIZING LEGALLY LEGEND LEGENDARY LEGENDRE LEGENDS LEGER LEGERS LEGGED LEGGINGS LEGIBILITY LEGIBLE LEGIBLY LEGION LEGIONS LEGISLATE LEGISLATED LEGISLATES LEGISLATING LEGISLATION LEGISLATIVE LEGISLATOR LEGISLATORS LEGISLATURE LEGISLATURES LEGITIMACY LEGITIMATE LEGITIMATELY LEGS LEGUME LEHIGH LEHMAN LEIBNIZ LEIDEN LEIGH LEIGHTON LEILA LEIPZIG LEISURE LEISURELY LELAND LEMKE LEMMA LEMMAS LEMMING LEMMINGS LEMON LEMONADE LEMONS LEMUEL LEN LENA LEND LENDER LENDERS LENDING LENDS LENGTH LENGTHEN LENGTHENED LENGTHENING LENGTHENS LENGTHLY LENGTHS LENGTHWISE LENGTHY LENIENCY LENIENT LENIENTLY LENIN LENINGRAD LENINISM LENINIST LENNOX LENNY LENORE LENS LENSES LENT LENTEN LENTIL LENTILS LEO LEON LEONA LEONARD LEONARDO LEONE LEONID LEOPARD LEOPARDS LEOPOLD LEOPOLDVILLE LEPER LEPROSY LEROY LESBIAN LESBIANS LESLIE LESOTHO LESS LESSEN LESSENED LESSENING LESSENS LESSER LESSON LESSONS LESSOR LEST LESTER LET LETHAL LETHE LETITIA LETS LETTER LETTERED LETTERER LETTERHEAD LETTERING LETTERS LETTING LETTUCE LEUKEMIA LEV LEVEE LEVEES LEVEL LEVELED LEVELER LEVELING LEVELLED LEVELLER LEVELLEST LEVELLING LEVELLY LEVELNESS LEVELS LEVER LEVERAGE LEVERS LEVI LEVIABLE LEVIED LEVIES LEVIN LEVINE LEVIS LEVITICUS LEVITT LEVITY LEVY LEVYING LEW LEWD LEWDLY LEWDNESS LEWELLYN LEXICAL LEXICALLY LEXICOGRAPHIC LEXICOGRAPHICAL LEXICOGRAPHICALLY LEXICON LEXICONS LEXINGTON LEYDEN LIABILITIES LIABILITY LIABLE LIAISON LIAISONS LIAR LIARS LIBEL LIBELOUS LIBERACE LIBERAL LIBERALIZE LIBERALIZED LIBERALIZES LIBERALIZING LIBERALLY LIBERALS LIBERATE LIBERATED LIBERATES LIBERATING LIBERATION LIBERATOR LIBERATORS LIBERIA LIBERTARIAN LIBERTIES LIBERTY LIBIDO LIBRARIAN LIBRARIANS LIBRARIES LIBRARY LIBRETTO LIBREVILLE LIBYA LIBYAN LICE LICENSE LICENSED LICENSEE LICENSES LICENSING LICENSOR LICENTIOUS LICHEN LICHENS LICHTER LICK LICKED LICKING LICKS LICORICE LID LIDS LIE LIEBERMAN LIECHTENSTEIN LIED LIEGE LIEN LIENS LIES LIEU LIEUTENANT LIEUTENANTS LIFE LIFEBLOOD LIFEBOAT LIFEGUARD LIFELESS LIFELESSNESS LIFELIKE LIFELONG LIFER LIFESPAN LIFESTYLE LIFESTYLES LIFETIME LIFETIMES LIFT LIFTED LIFTER LIFTERS LIFTING LIFTS LIGAMENT LIGATURE LIGGET LIGGETT LIGHT LIGHTED LIGHTEN LIGHTENS LIGHTER LIGHTERS LIGHTEST LIGHTFACE LIGHTHEARTED LIGHTHOUSE LIGHTHOUSES LIGHTING LIGHTLY LIGHTNESS LIGHTNING LIGHTNINGS LIGHTS LIGHTWEIGHT LIKE LIKED LIKELIER LIKELIEST LIKELIHOOD LIKELIHOODS LIKELINESS LIKELY LIKEN LIKENED LIKENESS LIKENESSES LIKENING LIKENS LIKES LIKEWISE LIKING LILA LILAC LILACS LILIAN LILIES LILLIAN LILLIPUT LILLIPUTIAN LILLIPUTIANIZE LILLIPUTIANIZES LILLY LILY LIMA LIMAN LIMB LIMBER LIMBO LIMBS LIME LIMELIGHT LIMERICK LIMES LIMESTONE LIMIT LIMITABILITY LIMITABLY LIMITATION LIMITATIONS LIMITED LIMITER LIMITERS LIMITING LIMITLESS LIMITS LIMOUSINE LIMP LIMPED LIMPING LIMPLY LIMPNESS LIMPS LIN LINCOLN LIND LINDA LINDBERG LINDBERGH LINDEN LINDHOLM LINDQUIST LINDSAY LINDSEY LINDSTROM LINDY LINE LINEAR LINEARITIES LINEARITY LINEARIZABLE LINEARIZE LINEARIZED LINEARIZES LINEARIZING LINEARLY LINED LINEN LINENS LINER LINERS LINES LINEUP LINGER LINGERED LINGERIE LINGERING LINGERS LINGO LINGUA LINGUIST LINGUISTIC LINGUISTICALLY LINGUISTICS LINGUISTS LINING LININGS LINK LINKAGE LINKAGES LINKED LINKER LINKERS LINKING LINKS LINNAEUS LINOLEUM LINOTYPE LINSEED LINT LINTON LINUS LINUX LION LIONEL LIONESS LIONESSES LIONS LIP LIPPINCOTT LIPS LIPSCHITZ LIPSCOMB LIPSTICK LIPTON LIQUID LIQUIDATE LIQUIDATION LIQUIDATIONS LIQUIDITY LIQUIDS LIQUOR LIQUORS LISA LISBON LISE LISP LISPED LISPING LISPS LISS LISSAJOUS LIST LISTED LISTEN LISTENED LISTENER LISTENERS LISTENING LISTENS LISTER LISTERIZE LISTERIZES LISTERS LISTING LISTINGS LISTLESS LISTON LISTS LIT LITANY LITER LITERACY LITERAL LITERALLY LITERALNESS LITERALS LITERARY LITERATE LITERATURE LITERATURES LITERS LITHE LITHOGRAPH LITHOGRAPHY LITHUANIA LITHUANIAN LITIGANT LITIGATE LITIGATION LITIGIOUS LITMUS LITTER LITTERBUG LITTERED LITTERING LITTERS LITTLE LITTLENESS LITTLER LITTLEST LITTLETON LITTON LIVABLE LIVABLY LIVE LIVED LIVELIHOOD LIVELY LIVENESS LIVER LIVERIED LIVERMORE LIVERPOOL LIVERPUDLIAN LIVERS LIVERY LIVES LIVESTOCK LIVID LIVING LIVINGSTON LIZ LIZARD LIZARDS LIZZIE LIZZY LLOYD LOAD LOADED LOADER LOADERS LOADING LOADINGS LOADS LOAF LOAFED LOAFER LOAN LOANED LOANING LOANS LOATH LOATHE LOATHED LOATHING LOATHLY LOATHSOME LOAVES LOBBIED LOBBIES LOBBY LOBBYING LOBE LOBES LOBSTER LOBSTERS LOCAL LOCALITIES LOCALITY LOCALIZATION LOCALIZE LOCALIZED LOCALIZES LOCALIZING LOCALLY LOCALS LOCATE LOCATED LOCATES LOCATING LOCATION LOCATIONS LOCATIVE LOCATIVES LOCATOR LOCATORS LOCI LOCK LOCKE LOCKED LOCKER LOCKERS LOCKHART LOCKHEED LOCKIAN LOCKING LOCKINGS LOCKOUT LOCKOUTS LOCKS LOCKSMITH LOCKSTEP LOCKUP LOCKUPS LOCKWOOD LOCOMOTION LOCOMOTIVE LOCOMOTIVES LOCUS LOCUST LOCUSTS LODGE LODGED LODGER LODGES LODGING LODGINGS LODOWICK LOEB LOFT LOFTINESS LOFTS LOFTY LOGAN LOGARITHM LOGARITHMIC LOGARITHMICALLY LOGARITHMS LOGGED LOGGER LOGGERS LOGGING LOGIC LOGICAL LOGICALLY LOGICIAN LOGICIANS LOGICS LOGIN LOGINS LOGISTIC LOGISTICS LOGJAM LOGO LOGS LOIN LOINCLOTH LOINS LOIRE LOIS LOITER LOITERED LOITERER LOITERING LOITERS LOKI LOLA LOMB LOMBARD LOMBARDY LOME LONDON LONDONDERRY LONDONER LONDONIZATION LONDONIZATIONS LONDONIZE LONDONIZES LONE LONELIER LONELIEST LONELINESS LONELY LONER LONERS LONESOME LONG LONGED LONGER LONGEST LONGEVITY LONGFELLOW LONGHAND LONGING LONGINGS LONGITUDE LONGITUDES LONGS LONGSTANDING LONGSTREET LOOK LOOKAHEAD LOOKED LOOKER LOOKERS LOOKING LOOKOUT LOOKS LOOKUP LOOKUPS LOOM LOOMED LOOMING LOOMIS LOOMS LOON LOOP LOOPED LOOPHOLE LOOPHOLES LOOPING LOOPS LOOSE LOOSED LOOSELEAF LOOSELY LOOSEN LOOSENED LOOSENESS LOOSENING LOOSENS LOOSER LOOSES LOOSEST LOOSING LOOT LOOTED LOOTER LOOTING LOOTS LOPEZ LOPSIDED LORD LORDLY LORDS LORDSHIP LORE LORELEI LOREN LORENTZIAN LORENZ LORETTA LORINDA LORRAINE LORRY LOS LOSE LOSER LOSERS LOSES LOSING LOSS LOSSES LOSSIER LOSSIEST LOSSY LOST LOT LOTHARIO LOTION LOTS LOTTE LOTTERY LOTTIE LOTUS LOU LOUD LOUDER LOUDEST LOUDLY LOUDNESS LOUDSPEAKER LOUDSPEAKERS LOUIS LOUISA LOUISE LOUISIANA LOUISIANAN LOUISVILLE LOUNGE LOUNGED LOUNGES LOUNGING LOUNSBURY LOURDES LOUSE LOUSY LOUT LOUVRE LOVABLE LOVABLY LOVE LOVED LOVEJOY LOVELACE LOVELAND LOVELIER LOVELIES LOVELIEST LOVELINESS LOVELORN LOVELY LOVER LOVERS LOVES LOVING LOVINGLY LOW LOWE LOWELL LOWER LOWERED LOWERING LOWERS LOWEST LOWLAND LOWLANDS LOWLIEST LOWLY LOWNESS LOWRY LOWS LOY LOYAL LOYALLY LOYALTIES LOYALTY LOYOLA LUBBOCK LUBELL LUBRICANT LUBRICATE LUBRICATION LUCAS LUCERNE LUCIA LUCIAN LUCID LUCIEN LUCIFER LUCILLE LUCIUS LUCK LUCKED LUCKIER LUCKIEST LUCKILY LUCKLESS LUCKS LUCKY LUCRATIVE LUCRETIA LUCRETIUS LUCY LUDICROUS LUDICROUSLY LUDICROUSNESS LUDLOW LUDMILLA LUDWIG LUFTHANSA LUFTWAFFE LUGGAGE LUIS LUKE LUKEWARM LULL LULLABY LULLED LULLS LUMBER LUMBERED LUMBERING LUMINOUS LUMINOUSLY LUMMOX LUMP LUMPED LUMPING LUMPS LUMPUR LUMPY LUNAR LUNATIC LUNCH LUNCHED LUNCHEON LUNCHEONS LUNCHES LUNCHING LUND LUNDBERG LUNDQUIST LUNG LUNGED LUNGS LURA LURCH LURCHED LURCHES LURCHING LURE LURED LURES LURING LURK LURKED LURKING LURKS LUSAKA LUSCIOUS LUSCIOUSLY LUSCIOUSNESS LUSH LUST LUSTER LUSTFUL LUSTILY LUSTINESS LUSTROUS LUSTS LUSTY LUTE LUTES LUTHER LUTHERAN LUTHERANIZE LUTHERANIZER LUTHERANIZERS LUTHERANIZES LUTZ LUXEMBOURG LUXEMBURG LUXURIANT LUXURIANTLY LUXURIES LUXURIOUS LUXURIOUSLY LUXURY LUZON LYDIA LYING LYKES LYLE LYMAN LYMPH LYNCH LYNCHBURG LYNCHED LYNCHER LYNCHES LYNDON LYNN LYNX LYNXES LYON LYONS LYRA LYRE LYRIC LYRICS LYSENKO MABEL MAC MACADAMIA MACARTHUR MACARTHUR MACASSAR MACAULAY MACAULAYAN MACAULAYISM MACAULAYISMS MACBETH MACDONALD MACDONALD MACDOUGALL MACDOUGALL MACDRAW MACE MACED MACEDON MACEDONIA MACEDONIAN MACES MACGREGOR MACGREGOR MACH MACHIAVELLI MACHIAVELLIAN MACHINATION MACHINE MACHINED MACHINELIKE MACHINERY MACHINES MACHINING MACHO MACINTOSH MACINTOSH MACINTOSH MACKENZIE MACKENZIE MACKEREL MACKEY MACKINAC MACKINAW MACMAHON MACMILLAN MACMILLAN MACON MACPAINT MACRO MACROECONOMICS MACROMOLECULE MACROMOLECULES MACROPHAGE MACROS MACROSCOPIC MAD MADAGASCAR MADAM MADAME MADAMES MADDEN MADDENING MADDER MADDEST MADDOX MADE MADEIRA MADELEINE MADELINE MADHOUSE MADHYA MADISON MADLY MADMAN MADMEN MADNESS MADONNA MADONNAS MADRAS MADRID MADSEN MAE MAELSTROM MAESTRO MAFIA MAFIOSI MAGAZINE MAGAZINES MAGDALENE MAGELLAN MAGELLANIC MAGENTA MAGGIE MAGGOT MAGGOTS MAGIC MAGICAL MAGICALLY MAGICIAN MAGICIANS MAGILL MAGISTRATE MAGISTRATES MAGNA MAGNESIUM MAGNET MAGNETIC MAGNETICALLY MAGNETISM MAGNETISMS MAGNETIZABLE MAGNETIZED MAGNETO MAGNIFICATION MAGNIFICENCE MAGNIFICENT MAGNIFICENTLY MAGNIFIED MAGNIFIER MAGNIFIES MAGNIFY MAGNIFYING MAGNITUDE MAGNITUDES MAGNOLIA MAGNUM MAGNUSON MAGOG MAGPIE MAGRUDER MAGUIRE MAGUIRES MAHARASHTRA MAHAYANA MAHAYANIST MAHOGANY MAHONEY MAID MAIDEN MAIDENS MAIDS MAIER MAIL MAILABLE MAILBOX MAILBOXES MAILED MAILER MAILING MAILINGS MAILMAN MAILMEN MAILS MAIM MAIMED MAIMING MAIMS MAIN MAINE MAINFRAME MAINFRAMES MAINLAND MAINLINE MAINLY MAINS MAINSTAY MAINSTREAM MAINTAIN MAINTAINABILITY MAINTAINABLE MAINTAINED MAINTAINER MAINTAINERS MAINTAINING MAINTAINS MAINTENANCE MAINTENANCES MAIZE MAJESTIC MAJESTIES MAJESTY MAJOR MAJORCA MAJORED MAJORING MAJORITIES MAJORITY MAJORS MAKABLE MAKE MAKER MAKERS MAKES MAKESHIFT MAKEUP MAKEUPS MAKING MAKINGS MALABAR MALADIES MALADY MALAGASY MALAMUD MALARIA MALAWI MALAY MALAYIZE MALAYIZES MALAYSIA MALAYSIAN MALCOLM MALCONTENT MALDEN MALDIVE MALE MALEFACTOR MALEFACTORS MALENESS MALES MALEVOLENT MALFORMED MALFUNCTION MALFUNCTIONED MALFUNCTIONING MALFUNCTIONS MALI MALIBU MALICE MALICIOUS MALICIOUSLY MALICIOUSNESS MALIGN MALIGNANT MALIGNANTLY MALL MALLARD MALLET MALLETS MALLORY MALNUTRITION MALONE MALONEY MALPRACTICE MALRAUX MALT MALTA MALTED MALTESE MALTHUS MALTHUSIAN MALTON MALTS MAMA MAMMA MAMMAL MAMMALIAN MAMMALS MAMMAS MAMMOTH MAN MANAGE MANAGEABLE MANAGEABLENESS MANAGED MANAGEMENT MANAGEMENTS MANAGER MANAGERIAL MANAGERS MANAGES MANAGING MANAGUA MANAMA MANCHESTER MANCHURIA MANDARIN MANDATE MANDATED MANDATES MANDATING MANDATORY MANDELBROT MANDIBLE MANE MANES MANEUVER MANEUVERED MANEUVERING MANEUVERS MANFRED MANGER MANGERS MANGLE MANGLED MANGLER MANGLES MANGLING MANHATTAN MANHATTANIZE MANHATTANIZES MANHOLE MANHOOD MANIA MANIAC MANIACAL MANIACS MANIC MANICURE MANICURED MANICURES MANICURING MANIFEST MANIFESTATION MANIFESTATIONS MANIFESTED MANIFESTING MANIFESTLY MANIFESTS MANIFOLD MANIFOLDS MANILA MANIPULABILITY MANIPULABLE MANIPULATABLE MANIPULATE MANIPULATED MANIPULATES MANIPULATING MANIPULATION MANIPULATIONS MANIPULATIVE MANIPULATOR MANIPULATORS MANIPULATORY MANITOBA MANITOWOC MANKIND MANKOWSKI MANLEY MANLY MANN MANNED MANNER MANNERED MANNERLY MANNERS MANNING MANOMETER MANOMETERS MANOR MANORS MANPOWER MANS MANSFIELD MANSION MANSIONS MANSLAUGHTER MANTEL MANTELS MANTIS MANTISSA MANTISSAS MANTLE MANTLEPIECE MANTLES MANUAL MANUALLY MANUALS MANUEL MANUFACTURE MANUFACTURED MANUFACTURER MANUFACTURERS MANUFACTURES MANUFACTURING MANURE MANUSCRIPT MANUSCRIPTS MANVILLE MANY MAO MAORI MAP MAPLE MAPLECREST MAPLES MAPPABLE MAPPED MAPPING MAPPINGS MAPS MARATHON MARBLE MARBLES MARBLING MARC MARCEAU MARCEL MARCELLO MARCH MARCHED MARCHER MARCHES MARCHING MARCIA MARCO MARCOTTE MARCUS MARCY MARDI MARDIS MARE MARES MARGARET MARGARINE MARGERY MARGIN MARGINAL MARGINALLY MARGINS MARGO MARGUERITE MARIANNE MARIE MARIETTA MARIGOLD MARIJUANA MARILYN MARIN MARINA MARINADE MARINATE MARINE MARINER MARINES MARINO MARIO MARION MARIONETTE MARITAL MARITIME MARJORIE MARJORY MARK MARKABLE MARKED MARKEDLY MARKER MARKERS MARKET MARKETABILITY MARKETABLE MARKETED MARKETING MARKETINGS MARKETPLACE MARKETPLACES MARKETS MARKHAM MARKING MARKINGS MARKISM MARKOV MARKOVIAN MARKOVITZ MARKS MARLBORO MARLBOROUGH MARLENE MARLOWE MARMALADE MARMOT MAROON MARQUETTE MARQUIS MARRIAGE MARRIAGEABLE MARRIAGES MARRIED MARRIES MARRIOTT MARROW MARRY MARRYING MARS MARSEILLES MARSH MARSHA MARSHAL MARSHALED MARSHALING MARSHALL MARSHALLED MARSHALLING MARSHALS MARSHES MARSHMALLOW MART MARTEN MARTHA MARTIAL MARTIAN MARTIANS MARTINEZ MARTINGALE MARTINI MARTINIQUE MARTINSON MARTS MARTY MARTYR MARTYRDOM MARTYRS MARVEL MARVELED MARVELLED MARVELLING MARVELOUS MARVELOUSLY MARVELOUSNESS MARVELS MARVIN MARX MARXIAN MARXISM MARXISMS MARXIST MARY MARYLAND MARYLANDERS MASCARA MASCULINE MASCULINELY MASCULINITY MASERU MASH MASHED MASHES MASHING MASK MASKABLE MASKED MASKER MASKING MASKINGS MASKS MASOCHIST MASOCHISTS MASON MASONIC MASONITE MASONRY MASONS MASQUERADE MASQUERADER MASQUERADES MASQUERADING MASS MASSACHUSETTS MASSACRE MASSACRED MASSACRES MASSAGE MASSAGES MASSAGING MASSED MASSES MASSEY MASSING MASSIVE MAST MASTED MASTER MASTERED MASTERFUL MASTERFULLY MASTERING MASTERINGS MASTERLY MASTERMIND MASTERPIECE MASTERPIECES MASTERS MASTERY MASTODON MASTS MASTURBATE MASTURBATED MASTURBATES MASTURBATING MASTURBATION MAT MATCH MATCHABLE MATCHED MATCHER MATCHERS MATCHES MATCHING MATCHINGS MATCHLESS MATE MATED MATEO MATER MATERIAL MATERIALIST MATERIALIZE MATERIALIZED MATERIALIZES MATERIALIZING MATERIALLY MATERIALS MATERNAL MATERNALLY MATERNITY MATES MATH MATHEMATICA MATHEMATICAL MATHEMATICALLY MATHEMATICIAN MATHEMATICIANS MATHEMATICS MATHEMATIK MATHEWSON MATHIAS MATHIEU MATILDA MATING MATINGS MATISSE MATISSES MATRIARCH MATRIARCHAL MATRICES MATRICULATE MATRICULATION MATRIMONIAL MATRIMONY MATRIX MATROID MATRON MATRONLY MATS MATSON MATSUMOTO MATT MATTED MATTER MATTERED MATTERS MATTHEW MATTHEWS MATTIE MATTRESS MATTRESSES MATTSON MATURATION MATURE MATURED MATURELY MATURES MATURING MATURITIES MATURITY MAUDE MAUL MAUREEN MAURICE MAURICIO MAURINE MAURITANIA MAURITIUS MAUSOLEUM MAVERICK MAVIS MAWR MAX MAXIM MAXIMA MAXIMAL MAXIMALLY MAXIMILIAN MAXIMIZE MAXIMIZED MAXIMIZER MAXIMIZERS MAXIMIZES MAXIMIZING MAXIMS MAXIMUM MAXIMUMS MAXINE MAXTOR MAXWELL MAXWELLIAN MAY MAYA MAYANS MAYBE MAYER MAYFAIR MAYFLOWER MAYHAP MAYHEM MAYNARD MAYO MAYONNAISE MAYOR MAYORAL MAYORS MAZDA MAZE MAZES MBABANE MCADAM MCADAMS MCALLISTER MCBRIDE MCCABE MCCALL MCCALLUM MCCANN MCCARTHY MCCARTY MCCAULEY MCCLAIN MCCLELLAN MCCLURE MCCLUSKEY MCCONNEL MCCONNELL MCCORMICK MCCOY MCCRACKEN MCCULLOUGH MCDANIEL MCDERMOTT MCDONALD MCDONNELL MCDOUGALL MCDOWELL MCELHANEY MCELROY MCFADDEN MCFARLAND MCGEE MCGILL MCGINNIS MCGOVERN MCGOWAN MCGRATH MCGRAW MCGREGOR MCGUIRE MCHUGH MCINTOSH MCINTYRE MCKAY MCKEE MCKENNA MCKENZIE MCKEON MCKESSON MCKINLEY MCKINNEY MCKNIGHT MCLANAHAN MCLAUGHLIN MCLEAN MCLEOD MCMAHON MCMARTIN MCMILLAN MCMULLEN MCNALLY MCNAUGHTON MCNEIL MCNULTY MCPHERSON MEAD MEADOW MEADOWS MEAGER MEAGERLY MEAGERNESS MEAL MEALS MEALTIME MEALY MEAN MEANDER MEANDERED MEANDERING MEANDERS MEANER MEANEST MEANING MEANINGFUL MEANINGFULLY MEANINGFULNESS MEANINGLESS MEANINGLESSLY MEANINGLESSNESS MEANINGS MEANLY MEANNESS MEANS MEANT MEANTIME MEANWHILE MEASLE MEASLES MEASURABLE MEASURABLY MEASURE MEASURED MEASUREMENT MEASUREMENTS MEASURER MEASURES MEASURING MEAT MEATS MEATY MECCA MECHANIC MECHANICAL MECHANICALLY MECHANICS MECHANISM MECHANISMS MECHANIZATION MECHANIZATIONS MECHANIZE MECHANIZED MECHANIZES MECHANIZING MEDAL MEDALLION MEDALLIONS MEDALS MEDDLE MEDDLED MEDDLER MEDDLES MEDDLING MEDEA MEDFIELD MEDFORD MEDIA MEDIAN MEDIANS MEDIATE MEDIATED MEDIATES MEDIATING MEDIATION MEDIATIONS MEDIATOR MEDIC MEDICAID MEDICAL MEDICALLY MEDICARE MEDICI MEDICINAL MEDICINALLY MEDICINE MEDICINES MEDICIS MEDICS MEDIEVAL MEDIOCRE MEDIOCRITY MEDITATE MEDITATED MEDITATES MEDITATING MEDITATION MEDITATIONS MEDITATIVE MEDITERRANEAN MEDITERRANEANIZATION MEDITERRANEANIZATIONS MEDITERRANEANIZE MEDITERRANEANIZES MEDIUM MEDIUMS MEDLEY MEDUSA MEDUSAN MEEK MEEKER MEEKEST MEEKLY MEEKNESS MEET MEETING MEETINGHOUSE MEETINGS MEETS MEG MEGABAUD MEGABIT MEGABITS MEGABYTE MEGABYTES MEGAHERTZ MEGALOMANIA MEGATON MEGAVOLT MEGAWATT MEGAWORD MEGAWORDS MEGOHM MEIER MEIJI MEISTER MEISTERSINGER MEKONG MEL MELAMPUS MELANCHOLY MELANESIA MELANESIAN MELANIE MELBOURNE MELCHER MELINDA MELISANDE MELISSA MELLON MELLOW MELLOWED MELLOWING MELLOWNESS MELLOWS MELODIES MELODIOUS MELODIOUSLY MELODIOUSNESS MELODRAMA MELODRAMAS MELODRAMATIC MELODY MELON MELONS MELPOMENE MELT MELTED MELTING MELTINGLY MELTS MELVILLE MELVIN MEMBER MEMBERS MEMBERSHIP MEMBERSHIPS MEMBRANE MEMENTO MEMO MEMOIR MEMOIRS MEMORABILIA MEMORABLE MEMORABLENESS MEMORANDA MEMORANDUM MEMORIAL MEMORIALLY MEMORIALS MEMORIES MEMORIZATION MEMORIZE MEMORIZED MEMORIZER MEMORIZES MEMORIZING MEMORY MEMORYLESS MEMOS MEMPHIS MEN MENACE MENACED MENACING MENAGERIE MENARCHE MENCKEN MEND MENDACIOUS MENDACITY MENDED MENDEL MENDELIAN MENDELIZE MENDELIZES MENDELSSOHN MENDER MENDING MENDOZA MENDS MENELAUS MENIAL MENIALS MENLO MENNONITE MENNONITES MENOMINEE MENORCA MENS MENSCH MENSTRUATE MENSURABLE MENSURATION MENTAL MENTALITIES MENTALITY MENTALLY MENTION MENTIONABLE MENTIONED MENTIONER MENTIONERS MENTIONING MENTIONS MENTOR MENTORS MENU MENUS MENZIES MEPHISTOPHELES MERCANTILE MERCATOR MERCEDES MERCENARIES MERCENARINESS MERCENARY MERCHANDISE MERCHANDISER MERCHANDISING MERCHANT MERCHANTS MERCIFUL MERCIFULLY MERCILESS MERCILESSLY MERCK MERCURIAL MERCURY MERCY MERE MEREDITH MERELY MEREST MERGE MERGED MERGER MERGERS MERGES MERGING MERIDIAN MERINGUE MERIT MERITED MERITING MERITORIOUS MERITORIOUSLY MERITORIOUSNESS MERITS MERIWETHER MERLE MERMAID MERRIAM MERRICK MERRIEST MERRILL MERRILY MERRIMAC MERRIMACK MERRIMENT MERRITT MERRY MERRYMAKE MERVIN MESCALINE MESH MESON MESOPOTAMIA MESOZOIC MESQUITE MESS MESSAGE MESSAGES MESSED MESSENGER MESSENGERS MESSES MESSIAH MESSIAHS MESSIER MESSIEST MESSILY MESSINESS MESSING MESSY MET META METABOLIC METABOLISM METACIRCULAR METACIRCULARITY METAL METALANGUAGE METALLIC METALLIZATION METALLIZATIONS METALLURGY METALS METAMATHEMATICAL METAMORPHOSIS METAPHOR METAPHORICAL METAPHORICALLY METAPHORS METAPHYSICAL METAPHYSICALLY METAPHYSICS METAVARIABLE METCALF METE METED METEOR METEORIC METEORITE METEORITIC METEOROLOGY METEORS METER METERING METERS METES METHANE METHOD METHODICAL METHODICALLY METHODICALNESS METHODISM METHODIST METHODISTS METHODOLOGICAL METHODOLOGICALLY METHODOLOGIES METHODOLOGISTS METHODOLOGY METHODS METHUEN METHUSELAH METHUSELAHS METICULOUSLY METING METRECAL METRIC METRICAL METRICS METRO METRONOME METROPOLIS METROPOLITAN METS METTLE METTLESOME METZLER MEW MEWED MEWS MEXICAN MEXICANIZE MEXICANIZES MEXICANS MEXICO MEYER MEYERS MIAMI MIASMA MICA MICE MICHAEL MICHAELS MICHEL MICHELANGELO MICHELE MICHELIN MICHELSON MICHIGAN MICK MICKEY MICKIE MICKY MICRO MICROARCHITECTS MICROARCHITECTURE MICROARCHITECTURES MICROBIAL MICROBICIDAL MICROBICIDE MICROCODE MICROCODED MICROCODES MICROCODING MICROCOMPUTER MICROCOMPUTERS MICROCOSM MICROCYCLE MICROCYCLES MICROECONOMICS MICROELECTRONICS MICROFILM MICROFILMS MICROFINANCE MICROGRAMMING MICROINSTRUCTION MICROINSTRUCTIONS MICROJUMP MICROJUMPS MICROLEVEL MICRON MICRONESIA MICRONESIAN MICROOPERATIONS MICROPHONE MICROPHONES MICROPHONING MICROPORT MICROPROCEDURE MICROPROCEDURES MICROPROCESSING MICROPROCESSOR MICROPROCESSORS MICROPROGRAM MICROPROGRAMMABLE MICROPROGRAMMED MICROPROGRAMMER MICROPROGRAMMING MICROPROGRAMS MICROS MICROSCOPE MICROSCOPES MICROSCOPIC MICROSCOPY MICROSECOND MICROSECONDS MICROSOFT MICROSTORE MICROSYSTEMS MICROVAX MICROVAXES MICROWAVE MICROWAVES MICROWORD MICROWORDS MID MIDAS MIDDAY MIDDLE MIDDLEBURY MIDDLEMAN MIDDLEMEN MIDDLES MIDDLESEX MIDDLETON MIDDLETOWN MIDDLING MIDGET MIDLANDIZE MIDLANDIZES MIDNIGHT MIDNIGHTS MIDPOINT MIDPOINTS MIDRANGE MIDSCALE MIDSECTION MIDSHIPMAN MIDSHIPMEN MIDST MIDSTREAM MIDSTS MIDSUMMER MIDWAY MIDWEEK MIDWEST MIDWESTERN MIDWESTERNER MIDWESTERNERS MIDWIFE MIDWINTER MIDWIVES MIEN MIGHT MIGHTIER MIGHTIEST MIGHTILY MIGHTINESS MIGHTY MIGRANT MIGRATE MIGRATED MIGRATES MIGRATING MIGRATION MIGRATIONS MIGRATORY MIGUEL MIKE MIKHAIL MIKOYAN MILAN MILD MILDER MILDEST MILDEW MILDLY MILDNESS MILDRED MILE MILEAGE MILES MILESTONE MILESTONES MILITANT MILITANTLY MILITARILY MILITARISM MILITARY MILITIA MILK MILKED MILKER MILKERS MILKINESS MILKING MILKMAID MILKMAIDS MILKS MILKY MILL MILLARD MILLED MILLENNIUM MILLER MILLET MILLIAMMETER MILLIAMPERE MILLIE MILLIJOULE MILLIKAN MILLIMETER MILLIMETERS MILLINERY MILLING MILLINGTON MILLION MILLIONAIRE MILLIONAIRES MILLIONS MILLIONTH MILLIPEDE MILLIPEDES MILLISECOND MILLISECONDS MILLIVOLT MILLIVOLTMETER MILLIWATT MILLS MILLSTONE MILLSTONES MILNE MILQUETOAST MILQUETOASTS MILTON MILTONIAN MILTONIC MILTONISM MILTONIST MILTONIZE MILTONIZED MILTONIZES MILTONIZING MILWAUKEE MIMEOGRAPH MIMI MIMIC MIMICKED MIMICKING MIMICS MINARET MINCE MINCED MINCEMEAT MINCES MINCING MIND MINDANAO MINDED MINDFUL MINDFULLY MINDFULNESS MINDING MINDLESS MINDLESSLY MINDS MINE MINED MINEFIELD MINER MINERAL MINERALS MINERS MINERVA MINES MINESWEEPER MINGLE MINGLED MINGLES MINGLING MINI MINIATURE MINIATURES MINIATURIZATION MINIATURIZE MINIATURIZED MINIATURIZES MINIATURIZING MINICOMPUTER MINICOMPUTERS MINIMA MINIMAL MINIMALLY MINIMAX MINIMIZATION MINIMIZATIONS MINIMIZE MINIMIZED MINIMIZER MINIMIZERS MINIMIZES MINIMIZING MINIMUM MINING MINION MINIS MINISTER MINISTERED MINISTERING MINISTERS MINISTRIES MINISTRY MINK MINKS MINNEAPOLIS MINNESOTA MINNIE MINNOW MINNOWS MINOAN MINOR MINORING MINORITIES MINORITY MINORS MINOS MINOTAUR MINSK MINSKY MINSTREL MINSTRELS MINT MINTED MINTER MINTING MINTS MINUEND MINUET MINUS MINUSCULE MINUTE MINUTELY MINUTEMAN MINUTEMEN MINUTENESS MINUTER MINUTES MIOCENE MIPS MIRA MIRACLE MIRACLES MIRACULOUS MIRACULOUSLY MIRAGE MIRANDA MIRE MIRED MIRES MIRFAK MIRIAM MIRROR MIRRORED MIRRORING MIRRORS MIRTH MISANTHROPE MISBEHAVING MISCALCULATION MISCALCULATIONS MISCARRIAGE MISCARRY MISCEGENATION MISCELLANEOUS MISCELLANEOUSLY MISCELLANEOUSNESS MISCHIEF MISCHIEVOUS MISCHIEVOUSLY MISCHIEVOUSNESS MISCONCEPTION MISCONCEPTIONS MISCONDUCT MISCONSTRUE MISCONSTRUED MISCONSTRUES MISDEMEANORS MISER MISERABLE MISERABLENESS MISERABLY MISERIES MISERLY MISERS MISERY MISFIT MISFITS MISFORTUNE MISFORTUNES MISGIVING MISGIVINGS MISGUIDED MISHAP MISHAPS MISINFORMED MISJUDGED MISJUDGMENT MISLEAD MISLEADING MISLEADS MISLED MISMANAGEMENT MISMATCH MISMATCHED MISMATCHES MISMATCHING MISNOMER MISPLACE MISPLACED MISPLACES MISPLACING MISPRONUNCIATION MISREPRESENTATION MISREPRESENTATIONS MISS MISSED MISSES MISSHAPEN MISSILE MISSILES MISSING MISSION MISSIONARIES MISSIONARY MISSIONER MISSIONS MISSISSIPPI MISSISSIPPIAN MISSISSIPPIANS MISSIVE MISSOULA MISSOURI MISSPELL MISSPELLED MISSPELLING MISSPELLINGS MISSPELLS MISSY MIST MISTAKABLE MISTAKE MISTAKEN MISTAKENLY MISTAKES MISTAKING MISTED MISTER MISTERS MISTINESS MISTING MISTLETOE MISTRESS MISTRUST MISTRUSTED MISTS MISTY MISTYPE MISTYPED MISTYPES MISTYPING MISUNDERSTAND MISUNDERSTANDER MISUNDERSTANDERS MISUNDERSTANDING MISUNDERSTANDINGS MISUNDERSTOOD MISUSE MISUSED MISUSES MISUSING MITCH MITCHELL MITER MITIGATE MITIGATED MITIGATES MITIGATING MITIGATION MITIGATIVE MITRE MITRES MITTEN MITTENS MIX MIXED MIXER MIXERS MIXES MIXING MIXTURE MIXTURES MIXUP MIZAR MNEMONIC MNEMONICALLY MNEMONICS MOAN MOANED MOANS MOAT MOATS MOB MOBIL MOBILE MOBILITY MOBS MOBSTER MOCCASIN MOCCASINS MOCK MOCKED MOCKER MOCKERY MOCKING MOCKINGBIRD MOCKS MOCKUP MODAL MODALITIES MODALITY MODALLY MODE MODEL MODELED MODELING MODELINGS MODELS MODEM MODEMS MODERATE MODERATED MODERATELY MODERATENESS MODERATES MODERATING MODERATION MODERN MODERNITY MODERNIZE MODERNIZED MODERNIZER MODERNIZING MODERNLY MODERNNESS MODERNS MODES MODEST MODESTLY MODESTO MODESTY MODICUM MODIFIABILITY MODIFIABLE MODIFICATION MODIFICATIONS MODIFIED MODIFIER MODIFIERS MODIFIES MODIFY MODIFYING MODULA MODULAR MODULARITY MODULARIZATION MODULARIZE MODULARIZED MODULARIZES MODULARIZING MODULARLY MODULATE MODULATED MODULATES MODULATING MODULATION MODULATIONS MODULATOR MODULATORS MODULE MODULES MODULI MODULO MODULUS MODUS MOE MOEN MOGADISCIO MOGADISHU MOGHUL MOHAMMED MOHAMMEDAN MOHAMMEDANISM MOHAMMEDANIZATION MOHAMMEDANIZATIONS MOHAMMEDANIZE MOHAMMEDANIZES MOHAWK MOHR MOINES MOISEYEV MOIST MOISTEN MOISTLY MOISTNESS MOISTURE MOLAR MOLASSES MOLD MOLDAVIA MOLDED MOLDER MOLDING MOLDS MOLE MOLECULAR MOLECULE MOLECULES MOLEHILL MOLES MOLEST MOLESTED MOLESTING MOLESTS MOLIERE MOLINE MOLL MOLLIE MOLLIFY MOLLUSK MOLLY MOLLYCODDLE MOLOCH MOLOCHIZE MOLOCHIZES MOLOTOV MOLTEN MOLUCCAS MOMENT MOMENTARILY MOMENTARINESS MOMENTARY MOMENTOUS MOMENTOUSLY MOMENTOUSNESS MOMENTS MOMENTUM MOMMY MONA MONACO MONADIC MONARCH MONARCHIES MONARCHS MONARCHY MONASH MONASTERIES MONASTERY MONASTIC MONDAY MONDAYS MONET MONETARISM MONETARY MONEY MONEYED MONEYS MONFORT MONGOLIA MONGOLIAN MONGOLIANISM MONGOOSE MONICA MONITOR MONITORED MONITORING MONITORS MONK MONKEY MONKEYED MONKEYING MONKEYS MONKISH MONKS MONMOUTH MONOALPHABETIC MONOCEROS MONOCHROMATIC MONOCHROME MONOCOTYLEDON MONOCULAR MONOGAMOUS MONOGAMY MONOGRAM MONOGRAMS MONOGRAPH MONOGRAPHES MONOGRAPHS MONOLITH MONOLITHIC MONOLOGUE MONONGAHELA MONOPOLIES MONOPOLIZE MONOPOLIZED MONOPOLIZING MONOPOLY MONOPROGRAMMED MONOPROGRAMMING MONOSTABLE MONOTHEISM MONOTONE MONOTONIC MONOTONICALLY MONOTONICITY MONOTONOUS MONOTONOUSLY MONOTONOUSNESS MONOTONY MONROE MONROVIA MONSANTO MONSOON MONSTER MONSTERS MONSTROSITY MONSTROUS MONSTROUSLY MONT MONTAGUE MONTAIGNE MONTANA MONTANAN MONTCLAIR MONTENEGRIN MONTENEGRO MONTEREY MONTEVERDI MONTEVIDEO MONTGOMERY MONTH MONTHLY MONTHS MONTICELLO MONTMARTRE MONTPELIER MONTRACHET MONTREAL MONTY MONUMENT MONUMENTAL MONUMENTALLY MONUMENTS MOO MOOD MOODINESS MOODS MOODY MOON MOONED MOONEY MOONING MOONLIGHT MOONLIGHTER MOONLIGHTING MOONLIKE MOONLIT MOONS MOONSHINE MOOR MOORE MOORED MOORING MOORINGS MOORISH MOORS MOOSE MOOT MOP MOPED MOPS MORAINE MORAL MORALE MORALITIES MORALITY MORALLY MORALS MORAN MORASS MORATORIUM MORAVIA MORAVIAN MORAVIANIZED MORAVIANIZEDS MORBID MORBIDLY MORBIDNESS MORE MOREHOUSE MORELAND MOREOVER MORES MORESBY MORGAN MORIARTY MORIBUND MORLEY MORMON MORN MORNING MORNINGS MOROCCAN MOROCCO MORON MOROSE MORPHINE MORPHISM MORPHISMS MORPHOLOGICAL MORPHOLOGY MORRILL MORRIS MORRISON MORRISSEY MORRISTOWN MORROW MORSE MORSEL MORSELS MORTAL MORTALITY MORTALLY MORTALS MORTAR MORTARED MORTARING MORTARS MORTEM MORTGAGE MORTGAGES MORTICIAN MORTIFICATION MORTIFIED MORTIFIES MORTIFY MORTIFYING MORTIMER MORTON MOSAIC MOSAICS MOSCONE MOSCOW MOSER MOSES MOSLEM MOSLEMIZE MOSLEMIZES MOSLEMS MOSQUE MOSQUITO MOSQUITOES MOSS MOSSBERG MOSSES MOSSY MOST MOSTLY MOTEL MOTELS MOTH MOTHBALL MOTHBALLS MOTHER MOTHERED MOTHERER MOTHERERS MOTHERHOOD MOTHERING MOTHERLAND MOTHERLY MOTHERS MOTIF MOTIFS MOTION MOTIONED MOTIONING MOTIONLESS MOTIONLESSLY MOTIONLESSNESS MOTIONS MOTIVATE MOTIVATED MOTIVATES MOTIVATING MOTIVATION MOTIVATIONS MOTIVE MOTIVES MOTLEY MOTOR MOTORCAR MOTORCARS MOTORCYCLE MOTORCYCLES MOTORING MOTORIST MOTORISTS MOTORIZE MOTORIZED MOTORIZES MOTORIZING MOTOROLA MOTORS MOTTO MOTTOES MOULD MOULDING MOULTON MOUND MOUNDED MOUNDS MOUNT MOUNTABLE MOUNTAIN MOUNTAINEER MOUNTAINEERING MOUNTAINEERS MOUNTAINOUS MOUNTAINOUSLY MOUNTAINS MOUNTED MOUNTER MOUNTING MOUNTINGS MOUNTS MOURN MOURNED MOURNER MOURNERS MOURNFUL MOURNFULLY MOURNFULNESS MOURNING MOURNS MOUSE MOUSER MOUSES MOUSETRAP MOUSY MOUTH MOUTHE MOUTHED MOUTHES MOUTHFUL MOUTHING MOUTHPIECE MOUTHS MOUTON MOVABLE MOVE MOVED MOVEMENT MOVEMENTS MOVER MOVERS MOVES MOVIE MOVIES MOVING MOVINGS MOW MOWED MOWER MOWS MOYER MOZART MUCH MUCK MUCKER MUCKING MUCUS MUD MUDD MUDDIED MUDDINESS MUDDLE MUDDLED MUDDLEHEAD MUDDLER MUDDLERS MUDDLES MUDDLING MUDDY MUELLER MUENSTER MUFF MUFFIN MUFFINS MUFFLE MUFFLED MUFFLER MUFFLES MUFFLING MUFFS MUG MUGGING MUGS MUHAMMAD MUIR MUKDEN MULATTO MULBERRIES MULBERRY MULE MULES MULL MULLAH MULLEN MULTI MULTIBIT MULTIBUS MULTIBYTE MULTICAST MULTICASTING MULTICASTS MULTICELLULAR MULTICOMPUTER MULTICS MULTICS MULTIDIMENSIONAL MULTILATERAL MULTILAYER MULTILAYERED MULTILEVEL MULTIMEDIA MULTINATIONAL MULTIPLE MULTIPLES MULTIPLEX MULTIPLEXED MULTIPLEXER MULTIPLEXERS MULTIPLEXES MULTIPLEXING MULTIPLEXOR MULTIPLEXORS MULTIPLICAND MULTIPLICANDS MULTIPLICATION MULTIPLICATIONS MULTIPLICATIVE MULTIPLICATIVES MULTIPLICITY MULTIPLIED MULTIPLIER MULTIPLIERS MULTIPLIES MULTIPLY MULTIPLYING MULTIPROCESS MULTIPROCESSING MULTIPROCESSOR MULTIPROCESSORS MULTIPROGRAM MULTIPROGRAMMED MULTIPROGRAMMING MULTISTAGE MULTITUDE MULTITUDES MULTIUSER MULTIVARIATE MULTIWORD MUMBLE MUMBLED MUMBLER MUMBLERS MUMBLES MUMBLING MUMBLINGS MUMFORD MUMMIES MUMMY MUNCH MUNCHED MUNCHING MUNCIE MUNDANE MUNDANELY MUNDT MUNG MUNICH MUNICIPAL MUNICIPALITIES MUNICIPALITY MUNICIPALLY MUNITION MUNITIONS MUNROE MUNSEY MUNSON MUONG MURAL MURDER MURDERED MURDERER MURDERERS MURDERING MURDEROUS MURDEROUSLY MURDERS MURIEL MURKY MURMUR MURMURED MURMURER MURMURING MURMURS MURPHY MURRAY MURROW MUSCAT MUSCLE MUSCLED MUSCLES MUSCLING MUSCOVITE MUSCOVY MUSCULAR MUSCULATURE MUSE MUSED MUSES MUSEUM MUSEUMS MUSH MUSHROOM MUSHROOMED MUSHROOMING MUSHROOMS MUSHY MUSIC MUSICAL MUSICALLY MUSICALS MUSICIAN MUSICIANLY MUSICIANS MUSICOLOGY MUSING MUSINGS MUSK MUSKEGON MUSKET MUSKETS MUSKOX MUSKOXEN MUSKRAT MUSKRATS MUSKS MUSLIM MUSLIMS MUSLIN MUSSEL MUSSELS MUSSOLINI MUSSOLINIS MUSSORGSKY MUST MUSTACHE MUSTACHED MUSTACHES MUSTARD MUSTER MUSTINESS MUSTS MUSTY MUTABILITY MUTABLE MUTABLENESS MUTANDIS MUTANT MUTATE MUTATED MUTATES MUTATING MUTATION MUTATIONS MUTATIS MUTATIVE MUTE MUTED MUTELY MUTENESS MUTILATE MUTILATED MUTILATES MUTILATING MUTILATION MUTINIES MUTINY MUTT MUTTER MUTTERED MUTTERER MUTTERERS MUTTERING MUTTERS MUTTON MUTUAL MUTUALLY MUZAK MUZO MUZZLE MUZZLES MYCENAE MYCENAEAN MYERS MYNHEER MYRA MYRIAD MYRON MYRTLE MYSELF MYSORE MYSTERIES MYSTERIOUS MYSTERIOUSLY MYSTERIOUSNESS MYSTERY MYSTIC MYSTICAL MYSTICS MYSTIFY MYTH MYTHICAL MYTHOLOGIES MYTHOLOGY NAB NABISCO NABLA NABLAS NADIA NADINE NADIR NAG NAGASAKI NAGGED NAGGING NAGOYA NAGS NAGY NAIL NAILED NAILING NAILS NAIR NAIROBI NAIVE NAIVELY NAIVENESS NAIVETE NAKAMURA NAKAYAMA NAKED NAKEDLY NAKEDNESS NAKOMA NAME NAMEABLE NAMED NAMELESS NAMELESSLY NAMELY NAMER NAMERS NAMES NAMESAKE NAMESAKES NAMING NAN NANCY NANETTE NANKING NANOINSTRUCTION NANOINSTRUCTIONS NANOOK NANOPROGRAM NANOPROGRAMMING NANOSECOND NANOSECONDS NANOSTORE NANOSTORES NANTUCKET NAOMI NAP NAPKIN NAPKINS NAPLES NAPOLEON NAPOLEONIC NAPOLEONIZE NAPOLEONIZES NAPS NARBONNE NARCISSUS NARCOTIC NARCOTICS NARRAGANSETT NARRATE NARRATION NARRATIVE NARRATIVES NARROW NARROWED NARROWER NARROWEST NARROWING NARROWLY NARROWNESS NARROWS NARY NASA NASAL NASALLY NASAS NASH NASHUA NASHVILLE NASSAU NASTIER NASTIEST NASTILY NASTINESS NASTY NAT NATAL NATALIE NATCHEZ NATE NATHAN NATHANIEL NATION NATIONAL NATIONALIST NATIONALISTS NATIONALITIES NATIONALITY NATIONALIZATION NATIONALIZE NATIONALIZED NATIONALIZES NATIONALIZING NATIONALLY NATIONALS NATIONHOOD NATIONS NATIONWIDE NATIVE NATIVELY NATIVES NATIVITY NATO NATOS NATURAL NATURALISM NATURALIST NATURALIZATION NATURALLY NATURALNESS NATURALS NATURE NATURED NATURES NAUGHT NAUGHTIER NAUGHTINESS NAUGHTY NAUR NAUSEA NAUSEATE NAUSEUM NAVAHO NAVAJO NAVAL NAVALLY NAVEL NAVIES NAVIGABLE NAVIGATE NAVIGATED NAVIGATES NAVIGATING NAVIGATION NAVIGATOR NAVIGATORS NAVONA NAVY NAY NAZARENE NAZARETH NAZI NAZIS NAZISM NDJAMENA NEAL NEANDERTHAL NEAPOLITAN NEAR NEARBY NEARED NEARER NEAREST NEARING NEARLY NEARNESS NEARS NEARSIGHTED NEAT NEATER NEATEST NEATLY NEATNESS NEBRASKA NEBRASKAN NEBUCHADNEZZAR NEBULA NEBULAR NEBULOUS NECESSARIES NECESSARILY NECESSARY NECESSITATE NECESSITATED NECESSITATES NECESSITATING NECESSITATION NECESSITIES NECESSITY NECK NECKING NECKLACE NECKLACES NECKLINE NECKS NECKTIE NECKTIES NECROSIS NECTAR NED NEED NEEDED NEEDFUL NEEDHAM NEEDING NEEDLE NEEDLED NEEDLER NEEDLERS NEEDLES NEEDLESS NEEDLESSLY NEEDLESSNESS NEEDLEWORK NEEDLING NEEDS NEEDY NEFF NEGATE NEGATED NEGATES NEGATING NEGATION NEGATIONS NEGATIVE NEGATIVELY NEGATIVES NEGATOR NEGATORS NEGLECT NEGLECTED NEGLECTING NEGLECTS NEGLIGEE NEGLIGENCE NEGLIGENT NEGLIGIBLE NEGOTIABLE NEGOTIATE NEGOTIATED NEGOTIATES NEGOTIATING NEGOTIATION NEGOTIATIONS NEGRO NEGROES NEGROID NEGROIZATION NEGROIZATIONS NEGROIZE NEGROIZES NEHRU NEIGH NEIGHBOR NEIGHBORHOOD NEIGHBORHOODS NEIGHBORING NEIGHBORLY NEIGHBORS NEIL NEITHER NELL NELLIE NELSEN NELSON NEMESIS NEOCLASSIC NEON NEONATAL NEOPHYTE NEOPHYTES NEPAL NEPALI NEPHEW NEPHEWS NEPTUNE NERO NERVE NERVES NERVOUS NERVOUSLY NERVOUSNESS NESS NEST NESTED NESTER NESTING NESTLE NESTLED NESTLES NESTLING NESTOR NESTS NET NETHER NETHERLANDS NETS NETTED NETTING NETTLE NETTLED NETWORK NETWORKED NETWORKING NETWORKS NEUMANN NEURAL NEURITIS NEUROLOGICAL NEUROLOGISTS NEURON NEURONS NEUROSES NEUROSIS NEUROTIC NEUTER NEUTRAL NEUTRALITIES NEUTRALITY NEUTRALIZE NEUTRALIZED NEUTRALIZING NEUTRALLY NEUTRINO NEUTRINOS NEUTRON NEVA NEVADA NEVER NEVERTHELESS NEVINS NEW NEWARK NEWBOLD NEWBORN NEWBURY NEWBURYPORT NEWCASTLE NEWCOMER NEWCOMERS NEWELL NEWER NEWEST NEWFOUNDLAND NEWLY NEWLYWED NEWMAN NEWMANIZE NEWMANIZES NEWNESS NEWPORT NEWS NEWSCAST NEWSGROUP NEWSLETTER NEWSLETTERS NEWSMAN NEWSMEN NEWSPAPER NEWSPAPERS NEWSSTAND NEWSWEEK NEWSWEEKLY NEWT NEWTON NEWTONIAN NEXT NGUYEN NIAGARA NIAMEY NIBBLE NIBBLED NIBBLER NIBBLERS NIBBLES NIBBLING NIBELUNG NICARAGUA NICCOLO NICE NICELY NICENESS NICER NICEST NICHE NICHOLAS NICHOLLS NICHOLS NICHOLSON NICK NICKED NICKEL NICKELS NICKER NICKING NICKLAUS NICKNAME NICKNAMED NICKNAMES NICKS NICODEMUS NICOSIA NICOTINE NIECE NIECES NIELSEN NIELSON NIETZSCHE NIFTY NIGER NIGERIA NIGERIAN NIGH NIGHT NIGHTCAP NIGHTCLUB NIGHTFALL NIGHTGOWN NIGHTINGALE NIGHTINGALES NIGHTLY NIGHTMARE NIGHTMARES NIGHTMARISH NIGHTS NIGHTTIME NIHILISM NIJINSKY NIKKO NIKOLAI NIL NILE NILSEN NILSSON NIMBLE NIMBLENESS NIMBLER NIMBLY NIMBUS NINA NINE NINEFOLD NINES NINETEEN NINETEENS NINETEENTH NINETIES NINETIETH NINETY NINEVEH NINTH NIOBE NIP NIPPLE NIPPON NIPPONIZE NIPPONIZES NIPS NITRIC NITROGEN NITROUS NITTY NIXON NOAH NOBEL NOBILITY NOBLE NOBLEMAN NOBLENESS NOBLER NOBLES NOBLEST NOBLY NOBODY NOCTURNAL NOCTURNALLY NOD NODAL NODDED NODDING NODE NODES NODS NODULAR NODULE NOEL NOETHERIAN NOISE NOISELESS NOISELESSLY NOISES NOISIER NOISILY NOISINESS NOISY NOLAN NOLL NOMENCLATURE NOMINAL NOMINALLY NOMINATE NOMINATED NOMINATING NOMINATION NOMINATIVE NOMINEE NON NONADAPTIVE NONBIODEGRADABLE NONBLOCKING NONCE NONCHALANT NONCOMMERCIAL NONCOMMUNICATION NONCONSECUTIVELY NONCONSERVATIVE NONCRITICAL NONCYCLIC NONDECREASING NONDESCRIPT NONDESCRIPTLY NONDESTRUCTIVELY NONDETERMINACY NONDETERMINATE NONDETERMINATELY NONDETERMINISM NONDETERMINISTIC NONDETERMINISTICALLY NONE NONEMPTY NONETHELESS NONEXISTENCE NONEXISTENT NONEXTENSIBLE NONFUNCTIONAL NONGOVERNMENTAL NONIDEMPOTENT NONINTERACTING NONINTERFERENCE NONINTERLEAVED NONINTRUSIVE NONINTUITIVE NONINVERTING NONLINEAR NONLINEARITIES NONLINEARITY NONLINEARLY NONLOCAL NONMASKABLE NONMATHEMATICAL NONMILITARY NONNEGATIVE NONNEGLIGIBLE NONNUMERICAL NONOGENARIAN NONORTHOGONAL NONORTHOGONALITY NONPERISHABLE NONPERSISTENT NONPORTABLE NONPROCEDURAL NONPROCEDURALLY NONPROFIT NONPROGRAMMABLE NONPROGRAMMER NONSEGMENTED NONSENSE NONSENSICAL NONSEQUENTIAL NONSPECIALIST NONSPECIALISTS NONSTANDARD NONSYNCHRONOUS NONTECHNICAL NONTERMINAL NONTERMINALS NONTERMINATING NONTERMINATION NONTHERMAL NONTRANSPARENT NONTRIVIAL NONUNIFORM NONUNIFORMITY NONZERO NOODLE NOOK NOOKS NOON NOONDAY NOONS NOONTIDE NOONTIME NOOSE NOR NORA NORDHOFF NORDIC NORDSTROM NOREEN NORFOLK NORM NORMA NORMAL NORMALCY NORMALITY NORMALIZATION NORMALIZE NORMALIZED NORMALIZES NORMALIZING NORMALLY NORMALS NORMAN NORMANDY NORMANIZATION NORMANIZATIONS NORMANIZE NORMANIZER NORMANIZERS NORMANIZES NORMATIVE NORMS NORRIS NORRISTOWN NORSE NORTH NORTHAMPTON NORTHBOUND NORTHEAST NORTHEASTER NORTHEASTERN NORTHERLY NORTHERN NORTHERNER NORTHERNERS NORTHERNLY NORTHFIELD NORTHROP NORTHRUP NORTHUMBERLAND NORTHWARD NORTHWARDS NORTHWEST NORTHWESTERN NORTON NORWALK NORWAY NORWEGIAN NORWICH NOSE NOSED NOSES NOSING NOSTALGIA NOSTALGIC NOSTRADAMUS NOSTRAND NOSTRIL NOSTRILS NOT NOTABLE NOTABLES NOTABLY NOTARIZE NOTARIZED NOTARIZES NOTARIZING NOTARY NOTATION NOTATIONAL NOTATIONS NOTCH NOTCHED NOTCHES NOTCHING NOTE NOTEBOOK NOTEBOOKS NOTED NOTES NOTEWORTHY NOTHING NOTHINGNESS NOTHINGS NOTICE NOTICEABLE NOTICEABLY NOTICED NOTICES NOTICING NOTIFICATION NOTIFICATIONS NOTIFIED NOTIFIER NOTIFIERS NOTIFIES NOTIFY NOTIFYING NOTING NOTION NOTIONS NOTORIETY NOTORIOUS NOTORIOUSLY NOTRE NOTTINGHAM NOTWITHSTANDING NOUAKCHOTT NOUN NOUNS NOURISH NOURISHED NOURISHES NOURISHING NOURISHMENT NOVAK NOVEL NOVELIST NOVELISTS NOVELS NOVELTIES NOVELTY NOVEMBER NOVEMBERS NOVICE NOVICES NOVOSIBIRSK NOW NOWADAYS NOWHERE NOXIOUS NOYES NOZZLE NUANCE NUANCES NUBIA NUBIAN NUBILE NUCLEAR NUCLEI NUCLEIC NUCLEOTIDE NUCLEOTIDES NUCLEUS NUCLIDE NUDE NUDGE NUDGED NUDITY NUGENT NUGGET NUISANCE NUISANCES NULL NULLARY NULLED NULLIFIED NULLIFIERS NULLIFIES NULLIFY NULLIFYING NULLS NUMB NUMBED NUMBER NUMBERED NUMBERER NUMBERING NUMBERLESS NUMBERS NUMBING NUMBLY NUMBNESS NUMBS NUMERABLE NUMERAL NUMERALS NUMERATOR NUMERATORS NUMERIC NUMERICAL NUMERICALLY NUMERICS NUMEROUS NUMISMATIC NUMISMATIST NUN NUNS NUPTIAL NURSE NURSED NURSERIES NURSERY NURSES NURSING NURTURE NURTURED NURTURES NURTURING NUT NUTATE NUTRIA NUTRIENT NUTRITION NUTRITIOUS NUTS NUTSHELL NUTSHELLS NUZZLE NYLON NYMPH NYMPHOMANIA NYMPHOMANIAC NYMPHS NYQUIST OAF OAK OAKEN OAKLAND OAKLEY OAKMONT OAKS OAR OARS OASES OASIS OAT OATEN OATH OATHS OATMEAL OATS OBEDIENCE OBEDIENCES OBEDIENT OBEDIENTLY OBELISK OBERLIN OBERON OBESE OBEY OBEYED OBEYING OBEYS OBFUSCATE OBFUSCATORY OBITUARY OBJECT OBJECTED OBJECTING OBJECTION OBJECTIONABLE OBJECTIONS OBJECTIVE OBJECTIVELY OBJECTIVES OBJECTOR OBJECTORS OBJECTS OBLIGATED OBLIGATION OBLIGATIONS OBLIGATORY OBLIGE OBLIGED OBLIGES OBLIGING OBLIGINGLY OBLIQUE OBLIQUELY OBLIQUENESS OBLITERATE OBLITERATED OBLITERATES OBLITERATING OBLITERATION OBLIVION OBLIVIOUS OBLIVIOUSLY OBLIVIOUSNESS OBLONG OBNOXIOUS OBOE OBSCENE OBSCURE OBSCURED OBSCURELY OBSCURER OBSCURES OBSCURING OBSCURITIES OBSCURITY OBSEQUIOUS OBSERVABLE OBSERVANCE OBSERVANCES OBSERVANT OBSERVATION OBSERVATIONS OBSERVATORY OBSERVE OBSERVED OBSERVER OBSERVERS OBSERVES OBSERVING OBSESSION OBSESSIONS OBSESSIVE OBSOLESCENCE OBSOLESCENT OBSOLETE OBSOLETED OBSOLETES OBSOLETING OBSTACLE OBSTACLES OBSTINACY OBSTINATE OBSTINATELY OBSTRUCT OBSTRUCTED OBSTRUCTING OBSTRUCTION OBSTRUCTIONS OBSTRUCTIVE OBTAIN OBTAINABLE OBTAINABLY OBTAINED OBTAINING OBTAINS OBVIATE OBVIATED OBVIATES OBVIATING OBVIATION OBVIATIONS OBVIOUS OBVIOUSLY OBVIOUSNESS OCCAM OCCASION OCCASIONAL OCCASIONALLY OCCASIONED OCCASIONING OCCASIONINGS OCCASIONS OCCIDENT OCCIDENTAL OCCIDENTALIZATION OCCIDENTALIZATIONS OCCIDENTALIZE OCCIDENTALIZED OCCIDENTALIZES OCCIDENTALIZING OCCIDENTALS OCCIPITAL OCCLUDE OCCLUDED OCCLUDES OCCLUSION OCCLUSIONS OCCULT OCCUPANCIES OCCUPANCY OCCUPANT OCCUPANTS OCCUPATION OCCUPATIONAL OCCUPATIONALLY OCCUPATIONS OCCUPIED OCCUPIER OCCUPIES OCCUPY OCCUPYING OCCUR OCCURRED OCCURRENCE OCCURRENCES OCCURRING OCCURS OCEAN OCEANIA OCEANIC OCEANOGRAPHY OCEANS OCONOMOWOC OCTAGON OCTAGONAL OCTAHEDRA OCTAHEDRAL OCTAHEDRON OCTAL OCTANE OCTAVE OCTAVES OCTAVIA OCTET OCTETS OCTOBER OCTOBERS OCTOGENARIAN OCTOPUS ODD ODDER ODDEST ODDITIES ODDITY ODDLY ODDNESS ODDS ODE ODERBERG ODERBERGS ODES ODESSA ODIN ODIOUS ODIOUSLY ODIOUSNESS ODIUM ODOR ODOROUS ODOROUSLY ODOROUSNESS ODORS ODYSSEUS ODYSSEY OEDIPAL OEDIPALLY OEDIPUS OFF OFFENBACH OFFEND OFFENDED OFFENDER OFFENDERS OFFENDING OFFENDS OFFENSE OFFENSES OFFENSIVE OFFENSIVELY OFFENSIVENESS OFFER OFFERED OFFERER OFFERERS OFFERING OFFERINGS OFFERS OFFHAND OFFICE OFFICEMATE OFFICER OFFICERS OFFICES OFFICIAL OFFICIALDOM OFFICIALLY OFFICIALS OFFICIATE OFFICIO OFFICIOUS OFFICIOUSLY OFFICIOUSNESS OFFING OFFLOAD OFFS OFFSET OFFSETS OFFSETTING OFFSHORE OFFSPRING OFT OFTEN OFTENTIMES OGDEN OHIO OHM OHMMETER OIL OILCLOTH OILED OILER OILERS OILIER OILIEST OILING OILS OILY OINTMENT OJIBWA OKAMOTO OKAY OKINAWA OKLAHOMA OKLAHOMAN OLAF OLAV OLD OLDEN OLDENBURG OLDER OLDEST OLDNESS OLDSMOBILE OLDUVAI OLDY OLEANDER OLEG OLEOMARGARINE OLGA OLIGARCHY OLIGOCENE OLIN OLIVE OLIVER OLIVERS OLIVES OLIVETTI OLIVIA OLIVIER OLSEN OLSON OLYMPIA OLYMPIAN OLYMPIANIZE OLYMPIANIZES OLYMPIC OLYMPICS OLYMPUS OMAHA OMAN OMEGA OMELET OMEN OMENS OMICRON OMINOUS OMINOUSLY OMINOUSNESS OMISSION OMISSIONS OMIT OMITS OMITTED OMITTING OMNIBUS OMNIDIRECTIONAL OMNIPOTENT OMNIPRESENT OMNISCIENT OMNISCIENTLY OMNIVORE ONANISM ONCE ONCOLOGY ONE ONEIDA ONENESS ONEROUS ONES ONESELF ONETIME ONGOING ONION ONIONS ONLINE ONLOOKER ONLY ONONDAGA ONRUSH ONSET ONSETS ONSLAUGHT ONTARIO ONTO ONTOLOGY ONUS ONWARD ONWARDS ONYX OOZE OOZED OPACITY OPAL OPALS OPAQUE OPAQUELY OPAQUENESS OPCODE OPEC OPEL OPEN OPENED OPENER OPENERS OPENING OPENINGS OPENLY OPENNESS OPENS OPERA OPERABLE OPERAND OPERANDI OPERANDS OPERAS OPERATE OPERATED OPERATES OPERATING OPERATION OPERATIONAL OPERATIONALLY OPERATIONS OPERATIVE OPERATIVES OPERATOR OPERATORS OPERETTA OPHIUCHUS OPHIUCUS OPIATE OPINION OPINIONS OPIUM OPOSSUM OPPENHEIMER OPPONENT OPPONENTS OPPORTUNE OPPORTUNELY OPPORTUNISM OPPORTUNISTIC OPPORTUNITIES OPPORTUNITY OPPOSABLE OPPOSE OPPOSED OPPOSES OPPOSING OPPOSITE OPPOSITELY OPPOSITENESS OPPOSITES OPPOSITION OPPRESS OPPRESSED OPPRESSES OPPRESSING OPPRESSION OPPRESSIVE OPPRESSOR OPPRESSORS OPPROBRIUM OPT OPTED OPTHALMIC OPTIC OPTICAL OPTICALLY OPTICS OPTIMA OPTIMAL OPTIMALITY OPTIMALLY OPTIMISM OPTIMIST OPTIMISTIC OPTIMISTICALLY OPTIMIZATION OPTIMIZATIONS OPTIMIZE OPTIMIZED OPTIMIZER OPTIMIZERS OPTIMIZES OPTIMIZING OPTIMUM OPTING OPTION OPTIONAL OPTIONALLY OPTIONS OPTOACOUSTIC OPTOMETRIST OPTOMETRY OPTS OPULENCE OPULENT OPUS ORACLE ORACLES ORAL ORALLY ORANGE ORANGES ORANGUTAN ORATION ORATIONS ORATOR ORATORIES ORATORS ORATORY ORB ORBIT ORBITAL ORBITALLY ORBITED ORBITER ORBITERS ORBITING ORBITS ORCHARD ORCHARDS ORCHESTRA ORCHESTRAL ORCHESTRAS ORCHESTRATE ORCHID ORCHIDS ORDAIN ORDAINED ORDAINING ORDAINS ORDEAL ORDER ORDERED ORDERING ORDERINGS ORDERLIES ORDERLY ORDERS ORDINAL ORDINANCE ORDINANCES ORDINARILY ORDINARINESS ORDINARY ORDINATE ORDINATES ORDINATION ORE OREGANO OREGON OREGONIANS ORES ORESTEIA ORESTES ORGAN ORGANIC ORGANISM ORGANISMS ORGANIST ORGANISTS ORGANIZABLE ORGANIZATION ORGANIZATIONAL ORGANIZATIONALLY ORGANIZATIONS ORGANIZE ORGANIZED ORGANIZER ORGANIZERS ORGANIZES ORGANIZING ORGANS ORGASM ORGIASTIC ORGIES ORGY ORIENT ORIENTAL ORIENTALIZATION ORIENTALIZATIONS ORIENTALIZE ORIENTALIZED ORIENTALIZES ORIENTALIZING ORIENTALS ORIENTATION ORIENTATIONS ORIENTED ORIENTING ORIENTS ORIFICE ORIFICES ORIGIN ORIGINAL ORIGINALITY ORIGINALLY ORIGINALS ORIGINATE ORIGINATED ORIGINATES ORIGINATING ORIGINATION ORIGINATOR ORIGINATORS ORIGINS ORIN ORINOCO ORIOLE ORION ORKNEY ORLANDO ORLEANS ORLICK ORLY ORNAMENT ORNAMENTAL ORNAMENTALLY ORNAMENTATION ORNAMENTED ORNAMENTING ORNAMENTS ORNATE ORNERY ORONO ORPHAN ORPHANAGE ORPHANED ORPHANS ORPHEUS ORPHIC ORPHICALLY ORR ORTEGA ORTHANT ORTHODONTIST ORTHODOX ORTHODOXY ORTHOGONAL ORTHOGONALITY ORTHOGONALLY ORTHOPEDIC ORVILLE ORWELL ORWELLIAN OSAKA OSBERT OSBORN OSBORNE OSCAR OSCILLATE OSCILLATED OSCILLATES OSCILLATING OSCILLATION OSCILLATIONS OSCILLATOR OSCILLATORS OSCILLATORY OSCILLOSCOPE OSCILLOSCOPES OSGOOD OSHKOSH OSIRIS OSLO OSMOSIS OSMOTIC OSSIFY OSTENSIBLE OSTENSIBLY OSTENTATIOUS OSTEOPATH OSTEOPATHIC OSTEOPATHY OSTEOPOROSIS OSTRACISM OSTRANDER OSTRICH OSTRICHES OSWALD OTHELLO OTHER OTHERS OTHERWISE OTHERWORLDLY OTIS OTT OTTAWA OTTER OTTERS OTTO OTTOMAN OTTOMANIZATION OTTOMANIZATIONS OTTOMANIZE OTTOMANIZES OUAGADOUGOU OUCH OUGHT OUNCE OUNCES OUR OURS OURSELF OURSELVES OUST OUT OUTBOUND OUTBREAK OUTBREAKS OUTBURST OUTBURSTS OUTCAST OUTCASTS OUTCOME OUTCOMES OUTCRIES OUTCRY OUTDATED OUTDO OUTDOOR OUTDOORS OUTER OUTERMOST OUTFIT OUTFITS OUTFITTED OUTGOING OUTGREW OUTGROW OUTGROWING OUTGROWN OUTGROWS OUTGROWTH OUTING OUTLANDISH OUTLAST OUTLASTS OUTLAW OUTLAWED OUTLAWING OUTLAWS OUTLAY OUTLAYS OUTLET OUTLETS OUTLINE OUTLINED OUTLINES OUTLINING OUTLIVE OUTLIVED OUTLIVES OUTLIVING OUTLOOK OUTLYING OUTNUMBERED OUTPERFORM OUTPERFORMED OUTPERFORMING OUTPERFORMS OUTPOST OUTPOSTS OUTPUT OUTPUTS OUTPUTTING OUTRAGE OUTRAGED OUTRAGEOUS OUTRAGEOUSLY OUTRAGES OUTRIGHT OUTRUN OUTRUNS OUTS OUTSET OUTSIDE OUTSIDER OUTSIDERS OUTSKIRTS OUTSTANDING OUTSTANDINGLY OUTSTRETCHED OUTSTRIP OUTSTRIPPED OUTSTRIPPING OUTSTRIPS OUTVOTE OUTVOTED OUTVOTES OUTVOTING OUTWARD OUTWARDLY OUTWEIGH OUTWEIGHED OUTWEIGHING OUTWEIGHS OUTWIT OUTWITS OUTWITTED OUTWITTING OVAL OVALS OVARIES OVARY OVEN OVENS OVER OVERALL OVERALLS OVERBOARD OVERCAME OVERCOAT OVERCOATS OVERCOME OVERCOMES OVERCOMING OVERCROWD OVERCROWDED OVERCROWDING OVERCROWDS OVERDONE OVERDOSE OVERDRAFT OVERDRAFTS OVERDUE OVEREMPHASIS OVEREMPHASIZED OVERESTIMATE OVERESTIMATED OVERESTIMATES OVERESTIMATING OVERESTIMATION OVERFLOW OVERFLOWED OVERFLOWING OVERFLOWS OVERGROWN OVERHANG OVERHANGING OVERHANGS OVERHAUL OVERHAULING OVERHEAD OVERHEADS OVERHEAR OVERHEARD OVERHEARING OVERHEARS OVERJOY OVERJOYED OVERKILL OVERLAND OVERLAP OVERLAPPED OVERLAPPING OVERLAPS OVERLAY OVERLAYING OVERLAYS OVERLOAD OVERLOADED OVERLOADING OVERLOADS OVERLOOK OVERLOOKED OVERLOOKING OVERLOOKS OVERLY OVERNIGHT OVERNIGHTER OVERNIGHTERS OVERPOWER OVERPOWERED OVERPOWERING OVERPOWERS OVERPRINT OVERPRINTED OVERPRINTING OVERPRINTS OVERPRODUCTION OVERRIDDEN OVERRIDE OVERRIDES OVERRIDING OVERRODE OVERRULE OVERRULED OVERRULES OVERRUN OVERRUNNING OVERRUNS OVERSEAS OVERSEE OVERSEEING OVERSEER OVERSEERS OVERSEES OVERSHADOW OVERSHADOWED OVERSHADOWING OVERSHADOWS OVERSHOOT OVERSHOT OVERSIGHT OVERSIGHTS OVERSIMPLIFIED OVERSIMPLIFIES OVERSIMPLIFY OVERSIMPLIFYING OVERSIZED OVERSTATE OVERSTATED OVERSTATEMENT OVERSTATEMENTS OVERSTATES OVERSTATING OVERSTOCKS OVERSUBSCRIBED OVERT OVERTAKE OVERTAKEN OVERTAKER OVERTAKERS OVERTAKES OVERTAKING OVERTHREW OVERTHROW OVERTHROWN OVERTIME OVERTLY OVERTONE OVERTONES OVERTOOK OVERTURE OVERTURES OVERTURN OVERTURNED OVERTURNING OVERTURNS OVERUSE OVERVIEW OVERVIEWS OVERWHELM OVERWHELMED OVERWHELMING OVERWHELMINGLY OVERWHELMS OVERWORK OVERWORKED OVERWORKING OVERWORKS OVERWRITE OVERWRITES OVERWRITING OVERWRITTEN OVERZEALOUS OVID OWE OWED OWEN OWENS OWES OWING OWL OWLS OWN OWNED OWNER OWNERS OWNERSHIP OWNERSHIPS OWNING OWNS OXEN OXFORD OXIDE OXIDES OXIDIZE OXIDIZED OXNARD OXONIAN OXYGEN OYSTER OYSTERS OZARK OZARKS OZONE OZZIE PABLO PABST PACE PACED PACEMAKER PACER PACERS PACES PACIFIC PACIFICATION PACIFIED PACIFIER PACIFIES PACIFISM PACIFIST PACIFY PACING PACK PACKAGE PACKAGED PACKAGER PACKAGERS PACKAGES PACKAGING PACKAGINGS PACKARD PACKARDS PACKED PACKER PACKERS PACKET PACKETS PACKING PACKS PACKWOOD PACT PACTS PAD PADDED PADDING PADDLE PADDOCK PADDY PADLOCK PADS PAGAN PAGANINI PAGANS PAGE PAGEANT PAGEANTRY PAGEANTS PAGED PAGER PAGERS PAGES PAGINATE PAGINATED PAGINATES PAGINATING PAGINATION PAGING PAGODA PAID PAIL PAILS PAIN PAINE PAINED PAINFUL PAINFULLY PAINLESS PAINS PAINSTAKING PAINSTAKINGLY PAINT PAINTED PAINTER PAINTERS PAINTING PAINTINGS PAINTS PAIR PAIRED PAIRING PAIRINGS PAIRS PAIRWISE PAJAMA PAJAMAS PAKISTAN PAKISTANI PAKISTANIS PAL PALACE PALACES PALATE PALATES PALATINE PALE PALED PALELY PALENESS PALEOLITHIC PALEOZOIC PALER PALERMO PALES PALEST PALESTINE PALESTINIAN PALFREY PALINDROME PALINDROMIC PALING PALL PALLADIAN PALLADIUM PALLIATE PALLIATIVE PALLID PALM PALMED PALMER PALMING PALMOLIVE PALMS PALMYRA PALO PALOMAR PALPABLE PALS PALSY PAM PAMELA PAMPER PAMPHLET PAMPHLETS PAN PANACEA PANACEAS PANAMA PANAMANIAN PANCAKE PANCAKES PANCHO PANDA PANDANUS PANDAS PANDEMIC PANDEMONIUM PANDER PANDORA PANE PANEL PANELED PANELING PANELIST PANELISTS PANELS PANES PANG PANGAEA PANGS PANIC PANICKED PANICKING PANICKY PANICS PANNED PANNING PANORAMA PANORAMIC PANS PANSIES PANSY PANT PANTED PANTHEISM PANTHEIST PANTHEON PANTHER PANTHERS PANTIES PANTING PANTOMIME PANTRIES PANTRY PANTS PANTY PANTYHOSE PAOLI PAPA PAPAL PAPER PAPERBACK PAPERBACKS PAPERED PAPERER PAPERERS PAPERING PAPERINGS PAPERS PAPERWEIGHT PAPERWORK PAPOOSE PAPPAS PAPUA PAPYRUS PAR PARABOLA PARABOLIC PARABOLOID PARABOLOIDAL PARACHUTE PARACHUTED PARACHUTES PARADE PARADED PARADES PARADIGM PARADIGMS PARADING PARADISE PARADOX PARADOXES PARADOXICAL PARADOXICALLY PARAFFIN PARAGON PARAGONS PARAGRAPH PARAGRAPHING PARAGRAPHS PARAGUAY PARAGUAYAN PARAGUAYANS PARAKEET PARALLAX PARALLEL PARALLELED PARALLELING PARALLELISM PARALLELIZE PARALLELIZED PARALLELIZES PARALLELIZING PARALLELOGRAM PARALLELOGRAMS PARALLELS PARALYSIS PARALYZE PARALYZED PARALYZES PARALYZING PARAMETER PARAMETERIZABLE PARAMETERIZATION PARAMETERIZATIONS PARAMETERIZE PARAMETERIZED PARAMETERIZES PARAMETERIZING PARAMETERLESS PARAMETERS PARAMETRIC PARAMETRIZED PARAMILITARY PARAMOUNT PARAMUS PARANOIA PARANOIAC PARANOID PARANORMAL PARAPET PARAPETS PARAPHERNALIA PARAPHRASE PARAPHRASED PARAPHRASES PARAPHRASING PARAPSYCHOLOGY PARASITE PARASITES PARASITIC PARASITICS PARASOL PARBOIL PARC PARCEL PARCELED PARCELING PARCELS PARCH PARCHED PARCHMENT PARDON PARDONABLE PARDONABLY PARDONED PARDONER PARDONERS PARDONING PARDONS PARE PAREGORIC PARENT PARENTAGE PARENTAL PARENTHESES PARENTHESIS PARENTHESIZED PARENTHESIZES PARENTHESIZING PARENTHETIC PARENTHETICAL PARENTHETICALLY PARENTHOOD PARENTS PARES PARETO PARIAH PARIMUTUEL PARING PARINGS PARIS PARISH PARISHES PARISHIONER PARISIAN PARISIANIZATION PARISIANIZATIONS PARISIANIZE PARISIANIZES PARITY PARK PARKE PARKED PARKER PARKERS PARKERSBURG PARKHOUSE PARKING PARKINSON PARKINSONIAN PARKLAND PARKLIKE PARKS PARKWAY PARLAY PARLEY PARLIAMENT PARLIAMENTARIAN PARLIAMENTARY PARLIAMENTS PARLOR PARLORS PARMESAN PAROCHIAL PARODY PAROLE PAROLED PAROLES PAROLING PARR PARRIED PARRISH PARROT PARROTING PARROTS PARRS PARRY PARS PARSE PARSED PARSER PARSERS PARSES PARSI PARSIFAL PARSIMONY PARSING PARSINGS PARSLEY PARSON PARSONS PART PARTAKE PARTAKER PARTAKES PARTAKING PARTED PARTER PARTERS PARTHENON PARTHIA PARTIAL PARTIALITY PARTIALLY PARTICIPANT PARTICIPANTS PARTICIPATE PARTICIPATED PARTICIPATES PARTICIPATING PARTICIPATION PARTICIPLE PARTICLE PARTICLES PARTICULAR PARTICULARLY PARTICULARS PARTICULATE PARTIES PARTING PARTINGS PARTISAN PARTISANS PARTITION PARTITIONED PARTITIONING PARTITIONS PARTLY PARTNER PARTNERED PARTNERS PARTNERSHIP PARTOOK PARTRIDGE PARTRIDGES PARTS PARTY PASADENA PASCAL PASCAL PASO PASS PASSAGE PASSAGES PASSAGEWAY PASSAIC PASSE PASSED PASSENGER PASSENGERS PASSER PASSERS PASSES PASSING PASSION PASSIONATE PASSIONATELY PASSIONS PASSIVATE PASSIVE PASSIVELY PASSIVENESS PASSIVITY PASSOVER PASSPORT PASSPORTS PASSWORD PASSWORDS PAST PASTE PASTED PASTEL PASTERNAK PASTES PASTEUR PASTIME PASTIMES PASTING PASTNESS PASTOR PASTORAL PASTORS PASTRY PASTS PASTURE PASTURES PAT PATAGONIA PATAGONIANS PATCH PATCHED PATCHES PATCHING PATCHWORK PATCHY PATE PATEN PATENT PATENTABLE PATENTED PATENTER PATENTERS PATENTING PATENTLY PATENTS PATERNAL PATERNALLY PATERNOSTER PATERSON PATH PATHETIC PATHNAME PATHNAMES PATHOGEN PATHOGENESIS PATHOLOGICAL PATHOLOGY PATHOS PATHS PATHWAY PATHWAYS PATIENCE PATIENT PATIENTLY PATIENTS PATINA PATIO PATRIARCH PATRIARCHAL PATRIARCHS PATRIARCHY PATRICE PATRICIA PATRICIAN PATRICIANS PATRICK PATRIMONIAL PATRIMONY PATRIOT PATRIOTIC PATRIOTISM PATRIOTS PATROL PATROLLED PATROLLING PATROLMAN PATROLMEN PATROLS PATRON PATRONAGE PATRONIZE PATRONIZED PATRONIZES PATRONIZING PATRONS PATS PATSIES PATSY PATTER PATTERED PATTERING PATTERINGS PATTERN PATTERNED PATTERNING PATTERNS PATTERS PATTERSON PATTI PATTIES PATTON PATTY PAUCITY PAUL PAULA PAULETTE PAULI PAULINE PAULING PAULINIZE PAULINIZES PAULO PAULSEN PAULSON PAULUS PAUNCH PAUNCHY PAUPER PAUSE PAUSED PAUSES PAUSING PAVE PAVED PAVEMENT PAVEMENTS PAVES PAVILION PAVILIONS PAVING PAVLOV PAVLOVIAN PAW PAWING PAWN PAWNS PAWNSHOP PAWS PAWTUCKET PAY PAYABLE PAYCHECK PAYCHECKS PAYED PAYER PAYERS PAYING PAYMENT PAYMENTS PAYNE PAYNES PAYNIZE PAYNIZES PAYOFF PAYOFFS PAYROLL PAYS PAYSON PAZ PEA PEABODY PEACE PEACEABLE PEACEFUL PEACEFULLY PEACEFULNESS PEACETIME PEACH PEACHES PEACHTREE PEACOCK PEACOCKS PEAK PEAKED PEAKS PEAL PEALE PEALED PEALING PEALS PEANUT PEANUTS PEAR PEARCE PEARL PEARLS PEARLY PEARS PEARSON PEAS PEASANT PEASANTRY PEASANTS PEASE PEAT PEBBLE PEBBLES PECCARY PECK PECKED PECKING PECKS PECOS PECTORAL PECULIAR PECULIARITIES PECULIARITY PECULIARLY PECUNIARY PEDAGOGIC PEDAGOGICAL PEDAGOGICALLY PEDAGOGY PEDAL PEDANT PEDANTIC PEDANTRY PEDDLE PEDDLER PEDDLERS PEDESTAL PEDESTRIAN PEDESTRIANS PEDIATRIC PEDIATRICIAN PEDIATRICS PEDIGREE PEDRO PEEK PEEKED PEEKING PEEKS PEEL PEELED PEELING PEELS PEEP PEEPED PEEPER PEEPHOLE PEEPING PEEPS PEER PEERED PEERING PEERLESS PEERS PEG PEGASUS PEGBOARD PEGGY PEGS PEIPING PEJORATIVE PEKING PELHAM PELICAN PELLAGRA PELOPONNESE PELT PELTING PELTS PELVIC PELVIS PEMBROKE PEN PENAL PENALIZE PENALIZED PENALIZES PENALIZING PENALTIES PENALTY PENANCE PENCE PENCHANT PENCIL PENCILED PENCILS PEND PENDANT PENDED PENDING PENDLETON PENDS PENDULUM PENDULUMS PENELOPE PENETRABLE PENETRATE PENETRATED PENETRATES PENETRATING PENETRATINGLY PENETRATION PENETRATIONS PENETRATIVE PENETRATOR PENETRATORS PENGUIN PENGUINS PENH PENICILLIN PENINSULA PENINSULAS PENIS PENISES PENITENT PENITENTIARY PENN PENNED PENNIES PENNILESS PENNING PENNSYLVANIA PENNY PENROSE PENS PENSACOLA PENSION PENSIONER PENSIONS PENSIVE PENT PENTAGON PENTAGONS PENTATEUCH PENTECOST PENTECOSTAL PENTHOUSE PENULTIMATE PENUMBRA PEONY PEOPLE PEOPLED PEOPLES PEORIA PEP PEPPER PEPPERED PEPPERING PEPPERMINT PEPPERONI PEPPERS PEPPERY PEPPY PEPSI PEPSICO PEPSICO PEPTIDE PER PERCEIVABLE PERCEIVABLY PERCEIVE PERCEIVED PERCEIVER PERCEIVERS PERCEIVES PERCEIVING PERCENT PERCENTAGE PERCENTAGES PERCENTILE PERCENTILES PERCENTS PERCEPTIBLE PERCEPTIBLY PERCEPTION PERCEPTIONS PERCEPTIVE PERCEPTIVELY PERCEPTUAL PERCEPTUALLY PERCH PERCHANCE PERCHED PERCHES PERCHING PERCIVAL PERCUSSION PERCUTANEOUS PERCY PEREMPTORY PERENNIAL PERENNIALLY PEREZ PERFECT PERFECTED PERFECTIBLE PERFECTING PERFECTION PERFECTIONIST PERFECTIONISTS PERFECTLY PERFECTNESS PERFECTS PERFORCE PERFORM PERFORMANCE PERFORMANCES PERFORMED PERFORMER PERFORMERS PERFORMING PERFORMS PERFUME PERFUMED PERFUMES PERFUMING PERFUNCTORY PERGAMON PERHAPS PERICLEAN PERICLES PERIHELION PERIL PERILLA PERILOUS PERILOUSLY PERILS PERIMETER PERIOD PERIODIC PERIODICAL PERIODICALLY PERIODICALS PERIODS PERIPHERAL PERIPHERALLY PERIPHERALS PERIPHERIES PERIPHERY PERISCOPE PERISH PERISHABLE PERISHABLES PERISHED PERISHER PERISHERS PERISHES PERISHING PERJURE PERJURY PERK PERKINS PERKY PERLE PERMANENCE PERMANENT PERMANENTLY PERMEABLE PERMEATE PERMEATED PERMEATES PERMEATING PERMEATION PERMIAN PERMISSIBILITY PERMISSIBLE PERMISSIBLY PERMISSION PERMISSIONS PERMISSIVE PERMISSIVELY PERMIT PERMITS PERMITTED PERMITTING PERMUTATION PERMUTATIONS PERMUTE PERMUTED PERMUTES PERMUTING PERNICIOUS PERNOD PEROXIDE PERPENDICULAR PERPENDICULARLY PERPENDICULARS PERPETRATE PERPETRATED PERPETRATES PERPETRATING PERPETRATION PERPETRATIONS PERPETRATOR PERPETRATORS PERPETUAL PERPETUALLY PERPETUATE PERPETUATED PERPETUATES PERPETUATING PERPETUATION PERPETUITY PERPLEX PERPLEXED PERPLEXING PERPLEXITY PERRY PERSECUTE PERSECUTED PERSECUTES PERSECUTING PERSECUTION PERSECUTOR PERSECUTORS PERSEID PERSEPHONE PERSEUS PERSEVERANCE PERSEVERE PERSEVERED PERSEVERES PERSEVERING PERSHING PERSIA PERSIAN PERSIANIZATION PERSIANIZATIONS PERSIANIZE PERSIANIZES PERSIANS PERSIST PERSISTED PERSISTENCE PERSISTENT PERSISTENTLY PERSISTING PERSISTS PERSON PERSONAGE PERSONAGES PERSONAL PERSONALITIES PERSONALITY PERSONALIZATION PERSONALIZE PERSONALIZED PERSONALIZES PERSONALIZING PERSONALLY PERSONIFICATION PERSONIFIED PERSONIFIES PERSONIFY PERSONIFYING PERSONNEL PERSONS PERSPECTIVE PERSPECTIVES PERSPICUOUS PERSPICUOUSLY PERSPIRATION PERSPIRE PERSUADABLE PERSUADE PERSUADED PERSUADER PERSUADERS PERSUADES PERSUADING PERSUASION PERSUASIONS PERSUASIVE PERSUASIVELY PERSUASIVENESS PERTAIN PERTAINED PERTAINING PERTAINS PERTH PERTINENT PERTURB PERTURBATION PERTURBATIONS PERTURBED PERU PERUSAL PERUSE PERUSED PERUSER PERUSERS PERUSES PERUSING PERUVIAN PERUVIANIZE PERUVIANIZES PERUVIANS PERVADE PERVADED PERVADES PERVADING PERVASIVE PERVASIVELY PERVERSION PERVERT PERVERTED PERVERTS PESSIMISM PESSIMIST PESSIMISTIC PEST PESTER PESTICIDE PESTILENCE PESTILENT PESTS PET PETAL PETALS PETE PETER PETERS PETERSBURG PETERSEN PETERSON PETITION PETITIONED PETITIONER PETITIONING PETITIONS PETKIEWICZ PETRI PETROLEUM PETS PETTED PETTER PETTERS PETTIBONE PETTICOAT PETTICOATS PETTINESS PETTING PETTY PETULANCE PETULANT PEUGEOT PEW PEWAUKEE PEWS PEWTER PFIZER PHAEDRA PHANTOM PHANTOMS PHARMACEUTIC PHARMACIST PHARMACOLOGY PHARMACOPOEIA PHARMACY PHASE PHASED PHASER PHASERS PHASES PHASING PHEASANT PHEASANTS PHELPS PHENOMENA PHENOMENAL PHENOMENALLY PHENOMENOLOGICAL PHENOMENOLOGICALLY PHENOMENOLOGIES PHENOMENOLOGY PHENOMENON PHI PHIGS PHIL PHILADELPHIA PHILANTHROPY PHILCO PHILHARMONIC PHILIP PHILIPPE PHILIPPIANS PHILIPPINE PHILIPPINES PHILISTINE PHILISTINES PHILISTINIZE PHILISTINIZES PHILLIES PHILLIP PHILLIPS PHILLY PHILOSOPHER PHILOSOPHERS PHILOSOPHIC PHILOSOPHICAL PHILOSOPHICALLY PHILOSOPHIES PHILOSOPHIZE PHILOSOPHIZED PHILOSOPHIZER PHILOSOPHIZERS PHILOSOPHIZES PHILOSOPHIZING PHILOSOPHY PHIPPS PHOBOS PHOENICIA PHOENIX PHONE PHONED PHONEME PHONEMES PHONEMIC PHONES PHONETIC PHONETICS PHONING PHONOGRAPH PHONOGRAPHS PHONY PHOSGENE PHOSPHATE PHOSPHATES PHOSPHOR PHOSPHORESCENT PHOSPHORIC PHOSPHORUS PHOTO PHOTOCOPIED PHOTOCOPIER PHOTOCOPIERS PHOTOCOPIES PHOTOCOPY PHOTOCOPYING PHOTODIODE PHOTODIODES PHOTOGENIC PHOTOGRAPH PHOTOGRAPHED PHOTOGRAPHER PHOTOGRAPHERS PHOTOGRAPHIC PHOTOGRAPHING PHOTOGRAPHS PHOTOGRAPHY PHOTON PHOTOS PHOTOSENSITIVE PHOTOTYPESETTER PHOTOTYPESETTERS PHRASE PHRASED PHRASEOLOGY PHRASES PHRASING PHRASINGS PHYLA PHYLLIS PHYLUM PHYSIC PHYSICAL PHYSICALLY PHYSICALNESS PHYSICALS PHYSICIAN PHYSICIANS PHYSICIST PHYSICISTS PHYSICS PHYSIOLOGICAL PHYSIOLOGICALLY PHYSIOLOGY PHYSIOTHERAPIST PHYSIOTHERAPY PHYSIQUE PHYTOPLANKTON PIANIST PIANO PIANOS PICA PICAS PICASSO PICAYUNE PICCADILLY PICCOLO PICK PICKAXE PICKED PICKER PICKERING PICKERS PICKET PICKETED PICKETER PICKETERS PICKETING PICKETS PICKETT PICKFORD PICKING PICKINGS PICKLE PICKLED PICKLES PICKLING PICKMAN PICKS PICKUP PICKUPS PICKY PICNIC PICNICKED PICNICKING PICNICS PICOFARAD PICOJOULE PICOSECOND PICT PICTORIAL PICTORIALLY PICTURE PICTURED PICTURES PICTURESQUE PICTURESQUENESS PICTURING PIDDLE PIDGIN PIE PIECE PIECED PIECEMEAL PIECES PIECEWISE PIECING PIEDFORT PIEDMONT PIER PIERCE PIERCED PIERCES PIERCING PIERRE PIERS PIERSON PIES PIETY PIEZOELECTRIC PIG PIGEON PIGEONHOLE PIGEONS PIGGISH PIGGY PIGGYBACK PIGGYBACKED PIGGYBACKING PIGGYBACKS PIGMENT PIGMENTATION PIGMENTED PIGMENTS PIGPEN PIGS PIGSKIN PIGTAIL PIKE PIKER PIKES PILATE PILE PILED PILERS PILES PILFER PILFERAGE PILGRIM PILGRIMAGE PILGRIMAGES PILGRIMS PILING PILINGS PILL PILLAGE PILLAGED PILLAR PILLARED PILLARS PILLORY PILLOW PILLOWS PILLS PILLSBURY PILOT PILOTING PILOTS PIMP PIMPLE PIN PINAFORE PINBALL PINCH PINCHED PINCHES PINCHING PINCUSHION PINE PINEAPPLE PINEAPPLES PINED PINEHURST PINES PING PINHEAD PINHOLE PINING PINION PINK PINKER PINKEST PINKIE PINKISH PINKLY PINKNESS PINKS PINNACLE PINNACLES PINNED PINNING PINNINGS PINOCHLE PINPOINT PINPOINTING PINPOINTS PINS PINSCHER PINSKY PINT PINTO PINTS PINWHEEL PION PIONEER PIONEERED PIONEERING PIONEERS PIOTR PIOUS PIOUSLY PIP PIPE PIPED PIPELINE PIPELINED PIPELINES PIPELINING PIPER PIPERS PIPES PIPESTONE PIPETTE PIPING PIQUE PIRACY PIRAEUS PIRATE PIRATES PISA PISCATAWAY PISCES PISS PISTACHIO PISTIL PISTILS PISTOL PISTOLS PISTON PISTONS PIT PITCH PITCHED PITCHER PITCHERS PITCHES PITCHFORK PITCHING PITEOUS PITEOUSLY PITFALL PITFALLS PITH PITHED PITHES PITHIER PITHIEST PITHINESS PITHING PITHY PITIABLE PITIED PITIER PITIERS PITIES PITIFUL PITIFULLY PITILESS PITILESSLY PITNEY PITS PITT PITTED PITTSBURGH PITTSBURGHERS PITTSFIELD PITTSTON PITUITARY PITY PITYING PITYINGLY PIUS PIVOT PIVOTAL PIVOTING PIVOTS PIXEL PIXELS PIZARRO PIZZA PLACARD PLACARDS PLACATE PLACE PLACEBO PLACED PLACEHOLDER PLACEMENT PLACEMENTS PLACENTA PLACENTAL PLACER PLACES PLACID PLACIDLY PLACING PLAGIARISM PLAGIARIST PLAGUE PLAGUED PLAGUES PLAGUING PLAID PLAIDS PLAIN PLAINER PLAINEST PLAINFIELD PLAINLY PLAINNESS PLAINS PLAINTEXT PLAINTEXTS PLAINTIFF PLAINTIFFS PLAINTIVE PLAINTIVELY PLAINTIVENESS PLAINVIEW PLAIT PLAITS PLAN PLANAR PLANARITY PLANCK PLANE PLANED PLANELOAD PLANER PLANERS PLANES PLANET PLANETARIA PLANETARIUM PLANETARY PLANETESIMAL PLANETOID PLANETS PLANING PLANK PLANKING PLANKS PLANKTON PLANNED PLANNER PLANNERS PLANNING PLANOCONCAVE PLANOCONVEX PLANS PLANT PLANTATION PLANTATIONS PLANTED PLANTER PLANTERS PLANTING PLANTINGS PLANTS PLAQUE PLASMA PLASTER PLASTERED PLASTERER PLASTERING PLASTERS PLASTIC PLASTICITY PLASTICS PLATE PLATEAU PLATEAUS PLATED PLATELET PLATELETS PLATEN PLATENS PLATES PLATFORM PLATFORMS PLATING PLATINUM PLATITUDE PLATO PLATONIC PLATONISM PLATONIST PLATOON PLATTE PLATTER PLATTERS PLATTEVILLE PLAUSIBILITY PLAUSIBLE PLAY PLAYABLE PLAYBACK PLAYBOY PLAYED PLAYER PLAYERS PLAYFUL PLAYFULLY PLAYFULNESS PLAYGROUND PLAYGROUNDS PLAYHOUSE PLAYING PLAYMATE PLAYMATES PLAYOFF PLAYROOM PLAYS PLAYTHING PLAYTHINGS PLAYTIME PLAYWRIGHT PLAYWRIGHTS PLAYWRITING PLAZA PLEA PLEAD PLEADED PLEADER PLEADING PLEADS PLEAS PLEASANT PLEASANTLY PLEASANTNESS PLEASE PLEASED PLEASES PLEASING PLEASINGLY PLEASURE PLEASURES PLEAT PLEBEIAN PLEBIAN PLEBISCITE PLEBISCITES PLEDGE PLEDGED PLEDGES PLEIADES PLEISTOCENE PLENARY PLENIPOTENTIARY PLENTEOUS PLENTIFUL PLENTIFULLY PLENTY PLETHORA PLEURISY PLEXIGLAS PLIABLE PLIANT PLIED PLIERS PLIES PLIGHT PLINY PLIOCENE PLOD PLODDING PLOT PLOTS PLOTTED PLOTTER PLOTTERS PLOTTING PLOW PLOWED PLOWER PLOWING PLOWMAN PLOWS PLOWSHARE PLOY PLOYS PLUCK PLUCKED PLUCKING PLUCKS PLUCKY PLUG PLUGGABLE PLUGGED PLUGGING PLUGS PLUM PLUMAGE PLUMB PLUMBED PLUMBING PLUMBS PLUME PLUMED PLUMES PLUMMET PLUMMETING PLUMP PLUMPED PLUMPNESS PLUMS PLUNDER PLUNDERED PLUNDERER PLUNDERERS PLUNDERING PLUNDERS PLUNGE PLUNGED PLUNGER PLUNGERS PLUNGES PLUNGING PLUNK PLURAL PLURALITY PLURALS PLUS PLUSES PLUSH PLUTARCH PLUTO PLUTONIUM PLY PLYMOUTH PLYWOOD PNEUMATIC PNEUMONIA POACH POACHER POACHES POCAHONTAS POCKET POCKETBOOK POCKETBOOKS POCKETED POCKETFUL POCKETING POCKETS POCONO POCONOS POD PODIA PODIUM PODS PODUNK POE POEM POEMS POET POETIC POETICAL POETICALLY POETICS POETRIES POETRY POETS POGO POGROM POIGNANCY POIGNANT POINCARE POINDEXTER POINT POINTED POINTEDLY POINTER POINTERS POINTING POINTLESS POINTS POINTY POISE POISED POISES POISON POISONED POISONER POISONING POISONOUS POISONOUSNESS POISONS POISSON POKE POKED POKER POKERFACE POKES POKING POLAND POLAR POLARIS POLARITIES POLARITY POLAROID POLE POLECAT POLED POLEMIC POLEMICS POLES POLICE POLICED POLICEMAN POLICEMEN POLICES POLICIES POLICING POLICY POLING POLIO POLISH POLISHED POLISHER POLISHERS POLISHES POLISHING POLITBURO POLITE POLITELY POLITENESS POLITER POLITEST POLITIC POLITICAL POLITICALLY POLITICIAN POLITICIANS POLITICKING POLITICS POLK POLKA POLL POLLARD POLLED POLLEN POLLING POLLOI POLLS POLLUTANT POLLUTE POLLUTED POLLUTES POLLUTING POLLUTION POLLUX POLO POLYALPHABETIC POLYGON POLYGONS POLYHYMNIA POLYMER POLYMERS POLYMORPHIC POLYNESIA POLYNESIAN POLYNOMIAL POLYNOMIALS POLYPHEMUS POLYTECHNIC POLYTHEIST POMERANIA POMERANIAN POMONA POMP POMPADOUR POMPEII POMPEY POMPOSITY POMPOUS POMPOUSLY POMPOUSNESS PONCE PONCHARTRAIN PONCHO POND PONDER PONDERED PONDERING PONDEROUS PONDERS PONDS PONG PONIES PONTIAC PONTIFF PONTIFIC PONTIFICATE PONY POOCH POODLE POOL POOLE POOLED POOLING POOLS POOR POORER POOREST POORLY POORNESS POP POPCORN POPE POPEK POPEKS POPISH POPLAR POPLIN POPPED POPPIES POPPING POPPY POPS POPSICLE POPSICLES POPULACE POPULAR POPULARITY POPULARIZATION POPULARIZE POPULARIZED POPULARIZES POPULARIZING POPULARLY POPULATE POPULATED POPULATES POPULATING POPULATION POPULATIONS POPULOUS POPULOUSNESS PORCELAIN PORCH PORCHES PORCINE PORCUPINE PORCUPINES PORE PORED PORES PORING PORK PORKER PORNOGRAPHER PORNOGRAPHIC PORNOGRAPHY POROUS PORPOISE PORRIDGE PORT PORTABILITY PORTABLE PORTAGE PORTAL PORTALS PORTE PORTED PORTEND PORTENDED PORTENDING PORTENDS PORTENT PORTENTOUS PORTER PORTERHOUSE PORTERS PORTFOLIO PORTFOLIOS PORTIA PORTICO PORTING PORTION PORTIONS PORTLAND PORTLY PORTMANTEAU PORTO PORTRAIT PORTRAITS PORTRAY PORTRAYAL PORTRAYED PORTRAYING PORTRAYS PORTS PORTSMOUTH PORTUGAL PORTUGUESE POSE POSED POSEIDON POSER POSERS POSES POSH POSING POSIT POSITED POSITING POSITION POSITIONAL POSITIONED POSITIONING POSITIONS POSITIVE POSITIVELY POSITIVENESS POSITIVES POSITRON POSITS POSNER POSSE POSSESS POSSESSED POSSESSES POSSESSING POSSESSION POSSESSIONAL POSSESSIONS POSSESSIVE POSSESSIVELY POSSESSIVENESS POSSESSOR POSSESSORS POSSIBILITIES POSSIBILITY POSSIBLE POSSIBLY POSSUM POSSUMS POST POSTAGE POSTAL POSTCARD POSTCONDITION POSTDOCTORAL POSTED POSTER POSTERIOR POSTERIORI POSTERITY POSTERS POSTFIX POSTGRADUATE POSTING POSTLUDE POSTMAN POSTMARK POSTMASTER POSTMASTERS POSTMORTEM POSTOPERATIVE POSTORDER POSTPONE POSTPONED POSTPONING POSTPROCESS POSTPROCESSOR POSTS POSTSCRIPT POSTSCRIPTS POSTULATE POSTULATED POSTULATES POSTULATING POSTULATION POSTULATIONS POSTURE POSTURES POT POTABLE POTASH POTASSIUM POTATO POTATOES POTBELLY POTEMKIN POTENT POTENTATE POTENTATES POTENTIAL POTENTIALITIES POTENTIALITY POTENTIALLY POTENTIALS POTENTIATING POTENTIOMETER POTENTIOMETERS POTHOLE POTION POTLATCH POTOMAC POTPOURRI POTS POTSDAM POTTAWATOMIE POTTED POTTER POTTERS POTTERY POTTING POTTS POUCH POUCHES POUGHKEEPSIE POULTICE POULTRY POUNCE POUNCED POUNCES POUNCING POUND POUNDED POUNDER POUNDERS POUNDING POUNDS POUR POURED POURER POURERS POURING POURS POUSSIN POUSSINS POUT POUTED POUTING POUTS POVERTY POWDER POWDERED POWDERING POWDERPUFF POWDERS POWDERY POWELL POWER POWERED POWERFUL POWERFULLY POWERFULNESS POWERING POWERLESS POWERLESSLY POWERLESSNESS POWERS POX POYNTING PRACTICABLE PRACTICABLY PRACTICAL PRACTICALITY PRACTICALLY PRACTICE PRACTICED PRACTICES PRACTICING PRACTITIONER PRACTITIONERS PRADESH PRADO PRAGMATIC PRAGMATICALLY PRAGMATICS PRAGMATISM PRAGMATIST PRAGUE PRAIRIE PRAISE PRAISED PRAISER PRAISERS PRAISES PRAISEWORTHY PRAISING PRAISINGLY PRANCE PRANCED PRANCER PRANCING PRANK PRANKS PRATE PRATT PRATTVILLE PRAVDA PRAY PRAYED PRAYER PRAYERS PRAYING PREACH PREACHED PREACHER PREACHERS PREACHES PREACHING PREALLOCATE PREALLOCATED PREALLOCATING PREAMBLE PREAMBLES PREASSIGN PREASSIGNED PREASSIGNING PREASSIGNS PRECAMBRIAN PRECARIOUS PRECARIOUSLY PRECARIOUSNESS PRECAUTION PRECAUTIONS PRECEDE PRECEDED PRECEDENCE PRECEDENCES PRECEDENT PRECEDENTED PRECEDENTS PRECEDES PRECEDING PRECEPT PRECEPTS PRECESS PRECESSION PRECINCT PRECINCTS PRECIOUS PRECIOUSLY PRECIOUSNESS PRECIPICE PRECIPITABLE PRECIPITATE PRECIPITATED PRECIPITATELY PRECIPITATENESS PRECIPITATES PRECIPITATING PRECIPITATION PRECIPITOUS PRECIPITOUSLY PRECISE PRECISELY PRECISENESS PRECISION PRECISIONS PRECLUDE PRECLUDED PRECLUDES PRECLUDING PRECOCIOUS PRECOCIOUSLY PRECOCITY PRECOMPUTE PRECOMPUTED PRECOMPUTING PRECONCEIVE PRECONCEIVED PRECONCEPTION PRECONCEPTIONS PRECONDITION PRECONDITIONED PRECONDITIONS PRECURSOR PRECURSORS PREDATE PREDATED PREDATES PREDATING PREDATORY PREDECESSOR PREDECESSORS PREDEFINE PREDEFINED PREDEFINES PREDEFINING PREDEFINITION PREDEFINITIONS PREDETERMINATION PREDETERMINE PREDETERMINED PREDETERMINES PREDETERMINING PREDICAMENT PREDICATE PREDICATED PREDICATES PREDICATING PREDICATION PREDICATIONS PREDICT PREDICTABILITY PREDICTABLE PREDICTABLY PREDICTED PREDICTING PREDICTION PREDICTIONS PREDICTIVE PREDICTOR PREDICTS PREDILECTION PREDILECTIONS PREDISPOSITION PREDOMINANT PREDOMINANTLY PREDOMINATE PREDOMINATED PREDOMINATELY PREDOMINATES PREDOMINATING PREDOMINATION PREEMINENCE PREEMINENT PREEMPT PREEMPTED PREEMPTING PREEMPTION PREEMPTIVE PREEMPTOR PREEMPTS PREEN PREEXISTING PREFAB PREFABRICATE PREFACE PREFACED PREFACES PREFACING PREFER PREFERABLE PREFERABLY PREFERENCE PREFERENCES PREFERENTIAL PREFERENTIALLY PREFERRED PREFERRING PREFERS PREFIX PREFIXED PREFIXES PREFIXING PREGNANCY PREGNANT PREHISTORIC PREINITIALIZE PREINITIALIZED PREINITIALIZES PREINITIALIZING PREJUDGE PREJUDGED PREJUDICE PREJUDICED PREJUDICES PREJUDICIAL PRELATE PRELIMINARIES PRELIMINARY PRELUDE PRELUDES PREMATURE PREMATURELY PREMATURITY PREMEDITATED PREMEDITATION PREMIER PREMIERS PREMISE PREMISES PREMIUM PREMIUMS PREMONITION PRENATAL PRENTICE PRENTICED PRENTICING PREOCCUPATION PREOCCUPIED PREOCCUPIES PREOCCUPY PREP PREPARATION PREPARATIONS PREPARATIVE PREPARATIVES PREPARATORY PREPARE PREPARED PREPARES PREPARING PREPEND PREPENDED PREPENDING PREPOSITION PREPOSITIONAL PREPOSITIONS PREPOSTEROUS PREPOSTEROUSLY PREPROCESSED PREPROCESSING PREPROCESSOR PREPROCESSORS PREPRODUCTION PREPROGRAMMED PREREQUISITE PREREQUISITES PREROGATIVE PREROGATIVES PRESBYTERIAN PRESBYTERIANISM PRESBYTERIANIZE PRESBYTERIANIZES PRESCOTT PRESCRIBE PRESCRIBED PRESCRIBES PRESCRIPTION PRESCRIPTIONS PRESCRIPTIVE PRESELECT PRESELECTED PRESELECTING PRESELECTS PRESENCE PRESENCES PRESENT PRESENTATION PRESENTATIONS PRESENTED PRESENTER PRESENTING PRESENTLY PRESENTNESS PRESENTS PRESERVATION PRESERVATIONS PRESERVE PRESERVED PRESERVER PRESERVERS PRESERVES PRESERVING PRESET PRESIDE PRESIDED PRESIDENCY PRESIDENT PRESIDENTIAL PRESIDENTS PRESIDES PRESIDING PRESLEY PRESS PRESSED PRESSER PRESSES PRESSING PRESSINGS PRESSURE PRESSURED PRESSURES PRESSURING PRESSURIZE PRESSURIZED PRESTIDIGITATE PRESTIGE PRESTIGIOUS PRESTON PRESUMABLY PRESUME PRESUMED PRESUMES PRESUMING PRESUMPTION PRESUMPTIONS PRESUMPTIVE PRESUMPTUOUS PRESUMPTUOUSNESS PRESUPPOSE PRESUPPOSED PRESUPPOSES PRESUPPOSING PRESUPPOSITION PRETEND PRETENDED PRETENDER PRETENDERS PRETENDING PRETENDS PRETENSE PRETENSES PRETENSION PRETENSIONS PRETENTIOUS PRETENTIOUSLY PRETENTIOUSNESS PRETEXT PRETEXTS PRETORIA PRETORIAN PRETTIER PRETTIEST PRETTILY PRETTINESS PRETTY PREVAIL PREVAILED PREVAILING PREVAILINGLY PREVAILS PREVALENCE PREVALENT PREVALENTLY PREVENT PREVENTABLE PREVENTABLY PREVENTED PREVENTING PREVENTION PREVENTIVE PREVENTIVES PREVENTS PREVIEW PREVIEWED PREVIEWING PREVIEWS PREVIOUS PREVIOUSLY PREY PREYED PREYING PREYS PRIAM PRICE PRICED PRICELESS PRICER PRICERS PRICES PRICING PRICK PRICKED PRICKING PRICKLY PRICKS PRIDE PRIDED PRIDES PRIDING PRIEST PRIESTLEY PRIGGISH PRIM PRIMA PRIMACY PRIMAL PRIMARIES PRIMARILY PRIMARY PRIMATE PRIME PRIMED PRIMENESS PRIMER PRIMERS PRIMES PRIMEVAL PRIMING PRIMITIVE PRIMITIVELY PRIMITIVENESS PRIMITIVES PRIMROSE PRINCE PRINCELY PRINCES PRINCESS PRINCESSES PRINCETON PRINCIPAL PRINCIPALITIES PRINCIPALITY PRINCIPALLY PRINCIPALS PRINCIPIA PRINCIPLE PRINCIPLED PRINCIPLES PRINT PRINTABLE PRINTABLY PRINTED PRINTER PRINTERS PRINTING PRINTOUT PRINTS PRIOR PRIORI PRIORITIES PRIORITY PRIORY PRISCILLA PRISM PRISMS PRISON PRISONER PRISONERS PRISONS PRISTINE PRITCHARD PRIVACIES PRIVACY PRIVATE PRIVATELY PRIVATES PRIVATION PRIVATIONS PRIVIES PRIVILEGE PRIVILEGED PRIVILEGES PRIVY PRIZE PRIZED PRIZER PRIZERS PRIZES PRIZEWINNING PRIZING PRO PROBABILISTIC PROBABILISTICALLY PROBABILITIES PROBABILITY PROBABLE PROBABLY PROBATE PROBATED PROBATES PROBATING PROBATION PROBATIVE PROBE PROBED PROBES PROBING PROBINGS PROBITY PROBLEM PROBLEMATIC PROBLEMATICAL PROBLEMATICALLY PROBLEMS PROCAINE PROCEDURAL PROCEDURALLY PROCEDURE PROCEDURES PROCEED PROCEEDED PROCEEDING PROCEEDINGS PROCEEDS PROCESS PROCESSED PROCESSES PROCESSING PROCESSION PROCESSOR PROCESSORS PROCLAIM PROCLAIMED PROCLAIMER PROCLAIMERS PROCLAIMING PROCLAIMS PROCLAMATION PROCLAMATIONS PROCLIVITIES PROCLIVITY PROCOTOLS PROCRASTINATE PROCRASTINATED PROCRASTINATES PROCRASTINATING PROCRASTINATION PROCREATE PROCRUSTEAN PROCRUSTEANIZE PROCRUSTEANIZES PROCRUSTES PROCTER PROCURE PROCURED PROCUREMENT PROCUREMENTS PROCURER PROCURERS PROCURES PROCURING PROCYON PROD PRODIGAL PRODIGALLY PRODIGIOUS PRODIGY PRODUCE PRODUCED PRODUCER PRODUCERS PRODUCES PRODUCIBLE PRODUCING PRODUCT PRODUCTION PRODUCTIONS PRODUCTIVE PRODUCTIVELY PRODUCTIVITY PRODUCTS PROFANE PROFANELY PROFESS PROFESSED PROFESSES PROFESSING PROFESSION PROFESSIONAL PROFESSIONALISM PROFESSIONALLY PROFESSIONALS PROFESSIONS PROFESSOR PROFESSORIAL PROFESSORS PROFFER PROFFERED PROFFERS PROFICIENCY PROFICIENT PROFICIENTLY PROFILE PROFILED PROFILES PROFILING PROFIT PROFITABILITY PROFITABLE PROFITABLY PROFITED PROFITEER PROFITEERS PROFITING PROFITS PROFITTED PROFLIGATE PROFOUND PROFOUNDEST PROFOUNDLY PROFUNDITY PROFUSE PROFUSION PROGENITOR PROGENY PROGNOSIS PROGNOSTICATE PROGRAM PROGRAMMABILITY PROGRAMMABLE PROGRAMMED PROGRAMMER PROGRAMMERS PROGRAMMING PROGRAMS PROGRESS PROGRESSED PROGRESSES PROGRESSING PROGRESSION PROGRESSIONS PROGRESSIVE PROGRESSIVELY PROHIBIT PROHIBITED PROHIBITING PROHIBITION PROHIBITIONS PROHIBITIVE PROHIBITIVELY PROHIBITORY PROHIBITS PROJECT PROJECTED PROJECTILE PROJECTING PROJECTION PROJECTIONS PROJECTIVE PROJECTIVELY PROJECTOR PROJECTORS PROJECTS PROKOFIEFF PROKOFIEV PROLATE PROLEGOMENA PROLETARIAT PROLIFERATE PROLIFERATED PROLIFERATES PROLIFERATING PROLIFERATION PROLIFIC PROLIX PROLOG PROLOGUE PROLONG PROLONGATE PROLONGED PROLONGING PROLONGS PROMENADE PROMENADES PROMETHEAN PROMETHEUS PROMINENCE PROMINENT PROMINENTLY PROMISCUOUS PROMISE PROMISED PROMISES PROMISING PROMONTORY PROMOTE PROMOTED PROMOTER PROMOTERS PROMOTES PROMOTING PROMOTION PROMOTIONAL PROMOTIONS PROMPT PROMPTED PROMPTER PROMPTEST PROMPTING PROMPTINGS PROMPTLY PROMPTNESS PROMPTS PROMULGATE PROMULGATED PROMULGATES PROMULGATING PROMULGATION PRONE PRONENESS PRONG PRONGED PRONGS PRONOUN PRONOUNCE PRONOUNCEABLE PRONOUNCED PRONOUNCEMENT PRONOUNCEMENTS PRONOUNCES PRONOUNCING PRONOUNS PRONUNCIATION PRONUNCIATIONS PROOF PROOFREAD PROOFREADER PROOFS PROP PROPAGANDA PROPAGANDIST PROPAGATE PROPAGATED PROPAGATES PROPAGATING PROPAGATION PROPAGATIONS PROPANE PROPEL PROPELLANT PROPELLED PROPELLER PROPELLERS PROPELLING PROPELS PROPENSITY PROPER PROPERLY PROPERNESS PROPERTIED PROPERTIES PROPERTY PROPHECIES PROPHECY PROPHESIED PROPHESIER PROPHESIES PROPHESY PROPHET PROPHETIC PROPHETS PROPITIOUS PROPONENT PROPONENTS PROPORTION PROPORTIONAL PROPORTIONALLY PROPORTIONATELY PROPORTIONED PROPORTIONING PROPORTIONMENT PROPORTIONS PROPOS PROPOSAL PROPOSALS PROPOSE PROPOSED PROPOSER PROPOSES PROPOSING PROPOSITION PROPOSITIONAL PROPOSITIONALLY PROPOSITIONED PROPOSITIONING PROPOSITIONS PROPOUND PROPOUNDED PROPOUNDING PROPOUNDS PROPRIETARY PROPRIETOR PROPRIETORS PROPRIETY PROPS PROPULSION PROPULSIONS PRORATE PRORATED PRORATES PROS PROSCENIUM PROSCRIBE PROSCRIPTION PROSE PROSECUTE PROSECUTED PROSECUTES PROSECUTING PROSECUTION PROSECUTIONS PROSECUTOR PROSELYTIZE PROSELYTIZED PROSELYTIZES PROSELYTIZING PROSERPINE PROSODIC PROSODICS PROSPECT PROSPECTED PROSPECTING PROSPECTION PROSPECTIONS PROSPECTIVE PROSPECTIVELY PROSPECTIVES PROSPECTOR PROSPECTORS PROSPECTS PROSPECTUS PROSPER PROSPERED PROSPERING PROSPERITY PROSPEROUS PROSPERS PROSTATE PROSTHETIC PROSTITUTE PROSTITUTION PROSTRATE PROSTRATION PROTAGONIST PROTEAN PROTECT PROTECTED PROTECTING PROTECTION PROTECTIONS PROTECTIVE PROTECTIVELY PROTECTIVENESS PROTECTOR PROTECTORATE PROTECTORS PROTECTS PROTEGE PROTEGES PROTEIN PROTEINS PROTEST PROTESTANT PROTESTANTISM PROTESTANTIZE PROTESTANTIZES PROTESTATION PROTESTATIONS PROTESTED PROTESTING PROTESTINGLY PROTESTOR PROTESTS PROTISTA PROTOCOL PROTOCOLS PROTON PROTONS PROTOPHYTA PROTOPLASM PROTOTYPE PROTOTYPED PROTOTYPES PROTOTYPICAL PROTOTYPICALLY PROTOTYPING PROTOZOA PROTOZOAN PROTRACT PROTRUDE PROTRUDED PROTRUDES PROTRUDING PROTRUSION PROTRUSIONS PROTUBERANT PROUD PROUDER PROUDEST PROUDLY PROUST PROVABILITY PROVABLE PROVABLY PROVE PROVED PROVEN PROVENANCE PROVENCE PROVER PROVERB PROVERBIAL PROVERBS PROVERS PROVES PROVIDE PROVIDED PROVIDENCE PROVIDENT PROVIDER PROVIDERS PROVIDES PROVIDING PROVINCE PROVINCES PROVINCIAL PROVING PROVISION PROVISIONAL PROVISIONALLY PROVISIONED PROVISIONING PROVISIONS PROVISO PROVOCATION PROVOKE PROVOKED PROVOKES PROVOST PROW PROWESS PROWL PROWLED PROWLER PROWLERS PROWLING PROWS PROXIMAL PROXIMATE PROXIMITY PROXMIRE PROXY PRUDENCE PRUDENT PRUDENTIAL PRUDENTLY PRUNE PRUNED PRUNER PRUNERS PRUNES PRUNING PRURIENT PRUSSIA PRUSSIAN PRUSSIANIZATION PRUSSIANIZATIONS PRUSSIANIZE PRUSSIANIZER PRUSSIANIZERS PRUSSIANIZES PRY PRYING PSALM PSALMS PSEUDO PSEUDOFILES PSEUDOINSTRUCTION PSEUDOINSTRUCTIONS PSEUDONYM PSEUDOPARALLELISM PSILOCYBIN PSYCH PSYCHE PSYCHEDELIC PSYCHES PSYCHIATRIC PSYCHIATRIST PSYCHIATRISTS PSYCHIATRY PSYCHIC PSYCHO PSYCHOANALYSIS PSYCHOANALYST PSYCHOANALYTIC PSYCHOBIOLOGY PSYCHOLOGICAL PSYCHOLOGICALLY PSYCHOLOGIST PSYCHOLOGISTS PSYCHOLOGY PSYCHOPATH PSYCHOPATHIC PSYCHOPHYSIC PSYCHOSES PSYCHOSIS PSYCHOSOCIAL PSYCHOSOMATIC PSYCHOTHERAPEUTIC PSYCHOTHERAPIST PSYCHOTHERAPY PSYCHOTIC PTOLEMAIC PTOLEMAISTS PTOLEMY PUB PUBERTY PUBLIC PUBLICATION PUBLICATIONS PUBLICITY PUBLICIZE PUBLICIZED PUBLICIZES PUBLICIZING PUBLICLY PUBLISH PUBLISHED PUBLISHER PUBLISHERS PUBLISHES PUBLISHING PUBS PUCCINI PUCKER PUCKERED PUCKERING PUCKERS PUDDING PUDDINGS PUDDLE PUDDLES PUDDLING PUERTO PUFF PUFFED PUFFIN PUFFING PUFFS PUGH PUKE PULASKI PULITZER PULL PULLED PULLER PULLEY PULLEYS PULLING PULLINGS PULLMAN PULLMANIZE PULLMANIZES PULLMANS PULLOVER PULLS PULMONARY PULP PULPING PULPIT PULPITS PULSAR PULSATE PULSATION PULSATIONS PULSE PULSED PULSES PULSING PUMA PUMICE PUMMEL PUMP PUMPED PUMPING PUMPKIN PUMPKINS PUMPS PUN PUNCH PUNCHED PUNCHER PUNCHES PUNCHING PUNCTUAL PUNCTUALLY PUNCTUATION PUNCTURE PUNCTURED PUNCTURES PUNCTURING PUNDIT PUNGENT PUNIC PUNISH PUNISHABLE PUNISHED PUNISHES PUNISHING PUNISHMENT PUNISHMENTS PUNITIVE PUNJAB PUNJABI PUNS PUNT PUNTED PUNTING PUNTS PUNY PUP PUPA PUPIL PUPILS PUPPET PUPPETEER PUPPETS PUPPIES PUPPY PUPS PURCELL PURCHASE PURCHASED PURCHASER PURCHASERS PURCHASES PURCHASING PURDUE PURE PURELY PURER PUREST PURGATORY PURGE PURGED PURGES PURGING PURIFICATION PURIFICATIONS PURIFIED PURIFIER PURIFIERS PURIFIES PURIFY PURIFYING PURINA PURIST PURITAN PURITANIC PURITANIZE PURITANIZER PURITANIZERS PURITANIZES PURITY PURPLE PURPLER PURPLEST PURPORT PURPORTED PURPORTEDLY PURPORTER PURPORTERS PURPORTING PURPORTS PURPOSE PURPOSED PURPOSEFUL PURPOSEFULLY PURPOSELY PURPOSES PURPOSIVE PURR PURRED PURRING PURRS PURSE PURSED PURSER PURSES PURSUANT PURSUE PURSUED PURSUER PURSUERS PURSUES PURSUING PURSUIT PURSUITS PURVEYOR PURVIEW PUS PUSAN PUSEY PUSH PUSHBUTTON PUSHDOWN PUSHED PUSHER PUSHERS PUSHES PUSHING PUSS PUSSY PUSSYCAT PUT PUTNAM PUTS PUTT PUTTER PUTTERING PUTTERS PUTTING PUTTY PUZZLE PUZZLED PUZZLEMENT PUZZLER PUZZLERS PUZZLES PUZZLING PUZZLINGS PYGMALION PYGMIES PYGMY PYLE PYONGYANG PYOTR PYRAMID PYRAMIDS PYRE PYREX PYRRHIC PYTHAGORAS PYTHAGOREAN PYTHAGOREANIZE PYTHAGOREANIZES PYTHAGOREANS PYTHON QATAR QUA QUACK QUACKED QUACKERY QUACKS QUAD QUADRANGLE QUADRANGULAR QUADRANT QUADRANTS QUADRATIC QUADRATICAL QUADRATICALLY QUADRATICS QUADRATURE QUADRATURES QUADRENNIAL QUADRILATERAL QUADRILLION QUADRUPLE QUADRUPLED QUADRUPLES QUADRUPLING QUADRUPOLE QUAFF QUAGMIRE QUAGMIRES QUAHOG QUAIL QUAILS QUAINT QUAINTLY QUAINTNESS QUAKE QUAKED QUAKER QUAKERESS QUAKERIZATION QUAKERIZATIONS QUAKERIZE QUAKERIZES QUAKERS QUAKES QUAKING QUALIFICATION QUALIFICATIONS QUALIFIED QUALIFIER QUALIFIERS QUALIFIES QUALIFY QUALIFYING QUALITATIVE QUALITATIVELY QUALITIES QUALITY QUALM QUANDARIES QUANDARY QUANTA QUANTICO QUANTIFIABLE QUANTIFICATION QUANTIFICATIONS QUANTIFIED QUANTIFIER QUANTIFIERS QUANTIFIES QUANTIFY QUANTIFYING QUANTILE QUANTITATIVE QUANTITATIVELY QUANTITIES QUANTITY QUANTIZATION QUANTIZE QUANTIZED QUANTIZES QUANTIZING QUANTUM QUARANTINE QUARANTINES QUARANTINING QUARK QUARREL QUARRELED QUARRELING QUARRELS QUARRELSOME QUARRIES QUARRY QUART QUARTER QUARTERBACK QUARTERED QUARTERING QUARTERLY QUARTERMASTER QUARTERS QUARTET QUARTETS QUARTILE QUARTS QUARTZ QUARTZITE QUASAR QUASH QUASHED QUASHES QUASHING QUASI QUASIMODO QUATERNARY QUAVER QUAVERED QUAVERING QUAVERS QUAY QUEASY QUEBEC QUEEN QUEENLY QUEENS QUEENSLAND QUEER QUEERER QUEEREST QUEERLY QUEERNESS QUELL QUELLING QUENCH QUENCHED QUENCHES QUENCHING QUERIED QUERIES QUERY QUERYING QUEST QUESTED QUESTER QUESTERS QUESTING QUESTION QUESTIONABLE QUESTIONABLY QUESTIONED QUESTIONER QUESTIONERS QUESTIONING QUESTIONINGLY QUESTIONINGS QUESTIONNAIRE QUESTIONNAIRES QUESTIONS QUESTS QUEUE QUEUED QUEUEING QUEUER QUEUERS QUEUES QUEUING QUEZON QUIBBLE QUICHUA QUICK QUICKEN QUICKENED QUICKENING QUICKENS QUICKER QUICKEST QUICKIE QUICKLIME QUICKLY QUICKNESS QUICKSAND QUICKSILVER QUIESCENT QUIET QUIETED QUIETER QUIETEST QUIETING QUIETLY QUIETNESS QUIETS QUIETUDE QUILL QUILT QUILTED QUILTING QUILTS QUINCE QUININE QUINN QUINT QUINTET QUINTILLION QUIP QUIRINAL QUIRK QUIRKY QUIT QUITE QUITO QUITS QUITTER QUITTERS QUITTING QUIVER QUIVERED QUIVERING QUIVERS QUIXOTE QUIXOTIC QUIXOTISM QUIZ QUIZZED QUIZZES QUIZZICAL QUIZZING QUO QUONSET QUORUM QUOTA QUOTAS QUOTATION QUOTATIONS QUOTE QUOTED QUOTES QUOTH QUOTIENT QUOTIENTS QUOTING RABAT RABBI RABBIT RABBITS RABBLE RABID RABIES RABIN RACCOON RACCOONS RACE RACED RACER RACERS RACES RACETRACK RACHEL RACHMANINOFF RACIAL RACIALLY RACINE RACING RACK RACKED RACKET RACKETEER RACKETEERING RACKETEERS RACKETS RACKING RACKS RADAR RADARS RADCLIFFE RADIAL RADIALLY RADIAN RADIANCE RADIANT RADIANTLY RADIATE RADIATED RADIATES RADIATING RADIATION RADIATIONS RADIATOR RADIATORS RADICAL RADICALLY RADICALS RADICES RADII RADIO RADIOACTIVE RADIOASTRONOMY RADIOED RADIOGRAPHY RADIOING RADIOLOGY RADIOS RADISH RADISHES RADIUM RADIUS RADIX RADON RAE RAFAEL RAFFERTY RAFT RAFTER RAFTERS RAFTS RAG RAGE RAGED RAGES RAGGED RAGGEDLY RAGGEDNESS RAGING RAGS RAGUSAN RAGWEED RAID RAIDED RAIDER RAIDERS RAIDING RAIDS RAIL RAILED RAILER RAILERS RAILING RAILROAD RAILROADED RAILROADER RAILROADERS RAILROADING RAILROADS RAILS RAILWAY RAILWAYS RAIMENT RAIN RAINBOW RAINCOAT RAINCOATS RAINDROP RAINDROPS RAINED RAINFALL RAINIER RAINIEST RAINING RAINS RAINSTORM RAINY RAISE RAISED RAISER RAISERS RAISES RAISIN RAISING RAKE RAKED RAKES RAKING RALEIGH RALLIED RALLIES RALLY RALLYING RALPH RALSTON RAM RAMADA RAMAN RAMBLE RAMBLER RAMBLES RAMBLING RAMBLINGS RAMIFICATION RAMIFICATIONS RAMIREZ RAMO RAMONA RAMP RAMPAGE RAMPANT RAMPART RAMPS RAMROD RAMS RAMSEY RAN RANCH RANCHED RANCHER RANCHERS RANCHES RANCHING RANCID RAND RANDALL RANDOLPH RANDOM RANDOMIZATION RANDOMIZE RANDOMIZED RANDOMIZES RANDOMLY RANDOMNESS RANDY RANG RANGE RANGED RANGELAND RANGER RANGERS RANGES RANGING RANGOON RANGY RANIER RANK RANKED RANKER RANKERS RANKEST RANKIN RANKINE RANKING RANKINGS RANKLE RANKLY RANKNESS RANKS RANSACK RANSACKED RANSACKING RANSACKS RANSOM RANSOMER RANSOMING RANSOMS RANT RANTED RANTER RANTERS RANTING RANTS RAOUL RAP RAPACIOUS RAPE RAPED RAPER RAPES RAPHAEL RAPID RAPIDITY RAPIDLY RAPIDS RAPIER RAPING RAPPORT RAPPROCHEMENT RAPS RAPT RAPTLY RAPTURE RAPTURES RAPTUROUS RAPUNZEL RARE RARELY RARENESS RARER RAREST RARITAN RARITY RASCAL RASCALLY RASCALS RASH RASHER RASHLY RASHNESS RASMUSSEN RASP RASPBERRY RASPED RASPING RASPS RASTER RASTUS RAT RATE RATED RATER RATERS RATES RATFOR RATHER RATIFICATION RATIFIED RATIFIES RATIFY RATIFYING RATING RATINGS RATIO RATION RATIONAL RATIONALE RATIONALES RATIONALITIES RATIONALITY RATIONALIZATION RATIONALIZATIONS RATIONALIZE RATIONALIZED RATIONALIZES RATIONALIZING RATIONALLY RATIONALS RATIONING RATIONS RATIOS RATS RATTLE RATTLED RATTLER RATTLERS RATTLES RATTLESNAKE RATTLESNAKES RATTLING RAUCOUS RAUL RAVAGE RAVAGED RAVAGER RAVAGERS RAVAGES RAVAGING RAVE RAVED RAVEN RAVENING RAVENOUS RAVENOUSLY RAVENS RAVES RAVINE RAVINES RAVING RAVINGS RAW RAWER RAWEST RAWLINGS RAWLINS RAWLINSON RAWLY RAWNESS RAWSON RAY RAYBURN RAYLEIGH RAYMOND RAYMONDVILLE RAYS RAYTHEON RAZE RAZOR RAZORS REABBREVIATE REABBREVIATED REABBREVIATES REABBREVIATING REACH REACHABILITY REACHABLE REACHABLY REACHED REACHER REACHES REACHING REACQUIRED REACT REACTED REACTING REACTION REACTIONARIES REACTIONARY REACTIONS REACTIVATE REACTIVATED REACTIVATES REACTIVATING REACTIVATION REACTIVE REACTIVELY REACTIVITY REACTOR REACTORS REACTS READ READABILITY READABLE READER READERS READIED READIER READIES READIEST READILY READINESS READING READINGS READJUSTED READOUT READOUTS READS READY READYING REAGAN REAL REALEST REALIGN REALIGNED REALIGNING REALIGNS REALISM REALIST REALISTIC REALISTICALLY REALISTS REALITIES REALITY REALIZABLE REALIZABLY REALIZATION REALIZATIONS REALIZE REALIZED REALIZES REALIZING REALLOCATE REALLY REALM REALMS REALNESS REALS REALTOR REAM REANALYZE REANALYZES REANALYZING REAP REAPED REAPER REAPING REAPPEAR REAPPEARED REAPPEARING REAPPEARS REAPPRAISAL REAPPRAISALS REAPS REAR REARED REARING REARRANGE REARRANGEABLE REARRANGED REARRANGEMENT REARRANGEMENTS REARRANGES REARRANGING REARREST REARRESTED REARS REASON REASONABLE REASONABLENESS REASONABLY REASONED REASONER REASONING REASONINGS REASONS REASSEMBLE REASSEMBLED REASSEMBLES REASSEMBLING REASSEMBLY REASSESSMENT REASSESSMENTS REASSIGN REASSIGNED REASSIGNING REASSIGNMENT REASSIGNMENTS REASSIGNS REASSURE REASSURED REASSURES REASSURING REAWAKEN REAWAKENED REAWAKENING REAWAKENS REBATE REBATES REBECCA REBEL REBELLED REBELLING REBELLION REBELLIONS REBELLIOUS REBELLIOUSLY REBELLIOUSNESS REBELS REBIND REBINDING REBINDS REBOOT REBOOTED REBOOTING REBOOTS REBOUND REBOUNDED REBOUNDING REBOUNDS REBROADCAST REBROADCASTING REBROADCASTS REBUFF REBUFFED REBUILD REBUILDING REBUILDS REBUILT REBUKE REBUKED REBUKES REBUKING REBUTTAL REBUTTED REBUTTING RECALCITRANT RECALCULATE RECALCULATED RECALCULATES RECALCULATING RECALCULATION RECALCULATIONS RECALIBRATE RECALIBRATED RECALIBRATES RECALIBRATING RECALL RECALLED RECALLING RECALLS RECANT RECAPITULATE RECAPITULATED RECAPITULATES RECAPITULATION RECAPTURE RECAPTURED RECAPTURES RECAPTURING RECAST RECASTING RECASTS RECEDE RECEDED RECEDES RECEDING RECEIPT RECEIPTS RECEIVABLE RECEIVE RECEIVED RECEIVER RECEIVERS RECEIVES RECEIVING RECENT RECENTLY RECENTNESS RECEPTACLE RECEPTACLES RECEPTION RECEPTIONIST RECEPTIONS RECEPTIVE RECEPTIVELY RECEPTIVENESS RECEPTIVITY RECEPTOR RECESS RECESSED RECESSES RECESSION RECESSIVE RECIFE RECIPE RECIPES RECIPIENT RECIPIENTS RECIPROCAL RECIPROCALLY RECIPROCATE RECIPROCATED RECIPROCATES RECIPROCATING RECIPROCATION RECIPROCITY RECIRCULATE RECIRCULATED RECIRCULATES RECIRCULATING RECITAL RECITALS RECITATION RECITATIONS RECITE RECITED RECITER RECITES RECITING RECKLESS RECKLESSLY RECKLESSNESS RECKON RECKONED RECKONER RECKONING RECKONINGS RECKONS RECLAIM RECLAIMABLE RECLAIMED RECLAIMER RECLAIMERS RECLAIMING RECLAIMS RECLAMATION RECLAMATIONS RECLASSIFICATION RECLASSIFIED RECLASSIFIES RECLASSIFY RECLASSIFYING RECLINE RECLINING RECODE RECODED RECODES RECODING RECOGNITION RECOGNITIONS RECOGNIZABILITY RECOGNIZABLE RECOGNIZABLY RECOGNIZE RECOGNIZED RECOGNIZER RECOGNIZERS RECOGNIZES RECOGNIZING RECOIL RECOILED RECOILING RECOILS RECOLLECT RECOLLECTED RECOLLECTING RECOLLECTION RECOLLECTIONS RECOMBINATION RECOMBINE RECOMBINED RECOMBINES RECOMBINING RECOMMEND RECOMMENDATION RECOMMENDATIONS RECOMMENDED RECOMMENDER RECOMMENDING RECOMMENDS RECOMPENSE RECOMPILE RECOMPILED RECOMPILES RECOMPILING RECOMPUTE RECOMPUTED RECOMPUTES RECOMPUTING RECONCILE RECONCILED RECONCILER RECONCILES RECONCILIATION RECONCILING RECONFIGURABLE RECONFIGURATION RECONFIGURATIONS RECONFIGURE RECONFIGURED RECONFIGURER RECONFIGURES RECONFIGURING RECONNECT RECONNECTED RECONNECTING RECONNECTION RECONNECTS RECONSIDER RECONSIDERATION RECONSIDERED RECONSIDERING RECONSIDERS RECONSTITUTED RECONSTRUCT RECONSTRUCTED RECONSTRUCTING RECONSTRUCTION RECONSTRUCTS RECONVERTED RECONVERTS RECORD RECORDED RECORDER RECORDERS RECORDING RECORDINGS RECORDS RECOUNT RECOUNTED RECOUNTING RECOUNTS RECOURSE RECOVER RECOVERABLE RECOVERED RECOVERIES RECOVERING RECOVERS RECOVERY RECREATE RECREATED RECREATES RECREATING RECREATION RECREATIONAL RECREATIONS RECREATIVE RECRUIT RECRUITED RECRUITER RECRUITING RECRUITS RECTA RECTANGLE RECTANGLES RECTANGULAR RECTIFY RECTOR RECTORS RECTUM RECTUMS RECUPERATE RECUR RECURRENCE RECURRENCES RECURRENT RECURRENTLY RECURRING RECURS RECURSE RECURSED RECURSES RECURSING RECURSION RECURSIONS RECURSIVE RECURSIVELY RECYCLABLE RECYCLE RECYCLED RECYCLES RECYCLING RED REDBREAST REDCOAT REDDEN REDDENED REDDER REDDEST REDDISH REDDISHNESS REDECLARE REDECLARED REDECLARES REDECLARING REDEEM REDEEMED REDEEMER REDEEMERS REDEEMING REDEEMS REDEFINE REDEFINED REDEFINES REDEFINING REDEFINITION REDEFINITIONS REDEMPTION REDESIGN REDESIGNED REDESIGNING REDESIGNS REDEVELOPMENT REDFORD REDHEAD REDHOOK REDIRECT REDIRECTED REDIRECTING REDIRECTION REDIRECTIONS REDISPLAY REDISPLAYED REDISPLAYING REDISPLAYS REDISTRIBUTE REDISTRIBUTED REDISTRIBUTES REDISTRIBUTING REDLY REDMOND REDNECK REDNESS REDO REDONE REDOUBLE REDOUBLED REDRAW REDRAWN REDRESS REDRESSED REDRESSES REDRESSING REDS REDSTONE REDUCE REDUCED REDUCER REDUCERS REDUCES REDUCIBILITY REDUCIBLE REDUCIBLY REDUCING REDUCTION REDUCTIONS REDUNDANCIES REDUNDANCY REDUNDANT REDUNDANTLY REDWOOD REED REEDS REEDUCATION REEDVILLE REEF REEFER REEFS REEL REELECT REELECTED REELECTING REELECTS REELED REELER REELING REELS REEMPHASIZE REEMPHASIZED REEMPHASIZES REEMPHASIZING REENABLED REENFORCEMENT REENTER REENTERED REENTERING REENTERS REENTRANT REESE REESTABLISH REESTABLISHED REESTABLISHES REESTABLISHING REEVALUATE REEVALUATED REEVALUATES REEVALUATING REEVALUATION REEVES REEXAMINE REEXAMINED REEXAMINES REEXAMINING REEXECUTED REFER REFEREE REFEREED REFEREEING REFEREES REFERENCE REFERENCED REFERENCER REFERENCES REFERENCING REFERENDA REFERENDUM REFERENDUMS REFERENT REFERENTIAL REFERENTIALITY REFERENTIALLY REFERENTS REFERRAL REFERRALS REFERRED REFERRING REFERS REFILL REFILLABLE REFILLED REFILLING REFILLS REFINE REFINED REFINEMENT REFINEMENTS REFINER REFINERY REFINES REFINING REFLECT REFLECTED REFLECTING REFLECTION REFLECTIONS REFLECTIVE REFLECTIVELY REFLECTIVITY REFLECTOR REFLECTORS REFLECTS REFLEX REFLEXES REFLEXIVE REFLEXIVELY REFLEXIVENESS REFLEXIVITY REFORESTATION REFORM REFORMABLE REFORMAT REFORMATION REFORMATORY REFORMATS REFORMATTED REFORMATTING REFORMED REFORMER REFORMERS REFORMING REFORMS REFORMULATE REFORMULATED REFORMULATES REFORMULATING REFORMULATION REFRACT REFRACTED REFRACTION REFRACTORY REFRAGMENT REFRAIN REFRAINED REFRAINING REFRAINS REFRESH REFRESHED REFRESHER REFRESHERS REFRESHES REFRESHING REFRESHINGLY REFRESHMENT REFRESHMENTS REFRIGERATE REFRIGERATOR REFRIGERATORS REFUEL REFUELED REFUELING REFUELS REFUGE REFUGEE REFUGEES REFUSAL REFUSE REFUSED REFUSES REFUSING REFUTABLE REFUTATION REFUTE REFUTED REFUTER REFUTES REFUTING REGAIN REGAINED REGAINING REGAINS REGAL REGALED REGALLY REGARD REGARDED REGARDING REGARDLESS REGARDS REGATTA REGENERATE REGENERATED REGENERATES REGENERATING REGENERATION REGENERATIVE REGENERATOR REGENERATORS REGENT REGENTS REGIME REGIMEN REGIMENT REGIMENTATION REGIMENTED REGIMENTS REGIMES REGINA REGINALD REGION REGIONAL REGIONALLY REGIONS REGIS REGISTER REGISTERED REGISTERING REGISTERS REGISTRAR REGISTRATION REGISTRATIONS REGISTRY REGRESS REGRESSED REGRESSES REGRESSING REGRESSION REGRESSIONS REGRESSIVE REGRET REGRETFUL REGRETFULLY REGRETS REGRETTABLE REGRETTABLY REGRETTED REGRETTING REGROUP REGROUPED REGROUPING REGULAR REGULARITIES REGULARITY REGULARLY REGULARS REGULATE REGULATED REGULATES REGULATING REGULATION REGULATIONS REGULATIVE REGULATOR REGULATORS REGULATORY REGULUS REHABILITATE REHEARSAL REHEARSALS REHEARSE REHEARSED REHEARSER REHEARSES REHEARSING REICH REICHENBERG REICHSTAG REID REIGN REIGNED REIGNING REIGNS REILLY REIMBURSABLE REIMBURSE REIMBURSED REIMBURSEMENT REIMBURSEMENTS REIN REINCARNATE REINCARNATED REINCARNATION REINDEER REINED REINFORCE REINFORCED REINFORCEMENT REINFORCEMENTS REINFORCER REINFORCES REINFORCING REINHARD REINHARDT REINHOLD REINITIALIZE REINITIALIZED REINITIALIZING REINS REINSERT REINSERTED REINSERTING REINSERTS REINSTATE REINSTATED REINSTATEMENT REINSTATES REINSTATING REINTERPRET REINTERPRETED REINTERPRETING REINTERPRETS REINTRODUCE REINTRODUCED REINTRODUCES REINTRODUCING REINVENT REINVENTED REINVENTING REINVENTS REITERATE REITERATED REITERATES REITERATING REITERATION REJECT REJECTED REJECTING REJECTION REJECTIONS REJECTOR REJECTORS REJECTS REJOICE REJOICED REJOICER REJOICES REJOICING REJOIN REJOINDER REJOINED REJOINING REJOINS RELABEL RELABELED RELABELING RELABELLED RELABELLING RELABELS RELAPSE RELATE RELATED RELATER RELATES RELATING RELATION RELATIONAL RELATIONALLY RELATIONS RELATIONSHIP RELATIONSHIPS RELATIVE RELATIVELY RELATIVENESS RELATIVES RELATIVISM RELATIVISTIC RELATIVISTICALLY RELATIVITY RELAX RELAXATION RELAXATIONS RELAXED RELAXER RELAXES RELAXING RELAY RELAYED RELAYING RELAYS RELEASE RELEASED RELEASES RELEASING RELEGATE RELEGATED RELEGATES RELEGATING RELENT RELENTED RELENTING RELENTLESS RELENTLESSLY RELENTLESSNESS RELENTS RELEVANCE RELEVANCES RELEVANT RELEVANTLY RELIABILITY RELIABLE RELIABLY RELIANCE RELIANT RELIC RELICS RELIED RELIEF RELIES RELIEVE RELIEVED RELIEVER RELIEVERS RELIEVES RELIEVING RELIGION RELIGIONS RELIGIOUS RELIGIOUSLY RELIGIOUSNESS RELINK RELINQUISH RELINQUISHED RELINQUISHES RELINQUISHING RELISH RELISHED RELISHES RELISHING RELIVE RELIVES RELIVING RELOAD RELOADED RELOADER RELOADING RELOADS RELOCATABLE RELOCATE RELOCATED RELOCATES RELOCATING RELOCATION RELOCATIONS RELUCTANCE RELUCTANT RELUCTANTLY RELY RELYING REMAIN REMAINDER REMAINDERS REMAINED REMAINING REMAINS REMARK REMARKABLE REMARKABLENESS REMARKABLY REMARKED REMARKING REMARKS REMBRANDT REMEDIAL REMEDIED REMEDIES REMEDY REMEDYING REMEMBER REMEMBERED REMEMBERING REMEMBERS REMEMBRANCE REMEMBRANCES REMIND REMINDED REMINDER REMINDERS REMINDING REMINDS REMINGTON REMINISCENCE REMINISCENCES REMINISCENT REMINISCENTLY REMISS REMISSION REMIT REMITTANCE REMNANT REMNANTS REMODEL REMODELED REMODELING REMODELS REMONSTRATE REMONSTRATED REMONSTRATES REMONSTRATING REMONSTRATION REMONSTRATIVE REMORSE REMORSEFUL REMOTE REMOTELY REMOTENESS REMOTEST REMOVABLE REMOVAL REMOVALS REMOVE REMOVED REMOVER REMOVES REMOVING REMUNERATE REMUNERATION REMUS REMY RENA RENAISSANCE RENAL RENAME RENAMED RENAMES RENAMING RENAULT RENAULTS REND RENDER RENDERED RENDERING RENDERINGS RENDERS RENDEZVOUS RENDING RENDITION RENDITIONS RENDS RENE RENEE RENEGADE RENEGOTIABLE RENEW RENEWABLE RENEWAL RENEWED RENEWER RENEWING RENEWS RENO RENOIR RENOUNCE RENOUNCES RENOUNCING RENOVATE RENOVATED RENOVATION RENOWN RENOWNED RENSSELAER RENT RENTAL RENTALS RENTED RENTING RENTS RENUMBER RENUMBERING RENUMBERS RENUNCIATE RENUNCIATION RENVILLE REOCCUR REOPEN REOPENED REOPENING REOPENS REORDER REORDERED REORDERING REORDERS REORGANIZATION REORGANIZATIONS REORGANIZE REORGANIZED REORGANIZES REORGANIZING REPACKAGE REPAID REPAIR REPAIRED REPAIRER REPAIRING REPAIRMAN REPAIRMEN REPAIRS REPARATION REPARATIONS REPARTEE REPARTITION REPAST REPASTS REPAY REPAYING REPAYS REPEAL REPEALED REPEALER REPEALING REPEALS REPEAT REPEATABLE REPEATED REPEATEDLY REPEATER REPEATERS REPEATING REPEATS REPEL REPELLED REPELLENT REPELS REPENT REPENTANCE REPENTED REPENTING REPENTS REPERCUSSION REPERCUSSIONS REPERTOIRE REPERTORY REPETITION REPETITIONS REPETITIOUS REPETITIVE REPETITIVELY REPETITIVENESS REPHRASE REPHRASED REPHRASES REPHRASING REPINE REPLACE REPLACEABLE REPLACED REPLACEMENT REPLACEMENTS REPLACER REPLACES REPLACING REPLAY REPLAYED REPLAYING REPLAYS REPLENISH REPLENISHED REPLENISHES REPLENISHING REPLETE REPLETENESS REPLETION REPLICA REPLICAS REPLICATE REPLICATED REPLICATES REPLICATING REPLICATION REPLICATIONS REPLIED REPLIES REPLY REPLYING REPORT REPORTED REPORTEDLY REPORTER REPORTERS REPORTING REPORTS REPOSE REPOSED REPOSES REPOSING REPOSITION REPOSITIONED REPOSITIONING REPOSITIONS REPOSITORIES REPOSITORY REPREHENSIBLE REPRESENT REPRESENTABLE REPRESENTABLY REPRESENTATION REPRESENTATIONAL REPRESENTATIONALLY REPRESENTATIONS REPRESENTATIVE REPRESENTATIVELY REPRESENTATIVENESS REPRESENTATIVES REPRESENTED REPRESENTING REPRESENTS REPRESS REPRESSED REPRESSES REPRESSING REPRESSION REPRESSIONS REPRESSIVE REPRIEVE REPRIEVED REPRIEVES REPRIEVING REPRIMAND REPRINT REPRINTED REPRINTING REPRINTS REPRISAL REPRISALS REPROACH REPROACHED REPROACHES REPROACHING REPROBATE REPRODUCE REPRODUCED REPRODUCER REPRODUCERS REPRODUCES REPRODUCIBILITIES REPRODUCIBILITY REPRODUCIBLE REPRODUCIBLY REPRODUCING REPRODUCTION REPRODUCTIONS REPROGRAM REPROGRAMMED REPROGRAMMING REPROGRAMS REPROOF REPROVE REPROVER REPTILE REPTILES REPTILIAN REPUBLIC REPUBLICAN REPUBLICANS REPUBLICS REPUDIATE REPUDIATED REPUDIATES REPUDIATING REPUDIATION REPUDIATIONS REPUGNANT REPULSE REPULSED REPULSES REPULSING REPULSION REPULSIONS REPULSIVE REPUTABLE REPUTABLY REPUTATION REPUTATIONS REPUTE REPUTED REPUTEDLY REPUTES REQUEST REQUESTED REQUESTER REQUESTERS REQUESTING REQUESTS REQUIRE REQUIRED REQUIREMENT REQUIREMENTS REQUIRES REQUIRING REQUISITE REQUISITES REQUISITION REQUISITIONED REQUISITIONING REQUISITIONS REREAD REREGISTER REROUTE REROUTED REROUTES REROUTING RERUN RERUNS RESCHEDULE RESCIND RESCUE RESCUED RESCUER RESCUERS RESCUES RESCUING RESEARCH RESEARCHED RESEARCHER RESEARCHERS RESEARCHES RESEARCHING RESELECT RESELECTED RESELECTING RESELECTS RESELL RESELLING RESEMBLANCE RESEMBLANCES RESEMBLE RESEMBLED RESEMBLES RESEMBLING RESENT RESENTED RESENTFUL RESENTFULLY RESENTING RESENTMENT RESENTS RESERPINE RESERVATION RESERVATIONS RESERVE RESERVED RESERVER RESERVES RESERVING RESERVOIR RESERVOIRS RESET RESETS RESETTING RESETTINGS RESIDE RESIDED RESIDENCE RESIDENCES RESIDENT RESIDENTIAL RESIDENTIALLY RESIDENTS RESIDES RESIDING RESIDUAL RESIDUE RESIDUES RESIGN RESIGNATION RESIGNATIONS RESIGNED RESIGNING RESIGNS RESILIENT RESIN RESINS RESIST RESISTABLE RESISTANCE RESISTANCES RESISTANT RESISTANTLY RESISTED RESISTIBLE RESISTING RESISTIVE RESISTIVITY RESISTOR RESISTORS RESISTS RESOLUTE RESOLUTELY RESOLUTENESS RESOLUTION RESOLUTIONS RESOLVABLE RESOLVE RESOLVED RESOLVER RESOLVERS RESOLVES RESOLVING RESONANCE RESONANCES RESONANT RESONATE RESORT RESORTED RESORTING RESORTS RESOUND RESOUNDING RESOUNDS RESOURCE RESOURCEFUL RESOURCEFULLY RESOURCEFULNESS RESOURCES RESPECT RESPECTABILITY RESPECTABLE RESPECTABLY RESPECTED RESPECTER RESPECTFUL RESPECTFULLY RESPECTFULNESS RESPECTING RESPECTIVE RESPECTIVELY RESPECTS RESPIRATION RESPIRATOR RESPIRATORY RESPITE RESPLENDENT RESPLENDENTLY RESPOND RESPONDED RESPONDENT RESPONDENTS RESPONDER RESPONDING RESPONDS RESPONSE RESPONSES RESPONSIBILITIES RESPONSIBILITY RESPONSIBLE RESPONSIBLENESS RESPONSIBLY RESPONSIVE RESPONSIVELY RESPONSIVENESS REST RESTART RESTARTED RESTARTING RESTARTS RESTATE RESTATED RESTATEMENT RESTATES RESTATING RESTAURANT RESTAURANTS RESTAURATEUR RESTED RESTFUL RESTFULLY RESTFULNESS RESTING RESTITUTION RESTIVE RESTLESS RESTLESSLY RESTLESSNESS RESTORATION RESTORATIONS RESTORE RESTORED RESTORER RESTORERS RESTORES RESTORING RESTRAIN RESTRAINED RESTRAINER RESTRAINERS RESTRAINING RESTRAINS RESTRAINT RESTRAINTS RESTRICT RESTRICTED RESTRICTING RESTRICTION RESTRICTIONS RESTRICTIVE RESTRICTIVELY RESTRICTS RESTROOM RESTRUCTURE RESTRUCTURED RESTRUCTURES RESTRUCTURING RESTS RESULT RESULTANT RESULTANTLY RESULTANTS RESULTED RESULTING RESULTS RESUMABLE RESUME RESUMED RESUMES RESUMING RESUMPTION RESUMPTIONS RESURGENT RESURRECT RESURRECTED RESURRECTING RESURRECTION RESURRECTIONS RESURRECTOR RESURRECTORS RESURRECTS RESUSCITATE RESYNCHRONIZATION RESYNCHRONIZE RESYNCHRONIZED RESYNCHRONIZING RETAIL RETAILER RETAILERS RETAILING RETAIN RETAINED RETAINER RETAINERS RETAINING RETAINMENT RETAINS RETALIATE RETALIATION RETALIATORY RETARD RETARDED RETARDER RETARDING RETCH RETENTION RETENTIONS RETENTIVE RETENTIVELY RETENTIVENESS RETICLE RETICLES RETICULAR RETICULATE RETICULATED RETICULATELY RETICULATES RETICULATING RETICULATION RETINA RETINAL RETINAS RETINUE RETIRE RETIRED RETIREE RETIREMENT RETIREMENTS RETIRES RETIRING RETORT RETORTED RETORTS RETRACE RETRACED RETRACES RETRACING RETRACT RETRACTED RETRACTING RETRACTION RETRACTIONS RETRACTS RETRAIN RETRAINED RETRAINING RETRAINS RETRANSLATE RETRANSLATED RETRANSMISSION RETRANSMISSIONS RETRANSMIT RETRANSMITS RETRANSMITTED RETRANSMITTING RETREAT RETREATED RETREATING RETREATS RETRIBUTION RETRIED RETRIER RETRIERS RETRIES RETRIEVABLE RETRIEVAL RETRIEVALS RETRIEVE RETRIEVED RETRIEVER RETRIEVERS RETRIEVES RETRIEVING RETROACTIVE RETROACTIVELY RETROFIT RETROFITTING RETROGRADE RETROSPECT RETROSPECTION RETROSPECTIVE RETRY RETRYING RETURN RETURNABLE RETURNED RETURNER RETURNING RETURNS RETYPE RETYPED RETYPES RETYPING REUB REUBEN REUNION REUNIONS REUNITE REUNITED REUNITING REUSABLE REUSE REUSED REUSES REUSING REUTERS REUTHER REVAMP REVAMPED REVAMPING REVAMPS REVEAL REVEALED REVEALING REVEALS REVEL REVELATION REVELATIONS REVELED REVELER REVELING REVELRY REVELS REVENGE REVENGER REVENUE REVENUERS REVENUES REVERBERATE REVERE REVERED REVERENCE REVEREND REVERENDS REVERENT REVERENTLY REVERES REVERIE REVERIFIED REVERIFIES REVERIFY REVERIFYING REVERING REVERSAL REVERSALS REVERSE REVERSED REVERSELY REVERSER REVERSES REVERSIBLE REVERSING REVERSION REVERT REVERTED REVERTING REVERTS REVIEW REVIEWED REVIEWER REVIEWERS REVIEWING REVIEWS REVILE REVILED REVILER REVILING REVISE REVISED REVISER REVISES REVISING REVISION REVISIONARY REVISIONS REVISIT REVISITED REVISITING REVISITS REVIVAL REVIVALS REVIVE REVIVED REVIVER REVIVES REVIVING REVOCABLE REVOCATION REVOKE REVOKED REVOKER REVOKES REVOKING REVOLT REVOLTED REVOLTER REVOLTING REVOLTINGLY REVOLTS REVOLUTION REVOLUTIONARIES REVOLUTIONARY REVOLUTIONIZE REVOLUTIONIZED REVOLUTIONIZER REVOLUTIONS REVOLVE REVOLVED REVOLVER REVOLVERS REVOLVES REVOLVING REVULSION REWARD REWARDED REWARDING REWARDINGLY REWARDS REWIND REWINDING REWINDS REWIRE REWORK REWORKED REWORKING REWORKS REWOUND REWRITE REWRITES REWRITING REWRITTEN REX REYKJAVIK REYNOLDS RHAPSODY RHEA RHEIMS RHEINHOLDT RHENISH RHESUS RHETORIC RHEUMATIC RHEUMATISM RHINE RHINESTONE RHINO RHINOCEROS RHO RHODA RHODE RHODES RHODESIA RHODODENDRON RHOMBIC RHOMBUS RHUBARB RHYME RHYMED RHYMES RHYMING RHYTHM RHYTHMIC RHYTHMICALLY RHYTHMS RIB RIBALD RIBBED RIBBING RIBBON RIBBONS RIBOFLAVIN RIBONUCLEIC RIBS RICA RICAN RICANISM RICANS RICE RICH RICHARD RICHARDS RICHARDSON RICHER RICHES RICHEST RICHEY RICHFIELD RICHLAND RICHLY RICHMOND RICHNESS RICHTER RICK RICKENBAUGH RICKETS RICKETTSIA RICKETY RICKSHAW RICKSHAWS RICO RICOCHET RID RIDDANCE RIDDEN RIDDING RIDDLE RIDDLED RIDDLES RIDDLING RIDE RIDER RIDERS RIDES RIDGE RIDGEFIELD RIDGEPOLE RIDGES RIDGWAY RIDICULE RIDICULED RIDICULES RIDICULING RIDICULOUS RIDICULOUSLY RIDICULOUSNESS RIDING RIDS RIEMANN RIEMANNIAN RIFLE RIFLED RIFLEMAN RIFLER RIFLES RIFLING RIFT RIG RIGA RIGEL RIGGING RIGGS RIGHT RIGHTED RIGHTEOUS RIGHTEOUSLY RIGHTEOUSNESS RIGHTER RIGHTFUL RIGHTFULLY RIGHTFULNESS RIGHTING RIGHTLY RIGHTMOST RIGHTNESS RIGHTS RIGHTWARD RIGID RIGIDITY RIGIDLY RIGOR RIGOROUS RIGOROUSLY RIGORS RIGS RILEY RILKE RILL RIM RIME RIMS RIND RINDS RINEHART RING RINGED RINGER RINGERS RINGING RINGINGLY RINGINGS RINGS RINGSIDE RINK RINSE RINSED RINSER RINSES RINSING RIO RIORDAN RIOT RIOTED RIOTER RIOTERS RIOTING RIOTOUS RIOTS RIP RIPE RIPELY RIPEN RIPENESS RIPLEY RIPOFF RIPPED RIPPING RIPPLE RIPPLED RIPPLES RIPPLING RIPS RISC RISE RISEN RISER RISERS RISES RISING RISINGS RISK RISKED RISKING RISKS RISKY RITCHIE RITE RITES RITTER RITUAL RITUALLY RITUALS RITZ RIVAL RIVALED RIVALLED RIVALLING RIVALRIES RIVALRY RIVALS RIVER RIVERBANK RIVERFRONT RIVERS RIVERSIDE RIVERVIEW RIVET RIVETER RIVETS RIVIERA RIVULET RIVULETS RIYADH ROACH ROAD ROADBED ROADBLOCK ROADS ROADSIDE ROADSTER ROADSTERS ROADWAY ROADWAYS ROAM ROAMED ROAMING ROAMS ROAR ROARED ROARER ROARING ROARS ROAST ROASTED ROASTER ROASTING ROASTS ROB ROBBED ROBBER ROBBERIES ROBBERS ROBBERY ROBBIE ROBBIN ROBBING ROBBINS ROBE ROBED ROBERT ROBERTA ROBERTO ROBERTS ROBERTSON ROBERTSONS ROBES ROBIN ROBING ROBINS ROBINSON ROBINSONVILLE ROBOT ROBOTIC ROBOTICS ROBOTS ROBS ROBUST ROBUSTLY ROBUSTNESS ROCCO ROCHESTER ROCHFORD ROCK ROCKABYE ROCKAWAY ROCKAWAYS ROCKED ROCKEFELLER ROCKER ROCKERS ROCKET ROCKETED ROCKETING ROCKETS ROCKFORD ROCKIES ROCKING ROCKLAND ROCKS ROCKVILLE ROCKWELL ROCKY ROD RODE RODENT RODENTS RODEO RODGERS RODNEY RODRIGUEZ RODS ROE ROENTGEN ROGER ROGERS ROGUE ROGUES ROLAND ROLE ROLES ROLL ROLLBACK ROLLED ROLLER ROLLERS ROLLIE ROLLING ROLLINS ROLLS ROMAN ROMANCE ROMANCER ROMANCERS ROMANCES ROMANCING ROMANESQUE ROMANIA ROMANIZATIONS ROMANIZER ROMANIZERS ROMANIZES ROMANO ROMANS ROMANTIC ROMANTICS ROME ROMELDALE ROMEO ROMP ROMPED ROMPER ROMPING ROMPS ROMULUS RON RONALD RONNIE ROOF ROOFED ROOFER ROOFING ROOFS ROOFTOP ROOK ROOKIE ROOM ROOMED ROOMER ROOMERS ROOMFUL ROOMING ROOMMATE ROOMS ROOMY ROONEY ROOSEVELT ROOSEVELTIAN ROOST ROOSTER ROOSTERS ROOT ROOTED ROOTER ROOTING ROOTS ROPE ROPED ROPER ROPERS ROPES ROPING ROQUEMORE RORSCHACH ROSA ROSABELLE ROSALIE ROSARY ROSE ROSEBUD ROSEBUDS ROSEBUSH ROSELAND ROSELLA ROSEMARY ROSEN ROSENBERG ROSENBLUM ROSENTHAL ROSENZWEIG ROSES ROSETTA ROSETTE ROSIE ROSINESS ROSS ROSSI ROSTER ROSTRUM ROSWELL ROSY ROT ROTARIAN ROTARIANS ROTARY ROTATE ROTATED ROTATES ROTATING ROTATION ROTATIONAL ROTATIONS ROTATOR ROTH ROTHSCHILD ROTOR ROTS ROTTEN ROTTENNESS ROTTERDAM ROTTING ROTUND ROTUNDA ROUGE ROUGH ROUGHED ROUGHEN ROUGHER ROUGHEST ROUGHLY ROUGHNECK ROUGHNESS ROULETTE ROUND ROUNDABOUT ROUNDED ROUNDEDNESS ROUNDER ROUNDEST ROUNDHEAD ROUNDHOUSE ROUNDING ROUNDLY ROUNDNESS ROUNDOFF ROUNDS ROUNDTABLE ROUNDUP ROUNDWORM ROURKE ROUSE ROUSED ROUSES ROUSING ROUSSEAU ROUSTABOUT ROUT ROUTE ROUTED ROUTER ROUTERS ROUTES ROUTINE ROUTINELY ROUTINES ROUTING ROUTINGS ROVE ROVED ROVER ROVES ROVING ROW ROWBOAT ROWDY ROWE ROWED ROWENA ROWER ROWING ROWLAND ROWLEY ROWS ROXBURY ROXY ROY ROYAL ROYALIST ROYALISTS ROYALLY ROYALTIES ROYALTY ROYCE ROZELLE RUANDA RUB RUBAIYAT RUBBED RUBBER RUBBERS RUBBERY RUBBING RUBBISH RUBBLE RUBDOWN RUBE RUBEN RUBENS RUBIES RUBIN RUBLE RUBLES RUBOUT RUBS RUBY RUDDER RUDDERS RUDDINESS RUDDY RUDE RUDELY RUDENESS RUDIMENT RUDIMENTARY RUDIMENTS RUDOLF RUDOLPH RUDY RUDYARD RUE RUEFULLY RUFFIAN RUFFIANLY RUFFIANS RUFFLE RUFFLED RUFFLES RUFUS RUG RUGGED RUGGEDLY RUGGEDNESS RUGS RUIN RUINATION RUINATIONS RUINED RUINING RUINOUS RUINOUSLY RUINS RULE RULED RULER RULERS RULES RULING RULINGS RUM RUMANIA RUMANIAN RUMANIANS RUMBLE RUMBLED RUMBLER RUMBLES RUMBLING RUMEN RUMFORD RUMMAGE RUMMEL RUMMY RUMOR RUMORED RUMORS RUMP RUMPLE RUMPLED RUMPLY RUMPUS RUN RUNAWAY RUNDOWN RUNG RUNGE RUNGS RUNNABLE RUNNER RUNNERS RUNNING RUNNYMEDE RUNOFF RUNS RUNT RUNTIME RUNYON RUPEE RUPPERT RUPTURE RUPTURED RUPTURES RUPTURING RURAL RURALLY RUSH RUSHED RUSHER RUSHES RUSHING RUSHMORE RUSS RUSSELL RUSSET RUSSIA RUSSIAN RUSSIANIZATIONS RUSSIANIZES RUSSIANS RUSSO RUST RUSTED RUSTIC RUSTICATE RUSTICATED RUSTICATES RUSTICATING RUSTICATION RUSTING RUSTLE RUSTLED RUSTLER RUSTLERS RUSTLING RUSTS RUSTY RUT RUTGERS RUTH RUTHERFORD RUTHLESS RUTHLESSLY RUTHLESSNESS RUTLAND RUTLEDGE RUTS RWANDA RYAN RYDBERG RYDER RYE SABBATH SABBATHIZE SABBATHIZES SABBATICAL SABER SABERS SABINA SABINE SABLE SABLES SABOTAGE SACHS SACK SACKER SACKING SACKS SACRAMENT SACRAMENTO SACRED SACREDLY SACREDNESS SACRIFICE SACRIFICED SACRIFICER SACRIFICERS SACRIFICES SACRIFICIAL SACRIFICIALLY SACRIFICING SACRILEGE SACRILEGIOUS SACROSANCT SAD SADDEN SADDENED SADDENS SADDER SADDEST SADDLE SADDLEBAG SADDLED SADDLES SADIE SADISM SADIST SADISTIC SADISTICALLY SADISTS SADLER SADLY SADNESS SAFARI SAFE SAFEGUARD SAFEGUARDED SAFEGUARDING SAFEGUARDS SAFEKEEPING SAFELY SAFENESS SAFER SAFES SAFEST SAFETIES SAFETY SAFFRON SAG SAGA SAGACIOUS SAGACITY SAGE SAGEBRUSH SAGELY SAGES SAGGING SAGINAW SAGITTAL SAGITTARIUS SAGS SAGUARO SAHARA SAID SAIGON SAIL SAILBOAT SAILED SAILFISH SAILING SAILOR SAILORLY SAILORS SAILS SAINT SAINTED SAINTHOOD SAINTLY SAINTS SAKE SAKES SAL SALAAM SALABLE SALAD SALADS SALAMANDER SALAMI SALARIED SALARIES SALARY SALE SALEM SALERNO SALES SALESGIRL SALESIAN SALESLADY SALESMAN SALESMEN SALESPERSON SALIENT SALINA SALINE SALISBURY SALISH SALIVA SALIVARY SALIVATE SALK SALLE SALLIES SALLOW SALLY SALLYING SALMON SALON SALONS SALOON SALOONS SALT SALTED SALTER SALTERS SALTIER SALTIEST SALTINESS SALTING SALTON SALTS SALTY SALUTARY SALUTATION SALUTATIONS SALUTE SALUTED SALUTES SALUTING SALVADOR SALVADORAN SALVAGE SALVAGED SALVAGER SALVAGES SALVAGING SALVATION SALVATORE SALVE SALVER SALVES SALZ SAM SAMARITAN SAME SAMENESS SAMMY SAMOA SAMOAN SAMPLE SAMPLED SAMPLER SAMPLERS SAMPLES SAMPLING SAMPLINGS SAMPSON SAMSON SAMUEL SAMUELS SAMUELSON SAN SANA SANATORIA SANATORIUM SANBORN SANCHEZ SANCHO SANCTIFICATION SANCTIFIED SANCTIFY SANCTIMONIOUS SANCTION SANCTIONED SANCTIONING SANCTIONS SANCTITY SANCTUARIES SANCTUARY SANCTUM SAND SANDAL SANDALS SANDBAG SANDBURG SANDED SANDER SANDERLING SANDERS SANDERSON SANDIA SANDING SANDMAN SANDPAPER SANDRA SANDS SANDSTONE SANDUSKY SANDWICH SANDWICHES SANDY SANE SANELY SANER SANEST SANFORD SANG SANGUINE SANHEDRIN SANITARIUM SANITARY SANITATION SANITY SANK SANSKRIT SANSKRITIC SANSKRITIZE SANTA SANTAYANA SANTIAGO SANTO SAO SAP SAPIENS SAPLING SAPLINGS SAPPHIRE SAPPHO SAPS SAPSUCKER SARA SARACEN SARACENS SARAH SARAN SARASOTA SARATOGA SARCASM SARCASMS SARCASTIC SARDINE SARDINIA SARDONIC SARGENT SARI SARTRE SASH SASKATCHEWAN SASKATOON SAT SATAN SATANIC SATANISM SATANIST SATCHEL SATCHELS SATE SATED SATELLITE SATELLITES SATES SATIN SATING SATIRE SATIRES SATIRIC SATISFACTION SATISFACTIONS SATISFACTORILY SATISFACTORY SATISFIABILITY SATISFIABLE SATISFIED SATISFIES SATISFY SATISFYING SATURATE SATURATED SATURATES SATURATING SATURATION SATURDAY SATURDAYS SATURN SATURNALIA SATURNISM SATYR SAUCE SAUCEPAN SAUCEPANS SAUCER SAUCERS SAUCES SAUCY SAUD SAUDI SAUKVILLE SAUL SAULT SAUNDERS SAUNTER SAUSAGE SAUSAGES SAVAGE SAVAGED SAVAGELY SAVAGENESS SAVAGER SAVAGERS SAVAGES SAVAGING SAVANNAH SAVE SAVED SAVER SAVERS SAVES SAVING SAVINGS SAVIOR SAVIORS SAVIOUR SAVONAROLA SAVOR SAVORED SAVORING SAVORS SAVORY SAVOY SAVOYARD SAVOYARDS SAW SAWDUST SAWED SAWFISH SAWING SAWMILL SAWMILLS SAWS SAWTOOTH SAX SAXON SAXONIZATION SAXONIZATIONS SAXONIZE SAXONIZES SAXONS SAXONY SAXOPHONE SAXTON SAY SAYER SAYERS SAYING SAYINGS SAYS SCAB SCABBARD SCABBARDS SCABROUS SCAFFOLD SCAFFOLDING SCAFFOLDINGS SCAFFOLDS SCALA SCALABLE SCALAR SCALARS SCALD SCALDED SCALDING SCALE SCALED SCALES SCALING SCALINGS SCALLOP SCALLOPED SCALLOPS SCALP SCALPS SCALY SCAMPER SCAMPERING SCAMPERS SCAN SCANDAL SCANDALOUS SCANDALS SCANDINAVIA SCANDINAVIAN SCANDINAVIANS SCANNED SCANNER SCANNERS SCANNING SCANS SCANT SCANTIER SCANTIEST SCANTILY SCANTINESS SCANTLY SCANTY SCAPEGOAT SCAR SCARBOROUGH SCARCE SCARCELY SCARCENESS SCARCER SCARCITY SCARE SCARECROW SCARED SCARES SCARF SCARING SCARLATTI SCARLET SCARS SCARSDALE SCARVES SCARY SCATTER SCATTERBRAIN SCATTERED SCATTERING SCATTERS SCENARIO SCENARIOS SCENE SCENERY SCENES SCENIC SCENT SCENTED SCENTS SCEPTER SCEPTERS SCHAEFER SCHAEFFER SCHAFER SCHAFFNER SCHANTZ SCHAPIRO SCHEDULABLE SCHEDULE SCHEDULED SCHEDULER SCHEDULERS SCHEDULES SCHEDULING SCHEHERAZADE SCHELLING SCHEMA SCHEMAS SCHEMATA SCHEMATIC SCHEMATICALLY SCHEMATICS SCHEME SCHEMED SCHEMER SCHEMERS SCHEMES SCHEMING SCHILLER SCHISM SCHIZOPHRENIA SCHLESINGER SCHLITZ SCHLOSS SCHMIDT SCHMITT SCHNABEL SCHNEIDER SCHOENBERG SCHOFIELD SCHOLAR SCHOLARLY SCHOLARS SCHOLARSHIP SCHOLARSHIPS SCHOLASTIC SCHOLASTICALLY SCHOLASTICS SCHOOL SCHOOLBOY SCHOOLBOYS SCHOOLED SCHOOLER SCHOOLERS SCHOOLHOUSE SCHOOLHOUSES SCHOOLING SCHOOLMASTER SCHOOLMASTERS SCHOOLROOM SCHOOLROOMS SCHOOLS SCHOONER SCHOPENHAUER SCHOTTKY SCHROEDER SCHROEDINGER SCHUBERT SCHULTZ SCHULZ SCHUMACHER SCHUMAN SCHUMANN SCHUSTER SCHUYLER SCHUYLKILL SCHWAB SCHWARTZ SCHWEITZER SCIENCE SCIENCES SCIENTIFIC SCIENTIFICALLY SCIENTIST SCIENTISTS SCISSOR SCISSORED SCISSORING SCISSORS SCLEROSIS SCLEROTIC SCOFF SCOFFED SCOFFER SCOFFING SCOFFS SCOLD SCOLDED SCOLDING SCOLDS SCOOP SCOOPED SCOOPING SCOOPS SCOOT SCOPE SCOPED SCOPES SCOPING SCORCH SCORCHED SCORCHER SCORCHES SCORCHING SCORE SCOREBOARD SCORECARD SCORED SCORER SCORERS SCORES SCORING SCORINGS SCORN SCORNED SCORNER SCORNFUL SCORNFULLY SCORNING SCORNS SCORPIO SCORPION SCORPIONS SCOT SCOTCH SCOTCHGARD SCOTCHMAN SCOTIA SCOTIAN SCOTLAND SCOTS SCOTSMAN SCOTSMEN SCOTT SCOTTISH SCOTTSDALE SCOTTY SCOUNDREL SCOUNDRELS SCOUR SCOURED SCOURGE SCOURING SCOURS SCOUT SCOUTED SCOUTING SCOUTS SCOW SCOWL SCOWLED SCOWLING SCOWLS SCRAM SCRAMBLE SCRAMBLED SCRAMBLER SCRAMBLES SCRAMBLING SCRANTON SCRAP SCRAPE SCRAPED SCRAPER SCRAPERS SCRAPES SCRAPING SCRAPINGS SCRAPPED SCRAPS SCRATCH SCRATCHED SCRATCHER SCRATCHERS SCRATCHES SCRATCHING SCRATCHY SCRAWL SCRAWLED SCRAWLING SCRAWLS SCRAWNY SCREAM SCREAMED SCREAMER SCREAMERS SCREAMING SCREAMS SCREECH SCREECHED SCREECHES SCREECHING SCREEN SCREENED SCREENING SCREENINGS SCREENPLAY SCREENS SCREW SCREWBALL SCREWDRIVER SCREWED SCREWING SCREWS SCRIBBLE SCRIBBLED SCRIBBLER SCRIBBLES SCRIBE SCRIBES SCRIBING SCRIBNERS SCRIMMAGE SCRIPPS SCRIPT SCRIPTS SCRIPTURE SCRIPTURES SCROLL SCROLLED SCROLLING SCROLLS SCROOGE SCROUNGE SCRUB SCRUMPTIOUS SCRUPLE SCRUPULOUS SCRUPULOUSLY SCRUTINIZE SCRUTINIZED SCRUTINIZING SCRUTINY SCUBA SCUD SCUFFLE SCUFFLED SCUFFLES SCUFFLING SCULPT SCULPTED SCULPTOR SCULPTORS SCULPTS SCULPTURE SCULPTURED SCULPTURES SCURRIED SCURRY SCURVY SCUTTLE SCUTTLED SCUTTLES SCUTTLING SCYLLA SCYTHE SCYTHES SCYTHIA SEA SEABOARD SEABORG SEABROOK SEACOAST SEACOASTS SEAFOOD SEAGATE SEAGRAM SEAGULL SEAHORSE SEAL SEALED SEALER SEALING SEALS SEALY SEAM SEAMAN SEAMED SEAMEN SEAMING SEAMS SEAMY SEAN SEAPORT SEAPORTS SEAQUARIUM SEAR SEARCH SEARCHED SEARCHER SEARCHERS SEARCHES SEARCHING SEARCHINGLY SEARCHINGS SEARCHLIGHT SEARED SEARING SEARINGLY SEARS SEAS SEASHORE SEASHORES SEASIDE SEASON SEASONABLE SEASONABLY SEASONAL SEASONALLY SEASONED SEASONER SEASONERS SEASONING SEASONINGS SEASONS SEAT SEATED SEATING SEATS SEATTLE SEAWARD SEAWEED SEBASTIAN SECANT SECEDE SECEDED SECEDES SECEDING SECESSION SECLUDE SECLUDED SECLUSION SECOND SECONDARIES SECONDARILY SECONDARY SECONDED SECONDER SECONDERS SECONDHAND SECONDING SECONDLY SECONDS SECRECY SECRET SECRETARIAL SECRETARIAT SECRETARIES SECRETARY SECRETE SECRETED SECRETES SECRETING SECRETION SECRETIONS SECRETIVE SECRETIVELY SECRETLY SECRETS SECT SECTARIAN SECTION SECTIONAL SECTIONED SECTIONING SECTIONS SECTOR SECTORS SECTS SECULAR SECURE SECURED SECURELY SECURES SECURING SECURINGS SECURITIES SECURITY SEDAN SEDATE SEDGE SEDGWICK SEDIMENT SEDIMENTARY SEDIMENTS SEDITION SEDITIOUS SEDUCE SEDUCED SEDUCER SEDUCERS SEDUCES SEDUCING SEDUCTION SEDUCTIVE SEE SEED SEEDED SEEDER SEEDERS SEEDING SEEDINGS SEEDLING SEEDLINGS SEEDS SEEDY SEEING SEEK SEEKER SEEKERS SEEKING SEEKS SEELEY SEEM SEEMED SEEMING SEEMINGLY SEEMLY SEEMS SEEN SEEP SEEPAGE SEEPED SEEPING SEEPS SEER SEERS SEERSUCKER SEES SEETHE SEETHED SEETHES SEETHING SEGMENT SEGMENTATION SEGMENTATIONS SEGMENTED SEGMENTING SEGMENTS SEGOVIA SEGREGATE SEGREGATED SEGREGATES SEGREGATING SEGREGATION SEGUNDO SEIDEL SEISMIC SEISMOGRAPH SEISMOLOGY SEIZE SEIZED SEIZES SEIZING SEIZURE SEIZURES SELDOM SELECT SELECTED SELECTING SELECTION SELECTIONS SELECTIVE SELECTIVELY SELECTIVITY SELECTMAN SELECTMEN SELECTOR SELECTORS SELECTRIC SELECTS SELENA SELENIUM SELF SELFISH SELFISHLY SELFISHNESS SELFRIDGE SELFSAME SELKIRK SELL SELLER SELLERS SELLING SELLOUT SELLS SELMA SELTZER SELVES SELWYN SEMANTIC SEMANTICAL SEMANTICALLY SEMANTICIST SEMANTICISTS SEMANTICS SEMAPHORE SEMAPHORES SEMBLANCE SEMESTER SEMESTERS SEMI SEMIAUTOMATED SEMICOLON SEMICOLONS SEMICONDUCTOR SEMICONDUCTORS SEMINAL SEMINAR SEMINARIAN SEMINARIES SEMINARS SEMINARY SEMINOLE SEMIPERMANENT SEMIPERMANENTLY SEMIRAMIS SEMITE SEMITIC SEMITICIZE SEMITICIZES SEMITIZATION SEMITIZATIONS SEMITIZE SEMITIZES SENATE SENATES SENATOR SENATORIAL SENATORS SEND SENDER SENDERS SENDING SENDS SENECA SENEGAL SENILE SENIOR SENIORITY SENIORS SENSATION SENSATIONAL SENSATIONALLY SENSATIONS SENSE SENSED SENSELESS SENSELESSLY SENSELESSNESS SENSES SENSIBILITIES SENSIBILITY SENSIBLE SENSIBLY SENSING SENSITIVE SENSITIVELY SENSITIVENESS SENSITIVES SENSITIVITIES SENSITIVITY SENSOR SENSORS SENSORY SENSUAL SENSUOUS SENT SENTENCE SENTENCED SENTENCES SENTENCING SENTENTIAL SENTIMENT SENTIMENTAL SENTIMENTALLY SENTIMENTS SENTINEL SENTINELS SENTRIES SENTRY SEOUL SEPARABLE SEPARATE SEPARATED SEPARATELY SEPARATENESS SEPARATES SEPARATING SEPARATION SEPARATIONS SEPARATOR SEPARATORS SEPIA SEPOY SEPT SEPTEMBER SEPTEMBERS SEPULCHER SEPULCHERS SEQUEL SEQUELS SEQUENCE SEQUENCED SEQUENCER SEQUENCERS SEQUENCES SEQUENCING SEQUENCINGS SEQUENTIAL SEQUENTIALITY SEQUENTIALIZE SEQUENTIALIZED SEQUENTIALIZES SEQUENTIALIZING SEQUENTIALLY SEQUESTER SEQUOIA SERAFIN SERBIA SERBIAN SERBIANS SERENDIPITOUS SERENDIPITY SERENE SERENELY SERENITY SERF SERFS SERGEANT SERGEANTS SERGEI SERIAL SERIALIZABILITY SERIALIZABLE SERIALIZATION SERIALIZATIONS SERIALIZE SERIALIZED SERIALIZES SERIALIZING SERIALLY SERIALS SERIES SERIF SERIOUS SERIOUSLY SERIOUSNESS SERMON SERMONS SERPENS SERPENT SERPENTINE SERPENTS SERRA SERUM SERUMS SERVANT SERVANTS SERVE SERVED SERVER SERVERS SERVES SERVICE SERVICEABILITY SERVICEABLE SERVICED SERVICEMAN SERVICEMEN SERVICES SERVICING SERVILE SERVING SERVINGS SERVITUDE SERVO SERVOMECHANISM SESAME SESSION SESSIONS SET SETBACK SETH SETS SETTABLE SETTER SETTERS SETTING SETTINGS SETTLE SETTLED SETTLEMENT SETTLEMENTS SETTLER SETTLERS SETTLES SETTLING SETUP SETUPS SEVEN SEVENFOLD SEVENS SEVENTEEN SEVENTEENS SEVENTEENTH SEVENTH SEVENTIES SEVENTIETH SEVENTY SEVER SEVERAL SEVERALFOLD SEVERALLY SEVERANCE SEVERE SEVERED SEVERELY SEVERER SEVEREST SEVERING SEVERITIES SEVERITY SEVERN SEVERS SEVILLE SEW SEWAGE SEWARD SEWED SEWER SEWERS SEWING SEWS SEX SEXED SEXES SEXIST SEXTANS SEXTET SEXTILLION SEXTON SEXTUPLE SEXTUPLET SEXUAL SEXUALITY SEXUALLY SEXY SEYCHELLES SEYMOUR SHABBY SHACK SHACKED SHACKLE SHACKLED SHACKLES SHACKLING SHACKS SHADE SHADED SHADES SHADIER SHADIEST SHADILY SHADINESS SHADING SHADINGS SHADOW SHADOWED SHADOWING SHADOWS SHADOWY SHADY SHAFER SHAFFER SHAFT SHAFTS SHAGGY SHAKABLE SHAKABLY SHAKE SHAKEDOWN SHAKEN SHAKER SHAKERS SHAKES SHAKESPEARE SHAKESPEAREAN SHAKESPEARIAN SHAKESPEARIZE SHAKESPEARIZES SHAKINESS SHAKING SHAKY SHALE SHALL SHALLOW SHALLOWER SHALLOWLY SHALLOWNESS SHAM SHAMBLES SHAME SHAMED SHAMEFUL SHAMEFULLY SHAMELESS SHAMELESSLY SHAMES SHAMING SHAMPOO SHAMROCK SHAMS SHANGHAI SHANGHAIED SHANGHAIING SHANGHAIINGS SHANGHAIS SHANNON SHANTIES SHANTUNG SHANTY SHAPE SHAPED SHAPELESS SHAPELESSLY SHAPELESSNESS SHAPELY SHAPER SHAPERS SHAPES SHAPING SHAPIRO SHARABLE SHARD SHARE SHAREABLE SHARECROPPER SHARECROPPERS SHARED SHAREHOLDER SHAREHOLDERS SHARER SHARERS SHARES SHARI SHARING SHARK SHARKS SHARON SHARP SHARPE SHARPEN SHARPENED SHARPENING SHARPENS SHARPER SHARPEST SHARPLY SHARPNESS SHARPSHOOT SHASTA SHATTER SHATTERED SHATTERING SHATTERPROOF SHATTERS SHATTUCK SHAVE SHAVED SHAVEN SHAVES SHAVING SHAVINGS SHAWANO SHAWL SHAWLS SHAWNEE SHE SHEA SHEAF SHEAR SHEARED SHEARER SHEARING SHEARS SHEATH SHEATHING SHEATHS SHEAVES SHEBOYGAN SHED SHEDDING SHEDIR SHEDS SHEEHAN SHEEN SHEEP SHEEPSKIN SHEER SHEERED SHEET SHEETED SHEETING SHEETS SHEFFIELD SHEIK SHEILA SHELBY SHELDON SHELF SHELL SHELLED SHELLER SHELLEY SHELLING SHELLS SHELTER SHELTERED SHELTERING SHELTERS SHELTON SHELVE SHELVED SHELVES SHELVING SHENANDOAH SHENANIGAN SHEPARD SHEPHERD SHEPHERDS SHEPPARD SHERATON SHERBET SHERIDAN SHERIFF SHERIFFS SHERLOCK SHERMAN SHERRILL SHERRY SHERWIN SHERWOOD SHIBBOLETH SHIED SHIELD SHIELDED SHIELDING SHIELDS SHIES SHIFT SHIFTED SHIFTER SHIFTERS SHIFTIER SHIFTIEST SHIFTILY SHIFTINESS SHIFTING SHIFTS SHIFTY SHIITE SHIITES SHILL SHILLING SHILLINGS SHILLONG SHILOH SHIMMER SHIMMERING SHIN SHINBONE SHINE SHINED SHINER SHINERS SHINES SHINGLE SHINGLES SHINING SHININGLY SHINTO SHINTOISM SHINTOIZE SHINTOIZES SHINY SHIP SHIPBOARD SHIPBUILDING SHIPLEY SHIPMATE SHIPMENT SHIPMENTS SHIPPED SHIPPER SHIPPERS SHIPPING SHIPS SHIPSHAPE SHIPWRECK SHIPWRECKED SHIPWRECKS SHIPYARD SHIRE SHIRK SHIRKER SHIRKING SHIRKS SHIRLEY SHIRT SHIRTING SHIRTS SHIT SHIVA SHIVER SHIVERED SHIVERER SHIVERING SHIVERS SHMUEL SHOAL SHOALS SHOCK SHOCKED SHOCKER SHOCKERS SHOCKING SHOCKINGLY SHOCKLEY SHOCKS SHOD SHODDY SHOE SHOED SHOEHORN SHOEING SHOELACE SHOEMAKER SHOES SHOESTRING SHOJI SHONE SHOOK SHOOT SHOOTER SHOOTERS SHOOTING SHOOTINGS SHOOTS SHOP SHOPKEEPER SHOPKEEPERS SHOPPED SHOPPER SHOPPERS SHOPPING SHOPS SHOPWORN SHORE SHORELINE SHORES SHOREWOOD SHORN SHORT SHORTAGE SHORTAGES SHORTCOMING SHORTCOMINGS SHORTCUT SHORTCUTS SHORTED SHORTEN SHORTENED SHORTENING SHORTENS SHORTER SHORTEST SHORTFALL SHORTHAND SHORTHANDED SHORTING SHORTISH SHORTLY SHORTNESS SHORTS SHORTSIGHTED SHORTSTOP SHOSHONE SHOT SHOTGUN SHOTGUNS SHOTS SHOULD SHOULDER SHOULDERED SHOULDERING SHOULDERS SHOUT SHOUTED SHOUTER SHOUTERS SHOUTING SHOUTS SHOVE SHOVED SHOVEL SHOVELED SHOVELS SHOVES SHOVING SHOW SHOWBOAT SHOWCASE SHOWDOWN SHOWED SHOWER SHOWERED SHOWERING SHOWERS SHOWING SHOWINGS SHOWN SHOWPIECE SHOWROOM SHOWS SHOWY SHRANK SHRAPNEL SHRED SHREDDER SHREDDING SHREDS SHREVEPORT SHREW SHREWD SHREWDEST SHREWDLY SHREWDNESS SHREWS SHRIEK SHRIEKED SHRIEKING SHRIEKS SHRILL SHRILLED SHRILLING SHRILLNESS SHRILLY SHRIMP SHRINE SHRINES SHRINK SHRINKABLE SHRINKAGE SHRINKING SHRINKS SHRIVEL SHRIVELED SHROUD SHROUDED SHRUB SHRUBBERY SHRUBS SHRUG SHRUGS SHRUNK SHRUNKEN SHU SHUDDER SHUDDERED SHUDDERING SHUDDERS SHUFFLE SHUFFLEBOARD SHUFFLED SHUFFLES SHUFFLING SHULMAN SHUN SHUNS SHUNT SHUT SHUTDOWN SHUTDOWNS SHUTOFF SHUTOUT SHUTS SHUTTER SHUTTERED SHUTTERS SHUTTING SHUTTLE SHUTTLECOCK SHUTTLED SHUTTLES SHUTTLING SHY SHYLOCK SHYLOCKIAN SHYLY SHYNESS SIAM SIAMESE SIAN SIBERIA SIBERIAN SIBLEY SIBLING SIBLINGS SICILIAN SICILIANA SICILIANS SICILY SICK SICKEN SICKER SICKEST SICKLE SICKLY SICKNESS SICKNESSES SICKROOM SIDE SIDEARM SIDEBAND SIDEBOARD SIDEBOARDS SIDEBURNS SIDECAR SIDED SIDELIGHT SIDELIGHTS SIDELINE SIDEREAL SIDES SIDESADDLE SIDESHOW SIDESTEP SIDETRACK SIDEWALK SIDEWALKS SIDEWAYS SIDEWISE SIDING SIDINGS SIDNEY SIEGE SIEGEL SIEGES SIEGFRIED SIEGLINDA SIEGMUND SIEMENS SIENA SIERRA SIEVE SIEVES SIFFORD SIFT SIFTED SIFTER SIFTING SIGGRAPH SIGH SIGHED SIGHING SIGHS SIGHT SIGHTED SIGHTING SIGHTINGS SIGHTLY SIGHTS SIGHTSEEING SIGMA SIGMUND SIGN SIGNAL SIGNALED SIGNALING SIGNALLED SIGNALLING SIGNALLY SIGNALS SIGNATURE SIGNATURES SIGNED SIGNER SIGNERS SIGNET SIGNIFICANCE SIGNIFICANT SIGNIFICANTLY SIGNIFICANTS SIGNIFICATION SIGNIFIED SIGNIFIES SIGNIFY SIGNIFYING SIGNING SIGNS SIKH SIKHES SIKHS SIKKIM SIKKIMESE SIKORSKY SILAS SILENCE SILENCED SILENCER SILENCERS SILENCES SILENCING SILENT SILENTLY SILHOUETTE SILHOUETTED SILHOUETTES SILICA SILICATE SILICON SILICONE SILK SILKEN SILKIER SILKIEST SILKILY SILKINE SILKS SILKY SILL SILLIEST SILLINESS SILLS SILLY SILO SILT SILTED SILTING SILTS SILVER SILVERED SILVERING SILVERMAN SILVERS SILVERSMITH SILVERSTEIN SILVERWARE SILVERY SIMILAR SIMILARITIES SIMILARITY SIMILARLY SIMILE SIMILITUDE SIMLA SIMMER SIMMERED SIMMERING SIMMERS SIMMONS SIMMONSVILLE SIMMS SIMON SIMONS SIMONSON SIMPLE SIMPLEMINDED SIMPLENESS SIMPLER SIMPLEST SIMPLETON SIMPLEX SIMPLICITIES SIMPLICITY SIMPLIFICATION SIMPLIFICATIONS SIMPLIFIED SIMPLIFIER SIMPLIFIERS SIMPLIFIES SIMPLIFY SIMPLIFYING SIMPLISTIC SIMPLY SIMPSON SIMS SIMULA SIMULA SIMULATE SIMULATED SIMULATES SIMULATING SIMULATION SIMULATIONS SIMULATOR SIMULATORS SIMULCAST SIMULTANEITY SIMULTANEOUS SIMULTANEOUSLY SINAI SINATRA SINBAD SINCE SINCERE SINCERELY SINCEREST SINCERITY SINCLAIR SINE SINES SINEW SINEWS SINEWY SINFUL SINFULLY SINFULNESS SING SINGABLE SINGAPORE SINGBORG SINGE SINGED SINGER SINGERS SINGING SINGINGLY SINGLE SINGLED SINGLEHANDED SINGLENESS SINGLES SINGLET SINGLETON SINGLETONS SINGLING SINGLY SINGS SINGSONG SINGULAR SINGULARITIES SINGULARITY SINGULARLY SINISTER SINK SINKED SINKER SINKERS SINKHOLE SINKING SINKS SINNED SINNER SINNERS SINNING SINS SINUOUS SINUS SINUSOID SINUSOIDAL SINUSOIDS SIOUX SIP SIPHON SIPHONING SIPPING SIPS SIR SIRE SIRED SIREN SIRENS SIRES SIRIUS SIRS SIRUP SISTER SISTERLY SISTERS SISTINE SISYPHEAN SISYPHUS SIT SITE SITED SITES SITING SITS SITTER SITTERS SITTING SITTINGS SITU SITUATE SITUATED SITUATES SITUATING SITUATION SITUATIONAL SITUATIONALLY SITUATIONS SIVA SIX SIXES SIXFOLD SIXGUN SIXPENCE SIXTEEN SIXTEENS SIXTEENTH SIXTH SIXTIES SIXTIETH SIXTY SIZABLE SIZE SIZED SIZES SIZING SIZINGS SIZZLE SKATE SKATED SKATER SKATERS SKATES SKATING SKELETAL SKELETON SKELETONS SKEPTIC SKEPTICAL SKEPTICALLY SKEPTICISM SKEPTICS SKETCH SKETCHBOOK SKETCHED SKETCHES SKETCHILY SKETCHING SKETCHPAD SKETCHY SKEW SKEWED SKEWER SKEWERS SKEWING SKEWS SKI SKID SKIDDING SKIED SKIES SKIFF SKIING SKILL SKILLED SKILLET SKILLFUL SKILLFULLY SKILLFULNESS SKILLS SKIM SKIMMED SKIMMING SKIMP SKIMPED SKIMPING SKIMPS SKIMPY SKIMS SKIN SKINDIVE SKINNED SKINNER SKINNERS SKINNING SKINNY SKINS SKIP SKIPPED SKIPPER SKIPPERS SKIPPING SKIPPY SKIPS SKIRMISH SKIRMISHED SKIRMISHER SKIRMISHERS SKIRMISHES SKIRMISHING SKIRT SKIRTED SKIRTING SKIRTS SKIS SKIT SKOPJE SKULK SKULKED SKULKER SKULKING SKULKS SKULL SKULLCAP SKULLDUGGERY SKULLS SKUNK SKUNKS SKY SKYE SKYHOOK SKYJACK SKYLARK SKYLARKING SKYLARKS SKYLIGHT SKYLIGHTS SKYLINE SKYROCKETS SKYSCRAPER SKYSCRAPERS SLAB SLACK SLACKEN SLACKER SLACKING SLACKLY SLACKNESS SLACKS SLAIN SLAM SLAMMED SLAMMING SLAMS SLANDER SLANDERER SLANDEROUS SLANDERS SLANG SLANT SLANTED SLANTING SLANTS SLAP SLAPPED SLAPPING SLAPS SLAPSTICK SLASH SLASHED SLASHES SLASHING SLAT SLATE SLATED SLATER SLATES SLATS SLAUGHTER SLAUGHTERED SLAUGHTERHOUSE SLAUGHTERING SLAUGHTERS SLAV SLAVE SLAVER SLAVERY SLAVES SLAVIC SLAVICIZE SLAVICIZES SLAVISH SLAVIZATION SLAVIZATIONS SLAVIZE SLAVIZES SLAVONIC SLAVONICIZE SLAVONICIZES SLAVS SLAY SLAYER SLAYERS SLAYING SLAYS SLED SLEDDING SLEDGE SLEDGEHAMMER SLEDGES SLEDS SLEEK SLEEP SLEEPER SLEEPERS SLEEPILY SLEEPINESS SLEEPING SLEEPLESS SLEEPLESSLY SLEEPLESSNESS SLEEPS SLEEPWALK SLEEPY SLEET SLEEVE SLEEVES SLEIGH SLEIGHS SLEIGHT SLENDER SLENDERER SLEPT SLESINGER SLEUTH SLEW SLEWING SLICE SLICED SLICER SLICERS SLICES SLICING SLICK SLICKER SLICKERS SLICKS SLID SLIDE SLIDER SLIDERS SLIDES SLIDING SLIGHT SLIGHTED SLIGHTER SLIGHTEST SLIGHTING SLIGHTLY SLIGHTNESS SLIGHTS SLIM SLIME SLIMED SLIMLY SLIMY SLING SLINGING SLINGS SLINGSHOT SLIP SLIPPAGE SLIPPED SLIPPER SLIPPERINESS SLIPPERS SLIPPERY SLIPPING SLIPS SLIT SLITHER SLITS SLIVER SLOAN SLOANE SLOB SLOCUM SLOGAN SLOGANS SLOOP SLOP SLOPE SLOPED SLOPER SLOPERS SLOPES SLOPING SLOPPED SLOPPINESS SLOPPING SLOPPY SLOPS SLOT SLOTH SLOTHFUL SLOTHS SLOTS SLOTTED SLOTTING SLOUCH SLOUCHED SLOUCHES SLOUCHING SLOVAKIA SLOVENIA SLOW SLOWDOWN SLOWED SLOWER SLOWEST SLOWING SLOWLY SLOWNESS SLOWS SLUDGE SLUG SLUGGISH SLUGGISHLY SLUGGISHNESS SLUGS SLUICE SLUM SLUMBER SLUMBERED SLUMMING SLUMP SLUMPED SLUMPS SLUMS SLUNG SLUR SLURP SLURRING SLURRY SLURS SLY SLYLY SMACK SMACKED SMACKING SMACKS SMALL SMALLER SMALLEST SMALLEY SMALLISH SMALLNESS SMALLPOX SMALLTIME SMALLWOOD SMART SMARTED SMARTER SMARTEST SMARTLY SMARTNESS SMASH SMASHED SMASHER SMASHERS SMASHES SMASHING SMASHINGLY SMATTERING SMEAR SMEARED SMEARING SMEARS SMELL SMELLED SMELLING SMELLS SMELLY SMELT SMELTER SMELTS SMILE SMILED SMILES SMILING SMILINGLY SMIRK SMITE SMITH SMITHEREENS SMITHFIELD SMITHS SMITHSON SMITHSONIAN SMITHTOWN SMITHY SMITTEN SMOCK SMOCKING SMOCKS SMOG SMOKABLE SMOKE SMOKED SMOKER SMOKERS SMOKES SMOKESCREEN SMOKESTACK SMOKIES SMOKING SMOKY SMOLDER SMOLDERED SMOLDERING SMOLDERS SMOOCH SMOOTH SMOOTHBORE SMOOTHED SMOOTHER SMOOTHES SMOOTHEST SMOOTHING SMOOTHLY SMOOTHNESS SMOTE SMOTHER SMOTHERED SMOTHERING SMOTHERS SMUCKER SMUDGE SMUG SMUGGLE SMUGGLED SMUGGLER SMUGGLERS SMUGGLES SMUGGLING SMUT SMUTTY SMYRNA SMYTHE SNACK SNAFU SNAG SNAIL SNAILS SNAKE SNAKED SNAKELIKE SNAKES SNAP SNAPDRAGON SNAPPED SNAPPER SNAPPERS SNAPPILY SNAPPING SNAPPY SNAPS SNAPSHOT SNAPSHOTS SNARE SNARED SNARES SNARING SNARK SNARL SNARLED SNARLING SNATCH SNATCHED SNATCHES SNATCHING SNAZZY SNEAD SNEAK SNEAKED SNEAKER SNEAKERS SNEAKIER SNEAKIEST SNEAKILY SNEAKINESS SNEAKING SNEAKS SNEAKY SNEED SNEER SNEERED SNEERING SNEERS SNEEZE SNEEZED SNEEZES SNEEZING SNIDER SNIFF SNIFFED SNIFFING SNIFFLE SNIFFS SNIFTER SNIGGER SNIP SNIPE SNIPPET SNIVEL SNOB SNOBBERY SNOBBISH SNODGRASS SNOOP SNOOPED SNOOPING SNOOPS SNOOPY SNORE SNORED SNORES SNORING SNORKEL SNORT SNORTED SNORTING SNORTS SNOTTY SNOUT SNOUTS SNOW SNOWBALL SNOWBELT SNOWED SNOWFALL SNOWFLAKE SNOWIER SNOWIEST SNOWILY SNOWING SNOWMAN SNOWMEN SNOWS SNOWSHOE SNOWSHOES SNOWSTORM SNOWY SNUB SNUFF SNUFFED SNUFFER SNUFFING SNUFFS SNUG SNUGGLE SNUGGLED SNUGGLES SNUGGLING SNUGLY SNUGNESS SNYDER SOAK SOAKED SOAKING SOAKS SOAP SOAPED SOAPING SOAPS SOAPY SOAR SOARED SOARING SOARS SOB SOBBING SOBER SOBERED SOBERING SOBERLY SOBERNESS SOBERS SOBRIETY SOBS SOCCER SOCIABILITY SOCIABLE SOCIABLY SOCIAL SOCIALISM SOCIALIST SOCIALISTS SOCIALIZE SOCIALIZED SOCIALIZES SOCIALIZING SOCIALLY SOCIETAL SOCIETIES SOCIETY SOCIOECONOMIC SOCIOLOGICAL SOCIOLOGICALLY SOCIOLOGIST SOCIOLOGISTS SOCIOLOGY SOCK SOCKED SOCKET SOCKETS SOCKING SOCKS SOCRATES SOCRATIC SOD SODA SODDY SODIUM SODOMY SODS SOFA SOFAS SOFIA SOFT SOFTBALL SOFTEN SOFTENED SOFTENING SOFTENS SOFTER SOFTEST SOFTLY SOFTNESS SOFTWARE SOFTWARES SOGGY SOIL SOILED SOILING SOILS SOIREE SOJOURN SOJOURNER SOJOURNERS SOL SOLACE SOLACED SOLAR SOLD SOLDER SOLDERED SOLDIER SOLDIERING SOLDIERLY SOLDIERS SOLE SOLELY SOLEMN SOLEMNITY SOLEMNLY SOLEMNNESS SOLENOID SOLES SOLICIT SOLICITATION SOLICITED SOLICITING SOLICITOR SOLICITOUS SOLICITS SOLICITUDE SOLID SOLIDARITY SOLIDIFICATION SOLIDIFIED SOLIDIFIES SOLIDIFY SOLIDIFYING SOLIDITY SOLIDLY SOLIDNESS SOLIDS SOLILOQUY SOLITAIRE SOLITARY SOLITUDE SOLITUDES SOLLY SOLO SOLOMON SOLON SOLOS SOLOVIEV SOLSTICE SOLUBILITY SOLUBLE SOLUTION SOLUTIONS SOLVABLE SOLVE SOLVED SOLVENT SOLVENTS SOLVER SOLVERS SOLVES SOLVING SOMALI SOMALIA SOMALIS SOMATIC SOMBER SOMBERLY SOME SOMEBODY SOMEDAY SOMEHOW SOMEONE SOMEPLACE SOMERS SOMERSAULT SOMERSET SOMERVILLE SOMETHING SOMETIME SOMETIMES SOMEWHAT SOMEWHERE SOMMELIER SOMMERFELD SOMNOLENT SON SONAR SONATA SONENBERG SONG SONGBOOK SONGS SONIC SONNET SONNETS SONNY SONOMA SONORA SONS SONY SOON SOONER SOONEST SOOT SOOTH SOOTHE SOOTHED SOOTHER SOOTHES SOOTHING SOOTHSAYER SOPHIA SOPHIAS SOPHIE SOPHISTICATED SOPHISTICATION SOPHISTRY SOPHOCLEAN SOPHOCLES SOPHOMORE SOPHOMORES SOPRANO SORCERER SORCERERS SORCERY SORDID SORDIDLY SORDIDNESS SORE SORELY SORENESS SORENSEN SORENSON SORER SORES SOREST SORGHUM SORORITY SORREL SORRENTINE SORRIER SORRIEST SORROW SORROWFUL SORROWFULLY SORROWS SORRY SORT SORTED SORTER SORTERS SORTIE SORTING SORTS SOUGHT SOUL SOULFUL SOULS SOUND SOUNDED SOUNDER SOUNDEST SOUNDING SOUNDINGS SOUNDLY SOUNDNESS SOUNDPROOF SOUNDS SOUP SOUPED SOUPS SOUR SOURCE SOURCES SOURDOUGH SOURED SOURER SOUREST SOURING SOURLY SOURNESS SOURS SOUSA SOUTH SOUTHAMPTON SOUTHBOUND SOUTHEAST SOUTHEASTERN SOUTHERN SOUTHERNER SOUTHERNERS SOUTHERNMOST SOUTHERNWOOD SOUTHEY SOUTHFIELD SOUTHLAND SOUTHPAW SOUTHWARD SOUTHWEST SOUTHWESTERN SOUVENIR SOVEREIGN SOVEREIGNS SOVEREIGNTY SOVIET SOVIETS SOW SOWN SOY SOYA SOYBEAN SPA SPACE SPACECRAFT SPACED SPACER SPACERS SPACES SPACESHIP SPACESHIPS SPACESUIT SPACEWAR SPACING SPACINGS SPACIOUS SPADED SPADES SPADING SPAFFORD SPAHN SPAIN SPALDING SPAN SPANDREL SPANIARD SPANIARDIZATION SPANIARDIZATIONS SPANIARDIZE SPANIARDIZES SPANIARDS SPANIEL SPANISH SPANISHIZE SPANISHIZES SPANK SPANKED SPANKING SPANKS SPANNED SPANNER SPANNERS SPANNING SPANS SPARC SPARCSTATION SPARE SPARED SPARELY SPARENESS SPARER SPARES SPAREST SPARING SPARINGLY SPARK SPARKED SPARKING SPARKLE SPARKLING SPARKMAN SPARKS SPARRING SPARROW SPARROWS SPARSE SPARSELY SPARSENESS SPARSER SPARSEST SPARTA SPARTAN SPARTANIZE SPARTANIZES SPASM SPASTIC SPAT SPATE SPATES SPATIAL SPATIALLY SPATTER SPATTERED SPATULA SPAULDING SPAWN SPAWNED SPAWNING SPAWNS SPAYED SPEAK SPEAKABLE SPEAKEASY SPEAKER SPEAKERPHONE SPEAKERPHONES SPEAKERS SPEAKING SPEAKS SPEAR SPEARED SPEARMINT SPEARS SPEC SPECIAL SPECIALIST SPECIALISTS SPECIALIZATION SPECIALIZATIONS SPECIALIZE SPECIALIZED SPECIALIZES SPECIALIZING SPECIALLY SPECIALS SPECIALTIES SPECIALTY SPECIE SPECIES SPECIFIABLE SPECIFIC SPECIFICALLY SPECIFICATION SPECIFICATIONS SPECIFICITY SPECIFICS SPECIFIED SPECIFIER SPECIFIERS SPECIFIES SPECIFY SPECIFYING SPECIMEN SPECIMENS SPECIOUS SPECK SPECKLE SPECKLED SPECKLES SPECKS SPECTACLE SPECTACLED SPECTACLES SPECTACULAR SPECTACULARLY SPECTATOR SPECTATORS SPECTER SPECTERS SPECTOR SPECTRA SPECTRAL SPECTROGRAM SPECTROGRAMS SPECTROGRAPH SPECTROGRAPHIC SPECTROGRAPHY SPECTROMETER SPECTROPHOTOMETER SPECTROPHOTOMETRY SPECTROSCOPE SPECTROSCOPIC SPECTROSCOPY SPECTRUM SPECULATE SPECULATED SPECULATES SPECULATING SPECULATION SPECULATIONS SPECULATIVE SPECULATOR SPECULATORS SPED SPEECH SPEECHES SPEECHLESS SPEECHLESSNESS SPEED SPEEDBOAT SPEEDED SPEEDER SPEEDERS SPEEDILY SPEEDING SPEEDOMETER SPEEDS SPEEDUP SPEEDUPS SPEEDY SPELL SPELLBOUND SPELLED SPELLER SPELLERS SPELLING SPELLINGS SPELLS SPENCER SPENCERIAN SPEND SPENDER SPENDERS SPENDING SPENDS SPENGLERIAN SPENT SPERM SPERRY SPHERE SPHERES SPHERICAL SPHERICALLY SPHEROID SPHEROIDAL SPHINX SPICA SPICE SPICED SPICES SPICINESS SPICY SPIDER SPIDERS SPIDERY SPIEGEL SPIES SPIGOT SPIKE SPIKED SPIKES SPILL SPILLED SPILLER SPILLING SPILLS SPILT SPIN SPINACH SPINAL SPINALLY SPINDLE SPINDLED SPINDLING SPINE SPINNAKER SPINNER SPINNERS SPINNING SPINOFF SPINS SPINSTER SPINY SPIRAL SPIRALED SPIRALING SPIRALLY SPIRE SPIRES SPIRIT SPIRITED SPIRITEDLY SPIRITING SPIRITS SPIRITUAL SPIRITUALLY SPIRITUALS SPIRO SPIT SPITE SPITED SPITEFUL SPITEFULLY SPITEFULNESS SPITES SPITFIRE SPITING SPITS SPITTING SPITTLE SPITZ SPLASH SPLASHED SPLASHES SPLASHING SPLASHY SPLEEN SPLENDID SPLENDIDLY SPLENDOR SPLENETIC SPLICE SPLICED SPLICER SPLICERS SPLICES SPLICING SPLICINGS SPLINE SPLINES SPLINT SPLINTER SPLINTERED SPLINTERS SPLINTERY SPLIT SPLITS SPLITTER SPLITTERS SPLITTING SPLURGE SPOIL SPOILAGE SPOILED SPOILER SPOILERS SPOILING SPOILS SPOKANE SPOKE SPOKED SPOKEN SPOKES SPOKESMAN SPOKESMEN SPONGE SPONGED SPONGER SPONGERS SPONGES SPONGING SPONGY SPONSOR SPONSORED SPONSORING SPONSORS SPONSORSHIP SPONTANEITY SPONTANEOUS SPONTANEOUSLY SPOOF SPOOK SPOOKY SPOOL SPOOLED SPOOLER SPOOLERS SPOOLING SPOOLS SPOON SPOONED SPOONFUL SPOONING SPOONS SPORADIC SPORE SPORES SPORT SPORTED SPORTING SPORTINGLY SPORTIVE SPORTS SPORTSMAN SPORTSMEN SPORTSWEAR SPORTSWRITER SPORTSWRITING SPORTY SPOSATO SPOT SPOTLESS SPOTLESSLY SPOTLIGHT SPOTS SPOTTED SPOTTER SPOTTERS SPOTTING SPOTTY SPOUSE SPOUSES SPOUT SPOUTED SPOUTING SPOUTS SPRAGUE SPRAIN SPRANG SPRAWL SPRAWLED SPRAWLING SPRAWLS SPRAY SPRAYED SPRAYER SPRAYING SPRAYS SPREAD SPREADER SPREADERS SPREADING SPREADINGS SPREADS SPREADSHEET SPREE SPREES SPRIG SPRIGHTLY SPRING SPRINGBOARD SPRINGER SPRINGERS SPRINGFIELD SPRINGIER SPRINGIEST SPRINGINESS SPRINGING SPRINGS SPRINGTIME SPRINGY SPRINKLE SPRINKLED SPRINKLER SPRINKLES SPRINKLING SPRINT SPRINTED SPRINTER SPRINTERS SPRINTING SPRINTS SPRITE SPROCKET SPROUL SPROUT SPROUTED SPROUTING SPRUCE SPRUCED SPRUNG SPUDS SPUN SPUNK SPUR SPURIOUS SPURN SPURNED SPURNING SPURNS SPURS SPURT SPURTED SPURTING SPURTS SPUTTER SPUTTERED SPY SPYGLASS SPYING SQUABBLE SQUABBLED SQUABBLES SQUABBLING SQUAD SQUADRON SQUADRONS SQUADS SQUALID SQUALL SQUALLS SQUANDER SQUARE SQUARED SQUARELY SQUARENESS SQUARER SQUARES SQUAREST SQUARESVILLE SQUARING SQUASH SQUASHED SQUASHING SQUAT SQUATS SQUATTING SQUAW SQUAWK SQUAWKED SQUAWKING SQUAWKS SQUEAK SQUEAKED SQUEAKING SQUEAKS SQUEAKY SQUEAL SQUEALED SQUEALING SQUEALS SQUEAMISH SQUEEZE SQUEEZED SQUEEZER SQUEEZES SQUEEZING SQUELCH SQUIBB SQUID SQUINT SQUINTED SQUINTING SQUIRE SQUIRES SQUIRM SQUIRMED SQUIRMS SQUIRMY SQUIRREL SQUIRRELED SQUIRRELING SQUIRRELS SQUIRT SQUISHY SRI STAB STABBED STABBING STABILE STABILITIES STABILITY STABILIZE STABILIZED STABILIZER STABILIZERS STABILIZES STABILIZING STABLE STABLED STABLER STABLES STABLING STABLY STABS STACK STACKED STACKING STACKS STACY STADIA STADIUM STAFF STAFFED STAFFER STAFFERS STAFFING STAFFORD STAFFORDSHIRE STAFFS STAG STAGE STAGECOACH STAGECOACHES STAGED STAGER STAGERS STAGES STAGGER STAGGERED STAGGERING STAGGERS STAGING STAGNANT STAGNATE STAGNATION STAGS STAHL STAID STAIN STAINED STAINING STAINLESS STAINS STAIR STAIRCASE STAIRCASES STAIRS STAIRWAY STAIRWAYS STAIRWELL STAKE STAKED STAKES STALACTITE STALE STALEMATE STALEY STALIN STALINIST STALINS STALK STALKED STALKING STALL STALLED STALLING STALLINGS STALLION STALLS STALWART STALWARTLY STAMEN STAMENS STAMFORD STAMINA STAMMER STAMMERED STAMMERER STAMMERING STAMMERS STAMP STAMPED STAMPEDE STAMPEDED STAMPEDES STAMPEDING STAMPER STAMPERS STAMPING STAMPS STAN STANCH STANCHEST STANCHION STAND STANDARD STANDARDIZATION STANDARDIZE STANDARDIZED STANDARDIZES STANDARDIZING STANDARDLY STANDARDS STANDBY STANDING STANDINGS STANDISH STANDOFF STANDPOINT STANDPOINTS STANDS STANDSTILL STANFORD STANHOPE STANLEY STANS STANTON STANZA STANZAS STAPHYLOCOCCUS STAPLE STAPLER STAPLES STAPLETON STAPLING STAR STARBOARD STARCH STARCHED STARDOM STARE STARED STARER STARES STARFISH STARGATE STARING STARK STARKEY STARKLY STARLET STARLIGHT STARLING STARR STARRED STARRING STARRY STARS START STARTED STARTER STARTERS STARTING STARTLE STARTLED STARTLES STARTLING STARTS STARTUP STARTUPS STARVATION STARVE STARVED STARVES STARVING STATE STATED STATELY STATEMENT STATEMENTS STATEN STATES STATESMAN STATESMANLIKE STATESMEN STATEWIDE STATIC STATICALLY STATING STATION STATIONARY STATIONED STATIONER STATIONERY STATIONING STATIONMASTER STATIONS STATISTIC STATISTICAL STATISTICALLY STATISTICIAN STATISTICIANS STATISTICS STATLER STATUE STATUES STATUESQUE STATUESQUELY STATUESQUENESS STATUETTE STATURE STATUS STATUSES STATUTE STATUTES STATUTORILY STATUTORINESS STATUTORY STAUFFER STAUNCH STAUNCHEST STAUNCHLY STAUNTON STAVE STAVED STAVES STAY STAYED STAYING STAYS STEAD STEADFAST STEADFASTLY STEADFASTNESS STEADIED STEADIER STEADIES STEADIEST STEADILY STEADINESS STEADY STEADYING STEAK STEAKS STEAL STEALER STEALING STEALS STEALTH STEALTHILY STEALTHY STEAM STEAMBOAT STEAMBOATS STEAMED STEAMER STEAMERS STEAMING STEAMS STEAMSHIP STEAMSHIPS STEAMY STEARNS STEED STEEL STEELE STEELED STEELERS STEELING STEELMAKER STEELS STEELY STEEN STEEP STEEPED STEEPER STEEPEST STEEPING STEEPLE STEEPLES STEEPLY STEEPNESS STEEPS STEER STEERABLE STEERED STEERING STEERS STEFAN STEGOSAURUS STEINBECK STEINBERG STEINER STELLA STELLAR STEM STEMMED STEMMING STEMS STENCH STENCHES STENCIL STENCILS STENDHAL STENDLER STENOGRAPHER STENOGRAPHERS STENOTYPE STEP STEPCHILD STEPHAN STEPHANIE STEPHEN STEPHENS STEPHENSON STEPMOTHER STEPMOTHERS STEPPED STEPPER STEPPING STEPS STEPSON STEPWISE STEREO STEREOS STEREOSCOPIC STEREOTYPE STEREOTYPED STEREOTYPES STEREOTYPICAL STERILE STERILIZATION STERILIZATIONS STERILIZE STERILIZED STERILIZER STERILIZES STERILIZING STERLING STERN STERNBERG STERNLY STERNNESS STERNO STERNS STETHOSCOPE STETSON STETSONS STEUBEN STEVE STEVEDORE STEVEN STEVENS STEVENSON STEVIE STEW STEWARD STEWARDESS STEWARDS STEWART STEWED STEWS STICK STICKER STICKERS STICKIER STICKIEST STICKILY STICKINESS STICKING STICKLEBACK STICKS STICKY STIFF STIFFEN STIFFENS STIFFER STIFFEST STIFFLY STIFFNESS STIFFS STIFLE STIFLED STIFLES STIFLING STIGMA STIGMATA STILE STILES STILETTO STILL STILLBIRTH STILLBORN STILLED STILLER STILLEST STILLING STILLNESS STILLS STILLWELL STILT STILTS STIMSON STIMULANT STIMULANTS STIMULATE STIMULATED STIMULATES STIMULATING STIMULATION STIMULATIONS STIMULATIVE STIMULI STIMULUS STING STINGING STINGS STINGY STINK STINKER STINKERS STINKING STINKS STINT STIPEND STIPENDS STIPULATE STIPULATED STIPULATES STIPULATING STIPULATION STIPULATIONS STIR STIRLING STIRRED STIRRER STIRRERS STIRRING STIRRINGLY STIRRINGS STIRRUP STIRS STITCH STITCHED STITCHES STITCHING STOCHASTIC STOCHASTICALLY STOCK STOCKADE STOCKADES STOCKBROKER STOCKED STOCKER STOCKERS STOCKHOLDER STOCKHOLDERS STOCKHOLM STOCKING STOCKINGS STOCKPILE STOCKROOM STOCKS STOCKTON STOCKY STODGY STOICHIOMETRY STOKE STOKES STOLE STOLEN STOLES STOLID STOMACH STOMACHED STOMACHER STOMACHES STOMACHING STOMP STONE STONED STONEHENGE STONES STONING STONY STOOD STOOGE STOOL STOOP STOOPED STOOPING STOOPS STOP STOPCOCK STOPCOCKS STOPGAP STOPOVER STOPPABLE STOPPAGE STOPPED STOPPER STOPPERS STOPPING STOPS STOPWATCH STORAGE STORAGES STORE STORED STOREHOUSE STOREHOUSES STOREKEEPER STOREROOM STORES STOREY STOREYED STOREYS STORIED STORIES STORING STORK STORKS STORM STORMED STORMIER STORMIEST STORMINESS STORMING STORMS STORMY STORY STORYBOARD STORYTELLER STOUFFER STOUT STOUTER STOUTEST STOUTLY STOUTNESS STOVE STOVES STOW STOWE STOWED STRADDLE STRAFE STRAGGLE STRAGGLED STRAGGLER STRAGGLERS STRAGGLES STRAGGLING STRAIGHT STRAIGHTAWAY STRAIGHTEN STRAIGHTENED STRAIGHTENS STRAIGHTER STRAIGHTEST STRAIGHTFORWARD STRAIGHTFORWARDLY STRAIGHTFORWARDNESS STRAIGHTNESS STRAIGHTWAY STRAIN STRAINED STRAINER STRAINERS STRAINING STRAINS STRAIT STRAITEN STRAITS STRAND STRANDED STRANDING STRANDS STRANGE STRANGELY STRANGENESS STRANGER STRANGERS STRANGEST STRANGLE STRANGLED STRANGLER STRANGLERS STRANGLES STRANGLING STRANGLINGS STRANGULATION STRANGULATIONS STRAP STRAPS STRASBOURG STRATAGEM STRATAGEMS STRATEGIC STRATEGIES STRATEGIST STRATEGY STRATFORD STRATIFICATION STRATIFICATIONS STRATIFIED STRATIFIES STRATIFY STRATOSPHERE STRATOSPHERIC STRATTON STRATUM STRAUSS STRAVINSKY STRAW STRAWBERRIES STRAWBERRY STRAWS STRAY STRAYED STRAYS STREAK STREAKED STREAKS STREAM STREAMED STREAMER STREAMERS STREAMING STREAMLINE STREAMLINED STREAMLINER STREAMLINES STREAMLINING STREAMS STREET STREETCAR STREETCARS STREETERS STREETS STRENGTH STRENGTHEN STRENGTHENED STRENGTHENER STRENGTHENING STRENGTHENS STRENGTHS STRENUOUS STRENUOUSLY STREPTOCOCCUS STRESS STRESSED STRESSES STRESSFUL STRESSING STRETCH STRETCHED STRETCHER STRETCHERS STRETCHES STRETCHING STREW STREWN STREWS STRICKEN STRICKLAND STRICT STRICTER STRICTEST STRICTLY STRICTNESS STRICTURE STRIDE STRIDER STRIDES STRIDING STRIFE STRIKE STRIKEBREAKER STRIKER STRIKERS STRIKES STRIKING STRIKINGLY STRINDBERG STRING STRINGED STRINGENT STRINGENTLY STRINGER STRINGERS STRINGIER STRINGIEST STRINGINESS STRINGING STRINGS STRINGY STRIP STRIPE STRIPED STRIPES STRIPPED STRIPPER STRIPPERS STRIPPING STRIPS STRIPTEASE STRIVE STRIVEN STRIVES STRIVING STRIVINGS STROBE STROBED STROBES STROBOSCOPIC STRODE STROKE STROKED STROKER STROKERS STROKES STROKING STROLL STROLLED STROLLER STROLLING STROLLS STROM STROMBERG STRONG STRONGER STRONGEST STRONGHEART STRONGHOLD STRONGLY STRONTIUM STROVE STRUCK STRUCTURAL STRUCTURALLY STRUCTURE STRUCTURED STRUCTURER STRUCTURES STRUCTURING STRUGGLE STRUGGLED STRUGGLES STRUGGLING STRUNG STRUT STRUTS STRUTTING STRYCHNINE STU STUART STUB STUBBLE STUBBLEFIELD STUBBLEFIELDS STUBBORN STUBBORNLY STUBBORNNESS STUBBY STUBS STUCCO STUCK STUD STUDEBAKER STUDENT STUDENTS STUDIED STUDIES STUDIO STUDIOS STUDIOUS STUDIOUSLY STUDS STUDY STUDYING STUFF STUFFED STUFFIER STUFFIEST STUFFING STUFFS STUFFY STUMBLE STUMBLED STUMBLES STUMBLING STUMP STUMPED STUMPING STUMPS STUN STUNG STUNNING STUNNINGLY STUNT STUNTS STUPEFY STUPEFYING STUPENDOUS STUPENDOUSLY STUPID STUPIDEST STUPIDITIES STUPIDITY STUPIDLY STUPOR STURBRIDGE STURDINESS STURDY STURGEON STURM STUTTER STUTTGART STUYVESANT STYGIAN STYLE STYLED STYLER STYLERS STYLES STYLI STYLING STYLISH STYLISHLY STYLISHNESS STYLISTIC STYLISTICALLY STYLIZED STYLUS STYROFOAM STYX SUAVE SUB SUBATOMIC SUBCHANNEL SUBCHANNELS SUBCLASS SUBCLASSES SUBCOMMITTEES SUBCOMPONENT SUBCOMPONENTS SUBCOMPUTATION SUBCOMPUTATIONS SUBCONSCIOUS SUBCONSCIOUSLY SUBCULTURE SUBCULTURES SUBCYCLE SUBCYCLES SUBDIRECTORIES SUBDIRECTORY SUBDIVIDE SUBDIVIDED SUBDIVIDES SUBDIVIDING SUBDIVISION SUBDIVISIONS SUBDOMAINS SUBDUE SUBDUED SUBDUES SUBDUING SUBEXPRESSION SUBEXPRESSIONS SUBFIELD SUBFIELDS SUBFILE SUBFILES SUBGOAL SUBGOALS SUBGRAPH SUBGRAPHS SUBGROUP SUBGROUPS SUBINTERVAL SUBINTERVALS SUBJECT SUBJECTED SUBJECTING SUBJECTION SUBJECTIVE SUBJECTIVELY SUBJECTIVITY SUBJECTS SUBLANGUAGE SUBLANGUAGES SUBLAYER SUBLAYERS SUBLIMATION SUBLIMATIONS SUBLIME SUBLIMED SUBLIST SUBLISTS SUBMARINE SUBMARINER SUBMARINERS SUBMARINES SUBMERGE SUBMERGED SUBMERGES SUBMERGING SUBMISSION SUBMISSIONS SUBMISSIVE SUBMIT SUBMITS SUBMITTAL SUBMITTED SUBMITTING SUBMODE SUBMODES SUBMODULE SUBMODULES SUBMULTIPLEXED SUBNET SUBNETS SUBNETWORK SUBNETWORKS SUBOPTIMAL SUBORDINATE SUBORDINATED SUBORDINATES SUBORDINATION SUBPARTS SUBPHASES SUBPOENA SUBPROBLEM SUBPROBLEMS SUBPROCESSES SUBPROGRAM SUBPROGRAMS SUBPROJECT SUBPROOF SUBPROOFS SUBRANGE SUBRANGES SUBROUTINE SUBROUTINES SUBS SUBSCHEMA SUBSCHEMAS SUBSCRIBE SUBSCRIBED SUBSCRIBER SUBSCRIBERS SUBSCRIBES SUBSCRIBING SUBSCRIPT SUBSCRIPTED SUBSCRIPTING SUBSCRIPTION SUBSCRIPTIONS SUBSCRIPTS SUBSECTION SUBSECTIONS SUBSEGMENT SUBSEGMENTS SUBSEQUENCE SUBSEQUENCES SUBSEQUENT SUBSEQUENTLY SUBSERVIENT SUBSET SUBSETS SUBSIDE SUBSIDED SUBSIDES SUBSIDIARIES SUBSIDIARY SUBSIDIES SUBSIDING SUBSIDIZE SUBSIDIZED SUBSIDIZES SUBSIDIZING SUBSIDY SUBSIST SUBSISTED SUBSISTENCE SUBSISTENT SUBSISTING SUBSISTS SUBSLOT SUBSLOTS SUBSPACE SUBSPACES SUBSTANCE SUBSTANCES SUBSTANTIAL SUBSTANTIALLY SUBSTANTIATE SUBSTANTIATED SUBSTANTIATES SUBSTANTIATING SUBSTANTIATION SUBSTANTIATIONS SUBSTANTIVE SUBSTANTIVELY SUBSTANTIVITY SUBSTATION SUBSTATIONS SUBSTITUTABILITY SUBSTITUTABLE SUBSTITUTE SUBSTITUTED SUBSTITUTES SUBSTITUTING SUBSTITUTION SUBSTITUTIONS SUBSTRATE SUBSTRATES SUBSTRING SUBSTRINGS SUBSTRUCTURE SUBSTRUCTURES SUBSUME SUBSUMED SUBSUMES SUBSUMING SUBSYSTEM SUBSYSTEMS SUBTASK SUBTASKS SUBTERFUGE SUBTERRANEAN SUBTITLE SUBTITLED SUBTITLES SUBTLE SUBTLENESS SUBTLER SUBTLEST SUBTLETIES SUBTLETY SUBTLY SUBTOTAL SUBTRACT SUBTRACTED SUBTRACTING SUBTRACTION SUBTRACTIONS SUBTRACTOR SUBTRACTORS SUBTRACTS SUBTRAHEND SUBTRAHENDS SUBTREE SUBTREES SUBUNIT SUBUNITS SUBURB SUBURBAN SUBURBIA SUBURBS SUBVERSION SUBVERSIVE SUBVERT SUBVERTED SUBVERTER SUBVERTING SUBVERTS SUBWAY SUBWAYS SUCCEED SUCCEEDED SUCCEEDING SUCCEEDS SUCCESS SUCCESSES SUCCESSFUL SUCCESSFULLY SUCCESSION SUCCESSIONS SUCCESSIVE SUCCESSIVELY SUCCESSOR SUCCESSORS SUCCINCT SUCCINCTLY SUCCINCTNESS SUCCOR SUCCUMB SUCCUMBED SUCCUMBING SUCCUMBS SUCH SUCK SUCKED SUCKER SUCKERS SUCKING SUCKLE SUCKLING SUCKS SUCTION SUDAN SUDANESE SUDANIC SUDDEN SUDDENLY SUDDENNESS SUDS SUDSING SUE SUED SUES SUEZ SUFFER SUFFERANCE SUFFERED SUFFERER SUFFERERS SUFFERING SUFFERINGS SUFFERS SUFFICE SUFFICED SUFFICES SUFFICIENCY SUFFICIENT SUFFICIENTLY SUFFICING SUFFIX SUFFIXED SUFFIXER SUFFIXES SUFFIXING SUFFOCATE SUFFOCATED SUFFOCATES SUFFOCATING SUFFOCATION SUFFOLK SUFFRAGE SUFFRAGETTE SUGAR SUGARED SUGARING SUGARINGS SUGARS SUGGEST SUGGESTED SUGGESTIBLE SUGGESTING SUGGESTION SUGGESTIONS SUGGESTIVE SUGGESTIVELY SUGGESTS SUICIDAL SUICIDALLY SUICIDE SUICIDES SUING SUIT SUITABILITY SUITABLE SUITABLENESS SUITABLY SUITCASE SUITCASES SUITE SUITED SUITERS SUITES SUITING SUITOR SUITORS SUITS SUKARNO SULFA SULFUR SULFURIC SULFUROUS SULK SULKED SULKINESS SULKING SULKS SULKY SULLEN SULLENLY SULLENNESS SULLIVAN SULPHATE SULPHUR SULPHURED SULPHURIC SULTAN SULTANS SULTRY SULZBERGER SUM SUMAC SUMATRA SUMERIA SUMERIAN SUMMAND SUMMANDS SUMMARIES SUMMARILY SUMMARIZATION SUMMARIZATIONS SUMMARIZE SUMMARIZED SUMMARIZES SUMMARIZING SUMMARY SUMMATION SUMMATIONS SUMMED SUMMER SUMMERDALE SUMMERS SUMMERTIME SUMMING SUMMIT SUMMITRY SUMMON SUMMONED SUMMONER SUMMONERS SUMMONING SUMMONS SUMMONSES SUMNER SUMPTUOUS SUMS SUMTER SUN SUNBEAM SUNBEAMS SUNBELT SUNBONNET SUNBURN SUNBURNT SUNDAY SUNDAYS SUNDER SUNDIAL SUNDOWN SUNDRIES SUNDRY SUNFLOWER SUNG SUNGLASS SUNGLASSES SUNK SUNKEN SUNLIGHT SUNLIT SUNNED SUNNING SUNNY SUNNYVALE SUNRISE SUNS SUNSET SUNSHINE SUNSPOT SUNTAN SUNTANNED SUNTANNING SUPER SUPERB SUPERBLOCK SUPERBLY SUPERCOMPUTER SUPERCOMPUTERS SUPEREGO SUPEREGOS SUPERFICIAL SUPERFICIALLY SUPERFLUITIES SUPERFLUITY SUPERFLUOUS SUPERFLUOUSLY SUPERGROUP SUPERGROUPS SUPERHUMAN SUPERHUMANLY SUPERIMPOSE SUPERIMPOSED SUPERIMPOSES SUPERIMPOSING SUPERINTEND SUPERINTENDENT SUPERINTENDENTS SUPERIOR SUPERIORITY SUPERIORS SUPERLATIVE SUPERLATIVELY SUPERLATIVES SUPERMARKET SUPERMARKETS SUPERMINI SUPERMINIS SUPERNATURAL SUPERPOSE SUPERPOSED SUPERPOSES SUPERPOSING SUPERPOSITION SUPERSCRIPT SUPERSCRIPTED SUPERSCRIPTING SUPERSCRIPTS SUPERSEDE SUPERSEDED SUPERSEDES SUPERSEDING SUPERSET SUPERSETS SUPERSTITION SUPERSTITIONS SUPERSTITIOUS SUPERUSER SUPERVISE SUPERVISED SUPERVISES SUPERVISING SUPERVISION SUPERVISOR SUPERVISORS SUPERVISORY SUPINE SUPPER SUPPERS SUPPLANT SUPPLANTED SUPPLANTING SUPPLANTS SUPPLE SUPPLEMENT SUPPLEMENTAL SUPPLEMENTARY SUPPLEMENTED SUPPLEMENTING SUPPLEMENTS SUPPLENESS SUPPLICATION SUPPLIED SUPPLIER SUPPLIERS SUPPLIES SUPPLY SUPPLYING SUPPORT SUPPORTABLE SUPPORTED SUPPORTER SUPPORTERS SUPPORTING SUPPORTINGLY SUPPORTIVE SUPPORTIVELY SUPPORTS SUPPOSE SUPPOSED SUPPOSEDLY SUPPOSES SUPPOSING SUPPOSITION SUPPOSITIONS SUPPRESS SUPPRESSED SUPPRESSES SUPPRESSING SUPPRESSION SUPPRESSOR SUPPRESSORS SUPRANATIONAL SUPREMACY SUPREME SUPREMELY SURCHARGE SURE SURELY SURENESS SURETIES SURETY SURF SURFACE SURFACED SURFACENESS SURFACES SURFACING SURGE SURGED SURGEON SURGEONS SURGERY SURGES SURGICAL SURGICALLY SURGING SURLINESS SURLY SURMISE SURMISED SURMISES SURMOUNT SURMOUNTED SURMOUNTING SURMOUNTS SURNAME SURNAMES SURPASS SURPASSED SURPASSES SURPASSING SURPLUS SURPLUSES SURPRISE SURPRISED SURPRISES SURPRISING SURPRISINGLY SURREAL SURRENDER SURRENDERED SURRENDERING SURRENDERS SURREPTITIOUS SURREY SURROGATE SURROGATES SURROUND SURROUNDED SURROUNDING SURROUNDINGS SURROUNDS SURTAX SURVEY SURVEYED SURVEYING SURVEYOR SURVEYORS SURVEYS SURVIVAL SURVIVALS SURVIVE SURVIVED SURVIVES SURVIVING SURVIVOR SURVIVORS SUS SUSAN SUSANNE SUSCEPTIBLE SUSIE SUSPECT SUSPECTED SUSPECTING SUSPECTS SUSPEND SUSPENDED SUSPENDER SUSPENDERS SUSPENDING SUSPENDS SUSPENSE SUSPENSES SUSPENSION SUSPENSIONS SUSPICION SUSPICIONS SUSPICIOUS SUSPICIOUSLY SUSQUEHANNA SUSSEX SUSTAIN SUSTAINED SUSTAINING SUSTAINS SUSTENANCE SUTHERLAND SUTTON SUTURE SUTURES SUWANEE SUZANNE SUZERAINTY SUZUKI SVELTE SVETLANA SWAB SWABBING SWAGGER SWAGGERED SWAGGERING SWAHILI SWAIN SWAINS SWALLOW SWALLOWED SWALLOWING SWALLOWS SWALLOWTAIL SWAM SWAMI SWAMP SWAMPED SWAMPING SWAMPS SWAMPY SWAN SWANK SWANKY SWANLIKE SWANS SWANSEA SWANSON SWAP SWAPPED SWAPPING SWAPS SWARM SWARMED SWARMING SWARMS SWARTHMORE SWARTHOUT SWARTHY SWARTZ SWASTIKA SWAT SWATTED SWAY SWAYED SWAYING SWAZILAND SWEAR SWEARER SWEARING SWEARS SWEAT SWEATED SWEATER SWEATERS SWEATING SWEATS SWEATSHIRT SWEATY SWEDE SWEDEN SWEDES SWEDISH SWEENEY SWEENEYS SWEEP SWEEPER SWEEPERS SWEEPING SWEEPINGS SWEEPS SWEEPSTAKES SWEET SWEETEN SWEETENED SWEETENER SWEETENERS SWEETENING SWEETENINGS SWEETENS SWEETER SWEETEST SWEETHEART SWEETHEARTS SWEETISH SWEETLY SWEETNESS SWEETS SWELL SWELLED SWELLING SWELLINGS SWELLS SWELTER SWENSON SWEPT SWERVE SWERVED SWERVES SWERVING SWIFT SWIFTER SWIFTEST SWIFTLY SWIFTNESS SWIM SWIMMER SWIMMERS SWIMMING SWIMMINGLY SWIMS SWIMSUIT SWINBURNE SWINDLE SWINE SWING SWINGER SWINGERS SWINGING SWINGS SWINK SWIPE SWIRL SWIRLED SWIRLING SWISH SWISHED SWISS SWITCH SWITCHBLADE SWITCHBOARD SWITCHBOARDS SWITCHED SWITCHER SWITCHERS SWITCHES SWITCHING SWITCHINGS SWITCHMAN SWITZER SWITZERLAND SWIVEL SWIZZLE SWOLLEN SWOON SWOOP SWOOPED SWOOPING SWOOPS SWORD SWORDFISH SWORDS SWORE SWORN SWUM SWUNG SYBIL SYCAMORE SYCOPHANT SYCOPHANTIC SYDNEY SYKES SYLLABLE SYLLABLES SYLLOGISM SYLLOGISMS SYLLOGISTIC SYLOW SYLVAN SYLVANIA SYLVESTER SYLVIA SYLVIE SYMBIOSIS SYMBIOTIC SYMBOL SYMBOLIC SYMBOLICALLY SYMBOLICS SYMBOLISM SYMBOLIZATION SYMBOLIZE SYMBOLIZED SYMBOLIZES SYMBOLIZING SYMBOLS SYMINGTON SYMMETRIC SYMMETRICAL SYMMETRICALLY SYMMETRIES SYMMETRY SYMPATHETIC SYMPATHIES SYMPATHIZE SYMPATHIZED SYMPATHIZER SYMPATHIZERS SYMPATHIZES SYMPATHIZING SYMPATHIZINGLY SYMPATHY SYMPHONIC SYMPHONIES SYMPHONY SYMPOSIA SYMPOSIUM SYMPOSIUMS SYMPTOM SYMPTOMATIC SYMPTOMS SYNAGOGUE SYNAPSE SYNAPSES SYNAPTIC SYNCHRONISM SYNCHRONIZATION SYNCHRONIZE SYNCHRONIZED SYNCHRONIZER SYNCHRONIZERS SYNCHRONIZES SYNCHRONIZING SYNCHRONOUS SYNCHRONOUSLY SYNCHRONY SYNCHROTRON SYNCOPATE SYNDICATE SYNDICATED SYNDICATES SYNDICATION SYNDROME SYNDROMES SYNERGISM SYNERGISTIC SYNERGY SYNGE SYNOD SYNONYM SYNONYMOUS SYNONYMOUSLY SYNONYMS SYNOPSES SYNOPSIS SYNTACTIC SYNTACTICAL SYNTACTICALLY SYNTAX SYNTAXES SYNTHESIS SYNTHESIZE SYNTHESIZED SYNTHESIZER SYNTHESIZERS SYNTHESIZES SYNTHESIZING SYNTHETIC SYNTHETICS SYRACUSE SYRIA SYRIAN SYRIANIZE SYRIANIZES SYRIANS SYRINGE SYRINGES SYRUP SYRUPY SYSTEM SYSTEMATIC SYSTEMATICALLY SYSTEMATIZE SYSTEMATIZED SYSTEMATIZES SYSTEMATIZING SYSTEMIC SYSTEMS SYSTEMWIDE SZILARD TAB TABERNACLE TABERNACLES TABLE TABLEAU TABLEAUS TABLECLOTH TABLECLOTHS TABLED TABLES TABLESPOON TABLESPOONFUL TABLESPOONFULS TABLESPOONS TABLET TABLETS TABLING TABOO TABOOS TABS TABULAR TABULATE TABULATED TABULATES TABULATING TABULATION TABULATIONS TABULATOR TABULATORS TACHOMETER TACHOMETERS TACIT TACITLY TACITUS TACK TACKED TACKING TACKLE TACKLES TACOMA TACT TACTIC TACTICS TACTILE TAFT TAG TAGGED TAGGING TAGS TAHITI TAHOE TAIL TAILED TAILING TAILOR TAILORED TAILORING TAILORS TAILS TAINT TAINTED TAIPEI TAIWAN TAIWANESE TAKE TAKEN TAKER TAKERS TAKES TAKING TAKINGS TALE TALENT TALENTED TALENTS TALES TALK TALKATIVE TALKATIVELY TALKATIVENESS TALKED TALKER TALKERS TALKIE TALKING TALKS TALL TALLADEGA TALLAHASSEE TALLAHATCHIE TALLAHOOSA TALLCHIEF TALLER TALLEST TALLEYRAND TALLNESS TALLOW TALLY TALMUD TALMUDISM TALMUDIZATION TALMUDIZATIONS TALMUDIZE TALMUDIZES TAME TAMED TAMELY TAMENESS TAMER TAMES TAMIL TAMING TAMMANY TAMMANYIZE TAMMANYIZES TAMPA TAMPER TAMPERED TAMPERING TAMPERS TAN TANAKA TANANARIVE TANDEM TANG TANGANYIKA TANGENT TANGENTIAL TANGENTS TANGIBLE TANGIBLY TANGLE TANGLED TANGY TANK TANKER TANKERS TANKS TANNENBAUM TANNER TANNERS TANTALIZING TANTALIZINGLY TANTALUS TANTAMOUNT TANTRUM TANTRUMS TANYA TANZANIA TAOISM TAOIST TAOS TAP TAPE TAPED TAPER TAPERED TAPERING TAPERS TAPES TAPESTRIES TAPESTRY TAPING TAPINGS TAPPED TAPPER TAPPERS TAPPING TAPROOT TAPROOTS TAPS TAR TARA TARBELL TARDINESS TARDY TARGET TARGETED TARGETING TARGETS TARIFF TARIFFS TARRY TARRYTOWN TART TARTARY TARTLY TARTNESS TARTUFFE TARZAN TASK TASKED TASKING TASKS TASMANIA TASS TASSEL TASSELS TASTE TASTED TASTEFUL TASTEFULLY TASTEFULNESS TASTELESS TASTELESSLY TASTER TASTERS TASTES TASTING TATE TATTER TATTERED TATTOO TATTOOED TATTOOS TAU TAUGHT TAUNT TAUNTED TAUNTER TAUNTING TAUNTS TAURUS TAUT TAUTLY TAUTNESS TAUTOLOGICAL TAUTOLOGICALLY TAUTOLOGIES TAUTOLOGY TAVERN TAVERNS TAWNEY TAWNY TAX TAXABLE TAXATION TAXED TAXES TAXI TAXICAB TAXICABS TAXIED TAXIING TAXING TAXIS TAXONOMIC TAXONOMICALLY TAXONOMY TAXPAYER TAXPAYERS TAYLOR TAYLORIZE TAYLORIZES TAYLORS TCHAIKOVSKY TEA TEACH TEACHABLE TEACHER TEACHERS TEACHES TEACHING TEACHINGS TEACUP TEAM TEAMED TEAMING TEAMS TEAR TEARED TEARFUL TEARFULLY TEARING TEARS TEAS TEASE TEASED TEASES TEASING TEASPOON TEASPOONFUL TEASPOONFULS TEASPOONS TECHNICAL TECHNICALITIES TECHNICALITY TECHNICALLY TECHNICIAN TECHNICIANS TECHNION TECHNIQUE TECHNIQUES TECHNOLOGICAL TECHNOLOGICALLY TECHNOLOGIES TECHNOLOGIST TECHNOLOGISTS TECHNOLOGY TED TEDDY TEDIOUS TEDIOUSLY TEDIOUSNESS TEDIUM TEEM TEEMED TEEMING TEEMS TEEN TEENAGE TEENAGED TEENAGER TEENAGERS TEENS TEETH TEETHE TEETHED TEETHES TEETHING TEFLON TEGUCIGALPA TEHERAN TEHRAN TEKTRONIX TELECOMMUNICATION TELECOMMUNICATIONS TELEDYNE TELEFUNKEN TELEGRAM TELEGRAMS TELEGRAPH TELEGRAPHED TELEGRAPHER TELEGRAPHERS TELEGRAPHIC TELEGRAPHING TELEGRAPHS TELEMANN TELEMETRY TELEOLOGICAL TELEOLOGICALLY TELEOLOGY TELEPATHY TELEPHONE TELEPHONED TELEPHONER TELEPHONERS TELEPHONES TELEPHONIC TELEPHONING TELEPHONY TELEPROCESSING TELESCOPE TELESCOPED TELESCOPES TELESCOPING TELETEX TELETEXT TELETYPE TELETYPES TELEVISE TELEVISED TELEVISES TELEVISING TELEVISION TELEVISIONS TELEVISOR TELEVISORS TELEX TELL TELLER TELLERS TELLING TELLS TELNET TELNET TEMPER TEMPERAMENT TEMPERAMENTAL TEMPERAMENTS TEMPERANCE TEMPERATE TEMPERATELY TEMPERATENESS TEMPERATURE TEMPERATURES TEMPERED TEMPERING TEMPERS TEMPEST TEMPESTUOUS TEMPESTUOUSLY TEMPLATE TEMPLATES TEMPLE TEMPLEMAN TEMPLES TEMPLETON TEMPORAL TEMPORALLY TEMPORARIES TEMPORARILY TEMPORARY TEMPT TEMPTATION TEMPTATIONS TEMPTED TEMPTER TEMPTERS TEMPTING TEMPTINGLY TEMPTS TEN TENACIOUS TENACIOUSLY TENANT TENANTS TEND TENDED TENDENCIES TENDENCY TENDER TENDERLY TENDERNESS TENDERS TENDING TENDS TENEMENT TENEMENTS TENEX TENEX TENFOLD TENNECO TENNESSEE TENNEY TENNIS TENNYSON TENOR TENORS TENS TENSE TENSED TENSELY TENSENESS TENSER TENSES TENSEST TENSING TENSION TENSIONS TENT TENTACLE TENTACLED TENTACLES TENTATIVE TENTATIVELY TENTED TENTH TENTING TENTS TENURE TERESA TERM TERMED TERMINAL TERMINALLY TERMINALS TERMINATE TERMINATED TERMINATES TERMINATING TERMINATION TERMINATIONS TERMINATOR TERMINATORS TERMING TERMINOLOGIES TERMINOLOGY TERMINUS TERMS TERMWISE TERNARY TERPSICHORE TERRA TERRACE TERRACED TERRACES TERRAIN TERRAINS TERRAN TERRE TERRESTRIAL TERRESTRIALS TERRIBLE TERRIBLY TERRIER TERRIERS TERRIFIC TERRIFIED TERRIFIES TERRIFY TERRIFYING TERRITORIAL TERRITORIES TERRITORY TERROR TERRORISM TERRORIST TERRORISTIC TERRORISTS TERRORIZE TERRORIZED TERRORIZES TERRORIZING TERRORS TERTIARY TESS TESSIE TEST TESTABILITY TESTABLE TESTAMENT TESTAMENTS TESTED TESTER TESTERS TESTICLE TESTICLES TESTIFIED TESTIFIER TESTIFIERS TESTIFIES TESTIFY TESTIFYING TESTIMONIES TESTIMONY TESTING TESTINGS TESTS TEUTONIC TEX TEX TEXACO TEXAN TEXANS TEXAS TEXASES TEXT TEXTBOOK TEXTBOOKS TEXTILE TEXTILES TEXTRON TEXTS TEXTUAL TEXTUALLY TEXTURE TEXTURED TEXTURES THAI THAILAND THALIA THAMES THAN THANK THANKED THANKFUL THANKFULLY THANKFULNESS THANKING THANKLESS THANKLESSLY THANKLESSNESS THANKS THANKSGIVING THANKSGIVINGS THAT THATCH THATCHES THATS THAW THAWED THAWING THAWS THAYER THE THEA THEATER THEATERS THEATRICAL THEATRICALLY THEATRICALS THEBES THEFT THEFTS THEIR THEIRS THELMA THEM THEMATIC THEME THEMES THEMSELVES THEN THENCE THENCEFORTH THEODORE THEODOSIAN THEODOSIUS THEOLOGICAL THEOLOGY THEOREM THEOREMS THEORETIC THEORETICAL THEORETICALLY THEORETICIANS THEORIES THEORIST THEORISTS THEORIZATION THEORIZATIONS THEORIZE THEORIZED THEORIZER THEORIZERS THEORIZES THEORIZING THEORY THERAPEUTIC THERAPIES THERAPIST THERAPISTS THERAPY THERE THEREABOUTS THEREAFTER THEREBY THEREFORE THEREIN THEREOF THEREON THERESA THERETO THEREUPON THEREWITH THERMAL THERMODYNAMIC THERMODYNAMICS THERMOFAX THERMOMETER THERMOMETERS THERMOSTAT THERMOSTATS THESE THESES THESEUS THESIS THESSALONIAN THESSALY THETIS THEY THICK THICKEN THICKENS THICKER THICKEST THICKET THICKETS THICKLY THICKNESS THIEF THIENSVILLE THIEVE THIEVES THIEVING THIGH THIGHS THIMBLE THIMBLES THIMBU THIN THING THINGS THINK THINKABLE THINKABLY THINKER THINKERS THINKING THINKS THINLY THINNER THINNESS THINNEST THIRD THIRDLY THIRDS THIRST THIRSTED THIRSTS THIRSTY THIRTEEN THIRTEENS THIRTEENTH THIRTIES THIRTIETH THIRTY THIS THISTLE THOMAS THOMISTIC THOMPSON THOMSON THONG THOR THOREAU THORN THORNBURG THORNS THORNTON THORNY THOROUGH THOROUGHFARE THOROUGHFARES THOROUGHLY THOROUGHNESS THORPE THORSTEIN THOSE THOUGH THOUGHT THOUGHTFUL THOUGHTFULLY THOUGHTFULNESS THOUGHTLESS THOUGHTLESSLY THOUGHTLESSNESS THOUGHTS THOUSAND THOUSANDS THOUSANDTH THRACE THRACIAN THRASH THRASHED THRASHER THRASHES THRASHING THREAD THREADED THREADER THREADERS THREADING THREADS THREAT THREATEN THREATENED THREATENING THREATENS THREATS THREE THREEFOLD THREES THREESCORE THRESHOLD THRESHOLDS THREW THRICE THRIFT THRIFTY THRILL THRILLED THRILLER THRILLERS THRILLING THRILLINGLY THRILLS THRIVE THRIVED THRIVES THRIVING THROAT THROATED THROATS THROB THROBBED THROBBING THROBS THRONE THRONEBERRY THRONES THRONG THRONGS THROTTLE THROTTLED THROTTLES THROTTLING THROUGH THROUGHOUT THROUGHPUT THROW THROWER THROWING THROWN THROWS THRUSH THRUST THRUSTER THRUSTERS THRUSTING THRUSTS THUBAN THUD THUDS THUG THUGS THULE THUMB THUMBED THUMBING THUMBS THUMP THUMPED THUMPING THUNDER THUNDERBOLT THUNDERBOLTS THUNDERED THUNDERER THUNDERERS THUNDERING THUNDERS THUNDERSTORM THUNDERSTORMS THURBER THURMAN THURSDAY THURSDAYS THUS THUSLY THWART THWARTED THWARTING THWARTS THYSELF TIBER TIBET TIBETAN TIBURON TICK TICKED TICKER TICKERS TICKET TICKETS TICKING TICKLE TICKLED TICKLES TICKLING TICKLISH TICKS TICONDEROGA TIDAL TIDALLY TIDE TIDED TIDES TIDIED TIDINESS TIDING TIDINGS TIDY TIDYING TIE TIECK TIED TIENTSIN TIER TIERS TIES TIFFANY TIGER TIGERS TIGHT TIGHTEN TIGHTENED TIGHTENER TIGHTENERS TIGHTENING TIGHTENINGS TIGHTENS TIGHTER TIGHTEST TIGHTLY TIGHTNESS TIGRIS TIJUANA TILDE TILE TILED TILES TILING TILL TILLABLE TILLED TILLER TILLERS TILLICH TILLIE TILLING TILLS TILT TILTED TILTING TILTS TIM TIMBER TIMBERED TIMBERING TIMBERS TIME TIMED TIMELESS TIMELESSLY TIMELESSNESS TIMELY TIMEOUT TIMEOUTS TIMER TIMERS TIMES TIMESHARE TIMESHARES TIMESHARING TIMESTAMP TIMESTAMPS TIMETABLE TIMETABLES TIMEX TIMID TIMIDITY TIMIDLY TIMING TIMINGS TIMMY TIMON TIMONIZE TIMONIZES TIMS TIN TINA TINCTURE TINGE TINGED TINGLE TINGLED TINGLES TINGLING TINIER TINIEST TINILY TININESS TINKER TINKERED TINKERING TINKERS TINKLE TINKLED TINKLES TINKLING TINNIER TINNIEST TINNILY TINNINESS TINNY TINS TINSELTOWN TINT TINTED TINTING TINTS TINY TIOGA TIP TIPPECANOE TIPPED TIPPER TIPPERARY TIPPERS TIPPING TIPS TIPTOE TIRANA TIRE TIRED TIREDLY TIRELESS TIRELESSLY TIRELESSNESS TIRES TIRESOME TIRESOMELY TIRESOMENESS TIRING TISSUE TISSUES TIT TITAN TITHE TITHER TITHES TITHING TITLE TITLED TITLES TITO TITS TITTER TITTERS TITUS TOAD TOADS TOAST TOASTED TOASTER TOASTING TOASTS TOBACCO TOBAGO TOBY TODAY TODAYS TODD TOE TOES TOGETHER TOGETHERNESS TOGGLE TOGGLED TOGGLES TOGGLING TOGO TOIL TOILED TOILER TOILET TOILETS TOILING TOILS TOKEN TOKENS TOKYO TOLAND TOLD TOLEDO TOLERABILITY TOLERABLE TOLERABLY TOLERANCE TOLERANCES TOLERANT TOLERANTLY TOLERATE TOLERATED TOLERATES TOLERATING TOLERATION TOLL TOLLED TOLLEY TOLLS TOLSTOY TOM TOMAHAWK TOMAHAWKS TOMATO TOMATOES TOMB TOMBIGBEE TOMBS TOMLINSON TOMMIE TOMOGRAPHY TOMORROW TOMORROWS TOMPKINS TON TONE TONED TONER TONES TONGS TONGUE TONGUED TONGUES TONI TONIC TONICS TONIGHT TONING TONIO TONNAGE TONS TONSIL TOO TOOK TOOL TOOLED TOOLER TOOLERS TOOLING TOOLS TOOMEY TOOTH TOOTHBRUSH TOOTHBRUSHES TOOTHPASTE TOOTHPICK TOOTHPICKS TOP TOPEKA TOPER TOPIC TOPICAL TOPICALLY TOPICS TOPMOST TOPOGRAPHY TOPOLOGICAL TOPOLOGIES TOPOLOGY TOPPLE TOPPLED TOPPLES TOPPLING TOPS TOPSY TORAH TORCH TORCHES TORE TORIES TORMENT TORMENTED TORMENTER TORMENTERS TORMENTING TORN TORNADO TORNADOES TORONTO TORPEDO TORPEDOES TORQUE TORQUEMADA TORRANCE TORRENT TORRENTS TORRID TORTOISE TORTOISES TORTURE TORTURED TORTURER TORTURERS TORTURES TORTURING TORUS TORUSES TORY TORYIZE TORYIZES TOSCA TOSCANINI TOSHIBA TOSS TOSSED TOSSES TOSSING TOTAL TOTALED TOTALING TOTALITIES TOTALITY TOTALLED TOTALLER TOTALLERS TOTALLING TOTALLY TOTALS TOTO TOTTER TOTTERED TOTTERING TOTTERS TOUCH TOUCHABLE TOUCHED TOUCHES TOUCHIER TOUCHIEST TOUCHILY TOUCHINESS TOUCHING TOUCHINGLY TOUCHY TOUGH TOUGHEN TOUGHER TOUGHEST TOUGHLY TOUGHNESS TOULOUSE TOUR TOURED TOURING TOURIST TOURISTS TOURNAMENT TOURNAMENTS TOURS TOW TOWARD TOWARDS TOWED TOWEL TOWELING TOWELLED TOWELLING TOWELS TOWER TOWERED TOWERING TOWERS TOWN TOWNLEY TOWNS TOWNSEND TOWNSHIP TOWNSHIPS TOWSLEY TOY TOYED TOYING TOYNBEE TOYOTA TOYS TRACE TRACEABLE TRACED TRACER TRACERS TRACES TRACING TRACINGS TRACK TRACKED TRACKER TRACKERS TRACKING TRACKS TRACT TRACTABILITY TRACTABLE TRACTARIANS TRACTIVE TRACTOR TRACTORS TRACTS TRACY TRADE TRADED TRADEMARK TRADEMARKS TRADEOFF TRADEOFFS TRADER TRADERS TRADES TRADESMAN TRADING TRADITION TRADITIONAL TRADITIONALLY TRADITIONS TRAFFIC TRAFFICKED TRAFFICKER TRAFFICKERS TRAFFICKING TRAFFICS TRAGEDIES TRAGEDY TRAGIC TRAGICALLY TRAIL TRAILED TRAILER TRAILERS TRAILING TRAILINGS TRAILS TRAIN TRAINED TRAINEE TRAINEES TRAINER TRAINERS TRAINING TRAINS TRAIT TRAITOR TRAITORS TRAITS TRAJECTORIES TRAJECTORY TRAMP TRAMPED TRAMPING TRAMPLE TRAMPLED TRAMPLER TRAMPLES TRAMPLING TRAMPS TRANCE TRANCES TRANQUIL TRANQUILITY TRANQUILLY TRANSACT TRANSACTION TRANSACTIONS TRANSATLANTIC TRANSCEIVE TRANSCEIVER TRANSCEIVERS TRANSCEND TRANSCENDED TRANSCENDENT TRANSCENDING TRANSCENDS TRANSCONTINENTAL TRANSCRIBE TRANSCRIBED TRANSCRIBER TRANSCRIBERS TRANSCRIBES TRANSCRIBING TRANSCRIPT TRANSCRIPTION TRANSCRIPTIONS TRANSCRIPTS TRANSFER TRANSFERABILITY TRANSFERABLE TRANSFERAL TRANSFERALS TRANSFERENCE TRANSFERRED TRANSFERRER TRANSFERRERS TRANSFERRING TRANSFERS TRANSFINITE TRANSFORM TRANSFORMABLE TRANSFORMATION TRANSFORMATIONAL TRANSFORMATIONS TRANSFORMED TRANSFORMER TRANSFORMERS TRANSFORMING TRANSFORMS TRANSGRESS TRANSGRESSED TRANSGRESSION TRANSGRESSIONS TRANSIENCE TRANSIENCY TRANSIENT TRANSIENTLY TRANSIENTS TRANSISTOR TRANSISTORIZE TRANSISTORIZED TRANSISTORIZING TRANSISTORS TRANSIT TRANSITE TRANSITION TRANSITIONAL TRANSITIONED TRANSITIONS TRANSITIVE TRANSITIVELY TRANSITIVENESS TRANSITIVITY TRANSITORY TRANSLATABILITY TRANSLATABLE TRANSLATE TRANSLATED TRANSLATES TRANSLATING TRANSLATION TRANSLATIONAL TRANSLATIONS TRANSLATOR TRANSLATORS TRANSLUCENT TRANSMISSION TRANSMISSIONS TRANSMIT TRANSMITS TRANSMITTAL TRANSMITTED TRANSMITTER TRANSMITTERS TRANSMITTING TRANSMOGRIFICATION TRANSMOGRIFY TRANSPACIFIC TRANSPARENCIES TRANSPARENCY TRANSPARENT TRANSPARENTLY TRANSPIRE TRANSPIRED TRANSPIRES TRANSPIRING TRANSPLANT TRANSPLANTED TRANSPLANTING TRANSPLANTS TRANSPONDER TRANSPONDERS TRANSPORT TRANSPORTABILITY TRANSPORTATION TRANSPORTED TRANSPORTER TRANSPORTERS TRANSPORTING TRANSPORTS TRANSPOSE TRANSPOSED TRANSPOSES TRANSPOSING TRANSPOSITION TRANSPUTER TRANSVAAL TRANSYLVANIA TRAP TRAPEZOID TRAPEZOIDAL TRAPEZOIDS TRAPPED TRAPPER TRAPPERS TRAPPING TRAPPINGS TRAPS TRASH TRASTEVERE TRAUMA TRAUMATIC TRAVAIL TRAVEL TRAVELED TRAVELER TRAVELERS TRAVELING TRAVELINGS TRAVELS TRAVERSAL TRAVERSALS TRAVERSE TRAVERSED TRAVERSES TRAVERSING TRAVESTIES TRAVESTY TRAVIS TRAY TRAYS TREACHERIES TREACHEROUS TREACHEROUSLY TREACHERY TREAD TREADING TREADS TREADWELL TREASON TREASURE TREASURED TREASURER TREASURES TREASURIES TREASURING TREASURY TREAT TREATED TREATIES TREATING TREATISE TREATISES TREATMENT TREATMENTS TREATS TREATY TREBLE TREE TREES TREETOP TREETOPS TREK TREKS TREMBLE TREMBLED TREMBLES TREMBLING TREMENDOUS TREMENDOUSLY TREMOR TREMORS TRENCH TRENCHER TRENCHES TREND TRENDING TRENDS TRENTON TRESPASS TRESPASSED TRESPASSER TRESPASSERS TRESPASSES TRESS TRESSES TREVELYAN TRIAL TRIALS TRIANGLE TRIANGLES TRIANGULAR TRIANGULARLY TRIANGULUM TRIANON TRIASSIC TRIBAL TRIBE TRIBES TRIBUNAL TRIBUNALS TRIBUNE TRIBUNES TRIBUTARY TRIBUTE TRIBUTES TRICERATOPS TRICHINELLA TRICHOTOMY TRICK TRICKED TRICKIER TRICKIEST TRICKINESS TRICKING TRICKLE TRICKLED TRICKLES TRICKLING TRICKS TRICKY TRIED TRIER TRIERS TRIES TRIFLE TRIFLER TRIFLES TRIFLING TRIGGER TRIGGERED TRIGGERING TRIGGERS TRIGONOMETRIC TRIGONOMETRY TRIGRAM TRIGRAMS TRIHEDRAL TRILATERAL TRILL TRILLED TRILLION TRILLIONS TRILLIONTH TRIM TRIMBLE TRIMLY TRIMMED TRIMMER TRIMMEST TRIMMING TRIMMINGS TRIMNESS TRIMS TRINIDAD TRINKET TRINKETS TRIO TRIP TRIPLE TRIPLED TRIPLES TRIPLET TRIPLETS TRIPLETT TRIPLING TRIPOD TRIPS TRISTAN TRIUMPH TRIUMPHAL TRIUMPHANT TRIUMPHANTLY TRIUMPHED TRIUMPHING TRIUMPHS TRIVIA TRIVIAL TRIVIALITIES TRIVIALITY TRIVIALLY TROBRIAND TROD TROJAN TROLL TROLLEY TROLLEYS TROLLS TROOP TROOPER TROOPERS TROOPS TROPEZ TROPHIES TROPHY TROPIC TROPICAL TROPICS TROT TROTS TROTSKY TROUBLE TROUBLED TROUBLEMAKER TROUBLEMAKERS TROUBLES TROUBLESHOOT TROUBLESHOOTER TROUBLESHOOTERS TROUBLESHOOTING TROUBLESHOOTS TROUBLESOME TROUBLESOMELY TROUBLING TROUGH TROUSER TROUSERS TROUT TROUTMAN TROWEL TROWELS TROY TRUANT TRUANTS TRUCE TRUCK TRUCKED TRUCKEE TRUCKER TRUCKERS TRUCKING TRUCKS TRUDEAU TRUDGE TRUDGED TRUDY TRUE TRUED TRUER TRUES TRUEST TRUING TRUISM TRUISMS TRUJILLO TRUK TRULY TRUMAN TRUMBULL TRUMP TRUMPED TRUMPET TRUMPETER TRUMPS TRUNCATE TRUNCATED TRUNCATES TRUNCATING TRUNCATION TRUNCATIONS TRUNK TRUNKS TRUST TRUSTED TRUSTEE TRUSTEES TRUSTFUL TRUSTFULLY TRUSTFULNESS TRUSTING TRUSTINGLY TRUSTS TRUSTWORTHINESS TRUSTWORTHY TRUSTY TRUTH TRUTHFUL TRUTHFULLY TRUTHFULNESS TRUTHS TRY TRYING TSUNEMATSU TUB TUBE TUBER TUBERCULOSIS TUBERS TUBES TUBING TUBS TUCK TUCKED TUCKER TUCKING TUCKS TUCSON TUDOR TUESDAY TUESDAYS TUFT TUFTS TUG TUGS TUITION TULANE TULIP TULIPS TULSA TUMBLE TUMBLED TUMBLER TUMBLERS TUMBLES TUMBLING TUMOR TUMORS TUMULT TUMULTS TUMULTUOUS TUNABLE TUNE TUNED TUNER TUNERS TUNES TUNIC TUNICS TUNING TUNIS TUNISIA TUNISIAN TUNNEL TUNNELED TUNNELS TUPLE TUPLES TURBAN TURBANS TURBULENCE TURBULENT TURBULENTLY TURF TURGID TURGIDLY TURIN TURING TURKEY TURKEYS TURKISH TURKIZE TURKIZES TURMOIL TURMOILS TURN TURNABLE TURNAROUND TURNED TURNER TURNERS TURNING TURNINGS TURNIP TURNIPS TURNOVER TURNS TURPENTINE TURQUOISE TURRET TURRETS TURTLE TURTLENECK TURTLES TUSCALOOSA TUSCAN TUSCANIZE TUSCANIZES TUSCANY TUSCARORA TUSKEGEE TUTANKHAMEN TUTANKHAMON TUTANKHAMUN TUTENKHAMON TUTOR TUTORED TUTORIAL TUTORIALS TUTORING TUTORS TUTTLE TWAIN TWANG TWAS TWEED TWELFTH TWELVE TWELVES TWENTIES TWENTIETH TWENTY TWICE TWIG TWIGS TWILIGHT TWILIGHTS TWILL TWIN TWINE TWINED TWINER TWINKLE TWINKLED TWINKLER TWINKLES TWINKLING TWINS TWIRL TWIRLED TWIRLER TWIRLING TWIRLS TWIST TWISTED TWISTER TWISTERS TWISTING TWISTS TWITCH TWITCHED TWITCHING TWITTER TWITTERED TWITTERING TWO TWOFOLD TWOMBLY TWOS TYBURN TYING TYLER TYLERIZE TYLERIZES TYNDALL TYPE TYPED TYPEOUT TYPES TYPESETTER TYPEWRITER TYPEWRITERS TYPHOID TYPHON TYPICAL TYPICALLY TYPICALNESS TYPIFIED TYPIFIES TYPIFY TYPIFYING TYPING TYPIST TYPISTS TYPO TYPOGRAPHIC TYPOGRAPHICAL TYPOGRAPHICALLY TYPOGRAPHY TYRANNICAL TYRANNOSAURUS TYRANNY TYRANT TYRANTS TYSON TZELTAL UBIQUITOUS UBIQUITOUSLY UBIQUITY UDALL UGANDA UGH UGLIER UGLIEST UGLINESS UGLY UKRAINE UKRAINIAN UKRAINIANS ULAN ULCER ULCERS ULLMAN ULSTER ULTIMATE ULTIMATELY ULTRA ULTRASONIC ULTRIX ULTRIX ULYSSES UMBRAGE UMBRELLA UMBRELLAS UMPIRE UMPIRES UNABATED UNABBREVIATED UNABLE UNACCEPTABILITY UNACCEPTABLE UNACCEPTABLY UNACCOUNTABLE UNACCUSTOMED UNACHIEVABLE UNACKNOWLEDGED UNADULTERATED UNAESTHETICALLY UNAFFECTED UNAFFECTEDLY UNAFFECTEDNESS UNAIDED UNALIENABILITY UNALIENABLE UNALTERABLY UNALTERED UNAMBIGUOUS UNAMBIGUOUSLY UNAMBITIOUS UNANALYZABLE UNANIMITY UNANIMOUS UNANIMOUSLY UNANSWERABLE UNANSWERED UNANTICIPATED UNARMED UNARY UNASSAILABLE UNASSIGNED UNASSISTED UNATTAINABILITY UNATTAINABLE UNATTENDED UNATTRACTIVE UNATTRACTIVELY UNAUTHORIZED UNAVAILABILITY UNAVAILABLE UNAVOIDABLE UNAVOIDABLY UNAWARE UNAWARENESS UNAWARES UNBALANCED UNBEARABLE UNBECOMING UNBELIEVABLE UNBIASED UNBIND UNBLOCK UNBLOCKED UNBLOCKING UNBLOCKS UNBORN UNBOUND UNBOUNDED UNBREAKABLE UNBRIDLED UNBROKEN UNBUFFERED UNCANCELLED UNCANNY UNCAPITALIZED UNCAUGHT UNCERTAIN UNCERTAINLY UNCERTAINTIES UNCERTAINTY UNCHANGEABLE UNCHANGED UNCHANGING UNCLAIMED UNCLASSIFIED UNCLE UNCLEAN UNCLEANLY UNCLEANNESS UNCLEAR UNCLEARED UNCLES UNCLOSED UNCOMFORTABLE UNCOMFORTABLY UNCOMMITTED UNCOMMON UNCOMMONLY UNCOMPROMISING UNCOMPUTABLE UNCONCERNED UNCONCERNEDLY UNCONDITIONAL UNCONDITIONALLY UNCONNECTED UNCONSCIONABLE UNCONSCIOUS UNCONSCIOUSLY UNCONSCIOUSNESS UNCONSTITUTIONAL UNCONSTRAINED UNCONTROLLABILITY UNCONTROLLABLE UNCONTROLLABLY UNCONTROLLED UNCONVENTIONAL UNCONVENTIONALLY UNCONVINCED UNCONVINCING UNCOORDINATED UNCORRECTABLE UNCORRECTED UNCOUNTABLE UNCOUNTABLY UNCOUTH UNCOVER UNCOVERED UNCOVERING UNCOVERS UNDAMAGED UNDAUNTED UNDAUNTEDLY UNDECIDABLE UNDECIDED UNDECLARED UNDECOMPOSABLE UNDEFINABILITY UNDEFINED UNDELETED UNDENIABLE UNDENIABLY UNDER UNDERBRUSH UNDERDONE UNDERESTIMATE UNDERESTIMATED UNDERESTIMATES UNDERESTIMATING UNDERESTIMATION UNDERFLOW UNDERFLOWED UNDERFLOWING UNDERFLOWS UNDERFOOT UNDERGO UNDERGOES UNDERGOING UNDERGONE UNDERGRADUATE UNDERGRADUATES UNDERGROUND UNDERLIE UNDERLIES UNDERLINE UNDERLINED UNDERLINES UNDERLING UNDERLINGS UNDERLINING UNDERLININGS UNDERLOADED UNDERLYING UNDERMINE UNDERMINED UNDERMINES UNDERMINING UNDERNEATH UNDERPINNING UNDERPINNINGS UNDERPLAY UNDERPLAYED UNDERPLAYING UNDERPLAYS UNDERSCORE UNDERSCORED UNDERSCORES UNDERSTAND UNDERSTANDABILITY UNDERSTANDABLE UNDERSTANDABLY UNDERSTANDING UNDERSTANDINGLY UNDERSTANDINGS UNDERSTANDS UNDERSTATED UNDERSTOOD UNDERTAKE UNDERTAKEN UNDERTAKER UNDERTAKERS UNDERTAKES UNDERTAKING UNDERTAKINGS UNDERTOOK UNDERWATER UNDERWAY UNDERWEAR UNDERWENT UNDERWORLD UNDERWRITE UNDERWRITER UNDERWRITERS UNDERWRITES UNDERWRITING UNDESIRABILITY UNDESIRABLE UNDETECTABLE UNDETECTED UNDETERMINED UNDEVELOPED UNDID UNDIMINISHED UNDIRECTED UNDISCIPLINED UNDISCOVERED UNDISTURBED UNDIVIDED UNDO UNDOCUMENTED UNDOES UNDOING UNDOINGS UNDONE UNDOUBTEDLY UNDRESS UNDRESSED UNDRESSES UNDRESSING UNDUE UNDULY UNEASILY UNEASINESS UNEASY UNECONOMIC UNECONOMICAL UNEMBELLISHED UNEMPLOYED UNEMPLOYMENT UNENCRYPTED UNENDING UNENLIGHTENING UNEQUAL UNEQUALED UNEQUALLY UNEQUIVOCAL UNEQUIVOCALLY UNESCO UNESSENTIAL UNEVALUATED UNEVEN UNEVENLY UNEVENNESS UNEVENTFUL UNEXCUSED UNEXPANDED UNEXPECTED UNEXPECTEDLY UNEXPLAINED UNEXPLORED UNEXTENDED UNFAIR UNFAIRLY UNFAIRNESS UNFAITHFUL UNFAITHFULLY UNFAITHFULNESS UNFAMILIAR UNFAMILIARITY UNFAMILIARLY UNFAVORABLE UNFETTERED UNFINISHED UNFIT UNFITNESS UNFLAGGING UNFOLD UNFOLDED UNFOLDING UNFOLDS UNFORESEEN UNFORGEABLE UNFORGIVING UNFORMATTED UNFORTUNATE UNFORTUNATELY UNFORTUNATES UNFOUNDED UNFRIENDLINESS UNFRIENDLY UNFULFILLED UNGRAMMATICAL UNGRATEFUL UNGRATEFULLY UNGRATEFULNESS UNGROUNDED UNGUARDED UNGUIDED UNHAPPIER UNHAPPIEST UNHAPPILY UNHAPPINESS UNHAPPY UNHARMED UNHEALTHY UNHEARD UNHEEDED UNIBUS UNICORN UNICORNS UNICYCLE UNIDENTIFIED UNIDIRECTIONAL UNIDIRECTIONALITY UNIDIRECTIONALLY UNIFICATION UNIFICATIONS UNIFIED UNIFIER UNIFIERS UNIFIES UNIFORM UNIFORMED UNIFORMITY UNIFORMLY UNIFORMS UNIFY UNIFYING UNILLUMINATING UNIMAGINABLE UNIMPEDED UNIMPLEMENTED UNIMPORTANT UNINDENTED UNINITIALIZED UNINSULATED UNINTELLIGIBLE UNINTENDED UNINTENTIONAL UNINTENTIONALLY UNINTERESTING UNINTERESTINGLY UNINTERPRETED UNINTERRUPTED UNINTERRUPTEDLY UNION UNIONIZATION UNIONIZE UNIONIZED UNIONIZER UNIONIZERS UNIONIZES UNIONIZING UNIONS UNIPLUS UNIPROCESSOR UNIQUE UNIQUELY UNIQUENESS UNIROYAL UNISOFT UNISON UNIT UNITARIAN UNITARIANIZE UNITARIANIZES UNITARIANS UNITE UNITED UNITES UNITIES UNITING UNITS UNITY UNIVAC UNIVALVE UNIVALVES UNIVERSAL UNIVERSALITY UNIVERSALLY UNIVERSALS UNIVERSE UNIVERSES UNIVERSITIES UNIVERSITY UNIX UNIX UNJUST UNJUSTIFIABLE UNJUSTIFIED UNJUSTLY UNKIND UNKINDLY UNKINDNESS UNKNOWABLE UNKNOWING UNKNOWINGLY UNKNOWN UNKNOWNS UNLABELLED UNLAWFUL UNLAWFULLY UNLEASH UNLEASHED UNLEASHES UNLEASHING UNLESS UNLIKE UNLIKELY UNLIKENESS UNLIMITED UNLINK UNLINKED UNLINKING UNLINKS UNLOAD UNLOADED UNLOADING UNLOADS UNLOCK UNLOCKED UNLOCKING UNLOCKS UNLUCKY UNMANAGEABLE UNMANAGEABLY UNMANNED UNMARKED UNMARRIED UNMASK UNMASKED UNMATCHED UNMENTIONABLE UNMERCIFUL UNMERCIFULLY UNMISTAKABLE UNMISTAKABLY UNMODIFIED UNMOVED UNNAMED UNNATURAL UNNATURALLY UNNATURALNESS UNNECESSARILY UNNECESSARY UNNEEDED UNNERVE UNNERVED UNNERVES UNNERVING UNNOTICED UNOBSERVABLE UNOBSERVED UNOBTAINABLE UNOCCUPIED UNOFFICIAL UNOFFICIALLY UNOPENED UNORDERED UNPACK UNPACKED UNPACKING UNPACKS UNPAID UNPARALLELED UNPARSED UNPLANNED UNPLEASANT UNPLEASANTLY UNPLEASANTNESS UNPLUG UNPOPULAR UNPOPULARITY UNPRECEDENTED UNPREDICTABLE UNPREDICTABLY UNPRESCRIBED UNPRESERVED UNPRIMED UNPROFITABLE UNPROJECTED UNPROTECTED UNPROVABILITY UNPROVABLE UNPROVEN UNPUBLISHED UNQUALIFIED UNQUALIFIEDLY UNQUESTIONABLY UNQUESTIONED UNQUOTED UNRAVEL UNRAVELED UNRAVELING UNRAVELS UNREACHABLE UNREAL UNREALISTIC UNREALISTICALLY UNREASONABLE UNREASONABLENESS UNREASONABLY UNRECOGNIZABLE UNRECOGNIZED UNREGULATED UNRELATED UNRELIABILITY UNRELIABLE UNREPORTED UNREPRESENTABLE UNRESOLVED UNRESPONSIVE UNREST UNRESTRAINED UNRESTRICTED UNRESTRICTEDLY UNRESTRICTIVE UNROLL UNROLLED UNROLLING UNROLLS UNRULY UNSAFE UNSAFELY UNSANITARY UNSATISFACTORY UNSATISFIABILITY UNSATISFIABLE UNSATISFIED UNSATISFYING UNSCRUPULOUS UNSEEDED UNSEEN UNSELECTED UNSELFISH UNSELFISHLY UNSELFISHNESS UNSENT UNSETTLED UNSETTLING UNSHAKEN UNSHARED UNSIGNED UNSKILLED UNSLOTTED UNSOLVABLE UNSOLVED UNSOPHISTICATED UNSOUND UNSPEAKABLE UNSPECIFIED UNSTABLE UNSTEADINESS UNSTEADY UNSTRUCTURED UNSUCCESSFUL UNSUCCESSFULLY UNSUITABLE UNSUITED UNSUPPORTED UNSURE UNSURPRISING UNSURPRISINGLY UNSYNCHRONIZED UNTAGGED UNTAPPED UNTENABLE UNTERMINATED UNTESTED UNTHINKABLE UNTHINKING UNTIDINESS UNTIDY UNTIE UNTIED UNTIES UNTIL UNTIMELY UNTO UNTOLD UNTOUCHABLE UNTOUCHABLES UNTOUCHED UNTOWARD UNTRAINED UNTRANSLATED UNTREATED UNTRIED UNTRUE UNTRUTHFUL UNTRUTHFULNESS UNTYING UNUSABLE UNUSED UNUSUAL UNUSUALLY UNVARYING UNVEIL UNVEILED UNVEILING UNVEILS UNWANTED UNWELCOME UNWHOLESOME UNWIELDINESS UNWIELDY UNWILLING UNWILLINGLY UNWILLINGNESS UNWIND UNWINDER UNWINDERS UNWINDING UNWINDS UNWISE UNWISELY UNWISER UNWISEST UNWITTING UNWITTINGLY UNWORTHINESS UNWORTHY UNWOUND UNWRAP UNWRAPPED UNWRAPPING UNWRAPS UNWRITTEN UPBRAID UPCOMING UPDATE UPDATED UPDATER UPDATES UPDATING UPGRADE UPGRADED UPGRADES UPGRADING UPHELD UPHILL UPHOLD UPHOLDER UPHOLDERS UPHOLDING UPHOLDS UPHOLSTER UPHOLSTERED UPHOLSTERER UPHOLSTERING UPHOLSTERS UPKEEP UPLAND UPLANDS UPLIFT UPLINK UPLINKS UPLOAD UPON UPPER UPPERMOST UPRIGHT UPRIGHTLY UPRIGHTNESS UPRISING UPRISINGS UPROAR UPROOT UPROOTED UPROOTING UPROOTS UPSET UPSETS UPSHOT UPSHOTS UPSIDE UPSTAIRS UPSTREAM UPTON UPTURN UPTURNED UPTURNING UPTURNS UPWARD UPWARDS URANIA URANUS URBAN URBANA URCHIN URCHINS URDU URGE URGED URGENT URGENTLY URGES URGING URGINGS URI URINATE URINATED URINATES URINATING URINATION URINE URIS URN URNS URQUHART URSA URSULA URSULINE URUGUAY URUGUAYAN URUGUAYANS USABILITY USABLE USABLY USAGE USAGES USE USED USEFUL USEFULLY USEFULNESS USELESS USELESSLY USELESSNESS USENET USENIX USER USERS USES USHER USHERED USHERING USHERS USING USUAL USUALLY USURP USURPED USURPER UTAH UTENSIL UTENSILS UTICA UTILITIES UTILITY UTILIZATION UTILIZATIONS UTILIZE UTILIZED UTILIZES UTILIZING UTMOST UTOPIA UTOPIAN UTOPIANIZE UTOPIANIZES UTOPIANS UTRECHT UTTER UTTERANCE UTTERANCES UTTERED UTTERING UTTERLY UTTERMOST UTTERS UZI VACANCIES VACANCY VACANT VACANTLY VACATE VACATED VACATES VACATING VACATION VACATIONED VACATIONER VACATIONERS VACATIONING VACATIONS VACUO VACUOUS VACUOUSLY VACUUM VACUUMED VACUUMING VADUZ VAGABOND VAGABONDS VAGARIES VAGARY VAGINA VAGINAS VAGRANT VAGRANTLY VAGUE VAGUELY VAGUENESS VAGUER VAGUEST VAIL VAIN VAINLY VALE VALENCE VALENCES VALENTINE VALENTINES VALERIE VALERY VALES VALET VALETS VALHALLA VALIANT VALIANTLY VALID VALIDATE VALIDATED VALIDATES VALIDATING VALIDATION VALIDITY VALIDLY VALIDNESS VALKYRIE VALLETTA VALLEY VALLEYS VALOIS VALOR VALPARAISO VALUABLE VALUABLES VALUABLY VALUATION VALUATIONS VALUE VALUED VALUER VALUERS VALUES VALUING VALVE VALVES VAMPIRE VAN VANCE VANCEMENT VANCOUVER VANDALIZE VANDALIZED VANDALIZES VANDALIZING VANDENBERG VANDERBILT VANDERBURGH VANDERPOEL VANE VANES VANESSA VANGUARD VANILLA VANISH VANISHED VANISHER VANISHES VANISHING VANISHINGLY VANITIES VANITY VANQUISH VANQUISHED VANQUISHES VANQUISHING VANS VANTAGE VAPOR VAPORING VAPORS VARIABILITY VARIABLE VARIABLENESS VARIABLES VARIABLY VARIAN VARIANCE VARIANCES VARIANT VARIANTLY VARIANTS VARIATION VARIATIONS VARIED VARIES VARIETIES VARIETY VARIOUS VARIOUSLY VARITYPE VARITYPING VARNISH VARNISHES VARY VARYING VARYINGS VASE VASES VASQUEZ VASSAL VASSAR VAST VASTER VASTEST VASTLY VASTNESS VAT VATICAN VATICANIZATION VATICANIZATIONS VATICANIZE VATICANIZES VATS VAUDEVILLE VAUDOIS VAUGHAN VAUGHN VAULT VAULTED VAULTER VAULTING VAULTS VAUNT VAUNTED VAX VAXES VEAL VECTOR VECTORIZATION VECTORIZING VECTORS VEDA VEER VEERED VEERING VEERS VEGA VEGANISM VEGAS VEGETABLE VEGETABLES VEGETARIAN VEGETARIANS VEGETATE VEGETATED VEGETATES VEGETATING VEGETATION VEGETATIVE VEHEMENCE VEHEMENT VEHEMENTLY VEHICLE VEHICLES VEHICULAR VEIL VEILED VEILING VEILS VEIN VEINED VEINING VEINS VELA VELASQUEZ VELLA VELOCITIES VELOCITY VELVET VENDOR VENDORS VENERABLE VENERATION VENETIAN VENETO VENEZUELA VENEZUELAN VENGEANCE VENIAL VENICE VENISON VENN VENOM VENOMOUS VENOMOUSLY VENT VENTED VENTILATE VENTILATED VENTILATES VENTILATING VENTILATION VENTRICLE VENTRICLES VENTS VENTURA VENTURE VENTURED VENTURER VENTURERS VENTURES VENTURING VENTURINGS VENUS VENUSIAN VENUSIANS VERA VERACITY VERANDA VERANDAS VERB VERBAL VERBALIZE VERBALIZED VERBALIZES VERBALIZING VERBALLY VERBOSE VERBS VERDE VERDERER VERDI VERDICT VERDURE VERGE VERGER VERGES VERGIL VERIFIABILITY VERIFIABLE VERIFICATION VERIFICATIONS VERIFIED VERIFIER VERIFIERS VERIFIES VERIFY VERIFYING VERILY VERITABLE VERLAG VERMIN VERMONT VERN VERNA VERNACULAR VERNE VERNON VERONA VERONICA VERSA VERSAILLES VERSATEC VERSATILE VERSATILITY VERSE VERSED VERSES VERSING VERSION VERSIONS VERSUS VERTEBRATE VERTEBRATES VERTEX VERTICAL VERTICALLY VERTICALNESS VERTICES VERY VESSEL VESSELS VEST VESTED VESTIGE VESTIGES VESTIGIAL VESTS VESUVIUS VETERAN VETERANS VETERINARIAN VETERINARIANS VETERINARY VETO VETOED VETOER VETOES VEX VEXATION VEXED VEXES VEXING VIA VIABILITY VIABLE VIABLY VIAL VIALS VIBRATE VIBRATED VIBRATING VIBRATION VIBRATIONS VIBRATOR VIC VICE VICEROY VICES VICHY VICINITY VICIOUS VICIOUSLY VICIOUSNESS VICISSITUDE VICISSITUDES VICKERS VICKSBURG VICKY VICTIM VICTIMIZE VICTIMIZED VICTIMIZER VICTIMIZERS VICTIMIZES VICTIMIZING VICTIMS VICTOR VICTORIA VICTORIAN VICTORIANIZE VICTORIANIZES VICTORIANS VICTORIES VICTORIOUS VICTORIOUSLY VICTORS VICTORY VICTROLA VICTUAL VICTUALER VICTUALS VIDA VIDAL VIDEO VIDEOTAPE VIDEOTAPES VIDEOTEX VIE VIED VIENNA VIENNESE VIENTIANE VIER VIES VIET VIETNAM VIETNAMESE VIEW VIEWABLE VIEWED VIEWER VIEWERS VIEWING VIEWPOINT VIEWPOINTS VIEWS VIGILANCE VIGILANT VIGILANTE VIGILANTES VIGILANTLY VIGNETTE VIGNETTES VIGOR VIGOROUS VIGOROUSLY VIKING VIKINGS VIKRAM VILE VILELY VILENESS VILIFICATION VILIFICATIONS VILIFIED VILIFIES VILIFY VILIFYING VILLA VILLAGE VILLAGER VILLAGERS VILLAGES VILLAIN VILLAINOUS VILLAINOUSLY VILLAINOUSNESS VILLAINS VILLAINY VILLAS VINCE VINCENT VINCI VINDICATE VINDICATED VINDICATION VINDICTIVE VINDICTIVELY VINDICTIVENESS VINE VINEGAR VINES VINEYARD VINEYARDS VINSON VINTAGE VIOLATE VIOLATED VIOLATES VIOLATING VIOLATION VIOLATIONS VIOLATOR VIOLATORS VIOLENCE VIOLENT VIOLENTLY VIOLET VIOLETS VIOLIN VIOLINIST VIOLINISTS VIOLINS VIPER VIPERS VIRGIL VIRGIN VIRGINIA VIRGINIAN VIRGINIANS VIRGINITY VIRGINS VIRGO VIRTUAL VIRTUALLY VIRTUE VIRTUES VIRTUOSO VIRTUOSOS VIRTUOUS VIRTUOUSLY VIRULENT VIRUS VIRUSES VISA VISAGE VISAS VISCOUNT VISCOUNTS VISCOUS VISHNU VISIBILITY VISIBLE VISIBLY VISIGOTH VISIGOTHS VISION VISIONARY VISIONS VISIT VISITATION VISITATIONS VISITED VISITING VISITOR VISITORS VISITS VISOR VISORS VISTA VISTAS VISUAL VISUALIZE VISUALIZED VISUALIZER VISUALIZES VISUALIZING VISUALLY VITA VITAE VITAL VITALITY VITALLY VITALS VITO VITUS VIVALDI VIVIAN VIVID VIVIDLY VIVIDNESS VIZIER VLADIMIR VLADIVOSTOK VOCABULARIES VOCABULARY VOCAL VOCALLY VOCALS VOCATION VOCATIONAL VOCATIONALLY VOCATIONS VOGEL VOGUE VOICE VOICED VOICER VOICERS VOICES VOICING VOID VOIDED VOIDER VOIDING VOIDS VOLATILE VOLATILITIES VOLATILITY VOLCANIC VOLCANO VOLCANOS VOLITION VOLKSWAGEN VOLKSWAGENS VOLLEY VOLLEYBALL VOLLEYBALLS VOLSTEAD VOLT VOLTA VOLTAGE VOLTAGES VOLTAIRE VOLTERRA VOLTS VOLUME VOLUMES VOLUNTARILY VOLUNTARY VOLUNTEER VOLUNTEERED VOLUNTEERING VOLUNTEERS VOLVO VOMIT VOMITED VOMITING VOMITS VORTEX VOSS VOTE VOTED VOTER VOTERS VOTES VOTING VOTIVE VOUCH VOUCHER VOUCHERS VOUCHES VOUCHING VOUGHT VOW VOWED VOWEL VOWELS VOWER VOWING VOWS VOYAGE VOYAGED VOYAGER VOYAGERS VOYAGES VOYAGING VOYAGINGS VREELAND VULCAN VULCANISM VULGAR VULGARLY VULNERABILITIES VULNERABILITY VULNERABLE VULTURE VULTURES WAALS WABASH WACKE WACKY WACO WADE WADED WADER WADES WADING WADSWORTH WAFER WAFERS WAFFLE WAFFLES WAFT WAG WAGE WAGED WAGER WAGERS WAGES WAGING WAGNER WAGNERIAN WAGNERIZE WAGNERIZES WAGON WAGONER WAGONS WAGS WAHL WAIL WAILED WAILING WAILS WAINWRIGHT WAIST WAISTCOAT WAISTCOATS WAISTS WAIT WAITE WAITED WAITER WAITERS WAITING WAITRESS WAITRESSES WAITS WAIVE WAIVED WAIVER WAIVERABLE WAIVES WAIVING WAKE WAKED WAKEFIELD WAKEN WAKENED WAKENING WAKES WAKEUP WAKING WALBRIDGE WALCOTT WALDEN WALDENSIAN WALDO WALDORF WALDRON WALES WALFORD WALGREEN WALK WALKED WALKER WALKERS WALKING WALKS WALL WALLACE WALLED WALLENSTEIN WALLER WALLET WALLETS WALLING WALLIS WALLOW WALLOWED WALLOWING WALLOWS WALLS WALNUT WALNUTS WALPOLE WALRUS WALRUSES WALSH WALT WALTER WALTERS WALTHAM WALTON WALTZ WALTZED WALTZES WALTZING WALWORTH WAN WAND WANDER WANDERED WANDERER WANDERERS WANDERING WANDERINGS WANDERS WANE WANED WANES WANG WANING WANLY WANSEE WANSLEY WANT WANTED WANTING WANTON WANTONLY WANTONNESS WANTS WAPATO WAPPINGER WAR WARBLE WARBLED WARBLER WARBLES WARBLING WARBURTON WARD WARDEN WARDENS WARDER WARDROBE WARDROBES WARDS WARE WAREHOUSE WAREHOUSES WAREHOUSING WARES WARFARE WARFIELD WARILY WARINESS WARING WARLIKE WARM WARMED WARMER WARMERS WARMEST WARMING WARMLY WARMS WARMTH WARN WARNED WARNER WARNING WARNINGLY WARNINGS WARNOCK WARNS WARP WARPED WARPING WARPS WARRANT WARRANTED WARRANTIES WARRANTING WARRANTS WARRANTY WARRED WARRING WARRIOR WARRIORS WARS WARSAW WARSHIP WARSHIPS WART WARTIME WARTS WARWICK WARY WAS WASH WASHBURN WASHED WASHER WASHERS WASHES WASHING WASHINGS WASHINGTON WASHOE WASP WASPS WASSERMAN WASTE WASTED WASTEFUL WASTEFULLY WASTEFULNESS WASTES WASTING WATANABE WATCH WATCHED WATCHER WATCHERS WATCHES WATCHFUL WATCHFULLY WATCHFULNESS WATCHING WATCHINGS WATCHMAN WATCHWORD WATCHWORDS WATER WATERBURY WATERED WATERFALL WATERFALLS WATERGATE WATERHOUSE WATERING WATERINGS WATERLOO WATERMAN WATERPROOF WATERPROOFING WATERS WATERTOWN WATERWAY WATERWAYS WATERY WATKINS WATSON WATTENBERG WATTERSON WATTS WAUKESHA WAUNONA WAUPACA WAUPUN WAUSAU WAUWATOSA WAVE WAVED WAVEFORM WAVEFORMS WAVEFRONT WAVEFRONTS WAVEGUIDES WAVELAND WAVELENGTH WAVELENGTHS WAVER WAVERS WAVES WAVING WAX WAXED WAXEN WAXER WAXERS WAXES WAXING WAXY WAY WAYNE WAYNESBORO WAYS WAYSIDE WAYWARD WEAK WEAKEN WEAKENED WEAKENING WEAKENS WEAKER WEAKEST WEAKLY WEAKNESS WEAKNESSES WEALTH WEALTHIEST WEALTHS WEALTHY WEAN WEANED WEANING WEAPON WEAPONS WEAR WEARABLE WEARER WEARIED WEARIER WEARIEST WEARILY WEARINESS WEARING WEARISOME WEARISOMELY WEARS WEARY WEARYING WEASEL WEASELS WEATHER WEATHERCOCK WEATHERCOCKS WEATHERED WEATHERFORD WEATHERING WEATHERS WEAVE WEAVER WEAVES WEAVING WEB WEBB WEBBER WEBS WEBSTER WEBSTERVILLE WEDDED WEDDING WEDDINGS WEDGE WEDGED WEDGES WEDGING WEDLOCK WEDNESDAY WEDNESDAYS WEDS WEE WEED WEEDS WEEK WEEKEND WEEKENDS WEEKLY WEEKS WEEP WEEPER WEEPING WEEPS WEHR WEI WEIBULL WEIDER WEIDMAN WEIERSTRASS WEIGH WEIGHED WEIGHING WEIGHINGS WEIGHS WEIGHT WEIGHTED WEIGHTING WEIGHTS WEIGHTY WEINBERG WEINER WEINSTEIN WEIRD WEIRDLY WEISENHEIMER WEISS WEISSMAN WEISSMULLER WELCH WELCHER WELCHES WELCOME WELCOMED WELCOMES WELCOMING WELD WELDED WELDER WELDING WELDON WELDS WELDWOOD WELFARE WELL WELLED WELLER WELLES WELLESLEY WELLING WELLINGTON WELLMAN WELLS WELLSVILLE WELMERS WELSH WELTON WENCH WENCHES WENDELL WENDY WENT WENTWORTH WEPT WERE WERNER WERTHER WESLEY WESLEYAN WESSON WEST WESTBOUND WESTBROOK WESTCHESTER WESTERN WESTERNER WESTERNERS WESTFIELD WESTHAMPTON WESTINGHOUSE WESTMINSTER WESTMORE WESTON WESTPHALIA WESTPORT WESTWARD WESTWARDS WESTWOOD WET WETLY WETNESS WETS WETTED WETTER WETTEST WETTING WEYERHAUSER WHACK WHACKED WHACKING WHACKS WHALE WHALEN WHALER WHALES WHALING WHARF WHARTON WHARVES WHAT WHATEVER WHATLEY WHATSOEVER WHEAT WHEATEN WHEATLAND WHEATON WHEATSTONE WHEEL WHEELED WHEELER WHEELERS WHEELING WHEELINGS WHEELOCK WHEELS WHELAN WHELLER WHELP WHEN WHENCE WHENEVER WHERE WHEREABOUTS WHEREAS WHEREBY WHEREIN WHEREUPON WHEREVER WHETHER WHICH WHICHEVER WHILE WHIM WHIMPER WHIMPERED WHIMPERING WHIMPERS WHIMS WHIMSICAL WHIMSICALLY WHIMSIES WHIMSY WHINE WHINED WHINES WHINING WHIP WHIPPANY WHIPPED WHIPPER WHIPPERS WHIPPING WHIPPINGS WHIPPLE WHIPS WHIRL WHIRLED WHIRLING WHIRLPOOL WHIRLPOOLS WHIRLS WHIRLWIND WHIRR WHIRRING WHISK WHISKED WHISKER WHISKERS WHISKEY WHISKING WHISKS WHISPER WHISPERED WHISPERING WHISPERINGS WHISPERS WHISTLE WHISTLED WHISTLER WHISTLERS WHISTLES WHISTLING WHIT WHITAKER WHITCOMB WHITE WHITEHALL WHITEHORSE WHITELEAF WHITELEY WHITELY WHITEN WHITENED WHITENER WHITENERS WHITENESS WHITENING WHITENS WHITER WHITES WHITESPACE WHITEST WHITEWASH WHITEWASHED WHITEWATER WHITFIELD WHITING WHITLOCK WHITMAN WHITMANIZE WHITMANIZES WHITNEY WHITTAKER WHITTIER WHITTLE WHITTLED WHITTLES WHITTLING WHIZ WHIZZED WHIZZES WHIZZING WHO WHOEVER WHOLE WHOLEHEARTED WHOLEHEARTEDLY WHOLENESS WHOLES WHOLESALE WHOLESALER WHOLESALERS WHOLESOME WHOLESOMENESS WHOLLY WHOM WHOMEVER WHOOP WHOOPED WHOOPING WHOOPS WHORE WHORES WHORL WHORLS WHOSE WHY WICHITA WICK WICKED WICKEDLY WICKEDNESS WICKER WICKS WIDE WIDEBAND WIDELY WIDEN WIDENED WIDENER WIDENING WIDENS WIDER WIDESPREAD WIDEST WIDGET WIDOW WIDOWED WIDOWER WIDOWERS WIDOWS WIDTH WIDTHS WIELAND WIELD WIELDED WIELDER WIELDING WIELDS WIER WIFE WIFELY WIG WIGGINS WIGHTMAN WIGS WIGWAM WILBUR WILCOX WILD WILDCAT WILDCATS WILDER WILDERNESS WILDEST WILDLY WILDNESS WILE WILES WILEY WILFRED WILHELM WILHELMINA WILINESS WILKES WILKIE WILKINS WILKINSON WILL WILLA WILLAMETTE WILLARD WILLCOX WILLED WILLEM WILLFUL WILLFULLY WILLIAM WILLIAMS WILLIAMSBURG WILLIAMSON WILLIE WILLIED WILLIES WILLING WILLINGLY WILLINGNESS WILLIS WILLISSON WILLOUGHBY WILLOW WILLOWS WILLS WILLY WILMA WILMETTE WILMINGTON WILSHIRE WILSON WILSONIAN WILT WILTED WILTING WILTS WILTSHIRE WILY WIN WINCE WINCED WINCES WINCHELL WINCHESTER WINCING WIND WINDED WINDER WINDERS WINDING WINDMILL WINDMILLS WINDOW WINDOWS WINDS WINDSOR WINDY WINE WINED WINEHEAD WINER WINERS WINES WINFIELD WING WINGED WINGING WINGS WINIFRED WINING WINK WINKED WINKER WINKING WINKS WINNEBAGO WINNER WINNERS WINNETKA WINNIE WINNING WINNINGLY WINNINGS WINNIPEG WINNIPESAUKEE WINOGRAD WINOOSKI WINS WINSBOROUGH WINSETT WINSLOW WINSTON WINTER WINTERED WINTERING WINTERS WINTHROP WINTRY WIPE WIPED WIPER WIPERS WIPES WIPING WIRE WIRED WIRELESS WIRES WIRETAP WIRETAPPERS WIRETAPPING WIRETAPS WIRINESS WIRING WIRY WISCONSIN WISDOM WISDOMS WISE WISED WISELY WISENHEIMER WISER WISEST WISH WISHED WISHER WISHERS WISHES WISHFUL WISHING WISP WISPS WISTFUL WISTFULLY WISTFULNESS WIT WITCH WITCHCRAFT WITCHES WITCHING WITH WITHAL WITHDRAW WITHDRAWAL WITHDRAWALS WITHDRAWING WITHDRAWN WITHDRAWS WITHDREW WITHER WITHERS WITHERSPOON WITHHELD WITHHOLD WITHHOLDER WITHHOLDERS WITHHOLDING WITHHOLDINGS WITHHOLDS WITHIN WITHOUT WITHSTAND WITHSTANDING WITHSTANDS WITHSTOOD WITNESS WITNESSED WITNESSES WITNESSING WITS WITT WITTGENSTEIN WITTY WIVES WIZARD WIZARDS WOE WOEFUL WOEFULLY WOKE WOLCOTT WOLF WOLFE WOLFF WOLFGANG WOLVERTON WOLVES WOMAN WOMANHOOD WOMANLY WOMB WOMBS WOMEN WON WONDER WONDERED WONDERFUL WONDERFULLY WONDERFULNESS WONDERING WONDERINGLY WONDERMENT WONDERS WONDROUS WONDROUSLY WONG WONT WONTED WOO WOOD WOODARD WOODBERRY WOODBURY WOODCHUCK WOODCHUCKS WOODCOCK WOODCOCKS WOODED WOODEN WOODENLY WOODENNESS WOODLAND WOODLAWN WOODMAN WOODPECKER WOODPECKERS WOODROW WOODS WOODSTOCK WOODWARD WOODWARDS WOODWORK WOODWORKING WOODY WOOED WOOER WOOF WOOFED WOOFER WOOFERS WOOFING WOOFS WOOING WOOL WOOLEN WOOLLY WOOLS WOOLWORTH WOONSOCKET WOOS WOOSTER WORCESTER WORCESTERSHIRE WORD WORDED WORDILY WORDINESS WORDING WORDS WORDSWORTH WORDY WORE WORK WORKABLE WORKABLY WORKBENCH WORKBENCHES WORKBOOK WORKBOOKS WORKED WORKER WORKERS WORKHORSE WORKHORSES WORKING WORKINGMAN WORKINGS WORKLOAD WORKMAN WORKMANSHIP WORKMEN WORKS WORKSHOP WORKSHOPS WORKSPACE WORKSTATION WORKSTATIONS WORLD WORLDLINESS WORLDLY WORLDS WORLDWIDE WORM WORMED WORMING WORMS WORN WORRIED WORRIER WORRIERS WORRIES WORRISOME WORRY WORRYING WORRYINGLY WORSE WORSHIP WORSHIPED WORSHIPER WORSHIPFUL WORSHIPING WORSHIPS WORST WORSTED WORTH WORTHIEST WORTHINESS WORTHINGTON WORTHLESS WORTHLESSNESS WORTHS WORTHWHILE WORTHWHILENESS WORTHY WOTAN WOULD WOUND WOUNDED WOUNDING WOUNDS WOVE WOVEN WRANGLE WRANGLED WRANGLER WRAP WRAPAROUND WRAPPED WRAPPER WRAPPERS WRAPPING WRAPPINGS WRAPS WRATH WREAK WREAKS WREATH WREATHED WREATHES WRECK WRECKAGE WRECKED WRECKER WRECKERS WRECKING WRECKS WREN WRENCH WRENCHED WRENCHES WRENCHING WRENS WREST WRESTLE WRESTLER WRESTLES WRESTLING WRESTLINGS WRETCH WRETCHED WRETCHEDNESS WRETCHES WRIGGLE WRIGGLED WRIGGLER WRIGGLES WRIGGLING WRIGLEY WRING WRINGER WRINGS WRINKLE WRINKLED WRINKLES WRIST WRISTS WRISTWATCH WRISTWATCHES WRIT WRITABLE WRITE WRITER WRITERS WRITES WRITHE WRITHED WRITHES WRITHING WRITING WRITINGS WRITS WRITTEN WRONG WRONGED WRONGING WRONGLY WRONGS WRONSKIAN WROTE WROUGHT WRUNG WUHAN WYANDOTTE WYATT WYETH WYLIE WYMAN WYNER WYNN WYOMING XANTHUS XAVIER XEBEC XENAKIS XENIA XENIX XEROX XEROXED XEROXES XEROXING XERXES XHOSA YAGI YAKIMA YALE YALIES YALTA YAMAHA YANK YANKED YANKEE YANKEES YANKING YANKS YANKTON YAOUNDE YAQUI YARD YARDS YARDSTICK YARDSTICKS YARMOUTH YARN YARNS YATES YAUNDE YAWN YAWNER YAWNING YEA YEAGER YEAR YEARLY YEARN YEARNED YEARNING YEARNINGS YEARS YEAS YEAST YEASTS YEATS YELL YELLED YELLER YELLING YELLOW YELLOWED YELLOWER YELLOWEST YELLOWING YELLOWISH YELLOWKNIFE YELLOWNESS YELLOWS YELLOWSTONE YELP YELPED YELPING YELPS YEMEN YENTL YEOMAN YEOMEN YERKES YES YESTERDAY YESTERDAYS YET YIDDISH YIELD YIELDED YIELDING YIELDS YODER YOKE YOKES YOKNAPATAWPHA YOKOHAMA YOKUTS YON YONDER YONKERS YORICK YORK YORKER YORKERS YORKSHIRE YORKTOWN YOSEMITE YOST YOU YOUNG YOUNGER YOUNGEST YOUNGLY YOUNGSTER YOUNGSTERS YOUNGSTOWN YOUR YOURS YOURSELF YOURSELVES YOUTH YOUTHES YOUTHFUL YOUTHFULLY YOUTHFULNESS YPSILANTI YUBA YUCATAN YUGOSLAV YUGOSLAVIA YUGOSLAVIAN YUGOSLAVIANS YUH YUKI YUKON YURI YVES YVETTE ZACHARY ZAGREB ZAIRE ZAMBIA ZAN ZANZIBAR ZEAL ZEALAND ZEALOUS ZEALOUSLY ZEALOUSNESS ZEBRA ZEBRAS ZEFFIRELLI ZEISS ZELLERBACH ZEN ZENITH ZENNIST ZERO ZEROED ZEROES ZEROING ZEROS ZEROTH ZEST ZEUS ZIEGFELD ZIEGFELDS ZIEGLER ZIGGY ZIGZAG ZILLIONS ZIMMERMAN ZINC ZION ZIONISM ZIONIST ZIONISTS ZIONS ZODIAC ZOE ZOMBA ZONAL ZONALLY ZONE ZONED ZONES ZONING ZOO ZOOLOGICAL ZOOLOGICALLY ZOOM ZOOMS ZOOS ZORN ZOROASTER ZOROASTRIAN ZULU ZULUS ZURICH ================================================ FILE: strings/dna.py ================================================ import re def dna(dna: str) -> str: """ https://en.wikipedia.org/wiki/DNA Returns the second side of a DNA strand >>> dna("GCTA") 'CGAT' >>> dna("ATGC") 'TACG' >>> dna("CTGA") 'GACT' >>> dna("GFGG") Traceback (most recent call last): ... ValueError: Invalid Strand """ if len(re.findall("[ATCG]", dna)) != len(dna): raise ValueError("Invalid Strand") return dna.translate(dna.maketrans("ATCG", "TAGC")) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: strings/edit_distance.py ================================================ def edit_distance(source: str, target: str) -> int: """ Edit distance algorithm is a string metric, i.e., it is a way of quantifying how dissimilar two strings are to one another. It is measured by counting the minimum number of operations required to transform one string into another. This implementation assumes that the cost of operations (insertion, deletion and substitution) is always 1 Args: source: the initial string with respect to which we are calculating the edit distance for the target target: the target string, formed after performing n operations on the source string >>> edit_distance("GATTIC", "GALTIC") 1 >>> edit_distance("NUM3", "HUM2") 2 >>> edit_distance("cap", "CAP") 3 >>> edit_distance("Cat", "") 3 >>> edit_distance("cat", "cat") 0 >>> edit_distance("", "123456789") 9 >>> edit_distance("Be@uty", "Beautyyyy!") 5 >>> edit_distance("lstring", "lsstring") 1 """ if len(source) == 0: return len(target) elif len(target) == 0: return len(source) delta = int(source[-1] != target[-1]) # Substitution return min( edit_distance(source[:-1], target[:-1]) + delta, edit_distance(source, target[:-1]) + 1, edit_distance(source[:-1], target) + 1, ) if __name__ == "__main__": print(edit_distance("ATCGCTG", "TAGCTAA")) # Answer is 4 ================================================ FILE: strings/frequency_finder.py ================================================ # Frequency Finder import string # frequency taken from https://en.wikipedia.org/wiki/Letter_frequency english_letter_freq = { "E": 12.70, "T": 9.06, "A": 8.17, "O": 7.51, "I": 6.97, "N": 6.75, "S": 6.33, "H": 6.09, "R": 5.99, "D": 4.25, "L": 4.03, "C": 2.78, "U": 2.76, "M": 2.41, "W": 2.36, "F": 2.23, "G": 2.02, "Y": 1.97, "P": 1.93, "B": 1.29, "V": 0.98, "K": 0.77, "J": 0.15, "X": 0.15, "Q": 0.10, "Z": 0.07, } ETAOIN = "ETAOINSHRDLCUMWFGYPBVKJXQZ" LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" def get_letter_count(message: str) -> dict[str, int]: letter_count = dict.fromkeys(string.ascii_uppercase, 0) for letter in message.upper(): if letter in LETTERS: letter_count[letter] += 1 return letter_count def get_item_at_index_zero(x: tuple) -> str: return x[0] def get_frequency_order(message: str) -> str: """ Get the frequency order of the letters in the given string >>> get_frequency_order('Hello World') 'LOWDRHEZQXJKVBPYGFMUCSNIAT' >>> get_frequency_order('Hello@') 'LHOEZQXJKVBPYGFWMUCDRSNIAT' >>> get_frequency_order('h') 'HZQXJKVBPYGFWMUCLDRSNIOATE' """ letter_to_freq = get_letter_count(message) freq_to_letter: dict[int, list[str]] = { freq: [] for letter, freq in letter_to_freq.items() } for letter in LETTERS: freq_to_letter[letter_to_freq[letter]].append(letter) freq_to_letter_str: dict[int, str] = {} for freq in freq_to_letter: # noqa: PLC0206 freq_to_letter[freq].sort(key=ETAOIN.find, reverse=True) freq_to_letter_str[freq] = "".join(freq_to_letter[freq]) freq_pairs = list(freq_to_letter_str.items()) freq_pairs.sort(key=get_item_at_index_zero, reverse=True) freq_order: list[str] = [freq_pair[1] for freq_pair in freq_pairs] return "".join(freq_order) def english_freq_match_score(message: str) -> int: """ >>> english_freq_match_score('Hello World') 1 """ freq_order = get_frequency_order(message) match_score = 0 for common_letter in ETAOIN[:6]: if common_letter in freq_order[:6]: match_score += 1 for uncommon_letter in ETAOIN[-6:]: if uncommon_letter in freq_order[-6:]: match_score += 1 return match_score if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: strings/hamming_distance.py ================================================ def hamming_distance(string1: str, string2: str) -> int: """Calculate the Hamming distance between two equal length strings In information theory, the Hamming distance between two strings of equal length is the number of positions at which the corresponding symbols are different. https://en.wikipedia.org/wiki/Hamming_distance Args: string1 (str): Sequence 1 string2 (str): Sequence 2 Returns: int: Hamming distance >>> hamming_distance("python", "python") 0 >>> hamming_distance("karolin", "kathrin") 3 >>> hamming_distance("00000", "11111") 5 >>> hamming_distance("karolin", "kath") Traceback (most recent call last): ... ValueError: String lengths must match! """ if len(string1) != len(string2): raise ValueError("String lengths must match!") count = 0 for char1, char2 in zip(string1, string2): if char1 != char2: count += 1 return count if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: strings/indian_phone_validator.py ================================================ import re def indian_phone_validator(phone: str) -> bool: """ Determine whether the string is a valid phone number or not :param phone: :return: Boolean >>> indian_phone_validator("+91123456789") False >>> indian_phone_validator("+919876543210") True >>> indian_phone_validator("01234567896") False >>> indian_phone_validator("919876543218") True >>> indian_phone_validator("+91-1234567899") False >>> indian_phone_validator("+91-9876543218") True """ pat = re.compile(r"^(\+91[\-\s]?)?[0]?(91)?[789]\d{9}$") if match := re.search(pat, phone): return match.string == phone return False if __name__ == "__main__": print(indian_phone_validator("+918827897895")) ================================================ FILE: strings/is_contains_unique_chars.py ================================================ def is_contains_unique_chars(input_str: str) -> bool: """ Check if all characters in the string is unique or not. >>> is_contains_unique_chars("I_love.py") True >>> is_contains_unique_chars("I don't love Python") False Time complexity: O(n) Space complexity: O(1) 19320 bytes as we are having 144697 characters in unicode """ # Each bit will represent each unicode character # For example 65th bit representing 'A' # https://stackoverflow.com/a/12811293 bitmap = 0 for ch in input_str: ch_unicode = ord(ch) ch_bit_index_on = pow(2, ch_unicode) # If we already turned on bit for current character's unicode if bitmap >> ch_unicode & 1 == 1: return False bitmap |= ch_bit_index_on return True if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: strings/is_isogram.py ================================================ """ wiki: https://en.wikipedia.org/wiki/Heterogram_(literature)#Isograms """ def is_isogram(string: str) -> bool: """ An isogram is a word in which no letter is repeated. Examples of isograms are uncopyrightable and ambidextrously. >>> is_isogram('Uncopyrightable') True >>> is_isogram('allowance') False >>> is_isogram('copy1') Traceback (most recent call last): ... ValueError: String must only contain alphabetic characters. """ if not all(x.isalpha() for x in string): raise ValueError("String must only contain alphabetic characters.") letters = sorted(string.lower()) return len(letters) == len(set(letters)) if __name__ == "__main__": input_str = input("Enter a string ").strip() isogram = is_isogram(input_str) print(f"{input_str} is {'an' if isogram else 'not an'} isogram.") ================================================ FILE: strings/is_pangram.py ================================================ """ wiki: https://en.wikipedia.org/wiki/Pangram """ def is_pangram( input_str: str = "The quick brown fox jumps over the lazy dog", ) -> bool: """ A Pangram String contains all the alphabets at least once. >>> is_pangram("The quick brown fox jumps over the lazy dog") True >>> is_pangram("Waltz, bad nymph, for quick jigs vex.") True >>> is_pangram("Jived fox nymph grabs quick waltz.") True >>> is_pangram("My name is Unknown") False >>> is_pangram("The quick brown fox jumps over the la_y dog") False >>> is_pangram() True """ # Declare frequency as a set to have unique occurrences of letters frequency = set() # Replace all the whitespace in our sentence input_str = input_str.replace(" ", "") for alpha in input_str: if "a" <= alpha.lower() <= "z": frequency.add(alpha.lower()) return len(frequency) == 26 def is_pangram_faster( input_str: str = "The quick brown fox jumps over the lazy dog", ) -> bool: """ >>> is_pangram_faster("The quick brown fox jumps over the lazy dog") True >>> is_pangram_faster("Waltz, bad nymph, for quick jigs vex.") True >>> is_pangram_faster("Jived fox nymph grabs quick waltz.") True >>> is_pangram_faster("The quick brown fox jumps over the la_y dog") False >>> is_pangram_faster() True """ flag = [False] * 26 for char in input_str: if char.islower(): flag[ord(char) - 97] = True elif char.isupper(): flag[ord(char) - 65] = True return all(flag) def is_pangram_fastest( input_str: str = "The quick brown fox jumps over the lazy dog", ) -> bool: """ >>> is_pangram_fastest("The quick brown fox jumps over the lazy dog") True >>> is_pangram_fastest("Waltz, bad nymph, for quick jigs vex.") True >>> is_pangram_fastest("Jived fox nymph grabs quick waltz.") True >>> is_pangram_fastest("The quick brown fox jumps over the la_y dog") False >>> is_pangram_fastest() True """ return len({char for char in input_str.lower() if char.isalpha()}) == 26 def benchmark() -> None: """ Benchmark code comparing different version. """ from timeit import timeit setup = "from __main__ import is_pangram, is_pangram_faster, is_pangram_fastest" print(timeit("is_pangram()", setup=setup)) print(timeit("is_pangram_faster()", setup=setup)) print(timeit("is_pangram_fastest()", setup=setup)) # 5.348480500048026, 2.6477354579837993, 1.8470395830227062 # 5.036091582966037, 2.644472333951853, 1.8869528750656173 if __name__ == "__main__": import doctest doctest.testmod() benchmark() ================================================ FILE: strings/is_polish_national_id.py ================================================ def is_polish_national_id(input_str: str) -> bool: """ Verification of the correctness of the PESEL number. www-gov-pl.translate.goog/web/gov/czym-jest-numer-pesel?_x_tr_sl=auto&_x_tr_tl=en PESEL can start with 0, that's why we take str as input, but convert it to int for some calculations. >>> is_polish_national_id(123) Traceback (most recent call last): ... ValueError: Expected str as input, found >>> is_polish_national_id("abc") Traceback (most recent call last): ... ValueError: Expected number as input >>> is_polish_national_id("02070803628") # correct PESEL True >>> is_polish_national_id("02150803629") # wrong month False >>> is_polish_national_id("02075503622") # wrong day False >>> is_polish_national_id("-99012212349") # wrong range False >>> is_polish_national_id("990122123499999") # wrong range False >>> is_polish_national_id("02070803621") # wrong checksum False """ # check for invalid input type if not isinstance(input_str, str): msg = f"Expected str as input, found {type(input_str)}" raise ValueError(msg) # check if input can be converted to int try: input_int = int(input_str) except ValueError: msg = "Expected number as input" raise ValueError(msg) # check number range if not 10100000 <= input_int <= 99923199999: return False # check month correctness month = int(input_str[2:4]) if ( month not in range(1, 13) # year 1900-1999 and month not in range(21, 33) # 2000-2099 and month not in range(41, 53) # 2100-2199 and month not in range(61, 73) # 2200-2299 and month not in range(81, 93) # 1800-1899 ): return False # check day correctness day = int(input_str[4:6]) if day not in range(1, 32): return False # check the checksum multipliers = [1, 3, 7, 9, 1, 3, 7, 9, 1, 3] subtotal = 0 digits_to_check = str(input_str)[:-1] # cut off the checksum for index, digit in enumerate(digits_to_check): # Multiply corresponding digits and multipliers. # In case of a double-digit result, add only the last digit. subtotal += (int(digit) * multipliers[index]) % 10 checksum = 10 - subtotal % 10 return checksum == input_int % 10 if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: strings/is_spain_national_id.py ================================================ NUMBERS_PLUS_LETTER = "Input must be a string of 8 numbers plus letter" LOOKUP_LETTERS = "TRWAGMYFPDXBNJZSQVHLCKE" def is_spain_national_id(spanish_id: str) -> bool: """ Spain National Id is a string composed by 8 numbers plus a letter The letter in fact is not part of the ID, it acts as a validator, checking you didn't do a mistake when entering it on a system or are giving a fake one. https://en.wikipedia.org/wiki/Documento_Nacional_de_Identidad_(Spain)#Number >>> is_spain_national_id("12345678Z") True >>> is_spain_national_id("12345678z") # It is case-insensitive True >>> is_spain_national_id("12345678x") False >>> is_spain_national_id("12345678I") False >>> is_spain_national_id("12345678-Z") # Some systems add a dash True >>> is_spain_national_id("12345678") Traceback (most recent call last): ... ValueError: Input must be a string of 8 numbers plus letter >>> is_spain_national_id("123456709") Traceback (most recent call last): ... ValueError: Input must be a string of 8 numbers plus letter >>> is_spain_national_id("1234567--Z") Traceback (most recent call last): ... ValueError: Input must be a string of 8 numbers plus letter >>> is_spain_national_id("1234Z") Traceback (most recent call last): ... ValueError: Input must be a string of 8 numbers plus letter >>> is_spain_national_id("1234ZzZZ") Traceback (most recent call last): ... ValueError: Input must be a string of 8 numbers plus letter >>> is_spain_national_id(12345678) Traceback (most recent call last): ... TypeError: Expected string as input, found int """ if not isinstance(spanish_id, str): msg = f"Expected string as input, found {type(spanish_id).__name__}" raise TypeError(msg) spanish_id_clean = spanish_id.replace("-", "").upper() if len(spanish_id_clean) != 9: raise ValueError(NUMBERS_PLUS_LETTER) try: number = int(spanish_id_clean[0:8]) letter = spanish_id_clean[8] except ValueError as ex: raise ValueError(NUMBERS_PLUS_LETTER) from ex if letter.isdigit(): raise ValueError(NUMBERS_PLUS_LETTER) return letter == LOOKUP_LETTERS[number % 23] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: strings/is_srilankan_phone_number.py ================================================ import re def is_sri_lankan_phone_number(phone: str) -> bool: """ Determine whether the string is a valid sri lankan mobile phone number or not References: https://aye.sh/blog/sri-lankan-phone-number-regex >>> is_sri_lankan_phone_number("+94773283048") True >>> is_sri_lankan_phone_number("+9477-3283048") True >>> is_sri_lankan_phone_number("0718382399") True >>> is_sri_lankan_phone_number("0094702343221") True >>> is_sri_lankan_phone_number("075 3201568") True >>> is_sri_lankan_phone_number("07779209245") False >>> is_sri_lankan_phone_number("0957651234") False """ pattern = re.compile(r"^(?:0|94|\+94|0{2}94)7(0|1|2|4|5|6|7|8)(-| |)\d{7}$") return bool(re.search(pattern, phone)) if __name__ == "__main__": phone = "0094702343221" print(is_sri_lankan_phone_number(phone)) ================================================ FILE: strings/is_valid_email_address.py ================================================ """ Implements an is valid email address algorithm @ https://en.wikipedia.org/wiki/Email_address """ import string email_tests: tuple[tuple[str, bool], ...] = ( ("simple@example.com", True), ("very.common@example.com", True), ("disposable.style.email.with+symbol@example.com", True), ("other-email-with-hyphen@and.subdomains.example.com", True), ("fully-qualified-domain@example.com", True), ("user.name+tag+sorting@example.com", True), ("x@example.com", True), ("example-indeed@strange-example.com", True), ("test/test@test.com", True), ( "123456789012345678901234567890123456789012345678901234567890123@example.com", True, ), ("admin@mailserver1", True), ("example@s.example", True), ("Abc.example.com", False), ("A@b@c@example.com", False), ("abc@example..com", False), ("a(c)d,e:f;gi[j\\k]l@example.com", False), ( "12345678901234567890123456789012345678901234567890123456789012345@example.com", False, ), ("i.like.underscores@but_its_not_allowed_in_this_part", False), ("", False), ) # The maximum octets (one character as a standard unicode character is one byte) # that the local part and the domain part can have MAX_LOCAL_PART_OCTETS = 64 MAX_DOMAIN_OCTETS = 255 def is_valid_email_address(email: str) -> bool: """ Returns True if the passed email address is valid. The local part of the email precedes the singular @ symbol and is associated with a display-name. For example, "john.smith" The domain is stricter than the local part and follows the @ symbol. Global email checks: 1. There can only be one @ symbol in the email address. Technically if the @ symbol is quoted in the local-part, then it is valid, however this implementation ignores "" for now. (See https://en.wikipedia.org/wiki/Email_address#:~:text=If%20quoted,) 2. The local-part and the domain are limited to a certain number of octets. With unicode storing a single character in one byte, each octet is equivalent to a character. Hence, we can just check the length of the string. Checks for the local-part: 3. The local-part may contain: upper and lowercase latin letters, digits 0 to 9, and printable characters (!#$%&'*+-/=?^_`{|}~) 4. The local-part may also contain a "." in any place that is not the first or last character, and may not have more than one "." consecutively. Checks for the domain: 5. The domain may contain: upper and lowercase latin letters and digits 0 to 9 6. Hyphen "-", provided that it is not the first or last character 7. The domain may also contain a "." in any place that is not the first or last character, and may not have more than one "." consecutively. >>> for email, valid in email_tests: ... assert is_valid_email_address(email) == valid """ # (1.) Make sure that there is only one @ symbol in the email address if email.count("@") != 1: return False local_part, domain = email.split("@") # (2.) Check octet length of the local part and domain if len(local_part) > MAX_LOCAL_PART_OCTETS or len(domain) > MAX_DOMAIN_OCTETS: return False # (3.) Validate the characters in the local-part if any( char not in string.ascii_letters + string.digits + ".(!#$%&'*+-/=?^_`{|}~)" for char in local_part ): return False # (4.) Validate the placement of "." characters in the local-part if local_part.startswith(".") or local_part.endswith(".") or ".." in local_part: return False # (5.) Validate the characters in the domain if any(char not in string.ascii_letters + string.digits + ".-" for char in domain): return False # (6.) Validate the placement of "-" characters if domain.startswith("-") or domain.endswith("."): return False # (7.) Validate the placement of "." characters return not (domain.startswith(".") or domain.endswith(".") or ".." in domain) if __name__ == "__main__": import doctest doctest.testmod() for email, valid in email_tests: is_valid = is_valid_email_address(email) assert is_valid == valid, f"{email} is {is_valid}" print(f"Email address {email} is {'not ' if not is_valid else ''}valid") ================================================ FILE: strings/jaro_winkler.py ================================================ """https://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance""" def jaro_winkler(str1: str, str2: str) -> float: """ Jaro-Winkler distance is a string metric measuring an edit distance between two sequences. Output value is between 0.0 and 1.0. >>> jaro_winkler("martha", "marhta") 0.9611111111111111 >>> jaro_winkler("CRATE", "TRACE") 0.7333333333333334 >>> jaro_winkler("test", "dbdbdbdb") 0.0 >>> jaro_winkler("test", "test") 1.0 >>> jaro_winkler("hello world", "HeLLo W0rlD") 0.6363636363636364 >>> jaro_winkler("test", "") 0.0 >>> jaro_winkler("hello", "world") 0.4666666666666666 >>> jaro_winkler("hell**o", "*world") 0.4365079365079365 """ def get_matched_characters(_str1: str, _str2: str) -> str: matched = [] limit = min(len(_str1), len(_str2)) // 2 for i, char in enumerate(_str1): left = int(max(0, i - limit)) right = int(min(i + limit + 1, len(_str2))) if char in _str2[left:right]: matched.append(char) _str2 = ( f"{_str2[0 : _str2.index(char)]} {_str2[_str2.index(char) + 1 :]}" ) return "".join(matched) # matching characters matching_1 = get_matched_characters(str1, str2) matching_2 = get_matched_characters(str2, str1) match_count = len(matching_1) # transposition transpositions = ( len([(c1, c2) for c1, c2 in zip(matching_1, matching_2) if c1 != c2]) // 2 ) if not match_count: jaro = 0.0 else: jaro = ( 1 / 3 * ( match_count / len(str1) + match_count / len(str2) + (match_count - transpositions) / match_count ) ) # common prefix up to 4 characters prefix_len = 0 for c1, c2 in zip(str1[:4], str2[:4]): if c1 == c2: prefix_len += 1 else: break return jaro + 0.1 * prefix_len * (1 - jaro) if __name__ == "__main__": import doctest doctest.testmod() print(jaro_winkler("hello", "world")) ================================================ FILE: strings/join.py ================================================ """ Program to join a list of strings with a separator """ def join(separator: str, separated: list[str]) -> str: """ Joins a list of strings using a separator and returns the result. :param separator: Separator to be used for joining the strings. :param separated: List of strings to be joined. :return: Joined string with the specified separator. Examples: >>> join("", ["a", "b", "c", "d"]) 'abcd' >>> join("#", ["a", "b", "c", "d"]) 'a#b#c#d' >>> join("#", "a") 'a' >>> join(" ", ["You", "are", "amazing!"]) 'You are amazing!' >>> join(",", ["", "", ""]) ',,' This example should raise an exception for non-string elements: >>> join("#", ["a", "b", "c", 1]) Traceback (most recent call last): ... Exception: join() accepts only strings Additional test case with a different separator: >>> join("-", ["apple", "banana", "cherry"]) 'apple-banana-cherry' """ # Check that all elements are strings for word_or_phrase in separated: # If the element is not a string, raise an exception if not isinstance(word_or_phrase, str): raise Exception("join() accepts only strings") joined: str = "" """ The last element of the list is not followed by the separator. So, we need to iterate through the list and join each element with the separator except the last element. """ last_index: int = len(separated) - 1 """ Iterate through the list and join each element with the separator. Except the last element, all other elements are followed by the separator. """ for word_or_phrase in separated[:last_index]: # join the element with the separator. joined += word_or_phrase + separator # If the list is not empty, join the last element. if separated != []: joined += separated[last_index] # Return the joined string. return joined if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: strings/knuth_morris_pratt.py ================================================ from __future__ import annotations def knuth_morris_pratt(text: str, pattern: str) -> int: """ The Knuth-Morris-Pratt Algorithm for finding a pattern within a piece of text with complexity O(n + m) 1) Preprocess pattern to identify any suffixes that are identical to prefixes This tells us where to continue from if we get a mismatch between a character in our pattern and the text. 2) Step through the text one character at a time and compare it to a character in the pattern updating our location within the pattern if necessary >>> kmp = "knuth_morris_pratt" >>> all( ... knuth_morris_pratt(kmp, s) == kmp.find(s) ... for s in ("kn", "h_m", "rr", "tt", "not there") ... ) True """ # 1) Construct the failure array failure = get_failure_array(pattern) # 2) Step through text searching for pattern i, j = 0, 0 # index into text, pattern while i < len(text): if pattern[j] == text[i]: if j == (len(pattern) - 1): return i - j j += 1 # if this is a prefix in our pattern # just go back far enough to continue elif j > 0: j = failure[j - 1] continue i += 1 return -1 def get_failure_array(pattern: str) -> list[int]: """ Calculates the new index we should go to if we fail a comparison :param pattern: :return: """ failure = [0] i = 0 j = 1 while j < len(pattern): if pattern[i] == pattern[j]: i += 1 elif i > 0: i = failure[i - 1] continue j += 1 failure.append(i) return failure if __name__ == "__main__": import doctest doctest.testmod() # Test 1) pattern = "abc1abc12" text1 = "alskfjaldsabc1abc1abc12k23adsfabcabc" text2 = "alskfjaldsk23adsfabcabc" assert knuth_morris_pratt(text1, pattern) assert knuth_morris_pratt(text2, pattern) # Test 2) pattern = "ABABX" text = "ABABZABABYABABX" assert knuth_morris_pratt(text, pattern) # Test 3) pattern = "AAAB" text = "ABAAAAAB" assert knuth_morris_pratt(text, pattern) # Test 4) pattern = "abcdabcy" text = "abcxabcdabxabcdabcdabcy" assert knuth_morris_pratt(text, pattern) # Test 5) -> Doctests kmp = "knuth_morris_pratt" assert all( knuth_morris_pratt(kmp, s) == kmp.find(s) for s in ("kn", "h_m", "rr", "tt", "not there") ) # Test 6) pattern = "aabaabaaa" assert get_failure_array(pattern) == [0, 1, 0, 1, 2, 3, 4, 5, 2] ================================================ FILE: strings/levenshtein_distance.py ================================================ from collections.abc import Callable def levenshtein_distance(first_word: str, second_word: str) -> int: """ Implementation of the Levenshtein distance in Python. :param first_word: the first word to measure the difference. :param second_word: the second word to measure the difference. :return: the levenshtein distance between the two words. Examples: >>> levenshtein_distance("planet", "planetary") 3 >>> levenshtein_distance("", "test") 4 >>> levenshtein_distance("book", "back") 2 >>> levenshtein_distance("book", "book") 0 >>> levenshtein_distance("test", "") 4 >>> levenshtein_distance("", "") 0 >>> levenshtein_distance("orchestration", "container") 10 """ # The longer word should come first if len(first_word) < len(second_word): return levenshtein_distance(second_word, first_word) if len(second_word) == 0: return len(first_word) previous_row = list(range(len(second_word) + 1)) for i, c1 in enumerate(first_word): current_row = [i + 1] for j, c2 in enumerate(second_word): # Calculate insertions, deletions, and substitutions insertions = previous_row[j + 1] + 1 deletions = current_row[j] + 1 substitutions = previous_row[j] + (c1 != c2) # Get the minimum to append to the current row current_row.append(min(insertions, deletions, substitutions)) # Store the previous row previous_row = current_row # Returns the last element (distance) return previous_row[-1] def levenshtein_distance_optimized(first_word: str, second_word: str) -> int: """ Compute the Levenshtein distance between two words (strings). The function is optimized for efficiency by modifying rows in place. :param first_word: the first word to measure the difference. :param second_word: the second word to measure the difference. :return: the Levenshtein distance between the two words. Examples: >>> levenshtein_distance_optimized("planet", "planetary") 3 >>> levenshtein_distance_optimized("", "test") 4 >>> levenshtein_distance_optimized("book", "back") 2 >>> levenshtein_distance_optimized("book", "book") 0 >>> levenshtein_distance_optimized("test", "") 4 >>> levenshtein_distance_optimized("", "") 0 >>> levenshtein_distance_optimized("orchestration", "container") 10 """ if len(first_word) < len(second_word): return levenshtein_distance_optimized(second_word, first_word) if len(second_word) == 0: return len(first_word) previous_row = list(range(len(second_word) + 1)) for i, c1 in enumerate(first_word): current_row = [i + 1] + [0] * len(second_word) for j, c2 in enumerate(second_word): insertions = previous_row[j + 1] + 1 deletions = current_row[j] + 1 substitutions = previous_row[j] + (c1 != c2) current_row[j + 1] = min(insertions, deletions, substitutions) previous_row = current_row return previous_row[-1] def benchmark_levenshtein_distance(func: Callable) -> None: """ Benchmark the Levenshtein distance function. :param str: The name of the function being benchmarked. :param func: The function to be benchmarked. """ from timeit import timeit stmt = f"{func.__name__}('sitting', 'kitten')" setup = f"from __main__ import {func.__name__}" number = 25_000 result = timeit(stmt=stmt, setup=setup, number=number) print(f"{func.__name__:<30} finished {number:,} runs in {result:.5f} seconds") if __name__ == "__main__": # Get user input for words first_word = input("Enter the first word for Levenshtein distance:\n").strip() second_word = input("Enter the second word for Levenshtein distance:\n").strip() # Calculate and print Levenshtein distances print(f"{levenshtein_distance(first_word, second_word) = }") print(f"{levenshtein_distance_optimized(first_word, second_word) = }") # Benchmark the Levenshtein distance functions benchmark_levenshtein_distance(levenshtein_distance) benchmark_levenshtein_distance(levenshtein_distance_optimized) ================================================ FILE: strings/lower.py ================================================ def lower(word: str) -> str: """ Will convert the entire string to lowercase letters >>> lower("wow") 'wow' >>> lower("HellZo") 'hellzo' >>> lower("WHAT") 'what' >>> lower("wh[]32") 'wh[]32' >>> lower("whAT") 'what' """ # Converting to ASCII value, obtaining the integer representation # and checking to see if the character is a capital letter. # If it is a capital letter, it is shifted by 32, making it a lowercase letter. return "".join(chr(ord(char) + 32) if "A" <= char <= "Z" else char for char in word) if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: strings/manacher.py ================================================ def palindromic_string(input_string: str) -> str: """ >>> palindromic_string('abbbaba') 'abbba' >>> palindromic_string('ababa') 'ababa' Manacher's algorithm which finds Longest palindromic Substring in linear time. 1. first this convert input_string("xyx") into new_string("x|y|x") where odd positions are actual input characters. 2. for each character in new_string it find corresponding length and store the length and left,right to store previously calculated info. (please look the explanation for details) 3. return corresponding output_string by removing all "|" """ max_length = 0 # if input_string is "aba" than new_input_string become "a|b|a" new_input_string = "" output_string = "" # append each character + "|" in new_string for range(0, length-1) for i in input_string[: len(input_string) - 1]: new_input_string += i + "|" # append last character new_input_string += input_string[-1] # we will store the starting and ending of previous furthest ending palindromic # substring left, right = 0, 0 # length[i] shows the length of palindromic substring with center i length = [1 for i in range(len(new_input_string))] # for each character in new_string find corresponding palindromic string start = 0 for j in range(len(new_input_string)): k = 1 if j > right else min(length[left + right - j] // 2, right - j + 1) while ( j - k >= 0 and j + k < len(new_input_string) and new_input_string[k + j] == new_input_string[j - k] ): k += 1 length[j] = 2 * k - 1 # does this string is ending after the previously explored end (that is right) ? # if yes the update the new right to the last index of this if j + k - 1 > right: left = j - k + 1 right = j + k - 1 # update max_length and start position if max_length < length[j]: max_length = length[j] start = j # create that string s = new_input_string[start - max_length // 2 : start + max_length // 2 + 1] for i in s: if i != "|": output_string += i return output_string if __name__ == "__main__": import doctest doctest.testmod() """ ...a0...a1...a2.....a3......a4...a5...a6.... consider the string for which we are calculating the longest palindromic substring is shown above where ... are some characters in between and right now we are calculating the length of palindromic substring with center at a5 with following conditions : i) we have stored the length of palindromic substring which has center at a3 (starts at left ends at right) and it is the furthest ending till now, and it has ending after a6 ii) a2 and a4 are equally distant from a3 so char(a2) == char(a4) iii) a0 and a6 are equally distant from a3 so char(a0) == char(a6) iv) a1 is corresponding equal character of a5 in palindrome with center a3 (remember that in below derivation of a4==a6) now for a5 we will calculate the length of palindromic substring with center as a5 but can we use previously calculated information in some way? Yes, look the above string we know that a5 is inside the palindrome with center a3 and previously we have calculated that a0==a2 (palindrome of center a1) a2==a4 (palindrome of center a3) a0==a6 (palindrome of center a3) so a4==a6 so we can say that palindrome at center a5 is at least as long as palindrome at center a1 but this only holds if a0 and a6 are inside the limits of palindrome centered at a3 so finally .. len_of_palindrome__at(a5) = min(len_of_palindrome_at(a1), right-a5) where a3 lies from left to right and we have to keep updating that and if the a5 lies outside of left,right boundary we calculate length of palindrome with bruteforce and update left,right. it gives the linear time complexity just like z-function """ ================================================ FILE: strings/min_cost_string_conversion.py ================================================ """ Algorithm for calculating the most cost-efficient sequence for converting one string into another. The only allowed operations are --- Cost to copy a character is copy_cost --- Cost to replace a character is replace_cost --- Cost to delete a character is delete_cost --- Cost to insert a character is insert_cost """ def compute_transform_tables( source_string: str, destination_string: str, copy_cost: int, replace_cost: int, delete_cost: int, insert_cost: int, ) -> tuple[list[list[int]], list[list[str]]]: """ Finds the most cost efficient sequence for converting one string into another. >>> costs, operations = compute_transform_tables("cat", "cut", 1, 2, 3, 3) >>> costs[0][:4] [0, 3, 6, 9] >>> costs[2][:4] [6, 4, 3, 6] >>> operations[0][:4] ['0', 'Ic', 'Iu', 'It'] >>> operations[3][:4] ['Dt', 'Dt', 'Rtu', 'Ct'] >>> compute_transform_tables("", "", 1, 2, 3, 3) ([[0]], [['0']]) """ source_seq = list(source_string) destination_seq = list(destination_string) len_source_seq = len(source_seq) len_destination_seq = len(destination_seq) costs = [ [0 for _ in range(len_destination_seq + 1)] for _ in range(len_source_seq + 1) ] ops = [ ["0" for _ in range(len_destination_seq + 1)] for _ in range(len_source_seq + 1) ] for i in range(1, len_source_seq + 1): costs[i][0] = i * delete_cost ops[i][0] = f"D{source_seq[i - 1]}" for i in range(1, len_destination_seq + 1): costs[0][i] = i * insert_cost ops[0][i] = f"I{destination_seq[i - 1]}" for i in range(1, len_source_seq + 1): for j in range(1, len_destination_seq + 1): if source_seq[i - 1] == destination_seq[j - 1]: costs[i][j] = costs[i - 1][j - 1] + copy_cost ops[i][j] = f"C{source_seq[i - 1]}" else: costs[i][j] = costs[i - 1][j - 1] + replace_cost ops[i][j] = f"R{source_seq[i - 1]}" + str(destination_seq[j - 1]) if costs[i - 1][j] + delete_cost < costs[i][j]: costs[i][j] = costs[i - 1][j] + delete_cost ops[i][j] = f"D{source_seq[i - 1]}" if costs[i][j - 1] + insert_cost < costs[i][j]: costs[i][j] = costs[i][j - 1] + insert_cost ops[i][j] = f"I{destination_seq[j - 1]}" return costs, ops def assemble_transformation(ops: list[list[str]], i: int, j: int) -> list[str]: """ Assembles the transformations based on the ops table. >>> ops = [['0', 'Ic', 'Iu', 'It'], ... ['Dc', 'Cc', 'Iu', 'It'], ... ['Da', 'Da', 'Rau', 'Rat'], ... ['Dt', 'Dt', 'Rtu', 'Ct']] >>> x = len(ops) - 1 >>> y = len(ops[0]) - 1 >>> assemble_transformation(ops, x, y) ['Cc', 'Rau', 'Ct'] >>> ops1 = [['0']] >>> x1 = len(ops1) - 1 >>> y1 = len(ops1[0]) - 1 >>> assemble_transformation(ops1, x1, y1) [] >>> ops2 = [['0', 'I1', 'I2', 'I3'], ... ['D1', 'C1', 'I2', 'I3'], ... ['D2', 'D2', 'R23', 'R23']] >>> x2 = len(ops2) - 1 >>> y2 = len(ops2[0]) - 1 >>> assemble_transformation(ops2, x2, y2) ['C1', 'I2', 'R23'] """ if i == 0 and j == 0: return [] elif ops[i][j][0] in {"C", "R"}: seq = assemble_transformation(ops, i - 1, j - 1) seq.append(ops[i][j]) return seq elif ops[i][j][0] == "D": seq = assemble_transformation(ops, i - 1, j) seq.append(ops[i][j]) return seq else: seq = assemble_transformation(ops, i, j - 1) seq.append(ops[i][j]) return seq if __name__ == "__main__": _, operations = compute_transform_tables("Python", "Algorithms", -1, 1, 2, 2) m = len(operations) n = len(operations[0]) sequence = assemble_transformation(operations, m - 1, n - 1) string = list("Python") i = 0 cost = 0 with open("min_cost.txt", "w") as file: for op in sequence: print("".join(string)) if op[0] == "C": file.write("%-16s" % "Copy %c" % op[1]) # noqa: UP031 file.write("\t\t\t" + "".join(string)) file.write("\r\n") cost -= 1 elif op[0] == "R": string[i] = op[2] file.write("%-16s" % ("Replace %c" % op[1] + " with " + str(op[2]))) # noqa: UP031 file.write("\t\t" + "".join(string)) file.write("\r\n") cost += 1 elif op[0] == "D": string.pop(i) file.write("%-16s" % "Delete %c" % op[1]) # noqa: UP031 file.write("\t\t\t" + "".join(string)) file.write("\r\n") cost += 2 else: string.insert(i, op[1]) file.write("%-16s" % "Insert %c" % op[1]) # noqa: UP031 file.write("\t\t\t" + "".join(string)) file.write("\r\n") cost += 2 i += 1 print("".join(string)) print("Cost: ", cost) file.write("\r\nMinimum cost: " + str(cost)) ================================================ FILE: strings/naive_string_search.py ================================================ """ https://en.wikipedia.org/wiki/String-searching_algorithm#Na%C3%AFve_string_search this algorithm tries to find the pattern from every position of the mainString if pattern is found from position i it add it to the answer and does the same for position i+1 Complexity : O(n*m) n=length of main string m=length of pattern string """ def naive_pattern_search(s: str, pattern: str) -> list: """ >>> naive_pattern_search("ABAAABCDBBABCDDEBCABC", "ABC") [4, 10, 18] >>> naive_pattern_search("ABC", "ABAAABCDBBABCDDEBCABC") [] >>> naive_pattern_search("", "ABC") [] >>> naive_pattern_search("TEST", "TEST") [0] >>> naive_pattern_search("ABCDEGFTEST", "TEST") [7] """ pat_len = len(pattern) position = [] for i in range(len(s) - pat_len + 1): match_found = True for j in range(pat_len): if s[i + j] != pattern[j]: match_found = False break if match_found: position.append(i) return position if __name__ == "__main__": assert naive_pattern_search("ABCDEFG", "DE") == [3] print(naive_pattern_search("ABAAABCDBBABCDDEBCABC", "ABC")) ================================================ FILE: strings/ngram.py ================================================ """ https://en.wikipedia.org/wiki/N-gram """ def create_ngram(sentence: str, ngram_size: int) -> list[str]: """ Create ngrams from a sentence >>> create_ngram("I am a sentence", 2) ['I ', ' a', 'am', 'm ', ' a', 'a ', ' s', 'se', 'en', 'nt', 'te', 'en', 'nc', 'ce'] >>> create_ngram("I am an NLPer", 2) ['I ', ' a', 'am', 'm ', ' a', 'an', 'n ', ' N', 'NL', 'LP', 'Pe', 'er'] >>> create_ngram("This is short", 50) [] """ return [sentence[i : i + ngram_size] for i in range(len(sentence) - ngram_size + 1)] if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: strings/palindrome.py ================================================ # Algorithms to determine if a string is palindrome from timeit import timeit test_data = { "MALAYALAM": True, "String": False, "rotor": True, "level": True, "A": True, "BB": True, "ABC": False, "amanaplanacanalpanama": True, # "a man a plan a canal panama" "abcdba": False, "AB": False, } # Ensure our test data is valid assert all((key == key[::-1]) == value for key, value in test_data.items()) def is_palindrome(s: str) -> bool: """ Return True if s is a palindrome otherwise return False. >>> all(is_palindrome(key) == value for key, value in test_data.items()) True """ start_i = 0 end_i = len(s) - 1 while start_i < end_i: if s[start_i] == s[end_i]: start_i += 1 end_i -= 1 else: return False return True def is_palindrome_traversal(s: str) -> bool: """ Return True if s is a palindrome otherwise return False. >>> all(is_palindrome_traversal(key) == value for key, value in test_data.items()) True """ end = len(s) // 2 n = len(s) # We need to traverse till half of the length of string # as we can get access of the i'th last element from # i'th index. # eg: [0,1,2,3,4,5] => 4th index can be accessed # with the help of 1st index (i==n-i-1) # where n is length of string return all(s[i] == s[n - i - 1] for i in range(end)) def is_palindrome_recursive(s: str) -> bool: """ Return True if s is a palindrome otherwise return False. >>> all(is_palindrome_recursive(key) == value for key, value in test_data.items()) True """ if len(s) <= 1: return True if s[0] == s[len(s) - 1]: return is_palindrome_recursive(s[1:-1]) else: return False def is_palindrome_slice(s: str) -> bool: """ Return True if s is a palindrome otherwise return False. >>> all(is_palindrome_slice(key) == value for key, value in test_data.items()) True """ return s == s[::-1] def benchmark_function(name: str) -> None: stmt = f"all({name}(key) == value for key, value in test_data.items())" setup = f"from __main__ import test_data, {name}" number = 500000 result = timeit(stmt=stmt, setup=setup, number=number) print(f"{name:<35} finished {number:,} runs in {result:.5f} seconds") if __name__ == "__main__": for key, value in test_data.items(): assert is_palindrome(key) == is_palindrome_recursive(key) assert is_palindrome(key) == is_palindrome_slice(key) print(f"{key:21} {value}") print("a man a plan a canal panama") # finished 500,000 runs in 0.46793 seconds benchmark_function("is_palindrome_slice") # finished 500,000 runs in 0.85234 seconds benchmark_function("is_palindrome") # finished 500,000 runs in 1.32028 seconds benchmark_function("is_palindrome_recursive") # finished 500,000 runs in 2.08679 seconds benchmark_function("is_palindrome_traversal") ================================================ FILE: strings/pig_latin.py ================================================ def pig_latin(word: str) -> str: """Compute the piglatin of a given string. https://en.wikipedia.org/wiki/Pig_Latin Usage examples: >>> pig_latin("pig") 'igpay' >>> pig_latin("latin") 'atinlay' >>> pig_latin("banana") 'ananabay' >>> pig_latin("friends") 'iendsfray' >>> pig_latin("smile") 'ilesmay' >>> pig_latin("string") 'ingstray' >>> pig_latin("eat") 'eatway' >>> pig_latin("omelet") 'omeletway' >>> pig_latin("are") 'areway' >>> pig_latin(" ") '' >>> pig_latin(None) '' """ if not (word or "").strip(): return "" word = word.lower() if word[0] in "aeiou": return f"{word}way" for i, char in enumerate(word): # noqa: B007 if char in "aeiou": break return f"{word[i:]}{word[:i]}ay" if __name__ == "__main__": print(f"{pig_latin('friends') = }") word = input("Enter a word: ") print(f"{pig_latin(word) = }") ================================================ FILE: strings/prefix_function.py ================================================ """ https://cp-algorithms.com/string/prefix-function.html Prefix function Knuth-Morris-Pratt algorithm Different algorithm than Knuth-Morris-Pratt pattern finding E.x. Finding longest prefix which is also suffix Time Complexity: O(n) - where n is the length of the string """ def prefix_function(input_string: str) -> list: """ For the given string this function computes value for each index(i), which represents the longest coincidence of prefix and suffix for given substring (input_str[0...i]) For the value of the first element the algorithm always returns 0 >>> prefix_function("aabcdaabc") [0, 1, 0, 0, 0, 1, 2, 3, 4] >>> prefix_function("asdasdad") [0, 0, 0, 1, 2, 3, 4, 0] """ # list for the result values prefix_result = [0] * len(input_string) for i in range(1, len(input_string)): # use last results for better performance - dynamic programming j = prefix_result[i - 1] while j > 0 and input_string[i] != input_string[j]: j = prefix_result[j - 1] if input_string[i] == input_string[j]: j += 1 prefix_result[i] = j return prefix_result def longest_prefix(input_str: str) -> int: """ Prefix-function use case Finding longest prefix which is suffix as well >>> longest_prefix("aabcdaabc") 4 >>> longest_prefix("asdasdad") 4 >>> longest_prefix("abcab") 2 """ # just returning maximum value of the array gives us answer return max(prefix_function(input_str)) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: strings/rabin_karp.py ================================================ # Numbers of alphabet which we call base alphabet_size = 256 # Modulus to hash a string modulus = 1000003 def rabin_karp(pattern: str, text: str) -> bool: """ The Rabin-Karp Algorithm for finding a pattern within a piece of text with complexity O(nm), most efficient when it is used with multiple patterns as it is able to check if any of a set of patterns match a section of text in o(1) given the precomputed hashes. This will be the simple version which only assumes one pattern is being searched for but it's not hard to modify 1) Calculate pattern hash 2) Step through the text one character at a time passing a window with the same length as the pattern calculating the hash of the text within the window compare it with the hash of the pattern. Only testing equality if the hashes match """ p_len = len(pattern) t_len = len(text) if p_len > t_len: return False p_hash = 0 text_hash = 0 modulus_power = 1 # Calculating the hash of pattern and substring of text for i in range(p_len): p_hash = (ord(pattern[i]) + p_hash * alphabet_size) % modulus text_hash = (ord(text[i]) + text_hash * alphabet_size) % modulus if i == p_len - 1: continue modulus_power = (modulus_power * alphabet_size) % modulus for i in range(t_len - p_len + 1): if text_hash == p_hash and text[i : i + p_len] == pattern: return True if i == t_len - p_len: continue # Calculate the https://en.wikipedia.org/wiki/Rolling_hash text_hash = ( (text_hash - ord(text[i]) * modulus_power) * alphabet_size + ord(text[i + p_len]) ) % modulus return False def test_rabin_karp() -> None: """ >>> test_rabin_karp() Success. """ # Test 1) pattern = "abc1abc12" text1 = "alskfjaldsabc1abc1abc12k23adsfabcabc" text2 = "alskfjaldsk23adsfabcabc" assert rabin_karp(pattern, text1) assert not rabin_karp(pattern, text2) # Test 2) pattern = "ABABX" text = "ABABZABABYABABX" assert rabin_karp(pattern, text) # Test 3) pattern = "AAAB" text = "ABAAAAAB" assert rabin_karp(pattern, text) # Test 4) pattern = "abcdabcy" text = "abcxabcdabxabcdabcdabcy" assert rabin_karp(pattern, text) # Test 5) pattern = "Lü" text = "Lüsai" assert rabin_karp(pattern, text) pattern = "Lue" assert not rabin_karp(pattern, text) print("Success.") if __name__ == "__main__": test_rabin_karp() ================================================ FILE: strings/remove_duplicate.py ================================================ def remove_duplicates(sentence: str) -> str: """ Remove duplicates from sentence >>> remove_duplicates("Python is great and Java is also great") 'Java Python also and great is' >>> remove_duplicates("Python is great and Java is also great") 'Java Python also and great is' """ return " ".join(sorted(set(sentence.split()))) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: strings/reverse_letters.py ================================================ def reverse_letters(sentence: str, length: int = 0) -> str: """ Reverse all words that are longer than the given length of characters in a sentence. If ``length`` is not specified, it defaults to 0. >>> reverse_letters("Hey wollef sroirraw", 3) 'Hey fellow warriors' >>> reverse_letters("nohtyP is nohtyP", 2) 'Python is Python' >>> reverse_letters("1 12 123 1234 54321 654321", 0) '1 21 321 4321 12345 123456' >>> reverse_letters("racecar") 'racecar' """ return " ".join( word[::-1] if len(word) > length else word for word in sentence.split() ) if __name__ == "__main__": import doctest doctest.testmod() print(reverse_letters("Hey wollef sroirraw")) ================================================ FILE: strings/reverse_words.py ================================================ def reverse_words(sentence: str) -> str: """Reverse the order of words in a given string. Extra whitespace between words is ignored. >>> reverse_words("I love Python") 'Python love I' >>> reverse_words("I Love Python") 'Python Love I' """ return " ".join(sentence.split()[::-1]) if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: strings/snake_case_to_camel_pascal_case.py ================================================ def snake_to_camel_case(input_str: str, use_pascal: bool = False) -> str: """ Transforms a snake_case given string to camelCase (or PascalCase if indicated) (defaults to not use Pascal) >>> snake_to_camel_case("some_random_string") 'someRandomString' >>> snake_to_camel_case("some_random_string", use_pascal=True) 'SomeRandomString' >>> snake_to_camel_case("some_random_string_with_numbers_123") 'someRandomStringWithNumbers123' >>> snake_to_camel_case("some_random_string_with_numbers_123", use_pascal=True) 'SomeRandomStringWithNumbers123' >>> snake_to_camel_case(123) Traceback (most recent call last): ... ValueError: Expected string as input, found >>> snake_to_camel_case("some_string", use_pascal="True") Traceback (most recent call last): ... ValueError: Expected boolean as use_pascal parameter, found """ if not isinstance(input_str, str): msg = f"Expected string as input, found {type(input_str)}" raise ValueError(msg) if not isinstance(use_pascal, bool): msg = f"Expected boolean as use_pascal parameter, found {type(use_pascal)}" raise ValueError(msg) words = input_str.split("_") start_index = 0 if use_pascal else 1 words_to_capitalize = words[start_index:] capitalized_words = [word[0].upper() + word[1:] for word in words_to_capitalize] initial_word = "" if use_pascal else words[0] return "".join([initial_word, *capitalized_words]) if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: strings/split.py ================================================ def split(string: str, separator: str = " ") -> list: """ Will split the string up into all the values separated by the separator (defaults to spaces) >>> split("apple#banana#cherry#orange",separator='#') ['apple', 'banana', 'cherry', 'orange'] >>> split("Hello there") ['Hello', 'there'] >>> split("11/22/63",separator = '/') ['11', '22', '63'] >>> split("12:43:39",separator = ":") ['12', '43', '39'] >>> split(";abbb;;c;", separator=';') ['', 'abbb', '', 'c', ''] """ split_words = [] last_index = 0 for index, char in enumerate(string): if char == separator: split_words.append(string[last_index:index]) last_index = index + 1 if index + 1 == len(string): split_words.append(string[last_index : index + 1]) return split_words if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: strings/string_switch_case.py ================================================ import re """ general info: https://en.wikipedia.org/wiki/Naming_convention_(programming)#Python_and_Ruby pascal case [ an upper Camel Case ]: https://en.wikipedia.org/wiki/Camel_case camel case: https://en.wikipedia.org/wiki/Camel_case kebab case [ can be found in general info ]: https://en.wikipedia.org/wiki/Naming_convention_(programming)#Python_and_Ruby snake case: https://en.wikipedia.org/wiki/Snake_case """ # assistant functions def split_input(str_: str) -> list: """ >>> split_input("one two 31235three4four") [['one', 'two', '31235three4four']] """ return [char.split() for char in re.split(r"[^ a-z A-Z 0-9 \s]", str_)] def to_simple_case(str_: str) -> str: """ >>> to_simple_case("one two 31235three4four") 'OneTwo31235three4four' >>> to_simple_case("This should be combined") 'ThisShouldBeCombined' >>> to_simple_case("The first letters are capitalized, then string is merged") 'TheFirstLettersAreCapitalizedThenStringIsMerged' >>> to_simple_case("special characters :, ', %, ^, $, are ignored") 'SpecialCharactersAreIgnored' """ string_split = split_input(str_) return "".join( ["".join([char.capitalize() for char in sub_str]) for sub_str in string_split] ) def to_complex_case(text: str, upper: bool, separator: str) -> str: """ Returns the string concatenated with the delimiter we provide. Parameters: @text: The string on which we want to perform operation @upper: Boolean value to determine whether we want capitalized result or not @separator: The delimiter with which we want to concatenate words Examples: >>> to_complex_case("one two 31235three4four", True, "_") 'ONE_TWO_31235THREE4FOUR' >>> to_complex_case("one two 31235three4four", False, "-") 'one-two-31235three4four' """ try: string_split = split_input(text) if upper: res_str = "".join( [ separator.join([char.upper() for char in sub_str]) for sub_str in string_split ] ) else: res_str = "".join( [ separator.join([char.lower() for char in sub_str]) for sub_str in string_split ] ) return res_str except IndexError: return "not valid string" # main content def to_pascal_case(text: str) -> str: """ >>> to_pascal_case("one two 31235three4four") 'OneTwo31235three4four' """ return to_simple_case(text) def to_camel_case(text: str) -> str: """ >>> to_camel_case("one two 31235three4four") 'oneTwo31235three4four' """ try: res_str = to_simple_case(text) return res_str[0].lower() + res_str[1:] except IndexError: return "not valid string" def to_snake_case(text: str, upper: bool) -> str: """ >>> to_snake_case("one two 31235three4four", True) 'ONE_TWO_31235THREE4FOUR' >>> to_snake_case("one two 31235three4four", False) 'one_two_31235three4four' """ return to_complex_case(text, upper, "_") def to_kebab_case(text: str, upper: bool) -> str: """ >>> to_kebab_case("one two 31235three4four", True) 'ONE-TWO-31235THREE4FOUR' >>> to_kebab_case("one two 31235three4four", False) 'one-two-31235three4four' """ return to_complex_case(text, upper, "-") if __name__ == "__main__": __import__("doctest").testmod() ================================================ FILE: strings/strip.py ================================================ def strip(user_string: str, characters: str = " \t\n\r") -> str: """ Remove leading and trailing characters (whitespace by default) from a string. Args: user_string (str): The input string to be stripped. characters (str, optional): Optional characters to be removed (default is whitespace). Returns: str: The stripped string. Examples: >>> strip(" hello ") 'hello' >>> strip("...world...", ".") 'world' >>> strip("123hello123", "123") 'hello' >>> strip("") '' """ start = 0 end = len(user_string) while start < end and user_string[start] in characters: start += 1 while end > start and user_string[end - 1] in characters: end -= 1 return user_string[start:end] ================================================ FILE: strings/text_justification.py ================================================ def text_justification(word: str, max_width: int) -> list: """ Will format the string such that each line has exactly (max_width) characters and is fully (left and right) justified, and return the list of justified text. example 1: string = "This is an example of text justification." max_width = 16 output = ['This is an', 'example of text', 'justification. '] >>> text_justification("This is an example of text justification.", 16) ['This is an', 'example of text', 'justification. '] example 2: string = "Two roads diverged in a yellow wood" max_width = 16 output = ['Two roads', 'diverged in a', 'yellow wood '] >>> text_justification("Two roads diverged in a yellow wood", 16) ['Two roads', 'diverged in a', 'yellow wood '] Time complexity: O(m*n) Space complexity: O(m*n) """ # Converting string into list of strings split by a space words = word.split() def justify(line: list, width: int, max_width: int) -> str: overall_spaces_count = max_width - width words_count = len(line) if len(line) == 1: # if there is only word in line # just insert overall_spaces_count for the remainder of line return line[0] + " " * overall_spaces_count else: spaces_to_insert_between_words = words_count - 1 # num_spaces_between_words_list[i] : tells you to insert # num_spaces_between_words_list[i] spaces # after word on line[i] num_spaces_between_words_list = spaces_to_insert_between_words * [ overall_spaces_count // spaces_to_insert_between_words ] spaces_count_in_locations = ( overall_spaces_count % spaces_to_insert_between_words ) # distribute spaces via round robin to the left words for i in range(spaces_count_in_locations): num_spaces_between_words_list[i] += 1 aligned_words_list = [] for i in range(spaces_to_insert_between_words): # add the word aligned_words_list.append(line[i]) # add the spaces to insert aligned_words_list.append(num_spaces_between_words_list[i] * " ") # just add the last word to the sentence aligned_words_list.append(line[-1]) # join the aligned words list to form a justified line return "".join(aligned_words_list) answer = [] line: list[str] = [] width = 0 for inner_word in words: if width + len(inner_word) + len(line) <= max_width: # keep adding words until we can fill out max_width # width = sum of length of all words (without overall_spaces_count) # len(inner_word) = length of current inner_word # len(line) = number of overall_spaces_count to insert between words line.append(inner_word) width += len(inner_word) else: # justify the line and add it to result answer.append(justify(line, width, max_width)) # reset new line and new width line, width = [inner_word], len(inner_word) remaining_spaces = max_width - width - len(line) answer.append(" ".join(line) + (remaining_spaces + 1) * " ") return answer if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: strings/title.py ================================================ def to_title_case(word: str) -> str: """ Converts a string to capitalized case, preserving the input as is >>> to_title_case("Aakash") 'Aakash' >>> to_title_case("aakash") 'Aakash' >>> to_title_case("AAKASH") 'Aakash' >>> to_title_case("aAkAsH") 'Aakash' """ """ Convert the first character to uppercase if it's lowercase """ if "a" <= word[0] <= "z": word = chr(ord(word[0]) - 32) + word[1:] """ Convert the remaining characters to lowercase if they are uppercase """ for i in range(1, len(word)): if "A" <= word[i] <= "Z": word = word[:i] + chr(ord(word[i]) + 32) + word[i + 1 :] return word def sentence_to_title_case(input_str: str) -> str: """ Converts a string to title case, preserving the input as is >>> sentence_to_title_case("Aakash Giri") 'Aakash Giri' >>> sentence_to_title_case("aakash giri") 'Aakash Giri' >>> sentence_to_title_case("AAKASH GIRI") 'Aakash Giri' >>> sentence_to_title_case("aAkAsH gIrI") 'Aakash Giri' """ return " ".join(to_title_case(word) for word in input_str.split()) if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: strings/top_k_frequent_words.py ================================================ """ Finds the top K most frequent words from the provided word list. This implementation aims to show how to solve the problem using the Heap class already present in this repository. Computing order statistics is, in fact, a typical usage of heaps. This is mostly shown for educational purposes, since the problem can be solved in a few lines using collections.Counter from the Python standard library: from collections import Counter def top_k_frequent_words(words, k_value): return [x[0] for x in Counter(words).most_common(k_value)] """ from collections import Counter from functools import total_ordering from data_structures.heap.heap import Heap @total_ordering class WordCount: def __init__(self, word: str, count: int) -> None: self.word = word self.count = count def __eq__(self, other: object) -> bool: """ >>> WordCount('a', 1).__eq__(WordCount('b', 1)) True >>> WordCount('a', 1).__eq__(WordCount('a', 1)) True >>> WordCount('a', 1).__eq__(WordCount('a', 2)) False >>> WordCount('a', 1).__eq__(WordCount('b', 2)) False >>> WordCount('a', 1).__eq__(1) NotImplemented """ if not isinstance(other, WordCount): return NotImplemented return self.count == other.count def __lt__(self, other: object) -> bool: """ >>> WordCount('a', 1).__lt__(WordCount('b', 1)) False >>> WordCount('a', 1).__lt__(WordCount('a', 1)) False >>> WordCount('a', 1).__lt__(WordCount('a', 2)) True >>> WordCount('a', 1).__lt__(WordCount('b', 2)) True >>> WordCount('a', 2).__lt__(WordCount('a', 1)) False >>> WordCount('a', 2).__lt__(WordCount('b', 1)) False >>> WordCount('a', 1).__lt__(1) NotImplemented """ if not isinstance(other, WordCount): return NotImplemented return self.count < other.count def top_k_frequent_words(words: list[str], k_value: int) -> list[str]: """ Returns the `k_value` most frequently occurring words, in non-increasing order of occurrence. In this context, a word is defined as an element in the provided list. In case `k_value` is greater than the number of distinct words, a value of k equal to the number of distinct words will be considered, instead. >>> top_k_frequent_words(['a', 'b', 'c', 'a', 'c', 'c'], 3) ['c', 'a', 'b'] >>> top_k_frequent_words(['a', 'b', 'c', 'a', 'c', 'c'], 2) ['c', 'a'] >>> top_k_frequent_words(['a', 'b', 'c', 'a', 'c', 'c'], 1) ['c'] >>> top_k_frequent_words(['a', 'b', 'c', 'a', 'c', 'c'], 0) [] >>> top_k_frequent_words([], 1) [] >>> top_k_frequent_words(['a', 'a'], 2) ['a'] """ heap: Heap[WordCount] = Heap() count_by_word = Counter(words) heap.build_max_heap( [WordCount(word, count) for word, count in count_by_word.items()] ) return [heap.extract_max().word for _ in range(min(k_value, len(count_by_word)))] if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: strings/upper.py ================================================ def upper(word: str) -> str: """ Convert an entire string to ASCII uppercase letters by looking for lowercase ASCII letters and subtracting 32 from their integer representation to get the uppercase letter. >>> upper("wow") 'WOW' >>> upper("Hello") 'HELLO' >>> upper("WHAT") 'WHAT' >>> upper("wh[]32") 'WH[]32' """ return "".join(chr(ord(char) - 32) if "a" <= char <= "z" else char for char in word) if __name__ == "__main__": from doctest import testmod testmod() ================================================ FILE: strings/wave_string.py ================================================ def wave(txt: str) -> list: """ Returns a so called 'wave' of a given string >>> wave('cat') ['Cat', 'cAt', 'caT'] >>> wave('one') ['One', 'oNe', 'onE'] >>> wave('book') ['Book', 'bOok', 'boOk', 'booK'] """ return [ txt[:a] + txt[a].upper() + txt[a + 1 :] for a in range(len(txt)) if txt[a].isalpha() ] if __name__ == "__main__": __import__("doctest").testmod() ================================================ FILE: strings/wildcard_pattern_matching.py ================================================ """ Implementation of regular expression matching with support for '.' and '*'. '.' Matches any single character. '*' Matches zero or more of the preceding element. The matching should cover the entire input string (not partial). """ def match_pattern(input_string: str, pattern: str) -> bool: """ uses bottom-up dynamic programming solution for matching the input string with a given pattern. Runtime: O(len(input_string)*len(pattern)) Arguments -------- input_string: str, any string which should be compared with the pattern pattern: str, the string that represents a pattern and may contain '.' for single character matches and '*' for zero or more of preceding character matches Note ---- the pattern cannot start with a '*', because there should be at least one character before * Returns ------- A Boolean denoting whether the given string follows the pattern Examples ------- >>> match_pattern("aab", "c*a*b") True >>> match_pattern("dabc", "*abc") False >>> match_pattern("aaa", "aa") False >>> match_pattern("aaa", "a.a") True >>> match_pattern("aaab", "aa*") False >>> match_pattern("aaab", ".*") True >>> match_pattern("a", "bbbb") False >>> match_pattern("", "bbbb") False >>> match_pattern("a", "") False >>> match_pattern("", "") True """ len_string = len(input_string) + 1 len_pattern = len(pattern) + 1 # dp is a 2d matrix where dp[i][j] denotes whether prefix string of # length i of input_string matches with prefix string of length j of # given pattern. # "dp" stands for dynamic programming. dp = [[0 for i in range(len_pattern)] for j in range(len_string)] # since string of zero length match pattern of zero length dp[0][0] = 1 # since pattern of zero length will never match with string of non-zero length for i in range(1, len_string): dp[i][0] = 0 # since string of zero length will match with pattern where there # is at least one * alternatively for j in range(1, len_pattern): dp[0][j] = dp[0][j - 2] if pattern[j - 1] == "*" else 0 # now using bottom-up approach to find for all remaining lengths for i in range(1, len_string): for j in range(1, len_pattern): if input_string[i - 1] == pattern[j - 1] or pattern[j - 1] == ".": dp[i][j] = dp[i - 1][j - 1] elif pattern[j - 1] == "*": if dp[i][j - 2] == 1: dp[i][j] = 1 elif pattern[j - 2] in (input_string[i - 1], "."): dp[i][j] = dp[i - 1][j] else: dp[i][j] = 0 else: dp[i][j] = 0 return bool(dp[-1][-1]) if __name__ == "__main__": import doctest doctest.testmod() # inputing the strings # input_string = input("input a string :") # pattern = input("input a pattern :") input_string = "aab" pattern = "c*a*b" # using function to check whether given string matches the given pattern if match_pattern(input_string, pattern): print(f"{input_string} matches the given pattern {pattern}") else: print(f"{input_string} does not match with the given pattern {pattern}") ================================================ FILE: strings/word_occurrence.py ================================================ # Created by sarathkaul on 17/11/19 # Modified by Arkadip Bhattacharya(@darkmatter18) on 20/04/2020 from collections import defaultdict def word_occurrence(sentence: str) -> dict: """ >>> from collections import Counter >>> SENTENCE = "a b A b c b d b d e f e g e h e i e j e 0" >>> occurence_dict = word_occurrence(SENTENCE) >>> all(occurence_dict[word] == count for word, count ... in Counter(SENTENCE.split()).items()) True >>> dict(word_occurrence("Two spaces")) {'Two': 1, 'spaces': 1} """ occurrence: defaultdict[str, int] = defaultdict(int) # Creating a dictionary containing count of each word for word in sentence.split(): occurrence[word] += 1 return occurrence if __name__ == "__main__": for word, count in word_occurrence("INPUT STRING").items(): print(f"{word}: {count}") ================================================ FILE: strings/word_patterns.py ================================================ def get_word_pattern(word: str) -> str: """ Returns numerical pattern of character appearances in given word >>> get_word_pattern("") '' >>> get_word_pattern(" ") '0' >>> get_word_pattern("pattern") '0.1.2.2.3.4.5' >>> get_word_pattern("word pattern") '0.1.2.3.4.5.6.7.7.8.2.9' >>> get_word_pattern("get word pattern") '0.1.2.3.4.5.6.7.3.8.9.2.2.1.6.10' >>> get_word_pattern() Traceback (most recent call last): ... TypeError: get_word_pattern() missing 1 required positional argument: 'word' >>> get_word_pattern(1) Traceback (most recent call last): ... AttributeError: 'int' object has no attribute 'upper' >>> get_word_pattern(1.1) Traceback (most recent call last): ... AttributeError: 'float' object has no attribute 'upper' >>> get_word_pattern([]) Traceback (most recent call last): ... AttributeError: 'list' object has no attribute 'upper' """ word = word.upper() next_num = 0 letter_nums = {} word_pattern = [] for letter in word: if letter not in letter_nums: letter_nums[letter] = str(next_num) next_num += 1 word_pattern.append(letter_nums[letter]) return ".".join(word_pattern) if __name__ == "__main__": import pprint import time start_time = time.time() with open("dictionary.txt") as in_file: word_list = in_file.read().splitlines() all_patterns: dict = {} for word in word_list: pattern = get_word_pattern(word) if pattern in all_patterns: all_patterns[pattern].append(word) else: all_patterns[pattern] = [word] with open("word_patterns.txt", "w") as out_file: out_file.write(pprint.pformat(all_patterns)) total_time = round(time.time() - start_time, 2) print(f"Done! {len(all_patterns):,} word patterns found in {total_time} seconds.") # Done! 9,581 word patterns found in 0.58 seconds. ================================================ FILE: strings/words.txt ================================================ A a aa aal aalii aam Aani aardvark aardwolf Aaron Aaronic Aaronical Aaronite Aaronitic Aaru Ab aba Ababdeh Ababua abac abaca abacate abacay abacinate abacination abaciscus abacist aback abactinal abactinally abaction abactor abaculus abacus Abadite abaff abaft abaisance abaiser abaissed abalienate abalienation abalone Abama abampere abandon abandonable abandoned abandonedly abandonee abandoner abandonment Abanic Abantes abaptiston Abarambo Abaris abarthrosis abarticular abarticulation abas abase abased abasedly abasedness abasement abaser Abasgi abash abashed abashedly abashedness abashless abashlessly abashment abasia abasic abask Abassin abastardize abatable abate abatement abater abatis abatised abaton abator abattoir Abatua abature abave abaxial abaxile abaze abb Abba abbacomes abbacy Abbadide abbas abbasi abbassi Abbasside abbatial abbatical abbess abbey abbeystede Abbie abbot abbotcy abbotnullius abbotship abbreviate abbreviately abbreviation abbreviator abbreviatory abbreviature Abby abcoulomb abdal abdat Abderian Abderite abdest abdicable abdicant abdicate abdication abdicative abdicator Abdiel abditive abditory abdomen abdominal Abdominales abdominalian abdominally abdominoanterior abdominocardiac abdominocentesis abdominocystic abdominogenital abdominohysterectomy abdominohysterotomy abdominoposterior abdominoscope abdominoscopy abdominothoracic abdominous abdominovaginal abdominovesical abduce abducens abducent abduct abduction abductor Abe abeam abear abearance abecedarian abecedarium abecedary abed abeigh Abel abele Abelia Abelian Abelicea Abelite abelite Abelmoschus abelmosk Abelonian abeltree Abencerrages abenteric abepithymia Aberdeen aberdevine Aberdonian Aberia aberrance aberrancy aberrant aberrate aberration aberrational aberrator aberrometer aberroscope aberuncator abet abetment abettal abettor abevacuation abey abeyance abeyancy abeyant abfarad abhenry abhiseka abhominable abhor abhorrence abhorrency abhorrent abhorrently abhorrer abhorrible abhorring Abhorson abidal abidance abide abider abidi abiding abidingly abidingness Abie Abies abietate abietene abietic abietin Abietineae abietineous abietinic Abiezer Abigail abigail abigailship abigeat abigeus abilao ability abilla abilo abintestate abiogenesis abiogenesist abiogenetic abiogenetical abiogenetically abiogenist abiogenous abiogeny abiological abiologically abiology abiosis abiotic abiotrophic abiotrophy Abipon abir abirritant abirritate abirritation abirritative abiston Abitibi abiuret abject abjectedness abjection abjective abjectly abjectness abjoint abjudge abjudicate abjudication abjunction abjunctive abjuration abjuratory abjure abjurement abjurer abkar abkari Abkhas Abkhasian ablach ablactate ablactation ablare ablastemic ablastous ablate ablation ablatitious ablatival ablative ablator ablaut ablaze able ableeze ablegate ableness ablepharia ablepharon ablepharous Ablepharus ablepsia ableptical ableptically abler ablest ablewhackets ablins abloom ablow ablude abluent ablush ablution ablutionary abluvion ably abmho Abnaki abnegate abnegation abnegative abnegator Abner abnerval abnet abneural abnormal abnormalism abnormalist abnormality abnormalize abnormally abnormalness abnormity abnormous abnumerable Abo aboard Abobra abode abodement abody abohm aboil abolish abolisher abolishment abolition abolitionary abolitionism abolitionist abolitionize abolla aboma abomasum abomasus abominable abominableness abominably abominate abomination abominator abomine Abongo aboon aborad aboral aborally abord aboriginal aboriginality aboriginally aboriginary aborigine abort aborted aborticide abortient abortifacient abortin abortion abortional abortionist abortive abortively abortiveness abortus abouchement abound abounder abounding aboundingly about abouts above aboveboard abovedeck aboveground aboveproof abovestairs abox abracadabra abrachia abradant abrade abrader Abraham Abrahamic Abrahamidae Abrahamite Abrahamitic abraid Abram Abramis abranchial abranchialism abranchian Abranchiata abranchiate abranchious abrasax abrase abrash abrasiometer abrasion abrasive abrastol abraum abraxas abreact abreaction abreast abrenounce abret abrico abridge abridgeable abridged abridgedly abridger abridgment abrim abrin abristle abroach abroad Abrocoma abrocome abrogable abrogate abrogation abrogative abrogator Abroma Abronia abrook abrotanum abrotine abrupt abruptedly abruption abruptly abruptness Abrus Absalom absampere Absaroka absarokite abscess abscessed abscession abscessroot abscind abscise abscision absciss abscissa abscissae abscisse abscission absconce abscond absconded abscondedly abscondence absconder absconsa abscoulomb absence absent absentation absentee absenteeism absenteeship absenter absently absentment absentmindedly absentness absfarad abshenry Absi absinthe absinthial absinthian absinthiate absinthic absinthin absinthine absinthism absinthismic absinthium absinthol absit absmho absohm absolute absolutely absoluteness absolution absolutism absolutist absolutistic absolutistically absolutive absolutization absolutize absolutory absolvable absolvatory absolve absolvent absolver absolvitor absolvitory absonant absonous absorb absorbability absorbable absorbed absorbedly absorbedness absorbefacient absorbency absorbent absorber absorbing absorbingly absorbition absorpt absorptance absorptiometer absorptiometric absorption absorptive absorptively absorptiveness absorptivity absquatulate abstain abstainer abstainment abstemious abstemiously abstemiousness abstention abstentionist abstentious absterge abstergent abstersion abstersive abstersiveness abstinence abstinency abstinent abstinential abstinently abstract abstracted abstractedly abstractedness abstracter abstraction abstractional abstractionism abstractionist abstractitious abstractive abstractively abstractiveness abstractly abstractness abstractor abstrahent abstricted abstriction abstruse abstrusely abstruseness abstrusion abstrusity absume absumption absurd absurdity absurdly absurdness absvolt Absyrtus abterminal abthain abthainrie abthainry abthanage Abu abu abucco abulia abulic abulomania abuna abundance abundancy abundant Abundantia abundantly abura aburabozu aburban aburst aburton abusable abuse abusedly abusee abuseful abusefully abusefulness abuser abusion abusious abusive abusively abusiveness abut Abuta Abutilon abutment abuttal abutter abutting abuzz abvolt abwab aby abysm abysmal abysmally abyss abyssal Abyssinian abyssobenthonic abyssolith abyssopelagic acacatechin acacatechol acacetin Acacia Acacian acaciin acacin academe academial academian Academic academic academical academically academicals academician academicism academism academist academite academization academize Academus academy Acadia acadialite Acadian Acadie Acaena acajou acaleph Acalepha Acalephae acalephan acalephoid acalycal acalycine acalycinous acalyculate Acalypha Acalypterae Acalyptrata Acalyptratae acalyptrate Acamar acampsia acana acanaceous acanonical acanth acantha Acanthaceae acanthaceous acanthad Acantharia Acanthia acanthial acanthin acanthine acanthion acanthite acanthocarpous Acanthocephala acanthocephalan Acanthocephali acanthocephalous Acanthocereus acanthocladous Acanthodea acanthodean Acanthodei Acanthodes acanthodian Acanthodidae Acanthodii Acanthodini acanthoid Acantholimon acanthological acanthology acantholysis acanthoma Acanthomeridae acanthon Acanthopanax Acanthophis acanthophorous acanthopod acanthopodous acanthopomatous acanthopore acanthopteran Acanthopteri acanthopterous acanthopterygian Acanthopterygii acanthosis acanthous Acanthuridae Acanthurus acanthus acapnia acapnial acapsular acapu acapulco acara Acarapis acardia acardiac acari acarian acariasis acaricidal acaricide acarid Acarida Acaridea acaridean acaridomatium acariform Acarina acarine acarinosis acarocecidium acarodermatitis acaroid acarol acarologist acarology acarophilous acarophobia acarotoxic acarpelous acarpous Acarus Acastus acatalectic acatalepsia acatalepsy acataleptic acatallactic acatamathesia acataphasia acataposis acatastasia acatastatic acate acategorical acatery acatharsia acatharsy acatholic acaudal acaudate acaulescent acauline acaulose acaulous acca accede accedence acceder accelerable accelerando accelerant accelerate accelerated acceleratedly acceleration accelerative accelerator acceleratory accelerograph accelerometer accend accendibility accendible accension accensor accent accentless accentor accentuable accentual accentuality accentually accentuate accentuation accentuator accentus accept acceptability acceptable acceptableness acceptably acceptance acceptancy acceptant acceptation accepted acceptedly accepter acceptilate acceptilation acception acceptive acceptor acceptress accerse accersition accersitor access accessarily accessariness accessary accessaryship accessibility accessible accessibly accession accessional accessioner accessive accessively accessless accessorial accessorily accessoriness accessorius accessory accidence accidency accident accidental accidentalism accidentalist accidentality accidentally accidentalness accidented accidential accidentiality accidently accidia accidie accinge accipient Accipiter accipitral accipitrary Accipitres accipitrine accismus accite acclaim acclaimable acclaimer acclamation acclamator acclamatory acclimatable acclimatation acclimate acclimatement acclimation acclimatizable acclimatization acclimatize acclimatizer acclimature acclinal acclinate acclivitous acclivity acclivous accloy accoast accoil accolade accoladed accolated accolent accolle accombination accommodable accommodableness accommodate accommodately accommodateness accommodating accommodatingly accommodation accommodational accommodative accommodativeness accommodator accompanier accompaniment accompanimental accompanist accompany accompanyist accompletive accomplice accompliceship accomplicity accomplish accomplishable accomplished accomplisher accomplishment accomplisht accompt accord accordable accordance accordancy accordant accordantly accorder according accordingly accordion accordionist accorporate accorporation accost accostable accosted accouche accouchement accoucheur accoucheuse account accountability accountable accountableness accountably accountancy accountant accountantship accounting accountment accouple accouplement accouter accouterment accoy accredit accreditate accreditation accredited accreditment accrementitial accrementition accresce accrescence accrescent accretal accrete accretion accretionary accretive accroach accroides accrual accrue accruement accruer accubation accubitum accubitus accultural acculturate acculturation acculturize accumbency accumbent accumber accumulable accumulate accumulation accumulativ accumulative accumulatively accumulativeness accumulator accuracy accurate accurately accurateness accurse accursed accursedly accursedness accusable accusably accusal accusant accusation accusatival accusative accusatively accusatorial accusatorially accusatory accusatrix accuse accused accuser accusingly accusive accustom accustomed accustomedly accustomedness ace aceacenaphthene aceanthrene aceanthrenequinone acecaffine aceconitic acedia acediamine acediast acedy Aceldama Acemetae Acemetic acenaphthene acenaphthenyl acenaphthylene acentric acentrous aceologic aceology acephal Acephala acephalan Acephali acephalia Acephalina acephaline acephalism acephalist Acephalite acephalocyst acephalous acephalus Acer Aceraceae aceraceous Acerae Acerata acerate Acerates acerathere Aceratherium aceratosis acerb Acerbas acerbate acerbic acerbity acerdol acerin acerose acerous acerra acertannin acervate acervately acervation acervative acervose acervuline acervulus acescence acescency acescent aceship acesodyne Acestes acetabular Acetabularia acetabuliferous acetabuliform acetabulous acetabulum acetacetic acetal acetaldehydase acetaldehyde acetaldehydrase acetalization acetalize acetamide acetamidin acetamidine acetamido acetaminol acetanilid acetanilide acetanion acetaniside acetanisidide acetannin acetarious acetarsone acetate acetated acetation acetbromamide acetenyl acethydrazide acetic acetification acetifier acetify acetimeter acetimetry acetin acetize acetmethylanilide acetnaphthalide acetoacetanilide acetoacetate acetoacetic acetoamidophenol acetoarsenite Acetobacter acetobenzoic acetobromanilide acetochloral acetocinnamene acetoin acetol acetolysis acetolytic acetometer acetometrical acetometrically acetometry acetomorphine acetonaphthone acetonate acetonation acetone acetonemia acetonemic acetonic acetonitrile acetonization acetonize acetonuria acetonurometer acetonyl acetonylacetone acetonylidene acetophenetide acetophenin acetophenine acetophenone acetopiperone acetopyrin acetosalicylic acetose acetosity acetosoluble acetothienone acetotoluide acetotoluidine acetous acetoveratrone acetoxime acetoxyl acetoxyphthalide acetphenetid acetphenetidin acetract acettoluide acetum aceturic acetyl acetylacetonates acetylacetone acetylamine acetylate acetylation acetylator acetylbenzene acetylbenzoate acetylbenzoic acetylbiuret acetylcarbazole acetylcellulose acetylcholine acetylcyanide acetylenation acetylene acetylenediurein acetylenic acetylenyl acetylfluoride acetylglycine acetylhydrazine acetylic acetylide acetyliodide acetylizable acetylization acetylize acetylizer acetylmethylcarbinol acetylperoxide acetylphenol acetylphenylhydrazine acetylrosaniline acetylsalicylate acetylsalol acetyltannin acetylthymol acetyltropeine acetylurea ach Achaean Achaemenian Achaemenid Achaemenidae Achaemenidian Achaenodon Achaeta achaetous achage Achagua Achakzai achalasia Achamoth Achango achar Achariaceae Achariaceous achate Achates Achatina Achatinella Achatinidae ache acheilia acheilous acheiria acheirous acheirus Achen achene achenial achenium achenocarp achenodium acher Achernar Acheronian Acherontic Acherontical achete Achetidae Acheulean acheweed achievable achieve achievement achiever achigan achilary achill Achillea Achillean Achilleid achilleine Achillize achillobursitis achillodynia achime Achimenes Achinese aching achingly achira Achitophel achlamydate Achlamydeae achlamydeous achlorhydria achlorophyllous achloropsia Achmetha acholia acholic Acholoe acholous acholuria acholuric Achomawi achondrite achondritic achondroplasia achondroplastic achor achordal Achordata achordate Achorion Achras achree achroacyte Achroanthes achrodextrin achrodextrinase achroglobin achroiocythaemia achroiocythemia achroite achroma achromacyte achromasia achromat achromate Achromatiaceae achromatic achromatically achromaticity achromatin achromatinic achromatism Achromatium achromatizable achromatization achromatize achromatocyte achromatolysis achromatope achromatophile achromatopia achromatopsia achromatopsy achromatosis achromatous achromaturia achromia achromic Achromobacter Achromobacterieae achromoderma achromophilous achromotrichia achromous achronical achroodextrin achroodextrinase achroous achropsia achtehalber achtel achtelthaler Achuas achy achylia achylous achymia achymous Achyranthes Achyrodes acichloride acicula acicular acicularly aciculate aciculated aciculum acid Acidanthera Acidaspis acidemia acider acidic acidiferous acidifiable acidifiant acidific acidification acidifier acidify acidimeter acidimetric acidimetrical acidimetrically acidimetry acidite acidity acidize acidly acidness acidoid acidology acidometer acidometry acidophile acidophilic acidophilous acidoproteolytic acidosis acidosteophyte acidotic acidproof acidulate acidulent acidulous aciduric acidyl acier acierage Acieral acierate acieration aciform aciliate aciliated Acilius acinaceous acinaces acinacifolious acinaciform acinar acinarious acinary Acineta Acinetae acinetan Acinetaria acinetarian acinetic acinetiform Acinetina acinetinan acinic aciniform acinose acinotubular acinous acinus Acipenser Acipenseres acipenserid Acipenseridae acipenserine acipenseroid Acipenseroidei Acis aciurgy acker ackey ackman acknow acknowledge acknowledgeable acknowledged acknowledgedly acknowledger aclastic acle acleidian acleistous Aclemon aclidian aclinal aclinic acloud aclys Acmaea Acmaeidae acmatic acme acmesthesia acmic Acmispon acmite acne acneform acneiform acnemia Acnida acnodal acnode Acocanthera acocantherin acock acockbill acocotl Acoela Acoelomata acoelomate acoelomatous Acoelomi acoelomous acoelous Acoemetae Acoemeti Acoemetic acoin acoine Acolapissa acold Acolhua Acolhuan acologic acology acolous acoluthic acolyte acolythate Acoma acoma acomia acomous aconative acondylose acondylous acone aconic aconin aconine aconital aconite aconitia aconitic aconitin aconitine Aconitum Acontias acontium Acontius aconuresis acopic acopon acopyrin acopyrine acor acorea acoria acorn acorned Acorus acosmic acosmism acosmist acosmistic acotyledon acotyledonous acouasm acouchi acouchy acoumeter acoumetry acouometer acouophonia acoupa acousmata acousmatic acoustic acoustical acoustically acoustician acousticolateral Acousticon acoustics acquaint acquaintance acquaintanceship acquaintancy acquaintant acquainted acquaintedness acquest acquiesce acquiescement acquiescence acquiescency acquiescent acquiescently acquiescer acquiescingly acquirability acquirable acquire acquired acquirement acquirenda acquirer acquisible acquisite acquisited acquisition acquisitive acquisitively acquisitiveness acquisitor acquisitum acquist acquit acquitment acquittal acquittance acquitter Acrab acracy acraein Acraeinae acraldehyde Acrania acranial acraniate acrasia Acrasiaceae Acrasiales Acrasida Acrasieae Acraspeda acraspedote acratia acraturesis acrawl acraze acre acreable acreage acreak acream acred Acredula acreman acrestaff acrid acridan acridian acridic Acrididae Acridiidae acridine acridinic acridinium acridity Acridium acridly acridness acridone acridonium acridophagus acridyl acriflavin acriflavine acrimonious acrimoniously acrimoniousness acrimony acrindoline acrinyl acrisia Acrisius Acrita acritan acrite acritical acritol Acroa acroaesthesia acroama acroamatic acroamatics acroanesthesia acroarthritis acroasphyxia acroataxia acroatic acrobacy acrobat Acrobates acrobatholithic acrobatic acrobatical acrobatically acrobatics acrobatism acroblast acrobryous acrobystitis Acrocarpi acrocarpous acrocephalia acrocephalic acrocephalous acrocephaly Acrocera Acroceratidae Acroceraunian Acroceridae Acrochordidae Acrochordinae acrochordon Acroclinium Acrocomia acroconidium acrocontracture acrocoracoid acrocyanosis acrocyst acrodactylum acrodermatitis acrodont acrodontism acrodrome acrodromous Acrodus acrodynia acroesthesia acrogamous acrogamy acrogen acrogenic acrogenous acrogenously acrography Acrogynae acrogynae acrogynous acrolein acrolith acrolithan acrolithic acrologic acrologically acrologism acrologue acrology acromania acromastitis acromegalia acromegalic acromegaly acromelalgia acrometer acromial acromicria acromioclavicular acromiocoracoid acromiodeltoid acromiohumeral acromiohyoid acromion acromioscapular acromiosternal acromiothoracic acromonogrammatic acromphalus Acromyodi acromyodian acromyodic acromyodous acromyotonia acromyotonus acron acronarcotic acroneurosis acronical acronically acronyc acronych Acronycta acronyctous acronym acronymic acronymize acronymous acronyx acrook acroparalysis acroparesthesia acropathology acropathy acropetal acropetally acrophobia acrophonetic acrophonic acrophony acropodium acropoleis acropolis acropolitan Acropora acrorhagus acrorrheuma acrosarc acrosarcum acroscleriasis acroscleroderma acroscopic acrose acrosome acrosphacelus acrospire acrospore acrosporous across acrostic acrostical acrostically acrostichal Acrosticheae acrostichic acrostichoid Acrostichum acrosticism acrostolion acrostolium acrotarsial acrotarsium acroteleutic acroterial acroteric acroterium Acrothoracica acrotic acrotism acrotomous Acrotreta Acrotretidae acrotrophic acrotrophoneurosis Acrux Acrydium acryl acrylaldehyde acrylate acrylic acrylonitrile acrylyl act acta actability actable Actaea Actaeaceae Actaeon Actaeonidae Actiad Actian actification actifier actify actin actinal actinally actinautographic actinautography actine actinenchyma acting Actinia actinian Actiniaria actiniarian actinic actinically Actinidia Actinidiaceae actiniferous actiniform actinine actiniochrome actiniohematin Actiniomorpha actinism Actinistia actinium actinobacillosis Actinobacillus actinoblast actinobranch actinobranchia actinocarp actinocarpic actinocarpous actinochemistry actinocrinid Actinocrinidae actinocrinite Actinocrinus actinocutitis actinodermatitis actinodielectric actinodrome actinodromous actinoelectric actinoelectrically actinoelectricity actinogonidiate actinogram actinograph actinography actinoid Actinoida Actinoidea actinolite actinolitic actinologous actinologue actinology actinomere actinomeric actinometer actinometric actinometrical actinometry actinomorphic actinomorphous actinomorphy Actinomyces Actinomycetaceae Actinomycetales actinomycete actinomycetous actinomycin actinomycoma actinomycosis actinomycotic Actinomyxidia Actinomyxidiida actinon Actinonema actinoneuritis actinophone actinophonic actinophore actinophorous actinophryan Actinophrys Actinopoda actinopraxis actinopteran Actinopteri actinopterous actinopterygian Actinopterygii actinopterygious actinoscopy actinosoma actinosome Actinosphaerium actinost actinostereoscopy actinostomal actinostome actinotherapeutic actinotherapeutics actinotherapy actinotoxemia actinotrichium actinotrocha actinouranium Actinozoa actinozoal actinozoan actinozoon actinula action actionable actionably actional actionary actioner actionize actionless Actipylea Actium activable activate activation activator active actively activeness activin activism activist activital activity activize actless actomyosin acton actor actorship actress Acts actu actual actualism actualist actualistic actuality actualization actualize actually actualness actuarial actuarially actuarian actuary actuaryship actuation actuator acture acturience actutate acuaesthesia Acuan acuate acuation Acubens acuclosure acuductor acuesthesia acuity aculea Aculeata aculeate aculeated aculeiform aculeolate aculeolus aculeus acumen acuminate acumination acuminose acuminous acuminulate acupress acupressure acupunctuate acupunctuation acupuncturation acupuncturator acupuncture acurative acushla acutangular acutate acute acutely acutenaculum acuteness acutiator acutifoliate Acutilinguae acutilingual acutilobate acutiplantar acutish acutograve acutonodose acutorsion acyanoblepsia acyanopsia acyclic acyesis acyetic acyl acylamido acylamidobenzene acylamino acylate acylation acylogen acyloin acyloxy acyloxymethane acyrological acyrology acystia ad Ada adactyl adactylia adactylism adactylous Adad adad adage adagial adagietto adagio Adai Adaize Adam adamant adamantean adamantine adamantinoma adamantoblast adamantoblastoma adamantoid adamantoma adamas Adamastor adambulacral adamellite Adamhood Adamic Adamical Adamically adamine Adamite adamite Adamitic Adamitical Adamitism Adamsia adamsite adance adangle Adansonia Adapa adapid Adapis adapt adaptability adaptable adaptation adaptational adaptationally adaptative adaptedness adapter adaption adaptional adaptionism adaptitude adaptive adaptively adaptiveness adaptometer adaptor adaptorial Adar adarme adat adati adatom adaunt adaw adawe adawlut adawn adaxial aday adays adazzle adcraft add Adda adda addability addable addax addebted added addedly addend addenda addendum adder adderbolt adderfish adderspit adderwort addibility addible addicent addict addicted addictedness addiction Addie addiment Addisonian Addisoniana additament additamentary addition additional additionally additionary additionist addititious additive additively additivity additory addle addlebrain addlebrained addlehead addleheaded addleheadedly addleheadedness addlement addleness addlepate addlepated addlepatedness addleplot addlings addlins addorsed address addressee addresser addressful Addressograph addressor addrest Addu adduce adducent adducer adducible adduct adduction adductive adductor Addy Ade ade adead adeem adeep Adela Adelaide Adelarthra Adelarthrosomata adelarthrosomatous Adelbert Adelea Adeleidae Adelges Adelia Adelina Adeline adeling adelite Adeliza adelocerous Adelochorda adelocodonic adelomorphic adelomorphous adelopod Adelops Adelphi Adelphian adelphogamy Adelphoi adelpholite adelphophagy ademonist adempted ademption adenalgia adenalgy Adenanthera adenase adenasthenia adendric adendritic adenectomy adenectopia adenectopic adenemphractic adenemphraxis adenia adeniform adenine adenitis adenization adenoacanthoma adenoblast adenocancroid adenocarcinoma adenocarcinomatous adenocele adenocellulitis adenochondroma adenochondrosarcoma adenochrome adenocyst adenocystoma adenocystomatous adenodermia adenodiastasis adenodynia adenofibroma adenofibrosis adenogenesis adenogenous adenographer adenographic adenographical adenography adenohypersthenia adenoid adenoidal adenoidism adenoliomyofibroma adenolipoma adenolipomatosis adenologaditis adenological adenology adenolymphocele adenolymphoma adenoma adenomalacia adenomatome adenomatous adenomeningeal adenometritis adenomycosis adenomyofibroma adenomyoma adenomyxoma adenomyxosarcoma adenoncus adenoneural adenoneure adenopathy adenopharyngeal adenopharyngitis adenophlegmon Adenophora adenophore adenophorous adenophthalmia adenophyllous adenophyma adenopodous adenosarcoma adenosclerosis adenose adenosine adenosis adenostemonous Adenostoma adenotome adenotomic adenotomy adenotyphoid adenotyphus adenyl adenylic Adeodatus Adeona Adephaga adephagan adephagia adephagous adept adeptness adeptship adequacy adequate adequately adequateness adequation adequative adermia adermin Adessenarian adet adevism adfected adfix adfluxion adglutinate Adhafera adhaka adhamant Adhara adharma adhere adherence adherency adherent adherently adherer adherescence adherescent adhesion adhesional adhesive adhesively adhesivemeter adhesiveness adhibit adhibition adiabatic adiabatically adiabolist adiactinic adiadochokinesis adiagnostic adiantiform Adiantum adiaphon adiaphonon adiaphoral adiaphoresis adiaphoretic adiaphorism adiaphorist adiaphoristic adiaphorite adiaphoron adiaphorous adiate adiathermal adiathermancy adiathermanous adiathermic adiathetic adiation Adib Adicea adicity Adiel adieu adieux Adigei Adighe Adigranth adigranth Adin Adinida adinidan adinole adion adipate adipescent adipic adipinic adipocele adipocellulose adipocere adipoceriform adipocerous adipocyte adipofibroma adipogenic adipogenous adipoid adipolysis adipolytic adipoma adipomatous adipometer adipopexia adipopexis adipose adiposeness adiposis adiposity adiposogenital adiposuria adipous adipsia adipsic adipsous adipsy adipyl Adirondack adit adital aditus adjacency adjacent adjacently adjag adject adjection adjectional adjectival adjectivally adjective adjectively adjectivism adjectivitis adjiger adjoin adjoined adjoinedly adjoining adjoint adjourn adjournal adjournment adjudge adjudgeable adjudger adjudgment adjudicate adjudication adjudicative adjudicator adjudicature adjunct adjunction adjunctive adjunctively adjunctly adjuration adjuratory adjure adjurer adjust adjustable adjustably adjustage adjustation adjuster adjustive adjustment adjutage adjutancy adjutant adjutantship adjutorious adjutory adjutrice adjuvant Adlai adlay adless adlet Adlumia adlumidine adlumine adman admarginate admaxillary admeasure admeasurement admeasurer admedial admedian admensuration admi adminicle adminicula adminicular adminiculary adminiculate adminiculation adminiculum administer administerd administerial administrable administrant administrate administration administrational administrative administratively administrator administratorship administratress administratrices administratrix admirability admirable admirableness admirably admiral admiralship admiralty admiration admirative admirator admire admired admiredly admirer admiring admiringly admissibility admissible admissibleness admissibly admission admissive admissory admit admittable admittance admitted admittedly admittee admitter admittible admix admixtion admixture admonish admonisher admonishingly admonishment admonition admonitioner admonitionist admonitive admonitively admonitor admonitorial admonitorily admonitory admonitrix admortization adnascence adnascent adnate adnation adnephrine adnerval adneural adnex adnexal adnexed adnexitis adnexopexy adnominal adnominally adnomination adnoun ado adobe adolesce adolescence adolescency adolescent adolescently Adolph Adolphus Adonai Adonean Adonia Adoniad Adonian Adonic adonidin adonin Adoniram Adonis adonite adonitol adonize adoperate adoperation adopt adoptability adoptable adoptant adoptative adopted adoptedly adoptee adopter adoptian adoptianism adoptianist adoption adoptional adoptionism adoptionist adoptious adoptive adoptively adorability adorable adorableness adorably adoral adorally adorant Adorantes adoration adoratory adore adorer Adoretus adoringly adorn adorner adorningly adornment adosculation adossed adoulie adown Adoxa Adoxaceae adoxaceous adoxography adoxy adoze adpao adpress adpromission adradial adradially adradius Adramelech Adrammelech adread adream adreamed adreamt adrectal adrenal adrenalectomize adrenalectomy Adrenalin adrenaline adrenalize adrenalone adrenergic adrenin adrenine adrenochrome adrenocortical adrenocorticotropic adrenolysis adrenolytic adrenotropic Adrian Adriana Adriatic Adrienne adrift adrip adroit adroitly adroitness adroop adrop adrostral adrowse adrue adry adsbud adscendent adscititious adscititiously adscript adscripted adscription adscriptitious adscriptitius adscriptive adsessor adsheart adsignification adsignify adsmith adsmithing adsorb adsorbable adsorbate adsorbent adsorption adsorptive adstipulate adstipulation adstipulator adterminal adtevac adular adularescence adularia adulate adulation adulator adulatory adulatress Adullam Adullamite adult adulter adulterant adulterate adulterately adulterateness adulteration adulterator adulterer adulteress adulterine adulterize adulterous adulterously adultery adulthood adulticidal adulticide adultness adultoid adumbral adumbrant adumbrate adumbration adumbrative adumbratively adunc aduncate aduncated aduncity aduncous adusk adust adustion adustiosis Advaita advance advanceable advanced advancedness advancement advancer advancing advancingly advancive advantage advantageous advantageously advantageousness advection advectitious advective advehent advene advenience advenient Advent advential Adventism Adventist adventitia adventitious adventitiously adventitiousness adventive adventual adventure adventureful adventurement adventurer adventureship adventuresome adventuresomely adventuresomeness adventuress adventurish adventurous adventurously adventurousness adverb adverbial adverbiality adverbialize adverbially adverbiation adversant adversaria adversarious adversary adversative adversatively adverse adversely adverseness adversifoliate adversifolious adversity advert advertence advertency advertent advertently advertisable advertise advertisee advertisement advertiser advertising advice adviceful advisability advisable advisableness advisably advisal advisatory advise advised advisedly advisedness advisee advisement adviser advisership advisive advisiveness advisor advisorily advisory advocacy advocate advocateship advocatess advocation advocator advocatory advocatress advocatrice advocatrix advolution advowee advowson ady adynamia adynamic adynamy adyta adyton adytum adz adze adzer adzooks ae Aeacides Aeacus Aeaean Aechmophorus aecial Aecidiaceae aecidial aecidioform Aecidiomycetes aecidiospore aecidiostage aecidium aeciospore aeciostage aecioteliospore aeciotelium aecium aedeagus Aedes aedicula aedile aedileship aedilian aedilic aedilitian aedility aedoeagus aefald aefaldness aefaldy aefauld aegagropila aegagropile aegagrus Aegean aegerian aegeriid Aegeriidae Aegialitis aegicrania Aegina Aeginetan Aeginetic Aegipan aegirine aegirinolite aegirite aegis Aegisthus Aegithalos Aegithognathae aegithognathism aegithognathous Aegle Aegopodium aegrotant aegyptilla aegyrite aeluroid Aeluroidea aelurophobe aelurophobia aeluropodous aenach aenean aeneolithic aeneous aenigmatite aeolharmonica Aeolia Aeolian Aeolic Aeolicism aeolid Aeolidae Aeolididae aeolina aeoline aeolipile Aeolis Aeolism Aeolist aeolistic aeolodicon aeolodion aeolomelodicon aeolopantalon aeolotropic aeolotropism aeolotropy aeolsklavier aeon aeonial aeonian aeonist Aepyceros Aepyornis Aepyornithidae Aepyornithiformes Aequi Aequian Aequiculi Aequipalpia aequoreal aer aerage aerarian aerarium aerate aeration aerator aerenchyma aerenterectasia aerial aerialist aeriality aerially aerialness aeric aerical Aerides aerie aeried aerifaction aeriferous aerification aeriform aerify aero Aerobacter aerobate aerobatic aerobatics aerobe aerobian aerobic aerobically aerobiologic aerobiological aerobiologically aerobiologist aerobiology aerobion aerobiont aerobioscope aerobiosis aerobiotic aerobiotically aerobious aerobium aeroboat Aerobranchia aerobranchiate aerobus aerocamera aerocartograph Aerocharidae aerocolpos aerocraft aerocurve aerocyst aerodermectasia aerodone aerodonetic aerodonetics aerodrome aerodromics aerodynamic aerodynamical aerodynamicist aerodynamics aerodyne aeroembolism aeroenterectasia aerofoil aerogel aerogen aerogenes aerogenesis aerogenic aerogenically aerogenous aerogeologist aerogeology aerognosy aerogram aerograph aerographer aerographic aerographical aerographics aerography aerogun aerohydrodynamic aerohydropathy aerohydroplane aerohydrotherapy aerohydrous aeroides aerolite aerolith aerolithology aerolitic aerolitics aerologic aerological aerologist aerology aeromaechanic aeromancer aeromancy aeromantic aeromarine aeromechanical aeromechanics aerometeorograph aerometer aerometric aerometry aeromotor aeronat aeronaut aeronautic aeronautical aeronautically aeronautics aeronautism aeronef aeroneurosis aeropathy Aerope aeroperitoneum aeroperitonia aerophagia aerophagist aerophagy aerophane aerophilatelic aerophilatelist aerophilately aerophile aerophilic aerophilous aerophobia aerophobic aerophone aerophor aerophore aerophotography aerophysical aerophysics aerophyte aeroplane aeroplaner aeroplanist aeropleustic aeroporotomy aeroscepsis aeroscepsy aeroscope aeroscopic aeroscopically aeroscopy aerose aerosiderite aerosiderolite Aerosol aerosol aerosphere aerosporin aerostat aerostatic aerostatical aerostatics aerostation aerosteam aerotactic aerotaxis aerotechnical aerotherapeutics aerotherapy aerotonometer aerotonometric aerotonometry aerotropic aerotropism aeroyacht aeruginous aerugo aery aes Aeschylean Aeschynanthus Aeschynomene aeschynomenous Aesculaceae aesculaceous Aesculapian Aesculapius Aesculus Aesopian Aesopic aesthete aesthetic aesthetical aesthetically aesthetician aestheticism aestheticist aestheticize aesthetics aesthiology aesthophysiology Aestii aethalioid aethalium aetheogam aetheogamic aetheogamous aethered Aethionema aethogen aethrioscope Aethusa Aetian aetiogenic aetiotropic aetiotropically Aetobatidae Aetobatus Aetolian Aetomorphae aetosaur aetosaurian Aetosaurus aevia aface afaint Afar afar afara afear afeard afeared afebrile Afenil afernan afetal affa affability affable affableness affably affabrous affair affaite affect affectable affectate affectation affectationist affected affectedly affectedness affecter affectibility affectible affecting affectingly affection affectional affectionally affectionate affectionately affectionateness affectioned affectious affective affectively affectivity affeer affeerer affeerment affeir affenpinscher affenspalte afferent affettuoso affiance affiancer affiant affidation affidavit affidavy affiliable affiliate affiliation affinal affination affine affined affinely affinitative affinitatively affinite affinition affinitive affinity affirm affirmable affirmably affirmance affirmant affirmation affirmative affirmatively affirmatory affirmer affirmingly affix affixal affixation affixer affixion affixture afflation afflatus afflict afflicted afflictedness afflicter afflicting afflictingly affliction afflictionless afflictive afflictively affluence affluent affluently affluentness afflux affluxion afforce afforcement afford affordable afforest afforestable afforestation afforestment afformative affranchise affranchisement affray affrayer affreight affreighter affreightment affricate affricated affrication affricative affright affrighted affrightedly affrighter affrightful affrightfully affrightingly affrightment affront affronte affronted affrontedly affrontedness affronter affronting affrontingly affrontingness affrontive affrontiveness affrontment affuse affusion affy Afghan afghani afield Afifi afikomen afire aflagellar aflame aflare aflat aflaunt aflicker aflight afloat aflow aflower afluking aflush aflutter afoam afoot afore aforehand aforenamed aforesaid aforethought aforetime aforetimes afortiori afoul afraid afraidness Aframerican Afrasia Afrasian afreet afresh afret Afric African Africana Africanism Africanist Africanization Africanize Africanoid Africanthropus Afridi Afrikaans Afrikander Afrikanderdom Afrikanderism Afrikaner Afrogaea Afrogaean afront afrown Afshah Afshar aft aftaba after afteract afterage afterattack afterband afterbeat afterbirth afterblow afterbody afterbrain afterbreach afterbreast afterburner afterburning aftercare aftercareer aftercast aftercataract aftercause afterchance afterchrome afterchurch afterclap afterclause aftercome aftercomer aftercoming aftercooler aftercost aftercourse aftercrop aftercure afterdamp afterdate afterdays afterdeck afterdinner afterdrain afterdrops aftereffect afterend aftereye afterfall afterfame afterfeed afterfermentation afterform afterfriend afterfruits afterfuture aftergame aftergas afterglide afterglow aftergo aftergood aftergrass aftergrave aftergrief aftergrind aftergrowth afterguard afterguns afterhand afterharm afterhatch afterhelp afterhend afterhold afterhope afterhours afterimage afterimpression afterings afterking afterknowledge afterlife afterlifetime afterlight afterloss afterlove aftermark aftermarriage aftermass aftermast aftermath aftermatter aftermeal aftermilk aftermost afternight afternoon afternoons afternose afternote afteroar afterpain afterpart afterpast afterpeak afterpiece afterplanting afterplay afterpressure afterproof afterrake afterreckoning afterrider afterripening afterroll afterschool aftersend aftersensation aftershaft aftershafted aftershine aftership aftershock aftersong aftersound afterspeech afterspring afterstain afterstate afterstorm afterstrain afterstretch afterstudy afterswarm afterswarming afterswell aftertan aftertask aftertaste afterthinker afterthought afterthoughted afterthrift aftertime aftertimes aftertouch aftertreatment aftertrial afterturn aftervision afterwale afterwar afterward afterwards afterwash afterwhile afterwisdom afterwise afterwit afterwitted afterwork afterworking afterworld afterwrath afterwrist aftmost Aftonian aftosa aftward aftwards afunction afunctional afwillite Afzelia aga agabanee agacante agacella Agaces Agade Agag again against againstand agal agalactia agalactic agalactous agalawood agalaxia agalaxy Agalena Agalenidae Agalinis agalite agalloch agallochum agallop agalma agalmatolite agalwood Agama agama Agamae Agamemnon agamete agami agamian agamic agamically agamid Agamidae agamobium agamogenesis agamogenetic agamogenetically agamogony agamoid agamont agamospore agamous agamy aganglionic Aganice Aganippe Agao Agaonidae Agapanthus agape Agapemone Agapemonian Agapemonist Agapemonite agapetae agapeti agapetid Agapetidae Agapornis agar agaric agaricaceae agaricaceous Agaricales agaricic agariciform agaricin agaricine agaricoid Agaricus Agaristidae agarita Agarum agarwal agasp Agastache Agastreae agastric agastroneuria agate agateware Agatha Agathaea Agathaumas agathin Agathis agathism agathist agathodaemon agathodaemonic agathokakological agathology Agathosma agatiferous agatiform agatine agatize agatoid agaty Agau Agave agavose Agawam Agaz agaze agazed Agdistis age aged agedly agedness agee Agelacrinites Agelacrinitidae Agelaius Agelaus ageless agelessness agelong agen Agena agency agenda agendum agenesia agenesic agenesis agennetic agent agentess agential agentival agentive agentry agentship ageometrical ager Ageratum ageusia ageusic ageustia agger aggerate aggeration aggerose Aggie agglomerant agglomerate agglomerated agglomeratic agglomeration agglomerative agglomerator agglutinability agglutinable agglutinant agglutinate agglutination agglutinationist agglutinative agglutinator agglutinin agglutinize agglutinogen agglutinogenic agglutinoid agglutinoscope agglutogenic aggradation aggradational aggrade aggrandizable aggrandize aggrandizement aggrandizer aggrate aggravate aggravating aggravatingly aggravation aggravative aggravator aggregable aggregant Aggregata Aggregatae aggregate aggregately aggregateness aggregation aggregative aggregator aggregatory aggress aggressin aggression aggressionist aggressive aggressively aggressiveness aggressor aggrievance aggrieve aggrieved aggrievedly aggrievedness aggrievement aggroup aggroupment aggry aggur agha Aghan aghanee aghast aghastness Aghlabite Aghorapanthi Aghori Agialid Agib Agiel agilawood agile agilely agileness agility agillawood aging agio agiotage agist agistator agistment agistor agitable agitant agitate agitatedly agitation agitational agitationist agitative agitator agitatorial agitatrix agitprop Agkistrodon agla Aglaia aglance Aglaonema Aglaos aglaozonia aglare Aglaspis Aglauros agleaf agleam aglet aglethead agley aglimmer aglint Aglipayan Aglipayano aglitter aglobulia Aglossa aglossal aglossate aglossia aglow aglucon aglutition aglycosuric Aglypha aglyphodont Aglyphodonta Aglyphodontia aglyphous agmatine agmatology agminate agminated agnail agname agnamed agnate Agnatha agnathia agnathic Agnathostomata agnathostomatous agnathous agnatic agnatically agnation agnel Agnes agnification agnize Agnoetae Agnoete Agnoetism agnoiology Agnoite agnomen agnomical agnominal agnomination agnosia agnosis agnostic agnostically agnosticism Agnostus agnosy Agnotozoic agnus ago agog agoge agogic agogics agoho agoing agomensin agomphiasis agomphious agomphosis agon agonal agone agoniada agoniadin agoniatite Agoniatites agonic agonied agonist Agonista agonistarch agonistic agonistically agonistics agonium agonize agonizedly agonizer agonizingly Agonostomus agonothete agonothetic agony agora agoranome agoraphobia agouara agouta agouti agpaite agpaitic Agra agraffee agrah agral agrammatical agrammatism Agrania agranulocyte agranulocytosis agranuloplastic Agrapha agraphia agraphic agrarian agrarianism agrarianize agrarianly Agrauleum agre agree agreeability agreeable agreeableness agreeably agreed agreeing agreeingly agreement agreer agregation agrege agrestal agrestial agrestian agrestic agria agricere agricole agricolist agricolite agricolous agricultor agricultural agriculturalist agriculturally agriculture agriculturer agriculturist Agrilus Agrimonia agrimony agrimotor agrin Agriochoeridae Agriochoerus agriological agriologist agriology Agrionia agrionid Agrionidae Agriotes Agriotypidae Agriotypus agrise agrito agroan agrobiologic agrobiological agrobiologically agrobiologist agrobiology agrogeological agrogeologically agrogeology agrologic agrological agrologically agrology agrom Agromyza agromyzid Agromyzidae agronome agronomial agronomic agronomical agronomics agronomist agronomy agroof agrope Agropyron Agrostemma agrosteral Agrostis agrostographer agrostographic agrostographical agrostography agrostologic agrostological agrostologist agrostology agrotechny Agrotis aground agrufe agruif agrypnia agrypnotic agsam agua aguacate Aguacateca aguavina Agudist ague aguelike agueproof agueweed aguey aguilarite aguilawood aguinaldo aguirage aguish aguishly aguishness agunah agush agust agy Agyieus agynarious agynary agynous agyrate agyria Ah ah aha ahaaina ahankara Ahantchuyuk ahartalav ahaunch ahead aheap ahem Ahepatokla Ahet ahey ahimsa ahind ahint Ahir ahluwalia ahmadi Ahmadiya Ahmed Ahmet Ahnfeltia aho Ahom ahong ahorse ahorseback Ahousaht ahoy Ahrendahronon Ahriman Ahrimanian ahsan Aht Ahtena ahu ahuatle ahuehuete ahull ahum ahungered ahungry ahunt ahura ahush ahwal ahypnia ai Aias Aiawong aichmophobia aid aidable aidance aidant aide Aidenn aider Aides aidful aidless aiel aigialosaur Aigialosauridae Aigialosaurus aiglet aigremore aigrette aiguille aiguillesque aiguillette aiguilletted aikinite ail ailantery ailanthic Ailanthus ailantine ailanto aile Aileen aileron ailette Ailie ailing aillt ailment ailsyte Ailuridae ailuro ailuroid Ailuroidea Ailuropoda Ailuropus Ailurus ailweed aim Aimak aimara Aimee aimer aimful aimfully aiming aimless aimlessly aimlessness Aimore aimworthiness ainaleh ainhum ainoi ainsell aint Ainu aion aionial air Aira airable airampo airan airbound airbrained airbrush aircraft aircraftman aircraftsman aircraftswoman aircraftwoman aircrew aircrewman airdock airdrome airdrop aire Airedale airedale airer airfield airfoil airframe airfreight airfreighter airgraphics airhead airiferous airified airily airiness airing airish airless airlift airlike airliner airmail airman airmanship airmark airmarker airmonger airohydrogen airometer airpark airphobia airplane airplanist airport airproof airscape airscrew airship airsick airsickness airstrip airt airtight airtightly airtightness airward airwards airway airwayman airwoman airworthiness airworthy airy aischrolatreia aiseweed aisle aisled aisleless aisling Aissaoua Aissor aisteoir Aistopoda Aistopodes ait aitch aitchbone aitchless aitchpiece aitesis aithochroi aition aitiotropic Aitkenite Aitutakian aiwan Aix aizle Aizoaceae aizoaceous Aizoon Ajaja ajaja ajangle ajar ajari Ajatasatru ajava ajhar ajivika ajog ajoint ajowan Ajuga ajutment ak Aka aka Akal akala Akali akalimba akamatsu Akamnik Akan Akanekunik Akania Akaniaceae akaroa akasa Akawai akazga akazgine akcheh ake akeake akebi Akebia akee akeki akeley akenobeite akepiro akerite akey Akha Akhissar Akhlame Akhmimic akhoond akhrot akhyana akia Akim akimbo akin akindle akinesia akinesic akinesis akinete akinetic Akiskemikinik Akiyenik Akka Akkad Akkadian Akkadist akmudar akmuddar aknee ako akoasm akoasma akoluthia akonge Akontae Akoulalion akov akpek Akra akra Akrabattine akroasis akrochordite akroterion Aktistetae Aktistete Aktivismus Aktivist aku akuammine akule akund Akwapim Al al ala Alabama Alabaman Alabamian alabamide alabamine alabandite alabarch alabaster alabastos alabastrian alabastrine alabastrites alabastron alabastrum alacha alack alackaday alacreatine alacreatinine alacrify alacritous alacrity Alactaga alada Aladdin Aladdinize Aladfar Aladinist alaihi Alain alaite Alaki Alala alala alalite alalonga alalunga alalus Alamanni Alamannian Alamannic alameda alamo alamodality alamonti alamosite alamoth Alan alan aland Alangiaceae alangin alangine Alangium alani alanine alannah Alans alantic alantin alantol alantolactone alantolic alanyl alar Alarbus alares Alaria Alaric alarm alarmable alarmed alarmedly alarming alarmingly alarmism alarmist Alarodian alarum alary alas Alascan Alaska alaskaite Alaskan alaskite Alastair Alaster alastrim alate alated alatern alaternus alation Alauda Alaudidae alaudine Alaunian Alawi Alb alb alba albacore albahaca Albainn Alban alban Albanenses Albanensian Albania Albanian albanite Albany albarco albardine albarello albarium albaspidin albata Albatros albatross albe albedo albedograph albee albeit Alberene Albert Alberta albertin Albertina Albertine Albertinian Albertist albertite Alberto albertustaler albertype albescence albescent albespine albetad Albi Albian albicans albicant albication albiculi albification albificative albiflorous albify Albigenses Albigensian Albigensianism Albin albinal albiness albinic albinism albinistic albino albinoism albinotic albinuria Albion Albireo albite albitic albitite albitization albitophyre Albizzia albocarbon albocinereous Albococcus albocracy Alboin albolite albolith albopannin albopruinose alboranite Albrecht Albright albronze Albruna Albuca Albuginaceae albuginea albugineous albuginitis albugo album albumean albumen albumenization albumenize albumenizer albumimeter albumin albuminate albuminaturia albuminiferous albuminiform albuminimeter albuminimetry albuminiparous albuminization albuminize albuminocholia albuminofibrin albuminogenous albuminoid albuminoidal albuminolysis albuminometer albuminometry albuminone albuminorrhea albuminoscope albuminose albuminosis albuminous albuminousness albuminuria albuminuric albumoid albumoscope albumose albumosuria alburn alburnous alburnum albus albutannin Albyn Alca Alcaaba Alcae Alcaic alcaide alcalde alcaldeship alcaldia Alcaligenes alcalizate Alcalzar alcamine alcanna Alcantara Alcantarines alcarraza alcatras alcazar Alcedines Alcedinidae Alcedininae Alcedo alcelaphine Alcelaphus Alces alchemic alchemical alchemically Alchemilla alchemist alchemistic alchemistical alchemistry alchemize alchemy alchera alcheringa alchimy alchitran alchochoden Alchornea alchymy Alcibiadean Alcicornium Alcidae alcidine alcine Alcippe alclad alco alcoate alcogel alcogene alcohate alcohol alcoholate alcoholature alcoholdom alcoholemia alcoholic alcoholically alcoholicity alcoholimeter alcoholism alcoholist alcoholizable alcoholization alcoholize alcoholmeter alcoholmetric alcoholomania alcoholometer alcoholometric alcoholometrical alcoholometry alcoholophilia alcoholuria alcoholysis alcoholytic Alcor Alcoran Alcoranic Alcoranist alcornoco alcornoque alcosol Alcotate alcove alcovinometer Alcuinian alcyon Alcyonacea alcyonacean Alcyonaria alcyonarian Alcyone Alcyones Alcyoniaceae alcyonic alcyoniform Alcyonium alcyonoid aldamine aldane aldazin aldazine aldeament Aldebaran aldebaranium aldehol aldehydase aldehyde aldehydic aldehydine aldehydrol alder Alderamin alderman aldermanate aldermancy aldermaness aldermanic aldermanical aldermanity aldermanlike aldermanly aldermanry aldermanship aldern Alderney alderwoman Aldhafara Aldhafera aldim aldime aldimine Aldine aldine aldoheptose aldohexose aldoketene aldol aldolization aldolize aldononose aldopentose aldose aldoside aldoxime Aldrovanda Aldus ale Alea aleak aleatory alebench aleberry Alebion alec alecithal alecize Aleck aleconner alecost Alectoria alectoria Alectorides alectoridine alectorioid Alectoris alectoromachy alectoromancy Alectoromorphae alectoromorphous Alectoropodes alectoropodous Alectrion Alectrionidae alectryomachy alectryomancy Alectryon alecup alee alef alefnull aleft alefzero alegar alehoof alehouse Alejandro alem alemana Alemanni Alemannian Alemannic Alemannish alembic alembicate alembroth Alemite alemite alemmal alemonger alen Alencon Aleochara aleph alephs alephzero alepidote alepole alepot Aleppine Aleppo alerce alerse alert alertly alertness alesan alestake aletap aletaster Alethea alethiology alethopteis alethopteroid alethoscope aletocyte Aletris alette aleukemic Aleurites aleuritic Aleurobius Aleurodes Aleurodidae aleuromancy aleurometer aleuronat aleurone aleuronic aleuroscope Aleut Aleutian Aleutic aleutite alevin alewife Alex Alexander alexanders Alexandra Alexandreid Alexandrian Alexandrianism Alexandrina Alexandrine alexandrite Alexas Alexia alexia Alexian alexic alexin alexinic alexipharmacon alexipharmacum alexipharmic alexipharmical alexipyretic Alexis alexiteric alexiterical Alexius aleyard Aleyrodes aleyrodid Aleyrodidae Alf alf alfa alfaje alfalfa alfaqui alfaquin alfenide alfet alfilaria alfileria alfilerilla alfilerillo alfiona Alfirk alfonsin alfonso alforja Alfred Alfreda alfresco alfridaric alfridary Alfur Alfurese Alfuro alga algae algaecide algaeological algaeologist algaeology algaesthesia algaesthesis algal algalia Algaroth algarroba algarrobilla algarrobin Algarsife Algarsyf algate Algebar algebra algebraic algebraical algebraically algebraist algebraization algebraize Algedi algedo algedonic algedonics algefacient Algenib Algerian Algerine algerine Algernon algesia algesic algesis algesthesis algetic Algic algic algid algidity algidness Algieba algific algin alginate algine alginic alginuresis algiomuscular algist algivorous algocyan algodoncillo algodonite algoesthesiometer algogenic algoid Algol algolagnia algolagnic algolagnist algolagny algological algologist algology Algoman algometer algometric algometrical algometrically algometry Algomian Algomic Algonkian Algonquian Algonquin algophilia algophilist algophobia algor Algorab Algores algorism algorismic algorist algoristic algorithm algorithmic algosis algous algovite algraphic algraphy alguazil algum Algy Alhagi Alhambra Alhambraic Alhambresque Alhena alhenna alias Alibamu alibangbang alibi alibility alible Alicant Alice alichel Alichino Alicia Alick alicoche alictisal alicyclic Alida alidade Alids alien alienability alienable alienage alienate alienation alienator aliency alienee aliener alienicola alienigenate alienism alienist alienize alienor alienship aliethmoid aliethmoidal alif aliferous aliform aligerous alight align aligner alignment aligreek aliipoe alike alikeness alikewise Alikuluf Alikulufan alilonghi alima aliment alimental alimentally alimentariness alimentary alimentation alimentative alimentatively alimentativeness alimenter alimentic alimentive alimentiveness alimentotherapy alimentum alimonied alimony alin alinasal Aline alineation alintatao aliofar Alioth alipata aliped aliphatic alipterion aliptes aliptic aliquant aliquot aliseptal alish alisier Alisma Alismaceae alismaceous alismad alismal Alismales Alismataceae alismoid aliso Alison alison alisonite alisp alisphenoid alisphenoidal alist Alister alit alite alitrunk aliturgic aliturgical aliunde alive aliveness alivincular Alix aliyah alizarate alizari alizarin aljoba alk alkahest alkahestic alkahestica alkahestical Alkaid alkalamide alkalemia alkalescence alkalescency alkalescent alkali alkalic alkaliferous alkalifiable alkalify alkaligen alkaligenous alkalimeter alkalimetric alkalimetrical alkalimetrically alkalimetry alkaline alkalinity alkalinization alkalinize alkalinuria alkalizable alkalizate alkalization alkalize alkalizer alkaloid alkaloidal alkalometry alkalosis alkalous Alkalurops alkamin alkamine alkane alkanet Alkanna alkannin Alkaphrah alkapton alkaptonuria alkaptonuric alkargen alkarsin alkekengi alkene alkenna alkenyl alkermes Alkes alkide alkine alkool Alkoran Alkoranic alkoxide alkoxy alkoxyl alky alkyd alkyl alkylamine alkylate alkylation alkylene alkylic alkylidene alkylize alkylogen alkyloxy alkyne all allabuta allactite allaeanthus allagite allagophyllous allagostemonous Allah allalinite Allamanda allamotti Allan allan allanite allanitic allantiasis allantochorion allantoic allantoid allantoidal Allantoidea allantoidean allantoidian allantoin allantoinase allantoinuria allantois allantoxaidin allanturic Allasch allassotonic allative allatrate allay allayer allayment allbone Alle allecret allectory allegate allegation allegator allege allegeable allegedly allegement alleger Alleghenian Allegheny allegiance allegiancy allegiant allegoric allegorical allegorically allegoricalness allegorism allegorist allegorister allegoristic allegorization allegorize allegorizer allegory allegretto allegro allele allelic allelism allelocatalytic allelomorph allelomorphic allelomorphism allelotropic allelotropism allelotropy alleluia alleluiatic allemand allemande allemontite Allen allenarly allene Allentiac Allentiacan aller allergen allergenic allergia allergic allergin allergist allergy allerion allesthesia alleviate alleviatingly alleviation alleviative alleviator alleviatory alley alleyed alleyite alleyway allgood Allhallow Allhallowtide allheal alliable alliably Alliaceae alliaceous alliance alliancer Alliaria allicampane allice allicholly alliciency allicient Allie allied Allies allies alligate alligator alligatored allineate allineation Allionia Allioniaceae allision alliteral alliterate alliteration alliterational alliterationist alliterative alliteratively alliterativeness alliterator Allium allivalite allmouth allness Allobroges allocable allocaffeine allocatable allocate allocatee allocation allocator allochetia allochetite allochezia allochiral allochirally allochiria allochlorophyll allochroic allochroite allochromatic allochroous allochthonous allocinnamic alloclase alloclasite allocochick allocrotonic allocryptic allocute allocution allocutive allocyanine allodelphite allodesmism alloeosis alloeostropha alloeotic alloerotic alloerotism allogamous allogamy allogene allogeneity allogeneous allogenic allogenically allograph alloiogenesis alloisomer alloisomeric alloisomerism allokinesis allokinetic allokurtic allomerism allomerous allometric allometry allomorph allomorphic allomorphism allomorphite allomucic allonomous allonym allonymous allopalladium allopath allopathetic allopathetically allopathic allopathically allopathist allopathy allopatric allopatrically allopatry allopelagic allophanamide allophanates allophane allophanic allophone allophyle allophylian allophylic Allophylus allophytoid alloplasm alloplasmatic alloplasmic alloplast alloplastic alloplasty alloploidy allopolyploid allopsychic alloquial alloquialism alloquy allorhythmia allorrhyhmia allorrhythmic allosaur Allosaurus allose allosematic allosome allosyndesis allosyndetic allot allotee allotelluric allotheism Allotheria allothigene allothigenetic allothigenetically allothigenic allothigenous allothimorph allothimorphic allothogenic allothogenous allotment allotriodontia Allotriognathi allotriomorphic allotriophagia allotriophagy allotriuria allotrope allotrophic allotropic allotropical allotropically allotropicity allotropism allotropize allotropous allotropy allotrylic allottable allottee allotter allotype allotypical allover allow allowable allowableness allowably allowance allowedly allower alloxan alloxanate alloxanic alloxantin alloxuraemia alloxuremia alloxuric alloxyproteic alloy alloyage allozooid allseed allspice allthing allthorn alltud allude allure allurement allurer alluring alluringly alluringness allusion allusive allusively allusiveness alluvia alluvial alluviate alluviation alluvion alluvious alluvium allwhere allwhither allwork Allworthy Ally ally allyl allylamine allylate allylation allylene allylic allylthiourea Alma alma Almach almaciga almacigo almadia almadie almagest almagra Almain Alman almanac almandine almandite alme almeidina almemar Almerian almeriite Almida almightily almightiness almighty almique Almira almirah almochoden Almohad Almohade Almohades almoign Almon almon almond almondy almoner almonership almonry Almoravid Almoravide Almoravides almost almous alms almsdeed almsfolk almsful almsgiver almsgiving almshouse almsman almswoman almucantar almuce almud almude almug Almuredin almuten aln alnage alnager alnagership Alnaschar Alnascharism alnein alnico Alnilam alniresinol Alnitak Alnitham alniviridol alnoite alnuin Alnus alo Aloadae Alocasia alochia alod alodial alodialism alodialist alodiality alodially alodian alodiary alodification alodium alody aloe aloed aloelike aloemodin aloeroot aloesol aloeswood aloetic aloetical aloewood aloft alogia Alogian alogical alogically alogism alogy aloid aloin Alois aloisiite aloma alomancy alone aloneness along alongshore alongshoreman alongside alongst Alonso Alonsoa Alonzo aloof aloofly aloofness aloose alop alopecia Alopecias alopecist alopecoid Alopecurus alopeke Alopias Alopiidae Alosa alose Alouatta alouatte aloud alow alowe Aloxite Aloysia Aloysius alp alpaca alpasotes Alpax alpeen Alpen alpenglow alpenhorn alpenstock alpenstocker alpestral alpestrian alpestrine alpha alphabet alphabetarian alphabetic alphabetical alphabetically alphabetics alphabetiform alphabetism alphabetist alphabetization alphabetize alphabetizer Alphard alphatoluic Alphean Alphecca alphenic Alpheratz alphitomancy alphitomorphous alphol Alphonist Alphonse Alphonsine Alphonsism Alphonso alphorn alphos alphosis alphyl Alpian Alpid alpieu alpigene Alpine alpine alpinely alpinery alpinesque Alpinia Alpiniaceae Alpinism Alpinist alpist Alpujarra alqueire alquier alquifou alraun alreadiness already alright alrighty alroot alruna Alsatia Alsatian alsbachite Alshain Alsinaceae alsinaceous Alsine also alsoon Alsophila Alstonia alstonidine alstonine alstonite Alstroemeria alsweill alt Altaian Altaic Altaid Altair altaite Altamira altar altarage altared altarist altarlet altarpiece altarwise altazimuth alter alterability alterable alterableness alterably alterant alterate alteration alterative altercate altercation altercative alteregoism alteregoistic alterer alterity altern alternacy alternance alternant Alternanthera Alternaria alternariose alternate alternately alternateness alternating alternatingly alternation alternationist alternative alternatively alternativeness alternativity alternator alterne alternifoliate alternipetalous alternipinnate alternisepalous alternize alterocentric Althaea althaein Althea althea althein altheine althionic altho althorn although Altica Alticamelus altigraph altilik altiloquence altiloquent altimeter altimetrical altimetrically altimetry altin altincar Altingiaceae altingiaceous altininck altiplano altiscope altisonant altisonous altissimo altitude altitudinal altitudinarian alto altogether altogetherness altometer altoun altrices altricial altropathy altrose altruism altruist altruistic altruistically altschin altun Aluco Aluconidae Aluconinae aludel Aludra alula alular alulet Alulim alum alumbloom Alumel alumic alumiferous alumina aluminaphone aluminate alumine aluminic aluminide aluminiferous aluminiform aluminish aluminite aluminium aluminize aluminoferric aluminographic aluminography aluminose aluminosilicate aluminosis aluminosity aluminothermic aluminothermics aluminothermy aluminotype aluminous aluminum aluminyl alumish alumite alumium alumna alumnae alumnal alumni alumniate Alumnol alumnus alumohydrocalcite alumroot Alundum aluniferous alunite alunogen alupag Alur alure alurgite alushtite aluta alutaceous Alvah Alvan alvar alvearium alveary alveloz alveola alveolar alveolariform alveolary alveolate alveolated alveolation alveole alveolectomy alveoli alveoliform alveolite Alveolites alveolitis alveoloclasia alveolocondylean alveolodental alveololabial alveololingual alveolonasal alveolosubnasal alveolotomy alveolus alveus alviducous Alvin Alvina alvine Alvissmal alvite alvus alway always aly Alya alycompaine alymphia alymphopotent alypin alysson Alyssum alytarch Alytes am ama amaas Amabel amability amacratic amacrinal amacrine amadavat amadelphous Amadi Amadis amadou Amaethon Amafingo amaga amah Amahuaca amain amaister amakebe Amakosa amala amalaita amalaka Amalfian Amalfitan amalgam amalgamable amalgamate amalgamation amalgamationist amalgamative amalgamatize amalgamator amalgamist amalgamization amalgamize Amalings Amalrician amaltas amamau Amampondo Amanda amandin Amandus amang amani amania Amanist Amanita amanitin amanitine Amanitopsis amanori amanous amantillo amanuenses amanuensis amapa Amapondo amar Amara Amarantaceae amarantaceous amaranth Amaranthaceae amaranthaceous amaranthine amaranthoid Amaranthus amarantite Amarantus amarelle amarevole amargoso amarillo amarin amarine amaritude amarity amaroid amaroidal Amarth amarthritis amaryllid Amaryllidaceae amaryllidaceous amaryllideous Amaryllis amasesis amass amassable amasser amassment Amasta amasthenic amastia amasty Amatembu amaterialistic amateur amateurish amateurishly amateurishness amateurism amateurship Amati amative amatively amativeness amatol amatorial amatorially amatorian amatorious amatory amatrice amatungula amaurosis amaurotic amaze amazed amazedly amazedness amazeful amazement amazia Amazilia amazing amazingly Amazon Amazona Amazonian Amazonism amazonite Amazulu amba ambage ambagiosity ambagious ambagiously ambagiousness ambagitory ambalam amban ambar ambaree ambarella ambary ambash ambassade Ambassadeur ambassador ambassadorial ambassadorially ambassadorship ambassadress ambassage ambassy ambatch ambatoarinite ambay ambeer amber amberfish ambergris amberiferous amberite amberoid amberous ambery ambicolorate ambicoloration ambidexter ambidexterity ambidextral ambidextrous ambidextrously ambidextrousness ambience ambiency ambiens ambient ambier ambigenous ambiguity ambiguous ambiguously ambiguousness ambilateral ambilateralaterally ambilaterality ambilevous ambilian ambilogy ambiopia ambiparous ambisinister ambisinistrous ambisporangiate ambisyllabic ambit ambital ambitendency ambition ambitionist ambitionless ambitionlessly ambitious ambitiously ambitiousness ambitty ambitus ambivalence ambivalency ambivalent ambivert amble ambler ambling amblingly amblotic amblyacousia amblyaphia Amblycephalidae Amblycephalus amblychromatic Amblydactyla amblygeusia amblygon amblygonal amblygonite amblyocarpous Amblyomma amblyope amblyopia amblyopic Amblyopsidae Amblyopsis amblyoscope amblypod Amblypoda amblypodous Amblyrhynchus amblystegite Amblystoma ambo amboceptoid amboceptor Ambocoelia Amboina Amboinese ambomalleal ambon ambonite Ambonnay ambos ambosexous ambosexual ambrain ambrein ambrette Ambrica ambrite ambroid ambrology Ambrose ambrose ambrosia ambrosiac Ambrosiaceae ambrosiaceous ambrosial ambrosially Ambrosian ambrosian ambrosiate ambrosin ambrosine Ambrosio ambrosterol ambrotype ambry ambsace ambulacral ambulacriform ambulacrum ambulance ambulancer ambulant ambulate ambulatio ambulation ambulative ambulator Ambulatoria ambulatorial ambulatorium ambulatory ambuling ambulomancy amburbial ambury ambuscade ambuscader ambush ambusher ambushment Ambystoma Ambystomidae amchoor ame amebiform Amedeo ameed ameen Ameiuridae Ameiurus Ameiva Amelanchier amelcorn Amelia amelia amelification ameliorable ameliorableness ameliorant ameliorate amelioration ameliorativ ameliorative ameliorator amellus ameloblast ameloblastic amelu amelus Amen amen amenability amenable amenableness amenably amend amendable amendableness amendatory amende amender amendment amends amene amenia Amenism Amenite amenity amenorrhea amenorrheal amenorrheic amenorrhoea ament amentaceous amental amentia Amentiferae amentiferous amentiform amentulum amentum amerce amerceable amercement amercer amerciament America American Americana Americanese Americanism Americanist Americanistic Americanitis Americanization Americanize Americanizer Americanly Americanoid Americaward Americawards americium Americomania Americophobe Amerimnon Amerind Amerindian Amerindic amerism ameristic amesite Ametabola ametabole ametabolia ametabolian ametabolic ametabolism ametabolous ametaboly ametallous amethodical amethodically amethyst amethystine ametoecious ametria ametrometer ametrope ametropia ametropic ametrous Amex amgarn amhar amherstite amhran Ami ami Amia amiability amiable amiableness amiably amianth amianthiform amianthine Amianthium amianthoid amianthoidal amianthus amic amicability amicable amicableness amicably amical amice amiced amicicide amicrobic amicron amicronucleate amid amidase amidate amidation amide amidic amidid amidide amidin amidine Amidism Amidist amido amidoacetal amidoacetic amidoacetophenone amidoaldehyde amidoazo amidoazobenzene amidoazobenzol amidocaffeine amidocapric amidofluorid amidofluoride amidogen amidoguaiacol amidohexose amidoketone amidol amidomyelin amidon amidophenol amidophosphoric amidoplast amidoplastid amidopyrine amidosuccinamic amidosulphonal amidothiazole amidoxime amidoxy amidoxyl amidrazone amidship amidships amidst amidstream amidulin Amigo Amiidae amil Amiles Amiloun amimia amimide amin aminate amination amine amini aminic aminity aminization aminize amino aminoacetal aminoacetanilide aminoacetic aminoacetone aminoacetophenetidine aminoacetophenone aminoacidemia aminoaciduria aminoanthraquinone aminoazobenzene aminobarbituric aminobenzaldehyde aminobenzamide aminobenzene aminobenzoic aminocaproic aminodiphenyl aminoethionic aminoformic aminogen aminoglutaric aminoguanidine aminoid aminoketone aminolipin aminolysis aminolytic aminomalonic aminomyelin aminophenol aminoplast aminoplastic aminopropionic aminopurine aminopyrine aminoquinoline aminosis aminosuccinamic aminosulphonic aminothiophen aminovaleric aminoxylol Aminta Amintor Amioidei Amir amir Amiranha amiray amirship Amish Amishgo amiss amissibility amissible amissness Amita Amitabha amitosis amitotic amitotically amity amixia Amizilis amla amli amlikar amlong Amma amma amman Ammanite ammelide ammelin ammeline ammer ammeter Ammi Ammiaceae ammiaceous ammine amminochloride amminolysis amminolytic ammiolite ammo Ammobium ammochaeta ammochryse ammocoete ammocoetes ammocoetid Ammocoetidae ammocoetiform ammocoetoid Ammodytes Ammodytidae ammodytoid ammonal ammonate ammonation Ammonea ammonia ammoniacal ammoniacum ammoniate ammoniation ammonic ammonical ammoniemia ammonification ammonifier ammonify ammoniojarosite ammonion ammonionitrate Ammonite ammonite Ammonites Ammonitess ammonitic ammoniticone ammonitiferous Ammonitish ammonitoid Ammonitoidea ammonium ammoniuria ammonization ammono ammonobasic ammonocarbonic ammonocarbonous ammonoid Ammonoidea ammonoidean ammonolysis ammonolytic ammonolyze Ammophila ammophilous ammoresinol ammotherapy ammu ammunition amnemonic amnesia amnesic amnestic amnesty amnia amniac amniatic amnic Amnigenia amnioallantoic amniocentesis amniochorial amnioclepsis amniomancy amnion Amnionata amnionate amnionic amniorrhea Amniota amniote amniotic amniotitis amniotome amober amobyr amoeba amoebae Amoebaea amoebaean amoebaeum amoebalike amoeban amoebian amoebiasis amoebic amoebicide amoebid Amoebida Amoebidae amoebiform Amoebobacter Amoebobacterieae amoebocyte Amoebogeniae amoeboid amoeboidism amoebous amoebula amok amoke amole amolilla amomal Amomales Amomis amomum among amongst amontillado amor amorado amoraic amoraim amoral amoralism amoralist amorality amoralize Amores amoret amoretto Amoreuxia amorism amorist amoristic Amorite Amoritic Amoritish amorosity amoroso amorous amorously amorousness Amorpha amorphia amorphic amorphinism amorphism Amorphophallus amorphophyte amorphotae amorphous amorphously amorphousness amorphus amorphy amort amortisseur amortizable amortization amortize amortizement Amorua Amos Amoskeag amotion amotus amount amour amourette amovability amovable amove Amoy Amoyan Amoyese ampalaya ampalea ampangabeite ampasimenite Ampelidaceae ampelidaceous Ampelidae ampelideous Ampelis ampelite ampelitic ampelographist ampelography ampelopsidin ampelopsin Ampelopsis Ampelosicyos ampelotherapy amper amperage ampere amperemeter Amperian amperometer ampersand ampery amphanthium ampheclexis ampherotokous ampherotoky amphetamine amphiarthrodial amphiarthrosis amphiaster amphibalus Amphibia amphibial amphibian amphibichnite amphibiety amphibiological amphibiology amphibion amphibiotic Amphibiotica amphibious amphibiously amphibiousness amphibium amphiblastic amphiblastula amphiblestritis Amphibola amphibole amphibolia amphibolic amphiboliferous amphiboline amphibolite amphibolitic amphibological amphibologically amphibologism amphibology amphibolous amphiboly amphibrach amphibrachic amphibryous Amphicarpa Amphicarpaea amphicarpic amphicarpium amphicarpogenous amphicarpous amphicentric amphichroic amphichrom amphichromatic amphichrome amphicoelian amphicoelous Amphicondyla amphicondylous amphicrania amphicreatinine amphicribral amphictyon amphictyonian amphictyonic amphictyony Amphicyon Amphicyonidae amphicyrtic amphicyrtous amphicytula amphid amphide amphidesmous amphidetic amphidiarthrosis amphidiploid amphidiploidy amphidisc Amphidiscophora amphidiscophoran amphierotic amphierotism Amphigaea amphigam Amphigamae amphigamous amphigastrium amphigastrula amphigean amphigen amphigene amphigenesis amphigenetic amphigenous amphigenously amphigonic amphigonium amphigonous amphigony amphigoric amphigory amphigouri amphikaryon amphilogism amphilogy amphimacer amphimictic amphimictical amphimictically amphimixis amphimorula Amphinesian Amphineura amphineurous amphinucleus Amphion Amphionic Amphioxi Amphioxidae Amphioxides Amphioxididae amphioxus amphipeptone amphiphloic amphiplatyan Amphipleura amphiploid amphiploidy amphipneust Amphipneusta amphipneustic Amphipnous amphipod Amphipoda amphipodal amphipodan amphipodiform amphipodous amphiprostylar amphiprostyle amphiprotic amphipyrenin Amphirhina amphirhinal amphirhine amphisarca amphisbaena amphisbaenian amphisbaenic Amphisbaenidae amphisbaenoid amphisbaenous amphiscians amphiscii Amphisile Amphisilidae amphispermous amphisporangiate amphispore Amphistoma amphistomatic amphistome amphistomoid amphistomous Amphistomum amphistylar amphistylic amphistyly amphitene amphitheater amphitheatered amphitheatral amphitheatric amphitheatrical amphitheatrically amphithecial amphithecium amphithect amphithyron amphitokal amphitokous amphitoky amphitriaene amphitrichous Amphitrite amphitropal amphitropous Amphitruo Amphitryon Amphiuma Amphiumidae amphivasal amphivorous Amphizoidae amphodarch amphodelite amphodiplopia amphogenous ampholyte amphopeptone amphophil amphophile amphophilic amphophilous amphora amphoral amphore amphorette amphoric amphoricity amphoriloquy amphorophony amphorous amphoteric Amphrysian ample amplectant ampleness amplexation amplexicaudate amplexicaul amplexicauline amplexifoliate amplexus ampliate ampliation ampliative amplicative amplidyne amplification amplificative amplificator amplificatory amplifier amplify amplitude amply ampollosity ampongue ampoule ampul ampulla ampullaceous ampullar Ampullaria Ampullariidae ampullary ampullate ampullated ampulliform ampullitis ampullula amputate amputation amputational amputative amputator amputee ampyx amra amreeta amrita Amritsar amsath amsel Amsonia Amsterdamer amt amtman Amuchco amuck Amueixa amuguis amula amulet amuletic amulla amunam amurca amurcosity amurcous Amurru amusable amuse amused amusedly amusee amusement amuser amusette Amusgo amusia amusing amusingly amusingness amusive amusively amusiveness amutter amuyon amuyong amuze amvis Amy amy Amyclaean Amyclas amyelencephalia amyelencephalic amyelencephalous amyelia amyelic amyelinic amyelonic amyelous amygdal amygdala Amygdalaceae amygdalaceous amygdalase amygdalate amygdalectomy amygdalic amygdaliferous amygdaliform amygdalin amygdaline amygdalinic amygdalitis amygdaloid amygdaloidal amygdalolith amygdaloncus amygdalopathy amygdalothripsis amygdalotome amygdalotomy Amygdalus amygdonitrile amygdophenin amygdule amyl amylaceous amylamine amylan amylase amylate amylemia amylene amylenol amylic amylidene amyliferous amylin amylo amylocellulose amyloclastic amylocoagulase amylodextrin amylodyspepsia amylogen amylogenesis amylogenic amylohydrolysis amylohydrolytic amyloid amyloidal amyloidosis amyloleucite amylolysis amylolytic amylom amylometer amylon amylopectin amylophagia amylophosphate amylophosphoric amyloplast amyloplastic amyloplastid amylopsin amylose amylosis amylosynthesis amylum amyluria Amynodon amynodont amyosthenia amyosthenic amyotaxia amyotonia amyotrophia amyotrophic amyotrophy amyous Amyraldism Amyraldist Amyridaceae amyrin Amyris amyrol amyroot Amytal amyxorrhea amyxorrhoea an Ana ana Anabaena Anabantidae Anabaptism Anabaptist Anabaptistic Anabaptistical Anabaptistically Anabaptistry anabaptize Anabas anabasine anabasis anabasse anabata anabathmos anabatic anaberoga anabibazon anabiosis anabiotic Anablepidae Anableps anabo anabohitsite anabolic anabolin anabolism anabolite anabolize anabong anabranch anabrosis anabrotic anacahuita anacahuite anacalypsis anacampsis anacamptic anacamptically anacamptics anacamptometer anacanth anacanthine Anacanthini anacanthous anacara anacard Anacardiaceae anacardiaceous anacardic Anacardium anacatadidymus anacatharsis anacathartic anacephalaeosis anacephalize Anaces Anacharis anachorism anachromasis anachronic anachronical anachronically anachronism anachronismatical anachronist anachronistic anachronistical anachronistically anachronize anachronous anachronously anachueta anacid anacidity anaclasis anaclastic anaclastics Anaclete anacleticum anaclinal anaclisis anaclitic anacoenosis anacoluthia anacoluthic anacoluthically anacoluthon anaconda Anacreon Anacreontic Anacreontically anacrisis Anacrogynae anacrogynae anacrogynous anacromyodian anacrotic anacrotism anacrusis anacrustic anacrustically anaculture anacusia anacusic anacusis Anacyclus anadem anadenia anadicrotic anadicrotism anadidymus anadiplosis anadipsia anadipsic anadrom anadromous Anadyomene anaematosis anaemia anaemic anaeretic anaerobation anaerobe anaerobia anaerobian anaerobic anaerobically anaerobies anaerobion anaerobiont anaerobiosis anaerobiotic anaerobiotically anaerobious anaerobism anaerobium anaerophyte anaeroplastic anaeroplasty anaesthesia anaesthesiant anaesthetically anaesthetizer anaetiological anagalactic Anagallis anagap anagenesis anagenetic anagep anagignoskomena anaglyph anaglyphic anaglyphical anaglyphics anaglyphoscope anaglyphy anaglyptic anaglyptical anaglyptics anaglyptograph anaglyptographic anaglyptography anaglypton anagnorisis anagnost anagoge anagogic anagogical anagogically anagogics anagogy anagram anagrammatic anagrammatical anagrammatically anagrammatism anagrammatist anagrammatize anagrams anagraph anagua anagyrin anagyrine Anagyris anahau Anahita Anaitis Anakes anakinesis anakinetic anakinetomer anakinetomeric anakoluthia anakrousis anaktoron anal analabos analav analcime analcimite analcite analcitite analecta analectic analects analemma analemmatic analepsis analepsy analeptic analeptical analgen analgesia analgesic Analgesidae analgesis analgesist analgetic analgia analgic analgize analkalinity anallagmatic anallantoic Anallantoidea anallantoidean anallergic anally analogic analogical analogically analogicalness analogion analogism analogist analogistic analogize analogon analogous analogously analogousness analogue analogy analphabet analphabete analphabetic analphabetical analphabetism analysability analysable analysand analysation analyse analyser analyses analysis analyst analytic analytical analytically analytics analyzability analyzable analyzation analyze analyzer Anam anam anama anamesite anametadromous Anamirta anamirtin Anamite anamite anammonid anammonide anamnesis anamnestic anamnestically Anamnia Anamniata Anamnionata anamnionic Anamniota anamniote anamniotic anamorphic anamorphism anamorphoscope anamorphose anamorphosis anamorphote anamorphous anan anana ananaplas ananaples ananas ananda anandrarious anandria anandrous ananepionic anangioid anangular Ananias Ananism Ananite anankastic Anansi Ananta anantherate anantherous ananthous ananym anapaest anapaestic anapaestical anapaestically anapaganize anapaite anapanapa anapeiratic anaphalantiasis Anaphalis anaphase Anaphe anaphia anaphora anaphoral anaphoria anaphoric anaphorical anaphrodisia anaphrodisiac anaphroditic anaphroditous anaphylactic anaphylactin anaphylactogen anaphylactogenic anaphylactoid anaphylatoxin anaphylaxis anaphyte anaplasia anaplasis anaplasm Anaplasma anaplasmosis anaplastic anaplasty anaplerosis anaplerotic anapnea anapneic anapnoeic anapnograph anapnoic anapnometer anapodeictic anapophysial anapophysis anapsid Anapsida anapsidan Anapterygota anapterygote anapterygotism anapterygotous Anaptomorphidae Anaptomorphus anaptotic anaptychus anaptyctic anaptyctical anaptyxis anaqua anarcestean Anarcestes anarch anarchal anarchial anarchic anarchical anarchically anarchism anarchist anarchistic anarchize anarchoindividualist anarchosocialist anarchosyndicalism anarchosyndicalist anarchy anarcotin anareta anaretic anaretical anargyros anarthria anarthric anarthropod Anarthropoda anarthropodous anarthrosis anarthrous anarthrously anarthrousness anartismos anarya Anaryan Anas Anasa anasarca anasarcous Anasazi anaschistic anaseismic Anasitch anaspadias anaspalin Anaspida Anaspidacea Anaspides anastalsis anastaltic Anastasia Anastasian anastasimon anastasimos anastasis Anastasius anastate anastatic Anastatica Anastatus anastigmat anastigmatic anastomose anastomosis anastomotic Anastomus anastrophe Anastrophia Anat anatase anatexis anathema anathematic anathematical anathematically anathematism anathematization anathematize anathematizer anatheme anathemize Anatherum Anatidae anatifa Anatifae anatifer anatiferous Anatinacea Anatinae anatine anatocism Anatole Anatolian Anatolic Anatoly anatomic anatomical anatomically anatomicobiological anatomicochirurgical anatomicomedical anatomicopathologic anatomicopathological anatomicophysiologic anatomicophysiological anatomicosurgical anatomism anatomist anatomization anatomize anatomizer anatomopathologic anatomopathological anatomy anatopism anatox anatoxin anatreptic anatripsis anatripsology anatriptic anatron anatropal anatropia anatropous Anatum anaudia anaunter anaunters Anax Anaxagorean Anaxagorize anaxial Anaximandrian anaxon anaxone Anaxonia anay anazoturia anba anbury Ancerata ancestor ancestorial ancestorially ancestral ancestrally ancestress ancestrial ancestrian ancestry Ancha Anchat Anchietea anchietin anchietine anchieutectic anchimonomineral Anchisaurus Anchises Anchistea Anchistopoda anchithere anchitherioid anchor anchorable anchorage anchorate anchored anchorer anchoress anchoret anchoretic anchoretical anchoretish anchoretism anchorhold anchorite anchoritess anchoritic anchoritical anchoritish anchoritism anchorless anchorlike anchorwise anchovy Anchtherium Anchusa anchusin anchusine anchylose anchylosis ancience anciency ancient ancientism anciently ancientness ancientry ancienty ancile ancilla ancillary ancipital ancipitous Ancistrocladaceae ancistrocladaceous Ancistrocladus ancistroid ancon Ancona anconad anconagra anconal ancone anconeal anconeous anconeus anconitis anconoid ancony ancora ancoral Ancyloceras Ancylocladus Ancylodactyla ancylopod Ancylopoda Ancylostoma ancylostome ancylostomiasis Ancylostomum Ancylus Ancyrean Ancyrene and anda andabatarian Andalusian andalusite Andaman Andamanese andante andantino Andaqui Andaquian Andarko Andaste Ande Andean Anderson Andesic andesine andesinite andesite andesitic Andevo Andhra Andi Andian Andine Andira andirin andirine andiroba andiron Andoke andorite Andorobo Andorran andouillet andradite andranatomy andrarchy Andre Andrea Andreaea Andreaeaceae Andreaeales Andreas Andrena andrenid Andrenidae Andrew andrewsite Andria Andriana Andrias andric Andries androcentric androcephalous androcephalum androclinium Androclus androconium androcracy androcratic androcyte androdioecious androdioecism androdynamous androecial androecium androgametangium androgametophore androgen androgenesis androgenetic androgenic androgenous androginous androgone androgonia androgonial androgonidium androgonium Andrographis andrographolide androgynal androgynary androgyne androgyneity androgynia androgynism androgynous androgynus androgyny android androidal androkinin androl androlepsia androlepsy Andromache andromania Andromaque Andromeda Andromede andromedotoxin andromonoecious andromonoecism andromorphous andron Andronicus andronitis andropetalar andropetalous androphagous androphobia androphonomania androphore androphorous androphorum androphyll Andropogon Androsace Androscoggin androseme androsin androsphinx androsporangium androspore androsterone androtauric androtomy Andy anear aneath anecdota anecdotage anecdotal anecdotalism anecdote anecdotic anecdotical anecdotically anecdotist anele anelectric anelectrode anelectrotonic anelectrotonus anelytrous anematosis Anemia anemia anemic anemobiagraph anemochord anemoclastic anemogram anemograph anemographic anemographically anemography anemological anemology anemometer anemometric anemometrical anemometrically anemometrograph anemometrographic anemometrographically anemometry anemonal anemone Anemonella anemonin anemonol anemony anemopathy anemophile anemophilous anemophily Anemopsis anemoscope anemosis anemotaxis anemotropic anemotropism anencephalia anencephalic anencephalotrophia anencephalous anencephalus anencephaly anend anenergia anenst anent anenterous anepia anepigraphic anepigraphous anepiploic anepithymia anerethisia aneretic anergia anergic anergy anerly aneroid aneroidograph anerotic anerythroplasia anerythroplastic anes anesis anesthesia anesthesiant anesthesimeter anesthesiologist anesthesiology anesthesis anesthetic anesthetically anesthetist anesthetization anesthetize anesthetizer anesthyl anethole Anethum anetiological aneuploid aneuploidy aneuria aneuric aneurilemmic aneurin aneurism aneurismally aneurysm aneurysmal aneurysmally aneurysmatic anew Anezeh anfractuose anfractuosity anfractuous anfractuousness anfracture Angami Angara angaralite angaria angary Angdistis angekok angel Angela angelate angeldom Angeleno angelet angeleyes angelfish angelhood angelic Angelica angelica Angelical angelical angelically angelicalness Angelican angelicic angelicize angelico angelin Angelina angeline angelique angelize angellike Angelo angelocracy angelographer angelolater angelolatry angelologic angelological angelology angelomachy Angelonia angelophany angelot angelship Angelus anger angerly Angerona Angeronalia Angers Angetenar Angevin angeyok angiasthenia angico Angie angiectasis angiectopia angiemphraxis angiitis angild angili angina anginal anginiform anginoid anginose anginous angioasthenia angioataxia angioblast angioblastic angiocarditis angiocarp angiocarpian angiocarpic angiocarpous angiocavernous angiocholecystitis angiocholitis angiochondroma angioclast angiocyst angiodermatitis angiodiascopy angioelephantiasis angiofibroma angiogenesis angiogenic angiogeny angioglioma angiograph angiography angiohyalinosis angiohydrotomy angiohypertonia angiohypotonia angioid angiokeratoma angiokinesis angiokinetic angioleucitis angiolipoma angiolith angiology angiolymphitis angiolymphoma angioma angiomalacia angiomatosis angiomatous angiomegaly angiometer angiomyocardiac angiomyoma angiomyosarcoma angioneoplasm angioneurosis angioneurotic angionoma angionosis angioparalysis angioparalytic angioparesis angiopathy angiophorous angioplany angioplasty angioplerosis angiopoietic angiopressure angiorrhagia angiorrhaphy angiorrhea angiorrhexis angiosarcoma angiosclerosis angiosclerotic angioscope angiosis angiospasm angiospastic angiosperm Angiospermae angiospermal angiospermatous angiospermic angiospermous angiosporous angiostegnosis angiostenosis angiosteosis angiostomize angiostomy angiostrophy angiosymphysis angiotasis angiotelectasia angiothlipsis angiotome angiotomy angiotonic angiotonin angiotribe angiotripsy angiotrophic Angka anglaise angle angleberry angled anglehook anglepod angler Angles anglesite anglesmith angletouch angletwitch anglewing anglewise angleworm Anglian Anglic Anglican Anglicanism Anglicanize Anglicanly Anglicanum Anglicism Anglicist Anglicization anglicization Anglicize anglicize Anglification Anglify anglimaniac angling Anglish Anglist Anglistics Anglogaea Anglogaean angloid Angloman Anglomane Anglomania Anglomaniac Anglophile Anglophobe Anglophobia Anglophobiac Anglophobic Anglophobist ango Angola angolar Angolese angor Angora angostura Angouleme Angoumian Angraecum angrily angriness angrite angry angst angster Angstrom angstrom anguid Anguidae anguiform Anguilla Anguillaria Anguillidae anguilliform anguilloid Anguillula Anguillulidae Anguimorpha anguine anguineal anguineous Anguinidae anguiped Anguis anguis anguish anguished anguishful anguishous anguishously angula angular angulare angularity angularization angularize angularly angularness angulate angulated angulately angulateness angulation angulatogibbous angulatosinuous anguliferous angulinerved Anguloa angulodentate angulometer angulosity angulosplenial angulous anguria Angus angusticlave angustifoliate angustifolious angustirostrate angustisellate angustiseptal angustiseptate angwantibo anhalamine anhaline anhalonine Anhalonium anhalouidine anhang Anhanga anharmonic anhedonia anhedral anhedron anhelation anhelous anhematosis anhemolytic anhidrosis anhidrotic anhima Anhimae Anhimidae anhinga anhistic anhistous anhungered anhungry anhydrate anhydration anhydremia anhydremic anhydric anhydride anhydridization anhydridize anhydrite anhydrization anhydrize anhydroglocose anhydromyelia anhydrous anhydroxime anhysteretic ani Aniba Anice aniconic aniconism anicular anicut anidian anidiomatic anidiomatical anidrosis Aniellidae aniente anigh anight anights anil anilao anilau anile anileness anilic anilid anilide anilidic anilidoxime aniline anilinism anilinophile anilinophilous anility anilla anilopyrin anilopyrine anima animability animable animableness animadversion animadversional animadversive animadversiveness animadvert animadverter animal animalcula animalculae animalcular animalcule animalculine animalculism animalculist animalculous animalculum animalhood Animalia animalian animalic animalier animalish animalism animalist animalistic animality Animalivora animalivore animalivorous animalization animalize animally animastic animastical animate animated animatedly animately animateness animater animating animatingly animation animatism animatistic animative animatograph animator anime animi Animikean animikite animism animist animistic animize animosity animotheism animous animus anion anionic aniridia anis anisal anisalcohol anisaldehyde anisaldoxime anisamide anisandrous anisanilide anisate anischuria anise aniseed aniseikonia aniseikonic aniselike aniseroot anisette anisic anisidin anisidine anisil anisilic anisobranchiate anisocarpic anisocarpous anisocercal anisochromatic anisochromia anisocoria anisocotyledonous anisocotyly anisocratic anisocycle anisocytosis anisodactyl Anisodactyla Anisodactyli anisodactylic anisodactylous anisodont anisogamete anisogamous anisogamy anisogenous anisogeny anisognathism anisognathous anisogynous anisoin anisole anisoleucocytosis Anisomeles anisomelia anisomelus anisomeric anisomerous anisometric anisometrope anisometropia anisometropic anisomyarian Anisomyodi anisomyodian anisomyodous anisopetalous anisophyllous anisophylly anisopia anisopleural anisopleurous anisopod Anisopoda anisopodal anisopodous anisopogonous Anisoptera anisopterous anisosepalous anisospore anisostaminous anisostemonous anisosthenic anisostichous Anisostichus anisostomous anisotonic anisotropal anisotrope anisotropic anisotropical anisotropically anisotropism anisotropous anisotropy anisoyl anisum anisuria anisyl anisylidene Anita anither anitrogenous anjan Anjou ankaramite ankaratrite ankee anker ankerite ankh ankle anklebone anklejack anklet anklong Ankoli Ankou ankus ankusha ankylenteron ankyloblepharon ankylocheilia ankylodactylia ankylodontia ankyloglossia ankylomele ankylomerism ankylophobia ankylopodia ankylopoietic ankyloproctia ankylorrhinia Ankylosaurus ankylose ankylosis ankylostoma ankylotia ankylotic ankylotome ankylotomy ankylurethria ankyroid anlace anlaut Ann ann Anna anna Annabel annabergite annal annale annaline annalism annalist annalistic annalize annals Annam Annamese Annamite Annamitic Annapurna Annard annat annates annatto Anne anneal annealer annectent annection annelid Annelida annelidan Annelides annelidian annelidous annelism Annellata anneloid annerodite Anneslia annet Annette annex annexa annexable annexal annexation annexational annexationist annexer annexion annexionist annexitis annexive annexment annexure annidalin Annie Anniellidae annihilability annihilable annihilate annihilation annihilationism annihilationist annihilative annihilator annihilatory Annist annite anniversarily anniversariness anniversary anniverse annodated Annona annona Annonaceae annonaceous annotate annotater annotation annotative annotator annotatory annotine annotinous announce announceable announcement announcer annoy annoyance annoyancer annoyer annoyful annoying annoyingly annoyingness annoyment annual annualist annualize annually annuary annueler annuent annuitant annuity annul annular Annularia annularity annularly annulary Annulata annulate annulated annulation annulet annulettee annulism annullable annullate annullation annuller annulment annuloid Annuloida Annulosa annulosan annulose annulus annunciable annunciate annunciation annunciative annunciator annunciatory anoa Anobiidae anocarpous anociassociation anococcygeal anodal anode anodendron anodic anodically anodize Anodon Anodonta anodontia anodos anodyne anodynia anodynic anodynous anoegenetic anoesia anoesis anoestrous anoestrum anoestrus anoetic anogenic anogenital Anogra anoil anoine anoint anointer anointment anole anoli anolian Anolis Anolympiad anolyte Anomala anomaliflorous anomaliped anomalism anomalist anomalistic anomalistical anomalistically anomalocephalus anomaloflorous Anomalogonatae anomalogonatous Anomalon anomalonomy Anomalopteryx anomaloscope anomalotrophy anomalous anomalously anomalousness anomalure Anomaluridae Anomalurus anomaly Anomatheca Anomia Anomiacea Anomiidae anomite anomocarpous anomodont Anomodontia Anomoean Anomoeanism anomophyllous anomorhomboid anomorhomboidal anomphalous Anomura anomural anomuran anomurous anomy anon anonang anoncillo anonol anonychia anonym anonyma anonymity anonymous anonymously anonymousness anonymuncule anoopsia anoperineal anophele Anopheles Anophelinae anopheline anophoria anophthalmia anophthalmos Anophthalmus anophyte anopia anopisthographic Anopla Anoplanthus anoplocephalic anoplonemertean Anoplonemertini anoplothere Anoplotheriidae anoplotherioid Anoplotherium anoplotheroid Anoplura anopluriform anopsia anopubic anorak anorchia anorchism anorchous anorchus anorectal anorectic anorectous anorexia anorexy anorgana anorganic anorganism anorganology anormal anormality anorogenic anorth anorthic anorthite anorthitic anorthitite anorthoclase anorthographic anorthographical anorthographically anorthography anorthophyre anorthopia anorthoscope anorthose anorthosite anoscope anoscopy Anosia anosmatic anosmia anosmic anosphrasia anosphresia anospinal anostosis Anostraca anoterite another anotherkins anotia anotropia anotta anotto anotus anounou Anous anovesical anoxemia anoxemic anoxia anoxic anoxidative anoxybiosis anoxybiotic anoxyscope ansa ansar ansarian Ansarie ansate ansation Anseis Ansel Anselm Anselmian Anser anserated Anseres Anseriformes Anserinae anserine anserous anspessade ansu ansulate answer answerability answerable answerableness answerably answerer answeringly answerless answerlessly ant Anta anta antacid antacrid antadiform Antaean Antaeus antagonism antagonist antagonistic antagonistical antagonistically antagonization antagonize antagonizer antagony Antaimerina Antaios Antaiva antal antalgesic antalgol antalkali antalkaline antambulacral antanacathartic antanaclasis Antanandro antanemic antapex antaphrodisiac antaphroditic antapocha antapodosis antapology antapoplectic Antar Antara antarchism antarchist antarchistic antarchistical antarchy Antarctalia Antarctalian antarctic Antarctica antarctica antarctical antarctically Antarctogaea Antarctogaean Antares antarthritic antasphyctic antasthenic antasthmatic antatrophic antdom ante anteact anteal anteambulate anteambulation anteater antebaptismal antebath antebrachial antebrachium antebridal antecabinet antecaecal antecardium antecavern antecedaneous antecedaneously antecede antecedence antecedency antecedent antecedental antecedently antecessor antechamber antechapel Antechinomys antechoir antechurch anteclassical antecloset antecolic antecommunion anteconsonantal antecornu antecourt antecoxal antecubital antecurvature antedate antedawn antediluvial antediluvially antediluvian Antedon antedonin antedorsal antefebrile antefix antefixal anteflected anteflexed anteflexion antefurca antefurcal antefuture antegarden antegrade antehall antehistoric antehuman antehypophysis anteinitial antejentacular antejudiciary antejuramentum antelabium antelegal antelocation antelope antelopian antelucan antelude anteluminary antemarginal antemarital antemedial antemeridian antemetallic antemetic antemillennial antemingent antemortal antemundane antemural antenarial antenatal antenatalitial antenati antenave antenna antennae antennal Antennaria antennariid Antennariidae Antennarius antennary Antennata antennate antenniferous antenniform antennula antennular antennulary antennule antenodal antenoon Antenor antenumber anteoccupation anteocular anteopercle anteoperculum anteorbital antepagmenta antepagments antepalatal antepaschal antepast antepatriarchal antepectoral antepectus antependium antepenult antepenultima antepenultimate antephialtic antepileptic antepirrhema anteporch anteportico anteposition anteposthumous anteprandial antepredicament antepredicamental antepreterit antepretonic anteprohibition anteprostate anteprostatic antepyretic antequalm antereformation antereformational anteresurrection anterethic anterevolutional anterevolutionary anteriad anterior anteriority anteriorly anteriorness anteroclusion anterodorsal anteroexternal anterofixation anteroflexion anterofrontal anterograde anteroinferior anterointerior anterointernal anterolateral anterolaterally anteromedial anteromedian anteroom anteroparietal anteroposterior anteroposteriorly anteropygal anterospinal anterosuperior anteroventral anteroventrally antes antescript antesignanus antespring antestature antesternal antesternum antesunrise antesuperior antetemple antetype Anteva antevenient anteversion antevert antevocalic antewar anthecological anthecologist anthecology Antheia anthela anthelion anthelmintic anthem anthema anthemene anthemia Anthemideae anthemion Anthemis anthemwise anthemy anther Antheraea antheral Anthericum antherid antheridial antheridiophore antheridium antheriferous antheriform antherless antherogenous antheroid antherozoid antherozoidal antherozooid antherozooidal anthesis Anthesteria Anthesteriac anthesterin Anthesterion anthesterol antheximeter Anthicidae Anthidium anthill Anthinae anthine anthobiology anthocarp anthocarpous anthocephalous Anthoceros Anthocerotaceae Anthocerotales anthocerote anthochlor anthochlorine anthoclinium anthocyan anthocyanidin anthocyanin anthodium anthoecological anthoecologist anthoecology anthogenesis anthogenetic anthogenous anthography anthoid anthokyan antholite anthological anthologically anthologion anthologist anthologize anthology antholysis Antholyza anthomania anthomaniac Anthomedusae anthomedusan Anthomyia anthomyiid Anthomyiidae Anthonin Anthonomus Anthony anthood anthophagous Anthophila anthophile anthophilian anthophilous anthophobia Anthophora anthophore Anthophoridae anthophorous anthophyllite anthophyllitic Anthophyta anthophyte anthorine anthosiderite Anthospermum anthotaxis anthotaxy anthotropic anthotropism anthoxanthin Anthoxanthum Anthozoa anthozoan anthozoic anthozooid anthozoon anthracemia anthracene anthraceniferous anthrachrysone anthracia anthracic anthraciferous anthracin anthracite anthracitic anthracitiferous anthracitious anthracitism anthracitization anthracnose anthracnosis anthracocide anthracoid anthracolithic anthracomancy Anthracomarti anthracomartian Anthracomartus anthracometer anthracometric anthraconecrosis anthraconite Anthracosaurus anthracosis anthracothere Anthracotheriidae Anthracotherium anthracotic anthracyl anthradiol anthradiquinone anthraflavic anthragallol anthrahydroquinone anthramine anthranil anthranilate anthranilic anthranol anthranone anthranoyl anthranyl anthraphenone anthrapurpurin anthrapyridine anthraquinol anthraquinone anthraquinonyl anthrarufin anthratetrol anthrathiophene anthratriol anthrax anthraxolite anthraxylon Anthrenus anthribid Anthribidae Anthriscus anthrohopobiological anthroic anthrol anthrone anthropic anthropical Anthropidae anthropobiologist anthropobiology anthropocentric anthropocentrism anthropoclimatologist anthropoclimatology anthropocosmic anthropodeoxycholic Anthropodus anthropogenesis anthropogenetic anthropogenic anthropogenist anthropogenous anthropogeny anthropogeographer anthropogeographical anthropogeography anthropoglot anthropogony anthropography anthropoid anthropoidal Anthropoidea anthropoidean anthropolater anthropolatric anthropolatry anthropolite anthropolithic anthropolitic anthropological anthropologically anthropologist anthropology anthropomancy anthropomantic anthropomantist anthropometer anthropometric anthropometrical anthropometrically anthropometrist anthropometry anthropomorph Anthropomorpha anthropomorphic anthropomorphical anthropomorphically Anthropomorphidae anthropomorphism anthropomorphist anthropomorphite anthropomorphitic anthropomorphitical anthropomorphitism anthropomorphization anthropomorphize anthropomorphological anthropomorphologically anthropomorphology anthropomorphosis anthropomorphotheist anthropomorphous anthropomorphously anthroponomical anthroponomics anthroponomist anthroponomy anthropopathia anthropopathic anthropopathically anthropopathism anthropopathite anthropopathy anthropophagi anthropophagic anthropophagical anthropophaginian anthropophagism anthropophagist anthropophagistic anthropophagite anthropophagize anthropophagous anthropophagously anthropophagy anthropophilous anthropophobia anthropophuism anthropophuistic anthropophysiography anthropophysite Anthropopithecus anthropopsychic anthropopsychism Anthropos anthroposcopy anthroposociologist anthroposociology anthroposomatology anthroposophical anthroposophist anthroposophy anthropoteleoclogy anthropoteleological anthropotheism anthropotomical anthropotomist anthropotomy anthropotoxin Anthropozoic anthropurgic anthroropolith anthroxan anthroxanic anthryl anthrylene Anthurium Anthus Anthyllis anthypophora anthypophoretic Anti anti antiabolitionist antiabrasion antiabrin antiabsolutist antiacid antiadiaphorist antiaditis antiadministration antiae antiaesthetic antiager antiagglutinating antiagglutinin antiaggression antiaggressionist antiaggressive antiaircraft antialbumid antialbumin antialbumose antialcoholic antialcoholism antialcoholist antialdoxime antialexin antialien antiamboceptor antiamusement antiamylase antianaphylactogen antianaphylaxis antianarchic antianarchist antiangular antiannexation antiannexationist antianopheline antianthrax antianthropocentric antianthropomorphism antiantibody antiantidote antiantienzyme antiantitoxin antiaphrodisiac antiaphthic antiapoplectic antiapostle antiaquatic antiar Antiarcha Antiarchi antiarin Antiaris antiaristocrat antiarthritic antiascetic antiasthmatic antiastronomical antiatheism antiatheist antiatonement antiattrition antiautolysin antibacchic antibacchius antibacterial antibacteriolytic antiballooner antibalm antibank antibasilican antibenzaldoxime antiberiberin antibibliolatry antibigotry antibilious antibiont antibiosis antibiotic antibishop antiblastic antiblennorrhagic antiblock antiblue antibody antiboxing antibreakage antibridal antibromic antibubonic Antiburgher antic anticachectic antical anticalcimine anticalculous anticalligraphic anticancer anticapital anticapitalism anticapitalist anticardiac anticardium anticarious anticarnivorous anticaste anticatalase anticatalyst anticatalytic anticatalyzer anticatarrhal anticathexis anticathode anticaustic anticensorship anticentralization anticephalalgic anticeremonial anticeremonialism anticeremonialist anticheater antichlor antichlorine antichloristic antichlorotic anticholagogue anticholinergic antichoromanic antichorus antichresis antichretic antichrist antichristian antichristianity antichristianly antichrome antichronical antichronically antichthon antichurch antichurchian antichymosin anticipant anticipatable anticipate anticipation anticipative anticipatively anticipator anticipatorily anticipatory anticivic anticivism anticize anticker anticlactic anticlassical anticlassicist Anticlea anticlergy anticlerical anticlericalism anticlimactic anticlimax anticlinal anticline anticlinorium anticlockwise anticlogging anticly anticnemion anticness anticoagulant anticoagulating anticoagulative anticoagulin anticogitative anticolic anticombination anticomet anticomment anticommercial anticommunist anticomplement anticomplementary anticomplex anticonceptionist anticonductor anticonfederationist anticonformist anticonscience anticonscription anticonscriptive anticonstitutional anticonstitutionalist anticonstitutionally anticontagion anticontagionist anticontagious anticonventional anticonventionalism anticonvulsive anticor anticorn anticorrosion anticorrosive anticorset anticosine anticosmetic anticouncil anticourt anticourtier anticous anticovenanter anticovenanting anticreation anticreative anticreator anticreep anticreeper anticreeping anticrepuscular anticrepuscule anticrisis anticritic anticritique anticrochet anticrotalic anticryptic anticum anticyclic anticyclone anticyclonic anticyclonically anticynic anticytolysin anticytotoxin antidactyl antidancing antidecalogue antideflation antidemocrat antidemocratic antidemocratical antidemoniac antidetonant antidetonating antidiabetic antidiastase Antidicomarian Antidicomarianite antidictionary antidiffuser antidinic antidiphtheria antidiphtheric antidiphtherin antidiphtheritic antidisciplinarian antidivine antidivorce antidogmatic antidomestic antidominican Antidorcas antidoron antidotal antidotally antidotary antidote antidotical antidotically antidotism antidraft antidrag antidromal antidromic antidromically antidromous antidromy antidrug antiduke antidumping antidynamic antidynastic antidyscratic antidysenteric antidysuric antiecclesiastic antiecclesiastical antiedemic antieducation antieducational antiegotism antiejaculation antiemetic antiemperor antiempirical antiendotoxin antiendowment antienergistic antienthusiastic antienzyme antienzymic antiepicenter antiepileptic antiepiscopal antiepiscopist antiepithelial antierosion antierysipelas Antietam antiethnic antieugenic antievangelical antievolution antievolutionist antiexpansionist antiexporting antiextreme antieyestrain antiface antifaction antifame antifanatic antifat antifatigue antifebrile antifederal antifederalism antifederalist antifelon antifelony antifeminism antifeminist antiferment antifermentative antifertilizer antifeudal antifeudalism antifibrinolysin antifibrinolysis antifideism antifire antiflash antiflattering antiflatulent antiflux antifoam antifoaming antifogmatic antiforeign antiforeignism antiformin antifouler antifouling antifowl antifreeze antifreezing antifriction antifrictional antifrost antifundamentalist antifungin antigalactagogue antigalactic antigambling antiganting antigen antigenic antigenicity antighostism antigigmanic antiglare antiglyoxalase antigod Antigone antigonococcic Antigonon antigonorrheic Antigonus antigorite antigovernment antigraft antigrammatical antigraph antigravitate antigravitational antigropelos antigrowth Antiguan antiguggler antigyrous antihalation antiharmonist antihectic antihelix antihelminthic antihemagglutinin antihemisphere antihemoglobin antihemolysin antihemolytic antihemorrhagic antihemorrheidal antihero antiheroic antiheroism antiheterolysin antihidrotic antihierarchical antihierarchist antihistamine antihistaminic antiholiday antihormone antihuff antihum antihuman antihumbuggist antihunting antihydrophobic antihydropic antihydropin antihygienic antihylist antihypnotic antihypochondriac antihypophora antihysteric Antikamnia antikathode antikenotoxin antiketogen antiketogenesis antiketogenic antikinase antiking antiknock antilabor antilaborist antilacrosse antilacrosser antilactase antilapsarian antileague antilegalist antilegomena antilemic antilens antilepsis antileptic antilethargic antileveling Antilia antiliberal antilibration antilift antilipase antilipoid antiliquor antilithic antiliturgical antiliturgist Antillean antilobium Antilocapra Antilocapridae Antilochus antiloemic antilogarithm antilogic antilogical antilogism antilogous antilogy antiloimic Antilope Antilopinae antilottery antiluetin antilynching antilysin antilysis antilyssic antilytic antimacassar antimachine antimachinery antimagistratical antimalaria antimalarial antimallein antimaniac antimaniacal Antimarian antimark antimartyr antimask antimasker Antimason Antimasonic Antimasonry antimasque antimasquer antimasquerade antimaterialist antimaterialistic antimatrimonial antimatrimonialist antimedical antimedieval antimelancholic antimellin antimeningococcic antimension antimensium antimephitic antimere antimerger antimeric Antimerina antimerism antimeristem antimetabole antimetathesis antimetathetic antimeter antimethod antimetrical antimetropia antimetropic antimiasmatic antimicrobic antimilitarism antimilitarist antimilitary antiministerial antiministerialist antiminsion antimiscegenation antimission antimissionary antimissioner antimixing antimnemonic antimodel antimodern antimonarchial antimonarchic antimonarchical antimonarchically antimonarchicalness antimonarchist antimonate antimonial antimoniate antimoniated antimonic antimonid antimonide antimoniferous antimonious antimonite antimonium antimoniuret antimoniureted antimoniuretted antimonopolist antimonopoly antimonsoon antimony antimonyl antimoral antimoralism antimoralist antimosquito antimusical antimycotic antimythic antimythical antinarcotic antinarrative antinational antinationalist antinationalistic antinatural antinegro antinegroism antineologian antinephritic antinepotic antineuralgic antineuritic antineurotoxin antineutral antinial antinicotine antinion antinode antinoise antinome antinomian antinomianism antinomic antinomical antinomist antinomy antinormal antinosarian Antinous Antiochene Antiochian Antiochianism antiodont antiodontalgic Antiope antiopelmous antiophthalmic antiopium antiopiumist antiopiumite antioptimist antioptionist antiorgastic antiorthodox antioxidant antioxidase antioxidizer antioxidizing antioxygen antioxygenation antioxygenator antioxygenic antipacifist antipapacy antipapal antipapalist antipapism antipapist antipapistical antiparabema antiparagraphe antiparagraphic antiparallel antiparallelogram antiparalytic antiparalytical antiparasitic antiparastatitis antiparliament antiparliamental antiparliamentarist antiparliamentary antipart Antipasch Antipascha antipass antipastic Antipatharia antipatharian antipathetic antipathetical antipathetically antipatheticalness antipathic Antipathida antipathist antipathize antipathogen antipathy antipatriarch antipatriarchal antipatriot antipatriotic antipatriotism antipedal Antipedobaptism Antipedobaptist antipeduncular antipellagric antipepsin antipeptone antiperiodic antiperistalsis antiperistaltic antiperistasis antiperistatic antiperistatical antiperistatically antipersonnel antiperthite antipestilential antipetalous antipewism antiphagocytic antipharisaic antipharmic antiphase antiphilosophic antiphilosophical antiphlogistian antiphlogistic antiphon antiphonal antiphonally antiphonary antiphoner antiphonetic antiphonic antiphonical antiphonically antiphonon antiphony antiphrasis antiphrastic antiphrastical antiphrastically antiphthisic antiphthisical antiphylloxeric antiphysic antiphysical antiphysician antiplague antiplanet antiplastic antiplatelet antipleion antiplenist antiplethoric antipleuritic antiplurality antipneumococcic antipodagric antipodagron antipodal antipode antipodean antipodes antipodic antipodism antipodist antipoetic antipoints antipolar antipole antipolemist antipolitical antipollution antipolo antipolygamy antipolyneuritic antipool antipooling antipope antipopery antipopular antipopulationist antiportable antiposition antipoverty antipragmatic antipragmatist antiprecipitin antipredeterminant antiprelate antiprelatic antiprelatist antipreparedness antiprestidigitation antipriest antipriestcraft antiprime antiprimer antipriming antiprinciple antiprism antiproductionist antiprofiteering antiprohibition antiprohibitionist antiprojectivity antiprophet antiprostate antiprostatic antiprotease antiproteolysis antiprotozoal antiprudential antipruritic antipsalmist antipsoric antiptosis antipudic antipuritan antiputrefaction antiputrefactive antiputrescent antiputrid antipyic antipyonin antipyresis antipyretic Antipyrine antipyrotic antipyryl antiqua antiquarian antiquarianism antiquarianize antiquarianly antiquarism antiquartan antiquary antiquate antiquated antiquatedness antiquation antique antiquely antiqueness antiquer antiquing antiquist antiquitarian antiquity antirabic antirabies antiracemate antiracer antirachitic antirachitically antiracing antiradiating antiradiation antiradical antirailwayist antirational antirationalism antirationalist antirationalistic antirattler antireactive antirealism antirealistic antirebating antirecruiting antired antireducer antireform antireformer antireforming antireformist antireligion antireligious antiremonstrant antirennet antirennin antirent antirenter antirentism antirepublican antireservationist antirestoration antireticular antirevisionist antirevolutionary antirevolutionist antirheumatic antiricin antirickets antiritual antiritualistic antirobin antiromance antiromantic antiromanticism antiroyal antiroyalist Antirrhinum antirumor antirun antirust antisacerdotal antisacerdotalist antisaloon antisalooner antisavage antiscabious antiscale antischolastic antischool antiscians antiscientific antiscion antiscolic antiscorbutic antiscorbutical antiscrofulous antiseismic antiselene antisensitizer antisensuous antisensuousness antisepalous antisepsin antisepsis antiseptic antiseptical antiseptically antisepticism antisepticist antisepticize antiseption antiseptize antiserum antishipping Antisi antisialagogue antisialic antisiccative antisideric antisilverite antisimoniacal antisine antisiphon antisiphonal antiskeptical antiskid antiskidding antislavery antislaveryism antislickens antislip antismoking antisnapper antisocial antisocialist antisocialistic antisocialistically antisociality antisolar antisophist antisoporific antispace antispadix antispasis antispasmodic antispast antispastic antispectroscopic antispermotoxin antispiritual antispirochetic antisplasher antisplenetic antisplitting antispreader antispreading antisquama antisquatting antistadholder antistadholderian antistalling antistaphylococcic antistate antistatism antistatist antisteapsin antisterility antistes antistimulant antistock antistreptococcal antistreptococcic antistreptococcin antistreptococcus antistrike antistrophal antistrophe antistrophic antistrophically antistrophize antistrophon antistrumatic antistrumous antisubmarine antisubstance antisudoral antisudorific antisuffrage antisuffragist antisun antisupernaturalism antisupernaturalist antisurplician antisymmetrical antisyndicalism antisyndicalist antisynod antisyphilitic antitabetic antitabloid antitangent antitank antitarnish antitartaric antitax antiteetotalism antitegula antitemperance antitetanic antitetanolysin antithalian antitheft antitheism antitheist antitheistic antitheistical antitheistically antithenar antitheologian antitheological antithermic antithermin antitheses antithesis antithesism antithesize antithet antithetic antithetical antithetically antithetics antithrombic antithrombin antitintinnabularian antitobacco antitobacconal antitobacconist antitonic antitorpedo antitoxic antitoxin antitrade antitrades antitraditional antitragal antitragic antitragicus antitragus antitrismus antitrochanter antitropal antitrope antitropic antitropical antitropous antitropy antitrust antitrypsin antitryptic antituberculin antituberculosis antituberculotic antituberculous antiturnpikeism antitwilight antitypal antitype antityphoid antitypic antitypical antitypically antitypy antityrosinase antiunion antiunionist antiuratic antiurease antiusurious antiutilitarian antivaccination antivaccinationist antivaccinator antivaccinist antivariolous antivenefic antivenereal antivenin antivenom antivenomous antivermicular antivibrating antivibrator antivibratory antivice antiviral antivirus antivitalist antivitalistic antivitamin antivivisection antivivisectionist antivolition antiwar antiwarlike antiwaste antiwedge antiweed antiwit antixerophthalmic antizealot antizymic antizymotic antler antlered antlerite antlerless antlia antliate Antlid antling antluetic antodontalgic antoeci antoecian antoecians Antoinette Anton Antonella Antonia Antonina antoninianus Antonio antonomasia antonomastic antonomastical antonomastically antonomasy Antony antonym antonymous antonymy antorbital antproof antra antral antralgia antre antrectomy antrin antritis antrocele antronasal antrophore antrophose antrorse antrorsely antroscope antroscopy Antrostomus antrotome antrotomy antrotympanic antrotympanitis antrum antrustion antrustionship antship Antu antu Antum Antwerp antwise anubing Anubis anucleate anukabiet Anukit anuloma Anura anuran anuresis anuretic anuria anuric anurous anury anus anusim anusvara anutraminosa anvasser anvil anvilsmith anxietude anxiety anxious anxiously anxiousness any anybody Anychia anyhow anyone anyplace Anystidae anything anythingarian anythingarianism anyway anyways anywhen anywhere anywhereness anywheres anywhy anywise anywither Anzac Anzanian Ao aogiri Aoife aonach Aonian aorist aoristic aoristically aorta aortal aortarctia aortectasia aortectasis aortic aorticorenal aortism aortitis aortoclasia aortoclasis aortolith aortomalacia aortomalaxis aortopathy aortoptosia aortoptosis aortorrhaphy aortosclerosis aortostenosis aortotomy aosmic Aotea Aotearoa Aotes Aotus aoudad Aouellimiden Aoul apa apabhramsa apace Apache apache Apachette apachism apachite apadana apagoge apagogic apagogical apagogically apaid Apalachee apalit Apama apandry Apanteles Apantesis apanthropia apanthropy apar Aparai aparaphysate aparejo Apargia aparithmesis apart apartheid aparthrosis apartment apartmental apartness apasote apastron apatan Apatela apatetic apathetic apathetical apathetically apathic apathism apathist apathistical apathogenic Apathus apathy apatite Apatornis Apatosaurus Apaturia Apayao ape apeak apectomy apedom apehood apeiron apelet apelike apeling apellous Apemantus Apennine apenteric apepsia apepsinia apepsy apeptic aper aperch aperea aperient aperiodic aperiodically aperiodicity aperispermic aperistalsis aperitive apert apertly apertness apertometer apertural aperture apertured Aperu apery apesthesia apesthetic apesthetize Apetalae apetaloid apetalose apetalous apetalousness apetaly apex apexed aphaeresis aphaeretic aphagia aphakia aphakial aphakic Aphanapteryx Aphanes aphanesite Aphaniptera aphanipterous aphanite aphanitic aphanitism Aphanomyces aphanophyre aphanozygous Apharsathacites aphasia aphasiac aphasic Aphelandra Aphelenchus aphelian Aphelinus aphelion apheliotropic apheliotropically apheliotropism Aphelops aphemia aphemic aphengescope aphengoscope aphenoscope apheresis apheretic aphesis apheta aphetic aphetically aphetism aphetize aphicidal aphicide aphid aphides aphidian aphidicide aphidicolous aphidid Aphididae Aphidiinae aphidious Aphidius aphidivorous aphidolysin aphidophagous aphidozer aphilanthropy Aphis aphlaston aphlebia aphlogistic aphnology aphodal aphodian Aphodius aphodus aphonia aphonic aphonous aphony aphoria aphorism aphorismatic aphorismer aphorismic aphorismical aphorismos aphorist aphoristic aphoristically aphorize aphorizer Aphoruridae aphotic aphototactic aphototaxis aphototropic aphototropism Aphra aphrasia aphrite aphrizite aphrodisia aphrodisiac aphrodisiacal aphrodisian Aphrodision Aphrodistic Aphrodite Aphroditeum aphroditic Aphroditidae aphroditous aphrolite aphronia aphrosiderite aphtha Aphthartodocetae Aphthartodocetic Aphthartodocetism aphthic aphthitalite aphthoid aphthong aphthongal aphthongia aphthous aphydrotropic aphydrotropism aphyllose aphyllous aphylly aphyric Apiaca Apiaceae apiaceous Apiales apian apiarian apiarist apiary apiator apicad apical apically apices Apician apicifixed apicilar apicillary apicitis apickaback apicoectomy apicolysis apicula apicular apiculate apiculated apiculation apicultural apiculture apiculturist apiculus Apidae apiece apieces apigenin apii apiin apikoros apilary Apina Apinae Apinage apinch aping apinoid apio Apioceridae apioid apioidal apiole apiolin apiologist apiology apionol Apios apiose Apiosoma apiphobia Apis apish apishamore apishly apishness apism apitong apitpat Apium apivorous apjohnite aplacental Aplacentalia Aplacentaria Aplacophora aplacophoran aplacophorous aplanat aplanatic aplanatically aplanatism Aplanobacter aplanogamete aplanospore aplasia aplastic Aplectrum aplenty aplite aplitic aplobasalt aplodiorite Aplodontia Aplodontiidae aplomb aplome Aplopappus aploperistomatous aplostemonous aplotaxene aplotomy Apluda aplustre Aplysia apnea apneal apneic apneumatic apneumatosis Apneumona apneumonous apneustic apoaconitine apoatropine apobiotic apoblast apocaffeine apocalypse apocalypst apocalypt apocalyptic apocalyptical apocalyptically apocalypticism apocalyptism apocalyptist apocamphoric apocarp apocarpous apocarpy apocatastasis apocatastatic apocatharsis apocenter apocentric apocentricity apocha apocholic apochromat apochromatic apochromatism apocinchonine apocodeine apocopate apocopated apocopation apocope apocopic apocrenic apocrisiary Apocrita apocrustic apocryph Apocrypha apocryphal apocryphalist apocryphally apocryphalness apocryphate apocryphon Apocynaceae apocynaceous apocyneous Apocynum apod Apoda apodal apodan apodeipnon apodeixis apodema apodemal apodematal apodeme Apodes Apodia apodia apodictic apodictical apodictically apodictive Apodidae apodixis apodosis apodous apodyterium apoembryony apofenchene apogaeic apogalacteum apogamic apogamically apogamous apogamously apogamy apogeal apogean apogee apogeic apogenous apogeny apogeotropic apogeotropically apogeotropism Apogon Apogonidae apograph apographal apoharmine apohyal Apoidea apoise apojove apokrea apokreos apolar apolarity apolaustic apolegamic Apolista Apolistan Apollinarian Apollinarianism Apolline Apollo Apollonia Apollonian Apollonic apollonicon Apollonistic Apolloship Apollyon apologal apologete apologetic apologetical apologetically apologetics apologia apologist apologize apologizer apologue apology apolousis Apolysin apolysis apolytikion apomecometer apomecometry apometabolic apometabolism apometabolous apometaboly apomictic apomictical apomixis apomorphia apomorphine aponeurology aponeurorrhaphy aponeurosis aponeurositis aponeurotic aponeurotome aponeurotomy aponia aponic Aponogeton Aponogetonaceae aponogetonaceous apoop apopenptic apopetalous apophantic apophasis apophatic Apophis apophlegmatic apophonia apophony apophorometer apophthegm apophthegmatist apophyge apophylactic apophylaxis apophyllite apophyllous apophysary apophysate apophyseal apophysis apophysitis apoplasmodial apoplastogamous apoplectic apoplectical apoplectically apoplectiform apoplectoid apoplex apoplexy apopyle apoquinamine apoquinine aporetic aporetical aporhyolite aporia Aporobranchia aporobranchian Aporobranchiata Aporocactus Aporosa aporose aporphin aporphine Aporrhaidae Aporrhais aporrhaoid aporrhegma aport aportoise aposafranine aposaturn aposaturnium aposematic aposematically aposepalous aposia aposiopesis aposiopetic apositia apositic aposoro aposporogony aposporous apospory apostasis apostasy apostate apostatic apostatical apostatically apostatism apostatize apostaxis apostemate apostematic apostemation apostematous aposteme aposteriori aposthia apostil apostle apostlehood apostleship apostolate apostoless apostoli Apostolian Apostolic apostolic apostolical apostolically apostolicalness Apostolici apostolicism apostolicity apostolize Apostolos apostrophal apostrophation apostrophe apostrophic apostrophied apostrophize apostrophus Apotactic Apotactici apotelesm apotelesmatic apotelesmatical apothecal apothecary apothecaryship apothece apothecial apothecium apothegm apothegmatic apothegmatical apothegmatically apothegmatist apothegmatize apothem apotheose apotheoses apotheosis apotheosize apothesine apothesis apotome apotracheal apotropaic apotropaion apotropaism apotropous apoturmeric apotype apotypic apout apoxesis Apoxyomenos apozem apozema apozemical apozymase Appalachia Appalachian appall appalling appallingly appallment appalment appanage appanagist apparatus apparel apparelment apparence apparency apparent apparently apparentness apparition apparitional apparitor appassionata appassionato appay appeal appealability appealable appealer appealing appealingly appealingness appear appearance appearanced appearer appeasable appeasableness appeasably appease appeasement appeaser appeasing appeasingly appeasive appellability appellable appellancy appellant appellate appellation appellational appellative appellatived appellatively appellativeness appellatory appellee appellor append appendage appendaged appendalgia appendance appendancy appendant appendectomy appendical appendicalgia appendice appendicectasis appendicectomy appendices appendicial appendicious appendicitis appendicle appendicocaecostomy appendicostomy appendicular Appendicularia appendicularian Appendiculariidae Appendiculata appendiculate appendiculated appenditious appendix appendorontgenography appendotome appentice apperceive apperception apperceptionism apperceptionist apperceptionistic apperceptive apperceptively appercipient appersonation appertain appertainment appertinent appet appete appetence appetency appetent appetently appetibility appetible appetibleness appetite appetition appetitional appetitious appetitive appetize appetizement appetizer appetizingly appinite Appius applanate applanation applaud applaudable applaudably applauder applaudingly applause applausive applausively apple appleberry appleblossom applecart appledrane applegrower applejack applejohn applemonger applenut appleringy appleroot applesauce applewife applewoman appliable appliableness appliably appliance appliant applicability applicable applicableness applicably applicancy applicant applicate application applicative applicatively applicator applicatorily applicatory applied appliedly applier applique applosion applosive applot applotment apply applyingly applyment appoggiatura appoint appointable appointe appointee appointer appointive appointment appointor Appomatox Appomattoc apport apportion apportionable apportioner apportionment apposability apposable appose apposer apposiopestic apposite appositely appositeness apposition appositional appositionally appositive appositively appraisable appraisal appraise appraisement appraiser appraising appraisingly appraisive appreciable appreciably appreciant appreciate appreciatingly appreciation appreciational appreciativ appreciative appreciatively appreciativeness appreciator appreciatorily appreciatory appredicate apprehend apprehender apprehendingly apprehensibility apprehensible apprehensibly apprehension apprehensive apprehensively apprehensiveness apprend apprense apprentice apprenticehood apprenticement apprenticeship appressed appressor appressorial appressorium appreteur apprise apprize apprizement apprizer approach approachability approachabl approachable approachableness approacher approaching approachless approachment approbate approbation approbative approbativeness approbator approbatory approof appropinquate appropinquation appropinquity appropre appropriable appropriate appropriately appropriateness appropriation appropriative appropriativeness appropriator approvable approvableness approval approvance approve approvedly approvedness approvement approver approvingly approximal approximate approximately approximation approximative approximatively approximativeness approximator appulse appulsion appulsive appulsively appurtenance appurtenant apractic apraxia apraxic apricate aprication aprickle apricot April Aprilesque Apriline Aprilis apriori apriorism apriorist aprioristic apriority Aprocta aproctia aproctous apron aproneer apronful apronless apronlike apropos aprosexia aprosopia aprosopous aproterodont apse apselaphesia apselaphesis apsidal apsidally apsides apsidiole apsis apsychia apsychical apt Aptal Aptenodytes Aptera apteral apteran apterial apterium apteroid apterous Apteryges apterygial Apterygidae Apterygiformes Apterygogenea Apterygota apterygote apterygotous Apteryx Aptian Aptiana aptitude aptitudinal aptitudinally aptly aptness aptote aptotic aptyalia aptyalism aptychus Apulian apulmonic apulse apurpose Apus apyonin apyrene apyretic apyrexia apyrexial apyrexy apyrotype apyrous aqua aquabelle aquabib aquacade aquacultural aquaculture aquaemanale aquafortist aquage aquagreen aquamarine aquameter aquaplane aquapuncture aquarelle aquarellist aquaria aquarial Aquarian aquarian Aquarid Aquarii aquariist aquarium Aquarius aquarter aquascutum aquatic aquatical aquatically aquatile aquatint aquatinta aquatinter aquation aquativeness aquatone aquavalent aquavit aqueduct aqueoglacial aqueoigneous aqueomercurial aqueous aqueously aqueousness aquicolous aquicultural aquiculture aquiculturist aquifer aquiferous Aquifoliaceae aquifoliaceous aquiform Aquila Aquilaria aquilawood aquilege Aquilegia Aquilian Aquilid aquiline aquilino aquincubital aquincubitalism Aquinist aquintocubital aquintocubitalism aquiparous Aquitanian aquiver aquo aquocapsulitis aquocarbonic aquocellolitis aquopentamminecobaltic aquose aquosity aquotization aquotize ar ara Arab araba araban arabana Arabella arabesque arabesquely arabesquerie Arabian Arabianize Arabic Arabicism Arabicize Arabidopsis arability arabin arabinic arabinose arabinosic Arabis Arabism Arabist arabit arabitol arabiyeh Arabize arable Arabophil Araby araca Aracana aracanga aracari Araceae araceous arachic arachidonic arachin Arachis arachnactis Arachne arachnean arachnid Arachnida arachnidan arachnidial arachnidism arachnidium arachnism Arachnites arachnitis arachnoid arachnoidal Arachnoidea arachnoidea arachnoidean arachnoiditis arachnological arachnologist arachnology Arachnomorphae arachnophagous arachnopia arad Aradidae arado araeostyle araeosystyle Aragallus Aragonese Aragonian aragonite araguato arain Arains Arakanese arakawaite arake Arales Aralia Araliaceae araliaceous araliad Araliaephyllum aralie Araliophyllum aralkyl aralkylated Aramaean Aramaic Aramaicize Aramaism aramayoite Aramidae aramina Araminta Aramis Aramitess Aramu Aramus Aranea Araneae araneid Araneida araneidan araneiform Araneiformes Araneiformia aranein Araneina Araneoidea araneologist araneology araneous aranga arango Aranyaka aranzada arapahite Arapaho arapaima araphorostic arapunga Araquaju arar Arara arara araracanga ararao ararauna arariba araroba arati aration aratory Araua Arauan Araucan Araucanian Araucano Araucaria Araucariaceae araucarian Araucarioxylon Araujia Arauna Arawa Arawak Arawakan Arawakian arba Arbacia arbacin arbalest arbalester arbalestre arbalestrier arbalist arbalister arbalo Arbela arbiter arbitrable arbitrager arbitragist arbitral arbitrament arbitrarily arbitrariness arbitrary arbitrate arbitration arbitrational arbitrationist arbitrative arbitrator arbitratorship arbitratrix arbitrement arbitrer arbitress arboloco arbor arboraceous arboral arborary arborator arboreal arboreally arborean arbored arboreous arborescence arborescent arborescently arboresque arboret arboreta arboretum arborical arboricole arboricoline arboricolous arboricultural arboriculture arboriculturist arboriform arborist arborization arborize arboroid arborolatry arborous arborvitae arborway arbuscle arbuscula arbuscular arbuscule arbusterol arbustum arbutase arbute arbutean arbutin arbutinase arbutus arc arca Arcacea arcade Arcadia Arcadian arcadian Arcadianism Arcadianly Arcadic Arcady arcana arcanal arcane arcanite arcanum arcate arcature Arcella Arceuthobium arch archabomination archae archaecraniate Archaeoceti Archaeocyathidae Archaeocyathus archaeogeology archaeographic archaeographical archaeography archaeolatry archaeolith archaeolithic archaeologer archaeologian archaeologic archaeological archaeologically archaeologist archaeology Archaeopithecus Archaeopteris Archaeopterygiformes Archaeopteryx Archaeornis Archaeornithes archaeostoma Archaeostomata archaeostomatous archagitator archaic archaical archaically archaicism archaism archaist archaistic archaize archaizer archangel archangelic Archangelica archangelical archangelship archantagonist archantiquary archapostate archapostle archarchitect archarios archartist archband archbeacon archbeadle archbishop archbishopess archbishopric archbishopry archbotcher archboutefeu archbuffoon archbuilder archchampion archchaplain archcharlatan archcheater archchemic archchief archchronicler archcity archconfraternity archconsoler archconspirator archcorrupter archcorsair archcount archcozener archcriminal archcritic archcrown archcupbearer archdapifer archdapifership archdeacon archdeaconate archdeaconess archdeaconry archdeaconship archdean archdeanery archdeceiver archdefender archdemon archdepredator archdespot archdetective archdevil archdiocesan archdiocese archdiplomatist archdissembler archdisturber archdivine archdogmatist archdolt archdruid archducal archduchess archduchy archduke archdukedom arche archeal Archean archearl archebiosis archecclesiastic archecentric arched archegone archegonial Archegoniata Archegoniatae archegoniate archegoniophore archegonium archegony Archegosaurus archeion Archelaus Archelenis archelogy Archelon archemperor Archencephala archencephalic archenemy archengineer archenteric archenteron archeocyte Archeozoic Archer archer archeress archerfish archership archery arches archespore archesporial archesporium archetypal archetypally archetype archetypic archetypical archetypically archetypist archeunuch archeus archexorcist archfelon archfiend archfire archflamen archflatterer archfoe archfool archform archfounder archfriend archgenethliac archgod archgomeral archgovernor archgunner archhead archheart archheresy archheretic archhost archhouse archhumbug archhypocrisy archhypocrite Archiannelida archiater Archibald archibenthal archibenthic archibenthos archiblast archiblastic archiblastoma archiblastula Archibuteo archicantor archicarp archicerebrum Archichlamydeae archichlamydeous archicleistogamous archicleistogamy archicoele archicontinent archicyte archicytula Archidamus Archidiaceae archidiaconal archidiaconate archididascalian archididascalos Archidiskodon Archidium archidome Archie archiepiscopacy archiepiscopal archiepiscopally archiepiscopate archiereus archigaster archigastrula archigenesis archigonic archigonocyte archigony archiheretical archikaryon archil archilithic Archilochian archilowe archimage Archimago archimagus archimandrite Archimedean Archimedes archimime archimorphic archimorula archimperial archimperialism archimperialist archimperialistic archimpressionist Archimycetes archineuron archinfamy archinformer arching archipallial archipallium archipelagian archipelagic archipelago archipin archiplasm archiplasmic Archiplata archiprelatical archipresbyter archipterygial archipterygium archisperm Archispermae archisphere archispore archistome archisupreme archisymbolical architect architective architectonic Architectonica architectonically architectonics architectress architectural architecturalist architecturally architecture architecturesque Architeuthis architis architraval architrave architraved architypographer archival archive archivist archivolt archizoic archjockey archking archknave archleader archlecher archleveler archlexicographer archliar archlute archly archmachine archmagician archmagirist archmarshal archmediocrity archmessenger archmilitarist archmime archminister archmock archmocker archmockery archmonarch archmonarchist archmonarchy archmugwump archmurderer archmystagogue archness archocele archocystosyrinx archology archon archonship archont archontate Archontia archontic archoplasm archoplasmic archoptoma archoptosis archorrhagia archorrhea archostegnosis archostenosis archosyrinx archoverseer archpall archpapist archpastor archpatriarch archpatron archphilosopher archphylarch archpiece archpilferer archpillar archpirate archplagiarist archplagiary archplayer archplotter archplunderer archplutocrat archpoet archpolitician archpontiff archpractice archprelate archprelatic archprelatical archpresbyter archpresbyterate archpresbytery archpretender archpriest archpriesthood archpriestship archprimate archprince archprophet archprotopope archprototype archpublican archpuritan archradical archrascal archreactionary archrebel archregent archrepresentative archrobber archrogue archruler archsacrificator archsacrificer archsaint archsatrap archscoundrel archseducer archsee archsewer archshepherd archsin archsnob archspirit archspy archsteward archswindler archsynagogue archtempter archthief archtraitor archtreasurer archtreasurership archturncoat archtyrant archurger archvagabond archvampire archvestryman archvillain archvillainy archvisitor archwag archway archwench archwise archworker archworkmaster Archy archy Arcidae Arcifera arciferous arcifinious arciform arcing Arcite arcked arcking arcocentrous arcocentrum arcograph Arcos Arctalia Arctalian Arctamerican arctation Arctia arctian arctic arctically arctician arcticize arcticward arcticwards arctiid Arctiidae Arctisca Arctium Arctocephalus Arctogaea Arctogaeal Arctogaean arctoid Arctoidea arctoidean Arctomys Arctos Arctosis Arctostaphylos Arcturia Arcturus arcual arcuale arcuate arcuated arcuately arcuation arcubalist arcubalister arcula arculite ardassine Ardea Ardeae ardeb Ardeidae Ardelia ardella ardency ardennite ardent ardently ardentness Ardhamagadhi Ardhanari ardish Ardisia Ardisiaceae ardoise ardor ardri ardu arduinite arduous arduously arduousness ardurous are area areach aread areal areality Arean arear areasoner areaway Areca Arecaceae arecaceous arecaidin arecaidine arecain arecaine Arecales arecolidin arecolidine arecolin arecoline Arecuna ared areek areel arefact arefaction aregenerative aregeneratory areito arena arenaceous arenae Arenaria arenariae arenarious arenation arend arendalite areng Arenga Arenicola arenicole arenicolite arenicolous Arenig arenilitic arenoid arenose arenosity arent areocentric areographer areographic areographical areographically areography areola areolar areolate areolated areolation areole areolet areologic areological areologically areologist areology areometer areometric areometrical areometry Areopagist Areopagite Areopagitic Areopagitica Areopagus areotectonics areroscope aretaics arete Arethusa Arethuse Aretinian arfvedsonite argal argala argali argans Argante Argas argasid Argasidae Argean argeers argel Argemone argemony argenol argent argental argentamid argentamide argentamin argentamine argentate argentation argenteous argenter argenteum argentic argenticyanide argentide argentiferous Argentina Argentine argentine Argentinean Argentinian Argentinidae argentinitrate Argentinize Argentino argention argentite argentojarosite argentol argentometric argentometrically argentometry argenton argentoproteinum argentose argentous argentum Argestes arghan arghel arghool Argid argil argillaceous argilliferous argillite argillitic argilloarenaceous argillocalcareous argillocalcite argilloferruginous argilloid argillomagnesian argillous arginine argininephosphoric Argiope Argiopidae Argiopoidea Argive Argo argo Argoan argol argolet Argolian Argolic Argolid argon Argonaut Argonauta Argonautic Argonne argosy argot argotic Argovian arguable argue arguer argufier argufy Argulus argument argumental argumentation argumentatious argumentative argumentatively argumentativeness argumentator argumentatory Argus argusfish Argusianus Arguslike argute argutely arguteness Argyle Argyll Argynnis argyranthemous argyranthous Argyraspides argyria argyric argyrite argyrocephalous argyrodite Argyrol Argyroneta Argyropelecus argyrose argyrosis Argyrosomus argyrythrose arhar arhat arhatship Arhauaco arhythmic aria Ariadne Arian Ariana Arianism Arianistic Arianistical Arianize Arianizer Arianrhod aribine Arician aricine arid Arided aridge aridian aridity aridly aridness ariegite Ariel ariel arienzo Aries arietation Arietid arietinous arietta aright arightly arigue Ariidae Arikara aril ariled arillary arillate arillated arilliform arillode arillodium arilloid arillus Arimasp Arimaspian Arimathaean Ariocarpus Arioi Arioian Arion ariose arioso ariot aripple Arisaema arisard arise arisen arist arista Aristarch Aristarchian aristarchy aristate Aristeas Aristida Aristides Aristippus aristocracy aristocrat aristocratic aristocratical aristocratically aristocraticalness aristocraticism aristocraticness aristocratism aristodemocracy aristodemocratical aristogenesis aristogenetic aristogenic aristogenics Aristol Aristolochia Aristolochiaceae aristolochiaceous Aristolochiales aristolochin aristolochine aristological aristologist aristology aristomonarchy Aristophanic aristorepublicanism Aristotelian Aristotelianism Aristotelic Aristotelism aristotype aristulate arite arithmetic arithmetical arithmetically arithmetician arithmetization arithmetize arithmic arithmocracy arithmocratic arithmogram arithmograph arithmography arithmomania arithmometer Arius Arivaipa Arizona Arizonan Arizonian arizonite arjun ark Arkab Arkansan Arkansas Arkansawyer arkansite Arkite arkite arkose arkosic arksutite Arlene Arleng arles Arline arm armada armadilla Armadillididae Armadillidium armadillo Armado Armageddon Armageddonist armagnac armament armamentarium armamentary armangite armariolum armarium Armata Armatoles Armatoli armature armbone armchair armchaired armed armeniaceous Armenian Armenic Armenize Armenoid armer Armeria Armeriaceae armet armful armgaunt armhole armhoop Armida armied armiferous armiger armigeral armigerous armil armilla Armillaria armillary armillate armillated arming Arminian Arminianism Arminianize Arminianizer armipotence armipotent armisonant armisonous armistice armless armlet armload armoire armonica armor Armoracia armored armorer armorial Armoric Armorican Armorician armoried armorist armorproof armorwise armory Armouchiquois armozeen armpiece armpit armplate armrack armrest arms armscye armure army arn arna Arnaut arnberry Arne Arneb Arnebia arnee arni arnica Arnold Arnoldist Arnoseris arnotta arnotto Arnusian arnut Aro aroar aroast arock aroeira aroid aroideous Aroides aroint arolium arolla aroma aromacity aromadendrin aromatic aromatically aromaticness aromatite aromatites aromatization aromatize aromatizer aromatophor aromatophore Aronia aroon Aroras Arosaguntacook arose around arousal arouse arousement arouser arow aroxyl arpeggiando arpeggiated arpeggiation arpeggio arpeggioed arpen arpent arquerite arquifoux arracach arracacha Arracacia arrack arrah arraign arraigner arraignment arrame arrange arrangeable arrangement arranger arrant arrantly Arras arras arrased arrasene arrastra arrastre arratel arrau array arrayal arrayer arrayment arrear arrearage arrect arrector arrendation arrenotokous arrenotoky arrent arrentable arrentation arreptitious arrest arrestable arrestation arrestee arrester arresting arrestingly arrestive arrestment arrestor Arretine arrhenal Arrhenatherum arrhenoid arrhenotokous arrhenotoky arrhinia arrhizal arrhizous arrhythmia arrhythmic arrhythmical arrhythmically arrhythmous arrhythmy arriage arriba arride arridge arrie arriere Arriet arrimby arris arrish arrisways arriswise arrival arrive arriver arroba arrogance arrogancy arrogant arrogantly arrogantness arrogate arrogatingly arrogation arrogative arrogator arrojadite arrope arrosive arrow arrowbush arrowed arrowhead arrowheaded arrowleaf arrowless arrowlet arrowlike arrowplate arrowroot arrowsmith arrowstone arrowweed arrowwood arrowworm arrowy arroyo Arruague Arry Arryish Arsacid Arsacidan arsanilic arse arsedine arsenal arsenate arsenation arseneted arsenetted arsenfast arsenferratose arsenhemol arseniasis arseniate arsenic arsenical arsenicalism arsenicate arsenicism arsenicize arsenicophagy arsenide arseniferous arsenillo arseniopleite arseniosiderite arsenious arsenism arsenite arsenium arseniuret arseniureted arsenization arseno arsenobenzene arsenobenzol arsenobismite arsenoferratin arsenofuran arsenohemol arsenolite arsenophagy arsenophen arsenophenol arsenophenylglycin arsenopyrite arsenostyracol arsenotherapy arsenotungstates arsenotungstic arsenous arsenoxide arsenyl arses arsesmart arsheen arshin arshine arsine arsinic arsino Arsinoitherium arsis arsle arsmetrik arsmetrike arsnicker arsoite arson arsonate arsonation arsonic arsonist arsonite arsonium arsono arsonvalization arsphenamine arsyl arsylene Art art artaba artabe artal Artamidae Artamus artar artarine artcraft artefact artel Artemas Artemia Artemis Artemisia artemisic artemisin Artemision Artemisium arteriagra arterial arterialization arterialize arterially arteriarctia arteriasis arteriectasia arteriectasis arteriectopia arterin arterioarctia arteriocapillary arteriococcygeal arteriodialysis arteriodiastasis arteriofibrosis arteriogenesis arteriogram arteriograph arteriography arteriole arteriolith arteriology arteriolosclerosis arteriomalacia arteriometer arteriomotor arterionecrosis arteriopalmus arteriopathy arteriophlebotomy arterioplania arterioplasty arteriopressor arteriorenal arteriorrhagia arteriorrhaphy arteriorrhexis arteriosclerosis arteriosclerotic arteriospasm arteriostenosis arteriostosis arteriostrepsis arteriosympathectomy arteriotome arteriotomy arteriotrepsis arterious arteriovenous arterioversion arterioverter arteritis artery Artesian artesian artful artfully artfulness Artgum artha arthel arthemis arthragra arthral arthralgia arthralgic arthrectomy arthredema arthrempyesis arthresthesia arthritic arthritical arthriticine arthritis arthritism arthrobacterium arthrobranch arthrobranchia arthrocace arthrocarcinoma arthrocele arthrochondritis arthroclasia arthrocleisis arthroclisis arthroderm arthrodesis arthrodia arthrodial arthrodic Arthrodira arthrodiran arthrodire arthrodirous Arthrodonteae arthrodynia arthrodynic arthroempyema arthroempyesis arthroendoscopy Arthrogastra arthrogastran arthrogenous arthrography arthrogryposis arthrolite arthrolith arthrolithiasis arthrology arthromeningitis arthromere arthromeric arthrometer arthrometry arthroncus arthroneuralgia arthropathic arthropathology arthropathy arthrophlogosis arthrophyma arthroplastic arthroplasty arthropleura arthropleure arthropod Arthropoda arthropodal arthropodan arthropodous Arthropomata arthropomatous arthropterous arthropyosis arthrorheumatism arthrorrhagia arthrosclerosis arthrosia arthrosis arthrospore arthrosporic arthrosporous arthrosteitis arthrosterigma arthrostome arthrostomy Arthrostraca arthrosynovitis arthrosyrinx arthrotome arthrotomy arthrotrauma arthrotropic arthrotyphoid arthrous arthroxerosis Arthrozoa arthrozoan arthrozoic Arthur Arthurian Arthuriana artiad artichoke article articled articulability articulable articulacy articulant articular articulare articularly articulary Articulata articulate articulated articulately articulateness articulation articulationist articulative articulator articulatory articulite articulus Artie artifact artifactitious artifice artificer artificership artificial artificialism artificiality artificialize artificially artificialness artiller artillerist artillery artilleryman artilleryship artiness artinite Artinskian artiodactyl Artiodactyla artiodactylous artiphyllous artisan artisanship artist artistdom artiste artistic artistical artistically artistry artless artlessly artlessness artlet artlike Artocarpaceae artocarpad artocarpeous artocarpous Artocarpus artolater artophagous artophorion artotype artotypy Artotyrite artware arty aru Aruac arui aruke Arulo Arum arumin Aruncus arundiferous arundinaceous Arundinaria arundineous Arundo Arunta arupa arusa arusha arustle arval arvel Arverni Arvicola arvicole Arvicolinae arvicoline arvicolous arviculture arx ary Arya Aryan Aryanism Aryanization Aryanize aryballoid aryballus aryepiglottic aryl arylamine arylamino arylate arytenoid arytenoidal arzan Arzava Arzawa arzrunite arzun As as Asa asaddle asafetida Asahel asak asale asana Asaph asaphia Asaphic asaphid Asaphidae Asaphus asaprol asarabacca Asaraceae Asarh asarite asaron asarone asarotum Asarum asbest asbestic asbestiform asbestine asbestinize asbestoid asbestoidal asbestos asbestosis asbestous asbestus asbolin asbolite Ascabart Ascalabota ascan Ascanian Ascanius ascare ascariasis ascaricidal ascaricide ascarid Ascaridae ascarides Ascaridia ascaridiasis ascaridole Ascaris ascaron Ascella ascellus ascend ascendable ascendance ascendancy ascendant ascendence ascendency ascendent ascender ascendible ascending ascendingly ascension ascensional ascensionist Ascensiontide ascensive ascent ascertain ascertainable ascertainableness ascertainably ascertainer ascertainment ascescency ascescent ascetic ascetical ascetically asceticism Ascetta aschaffite ascham aschistic asci ascian Ascidia Ascidiacea Ascidiae ascidian ascidiate ascidicolous ascidiferous ascidiform ascidioid Ascidioida Ascidioidea Ascidiozoa ascidiozooid ascidium asciferous ascigerous ascii ascites ascitic ascitical ascititious asclent Asclepiad asclepiad Asclepiadaceae asclepiadaceous Asclepiadae Asclepiadean asclepiadeous Asclepiadic Asclepian Asclepias asclepidin asclepidoid Asclepieion asclepin Asclepius ascocarp ascocarpous Ascochyta ascogenous ascogone ascogonial ascogonidium ascogonium ascolichen Ascolichenes ascoma ascomycetal ascomycete Ascomycetes ascomycetous ascon Ascones ascophore ascophorous Ascophyllum ascorbic ascospore ascosporic ascosporous Ascot ascot Ascothoracica ascribable ascribe ascript ascription ascriptitii ascriptitious ascriptitius ascry ascula Ascupart ascus ascyphous Ascyrum asdic ase asearch asecretory aseethe aseismatic aseismic aseismicity aseity aselgeia asellate Aselli Asellidae Aselline Asellus asem asemasia asemia asepsis aseptate aseptic aseptically asepticism asepticize aseptify aseptol aseptolin asexual asexuality asexualization asexualize asexually asfetida ash Asha ashake ashame ashamed ashamedly ashamedness ashamnu Ashangos Ashantee Ashanti Asharasi ashberry ashcake ashen Asher asherah Asherites ashery ashes ashet ashily ashimmer ashine ashiness ashipboard Ashir ashiver Ashkenazic Ashkenazim ashkoko ashlar ashlared ashlaring ashless ashling Ashluslay ashman Ashmolean Ashochimi ashore ashpan ashpit ashplant ashraf ashrafi ashthroat Ashur ashur ashweed ashwort ashy asialia Asian Asianic Asianism Asiarch Asiarchate Asiatic Asiatical Asiatically Asiatican Asiaticism Asiaticization Asiaticize Asiatize aside asidehand asideness asiderite asideu asiento asilid Asilidae Asilus asimen Asimina asimmer asinego asinine asininely asininity asiphonate asiphonogama asitia ask askable askance askant askar askari asker askew askingly askip asklent Asklepios askos Askr aslant aslantwise aslaver asleep aslop aslope aslumber asmack asmalte asmear asmile asmoke asmolder asniffle asnort asoak asocial asok asoka asomatophyte asomatous asonant asonia asop asor asouth asp aspace aspalathus Aspalax asparagic asparagine asparaginic asparaginous asparagus asparagyl asparkle aspartate aspartic aspartyl Aspasia Aspatia aspect aspectable aspectant aspection aspectual aspen asper asperate asperation aspergation asperge asperger Asperges aspergil aspergill Aspergillaceae Aspergillales aspergilliform aspergillin aspergillosis aspergillum aspergillus Asperifoliae asperifoliate asperifolious asperite asperity aspermatic aspermatism aspermatous aspermia aspermic aspermous asperous asperously asperse aspersed asperser aspersion aspersive aspersively aspersor aspersorium aspersory Asperugo Asperula asperuloside asperulous asphalt asphaltene asphalter asphaltic asphaltite asphaltum aspheterism aspheterize asphodel Asphodelaceae Asphodeline Asphodelus asphyctic asphyctous asphyxia asphyxial asphyxiant asphyxiate asphyxiation asphyxiative asphyxiator asphyxied asphyxy aspic aspiculate aspiculous aspidate aspidiaria aspidinol Aspidiotus Aspidiske Aspidistra aspidium Aspidobranchia Aspidobranchiata aspidobranchiate Aspidocephali Aspidochirota Aspidoganoidei aspidomancy Aspidosperma aspidospermine aspirant aspirata aspirate aspiration aspirator aspiratory aspire aspirer aspirin aspiring aspiringly aspiringness aspish asplanchnic Asplenieae asplenioid Asplenium asporogenic asporogenous asporous asport asportation asporulate aspout asprawl aspread Aspredinidae Aspredo aspring asprout asquare asquat asqueal asquint asquirm ass assacu assagai assai assail assailable assailableness assailant assailer assailment Assam Assamese Assamites assapan assapanic assarion assart assary assassin assassinate assassination assassinative assassinator assassinatress assassinist assate assation assault assaultable assaulter assaut assay assayable assayer assaying assbaa asse assecuration assecurator assedation assegai asself assemblable assemblage assemble assembler assembly assemblyman assent assentaneous assentation assentatious assentator assentatorily assentatory assented assenter assentient assenting assentingly assentive assentiveness assentor assert assertable assertative asserter assertible assertion assertional assertive assertively assertiveness assertor assertorial assertorially assertoric assertorical assertorically assertorily assertory assertress assertrix assertum assess assessable assessably assessed assessee assession assessionary assessment assessor assessorial assessorship assessory asset assets assever asseverate asseveratingly asseveration asseverative asseveratively asseveratory asshead assi assibilate assibilation Assidean assident assidual assidually assiduity assiduous assiduously assiduousness assientist assiento assify assign assignability assignable assignably assignat assignation assigned assignee assigneeship assigner assignment assignor assilag assimilability assimilable assimilate assimilation assimilationist assimilative assimilativeness assimilator assimilatory Assiniboin assis Assisan assise assish assishly assishness assist assistance assistant assistanted assistantship assistency assister assistful assistive assistless assistor assize assizement assizer assizes asslike assman Assmannshauser assmanship associability associable associableness associate associated associatedness associateship association associational associationalism associationalist associationism associationist associationistic associative associatively associativeness associator associatory assoil assoilment assoilzie assonance assonanced assonant assonantal assonantic assonate Assonia assort assortative assorted assortedness assorter assortive assortment assuade assuage assuagement assuager assuasive assubjugate assuetude assumable assumably assume assumed assumedly assumer assuming assumingly assumingness assumpsit assumption Assumptionist assumptious assumptiousness assumptive assumptively assurable assurance assurant assure assured assuredly assuredness assurer assurge assurgency assurgent assuring assuringly assyntite Assyrian Assyrianize Assyriological Assyriologist Assyriologue Assyriology Assyroid assythment ast asta Astacidae Astacus Astakiwi astalk astarboard astare astart Astarte Astartian Astartidae astasia astatic astatically astaticism astatine astatize astatizer astay asteam asteatosis asteep asteer asteism astelic astely aster Asteraceae asteraceous Asterales Asterella astereognosis asteria asterial Asterias asteriated Asteriidae asterikos asterin Asterina Asterinidae asterioid Asterion asterion Asterionella asterisk asterism asterismal astern asternal Asternata asternia Asterochiton asteroid asteroidal Asteroidea asteroidean Asterolepidae Asterolepis Asterope asterophyllite Asterophyllites Asterospondyli asterospondylic asterospondylous Asteroxylaceae Asteroxylon Asterozoa asterwort asthenia asthenic asthenical asthenobiosis asthenobiotic asthenolith asthenology asthenopia asthenopic asthenosphere astheny asthma asthmatic asthmatical asthmatically asthmatoid asthmogenic asthore asthorin Astian astichous astigmatic astigmatical astigmatically astigmatism astigmatizer astigmatometer astigmatoscope astigmatoscopy astigmia astigmism astigmometer astigmometry Astilbe astilbe astint astipulate astir astite astomatal astomatous astomia astomous astonied astonish astonishedly astonisher astonishing astonishingly astonishingness astonishment astony astoop astor astound astoundable astounding astoundingly astoundment Astrachan astraddle Astraea Astraean astraean astraeid Astraeidae astraeiform astragal astragalar astragalectomy astragali astragalocalcaneal astragalocentral astragalomancy astragalonavicular astragaloscaphoid astragalotibial Astragalus astragalus astrain astrakanite astrakhan astral astrally astrand Astrantia astraphobia astrapophobia astray astream astrer astrict astriction astrictive astrictively astrictiveness Astrid astride astrier astriferous astrild astringe astringency astringent astringently astringer astroalchemist astroblast Astrocaryum astrochemist astrochemistry astrochronological astrocyte astrocytoma astrocytomata astrodiagnosis astrodome astrofel astrogeny astroglia astrognosy astrogonic astrogony astrograph astrographic astrography astroid astroite astrolabe astrolabical astrolater astrolatry astrolithology astrologaster astrologer astrologian astrologic astrological astrologically astrologistic astrologize astrologous astrology astromancer astromancy astromantic astrometeorological astrometeorologist astrometeorology astrometer astrometrical astrometry astronaut astronautics astronomer astronomic astronomical astronomically astronomics astronomize astronomy Astropecten Astropectinidae astrophil astrophobia astrophotographic astrophotography astrophotometer astrophotometrical astrophotometry astrophyllite astrophysical astrophysicist astrophysics Astrophyton astroscope Astroscopus astroscopy astrospectral astrospectroscopic astrosphere astrotheology astrut astucious astuciously astucity Astur Asturian astute astutely astuteness astylar Astylospongia Astylosternus asudden asunder Asuri aswail aswarm asway asweat aswell aswim aswing aswirl aswoon aswooned asyla asyllabia asyllabic asyllabical asylum asymbiotic asymbolia asymbolic asymbolical asymmetric asymmetrical asymmetrically Asymmetron asymmetry asymptomatic asymptote asymptotic asymptotical asymptotically asynapsis asynaptic asynartete asynartetic asynchronism asynchronous asyndesis asyndetic asyndetically asyndeton asynergia asynergy asyngamic asyngamy asyntactic asyntrophy asystole asystolic asystolism asyzygetic at Ata atabal atabeg atabek Atabrine Atacaman Atacamenan Atacamenian Atacameno atacamite atactic atactiform Ataentsic atafter Ataigal Ataiyal Atalan ataman atamasco Atamosco atangle atap ataraxia ataraxy atatschite ataunt atavi atavic atavism atavist atavistic atavistically atavus ataxaphasia ataxia ataxiagram ataxiagraph ataxiameter ataxiaphasia ataxic ataxinomic ataxite ataxonomic ataxophemia ataxy atazir atbash atchison ate Ateba atebrin atechnic atechnical atechny ateeter atef atelectasis atelectatic ateleological Ateles atelestite atelets atelier ateliosis Atellan atelo atelocardia atelocephalous ateloglossia atelognathia atelomitic atelomyelia atelopodia ateloprosopia atelorachidia atelostomia atemporal Aten Atenism Atenist Aterian ates Atestine ateuchi ateuchus Atfalati Athabasca Athabascan athalamous athalline Athamantid athanasia Athanasian Athanasianism Athanasianist athanasy athanor Athapascan athar Atharvan Athecae Athecata athecate atheism atheist atheistic atheistical atheistically atheisticalness atheize atheizer athelia atheling athematic Athena Athenaea athenaeum athenee Athenian Athenianly athenor Athens atheological atheologically atheology atheous Athericera athericeran athericerous atherine Atherinidae Atheriogaea Atheriogaean Atheris athermancy athermanous athermic athermous atheroma atheromasia atheromata atheromatosis atheromatous atherosclerosis Atherosperma Atherurus athetesis athetize athetoid athetosic athetosis athing athirst athlete athletehood athletic athletical athletically athleticism athletics athletism athletocracy athlothete athlothetes athodyd athort athrepsia athreptic athrill athrive athrob athrocyte athrocytosis athrogenic athrong athrough athwart athwarthawse athwartship athwartships athwartwise athymia athymic athymy athyreosis athyria athyrid Athyridae Athyris Athyrium athyroid athyroidism athyrosis Ati Atik Atikokania atilt atimon atinga atingle atinkle atip atis Atka Atlanta atlantad atlantal Atlantean atlantes Atlantic atlantic Atlantica Atlantid Atlantides atlantite atlantoaxial atlantodidymus atlantomastoid atlantoodontoid Atlantosaurus Atlas atlas Atlaslike atlatl atle atlee atloaxoid atloid atloidean atloidoaxoid atma atman atmiatrics atmiatry atmid atmidalbumin atmidometer atmidometry atmo atmocausis atmocautery atmoclastic atmogenic atmograph atmologic atmological atmologist atmology atmolysis atmolyzation atmolyze atmolyzer atmometer atmometric atmometry atmos atmosphere atmosphereful atmosphereless atmospheric atmospherical atmospherically atmospherics atmospherology atmostea atmosteal atmosteon Atnah atocha atocia atokal atoke atokous atoll atom atomatic atomechanics atomerg atomic atomical atomically atomician atomicism atomicity atomics atomiferous atomism atomist atomistic atomistical atomistically atomistics atomity atomization atomize atomizer atomology atomy atonable atonal atonalism atonalistic atonality atonally atone atonement atoneness atoner atonia atonic atonicity atoningly atony atop Atophan atophan atopic atopite atopy Atorai Atossa atour atoxic Atoxyl atoxyl atrabilarian atrabilarious atrabiliar atrabiliarious atrabiliary atrabilious atrabiliousness atracheate Atractaspis Atragene atragene atrail atrament atramental atramentary atramentous atraumatic Atrebates Atremata atrematous atremble atrepsy atreptic atresia atresic atresy atretic atria atrial atrichia atrichosis atrichous atrickle Atridean atrienses atriensis atriocoelomic atrioporal atriopore atrioventricular atrip Atriplex atrium atrocha atrochal atrochous atrocious atrociously atrociousness atrocity atrolactic Atropa atropaceous atropal atropamine atrophia atrophiated atrophic atrophied atrophoderma atrophy atropia atropic Atropidae atropine atropinism atropinization atropinize atropism atropous atrorubent atrosanguineous atroscine atrous atry Atrypa Atta atta Attacapan attacco attach attachable attachableness attache attached attachedly attacher attacheship attachment attack attackable attacker attacolite Attacus attacus attagen attaghan attain attainability attainable attainableness attainder attainer attainment attaint attaintment attainture Attalea attaleh Attalid attar attargul attask attemper attemperament attemperance attemperate attemperately attemperation attemperator attempt attemptability attemptable attempter attemptless attend attendance attendancy attendant attendantly attender attendingly attendment attendress attensity attent attention attentional attentive attentively attentiveness attently attenuable attenuant attenuate attenuation attenuative attenuator atter attercop attercrop atterminal attermine atterminement attern attery attest attestable attestant attestation attestative attestator attester attestive Attic attic Attical Atticism atticism Atticist Atticize atticize atticomastoid attid Attidae attinge attingence attingency attingent attire attired attirement attirer attitude attitudinal attitudinarian attitudinarianism attitudinize attitudinizer Attiwendaronk attorn attorney attorneydom attorneyism attorneyship attornment attract attractability attractable attractableness attractant attracter attractile attractingly attraction attractionally attractive attractively attractiveness attractivity attractor attrahent attrap attributable attributal attribute attributer attribution attributive attributively attributiveness attrist attrite attrited attriteness attrition attritive attritus attune attunely attunement Atuami atule atumble atune atwain atweel atween atwin atwirl atwist atwitch atwitter atwixt atwo atypic atypical atypically atypy auantic aube aubepine Aubrey Aubrietia aubrietia aubrite auburn aubusson Auca auca Aucan Aucaner Aucanian Auchenia auchenia auchenium auchlet auction auctionary auctioneer auctorial Aucuba aucuba aucupate audacious audaciously audaciousness audacity Audaean Audian Audibertia audibility audible audibleness audibly audience audiencier audient audile audio audiogenic audiogram audiologist audiology audiometer audiometric audiometry Audion audion audiophile audiphone audit audition auditive auditor auditoria auditorial auditorially auditorily auditorium auditorship auditory auditress auditual audivise audiviser audivision Audrey Audubonistic Aueto auganite auge Augean augelite augen augend auger augerer augh aught aughtlins augite augitic augitite augitophyre augment augmentable augmentation augmentationer augmentative augmentatively augmented augmentedly augmenter augmentive augur augural augurate augurial augurous augurship augury August august Augusta augustal Augustan Augusti Augustin Augustinian Augustinianism Augustinism augustly augustness Augustus auh auhuhu Auk auk auklet aula aulacocarpous Aulacodus Aulacomniaceae Aulacomnium aulae aularian auld auldfarrantlike auletai aulete auletes auletic auletrides auletris aulic aulicism auloi aulophyte aulos Aulostoma Aulostomatidae Aulostomi aulostomid Aulostomidae Aulostomus aulu aum aumaga aumail aumbry aumery aumil aumildar aumous aumrie auncel aune Aunjetitz aunt aunthood auntie auntish auntlike auntly auntsary auntship aupaka aura aurae aural aurally auramine Aurantiaceae aurantiaceous Aurantium aurantium aurar aurate aurated aureate aureately aureateness aureation aureity Aurelia aurelia aurelian Aurelius Aureocasidium aureola aureole aureolin aureoline aureomycin aureous aureously auresca aureus auribromide auric aurichalcite aurichalcum aurichloride aurichlorohydric auricle auricled auricomous Auricula auricula auriculae auricular auriculare auriculares Auricularia auricularia Auriculariaceae auriculariae Auriculariales auricularian auricularis auricularly auriculate auriculated auriculately Auriculidae auriculocranial auriculoparietal auriculotemporal auriculoventricular auriculovertical auricyanhydric auricyanic auricyanide auride auriferous aurific aurification auriform aurify Auriga aurigal aurigation aurigerous Aurigid Aurignacian aurilave aurin aurinasal auriphone auriphrygia auriphrygiate auripuncture aurir auriscalp auriscalpia auriscalpium auriscope auriscopy aurist aurite aurivorous auroauric aurobromide aurochloride aurochs aurocyanide aurodiamine auronal aurophobia aurophore aurora aurorae auroral aurorally aurore aurorean Aurorian aurorium aurotellurite aurothiosulphate aurothiosulphuric aurous aurrescu aurulent aurum aurure auryl Aus auscult auscultascope auscultate auscultation auscultative auscultator auscultatory Auscultoscope auscultoscope Aushar auslaut auslaute Ausones Ausonian auspex auspicate auspice auspices auspicial auspicious auspiciously auspiciousness auspicy Aussie Austafrican austenite austenitic Auster austere austerely austereness austerity Austerlitz Austin Austral austral Australasian australene Australia Australian Australianism Australianize Australic Australioid australite Australoid Australopithecinae australopithecine Australopithecus Australorp Austrasian Austrian Austrianize Austric austrium Austroasiatic Austrogaea Austrogaean austromancy Austronesian Austrophil Austrophile Austrophilism Austroriparian ausu ausubo autacoid autacoidal autallotriomorphic autantitypy autarch autarchic autarchical Autarchoglossa autarchy autarkic autarkical autarkist autarky aute autechoscope autecious auteciously auteciousness autecism autecologic autecological autecologically autecologist autecology autecy autem authentic authentical authentically authenticalness authenticate authentication authenticator authenticity authenticly authenticness authigene authigenetic authigenic authigenous author authorcraft authoress authorhood authorial authorially authorish authorism authoritarian authoritarianism authoritative authoritatively authoritativeness authority authorizable authorization authorize authorized authorizer authorless authorling authorly authorship authotype autism autist autistic auto autoabstract autoactivation autoactive autoaddress autoagglutinating autoagglutination autoagglutinin autoalarm autoalkylation autoallogamous autoallogamy autoanalysis autoanalytic autoantibody autoanticomplement autoantitoxin autoasphyxiation autoaspiration autoassimilation autobahn autobasidia Autobasidiomycetes autobasidiomycetous autobasidium Autobasisii autobiographal autobiographer autobiographic autobiographical autobiographically autobiographist autobiography autobiology autoblast autoboat autoboating autobolide autobus autocab autocade autocall autocamp autocamper autocamping autocar autocarist autocarpian autocarpic autocarpous autocatalepsy autocatalysis autocatalytic autocatalytically autocatalyze autocatheterism autocephalia autocephality autocephalous autocephaly autoceptive autochemical autocholecystectomy autochrome autochromy autochronograph autochthon autochthonal autochthonic autochthonism autochthonous autochthonously autochthonousness autochthony autocide autocinesis autoclasis autoclastic autoclave autocoenobium autocoherer autocoid autocollimation autocollimator autocolony autocombustible autocombustion autocomplexes autocondensation autoconduction autoconvection autoconverter autocopist autocoprophagous autocorrosion autocracy autocrat autocratic autocratical autocratically autocrator autocratoric autocratorical autocratrix autocratship autocremation autocriticism autocystoplasty autocytolysis autocytolytic autodecomposition autodepolymerization autodermic autodestruction autodetector autodiagnosis autodiagnostic autodiagrammatic autodidact autodidactic autodifferentiation autodiffusion autodigestion autodigestive autodrainage autodrome autodynamic autodyne autoecholalia autoecic autoecious autoeciously autoeciousness autoecism autoecous autoecy autoeducation autoeducative autoelectrolysis autoelectrolytic autoelectronic autoelevation autoepigraph autoepilation autoerotic autoerotically autoeroticism autoerotism autoexcitation autofecundation autofermentation autoformation autofrettage autogamic autogamous autogamy autogauge autogeneal autogenesis autogenetic autogenetically autogenic autogenous autogenously autogeny Autogiro autogiro autognosis autognostic autograft autografting autogram autograph autographal autographer autographic autographical autographically autographism autographist autographometer autography autogravure Autoharp autoharp autoheader autohemic autohemolysin autohemolysis autohemolytic autohemorrhage autohemotherapy autoheterodyne autoheterosis autohexaploid autohybridization autohypnosis autohypnotic autohypnotism autohypnotization autoicous autoignition autoimmunity autoimmunization autoinduction autoinductive autoinfection autoinfusion autoinhibited autoinoculable autoinoculation autointellectual autointoxicant autointoxication autoirrigation autoist autojigger autojuggernaut autokinesis autokinetic autokrator autolaryngoscope autolaryngoscopic autolaryngoscopy autolater autolatry autolavage autolesion autolimnetic autolith autoloading autological autologist autologous autology autoluminescence autoluminescent autolysate autolysin autolysis autolytic Autolytus autolyzate autolyze automa automacy automanual automat automata automatic automatical automatically automaticity automatin automatism automatist automatization automatize automatograph automaton automatonlike automatous automechanical automelon autometamorphosis autometric autometry automobile automobilism automobilist automobilistic automobility automolite automonstration automorph automorphic automorphically automorphism automotive automotor automower automysophobia autonegation autonephrectomy autonephrotoxin autoneurotoxin autonitridation autonoetic autonomasy autonomic autonomical autonomically autonomist autonomize autonomous autonomously autonomy autonym autoparasitism autopathic autopathography autopathy autopelagic autopepsia autophagi autophagia autophagous autophagy autophobia autophoby autophon autophone autophonoscope autophonous autophony autophotoelectric autophotograph autophotometry autophthalmoscope autophyllogeny autophyte autophytic autophytically autophytograph autophytography autopilot autoplagiarism autoplasmotherapy autoplast autoplastic autoplasty autopneumatic autopoint autopoisonous autopolar autopolo autopoloist autopolyploid autopore autoportrait autoportraiture autopositive autopotent autoprogressive autoproteolysis autoprothesis autopsic autopsical autopsy autopsychic autopsychoanalysis autopsychology autopsychorhythmia autopsychosis autoptic autoptical autoptically autopticity autopyotherapy autoracemization autoradiograph autoradiographic autoradiography autoreduction autoregenerator autoregulation autoreinfusion autoretardation autorhythmic autorhythmus autoriser autorotation autorrhaphy Autosauri Autosauria autoschediasm autoschediastic autoschediastical autoschediastically autoschediaze autoscience autoscope autoscopic autoscopy autosender autosensitization autosensitized autosepticemia autoserotherapy autoserum autosexing autosight autosign autosite autositic autoskeleton autosled autoslip autosomal autosomatognosis autosomatognostic autosome autosoteric autosoterism autospore autosporic autospray autostability autostage autostandardization autostarter autostethoscope autostylic autostylism autostyly autosuggestibility autosuggestible autosuggestion autosuggestionist autosuggestive autosuppression autosymbiontic autosymbolic autosymbolical autosymbolically autosymnoia Autosyn autosyndesis autotelegraph autotelic autotetraploid autotetraploidy autothaumaturgist autotheater autotheism autotheist autotherapeutic autotherapy autothermy autotomic autotomize autotomous autotomy autotoxaemia autotoxic autotoxication autotoxicity autotoxicosis autotoxin autotoxis autotractor autotransformer autotransfusion autotransplant autotransplantation autotrepanation autotriploid autotriploidy autotroph autotrophic autotrophy autotropic autotropically autotropism autotruck autotuberculin autoturning autotype autotyphization autotypic autotypography autotypy autourine autovaccination autovaccine autovalet autovalve autovivisection autoxeny autoxidation autoxidator autoxidizability autoxidizable autoxidize autoxidizer autozooid autrefois autumn autumnal autumnally autumnian autumnity Autunian autunite auxamylase auxanogram auxanology auxanometer auxesis auxetic auxetical auxetically auxiliar auxiliarly auxiliary auxiliate auxiliation auxiliator auxiliatory auxilium auximone auxin auxinic auxinically auxoaction auxoamylase auxoblast auxobody auxocardia auxochrome auxochromic auxochromism auxochromous auxocyte auxoflore auxofluor auxograph auxographic auxohormone auxology auxometer auxospore auxosubstance auxotonic auxotox ava avadana avadavat avadhuta avahi avail availability available availableness availably availingly availment aval avalanche avalent avalvular Avanguardisti avania avanious Avanti avanturine Avar Avaradrano avaremotemo Avarian avarice avaricious avariciously avariciousness Avarish Avars avascular avast avaunt Ave ave avellan avellane avellaneous avellano avelonge aveloz Avena avenaceous avenage avenalin avener avenge avengeful avengement avenger avengeress avenging avengingly avenin avenolith avenous avens aventail Aventine aventurine avenue aver avera average averagely averager averah averil averin averment Avernal Avernus averrable averral Averrhoa Averroism Averroist Averroistic averruncate averruncation averruncator aversant aversation averse aversely averseness aversion aversive avert avertable averted avertedly averter avertible Avertin Avery Aves Avesta Avestan avian avianization avianize aviarist aviary aviate aviatic aviation aviator aviatorial aviatoriality aviatory aviatress aviatrices aviatrix Avicennia Avicenniaceae Avicennism avichi avicide avick avicolous Avicula avicular Avicularia avicularia avicularian Aviculariidae Avicularimorphae avicularium Aviculidae aviculture aviculturist avid avidious avidiously avidity avidly avidous avidya avifauna avifaunal avigate avigation avigator Avignonese avijja Avikom avine aviolite avirulence avirulent Avis aviso avital avitaminosis avitaminotic avitic avives avizandum avo avocado avocate avocation avocative avocatory avocet avodire avogadrite avoid avoidable avoidably avoidance avoider avoidless avoidment avoirdupois avolate avolation avolitional avondbloem avouch avouchable avoucher avouchment avourneen avow avowable avowableness avowably avowal avowance avowant avowed avowedly avowedness avower avowry avoyer avoyership Avshar avulse avulsion avuncular avunculate aw awa Awabakal awabi Awadhi awaft awag await awaiter Awaitlala awakable awake awaken awakenable awakener awakening awakeningly awakenment awald awalim awalt Awan awane awanting awapuhi award awardable awarder awardment aware awaredom awareness awaruite awash awaste awat awatch awater awave away awayness awber awd awe awearied aweary aweather aweband awedness awee aweek aweel aweigh Awellimiden awesome awesomely awesomeness awest aweto awfu awful awfully awfulness awheel awheft awhet awhile awhir awhirl awide awiggle awikiwiki awin awing awink awiwi awkward awkwardish awkwardly awkwardness awl awless awlessness awlwort awmous awn awned awner awning awninged awnless awnlike awny awoke Awol awork awreck awrist awrong awry Awshar ax axal axbreaker axe axed Axel axenic axes axfetch axhammer axhammered axhead axial axiality axially axiate axiation Axifera axiform axifugal axil axile axilemma axilemmata axilla axillae axillant axillar axillary axine axinite axinomancy axiolite axiolitic axiological axiologically axiologist axiology axiom axiomatic axiomatical axiomatically axiomatization axiomatize axion axiopisty Axis axis axised axisymmetric axisymmetrical axite axle axled axlesmith axletree axmaker axmaking axman axmanship axmaster Axminster axodendrite axofugal axogamy axoid axoidean axolemma axolotl axolysis axometer axometric axometry axon axonal axoneure axoneuron Axonia Axonolipa axonolipous axonometric axonometry Axonophora axonophorous Axonopus axonost axopetal axophyte axoplasm axopodia axopodium axospermous axostyle axseed axstone axtree Axumite axunge axweed axwise axwort Ay ay ayacahuite ayah Ayahuca Aydendron aye ayegreen ayelp ayenbite ayin Aylesbury ayless aylet ayllu Aymara Aymaran Aymoro ayond ayont ayous Ayrshire Aythya ayu Ayubite Ayyubid azadrachta azafrin Azalea azalea Azande azarole azedarach azelaic azelate Azelfafage azeotrope azeotropic azeotropism azeotropy Azerbaijanese Azerbaijani Azerbaijanian Azha azide aziethane Azilian azilut Azimech azimene azimethylene azimide azimine azimino aziminobenzene azimuth azimuthal azimuthally azine aziola azlactone azo azobacter azobenzene azobenzil azobenzoic azobenzol azoblack azoch azocochineal azocoralline azocorinth azocyanide azocyclic azodicarboxylic azodiphenyl azodisulphonic azoeosin azoerythrin azofication azofier azoflavine azoformamide azoformic azofy azogallein azogreen azogrenadine azohumic azoic azoimide azoisobutyronitrile azole azolitmin Azolla azomethine azon azonal azonaphthalene azonic azonium azoospermia azoparaffin azophen azophenetole azophenine azophenol azophenyl azophenylene azophosphin azophosphore azoprotein Azorian azorite azorubine azosulphine azosulphonic azotate azote azoted azotemia azotenesis azotetrazole azoth azothionium azotic azotine azotite azotize Azotobacter Azotobacterieae azotoluene azotometer azotorrhoea azotous azoturia azovernine azox azoxazole azoxime azoxine azoxonium azoxy azoxyanisole azoxybenzene azoxybenzoic azoxynaphthalene azoxyphenetole azoxytoluidine Aztec Azteca azteca Aztecan azthionium azulene azulite azulmic azumbre azure azurean azured azureous azurine azurite azurmalachite azurous azury Azygobranchia Azygobranchiata azygobranchiate azygomatous azygos azygosperm azygospore azygous azyme azymite azymous B b ba baa baahling Baal baal Baalath Baalish Baalism Baalist Baalite Baalitical Baalize Baalshem baar Bab baba babacoote babai babasco babassu babaylan Babbie Babbitt babbitt babbitter Babbittess Babbittian Babbittism Babbittry babblative babble babblement babbler babblesome babbling babblingly babblish babblishly babbly babby Babcock babe babehood Babel Babeldom babelet Babelic babelike Babelish Babelism Babelize babery babeship Babesia babesiasis Babhan Babi Babiana babiche babied Babiism babillard Babine babingtonite babirusa babish babished babishly babishness Babism Babist Babite bablah babloh baboen Babongo baboo baboodom babooism baboon baboonery baboonish baboonroot baboot babouche Babouvism Babouvist babroot Babs babu Babua babudom babuina babuism babul Babuma Babungera babushka baby babydom babyfied babyhood babyhouse babyish babyishly babyishness babyism babylike Babylon Babylonian Babylonic Babylonish Babylonism Babylonite Babylonize babyolatry babyship bac bacaba bacach bacalao bacao bacbakiri bacca baccaceous baccae baccalaurean baccalaureate baccara baccarat baccate baccated Bacchae bacchanal Bacchanalia bacchanalian bacchanalianism bacchanalianly bacchanalism bacchanalization bacchanalize bacchant bacchante bacchantes bacchantic bacchar baccharis baccharoid baccheion bacchiac bacchian Bacchic bacchic Bacchical Bacchides bacchii bacchius Bacchus Bacchuslike bacciferous bacciform baccivorous bach Bacharach bache bachel bachelor bachelordom bachelorhood bachelorism bachelorize bachelorlike bachelorly bachelorship bachelorwise bachelry Bachichi Bacillaceae bacillar Bacillariaceae bacillariaceous Bacillariales Bacillarieae Bacillariophyta bacillary bacillemia bacilli bacillian bacillicidal bacillicide bacillicidic bacilliculture bacilliform bacilligenic bacilliparous bacillite bacillogenic bacillogenous bacillophobia bacillosis bacilluria bacillus Bacis bacitracin back backache backaching backachy backage backband backbearing backbencher backbite backbiter backbitingly backblow backboard backbone backboned backboneless backbonelessness backbrand backbreaker backbreaking backcap backcast backchain backchat backcourt backcross backdoor backdown backdrop backed backen backer backet backfall backfatter backfield backfill backfiller backfilling backfire backfiring backflap backflash backflow backfold backframe backfriend backfurrow backgame backgammon background backhand backhanded backhandedly backhandedness backhander backhatch backheel backhooker backhouse backie backiebird backing backjaw backjoint backlands backlash backlashing backless backlet backlings backlog backlotter backmost backpedal backpiece backplate backrope backrun backsaw backscraper backset backsetting backsettler backshift backside backsight backslap backslapper backslapping backslide backslider backslidingness backspace backspacer backspang backspier backspierer backspin backspread backspringing backstaff backstage backstamp backstay backster backstick backstitch backstone backstop backstrap backstretch backstring backstrip backstroke backstromite backswept backswing backsword backswording backswordman backswordsman backtack backtender backtenter backtrack backtracker backtrick backup backveld backvelder backwall backward backwardation backwardly backwardness backwards backwash backwasher backwashing backwater backwatered backway backwood backwoods backwoodsiness backwoodsman backwoodsy backword backworm backwort backyarder baclin bacon baconer Baconian Baconianism Baconic Baconism Baconist baconize baconweed bacony Bacopa bacteremia bacteria Bacteriaceae bacteriaceous bacterial bacterially bacterian bacteric bactericholia bactericidal bactericide bactericidin bacterid bacteriemia bacteriform bacterin bacterioagglutinin bacterioblast bacteriocyte bacteriodiagnosis bacteriofluorescin bacteriogenic bacteriogenous bacteriohemolysin bacterioid bacterioidal bacteriologic bacteriological bacteriologically bacteriologist bacteriology bacteriolysin bacteriolysis bacteriolytic bacteriolyze bacteriopathology bacteriophage bacteriophagia bacteriophagic bacteriophagous bacteriophagy bacteriophobia bacterioprecipitin bacterioprotein bacteriopsonic bacteriopsonin bacteriopurpurin bacterioscopic bacterioscopical bacterioscopically bacterioscopist bacterioscopy bacteriosis bacteriosolvent bacteriostasis bacteriostat bacteriostatic bacteriotherapeutic bacteriotherapy bacteriotoxic bacteriotoxin bacteriotropic bacteriotropin bacteriotrypsin bacterious bacteritic bacterium bacteriuria bacterization bacterize bacteroid bacteroidal Bacteroideae Bacteroides Bactrian Bactris Bactrites bactriticone bactritoid bacula bacule baculi baculiferous baculiform baculine baculite Baculites baculitic baculiticone baculoid baculum baculus bacury bad Badaga badan Badarian badarrah Badawi baddeleyite badderlocks baddish baddishly baddishness baddock bade badenite badge badgeless badgeman badger badgerbrush badgerer badgeringly badgerlike badgerly badgerweed badiaga badian badigeon badinage badious badland badlands badly badminton badness Badon Baduhenna bae Baedeker Baedekerian Baeria baetuli baetulus baetyl baetylic baetylus baetzner bafaro baff baffeta baffle bafflement baffler baffling bafflingly bafflingness baffy baft bafta Bafyot bag baga Baganda bagani bagasse bagataway bagatelle bagatine bagattini bagattino Bagaudae Bagdad Bagdi bagel bagful baggage baggageman baggagemaster baggager baggala bagganet Baggara bagged bagger baggie baggily bagginess bagging baggit baggy Bagheli baghouse Baginda Bagirmi bagleaves baglike bagmaker bagmaking bagman bagnio bagnut bago Bagobo bagonet bagpipe bagpiper bagpipes bagplant bagrationite bagre bagreef bagroom baguette bagwig bagwigged bagworm bagwyn bah Bahai Bahaism Bahaist Baham Bahama Bahamian bahan bahar Bahaullah bahawder bahay bahera bahiaite Bahima bahisti Bahmani Bahmanid bahnung baho bahoe bahoo baht Bahuma bahur bahut Bahutu bahuvrihi Baianism baidarka Baidya Baiera baiginet baignet baikalite baikerinite baikerite baikie bail bailable bailage bailee bailer bailey bailie bailiery bailieship bailiff bailiffry bailiffship bailiwick bailliage baillone Baillonella bailment bailor bailpiece bailsman bailwood bain bainie Baining baioc baiocchi baiocco bairagi Bairam bairn bairnie bairnish bairnishness bairnliness bairnly bairnteam bairntime bairnwort Bais Baisakh baister bait baiter baith baittle baitylos baize bajada bajan Bajardo bajarigar Bajau Bajocian bajra bajree bajri bajury baka Bakairi bakal Bakalai Bakalei Bakatan bake bakeboard baked bakehouse Bakelite bakelite bakelize baken bakeoven bakepan baker bakerdom bakeress bakerite bakerless bakerly bakership bakery bakeshop bakestone Bakhtiari bakie baking bakingly bakli Bakongo Bakshaish baksheesh baktun Baku baku Bakuba bakula Bakunda Bakuninism Bakuninist bakupari Bakutu Bakwiri Bal bal Bala Balaam Balaamite Balaamitical balachong balaclava baladine Balaena Balaenicipites balaenid Balaenidae balaenoid Balaenoidea balaenoidean Balaenoptera Balaenopteridae balafo balagan balaghat balai Balaic Balak Balaklava balalaika Balan balance balanceable balanced balancedness balancelle balanceman balancement balancer balancewise balancing balander balandra balandrana balaneutics balangay balanic balanid Balanidae balaniferous balanism balanite Balanites balanitis balanoblennorrhea balanocele Balanoglossida Balanoglossus balanoid Balanophora Balanophoraceae balanophoraceous balanophore balanophorin balanoplasty balanoposthitis balanopreputial Balanops Balanopsidaceae Balanopsidales balanorrhagia Balanta Balante balantidial balantidiasis balantidic balantidiosis Balantidium Balanus Balao balao Balarama balas balata balatong balatron balatronic balausta balaustine balaustre Balawa Balawu balboa balbriggan balbutiate balbutient balbuties balconet balconied balcony bald baldachin baldachined baldachini baldachino baldberry baldcrown balden balder balderdash baldhead baldicoot Baldie baldish baldling baldly baldmoney baldness baldpate baldrib baldric baldricked baldricwise balductum Baldwin baldy bale Balearian Balearic Balearica baleen balefire baleful balefully balefulness balei baleise baleless baler balete Bali bali balibago Balija Balilla baline Balinese balinger balinghasay balisaur balistarius Balistes balistid Balistidae balistraria balita balk Balkan Balkanic Balkanization Balkanize Balkar balker balkingly Balkis balky ball ballad ballade balladeer ballader balladeroyal balladic balladical balladier balladism balladist balladize balladlike balladling balladmonger balladmongering balladry balladwise ballahoo ballam ballan ballant ballast ballastage ballaster ballasting ballata ballate ballatoon balldom balled baller ballerina ballet balletic balletomane Ballhausplatz balli ballist ballista ballistae ballistic ballistically ballistician ballistics Ballistite ballistocardiograph ballium ballmine ballogan ballonet balloon balloonation ballooner balloonery balloonet balloonfish balloonflower balloonful ballooning balloonish balloonist balloonlike ballot Ballota ballotade ballotage balloter balloting ballotist ballottement ballow Ballplatz ballplayer ballproof ballroom ballstock ballup ballweed bally ballyhack ballyhoo ballyhooer ballywack ballywrack balm balmacaan Balmarcodes Balmawhapple balmily balminess balmlike balmony Balmoral balmy balneal balneary balneation balneatory balneographer balneography balneologic balneological balneologist balneology balneophysiology balneotechnics balneotherapeutics balneotherapia balneotherapy Balnibarbi Baloch Baloghia Balolo balonea baloney baloo Balopticon Balor Baloskion Baloskionaceae balow balsa balsam balsamation Balsamea Balsameaceae balsameaceous balsamer balsamic balsamical balsamically balsamiferous balsamina Balsaminaceae balsaminaceous balsamine balsamitic balsamiticness balsamize balsamo Balsamodendron Balsamorrhiza balsamous balsamroot balsamum balsamweed balsamy Balt baltei balter balteus Balthasar Balti Baltic Baltimore Baltimorean baltimorite Baltis balu Baluba Baluch Baluchi Baluchistan baluchithere baluchitheria Baluchitherium baluchitherium Baluga Balunda balushai baluster balustered balustrade balustraded balustrading balut balwarra balza Balzacian balzarine bam Bamalip Bamangwato bamban Bambara bambini bambino bambocciade bamboo bamboozle bamboozlement bamboozler Bambos bamboula Bambuba Bambusa Bambuseae Bambute bamoth Ban ban Bana banaba banago banak banakite banal banality banally banana Bananaland Bananalander Banande bananist bananivorous banat Banate banatite banausic Banba Banbury banc banca bancal banchi banco bancus band Banda banda bandage bandager bandagist bandaite bandaka bandala bandalore bandanna bandannaed bandar bandarlog bandbox bandboxical bandboxy bandcase bandcutter bande bandeau banded bandelet bander Banderma banderole bandersnatch bandfish bandhava bandhook Bandhor bandhu bandi bandicoot bandicoy bandie bandikai bandiness banding bandit banditism banditry banditti bandle bandless bandlessly bandlessness bandlet bandman bandmaster bando bandog bandoleer bandoleered bandoline bandonion Bandor bandore bandrol bandsman bandstand bandster bandstring Bandusia Bandusian bandwork bandy bandyball bandyman bane baneberry baneful banefully banefulness banewort Banff bang banga Bangala bangalay bangalow Bangash bangboard bange banger banghy Bangia Bangiaceae bangiaceous Bangiales banging bangkok bangle bangled bangling bangster bangtail Bangwaketsi bani banian banig banilad banish banisher banishment banister Baniva baniwa baniya banjo banjoist banjore banjorine banjuke bank bankable Bankalachi bankbook banked banker bankera bankerdom bankeress banket bankfull banking bankman bankrider bankrupt bankruptcy bankruptism bankruptlike bankruptly bankruptship bankrupture bankshall Banksia Banksian bankside banksman bankweed banky banner bannered bannerer banneret bannerfish bannerless bannerlike bannerman bannerol bannerwise bannet banning bannister Bannock bannock Bannockburn banns bannut banovina banquet banqueteer banqueteering banqueter banquette bansalague banshee banstickle bant Bantam bantam bantamize bantamweight bantay bantayan banteng banter banterer banteringly bantery Bantingism bantingize bantling Bantoid Bantu banty banuyo banxring banya Banyai banyan Banyoro Banyuls banzai baobab bap Baphia Baphomet Baphometic Baptanodon Baptisia baptisin baptism baptismal baptismally Baptist baptistery baptistic baptizable baptize baptizee baptizement baptizer Baptornis bar bara barabara barabora Barabra Baraca barad baragnosis baragouin baragouinish Baraithas barajillo Baralipton Baramika barandos barangay barasingha barathea barathra barathrum barauna barb Barbacoa Barbacoan barbacou Barbadian Barbados barbal barbaloin Barbara barbaralalia Barbarea barbaresque Barbarian barbarian barbarianism barbarianize barbaric barbarical barbarically barbarious barbariousness barbarism barbarity barbarization barbarize barbarous barbarously barbarousness Barbary barbary barbas barbasco barbastel barbate barbated barbatimao barbe barbecue barbed barbeiro barbel barbellate barbellula barbellulate barber barberess barberfish barberish barberry barbershop barbet barbette Barbeyaceae barbican barbicel barbigerous barbion barbital barbitalism barbiton barbitone barbitos barbiturate barbituric barbless barblet barbone barbotine Barbra barbudo Barbula barbulate barbule barbulyie barbwire Barcan barcarole barcella barcelona Barcoo bard bardane bardash bardcraft bardel Bardesanism Bardesanist Bardesanite bardess bardic bardie bardiglio bardily bardiness barding bardish bardism bardlet bardlike bardling bardo Bardolater Bardolatry Bardolph Bardolphian bardship Bardulph bardy Bare bare bareback barebacked bareboat barebone bareboned bareca barefaced barefacedly barefacedness barefit barefoot barefooted barehanded barehead bareheaded bareheadedness barelegged barely barenecked bareness barer baresark baresma baretta barff barfish barfly barful bargain bargainee bargainer bargainor bargainwise bargander barge bargeboard bargee bargeer bargeese bargehouse bargelike bargeload bargeman bargemaster barger bargh bargham barghest bargoose Bari bari baria baric barid barie barile barilla baring baris barish barit barite baritone barium bark barkbound barkcutter barkeeper barken barkentine barker barkery barkevikite barkevikitic barkey barkhan barking barkingly Barkinji barkle barkless barklyite barkometer barkpeel barkpeeler barkpeeling barksome barky barlafumble barlafummil barless barley barleybird barleybreak barleycorn barleyhood barleymow barleysick barling barlock barlow barm barmaid barman barmaster barmbrack barmcloth Barmecidal Barmecide barmkin barmote barmskin barmy barmybrained barn Barnabas Barnabite Barnaby barnacle Barnard barnard barnbrack Barnburner Barney barney barnful barnhardtite barnman barnstorm barnstormer barnstorming Barnumism Barnumize barny barnyard Baroco barocyclonometer barodynamic barodynamics barognosis barogram barograph barographic baroi barolo barology Barolong barometer barometric barometrical barometrically barometrograph barometrography barometry barometz baromotor baron baronage baroness baronet baronetage baronetcy baronethood baronetical baronetship barong Baronga baronial baronize baronry baronship barony Baroque baroque baroscope baroscopic baroscopical Barosma barosmin barotactic barotaxis barotaxy barothermograph barothermohygrograph baroto Barotse barouche barouchet Barouni baroxyton barpost barquantine barra barrabkie barrable barrabora barracan barrack barracker barraclade barracoon barracouta barracuda barrad barragan barrage barragon barramunda barramundi barranca barrandite barras barrator barratrous barratrously barratry barred barrel barrelage barreled barreler barrelet barrelful barrelhead barrelmaker barrelmaking barrelwise barren barrenly barrenness barrenwort barrer barret Barrett barrette barretter barricade barricader barricado barrico barrier barriguda barrigudo barrikin barriness barring Barrington Barringtonia Barrio barrio barrister barristerial barristership barristress barroom barrow barrowful Barrowist barrowman barrulee barrulet barrulety barruly Barry barry Barsac barse barsom Bart bartender bartending barter barterer barth barthite bartholinitis Bartholomean Bartholomew Bartholomewtide Bartholomite bartizan bartizaned Bartlemy Bartlett Barton barton Bartonella Bartonia Bartram Bartramia Bartramiaceae Bartramian Bartsia baru Baruch Barundi baruria barvel barwal barway barways barwise barwood barycenter barycentric barye baryecoia baryglossia barylalia barylite baryphonia baryphonic baryphony barysilite barysphere baryta barytes barythymia barytic barytine barytocalcite barytocelestine barytocelestite baryton barytone barytophyllite barytostrontianite barytosulphate bas basal basale basalia basally basalt basaltes basaltic basaltiform basaltine basaltoid basanite basaree Bascology bascule base baseball baseballdom baseballer baseboard baseborn basebred based basehearted baseheartedness baselard baseless baselessly baselessness baselike baseliner Basella Basellaceae basellaceous basely baseman basement basementward baseness basenji bases bash bashaw bashawdom bashawism bashawship bashful bashfully bashfulness Bashilange Bashkir bashlyk Bashmuric basial basialveolar basiarachnitis basiarachnoiditis basiate basiation Basibracteolate basibranchial basibranchiate basibregmatic basic basically basichromatic basichromatin basichromatinic basichromiole basicity basicranial basicytoparaplastin basidia basidial basidigital basidigitale basidiogenetic basidiolichen Basidiolichenes basidiomycete Basidiomycetes basidiomycetous basidiophore basidiospore basidiosporous basidium basidorsal basifacial basification basifier basifixed basifugal basify basigamous basigamy basigenic basigenous basiglandular basigynium basihyal basihyoid Basil basil basilar Basilarchia basilary basilateral basilemma basileus Basilian basilic Basilica basilica Basilicae basilical basilican basilicate basilicon Basilics Basilidian Basilidianism basilinna basiliscan basiliscine Basiliscus basilisk basilissa Basilosauridae Basilosaurus basilweed basilysis basilyst basimesostasis basin basinasal basinasial basined basinerved basinet basinlike basioccipital basion basiophitic basiophthalmite basiophthalmous basiotribe basiotripsy basiparachromatin basiparaplastin basipetal basiphobia basipodite basipoditic basipterygial basipterygium basipterygoid basiradial basirhinal basirostral basis basiscopic basisphenoid basisphenoidal basitemporal basiventral basivertebral bask basker Baskerville basket basketball basketballer basketful basketing basketmaker basketmaking basketry basketware basketwoman basketwood basketwork basketworm Baskish Baskonize Basoche Basoga basoid Basoko Basommatophora basommatophorous bason Basongo basophile basophilia basophilic basophilous basophobia basos basote Basque basque basqued basquine bass Bassa Bassalia Bassalian bassan bassanello bassanite bassara bassarid Bassaris Bassariscus bassarisk basset bassetite bassetta Bassia bassie bassine bassinet bassist bassness basso bassoon bassoonist bassorin bassus basswood Bast bast basta Bastaard Bastard bastard bastardism bastardization bastardize bastardliness bastardly bastardy baste basten baster bastide bastille bastinade bastinado basting bastion bastionary bastioned bastionet bastite bastnasite basto baston basurale Basuto Bat bat bataan batad Batak batakan bataleur Batan batara batata Batatas batatilla Batavi Batavian batch batcher bate batea bateau bateaux bated Batekes batel bateman batement bater Batetela batfish batfowl batfowler batfowling Bath bath Bathala bathe batheable bather bathetic bathflower bathhouse bathic bathing bathless bathman bathmic bathmism bathmotropic bathmotropism bathochromatic bathochromatism bathochrome bathochromic bathochromy bathoflore bathofloric batholite batholith batholithic batholitic bathometer Bathonian bathophobia bathorse bathos bathrobe bathroom bathroomed bathroot bathtub bathukolpian bathukolpic bathvillite bathwort bathyal bathyanesthesia bathybian bathybic bathybius bathycentesis bathychrome bathycolpian bathycolpic bathycurrent bathyesthesia bathygraphic bathyhyperesthesia bathyhypesthesia bathylimnetic bathylite bathylith bathylithic bathylitic bathymeter bathymetric bathymetrical bathymetrically bathymetry bathyorographical bathypelagic bathyplankton bathyseism bathysmal bathysophic bathysophical bathysphere bathythermograph Batidaceae batidaceous batik batiker batikulin batikuling bating batino Batis batiste batitinan batlan batlike batling batlon batman Batocrinidae Batocrinus Batodendron batoid Batoidei Batoka baton Batonga batonistic batonne batophobia Batrachia batrachian batrachiate Batrachidae Batrachium batrachoid Batrachoididae batrachophagous Batrachophidia batrachophobia batrachoplasty Batrachospermum bats batsman batsmanship batster batswing batt Batta batta battailous Battak Battakhin battalia battalion battarism battarismus battel batteler batten battener battening batter batterable battercake batterdock battered batterer batterfang batteried batterman battery batteryman battik batting battish battle battled battledore battlefield battleful battleground battlement battlemented battleplane battler battleship battlesome battlestead battlewagon battleward battlewise battological battologist battologize battology battue batty batukite batule Batussi Batwa batwing batyphone batz batzen bauble baublery baubling Baubo bauch bauchle bauckie bauckiebird baud baudekin baudrons Bauera Bauhinia baul bauleah Baume baumhauerite baun bauno Baure bauson bausond bauta bauxite bauxitite Bavarian bavaroy bavary bavenite baviaantje Bavian bavian baviere bavin Bavius bavoso baw bawarchi bawbee bawcock bawd bawdily bawdiness bawdry bawdship bawdyhouse bawl bawler bawley bawn Bawra bawtie baxter Baxterian Baxterianism baxtone bay Baya baya bayadere bayal bayamo Bayard bayard bayardly bayberry baybolt baybush baycuru bayed bayeta baygall bayhead bayish bayldonite baylet baylike bayman bayness Bayogoula bayok bayonet bayoneted bayoneteer bayou baywood bazaar baze Bazigar bazoo bazooka bazzite bdellid Bdellidae bdellium bdelloid Bdelloida Bdellostoma Bdellostomatidae Bdellostomidae bdellotomy Bdelloura Bdellouridae be Bea beach beachcomb beachcomber beachcombing beached beachhead beachlamar beachless beachman beachmaster beachward beachy beacon beaconage beaconless beaconwise bead beaded beader beadflush beadhouse beadily beadiness beading beadle beadledom beadlehood beadleism beadlery beadleship beadlet beadlike beadman beadroll beadrow beadsman beadswoman beadwork beady Beagle beagle beagling beak beaked beaker beakerful beakerman beakermen beakful beakhead beakiron beaklike beaky beal beala bealing beallach bealtared Bealtine Bealtuinn beam beamage beambird beamed beamer beamfilling beamful beamhouse beamily beaminess beaming beamingly beamish beamless beamlet beamlike beamman beamsman beamster beamwork beamy bean beanbag beanbags beancod beanery beanfeast beanfeaster beanfield beanie beano beansetter beanshooter beanstalk beant beanweed beany beaproned bear bearable bearableness bearably bearance bearbaiter bearbaiting bearbane bearberry bearbind bearbine bearcoot beard bearded bearder beardie bearding beardless beardlessness beardom beardtongue beardy bearer bearess bearfoot bearherd bearhide bearhound bearing bearish bearishly bearishness bearlet bearlike bearm bearship bearskin beartongue bearward bearwood bearwort beast beastbane beastdom beasthood beastie beastily beastish beastishness beastlike beastlily beastliness beastling beastlings beastly beastman beastship beat Beata beata beatable beatae beatee beaten beater beaterman beath beatific beatifical beatifically beatificate beatification beatify beatinest beating beatitude Beatrice Beatrix beatster beatus beau Beauclerc beaufin Beaufort beauish beauism Beaujolais Beaumontia Beaune beaupere beauseant beauship beauteous beauteously beauteousness beauti beautician beautied beautification beautifier beautiful beautifully beautifulness beautify beautihood beauty beautydom beautyship beaux beaver Beaverboard beaverboard beavered beaverette beaverish beaverism beaverite beaverize Beaverkill beaverkin beaverlike beaverpelt beaverroot beaverteen beaverwood beavery beback bebait beballed bebang bebannered bebar bebaron bebaste bebat bebathe bebatter bebay bebeast bebed bebeerine bebeeru bebelted bebilya bebite bebization beblain beblear bebled bebless beblister beblood bebloom beblotch beblubber bebog bebop beboss bebotch bebothered bebouldered bebrave bebreech bebrine bebrother bebrush bebump bebusy bebuttoned becall becalm becalmment becap becard becarpet becarve becassocked becater because beccafico becense bechained bechalk bechance becharm bechase bechatter bechauffeur becheck becher bechern bechignoned bechirp Bechtler Bechuana becircled becivet Beck beck beckelite becker becket Beckie beckiron beckon beckoner beckoning beckoningly Becky beclad beclamor beclamour beclang beclart beclasp beclatter beclaw becloak beclog beclothe becloud beclout beclown becluster becobweb becoiffed becollier becolme becolor becombed become becomes becoming becomingly becomingness becomma becompass becompliment becoom becoresh becost becousined becovet becoward becquerelite becram becramp becrampon becrawl becreep becrime becrimson becrinolined becripple becroak becross becrowd becrown becrush becrust becry becudgel becuffed becuiba becumber becuna becurl becurry becurse becurtained becushioned becut bed bedabble bedad bedaggered bedamn bedamp bedangled bedare bedark bedarken bedash bedaub bedawn beday bedaze bedazement bedazzle bedazzlement bedazzling bedazzlingly bedboard bedbug bedcap bedcase bedchair bedchamber bedclothes bedcord bedcover bedded bedder bedding bedead bedeaf bedeafen bedebt bedeck bedecorate bedeguar bedel beden bedene bedesman bedevil bedevilment bedew bedewer bedewoman bedfast bedfellow bedfellowship bedflower bedfoot Bedford bedframe bedgery bedgoer bedgown bediademed bediamonded bediaper bedight bedikah bedim bedimple bedin bedip bedirt bedirter bedirty bedismal bedizen bedizenment bedkey bedlam bedlamer Bedlamic bedlamism bedlamite bedlamitish bedlamize bedlar bedless bedlids bedmaker bedmaking bedman bedmate bedoctor bedog bedolt bedot bedote Bedouin Bedouinism bedouse bedown bedoyo bedpan bedplate bedpost bedquilt bedrabble bedraggle bedragglement bedrail bedral bedrape bedravel bedrench bedress bedribble bedrid bedridden bedriddenness bedrift bedright bedrip bedrivel bedrizzle bedrock bedroll bedroom bedrop bedrown bedrowse bedrug bedscrew bedsick bedside bedsite bedsock bedsore bedspread bedspring bedstaff bedstand bedstaves bedstead bedstock bedstraw bedstring bedtick bedticking bedtime bedub beduchess beduck beduke bedull bedumb bedunce bedunch bedung bedur bedusk bedust bedwarf bedway bedways bedwell bedye Bee bee beearn beebread beech beechdrops beechen beechnut beechwood beechwoods beechy beedged beedom beef beefeater beefer beefhead beefheaded beefily beefin beefiness beefish beefishness beefless beeflower beefsteak beeftongue beefwood beefy beegerite beehead beeheaded beeherd beehive beehouse beeish beeishness beek beekeeper beekeeping beekite Beekmantown beelbow beelike beeline beelol Beelzebub Beelzebubian Beelzebul beeman beemaster been beennut beer beerage beerbachite beerbibber beerhouse beerily beeriness beerish beerishly beermaker beermaking beermonger beerocracy Beerothite beerpull beery bees beest beestings beeswax beeswing beeswinged beet beeth Beethovenian Beethovenish Beethovian beetle beetled beetlehead beetleheaded beetler beetlestock beetlestone beetleweed beetmister beetrave beetroot beetrooty beety beeve beevish beeware beeway beeweed beewise beewort befall befame befamilied befamine befan befancy befanned befathered befavor befavour befeather beferned befetished befetter befezzed befiddle befilch befile befilleted befilmed befilth befinger befire befist befit befitting befittingly befittingness beflag beflannel beflap beflatter beflea befleck beflounce beflour beflout beflower beflum befluster befoam befog befool befoolment befop before beforehand beforeness beforested beforetime beforetimes befortune befoul befouler befoulment befountained befraught befreckle befreeze befreight befret befriend befriender befriendment befrill befringe befriz befrocked befrogged befrounce befrumple befuddle befuddlement befuddler befume befurbelowed befurred beg begabled begad begall begani begar begari begarlanded begarnish begartered begash begat begaud begaudy begay begaze begeck begem beget begettal begetter beggable beggar beggardom beggarer beggaress beggarhood beggarism beggarlike beggarliness beggarly beggarman beggarweed beggarwise beggarwoman beggary Beggiatoa Beggiatoaceae beggiatoaceous begging beggingly beggingwise Beghard begift begiggle begild begin beginger beginner beginning begird begirdle beglad beglamour beglare beglerbeg beglerbeglic beglerbegluc beglerbegship beglerbey beglic beglide beglitter beglobed begloom begloze begluc beglue begnaw bego begob begobs begoggled begohm begone begonia Begoniaceae begoniaceous Begoniales begorra begorry begotten begottenness begoud begowk begowned begrace begrain begrave begray begrease begreen begrett begrim begrime begrimer begroan begrown begrudge begrudgingly begruntle begrutch begrutten beguard beguess beguile beguileful beguilement beguiler beguiling beguilingly Beguin Beguine beguine begulf begum begun begunk begut behale behalf behallow behammer behap behatted behave behavior behavioral behaviored behaviorism behaviorist behavioristic behavioristically behead beheadal beheader beheadlined behear behears behearse behedge beheld behelp behemoth behen behenate behenic behest behind behinder behindhand behindsight behint behn behold beholdable beholden beholder beholding beholdingness behoney behoof behooped behoot behoove behooveful behoovefully behoovefulness behooves behooving behoovingly behorn behorror behowl behung behusband behymn behypocrite beice Beid beige being beingless beingness beinked beira beisa Beja bejabers bejade bejan bejant bejaundice bejazz bejel bejewel bejezebel bejig bejuggle bejumble bekah bekerchief bekick bekilted beking bekinkinite bekiss bekko beknave beknight beknit beknived beknotted beknottedly beknottedness beknow beknown Bel bel bela belabor belaced beladle belady belage belah Belait Belaites belam Belamcanda belanda belar belard belash belate belated belatedly belatedness belatticed belaud belauder belavendered belay belayer belch belcher beld beldam beldamship belderroot belduque beleaf beleaguer beleaguerer beleaguerment beleap beleave belecture beledgered belee belemnid belemnite Belemnites belemnitic Belemnitidae belemnoid Belemnoidea beletter belfried belfry belga Belgae Belgian Belgic Belgophile Belgrade Belgravia Belgravian Belial Belialic Belialist belibel belick belie belief beliefful belieffulness beliefless belier believability believable believableness believe believer believing believingly belight beliked Belili belimousined Belinda Belinuridae Belinurus belion beliquor Belis belite belitter belittle belittlement belittler belive bell Bella Bellabella Bellacoola belladonna bellarmine Bellatrix bellbind bellbird bellbottle bellboy belle belled belledom Belleek bellehood belleric Bellerophon Bellerophontidae belletrist belletristic bellflower bellhanger bellhanging bellhop bellhouse bellicism bellicose bellicosely bellicoseness bellicosity bellied belliferous belligerence belligerency belligerent belligerently belling bellipotent Bellis bellite bellmaker bellmaking bellman bellmanship bellmaster bellmouth bellmouthed Bellona Bellonian bellonion bellote Bellovaci bellow bellower bellows bellowsful bellowslike bellowsmaker bellowsmaking bellowsman bellpull belltail belltopper belltopperdom bellware bellwaver bellweed bellwether bellwind bellwine bellwood bellwort belly bellyache bellyband bellyer bellyfish bellyflaught bellyful bellying bellyland bellylike bellyman bellypiece bellypinch beloam beloeilite beloid belomancy Belone belonesite belong belonger belonging belonid Belonidae belonite belonoid belonosphaerite belord Belostoma Belostomatidae Belostomidae belout belove beloved below belowstairs belozenged Belshazzar Belshazzaresque belsire belt Beltane belted Beltene belter Beltian beltie beltine belting Beltir Beltis beltmaker beltmaking beltman belton beltwise Beluchi Belucki beluga belugite belute belve belvedere Belverdian bely belying belyingly belzebuth bema bemad bemadam bemaddening bemail bemaim bemajesty beman bemangle bemantle bemar bemartyr bemask bemaster bemat bemata bemaul bemazed Bemba Bembecidae Bembex bemeal bemean bemedaled bemedalled bementite bemercy bemingle beminstrel bemire bemirement bemirror bemirrorment bemist bemistress bemitered bemitred bemix bemoan bemoanable bemoaner bemoaning bemoaningly bemoat bemock bemoil bemoisten bemole bemolt bemonster bemoon bemotto bemoult bemouth bemuck bemud bemuddle bemuddlement bemuddy bemuffle bemurmur bemuse bemused bemusedly bemusement bemusk bemuslined bemuzzle Ben ben bena benab Benacus bename benami benamidar benasty benben bench benchboard bencher benchership benchfellow benchful benching benchland benchlet benchman benchwork benchy bencite bend benda bendability bendable bended bender bending bendingly bendlet bendsome bendwise bendy bene beneaped beneath beneception beneceptive beneceptor benedicite Benedict benedict Benedicta Benedictine Benedictinism benediction benedictional benedictionary benedictive benedictively benedictory Benedictus benedight benefaction benefactive benefactor benefactorship benefactory benefactress benefic benefice beneficed beneficeless beneficence beneficent beneficential beneficently beneficial beneficially beneficialness beneficiary beneficiaryship beneficiate beneficiation benefit benefiter beneighbored Benelux benempt benempted beneplacito benet Benetnasch benettle Beneventan Beneventana benevolence benevolent benevolently benevolentness benevolist beng Bengal Bengalese Bengali Bengalic bengaline Bengola Beni beni benight benighted benightedness benighten benighter benightmare benightment benign benignancy benignant benignantly benignity benignly Benin Benincasa benison benitoite benj Benjamin benjamin benjaminite Benjamite Benjy benjy Benkulen benmost benn benne bennel Bennet bennet Bennettitaceae bennettitaceous Bennettitales Bennettites bennetweed Benny benny beno benorth benote bensel bensh benshea benshee benshi Benson bent bentang benthal Benthamic Benthamism Benthamite benthic benthon benthonic benthos Bentincks bentiness benting Benton bentonite bentstar bentwood benty Benu benumb benumbed benumbedness benumbing benumbingly benumbment benward benweed benzacridine benzal benzalacetone benzalacetophenone benzalaniline benzalazine benzalcohol benzalcyanhydrin benzaldehyde benzaldiphenyl benzaldoxime benzalethylamine benzalhydrazine benzalphenylhydrazone benzalphthalide benzamide benzamido benzamine benzaminic benzamino benzanalgen benzanilide benzanthrone benzantialdoxime benzazide benzazimide benzazine benzazole benzbitriazole benzdiazine benzdifuran benzdioxazine benzdioxdiazine benzdioxtriazine Benzedrine benzein benzene benzenediazonium benzenoid benzenyl benzhydrol benzhydroxamic benzidine benzidino benzil benzilic benzimidazole benziminazole benzinduline benzine benzo benzoate benzoated benzoazurine benzobis benzocaine benzocoumaran benzodiazine benzodiazole benzoflavine benzofluorene benzofulvene benzofuran benzofuroquinoxaline benzofuryl benzoglycolic benzoglyoxaline benzohydrol benzoic benzoid benzoin benzoinated benzoiodohydrin benzol benzolate benzole benzolize benzomorpholine benzonaphthol benzonitrile benzonitrol benzoperoxide benzophenanthrazine benzophenanthroline benzophenazine benzophenol benzophenone benzophenothiazine benzophenoxazine benzophloroglucinol benzophosphinic benzophthalazine benzopinacone benzopyran benzopyranyl benzopyrazolone benzopyrylium benzoquinoline benzoquinone benzoquinoxaline benzosulphimide benzotetrazine benzotetrazole benzothiazine benzothiazole benzothiazoline benzothiodiazole benzothiofuran benzothiophene benzothiopyran benzotoluide benzotriazine benzotriazole benzotrichloride benzotrifuran benzoxate benzoxy benzoxyacetic benzoxycamphor benzoxyphenanthrene benzoyl benzoylate benzoylation benzoylformic benzoylglycine benzpinacone benzthiophen benztrioxazine benzyl benzylamine benzylic benzylidene benzylpenicillin beode Beothuk Beothukan Beowulf bepaid Bepaint bepale bepaper beparch beparody beparse bepart bepaste bepastured bepat bepatched bepaw bepearl bepelt bepen bepepper beperiwigged bepester bepewed bephilter bephrase bepicture bepiece bepierce bepile bepill bepillared bepimple bepinch bepistoled bepity beplague beplaided beplaster beplumed bepommel bepowder bepraise bepraisement bepraiser beprank bepray bepreach bepress bepretty bepride beprose bepuddle bepuff bepun bepurple bepuzzle bepuzzlement bequalm bequeath bequeathable bequeathal bequeather bequeathment bequest bequirtle bequote ber berain berairou berakah berake berakoth berapt berascal berat berate berattle beraunite beray berbamine Berber Berberi Berberian berberid Berberidaceae berberidaceous berberine Berberis berberry Berchemia Berchta berdache bere Berean bereason bereave bereavement bereaven bereaver bereft berend Berengaria Berengarian Berengarianism berengelite Berenice Bereshith beresite beret berewick berg bergalith Bergama Bergamask bergamiol Bergamo Bergamot bergamot bergander bergaptene berger berghaan berginization berginize berglet bergschrund Bergsonian Bergsonism bergut bergy bergylt berhyme Beri beribanded beribboned beriberi beriberic beride berigora beringed beringite beringleted berinse berith Berkeleian Berkeleianism Berkeleyism Berkeleyite berkelium berkovets berkowitz Berkshire berley berlin berline Berliner berlinite Berlinize berm Bermuda Bermudian bermudite Bern Bernard Bernardina Bernardine berne Bernese Bernice Bernicia bernicle Bernie Berninesque Bernoullian berobed Beroe Beroida Beroidae beroll Berossos berouged beround berrendo berret berri berried berrier berrigan berrugate berry berrybush berryless berrylike berrypicker berrypicking berseem berserk berserker Bersiamite Bersil Bert Bertat Berteroa berth Bertha berthage berthed berther berthierite berthing Berthold Bertholletia Bertie Bertolonia Bertram bertram Bertrand bertrandite bertrum beruffed beruffled berust bervie berycid Berycidae beryciform berycine berycoid Berycoidea berycoidean Berycoidei Berycomorphi beryl berylate beryllia berylline berylliosis beryllium berylloid beryllonate beryllonite beryllosis Berytidae Beryx berzelianite berzeliite bes besa besagne besaiel besaint besan besanctify besauce bescab bescarf bescatter bescent bescorch bescorn bescoundrel bescour bescourge bescramble bescrape bescratch bescrawl bescreen bescribble bescurf bescurvy bescutcheon beseam besee beseech beseecher beseeching beseechingly beseechingness beseechment beseem beseeming beseemingly beseemingness beseemliness beseemly beseen beset besetment besetter besetting beshackle beshade beshadow beshag beshake beshame beshawled beshear beshell beshield beshine beshiver beshlik beshod beshout beshow beshower beshrew beshriek beshrivel beshroud besiclometer beside besides besiege besieged besiegement besieger besieging besiegingly besigh besilver besin besing besiren besit beslab beslap beslash beslave beslaver besleeve beslime beslimer beslings beslipper beslobber beslow beslubber beslur beslushed besmear besmearer besmell besmile besmirch besmircher besmirchment besmoke besmooth besmother besmouch besmudge besmut besmutch besnare besneer besnivel besnow besnuff besodden besogne besognier besoil besom besomer besonnet besoot besoothe besoothement besot besotment besotted besottedly besottedness besotting besottingly besought besoul besour bespangle bespate bespatter bespatterer bespatterment bespawl bespeak bespeakable bespeaker bespecked bespeckle bespecklement bespectacled besped bespeech bespeed bespell bespelled bespend bespete bespew bespice bespill bespin bespirit bespit besplash besplatter besplit bespoke bespoken bespot bespottedness bespouse bespout bespray bespread besprent besprinkle besprinkler bespurred besputter bespy besqueeze besquib besra Bess Bessarabian Besselian Bessemer bessemer Bessemerize bessemerize Bessera Bessi Bessie Bessy best bestab bestain bestamp bestar bestare bestarve bestatued bestay bestayed bestead besteer bestench bester bestial bestialism bestialist bestiality bestialize bestially bestiarian bestiarianism bestiary bestick bestill bestink bestir bestness bestock bestore bestorm bestove bestow bestowable bestowage bestowal bestower bestowing bestowment bestraddle bestrapped bestraught bestraw bestreak bestream bestrew bestrewment bestride bestripe bestrode bestubbled bestuck bestud besugar besuit besully beswarm besweatered besweeten beswelter beswim beswinge beswitch bet Beta beta betacism betacismus betafite betag betail betailor betaine betainogen betalk betallow betangle betanglement betask betassel betatron betattered betaxed betear beteela beteem betel Betelgeuse Beth beth bethabara bethankit bethel Bethesda bethflower bethink Bethlehem Bethlehemite bethought bethrall bethreaten bethroot Bethuel bethumb bethump bethunder bethwack Bethylidae betide betimber betimes betinge betipple betire betis betitle betocsin betoil betoken betokener betone betongue Betonica betony betorcin betorcinol betoss betowel betowered Betoya Betoyan betrace betrail betrample betrap betravel betray betrayal betrayer betrayment betread betrend betrim betrinket betroth betrothal betrothed betrothment betrough betrousered betrumpet betrunk Betsey Betsileos Betsimisaraka betso Betsy Betta betted better betterer bettergates bettering betterly betterment bettermost betterness betters Bettina Bettine betting bettong bettonga Bettongia bettor Betty betty betuckered Betula Betulaceae betulaceous betulin betulinamaric betulinic betulinol Betulites beturbaned betusked betutor betutored betwattled between betweenbrain betweenity betweenmaid betweenness betweenwhiles betwine betwit betwixen betwixt beudantite Beulah beuniformed bevatron beveil bevel beveled beveler bevelled bevelment bevenom bever beverage Beverly beverse bevesseled bevesselled beveto bevillain bevined bevoiled bevomit bevue bevy bewail bewailable bewailer bewailing bewailingly bewailment bewaitered bewall beware bewash bewaste bewater beweary beweep beweeper bewelcome bewelter bewept bewest bewet bewhig bewhiskered bewhisper bewhistle bewhite bewhiten bewidow bewig bewigged bewilder bewildered bewilderedly bewilderedness bewildering bewilderingly bewilderment bewimple bewinged bewinter bewired bewitch bewitchedness bewitcher bewitchery bewitchful bewitching bewitchingly bewitchingness bewitchment bewith bewizard bework beworm beworn beworry beworship bewrap bewrathed bewray bewrayer bewrayingly bewrayment bewreath bewreck bewrite bey beydom beylic beylical beyond beyrichite beyship Bezaleel Bezaleelian bezant bezantee bezanty bezel bezesteen bezetta bezique bezoar bezoardic bezonian Bezpopovets bezzi bezzle bezzo bhabar Bhadon Bhaga bhagavat bhagavata bhaiachari bhaiyachara bhakta bhakti bhalu bhandar bhandari bhang bhangi Bhar bhara bharal Bharata bhat bhava Bhavani bheesty bhikku bhikshu Bhil Bhili Bhima Bhojpuri bhoosa Bhotia Bhotiya Bhowani bhoy Bhumij bhungi bhungini bhut Bhutanese Bhutani bhutatathata Bhutia biabo biacetyl biacetylene biacid biacromial biacuminate biacuru bialate biallyl bialveolar Bianca Bianchi bianchite bianco biangular biangulate biangulated biangulous bianisidine biannual biannually biannulate biarchy biarcuate biarcuated biarticular biarticulate biarticulated bias biasness biasteric biaswise biatomic biauricular biauriculate biaxal biaxial biaxiality biaxially biaxillary bib bibacious bibacity bibasic bibation bibb bibber bibble bibbler bibbons bibcock bibenzyl bibi Bibio bibionid Bibionidae bibiri bibitory Bible bibless Biblic Biblical Biblicality Biblically Biblicism Biblicist Biblicistic Biblicolegal Biblicoliterary Biblicopsychological biblioclasm biblioclast bibliofilm bibliogenesis bibliognost bibliognostic bibliogony bibliograph bibliographer bibliographic bibliographical bibliographically bibliographize bibliography biblioklept bibliokleptomania bibliokleptomaniac bibliolater bibliolatrous bibliolatry bibliological bibliologist bibliology bibliomancy bibliomane bibliomania bibliomaniac bibliomaniacal bibliomanian bibliomanianism bibliomanism bibliomanist bibliopegic bibliopegist bibliopegistic bibliopegy bibliophage bibliophagic bibliophagist bibliophagous bibliophile bibliophilic bibliophilism bibliophilist bibliophilistic bibliophily bibliophobia bibliopolar bibliopole bibliopolery bibliopolic bibliopolical bibliopolically bibliopolism bibliopolist bibliopolistic bibliopoly bibliosoph bibliotaph bibliotaphic bibliothec bibliotheca bibliothecal bibliothecarial bibliothecarian bibliothecary bibliotherapeutic bibliotherapist bibliotherapy bibliothetic bibliotic bibliotics bibliotist Biblism Biblist biblus biborate bibracteate bibracteolate bibulosity bibulous bibulously bibulousness Bibulus bicalcarate bicameral bicameralism bicamerist bicapitate bicapsular bicarbonate bicarbureted bicarinate bicarpellary bicarpellate bicaudal bicaudate Bice bice bicellular bicentenary bicentennial bicephalic bicephalous biceps bicetyl bichir bichloride bichord bichromate bichromatic bichromatize bichrome bichromic bichy biciliate biciliated bicipital bicipitous bicircular bicirrose bick bicker bickerer bickern biclavate biclinium bicollateral bicollaterality bicolligate bicolor bicolored bicolorous biconcave biconcavity bicondylar bicone biconic biconical biconically biconjugate biconsonantal biconvex bicorn bicornate bicorne bicorned bicornous bicornuate bicornuous bicornute bicorporal bicorporate bicorporeal bicostate bicrenate bicrescentic bicrofarad bicron bicrural bicursal bicuspid bicuspidate bicyanide bicycle bicycler bicyclic bicyclism bicyclist bicyclo bicycloheptane bicylindrical bid bidactyl bidactyle bidactylous bidar bidarka bidcock biddable biddableness biddably biddance Biddelian bidder bidding Biddulphia Biddulphiaceae Biddy biddy bide Bidens bident bidental bidentate bidented bidential bidenticulate bider bidet bidigitate bidimensional biding bidirectional bidiurnal Bidpai bidri biduous bieberite Biedermeier bield bieldy bielectrolysis bielenite Bielid Bielorouss bien bienly bienness biennia biennial biennially biennium bier bierbalk biethnic bietle bifacial bifanged bifara bifarious bifariously bifer biferous biff biffin bifid bifidate bifidated bifidity bifidly bifilar bifilarly bifistular biflabellate biflagellate biflecnode biflected biflex biflorate biflorous bifluoride bifocal bifoil bifold bifolia bifoliate bifoliolate bifolium biforked biform biformed biformity biforous bifront bifrontal bifronted bifurcal bifurcate bifurcated bifurcately bifurcation big biga bigamic bigamist bigamistic bigamize bigamous bigamously bigamy bigarade bigaroon bigarreau bigbloom bigemina bigeminal bigeminate bigeminated bigeminum bigener bigeneric bigential bigeye bigg biggah biggen bigger biggest biggin biggish biggonet bigha bighead bighearted bigheartedness bighorn bight biglandular biglenoid biglot bigmouth bigmouthed bigness Bignonia Bignoniaceae bignoniaceous bignoniad bignou bigoniac bigonial bigot bigoted bigotedly bigotish bigotry bigotty bigroot bigthatch biguanide biguttate biguttulate bigwig bigwigged bigwiggedness bigwiggery bigwiggism Bihai Biham bihamate Bihari biharmonic bihourly bihydrazine bija bijasal bijou bijouterie bijoux bijugate bijugular bike bikh bikhaconitine bikini Bikol Bikram Bikukulla Bilaan bilabe bilabial bilabiate bilalo bilamellar bilamellate bilamellated bilaminar bilaminate bilaminated bilander bilateral bilateralism bilaterality bilaterally bilateralness Bilati bilberry bilbie bilbo bilboquet bilby bilch bilcock bildar bilders bile bilestone bilge bilgy Bilharzia bilharzial bilharziasis bilharzic bilharziosis bilianic biliary biliate biliation bilic bilicyanin bilifaction biliferous bilification bilifuscin bilify bilihumin bilimbi bilimbing biliment Bilin bilinear bilineate bilingual bilingualism bilingually bilinguar bilinguist bilinigrin bilinite bilio bilious biliously biliousness biliprasin bilipurpurin bilipyrrhin bilirubin bilirubinemia bilirubinic bilirubinuria biliteral biliteralism bilith bilithon biliverdic biliverdin bilixanthin bilk bilker Bill bill billa billable billabong billback billbeetle Billbergia billboard billbroking billbug billed biller billet billeter billethead billeting billetwood billety billfish billfold billhead billheading billholder billhook billian billiard billiardist billiardly billiards Billie Billiken billikin billing billingsgate billion billionaire billionism billionth billitonite Billjim billman billon billot billow billowiness billowy billposter billposting billsticker billsticking Billy billy billyboy billycan billycock billyer billyhood billywix bilo bilobated bilobe bilobed bilobiate bilobular bilocation bilocellate bilocular biloculate Biloculina biloculine bilophodont Biloxi bilsh Bilskirnir bilsted biltong biltongue Bim bimaculate bimaculated bimalar Bimana bimanal bimane bimanous bimanual bimanually bimarginate bimarine bimastic bimastism bimastoid bimasty bimaxillary bimbil Bimbisara bimeby bimensal bimester bimestrial bimetalic bimetallism bimetallist bimetallistic bimillenary bimillennium bimillionaire Bimini Bimmeler bimodal bimodality bimolecular bimonthly bimotored bimotors bimucronate bimuscular bin binal binaphthyl binarium binary binate binately bination binational binaural binauricular binbashi bind binder bindery bindheimite binding bindingly bindingness bindle bindlet bindoree bindweb bindweed bindwith bindwood bine binervate bineweed bing binge bingey binghi bingle bingo bingy binh Bini biniodide Binitarian Binitarianism bink binman binna binnacle binning binnite binnogue bino binocle binocular binocularity binocularly binoculate binodal binode binodose binodous binomenclature binomial binomialism binomially binominal binominated binominous binormal binotic binotonous binous binoxalate binoxide bint bintangor binturong binuclear binucleate binucleated binucleolate binukau Binzuru biobibliographical biobibliography bioblast bioblastic biocatalyst biocellate biocentric biochemic biochemical biochemically biochemics biochemist biochemistry biochemy biochore bioclimatic bioclimatology biocoenose biocoenosis biocoenotic biocycle biod biodynamic biodynamical biodynamics biodyne bioecologic bioecological bioecologically bioecologist bioecology biogen biogenase biogenesis biogenesist biogenetic biogenetical biogenetically biogenetics biogenous biogeny biogeochemistry biogeographic biogeographical biogeographically biogeography biognosis biograph biographee biographer biographic biographical biographically biographist biographize biography bioherm biokinetics biolinguistics biolith biologese biologic biological biologically biologicohumanistic biologism biologist biologize biology bioluminescence bioluminescent biolysis biolytic biomagnetic biomagnetism biomathematics biome biomechanical biomechanics biometeorology biometer biometric biometrical biometrically biometrician biometricist biometrics biometry biomicroscopy bion bionergy bionomic bionomical bionomically bionomics bionomist bionomy biophagism biophagous biophagy biophilous biophore biophotophone biophysical biophysicochemical biophysics biophysiography biophysiological biophysiologist biophysiology biophyte bioplasm bioplasmic bioplast bioplastic bioprecipitation biopsic biopsy biopsychic biopsychical biopsychological biopsychologist biopsychology biopyribole bioral biorbital biordinal bioreaction biorgan bios bioscope bioscopic bioscopy biose biosis biosocial biosociological biosphere biostatic biostatical biostatics biostatistics biosterin biosterol biostratigraphy biosynthesis biosynthetic biosystematic biosystematics biosystematist biosystematy Biota biota biotaxy biotechnics biotic biotical biotics biotin biotite biotitic biotome biotomy biotope biotype biotypic biovular biovulate bioxalate bioxide bipack bipaleolate Bipaliidae Bipalium bipalmate biparasitic biparental biparietal biparous biparted bipartible bipartient bipartile bipartisan bipartisanship bipartite bipartitely bipartition biparty bipaschal bipectinate bipectinated biped bipedal bipedality bipedism bipeltate bipennate bipennated bipenniform biperforate bipersonal bipetalous biphase biphasic biphenol biphenyl biphenylene bipinnaria bipinnate bipinnated bipinnately bipinnatifid bipinnatiparted bipinnatipartite bipinnatisect bipinnatisected biplanal biplanar biplane biplicate biplicity biplosion biplosive bipod bipolar bipolarity bipolarize Bipont Bipontine biporose biporous biprism biprong bipunctal bipunctate bipunctual bipupillate bipyramid bipyramidal bipyridine bipyridyl biquadrantal biquadrate biquadratic biquarterly biquartz biquintile biracial biracialism biradial biradiate biradiated biramous birational birch birchbark birchen birching birchman birchwood bird birdbander birdbanding birdbath birdberry birdcall birdcatcher birdcatching birdclapper birdcraft birddom birdeen birder birdglue birdhood birdhouse birdie birdikin birding birdland birdless birdlet birdlike birdlime birdling birdlore birdman birdmouthed birdnest birdnester birdseed birdstone birdweed birdwise birdwoman birdy birectangular birefracting birefraction birefractive birefringence birefringent bireme biretta Birgus biri biriba birimose birk birken Birkenhead Birkenia Birkeniidae birkie birkremite birl birle birler birlie birlieman birlinn birma Birmingham Birminghamize birn birny Biron birostrate birostrated birotation birotatory birr birse birsle birsy birth birthbed birthday birthland birthless birthmark birthmate birthnight birthplace birthright birthroot birthstone birthstool birthwort birthy bis bisabol bisaccate bisacromial bisalt Bisaltae bisantler bisaxillary bisbeeite biscacha Biscanism Biscayan Biscayanism biscayen Biscayner bischofite biscotin biscuit biscuiting biscuitlike biscuitmaker biscuitmaking biscuitroot biscuitry bisdiapason bisdimethylamino bisect bisection bisectional bisectionally bisector bisectrices bisectrix bisegment biseptate biserial biserially biseriate biseriately biserrate bisetose bisetous bisexed bisext bisexual bisexualism bisexuality bisexually bisexuous bisglyoxaline Bishareen Bishari Bisharin bishop bishopdom bishopess bishopful bishophood bishopless bishoplet bishoplike bishopling bishopric bishopship bishopweed bisiliac bisilicate bisiliquous bisimine bisinuate bisinuation bisischiadic bisischiatic Bisley bislings bismar Bismarck Bismarckian Bismarckianism bismarine bismerpund bismillah bismite Bismosol bismuth bismuthal bismuthate bismuthic bismuthide bismuthiferous bismuthine bismuthinite bismuthite bismuthous bismuthyl bismutite bismutoplagionite bismutosmaltite bismutosphaerite bisnaga bison bisonant bisontine bisphenoid bispinose bispinous bispore bisporous bisque bisquette bissext bissextile bisson bistate bistephanic bister bistered bistetrazole bisti bistipular bistipulate bistipuled bistort Bistorta bistournage bistoury bistratal bistratose bistriate bistriazole bistro bisubstituted bisubstitution bisulcate bisulfid bisulphate bisulphide bisulphite bisyllabic bisyllabism bisymmetric bisymmetrical bisymmetrically bisymmetry bit bitable bitangent bitangential bitanhol bitartrate bitbrace bitch bite bitemporal bitentaculate biter biternate biternately bitesheep bitewing bitheism Bithynian biti biting bitingly bitingness Bitis bitless bito bitolyl bitonality bitreadle bitripartite bitripinnatifid bitriseptate bitrochanteric bitstock bitstone bitt bitted bitten bitter bitterbark bitterblain bitterbloom bitterbur bitterbush bitterful bitterhead bitterhearted bitterheartedness bittering bitterish bitterishness bitterless bitterling bitterly bittern bitterness bitternut bitterroot bitters bittersweet bitterweed bitterwood bitterworm bitterwort bitthead bittie Bittium bittock bitty bitubercular bituberculate bituberculated Bitulithic bitulithic bitume bitumed bitumen bituminate bituminiferous bituminization bituminize bituminoid bituminous bitwise bityite bitypic biune biunial biunity biunivocal biurate biurea biuret bivalence bivalency bivalent bivalve bivalved Bivalvia bivalvian bivalvous bivalvular bivariant bivariate bivascular bivaulted bivector biventer biventral biverbal bivinyl bivious bivittate bivocal bivocalized bivoltine bivoluminous bivouac biwa biweekly biwinter Bixa Bixaceae bixaceous bixbyite bixin biyearly biz bizardite bizarre bizarrely bizarreness Bizen bizet bizonal bizone Bizonia bizygomatic bizz Bjorne blab blabber blabberer blachong black blackacre blackamoor blackback blackball blackballer blackband Blackbeard blackbelly blackberry blackbine blackbird blackbirder blackbirding blackboard blackboy blackbreast blackbush blackbutt blackcap blackcoat blackcock blackdamp blacken blackener blackening blacker blacketeer blackey blackeyes blackface Blackfeet blackfellow blackfellows blackfin blackfire blackfish blackfisher blackfishing Blackfoot blackfoot Blackfriars blackguard blackguardism blackguardize blackguardly blackguardry Blackhander blackhead blackheads blackheart blackhearted blackheartedness blackie blacking blackish blackishly blackishness blackit blackjack blackland blackleg blackleggery blacklegism blacklegs blackly blackmail blackmailer blackneb blackneck blackness blacknob blackout blackpoll blackroot blackseed blackshirted blacksmith blacksmithing blackstick blackstrap blacktail blackthorn blacktongue blacktree blackwash blackwasher blackwater blackwood blackwork blackwort blacky blad bladder bladderet bladderless bladderlike bladdernose bladdernut bladderpod bladderseed bladderweed bladderwort bladdery blade bladebone bladed bladelet bladelike blader bladesmith bladewise blading bladish blady bladygrass blae blaeberry blaeness blaewort blaff blaffert blaflum blah blahlaut blain Blaine Blair blair blairmorite Blake blake blakeberyed blamable blamableness blamably blame blamed blameful blamefully blamefulness blameless blamelessly blamelessness blamer blameworthiness blameworthy blaming blamingly blan blanc blanca blancard Blanch blanch blancher blanching blanchingly blancmange blancmanger blanco bland blanda Blandfordia blandiloquence blandiloquious blandiloquous blandish blandisher blandishing blandishingly blandishment blandly blandness blank blankard blankbook blanked blankeel blanket blanketed blanketeer blanketflower blanketing blanketless blanketmaker blanketmaking blanketry blanketweed blankety blanking blankish Blankit blankite blankly blankness blanky blanque blanquillo blare Blarina blarney blarneyer blarnid blarny blart blas blase blash blashy Blasia blaspheme blasphemer blasphemous blasphemously blasphemousness blasphemy blast blasted blastema blastemal blastematic blastemic blaster blastful blasthole blastid blastie blasting blastment blastocarpous blastocheme blastochyle blastocoele blastocolla blastocyst blastocyte blastoderm blastodermatic blastodermic blastodisk blastogenesis blastogenetic blastogenic blastogeny blastogranitic blastoid Blastoidea blastoma blastomata blastomere blastomeric Blastomyces blastomycete Blastomycetes blastomycetic blastomycetous blastomycosis blastomycotic blastoneuropore Blastophaga blastophitic blastophoral blastophore blastophoric blastophthoria blastophthoric blastophyllum blastoporal blastopore blastoporic blastoporphyritic blastosphere blastospheric blastostylar blastostyle blastozooid blastplate blastula blastulae blastular blastulation blastule blasty blat blatancy blatant blatantly blate blately blateness blather blatherer blatherskite blathery blatjang Blatta blatta Blattariae blatter blatterer blatti blattid Blattidae blattiform Blattodea blattoid Blattoidea blaubok Blaugas blauwbok blaver blaw blawort blay Blayne blaze blazer blazing blazingly blazon blazoner blazoning blazonment blazonry blazy bleaberry bleach bleachability bleachable bleached bleacher bleacherite bleacherman bleachery bleachfield bleachground bleachhouse bleaching bleachman bleachworks bleachyard bleak bleakish bleakly bleakness bleaky blear bleared blearedness bleareye bleariness blearness bleary bleat bleater bleating bleatingly bleaty bleb blebby blechnoid Blechnum bleck blee bleed bleeder bleeding bleekbok bleery bleeze bleezy blellum blemish blemisher blemishment Blemmyes blench blencher blenching blenchingly blencorn blend blendcorn blende blended blender blending blendor blendure blendwater blennadenitis blennemesis blennenteria blennenteritis blenniid Blenniidae blenniiform Blenniiformes blennioid Blennioidea blennocele blennocystitis blennoemesis blennogenic blennogenous blennoid blennoma blennometritis blennophlogisma blennophlogosis blennophthalmia blennoptysis blennorrhagia blennorrhagic blennorrhea blennorrheal blennorrhinia blennosis blennostasis blennostatic blennothorax blennotorrhea blennuria blenny blennymenitis blent bleo blephara blepharadenitis blepharal blepharanthracosis blepharedema blepharelcosis blepharemphysema Blephariglottis blepharism blepharitic blepharitis blepharoadenitis blepharoadenoma blepharoatheroma blepharoblennorrhea blepharocarcinoma Blepharocera Blepharoceridae blepharochalasis blepharochromidrosis blepharoclonus blepharocoloboma blepharoconjunctivitis blepharodiastasis blepharodyschroia blepharohematidrosis blepharolithiasis blepharomelasma blepharoncosis blepharoncus blepharophimosis blepharophryplasty blepharophthalmia blepharophyma blepharoplast blepharoplastic blepharoplasty blepharoplegia blepharoptosis blepharopyorrhea blepharorrhaphy blepharospasm blepharospath blepharosphincterectomy blepharostat blepharostenosis blepharosymphysis blepharosyndesmitis blepharosynechia blepharotomy blepharydatis Blephillia blesbok blesbuck bless blessed blessedly blessedness blesser blessing blessingly blest blet bletheration Bletia Bletilla blewits blibe blick blickey Blighia blight blightbird blighted blighter blighting blightingly blighty blimbing blimp blimy blind blindage blindball blinded blindedly blinder blindeyes blindfast blindfish blindfold blindfolded blindfoldedness blindfolder blindfoldly blinding blindingly blindish blindless blindling blindly blindness blindstory blindweed blindworm blink blinkard blinked blinker blinkered blinking blinkingly blinks blinky blinter blintze blip bliss blissful blissfully blissfulness blissless blissom blister blistered blistering blisteringly blisterweed blisterwort blistery blite blithe blithebread blitheful blithefully blithehearted blithelike blithely blithemeat blithen blitheness blither blithering blithesome blithesomely blithesomeness blitter Blitum blitz blitzbuggy blitzkrieg blizz blizzard blizzardly blizzardous blizzardy blo bloat bloated bloatedness bloater bloating blob blobbed blobber blobby bloc block blockade blockader blockage blockbuster blocked blocker blockhead blockheaded blockheadedly blockheadedness blockheadish blockheadishness blockheadism blockholer blockhouse blockiness blocking blockish blockishly blockishness blocklayer blocklike blockmaker blockmaking blockman blockpate blockship blocky blodite bloke blolly blomstrandine blonde blondeness blondine blood bloodalley bloodalp bloodbeat bloodberry bloodbird bloodcurdler bloodcurdling blooddrop blooddrops blooded bloodfin bloodflower bloodguilt bloodguiltiness bloodguiltless bloodguilty bloodhound bloodied bloodily bloodiness bloodleaf bloodless bloodlessly bloodlessness bloodletter bloodletting bloodline bloodmobile bloodmonger bloodnoun bloodripe bloodripeness bloodroot bloodshed bloodshedder bloodshedding bloodshot bloodshotten bloodspiller bloodspilling bloodstain bloodstained bloodstainedness bloodstanch bloodstock bloodstone bloodstroke bloodsuck bloodsucker bloodsucking bloodthirst bloodthirster bloodthirstily bloodthirstiness bloodthirsting bloodthirsty bloodweed bloodwite bloodwood bloodworm bloodwort bloodworthy bloody bloodybones blooey bloom bloomage bloomer Bloomeria bloomerism bloomers bloomery bloomfell blooming bloomingly bloomingness bloomkin bloomless Bloomsburian Bloomsbury bloomy bloop blooper blooping blore blosmy blossom blossombill blossomed blossomhead blossomless blossomry blossomtime blossomy blot blotch blotched blotchy blotless blotter blottesque blottesquely blotting blottingly blotto blotty bloubiskop blouse bloused blousing blout blow blowback blowball blowcock blowdown blowen blower blowfish blowfly blowgun blowhard blowhole blowiness blowing blowings blowiron blowlamp blowline blown blowoff blowout blowpipe blowpoint blowproof blowspray blowth blowtorch blowtube blowup blowy blowze blowzed blowzing blowzy blub blubber blubberer blubbering blubberingly blubberman blubberous blubbery blucher bludgeon bludgeoned bludgeoneer bludgeoner blue blueback bluebead Bluebeard bluebeard Bluebeardism bluebell bluebelled blueberry bluebill bluebird blueblaw bluebonnet bluebook bluebottle bluebreast bluebuck bluebush bluebutton bluecap bluecoat bluecup bluefish bluegill bluegown bluegrass bluehearted bluehearts blueing bluejack bluejacket bluejoint blueleg bluelegs bluely blueness bluenose Bluenoser blueprint blueprinter bluer blues bluesides bluestem bluestocking bluestockingish bluestockingism bluestone bluestoner bluet bluethroat bluetongue bluetop blueweed bluewing bluewood bluey bluff bluffable bluffer bluffly bluffness bluffy bluggy bluing bluish bluishness bluism Blumea blunder blunderbuss blunderer blunderful blunderhead blunderheaded blunderheadedness blundering blunderingly blundersome blunge blunger blunk blunker blunks blunnen blunt blunter blunthead blunthearted bluntie bluntish bluntly bluntness blup blur blurb blurbist blurred blurredness blurrer blurry blurt blush blusher blushful blushfully blushfulness blushiness blushing blushingly blushless blushwort blushy bluster blusteration blusterer blustering blusteringly blusterous blusterously blustery blype bo boa Boaedon boagane Boanbura Boanerges boanergism boar boarcite board boardable boarder boarding boardinghouse boardlike boardly boardman boardwalk boardy boarfish boarhound boarish boarishly boarishness boarship boarskin boarspear boarstaff boarwood boast boaster boastful boastfully boastfulness boasting boastive boastless boat boatable boatage boatbill boatbuilder boatbuilding boater boatfalls boatful boathead boatheader boathouse boatie boating boatkeeper boatless boatlike boatlip boatload boatloader boatloading boatly boatman boatmanship boatmaster boatowner boatsetter boatshop boatside boatsman boatswain boattail boatward boatwise boatwoman boatwright Bob bob boba bobac Bobadil Bobadilian Bobadilish Bobadilism bobbed bobber bobbery Bobbie bobbin bobbiner bobbinet bobbing Bobbinite bobbinwork bobbish bobbishly bobble Bobby bobby bobcat bobcoat bobeche bobfly bobierrite bobization bobjerom bobo bobolink bobotie bobsled bobsleigh bobstay bobtail bobtailed bobwhite bobwood bocaccio bocal bocardo bocasine bocca boccale boccarella boccaro bocce Bocconia boce bocedization Boche bocher Bochism bock bockerel bockeret bocking bocoy bod bodach bodacious bodaciously bode bodeful bodega bodement boden bodenbenderite boder bodewash bodge bodger bodgery bodhi bodhisattva bodice bodiced bodicemaker bodicemaking bodied bodier bodieron bodikin bodiless bodilessness bodiliness bodily bodiment boding bodingly bodkin bodkinwise bodle Bodleian Bodo bodock Bodoni body bodybending bodybuilder bodyguard bodyhood bodyless bodymaker bodymaking bodyplate bodywise bodywood bodywork Boebera Boedromion Boehmenism Boehmenist Boehmenite Boehmeria boeotarch Boeotian Boeotic Boer Boerdom Boerhavia Boethian Boethusian bog boga bogan bogard bogart bogberry bogey bogeyman boggart boggin bogginess boggish boggle bogglebo boggler boggy boghole bogie bogieman bogier Bogijiab bogland boglander bogle bogledom boglet bogman bogmire Bogo bogo Bogomil Bogomile Bogomilian bogong Bogota bogsucker bogtrot bogtrotter bogtrotting bogue bogum bogus bogusness bogway bogwood bogwort bogy bogydom bogyism bogyland Bohairic bohawn bohea Bohemia Bohemian Bohemianism bohemium bohereen bohireen boho bohor bohunk boid Boidae Boii Boiko boil boilable boildown boiled boiler boilerful boilerhouse boilerless boilermaker boilermaking boilerman boilersmith boilerworks boilery boiling boilinglike boilingly boilover boily Bois boist boisterous boisterously boisterousness bojite bojo bokadam bokard bokark boke Bokhara Bokharan bokom bola Bolag bolar Bolboxalis bold bolden Bolderian boldhearted boldine boldly boldness boldo Boldu bole bolection bolectioned boled boleite Bolelia bolelike bolero Boletaceae boletaceous bolete Boletus boleweed bolewort bolide bolimba bolis bolivar bolivarite bolivia Bolivian boliviano bolk boll Bollandist bollard bolled boller bolling bollock bollworm bolly Bolo bolo Bologna Bolognan Bolognese bolograph bolographic bolographically bolography Boloism boloman bolometer bolometric boloney boloroot Bolshevik Bolsheviki Bolshevikian Bolshevism Bolshevist Bolshevistic Bolshevistically Bolshevize Bolshie bolson bolster bolsterer bolsterwork bolt boltage boltant boltcutter boltel bolter bolthead boltheader boltheading bolthole bolti bolting boltless boltlike boltmaker boltmaking Boltonia boltonite boltrope boltsmith boltstrake boltuprightness boltwork bolus Bolyaian bom boma Bomarea bomb bombable Bombacaceae bombacaceous bombard bombarde bombardelle bombarder bombardier bombardment bombardon bombast bombaster bombastic bombastically bombastry Bombax Bombay bombazet bombazine bombed bomber bombiccite Bombidae bombilate bombilation Bombinae bombinate bombination bombo bombola bombonne bombous bombproof bombshell bombsight Bombus bombycid Bombycidae bombyciform Bombycilla Bombycillidae Bombycina bombycine Bombyliidae Bombyx Bon bon bonaci bonagh bonaght bonair bonairly bonairness bonally bonang bonanza Bonapartean Bonapartism Bonapartist Bonasa bonasus bonaventure Bonaveria bonavist Bonbo bonbon bonce bond bondage bondager bondar bonded Bondelswarts bonder bonderman bondfolk bondholder bondholding bonding bondless bondman bondmanship bondsman bondstone bondswoman bonduc bondwoman bone boneache bonebinder boneblack bonebreaker boned bonedog bonefish boneflower bonehead boneheaded boneless bonelessly bonelessness bonelet bonelike Bonellia boner boneset bonesetter bonesetting boneshaker boneshaw bonetail bonewood bonework bonewort Boney bonfire bong Bongo bongo bonhomie Boni boniata Boniface bonification boniform bonify boniness boninite bonitarian bonitary bonito bonk bonnaz bonnet bonneted bonneter bonnethead bonnetless bonnetlike bonnetman bonnibel Bonnie bonnily bonniness Bonny bonny bonnyclabber bonnyish bonnyvis Bononian bonsai bonspiel bontebok bontebuck bontequagga Bontok bonus bonxie bony bonyfish bonze bonzer bonzery bonzian boo boob boobery boobily boobook booby boobyalla boobyish boobyism bood boodie boodle boodledom boodleism boodleize boodler boody boof booger boogiewoogie boohoo boojum book bookable bookbinder bookbindery bookbinding bookboard bookcase bookcraft bookdealer bookdom booked booker bookery bookfold bookful bookholder bookhood bookie bookiness booking bookish bookishly bookishness bookism bookkeeper bookkeeping bookland bookless booklet booklike bookling booklore booklover bookmaker bookmaking Bookman bookman bookmark bookmarker bookmate bookmobile bookmonger bookplate bookpress bookrack bookrest bookroom bookseller booksellerish booksellerism bookselling bookshelf bookshop bookstack bookstall bookstand bookstore bookward bookwards bookways bookwise bookwork bookworm bookwright booky bool Boolian booly boolya boom boomable boomage boomah boomboat boomdas boomer boomerang booming boomingly boomless boomlet boomorah boomslang boomslange boomster boomy boon boondock boondocks boondoggle boondoggler Boone boonfellow boongary boonk boonless Boophilus boopis boor boorish boorishly boorishness boort boose boost booster boosterism boosy boot bootblack bootboy booted bootee booter bootery Bootes bootful booth boother Boothian boothite bootholder boothose Bootid bootied bootikin booting bootjack bootlace bootleg bootlegger bootlegging bootless bootlessly bootlessness bootlick bootlicker bootmaker bootmaking boots bootstrap booty bootyless booze boozed boozer boozily booziness boozy bop bopeep boppist bopyrid Bopyridae bopyridian Bopyrus bor bora borable borachio boracic boraciferous boracous borage Boraginaceae boraginaceous Borago Borak borak boral Boran Borana Borani borasca borasque Borassus borate borax Borboridae Borborus borborygmic borborygmus bord bordage bordar bordarius Bordeaux bordel bordello border bordered borderer Borderies bordering borderism borderland borderlander borderless borderline bordermark Borderside bordroom bordure bordured bore boreable boread Boreades boreal borealis borean Boreas borecole boredom boree boreen boregat borehole Boreiad boreism borele borer boresome Boreus borg borgh borghalpenny Borghese borh boric borickite boride borine boring boringly boringness Borinqueno Boris borish borism bority borize borlase born borne Bornean Borneo borneol borning bornite bornitic bornyl Boro boro Borocaine borocalcite borocarbide borocitrate borofluohydric borofluoric borofluoride borofluorin boroglycerate boroglyceride boroglycerine borolanite boron boronatrocalcite Boronia boronic borophenol borophenylic Bororo Bororoan borosalicylate borosalicylic borosilicate borosilicic borotungstate borotungstic borough boroughlet boroughmaster boroughmonger boroughmongering boroughmongery boroughship borowolframic borracha borrel Borrelia Borrelomycetaceae Borreria Borrichia Borromean Borrovian borrow borrowable borrower borrowing borsch borscht borsholder borsht borstall bort bortsch borty bortz Boruca Borussian borwort boryl Borzicactus borzoi Bos Bosc boscage bosch boschbok Boschneger boschvark boschveld bose Boselaphus boser bosh Boshas bosher Bosjesman bosjesman bosk bosker bosket boskiness bosky bosn Bosniac Bosniak Bosnian Bosnisch bosom bosomed bosomer bosomy Bosporan Bosporanic Bosporian bosporus boss bossage bossdom bossed bosselated bosselation bosser bosset bossiness bossing bossism bosslet bossship bossy bostangi bostanji bosthoon Boston boston Bostonese Bostonian bostonite bostrychid Bostrychidae bostrychoid bostrychoidal bostryx bosun Boswellia Boswellian Boswelliana Boswellism Boswellize bot bota botanic botanical botanically botanist botanize botanizer botanomancy botanophile botanophilist botany botargo Botaurinae Botaurus botch botched botchedly botcher botcherly botchery botchily botchiness botchka botchy bote Botein botella boterol botfly both bother botheration botherer botherheaded botherment bothersome bothlike Bothnian Bothnic bothrenchyma Bothriocephalus Bothriocidaris Bothriolepis bothrium Bothrodendron bothropic Bothrops bothros bothsided bothsidedness bothway bothy Botocudo botonee botong Botrychium Botrydium Botryllidae Botryllus botryogen botryoid botryoidal botryoidally botryolite Botryomyces botryomycoma botryomycosis botryomycotic Botryopteriaceae botryopterid Botryopteris botryose botryotherapy Botrytis bott bottekin Botticellian bottine bottle bottlebird bottled bottleflower bottleful bottlehead bottleholder bottlelike bottlemaker bottlemaking bottleman bottleneck bottlenest bottlenose bottler bottling bottom bottomchrome bottomed bottomer bottoming bottomless bottomlessly bottomlessness bottommost bottomry bottstick botuliform botulin botulinum botulism botulismus bouchal bouchaleen boucharde bouche boucher boucherism boucherize bouchette boud boudoir bouffancy bouffant Bougainvillaea Bougainvillea Bougainvillia Bougainvilliidae bougar bouge bouget bough boughed boughless boughpot bought boughten boughy bougie bouillabaisse bouillon bouk boukit boulangerite Boulangism Boulangist boulder boulderhead bouldering bouldery boule boulevard boulevardize boultel boulter boulterer boun bounce bounceable bounceably bouncer bouncing bouncingly bound boundable boundary bounded boundedly boundedness bounden bounder bounding boundingly boundless boundlessly boundlessness boundly boundness bounteous bounteously bounteousness bountied bountiful bountifully bountifulness bountith bountree bounty bountyless bouquet bourasque Bourbon bourbon Bourbonesque Bourbonian Bourbonism Bourbonist bourbonize bourd bourder bourdon bourette bourg bourgeois bourgeoise bourgeoisie bourgeoisitic Bourignian Bourignianism Bourignianist Bourignonism Bourignonist bourn bournless bournonite bourock Bourout bourse bourtree bouse bouser Boussingaultia boussingaultite boustrophedon boustrophedonic bousy bout boutade Bouteloua bouto boutonniere boutylka Bouvardia bouw bovarism bovarysm bovate bovenland bovicide boviculture bovid Bovidae boviform bovine bovinely bovinity Bovista bovoid bovovaccination bovovaccine bow bowable bowback bowbells bowbent bowboy Bowdichia bowdlerism bowdlerization bowdlerize bowed bowedness bowel boweled bowelless bowellike bowels bowenite bower bowerbird bowerlet bowermaiden bowermay bowerwoman Bowery bowery Boweryish bowet bowfin bowgrace bowhead bowie bowieful bowing bowingly bowk bowkail bowker bowknot bowl bowla bowleg bowlegged bowleggedness bowler bowless bowlful bowlike bowline bowling bowllike bowlmaker bowls bowly bowmaker bowmaking bowman bowpin bowralite bowshot bowsprit bowstave bowstring bowstringed bowwoman bowwood bowwort bowwow bowyer boxberry boxboard boxbush boxcar boxen Boxer boxer Boxerism boxfish boxful boxhaul boxhead boxing boxkeeper boxlike boxmaker boxmaking boxman boxthorn boxty boxwallah boxwood boxwork boxy boy boyang boyar boyard boyardism boyardom boyarism Boyce boycott boycottage boycotter boycottism Boyd boydom boyer boyhood boyish boyishly boyishness boyism boyla boylike boyology boysenberry boyship boza bozal bozo bozze bra brab brabagious brabant Brabanter Brabantine brabble brabblement brabbler brabblingly Brabejum braca braccate braccia bracciale braccianite braccio brace braced bracelet braceleted bracer bracero braces brach Brachelytra brachelytrous bracherer brachering brachet brachial brachialgia brachialis Brachiata brachiate brachiation brachiator brachiferous brachigerous Brachinus brachiocephalic brachiocrural brachiocubital brachiocyllosis brachiofacial brachiofaciolingual brachioganoid Brachioganoidei brachiolaria brachiolarian brachiopod Brachiopoda brachiopode brachiopodist brachiopodous brachioradial brachioradialis brachiorrhachidian brachiorrheuma brachiosaur Brachiosaurus brachiostrophosis brachiotomy brachistocephali brachistocephalic brachistocephalous brachistocephaly brachistochrone brachistochronic brachistochronous brachium brachtmema brachyaxis brachycardia brachycatalectic brachycephal brachycephalic brachycephalism brachycephalization brachycephalize brachycephalous brachycephaly Brachycera brachyceral brachyceric brachycerous brachychronic brachycnemic Brachycome brachycranial brachydactyl brachydactylic brachydactylism brachydactylous brachydactyly brachydiagonal brachydodrome brachydodromous brachydomal brachydomatic brachydome brachydont brachydontism brachyfacial brachyglossal brachygnathia brachygnathism brachygnathous brachygrapher brachygraphic brachygraphical brachygraphy brachyhieric brachylogy brachymetropia brachymetropic Brachyoura brachyphalangia Brachyphyllum brachypinacoid brachypinacoidal brachypleural brachypnea brachypodine brachypodous brachyprism brachyprosopic brachypterous brachypyramid brachyrrhinia brachysclereid brachyskelic brachysm brachystaphylic Brachystegia brachystochrone Brachystomata brachystomatous brachystomous brachytic brachytypous Brachyura brachyural brachyuran brachyuranic brachyure brachyurous Brachyurus bracing bracingly bracingness brack brackebuschite bracken brackened bracker bracket bracketing bracketwise brackish brackishness brackmard bracky Bracon braconid Braconidae bract bractea bracteal bracteate bracted bracteiform bracteolate bracteole bracteose bractless bractlet Brad brad bradawl Bradbury Bradburya bradenhead Bradford Bradley bradmaker Bradshaw bradsot bradyacousia bradycardia bradycauma bradycinesia bradycrotic bradydactylia bradyesthesia bradyglossia bradykinesia bradykinetic bradylalia bradylexia bradylogia bradynosus bradypepsia bradypeptic bradyphagia bradyphasia bradyphemia bradyphrasia bradyphrenia bradypnea bradypnoea bradypod bradypode Bradypodidae bradypodoid Bradypus bradyseism bradyseismal bradyseismic bradyseismical bradyseismism bradyspermatism bradysphygmia bradystalsis bradyteleocinesia bradyteleokinesis bradytocia bradytrophic bradyuria brae braeface braehead braeman braeside brag braggardism braggart braggartism braggartly braggartry braggat bragger braggery bragget bragging braggingly braggish braggishly Bragi bragite bragless braguette Brahm Brahma brahmachari Brahmahood Brahmaic Brahman Brahmana Brahmanaspati Brahmanda Brahmaness Brahmanhood Brahmani Brahmanic Brahmanical Brahmanism Brahmanist Brahmanistic Brahmanize Brahmany Brahmi Brahmic Brahmin Brahminic Brahminism Brahmoism Brahmsian Brahmsite Brahui braid braided braider braiding Braidism Braidist brail Braille Braillist brain brainache braincap braincraft brainer brainfag brainge braininess brainless brainlessly brainlessness brainlike brainpan brains brainsick brainsickly brainsickness brainstone brainward brainwash brainwasher brainwashing brainwater brainwood brainwork brainworker brainy braird braireau brairo braise brake brakeage brakehand brakehead brakeless brakeload brakemaker brakemaking brakeman braker brakeroot brakesman brakie braky Bram Bramantesque Bramantip bramble brambleberry bramblebush brambled brambling brambly brambrack Bramia bran brancard branch branchage branched Branchellion brancher branchery branchful branchi branchia branchiae branchial Branchiata branchiate branchicolous branchiferous branchiform branchihyal branchiness branching Branchiobdella branchiocardiac branchiogenous branchiomere branchiomeric branchiomerism branchiopallial branchiopod Branchiopoda branchiopodan branchiopodous Branchiopulmonata branchiopulmonate branchiosaur Branchiosauria branchiosaurian Branchiosaurus branchiostegal Branchiostegidae branchiostegite branchiostegous Branchiostoma branchiostomid Branchiostomidae Branchipodidae Branchipus branchireme Branchiura branchiurous branchless branchlet branchlike branchling branchman branchstand branchway branchy brand branded Brandenburg Brandenburger brander brandering Brandi brandied brandify brandise brandish brandisher brandisite brandless brandling Brandon brandreth Brandy brandy brandyball brandyman brandywine brangle brangled branglement brangler brangling branial brank brankie brankursine branle branner brannerite branny bransle bransolder brant Branta brantail brantness Brasenia brash brashiness brashness brashy brasiletto brasque brass brassage brassard brassart Brassavola brassbound brassbounder brasse brasser brasset Brassia brassic Brassica Brassicaceae brassicaceous brassidic brassie brassiere brassily brassiness brassish brasslike brassware brasswork brassworker brassworks brassy brassylic brat bratling bratstvo brattach brattice bratticer bratticing brattie brattish brattishing brattle brauna Brauneberger Brauneria braunite Brauronia Brauronian Brava bravade bravado bravadoism brave bravehearted bravely braveness braver bravery braving bravish bravo bravoite bravura bravuraish braw brawl brawler brawling brawlingly brawlsome brawly brawlys brawn brawned brawnedness brawner brawnily brawniness brawny braws braxy bray brayer brayera brayerin braystone braza braze brazen brazenface brazenfaced brazenfacedly brazenly brazenness brazer brazera brazier braziery brazil brazilein brazilette Brazilian brazilin brazilite brazilwood breach breacher breachful breachy bread breadbasket breadberry breadboard breadbox breadearner breadearning breaden breadfruit breadless breadlessness breadmaker breadmaking breadman breadnut breadroot breadseller breadstuff breadth breadthen breadthless breadthriders breadthways breadthwise breadwinner breadwinning breaghe break breakable breakableness breakably breakage breakaway breakax breakback breakbones breakdown breaker breakerman breakfast breakfaster breakfastless breaking breakless breakneck breakoff breakout breakover breakshugh breakstone breakthrough breakup breakwater breakwind bream breards breast breastband breastbeam breastbone breasted breaster breastfeeding breastful breastheight breasthook breastie breasting breastless breastmark breastpiece breastpin breastplate breastplow breastrail breastrope breastsummer breastweed breastwise breastwood breastwork breath breathable breathableness breathe breathed breather breathful breathiness breathing breathingly breathless breathlessly breathlessness breathseller breathy breba breccia breccial brecciated brecciation brecham Brechites breck brecken bred bredbergite brede bredi bree breech breechblock breechcloth breechclout breeched breeches breechesflower breechesless breeching breechless breechloader breed breedable breedbate breeder breediness breeding breedy breek breekless breekums breeze breezeful breezeless breezelike breezeway breezily breeziness breezy bregma bregmata bregmate bregmatic brehon brehonship brei breislakite breithauptite brekkle brelaw breloque breme bremely bremeness Bremia bremsstrahlung Brenda Brendan Brender brennage Brent brent Brenthis brephic Brescian Bret bret bretelle bretesse breth brethren Breton Bretonian Bretschneideraceae Brett brett brettice Bretwalda Bretwaldadom Bretwaldaship breunnerite breva breve brevet brevetcy breviary breviate breviature brevicaudate brevicipitid Brevicipitidae breviconic brevier brevifoliate breviger brevilingual breviloquence breviloquent breviped brevipen brevipennate breviradiate brevirostral brevirostrate Brevirostrines brevit brevity brew brewage brewer brewership brewery brewhouse brewing brewis brewmaster brewst brewster brewsterite brey Brian briar briarberry Briard Briarean Briareus briarroot bribe bribee bribegiver bribegiving bribemonger briber bribery bribetaker bribetaking bribeworthy Bribri brichen brichette brick brickbat brickcroft brickel bricken brickfield brickfielder brickhood bricking brickish brickkiln bricklayer bricklaying brickle brickleness bricklike brickliner bricklining brickly brickmaker brickmaking brickmason brickset bricksetter bricktimber brickwise brickwork bricky brickyard bricole bridal bridale bridaler bridally Bride bride bridebed bridebowl bridecake bridechamber bridecup bridegod bridegroom bridegroomship bridehead bridehood brideknot bridelace brideless bridelike bridely bridemaid bridemaiden bridemaidship brideship bridesmaid bridesmaiding bridesman bridestake bridewain brideweed bridewell bridewort bridge bridgeable bridgeboard bridgebote bridgebuilder bridgebuilding bridged bridgehead bridgekeeper bridgeless bridgelike bridgemaker bridgemaking bridgeman bridgemaster bridgepot Bridger bridger Bridget bridgetree bridgeward bridgewards bridgeway bridgework bridging bridle bridled bridleless bridleman bridler bridling bridoon brief briefing briefless brieflessly brieflessness briefly briefness briefs brier brierberry briered brierroot brierwood briery brieve brig brigade brigadier brigadiership brigalow brigand brigandage brigander brigandine brigandish brigandishly brigandism Brigantes Brigantia brigantine brigatry brigbote brigetty Briggs Briggsian Brighella Brighid bright brighten brightener brightening Brighteyes brighteyes brightish brightly brightness brightsmith brightsome brightsomeness brightwork Brigid Brigittine brill brilliance brilliancy brilliandeer brilliant brilliantine brilliantly brilliantness brilliantwise brilliolette brillolette brills brim brimborion brimborium brimful brimfully brimfulness briming brimless brimmed brimmer brimming brimmingly brimstone brimstonewort brimstony brin brindlish brine brinehouse brineless brineman briner bring bringal bringall bringer brininess brinish brinishness brinjal brinjarry brink brinkless briny brioche briolette brique briquette brisk brisken brisket briskish briskly briskness brisling brisque briss Brissotin Brissotine bristle bristlebird bristlecone bristled bristleless bristlelike bristler bristletail bristlewort bristliness bristly Bristol brisure brit Britain Britannia Britannian Britannic Britannically britchka brith brither Briticism British Britisher Britishhood Britishism Britishly Britishness Briton Britoness britska Brittany britten brittle brittlebush brittlely brittleness brittlestem brittlewood brittlewort brittling Briza brizz broach broacher broad broadacre broadax broadbill Broadbrim broadbrim broadcast broadcaster broadcloth broaden broadhead broadhearted broadhorn broadish broadleaf broadloom broadly broadmouth broadness broadpiece broadshare broadsheet broadside broadspread broadsword broadtail broadthroat Broadway broadway Broadwayite broadways broadwife broadwise brob Brobdingnag Brobdingnagian brocade brocaded brocard brocardic brocatel brocatello broccoli broch brochan brochant brochantite broche brochette brochidodromous brocho brochure brock brockage brocked brocket brockle brod brodder brodeglass brodequin broderer Brodiaea Brodie brog brogan brogger broggerite broggle brogue brogueful brogueneer broguer broguery broguish broider broiderer broideress broidery broigne broil broiler broiling broilingly brokage broke broken brokenhearted brokenheartedly brokenheartedness brokenly brokenness broker brokerage brokeress brokership broking brolga broll brolly broma bromacetanilide bromacetate bromacetic bromacetone bromal bromalbumin bromamide bromargyrite bromate bromaurate bromauric brombenzamide brombenzene brombenzyl bromcamphor bromcresol brome bromeigon Bromeikon bromeikon Bromelia Bromeliaceae bromeliaceous bromeliad bromelin bromellite bromethyl bromethylene bromgelatin bromhidrosis bromhydrate bromhydric Bromian bromic bromide bromidic bromidically bromidrosis brominate bromination bromindigo bromine brominism brominize bromiodide Bromios bromism bromite Bromius bromization bromize bromizer bromlite bromoacetone bromoaurate bromoauric bromobenzene bromobenzyl bromocamphor bromochlorophenol bromocresol bromocyanidation bromocyanide bromocyanogen bromoethylene bromoform bromogelatin bromohydrate bromohydrin bromoil bromoiodide bromoiodism bromoiodized bromoketone bromol bromomania bromomenorrhea bromomethane bromometric bromometrical bromometrically bromometry bromonaphthalene bromophenol bromopicrin bromopnea bromoprotein bromothymol bromous bromphenol brompicrin bromthymol bromuret Bromus bromvogel bromyrite bronc bronchadenitis bronchi bronchia bronchial bronchially bronchiarctia bronchiectasis bronchiectatic bronchiloquy bronchiocele bronchiocrisis bronchiogenic bronchiolar bronchiole bronchioli bronchiolitis bronchiolus bronchiospasm bronchiostenosis bronchitic bronchitis bronchium bronchoadenitis bronchoalveolar bronchoaspergillosis bronchoblennorrhea bronchocavernous bronchocele bronchocephalitis bronchoconstriction bronchoconstrictor bronchodilatation bronchodilator bronchoegophony bronchoesophagoscopy bronchogenic bronchohemorrhagia broncholemmitis broncholith broncholithiasis bronchomotor bronchomucormycosis bronchomycosis bronchopathy bronchophonic bronchophony bronchophthisis bronchoplasty bronchoplegia bronchopleurisy bronchopneumonia bronchopneumonic bronchopulmonary bronchorrhagia bronchorrhaphy bronchorrhea bronchoscope bronchoscopic bronchoscopist bronchoscopy bronchospasm bronchostenosis bronchostomy bronchotetany bronchotome bronchotomist bronchotomy bronchotracheal bronchotyphoid bronchotyphus bronchovesicular bronchus bronco broncobuster brongniardite bronk Bronteana bronteon brontephobia Brontesque bronteum brontide brontogram brontograph brontolite brontology brontometer brontophobia Brontops Brontosaurus brontoscopy Brontotherium Brontozoum Bronx bronze bronzed bronzelike bronzen bronzer bronzesmith bronzewing bronzify bronzine bronzing bronzite bronzitite bronzy broo brooch brood brooder broodiness brooding broodingly broodless broodlet broodling broody brook brookable Brooke brooked brookflower brookie brookite brookless brooklet brooklike brooklime Brooklynite brookside brookweed brooky brool broom broombush broomcorn broomer broommaker broommaking broomrape broomroot broomshank broomstaff broomstick broomstraw broomtail broomweed broomwood broomwort broomy broon broose broozled brose Brosimum brosot brosy brot brotan brotany broth brothel brotheler brothellike brothelry brother brotherhood brotherless brotherlike brotherliness brotherly brothership Brotherton brotherwort brothy brotocrystal Brotula brotulid Brotulidae brotuliform brough brougham brought Broussonetia brow browache Browallia browallia browband browbeat browbeater browbound browden browed browis browless browman brown brownback browner Brownian brownie browniness browning Browningesque brownish Brownism Brownist Brownistic Brownistical brownly brownness brownout brownstone browntail browntop brownweed brownwort browny browpiece browpost browse browser browsick browsing browst bruang Bruce Brucella brucellosis Bruchidae Bruchus brucia brucina brucine brucite bruckle bruckled bruckleness Bructeri brugh brugnatellite bruin bruise bruiser bruisewort bruising bruit bruiter bruke Brule brulee brulyie brulyiement brumal Brumalia brumby brume Brummagem brummagem brumous brumstane brumstone brunch Brunella Brunellia Brunelliaceae brunelliaceous brunet brunetness brunette brunetteness Brunfelsia brunissure Brunistic brunneous Brunnichia Bruno Brunonia Brunoniaceae Brunonian Brunonism Brunswick brunswick brunt bruscus brush brushable brushball brushbird brushbush brushed brusher brushes brushet brushful brushiness brushing brushite brushland brushless brushlessness brushlet brushlike brushmaker brushmaking brushman brushoff brushproof brushwood brushwork brushy brusque brusquely brusqueness Brussels brustle brut Bruta brutage brutal brutalism brutalist brutalitarian brutality brutalization brutalize brutally brute brutedom brutelike brutely bruteness brutification brutify bruting brutish brutishly brutishness brutism brutter Brutus bruzz Bryaceae bryaceous Bryales Bryan Bryanism Bryanite Bryanthus Bryce bryogenin bryological bryologist bryology Bryonia bryonidin bryonin bryony Bryophyllum Bryophyta bryophyte bryophytic Bryozoa bryozoan bryozoon bryozoum Brython Brythonic Bryum Bu bu bual buaze bub buba bubal bubaline Bubalis bubalis Bubastid Bubastite bubble bubbleless bubblement bubbler bubbling bubblingly bubblish bubbly bubby bubbybush Bube bubinga Bubo bubo buboed bubonalgia bubonic Bubonidae bubonocele bubukle bucare bucca buccal buccally buccan buccaneer buccaneerish buccate Buccellarius buccina buccinal buccinator buccinatory Buccinidae bucciniform buccinoid Buccinum Bucco buccobranchial buccocervical buccogingival buccolabial buccolingual bucconasal Bucconidae Bucconinae buccopharyngeal buccula Bucculatrix bucentaur Bucephala Bucephalus Buceros Bucerotes Bucerotidae Bucerotinae Buchanan Buchanite buchite Buchloe Buchmanism Buchmanite Buchnera buchnerite buchonite buchu buck buckaroo buckberry buckboard buckbrush buckbush bucked buckeen bucker bucket bucketer bucketful bucketing bucketmaker bucketmaking bucketman buckety buckeye buckhorn buckhound buckie bucking buckish buckishly buckishness buckjump buckjumper bucklandite buckle buckled buckleless buckler Buckleya buckling bucklum bucko buckplate buckpot buckra buckram bucksaw buckshee buckshot buckskin buckskinned buckstall buckstay buckstone bucktail buckthorn bucktooth buckwagon buckwash buckwasher buckwashing buckwheat buckwheater buckwheatlike Bucky bucky bucoliast bucolic bucolical bucolically bucolicism Bucorvinae Bucorvus bucrane bucranium Bud bud buda buddage budder Buddh Buddha Buddhahood Buddhaship buddhi Buddhic Buddhism Buddhist Buddhistic Buddhistical Buddhology budding buddle Buddleia buddleman buddler buddy budge budger budgeree budgereegah budgerigar budgerow budget budgetary budgeteer budgeter budgetful Budh budless budlet budlike budmash Budorcas budtime Budukha Buduma budwood budworm budzat Buettneria Buettneriaceae bufagin buff buffable buffalo buffaloback buffball buffcoat buffed buffer buffet buffeter buffing buffle bufflehead bufflehorn buffont buffoon buffoonery buffoonesque buffoonish buffoonism buffware buffy bufidin bufo Bufonidae bufonite bufotalin bug bugaboo bugan bugbane bugbear bugbeardom bugbearish bugbite bugdom bugfish bugger buggery bugginess buggy buggyman bughead bughouse Bugi Buginese Buginvillaea bugle bugled bugler buglet bugleweed buglewort bugloss bugologist bugology bugproof bugre bugseed bugweed bugwort buhl buhr buhrstone build buildable builder building buildingless buildress buildup built buirdly buisson buist Bukat Bukeyef bukh Bukidnon bukshi bulak Bulanda bulb bulbaceous bulbar bulbed bulbiferous bulbiform bulbil Bulbilis bulbilla bulbless bulblet bulblike bulbocapnin bulbocapnine bulbocavernosus bulbocavernous Bulbochaete Bulbocodium bulbomedullary bulbomembranous bulbonuclear Bulbophyllum bulborectal bulbose bulbospinal bulbotuber bulbous bulbul bulbule bulby bulchin Bulgar Bulgari Bulgarian Bulgaric Bulgarophil bulge bulger bulginess bulgy bulimia bulimiac bulimic bulimiform bulimoid Bulimulidae Bulimus bulimy bulk bulked bulker bulkhead bulkheaded bulkily bulkiness bulkish bulky bull bulla bullace bullamacow bullan bullary bullate bullated bullation bullback bullbaiting bullbat bullbeggar bullberry bullbird bullboat bullcart bullcomber bulldog bulldogged bulldoggedness bulldoggy bulldogism bulldoze bulldozer buller bullet bulleted bullethead bulletheaded bulletheadedness bulletin bulletless bulletlike bulletmaker bulletmaking bulletproof bulletwood bullety bullfeast bullfight bullfighter bullfighting bullfinch bullfist bullflower bullfoot bullfrog bullhead bullheaded bullheadedly bullheadedness bullhide bullhoof bullhorn Bullidae bulliform bullimong bulling bullion bullionism bullionist bullionless bullish bullishly bullishness bullism bullit bullneck bullnose bullnut bullock bullocker Bullockite bullockman bullocky Bullom bullous bullpates bullpoll bullpout bullskin bullsticker bullsucker bullswool bulltoad bullule bullweed bullwhack bullwhacker bullwhip bullwort bully bullyable bullydom bullyhuff bullying bullyism bullyrag bullyragger bullyragging bullyrook bulrush bulrushlike bulrushy bulse bult bulter bultey bultong bultow bulwand bulwark bum bumbailiff bumbailiffship bumbarge bumbaste bumbaze bumbee bumbershoot bumble bumblebee bumbleberry Bumbledom bumblefoot bumblekite bumblepuppy bumbler bumbo bumboat bumboatman bumboatwoman bumclock Bumelia bumicky bummalo bummaree bummed bummer bummerish bummie bumming bummler bummock bump bumpee bumper bumperette bumpily bumpiness bumping bumpingly bumpkin bumpkinet bumpkinish bumpkinly bumpology bumptious bumptiously bumptiousness bumpy bumtrap bumwood bun Buna buna buncal bunce bunch bunchberry buncher bunchflower bunchily bunchiness bunchy buncombe bund Bunda Bundahish Bundeli bunder Bundestag bundle bundler bundlerooted bundlet bundobust bundook Bundu bundweed bundy bunemost bung Bunga bungaloid bungalow bungarum Bungarus bungee bungerly bungey bungfu bungfull bunghole bungle bungler bunglesome bungling bunglingly bungmaker bungo bungwall bungy Buninahua bunion bunk bunker bunkerman bunkery bunkhouse bunkie bunkload bunko bunkum bunnell bunny bunnymouth bunodont Bunodonta bunolophodont Bunomastodontidae bunoselenodont bunsenite bunt buntal bunted Bunter bunter bunting buntline bunton bunty bunya bunyah bunyip Bunyoro buoy buoyage buoyance buoyancy buoyant buoyantly buoyantness Buphaga buphthalmia buphthalmic Buphthalmum bupleurol Bupleurum buplever buprestid Buprestidae buprestidan Buprestis bur buran burao Burbank burbank burbankian Burbankism burbark Burberry burble burbler burbly burbot burbush burd burdalone burden burdener burdenless burdenous burdensome burdensomely burdensomeness burdie Burdigalian burdock burdon bure bureau bureaucracy bureaucrat bureaucratic bureaucratical bureaucratically bureaucratism bureaucratist bureaucratization bureaucratize bureaux burel burele buret burette burfish burg burgage burgality burgall burgee burgensic burgeon burgess burgessdom burggrave burgh burghal burghalpenny burghbote burghemot burgher burgherage burgherdom burgheress burgherhood burghermaster burghership burghmaster burghmoot burglar burglarious burglariously burglarize burglarproof burglary burgle burgomaster burgomastership burgonet burgoo burgoyne burgrave burgraviate burgul Burgundian Burgundy burgus burgware burhead Burhinidae Burhinus Buri buri burial burian Buriat buried burier burin burinist burion buriti burka burke burker burkundaz burl burlap burled burler burlesque burlesquely burlesquer burlet burletta Burley burlily burliness Burlington burly Burman Burmannia Burmanniaceae burmanniaceous Burmese burmite burn burnable burnbeat burned burner burnet burnetize burnfire burnie burniebee burning burningly burnish burnishable burnisher burnishing burnishment burnoose burnoosed burnous burnout burnover Burnsian burnside burnsides burnt burntweed burnut burnwood burny buro burp burr burrah burrawang burred burrel burrer burrgrailer burring burrish burrito burrknot burro burrobrush burrow burroweed burrower burrowstown burry bursa bursal bursar bursarial bursarship bursary bursate bursattee bursautee burse burseed Bursera Burseraceae Burseraceous bursicle bursiculate bursiform bursitis burst burster burstwort burt burthenman burton burtonization burtonize burucha Burushaski Burut burweed bury burying bus Busaos busby buscarl buscarle bush bushbeater bushbuck bushcraft bushed bushel busheler bushelful bushelman bushelwoman busher bushfighter bushfighting bushful bushhammer bushi bushily bushiness bushing bushland bushless bushlet bushlike bushmaker bushmaking Bushman bushmanship bushmaster bushment Bushongo bushranger bushranging bushrope bushveld bushwa bushwhack bushwhacker bushwhacking bushwife bushwoman bushwood bushy busied busily busine business businesslike businesslikeness businessman businesswoman busk busked busker busket buskin buskined buskle busky busman buss busser bussock bussu bust bustard busted bustee buster busthead bustic busticate bustle bustled bustler bustling bustlingly busy busybodied busybody busybodyish busybodyism busybodyness Busycon busyhead busying busyish busyness busywork but butadiene butadiyne butanal butane butanoic butanol butanolid butanolide butanone butch butcher butcherbird butcherdom butcherer butcheress butchering butcherless butcherliness butcherly butcherous butchery Bute Butea butein butene butenyl Buteo buteonine butic butine Butler butler butlerage butlerdom butleress butlerism butlerlike butlership butlery butment Butomaceae butomaceous Butomus butoxy butoxyl Butsu butt butte butter butteraceous butterback butterball butterbill butterbird butterbox butterbump butterbur butterbush buttercup buttered butterfat butterfingered butterfingers butterfish butterflower butterfly butterflylike butterhead butterine butteriness butteris butterjags butterless butterlike buttermaker buttermaking butterman buttermilk buttermonger buttermouth butternose butternut butterroot butterscotch butterweed butterwife butterwoman butterworker butterwort butterwright buttery butteryfingered buttgenbachite butting buttinsky buttle buttock buttocked buttocker button buttonball buttonbur buttonbush buttoned buttoner buttonhold buttonholder buttonhole buttonholer buttonhook buttonless buttonlike buttonmold buttons buttonweed buttonwood buttony buttress buttressless buttresslike buttstock buttwoman buttwood butty buttyman butyl butylamine butylation butylene butylic Butyn butyne butyr butyraceous butyral butyraldehyde butyrate butyric butyrically butyrin butyrinase butyrochloral butyrolactone butyrometer butyrometric butyrone butyrous butyrousness butyryl Buxaceae buxaceous Buxbaumia Buxbaumiaceae buxerry buxom buxomly buxomness Buxus buy buyable buyer Buyides buzane buzylene buzz buzzard buzzardlike buzzardly buzzer buzzerphone buzzgloak buzzies buzzing buzzingly buzzle buzzwig buzzy by Byblidaceae Byblis bycoket bye byee byegaein byeman byepath byerite byerlite byestreet byeworker byeworkman bygane byganging bygo bygoing bygone byhand bylaw bylawman byname bynedestin Bynin byon byordinar byordinary byous byously bypass bypasser bypast bypath byplay byre byreman byrewards byrewoman byrlaw byrlawman byrnie byroad Byron Byronesque Byronian Byroniana Byronic Byronically Byronics Byronish Byronism Byronist Byronite Byronize byrrus Byrsonima byrthynsak Bysacki bysen bysmalith byspell byssaceous byssal byssiferous byssin byssine byssinosis byssogenous byssoid byssolite byssus bystander bystreet byth bytime bytownite bytownitite bywalk bywalker byway bywoner byword bywork Byzantian Byzantine Byzantinesque Byzantinism Byzantinize C c ca caam caama caaming caapeba caatinga cab caba cabaan caback cabaho cabal cabala cabalassou cabaletta cabalic cabalism cabalist cabalistic cabalistical cabalistically caballer caballine caban cabana cabaret cabas cabasset cabassou cabbage cabbagehead cabbagewood cabbagy cabber cabble cabbler cabby cabda cabdriver cabdriving cabellerote caber cabernet cabestro cabezon cabilliau cabin Cabinda cabinet cabinetmaker cabinetmaking cabinetry cabinetwork cabinetworker cabinetworking cabio Cabirean Cabiri Cabiria Cabirian Cabiric Cabiritic cable cabled cablegram cableless cablelike cableman cabler cablet cableway cabling cabman cabob caboceer cabochon cabocle Cabomba Cabombaceae caboodle cabook caboose caboshed cabot cabotage cabree cabrerite cabreuva cabrilla cabriole cabriolet cabrit cabstand cabureiba cabuya Caca Cacajao Cacalia cacam Cacan Cacana cacanthrax cacao Cacara Cacatua Cacatuidae Cacatuinae Caccabis cacesthesia cacesthesis cachalot cachaza cache cachectic cachemia cachemic cachet cachexia cachexic cachexy cachibou cachinnate cachinnation cachinnator cachinnatory cacholong cachou cachrys cachucha cachunde Cacicus cacidrosis caciocavallo cacique caciqueship caciquism cack cackerel cackle cackler cacocholia cacochroia cacochylia cacochymia cacochymic cacochymical cacochymy cacocnemia cacodaemoniac cacodaemonial cacodaemonic cacodemon cacodemonia cacodemoniac cacodemonial cacodemonic cacodemonize cacodemonomania cacodontia cacodorous cacodoxian cacodoxical cacodoxy cacodyl cacodylate cacodylic cacoeconomy cacoepist cacoepistic cacoepy cacoethes cacoethic cacogalactia cacogastric cacogenesis cacogenic cacogenics cacogeusia cacoglossia cacographer cacographic cacographical cacography cacology cacomagician cacomelia cacomistle cacomixl cacomixle cacomorphia cacomorphosis caconychia caconym caconymic cacoon cacopathy cacopharyngia cacophonia cacophonic cacophonical cacophonically cacophonist cacophonize cacophonous cacophonously cacophony cacophthalmia cacoplasia cacoplastic cacoproctia cacorhythmic cacorrhachis cacorrhinia cacosmia cacospermia cacosplanchnia cacostomia cacothansia cacotheline cacothesis cacothymia cacotrichia cacotrophia cacotrophic cacotrophy cacotype cacoxene cacoxenite cacozeal cacozealous cacozyme Cactaceae cactaceous Cactales cacti cactiform cactoid Cactus cacuminal cacuminate cacumination cacuminous cacur cad cadalene cadamba cadastral cadastration cadastre cadaver cadaveric cadaverine cadaverize cadaverous cadaverously cadaverousness cadbait cadbit cadbote caddice caddiced Caddie caddie caddis caddised caddish caddishly caddishness caddle Caddo Caddoan caddow caddy cade cadelle cadence cadenced cadency cadent cadential cadenza cader caderas Cadet cadet cadetcy cadetship cadette cadew cadge cadger cadgily cadginess cadgy cadi cadilesker cadinene cadism cadiueio cadjan cadlock Cadmean cadmia cadmic cadmide cadmiferous cadmium cadmiumize Cadmopone Cadmus cados cadrans cadre cadua caduac caduca caducary caducean caduceus caduciary caducibranch Caducibranchiata caducibranchiate caducicorn caducity caducous cadus Cadwal Cadwallader cadweed caeca caecal caecally caecectomy caeciform Caecilia Caeciliae caecilian Caeciliidae caecitis caecocolic caecostomy caecotomy caecum Caedmonian Caedmonic Caelian caelometer Caelum Caelus Caenogaea Caenogaean Caenolestes caenostylic caenostyly caeoma caeremoniarius Caerphilly Caesalpinia Caesalpiniaceae caesalpiniaceous Caesar Caesardom Caesarean Caesareanize Caesarian Caesarism Caesarist Caesarize caesaropapacy caesaropapism caesaropopism Caesarotomy Caesarship caesious caesura caesural caesuric cafeneh cafenet cafeteria caffa caffeate caffeic caffeina caffeine caffeinic caffeinism caffeism caffeol caffeone caffetannic caffetannin caffiso caffle caffoline caffoy cafh cafiz caftan caftaned cag Cagayan cage caged cageful cageless cagelike cageling cageman cager cagester cagework cagey caggy cagily cagit cagmag Cagn Cahenslyism Cahill cahincic Cahita cahiz Cahnite Cahokia cahoot cahot cahow Cahuapana Cahuilla caickle caid cailcedra cailleach caimacam caimakam caiman caimitillo caimito Cain cain Caingang Caingua Cainian Cainish Cainism Cainite Cainitic caique caiquejee Cairba caird Cairene cairn cairned cairngorm cairngorum cairny Cairo caisson caissoned Caitanyas Caite caitiff Cajan Cajanus cajeput cajole cajolement cajoler cajolery cajoling cajolingly cajuela Cajun cajun cajuput cajuputene cajuputol Cakavci Cakchikel cake cakebox cakebread cakehouse cakemaker cakemaking caker cakette cakewalk cakewalker cakey Cakile caky cal calaba Calabar Calabari calabash calabaza calabazilla calaber calaboose calabrasella Calabrese calabrese Calabrian calade Caladium calais calalu Calamagrostis calamanco calamansi Calamariaceae calamariaceous Calamariales calamarian calamarioid calamaroid calamary calambac calambour calamiferous calamiform calaminary calamine calamint Calamintha calamistral calamistrum calamite calamitean Calamites calamitoid calamitous calamitously calamitousness calamity Calamodendron calamondin Calamopitys Calamospermae Calamostachys calamus calander Calandra calandria Calandridae Calandrinae Calandrinia calangay calantas Calanthe calapite Calappa Calappidae Calas calascione calash Calathea calathian calathidium calathiform calathiscus calathus Calatrava calaverite calbroben calcaneal calcaneoastragalar calcaneoastragaloid calcaneocuboid calcaneofibular calcaneonavicular calcaneoplantar calcaneoscaphoid calcaneotibial calcaneum calcaneus calcar calcarate Calcarea calcareoargillaceous calcareobituminous calcareocorneous calcareosiliceous calcareosulphurous calcareous calcareously calcareousness calcariferous calcariform calcarine calced calceiform calcemia Calceolaria calceolate Calchaqui Calchaquian calcic calciclase calcicole calcicolous calcicosis calciferol Calciferous calciferous calcific calcification calcified calciform calcifugal calcifuge calcifugous calcify calcigenous calcigerous calcimeter calcimine calciminer calcinable calcination calcinatory calcine calcined calciner calcinize calciobiotite calciocarnotite calcioferrite calcioscheelite calciovolborthite calcipexy calciphile calciphilia calciphilous calciphobe calciphobous calciphyre calciprivic calcisponge Calcispongiae calcite calcitestaceous calcitic calcitrant calcitrate calcitreation calcium calcivorous calcographer calcographic calcography calcrete calculability calculable Calculagraph calculary calculate calculated calculatedly calculating calculatingly calculation calculational calculative calculator calculatory calculi calculiform calculist calculous calculus Calcydon calden caldron calean Caleb Caledonia Caledonian caledonite calefacient calefaction calefactive calefactor calefactory calelectric calelectrical calelectricity Calemes calendal calendar calendarer calendarial calendarian calendaric calender calenderer calendric calendrical calendry calends Calendula calendulin calentural calenture calenturist calepin calescence calescent calf calfbound calfhood calfish calfkill calfless calflike calfling calfskin Caliban Calibanism caliber calibered calibogus calibrate calibration calibrator calibre Caliburn Caliburno calicate calices caliciform calicle calico calicoback calicoed calicular caliculate Calicut calid calidity caliduct California Californian californite californium caliga caligated caliginous caliginously caligo Calimeris Calinago calinda calinut caliological caliologist caliology calipash calipee caliper caliperer calipers caliph caliphal caliphate caliphship Calista calistheneum calisthenic calisthenical calisthenics Calite caliver calix Calixtin Calixtus calk calkage calker calkin calking call Calla callable callainite callant callboy caller callet calli Callianassa Callianassidae Calliandra Callicarpa Callicebus callid callidity callidness calligraph calligrapha calligrapher calligraphic calligraphical calligraphically calligraphist calligraphy calling Callionymidae Callionymus Calliope calliophone Calliopsis calliper calliperer Calliphora calliphorid Calliphoridae calliphorine callipygian callipygous Callirrhoe Callisaurus callisection callisteia Callistemon Callistephus Callithrix callithump callithumpian Callitrichaceae callitrichaceous Callitriche Callitrichidae Callitris callitype callo Callorhynchidae Callorhynchus callosal callose callosity callosomarginal callosum callous callously callousness Callovian callow callower callowman callowness Calluna callus Callynteria calm calmant calmative calmer calmierer calmingly calmly calmness calmy Calocarpum Calochortaceae Calochortus calodemon calography calomba calomel calomorphic Calonectria Calonyction calool Calophyllum Calopogon calor calorescence calorescent caloric caloricity calorie calorifacient calorific calorifical calorifically calorification calorifics calorifier calorify calorigenic calorimeter calorimetric calorimetrical calorimetrically calorimetry calorimotor caloris calorisator calorist Calorite calorize calorizer Calosoma Calotermes calotermitid Calotermitidae Calothrix calotte calotype calotypic calotypist caloyer calp calpac calpack calpacked calpulli Caltha caltrap caltrop calumba calumet calumniate calumniation calumniative calumniator calumniatory calumnious calumniously calumniousness calumny Calusa calutron Calvados calvaria calvarium Calvary Calvatia calve calved calver calves Calvin Calvinian Calvinism Calvinist Calvinistic Calvinistical Calvinistically Calvinize calvish calvities calvity calvous calx calycanth Calycanthaceae calycanthaceous calycanthemous calycanthemy calycanthine Calycanthus calycate Calyceraceae calyceraceous calyces calyciferous calycifloral calyciflorate calyciflorous calyciform calycinal calycine calycle calycled Calycocarpum calycoid calycoideous Calycophora Calycophorae calycophoran Calycozoa calycozoan calycozoic calycozoon calycular calyculate calyculated calycule calyculus Calydon Calydonian Calymene calymma calyphyomy calypsist Calypso calypso calypsonian calypter Calypterae Calyptoblastea calyptoblastic Calyptorhynchus calyptra Calyptraea Calyptranthes Calyptrata Calyptratae calyptrate calyptriform calyptrimorphous calyptro calyptrogen Calyptrogyne Calystegia calyx cam camaca Camacan camagon camail camailed Camaldolensian Camaldolese Camaldolesian Camaldolite Camaldule Camaldulian camalote caman camansi camara camaraderie Camarasaurus camarilla camass Camassia camata camatina Camaxtli camb Camball Cambalo Cambarus cambaye camber Cambeva cambial cambiform cambiogenetic cambism cambist cambistry cambium Cambodian cambogia cambrel cambresine Cambrian Cambric cambricleaf cambuca Cambuscan Cambyuskan Came came cameist camel camelback cameleer Camelid Camelidae Camelina cameline camelish camelishness camelkeeper Camellia Camelliaceae camellike camellin Camellus camelman cameloid Cameloidea camelopard Camelopardalis Camelopardid Camelopardidae Camelopardus camelry Camelus Camembert Camenae Camenes cameo cameograph cameography camera cameral cameralism cameralist cameralistic cameralistics cameraman Camerata camerate camerated cameration camerier Camerina Camerinidae camerist camerlingo Cameronian Camestres camilla camillus camion camisado Camisard camise camisia camisole camlet camleteen Cammarum cammed cammock cammocky camomile camoodi camoodie Camorra Camorrism Camorrist Camorrista camouflage camouflager camp Campa campagna campagnol campaign campaigner campana campane campanero Campanian campaniform campanile campaniliform campanilla campanini campanist campanistic campanologer campanological campanologically campanologist campanology Campanula Campanulaceae campanulaceous Campanulales campanular Campanularia Campanulariae campanularian Campanularidae Campanulatae campanulate campanulated campanulous Campaspe Campbellism Campbellite campbellite campcraft Campe Campephagidae campephagine Campephilus camper campestral campfight campfire campground camphane camphanic camphanone camphanyl camphene camphine camphire campho camphocarboxylic camphoid camphol campholic campholide campholytic camphor camphoraceous camphorate camphoric camphorize camphorone camphoronic camphoroyl camphorphorone camphorwood camphory camphoryl camphylene Campignian campimeter campimetrical campimetry Campine campion cample campmaster campo Campodea campodeid Campodeidae campodeiform campodeoid campody Camponotus campoo camporee campshed campshedding campsheeting campshot campstool camptodrome camptonite Camptosorus campulitropal campulitropous campus campward campylite campylodrome campylometer Campyloneuron campylospermous campylotropal campylotropous camshach camshachle camshaft camstane camstone camuning camus camused camwood can Cana Canaan Canaanite Canaanitess Canaanitic Canaanitish canaba Canacee Canada canada Canadian Canadianism Canadianization Canadianize canadine canadite canadol canaigre canaille canajong canal canalage canalboat canalicular canaliculate canaliculated canaliculation canaliculi canaliculization canaliculus canaliferous canaliform canalization canalize canaller canalling canalman canalside Canamary canamo Cananaean Cananga Canangium canape canapina canard Canari canari Canarian canarin Canariote Canarium Canarsee canary canasta canaster canaut Canavali Canavalia canavalin Canberra cancan cancel cancelable cancelation canceleer canceler cancellarian cancellate cancellated cancellation cancelli cancellous cancellus cancelment cancer cancerate canceration cancerdrops cancered cancerigenic cancerism cancerophobe cancerophobia cancerous cancerously cancerousness cancerroot cancerweed cancerwort canch canchalagua Canchi Cancri Cancrid cancriform cancrinite cancrisocial cancrivorous cancrizans cancroid cancrophagous cancrum cand Candace candareen candela candelabra candelabrum candelilla candent candescence candescent candescently candid candidacy candidate candidateship candidature candidly candidness candied candier candify Candiot candiru candle candleball candlebeam candleberry candlebomb candlebox candlefish candleholder candlelight candlelighted candlelighter candlelighting candlelit candlemaker candlemaking Candlemas candlenut candlepin candler candlerent candleshine candleshrift candlestand candlestick candlesticked candlestickward candlewaster candlewasting candlewick candlewood candlewright candock Candollea Candolleaceae candolleaceous candor candroy candy candymaker candymaking candys candystick candytuft candyweed cane canebrake canel canelike canella Canellaceae canellaceous Canelo canelo caneology canephor canephore canephoros canephroi caner canescence canescent canette canewise canework Canfield canfieldite canful cangan cangia cangle cangler cangue canhoop Canichana Canichanan canicola Canicula canicular canicule canid Canidae Canidia canille caninal canine caniniform caninity caninus canioned canions Canis Canisiana canistel canister canities canjac cank canker cankerberry cankerbird cankereat cankered cankeredly cankeredness cankerflower cankerous cankerroot cankerweed cankerworm cankerwort cankery canmaker canmaking canman Canna canna cannabic Cannabinaceae cannabinaceous cannabine cannabinol Cannabis cannabism Cannaceae cannaceous cannach canned cannel cannelated cannelure cannelured cannequin canner cannery cannet cannibal cannibalean cannibalic cannibalish cannibalism cannibalistic cannibalistically cannibality cannibalization cannibalize cannibally cannikin cannily canniness canning cannon cannonade cannoned cannoneer cannoneering Cannonism cannonproof cannonry cannot Cannstatt cannula cannular cannulate cannulated canny canoe canoeing Canoeiro canoeist canoeload canoeman canoewood canon canoncito canoness canonic canonical canonically canonicalness canonicals canonicate canonicity canonics canonist canonistic canonistical canonizant canonization canonize canonizer canonlike canonry canonship canoodle canoodler Canopic canopic Canopus canopy canorous canorously canorousness Canossa canroy canroyer canso cant Cantab cantabank cantabile Cantabri Cantabrian Cantabrigian Cantabrize cantala cantalite cantaloupe cantankerous cantankerously cantankerousness cantar cantara cantaro cantata Cantate cantation cantative cantatory cantboard canted canteen cantefable canter Canterburian Canterburianism Canterbury canterer canthal Cantharellus Cantharidae cantharidal cantharidate cantharides cantharidian cantharidin cantharidism cantharidize cantharis cantharophilous cantharus canthectomy canthitis cantholysis canthoplasty canthorrhaphy canthotomy canthus cantic canticle cantico cantilena cantilene cantilever cantilevered cantillate cantillation cantily cantina cantiness canting cantingly cantingness cantion cantish cantle cantlet canto Canton canton cantonal cantonalism cantoned cantoner Cantonese cantonment cantoon cantor cantoral Cantorian cantoris cantorous cantorship cantred cantref cantrip cantus cantwise canty Canuck canun canvas canvasback canvasman canvass canvassy cany canyon canzon canzonet caoba Caodaism Caodaist caoutchouc caoutchoucin cap capability capable capableness capably capacious capaciously capaciousness capacitance capacitate capacitation capacitative capacitativly capacitive capacitor capacity capanna capanne caparison capax capcase Cape cape caped capel capelet capelin capeline Capella capellet caper caperbush capercaillie capercally capercut caperer capering caperingly Capernaism Capernaite Capernaitic Capernaitical Capernaitically Capernaitish capernoited capernoitie capernoity capersome caperwort capes capeskin Capetian Capetonian capeweed capewise capful Caph caph caphar caphite Caphtor Caphtorim capias capicha capillaceous capillaire capillament capillarectasia capillarily capillarimeter capillariness capillariomotor capillarity capillary capillation capilliculture capilliform capillitial capillitium capillose capistrate capital capitaldom capitaled capitalism capitalist capitalistic capitalistically capitalizable capitalization capitalize capitally capitalness capitan capitate capitated capitatim capitation capitative capitatum capitellar capitellate capitelliform capitellum Capito Capitol Capitolian Capitoline Capitolium Capitonidae Capitoninae capitoul capitoulate capitulant capitular capitularly capitulary capitulate capitulation capitulator capitulatory capituliform capitulum capivi capkin capless caplin capmaker capmaking capman capmint Capnodium Capnoides capnomancy capocchia capomo capon caponier caponize caponizer caporal capot capote cappadine Cappadocian Capparidaceae capparidaceous Capparis capped cappelenite capper cappie capping capple cappy Capra caprate Caprella Caprellidae caprelline capreol capreolar capreolary capreolate capreoline Capreolus Capri capric capriccetto capricci capriccio caprice capricious capriciously capriciousness Capricorn Capricornid Capricornus caprid caprificate caprification caprificator caprifig Caprifoliaceae caprifoliaceous Caprifolium caprifolium capriform caprigenous Caprimulgi Caprimulgidae Caprimulgiformes caprimulgine Caprimulgus caprin caprine caprinic Capriola capriole Capriote capriped capripede caprizant caproate caproic caproin Capromys caprone capronic capronyl caproyl capryl caprylate caprylene caprylic caprylin caprylone caprylyl capsa capsaicin Capsella capsheaf capshore Capsian capsicin Capsicum capsicum capsid Capsidae capsizal capsize capstan capstone capsula capsulae capsular capsulate capsulated capsulation capsule capsulectomy capsuler capsuliferous capsuliform capsuligerous capsulitis capsulociliary capsulogenous capsulolenticular capsulopupillary capsulorrhaphy capsulotome capsulotomy capsumin captaculum captain captaincy captainess captainly captainry captainship captance captation caption captious captiously captiousness captivate captivately captivating captivatingly captivation captivative captivator captivatrix captive captivity captor captress capturable capture capturer Capuan capuche capuched Capuchin capuchin capucine capulet capulin capybara Caquetio car Cara carabao carabeen carabid Carabidae carabidan carabideous carabidoid carabin carabineer Carabini caraboid Carabus carabus caracal caracara caracol caracole caracoler caracoli caracolite caracoller caracore caract Caractacus caracter Caradoc carafe Caragana Caraguata caraguata Caraho caraibe Caraipa caraipi Caraja Carajas carajura caramba carambola carambole caramel caramelan caramelen caramelin caramelization caramelize caramoussal carancha caranda Carandas caranday carane Caranga carangid Carangidae carangoid Carangus caranna Caranx Carapa carapace carapaced Carapache Carapacho carapacic carapato carapax Carapidae carapine carapo Carapus Carara carat caratch caraunda caravan caravaneer caravanist caravanner caravansary caravanserai caravanserial caravel caraway Carayan carbacidometer carbamate carbamic carbamide carbamido carbamine carbamino carbamyl carbanil carbanilic carbanilide carbarn carbasus carbazic carbazide carbazine carbazole carbazylic carbeen carbene carberry carbethoxy carbethoxyl carbide carbimide carbine carbinol carbinyl carbo carboazotine carbocinchomeronic carbodiimide carbodynamite carbogelatin carbohemoglobin carbohydrase carbohydrate carbohydraturia carbohydrazide carbohydride carbohydrogen carbolate carbolated carbolfuchsin carbolic carbolineate Carbolineum carbolize Carboloy carboluria carbolxylol carbomethene carbomethoxy carbomethoxyl carbon carbona carbonaceous carbonade carbonado Carbonari Carbonarism Carbonarist carbonatation carbonate carbonation carbonatization carbonator carbonemia carbonero carbonic carbonide Carboniferous carboniferous carbonification carbonify carbonigenous carbonimeter carbonimide carbonite carbonitride carbonium carbonizable carbonization carbonize carbonizer carbonless Carbonnieux carbonometer carbonometry carbonous carbonuria carbonyl carbonylene carbonylic carbophilous carbora Carborundum carborundum carbosilicate carbostyril carboxide carboxy Carboxydomonas carboxyhemoglobin carboxyl carboxylase carboxylate carboxylation carboxylic carboy carboyed carbro carbromal carbuilder carbuncle carbuncled carbuncular carbungi carburant carburate carburation carburator carbure carburet carburetant carburetor carburization carburize carburizer carburometer carbyl carbylamine carcajou carcake carcanet carcaneted carcass Carcavelhos carceag carcel carceral carcerate carceration Carcharhinus Carcharias carchariid Carchariidae carcharioid Carcharodon carcharodont carcinemia carcinogen carcinogenesis carcinogenic carcinoid carcinological carcinologist carcinology carcinolysin carcinolytic carcinoma carcinomata carcinomatoid carcinomatosis carcinomatous carcinomorphic carcinophagous carcinopolypus carcinosarcoma carcinosarcomata Carcinoscorpius carcinosis carcoon card cardaissin Cardamine cardamom Cardanic cardboard cardcase cardecu carded cardel carder cardholder cardia cardiac cardiacal Cardiacea cardiacean cardiagra cardiagram cardiagraph cardiagraphy cardial cardialgia cardialgy cardiameter cardiamorphia cardianesthesia cardianeuria cardiant cardiaplegia cardiarctia cardiasthenia cardiasthma cardiataxia cardiatomy cardiatrophia cardiauxe Cardiazol cardicentesis cardiectasis cardiectomize cardiectomy cardielcosis cardiemphraxia cardiform Cardigan cardigan Cardiidae cardin cardinal cardinalate cardinalic Cardinalis cardinalism cardinalist cardinalitial cardinalitian cardinally cardinalship cardines carding cardioaccelerator cardioarterial cardioblast cardiocarpum cardiocele cardiocentesis cardiocirrhosis cardioclasia cardioclasis cardiodilator cardiodynamics cardiodynia cardiodysesthesia cardiodysneuria cardiogenesis cardiogenic cardiogram cardiograph cardiographic cardiography cardiohepatic cardioid cardiokinetic cardiolith cardiological cardiologist cardiology cardiolysis cardiomalacia cardiomegaly cardiomelanosis cardiometer cardiometric cardiometry cardiomotility cardiomyoliposis cardiomyomalacia cardioncus cardionecrosis cardionephric cardioneural cardioneurosis cardionosus cardioparplasis cardiopathic cardiopathy cardiopericarditis cardiophobe cardiophobia cardiophrenia cardioplasty cardioplegia cardiopneumatic cardiopneumograph cardioptosis cardiopulmonary cardiopuncture cardiopyloric cardiorenal cardiorespiratory cardiorrhaphy cardiorrheuma cardiorrhexis cardioschisis cardiosclerosis cardioscope cardiospasm Cardiospermum cardiosphygmogram cardiosphygmograph cardiosymphysis cardiotherapy cardiotomy cardiotonic cardiotoxic cardiotrophia cardiotrophotherapy cardiovascular cardiovisceral cardipaludism cardipericarditis cardisophistical carditic carditis Cardium cardlike cardmaker cardmaking cardo cardol cardon cardona cardoncillo cardooer cardoon cardophagus cardplayer cardroom cardsharp cardsharping cardstock Carduaceae carduaceous Carduelis Carduus care carecloth careen careenage careener career careerer careering careeringly careerist carefree careful carefully carefulness careless carelessly carelessness carene carer caress caressant caresser caressing caressingly caressive caressively carest caret caretaker caretaking Caretta Carettochelydidae careworn Carex carfare carfax carfuffle carful carga cargo cargoose carhop carhouse cariacine Cariacus cariama Cariamae Carian Carib Caribal Cariban Caribbean Caribbee Caribi Caribisi caribou Carica Caricaceae caricaceous caricatura caricaturable caricatural caricature caricaturist caricetum caricographer caricography caricologist caricology caricous carid Carida Caridea caridean caridoid Caridomorpha caries Carijona carillon carillonneur carina carinal Carinaria Carinatae carinate carinated carination Cariniana cariniform Carinthian cariole carioling cariosity carious cariousness Caripuna Cariri Caririan Carisa Carissa caritative caritive Cariyo cark carking carkingly carkled Carl carl carless carlet carlie carlin Carlina carline carling carlings carlish carlishness Carlisle Carlism Carlist Carlo carload carloading carloadings Carlos carlot Carlovingian carls Carludovica Carlylean Carlyleian Carlylese Carlylesque Carlylian Carlylism carmagnole carmalum Carman carman Carmanians Carmel Carmela carmele Carmelite Carmelitess carmeloite Carmen carminative Carmine carmine carminette carminic carminite carminophilous carmoisin carmot Carnacian carnage carnaged carnal carnalism carnalite carnality carnalize carnallite carnally carnalness carnaptious Carnaria carnassial carnate carnation carnationed carnationist carnauba carnaubic carnaubyl Carnegie Carnegiea carnelian carneol carneole carneous carney carnic carniferous carniferrin carnifex carnification carnifices carnificial carniform carnify Carniolan carnival carnivaler carnivalesque Carnivora carnivoracity carnivoral carnivore carnivorism carnivorous carnivorously carnivorousness carnose carnosine carnosity carnotite carnous Caro caroa carob caroba caroche Caroid Carol carol Carolan Carole Carolean caroler caroli carolin Carolina Caroline caroline Caroling Carolingian Carolinian carolus Carolyn carom carombolette carone caronic caroome caroon carotene carotenoid carotic carotid carotidal carotidean carotin carotinemia carotinoid caroubier carousal carouse carouser carousing carousingly carp carpaine carpal carpale carpalia Carpathian carpel carpellary carpellate carpent carpenter Carpenteria carpentering carpentership carpentry carper carpet carpetbag carpetbagger carpetbaggery carpetbaggism carpetbagism carpetbeater carpeting carpetlayer carpetless carpetmaker carpetmaking carpetmonger carpetweb carpetweed carpetwork carpetwoven Carphiophiops carpholite Carphophis carphosiderite carpid carpidium carpincho carping carpingly carpintero Carpinus Carpiodes carpitis carpium carpocace Carpocapsa carpocarpal carpocephala carpocephalum carpocerite carpocervical Carpocratian Carpodacus Carpodetus carpogam carpogamy carpogenic carpogenous carpogone carpogonial carpogonium Carpoidea carpolite carpolith carpological carpologically carpologist carpology carpomania carpometacarpal carpometacarpus carpopedal Carpophaga carpophagous carpophalangeal carpophore carpophyll carpophyte carpopodite carpopoditic carpoptosia carpoptosis carport carpos carposperm carposporangia carposporangial carposporangium carpospore carposporic carposporous carpostome carpus carquaise carr carrack carrageen carrageenin Carrara Carraran carrel carriable carriage carriageable carriageful carriageless carriagesmith carriageway Carrick carrick Carrie carried carrier carrion carritch carritches carriwitchet Carrizo carrizo carroch carrollite carronade carrot carrotage carroter carrotiness carrottop carrotweed carrotwood carroty carrousel carrow Carry carry carryall carrying carrytale carse carshop carsick carsmith Carsten cart cartable cartaceous cartage cartboot cartbote carte cartel cartelism cartelist cartelization cartelize Carter carter Cartesian Cartesianism cartful Carthaginian carthame carthamic carthamin Carthamus Carthusian Cartier cartilage cartilaginean Cartilaginei cartilagineous Cartilagines cartilaginification cartilaginoid cartilaginous cartisane Cartist cartload cartmaker cartmaking cartman cartobibliography cartogram cartograph cartographer cartographic cartographical cartographically cartography cartomancy carton cartonnage cartoon cartoonist cartouche cartridge cartsale cartulary cartway cartwright cartwrighting carty carua carucage carucal carucate carucated Carum caruncle caruncula carunculae caruncular carunculate carunculated carunculous carvacrol carvacryl carval carve carvel carven carvene carver carvership carvestrene carving carvoepra carvol carvomenthene carvone carvyl carwitchet Cary Carya caryatic caryatid caryatidal caryatidean caryatidic caryl Caryocar Caryocaraceae caryocaraceous Caryophyllaceae caryophyllaceous caryophyllene caryophylleous caryophyllin caryophyllous Caryophyllus caryopilite caryopses caryopsides caryopsis Caryopteris Caryota casaba casabe casal casalty Casamarca Casanovanic Casasia casate casaun casava casave casavi casbah cascabel cascade Cascadia Cascadian cascadite cascado cascalho cascalote cascara cascarilla cascaron casco cascol Case case Casearia casease caseate caseation casebook casebox cased caseful casefy caseharden caseic casein caseinate caseinogen casekeeper Casel caseless caselessly casemaker casemaking casemate casemated casement casemented caseolysis caseose caseous caser casern caseum caseweed casewood casework caseworker caseworm Casey cash casha cashable cashableness cashaw cashbook cashbox cashboy cashcuttee cashel cashew cashgirl Cashibo cashier cashierer cashierment cashkeeper cashment Cashmere cashmere cashmerette Cashmirian Casimir Casimiroa casing casino casiri cask casket casking casklike Caslon Caspar Casparian Casper Caspian casque casqued casquet casquetel casquette cass cassabanana cassabully cassady Cassandra cassareep cassation casse Cassegrain Cassegrainian casselty cassena casserole Cassia cassia Cassiaceae Cassian cassican Cassicus Cassida cassideous cassidid Cassididae Cassidinae cassidony Cassidulina cassiduloid Cassiduloidea Cassie cassie Cassiepeia cassimere cassina cassine Cassinese cassinette Cassinian cassino cassinoid cassioberry Cassiope Cassiopeia Cassiopeian Cassiopeid cassiopeium Cassis cassis cassiterite Cassius cassock cassolette casson cassonade cassoon cassowary cassumunar Cassytha Cassythaceae cast castable castagnole Castalia Castalian Castalides Castalio Castanea castanean castaneous castanet Castanopsis Castanospermum castaway caste casteless castelet castellan castellano castellanship castellany castellar castellate castellated castellation caster casterless casthouse castice castigable castigate castigation castigative castigator castigatory Castilian Castilla Castilleja Castilloa casting castle castled castlelike castlet castlewards castlewise castling castock castoff Castor castor Castores castoreum castorial Castoridae castorin castorite castorized Castoroides castory castra castral castrametation castrate castrater castration castrator castrensial castrensian castrum castuli casual casualism casualist casuality casually casualness casualty Casuariidae Casuariiformes Casuarina Casuarinaceae casuarinaceous Casuarinales Casuarius casuary casuist casuistess casuistic casuistical casuistically casuistry casula caswellite Casziel Cat cat catabaptist catabases catabasis catabatic catabibazon catabiotic catabolic catabolically catabolin catabolism catabolite catabolize catacaustic catachreses catachresis catachrestic catachrestical catachrestically catachthonian cataclasm cataclasmic cataclastic cataclinal cataclysm cataclysmal cataclysmatic cataclysmatist cataclysmic cataclysmically cataclysmist catacomb catacorolla catacoustics catacromyodian catacrotic catacrotism catacumbal catadicrotic catadicrotism catadioptric catadioptrical catadioptrics catadromous catafalco catafalque catagenesis catagenetic catagmatic Cataian catakinesis catakinetic catakinetomer catakinomeric Catalan Catalanganes Catalanist catalase Catalaunian catalecta catalectic catalecticant catalepsis catalepsy cataleptic cataleptiform cataleptize cataleptoid catalexis catalina catalineta catalinite catallactic catallactically catallactics catallum catalogia catalogic catalogical catalogist catalogistic catalogue cataloguer cataloguish cataloguist cataloguize Catalonian catalowne Catalpa catalpa catalufa catalyses catalysis catalyst catalyte catalytic catalytical catalytically catalyzator catalyze catalyzer catamaran Catamarcan Catamarenan catamenia catamenial catamite catamited catamiting catamount catamountain catan Catananche catapan catapasm catapetalous cataphasia cataphatic cataphora cataphoresis cataphoretic cataphoria cataphoric cataphract Cataphracta Cataphracti cataphrenia cataphrenic Cataphrygian cataphrygianism cataphyll cataphylla cataphyllary cataphyllum cataphysical cataplasia cataplasis cataplasm catapleiite cataplexy catapult catapultic catapultier cataract cataractal cataracted cataractine cataractous cataractwise cataria catarinite catarrh catarrhal catarrhally catarrhed Catarrhina catarrhine catarrhinian catarrhous catasarka Catasetum catasta catastaltic catastasis catastate catastatic catasterism catastrophal catastrophe catastrophic catastrophical catastrophically catastrophism catastrophist catathymic catatonia catatoniac catatonic catawampous catawampously catawamptious catawamptiously catawampus Catawba catberry catbird catboat catcall catch catchable catchall catchcry catcher catchfly catchiness catching catchingly catchingness catchland catchment catchpenny catchplate catchpole catchpolery catchpoleship catchpoll catchpollery catchup catchwater catchweed catchweight catchword catchwork catchy catclaw catdom cate catechesis catechetic catechetical catechetically catechin catechism catechismal catechist catechistic catechistical catechistically catechizable catechization catechize catechizer catechol catechu catechumen catechumenal catechumenate catechumenical catechumenically catechumenism catechumenship catechutannic categorem categorematic categorematical categorematically categorial categoric categorical categorically categoricalness categorist categorization categorize category catelectrotonic catelectrotonus catella catena catenae catenarian catenary catenate catenated catenation catenoid catenulate catepuce cater cateran catercap catercorner caterer caterership cateress caterpillar caterpillared caterpillarlike caterva caterwaul caterwauler caterwauling Catesbaea cateye catface catfaced catfacing catfall catfish catfoot catfooted catgut Catha Cathari Catharina Catharine Catharism Catharist Catharistic catharization catharize catharpin catharping Cathars catharsis Cathartae Cathartes cathartic cathartical cathartically catharticalness Cathartidae Cathartides Cathartolinum Cathay Cathayan cathead cathect cathectic cathection cathedra cathedral cathedraled cathedralesque cathedralic cathedrallike cathedralwise cathedratic cathedratica cathedratical cathedratically cathedraticum cathepsin Catherine catheter catheterism catheterization catheterize catheti cathetometer cathetometric cathetus cathexion cathexis cathidine cathin cathine cathinine cathion cathisma cathodal cathode cathodic cathodical cathodically cathodofluorescence cathodograph cathodography cathodoluminescence cathograph cathography cathole catholic catholical catholically catholicalness catholicate catholicism catholicist catholicity catholicize catholicizer catholicly catholicness catholicon catholicos catholicus catholyte cathood cathop Cathrin cathro Cathryn Cathy Catilinarian cation cationic cativo catjang catkin catkinate catlap catlike catlin catling catlinite catmalison catmint catnip catoblepas Catocala catocalid catocathartic catoctin Catodon catodont catogene catogenic Catoism Catonian Catonic Catonically Catonism catoptric catoptrical catoptrically catoptrics catoptrite catoptromancy catoptromantic Catoquina catostomid Catostomidae catostomoid Catostomus catpiece catpipe catproof Catskill catskin catstep catstick catstitch catstitcher catstone catsup cattabu cattail cattalo cattery Catti cattily cattimandoo cattiness catting cattish cattishly cattishness cattle cattlebush cattlegate cattleless cattleman Cattleya cattleya cattleyak Catty catty cattyman Catullian catvine catwalk catwise catwood catwort caubeen cauboge Caucasian Caucasic Caucasoid cauch cauchillo caucho caucus cauda caudad caudae caudal caudally caudalward Caudata caudata caudate caudated caudation caudatolenticular caudatory caudatum caudex caudices caudicle caudiform caudillism caudle caudocephalad caudodorsal caudofemoral caudolateral caudotibial caudotibialis Caughnawaga caught cauk caul cauld cauldrife cauldrifeness Caulerpa Caulerpaceae caulerpaceous caules caulescent caulicle caulicole caulicolous caulicule cauliculus cauliferous cauliflorous cauliflory cauliflower cauliform cauligenous caulinar caulinary cauline caulis Caulite caulivorous caulocarpic caulocarpous caulome caulomer caulomic caulophylline Caulophyllum Caulopteris caulopteris caulosarc caulotaxis caulotaxy caulote caum cauma caumatic caunch Caunos Caunus caup caupo caupones Cauqui caurale Caurus causability causable causal causalgia causality causally causate causation causational causationism causationist causative causatively causativeness causativity cause causeful causeless causelessly causelessness causer causerie causeway causewayman causey causidical causing causingness causse causson caustic caustical caustically causticiser causticism causticity causticization causticize causticizer causticly causticness caustification caustify Causus cautel cautelous cautelously cautelousness cauter cauterant cauterization cauterize cautery caution cautionary cautioner cautionry cautious cautiously cautiousness cautivo cava cavae caval cavalcade cavalero cavalier cavalierish cavalierishness cavalierism cavalierly cavalierness cavaliero cavaliership cavalla cavalry cavalryman cavascope cavate cavatina cave caveat caveator cavekeeper cavel cavelet cavelike cavendish cavern cavernal caverned cavernicolous cavernitis cavernlike cavernoma cavernous cavernously cavernulous cavesson cavetto Cavia caviar cavicorn Cavicornia Cavidae cavie cavil caviler caviling cavilingly cavilingness cavillation Cavina caving cavings cavish cavitary cavitate cavitation cavitied cavity caviya cavort cavus cavy caw cawk cawky cawney cawquaw caxiri caxon Caxton Caxtonian cay Cayapa Cayapo Cayenne cayenne cayenned Cayleyan cayman Cayubaba Cayubaban Cayuga Cayugan Cayuse Cayuvava caza cazimi Ccoya ce Ceanothus cearin cease ceaseless ceaselessly ceaselessness ceasmic Cebalrai Cebatha cebell cebian cebid Cebidae cebil cebine ceboid cebollite cebur Cebus cecidiologist cecidiology cecidium cecidogenous cecidologist cecidology cecidomyian cecidomyiid Cecidomyiidae cecidomyiidous Cecil Cecile Cecilia cecilite cecils Cecily cecity cecograph Cecomorphae cecomorphic cecostomy Cecropia Cecrops cecutiency cedar cedarbird cedared cedarn cedarware cedarwood cedary cede cedent ceder cedilla cedrat cedrate cedre Cedrela cedrene Cedric cedrin cedrine cedriret cedrium cedrol cedron Cedrus cedry cedula cee Ceiba ceibo ceil ceile ceiler ceilidh ceiling ceilinged ceilingward ceilingwards ceilometer Celadon celadon celadonite Celaeno celandine Celanese Celarent Celastraceae celastraceous Celastrus celation celative celature Celebesian celebrant celebrate celebrated celebratedness celebrater celebration celebrative celebrator celebratory celebrity celemin celemines celeomorph Celeomorphae celeomorphic celeriac celerity celery celesta Celeste celeste celestial celestiality celestialize celestially celestialness celestina Celestine celestine Celestinian celestite celestitude Celia celiac celiadelphus celiagra celialgia celibacy celibatarian celibate celibatic celibatist celibatory celidographer celidography celiectasia celiectomy celiemia celiitis celiocele celiocentesis celiocolpotomy celiocyesis celiodynia celioelytrotomy celioenterotomy celiogastrotomy celiohysterotomy celiolymph celiomyalgia celiomyodynia celiomyomectomy celiomyomotomy celiomyositis celioncus celioparacentesis celiopyosis celiorrhaphy celiorrhea celiosalpingectomy celiosalpingotomy celioschisis celioscope celioscopy celiotomy celite cell cella cellae cellar cellarage cellarer cellaress cellaret cellaring cellarless cellarman cellarous cellarway cellarwoman cellated celled Cellepora cellepore Cellfalcicula celliferous celliform cellifugal cellipetal cellist Cellite cello cellobiose celloid celloidin celloist cellophane cellose Cellucotton cellular cellularity cellularly cellulase cellulate cellulated cellulation cellule cellulicidal celluliferous cellulifugal cellulifugally cellulin cellulipetal cellulipetally cellulitis cellulocutaneous cellulofibrous Celluloid celluloid celluloided Cellulomonadeae Cellulomonas cellulose cellulosic cellulosity cellulotoxic cellulous Cellvibrio Celosia Celotex celotomy Celsia celsian Celsius Celt celt Celtdom Celtiberi Celtiberian Celtic Celtically Celticism Celticist Celticize Celtidaceae celtiform Celtillyrians Celtis Celtish Celtism Celtist celtium Celtization Celtologist Celtologue Celtomaniac Celtophil Celtophobe Celtophobia celtuce cembalist cembalo cement cemental cementation cementatory cementer cementification cementin cementite cementitious cementless cementmaker cementmaking cementoblast cementoma cementum cemeterial cemetery cenacle cenaculum cenanthous cenanthy cencerro Cenchrus cendre cenobian cenobite cenobitic cenobitical cenobitically cenobitism cenobium cenoby cenogenesis cenogenetic cenogenetically cenogonous Cenomanian cenosite cenosity cenospecies cenospecific cenospecifically cenotaph cenotaphic cenotaphy Cenozoic cenozoology cense censer censerless censive censor censorable censorate censorial censorious censoriously censoriousness censorship censual censurability censurable censurableness censurably censure censureless censurer censureship census cent centage cental centare centaur centaurdom Centaurea centauress centauri centaurial centaurian centauric Centaurid Centauridium Centaurium centauromachia centauromachy Centaurus centaurus centaury centavo centena centenar centenarian centenarianism centenary centenier centenionalis centennial centennially center centerable centerboard centered centerer centering centerless centermost centerpiece centervelic centerward centerwise centesimal centesimally centesimate centesimation centesimi centesimo centesis Centetes centetid Centetidae centgener centiar centiare centibar centifolious centigrade centigram centile centiliter centillion centillionth Centiloquy centime centimeter centimo centimolar centinormal centipedal centipede centiplume centipoise centistere centistoke centner cento centonical centonism centrad central centrale Centrales centralism centralist centralistic centrality centralization centralize centralizer centrally centralness centranth Centranthus centrarchid Centrarchidae centrarchoid Centraxonia centraxonial Centrechinoida centric Centricae centrical centricality centrically centricalness centricipital centriciput centricity centriffed centrifugal centrifugalization centrifugalize centrifugaller centrifugally centrifugate centrifugation centrifuge centrifugence centriole centripetal centripetalism centripetally centripetence centripetency centriscid Centriscidae centrisciform centriscoid Centriscus centrist centroacinar centrobaric centrobarical centroclinal centrode centrodesmose centrodesmus centrodorsal centrodorsally centroid centroidal centrolecithal Centrolepidaceae centrolepidaceous centrolinead centrolineal centromere centronucleus centroplasm Centropomidae Centropomus Centrosema centrosome centrosomic Centrosoyus Centrospermae centrosphere centrosymmetric centrosymmetry Centrotus centrum centry centum centumvir centumviral centumvirate Centunculus centuple centuplicate centuplication centuply centuria centurial centuriate centuriation centuriator centuried centurion century ceorl ceorlish cep cepa cepaceous cepe cephaeline Cephaelis Cephalacanthidae Cephalacanthus cephalad cephalagra cephalalgia cephalalgic cephalalgy cephalanthium cephalanthous Cephalanthus Cephalaspis Cephalata cephalate cephaldemae cephalemia cephaletron Cephaleuros cephalhematoma cephalhydrocele cephalic cephalin Cephalina cephaline cephalism cephalitis cephalization cephaloauricular Cephalobranchiata cephalobranchiate cephalocathartic cephalocaudal cephalocele cephalocentesis cephalocercal Cephalocereus cephalochord Cephalochorda cephalochordal Cephalochordata cephalochordate cephaloclasia cephaloclast cephalocone cephaloconic cephalocyst cephalodiscid Cephalodiscida Cephalodiscus cephalodymia cephalodymus cephalodynia cephalofacial cephalogenesis cephalogram cephalograph cephalohumeral cephalohumeralis cephaloid cephalology cephalomancy cephalomant cephalomelus cephalomenia cephalomeningitis cephalomere cephalometer cephalometric cephalometry cephalomotor cephalomyitis cephalon cephalonasal cephalopagus cephalopathy cephalopharyngeal cephalophine cephalophorous Cephalophus cephalophyma cephaloplegia cephaloplegic cephalopod Cephalopoda cephalopodan cephalopodic cephalopodous Cephalopterus cephalorachidian cephalorhachidian cephalosome cephalospinal Cephalosporium cephalostyle Cephalotaceae cephalotaceous Cephalotaxus cephalotheca cephalothecal cephalothoracic cephalothoracopagus cephalothorax cephalotome cephalotomy cephalotractor cephalotribe cephalotripsy cephalotrocha Cephalotus cephalous Cephas Cepheid cephid Cephidae Cephus Cepolidae ceps ceptor cequi ceraceous cerago ceral ceramal cerambycid Cerambycidae Ceramiaceae ceramiaceous ceramic ceramicite ceramics ceramidium ceramist Ceramium ceramographic ceramography cerargyrite ceras cerasein cerasin cerastes Cerastium Cerasus cerata cerate ceratectomy cerated ceratiasis ceratiid Ceratiidae ceratioid ceration ceratite Ceratites ceratitic Ceratitidae Ceratitis ceratitoid Ceratitoidea Ceratium Ceratobatrachinae ceratoblast ceratobranchial ceratocricoid Ceratodidae Ceratodontidae Ceratodus ceratofibrous ceratoglossal ceratoglossus ceratohyal ceratohyoid ceratoid ceratomandibular ceratomania Ceratonia Ceratophrys Ceratophyllaceae ceratophyllaceous Ceratophyllum Ceratophyta ceratophyte Ceratops Ceratopsia ceratopsian ceratopsid Ceratopsidae Ceratopteridaceae ceratopteridaceous Ceratopteris ceratorhine Ceratosa Ceratosaurus Ceratospongiae ceratospongian Ceratostomataceae Ceratostomella ceratotheca ceratothecal Ceratozamia ceraunia ceraunics ceraunogram ceraunograph ceraunomancy ceraunophone ceraunoscope ceraunoscopy Cerberean Cerberic Cerberus cercal cercaria cercarial cercarian cercariform cercelee cerci Cercidiphyllaceae Cercis Cercocebus Cercolabes Cercolabidae cercomonad Cercomonadidae Cercomonas cercopid Cercopidae cercopithecid Cercopithecidae cercopithecoid Cercopithecus cercopod Cercospora Cercosporella cercus Cerdonian cere cereal cerealian cerealin cerealism cerealist cerealose cerebella cerebellar cerebellifugal cerebellipetal cerebellocortex cerebellopontile cerebellopontine cerebellorubral cerebellospinal cerebellum cerebra cerebral cerebralgia cerebralism cerebralist cerebralization cerebralize cerebrally cerebrasthenia cerebrasthenic cerebrate cerebration cerebrational Cerebratulus cerebric cerebricity cerebriform cerebriformly cerebrifugal cerebrin cerebripetal cerebritis cerebrize cerebrocardiac cerebrogalactose cerebroganglion cerebroganglionic cerebroid cerebrology cerebroma cerebromalacia cerebromedullary cerebromeningeal cerebromeningitis cerebrometer cerebron cerebronic cerebroparietal cerebropathy cerebropedal cerebrophysiology cerebropontile cerebropsychosis cerebrorachidian cerebrosclerosis cerebroscope cerebroscopy cerebrose cerebrosensorial cerebroside cerebrosis cerebrospinal cerebrospinant cerebrosuria cerebrotomy cerebrotonia cerebrotonic cerebrovisceral cerebrum cerecloth cered cereless cerement ceremonial ceremonialism ceremonialist ceremonialize ceremonially ceremonious ceremoniously ceremoniousness ceremony cereous cerer ceresin Cereus cerevis ceria Cerialia cerianthid Cerianthidae cerianthoid Cerianthus ceric ceride ceriferous cerigerous cerillo ceriman cerin cerine Cerinthe Cerinthian Ceriomyces Cerion Cerionidae ceriops Ceriornis cerise cerite Cerithiidae cerithioid Cerithium cerium cermet cern cerniture cernuous cero cerograph cerographic cerographist cerography ceroline cerolite ceroma ceromancy cerophilous ceroplast ceroplastic ceroplastics ceroplasty cerotate cerote cerotene cerotic cerotin cerotype cerous ceroxyle Ceroxylon cerrero cerrial cerris certain certainly certainty Certhia Certhiidae certie certifiable certifiableness certifiably certificate certification certificative certificator certificatory certified certifier certify certiorari certiorate certioration certis certitude certosina certosino certy cerule cerulean cerulein ceruleite ceruleolactite ceruleous cerulescent ceruleum cerulignol cerulignone cerumen ceruminal ceruminiferous ceruminous cerumniparous ceruse cerussite Cervantist cervantite cervical Cervicapra cervicaprine cervicectomy cervicicardiac cervicide cerviciplex cervicispinal cervicitis cervicoauricular cervicoaxillary cervicobasilar cervicobrachial cervicobregmatic cervicobuccal cervicodorsal cervicodynia cervicofacial cervicohumeral cervicolabial cervicolingual cervicolumbar cervicomuscular cerviconasal cervicorn cervicoscapular cervicothoracic cervicovaginal cervicovesical cervid Cervidae Cervinae cervine cervisia cervisial cervix cervoid cervuline Cervulus Cervus ceryl Cerynean Cesare cesarevitch cesarolite cesious cesium cespititous cespitose cespitosely cespitulose cess cessantly cessation cessative cessavit cesser cession cessionaire cessionary cessor cesspipe cesspit cesspool cest Cestida Cestidae Cestoda Cestodaria cestode cestoid Cestoidea cestoidean Cestracion cestraciont Cestraciontes Cestraciontidae Cestrian Cestrum cestrum cestus Cetacea cetacean cetaceous cetaceum cetane Cete cetene ceterach ceti cetic ceticide Cetid cetin Cetiosauria cetiosaurian Cetiosaurus cetological cetologist cetology Cetomorpha cetomorphic Cetonia cetonian Cetoniides Cetoniinae cetorhinid Cetorhinidae cetorhinoid Cetorhinus cetotolite Cetraria cetraric cetrarin Cetus cetyl cetylene cetylic cevadilla cevadilline cevadine Cevennian Cevenol Cevenole cevine cevitamic ceylanite Ceylon Ceylonese ceylonite ceyssatite Ceyx Cezannesque cha chaa chab chabasie chabazite Chablis chabot chabouk chabuk chabutra Chac chacate chachalaca Chachapuya chack Chackchiuma chacker chackle chackler chacma Chaco chacona chacte chad chadacryst Chaenactis Chaenolobus Chaenomeles chaeta Chaetangiaceae Chaetangium Chaetetes Chaetetidae Chaetifera chaetiferous Chaetites Chaetitidae Chaetochloa Chaetodon chaetodont chaetodontid Chaetodontidae chaetognath Chaetognatha chaetognathan chaetognathous Chaetophora Chaetophoraceae chaetophoraceous Chaetophorales chaetophorous chaetopod Chaetopoda chaetopodan chaetopodous chaetopterin Chaetopterus chaetosema Chaetosoma Chaetosomatidae Chaetosomidae chaetotactic chaetotaxy Chaetura chafe chafer chafery chafewax chafeweed chaff chaffcutter chaffer chafferer chaffinch chaffiness chaffing chaffingly chaffless chafflike chaffman chaffseed chaffwax chaffweed chaffy chaft chafted Chaga chagan Chagga chagrin chaguar chagul chahar chai Chailletiaceae chain chainage chained chainer chainette chainless chainlet chainmaker chainmaking chainman chainon chainsmith chainwale chainwork chair chairer chairless chairmaker chairmaking chairman chairmanship chairmender chairmending chairwarmer chairwoman chais chaise chaiseless Chait chaitya chaja chaka chakar chakari Chakavski chakazi chakdar chakobu chakra chakram chakravartin chaksi chal chalaco chalana chalastic Chalastogastra chalaza chalazal chalaze chalazian chalaziferous chalazion chalazogam chalazogamic chalazogamy chalazoidite chalcanthite Chalcedonian chalcedonic chalcedonous chalcedony chalcedonyx chalchuite chalcid Chalcidian Chalcidic chalcidicum chalcidid Chalcididae chalcidiform chalcidoid Chalcidoidea Chalcioecus Chalcis chalcites chalcocite chalcograph chalcographer chalcographic chalcographical chalcographist chalcography chalcolite chalcolithic chalcomancy chalcomenite chalcon chalcone chalcophanite chalcophyllite chalcopyrite chalcosiderite chalcosine chalcostibite chalcotrichite chalcotript chalcus Chaldaei Chaldaic Chaldaical Chaldaism Chaldean Chaldee chalder chaldron chalet chalice chaliced chalicosis chalicothere chalicotheriid Chalicotheriidae chalicotherioid Chalicotherium Chalina Chalinidae chalinine Chalinitis chalk chalkcutter chalker chalkiness chalklike chalkography chalkosideric chalkstone chalkstony chalkworker chalky challah challenge challengeable challengee challengeful challenger challengingly challie challis challote chalmer chalon chalone Chalons chalque chalta Chalukya Chalukyan chalumeau chalutz chalutzim Chalybean chalybeate chalybeous Chalybes chalybite Cham cham Chama Chamacea Chamacoco Chamaebatia Chamaecistus chamaecranial Chamaecrista Chamaecyparis Chamaedaphne Chamaeleo Chamaeleon Chamaeleontidae Chamaelirium Chamaenerion Chamaepericlymenum chamaeprosopic Chamaerops chamaerrhine Chamaesaura Chamaesiphon Chamaesiphonaceae Chamaesiphonaceous Chamaesiphonales Chamaesyce chamal Chamar chamar chamber chamberdeacon chambered chamberer chambering chamberlain chamberlainry chamberlainship chamberlet chamberleted chamberletted chambermaid Chambertin chamberwoman Chambioa chambray chambrel chambul chamecephalic chamecephalous chamecephalus chamecephaly chameleon chameleonic chameleonize chameleonlike chamfer chamferer chamfron Chamian Chamicuro Chamidae chamisal chamiso Chamite chamite Chamkanni chamma chamois Chamoisette chamoisite chamoline Chamomilla Chamorro Chamos champ Champa champac champaca champacol champagne champagneless champagnize champaign champain champaka champer champertor champertous champerty champignon champion championess championize championless championlike championship Champlain Champlainic champleve champy Chanabal Chanca chance chanceful chancefully chancefulness chancel chanceled chanceless chancellery chancellor chancellorate chancelloress chancellorism chancellorship chancer chancery chancewise chanche chanchito chanco chancre chancriform chancroid chancroidal chancrous chancy chandala chandam chandelier Chandi chandi chandler chandleress chandlering chandlery chandoo chandu chandul Chane chanfrin Chang chang changa changar change changeability changeable changeableness changeably changedale changedness changeful changefully changefulness changeless changelessly changelessness changeling changement changer Changoan Changos Changuina Changuinan Chanidae chank chankings channel channelbill channeled channeler channeling channelization channelize channelled channeller channelling channelwards channer chanson chansonnette chanst chant chantable chanter chanterelle chantership chantey chanteyman chanticleer chanting chantingly chantlate chantress chantry chao chaogenous chaology chaos chaotic chaotical chaotically chaoticness Chaouia chap Chapacura Chapacuran chapah Chapanec chaparral chaparro chapatty chapbook chape chapeau chapeaux chaped chapel chapeless chapelet chapelgoer chapelgoing chapellage chapellany chapelman chapelmaster chapelry chapelward chaperno chaperon chaperonage chaperone chaperonless chapfallen chapin chapiter chapitral chaplain chaplaincy chaplainry chaplainship chapless chaplet chapleted chapman chapmanship chapournet chapournetted chappaul chapped chapper chappie chappin chapping chappow chappy chaps chapt chaptalization chaptalize chapter chapteral chapterful chapwoman char Chara charabanc charabancer charac Characeae characeous characetum characin characine characinid Characinidae characinoid character characterful characterial characterical characterism characterist characteristic characteristical characteristically characteristicalness characteristicness characterizable characterization characterize characterizer characterless characterlessness characterological characterologist characterology charactery charade Charadrii Charadriidae charadriiform Charadriiformes charadrine charadrioid Charadriomorphae Charadrius Charales charas charbon Charca charcoal charcoaly charcutier chard chardock chare charer charet charette charge chargeability chargeable chargeableness chargeably chargee chargeless chargeling chargeman charger chargeship charging Charicleia charier charily chariness chariot charioted chariotee charioteer charioteership chariotlike chariotman chariotry chariotway charism charisma charismatic Charissa charisticary charitable charitableness charitably Charites charity charityless charivari chark charka charkha charkhana charlady charlatan charlatanic charlatanical charlatanically charlatanish charlatanism charlatanistic charlatanry charlatanship Charleen Charlene Charles Charleston Charley Charlie charlock Charlotte charm charmedly charmel charmer charmful charmfully charmfulness charming charmingly charmingness charmless charmlessly charmwise charnel charnockite Charon Charonian Charonic Charontas Charophyta charpit charpoy charqued charqui charr Charruan Charruas charry charshaf charsingha chart chartaceous charter charterable charterage chartered charterer charterhouse Charterist charterless chartermaster charthouse charting Chartism Chartist chartist chartless chartographist chartology chartometer chartophylax chartreuse Chartreux chartroom chartula chartulary charuk charwoman chary Charybdian Charybdis chasable chase chaseable chaser Chasidim chasing chasm chasma chasmal chasmed chasmic chasmogamic chasmogamous chasmogamy chasmophyte chasmy chasse Chasselas chassepot chasseur chassignite chassis Chastacosta chaste chastely chasten chastener chasteness chasteningly chastenment chasteweed chastisable chastise chastisement chastiser chastity chasuble chasubled chat chataka Chateau chateau chateaux chatelain chatelaine chatelainry chatellany chathamite chati Chatillon Chatino Chatot chatoyance chatoyancy chatoyant chatsome chatta chattable Chattanooga Chattanoogan chattation chattel chattelhood chattelism chattelization chattelize chattelship chatter chatteration chatterbag chatterbox chatterer chattering chatteringly chattermag chattermagging Chattertonian chattery Chatti chattily chattiness chatting chattingly chatty chatwood Chaucerian Chauceriana Chaucerianism Chaucerism Chauchat chaudron chauffer chauffeur chauffeurship Chaui chauk chaukidari Chauliodes chaulmoogra chaulmoograte chaulmoogric Chauna chaus chausseemeile Chautauqua Chautauquan chaute chauth chauvinism chauvinist chauvinistic chauvinistically Chavante Chavantean chavender chavibetol chavicin chavicine chavicol chavish chaw chawan chawbacon chawer Chawia chawk chawl chawstick chay chaya chayaroot Chayma Chayota chayote chayroot chazan Chazy che cheap cheapen cheapener cheapery cheaping cheapish cheaply cheapness Cheapside cheat cheatable cheatableness cheatee cheater cheatery cheating cheatingly cheatrie Chebacco chebec chebel chebog chebule chebulinic Chechehet Chechen check checkable checkage checkbird checkbite checkbook checked checker checkerbelly checkerberry checkerbloom checkerboard checkerbreast checkered checkerist checkers checkerwise checkerwork checkhook checkless checkman checkmate checkoff checkrack checkrein checkroll checkroom checkrope checkrow checkrowed checkrower checkstone checkstrap checkstring checkup checkweigher checkwork checky cheddaring cheddite cheder chedlock chee cheecha cheechako cheek cheekbone cheeker cheekily cheekiness cheekish cheekless cheekpiece cheeky cheep cheeper cheepily cheepiness cheepy cheer cheered cheerer cheerful cheerfulize cheerfully cheerfulness cheerfulsome cheerily cheeriness cheering cheeringly cheerio cheerleader cheerless cheerlessly cheerlessness cheerly cheery cheese cheeseboard cheesebox cheeseburger cheesecake cheesecloth cheesecurd cheesecutter cheeseflower cheeselip cheesemonger cheesemongering cheesemongerly cheesemongery cheeseparer cheeseparing cheeser cheesery cheesewood cheesiness cheesy cheet cheetah cheeter cheetie chef Chefrinia chegoe chegre Chehalis Cheilanthes cheilitis Cheilodipteridae Cheilodipterus Cheilostomata cheilostomatous cheir cheiragra Cheiranthus Cheirogaleus Cheiroglossa cheirognomy cheirography cheirolin cheirology cheiromancy cheiromegaly cheiropatagium cheiropodist cheiropody cheiropompholyx Cheiroptera cheiropterygium cheirosophy cheirospasm Cheirotherium Cheka chekan cheke cheki Chekist chekmak chela chelaship chelate chelation chelem chelerythrine chelicer chelicera cheliceral chelicerate chelicere chelide chelidon chelidonate chelidonian chelidonic chelidonine Chelidonium Chelidosaurus Cheliferidea cheliferous cheliform chelingo cheliped Chellean chello Chelodina chelodine chelone Chelonia chelonian chelonid Chelonidae cheloniid Cheloniidae chelonin chelophore chelp Cheltenham Chelura Chelydidae Chelydra Chelydridae chelydroid chelys Chemakuan chemasthenia chemawinite Chemehuevi chemesthesis chemiatric chemiatrist chemiatry chemic chemical chemicalization chemicalize chemically chemicker chemicoastrological chemicobiologic chemicobiology chemicocautery chemicodynamic chemicoengineering chemicoluminescence chemicomechanical chemicomineralogical chemicopharmaceutical chemicophysical chemicophysics chemicophysiological chemicovital chemigraph chemigraphic chemigraphy chemiloon chemiluminescence chemiotactic chemiotaxic chemiotaxis chemiotropic chemiotropism chemiphotic chemis chemise chemisette chemism chemisorb chemisorption chemist chemistry chemitype chemitypy chemoceptor chemokinesis chemokinetic chemolysis chemolytic chemolyze chemoreception chemoreceptor chemoreflex chemoresistance chemoserotherapy chemosis chemosmosis chemosmotic chemosynthesis chemosynthetic chemotactic chemotactically chemotaxis chemotaxy chemotherapeutic chemotherapeutics chemotherapist chemotherapy chemotic chemotropic chemotropically chemotropism Chemung chemurgic chemurgical chemurgy Chen chena chende chenevixite Cheney cheng chenica chenille cheniller chenopod Chenopodiaceae chenopodiaceous Chenopodiales Chenopodium cheoplastic chepster cheque Chequers Chera chercock cherem Cheremiss Cheremissian cherimoya cherish cherishable cherisher cherishing cherishingly cherishment Cherkess Cherkesser Chermes Chermidae Chermish Chernomorish chernozem Cherokee cheroot cherried cherry cherryblossom cherrylike chersonese Chersydridae chert cherte cherty cherub cherubic cherubical cherubically cherubim cherubimic cherubimical cherubin Cherusci Chervante chervil chervonets Chesapeake Cheshire cheson chess chessboard chessdom chessel chesser chessist chessman chessmen chesstree chessylite chest Chester chester chesterfield Chesterfieldian chesterlite chestful chestily chestiness chestnut chestnutty chesty Chet cheth chettik chetty chetverik chetvert chevage cheval chevalier chevaline chevance cheve cheven chevener chevesaile chevin Cheviot chevisance chevise chevon chevrette chevron chevrone chevronel chevronelly chevronwise chevrony chevrotain chevy chew chewbark chewer chewink chewstick chewy Cheyenne cheyney chhatri chi chia Chiam Chian Chianti Chiapanec Chiapanecan chiaroscurist chiaroscuro chiasm chiasma chiasmal chiasmatype chiasmatypy chiasmic Chiasmodon chiasmodontid Chiasmodontidae chiasmus chiastic chiastolite chiastoneural chiastoneurous chiastoneury chiaus Chibcha Chibchan chibinite chibouk chibrit chic chicane chicaner chicanery chicaric chicayote Chicha chichi chichicaste Chichimec chichimecan chichipate chichipe chichituna chick chickabiddy chickadee Chickahominy Chickamauga chickaree Chickasaw chickasaw chickell chicken chickenberry chickenbill chickenbreasted chickenhearted chickenheartedly chickenheartedness chickenhood chickenweed chickenwort chicker chickhood chickling chickstone chickweed chickwit chicky chicle chicness Chico chico Chicomecoatl chicory chicot chicote chicqued chicquer chicquest chicquing chid chidden chide chider chiding chidingly chidingness chidra chief chiefdom chiefery chiefess chiefest chiefish chiefless chiefling chiefly chiefship chieftain chieftaincy chieftainess chieftainry chieftainship chieftess chield Chien chien chiffer chiffon chiffonade chiffonier chiffony chifforobe chigetai chiggak chigger chiggerweed chignon chignoned chigoe chih chihfu Chihuahua chikara chil chilacavote chilalgia chilarium chilblain Chilcat child childbearing childbed childbirth childcrowing childe childed Childermas childhood childing childish childishly childishness childkind childless childlessness childlike childlikeness childly childness childrenite childridden childship childward chile Chilean Chileanization Chileanize chilectropion chilenite chili chiliad chiliadal chiliadic chiliagon chiliahedron chiliarch chiliarchia chiliarchy chiliasm chiliast chiliastic chilicote chilicothe chilidium Chilina Chilinidae chiliomb Chilion chilitis Chilkat chill chilla chillagite chilled chiller chillily chilliness chilling chillingly chillish Chilliwack chillness chillo chillroom chillsome chillum chillumchee chilly chilognath Chilognatha chilognathan chilognathous chilogrammo chiloma Chilomastix chiloncus chiloplasty chilopod Chilopoda chilopodan chilopodous Chilopsis Chilostoma Chilostomata chilostomatous chilostome chilotomy Chiltern chilver chimaera chimaerid Chimaeridae chimaeroid Chimaeroidei Chimakuan Chimakum Chimalakwe Chimalapa Chimane chimango Chimaphila Chimarikan Chimariko chimble chime chimer chimera chimeric chimerical chimerically chimericalness chimesmaster chiminage Chimmesyan chimney chimneyhead chimneyless chimneyman Chimonanthus chimopeelagic chimpanzee Chimu Chin chin china chinaberry chinalike Chinaman chinamania chinamaniac chinampa chinanta Chinantecan Chinantecs chinaphthol chinar chinaroot Chinatown chinaware chinawoman chinband chinch chincha Chinchasuyu chinchayote chinche chincherinchee chinchilla chinching chincloth chincough chine chined Chinee Chinese Chinesery ching chingma Chingpaw Chinhwan chinik chinin Chink chink chinkara chinker chinkerinchee chinking chinkle chinks chinky chinless chinnam chinned chinny chino chinoa chinol Chinook Chinookan chinotoxine chinotti chinpiece chinquapin chinse chint chintz chinwood Chiococca chiococcine Chiogenes chiolite chionablepsia Chionanthus Chionaspis Chionididae Chionis Chionodoxa Chiot chiotilla Chip chip chipchap chipchop Chipewyan chiplet chipling chipmunk chippable chippage chipped Chippendale chipper chipping chippy chips chipwood Chiquitan Chiquito chiragra chiral chiralgia chirality chirapsia chirarthritis chirata Chiriana Chiricahua Chiriguano chirimen Chirino chirinola chiripa chirivita chirk chirm chiro chirocosmetics chirogale chirognomic chirognomically chirognomist chirognomy chirognostic chirograph chirographary chirographer chirographic chirographical chirography chirogymnast chirological chirologically chirologist chirology chiromance chiromancer chiromancist chiromancy chiromant chiromantic chiromantical Chiromantis chiromegaly chirometer Chiromyidae Chiromys Chiron chironomic chironomid Chironomidae Chironomus chironomy chironym chiropatagium chiroplasty chiropod chiropodial chiropodic chiropodical chiropodist chiropodistry chiropodous chiropody chiropompholyx chiropractic chiropractor chiropraxis chiropter Chiroptera chiropteran chiropterite chiropterophilous chiropterous chiropterygian chiropterygious chiropterygium chirosophist chirospasm Chirotes chirotherian Chirotherium chirothesia chirotonsor chirotonsory chirotony chirotype chirp chirper chirpily chirpiness chirping chirpingly chirpling chirpy chirr chirrup chirruper chirrupy chirurgeon chirurgery Chisedec chisel chiseled chiseler chisellike chiselly chiselmouth chit Chita chitak chital chitchat chitchatty Chitimacha Chitimachan chitin chitinization chitinized chitinocalcareous chitinogenous chitinoid chitinous chiton chitosamine chitosan chitose chitra Chitrali chittamwood chitter chitterling chitty chivalresque chivalric chivalrous chivalrously chivalrousness chivalry chive chivey chiviatite Chiwere chkalik chladnite chlamyd chlamydate chlamydeous Chlamydobacteriaceae chlamydobacteriaceous Chlamydobacteriales Chlamydomonadaceae Chlamydomonadidae Chlamydomonas Chlamydosaurus Chlamydoselachidae Chlamydoselachus chlamydospore Chlamydozoa chlamydozoan chlamyphore Chlamyphorus chlamys Chleuh chloanthite chloasma Chloe chlor chloracetate chloragogen chloral chloralformamide chloralide chloralism chloralization chloralize chloralose chloralum chloramide chloramine chloramphenicol chloranemia chloranemic chloranhydride chloranil Chloranthaceae chloranthaceous Chloranthus chloranthy chlorapatite chlorastrolite chlorate chlorazide chlorcosane chlordan chlordane chlore Chlorella Chlorellaceae chlorellaceous chloremia chlorenchyma chlorhydrate chlorhydric chloric chloridate chloridation chloride Chloridella Chloridellidae chlorider chloridize chlorimeter chlorimetric chlorimetry chlorinate chlorination chlorinator chlorine chlorinize chlorinous chloriodide Chlorion Chlorioninae chlorite chloritic chloritization chloritize chloritoid chlorize chlormethane chlormethylic chloroacetate chloroacetic chloroacetone chloroacetophenone chloroamide chloroamine chloroanaemia chloroanemia chloroaurate chloroauric chloroaurite chlorobenzene chlorobromide chlorocalcite chlorocarbonate chlorochromates chlorochromic chlorochrous Chlorococcaceae Chlorococcales Chlorococcum Chlorococcus chlorocresol chlorocruorin chlorodize chloroform chloroformate chloroformic chloroformism chloroformist chloroformization chloroformize chlorogenic chlorogenine chlorohydrin chlorohydrocarbon chloroiodide chloroleucite chloroma chloromelanite chlorometer chloromethane chlorometric chlorometry Chloromycetin chloronitrate chloropal chloropalladates chloropalladic chlorophane chlorophenol chlorophoenicite Chlorophora Chlorophyceae chlorophyceous chlorophyl chlorophyll chlorophyllaceous chlorophyllan chlorophyllase chlorophyllian chlorophyllide chlorophylliferous chlorophylligenous chlorophylligerous chlorophyllin chlorophyllite chlorophylloid chlorophyllose chlorophyllous chloropia chloropicrin chloroplast chloroplastic chloroplastid chloroplatinate chloroplatinic chloroplatinite chloroplatinous chloroprene chloropsia chloroquine chlorosilicate chlorosis chlorospinel chlorosulphonic chlorotic chlorous chlorozincate chlorsalol chloryl Chnuphis cho choachyte choana choanate Choanephora choanocytal choanocyte Choanoflagellata choanoflagellate Choanoflagellida Choanoflagellidae choanoid choanophorous choanosomal choanosome choate choaty chob choca chocard Chocho chocho chock chockablock chocker chockler chockman Choco Chocoan chocolate Choctaw choel choenix Choeropsis Choes choffer choga chogak chogset Choiak choice choiceful choiceless choicelessness choicely choiceness choicy choil choiler choir choirboy choirlike choirman choirmaster choirwise Choisya chokage choke chokeberry chokebore chokecherry chokedamp choker chokered chokerman chokestrap chokeweed chokidar choking chokingly chokra choky Chol chol Chola chola cholagogic cholagogue cholalic cholane cholangioitis cholangitis cholanic cholanthrene cholate chold choleate cholecyanine cholecyst cholecystalgia cholecystectasia cholecystectomy cholecystenterorrhaphy cholecystenterostomy cholecystgastrostomy cholecystic cholecystitis cholecystnephrostomy cholecystocolostomy cholecystocolotomy cholecystoduodenostomy cholecystogastrostomy cholecystogram cholecystography cholecystoileostomy cholecystojejunostomy cholecystokinin cholecystolithiasis cholecystolithotripsy cholecystonephrostomy cholecystopexy cholecystorrhaphy cholecystostomy cholecystotomy choledoch choledochal choledochectomy choledochitis choledochoduodenostomy choledochoenterostomy choledocholithiasis choledocholithotomy choledocholithotripsy choledochoplasty choledochorrhaphy choledochostomy choledochotomy cholehematin choleic choleine choleinic cholelith cholelithiasis cholelithic cholelithotomy cholelithotripsy cholelithotrity cholemia choleokinase cholepoietic choler cholera choleraic choleric cholericly cholericness choleriform cholerigenous cholerine choleroid choleromania cholerophobia cholerrhagia cholestane cholestanol cholesteatoma cholesteatomatous cholestene cholesterate cholesteremia cholesteric cholesterin cholesterinemia cholesterinic cholesterinuria cholesterol cholesterolemia cholesteroluria cholesterosis cholesteryl choletelin choletherapy choleuria choli choliamb choliambic choliambist cholic choline cholinergic cholinesterase cholinic cholla choller Cholo cholochrome cholocyanine Choloepus chologenetic choloidic choloidinic chololith chololithic Cholonan Cholones cholophein cholorrhea choloscopy cholterheaded cholum choluria Choluteca chomp chondral chondralgia chondrarsenite chondre chondrectomy chondrenchyma chondric chondrification chondrify chondrigen chondrigenous Chondrilla chondrin chondrinous chondriocont chondriome chondriomere chondriomite chondriosomal chondriosome chondriosphere chondrite chondritic chondritis chondroadenoma chondroalbuminoid chondroangioma chondroarthritis chondroblast chondroblastoma chondrocarcinoma chondrocele chondroclasis chondroclast chondrocoracoid chondrocostal chondrocranial chondrocranium chondrocyte chondrodite chondroditic chondrodynia chondrodystrophia chondrodystrophy chondroendothelioma chondroepiphysis chondrofetal chondrofibroma chondrofibromatous Chondroganoidei chondrogen chondrogenesis chondrogenetic chondrogenous chondrogeny chondroglossal chondroglossus chondrography chondroid chondroitic chondroitin chondrolipoma chondrology chondroma chondromalacia chondromatous chondromucoid Chondromyces chondromyoma chondromyxoma chondromyxosarcoma chondropharyngeal chondropharyngeus chondrophore chondrophyte chondroplast chondroplastic chondroplasty chondroprotein chondropterygian Chondropterygii chondropterygious chondrosamine chondrosarcoma chondrosarcomatous chondroseptum chondrosin chondrosis chondroskeleton chondrostean Chondrostei chondrosteoma chondrosteous chondrosternal chondrotome chondrotomy chondroxiphoid chondrule chondrus chonolith chonta Chontal Chontalan Chontaquiro chontawood choop choosable choosableness choose chooser choosing choosingly choosy chop chopa chopboat chopfallen chophouse chopin chopine choplogic chopped chopper choppered chopping choppy chopstick Chopunnish Chora choragic choragion choragium choragus choragy Chorai choral choralcelo choraleon choralist chorally Chorasmian chord chorda Chordaceae chordacentrous chordacentrum chordaceous chordal chordally chordamesoderm Chordata chordate chorded Chordeiles chorditis chordoid chordomesoderm chordotomy chordotonal chore chorea choreal choreatic choree choregic choregus choregy choreic choreiform choreograph choreographer choreographic choreographical choreography choreoid choreomania chorepiscopal chorepiscopus choreus choreutic chorial choriamb choriambic choriambize choriambus choric chorine chorioadenoma chorioallantoic chorioallantoid chorioallantois choriocapillaris choriocapillary choriocarcinoma choriocele chorioepithelioma chorioid chorioidal chorioiditis chorioidocyclitis chorioidoiritis chorioidoretinitis chorioma chorion chorionepithelioma chorionic Chorioptes chorioptic chorioretinal chorioretinitis Choripetalae choripetalous choriphyllous chorisepalous chorisis chorism chorist choristate chorister choristership choristic choristoblastoma choristoma choristry chorization chorizont chorizontal chorizontes chorizontic chorizontist chorogi chorograph chorographer chorographic chorographical chorographically chorography choroid choroidal choroidea choroiditis choroidocyclitis choroidoiritis choroidoretinitis chorological chorologist chorology choromania choromanic chorometry chorook Chorotega Choroti chort chorten Chorti chortle chortler chortosterol chorus choruser choruslike Chorwat choryos chose chosen chott Chou Chouan Chouanize chouette chough chouka choultry choup chouquette chous chouse chouser chousingha chow Chowanoc chowchow chowder chowderhead chowderheaded chowk chowry choya choyroot Chozar chrematheism chrematist chrematistic chrematistics chreotechnics chresmology chrestomathic chrestomathics chrestomathy chria chrimsel Chris chrism chrisma chrismal chrismary chrismatine chrismation chrismatite chrismatize chrismatory chrismon chrisom chrisomloosing chrisroot Chrissie Christ Christabel Christadelphian Christadelphianism christcross Christdom Christed christen Christendie Christendom christened christener christening Christenmas Christhood Christiad Christian Christiana Christiania Christianiadeal Christianism christianite Christianity Christianization Christianize Christianizer Christianlike Christianly Christianness Christianogentilism Christianography Christianomastix Christianopaganism Christicide Christie Christiform Christina Christine Christless Christlessness Christlike Christlikeness Christliness Christly Christmas Christmasberry Christmasing Christmastide Christmasy Christocentric Christofer Christogram Christolatry Christological Christologist Christology Christophany Christophe Christopher Christos chroatol Chrobat chroma chromaffin chromaffinic chromammine chromaphil chromaphore chromascope chromate chromatic chromatical chromatically chromatician chromaticism chromaticity chromatics chromatid chromatin chromatinic Chromatioideae chromatism chromatist Chromatium chromatize chromatocyte chromatodysopia chromatogenous chromatogram chromatograph chromatographic chromatography chromatoid chromatology chromatolysis chromatolytic chromatometer chromatone chromatopathia chromatopathic chromatopathy chromatophil chromatophile chromatophilia chromatophilic chromatophilous chromatophobia chromatophore chromatophoric chromatophorous chromatoplasm chromatopsia chromatoptometer chromatoptometry chromatoscope chromatoscopy chromatosis chromatosphere chromatospheric chromatrope chromaturia chromatype chromazurine chromdiagnosis chrome chromene chromesthesia chromic chromicize chromid Chromidae Chromides chromidial Chromididae chromidiogamy chromidiosome chromidium chromidrosis chromiferous chromiole chromism chromite chromitite chromium chromo Chromobacterieae Chromobacterium chromoblast chromocenter chromocentral chromochalcographic chromochalcography chromocollograph chromocollographic chromocollography chromocollotype chromocollotypy chromocratic chromocyte chromocytometer chromodermatosis chromodiascope chromogen chromogene chromogenesis chromogenetic chromogenic chromogenous chromogram chromograph chromoisomer chromoisomeric chromoisomerism chromoleucite chromolipoid chromolith chromolithic chromolithograph chromolithographer chromolithographic chromolithography chromolysis chromomere chromometer chromone chromonema chromoparous chromophage chromophane chromophile chromophilic chromophilous chromophobic chromophore chromophoric chromophorous chromophotograph chromophotographic chromophotography chromophotolithograph chromophyll chromoplasm chromoplasmic chromoplast chromoplastid chromoprotein chromopsia chromoptometer chromoptometrical chromosantonin chromoscope chromoscopic chromoscopy chromosomal chromosome chromosphere chromospheric chromotherapist chromotherapy chromotrope chromotropic chromotropism chromotropy chromotype chromotypic chromotypographic chromotypography chromotypy chromous chromoxylograph chromoxylography chromule chromy chromyl chronal chronanagram chronaxia chronaxie chronaxy chronic chronical chronically chronicity chronicle chronicler chronicon chronisotherm chronist chronobarometer chronocinematography chronocrator chronocyclegraph chronodeik chronogeneous chronogenesis chronogenetic chronogram chronogrammatic chronogrammatical chronogrammatically chronogrammatist chronogrammic chronograph chronographer chronographic chronographical chronographically chronography chronoisothermal chronologer chronologic chronological chronologically chronologist chronologize chronology chronomancy chronomantic chronometer chronometric chronometrical chronometrically chronometry chrononomy chronopher chronophotograph chronophotographic chronophotography Chronos chronoscope chronoscopic chronoscopically chronoscopy chronosemic chronostichon chronothermal chronothermometer chronotropic chronotropism Chroococcaceae chroococcaceous Chroococcales chroococcoid Chroococcus Chrosperma chrotta chrysal chrysalid chrysalidal chrysalides chrysalidian chrysaline chrysalis chrysaloid chrysamine chrysammic chrysamminic Chrysamphora chrysaniline chrysanisic chrysanthemin chrysanthemum chrysanthous Chrysaor chrysarobin chrysatropic chrysazin chrysazol chryselectrum chryselephantine Chrysemys chrysene chrysenic chrysid Chrysidella chrysidid Chrysididae chrysin Chrysippus Chrysis chrysoaristocracy Chrysobalanaceae Chrysobalanus chrysoberyl chrysobull chrysocarpous chrysochlore Chrysochloridae Chrysochloris chrysochlorous chrysochrous chrysocolla chrysocracy chrysoeriol chrysogen chrysograph chrysographer chrysography chrysohermidin chrysoidine chrysolite chrysolitic chrysology Chrysolophus chrysomelid Chrysomelidae chrysomonad Chrysomonadales Chrysomonadina chrysomonadine Chrysomyia Chrysopa chrysopal chrysopee chrysophan chrysophanic Chrysophanus chrysophenine chrysophilist chrysophilite Chrysophlyctis chrysophyll Chrysophyllum chrysopid Chrysopidae chrysopoeia chrysopoetic chrysopoetics chrysoprase Chrysops Chrysopsis chrysorin chrysosperm Chrysosplenium Chrysothamnus Chrysothrix chrysotile Chrysotis chrystocrene chthonian chthonic chthonophagia chthonophagy chub chubbed chubbedness chubbily chubbiness chubby Chuchona Chuck chuck chucker chuckhole chuckies chucking chuckingly chuckle chucklehead chuckleheaded chuckler chucklingly chuckrum chuckstone chuckwalla chucky Chud chuddar Chude Chudic Chueta chufa chuff chuffy chug chugger chuhra Chuje chukar Chukchi chukker chukor chulan chullpa chum Chumashan Chumawi chummage chummer chummery chummily chummy chump chumpaka chumpish chumpishness Chumpivilca chumpy chumship Chumulu Chun chun chunari Chuncho chunga chunk chunkhead chunkily chunkiness chunky chunner chunnia chunter chupak chupon chuprassie chuprassy church churchanity churchcraft churchdom churchful churchgoer churchgoing churchgrith churchianity churchified churchiness churching churchish churchism churchite churchless churchlet churchlike churchliness churchly churchman churchmanly churchmanship churchmaster churchscot churchward churchwarden churchwardenism churchwardenize churchwardenship churchwards churchway churchwise churchwoman churchy churchyard churel churinga churl churled churlhood churlish churlishly churlishness churly churm churn churnability churnful churning churnmilk churnstaff Churoya Churoyan churr Churrigueresque churruck churrus churrworm chut chute chuter chutney Chuvash Chwana chyack chyak chylaceous chylangioma chylaqueous chyle chylemia chylidrosis chylifaction chylifactive chylifactory chyliferous chylific chylification chylificatory chyliform chylify chylocaulous chylocauly chylocele chylocyst chyloid chylomicron chylopericardium chylophyllous chylophylly chylopoiesis chylopoietic chylosis chylothorax chylous chyluria chymaqueous chymase chyme chymia chymic chymiferous chymification chymify chymosin chymosinogen chymotrypsin chymotrypsinogen chymous chypre chytra chytrid Chytridiaceae chytridiaceous chytridial Chytridiales chytridiose chytridiosis Chytridium Chytroi cibarial cibarian cibarious cibation cibol Cibola Cibolan Ciboney cibophobia ciborium cibory ciboule cicad cicada Cicadellidae cicadid Cicadidae cicala cicatrice cicatrices cicatricial cicatricle cicatricose cicatricula cicatricule cicatrisive cicatrix cicatrizant cicatrizate cicatrization cicatrize cicatrizer cicatrose Cicely cicely cicer ciceronage cicerone ciceroni Ciceronian Ciceronianism Ciceronianize Ciceronic Ciceronically ciceronism ciceronize cichlid Cichlidae cichloid cichoraceous Cichoriaceae cichoriaceous Cichorium Cicindela cicindelid cicindelidae cicisbeism ciclatoun Ciconia Ciconiae ciconian ciconiid Ciconiidae ciconiiform Ciconiiformes ciconine ciconioid Cicuta cicutoxin Cid cidarid Cidaridae cidaris Cidaroida cider ciderish ciderist ciderkin cig cigala cigar cigaresque cigarette cigarfish cigarillo cigarito cigarless cigua ciguatera cilectomy cilia ciliary Ciliata ciliate ciliated ciliately ciliation cilice Cilician cilicious Cilicism ciliella ciliferous ciliform ciliiferous ciliiform Cilioflagellata cilioflagellate ciliograde ciliolate ciliolum Ciliophora cilioretinal cilioscleral ciliospinal ciliotomy cilium cillosis cimbia Cimbri Cimbrian Cimbric cimelia cimex cimicid Cimicidae cimicide cimiciform Cimicifuga cimicifugin cimicoid ciminite cimline Cimmeria Cimmerian Cimmerianism cimolite cinch cincher cincholoipon cincholoiponic cinchomeronic Cinchona Cinchonaceae cinchonaceous cinchonamine cinchonate cinchonia cinchonic cinchonicine cinchonidia cinchonidine cinchonine cinchoninic cinchonism cinchonization cinchonize cinchonology cinchophen cinchotine cinchotoxine cincinnal Cincinnati Cincinnatia Cincinnatian cincinnus Cinclidae Cinclidotus cinclis Cinclus cinct cincture cinder Cinderella cinderlike cinderman cinderous cindery Cindie Cindy cine cinecamera cinefilm cinel cinema Cinemascope cinematic cinematical cinematically cinematize cinematograph cinematographer cinematographic cinematographical cinematographically cinematographist cinematography cinemelodrama cinemize cinemograph cinenchyma cinenchymatous cinene cinenegative cineole cineolic cinephone cinephotomicrography cineplastics cineplasty cineraceous Cinerama Cineraria cinerarium cinerary cineration cinerator cinerea cinereal cinereous cineritious cinevariety cingle cingular cingulate cingulated cingulum cinnabar cinnabaric cinnabarine cinnamal cinnamaldehyde cinnamate cinnamein cinnamene cinnamenyl cinnamic Cinnamodendron cinnamol cinnamomic Cinnamomum cinnamon cinnamoned cinnamonic cinnamonlike cinnamonroot cinnamonwood cinnamyl cinnamylidene cinnoline cinnyl cinquain cinque cinquecentism cinquecentist cinquecento cinquefoil cinquefoiled cinquepace cinter Cinura cinuran cinurous cion cionectomy cionitis cionocranial cionocranian cionoptosis cionorrhaphia cionotome cionotomy Cipango cipher cipherable cipherdom cipherer cipherhood cipo cipolin cippus circa Circaea Circaeaceae Circaetus Circassian Circassic Circe Circean Circensian circinal circinate circinately circination Circinus circiter circle circled circler circlet circlewise circling circovarian circuit circuitable circuital circuiteer circuiter circuition circuitman circuitor circuitous circuitously circuitousness circuity circulable circulant circular circularism circularity circularization circularize circularizer circularly circularness circularwise circulate circulation circulative circulator circulatory circumagitate circumagitation circumambages circumambagious circumambience circumambiency circumambient circumambulate circumambulation circumambulator circumambulatory circumanal circumantarctic circumarctic circumarticular circumaviate circumaviation circumaviator circumaxial circumaxile circumaxillary circumbasal circumbendibus circumboreal circumbuccal circumbulbar circumcallosal Circumcellion circumcenter circumcentral circumcinct circumcincture circumcircle circumcise circumciser circumcision circumclude circumclusion circumcolumnar circumcone circumconic circumcorneal circumcrescence circumcrescent circumdenudation circumdiction circumduce circumduct circumduction circumesophagal circumesophageal circumference circumferential circumferentially circumferentor circumflant circumflect circumflex circumflexion circumfluence circumfluent circumfluous circumforaneous circumfulgent circumfuse circumfusile circumfusion circumgenital circumgyrate circumgyration circumgyratory circumhorizontal circumincession circuminsession circuminsular circumintestinal circumitineration circumjacence circumjacency circumjacent circumlental circumlitio circumlittoral circumlocute circumlocution circumlocutional circumlocutionary circumlocutionist circumlocutory circummeridian circummeridional circummigration circummundane circummure circumnatant circumnavigable circumnavigate circumnavigation circumnavigator circumnavigatory circumneutral circumnuclear circumnutate circumnutation circumnutatory circumocular circumoesophagal circumoral circumorbital circumpacific circumpallial circumparallelogram circumpentagon circumplicate circumplication circumpolar circumpolygon circumpose circumposition circumradius circumrenal circumrotate circumrotation circumrotatory circumsail circumscissile circumscribable circumscribe circumscribed circumscriber circumscript circumscription circumscriptive circumscriptively circumscriptly circumsinous circumspangle circumspatial circumspect circumspection circumspective circumspectively circumspectly circumspectness circumspheral circumstance circumstanced circumstantiability circumstantiable circumstantial circumstantiality circumstantially circumstantialness circumstantiate circumstantiation circumtabular circumterraneous circumterrestrial circumtonsillar circumtropical circumumbilical circumundulate circumundulation circumvallate circumvallation circumvascular circumvent circumventer circumvention circumventive circumventor circumviate circumvolant circumvolute circumvolution circumvolutory circumvolve circumzenithal circus circusy cirque cirrate cirrated Cirratulidae Cirratulus Cirrhopetalum cirrhosed cirrhosis cirrhotic cirrhous cirri cirribranch cirriferous cirriform cirrigerous cirrigrade cirriped Cirripedia cirripedial cirrolite cirropodous cirrose Cirrostomi cirrous cirrus cirsectomy Cirsium cirsocele cirsoid cirsomphalos cirsophthalmia cirsotome cirsotomy ciruela cirurgian Cisalpine cisalpine Cisalpinism cisandine cisatlantic cisco cise cisele cisgangetic cisjurane cisleithan cismarine Cismontane cismontane Cismontanism cisoceanic cispadane cisplatine cispontine cisrhenane Cissampelos cissing cissoid cissoidal Cissus cist cista Cistaceae cistaceous cistae cisted Cistercian Cistercianism cistern cisterna cisternal cistic cistophoric cistophorus Cistudo Cistus cistvaen cit citable citadel citation citator citatory cite citee Citellus citer citess cithara Citharexylum citharist citharista citharoedi citharoedic citharoedus cither citied citification citified citify Citigradae citigrade citizen citizendom citizeness citizenhood citizenish citizenism citizenize citizenly citizenry citizenship citole citraconate citraconic citral citramide citramontane citrange citrangeade citrate citrated citrean citrene citreous citric citriculture citriculturist citril citrin citrination citrine citrinin citrinous citrometer Citromyces citron citronade citronella citronellal citronelle citronellic citronellol citronin citronwood Citropsis citropten citrous citrullin Citrullus Citrus citrus citrylidene cittern citua city citycism citydom cityfolk cityful cityish cityless cityness cityscape cityward citywards cive civet civetlike civetone civic civically civicism civics civil civilian civility civilizable civilization civilizational civilizatory civilize civilized civilizedness civilizee civilizer civilly civilness civism Civitan civvy cixiid Cixiidae Cixo clabber clabbery clachan clack Clackama clackdish clacker clacket clackety clad cladanthous cladautoicous cladding cladine cladocarpous Cladocera cladoceran cladocerous cladode cladodial cladodont cladodontid Cladodontidae Cladodus cladogenous Cladonia Cladoniaceae cladoniaceous cladonioid Cladophora Cladophoraceae cladophoraceous Cladophorales cladophyll cladophyllum cladoptosis cladose Cladoselache Cladoselachea cladoselachian Cladoselachidae cladosiphonic Cladosporium Cladothrix Cladrastis cladus clag claggum claggy Claiborne Claibornian claim claimable claimant claimer claimless clairaudience clairaudient clairaudiently clairce Claire clairecole clairecolle clairschach clairschacher clairsentience clairsentient clairvoyance clairvoyancy clairvoyant clairvoyantly claith claithes claiver Clallam clam clamant clamantly clamative Clamatores clamatorial clamatory clamb clambake clamber clamberer clamcracker clame clamer clammed clammer clammily clamminess clamming clammish clammy clammyweed clamor clamorer clamorist clamorous clamorously clamorousness clamorsome clamp clamper clamshell clamworm clan clancular clancularly clandestine clandestinely clandestineness clandestinity clanfellow clang clangful clangingly clangor clangorous clangorously Clangula clanjamfray clanjamfrey clanjamfrie clanjamphrey clank clankety clanking clankingly clankingness clankless clanless clanned clanning clannishly clannishness clansfolk clanship clansman clansmanship clanswoman Claosaurus clap clapboard clapbread clapmatch clapnet clapped clapper clapperclaw clapperclawer clapperdudgeon clappermaclaw clapping clapt claptrap clapwort claque claquer Clara clarabella clarain Clare Clarence Clarenceux Clarenceuxship Clarencieux clarendon claret Claretian Claribel claribella Clarice clarifiant clarification clarifier clarify clarigation clarin Clarinda clarinet clarinetist clarinettist clarion clarionet Clarissa Clarisse Clarist clarity Clark clark clarkeite Clarkia claro Claromontane clarshech clart clarty clary clash clasher clashingly clashy clasmatocyte clasmatosis clasp clasper clasping claspt class classable classbook classed classer classes classfellow classic classical classicalism classicalist classicality classicalize classically classicalness classicism classicist classicistic classicize classicolatry classifiable classific classifically classification classificational classificator classificatory classified classifier classis classism classman classmanship classmate classroom classwise classwork classy clastic clat clatch Clathraceae clathraceous Clathraria clathrarian clathrate Clathrina Clathrinidae clathroid clathrose clathrulate Clathrus Clatsop clatter clatterer clatteringly clattertrap clattery clatty Claude claudent claudetite Claudia Claudian claudicant claudicate claudication Claudio Claudius claught clausal clause Clausilia Clausiliidae clausthalite claustra claustral claustration claustrophobia claustrum clausula clausular clausule clausure claut clava clavacin claval Clavaria Clavariaceae clavariaceous clavate clavated clavately clavation clave clavecin clavecinist clavel clavelization clavelize clavellate clavellated claver clavial claviature clavicembalo Claviceps clavichord clavichordist clavicithern clavicle clavicorn clavicornate Clavicornes Clavicornia clavicotomy clavicular clavicularium claviculate claviculus clavicylinder clavicymbal clavicytherium clavier clavierist claviform claviger clavigerous claviharp clavilux claviol clavipectoral clavis clavodeltoid clavodeltoideus clavola clavolae clavolet clavus clavy claw clawed clawer clawk clawker clawless Clay clay claybank claybrained clayen clayer clayey clayiness clayish claylike clayman claymore Clayoquot claypan Clayton Claytonia clayware clayweed cleach clead cleaded cleading cleam cleamer clean cleanable cleaner cleanhanded cleanhandedness cleanhearted cleaning cleanish cleanlily cleanliness cleanly cleanness cleanout cleansable cleanse cleanser cleansing cleanskins cleanup clear clearable clearage clearance clearcole clearedness clearer clearheaded clearheadedly clearheadedness clearhearted clearing clearinghouse clearish clearly clearness clearskins clearstarch clearweed clearwing cleat cleavability cleavable cleavage cleave cleaveful cleavelandite cleaver cleavers cleaverwort cleaving cleavingly cleche cleck cled cledge cledgy cledonism clee cleek cleeked cleeky clef cleft clefted cleg cleidagra cleidarthritis cleidocostal cleidocranial cleidohyoid cleidomancy cleidomastoid cleidorrhexis cleidoscapular cleidosternal cleidotomy cleidotripsy cleistocarp cleistocarpous cleistogamic cleistogamically cleistogamous cleistogamously cleistogamy cleistogene cleistogenous cleistogeny cleistothecium Cleistothecopsis cleithral cleithrum Clem clem Clematis clematite Clemclemalats clemence clemency Clement clement Clementina Clementine clemently clench cleoid Cleome Cleopatra clep Clepsine clepsydra cleptobiosis cleptobiotic clerestoried clerestory clergy clergyable clergylike clergyman clergywoman cleric clerical clericalism clericalist clericality clericalize clerically clericate clericature clericism clericity clerid Cleridae clerihew clerisy clerk clerkage clerkdom clerkery clerkess clerkhood clerking clerkish clerkless clerklike clerkliness clerkly clerkship Clerodendron cleromancy cleronomy cleruch cleruchial cleruchic cleruchy Clerus cletch Clethra Clethraceae clethraceous cleuch cleve cleveite clever cleverality cleverish cleverishly cleverly cleverness clevis clew cliack clianthus cliche click clicker clicket clickless clicky Clidastes cliency client clientage cliental cliented clientelage clientele clientless clientry clientship Cliff cliff cliffed cliffless clifflet clifflike Clifford cliffside cliffsman cliffweed cliffy clift Cliftonia cliftonite clifty clima Climaciaceae climaciaceous Climacium climacteric climacterical climacterically climactic climactical climactically climacus climata climatal climate climath climatic climatical climatically Climatius climatize climatographical climatography climatologic climatological climatologically climatologist climatology climatometer climatotherapeutics climatotherapy climature climax climb climbable climber climbing clime climograph clinal clinamen clinamina clinandria clinandrium clinanthia clinanthium clinch clincher clinchingly clinchingness cline cling clinger clingfish clinging clingingly clingingness clingstone clingy clinia clinic clinical clinically clinician clinicist clinicopathological clinium clink clinker clinkerer clinkery clinking clinkstone clinkum clinoaxis clinocephalic clinocephalism clinocephalous clinocephalus clinocephaly clinochlore clinoclase clinoclasite clinodiagonal clinodomatic clinodome clinograph clinographic clinohedral clinohedrite clinohumite clinoid clinologic clinology clinometer clinometric clinometrical clinometry clinopinacoid clinopinacoidal Clinopodium clinoprism clinopyramid clinopyroxene clinorhombic clinospore clinostat clinquant clint clinting Clinton Clintonia clintonite clinty Clio Cliona Clione clip clipei clipeus clippable clipped clipper clipperman clipping clips clipse clipsheet clipsome clipt clique cliquedom cliqueless cliquish cliquishly cliquishness cliquism cliquy cliseometer clisere clishmaclaver Clisiocampa Clistogastra clit clitch clite clitella clitellar clitelliferous clitelline clitellum clitellus clites clithe clithral clithridiate clitia clition Clitocybe Clitoria clitoridauxe clitoridean clitoridectomy clitoriditis clitoridotomy clitoris clitorism clitoritis clitter clitterclatter clival clive clivers Clivia clivis clivus cloaca cloacal cloacaline cloacean cloacinal cloacinean cloacitis cloak cloakage cloaked cloakedly cloaking cloakless cloaklet cloakmaker cloakmaking cloakroom cloakwise cloam cloamen cloamer clobber clobberer clochan cloche clocher clochette clock clockbird clockcase clocked clocker clockface clockhouse clockkeeper clockless clocklike clockmaker clockmaking clockmutch clockroom clocksmith clockwise clockwork clod clodbreaker clodder cloddily cloddiness cloddish cloddishly cloddishness cloddy clodhead clodhopper clodhopping clodlet clodpate clodpated clodpoll cloff clog clogdogdo clogger cloggily clogginess cloggy cloghad cloglike clogmaker clogmaking clogwood clogwyn cloiochoanitic cloisonless cloisonne cloister cloisteral cloistered cloisterer cloisterless cloisterlike cloisterliness cloisterly cloisterwise cloistral cloistress cloit clomb clomben clonal clone clonic clonicity clonicotonic clonism clonorchiasis Clonorchis Clonothrix clonus cloof cloop cloot clootie clop cloragen clorargyrite cloriodid closable close closecross closed closefisted closefistedly closefistedness closehanded closehearted closely closemouth closemouthed closen closeness closer closestool closet closewing closh closish closter Closterium clostridial Clostridium closure clot clotbur clote cloth clothbound clothe clothes clothesbag clothesbasket clothesbrush clotheshorse clothesline clothesman clothesmonger clothespin clothespress clothesyard clothier clothify Clothilda clothing clothmaker clothmaking Clotho clothworker clothy clottage clottedness clotter clotty cloture clotweed cloud cloudage cloudberry cloudburst cloudcap clouded cloudful cloudily cloudiness clouding cloudland cloudless cloudlessly cloudlessness cloudlet cloudlike cloudling cloudology cloudscape cloudship cloudward cloudwards cloudy clough clour clout clouted clouter clouterly clouty clove cloven clovene clover clovered cloverlay cloverleaf cloveroot cloverroot clovery clow clown clownade clownage clownery clownheal clownish clownishly clownishness clownship clowring cloy cloyedness cloyer cloying cloyingly cloyingness cloyless cloysome club clubbability clubbable clubbed clubber clubbily clubbing clubbish clubbism clubbist clubby clubdom clubfellow clubfisted clubfoot clubfooted clubhand clubhaul clubhouse clubionid Clubionidae clubland clubman clubmate clubmobile clubmonger clubridden clubroom clubroot clubstart clubster clubweed clubwoman clubwood cluck clue cluff clump clumpish clumproot clumpy clumse clumsily clumsiness clumsy clunch clung Cluniac Cluniacensian Clunisian Clunist clunk clupanodonic Clupea clupeid Clupeidae clupeiform clupeine Clupeodei clupeoid cluricaune Clusia Clusiaceae clusiaceous cluster clusterberry clustered clusterfist clustering clusteringly clustery clutch clutchman cluther clutter clutterer clutterment cluttery cly Clyde Clydesdale Clydeside Clydesider clyer clyfaker clyfaking Clymenia clype clypeal Clypeaster Clypeastridea Clypeastrina clypeastroid Clypeastroida Clypeastroidea clypeate clypeiform clypeolar clypeolate clypeole clypeus clysis clysma clysmian clysmic clyster clysterize Clytemnestra cnemapophysis cnemial cnemidium Cnemidophorus cnemis Cneoraceae cneoraceous Cneorum cnicin Cnicus cnida Cnidaria cnidarian Cnidian cnidoblast cnidocell cnidocil cnidocyst cnidophore cnidophorous cnidopod cnidosac Cnidoscolus cnidosis coabode coabound coabsume coacceptor coacervate coacervation coach coachability coachable coachbuilder coachbuilding coachee coacher coachfellow coachful coaching coachlet coachmaker coachmaking coachman coachmanship coachmaster coachsmith coachsmithing coachway coachwhip coachwise coachwoman coachwork coachwright coachy coact coaction coactive coactively coactivity coactor coadamite coadapt coadaptation coadequate coadjacence coadjacency coadjacent coadjacently coadjudicator coadjust coadjustment coadjutant coadjutator coadjute coadjutement coadjutive coadjutor coadjutorship coadjutress coadjutrix coadjuvancy coadjuvant coadjuvate coadminister coadministration coadministrator coadministratrix coadmiration coadmire coadmit coadnate coadore coadsorbent coadunate coadunation coadunative coadunatively coadunite coadventure coadventurer coadvice coaffirmation coafforest coaged coagency coagent coaggregate coaggregated coaggregation coagitate coagitator coagment coagonize coagriculturist coagula coagulability coagulable coagulant coagulase coagulate coagulation coagulative coagulator coagulatory coagulin coagulometer coagulose coagulum Coahuiltecan coaid coaita coak coakum coal coalbag coalbagger coalbin coalbox coaldealer coaler coalesce coalescence coalescency coalescent coalfish coalfitter coalhole coalification coalify Coalite coalition coalitional coalitioner coalitionist coalize coalizer coalless coalmonger coalmouse coalpit coalrake coalsack coalternate coalternation coalternative coaltitude coaly coalyard coambassador coambulant coamiable coaming Coan coanimate coannex coannihilate coapostate coapparition coappear coappearance coapprehend coapprentice coappriser coapprover coapt coaptate coaptation coaration coarb coarbiter coarbitrator coarctate coarctation coardent coarrange coarrangement coarse coarsely coarsen coarseness coarsish coascend coassert coasserter coassession coassessor coassignee coassist coassistance coassistant coassume coast coastal coastally coaster Coastguard coastguardman coasting coastland coastman coastside coastwaiter coastward coastwards coastways coastwise coat coated coatee coater coati coatie coatimondie coatimundi coating coatless coatroom coattail coattailed coattend coattest coattestation coattestator coaudience coauditor coaugment coauthor coauthority coauthorship coawareness coax coaxal coaxation coaxer coaxial coaxially coaxing coaxingly coaxy cob cobaea cobalt cobaltammine cobaltic cobalticyanic cobalticyanides cobaltiferous cobaltinitrite cobaltite cobaltocyanic cobaltocyanide cobaltous cobang cobbed cobber cobberer cobbing cobble cobbler cobblerfish cobblerism cobblerless cobblership cobblery cobblestone cobbling cobbly cobbra cobby cobcab Cobdenism Cobdenite cobego cobelief cobeliever cobelligerent cobenignity coberger cobewail cobhead cobia cobiron cobishop Cobitidae Cobitis coble cobleman Coblentzian Cobleskill cobless cobloaf cobnut cobola coboundless cobourg cobra cobreathe cobridgehead cobriform cobrother cobstone coburg coburgess coburgher coburghership Cobus cobweb cobwebbery cobwebbing cobwebby cobwork coca cocaceous cocaine cocainism cocainist cocainization cocainize cocainomania cocainomaniac Cocama Cocamama cocamine Cocanucos cocarboxylase cocash cocashweed cocause cocautioner Coccaceae coccagee coccal Cocceian Cocceianism coccerin cocci coccid Coccidae coccidia coccidial coccidian Coccidiidea coccidioidal Coccidioides Coccidiomorpha coccidiosis coccidium coccidology cocciferous cocciform coccigenic coccinella coccinellid Coccinellidae coccionella cocco coccobacillus coccochromatic Coccogonales coccogone Coccogoneae coccogonium coccoid coccolite coccolith coccolithophorid Coccolithophoridae Coccoloba Coccolobis Coccomyces coccosphere coccostean coccosteid Coccosteidae Coccosteus Coccothraustes coccothraustine Coccothrinax coccous coccule cocculiferous Cocculus cocculus coccus coccydynia coccygalgia coccygeal coccygean coccygectomy coccygerector coccyges coccygeus coccygine coccygodynia coccygomorph Coccygomorphae coccygomorphic coccygotomy coccyodynia coccyx Coccyzus cocentric cochairman cochal cochief Cochin cochineal cochlea cochlear cochleare Cochlearia cochlearifoliate cochleariform cochleate cochleated cochleiform cochleitis cochleous cochlidiid Cochlidiidae cochliodont Cochliodontidae Cochliodus Cochlospermaceae cochlospermaceous Cochlospermum Cochranea cochurchwarden cocillana cocircular cocircularity cocitizen cocitizenship cock cockade cockaded Cockaigne cockal cockalorum cockamaroo cockarouse cockateel cockatoo cockatrice cockawee cockbell cockbill cockbird cockboat cockbrain cockchafer cockcrow cockcrower cockcrowing cocked Cocker cocker cockerel cockermeg cockernony cocket cockeye cockeyed cockfight cockfighting cockhead cockhorse cockieleekie cockily cockiness cocking cockish cockle cockleboat cocklebur cockled cockler cockleshell cocklet cocklewife cocklight cockling cockloft cockly cockmaster cockmatch cockmate cockneian cockneity cockney cockneybred cockneydom cockneyese cockneyess cockneyfication cockneyfy cockneyish cockneyishly cockneyism cockneyize cockneyland cockneyship cockpit cockroach cockscomb cockscombed cocksfoot cockshead cockshot cockshut cockshy cockshying cockspur cockstone cocksure cocksuredom cocksureism cocksurely cocksureness cocksurety cocktail cockthrowing cockup cockweed cocky Cocle coco cocoa cocoach cocobolo Coconino coconnection coconqueror coconscious coconsciously coconsciousness coconsecrator coconspirator coconstituent cocontractor Coconucan Coconuco coconut cocoon cocoonery cocorico cocoroot Cocos cocotte cocovenantor cocowood cocowort cocozelle cocreate cocreator cocreatorship cocreditor cocrucify coctile coction coctoantigen coctoprecipitin cocuisa cocullo cocurator cocurrent cocuswood cocuyo Cocytean Cocytus cod coda codamine codbank codder codding coddle coddler code codebtor codeclination codecree codefendant codeine codeless codelight codelinquency codelinquent codenization codeposit coder coderive codescendant codespairer codex codfish codfisher codfishery codger codhead codheaded Codiaceae codiaceous Codiaeum Codiales codical codices codicil codicilic codicillary codictatorship codification codifier codify codilla codille codiniac codirectional codirector codiscoverer codisjunct codist Codium codivine codling codman codo codol codomestication codominant codon codpiece codpitchings Codrus codshead codworm coe coecal coecum coed coeditor coeditorship coeducate coeducation coeducational coeducationalism coeducationalize coeducationally coeffect coefficacy coefficient coefficiently coeffluent coeffluential coelacanth coelacanthid Coelacanthidae coelacanthine Coelacanthini coelacanthoid coelacanthous coelanaglyphic coelar coelarium Coelastraceae coelastraceous Coelastrum Coelata coelder coeldership Coelebogyne coelect coelection coelector coelectron coelelminth Coelelminthes coelelminthic Coelentera Coelenterata coelenterate coelenteric coelenteron coelestine coelevate coelho coelia coeliac coelialgia coelian Coelicolae Coelicolist coeligenous coelin coeline coeliomyalgia coeliorrhea coeliorrhoea coelioscopy coeliotomy coeloblastic coeloblastula Coelococcus coelodont coelogastrula Coeloglossum Coelogyne coelom coeloma Coelomata coelomate coelomatic coelomatous coelomesoblast coelomic Coelomocoela coelomopore coelonavigation coelongated coeloplanula coelosperm coelospermous coelostat coelozoic coemanate coembedded coembody coembrace coeminency coemperor coemploy coemployee coemployment coempt coemption coemptional coemptionator coemptive coemptor coenact coenactor coenaculous coenamor coenamorment coenamourment coenanthium coendear Coendidae Coendou coendure coenenchym coenenchyma coenenchymal coenenchymatous coenenchyme coenesthesia coenesthesis coenflame coengage coengager coenjoy coenobe coenobiar coenobic coenobioid coenobium coenoblast coenoblastic coenocentrum coenocyte coenocytic coenodioecism coenoecial coenoecic coenoecium coenogamete coenomonoecism coenosarc coenosarcal coenosarcous coenosite coenospecies coenospecific coenospecifically coenosteal coenosteum coenotrope coenotype coenotypic coenthrone coenurus coenzyme coequal coequality coequalize coequally coequalness coequate coequated coequation coerce coercement coercer coercibility coercible coercibleness coercibly coercion coercionary coercionist coercitive coercive coercively coerciveness coercivity Coerebidae coeruleolactite coessential coessentiality coessentially coessentialness coestablishment coestate coetaneity coetaneous coetaneously coetaneousness coeternal coeternally coeternity coetus coeval coevality coevally coexchangeable coexclusive coexecutant coexecutor coexecutrix coexert coexertion coexist coexistence coexistency coexistent coexpand coexpanded coexperiencer coexpire coexplosion coextend coextension coextensive coextensively coextensiveness coextent cofactor Cofane cofaster cofather cofathership cofeature cofeoffee coferment cofermentation coff Coffea coffee coffeebush coffeecake coffeegrower coffeegrowing coffeehouse coffeeleaf coffeepot coffeeroom coffeetime coffeeweed coffeewood coffer cofferdam cofferer cofferfish coffering cofferlike cofferwork coffin coffinless coffinmaker coffinmaking coffle coffret cofighter coforeknown coformulator cofounder cofoundress cofreighter coft cofunction cog cogence cogency cogener cogeneric cogent cogently cogged cogger coggie cogging coggle coggledy cogglety coggly coghle cogitability cogitable cogitabund cogitabundity cogitabundly cogitabundous cogitant cogitantly cogitate cogitatingly cogitation cogitative cogitatively cogitativeness cogitativity cogitator coglorify coglorious cogman cognac cognate cognateness cognatic cognatical cognation cognisable cognisance cognition cognitional cognitive cognitively cognitum cognizability cognizable cognizableness cognizably cognizance cognizant cognize cognizee cognizer cognizor cognomen cognominal cognominate cognomination cognosce cognoscent cognoscibility cognoscible cognoscitive cognoscitively cogon cogonal cogovernment cogovernor cogracious cograil cogrediency cogredient cogroad Cogswellia coguarantor coguardian cogue cogway cogwheel cogwood cohabit cohabitancy cohabitant cohabitation coharmonious coharmoniously coharmonize coheartedness coheir coheiress coheirship cohelper cohelpership Cohen cohenite coherald cohere coherence coherency coherent coherently coherer coheretic coheritage coheritor cohesibility cohesible cohesion cohesive cohesively cohesiveness cohibit cohibition cohibitive cohibitor coho cohoba cohobate cohobation cohobator cohol cohort cohortation cohortative cohosh cohune cohusband coidentity coif coifed coiffure coign coigue coil coiled coiler coiling coilsmith coimmense coimplicant coimplicate coimplore coin coinable coinage coincide coincidence coincidency coincident coincidental coincidentally coincidently coincider coinclination coincline coinclude coincorporate coindicant coindicate coindication coindwelling coiner coinfeftment coinfer coinfinite coinfinity coinhabit coinhabitant coinhabitor coinhere coinherence coinherent coinheritance coinheritor coining coinitial coinmaker coinmaking coinmate coinspire coinstantaneity coinstantaneous coinstantaneously coinstantaneousness coinsurance coinsure cointense cointension cointensity cointer cointerest cointersecting cointise Cointreau coinventor coinvolve coiny coir coislander coistrel coistril coital coition coiture coitus Coix cojudge cojuror cojusticiar coke cokelike cokeman coker cokernut cokery coking coky col Cola cola colaborer Colada colalgia Colan colander colane colarin colate colation colatitude colatorium colature colauxe colback colberter colbertine Colbertism colcannon Colchian Colchicaceae colchicine Colchicum Colchis colchyte Colcine colcothar cold colder coldfinch coldhearted coldheartedly coldheartedness coldish coldly coldness coldproof coldslaw Cole cole coleader colecannon colectomy Coleen colegatee colegislator colemanite colemouse Coleochaetaceae coleochaetaceous Coleochaete Coleophora Coleophoridae coleopter Coleoptera coleopteral coleopteran coleopterist coleopteroid coleopterological coleopterology coleopteron coleopterous coleoptile coleoptilum coleorhiza Coleosporiaceae Coleosporium coleplant coleseed coleslaw colessee colessor coletit coleur Coleus colewort coli Colias colibacillosis colibacterin colibri colic colical colichemarde colicky colicolitis colicroot colicweed colicwort colicystitis colicystopyelitis coliform Coliidae Coliiformes colilysin Colima colima Colin colin colinear colinephritis coling Colinus coliplication colipuncture colipyelitis colipyuria colisepsis Coliseum coliseum colitic colitis colitoxemia coliuria Colius colk coll Colla collaborate collaboration collaborationism collaborationist collaborative collaboratively collaborator collage collagen collagenic collagenous collapse collapsibility collapsible collar collarband collarbird collarbone collard collare collared collaret collarino collarless collarman collatable collate collatee collateral collaterality collaterally collateralness collation collationer collatitious collative collator collatress collaud collaudation colleague colleagueship collect collectability collectable collectanea collectarium collected collectedly collectedness collectibility collectible collection collectional collectioner collective collectively collectiveness collectivism collectivist collectivistic collectivistically collectivity collectivization collectivize collector collectorate collectorship collectress colleen collegatary college colleger collegial collegialism collegiality collegian collegianer Collegiant collegiate collegiately collegiateness collegiation collegium Collembola collembolan collembole collembolic collembolous collenchyma collenchymatic collenchymatous collenchyme collencytal collencyte Colleri Colleries Collery collery collet colleter colleterial colleterium Colletes Colletia colletic Colletidae colletin Colletotrichum colletside colley collibert colliculate colliculus collide collidine collie collied collier colliery collieshangie colliform colligate colligation colligative colligible collimate collimation collimator Collin collin collinal colline collinear collinearity collinearly collineate collineation colling collingly collingual Collins collins Collinsia collinsite Collinsonia colliquate colliquation colliquative colliquativeness collision collisional collisive colloblast collobrierite collocal Collocalia collocate collocation collocationable collocative collocatory collochemistry collochromate collock collocution collocutor collocutory collodiochloride collodion collodionization collodionize collodiotype collodium collogue colloid colloidal colloidality colloidize colloidochemical Collomia collop colloped collophanite collophore colloque colloquia colloquial colloquialism colloquialist colloquiality colloquialize colloquially colloquialness colloquist colloquium colloquize colloquy collothun collotype collotypic collotypy colloxylin colluctation collude colluder collum collumelliaceous collusion collusive collusively collusiveness collutorium collutory colluvial colluvies colly collyba Collybia Collyridian collyrite collyrium collywest collyweston collywobbles colmar colobin colobium coloboma Colobus Colocasia colocentesis Colocephali colocephalous coloclysis colocola colocolic colocynth colocynthin colodyspepsia coloenteritis cologarithm Cologne cololite Colombian colombier colombin Colombina colometric colometrically colometry colon colonalgia colonate colonel colonelcy colonelship colongitude colonial colonialism colonialist colonialize colonially colonialness colonic colonist colonitis colonizability colonizable colonization colonizationist colonize colonizer colonnade colonnaded colonnette colonopathy colonopexy colonoscope colonoscopy colony colopexia colopexotomy colopexy colophane colophany colophene colophenic colophon colophonate Colophonian colophonic colophonist colophonite colophonium colophony coloplication coloproctitis coloptosis colopuncture coloquintid coloquintida color colorability colorable colorableness colorably Coloradan Colorado colorado coloradoite colorant colorate coloration colorational colorationally colorative coloratura colorature colorcast colorectitis colorectostomy colored colorer colorfast colorful colorfully colorfulness colorific colorifics colorimeter colorimetric colorimetrical colorimetrically colorimetrics colorimetrist colorimetry colorin coloring colorist coloristic colorization colorize colorless colorlessly colorlessness colormaker colormaking colorman colorrhaphy colors colortype Colorum colory coloss colossal colossality colossally colossean Colosseum colossi Colossian Colossochelys colossus Colossuswise colostomy colostral colostration colostric colostrous colostrum colotomy colotyphoid colove colp colpenchyma colpeo colpeurynter colpeurysis colpindach colpitis colpocele colpocystocele colpohyperplasia colpohysterotomy colpoperineoplasty colpoperineorrhaphy colpoplastic colpoplasty colpoptosis colporrhagia colporrhaphy colporrhea colporrhexis colport colportage colporter colporteur colposcope colposcopy colpotomy colpus Colt colt colter colthood coltish coltishly coltishness coltpixie coltpixy coltsfoot coltskin Coluber colubrid Colubridae colubriform Colubriformes Colubriformia Colubrina Colubrinae colubrine colubroid colugo Columba columbaceous Columbae Columban Columbanian columbarium columbary columbate columbeion Columbella Columbia columbiad Columbian columbic Columbid Columbidae columbier columbiferous Columbiformes columbin Columbine columbine columbite columbium columbo columboid columbotantalate columbotitanate columella columellar columellate Columellia Columelliaceae columelliform column columnal columnar columnarian columnarity columnated columned columner columniation columniferous columniform columning columnist columnization columnwise colunar colure Colutea Colville coly Colymbidae colymbiform colymbion Colymbriformes Colymbus colyone colyonic colytic colyum colyumist colza coma comacine comagistracy comagmatic comaker comal comamie Coman Comanche Comanchean Comandra comanic comart Comarum comate comatose comatosely comatoseness comatosity comatous comatula comatulid comb combaron combat combatable combatant combater combative combatively combativeness combativity combed comber combfish combflower combinable combinableness combinant combinantive combinate combination combinational combinative combinator combinatorial combinatory combine combined combinedly combinedness combinement combiner combing combining comble combless comblessness combmaker combmaking comboloio comboy Combretaceae combretaceous Combretum combure comburendo comburent comburgess comburimeter comburimetry comburivorous combust combustibility combustible combustibleness combustibly combustion combustive combustor combwise combwright comby come comeback Comecrudo comedial comedian comediant comedic comedical comedienne comedietta comedist comedo comedown comedy comelily comeliness comeling comely comendite comenic comephorous comer comes comestible comet cometarium cometary comether cometic cometical cometlike cometographer cometographical cometography cometoid cometology cometwise comeuppance comfit comfiture comfort comfortable comfortableness comfortably comforter comfortful comforting comfortingly comfortless comfortlessly comfortlessness comfortress comfortroot comfrey comfy Comiakin comic comical comicality comically comicalness comicocratic comicocynical comicodidactic comicography comicoprosaic comicotragedy comicotragic comicotragical comicry Comid comiferous Cominform coming comingle comino Comintern comism comital comitant comitatensian comitative comitatus comitia comitial Comitium comitragedy comity comma command commandable commandant commandedness commandeer commander commandership commandery commanding commandingly commandingness commandless commandment commando commandoman commandress commassation commassee commatic commation commatism commeasurable commeasure commeddle Commelina Commelinaceae commelinaceous commemorable commemorate commemoration commemorational commemorative commemoratively commemorativeness commemorator commemoratory commemorize commence commenceable commencement commencer commend commendable commendableness commendably commendador commendam commendatary commendation commendator commendatory commender commendingly commendment commensal commensalism commensalist commensalistic commensality commensally commensurability commensurable commensurableness commensurably commensurate commensurately commensurateness commensuration comment commentarial commentarialism commentary commentate commentation commentator commentatorial commentatorially commentatorship commenter commerce commerceless commercer commerciable commercial commercialism commercialist commercialistic commerciality commercialization commercialize commercially commercium commerge commie comminate commination comminative comminator comminatory commingle comminglement commingler comminister comminuate comminute comminution comminutor Commiphora commiserable commiserate commiseratingly commiseration commiserative commiseratively commiserator commissar commissarial commissariat commissary commissaryship commission commissionaire commissional commissionate commissioner commissionership commissionship commissive commissively commissural commissure commissurotomy commit commitment committable committal committee committeeism committeeman committeeship committeewoman committent committer committible committor commix commixt commixtion commixture commodatary commodate commodation commodatum commode commodious commodiously commodiousness commoditable commodity commodore common commonable commonage commonality commonalty commoner commonership commoney commonish commonition commonize commonly commonness commonplace commonplaceism commonplacely commonplaceness commonplacer commons commonsensible commonsensibly commonsensical commonsensically commonty commonweal commonwealth commonwealthism commorancy commorant commorient commorth commot commotion commotional commotive commove communa communal communalism communalist communalistic communality communalization communalize communalizer communally communard commune communer communicability communicable communicableness communicably communicant communicate communicatee communicating communication communicative communicatively communicativeness communicator communicatory communion communionist communique communism communist communistery communistic communistically communital communitarian communitary communitive communitorium community communization communize commutability commutable commutableness commutant commutate commutation commutative commutatively commutator commute commuter commuting commutual commutuality Comnenian comoid comolecule comortgagee comose comourn comourner comournful comous Comox compact compacted compactedly compactedness compacter compactible compaction compactly compactness compactor compacture compages compaginate compagination companator companion companionability companionable companionableness companionably companionage companionate companionize companionless companionship companionway company comparability comparable comparableness comparably comparascope comparate comparatival comparative comparatively comparativeness comparativist comparator compare comparer comparison comparition comparograph compart compartition compartment compartmental compartmentalization compartmentalize compartmentally compartmentize compass compassable compasser compasses compassing compassion compassionable compassionate compassionately compassionateness compassionless compassive compassivity compassless compaternity compatibility compatible compatibleness compatibly compatriot compatriotic compatriotism compear compearance compearant compeer compel compellable compellably compellation compellative compellent compeller compelling compellingly compend compendency compendent compendia compendiary compendiate compendious compendiously compendiousness compendium compenetrate compenetration compensable compensate compensating compensatingly compensation compensational compensative compensativeness compensator compensatory compense compenser compesce compete competence competency competent competently competentness competition competitioner competitive competitively competitiveness competitor competitorship competitory competitress competitrix compilation compilator compilatory compile compilement compiler compital Compitalia compitum complacence complacency complacent complacential complacentially complacently complain complainable complainant complainer complainingly complainingness complaint complaintive complaintiveness complaisance complaisant complaisantly complaisantness complanar complanate complanation complect complected complement complemental complementally complementalness complementariness complementarism complementary complementation complementative complementer complementoid complete completedness completely completement completeness completer completion completive completively completory complex complexedness complexification complexify complexion complexionably complexional complexionally complexioned complexionist complexionless complexity complexively complexly complexness complexus compliable compliableness compliably compliance compliancy compliant compliantly complicacy complicant complicate complicated complicatedly complicatedness complication complicative complice complicitous complicity complier compliment complimentable complimental complimentally complimentalness complimentarily complimentariness complimentary complimentation complimentative complimenter complimentingly complin complot complotter Complutensian compluvium comply compo compoer compole compone componed componency componendo component componental componented compony comport comportment compos compose composed composedly composedness composer composita Compositae composite compositely compositeness composition compositional compositionally compositive compositively compositor compositorial compositous composograph compossibility compossible compost composture composure compotation compotationship compotator compotatory compote compotor compound compoundable compoundedness compounder compounding compoundness comprachico comprador comprecation compreg compregnate comprehend comprehender comprehendible comprehendingly comprehense comprehensibility comprehensible comprehensibleness comprehensibly comprehension comprehensive comprehensively comprehensiveness comprehensor compresbyter compresbyterial compresence compresent compress compressed compressedly compressibility compressible compressibleness compressingly compression compressional compressive compressively compressometer compressor compressure comprest compriest comprisable comprisal comprise comprised compromise compromiser compromising compromisingly compromissary compromission compromissorial compromit compromitment comprovincial Compsilura Compsoa Compsognathus Compsothlypidae compter Comptometer Comptonia comptroller comptrollership compulsative compulsatively compulsatorily compulsatory compulsed compulsion compulsitor compulsive compulsively compulsiveness compulsorily compulsoriness compulsory compunction compunctionary compunctionless compunctious compunctiously compunctive compurgation compurgator compurgatorial compurgatory compursion computability computable computably computation computational computative computativeness compute computer computist computus comrade comradely comradery comradeship Comsomol comstockery Comtian Comtism Comtist comurmurer Comus con conacaste conacre conal conalbumin conamed Conant conarial conarium conation conational conationalistic conative conatus conaxial concamerate concamerated concameration concanavalin concaptive concassation concatenary concatenate concatenation concatenator concausal concause concavation concave concavely concaveness concaver concavity conceal concealable concealed concealedly concealedness concealer concealment concede conceded concededly conceder conceit conceited conceitedly conceitedness conceitless conceity conceivability conceivable conceivableness conceivably conceive conceiver concelebrate concelebration concent concenter concentive concentralization concentrate concentrated concentration concentrative concentrativeness concentrator concentric concentrically concentricity concentual concentus concept conceptacle conceptacular conceptaculum conception conceptional conceptionist conceptism conceptive conceptiveness conceptual conceptualism conceptualist conceptualistic conceptuality conceptualization conceptualize conceptually conceptus concern concerned concernedly concernedness concerning concerningly concerningness concernment concert concerted concertedly concertgoer concertina concertinist concertist concertize concertizer concertmaster concertmeister concertment concerto concertstuck concessible concession concessionaire concessional concessionary concessioner concessionist concessive concessively concessiveness concessor concettism concettist conch concha conchal conchate conche conched concher Conchifera conchiferous conchiform conchinine conchiolin conchitic conchitis Conchobor conchoid conchoidal conchoidally conchological conchologically conchologist conchologize conchology conchometer conchometry Conchostraca conchotome Conchubar Conchucu conchuela conchy conchyliated conchyliferous conchylium concierge concile conciliable conciliabule conciliabulum conciliar conciliate conciliating conciliatingly conciliation conciliationist conciliative conciliator conciliatorily conciliatoriness conciliatory concilium concinnity concinnous concionator concipiency concipient concise concisely conciseness concision conclamant conclamation conclave conclavist concludable conclude concluder concluding concludingly conclusion conclusional conclusionally conclusive conclusively conclusiveness conclusory concoagulate concoagulation concoct concocter concoction concoctive concoctor concolor concolorous concomitance concomitancy concomitant concomitantly conconscious Concord concord concordal concordance concordancer concordant concordantial concordantly concordat concordatory concorder concordial concordist concordity concorporate Concorrezanes concourse concreate concremation concrement concresce concrescence concrescible concrescive concrete concretely concreteness concreter concretion concretional concretionary concretism concretive concretively concretize concretor concubinage concubinal concubinarian concubinary concubinate concubine concubinehood concubitancy concubitant concubitous concubitus concupiscence concupiscent concupiscible concupiscibleness concupy concur concurrence concurrency concurrent concurrently concurrentness concurring concurringly concursion concurso concursus concuss concussant concussion concussional concussive concutient concyclic concyclically cond Condalia condemn condemnable condemnably condemnate condemnation condemnatory condemned condemner condemning condemningly condensability condensable condensance condensary condensate condensation condensational condensative condensator condense condensed condensedly condensedness condenser condensery condensity condescend condescendence condescendent condescender condescending condescendingly condescendingness condescension condescensive condescensively condescensiveness condiction condictious condiddle condiddlement condign condigness condignity condignly condiment condimental condimentary condisciple condistillation condite condition conditional conditionalism conditionalist conditionality conditionalize conditionally conditionate conditioned conditioner condivision condolatory condole condolement condolence condolent condoler condoling condolingly condominate condominium condonable condonance condonation condonative condone condonement condoner condor conduce conducer conducing conducingly conducive conduciveness conduct conductance conductibility conductible conductility conductimeter conductio conduction conductional conductitious conductive conductively conductivity conductometer conductometric conductor conductorial conductorless conductorship conductory conductress conductus conduit conduplicate conduplicated conduplication condurangin condurango condylar condylarth Condylarthra condylarthrosis condylarthrous condyle condylectomy condylion condyloid condyloma condylomatous condylome condylopod Condylopoda condylopodous condylos condylotomy Condylura condylure cone coned coneen coneflower conehead coneighboring coneine conelet conemaker conemaking Conemaugh conenose conepate coner cones conessine Conestoga confab confabular confabulate confabulation confabulator confabulatory confact confarreate confarreation confated confect confection confectionary confectioner confectionery Confed confederacy confederal confederalist confederate confederater confederatio confederation confederationist confederatism confederative confederatize confederator confelicity conferee conference conferential conferment conferrable conferral conferrer conferruminate conferted Conferva Confervaceae confervaceous conferval Confervales confervoid Confervoideae confervous confess confessable confessant confessarius confessary confessedly confesser confessing confessingly confession confessional confessionalian confessionalism confessionalist confessionary confessionist confessor confessorship confessory confidant confide confidence confidency confident confidential confidentiality confidentially confidentialness confidentiary confidently confidentness confider confiding confidingly confidingness configural configurate configuration configurational configurationally configurationism configurationist configurative configure confinable confine confineable confined confinedly confinedness confineless confinement confiner confining confinity confirm confirmable confirmand confirmation confirmative confirmatively confirmatorily confirmatory confirmed confirmedly confirmedness confirmee confirmer confirming confirmingly confirmity confirmment confirmor confiscable confiscatable confiscate confiscation confiscator confiscatory confitent confiteor confiture confix conflagrant conflagrate conflagration conflagrative conflagrator conflagratory conflate conflated conflation conflict conflicting conflictingly confliction conflictive conflictory conflow confluence confluent confluently conflux confluxibility confluxible confluxibleness confocal conform conformability conformable conformableness conformably conformal conformance conformant conformate conformation conformator conformer conformist conformity confound confoundable confounded confoundedly confoundedness confounder confounding confoundingly confrater confraternal confraternity confraternization confrere confriar confrication confront confrontal confrontation confronte confronter confrontment Confucian Confucianism Confucianist confusability confusable confusably confuse confused confusedly confusedness confusingly confusion confusional confusticate confustication confutable confutation confutative confutator confute confuter conga congeable congeal congealability congealable congealableness congealedness congealer congealment congee congelation congelative congelifraction congeliturbate congeliturbation congener congeneracy congeneric congenerical congenerous congenerousness congenetic congenial congeniality congenialize congenially congenialness congenital congenitally congenitalness conger congeree congest congested congestible congestion congestive congiary congius conglobate conglobately conglobation conglobe conglobulate conglomerate conglomeratic conglomeration conglutin conglutinant conglutinate conglutination conglutinative Congo Congoese Congolese Congoleum congou congratulable congratulant congratulate congratulation congratulational congratulator congratulatory congredient congreet congregable congreganist congregant congregate congregation congregational congregationalism Congregationalist congregationalize congregationally Congregationer congregationist congregative congregativeness congregator Congreso congress congresser congressional congressionalist congressionally congressionist congressist congressive congressman Congresso congresswoman Congreve Congridae congroid congruence congruency congruent congruential congruently congruism congruist congruistic congruity congruous congruously congruousness conhydrine Coniacian conic conical conicality conically conicalness coniceine conichalcite conicine conicity conicle conicoid conicopoly conics Conidae conidia conidial conidian conidiiferous conidioid conidiophore conidiophorous conidiospore conidium conifer Coniferae coniferin coniferophyte coniferous conification coniform Conilurus conima conimene conin conine Coniogramme Coniophora Coniopterygidae Conioselinum coniosis Coniothyrium coniroster conirostral Conirostres Conium conject conjective conjecturable conjecturably conjectural conjecturalist conjecturality conjecturally conjecture conjecturer conjobble conjoin conjoined conjoinedly conjoiner conjoint conjointly conjointment conjointness conjubilant conjugable conjugacy conjugal Conjugales conjugality conjugally conjugant conjugata Conjugatae conjugate conjugated conjugately conjugateness conjugation conjugational conjugationally conjugative conjugator conjugial conjugium conjunct conjunction conjunctional conjunctionally conjunctiva conjunctival conjunctive conjunctively conjunctiveness conjunctivitis conjunctly conjunctur conjunctural conjuncture conjuration conjurator conjure conjurement conjurer conjurership conjuror conjury conk conkanee conker conkers conky conn connach Connaraceae connaraceous connarite Connarus connascency connascent connatal connate connately connateness connation connatural connaturality connaturalize connaturally connaturalness connature connaught connect connectable connectant connected connectedly connectedness connectible connection connectional connectival connective connectively connectivity connector connellite conner connex connexion connexionalism connexity connexive connexivum connexus Connie conning conniption connivance connivancy connivant connivantly connive connivent conniver Connochaetes connoissance connoisseur connoisseurship connotation connotative connotatively connote connotive connotively connubial connubiality connubially connubiate connubium connumerate connumeration Conocarpus Conocephalum Conocephalus conoclinium conocuneus conodont conoid conoidal conoidally conoidic conoidical conoidically Conolophus conominee cononintelligent Conopholis conopid Conopidae conoplain conopodium Conopophaga Conopophagidae Conor Conorhinus conormal conoscope conourish Conoy conphaseolin conplane conquedle conquer conquerable conquerableness conqueress conquering conqueringly conquerment conqueror conquest conquian conquinamine conquinine conquistador Conrad conrector conrectorship conred Conringia consanguine consanguineal consanguinean consanguineous consanguineously consanguinity conscience conscienceless consciencelessly consciencelessness consciencewise conscient conscientious conscientiously conscientiousness conscionable conscionableness conscionably conscious consciously consciousness conscribe conscript conscription conscriptional conscriptionist conscriptive consecrate consecrated consecratedness consecrater consecration consecrative consecrator consecratory consectary consecute consecution consecutive consecutively consecutiveness consecutives consenescence consenescency consension consensual consensually consensus consent consentable consentaneity consentaneous consentaneously consentaneousness consentant consenter consentful consentfully consentience consentient consentiently consenting consentingly consentingness consentive consentively consentment consequence consequency consequent consequential consequentiality consequentially consequentialness consequently consertal conservable conservacy conservancy conservant conservate conservation conservational conservationist conservatism conservatist conservative conservatively conservativeness conservatize conservatoire conservator conservatorio conservatorium conservatorship conservatory conservatrix conserve conserver consider considerability considerable considerableness considerably considerance considerate considerately considerateness consideration considerative consideratively considerativeness considerator considered considerer considering consideringly consign consignable consignatary consignation consignatory consignee consigneeship consigner consignificant consignificate consignification consignificative consignificator consignify consignment consignor consiliary consilience consilient consimilar consimilarity consimilate consist consistence consistency consistent consistently consistorial consistorian consistory consociate consociation consociational consociationism consociative consocies consol consolable consolableness consolably Consolamentum consolation Consolato consolatorily consolatoriness consolatory consolatrix console consolement consoler consolidant consolidate consolidated consolidation consolidationist consolidative consolidator consoling consolingly consolute consomme consonance consonancy consonant consonantal consonantic consonantism consonantize consonantly consonantness consonate consonous consort consortable consorter consortial consortion consortism consortium consortship consound conspecies conspecific conspectus consperse conspersion conspicuity conspicuous conspicuously conspicuousness conspiracy conspirant conspiration conspirative conspirator conspiratorial conspiratorially conspiratory conspiratress conspire conspirer conspiring conspiringly conspue constable constablery constableship constabless constablewick constabular constabulary Constance constancy constant constantan Constantine Constantinian Constantinopolitan constantly constantness constat constatation constate constatory constellate constellation constellatory consternate consternation constipate constipation constituency constituent constituently constitute constituter constitution constitutional constitutionalism constitutionalist constitutionality constitutionalization constitutionalize constitutionally constitutionary constitutioner constitutionist constitutive constitutively constitutiveness constitutor constrain constrainable constrained constrainedly constrainedness constrainer constraining constrainingly constrainment constraint constrict constricted constriction constrictive constrictor constringe constringency constringent construability construable construct constructer constructible construction constructional constructionally constructionism constructionist constructive constructively constructiveness constructivism constructivist constructor constructorship constructure construe construer constuprate constupration consubsist consubsistency consubstantial consubstantialism consubstantialist consubstantiality consubstantially consubstantiate consubstantiation consubstantiationist consubstantive consuete consuetitude consuetude consuetudinal consuetudinary consul consulage consular consularity consulary consulate consulship consult consultable consultant consultary consultation consultative consultatory consultee consulter consulting consultive consultively consultor consultory consumable consume consumedly consumeless consumer consuming consumingly consumingness consummate consummately consummation consummative consummatively consummativeness consummator consummatory consumpt consumpted consumptible consumption consumptional consumptive consumptively consumptiveness consumptivity consute contabescence contabescent contact contactor contactual contactually contagion contagioned contagionist contagiosity contagious contagiously contagiousness contagium contain containable container containment contakion contaminable contaminant contaminate contamination contaminative contaminator contaminous contangential contango conte contect contection contemn contemner contemnible contemnibly contemning contemningly contemnor contemper contemperate contemperature contemplable contemplamen contemplant contemplate contemplatingly contemplation contemplatist contemplative contemplatively contemplativeness contemplator contemplature contemporanean contemporaneity contemporaneous contemporaneously contemporaneousness contemporarily contemporariness contemporary contemporize contempt contemptful contemptibility contemptible contemptibleness contemptibly contemptuous contemptuously contemptuousness contendent contender contending contendingly contendress content contentable contented contentedly contentedness contentful contention contentional contentious contentiously contentiousness contentless contently contentment contentness contents conter conterminal conterminant contermine conterminous conterminously conterminousness contest contestable contestableness contestably contestant contestation contestee contester contestingly contestless context contextive contextual contextually contextural contexture contextured conticent contignation contiguity contiguous contiguously contiguousness continence continency continent continental Continentaler continentalism continentalist continentality Continentalize continentally continently contingence contingency contingent contingential contingentialness contingently contingentness continuable continual continuality continually continualness continuance continuancy continuando continuant continuantly continuate continuately continuateness continuation continuative continuatively continuativeness continuator continue continued continuedly continuedness continuer continuingly continuist continuity continuous continuously continuousness continuum contise contline conto contorniate contorsive contort Contortae contorted contortedly contortedness contortion contortional contortionate contortioned contortionist contortionistic contortive contour contourne contra contraband contrabandage contrabandery contrabandism contrabandist contrabandista contrabass contrabassist contrabasso contracapitalist contraception contraceptionist contraceptive contracivil contraclockwise contract contractable contractant contractation contracted contractedly contractedness contractee contracter contractibility contractible contractibleness contractibly contractile contractility contraction contractional contractionist contractive contractively contractiveness contractor contractual contractually contracture contractured contradebt contradict contradictable contradictedness contradicter contradiction contradictional contradictious contradictiously contradictiousness contradictive contradictively contradictiveness contradictor contradictorily contradictoriness contradictory contradiscriminate contradistinct contradistinction contradistinctive contradistinctively contradistinctly contradistinguish contradivide contrafacture contrafagotto contrafissura contraflexure contraflow contrafocal contragredience contragredient contrahent contrail contraindicate contraindication contraindicative contralateral contralto contramarque contranatural contrantiscion contraoctave contraparallelogram contraplex contrapolarization contrapone contraponend Contraposaune contrapose contraposit contraposita contraposition contrapositive contraprogressist contraprop contraproposal contraption contraptious contrapuntal contrapuntalist contrapuntally contrapuntist contrapunto contrarational contraregular contraregularity contraremonstrance contraremonstrant contrarevolutionary contrariant contrariantly contrariety contrarily contrariness contrarious contrariously contrariousness contrariwise contrarotation contrary contrascriptural contrast contrastable contrastably contrastedly contrastimulant contrastimulation contrastimulus contrastingly contrastive contrastively contrastment contrasty contrasuggestible contratabular contrate contratempo contratenor contravalence contravallation contravariant contravene contravener contravention contraversion contravindicate contravindication contrawise contrayerva contrectation contreface contrefort contretemps contributable contribute contribution contributional contributive contributively contributiveness contributor contributorial contributorship contributory contrite contritely contriteness contrition contriturate contrivance contrivancy contrive contrivement contriver control controllability controllable controllableness controllably controller controllership controlless controllingly controlment controversial controversialism controversialist controversialize controversially controversion controversional controversionalism controversionalist controversy controvert controverter controvertible controvertibly controvertist contubernal contubernial contubernium contumacious contumaciously contumaciousness contumacity contumacy contumelious contumeliously contumeliousness contumely contund conturbation contuse contusion contusioned contusive conubium Conularia conumerary conumerous conundrum conundrumize conurbation conure Conuropsis Conurus conus conusable conusance conusant conusee conusor conutrition conuzee conuzor convalesce convalescence convalescency convalescent convalescently convallamarin Convallaria Convallariaceae convallariaceous convallarin convect convection convectional convective convectively convector convenable convenably convene convenee convener convenership convenience conveniency convenient conveniently convenientness convent conventical conventically conventicle conventicler conventicular convention conventional conventionalism conventionalist conventionality conventionalization conventionalize conventionally conventionary conventioner conventionism conventionist conventionize conventual conventually converge convergement convergence convergency convergent convergescence converging conversable conversableness conversably conversance conversancy conversant conversantly conversation conversationable conversational conversationalist conversationally conversationism conversationist conversationize conversative converse conversely converser conversibility conversible conversion conversional conversionism conversionist conversive convert converted convertend converter convertibility convertible convertibleness convertibly converting convertingness convertise convertism convertite convertive convertor conveth convex convexed convexedly convexedness convexity convexly convexness convey conveyable conveyal conveyance conveyancer conveyancing conveyer convict convictable conviction convictional convictism convictive convictively convictiveness convictment convictor convince convinced convincedly convincedness convincement convincer convincibility convincible convincing convincingly convincingness convival convive convivial convivialist conviviality convivialize convivially convocant convocate convocation convocational convocationally convocationist convocative convocator convoke convoker Convoluta convolute convoluted convolutely convolution convolutional convolutionary convolutive convolve convolvement Convolvulaceae convolvulaceous convolvulad convolvuli convolvulic convolvulin convolvulinic convolvulinolic Convolvulus convoy convulsant convulse convulsedly convulsibility convulsible convulsion convulsional convulsionary convulsionism convulsionist convulsive convulsively convulsiveness cony conycatcher conyrine coo cooba coodle cooee cooer coof Coohee cooing cooingly cooja cook cookable cookbook cookdom cookee cookeite cooker cookery cookhouse cooking cookish cookishly cookless cookmaid cookout cookroom cookshack cookshop cookstove cooky cool coolant coolen cooler coolerman coolheaded coolheadedly coolheadedness coolhouse coolibah coolie cooling coolingly coolingness coolish coolly coolness coolth coolung coolweed coolwort cooly coom coomb coomy coon cooncan coonily cooniness coonroot coonskin coontail coontie coony coop cooper cooperage Cooperia coopering coopery cooree Coorg coorie cooruptibly Coos cooser coost Coosuc coot cooter cootfoot coothay cootie cop copa copable copacetic copaene copaiba copaibic Copaifera Copaiva copaivic copaiye copal copalche copalcocote copaliferous copalite copalm coparallel coparcenary coparcener coparceny coparent copart copartaker copartner copartnership copartnery coparty copassionate copastor copastorate copatain copatentee copatriot copatron copatroness cope Copehan copei Copelata Copelatae copelate copellidine copeman copemate copen copending copenetrate Copeognatha copepod Copepoda copepodan copepodous coper coperception coperiodic Copernican Copernicanism Copernicia coperta copesman copesmate copestone copetitioner cophasal Cophetua cophosis copiability copiable copiapite copied copier copilot coping copiopia copiopsia copiosity copious copiously copiousness copis copist copita coplaintiff coplanar coplanarity copleased coplotter coploughing coplowing copolar copolymer copolymerization copolymerize coppaelite copped copper copperas copperbottom copperer copperhead copperheadism coppering copperish copperization copperize copperleaf coppernose coppernosed copperplate copperproof coppersidesman copperskin coppersmith coppersmithing copperware copperwing copperworks coppery copperytailed coppet coppice coppiced coppicing coppin copping copple copplecrown coppled coppy copr copra coprecipitate coprecipitation copremia copremic copresbyter copresence copresent Coprides Coprinae coprincipal coprincipate Coprinus coprisoner coprodaeum coproduce coproducer coprojector coprolagnia coprolagnist coprolalia coprolaliac coprolite coprolith coprolitic coprology copromisor copromoter coprophagan coprophagia coprophagist coprophagous coprophagy coprophilia coprophiliac coprophilic coprophilism coprophilous coprophyte coproprietor coproprietorship coprose Coprosma coprostasis coprosterol coprozoic copse copsewood copsewooded copsing copsy Copt copter Coptic Coptis copula copulable copular copularium copulate copulation copulative copulatively copulatory copunctal copurchaser copus copy copybook copycat copygraph copygraphed copyhold copyholder copyholding copyism copyist copyman copyreader copyright copyrightable copyrighter copywise coque coquecigrue coquelicot coqueluche coquet coquetoon coquetry coquette coquettish coquettishly coquettishness coquicken coquilla Coquille coquille coquimbite coquina coquita Coquitlam coquito cor Cora cora Corabeca Corabecan corach Coraciae coracial Coracias Coracii Coraciidae coraciiform Coraciiformes coracine coracle coracler coracoacromial coracobrachial coracobrachialis coracoclavicular coracocostal coracohumeral coracohyoid coracoid coracoidal coracomandibular coracomorph Coracomorphae coracomorphic coracopectoral coracoprocoracoid coracoradialis coracoscapular coracovertebral coradical coradicate corah coraise coral coralberry coralbush coraled coralflower coralist corallet Corallian corallic Corallidae corallidomous coralliferous coralliform Coralligena coralligenous coralligerous corallike Corallina Corallinaceae corallinaceous coralline corallite Corallium coralloid coralloidal Corallorhiza corallum Corallus coralroot coralwort coram Corambis coranto corban corbeau corbeil corbel corbeling corbicula corbiculate corbiculum corbie corbiestep corbovinum corbula corcass Corchorus corcir corcopali Corcyraean cord cordage Cordaitaceae cordaitaceous cordaitalean Cordaitales cordaitean Cordaites cordant cordate cordately cordax Cordeau corded cordel Cordelia Cordelier cordeliere cordelle corder Cordery cordewane Cordia cordial cordiality cordialize cordially cordialness cordiceps cordicole cordierite cordies cordiform cordigeri cordillera cordilleran cordiner cording cordite corditis cordleaf cordmaker cordoba cordon cordonnet Cordovan Cordula corduroy corduroyed cordwain cordwainer cordwainery cordwood cordy Cordyceps cordyl Cordylanthus Cordyline core corebel coreceiver coreciprocal corectome corectomy corector cored coredeem coredeemer coredemptress coreductase Coree coreflexed coregence coregency coregent coregnancy coregnant coregonid Coregonidae coregonine coregonoid Coregonus coreid Coreidae coreign coreigner corejoice coreless coreligionist corella corelysis Corema coremaker coremaking coremium coremorphosis corenounce coreometer Coreopsis coreplastic coreplasty corer coresidence coresidual coresign coresonant coresort corespect corespondency corespondent coretomy coreveler coreveller corevolve Corey corf Corfiote Corflambo corge corgi coriaceous corial coriamyrtin coriander coriandrol Coriandrum Coriaria Coriariaceae coriariaceous coriin Corimelaena Corimelaenidae Corin corindon Corineus coring Corinna corinne Corinth Corinthian Corinthianesque Corinthianism Corinthianize Coriolanus coriparian corium Corixa Corixidae cork corkage corkboard corke corked corker corkiness corking corkish corkite corkmaker corkmaking corkscrew corkscrewy corkwing corkwood corky corm Cormac cormel cormidium cormoid Cormophyta cormophyte cormophytic cormorant cormous cormus corn Cornaceae cornaceous cornage cornbell cornberry cornbin cornbinks cornbird cornbole cornbottle cornbrash corncake corncob corncracker corncrib corncrusher corndodger cornea corneagen corneal cornein corneitis cornel Cornelia cornelian Cornelius cornemuse corneocalcareous corneosclerotic corneosiliceous corneous corner cornerbind cornered cornerer cornerpiece cornerstone cornerways cornerwise cornet cornetcy cornettino cornettist corneule corneum cornfield cornfloor cornflower corngrower cornhouse cornhusk cornhusker cornhusking cornic cornice cornicle corniculate corniculer corniculum Corniferous cornific cornification cornified corniform cornigerous cornin corning corniplume Cornish Cornishman cornland cornless cornloft cornmaster cornmonger cornopean cornpipe cornrick cornroot cornstalk cornstarch cornstook cornu cornual cornuate cornuated cornubianite cornucopia Cornucopiae cornucopian cornucopiate cornule cornulite Cornulites cornupete Cornus cornute cornuted cornutine cornuto cornwallis cornwallite corny coroa Coroado corocleisis corodiary corodiastasis corodiastole corody corol corolla corollaceous corollarial corollarially corollary corollate corollated corolliferous corolliform corollike corolline corollitic corometer corona coronach coronad coronadite coronae coronagraph coronagraphic coronal coronale coronaled coronally coronamen coronary coronate coronated coronation coronatorial coroner coronership coronet coroneted coronetted coronetty coroniform Coronilla coronillin coronion coronitis coronium coronize coronobasilar coronofacial coronofrontal coronoid Coronopus coronule coroparelcysis coroplast coroplasta coroplastic Coropo coroscopy corotomy corozo corp corpora corporal corporalism corporality corporally corporalship corporas corporate corporately corporateness corporation corporational corporationer corporationism corporative corporator corporature corporeal corporealist corporeality corporealization corporealize corporeally corporealness corporeals corporeity corporeous corporification corporify corporosity corposant corps corpsbruder corpse corpsman corpulence corpulency corpulent corpulently corpulentness corpus corpuscle corpuscular corpuscularian corpuscularity corpusculated corpuscule corpusculous corpusculum corrade corradial corradiate corradiation corral corrasion corrasive Correa correal correality correct correctable correctant corrected correctedness correctible correcting correctingly correction correctional correctionalist correctioner correctitude corrective correctively correctiveness correctly correctness corrector correctorship correctress correctrice corregidor correlatable correlate correlated correlation correlational correlative correlatively correlativeness correlativism correlativity correligionist corrente correption corresol correspond correspondence correspondency correspondent correspondential correspondentially correspondently correspondentship corresponder corresponding correspondingly corresponsion corresponsive corresponsively corridor corridored corrie Corriedale corrige corrigenda corrigendum corrigent corrigibility corrigible corrigibleness corrigibly Corrigiola Corrigiolaceae corrival corrivality corrivalry corrivalship corrivate corrivation corrobboree corroborant corroborate corroboration corroborative corroboratively corroborator corroboratorily corroboratory corroboree corrode corrodent Corrodentia corroder corrodiary corrodibility corrodible corrodier corroding corrosibility corrosible corrosibleness corrosion corrosional corrosive corrosively corrosiveness corrosivity corrugate corrugated corrugation corrugator corrupt corrupted corruptedly corruptedness corrupter corruptful corruptibility corruptible corruptibleness corrupting corruptingly corruption corruptionist corruptive corruptively corruptly corruptness corruptor corruptress corsac corsage corsaint corsair corse corselet corsepresent corsesque corset corseting corsetless corsetry Corsican corsie corsite corta Cortaderia cortege Cortes cortex cortez cortical cortically corticate corticated corticating cortication cortices corticiferous corticiform corticifugal corticifugally corticipetal corticipetally Corticium corticoafferent corticoefferent corticoline corticopeduncular corticose corticospinal corticosterone corticostriate corticous cortin cortina cortinarious Cortinarius cortinate cortisone cortlandtite Corton coruco coruler Coruminacan corundophilite corundum corupay coruscant coruscate coruscation corver corvette corvetto Corvidae corviform corvillosum corvina Corvinae corvine corvoid Corvus Cory Corybant Corybantian corybantiasm Corybantic corybantic Corybantine corybantish corybulbin corybulbine corycavamine corycavidin corycavidine corycavine Corycia Corycian corydalin corydaline Corydalis corydine Corydon coryl Corylaceae corylaceous corylin Corylopsis Corylus corymb corymbed corymbiate corymbiated corymbiferous corymbiform corymbose corymbous corynebacterial Corynebacterium Coryneum corynine Corynocarpaceae corynocarpaceous Corynocarpus Corypha Coryphaena coryphaenid Coryphaenidae coryphaenoid Coryphaenoididae coryphaeus coryphee coryphene Coryphodon coryphodont coryphylly corytuberine coryza cos cosalite cosaque cosavior coscet Coscinodiscaceae Coscinodiscus coscinomancy coscoroba coseasonal coseat cosec cosecant cosech cosectarian cosectional cosegment coseism coseismal coseismic cosenator cosentiency cosentient coservant cosession coset cosettler cosh cosharer cosheath cosher cosherer coshering coshery cosignatory cosigner cosignitary cosily cosinage cosine cosiness cosingular cosinusoid Cosmati cosmecology cosmesis cosmetic cosmetical cosmetically cosmetician cosmetiste cosmetological cosmetologist cosmetology cosmic cosmical cosmicality cosmically cosmism cosmist cosmocracy cosmocrat cosmocratic cosmogenesis cosmogenetic cosmogenic cosmogeny cosmogonal cosmogoner cosmogonic cosmogonical cosmogonist cosmogonize cosmogony cosmographer cosmographic cosmographical cosmographically cosmographist cosmography cosmolabe cosmolatry cosmologic cosmological cosmologically cosmologist cosmology cosmometry cosmopathic cosmoplastic cosmopoietic cosmopolicy cosmopolis cosmopolitan cosmopolitanism cosmopolitanization cosmopolitanize cosmopolitanly cosmopolite cosmopolitic cosmopolitical cosmopolitics cosmopolitism cosmorama cosmoramic cosmorganic cosmos cosmoscope cosmosophy cosmosphere cosmotellurian cosmotheism cosmotheist cosmotheistic cosmothetic cosmotron cosmozoan cosmozoic cosmozoism cosonant cosounding cosovereign cosovereignty cospecies cospecific cosphered cosplendor cosplendour coss Cossack Cossaean cossas cosse cosset cossette cossid Cossidae cossnent cossyrite cost costa Costaea costal costalgia costally costander Costanoan costar costard Costata costate costated costean costeaning costectomy costellate coster costerdom costermonger costicartilage costicartilaginous costicervical costiferous costiform costing costipulator costispinal costive costively costiveness costless costlessness costliness costly costmary costoabdominal costoapical costocentral costochondral costoclavicular costocolic costocoracoid costodiaphragmatic costogenic costoinferior costophrenic costopleural costopneumopexy costopulmonary costoscapular costosternal costosuperior costothoracic costotome costotomy costotrachelian costotransversal costotransverse costovertebral costoxiphoid costraight costrel costula costulation costume costumer costumery costumic costumier costumiere costuming costumist costusroot cosubject cosubordinate cosuffer cosufferer cosuggestion cosuitor cosurety cosustain coswearer cosy cosymmedian cot cotangent cotangential cotarius cotarnine cotch cote coteful coteline coteller cotemporane cotemporanean cotemporaneous cotemporaneously cotemporary cotenancy cotenant cotenure coterell coterie coterminous Cotesian coth cothamore cothe cotheorist cothish cothon cothurn cothurnal cothurnate cothurned cothurnian cothurnus cothy cotidal cotillage cotillion Cotinga cotingid Cotingidae cotingoid Cotinus cotise cotitular cotland cotman coto cotoin Cotonam Cotoneaster cotonier cotorment cotoro cotorture Cotoxo cotquean cotraitor cotransfuse cotranslator cotranspire cotransubstantiate cotrine cotripper cotrustee cotset cotsetla cotsetle cotta cottabus cottage cottaged cottager cottagers cottagey cotte cotted cotter cotterel cotterite cotterway cottid Cottidae cottier cottierism cottiform cottoid cotton cottonade cottonbush cottonee cottoneer cottoner Cottonian cottonization cottonize cottonless cottonmouth cottonocracy Cottonopolis cottonseed cottontail cottontop cottonweed cottonwood cottony Cottus cotty cotuit cotula cotunnite Coturnix cotutor cotwin cotwinned cotwist cotyla cotylar cotyledon cotyledonal cotyledonar cotyledonary cotyledonous cotyliform cotyligerous cotyliscus cotyloid Cotylophora cotylophorous cotylopubic cotylosacral cotylosaur Cotylosauria cotylosaurian cotype Cotys Cotyttia couac coucal couch couchancy couchant couched couchee coucher couching couchmaker couchmaking couchmate couchy coude coudee coue Coueism cougar cough cougher coughroot coughweed coughwort cougnar coul could couldron coulee coulisse coulomb coulometer coulterneb coulure couma coumalic coumalin coumara coumaran coumarate coumaric coumarilic coumarin coumarinic coumarone coumarou Coumarouna council councilist councilman councilmanic councilor councilorship councilwoman counderstand counite couniversal counsel counselable counselee counselful counselor counselorship count countable countableness countably countdom countenance countenancer counter counterabut counteraccusation counteracquittance counteract counteractant counteracter counteracting counteractingly counteraction counteractive counteractively counteractivity counteractor counteraddress counteradvance counteradvantage counteradvice counteradvise counteraffirm counteraffirmation counteragency counteragent counteragitate counteragitation counteralliance counterambush counterannouncement counteranswer counterappeal counterappellant counterapproach counterapse counterarch counterargue counterargument counterartillery counterassertion counterassociation counterassurance counterattack counterattestation counterattired counterattraction counterattractive counterattractively counteraverment counteravouch counteravouchment counterbalance counterbarrage counterbase counterbattery counterbeating counterbend counterbewitch counterbid counterblast counterblow counterbond counterborder counterbore counterboycott counterbrace counterbranch counterbrand counterbreastwork counterbuff counterbuilding countercampaign countercarte countercause counterchange counterchanged countercharge countercharm countercheck countercheer counterclaim counterclaimant counterclockwise countercolored countercommand countercompetition countercomplaint countercompony countercondemnation counterconquest counterconversion countercouchant countercoupe countercourant countercraft countercriticism countercross countercry countercurrent countercurrently countercurrentwise counterdance counterdash counterdecision counterdeclaration counterdecree counterdefender counterdemand counterdemonstration counterdeputation counterdesire counterdevelopment counterdifficulty counterdigged counterdike counterdiscipline counterdisengage counterdisengagement counterdistinction counterdistinguish counterdoctrine counterdogmatism counterdraft counterdrain counterdrive counterearth counterefficiency countereffort counterembattled counterembowed counterenamel counterend counterenergy counterengagement counterengine counterenthusiasm counterentry counterequivalent counterermine counterespionage counterestablishment counterevidence counterexaggeration counterexcitement counterexcommunication counterexercise counterexplanation counterexposition counterexpostulation counterextend counterextension counterfact counterfallacy counterfaller counterfeit counterfeiter counterfeitly counterfeitment counterfeitness counterferment counterfessed counterfire counterfix counterflange counterflashing counterflight counterflory counterflow counterflux counterfoil counterforce counterformula counterfort counterfugue countergabble countergabion countergambit countergarrison countergauge countergauger countergift countergirded counterglow counterguard counterhaft counterhammering counterhypothesis counteridea counterideal counterimagination counterimitate counterimitation counterimpulse counterindentation counterindented counterindicate counterindication counterinfluence counterinsult counterintelligence counterinterest counterinterpretation counterintrigue counterinvective counterirritant counterirritate counterirritation counterjudging counterjumper counterlath counterlathing counterlatration counterlaw counterleague counterlegislation counterlife counterlocking counterlode counterlove counterly countermachination counterman countermand countermandable countermaneuver countermanifesto countermarch countermark countermarriage countermeasure countermeet countermessage countermigration countermine countermission countermotion countermount countermove countermovement countermure countermutiny counternaiant counternarrative counternatural counternecromancy counternoise counternotice counterobjection counterobligation counteroffensive counteroffer counteropening counteropponent counteropposite counterorator counterorder counterorganization counterpaled counterpaly counterpane counterpaned counterparadox counterparallel counterparole counterparry counterpart counterpassant counterpassion counterpenalty counterpendent counterpetition counterpicture counterpillar counterplan counterplay counterplayer counterplea counterplead counterpleading counterplease counterplot counterpoint counterpointe counterpointed counterpoise counterpoison counterpole counterponderate counterpose counterposition counterposting counterpotence counterpotency counterpotent counterpractice counterpray counterpreach counterpreparation counterpressure counterprick counterprinciple counterprocess counterproject counterpronunciamento counterproof counterpropaganda counterpropagandize counterprophet counterproposal counterproposition counterprotection counterprotest counterprove counterpull counterpunch counterpuncture counterpush counterquartered counterquarterly counterquery counterquestion counterquip counterradiation counterraid counterraising counterrampant counterrate counterreaction counterreason counterreckoning counterrecoil counterreconnaissance counterrefer counterreflected counterreform counterreformation counterreligion counterremonstrant counterreply counterreprisal counterresolution counterrestoration counterretreat counterrevolution counterrevolutionary counterrevolutionist counterrevolutionize counterriposte counterroll counterround counterruin countersale countersalient counterscale counterscalloped counterscarp counterscoff countersconce counterscrutiny countersea counterseal countersecure countersecurity counterselection countersense counterservice countershade countershaft countershafting countershear countershine countershout counterside countersiege countersign countersignal countersignature countersink countersleight counterslope countersmile countersnarl counterspying counterstain counterstamp counterstand counterstatant counterstatement counterstatute counterstep counterstimulate counterstimulation counterstimulus counterstock counterstratagem counterstream counterstrike counterstroke counterstruggle countersubject countersuggestion countersuit countersun countersunk countersurprise counterswing countersworn countersympathy countersynod countertack countertail countertally countertaste countertechnicality countertendency countertenor counterterm counterterror countertheme countertheory counterthought counterthreat counterthrust counterthwarting countertierce countertime countertouch countertraction countertrades countertransference countertranslation countertraverse countertreason countertree countertrench countertrespass countertrippant countertripping countertruth countertug counterturn counterturned countertype countervail countervair countervairy countervallation countervaunt countervene countervengeance countervenom countervibration counterview countervindication countervolition countervolley countervote counterwager counterwall counterwarmth counterwave counterweigh counterweight counterweighted counterwheel counterwill counterwilling counterwind counterwitness counterword counterwork counterworker counterwrite countess countfish counting countinghouse countless countor countrified countrifiedness country countryfolk countryman countrypeople countryseat countryside countryward countrywoman countship county coup coupage coupe couped coupee coupelet couper couple coupled couplement coupler coupleress couplet coupleteer coupling coupon couponed couponless coupstick coupure courage courageous courageously courageousness courager courant courante courap couratari courb courbache courbaril courbash courge courida courier couril courlan Cours course coursed courser coursing court courtbred courtcraft courteous courteously courteousness courtepy courter courtesan courtesanry courtesanship courtesy courtezanry courtezanship courthouse courtier courtierism courtierly courtiership courtin courtless courtlet courtlike courtliness courtling courtly courtman Courtney courtroom courtship courtyard courtzilite couscous couscousou couseranite cousin cousinage cousiness cousinhood cousinly cousinry cousinship cousiny coussinet coustumier coutel coutelle couter Coutet couth couthie couthily couthiness couthless coutil coutumier couvade couxia covado covalence covalent Covarecan Covarecas covariable covariance covariant covariation covassal cove coved covelline covellite covenant covenantal covenanted covenantee Covenanter covenanter covenanting covenantor covent coventrate coventrize Coventry cover coverage coveralls coverchief covercle covered coverer covering coverless coverlet coverlid coversed coverside coversine coverslut covert covertical covertly covertness coverture covet covetable coveter coveting covetingly covetiveness covetous covetously covetousness covey covibrate covibration covid Coviello covillager Covillea covin coving covinous covinously covisit covisitor covite covolume covotary cow cowal Cowan coward cowardice cowardliness cowardly cowardness cowardy cowbane cowbell cowberry cowbind cowbird cowboy cowcatcher cowdie coween cower cowfish cowgate cowgram cowhage cowheart cowhearted cowheel cowherb cowherd cowhide cowhiding cowhorn Cowichan cowish cowitch cowkeeper cowl cowle cowled cowleech cowleeching cowlick cowlicks cowlike cowling Cowlitz cowlstaff cowman cowpath cowpea cowpen Cowperian cowperitis cowpock cowpox cowpuncher cowquake cowrie cowroid cowshed cowskin cowslip cowslipped cowsucker cowtail cowthwort cowtongue cowweed cowwheat cowy cowyard cox coxa coxal coxalgia coxalgic coxankylometer coxarthritis coxarthrocace coxarthropathy coxbones coxcomb coxcombess coxcombhood coxcombic coxcombical coxcombicality coxcombically coxcombity coxcombry coxcomby coxcomical coxcomically coxite coxitis coxocerite coxoceritic coxodynia coxofemoral coxopodite coxswain coxy coy coyan coydog coyish coyishness coyly coyness coynye coyo coyol coyote Coyotero coyotillo coyoting coypu coyure coz coze cozen cozenage cozener cozening cozeningly cozier cozily coziness cozy crab crabbed crabbedly crabbedness crabber crabbery crabbing crabby crabcatcher crabeater craber crabhole crablet crablike crabman crabmill crabsidle crabstick crabweed crabwise crabwood Cracca Cracidae Cracinae crack crackable crackajack crackbrain crackbrained crackbrainedness crackdown cracked crackedness cracker crackerberry crackerjack crackers crackhemp crackiness cracking crackjaw crackle crackled crackless crackleware crackling crackly crackmans cracknel crackpot crackskull cracksman cracky cracovienne craddy cradge cradle cradleboard cradlechild cradlefellow cradleland cradlelike cradlemaker cradlemaking cradleman cradlemate cradler cradleside cradlesong cradletime cradling Cradock craft craftily craftiness craftless craftsman craftsmanship craftsmaster craftswoman craftwork craftworker crafty crag craggan cragged craggedness craggily cragginess craggy craglike cragsman cragwork craichy Craig craigmontite crain craisey craizey crajuru crake crakefeet crakow cram cramasie crambambulee crambambuli Crambe crambe cramberry crambid Crambidae Crambinae cramble crambly crambo Crambus crammer cramp cramped crampedness cramper crampet crampfish cramping crampingly crampon cramponnee crampy cran cranage cranberry crance crandall crandallite crane cranelike craneman craner cranesman craneway craney Crania crania craniacromial craniad cranial cranially cranian Craniata craniate cranic craniectomy craniocele craniocerebral cranioclasis cranioclasm cranioclast cranioclasty craniodidymus craniofacial craniognomic craniognomy craniognosy craniograph craniographer craniography craniological craniologically craniologist craniology craniomalacia craniomaxillary craniometer craniometric craniometrical craniometrically craniometrist craniometry craniopagus craniopathic craniopathy craniopharyngeal craniophore cranioplasty craniopuncture craniorhachischisis craniosacral cranioschisis cranioscopical cranioscopist cranioscopy craniospinal craniostenosis craniostosis Craniota craniotabes craniotome craniotomy craniotopography craniotympanic craniovertebral cranium crank crankbird crankcase cranked cranker crankery crankily crankiness crankle crankless crankly crankman crankous crankpin crankshaft crankum cranky crannage crannied crannock crannog crannoger cranny cranreuch crantara crants crap crapaud crapaudine crape crapefish crapehanger crapelike crappie crappin crapple crappo craps crapshooter crapulate crapulence crapulent crapulous crapulously crapulousness crapy craquelure crare crash crasher crasis craspedal craspedodromous craspedon Craspedota craspedotal craspedote crass crassamentum crassier crassilingual Crassina crassitude crassly crassness Crassula Crassulaceae crassulaceous Crataegus Crataeva cratch cratchens cratches crate crateful cratemaker cratemaking crateman crater crateral cratered Craterellus Craterid crateriform crateris craterkin craterless craterlet craterlike craterous craticular Cratinean cratometer cratometric cratometry craunch craunching craunchingly cravat crave craven Cravenette cravenette cravenhearted cravenly cravenness craver craving cravingly cravingness cravo craw crawberry crawdad crawfish crawfoot crawful crawl crawler crawlerize crawley crawleyroot crawling crawlingly crawlsome crawly crawm crawtae Crawthumper Crax crayer crayfish crayon crayonist crayonstone craze crazed crazedly crazedness crazily craziness crazingmill crazy crazycat crazyweed crea creagh creaght creak creaker creakily creakiness creakingly creaky cream creambush creamcake creamcup creamer creamery creameryman creamfruit creamily creaminess creamless creamlike creammaker creammaking creamometer creamsacs creamware creamy creance creancer creant crease creaseless creaser creashaks creasing creasy creat creatable create createdness creatic creatine creatinephosphoric creatinine creatininemia creatinuria creation creational creationary creationism creationist creationistic creative creatively creativeness creativity creatophagous creator creatorhood creatorrhea creatorship creatotoxism creatress creatrix creatural creature creaturehood creatureless creatureliness creatureling creaturely creatureship creaturize crebricostate crebrisulcate crebrity crebrous creche creddock credence credencive credenciveness credenda credensive credensiveness credent credential credently credenza credibility credible credibleness credibly credit creditability creditable creditableness creditably creditive creditless creditor creditorship creditress creditrix crednerite Credo credulity credulous credulously credulousness Cree cree creed creedal creedalism creedalist creeded creedist creedite creedless creedlessness creedmore creedsman Creek creek creeker creekfish creekside creekstuff creeky creel creeler creem creen creep creepage creeper creepered creeperless creephole creepie creepiness creeping creepingly creepmouse creepmousy creepy creese creesh creeshie creeshy creirgist cremaster cremasterial cremasteric cremate cremation cremationism cremationist cremator crematorial crematorium crematory crembalum cremnophobia cremocarp cremometer cremone cremor cremorne cremule crena crenate crenated crenately crenation crenature crenel crenelate crenelated crenelation crenele creneled crenelet crenellate crenellation crenic crenitic crenology crenotherapy Crenothrix crenula crenulate crenulated crenulation creodont Creodonta creole creoleize creolian Creolin creolism creolization creolize creophagia creophagism creophagist creophagous creophagy creosol creosote creosoter creosotic crepance crepe crepehanger Crepidula crepine crepiness Crepis crepitaculum crepitant crepitate crepitation crepitous crepitus crepon crept crepuscle crepuscular crepuscule crepusculine crepusculum crepy cresamine crescendo crescent crescentade crescentader Crescentia crescentic crescentiform crescentlike crescentoid crescentwise crescive crescograph crescographic cresegol cresol cresolin cresorcinol cresotate cresotic cresotinic cresoxide cresoxy cresphontes cress cressed cresselle cresset Cressida cresson cressweed cresswort cressy crest crested crestfallen crestfallenly crestfallenness cresting crestless crestline crestmoreite cresyl cresylate cresylene cresylic cresylite creta Cretaceous cretaceous cretaceously Cretacic Cretan Crete cretefaction Cretic cretic cretification cretify cretin cretinic cretinism cretinization cretinize cretinoid cretinous cretion cretionary Cretism cretonne crevalle crevasse crevice creviced crew crewel crewelist crewellery crewelwork crewer crewless crewman Crex crib cribbage cribber cribbing cribble cribellum cribo cribral cribrate cribrately cribration cribriform cribrose cribwork cric Cricetidae cricetine Cricetus crick cricket cricketer cricketing crickety crickey crickle cricoarytenoid cricoid cricopharyngeal cricothyreoid cricothyreotomy cricothyroid cricothyroidean cricotomy cricotracheotomy Cricotus cried crier criey crig crile crime Crimean crimeful crimeless crimelessness crimeproof criminal criminaldom criminalese criminalism criminalist criminalistic criminalistician criminalistics criminality criminally criminalness criminaloid criminate crimination criminative criminator criminatory crimine criminogenesis criminogenic criminologic criminological criminologist criminology criminosis criminous criminously criminousness crimogenic crimp crimpage crimper crimping crimple crimpness crimpy crimson crimsonly crimsonness crimsony crin crinal crinanite crinated crinatory crine crined crinet cringe cringeling cringer cringing cringingly cringingness cringle crinicultural criniculture criniferous Criniger crinigerous criniparous crinite crinitory crinivorous crink crinkle crinkleroot crinkly crinoid crinoidal Crinoidea crinoidean crinoline crinose crinosity crinula Crinum criobolium criocephalus Crioceras crioceratite crioceratitic Crioceris criophore Criophoros criosphinx cripes crippingly cripple crippledom crippleness crippler crippling cripply Cris crises crisic crisis crisp crispate crispated crispation crispature crisped crisper crispily Crispin crispine crispiness crisping crisply crispness crispy criss crissal crisscross crissum crista cristate Cristatella Cristi cristiform Cristina Cristineaux Cristino Cristispira Cristivomer cristobalite Cristopher critch criteria criteriology criterion criterional criterium crith Crithidia crithmene crithomancy critic critical criticality critically criticalness criticaster criticasterism criticastry criticisable criticism criticist criticizable criticize criticizer criticizingly critickin criticship criticule critique critling crizzle cro croak Croaker croaker croakily croakiness croaky Croat Croatan Croatian croc Crocanthemum crocard croceic crocein croceine croceous crocetin croche crochet crocheter crocheting croci crocidolite Crocidura crocin crock crocker crockery crockeryware crocket crocketed crocky crocodile Crocodilia crocodilian Crocodilidae crocodiline crocodilite crocodiloid Crocodilus Crocodylidae Crocodylus crocoisite crocoite croconate croconic Crocosmia Crocus crocus crocused croft crofter crofterization crofterize crofting croftland croisette croissante Crokinole Crom cromaltite crome Cromer Cromerian cromfordite cromlech cromorna cromorne Cromwell Cromwellian Cronartium crone croneberry cronet Cronian cronish cronk cronkness cronstedtite crony crood croodle crook crookback crookbacked crookbill crookbilled crooked crookedly crookedness crooken crookesite crookfingered crookheaded crookkneed crookle crooklegged crookneck crooknecked crooknosed crookshouldered crooksided crooksterned crooktoothed crool Croomia croon crooner crooning crooningly crop crophead cropland cropman croppa cropper croppie cropplecrown croppy cropshin cropsick cropsickness cropweed croquet croquette crore crosa Crosby crosier crosiered crosnes cross crossability crossable crossarm crossband crossbar crossbeak crossbeam crossbelt crossbill crossbolt crossbolted crossbones crossbow crossbowman crossbred crossbreed crosscurrent crosscurrented crosscut crosscutter crosscutting crosse crossed crosser crossette crossfall crossfish crossflow crossflower crossfoot crosshackle crosshand crosshatch crosshaul crosshauling crosshead crossing crossite crossjack crosslegs crosslet crossleted crosslight crosslighted crossline crossly crossness crossopodia crossopterygian Crossopterygii Crossosoma Crossosomataceae crossosomataceous crossover crosspatch crosspath crosspiece crosspoint crossrail crossroad crossroads crossrow crossruff crosstail crosstie crosstied crosstoes crosstrack crosstree crosswalk crossway crossways crossweb crossweed crosswise crossword crosswort crostarie crotal Crotalaria crotalic Crotalidae crotaliform Crotalinae crotaline crotalism crotalo crotaloid crotalum Crotalus crotaphic crotaphion crotaphite crotaphitic Crotaphytus crotch crotched crotchet crotcheteer crotchetiness crotchety crotchy crotin Croton crotonaldehyde crotonate crotonic crotonization crotonyl crotonylene Crotophaga crottels crottle crotyl crouch crouchant crouched croucher crouching crouchingly crounotherapy croup croupade croupal croupe crouperbush croupier croupily croupiness croupous croupy crouse crousely crout croute crouton crow crowbait crowbar crowberry crowbill crowd crowded crowdedly crowdedness crowder crowdweed crowdy crower crowflower crowfoot crowfooted crowhop crowing crowingly crowkeeper crowl crown crownbeard crowned crowner crownless crownlet crownling crownmaker crownwork crownwort crowshay crowstep crowstepped crowstick crowstone crowtoe croy croyden croydon croze crozer crozzle crozzly crubeen cruce cruces crucethouse cruche crucial cruciality crucially crucian Crucianella cruciate cruciately cruciation crucible Crucibulum crucifer Cruciferae cruciferous crucificial crucified crucifier crucifix crucifixion cruciform cruciformity cruciformly crucify crucigerous crucilly crucily cruck crude crudely crudeness crudity crudwort cruel cruelhearted cruelize cruelly cruelness cruels cruelty cruent cruentation cruet cruety cruise cruiser cruisken cruive cruller crum crumb crumbable crumbcloth crumber crumble crumblement crumblet crumbliness crumblingness crumblings crumbly crumby crumen crumenal crumlet crummie crummier crummiest crummock crummy crump crumper crumpet crumple crumpled crumpler crumpling crumply crumpy crunch crunchable crunchiness crunching crunchingly crunchingness crunchweed crunchy crunk crunkle crunodal crunode crunt cruor crupper crural crureus crurogenital cruroinguinal crurotarsal crus crusade crusader crusado Crusca cruse crush crushability crushable crushed crusher crushing crushingly crusie crusily crust crusta Crustacea crustaceal crustacean crustaceological crustaceologist crustaceology crustaceous crustade crustal crustalogical crustalogist crustalogy crustate crustated crustation crusted crustedly cruster crustific crustification crustily crustiness crustless crustose crustosis crusty crutch crutched crutcher crutching crutchlike cruth crutter crux cruzeiro cry cryable cryaesthesia cryalgesia cryanesthesia crybaby cryesthesia crying cryingly crymodynia crymotherapy cryoconite cryogen cryogenic cryogenics cryogeny cryohydrate cryohydric cryolite cryometer cryophile cryophilic cryophoric cryophorus cryophyllite cryophyte cryoplankton cryoscope cryoscopic cryoscopy cryosel cryostase cryostat crypt crypta cryptal cryptamnesia cryptamnesic cryptanalysis cryptanalyst cryptarch cryptarchy crypted Crypteronia Crypteroniaceae cryptesthesia cryptesthetic cryptic cryptical cryptically cryptoagnostic cryptobatholithic cryptobranch Cryptobranchia Cryptobranchiata cryptobranchiate Cryptobranchidae Cryptobranchus cryptocarp cryptocarpic cryptocarpous Cryptocarya Cryptocephala cryptocephalous Cryptocerata cryptocerous cryptoclastic Cryptocleidus cryptococci cryptococcic Cryptococcus cryptococcus cryptocommercial cryptocrystalline cryptocrystallization cryptodeist Cryptodira cryptodiran cryptodire cryptodirous cryptodouble cryptodynamic cryptogam Cryptogamia cryptogamian cryptogamic cryptogamical cryptogamist cryptogamous cryptogamy cryptogenetic cryptogenic cryptogenous Cryptoglaux cryptoglioma cryptogram Cryptogramma cryptogrammatic cryptogrammatical cryptogrammatist cryptogrammic cryptograph cryptographal cryptographer cryptographic cryptographical cryptographically cryptographist cryptography cryptoheresy cryptoheretic cryptoinflationist cryptolite cryptologist cryptology cryptolunatic cryptomere Cryptomeria cryptomerous cryptomnesia cryptomnesic cryptomonad Cryptomonadales Cryptomonadina cryptonema Cryptonemiales cryptoneurous cryptonym cryptonymous cryptopapist cryptoperthite Cryptophagidae cryptophthalmos Cryptophyceae cryptophyte cryptopine cryptoporticus Cryptoprocta cryptoproselyte cryptoproselytism cryptopyic cryptopyrrole cryptorchid cryptorchidism cryptorchis Cryptorhynchus cryptorrhesis cryptorrhetic cryptoscope cryptoscopy cryptosplenetic Cryptostegia cryptostoma Cryptostomata cryptostomate cryptostome Cryptotaenia cryptous cryptovalence cryptovalency cryptozonate Cryptozonia cryptozygosity cryptozygous Crypturi Crypturidae crystal crystallic crystalliferous crystalliform crystalligerous crystallin crystalline crystallinity crystallite crystallitic crystallitis crystallizability crystallizable crystallization crystallize crystallized crystallizer crystalloblastic crystallochemical crystallochemistry crystallogenesis crystallogenetic crystallogenic crystallogenical crystallogeny crystallogram crystallographer crystallographic crystallographical crystallographically crystallography crystalloid crystalloidal crystallology crystalloluminescence crystallomagnetic crystallomancy crystallometric crystallometry crystallophyllian crystallose crystallurgy crystalwort crystic crystograph crystoleum Crystolon crystosphene csardas Ctenacanthus ctene ctenidial ctenidium cteniform Ctenocephalus ctenocyst ctenodactyl Ctenodipterini ctenodont Ctenodontidae Ctenodus ctenoid ctenoidean Ctenoidei ctenoidian ctenolium Ctenophora ctenophoral ctenophoran ctenophore ctenophoric ctenophorous Ctenoplana Ctenostomata ctenostomatous ctenostome ctetology cuadra Cuailnge cuapinole cuarenta cuarta cuarteron cuartilla cuartillo cub Cuba cubage Cuban cubangle cubanite Cubanize cubatory cubature cubbing cubbish cubbishly cubbishness cubby cubbyhole cubbyhouse cubbyyew cubdom cube cubeb cubelet Cubelium cuber cubhood cubi cubic cubica cubical cubically cubicalness cubicity cubicle cubicly cubicone cubicontravariant cubicovariant cubicular cubiculum cubiform cubism cubist cubit cubital cubitale cubited cubitiere cubito cubitocarpal cubitocutaneous cubitodigital cubitometacarpal cubitopalmar cubitoplantar cubitoradial cubitus cubmaster cubocalcaneal cuboctahedron cubocube cubocuneiform cubododecahedral cuboid cuboidal cuboides cubomancy Cubomedusae cubomedusan cubometatarsal cubonavicular Cuchan Cuchulainn cuck cuckhold cuckold cuckoldom cuckoldry cuckoldy cuckoo cuckooflower cuckoomaid cuckoopint cuckoopintle cuckstool cucoline Cucujid Cucujidae Cucujus Cuculi Cuculidae cuculiform Cuculiformes cuculine cuculla cucullaris cucullate cucullately cuculliform cucullus cuculoid Cuculus Cucumaria Cucumariidae cucumber cucumiform Cucumis cucurbit Cucurbita Cucurbitaceae cucurbitaceous cucurbite cucurbitine cud cudava cudbear cudden cuddle cuddleable cuddlesome cuddly Cuddy cuddy cuddyhole cudgel cudgeler cudgerie cudweed cue cueball cueca cueist cueman cuemanship cuerda cuesta Cueva cuff cuffer cuffin cuffy cuffyism cuggermugger cuichunchulli cuinage cuir cuirass cuirassed cuirassier cuisinary cuisine cuissard cuissart cuisse cuissen cuisten Cuitlateco cuittikin Cujam cuke Culavamsa culbut Culdee culebra culet culeus Culex culgee culicid Culicidae culicidal culicide culiciform culicifugal culicifuge Culicinae culicine Culicoides culilawan culinarily culinary cull culla cullage Cullen culler cullet culling cullion cullis cully culm culmen culmicolous culmiferous culmigenous culminal culminant culminate culmination culmy culotte culottes culottic culottism culpa culpability culpable culpableness culpably culpatory culpose culprit cult cultch cultellation cultellus culteranismo cultic cultigen cultirostral Cultirostres cultish cultism cultismo cultist cultivability cultivable cultivably cultivar cultivatability cultivatable cultivate cultivated cultivation cultivator cultrate cultrated cultriform cultrirostral Cultrirostres cultual culturable cultural culturally culture cultured culturine culturist culturization culturize culturological culturologically culturologist culturology cultus culver culverfoot culverhouse culverin culverineer culverkey culvert culvertage culverwort cum Cumacea cumacean cumaceous Cumaean cumal cumaldehyde Cumanagoto cumaphyte cumaphytic cumaphytism Cumar cumay cumbent cumber cumberer cumberlandite cumberless cumberment cumbersome cumbersomely cumbersomeness cumberworld cumbha cumbly cumbraite cumbrance cumbre Cumbrian cumbrous cumbrously cumbrousness cumbu cumene cumengite cumenyl cumflutter cumhal cumic cumidin cumidine cumin cuminal cuminic cuminoin cuminol cuminole cuminseed cuminyl cummer cummerbund cummin cummingtonite cumol cump cumshaw cumulant cumular cumulate cumulately cumulation cumulatist cumulative cumulatively cumulativeness cumuli cumuliform cumulite cumulophyric cumulose cumulous cumulus cumyl Cuna cunabular Cunan Cunarder Cunas cunctation cunctatious cunctative cunctator cunctatorship cunctatury cunctipotent cundeamor cuneal cuneate cuneately cuneatic cuneator cuneiform cuneiformist cuneocuboid cuneonavicular cuneoscaphoid cunette cuneus cungeboi cunicular cuniculus cunila cunjah cunjer cunjevoi cunner cunnilinctus cunnilingus cunning Cunninghamia cunningly cunningness Cunonia Cunoniaceae cunoniaceous cunye Cunza Cuon cuorin cup Cupania cupay cupbearer cupboard cupcake cupel cupeler cupellation cupflower cupful Cuphea cuphead cupholder Cupid cupidinous cupidity cupidon cupidone cupless cupmaker cupmaking cupman cupmate cupola cupolaman cupolar cupolated cupped cupper cupping cuppy cuprammonia cuprammonium cupreine cuprene cupreous Cupressaceae cupressineous Cupressinoxylon Cupressus cupric cupride cupriferous cuprite cuproammonium cuprobismutite cuprocyanide cuprodescloizite cuproid cuproiodargyrite cupromanganese cupronickel cuproplumbite cuproscheelite cuprose cuprosilicon cuprotungstite cuprous cuprum cupseed cupstone cupula cupulate cupule Cupuliferae cupuliferous cupuliform cur curability curable curableness curably curacao curacy curare curarine curarization curarize curassow curatage curate curatel curateship curatess curatial curatic curation curative curatively curativeness curatize curatolatry curator curatorial curatorium curatorship curatory curatrix Curavecan curb curbable curber curbing curbless curblike curbstone curbstoner curby curcas curch curcuddoch Curculio curculionid Curculionidae curculionist Curcuma curcumin curd curdiness curdle curdler curdly curdwort curdy cure cureless curelessly curemaster curer curettage curette curettement curfew curial curialism curialist curialistic curiality curiate Curiatii curiboca curie curiescopy curietherapy curin curine curing curio curiologic curiologically curiologics curiology curiomaniac curiosa curiosity curioso curious curiously curiousness curite Curitis curium curl curled curledly curledness curler curlew curlewberry curlicue curliewurly curlike curlily curliness curling curlingly curlpaper curly curlycue curlyhead curlylocks curmudgeon curmudgeonery curmudgeonish curmudgeonly curmurring curn curney curnock curple curr currach currack curragh currant curratow currawang currency current currently currentness currentwise curricle curricula curricular curricularization curricularize curriculum curried currier curriery currish currishly currishness curry currycomb curryfavel Cursa cursal curse cursed cursedly cursedness curser curship cursitor cursive cursively cursiveness cursor cursorary Cursores Cursoria cursorial Cursoriidae cursorily cursoriness cursorious Cursorius cursory curst curstful curstfully curstly curstness cursus Curt curt curtail curtailed curtailedly curtailer curtailment curtain curtaining curtainless curtainwise curtal Curtana curtate curtation curtesy curtilage Curtis Curtise curtly curtness curtsy curua curuba Curucaneca Curucanecan curucucu curule Curuminaca Curuminacan Curupira cururo curvaceous curvaceousness curvacious curvant curvate curvation curvature curve curved curvedly curvedness curver curvesome curvesomeness curvet curvicaudate curvicostate curvidentate curvifoliate curviform curvilineal curvilinear curvilinearity curvilinearly curvimeter curvinervate curvinerved curvirostral Curvirostres curviserial curvital curvity curvograph curvometer curvous curvulate curvy curwhibble curwillet cuscohygrine cusconine Cuscus cuscus Cuscuta Cuscutaceae cuscutaceous cusec cuselite cush cushag cushat cushaw cushewbird cushion cushioned cushionflower cushionless cushionlike cushiony Cushite Cushitic cushlamochree cushy cusie cusinero cusk cusp cuspal cusparidine cusparine cuspate cusped cuspid cuspidal cuspidate cuspidation cuspidine cuspidor cuspule cuss cussed cussedly cussedness cusser cusso custard custerite custodee custodes custodial custodiam custodian custodianship custodier custody custom customable customarily customariness customary customer customhouse customs custumal cut cutaneal cutaneous cutaneously cutaway cutback cutch cutcher cutcherry cute cutely cuteness Cuterebra Cuthbert cutheal cuticle cuticolor cuticula cuticular cuticularization cuticularize cuticulate cutidure cutie cutification cutigeral cutin cutinization cutinize cutireaction cutis cutisector Cutiterebra cutitis cutization cutlass cutler cutleress Cutleria Cutleriaceae cutleriaceous Cutleriales cutlery cutlet cutling cutlips cutocellulose cutoff cutout cutover cutpurse cuttable cuttage cuttail cuttanee cutted cutter cutterhead cutterman cutthroat cutting cuttingly cuttingness cuttle cuttlebone cuttlefish cuttler cuttoo cutty cuttyhunk cutup cutwater cutweed cutwork cutworm cuvette Cuvierian cuvy cuya Cuzceno cwierc cwm cyamelide Cyamus cyan cyanacetic cyanamide cyananthrol Cyanastraceae Cyanastrum cyanate cyanaurate cyanauric cyanbenzyl cyancarbonic Cyanea cyanean cyanemia cyaneous cyanephidrosis cyanformate cyanformic cyanhidrosis cyanhydrate cyanhydric cyanhydrin cyanic cyanicide cyanidation cyanide cyanidin cyanidine cyanidrosis cyanimide cyanin cyanine cyanite cyanize cyanmethemoglobin cyanoacetate cyanoacetic cyanoaurate cyanoauric cyanobenzene cyanocarbonic cyanochlorous cyanochroia cyanochroic Cyanocitta cyanocrystallin cyanoderma cyanogen cyanogenesis cyanogenetic cyanogenic cyanoguanidine cyanohermidin cyanohydrin cyanol cyanole cyanomaclurin cyanometer cyanomethaemoglobin cyanomethemoglobin cyanometric cyanometry cyanopathic cyanopathy cyanophile cyanophilous cyanophoric cyanophose Cyanophyceae cyanophycean cyanophyceous cyanophycin cyanopia cyanoplastid cyanoplatinite cyanoplatinous cyanopsia cyanose cyanosed cyanosis Cyanospiza cyanotic cyanotrichite cyanotype cyanuramide cyanurate cyanuret cyanuric cyanurine cyanus cyaphenine cyath Cyathaspis Cyathea Cyatheaceae cyatheaceous cyathiform cyathium cyathoid cyatholith Cyathophyllidae cyathophylline cyathophylloid Cyathophyllum cyathos cyathozooid cyathus cybernetic cyberneticist cybernetics Cybister cycad Cycadaceae cycadaceous Cycadales cycadean cycadeoid Cycadeoidea cycadeous cycadiform cycadlike cycadofilicale Cycadofilicales Cycadofilices cycadofilicinean Cycadophyta Cycas Cycladic cyclamen cyclamin cyclamine cyclammonium cyclane Cyclanthaceae cyclanthaceous Cyclanthales Cyclanthus cyclar cyclarthrodial cyclarthrsis cyclas cycle cyclecar cycledom cyclene cycler cyclesmith Cycliae cyclian cyclic cyclical cyclically cyclicism cyclide cycling cyclism cyclist cyclistic cyclitic cyclitis cyclization cyclize cycloalkane Cyclobothra cyclobutane cyclocoelic cyclocoelous Cycloconium cyclodiolefin cycloganoid Cycloganoidei cyclogram cyclograph cyclographer cycloheptane cycloheptanone cyclohexane cyclohexanol cyclohexanone cyclohexene cyclohexyl cycloid cycloidal cycloidally cycloidean Cycloidei cycloidian cycloidotrope cyclolith Cycloloma cyclomania cyclometer cyclometric cyclometrical cyclometry Cyclomyaria cyclomyarian cyclonal cyclone cyclonic cyclonical cyclonically cyclonist cyclonite cyclonologist cyclonology cyclonometer cyclonoscope cycloolefin cycloparaffin cyclope Cyclopean cyclopean cyclopedia cyclopedic cyclopedical cyclopedically cyclopedist cyclopentadiene cyclopentane cyclopentanone cyclopentene Cyclopes cyclopes cyclophoria cyclophoric Cyclophorus cyclophrenia cyclopia Cyclopic cyclopism cyclopite cycloplegia cycloplegic cyclopoid cyclopropane Cyclops Cyclopteridae cyclopteroid cyclopterous cyclopy cyclorama cycloramic Cyclorrhapha cyclorrhaphous cycloscope cyclose cyclosis cyclospermous Cyclospondyli cyclospondylic cyclospondylous Cyclosporales Cyclosporeae Cyclosporinae cyclosporous Cyclostoma Cyclostomata cyclostomate Cyclostomatidae cyclostomatous cyclostome Cyclostomes Cyclostomi Cyclostomidae cyclostomous cyclostrophic cyclostyle Cyclotella cyclothem cyclothure cyclothurine Cyclothurus cyclothyme cyclothymia cyclothymiac cyclothymic cyclotome cyclotomic cyclotomy Cyclotosaurus cyclotron cyclovertebral cyclus Cydippe cydippian cydippid Cydippida Cydonia Cydonian cydonium cyesiology cyesis cygneous cygnet Cygnid Cygninae cygnine Cygnus cyke cylinder cylindered cylinderer cylinderlike cylindraceous cylindrarthrosis Cylindrella cylindrelloid cylindrenchyma cylindric cylindrical cylindricality cylindrically cylindricalness cylindricity cylindricule cylindriform cylindrite cylindrocellular cylindrocephalic cylindroconical cylindroconoidal cylindrocylindric cylindrodendrite cylindrograph cylindroid cylindroidal cylindroma cylindromatous cylindrometric cylindroogival Cylindrophis Cylindrosporium cylindruria cylix Cyllenian Cyllenius cyllosis cyma cymagraph cymaphen cymaphyte cymaphytic cymaphytism cymar cymation cymatium cymba cymbaeform cymbal Cymbalaria cymbaleer cymbaler cymbaline cymbalist cymballike cymbalo cymbalon cymbate Cymbella cymbiform Cymbium cymbling cymbocephalic cymbocephalous cymbocephaly Cymbopogon cyme cymelet cymene cymiferous cymling Cymodoceaceae cymogene cymograph cymographic cymoid Cymoidium cymometer cymophane cymophanous cymophenol cymoscope cymose cymosely cymotrichous cymotrichy cymous Cymraeg Cymric Cymry cymule cymulose cynanche Cynanchum cynanthropy Cynara cynaraceous cynarctomachy cynareous cynaroid cynebot cynegetic cynegetics cynegild cynhyena Cynias cyniatria cyniatrics cynic cynical cynically cynicalness cynicism cynicist cynipid Cynipidae cynipidous cynipoid Cynipoidea Cynips cynism cynocephalic cynocephalous cynocephalus cynoclept Cynocrambaceae cynocrambaceous Cynocrambe Cynodon cynodont Cynodontia Cynogale cynogenealogist cynogenealogy Cynoglossum Cynognathus cynography cynoid Cynoidea cynology Cynomoriaceae cynomoriaceous Cynomorium Cynomorpha cynomorphic cynomorphous Cynomys cynophile cynophilic cynophilist cynophobe cynophobia Cynopithecidae cynopithecoid cynopodous cynorrhodon Cynosarges Cynoscion Cynosura cynosural cynosure Cynosurus cynotherapy Cynoxylon Cynthia Cynthian Cynthiidae Cynthius cyp Cyperaceae cyperaceous Cyperus cyphella cyphellate Cyphomandra cyphonautes cyphonism Cypraea cypraeid Cypraeidae cypraeiform cypraeoid cypre cypres cypress cypressed cypressroot Cypria Cyprian Cyprididae Cypridina Cypridinidae cypridinoid Cyprina cyprine cyprinid Cyprinidae cypriniform cyprinine cyprinodont Cyprinodontes Cyprinodontidae cyprinodontoid cyprinoid Cyprinoidea cyprinoidean Cyprinus Cypriote Cypripedium Cypris cypsela Cypseli Cypselid Cypselidae cypseliform Cypseliformes cypseline cypseloid cypselomorph Cypselomorphae cypselomorphic cypselous Cypselus cyptozoic Cyrano Cyrenaic Cyrenaicism Cyrenian Cyril Cyrilla Cyrillaceae cyrillaceous Cyrillian Cyrillianism Cyrillic cyriologic cyriological Cyrtandraceae Cyrtidae cyrtoceracone Cyrtoceras cyrtoceratite cyrtoceratitic cyrtograph cyrtolite cyrtometer Cyrtomium cyrtopia cyrtosis Cyrus cyrus cyst cystadenoma cystadenosarcoma cystal cystalgia cystamine cystaster cystatrophia cystatrophy cystectasia cystectasy cystectomy cysted cysteine cysteinic cystelcosis cystenchyma cystenchymatous cystencyte cysterethism cystic cysticarpic cysticarpium cysticercoid cysticercoidal cysticercosis cysticercus cysticolous cystid Cystidea cystidean cystidicolous cystidium cystiferous cystiform cystigerous Cystignathidae cystignathine cystine cystinuria cystirrhea cystis cystitis cystitome cystoadenoma cystocarcinoma cystocarp cystocarpic cystocele cystocolostomy cystocyte cystodynia cystoelytroplasty cystoenterocele cystoepiplocele cystoepithelioma cystofibroma Cystoflagellata cystoflagellate cystogenesis cystogenous cystogram cystoid Cystoidea cystoidean cystolith cystolithectomy cystolithiasis cystolithic cystoma cystomatous cystomorphous cystomyoma cystomyxoma Cystonectae cystonectous cystonephrosis cystoneuralgia cystoparalysis Cystophora cystophore cystophotography cystophthisis cystoplasty cystoplegia cystoproctostomy Cystopteris cystoptosis Cystopus cystopyelitis cystopyelography cystopyelonephritis cystoradiography cystorrhagia cystorrhaphy cystorrhea cystosarcoma cystoschisis cystoscope cystoscopic cystoscopy cystose cystospasm cystospastic cystospore cystostomy cystosyrinx cystotome cystotomy cystotrachelotomy cystoureteritis cystourethritis cystous cytase cytasic Cytherea Cytherean Cytherella Cytherellidae Cytinaceae cytinaceous Cytinus cytioderm cytisine Cytisus cytitis cytoblast cytoblastema cytoblastemal cytoblastematous cytoblastemic cytoblastemous cytochemistry cytochrome cytochylema cytocide cytoclasis cytoclastic cytococcus cytocyst cytode cytodendrite cytoderm cytodiagnosis cytodieresis cytodieretic cytogamy cytogene cytogenesis cytogenetic cytogenetical cytogenetically cytogeneticist cytogenetics cytogenic cytogenous cytogeny cytoglobin cytohyaloplasm cytoid cytokinesis cytolist cytologic cytological cytologically cytologist cytology cytolymph cytolysin cytolysis cytolytic cytoma cytomere cytometer cytomicrosome cytomitome cytomorphosis cyton cytoparaplastin cytopathologic cytopathological cytopathologically cytopathology Cytophaga cytophagous cytophagy cytopharynx cytophil cytophysics cytophysiology cytoplasm cytoplasmic cytoplast cytoplastic cytoproct cytopyge cytoreticulum cytoryctes cytosine cytosome Cytospora Cytosporina cytost cytostomal cytostome cytostroma cytostromatic cytotactic cytotaxis cytotoxic cytotoxin cytotrophoblast cytotrophy cytotropic cytotropism cytozoic cytozoon cytozymase cytozyme cytula Cyzicene cyzicene czar czardas czardom czarevitch czarevna czarian czaric czarina czarinian czarish czarism czarist czaristic czaritza czarowitch czarowitz czarship Czech Czechic Czechish Czechization Czechoslovak Czechoslovakian D d da daalder dab dabb dabba dabber dabble dabbler dabbling dabblingly dabblingness dabby dabchick Dabih Dabitis dablet daboia daboya dabster dace Dacelo Daceloninae dacelonine dachshound dachshund Dacian dacite dacitic dacker dacoit dacoitage dacoity dacryadenalgia dacryadenitis dacryagogue dacrycystalgia Dacrydium dacryelcosis dacryoadenalgia dacryoadenitis dacryoblenorrhea dacryocele dacryocyst dacryocystalgia dacryocystitis dacryocystoblennorrhea dacryocystocele dacryocystoptosis dacryocystorhinostomy dacryocystosyringotomy dacryocystotome dacryocystotomy dacryohelcosis dacryohemorrhea dacryolite dacryolith dacryolithiasis dacryoma dacryon dacryops dacryopyorrhea dacryopyosis dacryosolenitis dacryostenosis dacryosyrinx dacryuria Dactyl dactyl dactylar dactylate dactylic dactylically dactylioglyph dactylioglyphic dactylioglyphist dactylioglyphtic dactylioglyphy dactyliographer dactyliographic dactyliography dactyliology dactyliomancy dactylion dactyliotheca Dactylis dactylist dactylitic dactylitis dactylogram dactylograph dactylographic dactylography dactyloid dactylology dactylomegaly dactylonomy dactylopatagium Dactylopius dactylopodite dactylopore Dactylopteridae Dactylopterus dactylorhiza dactyloscopic dactyloscopy dactylose dactylosternal dactylosymphysis dactylotheca dactylous dactylozooid dactylus Dacus dacyorrhea dad Dada dada Dadaism Dadaist dadap Dadayag dadder daddle daddock daddocky daddy daddynut dade dadenhudd dado Dadoxylon Dadu daduchus Dadupanthi dae Daedal daedal Daedalea Daedalean Daedalian Daedalic Daedalidae Daedalist daedaloid Daedalus daemon Daemonelix daemonic daemonurgist daemonurgy daemony daer daff daffery daffing daffish daffle daffodil daffodilly daffy daffydowndilly Dafla daft daftberry daftlike daftly daftness dag dagaba dagame dagassa Dagbamba Dagbane dagesh Dagestan dagga dagger daggerbush daggered daggerlike daggerproof daggers daggle daggletail daggletailed daggly daggy daghesh daglock Dagmar Dago dagoba Dagomba dags Daguerrean daguerreotype daguerreotyper daguerreotypic daguerreotypist daguerreotypy dah dahabeah Dahlia Dahoman Dahomeyan dahoon Daibutsu daidle daidly Daijo daiker daikon Dail Dailamite dailiness daily daimen daimiate daimio daimon daimonic daimonion daimonistic daimonology dain daincha dainteth daintify daintihood daintily daintiness daintith dainty Daira daira dairi dairy dairying dairymaid dairyman dairywoman dais daisied daisy daisybush daitya daiva dak daker Dakhini dakir Dakota daktylon daktylos dal dalar Dalarnian Dalbergia Dalcassian Dale dale Dalea Dalecarlian daleman daler dalesfolk dalesman dalespeople daleswoman daleth dali Dalibarda dalk dallack dalle dalles dalliance dallier dally dallying dallyingly Dalmania Dalmanites Dalmatian Dalmatic dalmatic Dalradian dalt dalteen Dalton dalton Daltonian Daltonic Daltonism Daltonist dam dama damage damageability damageable damageableness damageably damagement damager damages damagingly daman Damara Damascene damascene damascened damascener damascenine Damascus damask damaskeen damasse damassin Damayanti dambonitol dambose dambrod dame damenization damewort Damgalnunna Damia damiana Damianist damie damier damine damkjernite damlike dammar Dammara damme dammer dammish damn damnability damnable damnableness damnably damnation damnatory damned damner damnification damnify Damnii damning damningly damningness damnonians Damnonii damnous damnously Damoclean Damocles Damoetas damoiseau Damon Damone damonico damourite damp dampang damped dampen dampener damper damping dampish dampishly dampishness damply dampness dampproof dampproofer dampproofing dampy damsel damselfish damselhood damson Dan dan Dana Danaan Danagla Danai Danaid danaid Danaidae danaide Danaidean Danainae danaine Danais danaite Danakil danalite danburite dancalite dance dancer danceress dancery dancette dancing dancingly dand danda dandelion dander dandiacal dandiacally dandically dandification dandify dandilly dandily dandiprat dandizette dandle dandler dandling dandlingly dandruff dandruffy dandy dandydom dandyish dandyism dandyize dandyling Dane Daneball Daneflower Danegeld Danelaw Daneweed Danewort dang danger dangerful dangerfully dangerless dangerous dangerously dangerousness dangersome dangle dangleberry danglement dangler danglin dangling danglingly Dani Danian Danic danicism Daniel Daniele Danielic Danielle Daniglacial danio Danish Danism Danite Danization Danize dank Dankali dankish dankishness dankly dankness danli Dannebrog dannemorite danner Dannie dannock Danny danoranja dansant danseuse danta Dantean Dantesque Danthonia Dantist Dantology Dantomania danton Dantonesque Dantonist Dantophilist Dantophily Danube Danubian Danuri Danzig Danziger dao daoine dap Dapedium Dapedius Daphnaceae Daphne Daphnean Daphnephoria daphnetin Daphnia daphnin daphnioid Daphnis daphnoid dapicho dapico dapifer dapper dapperling dapperly dapperness dapple dappled dar darabukka darac daraf Darapti darat darbha darby Darbyism Darbyite Darci Dard Dardan dardanarius Dardani dardanium dardaol Dardic Dardistan dare dareall daredevil daredevilism daredevilry daredeviltry dareful Daren darer Dares daresay darg dargah darger Darghin Dargo dargsman dargue dari daribah daric Darien Darii Darin daring daringly daringness dariole Darius Darjeeling dark darken darkener darkening darkful darkhearted darkheartedness darkish darkishness darkle darkling darklings darkly darkmans darkness darkroom darkskin darksome darksomeness darky darling darlingly darlingness Darlingtonia darn darnation darned darnel darner darnex darning daroga daroo darr darrein Darrell Darren Darryl darshana Darsonval Darsonvalism darst dart Dartagnan dartars dartboard darter darting dartingly dartingness dartle dartlike dartman Dartmoor dartoic dartoid dartos dartre dartrose dartrous darts dartsman Darwinian Darwinical Darwinically Darwinism Darwinist Darwinistic Darwinite Darwinize Daryl darzee das Daschagga dash dashboard dashed dashedly dashee dasheen dasher dashing dashingly dashmaker Dashnak Dashnakist Dashnaktzutiun dashplate dashpot dashwheel dashy dasi Dasiphora dasnt dassie dassy dastard dastardize dastardliness dastardly dastur dasturi Dasya Dasyatidae Dasyatis Dasycladaceae dasycladaceous Dasylirion dasymeter dasypaedal dasypaedes dasypaedic Dasypeltis dasyphyllous Dasypodidae dasypodoid Dasyprocta Dasyproctidae dasyproctine Dasypus Dasystephana dasyure Dasyuridae dasyurine dasyuroid Dasyurus Dasyus data datable datableness datably dataria datary datch datcha date dateless datemark dater datil dating dation Datisca Datiscaceae datiscaceous datiscetin datiscin datiscoside Datisi Datism datival dative datively dativogerundial datolite datolitic dattock datum Datura daturic daturism daub daube Daubentonia Daubentoniidae dauber daubery daubing daubingly daubreeite daubreelite daubster dauby Daucus daud daughter daughterhood daughterkin daughterless daughterlike daughterliness daughterling daughterly daughtership Daulias daunch dauncy Daunii daunt daunter daunting dauntingly dauntingness dauntless dauntlessly dauntlessness daunton dauphin dauphine dauphiness Daur Dauri daut dautie dauw davach Davallia Dave daven davenport daver daverdy David Davidian Davidic Davidical Davidist davidsonite Daviesia daviesite davit davoch Davy davy davyne daw dawdle dawdler dawdling dawdlingly dawdy dawish dawkin Dawn dawn dawning dawnlight dawnlike dawnstreak dawnward dawny Dawson Dawsonia Dawsoniaceae dawsoniaceous dawsonite dawtet dawtit dawut day dayabhaga Dayakker dayal daybeam dayberry dayblush daybook daybreak daydawn daydream daydreamer daydreamy daydrudge dayflower dayfly daygoing dayless daylight daylit daylong dayman daymare daymark dayroom days dayshine daysman dayspring daystar daystreak daytale daytide daytime daytimes dayward daywork dayworker daywrit Daza daze dazed dazedly dazedness dazement dazingly dazy dazzle dazzlement dazzler dazzlingly de deacetylate deacetylation deacidification deacidify deacon deaconal deaconate deaconess deaconhood deaconize deaconry deaconship deactivate deactivation dead deadbeat deadborn deadcenter deaden deadener deadening deader deadeye deadfall deadhead deadheadism deadhearted deadheartedly deadheartedness deadhouse deading deadish deadishly deadishness deadlatch deadlight deadlily deadline deadliness deadlock deadly deadman deadmelt deadness deadpan deadpay deadtongue deadwood deadwort deaerate deaeration deaerator deaf deafen deafening deafeningly deafforest deafforestation deafish deafly deafness deair deal dealable dealate dealated dealation dealbate dealbation dealbuminize dealcoholist dealcoholization dealcoholize dealer dealerdom dealership dealfish dealing dealkalize dealkylate dealkylation dealt deambulation deambulatory deamidase deamidate deamidation deamidization deamidize deaminase deaminate deamination deaminization deaminize deammonation Dean dean deanathematize deaner deanery deaness deanimalize deanship deanthropomorphic deanthropomorphism deanthropomorphization deanthropomorphize deappetizing deaquation dear dearborn dearie dearly dearness dearomatize dearsenicate dearsenicator dearsenicize dearth dearthfu dearticulation dearworth dearworthily dearworthiness deary deash deasil deaspirate deaspiration deassimilation death deathbed deathblow deathday deathful deathfully deathfulness deathify deathin deathiness deathless deathlessly deathlessness deathlike deathliness deathling deathly deathroot deathshot deathsman deathtrap deathward deathwards deathwatch deathweed deathworm deathy deave deavely Deb deb debacle debadge debamboozle debar debarbarization debarbarize debark debarkation debarkment debarment debarrance debarrass debarration debase debasedness debasement debaser debasingly debatable debate debateful debatefully debatement debater debating debatingly debauch debauched debauchedly debauchedness debauchee debaucher debauchery debauchment Debbie Debby debby debeige debellate debellation debellator deben debenture debentured debenzolize Debi debile debilissima debilitant debilitate debilitated debilitation debilitative debility debind debit debiteuse debituminization debituminize deblaterate deblateration deboistly deboistness debonair debonaire debonairity debonairly debonairness debonnaire Deborah debord debordment debosh deboshed debouch debouchment debride debrief debris debrominate debromination debruise debt debtee debtful debtless debtor debtorship debullition debunk debunker debunkment debus Debussyan Debussyanize debut debutant debutante decachord decad decadactylous decadal decadally decadarch decadarchy decadary decadation decade decadence decadency decadent decadentism decadently decadescent decadianome decadic decadist decadrachm decadrachma decaesarize decaffeinate decaffeinize decafid decagon decagonal decagram decagramme decahedral decahedron decahydrate decahydrated decahydronaphthalene Decaisnea decal decalcification decalcifier decalcify decalcomania decalcomaniac decalescence decalescent Decalin decaliter decalitre decalobate Decalogist Decalogue decalvant decalvation decameral Decameron Decameronic decamerous decameter decametre decamp decampment decan decanal decanally decanate decane decangular decani decanically decannulation decanonization decanonize decant decantate decantation decanter decantherous decap decapetalous decaphyllous decapitable decapitalization decapitalize decapitate decapitation decapitator decapod Decapoda decapodal decapodan decapodiform decapodous decapper decapsulate decapsulation decarbonate decarbonator decarbonization decarbonize decarbonized decarbonizer decarboxylate decarboxylation decarboxylization decarboxylize decarburation decarburization decarburize decarch decarchy decardinalize decare decarhinus decarnate decarnated decart decasemic decasepalous decaspermal decaspermous decast decastellate decastere decastich decastyle decasualization decasualize decasyllabic decasyllable decasyllabon decate decathlon decatholicize decatize decatizer decatoic decator decatyl decaudate decaudation decay decayable decayed decayedness decayer decayless decease deceased decedent deceit deceitful deceitfully deceitfulness deceivability deceivable deceivableness deceivably deceive deceiver deceiving deceivingly decelerate deceleration decelerator decelerometer December Decemberish Decemberly Decembrist decemcostate decemdentate decemfid decemflorous decemfoliate decemfoliolate decemjugate decemlocular decempartite decempeda decempedal decempedate decempennate decemplex decemplicate decempunctate decemstriate decemuiri decemvir decemviral decemvirate decemvirship decenary decence decency decene decennal decennary decennia decenniad decennial decennially decennium decennoval decent decenter decently decentness decentralism decentralist decentralization decentralize decentration decentre decenyl decephalization deceptibility deceptible deception deceptious deceptiously deceptitious deceptive deceptively deceptiveness deceptivity decerebrate decerebration decerebrize decern decerniture decernment decess decession dechemicalization dechemicalize dechenite Dechlog dechlore dechlorination dechoralize dechristianization dechristianize Decian deciare deciatine decibel deciceronize decidable decide decided decidedly decidedness decider decidingly decidua decidual deciduary Deciduata deciduate deciduitis deciduoma deciduous deciduously deciduousness decigram decigramme decil decile deciliter decillion decillionth decima decimal decimalism decimalist decimalization decimalize decimally decimate decimation decimator decimestrial decimeter decimolar decimole decimosexto Decimus decinormal decipher decipherability decipherable decipherably decipherer decipherment decipium decipolar decision decisional decisive decisively decisiveness decistere decitizenize Decius decivilization decivilize deck decke decked deckel decker deckhead deckhouse deckie decking deckle deckload deckswabber declaim declaimant declaimer declamation declamatoriness declamatory declarable declarant declaration declarative declaratively declarator declaratorily declaratory declare declared declaredly declaredness declarer declass declassicize declassify declension declensional declensionally declericalize declimatize declinable declinal declinate declination declinational declinatory declinature decline declined declinedness decliner declinograph declinometer declivate declive declivitous declivity declivous declutch decoagulate decoagulation decoat decocainize decoct decoctible decoction decoctive decoctum decode Decodon decohere decoherence decoherer decohesion decoic decoke decollate decollated decollation decollator decolletage decollete decolor decolorant decolorate decoloration decolorimeter decolorization decolorize decolorizer decolour decommission decompensate decompensation decomplex decomponible decomposability decomposable decompose decomposed decomposer decomposite decomposition decomposure decompound decompoundable decompoundly decompress decompressing decompression decompressive deconcatenate deconcentrate deconcentration deconcentrator decongestive deconsecrate deconsecration deconsider deconsideration decontaminate decontamination decontrol deconventionalize decopperization decopperize decorability decorable decorably decorament decorate decorated decoration decorationist decorative decoratively decorativeness decorator decoratory decorist decorous decorously decorousness decorrugative decorticate decortication decorticator decorticosis decorum decostate decoy decoyer decoyman decrassify decream decrease decreaseless decreasing decreasingly decreation decreative decree decreeable decreement decreer decreet decrement decrementless decremeter decrepit decrepitate decrepitation decrepitly decrepitness decrepitude decrescence decrescendo decrescent decretal decretalist decrete decretist decretive decretively decretorial decretorily decretory decretum decrew decrial decried decrier decrown decrudescence decrustation decry decrystallization decubital decubitus decultivate deculturate decuman decumana decumanus Decumaria decumary decumbence decumbency decumbent decumbently decumbiture decuple decuplet decuria decurion decurionate decurrence decurrency decurrent decurrently decurring decursion decursive decursively decurtate decurvation decurvature decurve decury decus decussate decussated decussately decussation decussis decussorium decyl decylene decylenic decylic decyne Dedan Dedanim Dedanite dedecorate dedecoration dedecorous dedendum dedentition dedicant dedicate dedicatee dedication dedicational dedicative dedicator dedicatorial dedicatorily dedicatory dedicature dedifferentiate dedifferentiation dedimus deditician dediticiancy dedition dedo dedoggerelize dedogmatize dedolation deduce deducement deducibility deducible deducibleness deducibly deducive deduct deductible deduction deductive deductively deductory deduplication dee deed deedbox deedeed deedful deedfully deedily deediness deedless deedy deem deemer deemie deemster deemstership deep deepen deepener deepening deepeningly Deepfreeze deeping deepish deeplier deeply deepmost deepmouthed deepness deepsome deepwater deepwaterman deer deerberry deerdog deerdrive deerfood deerhair deerherd deerhorn deerhound deerlet deermeat deerskin deerstalker deerstalking deerstand deerstealer deertongue deerweed deerwood deeryard deevey deevilick deface defaceable defacement defacer defacing defacingly defalcate defalcation defalcator defalk defamation defamatory defame defamed defamer defamingly defassa defat default defaultant defaulter defaultless defaulture defeasance defeasanced defease defeasibility defeasible defeasibleness defeat defeater defeatism defeatist defeatment defeature defecant defecate defecation defecator defect defectibility defectible defection defectionist defectious defective defectively defectiveness defectless defectology defector defectoscope defedation defeminize defence defend defendable defendant defender defendress defenestration defensative defense defenseless defenselessly defenselessness defensibility defensible defensibleness defensibly defension defensive defensively defensiveness defensor defensorship defensory defer deferable deference deferent deferentectomy deferential deferentiality deferentially deferentitis deferment deferrable deferral deferred deferrer deferrization deferrize defervesce defervescence defervescent defeudalize defiable defial defiance defiant defiantly defiantness defiber defibrinate defibrination defibrinize deficience deficiency deficient deficiently deficit defier defiguration defilade defile defiled defiledness defilement defiler defiliation defiling defilingly definability definable definably define defined definedly definement definer definiendum definiens definite definitely definiteness definition definitional definitiones definitive definitively definitiveness definitization definitize definitor definitude deflagrability deflagrable deflagrate deflagration deflagrator deflate deflation deflationary deflationist deflator deflect deflectable deflected deflection deflectionization deflectionize deflective deflectometer deflector deflesh deflex deflexibility deflexible deflexion deflexure deflocculant deflocculate deflocculation deflocculator deflorate defloration deflorescence deflower deflowerer defluent defluous defluvium defluxion defoedation defog defoliage defoliate defoliated defoliation defoliator deforce deforcement deforceor deforcer deforciant deforest deforestation deforester deform deformability deformable deformalize deformation deformational deformative deformed deformedly deformedness deformer deformeter deformism deformity defortify defoul defraud defraudation defrauder defraudment defray defrayable defrayal defrayer defrayment defreeze defrication defrock defrost defroster deft defterdar deftly deftness defunct defunction defunctionalization defunctionalize defunctness defuse defusion defy defyingly deg deganglionate degarnish degas degasification degasifier degasify degasser degauss degelatinize degelation degeneracy degeneralize degenerate degenerately degenerateness degeneration degenerationist degenerative degenerescence degenerescent degentilize degerm degerminate degerminator degged degger deglaciation deglaze deglutinate deglutination deglutition deglutitious deglutitive deglutitory deglycerin deglycerine degorge degradable degradand degradation degradational degradative degrade degraded degradedly degradedness degradement degrader degrading degradingly degradingness degraduate degraduation degrain degrease degreaser degree degreeless degreewise degression degressive degressively degu Deguelia deguelin degum degummer degust degustation dehair dehairer Dehaites deheathenize dehematize dehepatize Dehgan dehisce dehiscence dehiscent dehistoricize Dehkan dehnstufe dehonestate dehonestation dehorn dehorner dehors dehort dehortation dehortative dehortatory dehorter dehull dehumanization dehumanize dehumidification dehumidifier dehumidify dehusk Dehwar dehydrant dehydrase dehydrate dehydration dehydrator dehydroascorbic dehydrocorydaline dehydrofreezing dehydrogenase dehydrogenate dehydrogenation dehydrogenization dehydrogenize dehydromucic dehydrosparteine dehypnotize deice deicer deicidal deicide deictic deictical deictically deidealize Deidesheimer deific deifical deification deificatory deifier deiform deiformity deify deign Deimos deincrustant deindividualization deindividualize deindividuate deindustrialization deindustrialize deink Deino Deinocephalia Deinoceras Deinodon Deinodontidae deinos Deinosauria Deinotherium deinsularize deintellectualization deintellectualize deionize Deipara deiparous Deiphobus deipnodiplomatic deipnophobia deipnosophism deipnosophist deipnosophistic deipotent Deirdre deiseal deisidaimonia deism deist deistic deistical deistically deisticalness deity deityship deject dejecta dejected dejectedly dejectedness dejectile dejection dejectly dejectory dejecture dejerate dejeration dejerator dejeune dejeuner dejunkerize Dekabrist dekaparsec dekapode dekko dekle deknight Del delabialization delabialize delacrimation delactation delaine delaminate delamination delapse delapsion delate delater delatinization delatinize delation delator delatorian Delaware Delawarean delawn delay delayable delayage delayer delayful delaying delayingly Delbert dele delead delectability delectable delectableness delectably delectate delectation delectus delegable delegacy delegalize delegant delegate delegatee delegateship delegation delegative delegator delegatory delenda Delesseria Delesseriaceae delesseriaceous delete deleterious deleteriously deleteriousness deletion deletive deletory delf delft delftware Delhi Delia Delian deliberalization deliberalize deliberant deliberate deliberately deliberateness deliberation deliberative deliberatively deliberativeness deliberator delible delicacy delicate delicately delicateness delicatesse delicatessen delicense Delichon delicioso Delicious delicious deliciously deliciousness delict delictum deligated deligation delight delightable delighted delightedly delightedness delighter delightful delightfully delightfulness delighting delightingly delightless delightsome delightsomely delightsomeness delignate delignification Delilah delime delimit delimitate delimitation delimitative delimiter delimitize delineable delineament delineate delineation delineative delineator delineatory delineature delinquence delinquency delinquent delinquently delint delinter deliquesce deliquescence deliquescent deliquium deliracy delirament deliration deliriant delirifacient delirious deliriously deliriousness delirium delitescence delitescency delitescent deliver deliverable deliverance deliverer deliveress deliveror delivery deliveryman dell Della dellenite Delobranchiata delocalization delocalize delomorphic delomorphous deloul delouse delphacid Delphacidae Delphian Delphin Delphinapterus delphine delphinic Delphinid Delphinidae delphinin delphinine delphinite Delphinium Delphinius delphinoid Delphinoidea delphinoidine Delphinus delphocurarine Delsarte Delsartean Delsartian Delta delta deltafication deltaic deltal deltarium deltation delthyrial delthyrium deltic deltidial deltidium deltiology deltohedron deltoid deltoidal delubrum deludable delude deluder deludher deluding deludingly deluge deluminize delundung delusion delusional delusionist delusive delusively delusiveness delusory deluster deluxe delve delver demagnetizable demagnetization demagnetize demagnetizer demagog demagogic demagogical demagogically demagogism demagogue demagoguery demagogy demal demand demandable demandant demander demanding demandingly demanganization demanganize demantoid demarcate demarcation demarcator demarch demarchy demargarinate demark demarkation demast dematerialization dematerialize Dematiaceae dematiaceous deme demean demeanor demegoric demency dement dementate dementation demented dementedly dementedness dementholize dementia demephitize demerit demeritorious demeritoriously Demerol demersal demersed demersion demesman demesmerize demesne demesnial demetallize demethylate demethylation Demetrian demetricize demi demiadult demiangel demiassignation demiatheism demiatheist demibarrel demibastion demibastioned demibath demibeast demibelt demibob demibombard demibrassart demibrigade demibrute demibuckram demicadence demicannon demicanon demicanton demicaponier demichamfron demicircle demicircular demicivilized demicolumn demicoronal demicritic demicuirass demiculverin demicylinder demicylindrical demidandiprat demideify demideity demidevil demidigested demidistance demiditone demidoctor demidog demidolmen demidome demieagle demifarthing demifigure demiflouncing demifusion demigardebras demigauntlet demigentleman demiglobe demigod demigoddess demigoddessship demigorge demigriffin demigroat demihag demihearse demiheavenly demihigh demihogshead demihorse demihuman demijambe demijohn demikindred demiking demilance demilancer demilawyer demilegato demilion demilitarization demilitarize demiliterate demilune demiluster demilustre demiman demimark demimentoniere demimetope demimillionaire demimondaine demimonde demimonk deminatured demineralization demineralize deminude deminudity demioctagonal demioctangular demiofficial demiorbit demiourgoi demiowl demiox demipagan demiparallel demipauldron demipectinate demipesade demipike demipillar demipique demiplacate demiplate demipomada demipremise demipremiss demipriest demipronation demipuppet demiquaver demiracle demiram demirelief demirep demirevetment demirhumb demirilievo demirobe demisability demisable demisacrilege demisang demisangue demisavage demise demiseason demisecond demisemiquaver demisemitone demisheath demishirt demisovereign demisphere demiss demission demissionary demissly demissness demissory demisuit demit demitasse demitint demitoilet demitone demitrain demitranslucence demitube demiturned demiurge demiurgeous demiurgic demiurgical demiurgically demiurgism demivambrace demivirgin demivoice demivol demivolt demivotary demiwivern demiwolf demnition demob demobilization demobilize democracy democrat democratian democratic democratical democratically democratifiable democratism democratist democratization democratize demodectic demoded Demodex Demodicidae Demodocus demodulation demodulator demogenic Demogorgon demographer demographic demographical demographically demographist demography demoid demoiselle demolish demolisher demolishment demolition demolitionary demolitionist demological demology Demon demon demonastery demoness demonetization demonetize demoniac demoniacal demoniacally demoniacism demonial demonian demonianism demoniast demonic demonical demonifuge demonish demonism demonist demonize demonkind demonland demonlike demonocracy demonograph demonographer demonography demonolater demonolatrous demonolatrously demonolatry demonologer demonologic demonological demonologically demonologist demonology demonomancy demonophobia demonry demonship demonstrability demonstrable demonstrableness demonstrably demonstrant demonstratable demonstrate demonstratedly demonstrater demonstration demonstrational demonstrationist demonstrative demonstratively demonstrativeness demonstrator demonstratorship demonstratory demophil demophilism demophobe Demophon Demophoon demoralization demoralize demoralizer demorphinization demorphism demos Demospongiae Demosthenean Demosthenic demote demotic demotics demotion demotist demount demountability demountable dempster demulce demulcent demulsibility demulsify demulsion demure demurely demureness demurity demurrable demurrage demurral demurrant demurrer demurring demurringly demutization demy demyship den denarcotization denarcotize denarius denaro denary denat denationalization denationalize denaturalization denaturalize denaturant denaturate denaturation denature denaturization denaturize denaturizer denazify denda dendrachate dendral Dendraspis dendraxon dendric dendriform dendrite Dendrites dendritic dendritical dendritically dendritiform Dendrium Dendrobates Dendrobatinae dendrobe Dendrobium Dendrocalamus Dendroceratina dendroceratine Dendrochirota dendrochronological dendrochronologist dendrochronology dendroclastic Dendrocoela dendrocoelan dendrocoele dendrocoelous Dendrocolaptidae dendrocolaptine Dendroctonus Dendrocygna dendrodont Dendrodus Dendroeca Dendrogaea Dendrogaean dendrograph dendrography Dendrohyrax Dendroica dendroid dendroidal Dendroidea Dendrolagus dendrolatry Dendrolene dendrolite dendrologic dendrological dendrologist dendrologous dendrology Dendromecon dendrometer dendron dendrophil dendrophile dendrophilous Dendropogon Dene dene Deneb Denebola denegate denegation denehole denervate denervation deneutralization dengue deniable denial denicotinize denier denierage denierer denigrate denigration denigrator denim Denis denitrate denitration denitrator denitrificant denitrification denitrificator denitrifier denitrify denitrize denization denizen denizenation denizenize denizenship Denmark dennet Dennis Dennstaedtia denominable denominate denomination denominational denominationalism denominationalist denominationalize denominationally denominative denominatively denominator denotable denotation denotative denotatively denotativeness denotatum denote denotement denotive denouement denounce denouncement denouncer dense densely densen denseness denshare densher denshire densification densifier densify densimeter densimetric densimetrically densimetry densitometer density dent dentagra dental dentale dentalgia Dentaliidae dentalism dentality Dentalium dentalization dentalize dentally dentaphone Dentaria dentary dentata dentate dentated dentately dentation dentatoangulate dentatocillitate dentatocostate dentatocrenate dentatoserrate dentatosetaceous dentatosinuate dentel dentelated dentelle dentelure denter dentex dentical denticate Denticeti denticle denticular denticulate denticulately denticulation denticule dentiferous dentification dentiform dentifrice dentigerous dentil dentilabial dentilated dentilation dentile dentilingual dentiloquist dentiloquy dentimeter dentin dentinal dentinalgia dentinasal dentine dentinitis dentinoblast dentinocemental dentinoid dentinoma dentiparous dentiphone dentiroster dentirostral dentirostrate Dentirostres dentiscalp dentist dentistic dentistical dentistry dentition dentoid dentolabial dentolingual dentonasal dentosurgical dentural denture denty denucleate denudant denudate denudation denudative denude denuder denumerable denumerably denumeral denumerant denumerantive denumeration denumerative denunciable denunciant denunciate denunciation denunciative denunciatively denunciator denunciatory denutrition deny denyingly deobstruct deobstruent deoccidentalize deoculate deodand deodara deodorant deodorization deodorize deodorizer deontological deontologist deontology deoperculate deoppilant deoppilate deoppilation deoppilative deordination deorganization deorganize deorientalize deorsumvergence deorsumversion deorusumduction deossification deossify deota deoxidant deoxidate deoxidation deoxidative deoxidator deoxidization deoxidize deoxidizer deoxygenate deoxygenation deoxygenization deozonization deozonize deozonizer depa depaganize depaint depancreatization depancreatize depark deparliament depart departed departer departisanize departition department departmental departmentalism departmentalization departmentalize departmentally departmentization departmentize departure depas depascent depass depasturable depasturage depasturation depasture depatriate depauperate depauperation depauperization depauperize depencil depend dependability dependable dependableness dependably dependence dependency dependent dependently depender depending dependingly depeople deperdite deperditely deperition depersonalization depersonalize depersonize depetalize depeter depetticoat dephase dephilosophize dephlegmate dephlegmation dephlegmatize dephlegmator dephlegmatory dephlegmedness dephlogisticate dephlogisticated dephlogistication dephosphorization dephosphorize dephysicalization dephysicalize depickle depict depicter depiction depictive depicture depiedmontize depigment depigmentate depigmentation depigmentize depilate depilation depilator depilatory depilitant depilous deplaceable deplane deplasmolysis deplaster deplenish deplete deplethoric depletion depletive depletory deploitation deplorability deplorable deplorableness deplorably deploration deplore deplored deploredly deploredness deplorer deploringly deploy deployment deplumate deplumated deplumation deplume deplump depoetize depoh depolarization depolarize depolarizer depolish depolishing depolymerization depolymerize depone deponent depopularize depopulate depopulation depopulative depopulator deport deportable deportation deportee deporter deportment deposable deposal depose deposer deposit depositary depositation depositee deposition depositional depositive depositor depository depositum depositure depot depotentiate depotentiation depravation deprave depraved depravedly depravedness depraver depravingly depravity deprecable deprecate deprecatingly deprecation deprecative deprecator deprecatorily deprecatoriness deprecatory depreciable depreciant depreciate depreciatingly depreciation depreciative depreciatively depreciator depreciatoriness depreciatory depredate depredation depredationist depredator depredatory depress depressant depressed depressibility depressible depressing depressingly depressingness depression depressive depressively depressiveness depressomotor depressor depreter deprint depriorize deprivable deprival deprivate deprivation deprivative deprive deprivement depriver deprovincialize depside depth depthen depthing depthless depthometer depthwise depullulation depurant depurate depuration depurative depurator depuratory depursement deputable deputation deputational deputationist deputationize deputative deputatively deputator depute deputize deputy deputyship dequeen derabbinize deracialize deracinate deracination deradelphus deradenitis deradenoncus derah deraign derail derailer derailment derange derangeable deranged derangement deranger derat derate derater derationalization derationalize deratization deray Derbend Derby derby derbylite dere deregister deregulationize dereism dereistic dereistically Derek derelict dereliction derelictly derelictness dereligion dereligionize derencephalocele derencephalus deresinate deresinize deric deride derider deridingly Deringa Deripia derisible derision derisive derisively derisiveness derisory derivability derivable derivably derival derivant derivate derivately derivation derivational derivationally derivationist derivatist derivative derivatively derivativeness derive derived derivedly derivedness deriver derm derma Dermacentor dermad dermahemia dermal dermalgia dermalith dermamyiasis dermanaplasty dermapostasis Dermaptera dermapteran dermapterous dermaskeleton dermasurgery dermatagra dermatalgia dermataneuria dermatatrophia dermatauxe dermathemia dermatic dermatine dermatitis Dermatobia dermatocele dermatocellulitis dermatoconiosis Dermatocoptes dermatocoptic dermatocyst dermatodynia dermatogen dermatoglyphics dermatograph dermatographia dermatography dermatoheteroplasty dermatoid dermatological dermatologist dermatology dermatolysis dermatoma dermatome dermatomere dermatomic dermatomuscular dermatomyces dermatomycosis dermatomyoma dermatoneural dermatoneurology dermatoneurosis dermatonosus dermatopathia dermatopathic dermatopathology dermatopathophobia Dermatophagus dermatophobia dermatophone dermatophony dermatophyte dermatophytic dermatophytosis dermatoplasm dermatoplast dermatoplastic dermatoplasty dermatopnagic dermatopsy Dermatoptera dermatoptic dermatorrhagia dermatorrhea dermatorrhoea dermatosclerosis dermatoscopy dermatosis dermatoskeleton dermatotherapy dermatotome dermatotomy dermatotropic dermatoxerasia dermatozoon dermatozoonosis dermatrophia dermatrophy dermenchysis Dermestes dermestid Dermestidae dermestoid dermic dermis dermitis dermoblast Dermobranchia dermobranchiata dermobranchiate Dermochelys dermochrome dermococcus dermogastric dermographia dermographic dermographism dermography dermohemal dermohemia dermohumeral dermoid dermoidal dermoidectomy dermol dermolysis dermomuscular dermomycosis dermoneural dermoneurosis dermonosology dermoosseous dermoossification dermopathic dermopathy dermophlebitis dermophobe dermophyte dermophytic dermoplasty Dermoptera dermopteran dermopterous dermoreaction Dermorhynchi dermorhynchous dermosclerite dermoskeletal dermoskeleton dermostenosis dermostosis dermosynovitis dermotropic dermovaccine dermutation dern dernier derodidymus derogate derogately derogation derogative derogatively derogator derogatorily derogatoriness derogatory Derotrema Derotremata derotremate derotrematous derotreme derout Derrick derrick derricking derrickman derride derries derringer Derris derry dertrotheca dertrum deruinate deruralize derust dervish dervishhood dervishism dervishlike desaccharification desacralization desacralize desalt desamidization desand desaturate desaturation desaurin descale descant descanter descantist descend descendable descendance descendant descendence descendent descendental descendentalism descendentalist descendentalistic descender descendibility descendible descending descendingly descension descensional descensionist descensive descent Deschampsia descloizite descort describability describable describably describe describer descrier descript description descriptionist descriptionless descriptive descriptively descriptiveness descriptory descrive descry deseasonalize desecrate desecrater desecration desectionalize deseed desegmentation desegmented desensitization desensitize desensitizer desentimentalize deseret desert deserted desertedly desertedness deserter desertful desertfully desertic deserticolous desertion desertism desertless desertlessly desertlike desertness desertress desertrice desertward deserve deserved deservedly deservedness deserveless deserver deserving deservingly deservingness desex desexualization desexualize deshabille desi desiccant desiccate desiccation desiccative desiccator desiccatory desiderant desiderata desiderate desideration desiderative desideratum desight desightment design designable designate designation designative designator designatory designatum designed designedly designedness designee designer designful designfully designfulness designing designingly designless designlessly designlessness desilicate desilicification desilicify desiliconization desiliconize desilver desilverization desilverize desilverizer desinence desinent desiodothyroxine desipience desipiency desipient desirability desirable desirableness desirably desire desired desiredly desiredness desireful desirefulness desireless desirer desiringly desirous desirously desirousness desist desistance desistive desition desize desk desklike deslime desma desmachymatous desmachyme desmacyte desman Desmanthus Desmarestia Desmarestiaceae desmarestiaceous Desmatippus desmectasia desmepithelium desmic desmid Desmidiaceae desmidiaceous Desmidiales desmidiologist desmidiology desmine desmitis desmocyte desmocytoma Desmodactyli Desmodium desmodont Desmodontidae Desmodus desmodynia desmogen desmogenous Desmognathae desmognathism desmognathous desmography desmohemoblast desmoid desmology desmoma Desmomyaria desmon Desmoncus desmoneoplasm desmonosology desmopathologist desmopathology desmopathy desmopelmous desmopexia desmopyknosis desmorrhexis Desmoscolecidae Desmoscolex desmosis desmosite Desmothoraca desmotomy desmotrope desmotropic desmotropism desocialization desocialize desolate desolately desolateness desolater desolating desolatingly desolation desolative desonation desophisticate desophistication desorption desoxalate desoxyanisoin desoxybenzoin desoxycinchonine desoxycorticosterone desoxymorphine desoxyribonucleic despair despairer despairful despairfully despairfulness despairing despairingly despairingness despecialization despecialize despecificate despecification despect desperacy desperado desperadoism desperate desperately desperateness desperation despicability despicable despicableness despicably despiritualization despiritualize despisable despisableness despisal despise despisedness despisement despiser despisingly despite despiteful despitefully despitefulness despiteous despiteously despoil despoiler despoilment despoliation despond despondence despondency despondent despondently desponder desponding despondingly despot despotat Despotes despotic despotically despoticalness despoticly despotism despotist despotize despumate despumation desquamate desquamation desquamative desquamatory dess dessa dessert dessertspoon dessertspoonful dessiatine dessil destabilize destain destandardize desterilization desterilize destinate destination destine destinezite destinism destinist destiny destitute destitutely destituteness destitution destour destress destrier destroy destroyable destroyer destroyingly destructibility destructible destructibleness destruction destructional destructionism destructionist destructive destructively destructiveness destructivism destructivity destructor destructuralize desubstantiate desucration desuete desuetude desugar desugarize Desulfovibrio desulphur desulphurate desulphuration desulphurization desulphurize desulphurizer desultor desultorily desultoriness desultorious desultory desuperheater desyatin desyl desynapsis desynaptic desynonymization desynonymize detach detachability detachable detachableness detachably detached detachedly detachedness detacher detachment detail detailed detailedly detailedness detailer detailism detailist detain detainable detainal detainer detainingly detainment detar detassel detax detect detectability detectable detectably detectaphone detecter detectible detection detective detectivism detector detenant detent detention detentive deter deterge detergence detergency detergent detergible deteriorate deterioration deteriorationist deteriorative deteriorator deteriorism deteriority determent determinability determinable determinableness determinably determinacy determinant determinantal determinate determinately determinateness determination determinative determinatively determinativeness determinator determine determined determinedly determinedness determiner determinism determinist deterministic determinoid deterrence deterrent detersion detersive detersively detersiveness detest detestability detestable detestableness detestably detestation detester dethronable dethrone dethronement dethroner dethyroidism detin detinet detinue detonable detonate detonation detonative detonator detorsion detour detoxicant detoxicate detoxication detoxicator detoxification detoxify detract detracter detractingly detraction detractive detractively detractiveness detractor detractory detractress detrain detrainment detribalization detribalize detriment detrimental detrimentality detrimentally detrimentalness detrital detrited detrition detritus Detroiter detrude detruncate detruncation detrusion detrusive detrusor detubation detumescence detune detur deuce deuced deucedly deul deurbanize deutencephalic deutencephalon deuteragonist deuteranomal deuteranomalous deuteranope deuteranopia deuteranopic deuteric deuteride deuterium deuteroalbumose deuterocanonical deuterocasease deuterocone deuteroconid deuterodome deuteroelastose deuterofibrinose deuterogamist deuterogamy deuterogelatose deuterogenic deuteroglobulose deuteromorphic Deuteromycetes deuteromyosinose deuteron Deuteronomic Deuteronomical Deuteronomist Deuteronomistic Deuteronomy deuteropathic deuteropathy deuteroplasm deuteroprism deuteroproteose deuteroscopic deuteroscopy deuterostoma Deuterostomata deuterostomatous deuterotokous deuterotoky deuterotype deuterovitellose deuterozooid deutobromide deutocarbonate deutochloride deutomala deutomalal deutomalar deutomerite deuton deutonephron deutonymph deutonymphal deutoplasm deutoplasmic deutoplastic deutoscolex deutoxide Deutzia dev deva devachan devadasi devall devaloka devalorize devaluate devaluation devalue devance devaporate devaporation devast devastate devastating devastatingly devastation devastative devastator devastavit devaster devata develin develop developability developable developedness developer developist development developmental developmentalist developmentally developmentarian developmentary developmentist developoid devertebrated devest deviability deviable deviancy deviant deviate deviation deviationism deviationist deviative deviator deviatory device deviceful devicefully devicefulness devil devilbird devildom deviled deviler deviless devilet devilfish devilhood deviling devilish devilishly devilishness devilism devilize devilkin devillike devilman devilment devilmonger devilry devilship deviltry devilward devilwise devilwood devily devious deviously deviousness devirginate devirgination devirginator devirilize devisable devisal deviscerate devisceration devise devisee deviser devisor devitalization devitalize devitalized devitaminize devitrification devitrify devocalization devocalize devoice devoid devoir devolatilize devolute devolution devolutionary devolutionist devolve devolvement Devon Devonian Devonic devonite devonport devonshire devorative devote devoted devotedly devotedness devotee devoteeism devotement devoter devotion devotional devotionalism devotionalist devotionality devotionally devotionalness devotionate devotionist devour devourable devourer devouress devouring devouringly devouringness devourment devout devoutless devoutlessly devoutlessness devoutly devoutness devow devulcanization devulcanize devulgarize devvel dew dewan dewanee dewanship dewater dewaterer dewax dewbeam dewberry dewclaw dewclawed dewcup dewdamp dewdrop dewdropper dewer Dewey deweylite dewfall dewflower dewily dewiness dewlap dewlapped dewless dewlight dewlike dewool deworm dewret dewtry dewworm dewy dexiocardia dexiotrope dexiotropic dexiotropism dexiotropous Dexter dexter dexterical dexterity dexterous dexterously dexterousness dextrad dextral dextrality dextrally dextran dextraural dextrin dextrinase dextrinate dextrinize dextrinous dextro dextroaural dextrocardia dextrocardial dextrocerebral dextrocular dextrocularity dextroduction dextroglucose dextrogyrate dextrogyration dextrogyratory dextrogyrous dextrolactic dextrolimonene dextropinene dextrorotary dextrorotatary dextrorotation dextrorsal dextrorse dextrorsely dextrosazone dextrose dextrosinistral dextrosinistrally dextrosuria dextrotartaric dextrotropic dextrotropous dextrous dextrously dextrousness dextroversion dey deyhouse deyship deywoman Dezaley dezinc dezincation dezincification dezincify dezymotize dha dhabb dhai dhak dhamnoo dhan dhangar dhanuk dhanush Dhanvantari dharana dharani dharma dharmakaya dharmashastra dharmasmriti dharmasutra dharmsala dharna dhaura dhauri dhava dhaw Dheneb dheri dhobi dhole dhoni dhoon dhoti dhoul dhow Dhritarashtra dhu dhunchee dhunchi Dhundia dhurra dhyal dhyana di diabase diabasic diabetes diabetic diabetogenic diabetogenous diabetometer diablerie diabolarch diabolarchy diabolatry diabolepsy diaboleptic diabolic diabolical diabolically diabolicalness diabolification diabolify diabolism diabolist diabolization diabolize diabological diabology diabolology diabrosis diabrotic Diabrotica diacanthous diacaustic diacetamide diacetate diacetic diacetin diacetine diacetonuria diaceturia diacetyl diacetylene diachoretic diachronic diachylon diachylum diacid diacipiperazine diaclase diaclasis diaclastic diacle diaclinal diacodion diacoele diacoelia diaconal diaconate diaconia diaconicon diaconicum diacope diacranterian diacranteric diacrisis diacritic diacritical diacritically Diacromyodi diacromyodian diact diactin diactinal diactinic diactinism Diadelphia diadelphian diadelphic diadelphous diadem Diadema Diadematoida diaderm diadermic diadoche Diadochi Diadochian diadochite diadochokinesia diadochokinetic diadromous diadumenus diaene diaereses diaeresis diaeretic diaetetae diagenesis diagenetic diageotropic diageotropism diaglyph diaglyphic diagnosable diagnose diagnoseable diagnoses diagnosis diagnostic diagnostically diagnosticate diagnostication diagnostician diagnostics diagometer diagonal diagonality diagonalize diagonally diagonalwise diagonic diagram diagrammatic diagrammatical diagrammatician diagrammatize diagrammeter diagrammitically diagraph diagraphic diagraphical diagraphics diagredium diagrydium Diaguitas Diaguite diaheliotropic diaheliotropically diaheliotropism diakinesis dial dialcohol dialdehyde dialect dialectal dialectalize dialectally dialectic dialectical dialectically dialectician dialecticism dialecticize dialectics dialectologer dialectological dialectologist dialectology dialector dialer dialin dialing dialist Dialister dialkyl dialkylamine diallage diallagic diallagite diallagoid diallel diallelon diallelus diallyl dialogic dialogical dialogically dialogism dialogist dialogistic dialogistical dialogistically dialogite dialogize dialogue dialoguer Dialonian dialuric dialycarpous Dialypetalae dialypetalous dialyphyllous dialysepalous dialysis dialystaminous dialystelic dialystely dialytic dialytically dialyzability dialyzable dialyzate dialyzation dialyzator dialyze dialyzer diamagnet diamagnetic diamagnetically diamagnetism diamantiferous diamantine diamantoid diamb diambic diamesogamous diameter diametral diametrally diametric diametrical diametrically diamicton diamide diamidogen diamine diaminogen diaminogene diammine diamminobromide diamminonitrate diammonium diamond diamondback diamonded diamondiferous diamondize diamondlike diamondwise diamondwork diamorphine diamylose Dian dian Diana Diancecht diander Diandria diandrian diandrous Diane dianetics Dianil dianilid dianilide dianisidin dianisidine dianite dianodal dianoetic dianoetical dianoetically Dianthaceae Dianthera Dianthus diapalma diapase diapasm diapason diapasonal diapause diapedesis diapedetic Diapensia Diapensiaceae diapensiaceous diapente diaper diapering diaphane diaphaneity diaphanie diaphanometer diaphanometric diaphanometry diaphanoscope diaphanoscopy diaphanotype diaphanous diaphanously diaphanousness diaphany diaphone diaphonia diaphonic diaphonical diaphony diaphoresis diaphoretic diaphoretical diaphorite diaphote diaphototropic diaphototropism diaphragm diaphragmal diaphragmatic diaphragmatically diaphtherin diaphysial diaphysis diaplasma diaplex diaplexal diaplexus diapnoic diapnotic diapophysial diapophysis Diaporthe diapositive diapsid Diapsida diapsidan diapyesis diapyetic diarch diarchial diarchic diarchy diarhemia diarial diarian diarist diaristic diarize diarrhea diarrheal diarrheic diarrhetic diarsenide diarthric diarthrodial diarthrosis diarticular diary diaschisis diaschisma diaschistic Diascia diascope diascopy diascord diascordium diaskeuasis diaskeuast Diaspidinae diaspidine Diaspinae diaspine diaspirin Diaspora diaspore diastaltic diastase diastasic diastasimetry diastasis diastataxic diastataxy diastatic diastatically diastem diastema diastematic diastematomyelia diaster diastole diastolic diastomatic diastral diastrophe diastrophic diastrophism diastrophy diasynthesis diasyrm diatessaron diathermacy diathermal diathermancy diathermaneity diathermanous diathermic diathermize diathermometer diathermotherapy diathermous diathermy diathesic diathesis diathetic diatom Diatoma Diatomaceae diatomacean diatomaceoid diatomaceous Diatomales Diatomeae diatomean diatomic diatomicity diatomiferous diatomin diatomist diatomite diatomous diatonic diatonical diatonically diatonous diatoric diatreme diatribe diatribist diatropic diatropism Diatryma Diatrymiformes Diau diaulic diaulos diaxial diaxon diazenithal diazeuctic diazeuxis diazide diazine diazoamine diazoamino diazoaminobenzene diazoanhydride diazoate diazobenzene diazohydroxide diazoic diazoimide diazoimido diazole diazoma diazomethane diazonium diazotate diazotic diazotizability diazotizable diazotization diazotize diazotype dib dibase dibasic dibasicity dibatag Dibatis dibber dibble dibbler dibbuk dibenzophenazine dibenzopyrrole dibenzoyl dibenzyl dibhole diblastula diborate Dibothriocephalus dibrach dibranch Dibranchia Dibranchiata dibranchiate dibranchious dibrom dibromid dibromide dibromoacetaldehyde dibromobenzene dibs dibstone dibutyrate dibutyrin dicacodyl Dicaeidae dicaeology dicalcic dicalcium dicarbonate dicarbonic dicarboxylate dicarboxylic dicarpellary dicaryon dicaryophase dicaryophyte dicaryotic dicast dicastery dicastic dicatalectic dicatalexis Diccon dice diceboard dicebox dicecup dicellate diceman Dicentra dicentrine dicephalism dicephalous dicephalus diceplay dicer Diceras Diceratidae dicerion dicerous dicetyl dich Dichapetalaceae Dichapetalum dichas dichasial dichasium dichastic Dichelyma dichlamydeous dichloramine dichlorhydrin dichloride dichloroacetic dichlorohydrin dichloromethane dichocarpism dichocarpous dichogamous dichogamy Dichondra Dichondraceae dichopodial dichoptic dichord dichoree Dichorisandra dichotic dichotomal dichotomic dichotomically dichotomist dichotomistic dichotomization dichotomize dichotomous dichotomously dichotomy dichroic dichroiscope dichroism dichroite dichroitic dichromasy dichromat dichromate dichromatic dichromatism dichromic dichromism dichronous dichrooscope dichroous dichroscope dichroscopic Dichter dicing Dick dick dickcissel dickens Dickensian Dickensiana dicker dickey dickeybird dickinsonite Dicksonia dicky Diclidantheraceae diclinic diclinism diclinous Diclytra dicoccous dicodeine dicoelious dicolic dicolon dicondylian dicot dicotyl dicotyledon dicotyledonary Dicotyledones dicotyledonous Dicotyles Dicotylidae dicotylous dicoumarin Dicranaceae dicranaceous dicranoid dicranterian Dicranum Dicrostonyx dicrotal dicrotic dicrotism dicrotous Dicruridae dicta Dictaen Dictamnus Dictaphone dictate dictatingly dictation dictational dictative dictator dictatorial dictatorialism dictatorially dictatorialness dictatorship dictatory dictatress dictatrix dictature dictic diction dictionary Dictograph dictum dictynid Dictynidae Dictyoceratina dictyoceratine dictyodromous dictyogen dictyogenous Dictyograptus dictyoid Dictyonema Dictyonina dictyonine Dictyophora dictyopteran Dictyopteris Dictyosiphon Dictyosiphonaceae dictyosiphonaceous dictyosome dictyostele dictyostelic Dictyota Dictyotaceae dictyotaceous Dictyotales dictyotic Dictyoxylon dicyanide dicyanine dicyanodiamide dicyanogen dicycle dicyclic Dicyclica dicyclist Dicyema Dicyemata dicyemid Dicyemida Dicyemidae Dicynodon dicynodont Dicynodontia Dicynodontidae did Didache Didachist didactic didactical didacticality didactically didactician didacticism didacticity didactics didactive didactyl didactylism didactylous didapper didascalar didascaliae didascalic didascalos didascaly didder diddle diddler diddy didelph Didelphia didelphian didelphic didelphid Didelphidae didelphine Didelphis didelphoid didelphous Didelphyidae didepsid didepside Dididae didie didine Didinium didle didna didnt Dido didodecahedral didodecahedron didrachma didrachmal didromy didst diductor Didunculidae Didunculinae Didunculus Didus didym didymate didymia didymitis didymium didymoid didymolite didymous didymus Didynamia didynamian didynamic didynamous didynamy die dieb dieback diectasis diedral diedric Dieffenbachia Diego Diegueno diehard dielectric dielectrically dielike Dielytra diem diemaker diemaking diencephalic diencephalon diene dier Dieri Diervilla diesel dieselization dieselize diesinker diesinking diesis diestock diet dietal dietarian dietary Dieter dieter dietetic dietetically dietetics dietetist diethanolamine diethyl diethylamine diethylenediamine diethylstilbestrol dietic dietician dietics dietine dietist dietitian dietotherapeutics dietotherapy dietotoxic dietotoxicity dietrichite dietzeite diewise Dieyerie diezeugmenon Difda diferrion diffame diffarreation differ difference differencingly different differentia differentiable differential differentialize differentially differentiant differentiate differentiation differentiator differently differentness differingly difficile difficileness difficult difficultly difficultness difficulty diffidation diffide diffidence diffident diffidently diffidentness diffinity diffluence diffluent Difflugia difform difformed difformity diffract diffraction diffractive diffractively diffractiveness diffractometer diffrangibility diffrangible diffugient diffusate diffuse diffused diffusedly diffusely diffuseness diffuser diffusibility diffusible diffusibleness diffusibly diffusimeter diffusiometer diffusion diffusionism diffusionist diffusive diffusively diffusiveness diffusivity diffusor diformin dig digallate digallic digametic digamist digamma digammated digammic digamous digamy digastric Digenea digeneous digenesis digenetic Digenetica digenic digenous digeny digerent digest digestant digested digestedly digestedness digester digestibility digestible digestibleness digestibly digestion digestional digestive digestively digestiveness digestment diggable digger digging diggings dight dighter digit digital digitalein digitalin digitalis digitalism digitalization digitalize digitally Digitaria digitate digitated digitately digitation digitiform Digitigrada digitigrade digitigradism digitinervate digitinerved digitipinnate digitize digitizer digitogenin digitonin digitoplantar digitorium digitoxin digitoxose digitule digitus digladiate digladiation digladiator diglossia diglot diglottic diglottism diglottist diglucoside diglyceride diglyph diglyphic digmeat dignification dignified dignifiedly dignifiedness dignify dignitarial dignitarian dignitary dignity digoneutic digoneutism digonoporous digonous Digor digram digraph digraphic digredience digrediency digredient digress digressingly digression digressional digressionary digressive digressively digressiveness digressory digs diguanide Digynia digynian digynous dihalide dihalo dihalogen dihedral dihedron dihexagonal dihexahedral dihexahedron dihybrid dihybridism dihydrate dihydrated dihydrazone dihydric dihydride dihydrite dihydrocupreine dihydrocuprin dihydrogen dihydrol dihydronaphthalene dihydronicotine dihydrotachysterol dihydroxy dihydroxysuccinic dihydroxytoluene dihysteria diiamb diiambus diiodide diiodo diiodoform diipenates Diipolia diisatogen dijudicate dijudication dika dikage dikamali dikaryon dikaryophase dikaryophasic dikaryophyte dikaryophytic dikaryotic Dike dike dikegrave dikelocephalid Dikelocephalus diker dikereeve dikeside diketo diketone dikkop diktyonite dilacerate dilaceration dilambdodont dilamination Dilantin dilapidate dilapidated dilapidation dilapidator dilatability dilatable dilatableness dilatably dilatancy dilatant dilatate dilatation dilatative dilatator dilatatory dilate dilated dilatedly dilatedness dilater dilatingly dilation dilative dilatometer dilatometric dilatometry dilator dilatorily dilatoriness dilatory dildo dilection Dilemi Dilemite dilemma dilemmatic dilemmatical dilemmatically dilettant dilettante dilettanteish dilettanteism dilettanteship dilettanti dilettantish dilettantism dilettantist diligence diligency diligent diligentia diligently diligentness dilker dill Dillenia Dilleniaceae dilleniaceous dilleniad dilli dillier dilligrout dilling dillseed dillue dilluer dillweed dilly dillydallier dillydally dillyman dilo dilogy diluent dilute diluted dilutedly dilutedness dilutee dilutely diluteness dilutent diluter dilution dilutive dilutor diluvia diluvial diluvialist diluvian diluvianism diluvion diluvium dim dimagnesic dimanganion dimanganous Dimaris dimastigate Dimatis dimber dimberdamber dimble dime dimensible dimension dimensional dimensionality dimensionally dimensioned dimensionless dimensive dimer Dimera dimeran dimercuric dimercurion dimercury dimeric dimeride dimerism dimerization dimerlie dimerous dimetallic dimeter dimethoxy dimethyl dimethylamine dimethylamino dimethylaniline dimethylbenzene dimetria dimetric Dimetry dimication dimidiate dimidiation diminish diminishable diminishableness diminisher diminishingly diminishment diminuendo diminutal diminute diminution diminutival diminutive diminutively diminutiveness diminutivize dimiss dimission dimissorial dimissory dimit Dimitry Dimittis dimity dimly dimmed dimmedness dimmer dimmest dimmet dimmish Dimna dimness dimolecular dimoric dimorph dimorphic dimorphism Dimorphotheca dimorphous dimple dimplement dimply dimps dimpsy Dimyaria dimyarian dimyaric din Dinah dinamode Dinantian dinaphthyl dinar Dinaric Dinarzade dinder dindle Dindymene Dindymus dine diner dinergate dineric dinero dinette dineuric ding dingar dingbat dingdong dinge dingee dinghee dinghy dingily dinginess dingle dingleberry dinglebird dingledangle dingly dingmaul dingo dingus Dingwall dingy dinheiro dinic dinical Dinichthys dining dinitrate dinitril dinitrile dinitro dinitrobenzene dinitrocellulose dinitrophenol dinitrotoluene dink Dinka dinkey dinkum dinky dinmont dinner dinnerless dinnerly dinnertime dinnerware dinnery Dinobryon Dinoceras Dinocerata dinoceratan dinoceratid Dinoceratidae Dinoflagellata Dinoflagellatae dinoflagellate Dinoflagellida dinomic Dinomys Dinophilea Dinophilus Dinophyceae Dinornis Dinornithes dinornithic dinornithid Dinornithidae Dinornithiformes dinornithine dinornithoid dinosaur Dinosauria dinosaurian dinothere Dinotheres dinotherian Dinotheriidae Dinotherium dinsome dint dintless dinus diobely diobol diocesan diocese Diocletian dioctahedral Dioctophyme diode Diodia Diodon diodont Diodontidae Dioecia dioecian dioeciodimorphous dioeciopolygamous dioecious dioeciously dioeciousness dioecism dioecy dioestrous dioestrum dioestrus Diogenean Diogenic diogenite dioicous diol diolefin diolefinic Diomedea Diomedeidae Dion Dionaea Dionaeaceae Dione dionise dionym dionymal Dionysia Dionysiac Dionysiacal Dionysiacally Dioon Diophantine Diopsidae diopside Diopsis dioptase diopter Dioptidae dioptograph dioptometer dioptometry dioptoscopy dioptra dioptral dioptrate dioptric dioptrical dioptrically dioptrics dioptrometer dioptrometry dioptroscopy dioptry diorama dioramic diordinal diorite dioritic diorthosis diorthotic Dioscorea Dioscoreaceae dioscoreaceous dioscorein dioscorine Dioscuri Dioscurian diose Diosma diosmin diosmose diosmosis diosmotic diosphenol Diospyraceae diospyraceous Diospyros diota diotic Diotocardia diovular dioxane dioxide dioxime dioxindole dioxy dip Dipala diparentum dipartite dipartition dipaschal dipentene dipeptid dipeptide dipetalous dipetto diphase diphaser diphasic diphead diphenol diphenyl diphenylamine diphenylchloroarsine diphenylene diphenylenimide diphenylguanidine diphenylmethane diphenylquinomethane diphenylthiourea diphosgene diphosphate diphosphide diphosphoric diphosphothiamine diphrelatic diphtheria diphtherial diphtherian diphtheric diphtheritic diphtheritically diphtheritis diphtheroid diphtheroidal diphtherotoxin diphthong diphthongal diphthongalize diphthongally diphthongation diphthongic diphthongization diphthongize diphycercal diphycercy Diphyes diphygenic diphyletic Diphylla Diphylleia Diphyllobothrium diphyllous diphyodont diphyozooid Diphysite Diphysitism diphyzooid dipicrate dipicrylamin dipicrylamine Diplacanthidae Diplacanthus diplacusis Dipladenia diplanar diplanetic diplanetism diplantidian diplarthrism diplarthrous diplasiasmus diplasic diplasion diplegia dipleidoscope dipleura dipleural dipleurogenesis dipleurogenetic diplex diplobacillus diplobacterium diploblastic diplocardia diplocardiac Diplocarpon diplocaulescent diplocephalous diplocephalus diplocephaly diplochlamydeous diplococcal diplococcemia diplococcic diplococcoid diplococcus diploconical diplocoria Diplodia Diplodocus Diplodus diploe diploetic diplogangliate diplogenesis diplogenetic diplogenic Diploglossata diploglossate diplograph diplographic diplographical diplography diplohedral diplohedron diploic diploid diploidic diploidion diploidy diplois diplokaryon diploma diplomacy diplomat diplomate diplomatic diplomatical diplomatically diplomatics diplomatism diplomatist diplomatize diplomatology diplomyelia diplonema diplonephridia diploneural diplont diploperistomic diplophase diplophyte diplopia diplopic diploplacula diploplacular diploplaculate diplopod Diplopoda diplopodic Diploptera diplopterous Diplopteryga diplopy diplosis diplosome diplosphenal diplosphene Diplospondyli diplospondylic diplospondylism diplostemonous diplostemony diplostichous Diplotaxis diplotegia diplotene Diplozoon diplumbic Dipneumona Dipneumones dipneumonous dipneustal Dipneusti dipnoan Dipnoi dipnoid dipnoous dipode dipodic Dipodidae Dipodomyinae Dipodomys dipody dipolar dipolarization dipolarize dipole diporpa dipotassic dipotassium dipped dipper dipperful dipping diprimary diprismatic dipropargyl dipropyl Diprotodon diprotodont Diprotodontia Dipsacaceae dipsacaceous Dipsaceae dipsaceous Dipsacus Dipsadinae dipsas dipsetic dipsey dipsomania dipsomaniac dipsomaniacal Dipsosaurus dipsosis dipter Diptera Dipteraceae dipteraceous dipterad dipteral dipteran dipterist dipterocarp Dipterocarpaceae dipterocarpaceous dipterocarpous Dipterocarpus dipterocecidium dipterological dipterologist dipterology dipteron dipteros dipterous Dipteryx diptote diptych Dipus dipware dipygus dipylon dipyre dipyrenous dipyridyl Dirca Dircaean dird dirdum dire direct directable directed directer direction directional directionally directionless directitude directive directively directiveness directivity directly directness Directoire director directoral directorate directorial directorially directorship directory directress directrices directrix direful direfully direfulness direly dirempt diremption direness direption dirge dirgeful dirgelike dirgeman dirgler dirhem Dirian Dirichletian dirigent dirigibility dirigible dirigomotor diriment Dirk dirk dirl dirndl dirt dirtbird dirtboard dirten dirtily dirtiness dirtplate dirty dis Disa disability disable disabled disablement disabusal disabuse disacceptance disaccharide disaccharose disaccommodate disaccommodation disaccord disaccordance disaccordant disaccustom disaccustomed disaccustomedness disacidify disacknowledge disacknowledgement disacquaint disacquaintance disadjust disadorn disadvance disadvantage disadvantageous disadvantageously disadvantageousness disadventure disadventurous disadvise disaffect disaffectation disaffected disaffectedly disaffectedness disaffection disaffectionate disaffiliate disaffiliation disaffirm disaffirmance disaffirmation disaffirmative disafforest disafforestation disafforestment disagglomeration disaggregate disaggregation disaggregative disagio disagree disagreeability disagreeable disagreeableness disagreeably disagreed disagreement disagreer disalicylide disalign disalignment disalike disallow disallowable disallowableness disallowance disally disamenity Disamis disanagrammatize disanalogous disangularize disanimal disanimate disanimation disannex disannexation disannul disannuller disannulment disanoint disanswerable disapostle disapparel disappear disappearance disappearer disappearing disappoint disappointed disappointedly disappointer disappointing disappointingly disappointingness disappointment disappreciate disappreciation disapprobation disapprobative disapprobatory disappropriate disappropriation disapprovable disapproval disapprove disapprover disapprovingly disaproned disarchbishop disarm disarmament disarmature disarmed disarmer disarming disarmingly disarrange disarrangement disarray disarticulate disarticulation disarticulator disasinate disasinize disassemble disassembly disassimilate disassimilation disassimilative disassociate disassociation disaster disastimeter disastrous disastrously disastrousness disattaint disattire disattune disauthenticate disauthorize disavow disavowable disavowal disavowedly disavower disavowment disawa disazo disbalance disbalancement disband disbandment disbar disbark disbarment disbelief disbelieve disbeliever disbelieving disbelievingly disbench disbenchment disbloom disbody disbosom disbowel disbrain disbranch disbud disbudder disburden disburdenment disbursable disburse disbursement disburser disburthen disbury disbutton disc discage discal discalceate discalced discanonization discanonize discanter discantus discapacitate discard discardable discarder discardment discarnate discarnation discase discastle discept disceptation disceptator discern discerner discernible discernibleness discernibly discerning discerningly discernment discerp discerpibility discerpible discerpibleness discerptibility discerptible discerptibleness discerption discharacter discharge dischargeable dischargee discharger discharging discharity discharm dischase Disciflorae discifloral disciform discigerous Discina discinct discinoid disciple disciplelike discipleship disciplinability disciplinable disciplinableness disciplinal disciplinant disciplinarian disciplinarianism disciplinarily disciplinary disciplinative disciplinatory discipline discipliner discipular discircumspection discission discitis disclaim disclaimant disclaimer disclamation disclamatory disclass disclassify disclike disclimax discloister disclose disclosed discloser disclosive disclosure discloud discoach discoactine discoblastic discoblastula discobolus discocarp discocarpium discocarpous discocephalous discodactyl discodactylous discogastrula discoglossid Discoglossidae discoglossoid discographical discography discohexaster discoid discoidal Discoidea Discoideae discolichen discolith discolor discolorate discoloration discolored discoloredness discolorization discolorment discolourization Discomedusae discomedusan discomedusoid discomfit discomfiter discomfiture discomfort discomfortable discomfortableness discomforting discomfortingly discommend discommendable discommendableness discommendably discommendation discommender discommode discommodious discommodiously discommodiousness discommodity discommon discommons discommunity discomorula discompliance discompose discomposed discomposedly discomposedness discomposing discomposingly discomposure discomycete Discomycetes discomycetous Disconanthae disconanthous disconcert disconcerted disconcertedly disconcertedness disconcerting disconcertingly disconcertingness disconcertion disconcertment disconcord disconduce disconducive Disconectae disconform disconformable disconformity discongruity disconjure disconnect disconnected disconnectedly disconnectedness disconnecter disconnection disconnective disconnectiveness disconnector disconsider disconsideration disconsolate disconsolately disconsolateness disconsolation disconsonancy disconsonant discontent discontented discontentedly discontentedness discontentful discontenting discontentive discontentment discontiguity discontiguous discontiguousness discontinuable discontinuance discontinuation discontinue discontinuee discontinuer discontinuity discontinuor discontinuous discontinuously discontinuousness disconula disconvenience disconvenient disconventicle discophile Discophora discophoran discophore discophorous discoplacenta discoplacental Discoplacentalia discoplacentalian discoplasm discopodous discord discordance discordancy discordant discordantly discordantness discordful Discordia discording discorporate discorrespondency discorrespondent discount discountable discountenance discountenancer discounter discouple discourage discourageable discouragement discourager discouraging discouragingly discouragingness discourse discourseless discourser discoursive discoursively discoursiveness discourteous discourteously discourteousness discourtesy discous discovenant discover discoverability discoverable discoverably discovered discoverer discovert discoverture discovery discreate discreation discredence discredit discreditability discreditable discreet discreetly discreetness discrepance discrepancy discrepant discrepantly discrepate discrepation discrested discrete discretely discreteness discretion discretional discretionally discretionarily discretionary discretive discretively discretiveness discriminability discriminable discriminal discriminant discriminantal discriminate discriminately discriminateness discriminating discriminatingly discrimination discriminational discriminative discriminatively discriminator discriminatory discrown disculpate disculpation disculpatory discumber discursative discursativeness discursify discursion discursive discursively discursiveness discursory discursus discurtain discus discuss discussable discussant discusser discussible discussion discussional discussionism discussionist discussive discussment discutable discutient disdain disdainable disdainer disdainful disdainfully disdainfulness disdainly disdeceive disdenominationalize disdiaclast disdiaclastic disdiapason disdiazo disdiplomatize disdodecahedroid disdub disease diseased diseasedly diseasedness diseaseful diseasefulness disecondary disedge disedification disedify diseducate diselder diselectrification diselectrify diselenide disematism disembargo disembark disembarkation disembarkment disembarrass disembarrassment disembattle disembed disembellish disembitter disembocation disembodiment disembody disembogue disemboguement disembosom disembowel disembowelment disembower disembroil disemburden diseme disemic disemplane disemploy disemployment disempower disenable disenablement disenact disenactment disenamor disenamour disenchain disenchant disenchanter disenchantingly disenchantment disenchantress disencharm disenclose disencumber disencumberment disencumbrance disendow disendower disendowment disenfranchise disenfranchisement disengage disengaged disengagedness disengagement disengirdle disenjoy disenjoyment disenmesh disennoble disennui disenshroud disenslave disensoul disensure disentail disentailment disentangle disentanglement disentangler disenthral disenthrall disenthrallment disenthralment disenthrone disenthronement disentitle disentomb disentombment disentrain disentrainment disentrammel disentrance disentrancement disentwine disenvelop disepalous disequalize disequalizer disequilibrate disequilibration disequilibrium disestablish disestablisher disestablishment disestablishmentarian disesteem disesteemer disestimation disexcommunicate disfaith disfame disfashion disfavor disfavorer disfeature disfeaturement disfellowship disfen disfiguration disfigurative disfigure disfigurement disfigurer disfiguringly disflesh disfoliage disforest disforestation disfranchise disfranchisement disfranchiser disfrequent disfriar disfrock disfurnish disfurnishment disgarland disgarnish disgarrison disgavel disgeneric disgenius disgig disglorify disglut disgood disgorge disgorgement disgorger disgospel disgown disgrace disgraceful disgracefully disgracefulness disgracement disgracer disgracious disgradation disgrade disgregate disgregation disgruntle disgruntlement disguisable disguisal disguise disguised disguisedly disguisedness disguiseless disguisement disguiser disguising disgulf disgust disgusted disgustedly disgustedness disguster disgustful disgustfully disgustfulness disgusting disgustingly disgustingness dish dishabilitate dishabilitation dishabille dishabituate dishallow dishallucination disharmonic disharmonical disharmonious disharmonism disharmonize disharmony dishboard dishcloth dishclout disheart dishearten disheartener disheartening dishearteningly disheartenment disheaven dished dishellenize dishelm disher disherent disherison disherit disheritment dishevel disheveled dishevelment dishexecontahedroid dishful Dishley dishlike dishling dishmaker dishmaking dishmonger dishome dishonest dishonestly dishonor dishonorable dishonorableness dishonorably dishonorary dishonorer dishorn dishorner dishorse dishouse dishpan dishpanful dishrag dishumanize dishwasher dishwashing dishwashings dishwater dishwatery dishwiper dishwiping disidentify disilane disilicane disilicate disilicic disilicid disilicide disillude disilluminate disillusion disillusionist disillusionize disillusionizer disillusionment disillusive disimagine disimbitter disimitate disimitation disimmure disimpark disimpassioned disimprison disimprisonment disimprove disimprovement disincarcerate disincarceration disincarnate disincarnation disinclination disincline disincorporate disincorporation disincrust disincrustant disincrustion disindividualize disinfect disinfectant disinfecter disinfection disinfective disinfector disinfest disinfestation disinfeudation disinflame disinflate disinflation disingenuity disingenuous disingenuously disingenuousness disinherison disinherit disinheritable disinheritance disinhume disinsulation disinsure disintegrable disintegrant disintegrate disintegration disintegrationist disintegrative disintegrator disintegratory disintegrity disintegrous disintensify disinter disinterest disinterested disinterestedly disinterestedness disinteresting disinterment disintertwine disintrench disintricate disinvagination disinvest disinvestiture disinvigorate disinvite disinvolve disjasked disject disjection disjoin disjoinable disjoint disjointed disjointedly disjointedness disjointly disjointure disjunct disjunction disjunctive disjunctively disjunctor disjuncture disjune disk diskelion diskless disklike dislaurel disleaf dislegitimate dislevelment dislicense dislikable dislike dislikelihood disliker disliking dislimn dislink dislip disload dislocability dislocable dislocate dislocated dislocatedly dislocatedness dislocation dislocator dislocatory dislodge dislodgeable dislodgement dislove disloyal disloyalist disloyally disloyalty disluster dismain dismal dismality dismalize dismally dismalness disman dismantle dismantlement dismantler dismarble dismark dismarket dismask dismast dismastment dismay dismayable dismayed dismayedness dismayful dismayfully dismayingly disme dismember dismembered dismemberer dismemberment dismembrate dismembrator disminion disminister dismiss dismissable dismissal dismissible dismissingly dismission dismissive dismissory dismoded dismount dismountable dismutation disna disnaturalization disnaturalize disnature disnest disnew disniche disnosed disnumber disobedience disobedient disobediently disobey disobeyal disobeyer disobligation disoblige disobliger disobliging disobligingly disobligingness disoccupation disoccupy disodic disodium disomatic disomatous disomic disomus disoperculate disorb disorchard disordained disorder disordered disorderedly disorderedness disorderer disorderliness disorderly disordinated disordination disorganic disorganization disorganize disorganizer disorient disorientate disorientation disown disownable disownment disoxygenate disoxygenation disozonize dispapalize disparage disparageable disparagement disparager disparaging disparagingly disparate disparately disparateness disparation disparity dispark dispart dispartment dispassionate dispassionately dispassionateness dispassioned dispatch dispatcher dispatchful dispatriated dispauper dispauperize dispeace dispeaceful dispel dispeller dispend dispender dispendious dispendiously dispenditure dispensability dispensable dispensableness dispensary dispensate dispensation dispensational dispensative dispensatively dispensator dispensatorily dispensatory dispensatress dispensatrix dispense dispenser dispensingly dispeople dispeoplement dispeopler dispergate dispergation dispergator dispericraniate disperiwig dispermic dispermous dispermy dispersal dispersant disperse dispersed dispersedly dispersedness dispersement disperser dispersibility dispersible dispersion dispersity dispersive dispersively dispersiveness dispersoid dispersoidological dispersoidology dispersonalize dispersonate dispersonification dispersonify dispetal disphenoid dispiece dispireme dispirit dispirited dispiritedly dispiritedness dispiritingly dispiritment dispiteous dispiteously dispiteousness displace displaceability displaceable displacement displacency displacer displant display displayable displayed displayer displease displeased displeasedly displeaser displeasing displeasingly displeasingness displeasurable displeasurably displeasure displeasurement displenish displicency displume displuviate dispondaic dispondee dispone disponee disponent disponer dispope dispopularize disporous disport disportive disportment Disporum disposability disposable disposableness disposal dispose disposed disposedly disposedness disposer disposingly disposition dispositional dispositioned dispositive dispositively dispossess dispossession dispossessor dispossessory dispost disposure dispowder dispractice dispraise dispraiser dispraisingly dispread dispreader disprejudice disprepare disprince disprison disprivacied disprivilege disprize disprobabilization disprobabilize disprobative dispromise disproof disproportion disproportionable disproportionableness disproportionably disproportional disproportionality disproportionally disproportionalness disproportionate disproportionately disproportionateness disproportionation disprovable disproval disprove disprovement disproven disprover dispulp dispunct dispunishable dispunitive disputability disputable disputableness disputably disputant disputation disputatious disputatiously disputatiousness disputative disputatively disputativeness disputator dispute disputeless disputer disqualification disqualify disquantity disquiet disquieted disquietedly disquietedness disquieten disquieter disquieting disquietingly disquietly disquietness disquietude disquiparancy disquiparant disquiparation disquisite disquisition disquisitional disquisitionary disquisitive disquisitively disquisitor disquisitorial disquisitory disquixote disrank disrate disrealize disrecommendation disregard disregardable disregardance disregardant disregarder disregardful disregardfully disregardfulness disrelated disrelation disrelish disrelishable disremember disrepair disreputability disreputable disreputableness disreputably disreputation disrepute disrespect disrespecter disrespectful disrespectfully disrespectfulness disrestore disring disrobe disrobement disrober disroof disroost disroot disrudder disrump disrupt disruptability disruptable disrupter disruption disruptionist disruptive disruptively disruptiveness disruptment disruptor disrupture diss dissatisfaction dissatisfactoriness dissatisfactory dissatisfied dissatisfiedly dissatisfiedness dissatisfy dissaturate disscepter disseat dissect dissected dissectible dissecting dissection dissectional dissective dissector disseize disseizee disseizin disseizor disseizoress disselboom dissemblance dissemble dissembler dissemblingly dissembly dissemilative disseminate dissemination disseminative disseminator disseminule dissension dissensualize dissent dissentaneous dissentaneousness dissenter dissenterism dissentience dissentiency dissentient dissenting dissentingly dissentious dissentiously dissentism dissentment dissepiment dissepimental dissert dissertate dissertation dissertational dissertationist dissertative dissertator disserve disservice disserviceable disserviceableness disserviceably dissettlement dissever disseverance disseverment disshadow dissheathe disshroud dissidence dissident dissidently dissight dissightly dissiliency dissilient dissimilar dissimilarity dissimilarly dissimilars dissimilate dissimilation dissimilatory dissimile dissimilitude dissimulate dissimulation dissimulative dissimulator dissimule dissimuler dissipable dissipate dissipated dissipatedly dissipatedness dissipater dissipation dissipative dissipativity dissipator dissociability dissociable dissociableness dissocial dissociality dissocialize dissociant dissociate dissociation dissociative dissoconch dissogeny dissogony dissolubility dissoluble dissolubleness dissolute dissolutely dissoluteness dissolution dissolutional dissolutionism dissolutionist dissolutive dissolvable dissolvableness dissolve dissolveability dissolvent dissolver dissolving dissolvingly dissonance dissonancy dissonant dissonantly dissonous dissoul dissuade dissuader dissuasion dissuasive dissuasively dissuasiveness dissuasory dissuit dissuitable dissuited dissyllabic dissyllabification dissyllabify dissyllabism dissyllabize dissyllable dissymmetric dissymmetrical dissymmetrically dissymmetry dissympathize dissympathy distad distaff distain distal distale distally distalwards distance distanceless distancy distannic distant distantly distantness distaste distasted distasteful distastefully distastefulness distater distemonous distemper distemperature distempered distemperedly distemperedness distemperer distenant distend distendedly distender distensibility distensible distensive distent distention disthene disthrall disthrone distich Distichlis distichous distichously distill distillable distillage distilland distillate distillation distillatory distilled distiller distillery distilling distillmint distinct distinctify distinction distinctional distinctionless distinctive distinctively distinctiveness distinctly distinctness distingue distinguish distinguishability distinguishable distinguishableness distinguishably distinguished distinguishedly distinguisher distinguishing distinguishingly distinguishment distoclusion Distoma Distomatidae distomatosis distomatous distome distomian distomiasis Distomidae Distomum distort distorted distortedly distortedness distorter distortion distortional distortionist distortionless distortive distract distracted distractedly distractedness distracter distractibility distractible distractingly distraction distractive distractively distrain distrainable distrainee distrainer distrainment distrainor distraint distrait distraite distraught distress distressed distressedly distressedness distressful distressfully distressfulness distressing distressingly distributable distributary distribute distributed distributedly distributee distributer distribution distributional distributionist distributival distributive distributively distributiveness distributor distributress district distrouser distrust distruster distrustful distrustfully distrustfulness distrustingly distune disturb disturbance disturbative disturbed disturbedly disturber disturbing disturbingly disturn disturnpike disubstituted disubstitution disulfonic disulfuric disulphate disulphide disulphonate disulphone disulphonic disulphoxide disulphuret disulphuric disuniform disuniformity disunify disunion disunionism disunionist disunite disuniter disunity disusage disusance disuse disutility disutilize disvaluation disvalue disvertebrate disvisage disvoice disvulnerability diswarren diswench diswood disworth disyllabic disyllable disyoke dit dita dital ditch ditchbank ditchbur ditchdigger ditchdown ditcher ditchless ditchside ditchwater dite diter diterpene ditertiary ditetragonal dithalous dithecal ditheism ditheist ditheistic ditheistical dithematic dither dithery dithiobenzoic dithioglycol dithioic dithion dithionate dithionic dithionite dithionous dithymol dithyramb dithyrambic dithyrambically Dithyrambos Dithyrambus ditokous ditolyl ditone ditrematous ditremid Ditremidae ditrichotomous ditriglyph ditriglyphic ditrigonal ditrigonally Ditrocha ditrochean ditrochee ditrochous ditroite dittamy dittander dittany dittay dittied ditto dittogram dittograph dittographic dittography dittology ditty diumvirate diuranate diureide diuresis diuretic diuretically diureticalness Diurna diurnal diurnally diurnalness diurnation diurne diurnule diuturnal diuturnity div diva divagate divagation divalence divalent divan divariant divaricate divaricately divaricating divaricatingly divarication divaricator divata dive divekeeper divel divellent divellicate diver diverge divergement divergence divergency divergent divergently diverging divergingly divers diverse diversely diverseness diversicolored diversifiability diversifiable diversification diversified diversifier diversiflorate diversiflorous diversifoliate diversifolious diversiform diversify diversion diversional diversionary diversipedate diversisporous diversity diversly diversory divert divertedly diverter divertibility divertible diverticle diverticular diverticulate diverticulitis diverticulosis diverticulum diverting divertingly divertingness divertisement divertive divertor divest divestible divestitive divestiture divestment divesture dividable dividableness divide divided dividedly dividedness dividend divider dividing dividingly dividual dividualism dividually dividuity dividuous divinable divinail divination divinator divinatory divine divinely divineness diviner divineress diving divinify divining diviningly divinity divinityship divinization divinize divinyl divisibility divisible divisibleness divisibly division divisional divisionally divisionary divisionism divisionist divisionistic divisive divisively divisiveness divisor divisorial divisory divisural divorce divorceable divorcee divorcement divorcer divorcible divorcive divot divoto divulgate divulgater divulgation divulgatory divulge divulgement divulgence divulger divulse divulsion divulsive divulsor divus Divvers divvy diwata dixenite Dixie dixie Dixiecrat dixit dixy dizain dizen dizenment dizoic dizygotic dizzard dizzily dizziness dizzy Djagatay djasakid djave djehad djerib djersa Djuka do doab doable doarium doat doated doater doating doatish Dob dob dobbed dobber dobbin dobbing dobby dobe dobla doblon dobra dobrao dobson doby doc docent docentship Docetae Docetic Docetically Docetism Docetist Docetistic Docetize dochmiac dochmiacal dochmiasis dochmius docibility docible docibleness docile docilely docility docimasia docimastic docimastical docimasy docimology docity dock dockage docken docker docket dockhead dockhouse dockization dockize dockland dockmackie dockman dockmaster dockside dockyard dockyardman docmac Docoglossa docoglossan docoglossate docosane doctor doctoral doctorally doctorate doctorbird doctordom doctoress doctorfish doctorhood doctorial doctorially doctorization doctorize doctorless doctorlike doctorly doctorship doctress doctrinaire doctrinairism doctrinal doctrinalism doctrinalist doctrinality doctrinally doctrinarian doctrinarianism doctrinarily doctrinarity doctrinary doctrinate doctrine doctrinism doctrinist doctrinization doctrinize doctrix document documental documentalist documentarily documentary documentation documentize dod dodd doddart dodded dodder doddered dodderer doddering doddery doddie dodding doddle doddy doddypoll Dode dodecade dodecadrachm dodecafid dodecagon dodecagonal dodecahedral dodecahedric dodecahedron dodecahydrate dodecahydrated dodecamerous dodecane Dodecanesian dodecanoic dodecant dodecapartite dodecapetalous dodecarch dodecarchy dodecasemic dodecastyle dodecastylos dodecasyllabic dodecasyllable dodecatemory Dodecatheon dodecatoic dodecatyl dodecatylic dodecuplet dodecyl dodecylene dodecylic dodge dodgeful dodger dodgery dodgily dodginess dodgy dodkin dodlet dodman dodo dodoism Dodona Dodonaea Dodonaeaceae Dodonaean Dodonean Dodonian dodrans doe doebird Doedicurus Doeg doeglic doegling doer does doeskin doesnt doest doff doffer doftberry dog dogal dogate dogbane Dogberry dogberry Dogberrydom Dogberryism dogbite dogblow dogboat dogbolt dogbush dogcart dogcatcher dogdom doge dogedom dogeless dogeship dogface dogfall dogfight dogfish dogfoot dogged doggedly doggedness dogger doggerel doggereler doggerelism doggerelist doggerelize doggerelizer doggery doggess doggish doggishly doggishness doggo doggone doggoned doggrel doggrelize doggy doghead doghearted doghole doghood doghouse dogie dogless doglike dogly dogma dogman dogmata dogmatic dogmatical dogmatically dogmaticalness dogmatician dogmatics dogmatism dogmatist dogmatization dogmatize dogmatizer dogmouth dogplate dogproof Dogra Dogrib dogs dogship dogshore dogskin dogsleep dogstone dogtail dogtie dogtooth dogtoothing dogtrick dogtrot dogvane dogwatch dogwood dogy doigt doiled doily doina doing doings doit doited doitkin doitrified doke Doketic Doketism dokhma dokimastic Dokmarok Doko Dol dola dolabra dolabrate dolabriform dolcan dolcian dolciano dolcino doldrum doldrums dole dolefish doleful dolefully dolefulness dolefuls dolent dolently dolerite doleritic dolerophanite dolesman dolesome dolesomely dolesomeness doless doli dolia dolichoblond dolichocephal dolichocephali dolichocephalic dolichocephalism dolichocephalize dolichocephalous dolichocephaly dolichocercic dolichocnemic dolichocranial dolichofacial Dolichoglossus dolichohieric Dolicholus dolichopellic dolichopodous dolichoprosopic Dolichopsyllidae Dolichos dolichos dolichosaur Dolichosauri Dolichosauria Dolichosaurus Dolichosoma dolichostylous dolichotmema dolichuric dolichurus Doliidae dolina doline dolioform Doliolidae Doliolum dolium doll dollar dollarbird dollardee dollardom dollarfish dollarleaf dollbeer dolldom dollface dollfish dollhood dollhouse dollier dolliness dollish dollishly dollishness dollmaker dollmaking dollop dollship dolly dollyman dollyway dolman dolmen dolmenic Dolomedes dolomite dolomitic dolomitization dolomitize dolomization dolomize dolor Dolores doloriferous dolorific dolorifuge dolorous dolorously dolorousness dolose dolous Dolph dolphin dolphinlike Dolphus dolt dolthead doltish doltishly doltishness dom domain domainal domal domanial domatium domatophobia domba Dombeya Domdaniel dome domelike doment domer domesday domestic domesticable domesticality domestically domesticate domestication domesticative domesticator domesticity domesticize domett domeykite domic domical domically Domicella domicile domicilement domiciliar domiciliary domiciliate domiciliation dominance dominancy dominant dominantly dominate dominated dominatingly domination dominative dominator domine domineer domineerer domineering domineeringly domineeringness dominial Dominic dominical dominicale Dominican Dominick dominie dominion dominionism dominionist Dominique dominium domino dominus domitable domite Domitian domitic domn domnei domoid dompt domy Don don donable Donacidae donaciform Donal Donald Donar donary donatary donate donated donatee Donatiaceae donation Donatism Donatist Donatistic Donatistical donative donatively donator donatory donatress donax doncella Dondia done donee Donet doney dong donga Dongola Dongolese dongon Donia donjon donkey donkeyback donkeyish donkeyism donkeyman donkeywork Donmeh Donn Donna donna Donne donnered donnert Donnie donnish donnishness donnism donnot donor donorship donought Donovan donship donsie dont donum doob doocot doodab doodad Doodia doodle doodlebug doodler doodlesack doohickey doohickus doohinkey doohinkus dooja dook dooket dookit dool doolee dooley dooli doolie dooly doom doomage doombook doomer doomful dooms doomsday doomsman doomstead doon door doorba doorbell doorboy doorbrand doorcase doorcheek doored doorframe doorhead doorjamb doorkeeper doorknob doorless doorlike doormaid doormaker doormaking doorman doornail doorplate doorpost doorsill doorstead doorstep doorstone doorstop doorward doorway doorweed doorwise dooryard dop dopa dopamelanin dopaoxidase dopatta dope dopebook doper dopester dopey doppelkummel Dopper dopper doppia Doppler dopplerite Dor dor Dora dorab dorad Doradidae dorado doraphobia Dorask Doraskean dorbeetle Dorcas dorcastry Dorcatherium Dorcopsis doree dorestane dorhawk Dori doria Dorian Doric Dorical Doricism Doricize Dorididae Dorine Doris Dorism Dorize dorje Dorking dorlach dorlot dorm dormancy dormant dormer dormered dormie dormient dormilona dormition dormitive dormitory dormouse dormy dorn dorneck dornic dornick dornock Dorobo Doronicum Dorosoma Dorothea Dorothy dorp dorsabdominal dorsabdominally dorsad dorsal dorsale dorsalgia dorsalis dorsally dorsalmost dorsalward dorsalwards dorsel dorser dorsibranch Dorsibranchiata dorsibranchiate dorsicollar dorsicolumn dorsicommissure dorsicornu dorsiduct dorsiferous dorsifixed dorsiflex dorsiflexion dorsiflexor dorsigrade dorsilateral dorsilumbar dorsimedian dorsimesal dorsimeson dorsiparous dorsispinal dorsiventral dorsiventrality dorsiventrally dorsoabdominal dorsoanterior dorsoapical Dorsobranchiata dorsocaudad dorsocaudal dorsocentral dorsocephalad dorsocephalic dorsocervical dorsocervically dorsodynia dorsoepitrochlear dorsointercostal dorsointestinal dorsolateral dorsolumbar dorsomedial dorsomedian dorsomesal dorsonasal dorsonuchal dorsopleural dorsoposteriad dorsoposterior dorsoradial dorsosacral dorsoscapular dorsosternal dorsothoracic dorsoventrad dorsoventral dorsoventrally Dorstenia dorsulum dorsum dorsumbonal dorter dortiness dortiship dorts dorty doruck Dory dory Doryanthes Dorylinae doryphorus dos dosa dosadh dosage dose doser dosimeter dosimetric dosimetrician dosimetrist dosimetry Dosinia dosiology dosis Dositheans dosology doss dossal dossel dosser dosseret dossier dossil dossman Dot dot dotage dotal dotard dotardism dotardly dotardy dotate dotation dotchin dote doted doter Dothideacea dothideaceous Dothideales Dothidella dothienenteritis Dothiorella dotiness doting dotingly dotingness dotish dotishness dotkin dotless dotlike Doto Dotonidae dotriacontane dotted dotter dotterel dottily dottiness dotting dottle dottler Dottore Dotty dotty doty douar double doubled doubledamn doubleganger doublegear doublehanded doublehandedly doublehandedness doublehatching doublehearted doubleheartedness doublehorned doubleleaf doublelunged doubleness doubler doublet doubleted doubleton doubletone doubletree doublets doubling doubloon doubly doubt doubtable doubtably doubtedly doubter doubtful doubtfully doubtfulness doubting doubtingly doubtingness doubtless doubtlessly doubtlessness doubtmonger doubtous doubtsome douc douce doucely douceness doucet douche doucin doucine doudle Doug dough doughbird doughboy doughface doughfaceism doughfoot doughhead doughiness doughlike doughmaker doughmaking doughman doughnut dought doughtily doughtiness doughty doughy Douglas doulocracy doum doundake doup douping dour dourine dourly dourness douse douser dout douter doutous douzepers douzieme dove dovecot doveflower dovefoot dovehouse dovekey dovekie dovelet dovelike doveling dover dovetail dovetailed dovetailer dovetailwise doveweed dovewood dovish Dovyalis dow dowable dowager dowagerism dowcet dowd dowdily dowdiness dowdy dowdyish dowdyism dowed dowel dower doweral doweress dowerless dowery dowf dowie Dowieism Dowieite dowily dowiness dowitch dowitcher dowl dowlas dowless down downbear downbeard downbeat downby downcast downcastly downcastness downcome downcomer downcoming downcry downcurved downcut downdale downdraft downer downface downfall downfallen downfalling downfeed downflow downfold downfolded downgate downgone downgrade downgrowth downhanging downhaul downheaded downhearted downheartedly downheartedness downhill downily downiness Downing Downingia downland downless downlie downlier downligging downlike downline downlooked downlooker downlying downmost downness downpour downpouring downright downrightly downrightness downrush downrushing downset downshare downshore downside downsinking downsitting downsliding downslip downslope downsman downspout downstage downstairs downstate downstater downstream downstreet downstroke downswing downtake downthrow downthrown downthrust Downton downtown downtrampling downtreading downtrend downtrodden downtroddenness downturn downward downwardly downwardness downway downweed downweigh downweight downweighted downwind downwith downy dowp dowry dowsabel dowse dowser dowset doxa Doxantha doxastic doxasticon doxographer doxographical doxography doxological doxologically doxologize doxology doxy Doyle doze dozed dozen dozener dozenth dozer dozily doziness dozy dozzled drab Draba drabbet drabbish drabble drabbler drabbletail drabbletailed drabby drably drabness Dracaena Dracaenaceae drachm drachma drachmae drachmai drachmal dracma Draco Dracocephalum Draconian Draconianism Draconic draconic Draconically Draconid Draconis Draconism draconites draconitic dracontian dracontiasis dracontic dracontine dracontites Dracontium dracunculus draegerman draff draffman draffy draft draftage draftee drafter draftily draftiness drafting draftman draftmanship draftproof draftsman draftsmanship draftswoman draftswomanship draftwoman drafty drag dragade dragbar dragbolt dragged dragger draggily dragginess dragging draggingly draggle draggletail draggletailed draggletailedly draggletailedness draggly draggy draghound dragline dragman dragnet drago dragoman dragomanate dragomanic dragomanish dragon dragonesque dragoness dragonet dragonfish dragonfly dragonhead dragonhood dragonish dragonism dragonize dragonkind dragonlike dragonnade dragonroot dragontail dragonwort dragoon dragoonable dragoonade dragoonage dragooner dragrope dragsaw dragsawing dragsman dragstaff drail drain drainable drainage drainboard draine drained drainer drainerman drainless drainman drainpipe draintile draisine drake drakestone drakonite dram drama dramalogue Dramamine dramatic dramatical dramatically dramaticism dramatics dramaticule dramatism dramatist dramatizable dramatization dramatize dramatizer dramaturge dramaturgic dramaturgical dramaturgist dramaturgy dramm drammage dramme drammed drammer dramming drammock dramseller dramshop drang drank drant drapable Draparnaldia drape drapeable draper draperess draperied drapery drapetomania drapping drassid Drassidae drastic drastically drat dratchell drate dratted dratting draught draughtboard draughthouse draughtman draughtmanship draughts draughtsman draughtsmanship draughtswoman draughtswomanship Dravida Dravidian Dravidic dravya draw drawable drawarm drawback drawbar drawbeam drawbench drawboard drawbolt drawbore drawboy drawbridge Drawcansir drawcut drawdown drawee drawer drawers drawfile drawfiling drawgate drawgear drawglove drawhead drawhorse drawing drawk drawknife drawknot drawl drawlatch drawler drawling drawlingly drawlingness drawlink drawloom drawly drawn drawnet drawoff drawout drawplate drawpoint drawrod drawshave drawsheet drawspan drawspring drawstop drawstring drawtongs drawtube dray drayage drayman drazel dread dreadable dreader dreadful dreadfully dreadfulness dreadingly dreadless dreadlessly dreadlessness dreadly dreadness dreadnought dream dreamage dreamer dreamery dreamful dreamfully dreamfulness dreamhole dreamily dreaminess dreamingly dreamish dreamland dreamless dreamlessly dreamlessness dreamlet dreamlike dreamlit dreamlore dreamsily dreamsiness dreamsy dreamt dreamtide dreamwhile dreamwise dreamworld dreamy drear drearfully drearily dreariment dreariness drearisome drearly drearness dreary dredge dredgeful dredger dredging dree dreep dreepiness dreepy dreg dreggily dregginess dreggish dreggy dregless dregs dreiling Dreissensia dreissiger drench drencher drenching drenchingly dreng drengage Drepanaspis Drepanidae Drepanididae drepaniform Drepanis drepanium drepanoid Dreparnaudia dress dressage dressed dresser dressership dressily dressiness dressing dressline dressmaker dressmakership dressmakery dressmaking dressy drest Drew drew drewite Dreyfusism Dreyfusist drias drib dribble dribblement dribbler driblet driddle dried drier drierman driest drift driftage driftbolt drifter drifting driftingly driftland driftless driftlessness driftlet driftman driftpiece driftpin driftway driftweed driftwind driftwood drifty drightin drill driller drillet drilling drillman drillmaster drillstock Drimys dringle drink drinkability drinkable drinkableness drinkably drinker drinking drinkless drinkproof drinn drip dripper dripping dripple dripproof drippy dripstick dripstone drisheen drisk drivable drivage drive driveaway driveboat drivebolt drivehead drivel driveler drivelingly driven drivepipe driver driverless drivership drivescrew driveway drivewell driving drivingly drizzle drizzly drochuil droddum drofland drogh drogher drogherman drogue droit droitsman droitural droiturel Drokpa droll drollery drollingly drollish drollishness drollist drollness drolly Dromaeognathae dromaeognathism dromaeognathous Dromaeus drome dromedarian dromedarist dromedary drometer Dromiacea dromic Dromiceiidae Dromiceius Dromicia dromograph dromomania dromometer dromond Dromornis dromos dromotropic drona dronage drone dronepipe droner drongo droningly dronish dronishly dronishness dronkgrass drony drool droop drooper drooping droopingly droopingness droopt droopy drop dropberry dropcloth dropflower drophead droplet droplight droplike dropling dropman dropout dropper dropping droppingly droppy dropseed dropsical dropsically dropsicalness dropsied dropsy dropsywort dropt dropwise dropworm dropwort Droschken Drosera Droseraceae droseraceous droshky drosky drosograph drosometer Drosophila Drosophilidae Drosophyllum dross drossel drosser drossiness drossless drossy drostdy droud drought droughtiness droughty drouk drove drover drovy drow drown drowner drowningly drowse drowsily drowsiness drowsy drub drubber drubbing drubbly drucken drudge drudger drudgery drudgingly drudgism druery drug drugeteria drugger druggery drugget druggeting druggist druggister druggy drugless drugman drugshop drugstore druid druidess druidic druidical druidism druidry druith Drukpa drum drumbeat drumble drumbledore drumbler drumfire drumfish drumhead drumheads drumlike drumlin drumline drumlinoid drumloid drumloidal drumly drummer drumming drummy drumskin drumstick drumwood drung drungar drunk drunkard drunken drunkenly drunkenness drunkensome drunkenwise drunkery Drupa Drupaceae drupaceous drupal drupe drupel drupelet drupeole drupetum drupiferous Druse druse Drusean Drusedom drusy druxiness druxy dry dryad dryadetum dryadic dryas dryasdust drybeard drybrained drycoal Drydenian Drydenism dryfoot drygoodsman dryhouse drying dryish dryly Drynaria dryness Dryobalanops Dryope Dryopes Dryophyllum Dryopians dryopithecid Dryopithecinae dryopithecine Dryopithecus Dryops Dryopteris dryopteroid drysalter drysaltery dryster dryth dryworker Dschubba duad duadic dual Duala duali dualin dualism dualist dualistic dualistically duality dualization dualize dually Dualmutef dualogue Duane duarch duarchy dub dubash dubb dubba dubbah dubbeltje dubber dubbing dubby Dubhe Dubhgall dubiety dubiocrystalline dubiosity dubious dubiously dubiousness dubitable dubitably dubitancy dubitant dubitate dubitatingly dubitation dubitative dubitatively Duboisia duboisin duboisine Dubonnet dubs ducal ducally ducamara ducape ducat ducato ducatoon ducdame duces Duchesnea Duchess duchess duchesse duchesslike duchy duck duckbill duckblind duckboard duckboat ducker duckery duckfoot duckhearted duckhood duckhouse duckhunting duckie ducking duckling ducklingship duckmeat duckpin duckpond duckstone duckweed duckwife duckwing Duco duct ducted ductibility ductible ductile ductilely ductileness ductilimeter ductility ductilize duction ductless ductor ductule Ducula Duculinae dud dudaim dudder duddery duddies dude dudeen dudgeon dudine dudish dudishness dudism dudler dudley Dudleya dudleyite dudman due duel dueler dueling duelist duelistic duello dueness duenna duennadom duennaship duer Duessa duet duettist duff duffadar duffel duffer dufferdom duffing dufoil dufrenite dufrenoysite dufter dufterdar duftery dug dugal dugdug duggler dugong Dugongidae dugout dugway duhat Duhr duiker duikerbok duim Duit duit dujan Duke duke dukedom dukeling dukely dukery dukeship dukhn dukker dukkeripen Dulanganes Dulat dulbert dulcet dulcetly dulcetness dulcian dulciana dulcification dulcifluous dulcify dulcigenic dulcimer Dulcin Dulcinea Dulcinist dulcitol dulcitude dulcose duledge duler dulia dull dullard dullardism dullardness dullbrained duller dullery dullhead dullhearted dullification dullify dullish dullity dullness dullpate dullsome dully dulosis dulotic dulse dulseman dult dultie dulwilly duly dum duma dumaist dumb dumba dumbbell dumbbeller dumbcow dumbfounder dumbfounderment dumbhead dumbledore dumbly dumbness dumdum dumetose dumfound dumfounder dumfounderment dummel dummered dumminess dummy dummyism dummyweed Dumontia Dumontiaceae dumontite dumortierite dumose dumosity dump dumpage dumpcart dumper dumpily dumpiness dumping dumpish dumpishly dumpishness dumple dumpling dumpoke dumpy dumsola dun dunair dunal dunbird Duncan dunce duncedom duncehood duncery dunch Dunciad duncical duncify duncish duncishly duncishness dundasite dunder dunderhead dunderheaded dunderheadedness dunderpate dune dunelike dunfish dung Dungan dungannonite dungaree dungbeck dungbird dungbred dungeon dungeoner dungeonlike dunger dunghill dunghilly dungol dungon dungy dungyard dunite dunk dunkadoo Dunkard Dunker dunker Dunkirk Dunkirker Dunlap dunlin Dunlop dunnage dunne dunner dunness dunnish dunnite dunnock dunny dunpickle Duns dunst dunstable dunt duntle duny dunziekte duo duocosane duodecahedral duodecahedron duodecane duodecennial duodecillion duodecimal duodecimality duodecimally duodecimfid duodecimo duodecimole duodecuple duodena duodenal duodenary duodenate duodenation duodene duodenectomy duodenitis duodenocholangitis duodenocholecystostomy duodenocholedochotomy duodenocystostomy duodenoenterostomy duodenogram duodenojejunal duodenojejunostomy duodenopancreatectomy duodenoscopy duodenostomy duodenotomy duodenum duodrama duograph duogravure duole duoliteral duologue duomachy duopod duopolistic duopoly duopsonistic duopsony duosecant duotone duotriacontane duotype dup dupability dupable dupe dupedom duper dupery dupion dupla duplation duple duplet duplex duplexity duplicability duplicable duplicand duplicate duplication duplicative duplicator duplicature duplicia duplicident Duplicidentata duplicidentate duplicipennate duplicitas duplicity duplification duplify duplone dupondius duppy dura durability durable durableness durably durain dural Duralumin duramatral duramen durance Durandarte durangite Durango Durani durant Duranta duraplasty duraquara duraspinalis duration durational durationless durative durax durbachite Durban durbar durdenite dure durene durenol duress duressor durgan Durham durian duridine Durindana during duringly Durio durity durmast durn duro Duroc durometer duroquinone durra durrie durrin durry durst durukuli durwaun duryl Duryodhana Durzada dusack duscle dush dusio dusk dusken duskily duskiness duskingtide duskish duskishly duskishness duskly duskness dusky dust dustbin dustbox dustcloth dustee duster dusterman dustfall dustily Dustin dustiness dusting dustless dustlessness dustman dustpan dustproof dustuck dustwoman dusty dustyfoot Dusun Dutch dutch Dutcher Dutchify Dutchman Dutchy duteous duteously duteousness dutiability dutiable dutied dutiful dutifully dutifulness dutra duty dutymonger duumvir duumviral duumvirate duvet duvetyn dux duyker dvaita dvandva dwale dwalm Dwamish dwang dwarf dwarfish dwarfishly dwarfishness dwarfism dwarfling dwarfness dwarfy dwayberry Dwayne dwell dwelled dweller dwelling dwelt Dwight dwindle dwindlement dwine Dwyka dyad dyadic Dyak dyakisdodecahedron Dyakish dyarchic dyarchical dyarchy Dyas Dyassic dyaster Dyaus dyce dye dyeable dyehouse dyeing dyeleaves dyemaker dyemaking dyer dyester dyestuff dyeware dyeweed dyewood dygogram dying dyingly dyingness dyke dykehopper dyker dykereeve Dylan dynagraph dynameter dynametric dynametrical dynamic dynamical dynamically dynamics dynamis dynamism dynamist dynamistic dynamitard dynamite dynamiter dynamitic dynamitical dynamitically dynamiting dynamitish dynamitism dynamitist dynamization dynamize dynamo dynamoelectric dynamoelectrical dynamogenesis dynamogenic dynamogenous dynamogenously dynamogeny dynamometamorphic dynamometamorphism dynamometamorphosed dynamometer dynamometric dynamometrical dynamometry dynamomorphic dynamoneure dynamophone dynamostatic dynamotor dynast Dynastes dynastical dynastically dynasticism dynastid dynastidan Dynastides Dynastinae dynasty dynatron dyne dyophone Dyophysite Dyophysitic Dyophysitical Dyophysitism dyotheism Dyothelete Dyotheletian Dyotheletic Dyotheletical Dyotheletism Dyothelism dyphone dysacousia dysacousis dysanalyte dysaphia dysarthria dysarthric dysarthrosis dysbulia dysbulic dyschiria dyschroa dyschroia dyschromatopsia dyschromatoptic dyschronous dyscrasia dyscrasial dyscrasic dyscrasite dyscratic dyscrystalline dysenteric dysenterical dysentery dysepulotic dysepulotical dyserethisia dysergasia dysergia dysesthesia dysesthetic dysfunction dysgenesic dysgenesis dysgenetic dysgenic dysgenical dysgenics dysgeogenous dysgnosia dysgraphia dysidrosis dyskeratosis dyskinesia dyskinetic dyslalia dyslexia dyslogia dyslogistic dyslogistically dyslogy dysluite dyslysin dysmenorrhea dysmenorrheal dysmerism dysmeristic dysmerogenesis dysmerogenetic dysmeromorph dysmeromorphic dysmetria dysmnesia dysmorphism dysmorphophobia dysneuria dysnomy dysodile dysodontiasis dysorexia dysorexy dysoxidation dysoxidizable dysoxidize dyspathetic dyspathy dyspepsia dyspepsy dyspeptic dyspeptical dyspeptically dysphagia dysphagic dysphasia dysphasic dysphemia dysphonia dysphonic dysphoria dysphoric dysphotic dysphrasia dysphrenia dyspituitarism dysplasia dysplastic dyspnea dyspneal dyspneic dyspnoic dysprosia dysprosium dysraphia dyssnite Dyssodia dysspermatism dyssynergia dyssystole dystaxia dystectic dysteleological dysteleologist dysteleology dysthyroidism dystocia dystocial dystome dystomic dystomous dystrophia dystrophic dystrophy dysuria dysuric dysyntribite dytiscid Dytiscidae Dytiscus dzeren Dzungar E e ea each eachwhere eager eagerly eagerness eagle eaglelike eagless eaglestone eaglet eaglewood eagre ean ear earache earbob earcap earcockle eardrop eardropper eardrum eared earflower earful earhole earing earjewel Earl earl earlap earldom Earle earless earlet earlike earliness earlish earlock earlship early earmark earn earner earnest earnestly earnestness earnful Earnie earning earnings earphone earpick earpiece earplug earreach earring earringed earscrew earshot earsore earsplitting eartab earth earthboard earthborn earthbred earthdrake earthed earthen earthenhearted earthenware earthfall earthfast earthgall earthgrubber earthian earthiness earthkin earthless earthlight earthlike earthliness earthling earthly earthmaker earthmaking earthnut earthpea earthquake earthquaked earthquaken earthquaking Earthshaker earthshine earthshock earthslide earthsmoke earthstar earthtongue earthwall earthward earthwards earthwork earthworm earthy earwax earwig earwigginess earwiggy earwitness earworm earwort ease easeful easefully easefulness easel easeless easement easer easier easiest easily easiness easing east eastabout eastbound Easter easter easterling easterly Eastern eastern easterner Easternism Easternly easternmost Eastertide easting Eastlake eastland eastmost Eastre eastward eastwardly easy easygoing easygoingness eat eatability eatable eatableness eatage Eatanswill eatberry eaten eater eatery eating eats eave eaved eavedrop eaver eaves eavesdrop eavesdropper eavesdropping ebb ebbman Eben Ebenaceae ebenaceous Ebenales ebeneous Ebenezer Eberthella Ebionism Ebionite Ebionitic Ebionitism Ebionize Eboe eboe ebon ebonist ebonite ebonize ebony ebracteate ebracteolate ebriate ebriety ebriosity ebrious ebriously ebullate ebullience ebulliency ebullient ebulliently ebulliometer ebullioscope ebullioscopic ebullioscopy ebullition ebullitive ebulus eburated eburine Eburna eburnated eburnation eburnean eburneoid eburneous eburnian eburnification ecad ecalcarate ecanda ecardinal Ecardines ecarinate ecarte Ecaudata ecaudate Ecballium ecbatic ecblastesis ecbole ecbolic Ecca eccaleobion eccentrate eccentric eccentrical eccentrically eccentricity eccentring eccentrometer ecchondroma ecchondrosis ecchondrotome ecchymoma ecchymose ecchymosis ecclesia ecclesial ecclesiarch ecclesiarchy ecclesiast Ecclesiastes ecclesiastic ecclesiastical ecclesiastically ecclesiasticism ecclesiasticize ecclesiastics Ecclesiasticus ecclesiastry ecclesioclastic ecclesiography ecclesiolater ecclesiolatry ecclesiologic ecclesiological ecclesiologically ecclesiologist ecclesiology ecclesiophobia eccoprotic eccoproticophoric eccrinology eccrisis eccritic eccyclema eccyesis ecdemic ecdemite ecderon ecderonic ecdysiast ecdysis ecesic ecesis ecgonine eche echea echelette echelon echelonment Echeloot Echeneidae echeneidid Echeneididae echeneidoid Echeneis Echeveria echidna Echidnidae Echimys Echinacea echinal echinate echinid Echinidea echinital echinite Echinocactus Echinocaris Echinocereus Echinochloa echinochrome echinococcus Echinoderes Echinoderidae echinoderm Echinoderma echinodermal Echinodermata echinodermatous echinodermic Echinodorus echinoid Echinoidea echinologist echinology Echinomys Echinopanax Echinops echinopsine Echinorhinidae Echinorhinus Echinorhynchus Echinospermum Echinosphaerites Echinosphaeritidae Echinostoma Echinostomatidae echinostome echinostomiasis Echinozoa echinulate echinulated echinulation echinuliform echinus Echis echitamine Echites Echium echiurid Echiurida echiuroid Echiuroidea Echiurus echo echoer echoic echoingly echoism echoist echoize echolalia echolalic echoless echometer echopractic echopraxia echowise Echuca eciliate Eciton ecize Eckehart ecklein eclair eclampsia eclamptic eclat eclectic eclectical eclectically eclecticism eclecticize Eclectics eclectism eclectist eclegm eclegma eclipsable eclipsareon eclipsation eclipse eclipser eclipsis ecliptic ecliptical ecliptically eclogite eclogue eclosion ecmnesia ecoid ecole ecologic ecological ecologically ecologist ecology econometer econometric econometrician econometrics economic economical economically economics economism economist Economite economization economize economizer economy ecophene ecophobia ecorticate ecospecies ecospecific ecospecifically ecostate ecosystem ecotonal ecotone ecotype ecotypic ecotypically ecphonesis ecphorable ecphore ecphoria ecphorization ecphorize ecphrasis ecrasite ecru ecrustaceous ecstasis ecstasize ecstasy ecstatic ecstatica ecstatical ecstatically ecstaticize ecstrophy ectad ectadenia ectal ectally ectasia ectasis ectatic ectene ectental ectepicondylar ectethmoid ectethmoidal Ecthesis ecthetically ecthlipsis ecthyma ectiris ectobatic ectoblast ectoblastic ectobronchium ectocardia Ectocarpaceae ectocarpaceous Ectocarpales ectocarpic ectocarpous Ectocarpus ectocinerea ectocinereal ectocoelic ectocondylar ectocondyle ectocondyloid ectocornea ectocranial ectocuneiform ectocuniform ectocyst ectodactylism ectoderm ectodermal ectodermic ectodermoidal ectodermosis ectodynamomorphic ectoentad ectoenzyme ectoethmoid ectogenesis ectogenic ectogenous ectoglia Ectognatha ectolecithal ectoloph ectomere ectomeric ectomesoblast ectomorph ectomorphic ectomorphy ectonephridium ectoparasite ectoparasitic Ectoparasitica ectopatagium ectophloic ectophyte ectophytic ectopia ectopic Ectopistes ectoplacenta ectoplasm ectoplasmatic ectoplasmic ectoplastic ectoplasy Ectoprocta ectoproctan ectoproctous ectopterygoid ectopy ectoretina ectorganism ectorhinal ectosarc ectosarcous ectoskeleton ectosomal ectosome ectosphenoid ectosphenotic ectosphere ectosteal ectosteally ectostosis ectotheca ectotoxin Ectotrophi ectotrophic ectozoa ectozoan ectozoic ectozoon ectrodactylia ectrodactylism ectrodactyly ectrogenic ectrogeny ectromelia ectromelian ectromelic ectromelus ectropion ectropium ectropometer ectrosyndactyly ectypal ectype ectypography Ecuadoran Ecuadorian ecuelling ecumenic ecumenical ecumenicalism ecumenicality ecumenically ecumenicity ecyphellate eczema eczematization eczematoid eczematosis eczematous Ed edacious edaciously edaciousness edacity Edana edaphic edaphology edaphon Edaphosauria Edaphosaurus Edda Eddaic edder Eddic Eddie eddish eddo Eddy eddy eddyroot edea edeagra edeitis edelweiss edema edematous edemic Eden Edenic edenite Edenization Edenize edental edentalous Edentata edentate edentulate edentulous edeodynia edeology edeomania edeoscopy edeotomy Edessan edestan edestin Edestosaurus Edgar edge edgebone edged edgeless edgemaker edgemaking edgeman edger edgerman edgeshot edgestone edgeways edgeweed edgewise edginess edging edgingly edgrew edgy edh edibility edible edibleness edict edictal edictally edicule edificable edification edificator edificatory edifice edificial edifier edify edifying edifyingly edifyingness edingtonite edit edital Edith edition editor editorial editorialize editorially editorship editress Ediya Edmond Edmund Edna Edo Edomite Edomitish Edoni Edriasteroidea Edrioasteroid Edrioasteroidea Edriophthalma edriophthalmatous edriophthalmian edriophthalmic edriophthalmous Eduardo Educabilia educabilian educability educable educand educatable educate educated educatee education educationable educational educationalism educationalist educationally educationary educationist educative educator educatory educatress educe educement educible educive educt eduction eductive eductor edulcorate edulcoration edulcorative edulcorator Eduskunta Edward Edwardean Edwardeanism Edwardian Edwardine Edwardsia Edwardsiidae Edwin Edwina eegrass eel eelboat eelbob eelbobber eelcake eelcatcher eeler eelery eelfare eelfish eelgrass eellike eelpot eelpout eelshop eelskin eelspear eelware eelworm eely eer eerie eerily eeriness eerisome effable efface effaceable effacement effacer effect effecter effectful effectible effective effectively effectiveness effectivity effectless effector effects effectual effectuality effectualize effectually effectualness effectuate effectuation effeminacy effeminate effeminately effeminateness effemination effeminatize effeminization effeminize effendi efferent effervesce effervescence effervescency effervescent effervescible effervescingly effervescive effete effeteness effetman efficacious efficaciously efficaciousness efficacity efficacy efficience efficiency efficient efficiently Effie effigial effigiate effigiation effigurate effiguration effigy efflate efflation effloresce efflorescence efflorescency efflorescent efflower effluence effluency effluent effluvia effluvial effluviate effluviography effluvious effluvium efflux effluxion effodient Effodientia efform efformation efformative effort effortful effortless effortlessly effossion effraction effranchise effranchisement effrontery effulge effulgence effulgent effulgently effund effuse effusiometer effusion effusive effusively effusiveness Efik eflagelliferous efoliolate efoliose efoveolate eft eftest eftsoons egad egalitarian egalitarianism egality Egba Egbert Egbo egence egeran Egeria egest egesta egestion egestive egg eggberry eggcup eggcupful eggeater egger eggfish eggfruit egghead egghot egging eggler eggless egglike eggnog eggplant eggshell eggy egilops egipto Eglamore eglandular eglandulose eglantine eglatere eglestonite egma ego egocentric egocentricity egocentrism Egocerus egohood egoism egoist egoistic egoistical egoistically egoity egoize egoizer egol egolatrous egomania egomaniac egomaniacal egomism egophonic egophony egosyntonic egotheism egotism egotist egotistic egotistical egotistically egotize egregious egregiously egregiousness egress egression egressive egressor egret Egretta egrimony egueiite egurgitate eguttulate Egypt Egyptian Egyptianism Egyptianization Egyptianize Egyptize Egyptologer Egyptologic Egyptological Egyptologist Egyptology eh Ehatisaht eheu ehlite Ehretia Ehretiaceae ehrwaldite ehuawa eichbergite Eichhornia eichwaldite eicosane eident eidently eider eidetic eidograph eidolic eidolism eidology eidolology eidolon eidoptometry eidouranion eigenfunction eigenvalue eight eighteen eighteenfold eighteenmo eighteenth eighteenthly eightfoil eightfold eighth eighthly eightieth eightling eightpenny eightscore eightsman eightsome eighty eightyfold eigne Eikonogen eikonology Eileen Eimak eimer Eimeria einkorn Einsteinian Eireannach Eirene eiresione eisegesis eisegetical eisodic eisteddfod eisteddfodic eisteddfodism either ejaculate ejaculation ejaculative ejaculator ejaculatory Ejam eject ejecta ejectable ejection ejective ejectively ejectivity ejectment ejector ejicient ejoo ekaboron ekacaesium ekaha ekamanganese ekasilicon ekatantalum eke ekebergite eker ekerite eking ekka Ekoi ekphore Ekron Ekronite ektene ektenes ektodynamorphic el elaborate elaborately elaborateness elaboration elaborative elaborator elaboratory elabrate Elachista Elachistaceae elachistaceous Elaeagnaceae elaeagnaceous Elaeagnus Elaeis elaeoblast elaeoblastic Elaeocarpaceae elaeocarpaceous Elaeocarpus Elaeococca Elaeodendron elaeodochon elaeomargaric elaeometer elaeoptene elaeosaccharum elaeothesium elaidate elaidic elaidin elaidinic elain Elaine elaine elaioleucite elaioplast elaiosome Elamite Elamitic Elamitish elance eland elanet Elanus Elaphe Elaphebolion elaphine Elaphodus Elaphoglossum Elaphomyces Elaphomycetaceae Elaphrium elaphure elaphurine Elaphurus elapid Elapidae Elapinae elapine elapoid Elaps elapse Elapsoidea elasmobranch elasmobranchian elasmobranchiate Elasmobranchii elasmosaur Elasmosaurus elasmothere Elasmotherium elastance elastic elastica elastically elastician elasticin elasticity elasticize elasticizer elasticness elastin elastivity elastomer elastomeric elastometer elastometry elastose elatcha elate elated elatedly elatedness elater elaterid Elateridae elaterin elaterite elaterium elateroid Elatha Elatinaceae elatinaceous Elatine elation elative elator elatrometer elb Elbert Elberta elbow elbowboard elbowbush elbowchair elbowed elbower elbowpiece elbowroom elbowy elcaja elchee eld elder elderberry elderbrotherhood elderbrotherish elderbrotherly elderbush elderhood elderliness elderly elderman eldership eldersisterly elderwoman elderwood elderwort eldest eldin elding Eldred eldress eldritch Elean Eleanor Eleatic Eleaticism Eleazar elecampane elect electable electee electicism election electionary electioneer electioneerer elective electively electiveness electivism electivity electly elector electoral electorally electorate electorial electorship Electra electragist electragy electralize electrepeter electress electret electric electrical electricalize electrically electricalness electrician electricity electricize electrics electriferous electrifiable electrification electrifier electrify electrion electrionic electrizable electrization electrize electrizer electro electroacoustic electroaffinity electroamalgamation electroanalysis electroanalytic electroanalytical electroanesthesia electroballistic electroballistics electrobath electrobiological electrobiologist electrobiology electrobioscopy electroblasting electrobrasser electrobus electrocapillarity electrocapillary electrocardiogram electrocardiograph electrocardiographic electrocardiography electrocatalysis electrocatalytic electrocataphoresis electrocataphoretic electrocauterization electrocautery electroceramic electrochemical electrochemically electrochemist electrochemistry electrochronograph electrochronographic electrochronometer electrochronometric electrocoagulation electrocoating electrocolloidal electrocontractility electrocorticogram electroculture electrocute electrocution electrocutional electrocutioner electrocystoscope electrode electrodeless electrodentistry electrodeposit electrodepositable electrodeposition electrodepositor electrodesiccate electrodesiccation electrodiagnosis electrodialysis electrodialyze electrodialyzer electrodiplomatic electrodispersive electrodissolution electrodynamic electrodynamical electrodynamics electrodynamism electrodynamometer electroencephalogram electroencephalograph electroencephalography electroendosmose electroendosmosis electroendosmotic electroengrave electroengraving electroergometer electroetching electroethereal electroextraction electroform electroforming electrofuse electrofused electrofusion electrogalvanic electrogalvanize electrogenesis electrogenetic electrogild electrogilding electrogilt electrograph electrographic electrographite electrography electroharmonic electrohemostasis electrohomeopathy electrohorticulture electrohydraulic electroimpulse electroindustrial electroionic electroirrigation electrokinematics electrokinetic electrokinetics electrolier electrolithotrity electrologic electrological electrologist electrology electroluminescence electroluminescent electrolysis electrolyte electrolytic electrolytical electrolytically electrolyzability electrolyzable electrolyzation electrolyze electrolyzer electromagnet electromagnetic electromagnetical electromagnetically electromagnetics electromagnetism electromagnetist electromassage electromechanical electromechanics electromedical electromer electromeric electromerism electrometallurgical electrometallurgist electrometallurgy electrometer electrometric electrometrical electrometrically electrometry electromobile electromobilism electromotion electromotive electromotivity electromotograph electromotor electromuscular electromyographic electron electronarcosis electronegative electronervous electronic electronics electronographic electrooptic electrooptical electrooptically electrooptics electroosmosis electroosmotic electroosmotically electrootiatrics electropathic electropathology electropathy electropercussive electrophobia electrophone electrophore electrophoresis electrophoretic electrophoric Electrophoridae electrophorus electrophotometer electrophotometry electrophototherapy electrophrenic electrophysics electrophysiological electrophysiologist electrophysiology electropism electroplate electroplater electroplating electroplax electropneumatic electropneumatically electropoion electropolar electropositive electropotential electropower electropsychrometer electropult electropuncturation electropuncture electropuncturing electropyrometer electroreceptive electroreduction electrorefine electroscission electroscope electroscopic electrosherardizing electroshock electrosmosis electrostatic electrostatical electrostatically electrostatics electrosteel electrostenolysis electrostenolytic electrostereotype electrostriction electrosurgery electrosurgical electrosynthesis electrosynthetic electrosynthetically electrotactic electrotautomerism electrotaxis electrotechnic electrotechnical electrotechnician electrotechnics electrotechnology electrotelegraphic electrotelegraphy electrotelethermometer electrotellurograph electrotest electrothanasia electrothanatosis electrotherapeutic electrotherapeutical electrotherapeutics electrotherapeutist electrotherapist electrotherapy electrothermal electrothermancy electrothermic electrothermics electrothermometer electrothermostat electrothermostatic electrothermotic electrotitration electrotonic electrotonicity electrotonize electrotonus electrotrephine electrotropic electrotropism electrotype electrotyper electrotypic electrotyping electrotypist electrotypy electrovalence electrovalency electrovection electroviscous electrovital electrowin electrum electuary eleemosynarily eleemosynariness eleemosynary elegance elegancy elegant elegantly elegiac elegiacal elegiambic elegiambus elegiast elegist elegit elegize elegy eleidin element elemental elementalism elementalist elementalistic elementalistically elementality elementalize elementally elementarily elementariness elementary elementoid elemi elemicin elemin elench elenchi elenchic elenchical elenchically elenchize elenchtic elenchtical elenctic elenge eleoblast Eleocharis eleolite eleomargaric eleometer eleonorite eleoptene eleostearate eleostearic elephant elephanta elephantiac elephantiasic elephantiasis elephantic elephanticide Elephantidae elephantine elephantlike elephantoid elephantoidal Elephantopus elephantous elephantry Elephas Elettaria Eleusine Eleusinia Eleusinian Eleusinion Eleut eleutherarch Eleutheri Eleutheria Eleutherian Eleutherios eleutherism eleutherodactyl Eleutherodactyli Eleutherodactylus eleutheromania eleutheromaniac eleutheromorph eleutheropetalous eleutherophyllous eleutherosepalous Eleutherozoa eleutherozoan elevate elevated elevatedly elevatedness elevating elevatingly elevation elevational elevator elevatory eleven elevener elevenfold eleventh eleventhly elevon elf elfenfolk elfhood elfic elfin elfinwood elfish elfishly elfishness elfkin elfland elflike elflock elfship elfwife elfwort Eli Elia Elian Elianic Elias eliasite elicit elicitable elicitate elicitation elicitor elicitory elide elidible eligibility eligible eligibleness eligibly Elihu Elijah eliminable eliminand eliminant eliminate elimination eliminative eliminator eliminatory Elinor Elinvar Eliot Eliphalet eliquate eliquation Elisabeth Elisha Elishah elision elisor Elissa elite elixir Eliza Elizabeth Elizabethan Elizabethanism Elizabethanize elk Elkanah Elkdom Elkesaite elkhorn elkhound Elkoshite elkslip Elkuma elkwood ell Ella ellachick ellagate ellagic ellagitannin Ellasar elle elleck Ellen ellenyard Ellerian ellfish Ellice Ellick Elliot Elliott ellipse ellipses ellipsis ellipsograph ellipsoid ellipsoidal ellipsone ellipsonic elliptic elliptical elliptically ellipticalness ellipticity elliptograph elliptoid ellops ellwand elm Elmer elmy Eloah elocular elocute elocution elocutionary elocutioner elocutionist elocutionize elod Elodea Elodeaceae Elodes eloge elogium Elohim Elohimic Elohism Elohist Elohistic eloign eloigner eloignment Eloise Elon elongate elongated elongation elongative Elonite elope elopement eloper Elopidae elops eloquence eloquent eloquential eloquently eloquentness Elotherium elotillo elpasolite elpidite Elric els Elsa else elsehow elsewards elseways elsewhen elsewhere elsewheres elsewhither elsewise Elsholtzia elsin elt eluate elucidate elucidation elucidative elucidator elucidatory elucubrate elucubration elude eluder elusion elusive elusively elusiveness elusoriness elusory elute elution elutor elutriate elutriation elutriator eluvial eluviate eluviation eluvium elvan elvanite elvanitic elver elves elvet Elvira Elvis elvish elvishly Elwood elydoric Elymi Elymus Elysee Elysia elysia Elysian Elysiidae Elysium elytral elytriferous elytriform elytrigerous elytrin elytrocele elytroclasia elytroid elytron elytroplastic elytropolypus elytroposis elytrorhagia elytrorrhagia elytrorrhaphy elytrostenosis elytrotomy elytrous elytrum Elzevir Elzevirian Em em emaciate emaciation emajagua emanant emanate emanation emanational emanationism emanationist emanatism emanatist emanatistic emanativ emanative emanatively emanator emanatory emancipate emancipation emancipationist emancipatist emancipative emancipator emancipatory emancipatress emancipist emandibulate emanium emarcid emarginate emarginately emargination Emarginula emasculate emasculation emasculative emasculator emasculatory Embadomonas emball emballonurid Emballonuridae emballonurine embalm embalmer embalmment embank embankment embannered embar embargo embargoist embark embarkation embarkment embarras embarrass embarrassed embarrassedly embarrassing embarrassingly embarrassment embarrel embassage embassy embastioned embathe embatholithic embattle embattled embattlement embay embayment Embden embed embedment embeggar Embelia embelic embellish embellisher embellishment ember embergoose Emberiza emberizidae Emberizinae emberizine embezzle embezzlement embezzler Embiidae Embiidina embind Embiodea Embioptera embiotocid Embiotocidae embiotocoid embira embitter embitterer embitterment emblaze emblazer emblazon emblazoner emblazonment emblazonry emblem emblema emblematic emblematical emblematically emblematicalness emblematicize emblematist emblematize emblematology emblement emblemist emblemize emblemology emblic emblossom embodier embodiment embody embog emboitement embolden emboldener embole embolectomy embolemia embolic emboliform embolism embolismic embolismus embolite embolium embolize embolo embololalia Embolomeri embolomerism embolomerous embolomycotic embolum embolus emboly emborder emboscata embosom emboss embossage embosser embossing embossman embossment embosture embottle embouchure embound embow embowed embowel emboweler embowelment embower embowerment embowment embox embrace embraceable embraceably embracement embraceor embracer embracery embracing embracingly embracingness embracive embrail embranchment embrangle embranglement embrasure embreathe embreathement Embrica embright embrittle embrittlement embroaden embrocate embrocation embroider embroiderer embroideress embroidery embroil embroiler embroilment embronze embrown embryectomy embryo embryocardia embryoctonic embryoctony embryoferous embryogenesis embryogenetic embryogenic embryogeny embryogony embryographer embryographic embryography embryoid embryoism embryologic embryological embryologically embryologist embryology embryoma embryon embryonal embryonary embryonate embryonated embryonic embryonically embryoniferous embryoniform embryony embryopathology embryophagous embryophore Embryophyta embryophyte embryoplastic embryoscope embryoscopic embryotega embryotic embryotome embryotomy embryotrophic embryotrophy embryous embryulcia embryulcus embubble embuia embus embusk embuskin emcee eme emeer emeership Emeline emend emendable emendandum emendate emendation emendator emendatory emender emerald emeraldine emeraude emerge emergence emergency emergent emergently emergentness Emerita emerited emeritus emerize emerse emersed emersion Emersonian Emersonianism Emery emery Emesa Emesidae emesis emetatrophia emetic emetically emetine emetocathartic emetology emetomorphine emgalla emication emiction emictory emigrant emigrate emigration emigrational emigrationist emigrative emigrator emigratory emigree Emil Emilia Emily Emim eminence eminency eminent eminently emir emirate emirship emissarium emissary emissaryship emissile emission emissive emissivity emit emittent emitter Emm Emma emma Emmanuel emmarble emmarvel emmenagogic emmenagogue emmenic emmeniopathy emmenology emmensite Emmental emmer emmergoose emmet emmetrope emmetropia emmetropic emmetropism emmetropy Emmett emodin emollescence emolliate emollient emoloa emolument emolumental emolumentary emote emotion emotionable emotional emotionalism emotionalist emotionality emotionalization emotionalize emotionally emotioned emotionist emotionize emotionless emotionlessness emotive emotively emotiveness emotivity empacket empaistic empall empanel empanelment empanoply empaper emparadise emparchment empark empasm empathic empathically empathize empathy Empedoclean empeirema Empeo emperor emperorship empery Empetraceae empetraceous Empetrum emphases emphasis emphasize emphatic emphatical emphatically emphaticalness emphlysis emphractic emphraxis emphysema emphysematous emphyteusis emphyteuta emphyteutic empicture Empididae Empidonax empiecement Empire empire empirema empiric empirical empiricalness empiricism empiricist empirics empiriocritcism empiriocritical empiriological empirism empiristic emplace emplacement emplane emplastic emplastration emplastrum emplectite empleomania employ employability employable employed employee employer employless employment emplume empocket empodium empoison empoisonment emporetic emporeutic emporia emporial emporium empower empowerment empress emprise emprosthotonic emprosthotonos emprosthotonus empt emptier emptily emptiness emptings emptins emption emptional emptor empty emptyhearted emptysis empurple Empusa empyema empyemic empyesis empyocele empyreal empyrean empyreuma empyreumatic empyreumatical empyreumatize empyromancy emu emulable emulant emulate emulation emulative emulatively emulator emulatory emulatress emulgence emulgent emulous emulously emulousness emulsibility emulsible emulsifiability emulsifiable emulsification emulsifier emulsify emulsin emulsion emulsionize emulsive emulsoid emulsor emunctory emundation emyd Emydea emydian Emydidae Emydinae Emydosauria emydosaurian Emys en enable enablement enabler enact enactable enaction enactive enactment enactor enactory enaena enage Enajim enalid Enaliornis enaliosaur Enaliosauria enaliosaurian enallachrome enallage enaluron enam enamber enambush enamdar enamel enameler enameling enamelist enamelless enamellist enameloma enamelware enamor enamorato enamored enamoredness enamorment enamourment enanguish enanthem enanthema enanthematous enanthesis enantiobiosis enantioblastic enantioblastous enantiomer enantiomeride enantiomorph enantiomorphic enantiomorphism enantiomorphous enantiomorphously enantiomorphy enantiopathia enantiopathic enantiopathy enantiosis enantiotropic enantiotropy enantobiosis enapt enarbor enarbour enarch enarched enargite enarm enarme enarthrodia enarthrodial enarthrosis enate enatic enation enbrave encaenia encage encake encalendar encallow encamp encampment encanker encanthis encapsulate encapsulation encapsule encarditis encarnadine encarnalize encarpium encarpus encase encasement encash encashable encashment encasserole encastage encatarrhaphy encauma encaustes encaustic encaustically encave encefalon Encelia encell encenter encephala encephalalgia Encephalartos encephalasthenia encephalic encephalin encephalitic encephalitis encephalocele encephalocoele encephalodialysis encephalogram encephalograph encephalography encephaloid encephalolith encephalology encephaloma encephalomalacia encephalomalacosis encephalomalaxis encephalomeningitis encephalomeningocele encephalomere encephalomeric encephalometer encephalometric encephalomyelitis encephalomyelopathy encephalon encephalonarcosis encephalopathia encephalopathic encephalopathy encephalophyma encephalopsychesis encephalopyosis encephalorrhagia encephalosclerosis encephaloscope encephaloscopy encephalosepsis encephalospinal encephalothlipsis encephalotome encephalotomy encephalous enchain enchainment enchair enchalice enchannel enchant enchanter enchanting enchantingly enchantingness enchantment enchantress encharge encharnel enchase enchaser enchasten Enchelycephali enchequer enchest enchilada enchiridion Enchodontid Enchodontidae Enchodontoid Enchodus enchondroma enchondromatous enchondrosis enchorial enchurch enchylema enchylematous enchymatous enchytrae enchytraeid Enchytraeidae Enchytraeus encina encinal encincture encinder encinillo encipher encircle encirclement encircler encist encitadel enclaret enclasp enclave enclavement enclisis enclitic enclitical enclitically encloak encloister enclose encloser enclosure enclothe encloud encoach encode encoffin encoignure encoil encolden encollar encolor encolpion encolumn encomendero encomia encomiast encomiastic encomiastical encomiastically encomic encomienda encomiologic encomium encommon encompass encompasser encompassment encoop encorbelment encore encoronal encoronate encoronet encounter encounterable encounterer encourage encouragement encourager encouraging encouragingly encowl encraal encradle encranial encratic Encratism Encratite encraty encreel encrimson encrinal encrinic Encrinidae encrinidae encrinital encrinite encrinitic encrinitical encrinoid Encrinoidea Encrinus encrisp encroach encroacher encroachingly encroachment encrotchet encrown encrownment encrust encrustment encrypt encryption encuirassed encumber encumberer encumberingly encumberment encumbrance encumbrancer encup encurl encurtain encushion encyclic encyclical encyclopedia encyclopediac encyclopediacal encyclopedial encyclopedian encyclopediast encyclopedic encyclopedically encyclopedism encyclopedist encyclopedize encyrtid Encyrtidae encyst encystation encystment end endable endamage endamageable endamagement endamask endameba endamebic Endamoeba endamoebiasis endamoebic Endamoebidae endanger endangerer endangerment endangium endaortic endaortitis endarch endarchy endarterial endarteritis endarterium endaspidean endaze endboard endbrain endear endearance endeared endearedly endearedness endearing endearingly endearingness endearment endeavor endeavorer ended endeictic endellionite endemial endemic endemically endemicity endemiological endemiology endemism endenizen ender endere endermatic endermic endermically enderon enderonic endevil endew endgate endiadem endiaper ending endite endive endless endlessly endlessness endlichite endlong endmatcher endmost endoabdominal endoangiitis endoaortitis endoappendicitis endoarteritis endoauscultation endobatholithic endobiotic endoblast endoblastic endobronchial endobronchially endobronchitis endocannibalism endocardiac endocardial endocarditic endocarditis endocardium endocarp endocarpal endocarpic endocarpoid endocellular endocentric Endoceras Endoceratidae endoceratite endoceratitic endocervical endocervicitis endochondral endochorion endochorionic endochrome endochylous endoclinal endocline endocoelar endocoele endocoeliac endocolitis endocolpitis endocondensation endocone endoconidium endocorpuscular endocortex endocranial endocranium endocrinal endocrine endocrinic endocrinism endocrinological endocrinologist endocrinology endocrinopathic endocrinopathy endocrinotherapy endocrinous endocritic endocycle endocyclic endocyemate endocyst endocystitis endoderm endodermal endodermic endodermis endodontia endodontic endodontist endodynamomorphic endoenteritis endoenzyme endoesophagitis endofaradism endogalvanism endogamic endogamous endogamy endogastric endogastrically endogastritis endogen Endogenae endogenesis endogenetic endogenic endogenous endogenously endogeny endoglobular endognath endognathal endognathion endogonidium endointoxication endokaryogamy endolabyrinthitis endolaryngeal endolemma endolumbar endolymph endolymphangial endolymphatic endolymphic endolysin endomastoiditis endome endomesoderm endometrial endometritis endometrium endometry endomitosis endomitotic endomixis endomorph endomorphic endomorphism endomorphy Endomyces Endomycetaceae endomysial endomysium endoneurial endoneurium endonuclear endonucleolus endoparasite endoparasitic Endoparasitica endopathic endopelvic endopericarditis endoperidial endoperidium endoperitonitis endophagous endophagy endophasia endophasic endophlebitis endophragm endophragmal Endophyllaceae endophyllous Endophyllum endophytal endophyte endophytic endophytically endophytous endoplasm endoplasma endoplasmic endoplast endoplastron endoplastular endoplastule endopleura endopleural endopleurite endopleuritic endopod endopodite endopoditic endoproct Endoprocta endoproctous endopsychic Endopterygota endopterygote endopterygotic endopterygotism endopterygotous endorachis endoral endore endorhinitis endorsable endorsation endorse endorsed endorsee endorsement endorser endorsingly endosalpingitis endosarc endosarcode endosarcous endosclerite endoscope endoscopic endoscopy endosecretory endosepsis endosiphon endosiphonal endosiphonate endosiphuncle endoskeletal endoskeleton endosmometer endosmometric endosmosic endosmosis endosmotic endosmotically endosome endosperm endospermic endospore endosporium endosporous endoss endosteal endosteally endosteitis endosteoma endosternite endosternum endosteum endostitis endostoma endostome endostosis endostracal endostracum endostylar endostyle endostylic endotheca endothecal endothecate endothecial endothecium endothelia endothelial endothelioblastoma endotheliocyte endothelioid endotheliolysin endotheliolytic endothelioma endotheliomyoma endotheliomyxoma endotheliotoxin endothelium endothermal endothermic endothermous endothermy Endothia endothoracic endothorax Endothrix endothys endotoxic endotoxin endotoxoid endotracheitis endotrachelitis Endotrophi endotrophic endotys endovaccination endovasculitis endovenous endow endower endowment endozoa endpiece Endromididae Endromis endue enduement endungeon endura endurability endurable endurableness endurably endurance endurant endure endurer enduring enduringly enduringness endways endwise endyma endymal Endymion endysis Eneas eneclann enema enemy enemylike enemyship enepidermic energeia energesis energetic energetical energetically energeticalness energeticist energetics energetistic energic energical energid energism energist energize energizer energumen energumenon energy enervate enervation enervative enervator eneuch eneugh enface enfacement enfamous enfasten enfatico enfeature enfeeble enfeeblement enfeebler enfelon enfeoff enfeoffment enfester enfetter enfever enfigure enfilade enfilading enfile enfiled enflagellate enflagellation enflesh enfleurage enflower enfoil enfold enfolden enfolder enfoldment enfonced enforce enforceability enforceable enforced enforcedly enforcement enforcer enforcibility enforcible enforcingly enfork enfoul enframe enframement enfranchisable enfranchise enfranchisement enfranchiser enfree enfrenzy enfuddle enfurrow engage engaged engagedly engagedness engagement engager engaging engagingly engagingness engaol engarb engarble engarland engarment engarrison engastrimyth engastrimythic engaud engaze Engelmannia engem engender engenderer engenderment engerminate enghosted engild engine engineer engineering engineership enginehouse engineless enginelike engineman enginery enginous engird engirdle engirt engjateigur englacial englacially englad engladden Englander Engler Englerophoenix Englifier Englify English Englishable Englisher Englishhood Englishism Englishize Englishly Englishman Englishness Englishry Englishwoman englobe englobement engloom englory englut englyn engnessang engobe engold engolden engore engorge engorgement engouled engrace engraff engraft engraftation engrafter engraftment engrail engrailed engrailment engrain engrained engrainedly engrainer engram engramma engrammatic engrammic engrandize engrandizement engraphia engraphic engraphically engraphy engrapple engrasp Engraulidae Engraulis engrave engraved engravement engraver engraving engreen engrieve engroove engross engrossed engrossedly engrosser engrossing engrossingly engrossingness engrossment enguard engulf engulfment engyscope engysseismology Engystomatidae enhallow enhalo enhamper enhance enhanced enhancement enhancer enhancive enharmonic enharmonical enharmonically enhat enhaunt enhearse enheart enhearten enhedge enhelm enhemospore enherit enheritage enheritance enhorror enhunger enhusk Enhydra Enhydrinae Enhydris enhydrite enhydritic enhydros enhydrous enhypostasia enhypostasis enhypostatic enhypostatize eniac Enicuridae Enid Enif enigma enigmatic enigmatical enigmatically enigmaticalness enigmatist enigmatization enigmatize enigmatographer enigmatography enigmatology enisle enjail enjamb enjambed enjambment enjelly enjeopard enjeopardy enjewel enjoin enjoinder enjoiner enjoinment enjoy enjoyable enjoyableness enjoyably enjoyer enjoying enjoyingly enjoyment enkerchief enkernel Enki Enkidu enkindle enkindler enkraal enlace enlacement enlard enlarge enlargeable enlargeableness enlarged enlargedly enlargedness enlargement enlarger enlarging enlargingly enlaurel enleaf enleague enlevement enlief enlife enlight enlighten enlightened enlightenedly enlightenedness enlightener enlightening enlighteningly enlightenment enlink enlinkment enlist enlisted enlister enlistment enliven enlivener enlivening enliveningly enlivenment enlock enlodge enlodgement enmarble enmask enmass enmesh enmeshment enmist enmity enmoss enmuffle enneacontahedral enneacontahedron ennead enneadianome enneadic enneagon enneagynous enneahedral enneahedria enneahedron enneapetalous enneaphyllous enneasemic enneasepalous enneaspermous enneastyle enneastylos enneasyllabic enneateric enneatic enneatical ennerve enniche ennoble ennoblement ennobler ennobling ennoblingly ennoic ennomic ennui Enoch Enochic enocyte enodal enodally enoil enol enolate enolic enolizable enolization enolize enomania enomaniac enomotarch enomoty enophthalmos enophthalmus Enopla enoplan enoptromancy enorganic enorm enormity enormous enormously enormousness Enos enostosis enough enounce enouncement enow enphytotic enplane enquicken enquire enquirer enquiry enrace enrage enraged enragedly enragement enrange enrank enrapt enrapture enrapturer enravish enravishingly enravishment enray enregiment enregister enregistration enregistry enrib enrich enricher enriching enrichingly enrichment enring enrive enrobe enrobement enrober enrockment enrol enroll enrolled enrollee enroller enrollment enrolment enroot enrough enruin enrut ens ensaffron ensaint ensample ensand ensandal ensanguine ensate enscene ensconce enscroll ensculpture ense enseam enseat enseem ensellure ensemble ensepulcher ensepulchre enseraph enserf ensete enshade enshadow enshawl ensheathe enshell enshelter enshield enshrine enshrinement enshroud Ensiferi ensiform ensign ensigncy ensignhood ensignment ensignry ensignship ensilage ensilate ensilation ensile ensilist ensilver ensisternum ensky enslave enslavedness enslavement enslaver ensmall ensnare ensnarement ensnarer ensnaring ensnaringly ensnarl ensnow ensorcelize ensorcell ensoul enspell ensphere enspirit enstamp enstar enstate enstatite enstatitic enstatolite ensteel enstool enstore enstrengthen ensuable ensuance ensuant ensue ensuer ensuingly ensulphur ensure ensurer enswathe enswathement ensweep entablature entablatured entablement entach entad Entada entail entailable entailer entailment ental entame Entamoeba entamoebiasis entamoebic entangle entangled entangledly entangledness entanglement entangler entangling entanglingly entapophysial entapophysis entarthrotic entasia entasis entelam entelechy entellus Entelodon entelodont entempest entemple entente Ententophil entepicondylar enter enterable enteraden enteradenographic enteradenography enteradenological enteradenology enteral enteralgia enterate enterauxe enterclose enterectomy enterer entergogenic enteria enteric entericoid entering enteritidis enteritis entermete enteroanastomosis enterobiliary enterocele enterocentesis enterochirurgia enterochlorophyll enterocholecystostomy enterocinesia enterocinetic enterocleisis enteroclisis enteroclysis Enterocoela enterocoele enterocoelic enterocoelous enterocolitis enterocolostomy enterocrinin enterocyst enterocystoma enterodynia enteroepiplocele enterogastritis enterogastrone enterogenous enterogram enterograph enterography enterohelcosis enterohemorrhage enterohepatitis enterohydrocele enteroid enterointestinal enteroischiocele enterokinase enterokinesia enterokinetic enterolith enterolithiasis Enterolobium enterology enteromegalia enteromegaly enteromere enteromesenteric Enteromorpha enteromycosis enteromyiasis enteron enteroneuritis enteroparalysis enteroparesis enteropathy enteropexia enteropexy enterophthisis enteroplasty enteroplegia enteropneust Enteropneusta enteropneustan enteroptosis enteroptotic enterorrhagia enterorrhaphy enterorrhea enteroscope enterosepsis enterospasm enterostasis enterostenosis enterostomy enterosyphilis enterotome enterotomy enterotoxemia enterotoxication enterozoa enterozoan enterozoic enterprise enterpriseless enterpriser enterprising enterprisingly enterritoriality entertain entertainable entertainer entertaining entertainingly entertainingness entertainment enthalpy entheal enthelmintha enthelminthes enthelminthic enthetic enthral enthraldom enthrall enthralldom enthraller enthralling enthrallingly enthrallment enthralment enthrone enthronement enthronization enthronize enthuse enthusiasm enthusiast enthusiastic enthusiastical enthusiastically enthusiastly enthymematic enthymematical enthymeme entia entice enticeable enticeful enticement enticer enticing enticingly enticingness entifical entification entify entincture entire entirely entireness entirety entiris entitative entitatively entitle entitlement entity entoblast entoblastic entobranchiate entobronchium entocalcaneal entocarotid entocele entocnemial entocoele entocoelic entocondylar entocondyle entocondyloid entocone entoconid entocornea entocranial entocuneiform entocuniform entocyemate entocyst entoderm entodermal entodermic entogastric entogenous entoglossal entohyal entoil entoilment Entoloma entomb entombment entomere entomeric entomic entomical entomion entomogenous entomoid entomologic entomological entomologically entomologist entomologize entomology Entomophaga entomophagan entomophagous Entomophila entomophilous entomophily Entomophthora Entomophthoraceae entomophthoraceous Entomophthorales entomophthorous entomophytous Entomosporium Entomostraca entomostracan entomostracous entomotaxy entomotomist entomotomy entone entonement entoolitic entoparasite entoparasitic entoperipheral entophytal entophyte entophytic entophytically entophytous entopic entopical entoplasm entoplastic entoplastral entoplastron entopopliteal Entoprocta entoproctous entopterygoid entoptic entoptical entoptically entoptics entoptoscope entoptoscopic entoptoscopy entoretina entorganism entosarc entosclerite entosphenal entosphenoid entosphere entosternal entosternite entosternum entothorax entotic Entotrophi entotympanic entourage entozoa entozoal entozoan entozoarian entozoic entozoological entozoologically entozoologist entozoology entozoon entracte entrail entrails entrain entrainer entrainment entrammel entrance entrancedly entrancement entranceway entrancing entrancingly entrant entrap entrapment entrapper entrappingly entreasure entreat entreating entreatingly entreatment entreaty entree entremets entrench entrenchment entrepas entrepot entrepreneur entrepreneurial entrepreneurship entresol entrochite entrochus entropion entropionize entropium entropy entrough entrust entrustment entry entryman entryway enturret entwine entwinement entwist Entyloma enucleate enucleation enucleator Enukki enumerable enumerate enumeration enumerative enumerator enunciability enunciable enunciate enunciation enunciative enunciatively enunciator enunciatory enure enuresis enuretic enurny envapor envapour envassal envassalage envault enveil envelop envelope enveloper envelopment envenom envenomation enverdure envermeil enviable enviableness enviably envied envier envineyard envious enviously enviousness environ environage environal environic environment environmental environmentalism environmentalist environmentally environs envisage envisagement envision envolume envoy envoyship envy envying envyingly enwallow enwiden enwind enwisen enwoman enwomb enwood enworthed enwound enwrap enwrapment enwreathe enwrite enwrought enzone enzootic enzooty enzym enzymatic enzyme enzymic enzymically enzymologist enzymology enzymolysis enzymolytic enzymosis enzymotic eoan Eoanthropus Eocarboniferous Eocene Eodevonian Eogaea Eogaean Eoghanacht Eohippus eolation eolith eolithic Eomecon eon eonism Eopalaeozoic Eopaleozoic eophyte eophytic eophyton eorhyolite eosate Eosaurus eoside eosin eosinate eosinic eosinoblast eosinophile eosinophilia eosinophilic eosinophilous eosphorite Eozoic eozoon eozoonal epacmaic epacme epacrid Epacridaceae epacridaceous Epacris epact epactal epagoge epagogic epagomenae epagomenal epagomenic epagomenous epaleaceous epalpate epanadiplosis Epanagoge epanalepsis epanaleptic epanaphora epanaphoral epanastrophe epanisognathism epanisognathous epanodos epanody Epanorthidae epanorthosis epanorthotic epanthous epapillate epappose eparch eparchate Eparchean eparchial eparchy eparcuale eparterial epaule epaulement epaulet epauleted epauletted epauliere epaxial epaxially epedaphic epee epeeist Epeira epeiric epeirid Epeiridae epeirogenesis epeirogenetic epeirogenic epeirogeny epeisodion epembryonic epencephal epencephalic epencephalon ependyma ependymal ependyme ependymitis ependymoma ependytes epenthesis epenthesize epenthetic epephragmal epepophysial epepophysis epergne eperotesis Eperua epexegesis epexegetic epexegetical epexegetically epha ephah epharmonic epharmony ephebe ephebeion ephebeum ephebic ephebos ephebus ephectic Ephedra Ephedraceae ephedrine ephelcystic ephelis Ephemera ephemera ephemerae ephemeral ephemerality ephemerally ephemeralness ephemeran ephemerid Ephemerida Ephemeridae ephemerides ephemeris ephemerist ephemeromorph ephemeromorphic ephemeron Ephemeroptera ephemerous Ephesian Ephesine ephetae ephete ephetic ephialtes ephidrosis ephippial ephippium ephod ephor ephoral ephoralty ephorate ephoric ephorship ephorus ephphatha Ephraim Ephraimite Ephraimitic Ephraimitish Ephraitic Ephrathite Ephthalite Ephthianura ephthianure Ephydra ephydriad ephydrid Ephydridae ephymnium ephyra ephyrula epibasal Epibaterium epibatholithic epibenthic epibenthos epiblast epiblastema epiblastic epiblema epibole epibolic epibolism epiboly epiboulangerite epibranchial epic epical epically epicalyx epicanthic epicanthus epicardia epicardiac epicardial epicardium epicarid epicaridan Epicaridea Epicarides epicarp Epicauta epicede epicedial epicedian epicedium epicele epicene epicenism epicenity epicenter epicentral epicentrum Epiceratodus epicerebral epicheirema epichil epichile epichilium epichindrotic epichirema epichondrosis epichordal epichorial epichoric epichorion epichoristic Epichristian epicism epicist epiclastic epicleidian epicleidium epiclesis epiclidal epiclinal epicly epicnemial Epicoela epicoelar epicoele epicoelia epicoeliac epicoelian epicoeloma epicoelous epicolic epicondylar epicondyle epicondylian epicondylic epicontinental epicoracohumeral epicoracoid epicoracoidal epicormic epicorolline epicortical epicostal epicotyl epicotyleal epicotyledonary epicranial epicranium epicranius Epicrates epicrisis epicritic epicrystalline Epictetian epicure Epicurean Epicureanism epicurish epicurishly Epicurism Epicurize epicycle epicyclic epicyclical epicycloid epicycloidal epicyemate epicyesis epicystotomy epicyte epideictic epideictical epideistic epidemic epidemical epidemically epidemicalness epidemicity epidemiographist epidemiography epidemiological epidemiologist epidemiology epidemy epidendral epidendric Epidendron Epidendrum epiderm epiderma epidermal epidermatic epidermatoid epidermatous epidermic epidermical epidermically epidermidalization epidermis epidermization epidermoid epidermoidal epidermolysis epidermomycosis Epidermophyton epidermophytosis epidermose epidermous epidesmine epidialogue epidiascope epidiascopic epidictic epidictical epididymal epididymectomy epididymis epididymite epididymitis epididymodeferentectomy epididymodeferential epididymovasostomy epidiorite epidiorthosis epidosite epidote epidotic epidotiferous epidotization epidural epidymides epifascial epifocal epifolliculitis Epigaea epigamic epigaster epigastraeum epigastral epigastrial epigastric epigastrical epigastriocele epigastrium epigastrocele epigeal epigean epigeic epigene epigenesis epigenesist epigenetic epigenetically epigenic epigenist epigenous epigeous epiglottal epiglottic epiglottidean epiglottiditis epiglottis epiglottitis epignathous epigonal epigonation epigone Epigoni epigonic Epigonichthyidae Epigonichthys epigonium epigonos epigonous Epigonus epigram epigrammatic epigrammatical epigrammatically epigrammatism epigrammatist epigrammatize epigrammatizer epigraph epigrapher epigraphic epigraphical epigraphically epigraphist epigraphy epiguanine epigyne epigynous epigynum epigyny Epihippus epihyal epihydric epihydrinic epikeia epiklesis Epikouros epilabrum Epilachna Epilachnides epilamellar epilaryngeal epilate epilation epilatory epilegomenon epilemma epilemmal epilepsy epileptic epileptically epileptiform epileptogenic epileptogenous epileptoid epileptologist epileptology epilimnion epilobe Epilobiaceae Epilobium epilogation epilogic epilogical epilogist epilogistic epilogize epilogue Epimachinae epimacus epimandibular epimanikia Epimedium Epimenidean epimer epimeral epimere epimeric epimeride epimerite epimeritic epimeron epimerum epimorphic epimorphosis epimysium epimyth epinaos epinastic epinastically epinasty epineolithic Epinephelidae Epinephelus epinephrine epinette epineural epineurial epineurium epinglette epinicial epinician epinicion epinine epiopticon epiotic Epipactis epipaleolithic epiparasite epiparodos epipastic epiperipheral epipetalous epiphanous Epiphany epipharyngeal epipharynx Epiphegus epiphenomenal epiphenomenalism epiphenomenalist epiphenomenon epiphloedal epiphloedic epiphloeum epiphonema epiphora epiphragm epiphylline epiphyllous Epiphyllum epiphysary epiphyseal epiphyseolysis epiphysial epiphysis epiphysitis epiphytal epiphyte epiphytic epiphytical epiphytically epiphytism epiphytology epiphytotic epiphytous epipial epiplankton epiplanktonic epiplasm epiplasmic epiplastral epiplastron epiplectic epipleura epipleural epiplexis epiploce epiplocele epiploic epiploitis epiploon epiplopexy epipodial epipodiale epipodite epipoditic epipodium epipolic epipolism epipolize epiprecoracoid Epipsychidion epipteric epipterous epipterygoid epipubic epipubis epirhizous epirogenic epirogeny Epirote Epirotic epirotulian epirrhema epirrhematic epirrheme episarcine episcenium episclera episcleral episcleritis episcopable episcopacy Episcopal episcopal episcopalian Episcopalianism Episcopalianize episcopalism episcopality Episcopally episcopally episcopate episcopature episcope episcopicide episcopization episcopize episcopolatry episcotister episematic episepalous episiocele episiohematoma episioplasty episiorrhagia episiorrhaphy episiostenosis episiotomy episkeletal episkotister episodal episode episodial episodic episodical episodically epispadiac epispadias epispastic episperm epispermic epispinal episplenitis episporangium epispore episporium epistapedial epistasis epistatic epistaxis epistemic epistemolog epistemological epistemologically epistemologist epistemology epistemonic epistemonical epistemophilia epistemophiliac epistemophilic episternal episternalia episternite episternum epistilbite epistlar epistle epistler epistolarian epistolarily epistolary epistolatory epistoler epistolet epistolic epistolical epistolist epistolizable epistolization epistolize epistolizer epistolographer epistolographic epistolographist epistolography epistoma epistomal epistome epistomian epistroma epistrophe epistropheal epistropheus epistrophic epistrophy epistylar epistyle Epistylis episyllogism episynaloephe episynthetic episyntheton epitactic epitaph epitapher epitaphial epitaphian epitaphic epitaphical epitaphist epitaphize epitaphless epitasis epitela epitendineum epitenon epithalamia epithalamial epithalamiast epithalamic epithalamion epithalamium epithalamize epithalamus epithalamy epithalline epitheca epithecal epithecate epithecium epithelia epithelial epithelioblastoma epithelioceptor epitheliogenetic epithelioglandular epithelioid epitheliolysin epitheliolysis epitheliolytic epithelioma epitheliomatous epitheliomuscular epitheliosis epitheliotoxin epithelium epithelization epithelize epitheloid epithem epithesis epithet epithetic epithetical epithetically epithetician epithetize epitheton epithumetic epithyme epithymetic epithymetical epitimesis epitoke epitomator epitomatory epitome epitomic epitomical epitomically epitomist epitomization epitomize epitomizer epitonic Epitoniidae epitonion Epitonium epitoxoid epitrachelion epitrichial epitrichium epitrite epitritic epitrochlea epitrochlear epitrochoid epitrochoidal epitrope epitrophic epitrophy epituberculosis epituberculous epitympanic epitympanum epityphlitis epityphlon epiural epivalve epixylous epizeuxis Epizoa epizoa epizoal epizoan epizoarian epizoic epizoicide epizoon epizootic epizootiology epoch epocha epochal epochally epochism epochist epode epodic epollicate Epomophorus eponychium eponym eponymic eponymism eponymist eponymize eponymous eponymus eponymy epoophoron epopee epopoean epopoeia epopoeist epopt epoptes epoptic epoptist epornitic epornitically epos Eppie Eppy Eproboscidea epruinose epsilon Epsom epsomite Eptatretidae Eptatretus epulary epulation epulis epulo epuloid epulosis epulotic epupillate epural epurate epuration epyllion equability equable equableness equably equaeval equal equalable equaling equalist equalitarian equalitarianism equality equalization equalize equalizer equalizing equalling equally equalness equangular equanimity equanimous equanimously equanimousness equant equatable equate equation equational equationally equationism equationist equator equatorial equatorially equatorward equatorwards equerry equerryship equestrial equestrian equestrianism equestrianize equestrianship equestrienne equianchorate equiangle equiangular equiangularity equianharmonic equiarticulate equiatomic equiaxed equiaxial equibalance equibiradiate equicellular equichangeable equicohesive equiconvex equicostate equicrural equicurve equid equidense equidensity equidiagonal equidifferent equidimensional equidistance equidistant equidistantial equidistantly equidistribution equidiurnal equidivision equidominant equidurable equielliptical equiexcellency equiform equiformal equiformity equiglacial equigranular equijacent equilateral equilaterally equilibrant equilibrate equilibration equilibrative equilibrator equilibratory equilibria equilibrial equilibriate equilibrio equilibrious equilibrist equilibristat equilibristic equilibrity equilibrium equilibrize equilobate equilobed equilocation equilucent equimodal equimolar equimolecular equimomental equimultiple equinate equine equinecessary equinely equinia equinity equinoctial equinoctially equinovarus equinox equinumerally equinus equiomnipotent equip equipaga equipage equiparant equiparate equiparation equipartile equipartisan equipartition equiped equipedal equiperiodic equipluve equipment equipoise equipollence equipollency equipollent equipollently equipollentness equiponderance equiponderancy equiponderant equiponderate equiponderation equipostile equipotent equipotential equipotentiality equipper equiprobabilism equiprobabilist equiprobability equiproducing equiproportional equiproportionality equiradial equiradiate equiradical equirotal equisegmented Equisetaceae equisetaceous Equisetales equisetic Equisetum equisided equisignal equisized equison equisonance equisonant equispaced equispatial equisufficiency equisurface equitable equitableness equitably equitangential equitant equitation equitative equitemporal equitemporaneous equites equitist equitriangular equity equivalence equivalenced equivalency equivalent equivalently equivaliant equivalue equivaluer equivalve equivalved equivalvular equivelocity equivocacy equivocal equivocality equivocally equivocalness equivocate equivocatingly equivocation equivocator equivocatory equivoluminal equivoque equivorous equivote equoid equoidean equuleus Equus er era erade eradiate eradiation eradicable eradicant eradicate eradication eradicative eradicator eradicatory eradiculose Eragrostis eral eranist Eranthemum Eranthis erasable erase erased erasement eraser erasion Erasmian Erasmus Erastian Erastianism Erastianize Erastus erasure Erava erbia erbium erd erdvark ere Erechtheum Erechtheus Erechtites erect erectable erecter erectile erectility erecting erection erective erectly erectness erectopatent erector erelong eremacausis Eremian eremic eremital eremite eremiteship eremitic eremitical eremitish eremitism Eremochaeta eremochaetous eremology eremophyte Eremopteris Eremurus erenach erenow erepsin erept ereptase ereptic ereption erethic erethisia erethism erethismic erethistic erethitic Erethizon Erethizontidae Eretrian erewhile erewhiles erg ergal ergamine Ergane ergasia ergasterion ergastic ergastoplasm ergastoplasmic ergastulum ergatandromorph ergatandromorphic ergatandrous ergatandry ergates ergatocracy ergatocrat ergatogyne ergatogynous ergatogyny ergatoid ergatomorph ergatomorphic ergatomorphism ergmeter ergodic ergogram ergograph ergographic ergoism ergology ergomaniac ergometer ergometric ergometrine ergon ergonovine ergophile ergophobia ergophobiac ergoplasm ergostat ergosterin ergosterol ergot ergotamine ergotaminine ergoted ergothioneine ergotic ergotin ergotinine ergotism ergotist ergotization ergotize ergotoxin ergotoxine ergusia eria Erian Erianthus Eric eric Erica Ericaceae ericaceous ericad erical Ericales ericetal ericeticolous ericetum erichthus erichtoid ericineous ericius Erick ericoid ericolin ericophyte Eridanid Erie Erigenia Erigeron erigible Eriglossa eriglossate Erik erika erikite Erinaceidae erinaceous Erinaceus erineum erinite Erinize erinose Eriobotrya Eriocaulaceae eriocaulaceous Eriocaulon Eriocomi Eriodendron Eriodictyon erioglaucine Eriogonum eriometer erionite Eriophorum Eriophyes Eriophyidae eriophyllous Eriosoma Eriphyle Eristalis eristic eristical eristically Erithacus Eritrean erizo erlking Erma Ermanaric Ermani Ermanrich ermelin ermine ermined erminee ermines erminites erminois erne Ernest Ernestine Ernie Ernst erode eroded erodent erodible Erodium erogeneity erogenesis erogenetic erogenic erogenous erogeny Eros eros erose erosely erosible erosion erosional erosionist erosive erostrate eroteme erotesis erotetic erotic erotica erotical erotically eroticism eroticize eroticomania erotism erotogenesis erotogenetic erotogenic erotogenicity erotomania erotomaniac erotopath erotopathic erotopathy Erotylidae Erpetoichthys erpetologist err errability errable errableness errabund errancy errand errant Errantia errantly errantness errantry errata erratic erratical erratically erraticalness erraticism erraticness erratum errhine erring erringly errite erroneous erroneously erroneousness error errorful errorist errorless ers Ersar ersatz Erse Ertebolle erth erthen erthling erthly erubescence erubescent erubescite eruc Eruca eruca erucic eruciform erucin erucivorous eruct eructance eructation eructative eruction erudit erudite eruditely eruditeness eruditical erudition eruditional eruditionist erugate erugation erugatory erumpent erupt eruption eruptional eruptive eruptively eruptiveness eruptivity ervenholder Ervipiame Ervum Erwin Erwinia eryhtrism Erymanthian Eryngium eryngo Eryon Eryops Erysibe Erysimum erysipelas erysipelatoid erysipelatous erysipeloid Erysipelothrix erysipelous Erysiphaceae Erysiphe Erythea erythema erythematic erythematous erythemic Erythraea Erythraean Erythraeidae erythrasma erythrean erythremia erythremomelalgia erythrene erythrin Erythrina erythrine Erythrinidae Erythrinus erythrismal erythristic erythrite erythritic erythritol erythroblast erythroblastic erythroblastosis erythrocarpous erythrocatalysis Erythrochaete erythrochroic erythrochroism erythroclasis erythroclastic erythrocyte erythrocytic erythrocytoblast erythrocytolysin erythrocytolysis erythrocytolytic erythrocytometer erythrocytorrhexis erythrocytoschisis erythrocytosis erythrodegenerative erythrodermia erythrodextrin erythrogenesis erythrogenic erythroglucin erythrogonium erythroid erythrol erythrolein erythrolitmin erythrolysin erythrolysis erythrolytic erythromelalgia erythron erythroneocytosis Erythronium erythronium erythropenia erythrophage erythrophagous erythrophilous erythrophleine erythrophobia erythrophore erythrophyll erythrophyllin erythropia erythroplastid erythropoiesis erythropoietic erythropsia erythropsin erythrorrhexis erythroscope erythrose erythrosiderite erythrosin erythrosinophile erythrosis Erythroxylaceae erythroxylaceous erythroxyline Erythroxylon Erythroxylum erythrozincite erythrozyme erythrulose Eryx es esca escadrille escalade escalader escalado escalan escalate Escalator escalator escalin Escallonia Escalloniaceae escalloniaceous escalop escaloped escambio escambron escapable escapade escapage escape escapee escapeful escapeless escapement escaper escapingly escapism escapist escarbuncle escargatoire escarole escarp escarpment eschalot eschar eschara escharine escharoid escharotic eschatocol eschatological eschatologist eschatology escheat escheatable escheatage escheatment escheator escheatorship Escherichia eschew eschewal eschewance eschewer Eschscholtzia eschynite esclavage escoba escobadura escobilla escobita escolar esconson escopette Escorial escort escortage escortee escortment escribe escritoire escritorial escrol escropulo escrow escruage escudo Esculapian esculent esculetin esculin escutcheon escutcheoned escutellate esdragol Esdras Esebrias esemplastic esemplasy eseptate esere eserine esexual eshin esiphonal esker Eskimauan Eskimo Eskimoic Eskimoid Eskimoized Eskualdun Eskuara Esmeralda Esmeraldan esmeraldite esne esoanhydride esocataphoria Esocidae esociform esocyclic esodic esoenteritis esoethmoiditis esogastritis esonarthex esoneural esophagal esophagalgia esophageal esophagean esophagectasia esophagectomy esophagi esophagism esophagismus esophagitis esophago esophagocele esophagodynia esophagogastroscopy esophagogastrostomy esophagomalacia esophagometer esophagomycosis esophagopathy esophagoplasty esophagoplegia esophagoplication esophagoptosis esophagorrhagia esophagoscope esophagoscopy esophagospasm esophagostenosis esophagostomy esophagotome esophagotomy esophagus esophoria esophoric Esopus esoteric esoterica esoterical esoterically esotericism esotericist esoterics esoterism esoterist esoterize esotery esothyropexy esotrope esotropia esotropic Esox espacement espadon espalier espantoon esparcet esparsette esparto espathate espave especial especially especialness esperance Esperantic Esperantidist Esperantido Esperantism Esperantist Esperanto espial espichellite espier espinal espingole espinillo espino espionage esplanade esplees esponton espousal espouse espousement espouser Espriella espringal espundia espy esquamate esquamulose Esquiline esquire esquirearchy esquiredom esquireship ess essang essay essayer essayette essayical essayish essayism essayist essayistic essayistical essaylet essed Essedones Esselen Esselenian essence essency Essene Essenian Essenianism Essenic Essenical Essenis Essenism Essenize essentia essential essentialism essentialist essentiality essentialize essentially essentialness essenwood Essex essexite Essie essling essoin essoinee essoiner essoinment essonite essorant establish establishable established establisher establishment establishmentarian establishmentarianism establishmentism estacade estadal estadio estado estafette estafetted estamene estamp estampage estampede estampedero estate estatesman esteem esteemable esteemer Estella ester esterase esterellite esteriferous esterification esterify esterization esterize esterlin esterling estevin Esth Esthacyte esthematology Esther Estheria estherian Estheriidae esthesia esthesio esthesioblast esthesiogen esthesiogenic esthesiogeny esthesiography esthesiology esthesiometer esthesiometric esthesiometry esthesioneurosis esthesiophysiology esthesis esthetology esthetophore esthiomene estimable estimableness estimably estimate estimatingly estimation estimative estimator estipulate estivage estival estivate estivation estivator estmark estoc estoile Estonian estop estoppage estoppel Estotiland estovers estrade estradiol estradiot estragole estrange estrangedness estrangement estranger estrapade estray estre estreat estrepe estrepement estriate estriche estrin estriol estrogen estrogenic estrone estrous estrual estruate estruation estuarial estuarine estuary estufa estuous estus esugarization esurience esurient esuriently eta etaballi etacism etacist etalon Etamin etamine etch Etchareottine etcher Etchimin etching Eteoclus Eteocretes Eteocreton eternal eternalism eternalist eternalization eternalize eternally eternalness eternity eternization eternize etesian ethal ethaldehyde Ethan ethanal ethanamide ethane ethanedial ethanediol ethanedithiol ethanethial ethanethiol Ethanim ethanol ethanolamine ethanolysis ethanoyl Ethel ethel ethene Etheneldeli ethenic ethenoid ethenoidal ethenol ethenyl Etheostoma Etheostomidae Etheostominae etheostomoid ether etherate ethereal etherealism ethereality etherealization etherealize ethereally etherealness etherean ethered ethereous Etheria etheric etherification etheriform etherify Etheriidae etherin etherion etherism etherization etherize etherizer etherolate etherous ethic ethical ethicalism ethicality ethically ethicalness ethician ethicism ethicist ethicize ethicoaesthetic ethicophysical ethicopolitical ethicoreligious ethicosocial ethics ethid ethide ethidene ethine ethiodide ethionic Ethiop Ethiopia Ethiopian Ethiopic ethiops ethmofrontal ethmoid ethmoidal ethmoiditis ethmolachrymal ethmolith ethmomaxillary ethmonasal ethmopalatal ethmopalatine ethmophysal ethmopresphenoidal ethmosphenoid ethmosphenoidal ethmoturbinal ethmoturbinate ethmovomer ethmovomerine ethmyphitis ethnal ethnarch ethnarchy ethnic ethnical ethnically ethnicism ethnicist ethnicize ethnicon ethnize ethnobiological ethnobiology ethnobotanic ethnobotanical ethnobotanist ethnobotany ethnocentric ethnocentrism ethnocracy ethnodicy ethnoflora ethnogenic ethnogeny ethnogeographer ethnogeographic ethnogeographical ethnogeographically ethnogeography ethnographer ethnographic ethnographical ethnographically ethnographist ethnography ethnologer ethnologic ethnological ethnologically ethnologist ethnology ethnomaniac ethnopsychic ethnopsychological ethnopsychology ethnos ethnotechnics ethnotechnography ethnozoological ethnozoology ethography etholide ethologic ethological ethology ethonomic ethonomics ethopoeia ethos ethoxide ethoxycaffeine ethoxyl ethrog ethyl ethylamide ethylamine ethylate ethylation ethylene ethylenediamine ethylenic ethylenimine ethylenoid ethylhydrocupreine ethylic ethylidene ethylidyne ethylin ethylmorphine ethylsulphuric ethyne ethynyl etiogenic etiolate etiolation etiolin etiolize etiological etiologically etiologist etiologue etiology etiophyllin etioporphyrin etiotropic etiotropically etiquette etiquettical etna Etnean Etonian Etrurian Etruscan Etruscologist Etruscology Etta Ettarre ettle etua etude etui etym etymic etymography etymologer etymologic etymological etymologically etymologicon etymologist etymologization etymologize etymology etymon etymonic etypic etypical etypically eu Euahlayi euangiotic Euascomycetes euaster Eubacteriales eubacterium Eubasidii Euboean Euboic Eubranchipus eucaine eucairite eucalypt eucalypteol eucalyptian eucalyptic eucalyptography eucalyptol eucalyptole Eucalyptus eucalyptus Eucarida eucatropine eucephalous Eucharis Eucharist eucharistial eucharistic eucharistical Eucharistically eucharistically eucharistize Eucharitidae Euchite Euchlaena euchlorhydria euchloric euchlorine Euchlorophyceae euchological euchologion euchology Euchorda euchre euchred euchroic euchroite euchromatic euchromatin euchrome euchromosome euchrone Eucirripedia euclase Euclea Eucleidae Euclid Euclidean Euclideanism Eucnemidae eucolite Eucommia Eucommiaceae eucone euconic Euconjugatae Eucopepoda Eucosia eucosmid Eucosmidae eucrasia eucrasite eucrasy eucrite Eucryphia Eucryphiaceae eucryphiaceous eucryptite eucrystalline euctical eucyclic eudaemon eudaemonia eudaemonic eudaemonical eudaemonics eudaemonism eudaemonist eudaemonistic eudaemonistical eudaemonistically eudaemonize eudaemony eudaimonia eudaimonism eudaimonist Eudemian Eudendrium Eudeve eudiagnostic eudialyte eudiaphoresis eudidymite eudiometer eudiometric eudiometrical eudiometrically eudiometry eudipleural Eudist Eudora Eudorina Eudoxian Eudromias Eudyptes Euergetes euge Eugene eugenesic eugenesis eugenetic Eugenia eugenic eugenical eugenically eugenicist eugenics Eugenie eugenism eugenist eugenol eugenolate eugeny Euglandina Euglena Euglenaceae Euglenales Euglenida Euglenidae Euglenineae euglenoid Euglenoidina euglobulin eugranitic Eugregarinida Eugubine Eugubium euharmonic euhedral euhemerism euhemerist euhemeristic euhemeristically euhemerize euhyostylic euhyostyly euktolite eulachon Eulalia eulalia eulamellibranch Eulamellibranchia Eulamellibranchiata Eulima Eulimidae eulogia eulogic eulogical eulogically eulogious eulogism eulogist eulogistic eulogistical eulogistically eulogium eulogization eulogize eulogizer eulogy eulysite eulytine eulytite Eumenes eumenid Eumenidae Eumenidean Eumenides eumenorrhea eumerism eumeristic eumerogenesis eumerogenetic eumeromorph eumeromorphic eumitosis eumitotic eumoiriety eumoirous Eumolpides Eumolpus eumorphous eumycete Eumycetes eumycetic Eunectes Eunice eunicid Eunicidae Eunomia Eunomian Eunomianism eunomy eunuch eunuchal eunuchism eunuchize eunuchoid eunuchoidism eunuchry euomphalid Euomphalus euonym euonymin euonymous Euonymus euonymy Euornithes euornithic Euorthoptera euosmite euouae eupad Eupanorthidae Eupanorthus eupathy eupatoriaceous eupatorin Eupatorium eupatory eupatrid eupatridae eupepsia eupepsy eupeptic eupepticism eupepticity Euphausia Euphausiacea euphausiid Euphausiidae Euphemia euphemian euphemious euphemiously euphemism euphemist euphemistic euphemistical euphemistically euphemize euphemizer euphemous euphemy euphon euphone euphonetic euphonetics euphonia euphonic euphonical euphonically euphonicalness euphonious euphoniously euphoniousness euphonism euphonium euphonize euphonon euphonous euphony euphonym Euphorbia Euphorbiaceae euphorbiaceous euphorbium euphoria euphoric euphory Euphrasia euphrasy Euphratean euphroe Euphrosyne Euphues euphuism euphuist euphuistic euphuistical euphuistically euphuize Euphyllopoda eupione eupittonic euplastic Euplectella Euplexoptera Euplocomi Euploeinae euploid euploidy eupnea Eupolidean Eupolyzoa eupolyzoan Eupomatia Eupomatiaceae eupractic eupraxia Euprepia Euproctis eupsychics Euptelea Eupterotidae eupyrchroite eupyrene eupyrion Eurafric Eurafrican Euraquilo Eurasian Eurasianism Eurasiatic eureka eurhodine eurhodol Eurindic Euripidean euripus eurite Euroaquilo eurobin Euroclydon Europa Europasian European Europeanism Europeanization Europeanize Europeanly Europeward europium Europocentric Eurus Euryalae Euryale Euryaleae euryalean Euryalida euryalidan Euryalus eurybathic eurybenthic eurycephalic eurycephalous Eurycerotidae Euryclea Eurydice Eurygaea Eurygaean eurygnathic eurygnathism eurygnathous euryhaline Eurylaimi Eurylaimidae eurylaimoid Eurylaimus Eurymus euryon Eurypelma Eurypharyngidae Eurypharynx euryprognathous euryprosopic eurypterid Eurypterida eurypteroid Eurypteroidea Eurypterus Eurypyga Eurypygae Eurypygidae eurypylous euryscope Eurystheus eurystomatous eurythermal eurythermic eurythmic eurythmical eurythmics eurythmy eurytomid Eurytomidae Eurytus euryzygous Euscaro Eusebian Euselachii Euskaldun Euskara Euskarian Euskaric Euskera eusol Euspongia eusporangiate Eustace Eustachian eustachium Eustathian eustatic Eusthenopteron eustomatous eustyle Eusuchia eusuchian eusynchite Eutaenia eutannin eutaxic eutaxite eutaxitic eutaxy eutechnic eutechnics eutectic eutectoid Euterpe Euterpean eutexia Euthamia euthanasia euthanasy euthenics euthenist Eutheria eutherian euthermic Euthycomi euthycomic Euthyneura euthyneural euthyneurous euthytatic euthytropic eutomous eutony Eutopia Eutopian eutrophic eutrophy eutropic eutropous Eutychian Eutychianism euxanthate euxanthic euxanthone euxenite Euxine Eva evacuant evacuate evacuation evacuative evacuator evacue evacuee evadable evade evader evadingly Evadne evagation evaginable evaginate evagination evaluable evaluate evaluation evaluative evalue Evan evanesce evanescence evanescency evanescent evanescently evanescible evangel evangelary evangelian evangeliarium evangeliary evangelical evangelicalism evangelicality evangelically evangelicalness evangelican evangelicism evangelicity Evangeline evangelion evangelism evangelist evangelistarion evangelistarium evangelistary evangelistic evangelistically evangelistics evangelistship evangelium evangelization evangelize evangelizer Evaniidae evanish evanishment evanition evansite evaporability evaporable evaporate evaporation evaporative evaporativity evaporator evaporimeter evaporize evaporometer evase evasible evasion evasional evasive evasively evasiveness Eve eve Evea evechurr evection evectional Evehood evejar Eveless evelight Evelina Eveline evelong Evelyn even evenblush evendown evener evenfall evenforth evenglow evenhanded evenhandedly evenhandedness evening evenlight evenlong evenly evenmete evenminded evenmindedness evenness evens evensong event eventful eventfully eventfulness eventide eventime eventless eventlessly eventlessness eventognath Eventognathi eventognathous eventration eventual eventuality eventualize eventually eventuate eventuation evenwise evenworthy eveque ever Everard everbearer everbearing everbloomer everblooming everduring Everett everglade evergreen evergreenery evergreenite everlasting everlastingly everlastingness everliving evermore Evernia evernioid eversible eversion eversive eversporting evert evertebral Evertebrata evertebrate evertile evertor everwhich everwho every everybody everyday everydayness everyhow everylike Everyman everyman everyness everyone everything everywhen everywhence everywhere everywhereness everywheres everywhither evestar evetide eveweed evict eviction evictor evidence evidencive evident evidential evidentially evidentiary evidently evidentness evil evildoer evilhearted evilly evilmouthed evilness evilproof evilsayer evilspeaker evilspeaking evilwishing evince evincement evincible evincibly evincingly evincive evirate eviration eviscerate evisceration evisite evitable evitate evitation evittate evocable evocate evocation evocative evocatively evocator evocatory evocatrix Evodia evoe evoke evoker evolute evolution evolutional evolutionally evolutionary evolutionism evolutionist evolutionize evolutive evolutoid evolvable evolve evolvement evolvent evolver Evonymus evovae evulgate evulgation evulse evulsion evzone ewder Ewe ewe ewelease ewer ewerer ewery ewry ex exacerbate exacerbation exacerbescence exacerbescent exact exactable exacter exacting exactingly exactingness exaction exactitude exactive exactiveness exactly exactment exactness exactor exactress exadversum exaggerate exaggerated exaggeratedly exaggerating exaggeratingly exaggeration exaggerative exaggeratively exaggerativeness exaggerator exaggeratory exagitate exagitation exairesis exalate exalbuminose exalbuminous exallotriote exalt exaltation exaltative exalted exaltedly exaltedness exalter exam examen examinability examinable examinant examinate examination examinational examinationism examinationist examinative examinator examinatorial examinatory examine examinee examiner examinership examining examiningly example exampleless exampleship exanimate exanimation exanthem exanthema exanthematic exanthematous exappendiculate exarate exaration exarch exarchal exarchate exarchateship Exarchic Exarchist exarchist exarchy exareolate exarillate exaristate exarteritis exarticulate exarticulation exasperate exasperated exasperatedly exasperater exasperating exasperatingly exasperation exasperative exaspidean Exaudi exaugurate exauguration excalate excalation excalcarate excalceate excalceation Excalibur excamb excamber excambion excandescence excandescency excandescent excantation excarnate excarnation excathedral excaudate excavate excavation excavationist excavator excavatorial excavatory excave excecate excecation excedent exceed exceeder exceeding exceedingly exceedingness excel excelente excellence excellency excellent excellently excelsin Excelsior excelsior excelsitude excentral excentric excentrical excentricity except exceptant excepting exception exceptionable exceptionableness exceptionably exceptional exceptionality exceptionally exceptionalness exceptionary exceptionless exceptious exceptiousness exceptive exceptively exceptiveness exceptor excerebration excerpt excerptible excerption excerptive excerptor excess excessive excessively excessiveness excessman exchange exchangeability exchangeable exchangeably exchanger Exchangite Exchequer exchequer excide excipient exciple Excipulaceae excipular excipule excipuliform excipulum excircle excisable excise exciseman excisemanship excision excisor excitability excitable excitableness excitancy excitant excitation excitative excitator excitatory excite excited excitedly excitedness excitement exciter exciting excitingly excitive excitoglandular excitometabolic excitomotion excitomotor excitomotory excitomuscular excitonutrient excitor excitory excitosecretory excitovascular exclaim exclaimer exclaiming exclaimingly exclamation exclamational exclamative exclamatively exclamatorily exclamatory exclave exclosure excludable exclude excluder excluding excludingly exclusion exclusionary exclusioner exclusionism exclusionist exclusive exclusively exclusiveness exclusivism exclusivist exclusivity exclusory Excoecaria excogitable excogitate excogitation excogitative excogitator excommunicable excommunicant excommunicate excommunication excommunicative excommunicator excommunicatory exconjugant excoriable excoriate excoriation excoriator excorticate excortication excrement excremental excrementary excrementitial excrementitious excrementitiously excrementitiousness excrementive excresce excrescence excrescency excrescent excrescential excreta excretal excrete excreter excretes excretion excretionary excretitious excretive excretory excriminate excruciable excruciate excruciating excruciatingly excruciation excruciator excubant excudate exculpable exculpate exculpation exculpative exculpatorily exculpatory excurrent excurse excursion excursional excursionary excursioner excursionism excursionist excursionize excursive excursively excursiveness excursory excursus excurvate excurvated excurvation excurvature excurved excusability excusable excusableness excusably excusal excusative excusator excusatory excuse excuseful excusefully excuseless excuser excusing excusingly excusive excuss excyst excystation excysted excystment exdelicto exdie exeat execrable execrableness execrably execrate execration execrative execratively execrator execratory executable executancy executant execute executed executer execution executional executioneering executioner executioneress executionist executive executively executiveness executiveship executor executorial executorship executory executress executrices executrix executrixship executry exedent exedra exegeses exegesis exegesist exegete exegetic exegetical exegetically exegetics exegetist exemplar exemplaric exemplarily exemplariness exemplarism exemplarity exemplary exemplifiable exemplification exemplificational exemplificative exemplificator exemplifier exemplify exempt exemptible exemptile exemption exemptionist exemptive exencephalia exencephalic exencephalous exencephalus exendospermic exendospermous exenterate exenteration exequatur exequial exequy exercisable exercise exerciser exercitant exercitation exercitor exercitorial exercitorian exeresis exergual exergue exert exertion exertionless exertive exes exeunt exfiguration exfigure exfiltration exflagellate exflagellation exflect exfodiate exfodiation exfoliate exfoliation exfoliative exfoliatory exgorgitation exhalable exhalant exhalation exhalatory exhale exhaust exhausted exhaustedly exhaustedness exhauster exhaustibility exhaustible exhausting exhaustingly exhaustion exhaustive exhaustively exhaustiveness exhaustless exhaustlessly exhaustlessness exheredate exheredation exhibit exhibitable exhibitant exhibiter exhibition exhibitional exhibitioner exhibitionism exhibitionist exhibitionistic exhibitionize exhibitive exhibitively exhibitor exhibitorial exhibitorship exhibitory exhilarant exhilarate exhilarating exhilaratingly exhilaration exhilarative exhilarator exhilaratory exhort exhortation exhortative exhortatively exhortator exhortatory exhorter exhortingly exhumate exhumation exhumator exhumatory exhume exhumer exigence exigency exigent exigenter exigently exigible exiguity exiguous exiguously exiguousness exilarch exilarchate exile exiledom exilement exiler exilian exilic exility eximious eximiously eximiousness exinanite exinanition exindusiate exinguinal exist existability existence existent existential existentialism existentialist existentialistic existentialize existentially existently exister existibility existible existlessness exit exite exition exitus exlex exmeridian Exmoor exoarteritis Exoascaceae exoascaceous Exoascales Exoascus Exobasidiaceae Exobasidiales Exobasidium exocannibalism exocardia exocardiac exocardial exocarp exocataphoria exoccipital exocentric Exochorda exochorion exoclinal exocline exocoelar exocoele exocoelic exocoelom Exocoetidae Exocoetus exocolitis exocone exocrine exoculate exoculation exocyclic Exocyclica Exocycloida exode exoderm exodermis exodic exodist exodontia exodontist exodos exodromic exodromy exodus exody exoenzyme exoenzymic exoerythrocytic exogamic exogamous exogamy exogastric exogastrically exogastritis exogen Exogenae exogenetic exogenic exogenous exogenously exogeny exognathion exognathite Exogonium Exogyra exolemma exometritis exomion exomis exomologesis exomorphic exomorphism exomphalos exomphalous exomphalus Exon exon exonarthex exoner exonerate exoneration exonerative exonerator exoneural Exonian exonship exopathic exoperidium exophagous exophagy exophasia exophasic exophoria exophoric exophthalmic exophthalmos exoplasm exopod exopodite exopoditic Exopterygota exopterygotic exopterygotism exopterygotous exorability exorable exorableness exorbital exorbitance exorbitancy exorbitant exorbitantly exorbitate exorbitation exorcisation exorcise exorcisement exorciser exorcism exorcismal exorcisory exorcist exorcistic exorcistical exordia exordial exordium exordize exorganic exorhason exormia exornation exosepsis exoskeletal exoskeleton exosmic exosmose exosmosis exosmotic exosperm exosporal exospore exosporium exosporous Exostema exostome exostosed exostosis exostotic exostra exostracism exostracize exoteric exoterical exoterically exotericism exoterics exotheca exothecal exothecate exothecium exothermal exothermic exothermous exotic exotically exoticalness exoticism exoticist exoticity exoticness exotism exotospore exotoxic exotoxin exotropia exotropic exotropism expalpate expand expanded expandedly expandedness expander expanding expandingly expanse expansibility expansible expansibleness expansibly expansile expansion expansional expansionary expansionism expansionist expansive expansively expansiveness expansivity expansometer expansure expatiate expatiater expatiatingly expatiation expatiative expatiator expatiatory expatriate expatriation expect expectable expectance expectancy expectant expectantly expectation expectative expectedly expecter expectingly expective expectorant expectorate expectoration expectorative expectorator expede expediate expedience expediency expedient expediential expedientially expedientist expediently expeditate expeditation expedite expedited expeditely expediteness expediter expedition expeditionary expeditionist expeditious expeditiously expeditiousness expel expellable expellant expellee expeller expend expendability expendable expender expendible expenditor expenditrix expenditure expense expenseful expensefully expensefulness expenseless expensilation expensive expensively expensiveness expenthesis expergefacient expergefaction experience experienceable experienced experienceless experiencer experiencible experient experiential experientialism experientialist experientially experiment experimental experimentalism experimentalist experimentalize experimentally experimentarian experimentation experimentative experimentator experimented experimentee experimenter experimentist experimentize experimently expert expertism expertize expertly expertness expertship expiable expiate expiation expiational expiatist expiative expiator expiatoriness expiatory expilate expilation expilator expirable expirant expirate expiration expirator expiratory expire expiree expirer expiring expiringly expiry expiscate expiscation expiscator expiscatory explain explainable explainer explaining explainingly explanate explanation explanative explanatively explanator explanatorily explanatoriness explanatory explant explantation explement explemental expletive expletively expletiveness expletory explicable explicableness explicate explication explicative explicatively explicator explicatory explicit explicitly explicitness explodable explode exploded explodent exploder exploit exploitable exploitage exploitation exploitationist exploitative exploiter exploitive exploiture explorable exploration explorational explorative exploratively explorativeness explorator exploratory explore explorement explorer exploring exploringly explosibility explosible explosion explosionist explosive explosively explosiveness expone exponence exponency exponent exponential exponentially exponentiation exponible export exportability exportable exportation exporter exposal expose exposed exposedness exposer exposit exposition expositional expositionary expositive expositively expositor expositorial expositorially expositorily expositoriness expository expositress expostulate expostulating expostulatingly expostulation expostulative expostulatively expostulator expostulatory exposure expound expoundable expounder express expressable expressage expressed expresser expressibility expressible expressibly expression expressionable expressional expressionful expressionism expressionist expressionistic expressionless expressionlessly expressionlessness expressive expressively expressiveness expressivism expressivity expressless expressly expressman expressness expressway exprimable exprobrate exprobration exprobratory expromission expromissor expropriable expropriate expropriation expropriator expugn expugnable expuition expulsatory expulse expulser expulsion expulsionist expulsive expulsory expunction expunge expungeable expungement expunger expurgate expurgation expurgative expurgator expurgatorial expurgatory expurge exquisite exquisitely exquisiteness exquisitism exquisitively exradio exradius exrupeal exsanguinate exsanguination exsanguine exsanguineous exsanguinity exsanguinous exsanguious exscind exscissor exscriptural exsculptate exscutellate exsect exsectile exsection exsector exsequatur exsert exserted exsertile exsertion exship exsibilate exsibilation exsiccant exsiccatae exsiccate exsiccation exsiccative exsiccator exsiliency exsomatic exspuition exsputory exstipulate exstrophy exsuccous exsuction exsufflate exsufflation exsufflicate exsurge exsurgent extant extemporal extemporally extemporalness extemporaneity extemporaneous extemporaneously extemporaneousness extemporarily extemporariness extemporary extempore extemporization extemporize extemporizer extend extended extendedly extendedness extender extendibility extendible extending extense extensibility extensible extensibleness extensile extensimeter extension extensional extensionist extensity extensive extensively extensiveness extensometer extensor extensory extensum extent extenuate extenuating extenuatingly extenuation extenuative extenuator extenuatory exter exterior exteriorate exterioration exteriority exteriorization exteriorize exteriorly exteriorness exterminable exterminate extermination exterminative exterminator exterminatory exterminatress exterminatrix exterminist extern external externalism externalist externalistic externality externalization externalize externally externals externate externation externe externity externization externize externomedian externum exteroceptist exteroceptive exteroceptor exterraneous exterrestrial exterritorial exterritoriality exterritorialize exterritorially extima extinct extinction extinctionist extinctive extinctor extine extinguish extinguishable extinguishant extinguished extinguisher extinguishment extipulate extirpate extirpation extirpationist extirpative extirpator extirpatory extispex extispicious extispicy extogenous extol extoll extollation extoller extollingly extollment extolment extoolitic extorsive extorsively extort extorter extortion extortionary extortionate extortionately extortioner extortionist extortive extra extrabold extrabranchial extrabronchial extrabuccal extrabulbar extrabureau extraburghal extracalendar extracalicular extracanonical extracapsular extracardial extracarpal extracathedral extracellular extracellularly extracerebral extracivic extracivically extraclassroom extraclaustral extracloacal extracollegiate extracolumella extraconscious extraconstellated extraconstitutional extracorporeal extracorpuscular extracosmic extracosmical extracostal extracranial extract extractable extractant extracted extractible extractiform extraction extractive extractor extractorship extracultural extracurial extracurricular extracurriculum extracutaneous extracystic extradecretal extradialectal extraditable extradite extradition extradomestic extrados extradosed extradotal extraduction extradural extraembryonic extraenteric extraepiphyseal extraequilibrium extraessential extraessentially extrafascicular extrafloral extrafocal extrafoliaceous extraforaneous extraformal extragalactic extragastric extrait extrajudicial extrajudicially extralateral extralite extrality extramarginal extramatrical extramedullary extramental extrameridian extrameridional extrametaphysical extrametrical extrametropolitan extramodal extramolecular extramorainal extramorainic extramoral extramoralist extramundane extramural extramurally extramusical extranational extranatural extranean extraneity extraneous extraneously extraneousness extranidal extranormal extranuclear extraocular extraofficial extraoral extraorbital extraorbitally extraordinarily extraordinariness extraordinary extraorganismal extraovate extraovular extraparenchymal extraparental extraparietal extraparliamentary extraparochial extraparochially extrapatriarchal extrapelvic extraperineal extraperiodic extraperiosteal extraperitoneal extraphenomenal extraphysical extraphysiological extrapituitary extraplacental extraplanetary extrapleural extrapoetical extrapolar extrapolate extrapolation extrapolative extrapolator extrapopular extraprofessional extraprostatic extraprovincial extrapulmonary extrapyramidal extraquiz extrared extraregarding extraregular extraregularly extrarenal extraretinal extrarhythmical extrasacerdotal extrascholastic extraschool extrascientific extrascriptural extrascripturality extrasensible extrasensory extrasensuous extraserous extrasocial extrasolar extrasomatic extraspectral extraspherical extraspinal extrastapedial extrastate extrasterile extrastomachal extrasyllabic extrasyllogistic extrasyphilitic extrasystole extrasystolic extratabular extratarsal extratellurian extratelluric extratemporal extratension extratensive extraterrene extraterrestrial extraterritorial extraterritoriality extraterritorially extrathecal extratheistic extrathermodynamic extrathoracic extratorrid extratracheal extratribal extratropical extratubal extratympanic extrauterine extravagance extravagancy extravagant Extravagantes extravagantly extravagantness extravaganza extravagate extravaginal extravasate extravasation extravascular extraventricular extraversion extravert extravillar extraviolet extravisceral extrazodiacal extreme extremeless extremely extremeness extremism extremist extremistic extremital extremity extricable extricably extricate extricated extrication extrinsic extrinsical extrinsicality extrinsically extrinsicalness extrinsicate extrinsication extroitive extropical extrorsal extrorse extrorsely extrospect extrospection extrospective extroversion extroversive extrovert extrovertish extrude extruder extruding extrusile extrusion extrusive extrusory extubate extubation extumescence extund extusion exuberance exuberancy exuberant exuberantly exuberantness exuberate exuberation exudate exudation exudative exude exudence exulcerate exulceration exulcerative exulceratory exult exultance exultancy exultant exultantly exultation exultet exultingly exululate exumbral exumbrella exumbrellar exundance exundancy exundate exundation exuviability exuviable exuviae exuvial exuviate exuviation exzodiacal ey eyah eyalet eyas eye eyeball eyebalm eyebar eyebeam eyeberry eyeblink eyebolt eyebree eyebridled eyebright eyebrow eyecup eyed eyedness eyedot eyedrop eyeflap eyeful eyeglance eyeglass eyehole Eyeish eyelash eyeless eyelessness eyelet eyeleteer eyeletter eyelid eyelight eyelike eyeline eyemark eyen eyepiece eyepit eyepoint eyer eyereach eyeroot eyesalve eyeseed eyeservant eyeserver eyeservice eyeshade eyeshield eyeshot eyesight eyesome eyesore eyespot eyestalk eyestone eyestrain eyestring eyetooth eyewaiter eyewash eyewater eyewear eyewink eyewinker eyewitness eyewort eyey eying eyn eyne eyot eyoty eyra eyre eyrie eyrir ezba Ezekiel Ezra F f fa Faba Fabaceae fabaceous fabella fabes Fabian Fabianism Fabianist fabiform fable fabled fabledom fableist fableland fablemaker fablemonger fablemongering fabler fabliau fabling Fabraea fabric fabricant fabricate fabrication fabricative fabricator fabricatress Fabrikoid fabrikoid Fabronia Fabroniaceae fabular fabulist fabulosity fabulous fabulously fabulousness faburden facadal facade face faceable facebread facecloth faced faceless facellite facemaker facemaking faceman facemark facepiece faceplate facer facet facete faceted facetely faceteness facetiae facetiation facetious facetiously facetiousness facewise facework facia facial facially faciation faciend facient facies facile facilely facileness facilitate facilitation facilitative facilitator facility facing facingly facinorous facinorousness faciobrachial faciocervical faciolingual facioplegia facioscapulohumeral fack fackeltanz fackings fackins facks facsimile facsimilist facsimilize fact factable factabling factful Factice facticide faction factional factionalism factionary factioneer factionist factionistism factious factiously factiousness factish factitial factitious factitiously factitive factitively factitude factive factor factorability factorable factorage factordom factoress factorial factorially factorist factorization factorize factorship factory factoryship factotum factrix factual factuality factually factualness factum facture facty facula facular faculous facultate facultative facultatively facultied facultize faculty facund facy fad fadable faddiness faddish faddishness faddism faddist faddle faddy fade fadeaway faded fadedly fadedness fadeless faden fader fadge fading fadingly fadingness fadmonger fadmongering fadmongery fadridden fady fae faerie Faeroe faery faeryland faff faffle faffy fag Fagaceae fagaceous fagald Fagales Fagara fage Fagelia fager fagger faggery fagging faggingly fagine fagopyrism fagopyrismus Fagopyrum fagot fagoter fagoting fagottino fagottist fagoty Fagus faham fahlerz fahlore fahlunite Fahrenheit faience fail failing failingly failingness faille failure fain fainaigue fainaiguer faineance faineancy faineant faineantism fainly fainness fains faint fainter faintful faintheart fainthearted faintheartedly faintheartedness fainting faintingly faintish faintishness faintly faintness faints fainty faipule fair fairer fairfieldite fairgoer fairgoing fairgrass fairground fairily fairing fairish fairishly fairkeeper fairlike fairling fairly fairm fairness fairstead fairtime fairwater fairway fairy fairydom fairyfolk fairyhood fairyish fairyism fairyland fairylike fairyologist fairyology fairyship faith faithbreach faithbreaker faithful faithfully faithfulness faithless faithlessly faithlessness faithwise faithworthiness faithworthy faitour fake fakement faker fakery fakiness fakir fakirism Fakofo faky falanaka Falange Falangism Falangist Falasha falbala falcade Falcata falcate falcated falcation falcer falces falchion falcial Falcidian falciform Falcinellus falciparum Falco falcon falconbill falconelle falconer Falcones falconet Falconidae Falconiformes Falconinae falconine falconlike falconoid falconry falcopern falcula falcular falculate Falcunculus faldage falderal faldfee faldstool Falerian Falernian Falerno Faliscan Falisci Falkland fall fallace fallacious fallaciously fallaciousness fallacy fallage fallation fallaway fallback fallectomy fallen fallenness faller fallfish fallibility fallible fallibleness fallibly falling Fallopian fallostomy fallotomy fallow fallowist fallowness falltime fallway fally falsary false falsehearted falseheartedly falseheartedness falsehood falsely falsen falseness falser falsettist falsetto falsework falsidical falsie falsifiable falsificate falsification falsificator falsifier falsify falsism Falstaffian faltboat faltche falter falterer faltering falteringly Falunian Faluns falutin falx fam Fama famatinite famble fame fameflower fameful fameless famelessly famelessness Fameuse fameworthy familia familial familiar familiarism familiarity familiarization familiarize familiarizer familiarizingly familiarly familiarness familism familist familistery familistic familistical family familyish famine famish famishment famous famously famousness famulary famulus Fan fan fana fanal fanam fanatic fanatical fanatically fanaticalness fanaticism fanaticize fanback fanbearer fanciable fancical fancied fancier fanciful fancifully fancifulness fancify fanciless fancy fancymonger fancysick fancywork fand fandangle fandango fandom fanega fanegada fanfarade Fanfare fanfare fanfaron fanfaronade fanfaronading fanflower fanfoot fang fanged fangle fangled fanglement fangless fanglet fanglomerate fangot fangy fanhouse faniente fanion fanioned fanlight fanlike fanmaker fanmaking fanman fannel fanner Fannia fannier fanning Fanny fanon fant fantail fantasia fantasie fantasied fantasist fantasque fantassin fantast fantastic fantastical fantasticality fantastically fantasticalness fantasticate fantastication fantasticism fantasticly fantasticness fantastico fantastry fantasy Fanti fantigue fantoccini fantocine fantod fantoddish Fanwe fanweed fanwise fanwork fanwort fanwright Fany faon Fapesmo far farad faradaic faraday faradic faradism faradization faradize faradizer faradmeter faradocontractility faradomuscular faradonervous faradopalpation farandole farasula faraway farawayness farce farcelike farcer farcetta farcial farcialize farcical farcicality farcically farcicalness farcied farcify farcing farcinoma farcist farctate farcy farde fardel fardelet fardh fardo fare farer farewell farfara farfel farfetched farfetchedness Farfugium fargoing fargood farina farinaceous farinaceously faring farinometer farinose farinosely farinulent Farish farish farkleberry farl farleu farm farmable farmage farmer farmeress farmerette farmerlike farmership farmery farmhold farmhouse farmhousey farming farmost farmplace farmstead farmsteading farmtown farmy farmyard farmyardy farnesol farness Farnovian faro Faroeish Faroese farolito Farouk farraginous farrago farrand farrandly farrantly farreate farreation farrier farrierlike farriery farrisite farrow farruca farsalah farse farseeing farseeingness farseer farset Farsi farsighted farsightedly farsightedness farther farthermost farthest farthing farthingale farthingless farweltered fasces fascet fascia fascial fasciate fasciated fasciately fasciation fascicle fascicled fascicular fascicularly fasciculate fasciculated fasciculately fasciculation fascicule fasciculus fascinate fascinated fascinatedly fascinating fascinatingly fascination fascinative fascinator fascinatress fascine fascinery Fascio fasciodesis fasciola fasciolar Fasciolaria Fasciolariidae fasciole fasciolet fascioliasis Fasciolidae fascioloid fascioplasty fasciotomy fascis fascism fascist Fascista Fascisti fascisticization fascisticize fascistization fascistize fash fasher fashery fashion fashionability fashionable fashionableness fashionably fashioned fashioner fashionist fashionize fashionless fashionmonger fashionmonging fashious fashiousness fasibitikite fasinite fass fassalite fast fasten fastener fastening faster fastgoing fasthold fastidiosity fastidious fastidiously fastidiousness fastidium fastigate fastigated fastigiate fastigium fasting fastingly fastish fastland fastness fastuous fastuously fastuousness fastus fat Fatagaga fatal fatalism fatalist fatalistic fatalistically fatality fatalize fatally fatalness fatbird fatbrained fate fated fateful fatefully fatefulness fatelike fathead fatheaded fatheadedness fathearted father fathercraft fathered fatherhood fatherland fatherlandish fatherless fatherlessness fatherlike fatherliness fatherling fatherly fathership fathmur fathom fathomable fathomage fathomer Fathometer fathomless fathomlessly fathomlessness fatidic fatidical fatidically fatiferous fatigability fatigable fatigableness fatigue fatigueless fatiguesome fatiguing fatiguingly fatiha fatil fatiloquent Fatima Fatimid fatiscence fatiscent fatless fatling fatly fatness fatsia fattable fatten fattenable fattener fatter fattily fattiness fattish fattishness fattrels fatty fatuism fatuitous fatuitousness fatuity fatuoid fatuous fatuously fatuousness fatwood faucal faucalize fauces faucet fauchard faucial faucitis faucre faugh faujasite fauld Faulkland fault faultage faulter faultfind faultfinder faultfinding faultful faultfully faultily faultiness faulting faultless faultlessly faultlessness faultsman faulty faun Fauna faunal faunally faunated faunish faunist faunistic faunistical faunistically faunlike faunological faunology faunule fause faussebraie faussebrayed faust Faustian fauterer fautor fautorship fauve Fauvism Fauvist favaginous favella favellidium favelloid Faventine faveolate faveolus faviform favilla favillous favism favissa favn favonian Favonius favor favorable favorableness favorably favored favoredly favoredness favorer favoress favoring favoringly favorite favoritism favorless favose favosely favosite Favosites Favositidae favositoid favous favus fawn fawner fawnery fawning fawningly fawningness fawnlike fawnskin fawny Fay fay Fayal fayalite Fayettism fayles Fayumic faze fazenda fe feaberry feague feak feal fealty fear fearable feared fearedly fearedness fearer fearful fearfully fearfulness fearingly fearless fearlessly fearlessness fearnought fearsome fearsomely fearsomeness feasance feasibility feasible feasibleness feasibly feasor feast feasten feaster feastful feastfully feastless feat feather featherback featherbed featherbedding featherbird featherbone featherbrain featherbrained featherdom feathered featheredge featheredged featherer featherfew featherfoil featherhead featherheaded featheriness feathering featherleaf featherless featherlessness featherlet featherlike featherman feathermonger featherpate featherpated featherstitch featherstitching feathertop featherway featherweed featherweight featherwing featherwise featherwood featherwork featherworker feathery featliness featly featness featous featural featurally feature featured featureful featureless featureliness featurely featy feaze feazings febricant febricide febricity febricula febrifacient febriferous febrific febrifugal febrifuge febrile febrility Febronian Febronianism Februarius February februation fecal fecalith fecaloid feces Fechnerian feck feckful feckfully feckless fecklessly fecklessness feckly fecula feculence feculency feculent fecund fecundate fecundation fecundative fecundator fecundatory fecundify fecundity fecundize fed feddan federacy Federal federal federalism federalist federalization federalize federally federalness federate federation federationist federatist federative federatively federator Fedia Fedora fee feeable feeble feeblebrained feeblehearted feebleheartedly feebleheartedness feebleness feebling feeblish feebly feed feedable feedback feedbin feedboard feedbox feeder feedhead feeding feedman feedsman feedstuff feedway feedy feel feelable feeler feeless feeling feelingful feelingless feelinglessly feelingly feelingness feer feere feering feetage feetless feeze fefnicute fegary Fegatella Fehmic fei feif feigher feign feigned feignedly feignedness feigner feigning feigningly Feijoa feil feint feis feist feisty Felapton feldsher feldspar feldsparphyre feldspathic feldspathization feldspathoid Felichthys felicide felicific felicitate felicitation felicitator felicitous felicitously felicitousness felicity felid Felidae feliform Felinae feline felinely felineness felinity felinophile felinophobe Felis Felix fell fellable fellage fellah fellaheen fellahin Fellani Fellata Fellatah fellatio fellation fellen feller fellic felliducous fellifluous felling fellingbird fellinic fellmonger fellmongering fellmongery fellness felloe fellow fellowcraft fellowess fellowheirship fellowless fellowlike fellowship fellside fellsman felly feloid felon feloness felonious feloniously feloniousness felonry felonsetter felonsetting felonweed felonwood felonwort felony fels felsite felsitic felsobanyite felsophyre felsophyric felsosphaerite felstone felt felted felter felting feltlike feltmaker feltmaking feltmonger feltness feltwork feltwort felty feltyfare felucca Felup felwort female femalely femaleness femality femalize Feme feme femerell femic femicide feminacy feminal feminality feminate femineity feminie feminility feminin feminine femininely feminineness femininism femininity feminism feminist feministic feministics feminity feminization feminize feminologist feminology feminophobe femora femoral femorocaudal femorocele femorococcygeal femorofibular femoropopliteal femororotulian femorotibial femur fen fenbank fenberry fence fenceful fenceless fencelessness fencelet fenceplay fencer fenceress fenchene fenchone fenchyl fencible fencing fend fendable fender fendering fenderless fendillate fendillation fendy feneration fenestella Fenestellidae fenestra fenestral fenestrate fenestrated fenestration fenestrato fenestrule Fenian Fenianism fenite fenks fenland fenlander fenman fennec fennel fennelflower fennig fennish Fennoman fenny fenouillet Fenrir fensive fent fenter fenugreek Fenzelia feod feodal feodality feodary feodatory feoff feoffee feoffeeship feoffment feoffor feower feracious feracity Ferae Ferahan feral feralin Feramorz ferash ferberite Ferdiad ferdwit feretory feretrum ferfathmur ferfet ferganite Fergus fergusite Ferguson fergusonite feria ferial feridgi ferie ferine ferinely ferineness Feringi Ferio Ferison ferity ferk ferling ferly fermail Fermatian ferme ferment fermentability fermentable fermentarian fermentation fermentative fermentatively fermentativeness fermentatory fermenter fermentescible fermentitious fermentive fermentology fermentor fermentum fermerer fermery fermila fermorite fern fernandinite Fernando fernbird fernbrake ferned fernery ferngale ferngrower fernland fernleaf fernless fernlike fernshaw fernsick ferntickle ferntickled fernwort ferny Ferocactus ferocious ferociously ferociousness ferocity feroher Feronia ferrado ferrament Ferrara Ferrarese ferrate ferrated ferrateen ferratin ferrean ferreous ferret ferreter ferreting ferretto ferrety ferri ferriage ferric ferrichloride ferricyanate ferricyanhydric ferricyanic ferricyanide ferricyanogen ferrier ferriferous ferrihydrocyanic ferriprussiate ferriprussic ferrite ferritization ferritungstite ferrivorous ferroalloy ferroaluminum ferroboron ferrocalcite ferrocerium ferrochrome ferrochromium ferroconcrete ferroconcretor ferrocyanate ferrocyanhydric ferrocyanic ferrocyanide ferrocyanogen ferroglass ferrogoslarite ferrohydrocyanic ferroinclave ferromagnesian ferromagnetic ferromagnetism ferromanganese ferromolybdenum ferronatrite ferronickel ferrophosphorus ferroprint ferroprussiate ferroprussic ferrosilicon ferrotitanium ferrotungsten ferrotype ferrotyper ferrous ferrovanadium ferrozirconium ferruginate ferrugination ferruginean ferruginous ferrule ferruler ferrum ferruminate ferrumination ferry ferryboat ferryhouse ferryman ferryway ferthumlungur Fertil fertile fertilely fertileness fertility fertilizable fertilization fertilizational fertilize fertilizer feru ferula ferulaceous ferule ferulic fervanite fervency fervent fervently ferventness fervescence fervescent fervid fervidity fervidly fervidness Fervidor fervor fervorless Fesapo Fescennine fescenninity fescue fess fessely fesswise fest festal festally Feste fester festerment festilogy festinance festinate festinately festination festine Festino festival festivally festive festively festiveness festivity festivous festology festoon festoonery festoony festuca festucine fet fetal fetalism fetalization fetation fetch fetched fetcher fetching fetchingly feteless feterita fetial fetiales fetichmonger feticidal feticide fetid fetidity fetidly fetidness fetiferous fetiparous fetish fetisheer fetishic fetishism fetishist fetishistic fetishization fetishize fetishmonger fetishry fetlock fetlocked fetlow fetography fetometry fetoplacental fetor fetter fetterbush fetterer fetterless fetterlock fetticus fettle fettler fettling fetus feu feuage feuar feucht feud feudal feudalism feudalist feudalistic feudality feudalizable feudalization feudalize feudally feudatorial feudatory feudee feudist feudovassalism feued Feuillants feuille feuilletonism feuilletonist feuilletonistic feulamort fever feverberry feverbush fevercup feveret feverfew fevergum feverish feverishly feverishness feverless feverlike feverous feverously feverroot fevertrap fevertwig fevertwitch feverweed feverwort few fewness fewsome fewter fewterer fewtrils fey feyness fez Fezzan fezzed Fezziwig fezzy fi fiacre fiance fiancee fianchetto Fianna fiar fiard fiasco fiat fiatconfirmatio fib fibber fibbery fibdom Fiber fiber fiberboard fibered Fiberglas fiberize fiberizer fiberless fiberware fibration fibreless fibreware fibriform fibril fibrilla fibrillar fibrillary fibrillate fibrillated fibrillation fibrilled fibrilliferous fibrilliform fibrillose fibrillous fibrin fibrinate fibrination fibrine fibrinemia fibrinoalbuminous fibrinocellular fibrinogen fibrinogenetic fibrinogenic fibrinogenous fibrinolysin fibrinolysis fibrinolytic fibrinoplastic fibrinoplastin fibrinopurulent fibrinose fibrinosis fibrinous fibrinuria fibroadenia fibroadenoma fibroadipose fibroangioma fibroareolar fibroblast fibroblastic fibrobronchitis fibrocalcareous fibrocarcinoma fibrocartilage fibrocartilaginous fibrocaseose fibrocaseous fibrocellular fibrochondritis fibrochondroma fibrochondrosteal fibrocrystalline fibrocyst fibrocystic fibrocystoma fibrocyte fibroelastic fibroenchondroma fibrofatty fibroferrite fibroglia fibroglioma fibrohemorrhagic fibroid fibroin fibrointestinal fibroligamentous fibrolipoma fibrolipomatous fibrolite fibrolitic fibroma fibromata fibromatoid fibromatosis fibromatous fibromembrane fibromembranous fibromucous fibromuscular fibromyectomy fibromyitis fibromyoma fibromyomatous fibromyomectomy fibromyositis fibromyotomy fibromyxoma fibromyxosarcoma fibroneuroma fibronuclear fibronucleated fibropapilloma fibropericarditis fibroplastic fibropolypus fibropsammoma fibropurulent fibroreticulate fibrosarcoma fibrose fibroserous fibrosis fibrositis Fibrospongiae fibrotic fibrotuberculosis fibrous fibrously fibrousness fibrovasal fibrovascular fibry fibster fibula fibulae fibular fibulare fibulocalcaneal Ficaria ficary fice ficelle fiche Fichtean Fichteanism fichtelite fichu ficiform fickle ficklehearted fickleness ficklety ficklewise fickly fico ficoid Ficoidaceae Ficoideae ficoides fictation fictile fictileness fictility fiction fictional fictionalize fictionally fictionary fictioneer fictioner fictionist fictionistic fictionization fictionize fictionmonger fictious fictitious fictitiously fictitiousness fictive fictively Ficula Ficus fid Fidac fidalgo fidate fidation fiddle fiddleback fiddlebrained fiddlecome fiddledeedee fiddlefaced fiddlehead fiddleheaded fiddler fiddlerfish fiddlery fiddlestick fiddlestring fiddlewood fiddley fiddling fide fideicommiss fideicommissary fideicommission fideicommissioner fideicommissor fideicommissum fideism fideist fidejussion fidejussionary fidejussor fidejussory Fidele Fidelia Fidelio fidelity fidepromission fidepromissor Fides Fidessa fidfad fidge fidget fidgeter fidgetily fidgetiness fidgeting fidgetingly fidgety Fidia fidicinal fidicinales fidicula Fido fiducia fiducial fiducially fiduciarily fiduciary fiducinales fie fiedlerite fiefdom field fieldball fieldbird fielded fielder fieldfare fieldish fieldman fieldpiece fieldsman fieldward fieldwards fieldwork fieldworker fieldwort fieldy fiend fiendful fiendfully fiendhead fiendish fiendishly fiendishness fiendism fiendlike fiendliness fiendly fiendship fient Fierabras Fierasfer fierasferid Fierasferidae fierasferoid fierce fiercehearted fiercely fiercen fierceness fierding fierily fieriness fiery fiesta fieulamort Fife fife fifer fifie fifish fifo fifteen fifteener fifteenfold fifteenth fifteenthly fifth fifthly fiftieth fifty fiftyfold fig figaro figbird figeater figent figged figgery figging figgle figgy fight fightable fighter fighteress fighting fightingly fightwite Figitidae figless figlike figment figmental figpecker figshell figulate figulated figuline figurability figurable figural figurant figurante figurate figurately figuration figurative figuratively figurativeness figure figured figuredly figurehead figureheadless figureheadship figureless figurer figuresome figurette figurial figurine figurism figurist figurize figury figworm figwort Fiji Fijian fike fikie filace filaceous filacer Filago filament filamentar filamentary filamented filamentiferous filamentoid filamentose filamentous filamentule filander filanders filao filar Filaria filaria filarial filarian filariasis filaricidal filariform filariid Filariidae filarious filasse filate filator filature filbert filch filcher filchery filching filchingly file filefish filelike filemaker filemaking filemot filer filesmith filet filial filiality filially filialness filiate filiation filibeg filibranch Filibranchia filibranchiate filibuster filibusterer filibusterism filibusterous filical Filicales filicauline Filices filicic filicidal filicide filiciform filicin Filicineae filicinean filicite Filicites filicologist filicology Filicornia filiety filiferous filiform filiformed Filigera filigerous filigree filing filings filionymic filiopietistic filioque Filipendula filipendulous Filipina Filipiniana Filipinization Filipinize Filipino filippo filipuncture filite Filix fill fillable filled fillemot filler fillercap fillet filleter filleting filletlike filletster filleul filling fillingly fillingness fillip fillipeen fillister fillmass fillock fillowite filly film filmable filmdom filmet filmgoer filmgoing filmic filmiform filmily filminess filmish filmist filmize filmland filmlike filmogen filmslide filmstrip filmy filo filoplumaceous filoplume filopodium Filosa filose filoselle fils filter filterability filterable filterableness filterer filtering filterman filth filthify filthily filthiness filthless filthy filtrability filtrable filtratable filtrate filtration fimble fimbria fimbrial fimbriate fimbriated fimbriation fimbriatum fimbricate fimbricated fimbrilla fimbrillate fimbrilliferous fimbrillose fimbriodentate Fimbristylis fimetarious fimicolous Fin fin finable finableness finagle finagler final finale finalism finalist finality finalize finally finance financial financialist financially financier financiery financist finback finch finchbacked finched finchery find findability findable findal finder findfault finding findjan fine fineable finebent fineish fineleaf fineless finely finement fineness finer finery finespun finesse finesser finestill finestiller finetop finfish finfoot Fingal Fingall Fingallian fingent finger fingerable fingerberry fingerbreadth fingered fingerer fingerfish fingerflower fingerhold fingerhook fingering fingerleaf fingerless fingerlet fingerlike fingerling fingernail fingerparted fingerprint fingerprinting fingerroot fingersmith fingerspin fingerstall fingerstone fingertip fingerwise fingerwork fingery fingrigo Fingu finial finialed finical finicality finically finicalness finicism finick finickily finickiness finicking finickingly finickingness finific finify Finiglacial finikin finiking fining finis finish finishable finished finisher finishing finite finitely finiteness finitesimal finitive finitude finity finjan fink finkel finland Finlander finless finlet finlike Finmark Finn finnac finned finner finnesko Finnic Finnicize finnip Finnish finny finochio Fionnuala fiord fiorded Fioretti fiorin fiorite Fiot fip fipenny fipple fique fir Firbolg firca fire fireable firearm firearmed fireback fireball firebird fireblende fireboard fireboat firebolt firebolted firebote firebox fireboy firebrand firebrat firebreak firebrick firebug fireburn firecoat firecracker firecrest fired firedamp firedog firedrake firefall firefang firefanged fireflaught fireflirt fireflower firefly fireguard firehouse fireless firelight firelike fireling firelit firelock fireman firemanship firemaster fireplace fireplug firepower fireproof fireproofing fireproofness firer fireroom firesafe firesafeness firesafety fireshaft fireshine fireside firesider firesideship firespout firestone firestopping firetail firetop firetrap firewarden firewater fireweed firewood firework fireworkless fireworky fireworm firing firk firker firkin firlot firm firmament firmamental firman firmance firmer firmhearted firmisternal Firmisternia firmisternial firmisternous firmly firmness firn Firnismalerei Firoloida firring firry first firstcomer firsthand firstling firstly firstness firstship firth fisc fiscal fiscalify fiscalism fiscalization fiscalize fiscally fischerite fise fisetin fish fishable fishback fishbed fishberry fishbolt fishbone fisheater fished fisher fisherboat fisherboy fisheress fisherfolk fishergirl fisherman fisherpeople fisherwoman fishery fishet fisheye fishfall fishful fishgarth fishgig fishhood fishhook fishhooks fishhouse fishify fishily fishiness fishing fishingly fishless fishlet fishlike fishline fishling fishman fishmonger fishmouth fishplate fishpond fishpool fishpot fishpotter fishpound fishskin fishtail fishway fishweed fishweir fishwife fishwoman fishwood fishworker fishworks fishworm fishy fishyard fisnoga fissate fissicostate fissidactyl Fissidens Fissidentaceae fissidentaceous fissile fissileness fissilingual Fissilinguia fissility fission fissionable fissipalmate fissipalmation fissiparation fissiparism fissiparity fissiparous fissiparously fissiparousness fissiped Fissipeda fissipedal fissipedate Fissipedia fissipedial Fissipes fissirostral fissirostrate Fissirostres fissive fissural fissuration fissure fissureless Fissurella Fissurellidae fissuriform fissury fist fisted fister fistful fistiana fistic fistical fisticuff fisticuffer fisticuffery fistify fistiness fisting fistlike fistmele fistnote fistuca fistula Fistulana fistular Fistularia Fistulariidae fistularioid fistulate fistulated fistulatome fistulatous fistule fistuliform Fistulina fistulize fistulose fistulous fistwise fisty fit fitch fitched fitchee fitcher fitchery fitchet fitchew fitful fitfully fitfulness fitly fitment fitness fitout fitroot fittable fittage fitted fittedness fitten fitter fitters fittily fittiness fitting fittingly fittingness Fittonia fitty fittyfied fittyways fittywise fitweed Fitzclarence Fitzroy Fitzroya Fiuman five fivebar fivefold fivefoldness fiveling fivepence fivepenny fivepins fiver fives fivescore fivesome fivestones fix fixable fixage fixate fixatif fixation fixative fixator fixature fixed fixedly fixedness fixer fixidity fixing fixity fixture fixtureless fixure fizelyite fizgig fizz fizzer fizzle fizzy fjarding fjeld fjerding Fjorgyn flabbergast flabbergastation flabbily flabbiness flabby flabellarium flabellate flabellation flabellifoliate flabelliform flabellinerved flabellum flabrum flaccid flaccidity flaccidly flaccidness flacherie Flacian Flacianism Flacianist flack flacked flacker flacket Flacourtia Flacourtiaceae flacourtiaceous flaff flaffer flag flagboat flagellant flagellantism flagellar Flagellaria Flagellariaceae flagellariaceous Flagellata Flagellatae flagellate flagellated flagellation flagellative flagellator flagellatory flagelliferous flagelliform flagellist flagellosis flagellula flagellum flageolet flagfall flagger flaggery flaggily flagginess flagging flaggingly flaggish flaggy flagitate flagitation flagitious flagitiously flagitiousness flagleaf flagless flaglet flaglike flagmaker flagmaking flagman flagon flagonet flagonless flagpole flagrance flagrancy flagrant flagrantly flagrantness flagroot flagship flagstaff flagstick flagstone flagworm flail flaillike flair flaith flaithship flajolotite flak flakage flake flakeless flakelet flaker flakily flakiness flaky flam Flamandization Flamandize flamant flamb flambeau flambeaux flamberg flamboyance flamboyancy flamboyant flamboyantism flamboyantize flamboyantly flamboyer flame flamed flameflower flameless flamelet flamelike flamen flamenco flamenship flameproof flamer flamfew flamineous flaming Flamingant flamingly flamingo Flaminian flaminica flaminical flammability flammable flammeous flammiferous flammulated flammulation flammule flamy flan flancard flanch flanched flanconade flandan flandowser flane flange flangeless flanger flangeway flank flankard flanked flanker flanking flankwise flanky flannel flannelbush flanneled flannelette flannelflower flannelleaf flannelly flannelmouth flannelmouthed flannels flanque flap flapcake flapdock flapdoodle flapdragon flapjack flapmouthed flapper flapperdom flapperhood flapperish flapperism flare flareback flareboard flareless flaring flaringly flary flaser flash flashboard flasher flashet flashily flashiness flashing flashingly flashlight flashlike flashly flashness flashover flashpan flashproof flashtester flashy flask flasker flasket flasklet flasque flat flatboat flatbottom flatcap flatcar flatdom flated flatfish flatfoot flathat flathead flatiron flatland flatlet flatling flatly flatman flatness flatnose flatten flattener flattening flatter flatterable flattercap flatterdock flatterer flattering flatteringly flatteringness flattery flattie flatting flattish flattop flatulence flatulency flatulent flatulently flatulentness flatus flatware flatway flatways flatweed flatwise flatwoods flatwork flatworm Flaubertian flaught flaughter flaunt flaunter flauntily flauntiness flaunting flauntingly flaunty flautino flautist flavanilin flavaniline flavanthrene flavanthrone flavedo Flaveria flavescence flavescent Flavia Flavian flavic flavicant flavid flavin flavine Flavius flavo Flavobacterium flavone flavoprotein flavopurpurin flavor flavored flavorer flavorful flavoring flavorless flavorous flavorsome flavory flavour flaw flawed flawflower flawful flawless flawlessly flawlessness flawn flawy flax flaxboard flaxbush flaxdrop flaxen flaxlike flaxman flaxseed flaxtail flaxweed flaxwench flaxwife flaxwoman flaxwort flaxy flay flayer flayflint flea fleabane fleabite fleadock fleam fleaseed fleaweed fleawood fleawort fleay flebile fleche flechette fleck flecken flecker fleckiness fleckled fleckless flecklessly flecky flecnodal flecnode flection flectional flectionless flector fled fledge fledgeless fledgling fledgy flee fleece fleeceable fleeced fleeceflower fleeceless fleecelike fleecer fleech fleechment fleecily fleeciness fleecy fleer fleerer fleering fleeringly fleet fleeter fleetful fleeting fleetingly fleetingness fleetings fleetly fleetness fleetwing Flem Fleming Flemish flemish flench flense flenser flerry flesh fleshbrush fleshed fleshen flesher fleshful fleshhood fleshhook fleshiness fleshing fleshings fleshless fleshlike fleshlily fleshliness fleshly fleshment fleshmonger fleshpot fleshy flet Fleta fletch Fletcher fletcher Fletcherism Fletcherite Fletcherize flether fleuret fleurettee fleuronnee fleury flew flewed flewit flews flex flexanimous flexed flexibility flexible flexibleness flexibly flexile flexility flexion flexionless flexor flexuose flexuosity flexuous flexuously flexuousness flexural flexure flexured fley fleyedly fleyedness fleyland fleysome flibbertigibbet flicflac flick flicker flickering flickeringly flickerproof flickertail flickery flicky flidder flier fligger flight flighted flighter flightful flightily flightiness flighting flightless flightshot flighty flimflam flimflammer flimflammery flimmer flimp flimsily flimsiness flimsy flinch flincher flinching flinchingly flinder Flindersia flindosa flindosy fling flinger flingy flinkite flint flinter flinthearted flintify flintily flintiness flintless flintlike flintlock flintwood flintwork flintworker flinty flioma flip flipe flipjack flippancy flippant flippantly flippantness flipper flipperling flippery flirt flirtable flirtation flirtational flirtationless flirtatious flirtatiously flirtatiousness flirter flirtigig flirting flirtingly flirtish flirtishness flirtling flirty flisk flisky flit flitch flitchen flite flitfold fliting flitter flitterbat flittermouse flittern flitting flittingly flitwite flivver flix flixweed Flo float floatability floatable floatage floatation floatative floatboard floater floatiness floating floatingly floative floatless floatmaker floatman floatplane floatsman floatstone floaty flob flobby floc floccillation floccipend floccose floccosely flocculable flocculant floccular flocculate flocculation flocculator floccule flocculence flocculency flocculent flocculently flocculose flocculus floccus flock flocker flocking flockless flocklike flockman flockmaster flockowner flockwise flocky flocoon flodge floe floeberg Floerkea floey flog floggable flogger flogging floggingly flogmaster flogster flokite flong flood floodable floodage floodboard floodcock flooded flooder floodgate flooding floodless floodlet floodlight floodlighting floodlike floodmark floodometer floodproof floodtime floodwater floodway floodwood floody floor floorage floorcloth floorer floorhead flooring floorless floorman floorwalker floorward floorway floorwise floozy flop flophouse flopover flopper floppers floppily floppiness floppy flopwing Flora flora floral Floralia floralize florally floramor floran florate floreal floreate Florence florence florent Florentine Florentinism florentium flores florescence florescent floressence floret floreted floretum Floria Florian floriate floriated floriation florican floricin floricultural floriculturally floriculture floriculturist florid Florida Floridan Florideae floridean florideous Floridian floridity floridly floridness floriferous floriferously floriferousness florification floriform florigen florigenic florigraphy florikan floriken florilegium florimania florimanist florin Florinda floriparous floripondio floriscope Florissant florist floristic floristically floristics floristry florisugent florivorous floroon floroscope florula florulent flory floscular Floscularia floscularian Flosculariidae floscule flosculose flosculous flosh floss flosser flossflower Flossie flossification flossing flossy flot flota flotage flotant flotation flotative flotilla flotorial flotsam flounce flouncey flouncing flounder floundering flounderingly flour flourish flourishable flourisher flourishing flourishingly flourishment flourishy flourlike floury flouse flout flouter flouting floutingly flow flowable flowage flower flowerage flowered flowerer floweret flowerful flowerily floweriness flowering flowerist flowerless flowerlessness flowerlet flowerlike flowerpecker flowerpot flowerwork flowery flowing flowingly flowingness flowmanostat flowmeter flown flowoff Floyd flu fluate fluavil flub flubdub flubdubbery flucan fluctiferous fluctigerous fluctisonant fluctisonous fluctuability fluctuable fluctuant fluctuate fluctuation fluctuosity fluctuous flue flued flueless fluellen fluellite flueman fluency fluent fluently fluentness fluer fluework fluey fluff fluffer fluffily fluffiness fluffy Flugelhorn flugelman fluible fluid fluidacetextract fluidal fluidally fluidextract fluidglycerate fluidible fluidic fluidification fluidifier fluidify fluidimeter fluidism fluidist fluidity fluidization fluidize fluidly fluidness fluidram fluigram fluitant fluke fluked flukeless flukeworm flukewort flukily flukiness fluking fluky flumdiddle flume flumerin fluminose flummadiddle flummer flummery flummox flummydiddle flump flung flunk flunker flunkeydom flunkeyhood flunkeyish flunkeyize flunky flunkydom flunkyhood flunkyish flunkyism flunkyistic flunkyite flunkyize fluoaluminate fluoaluminic fluoarsenate fluoborate fluoboric fluoborid fluoboride fluoborite fluobromide fluocarbonate fluocerine fluocerite fluochloride fluohydric fluophosphate fluor fluoran fluoranthene fluorapatite fluorate fluorbenzene fluorene fluorenyl fluoresage fluoresce fluorescein fluorescence fluorescent fluorescigenic fluorescigenous fluorescin fluorhydric fluoric fluoridate fluoridation fluoride fluoridization fluoridize fluorimeter fluorinate fluorination fluorindine fluorine fluorite fluormeter fluorobenzene fluoroborate fluoroform fluoroformol fluorogen fluorogenic fluorography fluoroid fluorometer fluoroscope fluoroscopic fluoroscopy fluorosis fluorotype fluorspar fluoryl fluosilicate fluosilicic fluotantalate fluotantalic fluotitanate fluotitanic fluozirconic flurn flurr flurried flurriedly flurriment flurry flush flushboard flusher flusherman flushgate flushing flushingly flushness flushy flusk flusker fluster flusterate flusteration flusterer flusterment flustery Flustra flustrine flustroid flustrum flute flutebird fluted flutelike flutemouth fluter flutework Flutidae flutina fluting flutist flutter flutterable flutteration flutterer fluttering flutteringly flutterless flutterment fluttersome fluttery fluty fluvial fluvialist fluviatic fluviatile fluvicoline fluvioglacial fluviograph fluviolacustrine fluviology fluviomarine fluviometer fluviose fluvioterrestrial fluviovolcanic flux fluxation fluxer fluxibility fluxible fluxibleness fluxibly fluxile fluxility fluxion fluxional fluxionally fluxionary fluxionist fluxmeter fluxroot fluxweed fly flyable flyaway flyback flyball flybane flybelt flyblow flyblown flyboat flyboy flycatcher flyeater flyer flyflap flyflapper flyflower flying flyingly flyleaf flyless flyman flyness flypaper flype flyproof Flysch flyspeck flytail flytier flytrap flyway flyweight flywheel flywinch flywort Fo foal foalfoot foalhood foaly foam foambow foamer foamflower foamily foaminess foaming foamingly foamless foamlike foamy fob focal focalization focalize focally focaloid foci focimeter focimetry focoids focometer focometry focsle focus focusable focuser focusless fod fodda fodder fodderer foddering fodderless foder fodge fodgel fodient Fodientia foe foehn foehnlike foeish foeless foelike foeman foemanship Foeniculum foenngreek foeship foetalization fog fogbound fogbow fogdog fogdom fogeater fogey fogfruit foggage fogged fogger foggily fogginess foggish foggy foghorn fogle fogless fogman fogo fogon fogou fogproof fogram fogramite fogramity fogscoffer fogus fogy fogydom fogyish fogyism fohat foible foil foilable foiler foiling foilsman foining foiningly Foism foison foisonless Foist foist foister foistiness foisty foiter Fokker fold foldable foldage foldboat foldcourse folded foldedly folden folder folding foldless foldskirt foldure foldwards foldy fole folgerite folia foliaceous foliaceousness foliage foliaged foliageous folial foliar foliary foliate foliated foliation foliature folie foliicolous foliiferous foliiform folio foliobranch foliobranchiate foliocellosis foliolate foliole folioliferous foliolose foliose foliosity foliot folious foliously folium folk folkcraft folkfree folkland folklore folkloric folklorish folklorism folklorist folkloristic folkmoot folkmooter folkmot folkmote folkmoter folkright folksiness folksy Folkvang Folkvangr folkway folky folles folletage follicle follicular folliculate folliculated follicule folliculin Folliculina folliculitis folliculose folliculosis folliculous folliful follis follow followable follower followership following followingly folly follyproof Fomalhaut foment fomentation fomenter fomes fomites Fon fondak fondant fondish fondle fondler fondlesome fondlike fondling fondlingly fondly fondness fondu fondue fonduk fonly fonnish fono fons font Fontainea fontal fontally fontanel fontange fonted fontful fonticulus fontinal Fontinalaceae fontinalaceous Fontinalis fontlet foo Foochow Foochowese food fooder foodful foodless foodlessness foodstuff foody foofaraw fool fooldom foolery fooless foolfish foolhardihood foolhardily foolhardiness foolhardiship foolhardy fooling foolish foolishly foolishness foollike foolocracy foolproof foolproofness foolscap foolship fooner fooster foosterer foot footage footback football footballer footballist footband footblower footboard footboy footbreadth footbridge footcloth footed footeite footer footfall footfarer footfault footfolk footful footganger footgear footgeld foothalt foothill foothold foothook foothot footing footingly footings footle footler footless footlicker footlight footlights footling footlining footlock footmaker footman footmanhood footmanry footmanship footmark footnote footnoted footpace footpad footpaddery footpath footpick footplate footprint footrail footrest footrill footroom footrope foots footscald footslog footslogger footsore footsoreness footstalk footstall footstep footstick footstock footstone footstool footwalk footwall footway footwear footwork footworn footy fooyoung foozle foozler fop fopling foppery foppish foppishly foppishness foppy fopship For for fora forage foragement forager foralite foramen foraminated foramination foraminifer Foraminifera foraminiferal foraminiferan foraminiferous foraminose foraminous foraminulate foraminule foraminulose foraminulous forane foraneen foraneous forasmuch foray forayer forb forbade forbar forbathe forbear forbearable forbearance forbearant forbearantly forbearer forbearing forbearingly forbearingness forbesite forbid forbiddable forbiddal forbiddance forbidden forbiddenly forbiddenness forbidder forbidding forbiddingly forbiddingness forbit forbled forblow forbore forborne forbow forby force forceable forced forcedly forcedness forceful forcefully forcefulness forceless forcemeat forcement forceps forcepslike forcer forchase forche forcibility forcible forcibleness forcibly forcing forcingly forcipate forcipated forcipes forcipiform forcipressure Forcipulata forcipulate forcleave forconceit ford fordable fordableness fordays Fordicidia fording fordless fordo fordone fordwine fordy fore foreaccounting foreaccustom foreacquaint foreact foreadapt foreadmonish foreadvertise foreadvice foreadvise foreallege foreallot foreannounce foreannouncement foreanswer foreappoint foreappointment forearm foreassign foreassurance forebackwardly forebay forebear forebemoan forebemoaned forebespeak forebitt forebitten forebitter forebless foreboard forebode forebodement foreboder foreboding forebodingly forebodingness forebody foreboot forebowels forebowline forebrace forebrain forebreast forebridge foreburton forebush forecar forecarriage forecast forecaster forecasting forecastingly forecastle forecastlehead forecastleman forecatching forecatharping forechamber forechase forechoice forechoose forechurch forecited foreclaw foreclosable foreclose foreclosure forecome forecomingness forecommend foreconceive foreconclude forecondemn foreconscious foreconsent foreconsider forecontrive forecool forecooler forecounsel forecount forecourse forecourt forecover forecovert foredate foredawn foreday foredeck foredeclare foredecree foredeep foredefeated foredefine foredenounce foredescribe foredeserved foredesign foredesignment foredesk foredestine foredestiny foredetermination foredetermine foredevised foredevote forediscern foredispose foredivine foredone foredoom foredoomer foredoor foreface forefather forefatherly forefault forefeel forefeeling forefeelingly forefelt forefield forefigure forefin forefinger forefit foreflank foreflap foreflipper forefoot forefront foregallery foregame foreganger foregate foregift foregirth foreglance foregleam foreglimpse foreglow forego foregoer foregoing foregone foregoneness foreground foreguess foreguidance forehalf forehall forehammer forehand forehanded forehandedness forehandsel forehard forehatch forehatchway forehead foreheaded forehear forehearth foreheater forehill forehinting forehold forehood forehoof forehook foreign foreigneering foreigner foreignership foreignism foreignization foreignize foreignly foreignness foreimagination foreimagine foreimpressed foreimpression foreinclined foreinstruct foreintend foreiron forejudge forejudgment forekeel foreking foreknee foreknow foreknowable foreknower foreknowing foreknowingly foreknowledge forel forelady foreland forelay foreleech foreleg forelimb forelive forellenstein forelock forelook foreloop forelooper foreloper foremade foreman foremanship foremarch foremark foremartyr foremast foremasthand foremastman foremean foremeant foremelt foremention forementioned foremessenger foremilk foremisgiving foremistress foremost foremostly foremother forename forenamed forenews forenight forenoon forenote forenoted forenotice forenotion forensal forensic forensical forensicality forensically foreordain foreordainment foreorder foreordinate foreordination foreorlop forepad forepale foreparents forepart forepassed forepast forepaw forepayment forepeak foreperiod forepiece foreplace foreplan foreplanting forepole foreporch forepossessed forepost forepredicament forepreparation foreprepare forepretended foreproduct foreproffer forepromise forepromised foreprovided foreprovision forepurpose forequarter forequoted foreran forerank forereach forereaching foreread forereading forerecited forereckon forerehearsed foreremembered forereport forerequest forerevelation forerib forerigging foreright foreroom foreroyal forerun forerunner forerunnership forerunnings foresaddle foresaid foresail foresay forescene forescent foreschool foreschooling forescript foreseason foreseat foresee foreseeability foreseeable foreseeingly foreseer foreseize foresend foresense foresentence foreset foresettle foresettled foreshadow foreshadower foreshaft foreshank foreshape foresheet foreshift foreship foreshock foreshoe foreshop foreshore foreshorten foreshortening foreshot foreshoulder foreshow foreshower foreshroud foreside foresight foresighted foresightedness foresightful foresightless foresign foresignify foresin foresing foresinger foreskin foreskirt foresleeve foresound forespeak forespecified forespeed forespencer forest forestaff forestage forestair forestal forestall forestaller forestallment forestarling forestate forestation forestay forestaysail forestcraft forested foresteep forestem forestep forester forestership forestful forestial Forestian forestick Forestiera forestine forestish forestless forestlike forestology forestral forestress forestry forestside forestudy forestwards foresty foresummer foresummon foresweat foretack foretackle foretalk foretalking foretaste foretaster foretell foretellable foreteller forethink forethinker forethought forethoughted forethoughtful forethoughtfully forethoughtfulness forethoughtless forethrift foretime foretimed foretoken foretold foretop foretopman foretrace foretrysail foreturn foretype foretypified foreuse foreutter forevalue forever forevermore foreview forevision forevouch forevouched forevow forewarm forewarmer forewarn forewarner forewarning forewarningly forewaters foreween foreweep foreweigh forewing forewinning forewisdom forewish forewoman forewonted foreword foreworld foreworn forewritten forewrought foreyard foreyear forfairn forfar forfare forfars forfault forfaulture forfeit forfeiter forfeits forfeiture forfend forficate forficated forfication forficiform Forficula forficulate Forficulidae forfouchten forfoughen forfoughten forgainst forgather forge forgeability forgeable forged forgedly forgeful forgeman forger forgery forget forgetful forgetfully forgetfulness forgetive forgetness forgettable forgetter forgetting forgettingly forgie forging forgivable forgivableness forgivably forgive forgiveless forgiveness forgiver forgiving forgivingly forgivingness forgo forgoer forgot forgotten forgottenness forgrow forgrown forhoo forhooy forhow forinsec forint forisfamiliate forisfamiliation forjesket forjudge forjudger fork forkable forkbeard forked forkedly forkedness forker forkful forkhead forkiness forkless forklike forkman forksmith forktail forkwise forky forleft forlet forlorn forlornity forlornly forlornness form formability formable formably formagen formagenic formal formalazine formaldehyde formaldehydesulphoxylate formaldehydesulphoxylic formaldoxime formalesque Formalin formalism formalist formalistic formalith formality formalization formalize formalizer formally formalness formamide formamidine formamido formamidoxime formanilide formant format formate formation formational formative formatively formativeness formature formazyl forme formed formedon formee formel formene formenic former formeret formerly formerness formful formiate formic Formica formican Formicariae formicarian Formicariidae formicarioid formicarium formicaroid formicary formicate formication formicative formicicide formicid Formicidae formicide Formicina Formicinae formicine Formicivora formicivorous Formicoidea formidability formidable formidableness formidably formin forminate forming formless formlessly formlessness Formol formolite formonitrile Formosan formose formoxime formula formulable formulae formulaic formular formularism formularist formularistic formularization formularize formulary formulate formulation formulator formulatory formule formulism formulist formulistic formulization formulize formulizer formwork formy formyl formylal formylate formylation fornacic Fornax fornaxid fornenst fornent fornical fornicate fornicated fornication fornicator fornicatress fornicatrix forniciform forninst fornix forpet forpine forpit forprise forrad forrard forride forrit forritsome forrue forsake forsaken forsakenly forsakenness forsaker forset forslow forsooth forspeak forspend forspread Forst forsterite forswear forswearer forsworn forswornness Forsythia fort fortalice forte fortescue fortescure forth forthbring forthbringer forthcome forthcomer forthcoming forthcomingness forthcut forthfare forthfigured forthgaze forthgo forthgoing forthink forthputting forthright forthrightly forthrightness forthrights forthtell forthteller forthwith forthy forties fortieth fortifiable fortification fortifier fortify fortifying fortifyingly fortin fortis fortissimo fortitude fortitudinous fortlet fortnight fortnightly fortravail fortread fortress fortuitism fortuitist fortuitous fortuitously fortuitousness fortuity fortunate fortunately fortunateness fortune fortuned fortuneless Fortunella fortunetell fortuneteller fortunetelling fortunite forty fortyfold forum forumize forwander forward forwardal forwardation forwarder forwarding forwardly forwardness forwards forwean forweend forwent forwoden forworden fosh fosie Fosite fossa fossage fossane fossarian fosse fossed fossette fossick fossicker fossiform fossil fossilage fossilated fossilation fossildom fossiled fossiliferous fossilification fossilify fossilism fossilist fossilizable fossilization fossilize fossillike fossilogist fossilogy fossilological fossilologist fossilology fossor Fossores Fossoria fossorial fossorious fossula fossulate fossule fossulet fostell Foster foster fosterable fosterage fosterer fosterhood fostering fosteringly fosterite fosterland fosterling fostership fostress fot fotch fother Fothergilla fotmal fotui fou foud foudroyant fouette fougade fougasse fought foughten foughty foujdar foujdary foul foulage foulard fouler fouling foulish foully foulmouthed foulmouthedly foulmouthedness foulness foulsome foumart foun found foundation foundational foundationally foundationary foundationed foundationer foundationless foundationlessness founder founderous foundership foundery founding foundling foundress foundry foundryman fount fountain fountained fountaineer fountainhead fountainless fountainlet fountainous fountainously fountainwise fountful Fouquieria Fouquieriaceae fouquieriaceous four fourble fourche fourchee fourcher fourchette fourchite fourer fourflusher fourfold Fourierian Fourierism Fourierist Fourieristic Fourierite fourling fourpence fourpenny fourpounder fourre fourrier fourscore foursome foursquare foursquarely foursquareness fourstrand fourteen fourteener fourteenfold fourteenth fourteenthly fourth fourther fourthly foussa foute fouter fouth fovea foveal foveate foveated foveation foveiform foveola foveolarious foveolate foveolated foveole foveolet fow fowk fowl fowler fowlerite fowlery fowlfoot fowling fox foxbane foxberry foxchop foxer foxery foxfeet foxfinger foxfish foxglove foxhole foxhound foxily foxiness foxing foxish foxlike foxproof foxship foxskin foxtail foxtailed foxtongue foxwood foxy foy foyaite foyaitic foyboat foyer foziness fozy fra frab frabbit frabjous frabjously frabous fracas fracedinous frache frack fractable fractabling fracted Fracticipita fractile fraction fractional fractionalism fractionalize fractionally fractionary fractionate fractionating fractionation fractionator fractionization fractionize fractionlet fractious fractiously fractiousness fractocumulus fractonimbus fractostratus fractuosity fracturable fractural fracture fractureproof frae Fragaria fraghan Fragilaria Fragilariaceae fragile fragilely fragileness fragility fragment fragmental fragmentally fragmentarily fragmentariness fragmentary fragmentation fragmented fragmentist fragmentitious fragmentize fragrance fragrancy fragrant fragrantly fragrantness fraid fraik frail frailejon frailish frailly frailness frailty fraise fraiser Fram framable framableness frambesia frame framea frameable frameableness framed frameless framer framesmith framework framing frammit frampler frampold franc Frances franchisal franchise franchisement franchiser Francic Francis francisc francisca Franciscan Franciscanism Francisco francium Francize franco Francois francolin francolite Francomania Franconian Francophile Francophilism Francophobe Francophobia frangent Frangi frangibility frangible frangibleness frangipane frangipani frangula Frangulaceae frangulic frangulin frangulinic Frank frank frankability frankable frankalmoign Frankenia Frankeniaceae frankeniaceous Frankenstein franker frankfurter frankhearted frankheartedly frankheartedness Frankify frankincense frankincensed franking Frankish Frankist franklandite Franklin franklin Franklinia Franklinian Frankliniana Franklinic Franklinism Franklinist franklinite Franklinization frankly frankmarriage frankness frankpledge frantic frantically franticly franticness franzy frap frappe frapping frasco frase Frasera frasier frass frat fratch fratched fratcheous fratcher fratchety fratchy frater Fratercula fraternal fraternalism fraternalist fraternality fraternally fraternate fraternation fraternism fraternity fraternization fraternize fraternizer fratery Fraticelli Fraticellian fratority Fratricelli fratricidal fratricide fratry fraud fraudful fraudfully fraudless fraudlessly fraudlessness fraudproof fraudulence fraudulency fraudulent fraudulently fraudulentness fraughan fraught frawn fraxetin fraxin fraxinella Fraxinus fray frayed frayedly frayedness fraying frayn frayproof fraze frazer frazil frazzle frazzling freak freakdom freakery freakful freakily freakiness freakish freakishly freakishness freaky fream freath freck frecken freckened frecket freckle freckled freckledness freckleproof freckling frecklish freckly Fred Freddie Freddy Frederic Frederica Frederick frederik fredricite free freeboard freeboot freebooter freebootery freebooting freeborn Freechurchism freed freedman freedom freedwoman freehand freehanded freehandedly freehandedness freehearted freeheartedly freeheartedness freehold freeholder freeholdership freeholding freeing freeish Freekirker freelage freeloving freelovism freely freeman freemanship freemartin freemason freemasonic freemasonical freemasonism freemasonry freeness freer Freesia freesilverism freesilverite freestanding freestone freet freethinker freethinking freetrader freety freeward freeway freewheel freewheeler freewheeling freewill freewoman freezable freeze freezer freezing freezingly Fregata Fregatae Fregatidae freibergite freieslebenite freight freightage freighter freightless freightment freir freit freity fremd fremdly fremdness fremescence fremescent fremitus Fremontia Fremontodendron frenal Frenatae frenate French frenched Frenchification frenchification Frenchify frenchify Frenchily Frenchiness frenching Frenchism Frenchize Frenchless Frenchly Frenchman Frenchness Frenchwise Frenchwoman Frenchy frenetic frenetical frenetically Frenghi frenular frenulum frenum frenzelite frenzied frenziedly frenzy Freon frequence frequency frequent frequentable frequentage frequentation frequentative frequenter frequently frequentness frescade fresco frescoer frescoist fresh freshen freshener freshet freshhearted freshish freshly freshman freshmanhood freshmanic freshmanship freshness freshwoman Fresison fresnel fresno fret fretful fretfully fretfulness fretless fretsome frett frettage frettation frette fretted fretter fretting frettingly fretty fretum fretways fretwise fretwork fretworked Freudian Freudianism Freudism Freudist Freya freyalite Freycinetia Freyja Freyr friability friable friableness friand friandise friar friarbird friarhood friarling friarly friary frib fribble fribbleism fribbler fribblery fribbling fribblish fribby fricandeau fricandel fricassee frication fricative fricatrice friction frictionable frictional frictionally frictionize frictionless frictionlessly frictionproof Friday Fridila fridstool fried Frieda friedcake friedelite friedrichsdor friend friended friendless friendlessness friendlike friendlily friendliness friendliwise friendly friendship frier frieseite Friesian Friesic Friesish frieze friezer friezy frig frigate frigatoon friggle fright frightable frighten frightenable frightened frightenedly frightenedness frightener frightening frighteningly frighter frightful frightfully frightfulness frightless frightment frighty frigid Frigidaire frigidarium frigidity frigidly frigidness frigiferous frigolabile frigoric frigorific frigorifical frigorify frigorimeter frigostable frigotherapy Frija frijol frijolillo frijolito frike frill frillback frilled friller frillery frillily frilliness frilling frilly frim Frimaire fringe fringed fringeflower fringeless fringelet fringent fringepod Fringetail Fringilla fringillaceous Fringillidae fringilliform Fringilliformes fringilline fringilloid fringing fringy fripperer frippery frisca Frisesomorum frisette Frisian Frisii frisk frisker frisket friskful friskily friskiness frisking friskingly frisky frisolee frison frist frisure frit frith frithborh frithbot frithles frithsoken frithstool frithwork Fritillaria fritillary fritt fritter fritterer Fritz Friulian frivol frivoler frivolism frivolist frivolity frivolize frivolous frivolously frivolousness frixion friz frize frizer frizz frizzer frizzily frizziness frizzing frizzle frizzler frizzly frizzy fro frock frocking frockless frocklike frockmaker froe Froebelian Froebelism Froebelist frog frogbit frogeater frogeye frogface frogfish frogflower frogfoot frogged froggery frogginess frogging froggish froggy froghood froghopper frogland frogleaf frogleg froglet froglike frogling frogman frogmouth frognose frogskin frogstool frogtongue frogwort froise frolic frolicful frolicker frolicky frolicly frolicness frolicsome frolicsomely frolicsomeness from fromward fromwards frond frondage fronded frondent frondesce frondescence frondescent frondiferous frondiform frondigerous frondivorous frondlet frondose frondosely frondous front frontad frontage frontager frontal frontalis frontality frontally frontbencher fronted fronter frontier frontierlike frontierman frontiersman Frontignan fronting frontingly Frontirostria frontispiece frontless frontlessly frontlessness frontlet frontoauricular frontoethmoid frontogenesis frontolysis frontomallar frontomaxillary frontomental frontonasal frontooccipital frontoorbital frontoparietal frontopontine frontosphenoidal frontosquamosal frontotemporal frontozygomatic frontpiece frontsman frontstall frontward frontways frontwise froom frore frory frosh frost frostation frostbird frostbite frostbow frosted froster frostfish frostflower frostily frostiness frosting frostless frostlike frostproof frostproofing frostroot frostweed frostwork frostwort frosty frot froth frother Frothi frothily frothiness frothing frothless frothsome frothy frotton froufrou frough froughy frounce frounceless frow froward frowardly frowardness frower frowl frown frowner frownful frowning frowningly frownless frowny frowst frowstily frowstiness frowsty frowy frowze frowzily frowziness frowzled frowzly frowzy froze frozen frozenhearted frozenly frozenness fruchtschiefer fructed fructescence fructescent fructicultural fructiculture Fructidor fructiferous fructiferously fructification fructificative fructifier fructiform fructify fructiparous fructivorous fructose fructoside fructuary fructuosity fructuous fructuously fructuousness frugal frugalism frugalist frugality frugally frugalness fruggan Frugivora frugivorous fruit fruitade fruitage fruitarian fruitarianism fruitcake fruited fruiter fruiterer fruiteress fruitery fruitful fruitfullness fruitfully fruitgrower fruitgrowing fruitiness fruiting fruition fruitist fruitive fruitless fruitlessly fruitlessness fruitlet fruitling fruitstalk fruittime fruitwise fruitwoman fruitwood fruitworm fruity frumentaceous frumentarious frumentation frumenty frump frumpery frumpily frumpiness frumpish frumpishly frumpishness frumple frumpy frush frustrate frustrately frustrater frustration frustrative frustratory frustule frustulent frustulose frustum frutescence frutescent fruticetum fruticose fruticous fruticulose frutify fry fryer fu fub fubby fubsy Fucaceae fucaceous Fucales fucate fucation fucatious Fuchsia Fuchsian fuchsin fuchsine fuchsinophil fuchsinophilous fuchsite fuchsone fuci fucinita fuciphagous fucoid fucoidal Fucoideae fucosan fucose fucous fucoxanthin fucus fud fuddle fuddler fuder fudge fudger fudgy Fuegian fuel fueler fuelizer fuerte fuff fuffy fugacious fugaciously fugaciousness fugacity fugal fugally fuggy fugient fugitate fugitation fugitive fugitively fugitiveness fugitivism fugitivity fugle fugleman fuglemanship fugler fugu fugue fuguist fuidhir fuirdays Fuirena fuji Fulah fulciform fulcral fulcrate fulcrum fulcrumage fulfill fulfiller fulfillment Fulfulde fulgent fulgently fulgentness fulgid fulgide fulgidity fulgor Fulgora fulgorid Fulgoridae Fulgoroidea fulgorous Fulgur fulgural fulgurant fulgurantly fulgurata fulgurate fulgurating fulguration fulgurator fulgurite fulgurous fulham Fulica Fulicinae fulicine fuliginosity fuliginous fuliginously fuliginousness Fuligula Fuligulinae fuliguline fulk full fullam fullback fuller fullering fullery fullface fullhearted fulling fullish fullmouth fullmouthed fullmouthedly fullness fullom Fullonian fully fulmar Fulmarus fulmicotton fulminancy fulminant fulminate fulminating fulmination fulminator fulminatory fulmine fulmineous fulminic fulminous fulminurate fulminuric fulsome fulsomely fulsomeness fulth Fultz Fulup fulvene fulvescent fulvid fulvidness fulvous fulwa fulyie fulzie fum fumacious fumado fumage fumagine Fumago fumarate Fumaria Fumariaceae fumariaceous fumaric fumarine fumarium fumaroid fumaroidal fumarole fumarolic fumaryl fumatorium fumatory fumble fumbler fumbling fume fumeless fumer fumeroot fumet fumette fumewort fumiduct fumiferous fumigant fumigate fumigation fumigator fumigatorium fumigatory fumily fuminess fuming fumingly fumistery fumitory fumose fumosity fumous fumously fumy fun funambulate funambulation funambulator funambulatory funambulic funambulism funambulist funambulo Funaria Funariaceae funariaceous function functional functionalism functionalist functionality functionalize functionally functionarism functionary functionate functionation functionize functionless fund fundable fundal fundament fundamental fundamentalism fundamentalist fundamentality fundamentally fundamentalness fundatorial fundatrix funded funder fundholder fundi fundic fundiform funditor fundless fundmonger fundmongering funds Fundulinae funduline Fundulus fundungi fundus funebrial funeral funeralize funerary funereal funereally funest fungaceous fungal Fungales fungate fungation fungi Fungia fungian fungibility fungible fungic fungicidal fungicide fungicolous fungiferous fungiform fungilliform fungin fungistatic fungivorous fungo fungoid fungoidal fungological fungologist fungology fungose fungosity fungous fungus fungused funguslike fungusy funicle funicular funiculate funicule funiculitis funiculus funiform funipendulous funis Funje funk funker Funkia funkiness funky funmaker funmaking funnel funneled funnelform funnellike funnelwise funnily funniment funniness funny funnyman funori funt Funtumia Fur fur furacious furaciousness furacity fural furaldehyde furan furanoid furazan furazane furbelow furbish furbishable furbisher furbishment furca furcal furcate furcately furcation Furcellaria furcellate furciferine furciferous furciform Furcraea furcula furcular furculum furdel Furfooz furfur furfuraceous furfuraceously furfural furfuralcohol furfuraldehyde furfuramide furfuran furfuration furfurine furfuroid furfurole furfurous furfuryl furfurylidene furiant furibund furied Furies furify furil furilic furiosa furiosity furioso furious furiously furiousness furison furl furlable Furlan furler furless furlong furlough furnace furnacelike furnaceman furnacer furnacite furnage Furnariidae Furnariides Furnarius furner furnish furnishable furnished furnisher furnishing furnishment furniture furnitureless furodiazole furoic furoid furoin furole furomethyl furomonazole furor furore furphy furred furrier furriered furriery furrily furriness furring furrow furrower furrowless furrowlike furrowy furry furstone further furtherance furtherer furtherest furtherly furthermore furthermost furthersome furthest furtive furtively furtiveness Furud furuncle furuncular furunculoid furunculosis furunculous fury furyl furze furzechat furzed furzeling furzery furzetop furzy fusain fusarial fusariose fusariosis Fusarium fusarole fusate fusc fuscescent fuscin fuscohyaline fuscous fuse fuseboard fused fusee fuselage fuseplug fusht fusibility fusible fusibleness fusibly Fusicladium Fusicoccum fusiform Fusiformis fusil fusilier fusillade fusilly fusinist fusion fusional fusionism fusionist fusionless fusoid fuss fusser fussification fussify fussily fussiness fussock fussy fust fustanella fustee fusteric fustet fustian fustianish fustianist fustianize fustic fustigate fustigation fustigator fustigatory fustilugs fustily fustin fustiness fustle fusty Fusulina fusuma fusure Fusus fut futchel fute futhorc futile futilely futileness futilitarian futilitarianism futility futilize futtermassel futtock futural future futureless futureness futuric futurism futurist futuristic futurition futurity futurize futwa fuye fuze fuzz fuzzball fuzzily fuzziness fuzzy fyke fylfot fyrd G g Ga ga gab gabardine gabbard gabber gabble gabblement gabbler gabbro gabbroic gabbroid gabbroitic gabby Gabe gabelle gabelled gabelleman gabeller gaberdine gaberlunzie gabgab gabi gabion gabionade gabionage gabioned gablatores gable gableboard gablelike gablet gablewise gablock Gaboon Gabriel Gabriella Gabrielrache Gabunese gaby Gad gad Gadaba gadabout Gadarene Gadaria gadbee gadbush Gaddang gadded gadder Gaddi gaddi gadding gaddingly gaddish gaddishness gade gadfly gadge gadger gadget gadid Gadidae gadinine Gaditan gadling gadman gadoid Gadoidea gadolinia gadolinic gadolinite gadolinium gadroon gadroonage Gadsbodikins Gadsbud Gadslid gadsman Gadswoons gaduin Gadus gadwall Gadzooks Gael Gaeldom Gaelic Gaelicism Gaelicist Gaelicization Gaelicize Gaeltacht gaen Gaertnerian gaet Gaetulan Gaetuli Gaetulian gaff gaffe gaffer Gaffkya gaffle gaffsman gag gagate gage gageable gagee gageite gagelike gager gagership gagger gaggery gaggle gaggler gagman gagor gagroot gagtooth gahnite Gahrwali Gaia gaiassa Gaidropsaridae gaiety Gail Gaillardia gaily gain gainable gainage gainbirth gaincall gaincome gaine gainer gainful gainfully gainfulness gaining gainless gainlessness gainliness gainly gains gainsay gainsayer gainset gainsome gainspeaker gainspeaking gainst gainstrive gainturn gaintwist gainyield gair gairfish gaisling gait gaited gaiter gaiterless gaiting gaize gaj gal gala Galacaceae galactagogue galactagoguic galactan galactase galactemia galacthidrosis Galactia galactic galactidrosis galactite galactocele galactodendron galactodensimeter galactogenetic galactohemia galactoid galactolipide galactolipin galactolysis galactolytic galactoma galactometer galactometry galactonic galactopathy galactophagist galactophagous galactophlebitis galactophlysis galactophore galactophoritis galactophorous galactophthysis galactophygous galactopoiesis galactopoietic galactopyra galactorrhea galactorrhoea galactoscope galactose galactoside galactosis galactostasis galactosuria galactotherapy galactotrophy galacturia galagala Galaginae Galago galah galanas galanga galangin galant Galanthus galantine galany galapago Galatae galatea Galatian Galatic galatotrophic Galax galaxian Galaxias Galaxiidae galaxy galban galbanum Galbula Galbulae Galbulidae Galbulinae galbulus Galcha Galchic Gale gale galea galeage galeate galeated galee galeeny Galega galegine Galei galeid Galeidae galeiform galempung Galen galena Galenian Galenic galenic Galenical galenical Galenism Galenist galenite galenobismutite galenoid Galeodes Galeodidae galeoid Galeopithecus Galeopsis Galeorchis Galeorhinidae Galeorhinus galeproof galera galericulate galerum galerus Galesaurus galet Galeus galewort galey Galga galgal Galgulidae gali Galibi Galician Galictis Galidia Galidictis Galik Galilean galilee galimatias galingale Galinsoga galiongee galiot galipidine galipine galipoidin galipoidine galipoipin galipot Galium gall Galla galla gallacetophenone gallah gallanilide gallant gallantize gallantly gallantness gallantry gallate gallature gallberry gallbush galleass galled Gallegan gallein galleon galler Galleria gallerian galleried Galleriidae gallery gallerylike gallet galley galleylike galleyman galleyworm gallflower gallfly Galli galliambic galliambus Gallian galliard galliardise galliardly galliardness Gallic gallic Gallican Gallicanism Gallicism Gallicization Gallicize Gallicizer gallicola Gallicolae gallicole gallicolous galliferous Gallification gallification galliform Galliformes Gallify galligaskin gallimaufry Gallinaceae gallinacean Gallinacei gallinaceous Gallinae Gallinago gallinazo galline galling gallingly gallingness gallinipper Gallinula gallinule Gallinulinae gallinuline gallipot Gallirallus gallisin gallium gallivant gallivanter gallivat gallivorous galliwasp gallnut gallocyanin gallocyanine galloflavine galloglass Galloman Gallomania Gallomaniac gallon gallonage galloner galloon gallooned gallop gallopade galloper Galloperdix Gallophile Gallophilism Gallophobe Gallophobia galloping galloptious gallotannate gallotannic gallotannin gallous Gallovidian Galloway galloway gallowglass gallows gallowsmaker gallowsness gallowsward gallstone Gallus galluses gallweed gallwort gally gallybagger gallybeggar gallycrow Galoisian galoot galop galore galosh galp galravage galravitch galt Galtonia Galtonian galuchat galumph galumptious Galusha galuth galvanic galvanical galvanically galvanism galvanist galvanization galvanize galvanized galvanizer galvanocauterization galvanocautery galvanocontractility galvanofaradization galvanoglyph galvanoglyphy galvanograph galvanographic galvanography galvanologist galvanology galvanolysis galvanomagnet galvanomagnetic galvanomagnetism galvanometer galvanometric galvanometrical galvanometrically galvanometry galvanoplastic galvanoplastical galvanoplastically galvanoplastics galvanoplasty galvanopsychic galvanopuncture galvanoscope galvanoscopic galvanoscopy galvanosurgery galvanotactic galvanotaxis galvanotherapy galvanothermometer galvanothermy galvanotonic galvanotropic galvanotropism galvayne galvayning Galways Galwegian galyac galyak galziekte gam gamahe Gamaliel gamashes gamasid Gamasidae Gamasoidea gamb gamba gambade gambado gambang gambeer gambeson gambet gambette gambia gambier gambist gambit gamble gambler gamblesome gamblesomeness gambling gambodic gamboge gambogian gambogic gamboised gambol gambrel gambreled gambroon Gambusia gamdeboo game gamebag gameball gamecock gamecraft gameful gamekeeper gamekeeping gamelang gameless gamelike Gamelion gamelotte gamely gamene gameness gamesome gamesomely gamesomeness gamester gamestress gametal gametange gametangium gamete gametic gametically gametocyst gametocyte gametogenesis gametogenic gametogenous gametogeny gametogonium gametogony gametoid gametophagia gametophore gametophyll gametophyte gametophytic gamic gamily gamin gaminesque gaminess gaming gaminish gamma gammacism gammacismus gammadion gammarid Gammaridae gammarine gammaroid Gammarus gammation gammelost gammer gammerel gammerstang Gammexane gammick gammock gammon gammoner gammoning gammy gamobium gamodesmic gamodesmy gamogenesis gamogenetic gamogenetical gamogenetically gamogony Gamolepis gamomania gamont Gamopetalae gamopetalous gamophagia gamophagy gamophyllous gamori gamosepalous gamostele gamostelic gamostely gamotropic gamotropism gamp gamphrel gamut gamy gan ganam ganancial Ganapati ganch Ganda gander ganderess gandergoose gandermooner ganderteeth Gandhara Gandharva Gandhiism Gandhism Gandhist gandul gandum gandurah gane ganef gang Ganga ganga Gangamopteris gangan gangava gangboard gangdom gange ganger Gangetic ganggang ganging gangism gangland ganglander ganglia gangliac ganglial gangliar gangliasthenia gangliate gangliated gangliectomy gangliform gangliitis gangling ganglioblast gangliocyte ganglioform ganglioid ganglioma ganglion ganglionary ganglionate ganglionectomy ganglioneural ganglioneure ganglioneuroma ganglioneuron ganglionic ganglionitis ganglionless ganglioplexus gangly gangman gangmaster gangplank gangrel gangrene gangrenescent gangrenous gangsman gangster gangsterism gangtide gangue Ganguela gangway gangwayman ganister ganja ganner gannet Ganocephala ganocephalan ganocephalous ganodont Ganodonta Ganodus ganoid ganoidal ganoidean Ganoidei ganoidian ganoin ganomalite ganophyllite ganosis Ganowanian gansel gansey gansy gant ganta gantang gantlet gantline ganton gantries gantry gantryman gantsl Ganymede Ganymedes ganza ganzie gaol gaolbird gaoler Gaon Gaonate Gaonic gap Gapa gapa gape gaper gapes gapeseed gapeworm gaping gapingly gapingstock gapo gappy gapy gar gara garabato garad garage garageman Garamond garance garancine garapata garava garavance garawi garb garbage garbardine garbel garbell garbill garble garbleable garbler garbless garbling garboard garboil garbure garce Garcinia gardant gardeen garden gardenable gardencraft gardened gardener gardenership gardenesque gardenful gardenhood Gardenia gardenin gardening gardenize gardenless gardenlike gardenly gardenmaker gardenmaking gardenwards gardenwise gardeny garderobe gardevin gardy gardyloo gare garefowl gareh garetta garewaite garfish garganey Gargantua Gargantuan garget gargety gargle gargol gargoyle gargoyled gargoyley gargoylish gargoylishly gargoylism Garhwali garial gariba garibaldi Garibaldian garish garishly garishness garland garlandage garlandless garlandlike garlandry garlandwise garle garlic garlicky garliclike garlicmonger garlicwort garment garmentless garmentmaker garmenture garmentworker garn garnel garner garnerage garnet garnetberry garneter garnetiferous garnets garnett garnetter garnetwork garnetz garnice garniec garnierite garnish garnishable garnished garnishee garnisheement garnisher garnishment garnishry garniture Garo garoo garookuh garrafa garran Garret garret garreted garreteer garretmaster garrison Garrisonian Garrisonism garrot garrote garroter Garrulinae garruline garrulity garrulous garrulously garrulousness Garrulus garrupa Garrya Garryaceae garse Garshuni garsil garston garten garter gartered gartering garterless garth garthman Garuda garum garvanzo garvey garvock Gary gas Gasan gasbag gascoigny Gascon gasconade gasconader Gasconism gascromh gaseity gaselier gaseosity gaseous gaseousness gasfiring gash gashes gashful gashliness gashly gasholder gashouse gashy gasifiable gasification gasifier gasiform gasify gasket gaskin gasking gaskins gasless gaslight gaslighted gaslighting gaslit gaslock gasmaker gasman gasogenic gasoliery gasoline gasolineless gasoliner gasometer gasometric gasometrical gasometry gasp Gaspar gasparillo gasper gaspereau gaspergou gaspiness gasping gaspingly gasproof gaspy gasser Gasserian gassiness gassing gassy gast gastaldite gastaldo gaster gasteralgia Gasterolichenes gasteromycete Gasteromycetes gasteromycetous Gasterophilus gasteropod Gasteropoda gasterosteid Gasterosteidae gasterosteiform gasterosteoid Gasterosteus gasterotheca gasterothecal Gasterotricha gasterotrichan gasterozooid gastight gastightness Gastornis Gastornithidae gastradenitis gastraea gastraead Gastraeadae gastraeal gastraeum gastral gastralgia gastralgic gastralgy gastraneuria gastrasthenia gastratrophia gastrectasia gastrectasis gastrectomy gastrelcosis gastric gastricism gastrilegous gastriloquial gastriloquism gastriloquist gastriloquous gastriloquy gastrin gastritic gastritis gastroadenitis gastroadynamic gastroalbuminorrhea gastroanastomosis gastroarthritis gastroatonia gastroatrophia gastroblennorrhea gastrocatarrhal gastrocele gastrocentrous Gastrochaena Gastrochaenidae gastrocnemial gastrocnemian gastrocnemius gastrocoel gastrocolic gastrocoloptosis gastrocolostomy gastrocolotomy gastrocolpotomy gastrocystic gastrocystis gastrodialysis gastrodiaphanoscopy gastrodidymus gastrodisk gastroduodenal gastroduodenitis gastroduodenoscopy gastroduodenotomy gastrodynia gastroelytrotomy gastroenteralgia gastroenteric gastroenteritic gastroenteritis gastroenteroanastomosis gastroenterocolitis gastroenterocolostomy gastroenterological gastroenterologist gastroenterology gastroenteroptosis gastroenterostomy gastroenterotomy gastroepiploic gastroesophageal gastroesophagostomy gastrogastrotomy gastrogenital gastrograph gastrohelcosis gastrohepatic gastrohepatitis gastrohydrorrhea gastrohyperneuria gastrohypertonic gastrohysterectomy gastrohysteropexy gastrohysterorrhaphy gastrohysterotomy gastroid gastrointestinal gastrojejunal gastrojejunostomy gastrolater gastrolatrous gastrolienal gastrolith Gastrolobium gastrologer gastrological gastrologist gastrology gastrolysis gastrolytic gastromalacia gastromancy gastromelus gastromenia gastromyces gastromycosis gastromyxorrhea gastronephritis gastronome gastronomer gastronomic gastronomical gastronomically gastronomist gastronomy gastronosus gastropancreatic gastropancreatitis gastroparalysis gastroparesis gastroparietal gastropathic gastropathy gastroperiodynia gastropexy gastrophile gastrophilism gastrophilist gastrophilite Gastrophilus gastrophrenic gastrophthisis gastroplasty gastroplenic gastropleuritis gastroplication gastropneumatic gastropneumonic gastropod Gastropoda gastropodan gastropodous gastropore gastroptosia gastroptosis gastropulmonary gastropulmonic gastropyloric gastrorrhagia gastrorrhaphy gastrorrhea gastroschisis gastroscope gastroscopic gastroscopy gastrosoph gastrosopher gastrosophy gastrospasm gastrosplenic gastrostaxis gastrostegal gastrostege gastrostenosis gastrostomize Gastrostomus gastrostomy gastrosuccorrhea gastrotheca gastrothecal gastrotome gastrotomic gastrotomy Gastrotricha gastrotrichan gastrotubotomy gastrotympanites gastrovascular gastroxynsis gastrozooid gastrula gastrular gastrulate gastrulation gasworker gasworks gat gata gatch gatchwork gate gateado gateage gated gatehouse gatekeeper gateless gatelike gatemaker gateman gatepost gater gatetender gateward gatewards gateway gatewayman gatewise gatewoman gateworks gatewright Gatha gather gatherable gatherer gathering Gathic gating gator gatter gatteridge gau gaub gauby gauche gauchely gaucheness gaucherie Gaucho gaud gaudery Gaudete gaudful gaudily gaudiness gaudless gaudsman gaudy gaufer gauffer gauffered gauffre gaufre gaufrette gauge gaugeable gauger gaugership gauging Gaul gaulding gauleiter Gaulic gaulin Gaulish Gaullism Gaullist Gault gault gaulter gaultherase Gaultheria gaultherin gaum gaumish gaumless gaumlike gaumy gaun gaunt gaunted gauntlet gauntleted gauntly gauntness gauntry gaunty gaup gaupus gaur Gaura Gaurian gaus gauss gaussage gaussbergite Gaussian gauster gausterer gaut gauteite gauze gauzelike gauzewing gauzily gauziness gauzy gavall gave gavel gaveler gavelkind gavelkinder gavelman gavelock Gavia Gaviae gavial Gavialis gavialoid Gaviiformes gavotte gavyuti gaw gawby gawcie gawk gawkhammer gawkihood gawkily gawkiness gawkish gawkishly gawkishness gawky gawm gawn gawney gawsie gay gayal gayatri gaybine gaycat gaydiang gayish Gaylussacia gaylussite gayment gayness Gaypoo gaysome gaywings gayyou gaz gazabo gazangabin Gazania gaze gazebo gazee gazehound gazel gazeless Gazella gazelle gazelline gazement gazer gazettal gazette gazetteer gazetteerage gazetteerish gazetteership gazi gazing gazingly gazingstock gazogene gazon gazophylacium gazy gazzetta Ge ge Geadephaga geadephagous geal gean geanticlinal geanticline gear gearbox geared gearing gearksutite gearless gearman gearset gearshift gearwheel gease geason Geaster Geat geat Geatas gebang gebanga gebbie gebur Gecarcinidae Gecarcinus geck gecko geckoid geckotian geckotid Geckotidae geckotoid Ged ged gedackt gedanite gedder gedeckt gedecktwork Gederathite Gederite gedrite Gee gee geebong geebung Geechee geejee geek geelbec geeldikkop geelhout geepound geerah geest geet Geez geezer Gegenschein gegg geggee gegger geggery Geheimrat Gehenna gehlenite Geikia geikielite gein geira Geisenheimer geisha geison geisotherm geisothermal Geissoloma Geissolomataceae Geissolomataceous Geissorhiza geissospermin geissospermine geitjie geitonogamous geitonogamy Gekko Gekkones gekkonid Gekkonidae gekkonoid Gekkota gel gelable gelada gelandejump gelandelaufer gelandesprung Gelasian Gelasimus gelastic Gelastocoridae gelatification gelatigenous gelatin gelatinate gelatination gelatined gelatiniferous gelatiniform gelatinify gelatinigerous gelatinity gelatinizability gelatinizable gelatinization gelatinize gelatinizer gelatinobromide gelatinochloride gelatinoid gelatinotype gelatinous gelatinously gelatinousness gelation gelatose geld geldability geldable geldant gelder gelding Gelechia gelechiid Gelechiidae Gelfomino gelid Gelidiaceae gelidity Gelidium gelidly gelidness gelignite gelilah gelinotte gell Gellert gelly gelogenic gelong geloscopy gelose gelosin gelotherapy gelotometer gelotoscopy gelototherapy gelsemic gelsemine gelseminic gelseminine Gelsemium gelt gem Gemara Gemaric Gemarist gematria gematrical gemauve gemel gemeled gemellione gemellus geminate geminated geminately gemination geminative Gemini Geminid geminiflorous geminiform geminous Gemitores gemitorial gemless gemlike Gemma gemma gemmaceous gemmae gemmate gemmation gemmative gemmeous gemmer gemmiferous gemmiferousness gemmification gemmiform gemmily gemminess Gemmingia gemmipara gemmipares gemmiparity gemmiparous gemmiparously gemmoid gemmology gemmula gemmulation gemmule gemmuliferous gemmy gemot gemsbok gemsbuck gemshorn gemul gemuti gemwork gen gena genal genapp genapper genarch genarcha genarchaship genarchship gendarme gendarmery gender genderer genderless Gene gene genealogic genealogical genealogically genealogist genealogize genealogizer genealogy genear geneat genecologic genecological genecologically genecologist genecology geneki genep genera generability generable generableness general generalate generalcy generale generalia Generalidad generalific generalism generalissima generalissimo generalist generalistic generality generalizable generalization generalize generalized generalizer generall generally generalness generalship generalty generant generate generating generation generational generationism generative generatively generativeness generator generatrix generic generical generically genericalness generification generosity generous generously generousness Genesee geneserine Genesiac Genesiacal genesial genesic genesiology genesis Genesitic genesiurgic genet genethliac genethliacal genethliacally genethliacon genethliacs genethlialogic genethlialogical genethlialogy genethlic genetic genetical genetically geneticism geneticist genetics genetmoil genetous Genetrix genetrix Genetta Geneura Geneva geneva Genevan Genevese Genevieve Genevois genevoise genial geniality genialize genially genialness genian genic genicular geniculate geniculated geniculately geniculation geniculum genie genii genin genioglossal genioglossi genioglossus geniohyoglossal geniohyoglossus geniohyoid geniolatry genion genioplasty genip Genipa genipa genipap genipapada genisaro Genista genista genistein genital genitalia genitals genitival genitivally genitive genitocrural genitofemoral genitor genitorial genitory genitourinary geniture genius genizah genizero Genny Genoa genoblast genoblastic genocidal genocide Genoese genoese genom genome genomic genonema genos genotype genotypic genotypical genotypically Genoveva genovino genre genro gens genson gent genteel genteelish genteelism genteelize genteelly genteelness gentes genthite gentian Gentiana Gentianaceae gentianaceous Gentianales gentianella gentianic gentianin gentianose gentianwort gentile gentiledom gentilesse gentilic gentilism gentilitial gentilitian gentilitious gentility gentilization gentilize gentiobiose gentiopicrin gentisein gentisic gentisin gentle gentlefolk gentlehearted gentleheartedly gentleheartedness gentlehood gentleman gentlemanhood gentlemanism gentlemanize gentlemanlike gentlemanlikeness gentlemanliness gentlemanly gentlemanship gentlemens gentlemouthed gentleness gentlepeople gentleship gentlewoman gentlewomanhood gentlewomanish gentlewomanlike gentlewomanliness gentlewomanly gently gentman Gentoo gentrice gentry genty genu genua genual genuclast genuflect genuflection genuflector genuflectory genuflex genuflexuous genuine genuinely genuineness genus genyantrum Genyophrynidae genyoplasty genys geo geoaesthesia geoagronomic geobiologic geobiology geobiont geobios geoblast geobotanic geobotanical geobotanist geobotany geocarpic geocentric geocentrical geocentrically geocentricism geocerite geochemical geochemist geochemistry geochronic geochronology geochrony Geococcyx geocoronium geocratic geocronite geocyclic geodaesia geodal geode geodesic geodesical geodesist geodesy geodete geodetic geodetical geodetically geodetician geodetics geodiatropism geodic geodiferous geodist geoduck geodynamic geodynamical geodynamics geoethnic Geoff Geoffrey geoffroyin geoffroyine geoform geogenesis geogenetic geogenic geogenous geogeny Geoglossaceae Geoglossum geoglyphic geognosis geognosist geognost geognostic geognostical geognostically geognosy geogonic geogonical geogony geographer geographic geographical geographically geographics geographism geographize geography geohydrologist geohydrology geoid geoidal geoisotherm geolatry geologer geologian geologic geological geologically geologician geologist geologize geology geomagnetic geomagnetician geomagnetics geomagnetist geomalic geomalism geomaly geomance geomancer geomancy geomant geomantic geomantical geomantically geometer geometric geometrical geometrically geometrician geometricize geometrid Geometridae geometriform Geometrina geometrine geometrize geometroid Geometroidea geometry geomoroi geomorphic geomorphist geomorphogenic geomorphogenist geomorphogeny geomorphological geomorphology geomorphy geomyid Geomyidae Geomys Geon geonavigation geonegative Geonic Geonim Geonoma geonoma geonyctinastic geonyctitropic geoparallelotropic geophagia geophagism geophagist geophagous geophagy Geophila geophilid Geophilidae geophilous Geophilus Geophone geophone geophysical geophysicist geophysics geophyte geophytic geoplagiotropism Geoplana Geoplanidae geopolar geopolitic geopolitical geopolitically geopolitician geopolitics Geopolitik geoponic geoponical geoponics geopony geopositive Geoprumnon georama Geordie George Georgemas Georgette Georgia georgiadesite Georgian Georgiana georgic Georgie geoscopic geoscopy geoselenic geosid geoside geosphere Geospiza geostatic geostatics geostrategic geostrategist geostrategy geostrophic geosynclinal geosyncline geotactic geotactically geotaxis geotaxy geotechnic geotechnics geotectology geotectonic geotectonics Geoteuthis geotherm geothermal geothermic geothermometer Geothlypis geotic geotical geotilla geotonic geotonus geotropic geotropically geotropism geotropy geoty Gepeoo Gephyrea gephyrean gephyrocercal gephyrocercy Gepidae ger gerah Gerald Geraldine Geraniaceae geraniaceous geranial Geraniales geranic geraniol Geranium geranium geranomorph Geranomorphae geranomorphic geranyl Gerard gerardia Gerasene gerastian gerate gerated geratic geratologic geratologous geratology geraty gerb gerbe Gerbera Gerberia gerbil Gerbillinae Gerbillus gercrow gereagle gerefa gerenda gerendum gerent gerenuk gerfalcon gerhardtite geriatric geriatrician geriatrics gerim gerip germ germal German german germander germane germanely germaneness Germanesque Germanhood Germania Germanic germanic Germanical Germanically Germanics Germanification Germanify germanious Germanish Germanism Germanist Germanistic germanite Germanity germanity germanium Germanization germanization Germanize germanize Germanizer Germanly Germanness Germanocentric Germanomania Germanomaniac Germanophile Germanophilist Germanophobe Germanophobia Germanophobic Germanophobist germanous Germantown germanyl germarium germen germfree germicidal germicide germifuge germigenous germin germina germinability germinable Germinal germinal germinally germinance germinancy germinant germinate germination germinative germinatively germinator germing germinogony germiparity germless germlike germling germon germproof germule germy gernitz gerocomia gerocomical gerocomy geromorphism Geronomite geront gerontal gerontes gerontic gerontine gerontism geronto gerontocracy gerontocrat gerontocratic gerontogeous gerontology gerontophilia gerontoxon Gerres gerrhosaurid Gerrhosauridae Gerridae gerrymander gerrymanderer gers gersdorffite Gershom Gershon Gershonite gersum Gertie Gertrude gerund gerundial gerundially gerundival gerundive gerundively gerusia Gervais gervao Gervas Gervase Gerygone gerygone Geryonia geryonid Geryonidae Geryoniidae Ges Gesan Geshurites gesith gesithcund gesithcundman Gesnera Gesneraceae gesneraceous Gesneria gesneria Gesneriaceae gesneriaceous Gesnerian gesning gessamine gesso gest Gestalt gestalter gestaltist gestant Gestapo gestate gestation gestational gestative gestatorial gestatorium gestatory geste gested gesten gestening gestic gestical gesticulacious gesticulant gesticular gesticularious gesticulate gesticulation gesticulative gesticulatively gesticulator gesticulatory gestion gestning gestural gesture gestureless gesturer get geta Getae getah getaway gether Gethsemane gethsemane Gethsemanic gethsemanic Getic getling getpenny Getsul gettable getter getting getup Geullah Geum geum gewgaw gewgawed gewgawish gewgawry gewgawy gey geyan geyerite geyser geyseral geyseric geyserine geyserish geyserite gez ghafir ghaist ghalva Ghan gharial gharnao gharry Ghassanid ghastily ghastlily ghastliness ghastly ghat ghatti ghatwal ghatwazi ghazi ghazism Ghaznevid Gheber ghebeta Ghedda ghee Gheg Ghegish gheleem Ghent gherkin ghetchoo ghetti ghetto ghettoization ghettoize Ghibelline Ghibellinism Ghilzai Ghiordes ghizite ghoom ghost ghostcraft ghostdom ghoster ghostess ghostfish ghostflower ghosthood ghostified ghostily ghostish ghostism ghostland ghostless ghostlet ghostlify ghostlike ghostlily ghostliness ghostly ghostmonger ghostology ghostship ghostweed ghostwrite ghosty ghoul ghoulery ghoulish ghoulishly ghoulishness ghrush ghurry Ghuz Gi Giansar giant giantesque giantess gianthood giantish giantism giantize giantkind giantlike giantly giantry giantship Giardia giardia giardiasis giarra giarre Gib gib gibaro gibbals gibbed gibber Gibberella gibbergunyah gibberish gibberose gibberosity gibbet gibbetwise Gibbi gibblegabble gibblegabbler gibbles gibbon gibbose gibbosity gibbous gibbously gibbousness gibbsite gibbus gibby gibe gibel gibelite Gibeonite giber gibing gibingly gibleh giblet giblets Gibraltar Gibson gibstaff gibus gid giddap giddea giddify giddily giddiness giddy giddyberry giddybrain giddyhead giddyish Gideon Gideonite gidgee gie gied gien Gienah gieseckite gif giffgaff Gifola gift gifted giftedly giftedness giftie giftless giftling giftware gig gigantean gigantesque gigantic gigantical gigantically giganticidal giganticide giganticness gigantism gigantize gigantoblast gigantocyte gigantolite gigantological gigantology gigantomachy Gigantopithecus Gigantosaurus Gigantostraca gigantostracan gigantostracous Gigartina Gigartinaceae gigartinaceous Gigartinales gigback gigelira gigeria gigerium gigful gigger giggish giggit giggle giggledom gigglement giggler gigglesome giggling gigglingly gigglish giggly Gigi giglet gigliato giglot gigman gigmaness gigmanhood gigmania gigmanic gigmanically gigmanism gigmanity gignate gignitive gigolo gigot gigsman gigster gigtree gigunu Gil Gila Gilaki Gilbert gilbert gilbertage Gilbertese Gilbertian Gilbertianism gilbertite gild gildable gilded gilden gilder gilding Gileadite Gileno Giles gilguy Gilia gilia Giliak gilim Gill gill gillaroo gillbird gilled Gillenia giller Gilles gillflirt gillhooter Gillian gillie gilliflirt gilling gilliver gillotage gillotype gillstoup gilly gillyflower gillygaupus gilo gilpy gilravage gilravager gilse gilsonite gilt giltcup gilthead gilttail gim gimbal gimbaled gimbaljawed gimberjawed gimble gimcrack gimcrackery gimcrackiness gimcracky gimel Gimirrai gimlet gimleteyed gimlety gimmal gimmer gimmerpet gimmick gimp gimped gimper gimping gin ging ginger gingerade gingerberry gingerbread gingerbready gingerin gingerleaf gingerline gingerliness gingerly gingerness gingernut gingerol gingerous gingerroot gingersnap gingerspice gingerwork gingerwort gingery gingham ginghamed gingili gingiva gingivae gingival gingivalgia gingivectomy gingivitis gingivoglossitis gingivolabial ginglyform ginglymoarthrodia ginglymoarthrodial Ginglymodi ginglymodian ginglymoid ginglymoidal Ginglymostoma ginglymostomoid ginglymus ginglyni ginhouse gink Ginkgo ginkgo Ginkgoaceae ginkgoaceous Ginkgoales ginned ginner ginners ginnery ginney ginning ginnle Ginny ginny ginseng ginward gio giobertite giornata giornatate Giottesque Giovanni gip gipon gipper Gippy gipser gipsire gipsyweed Giraffa giraffe giraffesque Giraffidae giraffine giraffoid girandola girandole girasol girasole girba gird girder girderage girderless girding girdingly girdle girdlecake girdlelike girdler girdlestead girdling girdlingly Girella Girellidae Girgashite Girgasite girl girleen girlery girlfully girlhood girlie girliness girling girlish girlishly girlishness girlism girllike girly girn girny giro giroflore Girondin Girondism Girondist girouette girouettism girr girse girsh girsle girt girth girtline gisarme gish gisla gisler gismondine gismondite gist git gitaligenin gitalin Gitanemuck gith Gitksan gitonin gitoxigenin gitoxin gittern Gittite gittith Giuseppe giustina give giveable giveaway given givenness giver givey giving gizz gizzard gizzen gizzern glabella glabellae glabellar glabellous glabellum glabrate glabrescent glabrous glace glaceed glaceing glaciable glacial glacialism glacialist glacialize glacially glaciaria glaciarium glaciate glaciation glacier glaciered glacieret glacierist glacification glacioaqueous glaciolacustrine glaciological glaciologist glaciology glaciomarine glaciometer glacionatant glacis glack glad gladden gladdener gladdon gladdy glade gladelike gladeye gladful gladfully gladfulness gladhearted gladiate gladiator gladiatorial gladiatorism gladiatorship gladiatrix gladify gladii gladiola gladiolar gladiole gladioli gladiolus gladius gladkaite gladless gladly gladness gladsome gladsomely gladsomeness Gladstone Gladstonian Gladstonianism glady Gladys glaga Glagol Glagolic Glagolitic Glagolitsa glaieul glaik glaiket glaiketness glair glaireous glairiness glairy glaister glaive glaived glaked glaky glam glamberry glamorize glamorous glamorously glamour glamoury glance glancer glancing glancingly gland glandaceous glandarious glandered glanderous glanders glandes glandiferous glandiform glandless glandlike glandular glandularly glandule glanduliferous glanduliform glanduligerous glandulose glandulosity glandulous glandulousness Glaniostomi glans glar glare glareless Glareola glareole Glareolidae glareous glareproof glareworm glarily glariness glaring glaringly glaringness glarry glary Glaserian glaserite glashan glass glassen glasser glasses glassfish glassful glasshouse glassie glassily glassine glassiness Glassite glassless glasslike glassmaker glassmaking glassman glassophone glassrope glassteel glassware glassweed glasswork glassworker glassworking glassworks glasswort glassy Glaswegian Glathsheim Glathsheimr glauberite glaucescence glaucescent Glaucidium glaucin glaucine Glaucionetta Glaucium glaucochroite glaucodot glaucolite glaucoma glaucomatous Glaucomys Glauconia glauconiferous Glauconiidae glauconite glauconitic glauconitization glaucophane glaucophanite glaucophanization glaucophanize glaucophyllous Glaucopis glaucosuria glaucous glaucously Glauke glaum glaumrie glaur glaury Glaux glaver glaze glazed glazen glazer glazework glazier glaziery glazily glaziness glazing glazy gleam gleamily gleaminess gleaming gleamingly gleamless gleamy glean gleanable gleaner gleaning gleary gleba glebal glebe glebeless glebous Glecoma glede Gleditsia gledy glee gleed gleeful gleefully gleefulness gleeishly gleek gleemaiden gleeman gleesome gleesomely gleesomeness gleet gleety gleewoman gleg glegly glegness Glen glen Glengarry Glenn glenohumeral glenoid glenoidal glent glessite gleyde glia gliadin glial glib glibbery glibly glibness glidder gliddery glide glideless glideness glider gliderport glidewort gliding glidingly gliff gliffing glime glimmer glimmering glimmeringly glimmerite glimmerous glimmery glimpse glimpser glink glint glioma gliomatous gliosa gliosis Glires Gliridae gliriform Gliriformia glirine Glis glisk glisky glissade glissader glissando glissette glisten glistening glisteningly glister glisteringly Glitnir glitter glitterance glittering glitteringly glittersome glittery gloam gloaming gloat gloater gloating gloatingly global globally globate globated globe globed globefish globeflower globeholder globelet Globicephala globiferous Globigerina globigerine Globigerinidae globin Globiocephalus globoid globose globosely globoseness globosite globosity globosphaerite globous globously globousness globular Globularia Globulariaceae globulariaceous globularity globularly globularness globule globulet globulicidal globulicide globuliferous globuliform globulimeter globulin globulinuria globulite globulitic globuloid globulolysis globulose globulous globulousness globulysis globy glochid glochideous glochidia glochidial glochidian glochidiate glochidium glochis glockenspiel gloea gloeal Gloeocapsa gloeocapsoid gloeosporiose Gloeosporium Gloiopeltis Gloiosiphonia Gloiosiphoniaceae glom glome glomerate glomeration Glomerella glomeroporphyritic glomerular glomerulate glomerule glomerulitis glomerulonephritis glomerulose glomerulus glommox glomus glonoin glonoine gloom gloomful gloomfully gloomily gloominess glooming gloomingly gloomless gloomth gloomy glop gloppen glor glore Gloria Gloriana gloriation gloriette glorifiable glorification glorifier glorify gloriole Gloriosa gloriosity glorious gloriously gloriousness glory gloryful glorying gloryingly gloryless gloss glossa glossagra glossal glossalgia glossalgy glossanthrax glossarial glossarially glossarian glossarist glossarize glossary Glossata glossate glossator glossatorial glossectomy glossed glosser glossic glossily Glossina glossiness glossing glossingly Glossiphonia Glossiphonidae glossist glossitic glossitis glossless glossmeter glossocarcinoma glossocele glossocoma glossocomon glossodynamometer glossodynia glossoepiglottic glossoepiglottidean glossograph glossographer glossographical glossography glossohyal glossoid glossokinesthetic glossolabial glossolabiolaryngeal glossolabiopharyngeal glossolalia glossolalist glossolaly glossolaryngeal glossological glossologist glossology glossolysis glossoncus glossopalatine glossopalatinus glossopathy glossopetra Glossophaga glossophagine glossopharyngeal glossopharyngeus Glossophora glossophorous glossophytia glossoplasty glossoplegia glossopode glossopodium Glossopteris glossoptosis glossopyrosis glossorrhaphy glossoscopia glossoscopy glossospasm glossosteresis Glossotherium glossotomy glossotype glossy glost glottal glottalite glottalize glottic glottid glottidean glottis glottiscope glottogonic glottogonist glottogony glottologic glottological glottologist glottology Gloucester glout glove gloveless glovelike glovemaker glovemaking glover gloveress glovey gloving glow glower glowerer glowering gloweringly glowfly glowing glowingly glowworm Gloxinia gloy gloze glozing glozingly glub glucase glucemia glucid glucide glucidic glucina glucine glucinic glucinium glucinum gluck glucofrangulin glucokinin glucolipid glucolipide glucolipin glucolipine glucolysis glucosaemia glucosamine glucosan glucosane glucosazone glucose glucosemia glucosic glucosid glucosidal glucosidase glucoside glucosidic glucosidically glucosin glucosine glucosone glucosuria glucuronic glue glued gluemaker gluemaking gluepot gluer gluey glueyness glug gluish gluishness glum gluma Glumaceae glumaceous glumal Glumales glume glumiferous Glumiflorae glumly glummy glumness glumose glumosity glump glumpily glumpiness glumpish glumpy glunch Gluneamie glusid gluside glut glutamic glutamine glutaminic glutaric glutathione glutch gluteal glutelin gluten glutenin glutenous gluteofemoral gluteoinguinal gluteoperineal gluteus glutin glutinate glutination glutinative glutinize glutinose glutinosity glutinous glutinously glutinousness glutition glutoid glutose glutter gluttery glutting gluttingly glutton gluttoness gluttonish gluttonism gluttonize gluttonous gluttonously gluttonousness gluttony glyceraldehyde glycerate Glyceria glyceric glyceride glycerin glycerinate glycerination glycerine glycerinize glycerite glycerize glycerizin glycerizine glycerogel glycerogelatin glycerol glycerolate glycerole glycerolize glycerophosphate glycerophosphoric glycerose glyceroxide glyceryl glycid glycide glycidic glycidol Glycine glycine glycinin glycocholate glycocholic glycocin glycocoll glycogelatin glycogen glycogenesis glycogenetic glycogenic glycogenize glycogenolysis glycogenous glycogeny glycohaemia glycohemia glycol glycolaldehyde glycolate glycolic glycolide glycolipid glycolipide glycolipin glycolipine glycoluric glycoluril glycolyl glycolylurea glycolysis glycolytic glycolytically Glyconian Glyconic glyconic glyconin glycoproteid glycoprotein glycosaemia glycose glycosemia glycosin glycosine glycosuria glycosuric glycuresis glycuronic glycyl glycyphyllin Glycyrrhiza glycyrrhizin Glynn glyoxal glyoxalase glyoxalic glyoxalin glyoxaline glyoxim glyoxime glyoxyl glyoxylic glyph glyphic glyphograph glyphographer glyphographic glyphography glyptic glyptical glyptician Glyptodon glyptodont Glyptodontidae glyptodontoid glyptograph glyptographer glyptographic glyptography glyptolith glyptological glyptologist glyptology glyptotheca Glyptotherium glyster Gmelina gmelinite gnabble Gnaeus gnaphalioid Gnaphalium gnar gnarl gnarled gnarliness gnarly gnash gnashingly gnat gnatcatcher gnatflower gnathal gnathalgia gnathic gnathidium gnathion gnathism gnathite gnathitis Gnatho gnathobase gnathobasic Gnathobdellae Gnathobdellida gnathometer gnathonic gnathonical gnathonically gnathonism gnathonize gnathophorous gnathoplasty gnathopod Gnathopoda gnathopodite gnathopodous gnathostegite Gnathostoma Gnathostomata gnathostomatous gnathostome Gnathostomi gnathostomous gnathotheca gnatling gnatproof gnatsnap gnatsnapper gnatter gnatty gnatworm gnaw gnawable gnawer gnawing gnawingly gnawn gneiss gneissic gneissitic gneissoid gneissose gneissy Gnetaceae gnetaceous Gnetales Gnetum gnocchetti gnome gnomed gnomesque gnomic gnomical gnomically gnomide gnomish gnomist gnomologic gnomological gnomologist gnomology gnomon Gnomonia Gnomoniaceae gnomonic gnomonical gnomonics gnomonological gnomonologically gnomonology gnosiological gnosiology gnosis Gnostic gnostic gnostical gnostically Gnosticism gnosticity gnosticize gnosticizer gnostology gnu go goa goad goadsman goadster goaf Goajiro goal Goala goalage goalee goalie goalkeeper goalkeeping goalless goalmouth Goan Goanese goanna Goasila goat goatbeard goatbrush goatbush goatee goateed goatfish goatherd goatherdess goatish goatishly goatishness goatland goatlike goatling goatly goatroot goatsbane goatsbeard goatsfoot goatskin goatstone goatsucker goatweed goaty goave gob goback goban gobang gobbe gobber gobbet gobbin gobbing gobble gobbledygook gobbler gobby Gobelin gobelin gobernadora gobi Gobia Gobian gobiesocid Gobiesocidae gobiesociform Gobiesox gobiid Gobiidae gobiiform Gobiiformes Gobinism Gobinist Gobio gobioid Gobioidea Gobioidei goblet gobleted gobletful goblin gobline goblinesque goblinish goblinism goblinize goblinry gobmouthed gobo gobonated gobony gobstick goburra goby gobylike gocart Goclenian God god godchild Goddam Goddard goddard goddaughter godded goddess goddesshood goddessship goddikin goddize gode godet Godetia godfather godfatherhood godfathership Godforsaken Godfrey Godful godhead godhood Godiva godkin godless godlessly godlessness godlet godlike godlikeness godlily godliness godling godly godmaker godmaking godmamma godmother godmotherhood godmothership godown godpapa godparent Godsake godsend godship godson godsonship Godspeed Godward Godwin Godwinian godwit goeduck goel goelism Goemagot Goemot goer goes Goetae Goethian goetia goetic goetical goety goff goffer goffered gofferer goffering goffle gog gogga goggan goggle goggled goggler gogglers goggly goglet Gogo gogo Gohila goi goiabada Goidel Goidelic going goitcho goiter goitered goitral goitrogen goitrogenic goitrous Gokuraku gol gola golach goladar golandaas golandause Golaseccan Golconda Gold gold goldbeater goldbeating Goldbird goldbrick goldbricker goldbug goldcrest goldcup golden goldenback goldeneye goldenfleece goldenhair goldenknop goldenlocks goldenly Goldenmouth goldenmouthed goldenness goldenpert goldenrod goldenseal goldentop goldenwing golder goldfielder goldfinch goldfinny goldfish goldflower goldhammer goldhead Goldi Goldic goldie goldilocks goldin goldish goldless goldlike Goldonian goldseed goldsinny goldsmith goldsmithery goldsmithing goldspink goldstone goldtail goldtit goldwater goldweed goldwork goldworker Goldy goldy golee golem golf golfdom golfer Golgi Golgotha goli goliard goliardery goliardic Goliath goliath goliathize golkakra Goll golland gollar golliwogg golly Golo goloe golpe Goma gomari Gomarian Gomarist Gomarite gomart gomashta gomavel gombay gombeen gombeenism gombroon Gomeisa gomer gomeral gomlah gommelin Gomontia Gomorrhean Gomphocarpus gomphodont Gompholobium gomphosis Gomphrena gomuti gon Gona gonad gonadal gonadial gonadic gonadotropic gonadotropin gonaduct gonagra gonakie gonal gonalgia gonangial gonangium gonapod gonapophysal gonapophysial gonapophysis gonarthritis Gond gondang Gondi gondite gondola gondolet gondolier gone goneness goneoclinic gonepoiesis gonepoietic goner Goneril gonesome gonfalcon gonfalonier gonfalonierate gonfaloniership gonfanon gong gongman Gongoresque Gongorism Gongorist gongoristic gonia goniac gonial goniale Goniaster goniatite Goniatites goniatitic goniatitid Goniatitidae goniatitoid gonid gonidangium gonidia gonidial gonidic gonidiferous gonidiogenous gonidioid gonidiophore gonidiose gonidiospore gonidium gonimic gonimium gonimolobe gonimous goniocraniometry Goniodoridae Goniodorididae Goniodoris goniometer goniometric goniometrical goniometrically goniometry gonion Goniopholidae Goniopholis goniostat goniotropous gonitis Gonium gonium gonnardite gonne gonoblast gonoblastic gonoblastidial gonoblastidium gonocalycine gonocalyx gonocheme gonochorism gonochorismal gonochorismus gonochoristic gonococcal gonococcic gonococcoid gonococcus gonocoel gonocyte gonoecium Gonolobus gonomere gonomery gonophore gonophoric gonophorous gonoplasm gonopoietic gonorrhea gonorrheal gonorrheic gonosomal gonosome gonosphere gonostyle gonotheca gonothecal gonotokont gonotome gonotype gonozooid gony gonyalgia gonydeal gonydial gonyocele gonyoncus gonys Gonystylaceae gonystylaceous Gonystylus gonytheca Gonzalo goo goober good Goodenia Goodeniaceae goodeniaceous Goodenoviaceae goodhearted goodheartedly goodheartedness gooding goodish goodishness goodlihead goodlike goodliness goodly goodman goodmanship goodness goods goodsome goodwife goodwill goodwillit goodwilly goody goodyear Goodyera goodyish goodyism goodyness goodyship goof goofer goofily goofiness goofy googly googol googolplex googul gook gool goolah gools gooma goon goondie goonie Goop goosander goose goosebeak gooseberry goosebill goosebird goosebone gooseboy goosecap goosefish gooseflower goosefoot goosegirl goosegog gooseherd goosehouse gooselike goosemouth gooseneck goosenecked gooserumped goosery goosetongue gooseweed goosewing goosewinged goosish goosishly goosishness goosy gopher gopherberry gopherroot gopherwood gopura Gor gor gora goracco goral goran gorb gorbal gorbellied gorbelly gorbet gorble gorblimy gorce gorcock gorcrow Gordiacea gordiacean gordiaceous Gordian Gordiidae Gordioidea Gordius gordolobo Gordon Gordonia gordunite Gordyaean gore gorer gorevan gorfly gorge gorgeable gorged gorgedly gorgelet gorgeous gorgeously gorgeousness gorger gorgerin gorget gorgeted gorglin Gorgon Gorgonacea gorgonacean gorgonaceous gorgonesque gorgoneum Gorgonia Gorgoniacea gorgoniacean gorgoniaceous Gorgonian gorgonian gorgonin gorgonize gorgonlike Gorgonzola Gorgosaurus gorhen goric gorilla gorillaship gorillian gorilline gorilloid gorily goriness goring Gorkhali Gorkiesque gorlin gorlois gormandize gormandizer gormaw gormed gorra gorraf gorry gorse gorsebird gorsechat gorsedd gorsehatch gorsy Gortonian Gortonite gory gos gosain goschen gosh goshawk Goshen goshenite goslarite goslet gosling gosmore gospel gospeler gospelist gospelize gospellike gospelly gospelmonger gospelwards Gosplan gospodar gosport gossamer gossamered gossamery gossampine gossan gossaniferous gossard gossip gossipdom gossipee gossiper gossiphood gossipiness gossiping gossipingly gossipmonger gossipred gossipry gossipy gossoon gossy gossypine Gossypium gossypol gossypose got gotch gote Goth Gotha Gotham Gothamite Gothic Gothically Gothicism Gothicist Gothicity Gothicize Gothicizer Gothicness Gothish Gothism gothite Gothlander Gothonic Gotiglacial gotra gotraja gotten Gottfried Gottlieb gouaree Gouda Goudy gouge gouger goujon goulash goumi goup Goura gourami gourd gourde gourdful gourdhead gourdiness gourdlike gourdworm gourdy Gourinae gourmand gourmander gourmanderie gourmandism gourmet gourmetism gourounut goustrous gousty gout goutify goutily goutiness goutish goutte goutweed goutwort gouty gove govern governability governable governableness governably governail governance governess governessdom governesshood governessy governing governingly government governmental governmentalism governmentalist governmentalize governmentally governmentish governor governorate governorship gowan gowdnie gowf gowfer gowiddie gowk gowked gowkedly gowkedness gowkit gowl gown gownlet gownsman gowpen goy Goyana goyazite Goyetian goyim goyin goyle gozell gozzard gra Graafian grab grabbable grabber grabble grabbler grabbling grabbots graben grabhook grabouche Grace grace graceful gracefully gracefulness graceless gracelessly gracelessness gracelike gracer Gracilaria gracilariid Gracilariidae gracile gracileness gracilescent gracilis gracility graciosity gracioso gracious graciously graciousness grackle Graculus grad gradable gradal gradate gradation gradational gradationally gradationately gradative gradatively gradatory graddan grade graded gradefinder gradely grader Gradgrind gradgrind Gradgrindian Gradgrindish Gradgrindism gradient gradienter Gradientia gradin gradine grading gradiometer gradiometric gradometer gradual gradualism gradualist gradualistic graduality gradually gradualness graduand graduate graduated graduateship graduatical graduating graduation graduator gradus Graeae Graeculus Graeme graff graffage graffer Graffias graffito grafship graft graftage graftdom grafted grafter grafting graftonite graftproof Graham graham grahamite Graian grail grailer grailing grain grainage grained grainedness grainer grainering grainery grainfield graininess graining grainland grainless grainman grainsick grainsickness grainsman grainways grainy graip graisse graith Grallae Grallatores grallatorial grallatory grallic Grallina gralline gralloch gram grama gramarye gramashes grame gramenite gramicidin Graminaceae graminaceous Gramineae gramineal gramineous gramineousness graminicolous graminiferous graminifolious graminiform graminin graminivore graminivorous graminological graminology graminous grammalogue grammar grammarian grammarianism grammarless grammatic grammatical grammatically grammaticalness grammaticaster grammaticism grammaticize grammatics grammatist grammatistical grammatite grammatolator grammatolatry Grammatophyllum gramme Grammontine gramoches Gramophone gramophone gramophonic gramophonical gramophonically gramophonist gramp grampa grampus granada granadilla granadillo Granadine granage granary granate granatum granch grand grandam grandame grandaunt grandchild granddad granddaddy granddaughter granddaughterly grandee grandeeism grandeeship grandesque grandeur grandeval grandfather grandfatherhood grandfatherish grandfatherless grandfatherly grandfathership grandfer grandfilial grandiloquence grandiloquent grandiloquently grandiloquous grandiose grandiosely grandiosity grandisonant Grandisonian Grandisonianism grandisonous grandly grandma grandmaternal Grandmontine grandmother grandmotherhood grandmotherism grandmotherliness grandmotherly grandnephew grandness grandniece grandpa grandparent grandparentage grandparental grandpaternal grandsire grandson grandsonship grandstand grandstander granduncle grane grange granger grangerism grangerite grangerization grangerize grangerizer Grangousier graniform granilla granite granitelike graniteware granitic granitical graniticoline granitiferous granitification granitiform granitite granitization granitize granitoid granivore granivorous granjeno grank grannom granny grannybush grano granoblastic granodiorite granogabbro granolite granolith granolithic granomerite granophyre granophyric granose granospherite Grant grant grantable grantedly grantee granter Granth Grantha Grantia Grantiidae grantor granula granular granularity granularly granulary granulate granulated granulater granulation granulative granulator granule granulet granuliferous granuliform granulite granulitic granulitis granulitization granulitize granulize granuloadipose granulocyte granuloma granulomatous granulometric granulosa granulose granulous Granville granza granzita grape graped grapeflower grapefruit grapeful grapeless grapelet grapelike grapenuts graperoot grapery grapeshot grapeskin grapestalk grapestone grapevine grapewise grapewort graph graphalloy graphic graphical graphically graphicalness graphicly graphicness graphics Graphidiaceae Graphiola graphiological graphiologist graphiology Graphis graphite graphiter graphitic graphitization graphitize graphitoid graphitoidal Graphium graphologic graphological graphologist graphology graphomania graphomaniac graphometer graphometric graphometrical graphometry graphomotor Graphophone graphophone graphophonic graphorrhea graphoscope graphospasm graphostatic graphostatical graphostatics graphotype graphotypic graphy graping grapnel grappa grapple grappler grappling Grapsidae grapsoid Grapsus Grapta graptolite Graptolitha Graptolithida Graptolithina graptolitic Graptolitoidea Graptoloidea graptomancy grapy grasp graspable grasper grasping graspingly graspingness graspless grass grassant grassation grassbird grasschat grasscut grasscutter grassed grasser grasset grassflat grassflower grasshop grasshopper grasshopperdom grasshopperish grasshouse grassiness grassing grassland grassless grasslike grassman grassnut grassplot grassquit grasswards grassweed grasswidowhood grasswork grassworm grassy grat grate grateful gratefully gratefulness grateless grateman grater gratewise grather Gratia Gratiano graticulate graticulation graticule gratification gratified gratifiedly gratifier gratify gratifying gratifyingly gratility gratillity gratinate grating Gratiola gratiolin gratiosolin gratis gratitude gratten grattoir gratuitant gratuitous gratuitously gratuitousness gratuity gratulant gratulate gratulation gratulatorily gratulatory graupel gravamen gravamina grave graveclod gravecloth graveclothes graved gravedigger gravegarth gravel graveless gravelike graveling gravelish gravelliness gravelly gravelroot gravelstone gravelweed gravely gravemaker gravemaking graveman gravemaster graven graveness Gravenstein graveolence graveolency graveolent graver Graves graveship graveside gravestead gravestone graveward gravewards graveyard gravic gravicembalo gravid gravidity gravidly gravidness Gravigrada gravigrade gravimeter gravimetric gravimetrical gravimetrically gravimetry graving gravitate gravitater gravitation gravitational gravitationally gravitative gravitometer gravity gravure gravy grawls gray grayback graybeard graycoat grayfish grayfly grayhead grayish graylag grayling grayly graymalkin graymill grayness graypate graywacke grayware graywether grazable graze grazeable grazer grazier grazierdom graziery grazing grazingly grease greasebush greasehorn greaseless greaselessness greaseproof greaseproofness greaser greasewood greasily greasiness greasy great greatcoat greatcoated greaten greater greathead greatheart greathearted greatheartedness greatish greatly greatmouthed greatness greave greaved greaves grebe Grebo grece Grecian Grecianize Grecism Grecize Grecomania Grecomaniac Grecophil gree greed greedily greediness greedless greedsome greedy greedygut greedyguts Greek Greekdom Greekery Greekess Greekish Greekism Greekist Greekize Greekless Greekling green greenable greenage greenalite greenback Greenbacker Greenbackism greenbark greenbone greenbrier Greencloth greencoat greener greenery greeney greenfinch greenfish greengage greengill greengrocer greengrocery greenhead greenheaded greenheart greenhearted greenhew greenhide greenhood greenhorn greenhornism greenhouse greening greenish greenishness greenkeeper greenkeeping Greenland Greenlander Greenlandic Greenlandish greenlandite Greenlandman greenleek greenless greenlet greenling greenly greenness greenockite greenovite greenroom greensand greensauce greenshank greensick greensickness greenside greenstone greenstuff greensward greenswarded greentail greenth greenuk greenweed Greenwich greenwing greenwithe greenwood greenwort greeny greenyard greet greeter greeting greetingless greetingly greffier greffotome Greg gregal gregale gregaloid gregarian gregarianism Gregarina Gregarinae Gregarinaria gregarine Gregarinida gregarinidal gregariniform Gregarinina Gregarinoidea gregarinosis gregarinous gregarious gregariously gregariousness gregaritic grege Gregg Gregge greggle grego Gregor Gregorian Gregorianist Gregorianize Gregorianizer Gregory greige grein greisen gremial gremlin grenade Grenadian grenadier grenadierial grenadierly grenadiership grenadin grenadine Grendel Grenelle Gressoria gressorial gressorious Greta Gretchen Gretel greund Grevillea grew grewhound Grewia grey greyhound Greyiaceae greyly greyness gribble grice grid griddle griddlecake griddler gride gridelin gridiron griece grieced grief griefful grieffully griefless grieflessness grieshoch grievance grieve grieved grievedly griever grieveship grieving grievingly grievous grievously grievousness Griff griff griffade griffado griffaun griffe griffin griffinage griffinesque griffinhood griffinish griffinism Griffith griffithite Griffon griffon griffonage griffonne grift grifter grig griggles grignet grigri grihastha grihyasutra grike grill grillade grillage grille grilled griller grillroom grillwork grilse grim grimace grimacer grimacier grimacing grimacingly grimalkin grime grimful grimgribber grimily griminess grimliness grimly grimme Grimmia Grimmiaceae grimmiaceous grimmish grimness grimp grimy grin grinagog grinch grind grindable Grindelia grinder grinderman grindery grinding grindingly grindle grindstone gringo gringolee gringophobia Grinnellia grinner grinning grinningly grinny grintern grip gripe gripeful griper gripgrass griphite Griphosaurus griping gripingly gripless gripman gripment grippal grippe gripper grippiness gripping grippingly grippingness gripple grippleness grippotoxin grippy gripsack gripy Griqua griquaite Griqualander gris grisaille grisard Griselda griseous grisette grisettish grisgris griskin grisliness grisly Grison grison grisounite grisoutine Grissel grissens grissons grist gristbite grister Gristhorbia gristle gristliness gristly gristmill gristmiller gristmilling gristy grit grith grithbreach grithman gritless gritrock grits gritstone gritten gritter grittily grittiness grittle gritty grivet grivna Grizel Grizzel grizzle grizzled grizzler grizzly grizzlyman groan groaner groanful groaning groaningly groat groats groatsworth grobian grobianism grocer grocerdom groceress grocerly grocerwise grocery groceryman Groenendael groff grog groggery groggily grogginess groggy grogram grogshop groin groined groinery groining Grolier Grolieresque gromatic gromatics Gromia grommet gromwell groom groomer groomish groomishly groomlet groomling groomsman groomy groop groose groot grooty groove grooveless groovelike groover grooverhead grooviness grooving groovy grope groper groping gropingly gropple grorudite gros grosbeak groschen groser groset grosgrain grosgrained gross grossart grossen grosser grossification grossify grossly grossness grosso grossulaceous grossular Grossularia grossularia Grossulariaceae grossulariaceous grossularious grossularite grosz groszy grot grotesque grotesquely grotesqueness grotesquerie grothine grothite Grotian Grotianism grottesco grotto grottoed grottolike grottowork grouch grouchily grouchiness grouchingly grouchy grouf grough ground groundable groundably groundage groundberry groundbird grounded groundedly groundedness groundenell grounder groundflower grounding groundless groundlessly groundlessness groundliness groundling groundly groundman groundmass groundneedle groundnut groundplot grounds groundsel groundsill groundsman groundward groundwood groundwork groundy group groupage groupageness grouped grouper grouping groupist grouplet groupment groupwise grouse grouseberry grouseless grouser grouseward grousewards grousy grout grouter grouthead grouts grouty grouze grove groved grovel groveler groveless groveling grovelingly grovelings grovy grow growable growan growed grower growing growingly growingupness growl growler growlery growling growlingly growly grown grownup growse growsome growth growthful growthiness growthless growthy grozart grozet grr grub grubbed grubber grubbery grubbily grubbiness grubby grubhood grubless grubroot grubs grubstake grubstaker Grubstreet grubstreet grubworm grudge grudgeful grudgefully grudgekin grudgeless grudger grudgery grudging grudgingly grudgingness grudgment grue gruel grueler grueling gruelly Grues gruesome gruesomely gruesomeness gruff gruffily gruffiness gruffish gruffly gruffness gruffs gruffy grufted grugru Gruidae gruiform Gruiformes gruine Gruis grum grumble grumbler grumblesome Grumbletonian grumbling grumblingly grumbly grume Grumium grumly grummel grummels grummet grummeter grumness grumose grumous grumousness grump grumph grumphie grumphy grumpily grumpiness grumpish grumpy grun Grundified Grundlov grundy Grundyism Grundyist Grundyite grunerite gruneritization grunion grunt grunter Grunth grunting gruntingly gruntle gruntled gruntling Grus grush grushie Grusian Grusinian gruss grutch grutten gryde grylli gryllid Gryllidae gryllos Gryllotalpa Gryllus gryllus grypanian Gryphaea Gryphosaurus gryposis Grypotherium grysbok guaba guacacoa guachamaca guacharo guachipilin Guacho Guacico guacimo guacin guaco guaconize Guadagnini guadalcazarite Guaharibo Guahiban Guahibo Guahivo guaiac guaiacol guaiacolize guaiaconic guaiacum guaiaretic guaiasanol guaiol guaka Gualaca guama guan Guana guana guanabana guanabano guanaco guanajuatite guanamine guanase guanay Guanche guaneide guango guanidine guanidopropionic guaniferous guanine guanize guano guanophore guanosine guanyl guanylic guao guapena guapilla guapinol Guaque guar guara guarabu guaracha guaraguao guarana Guarani guarani Guaranian guaranine guarantee guaranteeship guarantor guarantorship guaranty guarapucu Guaraunan Guarauno guard guardable guardant guarded guardedly guardedness guardeen guarder guardfish guardful guardfully guardhouse guardian guardiancy guardianess guardianless guardianly guardianship guarding guardingly guardless guardlike guardo guardrail guardroom guardship guardsman guardstone Guarea guariba guarinite guarneri Guarnerius Guarnieri Guarrau guarri Guaruan guasa Guastalline guatambu Guatemalan Guatemaltecan guativere Guato Guatoan Guatusan Guatuso Guauaenok guava guavaberry guavina guayaba guayabi guayabo guayacan Guayaqui Guaycuru Guaycuruan Guaymie guayroto guayule guaza Guazuma gubbertush Gubbin gubbo gubernacula gubernacular gubernaculum gubernative gubernator gubernatorial gubernatrix guberniya gucki gud gudame guddle gude gudebrother gudefather gudemother gudesake gudesakes gudesire gudewife gudge gudgeon gudget gudok gue guebucu guejarite Guelph Guelphic Guelphish Guelphism guemal guenepe guenon guepard guerdon guerdonable guerdoner guerdonless guereza Guerickian Guerinet Guernsey guernsey guernseyed guerrilla guerrillaism guerrillaship Guesdism Guesdist guess guessable guesser guessing guessingly guesswork guessworker guest guestchamber guesten guester guesthouse guesting guestive guestless Guestling guestling guestmaster guestship guestwise Guetar Guetare gufa guff guffaw guffer guffin guffy gugal guggle gugglet guglet guglia guglio gugu Guha Guhayna guhr Guiana Guianan Guianese guib guiba guidable guidage guidance guide guideboard guidebook guidebookish guidecraft guideless guideline guidepost guider guideress guidership guideship guideway guidman Guido guidon Guidonian guidwilly guige Guignardia guignol guijo Guilandina guild guilder guildhall guildic guildry guildship guildsman guile guileful guilefully guilefulness guileless guilelessly guilelessness guilery guillemet guillemot Guillermo guillevat guilloche guillochee guillotinade guillotine guillotinement guillotiner guillotinism guillotinist guilt guiltily guiltiness guiltless guiltlessly guiltlessness guiltsick guilty guily guimbard guimpe Guinea guinea Guineaman Guinean Guinevere guipure Guisard guisard guise guiser Guisian guising guitar guitarfish guitarist guitermanite guitguit Guittonian Gujar Gujarati Gujrati gul gula gulae gulaman gulancha Gulanganes gular gularis gulch gulden guldengroschen gule gules Gulf gulf gulflike gulfside gulfwards gulfweed gulfy gulgul gulinula gulinulae gulinular gulix gull Gullah gullery gullet gulleting gullibility gullible gullibly gullion gullish gullishly gullishness gully gullyhole Gulo gulonic gulose gulosity gulp gulper gulpin gulping gulpingly gulpy gulravage gulsach Gum gum gumbo gumboil gumbotil gumby gumchewer gumdigger gumdigging gumdrop gumfield gumflower gumihan gumless gumlike gumly gumma gummage gummaker gummaking gummata gummatous gummed gummer gummiferous gumminess gumming gummite gummose gummosis gummosity gummous gummy gump gumphion gumption gumptionless gumptious gumpus gumshoe gumweed gumwood gun guna gunate gunation gunbearer gunboat gunbright gunbuilder guncotton gundi gundy gunebo gunfire gunflint gunge gunhouse Gunite gunite gunj gunk gunl gunless gunlock gunmaker gunmaking gunman gunmanship gunnage Gunnar gunne gunnel gunner Gunnera Gunneraceae gunneress gunnership gunnery gunnies gunning gunnung gunny gunocracy gunong gunpaper gunplay gunpowder gunpowderous gunpowdery gunpower gunrack gunreach gunrunner gunrunning gunsel gunshop gunshot gunsman gunsmith gunsmithery gunsmithing gunster gunstick gunstock gunstocker gunstocking gunstone Gunter gunter Gunther gunwale gunyah gunyang gunyeh Gunz Gunzian gup guppy guptavidya gur Guran gurdfish gurdle gurdwara gurge gurgeon gurgeons gurges gurgitation gurgle gurglet gurgling gurglingly gurgly gurgoyle gurgulation Gurian Guric Gurish Gurjara gurjun gurk Gurkha gurl gurly Gurmukhi gurnard gurnet gurnetty Gurneyite gurniad gurr gurrah gurry gurt guru guruship Gus gush gusher gushet gushily gushiness gushing gushingly gushingness gushy gusla gusle guss gusset Gussie gussie gust gustable gustation gustative gustativeness gustatory Gustavus gustful gustfully gustfulness gustily gustiness gustless gusto gustoish Gustus gusty gut Guti Gutium gutless gutlike gutling Gutnic Gutnish gutt gutta guttable guttate guttated guttatim guttation gutte gutter Guttera gutterblood guttering gutterlike gutterling gutterman guttersnipe guttersnipish gutterspout gutterwise guttery gutti guttide guttie Guttiferae guttiferal Guttiferales guttiferous guttiform guttiness guttle guttler guttula guttulae guttular guttulate guttule guttural gutturalism gutturality gutturalization gutturalize gutturally gutturalness gutturize gutturonasal gutturopalatal gutturopalatine gutturotetany guttus gutty gutweed gutwise gutwort guvacine guvacoline Guy guy Guyandot guydom guyer guytrash guz guze Guzmania guzmania Guzul guzzle guzzledom guzzler gwag gweduc gweed gweeon gwely Gwen Gwendolen gwine gwyniad Gyarung gyascutus Gyges Gygis gyle gym gymel gymkhana Gymnadenia Gymnadeniopsis Gymnanthes gymnanthous Gymnarchidae Gymnarchus gymnasia gymnasial gymnasiarch gymnasiarchy gymnasiast gymnasic gymnasium gymnast gymnastic gymnastically gymnastics gymnemic gymnetrous gymnic gymnical gymnics gymnite Gymnoblastea gymnoblastic Gymnocalycium gymnocarpic gymnocarpous Gymnocerata gymnoceratous gymnocidium Gymnocladus Gymnoconia Gymnoderinae Gymnodiniaceae gymnodiniaceous Gymnodiniidae Gymnodinium gymnodont Gymnodontes gymnogen gymnogenous Gymnoglossa gymnoglossate gymnogynous Gymnogyps Gymnolaema Gymnolaemata gymnolaematous Gymnonoti Gymnopaedes gymnopaedic gymnophiona gymnoplast Gymnorhina gymnorhinal Gymnorhininae gymnosoph gymnosophist gymnosophy gymnosperm Gymnospermae gymnospermal gymnospermic gymnospermism Gymnospermous gymnospermy Gymnosporangium gymnospore gymnosporous Gymnostomata Gymnostomina gymnostomous Gymnothorax gymnotid Gymnotidae Gymnotoka gymnotokous Gymnotus Gymnura gymnure Gymnurinae gymnurine gympie gyn gynaecea gynaeceum gynaecocoenic gynander gynandrarchic gynandrarchy Gynandria gynandria gynandrian gynandrism gynandroid gynandromorph gynandromorphic gynandromorphism gynandromorphous gynandromorphy gynandrophore gynandrosporous gynandrous gynandry gynantherous gynarchic gynarchy gyne gynecic gynecidal gynecide gynecocentric gynecocracy gynecocrat gynecocratic gynecocratical gynecoid gynecolatry gynecologic gynecological gynecologist gynecology gynecomania gynecomastia gynecomastism gynecomasty gynecomazia gynecomorphous gyneconitis gynecopathic gynecopathy gynecophore gynecophoric gynecophorous gynecotelic gynecratic gyneocracy gyneolater gyneolatry gynephobia Gynerium gynethusia gyniatrics gyniatry gynic gynics gynobase gynobaseous gynobasic gynocardia gynocardic gynocracy gynocratic gynodioecious gynodioeciously gynodioecism gynoecia gynoecium gynogenesis gynomonecious gynomonoeciously gynomonoecism gynophagite gynophore gynophoric gynosporangium gynospore gynostegia gynostegium gynostemium Gynura gyp Gypaetus gype gypper Gyppo Gyps gyps gypseian gypseous gypsiferous gypsine gypsiologist gypsite gypsography gypsologist gypsology Gypsophila gypsophila gypsophilous gypsophily gypsoplast gypsous gypster gypsum Gypsy gypsy gypsydom gypsyesque gypsyfy gypsyhead gypsyhood gypsyish gypsyism gypsylike gypsyry gypsyweed gypsywise gypsywort Gyracanthus gyral gyrally gyrant gyrate gyration gyrational gyrator gyratory gyre Gyrencephala gyrencephalate gyrencephalic gyrencephalous gyrene gyrfalcon gyri gyric gyrinid Gyrinidae Gyrinus gyro gyrocar gyroceracone gyroceran Gyroceras gyrochrome gyrocompass Gyrodactylidae Gyrodactylus gyrogonite gyrograph gyroidal gyroidally gyrolite gyrolith gyroma gyromagnetic gyromancy gyromele gyrometer Gyromitra gyron gyronny Gyrophora Gyrophoraceae Gyrophoraceous gyrophoric gyropigeon gyroplane gyroscope gyroscopic gyroscopically gyroscopics gyrose gyrostabilizer Gyrostachys gyrostat gyrostatic gyrostatically gyrostatics Gyrotheca gyrous gyrovagi gyrovagues gyrowheel gyrus gyte gytling gyve H h ha haab haaf Habab habanera Habbe habble habdalah Habe habeas habena habenal habenar Habenaria habendum habenula habenular haberdash haberdasher haberdasheress haberdashery haberdine habergeon habilable habilatory habile habiliment habilimentation habilimented habilitate habilitation habilitator hability habille Habiri Habiru habit habitability habitable habitableness habitably habitacle habitacule habitally habitan habitance habitancy habitant habitat habitate habitation habitational habitative habited habitual habituality habitualize habitually habitualness habituate habituation habitude habitudinal habitue habitus habnab haboob Habronema habronemiasis habronemic habu habutai habutaye hache Hachiman hachure hacienda hack hackamatak hackamore hackbarrow hackberry hackbolt hackbush hackbut hackbuteer hacked hackee hacker hackery hackin hacking hackingly hackle hackleback hackler hacklog hackly hackmack hackman hackmatack hackney hackneyed hackneyer hackneyism hackneyman hacksaw hacksilber hackster hackthorn hacktree hackwood hacky had Hadassah hadbot hadden haddie haddo haddock haddocker hade Hadean Hadendoa Hadendowa hadentomoid Hadentomoidea Hades Hadhramautian hading Hadith hadj Hadjemi hadji hadland Hadramautian hadrome Hadromerina hadromycosis hadrosaur Hadrosaurus haec haecceity Haeckelian Haeckelism haem Haemamoeba Haemanthus Haemaphysalis haemaspectroscope haematherm haemathermal haemathermous haematinon haematinum haematite Haematobranchia haematobranchiate Haematocrya haematocryal Haematophilina haematophiline Haematopus haematorrhachis haematosepsis Haematotherma haematothermal haematoxylic haematoxylin Haematoxylon haemoconcentration haemodilution Haemodoraceae haemodoraceous haemoglobin haemogram Haemogregarina Haemogregarinidae haemonchiasis haemonchosis Haemonchus haemony haemophile Haemoproteus haemorrhage haemorrhagia haemorrhagic haemorrhoid haemorrhoidal haemosporid Haemosporidia haemosporidian Haemosporidium Haemulidae haemuloid haeremai haet haff haffet haffkinize haffle Hafgan hafiz hafnium hafnyl haft hafter hag Haganah Hagarite hagberry hagboat hagborn hagbush hagdon hageen Hagenia hagfish haggada haggaday haggadic haggadical haggadist haggadistic haggard haggardly haggardness hagged hagger haggis haggish haggishly haggishness haggister haggle haggler haggly haggy hagi hagia hagiarchy hagiocracy Hagiographa hagiographal hagiographer hagiographic hagiographical hagiographist hagiography hagiolater hagiolatrous hagiolatry hagiologic hagiological hagiologist hagiology hagiophobia hagioscope hagioscopic haglet haglike haglin hagride hagrope hagseed hagship hagstone hagtaper hagweed hagworm hah Hahnemannian Hahnemannism Haiathalah Haida Haidan Haidee haidingerite Haiduk haik haikai haikal Haikh haikwan hail hailer hailproof hailse hailshot hailstone hailstorm hailweed haily Haimavati hain Hainai Hainan Hainanese hainberry haine hair hairband hairbeard hairbird hairbrain hairbreadth hairbrush haircloth haircut haircutter haircutting hairdo hairdress hairdresser hairdressing haire haired hairen hairhoof hairhound hairif hairiness hairlace hairless hairlessness hairlet hairline hairlock hairmeal hairmonger hairpin hairsplitter hairsplitting hairspring hairstone hairstreak hairtail hairup hairweed hairwood hairwork hairworm hairy Haisla Haithal Haitian haje hajib hajilij hak hakam hakdar hake Hakea hakeem hakenkreuz Hakenkreuzler hakim Hakka hako haku Hal hala halakah halakic halakist halakistic halal halalcor halation Halawi halazone halberd halberdier halberdman halberdsman halbert halch halcyon halcyonian halcyonic Halcyonidae Halcyoninae halcyonine Haldanite hale halebi Halecomorphi haleness Halenia haler halerz Halesia halesome half halfback halfbeak halfer halfheaded halfhearted halfheartedly halfheartedness halfling halfman halfness halfpace halfpaced halfpenny halfpennyworth halfway halfwise Haliaeetus halibios halibiotic halibiu halibut halibuter Halicarnassean Halicarnassian Halichondriae halichondrine halichondroid Halicore Halicoridae halide halidom halieutic halieutically halieutics Haligonian Halimeda halimous halinous haliographer haliography Haliotidae Haliotis haliotoid haliplankton haliplid Haliplidae Haliserites halisteresis halisteretic halite Halitheriidae Halitherium halitosis halituosity halituous halitus hall hallabaloo hallage hallah hallan hallanshaker hallebardier hallecret halleflinta halleflintoid hallel hallelujah hallelujatic hallex Halleyan halliblash halling hallman hallmark hallmarked hallmarker hallmoot halloo Hallopididae hallopodous Hallopus hallow Hallowday hallowed hallowedly hallowedness Halloween hallower Hallowmas Hallowtide halloysite Hallstatt Hallstattian hallucal hallucinate hallucination hallucinational hallucinative hallucinator hallucinatory hallucined hallucinosis hallux hallway halma halmalille halmawise halo Haloa Halobates halobios halobiotic halochromism halochromy Halocynthiidae haloesque halogen halogenate halogenation halogenoid halogenous Halogeton halohydrin haloid halolike halolimnic halomancy halometer halomorphic halophile halophilism halophilous halophyte halophytic halophytism Halopsyche Halopsychidae Haloragidaceae haloragidaceous Halosauridae Halosaurus haloscope Halosphaera halotrichite haloxene hals halse halsen halsfang halt halter halterbreak halteres Halteridium halterproof Haltica halting haltingly haltingness haltless halucket halukkah halurgist halurgy halutz halvaner halvans halve halved halvelings halver halves halyard Halysites ham hamacratic Hamadan hamadryad Hamal hamal hamald Hamamelidaceae hamamelidaceous Hamamelidanthemum hamamelidin Hamamelidoxylon hamamelin Hamamelis Hamamelites hamartiologist hamartiology hamartite hamate hamated Hamathite hamatum hambergite hamble hambroline hamburger hame hameil hamel Hamelia hamesucken hamewith hamfat hamfatter hami Hamidian Hamidieh hamiform Hamilton Hamiltonian Hamiltonianism Hamiltonism hamingja hamirostrate Hamital Hamite Hamites Hamitic Hamiticized Hamitism Hamitoid hamlah hamlet hamleted hamleteer hamletization hamletize hamlinite hammada hammam hammer hammerable hammerbird hammercloth hammerdress hammerer hammerfish hammerhead hammerheaded hammering hammeringly hammerkop hammerless hammerlike hammerman hammersmith hammerstone hammertoe hammerwise hammerwork hammerwort hammochrysos hammock hammy hamose hamous hamper hamperedly hamperedness hamperer hamperman Hampshire hamrongite hamsa hamshackle hamster hamstring hamular hamulate hamule Hamulites hamulose hamulus hamus hamza han Hanafi Hanafite hanaper hanaster Hanbalite hanbury hance hanced hanch hancockite hand handbag handball handballer handbank handbanker handbarrow handbill handblow handbolt handbook handbow handbreadth handcar handcart handclap handclasp handcloth handcraft handcraftman handcraftsman handcuff handed handedness Handelian hander handersome handfast handfasting handfastly handfastness handflower handful handgrasp handgravure handgrip handgriping handgun handhaving handhold handhole handicap handicapped handicapper handicraft handicraftship handicraftsman handicraftsmanship handicraftswoman handicuff handily handiness handistroke handiwork handkercher handkerchief handkerchiefful handlaid handle handleable handled handleless handler handless handlike handling handmade handmaid handmaiden handmaidenly handout handpost handprint handrail handrailing handreader handreading handsale handsaw handsbreadth handscrape handsel handseller handset handshake handshaker handshaking handsmooth handsome handsomeish handsomely handsomeness handspade handspike handspoke handspring handstaff handstand handstone handstroke handwear handwheel handwhile handwork handworkman handwrist handwrite handwriting handy handyblow handybook handygrip hangability hangable hangalai hangar hangbird hangby hangdog hange hangee hanger hangfire hangie hanging hangingly hangkang hangle hangman hangmanship hangment hangnail hangnest hangout hangul hangwoman hangworm hangworthy hanif hanifism hanifite hanifiya Hank hank hanker hankerer hankering hankeringly hankie hankle hanksite hanky hanna hannayite Hannibal Hannibalian Hannibalic Hano Hanoverian Hanoverianize Hanoverize Hans hansa Hansard Hansardization Hansardize Hanse hanse Hanseatic hansel hansgrave hansom hant hantle Hanukkah Hanuman hao haole haoma haori hap Hapale Hapalidae hapalote Hapalotis hapaxanthous haphazard haphazardly haphazardness haphtarah Hapi hapless haplessly haplessness haplite haplocaulescent haplochlamydeous Haplodoci Haplodon haplodont haplodonty haplography haploid haploidic haploidy haplolaly haplologic haplology haploma Haplomi haplomid haplomous haplont haploperistomic haploperistomous haplopetalous haplophase haplophyte haploscope haploscopic haplosis haplostemonous haplotype haply happen happening happenstance happier happiest happify happiless happily happiness happing happy hapten haptene haptenic haptere hapteron haptic haptics haptometer haptophor haptophoric haptophorous haptotropic haptotropically haptotropism hapu hapuku haqueton harakeke harangue harangueful haranguer Hararese Harari harass harassable harassedly harasser harassingly harassment haratch Haratin Haraya Harb harbergage harbi harbinge harbinger harbingership harbingery harbor harborage harborer harborless harborous harborside harborward hard hardanger hardback hardbake hardbeam hardberry harden hardenable Hardenbergia hardener hardening hardenite harder Harderian hardfern hardfist hardfisted hardfistedness hardhack hardhanded hardhandedness hardhead hardheaded hardheadedly hardheadedness hardhearted hardheartedly hardheartedness hardihood hardily hardim hardiment hardiness hardish hardishrew hardly hardmouth hardmouthed hardness hardock hardpan hardship hardstand hardstanding hardtack hardtail hardware hardwareman Hardwickia hardwood hardy hardystonite hare harebell harebottle harebrain harebrained harebrainedly harebrainedness harebur harefoot harefooted harehearted harehound Harelda harelike harelip harelipped harem haremism haremlik harengiform harfang haricot harigalds hariolate hariolation hariolize harish hark harka harl Harleian Harlemese Harlemite harlequin harlequina harlequinade harlequinery harlequinesque harlequinic harlequinism harlequinize harling harlock harlot harlotry harm Harmachis harmal harmala harmaline harman harmattan harmel harmer harmful harmfully harmfulness harmine harminic harmless harmlessly harmlessness Harmon harmonia harmoniacal harmonial harmonic harmonica harmonical harmonically harmonicalness harmonichord harmonici harmonicism harmonicon harmonics harmonious harmoniously harmoniousness harmoniphon harmoniphone harmonist harmonistic harmonistically Harmonite harmonium harmonizable harmonization harmonize harmonizer harmonogram harmonograph harmonometer harmony harmost harmotome harmotomic harmproof harn harness harnesser harnessry harnpan Harold harp Harpa harpago harpagon Harpagornis Harpalides Harpalinae Harpalus harper harperess Harpidae harpier harpings harpist harpless harplike Harpocrates harpoon harpooner Harporhynchus harpress harpsichord harpsichordist harpula Harpullia harpwaytuning harpwise Harpy Harpyia harpylike harquebus harquebusade harquebusier harr harrateen harridan harrier Harris Harrisia harrisite Harrovian harrow harrower harrowing harrowingly harrowingness harrowment Harry harry harsh harshen harshish harshly harshness harshweed harstigite hart hartal hartberry hartebeest hartin hartite Hartleian Hartleyan Hartmann Hartmannia Hartogia hartshorn hartstongue harttite Hartungen haruspex haruspical haruspicate haruspication haruspice haruspices haruspicy Harv Harvard Harvardian Harvardize Harveian harvest harvestbug harvester harvestless harvestman harvestry harvesttime Harvey Harveyize harzburgite hasan hasenpfeffer hash hashab hasher Hashimite hashish Hashiya hashy Hasidean Hasidic Hasidim Hasidism Hasinai hask Haskalah haskness hasky haslet haslock Hasmonaean hasp hassar hassel hassle hassock hassocky hasta hastate hastately hastati hastatolanceolate hastatosagittate haste hasteful hastefully hasteless hastelessness hasten hastener hasteproof haster hastilude hastily hastiness hastings hastingsite hastish hastler hasty hat hatable hatband hatbox hatbrim hatbrush hatch hatchability hatchable hatchel hatcheler hatcher hatchery hatcheryman hatchet hatchetback hatchetfish hatchetlike hatchetman hatchettine hatchettolite hatchety hatchgate hatching hatchling hatchman hatchment hatchminder hatchway hatchwayman hate hateable hateful hatefully hatefulness hateless hatelessness hater hatful hath hatherlite hathi Hathor Hathoric Hati Hatikvah hatless hatlessness hatlike hatmaker hatmaking hatpin hatrack hatrail hatred hatress hatstand hatt hatted Hattemist hatter Hatteria hattery Hatti Hattic Hattie hatting Hattism Hattize hattock Hatty hatty hau hauberget hauberk hauchecornite hauerite haugh haughland haught haughtily haughtiness haughtly haughtness haughtonite haughty haul haulabout haulage haulageway haulback hauld hauler haulier haulm haulmy haulster haunch haunched hauncher haunching haunchless haunchy haunt haunter hauntingly haunty Hauranitic hauriant haurient Hausa hause hausen hausmannite hausse Haussmannization Haussmannize haustellate haustellated haustellous haustellum haustement haustorial haustorium haustral haustrum hautboy hautboyist hauteur hauynite hauynophyre havage Havaiki Havaikian Havana Havanese have haveable haveage havel haveless havelock haven havenage havener havenership havenet havenful havenless havent havenward haver havercake haverel haverer havergrass havermeal havers haversack Haversian haversine havier havildar havingness havoc havocker haw Hawaiian hawaiite hawbuck hawcubite hawer hawfinch Hawiya hawk hawkbill hawkbit hawked hawker hawkery Hawkeye hawkie hawking hawkish hawklike hawknut hawkweed hawkwise hawky hawm hawok Haworthia hawse hawsehole hawseman hawsepiece hawsepipe hawser hawserwise hawthorn hawthorned hawthorny hay haya hayband haybird haybote haycap haycart haycock haydenite hayey hayfield hayfork haygrower haylift hayloft haymaker haymaking haymarket haymow hayrack hayrake hayraker hayrick hayseed haysel haystack haysuck haytime hayward hayweed haywire hayz Hazara hazard hazardable hazarder hazardful hazardize hazardless hazardous hazardously hazardousness hazardry haze Hazel hazel hazeled hazeless hazelly hazelnut hazelwood hazelwort hazen hazer hazily haziness hazing hazle haznadar hazy hazzan he head headache headachy headband headbander headboard headborough headcap headchair headcheese headchute headcloth headdress headed headender header headfirst headforemost headframe headful headgear headily headiness heading headkerchief headland headledge headless headlessness headlight headlighting headlike headline headliner headlock headlong headlongly headlongs headlongwise headman headmark headmaster headmasterly headmastership headmistress headmistressship headmold headmost headnote headpenny headphone headpiece headplate headpost headquarter headquarters headrace headrail headreach headrent headrest headright headring headroom headrope headsail headset headshake headship headsill headskin headsman headspring headstall headstand headstick headstock headstone headstream headstrong headstrongly headstrongness headwaiter headwall headward headwark headwater headway headwear headwork headworker headworking heady heaf heal healable heald healder healer healful healing healingly healless healsome healsomeness health healthcraft healthful healthfully healthfulness healthguard healthily healthiness healthless healthlessness healthsome healthsomely healthsomeness healthward healthy heap heaper heaps heapstead heapy hear hearable hearer hearing hearingless hearken hearkener hearsay hearse hearsecloth hearselike hearst heart heartache heartaching heartbeat heartbird heartblood heartbreak heartbreaker heartbreaking heartbreakingly heartbroken heartbrokenly heartbrokenness heartburn heartburning heartdeep heartease hearted heartedly heartedness hearten heartener heartening hearteningly heartfelt heartful heartfully heartfulness heartgrief hearth hearthless hearthman hearthpenny hearthrug hearthstead hearthstone hearthward hearthwarming heartikin heartily heartiness hearting heartland heartleaf heartless heartlessly heartlessness heartlet heartling heartly heartnut heartpea heartquake heartroot hearts heartscald heartsease heartseed heartsette heartsick heartsickening heartsickness heartsome heartsomely heartsomeness heartsore heartstring heartthrob heartward heartwater heartweed heartwise heartwood heartwort hearty heat heatable heatdrop heatedly heater heaterman heatful heath heathberry heathbird heathen heathendom heatheness heathenesse heathenhood heathenish heathenishly heathenishness heathenism heathenize heathenness heathenry heathenship Heather heather heathered heatheriness heathery heathless heathlike heathwort heathy heating heatingly heatless heatlike heatmaker heatmaking heatproof heatronic heatsman heatstroke heaume heaumer heautarit heautomorphism Heautontimorumenos heautophany heave heaveless heaven Heavenese heavenful heavenhood heavenish heavenishly heavenize heavenless heavenlike heavenliness heavenly heavens heavenward heavenwardly heavenwardness heavenwards heaver heavies heavily heaviness heaving heavisome heavity heavy heavyback heavyhanded heavyhandedness heavyheaded heavyhearted heavyheartedness heavyweight hebamic hebdomad hebdomadal hebdomadally hebdomadary hebdomader hebdomarian hebdomary hebeanthous hebecarpous hebecladous hebegynous hebenon hebeosteotomy hebepetalous hebephrenia hebephrenic hebetate hebetation hebetative hebete hebetic hebetomy hebetude hebetudinous Hebraean Hebraic Hebraica Hebraical Hebraically Hebraicize Hebraism Hebraist Hebraistic Hebraistical Hebraistically Hebraization Hebraize Hebraizer Hebrew Hebrewdom Hebrewess Hebrewism Hebrician Hebridean Hebronite hebronite hecastotheism Hecate Hecatean Hecatic Hecatine hecatomb Hecatombaeon hecatomped hecatompedon hecatonstylon hecatontarchy hecatontome hecatophyllous hech Hechtia heck heckelphone Heckerism heckimal heckle heckler hectare hecte hectic hectical hectically hecticly hecticness hectocotyl hectocotyle hectocotyliferous hectocotylization hectocotylize hectocotylus hectogram hectograph hectographic hectography hectoliter hectometer Hector hector Hectorean Hectorian hectoringly hectorism hectorly hectorship hectostere hectowatt heddle heddlemaker heddler hedebo hedenbergite Hedeoma heder Hedera hederaceous hederaceously hederated hederic hederiferous hederiform hederigerent hederin hederose hedge hedgeberry hedgeborn hedgebote hedgebreaker hedgehog hedgehoggy hedgehop hedgehopper hedgeless hedgemaker hedgemaking hedger hedgerow hedgesmith hedgeweed hedgewise hedgewood hedging hedgingly hedgy hedonic hedonical hedonically hedonics hedonism hedonist hedonistic hedonistically hedonology hedriophthalmous hedrocele hedrumite Hedychium hedyphane Hedysarum heed heeder heedful heedfully heedfulness heedily heediness heedless heedlessly heedlessness heedy heehaw heel heelball heelband heelcap heeled heeler heelgrip heelless heelmaker heelmaking heelpath heelpiece heelplate heelpost heelprint heelstrap heeltap heeltree heemraad heer heeze heezie heezy heft hefter heftily heftiness hefty hegari Hegelian Hegelianism Hegelianize Hegelizer hegemon hegemonic hegemonical hegemonist hegemonizer hegemony hegira hegumen hegumene Hehe hei heiau Heidi heifer heiferhood heigh heighday height heighten heightener heii Heikum Heiltsuk heimin Hein Heinesque Heinie heinous heinously heinousness Heinrich heintzite Heinz heir heirdom heiress heiressdom heiresshood heirless heirloom heirship heirskip heitiki Hejazi Hejazian hekteus helbeh helcoid helcology helcoplasty helcosis helcotic heldentenor helder Helderbergian hele Helen Helena helenin helenioid Helenium Helenus helepole Helge heliacal heliacally Heliaea heliaean Heliamphora Heliand helianthaceous Helianthemum helianthic helianthin Helianthium Helianthoidea Helianthoidean Helianthus heliast heliastic heliazophyte helical helically heliced helices helichryse helichrysum Helicidae heliciform helicin Helicina helicine Helicinidae helicitic helicline helicograph helicogyrate helicogyre helicoid helicoidal helicoidally helicometry helicon Heliconia Heliconian Heliconiidae Heliconiinae heliconist Heliconius helicoprotein helicopter helicorubin helicotrema Helicteres helictite helide Heligmus heling helio heliocentric heliocentrical heliocentrically heliocentricism heliocentricity heliochrome heliochromic heliochromoscope heliochromotype heliochromy helioculture heliodon heliodor helioelectric helioengraving heliofugal Heliogabalize Heliogabalus heliogram heliograph heliographer heliographic heliographical heliographically heliography heliogravure helioid heliolater heliolatrous heliolatry heliolite Heliolites heliolithic Heliolitidae heliologist heliology heliometer heliometric heliometrical heliometrically heliometry heliomicrometer Helion heliophilia heliophiliac heliophilous heliophobe heliophobia heliophobic heliophobous heliophotography heliophyllite heliophyte Heliopora Helioporidae Heliopsis heliopticon Heliornis Heliornithes Heliornithidae Helios helioscope helioscopic helioscopy heliosis heliostat heliostatic heliotactic heliotaxis heliotherapy heliothermometer Heliothis heliotrope heliotroper Heliotropiaceae heliotropian heliotropic heliotropical heliotropically heliotropine heliotropism Heliotropium heliotropy heliotype heliotypic heliotypically heliotypography heliotypy Heliozoa heliozoan heliozoic heliport Helipterum helispheric helispherical helium helix helizitic hell Helladian Helladic Helladotherium hellandite hellanodic hellbender hellborn hellbox hellbred hellbroth hellcat helldog helleboraceous helleboraster hellebore helleborein helleboric helleborin Helleborine helleborism Helleborus Hellelt Hellen Hellene Hellenian Hellenic Hellenically Hellenicism Hellenism Hellenist Hellenistic Hellenistical Hellenistically Hellenisticism Hellenization Hellenize Hellenizer Hellenocentric Hellenophile heller helleri Hellespont Hellespontine hellgrammite hellhag hellhole hellhound hellicat hellier hellion hellish hellishly hellishness hellkite hellness hello hellroot hellship helluo hellward hellweed helly helm helmage helmed helmet helmeted helmetlike helmetmaker helmetmaking Helmholtzian helminth helminthagogic helminthagogue Helminthes helminthiasis helminthic helminthism helminthite Helminthocladiaceae helminthoid helminthologic helminthological helminthologist helminthology helminthosporiose Helminthosporium helminthosporoid helminthous helmless helmsman helmsmanship helobious heloderm Heloderma Helodermatidae helodermatoid helodermatous helodes heloe heloma Helonias helonin helosis Helot helotage helotism helotize helotomy helotry help helpable helper helpful helpfully helpfulness helping helpingly helpless helplessly helplessness helply helpmate helpmeet helpsome helpworthy helsingkite helve helvell Helvella Helvellaceae helvellaceous Helvellales helvellic helver Helvetia Helvetian Helvetic Helvetii Helvidian helvite hem hemabarometer hemachate hemachrome hemachrosis hemacite hemad hemadrometer hemadrometry hemadromograph hemadromometer hemadynameter hemadynamic hemadynamics hemadynamometer hemafibrite hemagglutinate hemagglutination hemagglutinative hemagglutinin hemagogic hemagogue hemal hemalbumen hemamoeba hemangioma hemangiomatosis hemangiosarcoma hemaphein hemapod hemapodous hemapoiesis hemapoietic hemapophyseal hemapophysial hemapophysis hemarthrosis hemase hemaspectroscope hemastatics hematachometer hematachometry hematal hematein hematemesis hematemetic hematencephalon hematherapy hematherm hemathermal hemathermous hemathidrosis hematic hematid hematidrosis hematimeter hematin hematinic hematinometer hematinometric hematinuria hematite hematitic hematobic hematobious hematobium hematoblast hematobranchiate hematocatharsis hematocathartic hematocele hematochezia hematochrome hematochyluria hematoclasia hematoclasis hematocolpus hematocrit hematocryal hematocrystallin hematocyanin hematocyst hematocystis hematocyte hematocytoblast hematocytogenesis hematocytometer hematocytotripsis hematocytozoon hematocyturia hematodynamics hematodynamometer hematodystrophy hematogen hematogenesis hematogenetic hematogenic hematogenous hematoglobulin hematography hematohidrosis hematoid hematoidin hematolin hematolite hematological hematologist hematology hematolymphangioma hematolysis hematolytic hematoma hematomancy hematometer hematometra hematometry hematomphalocele hematomyelia hematomyelitis hematonephrosis hematonic hematopathology hematopericardium hematopexis hematophobia hematophyte hematoplast hematoplastic hematopoiesis hematopoietic hematoporphyrin hematoporphyrinuria hematorrhachis hematorrhea hematosalpinx hematoscope hematoscopy hematose hematosepsis hematosin hematosis hematospectrophotometer hematospectroscope hematospermatocele hematospermia hematostibiite hematotherapy hematothermal hematothorax hematoxic hematozoal hematozoan hematozoic hematozoon hematozymosis hematozymotic hematuresis hematuria hematuric hemautogram hemautograph hemautographic hemautography heme hemellitene hemellitic hemelytral hemelytron hemen hemera hemeralope hemeralopia hemeralopic Hemerobaptism Hemerobaptist Hemerobian Hemerobiid Hemerobiidae Hemerobius Hemerocallis hemerologium hemerology hemerythrin hemiablepsia hemiacetal hemiachromatopsia hemiageusia hemiageustia hemialbumin hemialbumose hemialbumosuria hemialgia hemiamaurosis hemiamb hemiamblyopia hemiamyosthenia hemianacusia hemianalgesia hemianatropous hemianesthesia hemianopia hemianopic hemianopsia hemianoptic hemianosmia hemiapraxia Hemiascales Hemiasci Hemiascomycetes hemiasynergia hemiataxia hemiataxy hemiathetosis hemiatrophy hemiazygous Hemibasidiales Hemibasidii Hemibasidiomycetes hemibasidium hemibathybian hemibenthic hemibenthonic hemibranch hemibranchiate Hemibranchii hemic hemicanities hemicardia hemicardiac hemicarp hemicatalepsy hemicataleptic hemicellulose hemicentrum hemicephalous hemicerebrum Hemichorda hemichordate hemichorea hemichromatopsia hemicircle hemicircular hemiclastic hemicollin hemicrane hemicrania hemicranic hemicrany hemicrystalline hemicycle hemicyclic hemicyclium hemicylindrical hemidactylous Hemidactylus hemidemisemiquaver hemidiapente hemidiaphoresis hemiditone hemidomatic hemidome hemidrachm hemidysergia hemidysesthesia hemidystrophy hemiekton hemielliptic hemiepilepsy hemifacial hemiform Hemigale Hemigalus Hemiganus hemigastrectomy hemigeusia hemiglossal hemiglossitis hemiglyph hemignathous hemihdry hemihedral hemihedrally hemihedric hemihedrism hemihedron hemiholohedral hemihydrate hemihydrated hemihydrosis hemihypalgesia hemihyperesthesia hemihyperidrosis hemihypertonia hemihypertrophy hemihypesthesia hemihypoesthesia hemihypotonia hemikaryon hemikaryotic hemilaminectomy hemilaryngectomy Hemileia hemilethargy hemiligulate hemilingual hemimellitene hemimellitic hemimelus Hemimeridae Hemimerus Hemimetabola hemimetabole hemimetabolic hemimetabolism hemimetabolous hemimetaboly hemimetamorphic hemimetamorphosis hemimetamorphous hemimorph hemimorphic hemimorphism hemimorphite hemimorphy Hemimyaria hemin hemina hemine heminee hemineurasthenia hemiobol hemiolia hemiolic hemionus hemiope hemiopia hemiopic hemiorthotype hemiparalysis hemiparanesthesia hemiparaplegia hemiparasite hemiparasitic hemiparasitism hemiparesis hemiparesthesia hemiparetic hemipenis hemipeptone hemiphrase hemipic hemipinnate hemiplane hemiplankton hemiplegia hemiplegic hemiplegy hemipodan hemipode Hemipodii Hemipodius hemiprism hemiprismatic hemiprotein hemipter Hemiptera hemipteral hemipteran hemipteroid hemipterological hemipterology hemipteron hemipterous hemipyramid hemiquinonoid hemiramph Hemiramphidae Hemiramphinae hemiramphine Hemiramphus hemisaprophyte hemisaprophytic hemiscotosis hemisect hemisection hemispasm hemispheral hemisphere hemisphered hemispherical hemispherically hemispheroid hemispheroidal hemispherule hemistater hemistich hemistichal hemistrumectomy hemisymmetrical hemisymmetry hemisystole hemiterata hemiteratic hemiteratics hemiteria hemiterpene hemitery hemithyroidectomy hemitone hemitremor hemitrichous hemitriglyph hemitropal hemitrope hemitropic hemitropism hemitropous hemitropy hemitype hemitypic hemivagotony heml hemlock hemmel hemmer hemoalkalimeter hemoblast hemochromatosis hemochrome hemochromogen hemochromometer hemochromometry hemoclasia hemoclasis hemoclastic hemocoel hemocoele hemocoelic hemocoelom hemoconcentration hemoconia hemoconiosis hemocry hemocrystallin hemoculture hemocyanin hemocyte hemocytoblast hemocytogenesis hemocytolysis hemocytometer hemocytotripsis hemocytozoon hemocyturia hemodiagnosis hemodilution hemodrometer hemodrometry hemodromograph hemodromometer hemodynameter hemodynamic hemodynamics hemodystrophy hemoerythrin hemoflagellate hemofuscin hemogastric hemogenesis hemogenetic hemogenic hemogenous hemoglobic hemoglobin hemoglobinemia hemoglobiniferous hemoglobinocholia hemoglobinometer hemoglobinophilic hemoglobinous hemoglobinuria hemoglobinuric hemoglobulin hemogram hemogregarine hemoid hemokonia hemokoniosis hemol hemoleucocyte hemoleucocytic hemologist hemology hemolymph hemolymphatic hemolysin hemolysis hemolytic hemolyze hemomanometer hemometer hemometry hemonephrosis hemopathology hemopathy hemopericardium hemoperitoneum hemopexis hemophage hemophagia hemophagocyte hemophagocytosis hemophagous hemophagy hemophile Hemophileae hemophilia hemophiliac hemophilic Hemophilus hemophobia hemophthalmia hemophthisis hemopiezometer hemoplasmodium hemoplastic hemopneumothorax hemopod hemopoiesis hemopoietic hemoproctia hemoptoe hemoptysis hemopyrrole hemorrhage hemorrhagic hemorrhagin hemorrhea hemorrhodin hemorrhoid hemorrhoidal hemorrhoidectomy hemosalpinx hemoscope hemoscopy hemosiderin hemosiderosis hemospasia hemospastic hemospermia hemosporid hemosporidian hemostasia hemostasis hemostat hemostatic hemotachometer hemotherapeutics hemotherapy hemothorax hemotoxic hemotoxin hemotrophe hemotropic hemozoon hemp hempbush hempen hemplike hempseed hempstring hempweed hempwort hempy hemstitch hemstitcher hen henad henbane henbill henbit hence henceforth henceforward henceforwards henchboy henchman henchmanship hencoop hencote hend hendecacolic hendecagon hendecagonal hendecahedron hendecane hendecasemic hendecasyllabic hendecasyllable hendecatoic hendecoic hendecyl hendiadys hendly hendness heneicosane henequen henfish henhearted henhouse henhussy henism henlike henmoldy henna Hennebique hennery hennin hennish henny henogeny henotheism henotheist henotheistic henotic henpeck henpen Henrician Henrietta henroost Henry henry hent Hentenian henter hentriacontane henware henwife henwise henwoodite henyard heortological heortologion heortology hep hepar heparin heparinize hepatalgia hepatatrophia hepatatrophy hepatauxe hepatectomy hepatic Hepatica hepatica Hepaticae hepatical hepaticoduodenostomy hepaticoenterostomy hepaticogastrostomy hepaticologist hepaticology hepaticopulmonary hepaticostomy hepaticotomy hepatite hepatitis hepatization hepatize hepatocele hepatocirrhosis hepatocolic hepatocystic hepatoduodenal hepatoduodenostomy hepatodynia hepatodysentery hepatoenteric hepatoflavin hepatogastric hepatogenic hepatogenous hepatography hepatoid hepatolenticular hepatolith hepatolithiasis hepatolithic hepatological hepatologist hepatology hepatolysis hepatolytic hepatoma hepatomalacia hepatomegalia hepatomegaly hepatomelanosis hepatonephric hepatopathy hepatoperitonitis hepatopexia hepatopexy hepatophlebitis hepatophlebotomy hepatophyma hepatopneumonic hepatoportal hepatoptosia hepatoptosis hepatopulmonary hepatorenal hepatorrhagia hepatorrhaphy hepatorrhea hepatorrhexis hepatorrhoea hepatoscopy hepatostomy hepatotherapy hepatotomy hepatotoxemia hepatoumbilical hepcat Hephaesteum Hephaestian Hephaestic Hephaestus hephthemimer hephthemimeral hepialid Hepialidae Hepialus heppen hepper heptacapsular heptace heptachord heptachronous heptacolic heptacosane heptad heptadecane heptadecyl heptaglot heptagon heptagonal heptagynous heptahedral heptahedrical heptahedron heptahexahedral heptahydrate heptahydrated heptahydric heptahydroxy heptal heptameride Heptameron heptamerous heptameter heptamethylene heptametrical heptanaphthene Heptanchus heptandrous heptane Heptanesian heptangular heptanoic heptanone heptapetalous heptaphyllous heptaploid heptaploidy heptapodic heptapody heptarch heptarchal heptarchic heptarchical heptarchist heptarchy heptasemic heptasepalous heptaspermous heptastich heptastrophic heptastylar heptastyle heptasulphide heptasyllabic Heptateuch heptatomic heptatonic Heptatrema heptavalent heptene hepteris heptine heptite heptitol heptoic heptorite heptose heptoxide Heptranchias heptyl heptylene heptylic heptyne her Heraclean Heracleidan Heracleonite Heracleopolitan Heracleopolite Heracleum Heraclid Heraclidae Heraclidan Heraclitean Heracliteanism Heraclitic Heraclitical Heraclitism Herakles herald heraldess heraldic heraldical heraldically heraldist heraldize heraldress heraldry heraldship herapathite Herat Herb herb herbaceous herbaceously herbage herbaged herbager herbagious herbal herbalism herbalist herbalize herbane herbaria herbarial herbarian herbarism herbarist herbarium herbarize Herbartian Herbartianism herbary Herbert herbescent herbicidal herbicide herbicolous herbiferous herbish herbist Herbivora herbivore herbivority herbivorous herbless herblet herblike herbman herborist herborization herborize herborizer herbose herbosity herbous herbwife herbwoman herby hercogamous hercogamy Herculanean Herculanensian Herculanian Herculean Hercules Herculid Hercynian hercynite herd herdbook herdboy herder herderite herdic herding herdship herdsman herdswoman herdwick here hereabout hereadays hereafter hereafterward hereamong hereat hereaway hereaways herebefore hereby heredipetous heredipety hereditability hereditable hereditably hereditament hereditarian hereditarianism hereditarily hereditariness hereditarist hereditary hereditation hereditative hereditism hereditist hereditivity heredity heredium heredofamilial heredolues heredoluetic heredosyphilis heredosyphilitic heredosyphilogy heredotuberculosis Hereford herefrom heregeld herein hereinabove hereinafter hereinbefore hereinto herem hereness hereniging hereof hereon hereright Herero heresiarch heresimach heresiographer heresiography heresiologer heresiologist heresiology heresy heresyphobia heresyproof heretic heretical heretically hereticalness hereticate heretication hereticator hereticide hereticize hereto heretoch heretofore heretoforetime heretoga heretrix hereunder hereunto hereupon hereward herewith herewithal herile heriot heriotable herisson heritability heritable heritably heritage heritance Heritiera heritor heritress heritrix herl herling herma hermaean hermaic Herman hermaphrodite hermaphroditic hermaphroditical hermaphroditically hermaphroditish hermaphroditism hermaphroditize Hermaphroditus hermeneut hermeneutic hermeneutical hermeneutically hermeneutics hermeneutist Hermes Hermesian Hermesianism Hermetic hermetic hermetical hermetically hermeticism Hermetics Hermetism Hermetist hermidin Herminone Hermione Hermit hermit hermitage hermitary hermitess hermitic hermitical hermitically hermitish hermitism hermitize hermitry hermitship Hermo hermodact hermodactyl Hermogenian hermoglyphic hermoglyphist hermokopid hern Hernandia Hernandiaceae hernandiaceous hernanesell hernani hernant herne hernia hernial Herniaria herniarin herniary herniate herniated herniation hernioenterotomy hernioid herniology herniopuncture herniorrhaphy herniotome herniotomist herniotomy hero heroarchy Herodian herodian Herodianic Herodii Herodiones herodionine heroess herohead herohood heroic heroical heroically heroicalness heroicity heroicly heroicness heroicomic heroicomical heroid Heroides heroify Heroin heroin heroine heroineship heroinism heroinize heroism heroistic heroization heroize herolike heromonger heron heroner heronite heronry heroogony heroologist heroology Herophile Herophilist heroship herotheism herpes Herpestes Herpestinae herpestine herpetic herpetiform herpetism herpetography herpetoid herpetologic herpetological herpetologically herpetologist herpetology herpetomonad Herpetomonas herpetophobia herpetotomist herpetotomy herpolhode Herpotrichia herrengrundite Herrenvolk herring herringbone herringer Herrnhuter hers Herschelian herschelite herse hersed herself hership hersir hertz hertzian Heruli Herulian Hervati Herve Herzegovinian Hesiodic Hesione Hesionidae hesitance hesitancy hesitant hesitantly hesitate hesitater hesitating hesitatingly hesitatingness hesitation hesitative hesitatively hesitatory Hesper Hespera Hesperia Hesperian Hesperic Hesperid hesperid hesperidate hesperidene hesperideous Hesperides Hesperidian hesperidin hesperidium hesperiid Hesperiidae hesperinon Hesperis hesperitin Hesperornis Hesperornithes hesperornithid Hesperornithiformes hesperornithoid Hesperus Hessian hessite hessonite hest Hester hestern hesternal Hesther hesthogenous Hesychasm Hesychast hesychastic het hetaera hetaeria hetaeric hetaerism Hetaerist hetaerist hetaeristic hetaerocracy hetaerolite hetaery heteradenia heteradenic heterakid Heterakis Heteralocha heterandrous heterandry heteratomic heterauxesis heteraxial heteric heterically hetericism hetericist heterism heterization heterize hetero heteroagglutinin heteroalbumose heteroauxin heteroblastic heteroblastically heteroblasty heterocarpism heterocarpous Heterocarpus heterocaseose heterocellular heterocentric heterocephalous Heterocera heterocerc heterocercal heterocercality heterocercy heterocerous heterochiral heterochlamydeous Heterochloridales heterochromatic heterochromatin heterochromatism heterochromatization heterochromatized heterochrome heterochromia heterochromic heterochromosome heterochromous heterochromy heterochronic heterochronism heterochronistic heterochronous heterochrony heterochrosis heterochthon heterochthonous heterocline heteroclinous heteroclital heteroclite heteroclitica heteroclitous Heterocoela heterocoelous Heterocotylea heterocycle heterocyclic heterocyst heterocystous heterodactyl Heterodactylae heterodactylous Heterodera Heterodon heterodont Heterodonta Heterodontidae heterodontism heterodontoid Heterodontus heterodox heterodoxal heterodoxical heterodoxly heterodoxness heterodoxy heterodromous heterodromy heterodyne heteroecious heteroeciously heteroeciousness heteroecism heteroecismal heteroecy heteroepic heteroepy heteroerotic heteroerotism heterofermentative heterofertilization heterogalactic heterogamete heterogametic heterogametism heterogamety heterogamic heterogamous heterogamy heterogangliate heterogen heterogene heterogeneal heterogenean heterogeneity heterogeneous heterogeneously heterogeneousness heterogenesis heterogenetic heterogenic heterogenicity heterogenist heterogenous heterogeny heteroglobulose heterognath Heterognathi heterogone heterogonism heterogonous heterogonously heterogony heterograft heterographic heterographical heterography Heterogyna heterogynal heterogynous heteroicous heteroimmune heteroinfection heteroinoculable heteroinoculation heterointoxication heterokaryon heterokaryosis heterokaryotic heterokinesis heterokinetic Heterokontae heterokontan heterolalia heterolateral heterolecithal heterolith heterolobous heterologic heterological heterologically heterologous heterology heterolysin heterolysis heterolytic heteromallous heteromastigate heteromastigote Heteromeles Heteromera heteromeral Heteromeran Heteromeri heteromeric heteromerous Heterometabola heterometabole heterometabolic heterometabolism heterometabolous heterometaboly heterometric Heteromi Heteromita Heteromorpha Heteromorphae heteromorphic heteromorphism heteromorphite heteromorphosis heteromorphous heteromorphy Heteromya Heteromyaria heteromyarian Heteromyidae Heteromys heteronereid heteronereis Heteroneura heteronomous heteronomously heteronomy heteronuclear heteronym heteronymic heteronymous heteronymously heteronymy heteroousia Heteroousian heteroousian Heteroousiast heteroousious heteropathic heteropathy heteropelmous heteropetalous Heterophaga Heterophagi heterophagous heterophasia heterophemism heterophemist heterophemistic heterophemize heterophemy heterophile heterophoria heterophoric heterophylesis heterophyletic heterophyllous heterophylly heterophyly heterophyte heterophytic Heteropia Heteropidae heteroplasia heteroplasm heteroplastic heteroplasty heteroploid heteroploidy heteropod Heteropoda heteropodal heteropodous heteropolar heteropolarity heteropoly heteroproteide heteroproteose heteropter Heteroptera heteropterous heteroptics heteropycnosis Heterorhachis heteroscope heteroscopy heterosexual heterosexuality heteroside Heterosiphonales heterosis Heterosomata Heterosomati heterosomatous heterosome Heterosomi heterosomous Heterosporeae heterosporic Heterosporium heterosporous heterospory heterostatic heterostemonous Heterostraca heterostracan Heterostraci heterostrophic heterostrophous heterostrophy heterostyled heterostylism heterostylous heterostyly heterosuggestion heterosyllabic heterotactic heterotactous heterotaxia heterotaxic heterotaxis heterotaxy heterotelic heterothallic heterothallism heterothermal heterothermic heterotic heterotopia heterotopic heterotopism heterotopous heterotopy heterotransplant heterotransplantation heterotrich Heterotricha Heterotrichales Heterotrichida heterotrichosis heterotrichous heterotropal heterotroph heterotrophic heterotrophy heterotropia heterotropic heterotropous heterotype heterotypic heterotypical heteroxanthine heteroxenous heterozetesis heterozygosis heterozygosity heterozygote heterozygotic heterozygous heterozygousness hething hetman hetmanate hetmanship hetter hetterly Hettie Hetty heuau Heuchera heugh heulandite heumite heuretic heuristic heuristically Hevea hevi hew hewable hewel hewer hewettite hewhall hewn hewt hex hexa hexabasic Hexabiblos hexabiose hexabromide hexacanth hexacanthous hexacapsular hexacarbon hexace hexachloride hexachlorocyclohexane hexachloroethane hexachord hexachronous hexacid hexacolic Hexacoralla hexacorallan Hexacorallia hexacosane hexacosihedroid hexact hexactinal hexactine hexactinellid Hexactinellida hexactinellidan hexactinelline hexactinian hexacyclic hexad hexadactyle hexadactylic hexadactylism hexadactylous hexadactyly hexadecahedroid hexadecane hexadecanoic hexadecene hexadecyl hexadic hexadiene hexadiyne hexafoil hexaglot hexagon hexagonal hexagonally hexagonial hexagonical hexagonous hexagram Hexagrammidae hexagrammoid Hexagrammos hexagyn Hexagynia hexagynian hexagynous hexahedral hexahedron hexahydrate hexahydrated hexahydric hexahydride hexahydrite hexahydrobenzene hexahydroxy hexakisoctahedron hexakistetrahedron hexameral hexameric hexamerism hexameron hexamerous hexameter hexamethylenamine hexamethylene hexamethylenetetramine hexametral hexametric hexametrical hexametrist hexametrize hexametrographer Hexamita hexamitiasis hexammine hexammino hexanaphthene Hexanchidae Hexanchus Hexandria hexandric hexandrous hexandry hexane hexanedione hexangular hexangularly hexanitrate hexanitrodiphenylamine hexapartite hexaped hexapetaloid hexapetaloideous hexapetalous hexaphyllous hexapla hexaplar hexaplarian hexaplaric hexaploid hexaploidy hexapod Hexapoda hexapodal hexapodan hexapodous hexapody hexapterous hexaradial hexarch hexarchy hexaseme hexasemic hexasepalous hexaspermous hexastemonous hexaster hexastich hexastichic hexastichon hexastichous hexastichy hexastigm hexastylar hexastyle hexastylos hexasulphide hexasyllabic hexatetrahedron Hexateuch Hexateuchal hexathlon hexatomic hexatriacontane hexatriose hexavalent hexecontane hexenbesen hexene hexer hexerei hexeris hexestrol hexicological hexicology hexine hexiological hexiology hexis hexitol hexoctahedral hexoctahedron hexode hexoestrol hexogen hexoic hexokinase hexone hexonic hexosamine hexosaminic hexosan hexose hexosediphosphoric hexosemonophosphoric hexosephosphatase hexosephosphoric hexoylene hexpartite hexyl hexylene hexylic hexylresorcinol hexyne hey heyday Hezron Hezronites hi hia Hianakoto hiant hiatal hiate hiation hiatus Hibbertia hibbin hibernacle hibernacular hibernaculum hibernal hibernate hibernation hibernator Hibernia Hibernian Hibernianism Hibernic Hibernical Hibernically Hibernicism Hibernicize Hibernization Hibernize Hibernologist Hibernology Hibiscus Hibito Hibitos Hibunci hic hicatee hiccup hick hickey hickory Hicksite hickwall Hicoria hidable hidage hidalgism hidalgo hidalgoism hidated hidation Hidatsa hidden hiddenite hiddenly hiddenmost hiddenness hide hideaway hidebind hidebound hideboundness hided hideland hideless hideling hideosity hideous hideously hideousness hider hidling hidlings hidradenitis hidrocystoma hidromancy hidropoiesis hidrosis hidrotic hie hieder hielaman hield hielmite hiemal hiemation Hienz Hieracian Hieracium hieracosphinx hierapicra hierarch hierarchal hierarchic hierarchical hierarchically hierarchism hierarchist hierarchize hierarchy hieratic hieratical hieratically hieraticism hieratite Hierochloe hierocracy hierocratic hierocratical hierodule hierodulic Hierofalco hierogamy hieroglyph hieroglypher hieroglyphic hieroglyphical hieroglyphically hieroglyphist hieroglyphize hieroglyphology hieroglyphy hierogram hierogrammat hierogrammate hierogrammateus hierogrammatic hierogrammatical hierogrammatist hierograph hierographer hierographic hierographical hierography hierolatry hierologic hierological hierologist hierology hieromachy hieromancy hieromnemon hieromonach hieron Hieronymic Hieronymite hieropathic hierophancy hierophant hierophantes hierophantic hierophantically hierophanticly hieros hieroscopy Hierosolymitan Hierosolymite hierurgical hierurgy hifalutin higdon higgaion higginsite higgle higglehaggle higgler higglery high highball highbelia highbinder highborn highboy highbred higher highermost highest highfalutin highfaluting highfalutinism highflying highhanded highhandedly highhandedness highhearted highheartedly highheartedness highish highjack highjacker highland highlander highlandish Highlandman Highlandry highlight highliving highly highman highmoor highmost highness highroad hight hightoby hightop highway highwayman higuero hijack hike hiker Hilaria hilarious hilariously hilariousness hilarity Hilary Hilarymas Hilarytide hilasmic hilch Hilda Hildebrand Hildebrandian Hildebrandic Hildebrandine Hildebrandism Hildebrandist Hildebrandslied Hildegarde hilding hiliferous hill Hillary hillberry hillbilly hillculture hillebrandite Hillel hiller hillet Hillhousia hilliness hillman hillock hillocked hillocky hillsale hillsalesman hillside hillsman hilltop hilltrot hillward hillwoman hilly hilsa hilt hiltless hilum hilus him Hima Himalaya Himalayan Himantopus himation Himawan himp himself himward himwards Himyaric Himyarite Himyaritic hin hinau Hinayana hinch hind hindberry hindbrain hindcast hinddeck hinder hinderance hinderer hinderest hinderful hinderfully hinderingly hinderlands hinderlings hinderlins hinderly hinderment hindermost hindersome hindhand hindhead Hindi hindmost hindquarter hindrance hindsaddle hindsight Hindu Hinduism Hinduize Hindustani hindward hing hinge hingecorner hingeflower hingeless hingelike hinger hingeways hingle hinney hinnible Hinnites hinny hinoid hinoideous hinoki hinsdalite hint hintedly hinter hinterland hintingly hintproof hintzeite Hiodon hiodont Hiodontidae hiortdahlite hip hipbone hipe hiper hiphalt hipless hipmold Hippa hippalectryon hipparch Hipparion Hippeastrum hipped Hippelates hippen Hippia hippian hippiater hippiatric hippiatrical hippiatrics hippiatrist hippiatry hippic Hippidae Hippidion Hippidium hipping hippish hipple hippo Hippobosca hippoboscid Hippoboscidae hippocamp hippocampal hippocampi hippocampine hippocampus Hippocastanaceae hippocastanaceous hippocaust hippocentaur hippocentauric hippocerf hippocoprosterol hippocras Hippocratea Hippocrateaceae hippocrateaceous Hippocratian Hippocratic Hippocratical Hippocratism Hippocrene Hippocrenian hippocrepian hippocrepiform Hippodamia hippodamous hippodrome hippodromic hippodromist hippogastronomy Hippoglosinae Hippoglossidae Hippoglossus hippogriff hippogriffin hippoid hippolite hippolith hippological hippologist hippology Hippolytan Hippolyte Hippolytidae Hippolytus hippomachy hippomancy hippomanes Hippomedon hippomelanin Hippomenes hippometer hippometric hippometry Hipponactean hipponosological hipponosology hippopathological hippopathology hippophagi hippophagism hippophagist hippophagistical hippophagous hippophagy hippophile hippophobia hippopod hippopotami hippopotamian hippopotamic Hippopotamidae hippopotamine hippopotamoid hippopotamus Hipposelinum hippotigrine Hippotigris hippotomical hippotomist hippotomy hippotragine Hippotragus hippurate hippuric hippurid Hippuridaceae Hippuris hippurite Hippurites hippuritic Hippuritidae hippuritoid hippus hippy hipshot hipwort hirable hiragana Hiram Hiramite hircarra hircine hircinous hircocerf hircocervus hircosity hire hired hireless hireling hireman Hiren hirer hirmologion hirmos Hirneola hiro Hirofumi hirondelle Hirotoshi Hiroyuki hirple hirrient hirse hirsel hirsle hirsute hirsuteness hirsuties hirsutism hirsutulous Hirtella hirtellous Hirudin hirudine Hirudinea hirudinean hirudiniculture Hirudinidae hirudinize hirudinoid Hirudo hirundine Hirundinidae hirundinous Hirundo his hish hisingerite hisn Hispa Hispania Hispanic Hispanicism Hispanicize hispanidad Hispaniolate Hispaniolize Hispanist Hispanize Hispanophile Hispanophobe hispid hispidity hispidulate hispidulous Hispinae hiss hisser hissing hissingly hissproof hist histaminase histamine histaminic histidine histie histiocyte histiocytic histioid histiology Histiophoridae Histiophorus histoblast histochemic histochemical histochemistry histoclastic histocyte histodiagnosis histodialysis histodialytic histogen histogenesis histogenetic histogenetically histogenic histogenous histogeny histogram histographer histographic histographical histography histoid histologic histological histologically histologist histology histolysis histolytic histometabasis histomorphological histomorphologically histomorphology histon histonal histone histonomy histopathologic histopathological histopathologist histopathology histophyly histophysiological histophysiology Histoplasma histoplasmin histoplasmosis historial historian historiated historic historical historically historicalness historician historicism historicity historicize historicocabbalistical historicocritical historicocultural historicodogmatic historicogeographical historicophilosophica historicophysical historicopolitical historicoprophetic historicoreligious historics historicus historied historier historiette historify historiograph historiographer historiographership historiographic historiographical historiographically historiography historiological historiology historiometric historiometry historionomer historious historism historize history histotherapist histotherapy histotome histotomy histotrophic histotrophy histotropic histozoic histozyme histrio Histriobdella Histriomastix histrion histrionic histrionical histrionically histrionicism histrionism hit hitch hitcher hitchhike hitchhiker hitchily hitchiness Hitchiti hitchproof hitchy hithe hither hithermost hitherto hitherward Hitlerism Hitlerite hitless Hitoshi hittable hitter Hittite Hittitics Hittitology Hittology hive hiveless hiver hives hiveward Hivite hizz Hler Hlidhskjalf Hlithskjalf Hlorrithi Ho ho hoar hoard hoarder hoarding hoardward hoarfrost hoarhead hoarheaded hoarhound hoarily hoariness hoarish hoarness hoarse hoarsely hoarsen hoarseness hoarstone hoarwort hoary hoaryheaded hoast hoastman hoatzin hoax hoaxee hoaxer hoaxproof hob hobber Hobbesian hobbet Hobbian hobbil Hobbism Hobbist Hobbistical hobble hobblebush hobbledehoy hobbledehoydom hobbledehoyhood hobbledehoyish hobbledehoyishness hobbledehoyism hobbledygee hobbler hobbling hobblingly hobbly hobby hobbyhorse hobbyhorsical hobbyhorsically hobbyism hobbyist hobbyless hobgoblin hoblike hobnail hobnailed hobnailer hobnob hobo hoboism Hobomoco hobthrush hocco Hochelaga Hochheimer hock Hockday hockelty hocker hocket hockey hockshin Hocktide hocky hocus hod hodden hodder hoddle hoddy hodening hodful hodgepodge Hodgkin hodgkinsonite hodiernal hodman hodmandod hodograph hodometer hodometrical hoe hoecake hoedown hoeful hoer hoernesite Hoffmannist Hoffmannite hog hoga hogan Hogarthian hogback hogbush hogfish hogframe hogged hogger hoggerel hoggery hogget hoggie hoggin hoggish hoggishly hoggishness hoggism hoggy hogherd hoghide hoghood hoglike hogling hogmace hogmanay Hogni hognose hognut hogpen hogreeve hogrophyte hogshead hogship hogshouther hogskin hogsty hogward hogwash hogweed hogwort hogyard Hohe Hohenzollern Hohenzollernism Hohn Hohokam hoi hoick hoin hoise hoist hoistaway hoister hoisting hoistman hoistway hoit hoju Hokan hokey hokeypokey hokum holagogue holarctic holard holarthritic holarthritis holaspidean holcad holcodont Holconoti Holcus hold holdable holdall holdback holden holdenite holder holdership holdfast holdfastness holding holdingly holdout holdover holdsman holdup hole holeable Holectypina holectypoid holeless holeman holeproof holer holethnic holethnos holewort holey holia holiday holidayer holidayism holidaymaker holidaymaking holily holiness holing holinight holism holistic holistically holl holla hollaite Holland hollandaise Hollander Hollandish hollandite Hollands Hollantide holler hollin holliper hollo hollock hollong hollow hollower hollowfaced hollowfoot hollowhearted hollowheartedness hollowly hollowness holluschick Holly holly hollyhock Hollywood Hollywooder Hollywoodize holm holmberry holmgang holmia holmic holmium holmos holobaptist holobenthic holoblastic holoblastically holobranch holocaine holocarpic holocarpous holocaust holocaustal holocaustic Holocene holocentrid Holocentridae holocentroid Holocentrus Holocephala holocephalan Holocephali holocephalian holocephalous Holochoanites holochoanitic holochoanoid Holochoanoida holochoanoidal holochordate holochroal holoclastic holocrine holocryptic holocrystalline holodactylic holodedron Holodiscus hologamous hologamy hologastrula hologastrular Holognatha holognathous hologonidium holograph holographic holographical holohedral holohedric holohedrism holohemihedral holohyaline holomastigote Holometabola holometabole holometabolian holometabolic holometabolism holometabolous holometaboly holometer holomorph holomorphic holomorphism holomorphosis holomorphy Holomyaria holomyarian Holomyarii holoparasite holoparasitic Holophane holophane holophotal holophote holophotometer holophrase holophrasis holophrasm holophrastic holophyte holophytic holoplankton holoplanktonic holoplexia holopneustic holoproteide holoptic holoptychian holoptychiid Holoptychiidae Holoptychius holoquinoid holoquinoidal holoquinonic holoquinonoid holorhinal holosaprophyte holosaprophytic holosericeous holoside holosiderite Holosiphona holosiphonate Holosomata holosomatous holospondaic holostean Holostei holosteous holosteric Holosteum Holostomata holostomate holostomatous holostome holostomous holostylic holosymmetric holosymmetrical holosymmetry holosystematic holosystolic holothecal holothoracic Holothuria holothurian Holothuridea holothurioid Holothurioidea holotonia holotonic holotony holotrich Holotricha holotrichal Holotrichida holotrichous holotype holour holozoic Holstein holster holstered holt holy holyday holyokeite holystone holytide homage homageable homager Homalocenchrus homalogonatous homalographic homaloid homaloidal Homalonotus Homalopsinae Homaloptera Homalopterous homalosternal Homalosternii Homam Homaridae homarine homaroid Homarus homatomic homaxial homaxonial homaxonic Homburg home homebody homeborn homebound homebred homecomer homecraft homecroft homecrofter homecrofting homefarer homefelt homegoer homekeeper homekeeping homeland homelander homeless homelessly homelessness homelet homelike homelikeness homelily homeliness homeling homely homelyn homemade homemaker homemaking homeoblastic homeochromatic homeochromatism homeochronous homeocrystalline homeogenic homeogenous homeoid homeoidal homeoidality homeokinesis homeokinetic homeomerous homeomorph homeomorphic homeomorphism homeomorphous homeomorphy homeopath homeopathic homeopathically homeopathician homeopathicity homeopathist homeopathy homeophony homeoplasia homeoplastic homeoplasy homeopolar homeosis homeostasis homeostatic homeotic homeotransplant homeotransplantation homeotype homeotypic homeotypical homeowner homeozoic Homer homer Homerian Homeric Homerical Homerically Homerid Homeridae Homeridian Homerist Homerologist Homerology Homeromastix homeseeker homesick homesickly homesickness homesite homesome homespun homestall homestead homesteader homester homestretch homeward homewardly homework homeworker homewort homey homeyness homicidal homicidally homicide homicidious homiculture homilete homiletic homiletical homiletically homiletics homiliarium homiliary homilist homilite homilize homily hominal hominess Hominian hominid Hominidae hominiform hominify hominine hominisection hominivorous hominoid hominy homish homishness homo homoanisaldehyde homoanisic homoarecoline homobaric homoblastic homoblasty homocarpous homocategoric homocentric homocentrical homocentrically homocerc homocercal homocercality homocercy homocerebrin homochiral homochlamydeous homochromatic homochromatism homochrome homochromic homochromosome homochromous homochromy homochronous homoclinal homocline Homocoela homocoelous homocreosol homocyclic homodermic homodermy homodont homodontism homodox homodoxian homodromal homodrome homodromous homodromy homodynamic homodynamous homodynamy homodyne Homoean Homoeanism homoecious homoeoarchy homoeoblastic homoeochromatic homoeochronous homoeocrystalline homoeogenic homoeogenous homoeography homoeokinesis homoeomerae Homoeomeri homoeomeria homoeomerian homoeomerianism homoeomeric homoeomerical homoeomerous homoeomery homoeomorph homoeomorphic homoeomorphism homoeomorphous homoeomorphy homoeopath homoeopathic homoeopathically homoeopathician homoeopathicity homoeopathist homoeopathy homoeophony homoeophyllous homoeoplasia homoeoplastic homoeoplasy homoeopolar homoeosis homoeotel homoeoteleutic homoeoteleuton homoeotic homoeotopy homoeotype homoeotypic homoeotypical homoeozoic homoerotic homoerotism homofermentative homogametic homogamic homogamous homogamy homogangliate homogen homogenate homogene homogeneal homogenealness homogeneate homogeneity homogeneization homogeneize homogeneous homogeneously homogeneousness homogenesis homogenetic homogenetical homogenic homogenization homogenize homogenizer homogenous homogentisic homogeny homoglot homogone homogonous homogonously homogony homograft homograph homographic homography homohedral homoiotherm homoiothermal homoiothermic homoiothermism homoiothermous homoiousia Homoiousian homoiousian Homoiousianism homoiousious homolateral homolecithal homolegalis homologate homologation homologic homological homologically homologist homologize homologizer homologon homologoumena homologous homolographic homolography homologue homology homolosine homolysin homolysis homomallous homomeral homomerous homometrical homometrically homomorph Homomorpha homomorphic homomorphism homomorphosis homomorphous homomorphy Homoneura homonomous homonomy homonuclear homonym homonymic homonymous homonymously homonymy homoousia Homoousian Homoousianism Homoousianist Homoousiast Homoousion homoousious homopathy homoperiodic homopetalous homophene homophenous homophone homophonic homophonous homophony homophthalic homophylic homophyllous homophyly homopiperonyl homoplasis homoplasmic homoplasmy homoplast homoplastic homoplasy homopolar homopolarity homopolic homopter Homoptera homopteran homopteron homopterous Homorelaps homorganic homoseismal homosexual homosexualism homosexualist homosexuality homosporous homospory Homosteus homostyled homostylic homostylism homostylous homostyly homosystemic homotactic homotatic homotaxeous homotaxia homotaxial homotaxially homotaxic homotaxis homotaxy homothallic homothallism homothetic homothety homotonic homotonous homotonously homotony homotopic homotransplant homotransplantation homotropal homotropous homotypal homotype homotypic homotypical homotypy homovanillic homovanillin homoveratric homoveratrole homozygosis homozygosity homozygote homozygous homozygousness homrai homuncle homuncular homunculus homy Hon honda hondo Honduran Honduranean Honduranian Hondurean Hondurian hone honest honestly honestness honestone honesty honewort honey honeybee honeyberry honeybind honeyblob honeybloom honeycomb honeycombed honeydew honeydewed honeydrop honeyed honeyedly honeyedness honeyfall honeyflower honeyfogle honeyful honeyhearted honeyless honeylike honeylipped honeymoon honeymooner honeymoonlight honeymoonshine honeymoonstruck honeymoony honeymouthed honeypod honeypot honeystone honeysuck honeysucker honeysuckle honeysuckled honeysweet honeyware Honeywood honeywood honeywort hong honied honily honk honker honor Honora honorability honorable honorableness honorableship honorably honorance honoraria honorarily honorarium honorary honoree honorer honoress honorific honorifically honorless honorous honorsman honorworthy hontish hontous Honzo hooch hoochinoo hood hoodcap hooded hoodedness hoodful hoodie hoodless hoodlike hoodlum hoodlumish hoodlumism hoodlumize hoodman hoodmold hoodoo hoodsheaf hoodshy hoodshyness hoodwink hoodwinkable hoodwinker hoodwise hoodwort hooey hoof hoofbeat hoofbound hoofed hoofer hoofiness hoofish hoofless hooflet hooflike hoofmark hoofprint hoofrot hoofs hoofworm hoofy hook hookah hookaroon hooked hookedness hookedwise hooker Hookera hookerman hookers hookheal hookish hookless hooklet hooklike hookmaker hookmaking hookman hooknose hooksmith hooktip hookum hookup hookweed hookwise hookworm hookwormer hookwormy hooky hooligan hooliganism hooliganize hoolock hooly hoon hoonoomaun hoop hooped hooper hooping hoopla hoople hoopless hooplike hoopmaker hoopman hoopoe hoopstick hoopwood hoose hoosegow hoosh Hoosier Hoosierdom Hoosierese Hoosierize hoot hootay hooter hootingly hoove hooven Hooverism Hooverize hoovey hop hopbine hopbush Hopcalite hopcrease hope hoped hopeful hopefully hopefulness hopeite hopeless hopelessly hopelessness hoper Hopi hopi hopingly Hopkinsian Hopkinsianism Hopkinsonian hoplite hoplitic hoplitodromos Hoplocephalus hoplology hoplomachic hoplomachist hoplomachos hoplomachy Hoplonemertea hoplonemertean hoplonemertine Hoplonemertini hopoff hopped hopper hopperburn hopperdozer hopperette hoppergrass hopperings hopperman hoppers hoppestere hoppet hoppingly hoppity hopple hoppy hopscotch hopscotcher hoptoad hopvine hopyard hora horal horary Horatian Horatio Horatius horbachite hordarian hordary horde hordeaceous hordeiform hordein hordenine Hordeum horehound Horim horismology horizometer horizon horizonless horizontal horizontalism horizontality horizontalization horizontalize horizontally horizontalness horizontic horizontical horizontically horizonward horme hormic hormigo hormion hormist hormogon Hormogonales Hormogoneae Hormogoneales hormogonium hormogonous hormonal hormone hormonic hormonize hormonogenesis hormonogenic hormonology hormonopoiesis hormonopoietic hormos horn hornbeam hornbill hornblende hornblendic hornblendite hornblendophyre hornblower hornbook horned hornedness horner hornerah hornet hornety hornfair hornfels hornfish hornful horngeld Hornie hornify hornily horniness horning hornish hornist hornito hornless hornlessness hornlet hornlike hornotine hornpipe hornplant hornsman hornstay hornstone hornswoggle horntail hornthumb horntip hornwood hornwork hornworm hornwort horny hornyhanded hornyhead horograph horographer horography horokaka horologe horologer horologic horological horologically horologiography horologist horologium horologue horology horometrical horometry Horonite horopito horopter horopteric horoptery horoscopal horoscope horoscoper horoscopic horoscopical horoscopist horoscopy Horouta horrendous horrendously horrent horrescent horreum horribility horrible horribleness horribly horrid horridity horridly horridness horrific horrifically horrification horrify horripilant horripilate horripilation horrisonant horror horrorful horrorish horrorist horrorize horrormonger horrormongering horrorous horrorsome horse horseback horsebacker horseboy horsebreaker horsecar horsecloth horsecraft horsedom horsefair horsefettler horsefight horsefish horseflesh horsefly horsefoot horsegate horsehair horsehaired horsehead horseherd horsehide horsehood horsehoof horsejockey horsekeeper horselaugh horselaugher horselaughter horseleech horseless horselike horseload horseman horsemanship horsemastership horsemint horsemonger horseplay horseplayful horsepond horsepower horsepox horser horseshoe horseshoer horsetail horsetongue Horsetown horsetree horseway horseweed horsewhip horsewhipper horsewoman horsewomanship horsewood horsfordite horsify horsily horsiness horsing Horst horst horsy horsyism hortation hortative hortatively hortator hortatorily hortatory Hortense Hortensia hortensial Hortensian hortensian horticultural horticulturally horticulture horticulturist hortite hortonolite hortulan Horvatian hory Hosackia hosanna hose hosed hosel hoseless hoselike hoseman hosier hosiery hosiomartyr hospice hospitable hospitableness hospitably hospitage hospital hospitalary hospitaler hospitalism hospitality hospitalization hospitalize hospitant hospitate hospitation hospitator hospitious hospitium hospitize hospodar hospodariat hospodariate host Hosta hostage hostager hostageship hostel hosteler hostelry hoster hostess hostie hostile hostilely hostileness hostility hostilize hosting hostler hostlership hostlerwife hostless hostly hostry hostship hot hotbed hotblood hotbox hotbrained hotch hotchpot hotchpotch hotchpotchly hotel hoteldom hotelhood hotelier hotelization hotelize hotelkeeper hotelless hotelward hotfoot hothead hotheaded hotheadedly hotheadedness hothearted hotheartedly hotheartedness hothouse hoti hotly hotmouthed hotness hotspur hotspurred Hotta Hottentot Hottentotese Hottentotic Hottentotish Hottentotism hotter hottery hottish Hottonia houbara Houdan hough houghband hougher houghite houghmagandy Houghton hounce hound hounder houndfish hounding houndish houndlike houndman houndsbane houndsberry houndshark houndy houppelande hour hourful hourglass houri hourless hourly housage housal Housatonic house houseball houseboat houseboating housebote housebound houseboy housebreak housebreaker housebreaking housebroke housebroken housebug housebuilder housebuilding housecarl housecoat housecraft housefast housefather housefly houseful housefurnishings household householder householdership householding householdry housekeep housekeeper housekeeperlike housekeeperly housekeeping housel houseleek houseless houselessness houselet houseline houseling housemaid housemaidenly housemaiding housemaidy houseman housemaster housemastership housemate housemating houseminder housemistress housemother housemotherly houseowner houser houseridden houseroom housesmith housetop houseward housewares housewarm housewarmer housewarming housewear housewife housewifeliness housewifely housewifery housewifeship housewifish housewive housework housewright housing Houstonia housty housy houtou houvari Hova hove hovedance hovel hoveler hoven Hovenia hover hoverer hovering hoveringly hoverly how howadji Howard howardite howbeit howdah howder howdie howdy howe Howea howel however howff howish howitzer howk howkit howl howler howlet howling howlingly howlite howso howsoever howsomever hox hoy Hoya hoyden hoydenhood hoydenish hoydenism hoyle hoyman Hrimfaxi Hrothgar Hsi Hsuan Hu huaca huaco huajillo huamuchil huantajayite huaracho Huari huarizo Huashi Huastec Huastecan Huave Huavean hub hubb hubba hubber Hubbite hubble hubbly hubbub hubbuboo hubby Hubert hubmaker hubmaking hubnerite hubristic hubshi huccatoon huchen Huchnom hucho huck huckaback huckle huckleback hucklebacked huckleberry hucklebone huckmuck huckster hucksterage hucksterer hucksteress hucksterize huckstery hud huddle huddledom huddlement huddler huddling huddlingly huddock huddroun huddup Hudibras Hudibrastic Hudibrastically Hudsonia Hudsonian hudsonite hue hued hueful hueless huelessness huer Huey huff huffier huffily huffiness huffingly huffish huffishly huffishness huffle huffler huffy hug huge Hugelia hugelite hugely hugeness hugeous hugeously hugeousness huggable hugger huggermugger huggermuggery Huggin hugging huggingly huggle Hugh Hughes Hughoc Hugo Hugoesque hugsome Huguenot Huguenotic Huguenotism huh Hui huia huipil huisache huiscoyol huitain Huk Hukbalahap huke hula Huldah huldee hulk hulkage hulking hulky hull hullabaloo huller hullock hulloo hulotheism Hulsean hulsite hulster hulu hulver hulverhead hulverheaded hum Huma human humane humanely humaneness humanhood humanics humanification humaniform humaniformian humanify humanish humanism humanist humanistic humanistical humanistically humanitarian humanitarianism humanitarianist humanitarianize humanitary humanitian humanity humanitymonger humanization humanize humanizer humankind humanlike humanly humanness humanoid humate humble humblebee humblehearted humblemouthed humbleness humbler humblie humblingly humbly humbo humboldtilite humboldtine humboldtite humbug humbugability humbugable humbugger humbuggery humbuggism humbuzz humdinger humdrum humdrumminess humdrummish humdrummishness humdudgeon Hume Humean humect humectant humectate humectation humective humeral humeri humeroabdominal humerocubital humerodigital humerodorsal humerometacarpal humeroradial humeroscapular humeroulnar humerus humet humetty humhum humic humicubation humid humidate humidification humidifier humidify humidistat humidity humidityproof humidly humidness humidor humific humification humifuse humify humiliant humiliate humiliating humiliatingly humiliation humiliative humiliator humiliatory humilific humilitude humility humin Humiria Humiriaceae Humiriaceous Humism Humist humistratous humite humlie hummel hummeler hummer hummie humming hummingbird hummock hummocky humor humoral humoralism humoralist humoralistic humoresque humoresquely humorful humorific humorism humorist humoristic humoristical humorize humorless humorlessness humorology humorous humorously humorousness humorproof humorsome humorsomely humorsomeness humourful humous hump humpback humpbacked humped humph Humphrey humpiness humpless humpty humpy humstrum humulene humulone Humulus humus humuslike Hun Hunanese hunch Hunchakist hunchback hunchbacked hunchet hunchy hundi hundred hundredal hundredary hundreder hundredfold hundredman hundredpenny hundredth hundredweight hundredwork hung Hungaria Hungarian hungarite hunger hungerer hungeringly hungerless hungerly hungerproof hungerweed hungrify hungrily hungriness hungry hunh hunk Hunker hunker Hunkerism hunkerous hunkerousness hunkers hunkies Hunkpapa hunks hunky Hunlike Hunnian Hunnic Hunnican Hunnish Hunnishness hunt huntable huntedly Hunter Hunterian hunterlike huntilite hunting huntress huntsman huntsmanship huntswoman Hunyak hup Hupa hupaithric Hura hura hurcheon hurdies hurdis hurdle hurdleman hurdler hurdlewise hurds hure hureaulite hureek Hurf hurgila hurkle hurl hurlbarrow hurled hurler hurley hurleyhouse hurling hurlock hurly Huron huron Huronian hurr hurrah Hurri Hurrian hurricane hurricanize hurricano hurried hurriedly hurriedness hurrier hurrisome hurrock hurroo hurroosh hurry hurryingly hurryproof hursinghar hurst hurt hurtable hurted hurter hurtful hurtfully hurtfulness hurting hurtingest hurtle hurtleberry hurtless hurtlessly hurtlessness hurtlingly hurtsome hurty husband husbandable husbandage husbander husbandfield husbandhood husbandland husbandless husbandlike husbandliness husbandly husbandman husbandress husbandry husbandship huse hush hushable hushaby hushcloth hushedly husheen hushel husher hushful hushfully hushing hushingly hushion husho husk huskanaw husked huskened husker huskershredder huskily huskiness husking huskroot huskwort Husky husky huso huspil huss hussar Hussite Hussitism hussy hussydom hussyness husting hustle hustlecap hustlement hustler hut hutch hutcher hutchet Hutchinsonian Hutchinsonianism hutchinsonite Huterian huthold hutholder hutia hutkeeper hutlet hutment Hutsulian Hutterites Huttonian Huttonianism huttoning huttonweed hutukhtu huvelyk Huxleian Huygenian huzoor Huzvaresh huzz huzza huzzard Hwa Hy hyacinth Hyacinthia hyacinthian hyacinthine Hyacinthus Hyades hyaena Hyaenanche Hyaenarctos Hyaenidae Hyaenodon hyaenodont hyaenodontoid Hyakume hyalescence hyalescent hyaline hyalinization hyalinize hyalinocrystalline hyalinosis hyalite hyalitis hyaloandesite hyalobasalt hyalocrystalline hyalodacite hyalogen hyalograph hyalographer hyalography hyaloid hyaloiditis hyaloliparite hyalolith hyalomelan hyalomucoid Hyalonema hyalophagia hyalophane hyalophyre hyalopilitic hyaloplasm hyaloplasma hyaloplasmic hyalopsite hyalopterous hyalosiderite Hyalospongia hyalotekite hyalotype hyaluronic hyaluronidase Hybanthus Hybla Hyblaea Hyblaean Hyblan hybodont Hybodus hybosis hybrid hybridal hybridation hybridism hybridist hybridity hybridizable hybridization hybridize hybridizer hybridous hydantoate hydantoic hydantoin hydathode hydatid hydatidiform hydatidinous hydatidocele hydatiform hydatigenous Hydatina hydatogenesis hydatogenic hydatogenous hydatoid hydatomorphic hydatomorphism hydatopneumatic hydatopneumatolytic hydatopyrogenic hydatoscopy Hydnaceae hydnaceous hydnocarpate hydnocarpic Hydnocarpus hydnoid Hydnora Hydnoraceae hydnoraceous Hydnum Hydra hydracetin Hydrachna hydrachnid Hydrachnidae hydracid hydracoral hydracrylate hydracrylic Hydractinia hydractinian Hydradephaga hydradephagan hydradephagous hydragogue hydragogy hydramine hydramnion hydramnios Hydrangea Hydrangeaceae hydrangeaceous hydrant hydranth hydrarch hydrargillite hydrargyrate hydrargyria hydrargyriasis hydrargyric hydrargyrism hydrargyrosis hydrargyrum hydrarthrosis hydrarthrus hydrastine Hydrastis hydrate hydrated hydration hydrator hydratropic hydraucone hydraulic hydraulically hydraulician hydraulicity hydraulicked hydraulicon hydraulics hydraulist hydraulus hydrazide hydrazidine hydrazimethylene hydrazine hydrazino hydrazo hydrazoate hydrazobenzene hydrazoic hydrazone hydrazyl hydremia hydremic hydrencephalocele hydrencephaloid hydrencephalus hydria hydriatric hydriatrist hydriatry hydric hydrically Hydrid hydride hydriform hydrindene hydriodate hydriodic hydriodide hydriotaphia Hydriote hydro hydroa hydroadipsia hydroaeric hydroalcoholic hydroaromatic hydroatmospheric hydroaviation hydrobarometer Hydrobates Hydrobatidae hydrobenzoin hydrobilirubin hydrobiological hydrobiologist hydrobiology hydrobiosis hydrobiplane hydrobomb hydroboracite hydroborofluoric hydrobranchiate hydrobromate hydrobromic hydrobromide hydrocarbide hydrocarbon hydrocarbonaceous hydrocarbonate hydrocarbonic hydrocarbonous hydrocarbostyril hydrocardia Hydrocaryaceae hydrocaryaceous hydrocatalysis hydrocauline hydrocaulus hydrocele hydrocellulose hydrocephalic hydrocephalocele hydrocephaloid hydrocephalous hydrocephalus hydrocephaly hydroceramic hydrocerussite Hydrocharidaceae hydrocharidaceous Hydrocharis Hydrocharitaceae hydrocharitaceous Hydrochelidon hydrochemical hydrochemistry hydrochlorate hydrochlorauric hydrochloric hydrochloride hydrochlorplatinic hydrochlorplatinous Hydrochoerus hydrocholecystis hydrocinchonine hydrocinnamic hydrocirsocele hydrocladium hydroclastic Hydrocleis hydroclimate hydrocobalticyanic hydrocoele hydrocollidine hydroconion Hydrocorallia Hydrocorallinae hydrocoralline Hydrocores Hydrocorisae hydrocorisan hydrocotarnine Hydrocotyle hydrocoumaric hydrocupreine hydrocyanate hydrocyanic hydrocyanide hydrocycle hydrocyclic hydrocyclist Hydrocyon hydrocyst hydrocystic Hydrodamalidae Hydrodamalis Hydrodictyaceae Hydrodictyon hydrodrome Hydrodromica hydrodromican hydrodynamic hydrodynamical hydrodynamics hydrodynamometer hydroeconomics hydroelectric hydroelectricity hydroelectrization hydroergotinine hydroextract hydroextractor hydroferricyanic hydroferrocyanate hydroferrocyanic hydrofluate hydrofluoboric hydrofluoric hydrofluorid hydrofluoride hydrofluosilicate hydrofluosilicic hydrofluozirconic hydrofoil hydroforming hydrofranklinite hydrofuge hydrogalvanic hydrogel hydrogen hydrogenase hydrogenate hydrogenation hydrogenator hydrogenic hydrogenide hydrogenium hydrogenization hydrogenize hydrogenolysis Hydrogenomonas hydrogenous hydrogeological hydrogeology hydroglider hydrognosy hydrogode hydrograph hydrographer hydrographic hydrographical hydrographically hydrography hydrogymnastics hydrohalide hydrohematite hydrohemothorax hydroid Hydroida Hydroidea hydroidean hydroiodic hydrokinetic hydrokinetical hydrokinetics hydrol hydrolase hydrolatry Hydrolea Hydroleaceae hydrolize hydrologic hydrological hydrologically hydrologist hydrology hydrolysis hydrolyst hydrolyte hydrolytic hydrolyzable hydrolyzate hydrolyzation hydrolyze hydromagnesite hydromancer hydromancy hydromania hydromaniac hydromantic hydromantical hydromantically hydrome hydromechanical hydromechanics hydromedusa Hydromedusae hydromedusan hydromedusoid hydromel hydromeningitis hydromeningocele hydrometallurgical hydrometallurgically hydrometallurgy hydrometamorphism hydrometeor hydrometeorological hydrometeorology hydrometer hydrometra hydrometric hydrometrical hydrometrid Hydrometridae hydrometry hydromica hydromicaceous hydromonoplane hydromorph hydromorphic hydromorphous hydromorphy hydromotor hydromyelia hydromyelocele hydromyoma Hydromys hydrone hydronegative hydronephelite hydronephrosis hydronephrotic hydronitric hydronitroprussic hydronitrous hydronium hydroparacoumaric Hydroparastatae hydropath hydropathic hydropathical hydropathist hydropathy hydropericarditis hydropericardium hydroperiod hydroperitoneum hydroperitonitis hydroperoxide hydrophane hydrophanous hydrophid Hydrophidae hydrophil hydrophile hydrophilic hydrophilid Hydrophilidae hydrophilism hydrophilite hydrophiloid hydrophilous hydrophily Hydrophinae Hydrophis hydrophobe hydrophobia hydrophobic hydrophobical hydrophobist hydrophobophobia hydrophobous hydrophoby hydrophoid hydrophone Hydrophora hydrophoran hydrophore hydrophoria hydrophorous hydrophthalmia hydrophthalmos hydrophthalmus hydrophylacium hydrophyll Hydrophyllaceae hydrophyllaceous hydrophylliaceous hydrophyllium Hydrophyllum hydrophysometra hydrophyte hydrophytic hydrophytism hydrophyton hydrophytous hydropic hydropical hydropically hydropigenous hydroplane hydroplanula hydroplatinocyanic hydroplutonic hydropneumatic hydropneumatosis hydropneumopericardium hydropneumothorax hydropolyp hydroponic hydroponicist hydroponics hydroponist hydropositive hydropot Hydropotes hydropropulsion hydrops hydropsy Hydropterideae hydroptic hydropult hydropultic hydroquinine hydroquinol hydroquinoline hydroquinone hydrorachis hydrorhiza hydrorhizal hydrorrhachis hydrorrhachitis hydrorrhea hydrorrhoea hydrorubber hydrosalpinx hydrosalt hydrosarcocele hydroscope hydroscopic hydroscopical hydroscopicity hydroscopist hydroselenic hydroselenide hydroselenuret hydroseparation hydrosilicate hydrosilicon hydrosol hydrosomal hydrosomatous hydrosome hydrosorbic hydrosphere hydrospire hydrospiric hydrostat hydrostatic hydrostatical hydrostatically hydrostatician hydrostatics hydrostome hydrosulphate hydrosulphide hydrosulphite hydrosulphocyanic hydrosulphurated hydrosulphuret hydrosulphureted hydrosulphuric hydrosulphurous hydrosulphuryl hydrotachymeter hydrotactic hydrotalcite hydrotasimeter hydrotaxis hydrotechnic hydrotechnical hydrotechnologist hydrotechny hydroterpene hydrotheca hydrothecal hydrotherapeutic hydrotherapeutics hydrotherapy hydrothermal hydrothoracic hydrothorax hydrotic hydrotical hydrotimeter hydrotimetric hydrotimetry hydrotomy hydrotropic hydrotropism hydroturbine hydrotype hydrous hydrovane hydroxamic hydroxamino hydroxide hydroximic hydroxy hydroxyacetic hydroxyanthraquinone hydroxybutyricacid hydroxyketone hydroxyl hydroxylactone hydroxylamine hydroxylate hydroxylation hydroxylic hydroxylization hydroxylize hydrozincite Hydrozoa hydrozoal hydrozoan hydrozoic hydrozoon hydrula Hydruntine Hydrurus Hydrus hydurilate hydurilic hyena hyenadog hyenanchin hyenic hyeniform hyenine hyenoid hyetal hyetograph hyetographic hyetographical hyetographically hyetography hyetological hyetology hyetometer hyetometrograph Hygeia Hygeian hygeiolatry hygeist hygeistic hygeology hygiantic hygiantics hygiastic hygiastics hygieist hygienal hygiene hygienic hygienical hygienically hygienics hygienist hygienization hygienize hygiologist hygiology hygric hygrine hygroblepharic hygrodeik hygroexpansivity hygrograph hygrology hygroma hygromatous hygrometer hygrometric hygrometrical hygrometrically hygrometry hygrophaneity hygrophanous hygrophilous hygrophobia hygrophthalmic hygrophyte hygrophytic hygroplasm hygroplasma hygroscope hygroscopic hygroscopical hygroscopically hygroscopicity hygroscopy hygrostat hygrostatics hygrostomia hygrothermal hygrothermograph hying hyke Hyla hylactic hylactism hylarchic hylarchical hyle hyleg hylegiacal hylic hylicism hylicist Hylidae hylism hylist Hyllus Hylobates hylobatian hylobatic hylobatine Hylocereus Hylocichla Hylocomium Hylodes hylogenesis hylogeny hyloid hylology hylomorphic hylomorphical hylomorphism hylomorphist hylomorphous Hylomys hylopathism hylopathist hylopathy hylophagous hylotheism hylotheist hylotheistic hylotheistical hylotomous hylozoic hylozoism hylozoist hylozoistic hylozoistically hymen Hymenaea Hymenaeus Hymenaic hymenal hymeneal hymeneally hymeneals hymenean hymenial hymenic hymenicolar hymeniferous hymeniophore hymenium Hymenocallis Hymenochaete Hymenogaster Hymenogastraceae hymenogeny hymenoid Hymenolepis hymenomycetal hymenomycete Hymenomycetes hymenomycetoid hymenomycetous hymenophore hymenophorum Hymenophyllaceae hymenophyllaceous Hymenophyllites Hymenophyllum hymenopter Hymenoptera hymenopteran hymenopterist hymenopterological hymenopterologist hymenopterology hymenopteron hymenopterous hymenotomy Hymettian Hymettic hymn hymnal hymnarium hymnary hymnbook hymner hymnic hymnist hymnless hymnlike hymnode hymnodical hymnodist hymnody hymnographer hymnography hymnologic hymnological hymnologically hymnologist hymnology hymnwise hynde hyne hyobranchial hyocholalic hyocholic hyoepiglottic hyoepiglottidean hyoglossal hyoglossus hyoglycocholic hyoid hyoidal hyoidan hyoideal hyoidean hyoides Hyolithes hyolithid Hyolithidae hyolithoid hyomandibula hyomandibular hyomental hyoplastral hyoplastron hyoscapular hyoscine hyoscyamine Hyoscyamus hyosternal hyosternum hyostylic hyostyly hyothere Hyotherium hyothyreoid hyothyroid hyp hypabyssal hypaethral hypaethron hypaethros hypaethrum hypalgesia hypalgia hypalgic hypallactic hypallage hypanthial hypanthium hypantrum Hypapante hypapophysial hypapophysis hyparterial hypaspist hypate hypaton hypautomorphic hypaxial Hypenantron hyper hyperabelian hyperabsorption hyperaccurate hyperacid hyperacidaminuria hyperacidity hyperacoustics hyperaction hyperactive hyperactivity hyperacuity hyperacusia hyperacusis hyperacute hyperacuteness hyperadenosis hyperadiposis hyperadiposity hyperadrenalemia hyperaeolism hyperalbuminosis hyperalgebra hyperalgesia hyperalgesic hyperalgesis hyperalgetic hyperalimentation hyperalkalinity hyperaltruism hyperaminoacidemia hyperanabolic hyperanarchy hyperangelical hyperaphia hyperaphic hyperapophyseal hyperapophysial hyperapophysis hyperarchaeological hyperarchepiscopal hyperazotemia hyperbarbarous hyperbatic hyperbatically hyperbaton hyperbola hyperbolaeon hyperbole hyperbolic hyperbolically hyperbolicly hyperbolism hyperbolize hyperboloid hyperboloidal hyperboreal Hyperborean hyperborean hyperbrachycephal hyperbrachycephalic hyperbrachycephaly hyperbrachycranial hyperbrachyskelic hyperbranchia hyperbrutal hyperbulia hypercalcemia hypercarbamidemia hypercarbureted hypercarburetted hypercarnal hypercatalectic hypercatalexis hypercatharsis hypercathartic hypercathexis hypercenosis hyperchamaerrhine hyperchlorhydria hyperchloric hypercholesterinemia hypercholesterolemia hypercholia hypercivilization hypercivilized hyperclassical hyperclimax hypercoagulability hypercoagulable hypercomplex hypercomposite hyperconcentration hypercone hyperconfident hyperconformist hyperconscientious hyperconscientiousness hyperconscious hyperconsciousness hyperconservatism hyperconstitutional hypercoracoid hypercorrect hypercorrection hypercorrectness hypercosmic hypercreaturely hypercritic hypercritical hypercritically hypercriticism hypercriticize hypercryalgesia hypercube hypercyanotic hypercycle hypercylinder hyperdactyl hyperdactylia hyperdactyly hyperdeify hyperdelicacy hyperdelicate hyperdemocracy hyperdemocratic hyperdeterminant hyperdiabolical hyperdialectism hyperdiapason hyperdiapente hyperdiastole hyperdiatessaron hyperdiazeuxis hyperdicrotic hyperdicrotism hyperdicrotous hyperdimensional hyperdimensionality hyperdissyllable hyperdistention hyperditone hyperdivision hyperdolichocephal hyperdolichocephalic hyperdolichocephaly hyperdolichocranial hyperdoricism hyperdulia hyperdulic hyperdulical hyperelegant hyperelliptic hyperemesis hyperemetic hyperemia hyperemic hyperemotivity hyperemphasize hyperenthusiasm hypereosinophilia hyperephidrosis hyperequatorial hypererethism hyperessence hyperesthesia hyperesthetic hyperethical hypereuryprosopic hypereutectic hypereutectoid hyperexaltation hyperexcitability hyperexcitable hyperexcitement hyperexcursive hyperexophoria hyperextend hyperextension hyperfastidious hyperfederalist hyperfine hyperflexion hyperfocal hyperfunction hyperfunctional hyperfunctioning hypergalactia hypergamous hypergamy hypergenesis hypergenetic hypergeometric hypergeometrical hypergeometry hypergeusia hypergeustia hyperglycemia hyperglycemic hyperglycorrhachia hyperglycosuria hypergoddess hypergol hypergolic Hypergon hypergrammatical hyperhedonia hyperhemoglobinemia hyperhilarious hyperhypocrisy Hypericaceae hypericaceous Hypericales hypericin hypericism Hypericum hypericum hyperidealistic hyperideation hyperimmune hyperimmunity hyperimmunization hyperimmunize hyperingenuity hyperinosis hyperinotic hyperinsulinization hyperinsulinize hyperintellectual hyperintelligence hyperinvolution hyperirritability hyperirritable hyperisotonic hyperite hyperkeratosis hyperkinesia hyperkinesis hyperkinetic hyperlactation hyperleptoprosopic hyperleucocytosis hyperlipemia hyperlipoidemia hyperlithuria hyperlogical hyperlustrous hypermagical hypermakroskelic hypermedication hypermenorrhea hypermetabolism hypermetamorphic hypermetamorphism hypermetamorphosis hypermetamorphotic hypermetaphorical hypermetaphysical hypermetaplasia hypermeter hypermetric hypermetrical hypermetron hypermetrope hypermetropia hypermetropic hypermetropical hypermetropy hypermiraculous hypermixolydian hypermnesia hypermnesic hypermnesis hypermnestic hypermodest hypermonosyllable hypermoral hypermorph hypermorphism hypermorphosis hypermotile hypermotility hypermyotonia hypermyotrophy hypermyriorama hypermystical hypernatural hypernephroma hyperneuria hyperneurotic hypernic hypernitrogenous hypernomian hypernomic hypernormal hypernote hypernutrition Hyperoartia hyperoartian hyperobtrusive hyperodontogeny Hyperoodon hyperoon hyperope hyperopia hyperopic hyperorganic hyperorthognathic hyperorthognathous hyperorthognathy hyperosmia hyperosmic hyperostosis hyperostotic hyperothodox hyperothodoxy Hyperotreta hyperotretan Hyperotreti hyperotretous hyperoxidation hyperoxide hyperoxygenate hyperoxygenation hyperoxygenize hyperpanegyric hyperparasite hyperparasitic hyperparasitism hyperparasitize hyperparoxysm hyperpathetic hyperpatriotic hyperpencil hyperpepsinia hyperper hyperperistalsis hyperperistaltic hyperpersonal hyperphalangeal hyperphalangism hyperpharyngeal hyperphenomena hyperphoria hyperphoric hyperphosphorescence hyperphysical hyperphysically hyperphysics hyperpiesia hyperpiesis hyperpietic hyperpietist hyperpigmentation hyperpigmented hyperpinealism hyperpituitarism hyperplagiarism hyperplane hyperplasia hyperplasic hyperplastic hyperplatyrrhine hyperploid hyperploidy hyperpnea hyperpnoea hyperpolysyllabic hyperpredator hyperprism hyperproduction hyperprognathous hyperprophetical hyperprosexia hyperpulmonary hyperpure hyperpurist hyperpyramid hyperpyretic hyperpyrexia hyperpyrexial hyperquadric hyperrational hyperreactive hyperrealize hyperresonance hyperresonant hyperreverential hyperrhythmical hyperridiculous hyperritualism hypersacerdotal hypersaintly hypersalivation hypersceptical hyperscholastic hyperscrupulosity hypersecretion hypersensibility hypersensitive hypersensitiveness hypersensitivity hypersensitization hypersensitize hypersensual hypersensualism hypersensuous hypersentimental hypersolid hypersomnia hypersonic hypersophisticated hyperspace hyperspatial hyperspeculative hypersphere hyperspherical hyperspiritualizing hypersplenia hypersplenism hypersthene hypersthenia hypersthenic hypersthenite hyperstoic hyperstrophic hypersubtlety hypersuggestibility hypersuperlative hypersurface hypersusceptibility hypersusceptible hypersystole hypersystolic hypertechnical hypertelic hypertely hypertense hypertensin hypertension hypertensive hyperterrestrial hypertetrahedron hyperthermal hyperthermalgesia hyperthermesthesia hyperthermia hyperthermic hyperthermy hyperthesis hyperthetic hyperthetical hyperthyreosis hyperthyroid hyperthyroidism hyperthyroidization hyperthyroidize hypertonia hypertonic hypertonicity hypertonus hypertorrid hypertoxic hypertoxicity hypertragical hypertragically hypertranscendent hypertrichosis hypertridimensional hypertrophic hypertrophied hypertrophous hypertrophy hypertropia hypertropical hypertype hypertypic hypertypical hyperurbanism hyperuresis hypervascular hypervascularity hypervenosity hyperventilate hyperventilation hypervigilant hyperviscosity hypervitalization hypervitalize hypervitaminosis hypervolume hyperwrought hypesthesia hypesthesic hypethral hypha Hyphaene hyphaeresis hyphal hyphedonia hyphema hyphen hyphenate hyphenated hyphenation hyphenic hyphenism hyphenization hyphenize hypho hyphodrome Hyphomycetales hyphomycete Hyphomycetes hyphomycetic hyphomycetous hyphomycosis hypidiomorphic hypidiomorphically hypinosis hypinotic Hypnaceae hypnaceous hypnagogic hypnesthesis hypnesthetic hypnoanalysis hypnobate hypnocyst hypnody hypnoetic hypnogenesis hypnogenetic hypnoid hypnoidal hypnoidization hypnoidize hypnologic hypnological hypnologist hypnology hypnone hypnophobia hypnophobic hypnophoby hypnopompic Hypnos hypnoses hypnosis hypnosperm hypnosporangium hypnospore hypnosporic hypnotherapy hypnotic hypnotically hypnotism hypnotist hypnotistic hypnotizability hypnotizable hypnotization hypnotize hypnotizer hypnotoid hypnotoxin Hypnum hypo hypoacid hypoacidity hypoactive hypoactivity hypoadenia hypoadrenia hypoaeolian hypoalimentation hypoalkaline hypoalkalinity hypoaminoacidemia hypoantimonate hypoazoturia hypobasal hypobatholithic hypobenthonic hypobenthos hypoblast hypoblastic hypobole hypobranchial hypobranchiate hypobromite hypobromous hypobulia hypobulic hypocalcemia hypocarp hypocarpium hypocarpogean hypocatharsis hypocathartic hypocathexis hypocaust hypocentrum hypocephalus Hypochaeris hypochil hypochilium hypochlorhydria hypochlorhydric hypochloric hypochlorite hypochlorous hypochloruria Hypochnaceae hypochnose Hypochnus hypochondria hypochondriac hypochondriacal hypochondriacally hypochondriacism hypochondrial hypochondriasis hypochondriast hypochondrium hypochondry hypochordal hypochromia hypochrosis hypochylia hypocist hypocleidian hypocleidium hypocoelom hypocondylar hypocone hypoconid hypoconule hypoconulid hypocoracoid hypocorism hypocoristic hypocoristical hypocoristically hypocotyl hypocotyleal hypocotyledonary hypocotyledonous hypocotylous hypocrater hypocrateriform hypocraterimorphous Hypocreaceae hypocreaceous Hypocreales hypocrisis hypocrisy hypocrital hypocrite hypocritic hypocritical hypocritically hypocrize hypocrystalline hypocycloid hypocycloidal hypocystotomy hypocytosis hypodactylum hypoderm hypoderma hypodermal hypodermatic hypodermatically hypodermatoclysis hypodermatomy Hypodermella hypodermic hypodermically hypodermis hypodermoclysis hypodermosis hypodermous hypodiapason hypodiapente hypodiastole hypodiatessaron hypodiazeuxis hypodicrotic hypodicrotous hypoditone hypodorian hypodynamia hypodynamic hypoeliminator hypoendocrinism hypoeosinophilia hypoeutectic hypoeutectoid hypofunction hypogastric hypogastrium hypogastrocele hypogeal hypogean hypogee hypogeic hypogeiody hypogene hypogenesis hypogenetic hypogenic hypogenous hypogeocarpous hypogeous hypogeum hypogeusia hypoglobulia hypoglossal hypoglossitis hypoglossus hypoglottis hypoglycemia hypoglycemic hypognathism hypognathous hypogonation hypogynic hypogynium hypogynous hypogyny hypohalous hypohemia hypohidrosis Hypohippus hypohyal hypohyaline hypoid hypoiodite hypoiodous hypoionian hypoischium hypoisotonic hypokeimenometry hypokinesia hypokinesis hypokinetic hypokoristikon hypolemniscus hypoleptically hypoleucocytosis hypolimnion hypolocrian hypolydian hypomania hypomanic hypomelancholia hypomeral hypomere hypomeron hypometropia hypomixolydian hypomnematic hypomnesis hypomochlion hypomorph hypomotility hypomyotonia hyponastic hyponastically hyponasty hyponeuria hyponitric hyponitrite hyponitrous hyponoetic hyponoia hyponome hyponomic hyponychial hyponychium hyponym hyponymic hyponymous Hypoparia hypopepsia hypopepsinia hypopepsy hypopetalous hypopetaly hypophalangism hypophamin hypophamine hypophare hypopharyngeal hypopharynx hypophloeodal hypophloeodic hypophloeous hypophonic hypophonous hypophora hypophoria hypophosphate hypophosphite hypophosphoric hypophosphorous hypophrenia hypophrenic hypophrenosis hypophrygian hypophyge hypophyll hypophyllium hypophyllous hypophyllum hypophyse hypophyseal hypophysectomize hypophysectomy hypophyseoprivic hypophyseoprivous hypophysial hypophysical hypophysics hypophysis hypopial hypopinealism hypopituitarism Hypopitys hypoplankton hypoplanktonic hypoplasia hypoplastic hypoplastral hypoplastron hypoplasty hypoplasy hypoploid hypoploidy hypopodium hypopraxia hypoprosexia hypopselaphesia hypopteral hypopteron hypoptilar hypoptilum hypoptosis hypoptyalism hypopus hypopygial hypopygidium hypopygium hypopyon hyporadial hyporadiolus hyporadius hyporchema hyporchematic hyporcheme hyporchesis hyporhachidian hyporhachis hyporhined hyporit hyporrhythmic hyposcenium hyposcleral hyposcope hyposecretion hyposensitization hyposensitize hyposkeletal hyposmia hypospadiac hypospadias hyposphene hypospray hypostase hypostasis hypostasization hypostasize hypostasy hypostatic hypostatical hypostatically hypostatization hypostatize hyposternal hyposternum hyposthenia hyposthenic hyposthenuria hypostigma hypostilbite hypostoma Hypostomata hypostomatic hypostomatous hypostome hypostomial Hypostomides hypostomous hypostrophe hypostyle hypostypsis hypostyptic hyposulphite hyposulphurous hyposuprarenalism hyposyllogistic hyposynaphe hyposynergia hyposystole hypotactic hypotarsal hypotarsus hypotaxia hypotaxic hypotaxis hypotension hypotensive hypotensor hypotenusal hypotenuse hypothalamic hypothalamus hypothalline hypothallus hypothec hypotheca hypothecal hypothecary hypothecate hypothecation hypothecative hypothecator hypothecatory hypothecial hypothecium hypothenal hypothenar Hypotheria hypothermal hypothermia hypothermic hypothermy hypotheses hypothesis hypothesist hypothesize hypothesizer hypothetic hypothetical hypothetically hypothetics hypothetist hypothetize hypothetizer hypothyreosis hypothyroid hypothyroidism hypotonia hypotonic hypotonicity hypotonus hypotony hypotoxic hypotoxicity hypotrachelium Hypotremata hypotrich Hypotricha Hypotrichida hypotrichosis hypotrichous hypotrochanteric hypotrochoid hypotrochoidal hypotrophic hypotrophy hypotympanic hypotypic hypotypical hypotyposis hypovalve hypovanadate hypovanadic hypovanadious hypovanadous hypovitaminosis hypoxanthic hypoxanthine Hypoxis Hypoxylon hypozeugma hypozeuxis Hypozoa hypozoan hypozoic hyppish hypsibrachycephalic hypsibrachycephalism hypsibrachycephaly hypsicephalic hypsicephaly hypsidolichocephalic hypsidolichocephalism hypsidolichocephaly hypsiliform hypsiloid Hypsilophodon hypsilophodont hypsilophodontid Hypsilophodontidae hypsilophodontoid Hypsiprymninae Hypsiprymnodontinae Hypsiprymnus Hypsistarian hypsistenocephalic hypsistenocephalism hypsistenocephaly hypsobathymetric hypsocephalous hypsochrome hypsochromic hypsochromy hypsodont hypsodontism hypsodonty hypsographic hypsographical hypsography hypsoisotherm hypsometer hypsometric hypsometrical hypsometrically hypsometrist hypsometry hypsophobia hypsophonous hypsophyll hypsophyllar hypsophyllary hypsophyllous hypsophyllum hypsothermometer hypural hyraces hyraceum Hyrachyus hyracid Hyracidae hyraciform Hyracina Hyracodon hyracodont hyracodontid Hyracodontidae hyracodontoid hyracoid Hyracoidea hyracoidean hyracothere hyracotherian Hyracotheriinae Hyracotherium hyrax Hyrcan Hyrcanian hyson hyssop Hyssopus hystazarin hysteralgia hysteralgic hysteranthous hysterectomy hysterelcosis hysteresial hysteresis hysteretic hysteretically hysteria hysteriac Hysteriales hysteric hysterical hysterically hystericky hysterics hysteriform hysterioid Hysterocarpus hysterocatalepsy hysterocele hysterocleisis hysterocrystalline hysterocystic hysterodynia hysterogen hysterogenetic hysterogenic hysterogenous hysterogeny hysteroid hysterolaparotomy hysterolith hysterolithiasis hysterology hysterolysis hysteromania hysterometer hysterometry hysteromorphous hysteromyoma hysteromyomectomy hysteron hysteroneurasthenia hysteropathy hysteropexia hysteropexy hysterophore Hysterophyta hysterophytal hysterophyte hysteroproterize hysteroptosia hysteroptosis hysterorrhaphy hysterorrhexis hysteroscope hysterosis hysterotome hysterotomy hysterotraumatism hystriciasis hystricid Hystricidae Hystricinae hystricine hystricism hystricismus hystricoid hystricomorph Hystricomorpha hystricomorphic hystricomorphous Hystrix I i Iacchic Iacchos Iacchus Iachimo iamatology iamb Iambe iambelegus iambi iambic iambically iambist iambize iambographer iambus Ian Ianthina ianthine ianthinite Ianus iao Iapetus Iapyges Iapygian Iapygii iatraliptic iatraliptics iatric iatrical iatrochemic iatrochemical iatrochemist iatrochemistry iatrological iatrology iatromathematical iatromathematician iatromathematics iatromechanical iatromechanist iatrophysical iatrophysicist iatrophysics iatrotechnics iba Ibad Ibadite Iban Ibanag Iberes Iberi Iberia Iberian Iberic Iberis Iberism iberite ibex ibices ibid Ibididae Ibidinae ibidine Ibidium Ibilao ibis ibisbill Ibo ibolium ibota Ibsenian Ibsenic Ibsenish Ibsenism Ibsenite Ibycter Ibycus Icacinaceae icacinaceous icaco Icacorea Icaria Icarian Icarianism Icarus ice iceberg iceblink iceboat icebone icebound icebox icebreaker icecap icecraft iced icefall icefish icehouse Iceland iceland Icelander Icelandian Icelandic iceleaf iceless Icelidae icelike iceman Iceni icequake iceroot Icerya icework ich Ichneumia ichneumon ichneumoned Ichneumones ichneumonid Ichneumonidae ichneumonidan Ichneumonides ichneumoniform ichneumonized ichneumonoid Ichneumonoidea ichneumonology ichneumous ichneutic ichnite ichnographic ichnographical ichnographically ichnography ichnolite ichnolithology ichnolitic ichnological ichnology ichnomancy icho ichoglan ichor ichorous ichorrhea ichorrhemia ichthulin ichthulinic ichthus ichthyal ichthyic ichthyism ichthyismus ichthyization ichthyized ichthyobatrachian Ichthyocephali ichthyocephalous ichthyocol ichthyocolla ichthyocoprolite Ichthyodea Ichthyodectidae ichthyodian ichthyodont ichthyodorulite ichthyofauna ichthyoform ichthyographer ichthyographia ichthyographic ichthyography ichthyoid ichthyoidal Ichthyoidea Ichthyol ichthyolatrous ichthyolatry ichthyolite ichthyolitic ichthyologic ichthyological ichthyologically ichthyologist ichthyology ichthyomancy ichthyomantic Ichthyomorpha ichthyomorphic ichthyomorphous ichthyonomy ichthyopaleontology ichthyophagan ichthyophagi ichthyophagian ichthyophagist ichthyophagize ichthyophagous ichthyophagy ichthyophile ichthyophobia ichthyophthalmite ichthyophthiriasis ichthyopolism ichthyopolist ichthyopsid Ichthyopsida ichthyopsidan Ichthyopterygia ichthyopterygian ichthyopterygium Ichthyornis Ichthyornithes ichthyornithic Ichthyornithidae Ichthyornithiformes ichthyornithoid ichthyosaur Ichthyosauria ichthyosaurian ichthyosaurid Ichthyosauridae ichthyosauroid Ichthyosaurus ichthyosis ichthyosism ichthyotic Ichthyotomi ichthyotomist ichthyotomous ichthyotomy ichthyotoxin ichthyotoxism ichthytaxidermy ichu icica icicle icicled icily iciness icing icon Iconian iconic iconical iconism iconoclasm iconoclast iconoclastic iconoclastically iconoclasticism iconodule iconodulic iconodulist iconoduly iconograph iconographer iconographic iconographical iconographist iconography iconolater iconolatrous iconolatry iconological iconologist iconology iconomachal iconomachist iconomachy iconomania iconomatic iconomatically iconomaticism iconomatography iconometer iconometric iconometrical iconometrically iconometry iconophile iconophilism iconophilist iconophily iconoplast iconoscope iconostas iconostasion iconostasis iconotype icosahedral Icosandria icosasemic icosian icositetrahedron icosteid Icosteidae icosteine Icosteus icotype icteric icterical Icteridae icterine icteritious icterode icterogenetic icterogenic icterogenous icterohematuria icteroid icterus ictic Ictonyx ictuate ictus icy id Ida Idaean Idaho Idahoan Idaic idalia Idalian idant iddat Iddio ide idea ideaed ideaful ideagenous ideal idealess idealism idealist idealistic idealistical idealistically ideality idealization idealize idealizer idealless ideally idealness ideamonger Idean ideate ideation ideational ideationally ideative ideist idempotent identic identical identicalism identically identicalness identifiable identifiableness identification identifier identify identism identity ideogenetic ideogenical ideogenous ideogeny ideoglyph ideogram ideogrammic ideograph ideographic ideographical ideographically ideography ideolatry ideologic ideological ideologically ideologist ideologize ideologue ideology ideomotion ideomotor ideophone ideophonetics ideophonous ideoplastia ideoplastic ideoplastics ideoplasty ideopraxist ides idgah idiasm idic idiobiology idioblast idioblastic idiochromatic idiochromatin idiochromosome idiocrasis idiocrasy idiocratic idiocratical idiocy idiocyclophanous idioelectric idioelectrical Idiogastra idiogenesis idiogenetic idiogenous idioglossia idioglottic idiograph idiographic idiographical idiohypnotism idiolalia idiolatry idiologism idiolysin idiom idiomatic idiomatical idiomatically idiomaticalness idiomelon idiometer idiomography idiomology idiomorphic idiomorphically idiomorphism idiomorphous idiomuscular idiopathetic idiopathic idiopathical idiopathically idiopathy idiophanism idiophanous idiophonic idioplasm idioplasmatic idioplasmic idiopsychological idiopsychology idioreflex idiorepulsive idioretinal idiorrhythmic Idiosepiidae Idiosepion idiosome idiospasm idiospastic idiostatic idiosyncrasy idiosyncratic idiosyncratical idiosyncratically idiot idiotcy idiothalamous idiothermous idiothermy idiotic idiotical idiotically idioticalness idioticon idiotish idiotism idiotize idiotropian idiotry idiotype idiotypic Idism Idist Idistic idite iditol idle idleful idleheaded idlehood idleman idlement idleness idler idleset idleship idlety idlish idly Ido idocrase Idoism Idoist Idoistic idol idola idolaster idolater idolatress idolatric idolatrize idolatrizer idolatrous idolatrously idolatrousness idolatry idolify idolism idolist idolistic idolization idolize idolizer idoloclast idoloclastic idolodulia idolographical idololatrical idololatry idolomancy idolomania idolothyte idolothytic idolous idolum Idomeneus idoneal idoneity idoneous idoneousness idorgan idosaccharic idose Idotea Idoteidae Idothea Idotheidae idrialin idrialine idrialite Idrisid Idrisite idryl Idumaean idyl idyler idylism idylist idylize idyllian idyllic idyllical idyllically idyllicism ie Ierne if ife iffy Ifugao Igara Igbira Igdyr igelstromite igloo Iglulirmiut ignatia Ignatian Ignatianist Ignatius ignavia igneoaqueous igneous ignescent ignicolist igniferous igniferousness igniform ignifuge ignify ignigenous ignipotent ignipuncture ignitability ignite igniter ignitibility ignitible ignition ignitive ignitor ignitron ignivomous ignivomousness ignobility ignoble ignobleness ignoblesse ignobly ignominious ignominiously ignominiousness ignominy ignorable ignoramus ignorance ignorant Ignorantine ignorantism ignorantist ignorantly ignorantness ignoration ignore ignorement ignorer ignote Igorot iguana Iguania iguanian iguanid Iguanidae iguaniform Iguanodon iguanodont Iguanodontia Iguanodontidae iguanodontoid Iguanodontoidea iguanoid Iguvine ihi Ihlat ihleite ihram iiwi ijma Ijo ijolite Ijore ijussite ikat Ike ikey ikeyness Ikhwan ikona ikra Ila ileac ileectomy ileitis ileocaecal ileocaecum ileocolic ileocolitis ileocolostomy ileocolotomy ileon ileosigmoidostomy ileostomy ileotomy ilesite ileum ileus ilex ilia Iliac iliac iliacus Iliad Iliadic Iliadist Iliadize iliahi ilial Ilian iliau Ilicaceae ilicaceous ilicic ilicin ilima iliocaudal iliocaudalis iliococcygeal iliococcygeus iliococcygian iliocostal iliocostalis iliodorsal iliofemoral iliohypogastric ilioinguinal ilioischiac ilioischiatic iliolumbar iliopectineal iliopelvic ilioperoneal iliopsoas iliopsoatic iliopubic iliosacral iliosciatic ilioscrotal iliospinal iliotibial iliotrochanteric Ilissus ilium ilk ilka ilkane ill illaborate illachrymable illachrymableness Illaenus Illano Illanun illapsable illapse illapsive illaqueate illaqueation illation illative illatively illaudable illaudably illaudation illaudatory Illecebraceae illecebrous illeck illegal illegality illegalize illegally illegalness illegibility illegible illegibleness illegibly illegitimacy illegitimate illegitimately illegitimateness illegitimation illegitimatize illeism illeist illess illfare illguide illiberal illiberalism illiberality illiberalize illiberally illiberalness illicit illicitly illicitness Illicium illimitability illimitable illimitableness illimitably illimitate illimitation illimited illimitedly illimitedness illinition illinium Illinoian Illinois Illinoisan Illinoisian Illipe illipene illiquation illiquid illiquidity illiquidly illish illision illiteracy illiteral illiterate illiterately illiterateness illiterature illium illness illocal illocality illocally illogic illogical illogicality illogically illogicalness illogician illogicity Illoricata illoricate illoricated illoyal illoyalty illth illucidate illucidation illucidative illude illudedly illuder illume illumer illuminability illuminable illuminance illuminant illuminate illuminated illuminati illuminating illuminatingly illumination illuminational illuminatism illuminatist illuminative illuminato illuminator illuminatory illuminatus illumine illuminee illuminer Illuminism illuminist Illuministic Illuminize illuminometer illuminous illupi illure illurement illusible illusion illusionable illusional illusionary illusioned illusionism illusionist illusionistic illusive illusively illusiveness illusor illusorily illusoriness illusory illustrable illustratable illustrate illustration illustrational illustrative illustratively illustrator illustratory illustratress illustre illustricity illustrious illustriously illustriousness illutate illutation illuvial illuviate illuviation illy Illyrian Illyric ilmenite ilmenitite ilmenorutile Ilocano Ilokano Iloko Ilongot ilot Ilpirra ilvaite Ilya Ilysanthes Ilysia Ilysiidae ilysioid Ima image imageable imageless imager imagerial imagerially imagery imaginability imaginable imaginableness imaginably imaginal imaginant imaginarily imaginariness imaginary imaginate imagination imaginational imaginationalism imaginative imaginatively imaginativeness imaginator imagine imaginer imagines imaginist imaginous imagism imagist imagistic imago imam imamah imamate imambarah imamic imamship Imantophyllum imaret imbalance imban imband imbannered imbarge imbark imbarn imbased imbastardize imbat imbauba imbe imbecile imbecilely imbecilic imbecilitate imbecility imbed imbellious imber imbibe imbiber imbibition imbibitional imbibitory imbirussu imbitter imbitterment imbolish imbondo imbonity imbordure imborsation imbosom imbower imbreathe imbreviate imbrex imbricate imbricated imbricately imbrication imbricative imbroglio imbrue imbruement imbrute imbrutement imbue imbuement imburse imbursement Imer Imerina Imeritian imi imidazole imidazolyl imide imidic imidogen iminazole imine imino iminohydrin imitability imitable imitableness imitancy imitant imitate imitatee imitation imitational imitationist imitative imitatively imitativeness imitator imitatorship imitatress imitatrix immaculacy immaculance immaculate immaculately immaculateness immalleable immanacle immanation immane immanely immanence immanency immaneness immanent immanental immanentism immanentist immanently Immanes immanifest immanifestness immanity immantle Immanuel immarble immarcescible immarcescibly immarcibleness immarginate immask immatchable immaterial immaterialism immaterialist immateriality immaterialize immaterially immaterialness immaterials immateriate immatriculate immatriculation immature immatured immaturely immatureness immaturity immeability immeasurability immeasurable immeasurableness immeasurably immeasured immechanical immechanically immediacy immedial immediate immediately immediateness immediatism immediatist immedicable immedicableness immedicably immelodious immember immemorable immemorial immemorially immense immensely immenseness immensity immensive immensurability immensurable immensurableness immensurate immerd immerge immergence immergent immerit immerited immeritorious immeritoriously immeritous immerse immersement immersible immersion immersionism immersionist immersive immethodic immethodical immethodically immethodicalness immethodize immetrical immetrically immetricalness immew immi immigrant immigrate immigration immigrator immigratory imminence imminency imminent imminently imminentness immingle imminution immiscibility immiscible immiscibly immission immit immitigability immitigable immitigably immix immixable immixture immobile immobility immobilization immobilize immoderacy immoderate immoderately immoderateness immoderation immodest immodestly immodesty immodulated immolate immolation immolator immoment immomentous immonastered immoral immoralism immoralist immorality immoralize immorally immorigerous immorigerousness immortability immortable immortal immortalism immortalist immortality immortalizable immortalization immortalize immortalizer immortally immortalness immortalship immortelle immortification immortified immotile immotioned immotive immound immovability immovable immovableness immovably immund immundity immune immunist immunity immunization immunize immunochemistry immunogen immunogenetic immunogenetics immunogenic immunogenically immunogenicity immunologic immunological immunologically immunologist immunology immunoreaction immunotoxin immuration immure immurement immusical immusically immutability immutable immutableness immutably immutation immute immutilate immutual Imogen Imolinda imonium imp impacability impacable impack impackment impact impacted impaction impactionize impactment impactual impages impaint impair impairable impairer impairment impala impalace impalatable impale impalement impaler impall impalm impalpability impalpable impalpably impalsy impaludism impanate impanation impanator impane impanel impanelment impapase impapyrate impar imparadise imparalleled imparasitic impardonable impardonably imparidigitate imparipinnate imparisyllabic imparity impark imparkation imparl imparlance imparsonee impart impartable impartance impartation imparter impartial impartialism impartialist impartiality impartially impartialness impartibilibly impartibility impartible impartibly imparticipable impartite impartive impartivity impartment impassability impassable impassableness impassably impasse impassibilibly impassibility impassible impassibleness impassion impassionable impassionate impassionately impassioned impassionedly impassionedness impassionment impassive impassively impassiveness impassivity impastation impaste impasto impasture impaternate impatible impatience impatiency Impatiens impatient Impatientaceae impatientaceous impatiently impatientness impatronize impave impavid impavidity impavidly impawn impayable impeach impeachability impeachable impeacher impeachment impearl impeccability impeccable impeccably impeccance impeccancy impeccant impectinate impecuniary impecuniosity impecunious impecuniously impecuniousness impedance impede impeder impedibility impedible impedient impediment impedimenta impedimental impedimentary impeding impedingly impedite impedition impeditive impedometer impeevish impel impellent impeller impen impend impendence impendency impendent impending impenetrability impenetrable impenetrableness impenetrably impenetrate impenetration impenetrative impenitence impenitent impenitently impenitentness impenitible impenitibleness impennate Impennes impent imperance imperant Imperata imperate imperation imperatival imperative imperatively imperativeness imperator imperatorial imperatorially imperatorian imperatorious imperatorship imperatory imperatrix imperceivable imperceivableness imperceivably imperceived imperceiverant imperceptibility imperceptible imperceptibleness imperceptibly imperception imperceptive imperceptiveness imperceptivity impercipience impercipient imperence imperent imperfect imperfected imperfectibility imperfectible imperfection imperfectious imperfective imperfectly imperfectness imperforable Imperforata imperforate imperforated imperforation imperformable imperia imperial imperialin imperialine imperialism imperialist imperialistic imperialistically imperiality imperialization imperialize imperially imperialness imperialty imperil imperilment imperious imperiously imperiousness imperish imperishability imperishable imperishableness imperishably imperite imperium impermanence impermanency impermanent impermanently impermeability impermeabilization impermeabilize impermeable impermeableness impermeably impermeated impermeator impermissible impermutable imperscriptible imperscrutable impersonable impersonal impersonality impersonalization impersonalize impersonally impersonate impersonation impersonative impersonator impersonatress impersonatrix impersonification impersonify impersonization impersonize imperspicuity imperspicuous imperspirability imperspirable impersuadable impersuadableness impersuasibility impersuasible impersuasibleness impersuasibly impertinacy impertinence impertinency impertinent impertinently impertinentness impertransible imperturbability imperturbable imperturbableness imperturbably imperturbation imperturbed imperverse impervertible impervestigable imperviability imperviable imperviableness impervial impervious imperviously imperviousness impest impestation impester impeticos impetiginous impetigo impetition impetrate impetration impetrative impetrator impetratory impetre impetulant impetulantly impetuosity impetuous impetuously impetuousness impetus Impeyan imphee impi impicture impierceable impiety impignorate impignoration impinge impingement impingence impingent impinger impinguate impious impiously impiousness impish impishly impishness impiteous impitiably implacability implacable implacableness implacably implacement implacental Implacentalia implacentate implant implantation implanter implastic implasticity implate implausibility implausible implausibleness implausibly impleach implead impleadable impleader impledge implement implemental implementation implementiferous implete impletion impletive implex impliable implial implicant implicate implicately implicateness implication implicational implicative implicatively implicatory implicit implicitly implicitness impliedly impliedness impling implode implodent implorable imploration implorator imploratory implore implorer imploring imploringly imploringness implosion implosive implosively implume implumed implunge impluvium imply impocket impofo impoison impoisoner impolarizable impolicy impolished impolite impolitely impoliteness impolitic impolitical impolitically impoliticalness impoliticly impoliticness impollute imponderabilia imponderability imponderable imponderableness imponderably imponderous impone imponent impoor impopular impopularly imporosity imporous import importability importable importableness importably importance importancy important importantly importation importer importless importment importraiture importray importunacy importunance importunate importunately importunateness importunator importune importunely importunement importuner importunity imposable imposableness imposal impose imposement imposer imposing imposingly imposingness imposition impositional impositive impossibilification impossibilism impossibilist impossibilitate impossibility impossible impossibleness impossibly impost imposter imposterous impostor impostorism impostorship impostress impostrix impostrous impostumate impostumation impostume imposture imposturism imposturous imposure impot impotable impotence impotency impotent impotently impotentness impound impoundable impoundage impounder impoundment impoverish impoverisher impoverishment impracticability impracticable impracticableness impracticably impractical impracticality impracticalness imprecant imprecate imprecation imprecator imprecatorily imprecatory imprecise imprecisely imprecision impredicability impredicable impreg impregn impregnability impregnable impregnableness impregnably impregnant impregnate impregnation impregnative impregnator impregnatory imprejudice impremeditate impreparation impresa impresario imprescience imprescribable imprescriptibility imprescriptible imprescriptibly imprese impress impressable impressedly impresser impressibility impressible impressibleness impressibly impression impressionability impressionable impressionableness impressionably impressional impressionalist impressionality impressionally impressionary impressionism impressionist impressionistic impressionistically impressionless impressive impressively impressiveness impressment impressor impressure imprest imprestable impreventability impreventable imprevisibility imprevisible imprevision imprimatur imprime imprimitive imprimitivity imprint imprinter imprison imprisonable imprisoner imprisonment improbability improbabilize improbable improbableness improbably improbation improbative improbatory improbity improcreant improcurability improcurable improducible improficience improficiency improgressive improgressively improgressiveness improlificical impromptitude impromptu impromptuary impromptuist improof improper improperation improperly improperness impropriate impropriation impropriator impropriatrix impropriety improvability improvable improvableness improvably improve improvement improver improvership improvidence improvident improvidentially improvidently improving improvingly improvisate improvisation improvisational improvisator improvisatorial improvisatorially improvisatorize improvisatory improvise improvisedly improviser improvision improviso improvisor imprudence imprudency imprudent imprudential imprudently imprudentness impship impuberal impuberate impuberty impubic impudence impudency impudent impudently impudentness impudicity impugn impugnability impugnable impugnation impugner impugnment impuissance impuissant impulse impulsion impulsive impulsively impulsiveness impulsivity impulsory impunctate impunctual impunctuality impunely impunible impunibly impunity impure impurely impureness impuritan impuritanism impurity imputability imputable imputableness imputably imputation imputative imputatively imputativeness impute imputedly imputer imputrescence imputrescibility imputrescible imputrid impy imshi imsonic imu in inability inabordable inabstinence inaccentuated inaccentuation inacceptable inaccessibility inaccessible inaccessibleness inaccessibly inaccordance inaccordancy inaccordant inaccordantly inaccuracy inaccurate inaccurately inaccurateness inachid Inachidae inachoid Inachus inacquaintance inacquiescent inactinic inaction inactionist inactivate inactivation inactive inactively inactiveness inactivity inactuate inactuation inadaptability inadaptable inadaptation inadaptive inadept inadequacy inadequate inadequately inadequateness inadequation inadequative inadequatively inadherent inadhesion inadhesive inadjustability inadjustable inadmissibility inadmissible inadmissibly inadventurous inadvertence inadvertency inadvertent inadvertently inadvisability inadvisable inadvisableness inadvisedly inaesthetic inaffability inaffable inaffectation inagglutinability inagglutinable inaggressive inagile inaidable inaja inalacrity inalienability inalienable inalienableness inalienably inalimental inalterability inalterable inalterableness inalterably inamissibility inamissible inamissibleness inamorata inamorate inamoration inamorato inamovability inamovable inane inanely inanga inangulate inanimadvertence inanimate inanimated inanimately inanimateness inanimation inanition inanity inantherate inapathy inapostate inapparent inappealable inappeasable inappellability inappellable inappendiculate inapperceptible inappertinent inappetence inappetency inappetent inappetible inapplicability inapplicable inapplicableness inapplicably inapplication inapposite inappositely inappositeness inappreciable inappreciably inappreciation inappreciative inappreciatively inappreciativeness inapprehensible inapprehension inapprehensive inapprehensiveness inapproachability inapproachable inapproachably inappropriable inappropriableness inappropriate inappropriately inappropriateness inapt inaptitude inaptly inaptness inaqueous inarable inarch inarculum inarguable inarguably inarm inarticulacy Inarticulata inarticulate inarticulated inarticulately inarticulateness inarticulation inartificial inartificiality inartificially inartificialness inartistic inartistical inartisticality inartistically inasmuch inassimilable inassimilation inassuageable inattackable inattention inattentive inattentively inattentiveness inaudibility inaudible inaudibleness inaudibly inaugur inaugural inaugurate inauguration inaugurative inaugurator inauguratory inaugurer inaurate inauration inauspicious inauspiciously inauspiciousness inauthentic inauthenticity inauthoritative inauthoritativeness inaxon inbe inbeaming inbearing inbeing inbending inbent inbirth inblow inblowing inblown inboard inbond inborn inbound inbread inbreak inbreaking inbreathe inbreather inbred inbreed inbring inbringer inbuilt inburning inburnt inburst inby Inca Incaic incalculability incalculable incalculableness incalculably incalescence incalescency incalescent incaliculate incalver incalving incameration Incan incandent incandesce incandescence incandescency incandescent incandescently incanous incantation incantational incantator incantatory incanton incapability incapable incapableness incapably incapacious incapaciousness incapacitate incapacitation incapacity incapsulate incapsulation incaptivate incarcerate incarceration incarcerator incardinate incardination Incarial incarmined incarn incarnadine incarnant incarnate incarnation incarnational incarnationist incarnative Incarvillea incase incasement incast incatenate incatenation incaution incautious incautiously incautiousness incavate incavated incavation incavern incedingly incelebrity incendiarism incendiary incendivity incensation incense incenseless incensement incensory incensurable incensurably incenter incentive incentively incentor incept inception inceptive inceptively inceptor inceration incertitude incessable incessably incessancy incessant incessantly incessantness incest incestuous incestuously incestuousness inch inched inchmeal inchoacy inchoant inchoate inchoately inchoateness inchoation inchoative inchpin inchworm incide incidence incident incidental incidentalist incidentally incidentalness incidentless incidently incinerable incinerate incineration incinerator incipience incipient incipiently incircumscription incircumspect incircumspection incircumspectly incircumspectness incisal incise incisely incisiform incision incisive incisively incisiveness incisor incisorial incisory incisure incitability incitable incitant incitation incite incitement inciter incitingly incitive incitress incivic incivility incivilization incivism inclemency inclement inclemently inclementness inclinable inclinableness inclination inclinational inclinator inclinatorily inclinatorium inclinatory incline incliner inclinograph inclinometer inclip inclose inclosure includable include included includedness includer inclusa incluse inclusion inclusionist inclusive inclusively inclusiveness inclusory incoagulable incoalescence incoercible incog incogent incogitability incogitable incogitancy incogitant incogitantly incogitative incognita incognitive incognito incognizability incognizable incognizance incognizant incognoscent incognoscibility incognoscible incoherence incoherency incoherent incoherentific incoherently incoherentness incohering incohesion incohesive incoincidence incoincident incombustibility incombustible incombustibleness incombustibly incombustion income incomeless incomer incoming incommensurability incommensurable incommensurableness incommensurably incommensurate incommensurately incommensurateness incommiscibility incommiscible incommodate incommodation incommode incommodement incommodious incommodiously incommodiousness incommodity incommunicability incommunicable incommunicableness incommunicably incommunicado incommunicative incommunicatively incommunicativeness incommutability incommutable incommutableness incommutably incompact incompactly incompactness incomparability incomparable incomparableness incomparably incompassionate incompassionately incompassionateness incompatibility incompatible incompatibleness incompatibly incompendious incompensated incompensation incompetence incompetency incompetent incompetently incompetentness incompletability incompletable incompletableness incomplete incompleted incompletely incompleteness incompletion incomplex incompliance incompliancy incompliant incompliantly incomplicate incomplying incomposed incomposedly incomposedness incomposite incompossibility incompossible incomprehended incomprehending incomprehendingly incomprehensibility incomprehensible incomprehensibleness incomprehensibly incomprehension incomprehensive incomprehensively incomprehensiveness incompressibility incompressible incompressibleness incompressibly incomputable inconcealable inconceivability inconceivable inconceivableness inconceivably inconcinnate inconcinnately inconcinnity inconcinnous inconcludent inconcluding inconclusion inconclusive inconclusively inconclusiveness inconcrete inconcurrent inconcurring incondensability incondensable incondensibility incondensible incondite inconditionate inconditioned inconducive inconfirm inconformable inconformably inconformity inconfused inconfusedly inconfusion inconfutable inconfutably incongealable incongealableness incongenerous incongenial incongeniality inconglomerate incongruence incongruent incongruently incongruity incongruous incongruously incongruousness inconjoinable inconnected inconnectedness inconnu inconscience inconscient inconsciently inconscious inconsciously inconsecutive inconsecutively inconsecutiveness inconsequence inconsequent inconsequential inconsequentiality inconsequentially inconsequently inconsequentness inconsiderable inconsiderableness inconsiderably inconsiderate inconsiderately inconsiderateness inconsideration inconsidered inconsistence inconsistency inconsistent inconsistently inconsistentness inconsolability inconsolable inconsolableness inconsolably inconsolate inconsolately inconsonance inconsonant inconsonantly inconspicuous inconspicuously inconspicuousness inconstancy inconstant inconstantly inconstantness inconstruable inconsultable inconsumable inconsumably inconsumed incontaminable incontaminate incontaminateness incontemptible incontestability incontestable incontestableness incontestably incontinence incontinency incontinent incontinently incontinuity incontinuous incontracted incontractile incontraction incontrollable incontrollably incontrolled incontrovertibility incontrovertible incontrovertibleness incontrovertibly inconvenience inconveniency inconvenient inconveniently inconvenientness inconversable inconversant inconversibility inconvertibility inconvertible inconvertibleness inconvertibly inconvinced inconvincedly inconvincibility inconvincible inconvincibly incopresentability incopresentable incoronate incoronated incoronation incorporable incorporate incorporated incorporatedness incorporation incorporative incorporator incorporeal incorporealism incorporealist incorporeality incorporealize incorporeally incorporeity incorporeous incorpse incorrect incorrection incorrectly incorrectness incorrespondence incorrespondency incorrespondent incorresponding incorrigibility incorrigible incorrigibleness incorrigibly incorrodable incorrodible incorrosive incorrupt incorrupted incorruptibility Incorruptible incorruptible incorruptibleness incorruptibly incorruption incorruptly incorruptness incourteous incourteously incrash incrassate incrassated incrassation incrassative increasable increasableness increase increasedly increaseful increasement increaser increasing increasingly increate increately increative incredibility incredible incredibleness incredibly increditable incredited incredulity incredulous incredulously incredulousness increep incremate incremation increment incremental incrementation increpate increpation increscence increscent increst incretion incretionary incretory incriminate incrimination incriminator incriminatory incross incrossbred incrossing incrotchet incruent incruental incruentous incrust incrustant Incrustata incrustate incrustation incrustator incrustive incrustment incrystal incrystallizable incubate incubation incubational incubative incubator incubatorium incubatory incubi incubous incubus incudal incudate incudectomy incudes incudomalleal incudostapedial inculcate inculcation inculcative inculcator inculcatory inculpability inculpable inculpableness inculpably inculpate inculpation inculpative inculpatory incult incultivation inculture incumbence incumbency incumbent incumbentess incumbently incumber incumberment incumbrance incumbrancer incunable incunabula incunabular incunabulist incunabulum incuneation incur incurability incurable incurableness incurably incuriosity incurious incuriously incuriousness incurrable incurrence incurrent incurse incursion incursionist incursive incurvate incurvation incurvature incurve incus incuse incut incutting Ind indaba indaconitine indagate indagation indagative indagator indagatory indamine indan indane Indanthrene indanthrene indart indazin indazine indazol indazole inde indebt indebted indebtedness indebtment indecence indecency indecent indecently indecentness Indecidua indeciduate indeciduous indecipherability indecipherable indecipherableness indecipherably indecision indecisive indecisively indecisiveness indeclinable indeclinableness indeclinably indecomponible indecomposable indecomposableness indecorous indecorously indecorousness indecorum indeed indeedy indefaceable indefatigability indefatigable indefatigableness indefatigably indefeasibility indefeasible indefeasibleness indefeasibly indefeatable indefectibility indefectible indefectibly indefective indefensibility indefensible indefensibleness indefensibly indefensive indeficiency indeficient indeficiently indefinable indefinableness indefinably indefinite indefinitely indefiniteness indefinitive indefinitively indefinitiveness indefinitude indefinity indeflectible indefluent indeformable indehiscence indehiscent indelectable indelegability indelegable indeliberate indeliberately indeliberateness indeliberation indelibility indelible indelibleness indelibly indelicacy indelicate indelicately indelicateness indemnification indemnificator indemnificatory indemnifier indemnify indemnitee indemnitor indemnity indemnization indemoniate indemonstrability indemonstrable indemonstrableness indemonstrably indene indent indentation indented indentedly indentee indenter indention indentment indentor indenture indentured indentureship indentwise independable independence independency independent independentism independently Independista indeposable indeprehensible indeprivability indeprivable inderivative indescribability indescribable indescribableness indescribably indescript indescriptive indesert indesignate indesirable indestructibility indestructible indestructibleness indestructibly indetectable indeterminable indeterminableness indeterminably indeterminacy indeterminate indeterminately indeterminateness indetermination indeterminative indetermined indeterminism indeterminist indeterministic indevirginate indevoted indevotion indevotional indevout indevoutly indevoutness index indexed indexer indexical indexically indexing indexless indexlessness indexterity India indiadem Indiaman Indian Indiana indianaite Indianan Indianeer Indianesque Indianhood Indianian Indianism Indianist indianite indianization indianize Indic indic indicable indican indicant indicanuria indicate indication indicative indicatively indicator Indicatoridae Indicatorinae indicatory indicatrix indices indicia indicial indicible indicium indicolite indict indictable indictably indictee indicter indiction indictional indictive indictment indictor Indies indiferous indifference indifferency indifferent indifferential indifferentism indifferentist indifferentistic indifferently indigena indigenal indigenate indigence indigency indigene indigeneity Indigenismo indigenist indigenity indigenous indigenously indigenousness indigent indigently indigested indigestedness indigestibility indigestible indigestibleness indigestibly indigestion indigestive indigitamenta indigitate indigitation indign indignance indignancy indignant indignantly indignation indignatory indignify indignity indignly indigo indigoberry Indigofera indigoferous indigoid indigotic indigotin indigotindisulphonic indiguria indimensible indimensional indiminishable indimple indirect indirected indirection indirectly indirectness indirubin indiscernibility indiscernible indiscernibleness indiscernibly indiscerptibility indiscerptible indiscerptibleness indiscerptibly indisciplinable indiscipline indisciplined indiscoverable indiscoverably indiscovered indiscreet indiscreetly indiscreetness indiscrete indiscretely indiscretion indiscretionary indiscriminate indiscriminated indiscriminately indiscriminateness indiscriminating indiscriminatingly indiscrimination indiscriminative indiscriminatively indiscriminatory indiscussable indiscussible indispellable indispensability indispensable indispensableness indispensably indispose indisposed indisposedness indisposition indisputability indisputable indisputableness indisputably indissipable indissociable indissolubility indissoluble indissolubleness indissolubly indissolute indissolvability indissolvable indissolvableness indissolvably indissuadable indissuadably indistinct indistinction indistinctive indistinctively indistinctiveness indistinctly indistinctness indistinguishability indistinguishable indistinguishableness indistinguishably indistinguished indistortable indistributable indisturbable indisturbance indisturbed indite inditement inditer indium indivertible indivertibly individable individua individual individualism individualist individualistic individualistically individuality individualization individualize individualizer individualizingly individually individuate individuation individuative individuator individuity individuum indivinable indivisibility indivisible indivisibleness indivisibly indivision indocibility indocible indocibleness indocile indocility indoctrinate indoctrination indoctrinator indoctrine indoctrinization indoctrinize Indogaea Indogaean indogen indogenide indole indolence indolent indolently indoles indoline Indologian Indologist Indologue Indology indoloid indolyl indomitability indomitable indomitableness indomitably Indone Indonesian indoor indoors indophenin indophenol Indophile Indophilism Indophilist indorsation indorse indoxyl indoxylic indoxylsulphuric Indra indraft indraught indrawal indrawing indrawn indri Indris indubious indubiously indubitable indubitableness indubitably indubitatively induce induced inducedly inducement inducer induciae inducible inducive induct inductance inductee inducteous inductile inductility induction inductional inductionally inductionless inductive inductively inductiveness inductivity inductometer inductophone inductor inductorium inductory inductoscope indue induement indulge indulgeable indulgement indulgence indulgenced indulgency indulgent indulgential indulgentially indulgently indulgentness indulger indulging indulgingly induline indult indulto indument indumentum induna induplicate induplication induplicative indurable indurate induration indurative indurite Indus indusial indusiate indusiated indusiform indusioid indusium industrial industrialism industrialist industrialization industrialize industrially industrialness industrious industriously industriousness industrochemical industry induviae induvial induviate indwell indweller indy indyl indylic inearth inebriacy inebriant inebriate inebriation inebriative inebriety inebrious ineconomic ineconomy inedibility inedible inedited Ineducabilia ineducabilian ineducability ineducable ineducation ineffability ineffable ineffableness ineffably ineffaceability ineffaceable ineffaceably ineffectible ineffectibly ineffective ineffectively ineffectiveness ineffectual ineffectuality ineffectually ineffectualness ineffervescence ineffervescent ineffervescibility ineffervescible inefficacious inefficaciously inefficaciousness inefficacity inefficacy inefficience inefficiency inefficient inefficiently ineffulgent inelaborate inelaborated inelaborately inelastic inelasticate inelasticity inelegance inelegancy inelegant inelegantly ineligibility ineligible ineligibleness ineligibly ineliminable ineloquence ineloquent ineloquently ineluctability ineluctable ineluctably ineludible ineludibly inembryonate inemendable inemotivity inemulous inenarrable inenergetic inenubilable inenucleable inept ineptitude ineptly ineptness inequable inequal inequalitarian inequality inequally inequalness inequation inequiaxial inequicostate inequidistant inequigranular inequilateral inequilibrium inequilobate inequilobed inequipotential inequipotentiality inequitable inequitableness inequitably inequity inequivalent inequivalve inequivalvular ineradicable ineradicableness ineradicably inerasable inerasableness inerasably inerasible Ineri inerm Inermes Inermi Inermia inermous inerrability inerrable inerrableness inerrably inerrancy inerrant inerrantly inerratic inerring inerringly inerroneous inert inertance inertia inertial inertion inertly inertness inerubescent inerudite ineruditely inerudition inescapable inescapableness inescapably inesculent inescutcheon inesite inessential inessentiality inestimability inestimable inestimableness inestimably inestivation inethical ineunt ineuphonious inevadible inevadibly inevaporable inevasible inevidence inevident inevitability inevitable inevitableness inevitably inexact inexacting inexactitude inexactly inexactness inexcellence inexcitability inexcitable inexclusive inexclusively inexcommunicable inexcusability inexcusable inexcusableness inexcusably inexecutable inexecution inexertion inexhausted inexhaustedly inexhaustibility inexhaustible inexhaustibleness inexhaustibly inexhaustive inexhaustively inexigible inexist inexistence inexistency inexistent inexorability inexorable inexorableness inexorably inexpansible inexpansive inexpectancy inexpectant inexpectation inexpected inexpectedly inexpectedness inexpedience inexpediency inexpedient inexpediently inexpensive inexpensively inexpensiveness inexperience inexperienced inexpert inexpertly inexpertness inexpiable inexpiableness inexpiably inexpiate inexplainable inexplicability inexplicable inexplicableness inexplicables inexplicably inexplicit inexplicitly inexplicitness inexplorable inexplosive inexportable inexposable inexposure inexpress inexpressibility inexpressible inexpressibleness inexpressibles inexpressibly inexpressive inexpressively inexpressiveness inexpugnability inexpugnable inexpugnableness inexpugnably inexpungeable inexpungible inextant inextended inextensibility inextensible inextensile inextension inextensional inextensive inexterminable inextinct inextinguishable inextinguishably inextirpable inextirpableness inextricability inextricable inextricableness inextricably Inez inface infall infallibilism infallibilist infallibility infallible infallibleness infallibly infalling infalsificable infame infamiliar infamiliarity infamize infamonize infamous infamously infamousness infamy infancy infand infandous infang infanglement infangthief infant infanta infantado infante infanthood infanticidal infanticide infantile infantilism infantility infantine infantlike infantry infantryman infarct infarctate infarcted infarction infare infatuate infatuatedly infatuation infatuator infaust infeasibility infeasible infeasibleness infect infectant infected infectedness infecter infectible infection infectionist infectious infectiously infectiousness infective infectiveness infectivity infector infectress infectuous infecund infecundity infeed infeft infeftment infelicific infelicitous infelicitously infelicitousness infelicity infelonious infelt infeminine infer inferable inference inferent inferential inferentialism inferentialist inferentially inferior inferiorism inferiority inferiorize inferiorly infern infernal infernalism infernality infernalize infernally infernalry infernalship inferno inferoanterior inferobranchiate inferofrontal inferolateral inferomedian inferoposterior inferrer inferribility inferrible inferringly infertile infertilely infertileness infertility infest infestant infestation infester infestive infestivity infestment infeudation infibulate infibulation inficete infidel infidelic infidelical infidelism infidelistic infidelity infidelize infidelly infield infielder infieldsman infighter infighting infill infilling infilm infilter infiltrate infiltration infiltrative infinitant infinitarily infinitary infinitate infinitation infinite infinitely infiniteness infinitesimal infinitesimalism infinitesimality infinitesimally infinitesimalness infiniteth infinitieth infinitival infinitivally infinitive infinitively infinitize infinitude infinituple infinity infirm infirmarer infirmaress infirmarian infirmary infirmate infirmation infirmative infirmity infirmly infirmness infissile infit infitter infix infixion inflame inflamed inflamedly inflamedness inflamer inflaming inflamingly inflammability inflammable inflammableness inflammably inflammation inflammative inflammatorily inflammatory inflatable inflate inflated inflatedly inflatedness inflater inflatile inflatingly inflation inflationary inflationism inflationist inflative inflatus inflect inflected inflectedness inflection inflectional inflectionally inflectionless inflective inflector inflex inflexed inflexibility inflexible inflexibleness inflexibly inflexive inflict inflictable inflicter infliction inflictive inflood inflorescence inflorescent inflow inflowering influence influenceable influencer influencive influent influential influentiality influentially influenza influenzal influenzic influx influxable influxible influxibly influxion influxionism infold infolder infolding infoldment infoliate inform informable informal informality informalize informally informant information informational informative informatively informatory informed informedly informer informidable informingly informity infortiate infortitude infortunate infortunately infortunateness infortune infra infrabasal infrabestial infrabranchial infrabuccal infracanthal infracaudal infracelestial infracentral infracephalic infraclavicle infraclavicular infraclusion infraconscious infracortical infracostal infracostalis infracotyloid infract infractible infraction infractor infradentary infradiaphragmatic infragenual infraglacial infraglenoid infraglottic infragrant infragular infrahuman infrahyoid infralabial infralapsarian infralapsarianism infralinear infralittoral inframammary inframammillary inframandibular inframarginal inframaxillary inframedian inframercurial inframercurian inframolecular inframontane inframundane infranatural infranaturalism infrangibility infrangible infrangibleness infrangibly infranodal infranuclear infraoccipital infraocclusion infraocular infraoral infraorbital infraordinary infrapapillary infrapatellar infraperipherial infrapose infraposition infraprotein infrapubian infraradular infrared infrarenal infrarenally infrarimal infrascapular infrascapularis infrascientific infraspinal infraspinate infraspinatus infraspinous infrastapedial infrasternal infrastigmatal infrastipular infrastructure infrasutral infratemporal infraterrene infraterritorial infrathoracic infratonsillar infratracheal infratrochanteric infratrochlear infratubal infraturbinal infravaginal infraventral infrequency infrequent infrequently infrigidate infrigidation infrigidative infringe infringement infringer infringible infructiferous infructuose infructuosity infructuous infructuously infrugal infrustrable infrustrably infula infumate infumated infumation infundibular Infundibulata infundibulate infundibuliform infundibulum infuriate infuriately infuriatingly infuriation infuscate infuscation infuse infusedly infuser infusibility infusible infusibleness infusile infusion infusionism infusionist infusive Infusoria infusorial infusorian infusoriform infusorioid infusorium infusory Ing ing Inga Ingaevones Ingaevonic ingallantry ingate ingather ingatherer ingathering ingeldable ingeminate ingemination ingenerability ingenerable ingenerably ingenerate ingenerately ingeneration ingenerative ingeniosity ingenious ingeniously ingeniousness ingenit ingenue ingenuity ingenuous ingenuously ingenuousness Inger ingerminate ingest ingesta ingestible ingestion ingestive Inghamite Inghilois ingiver ingiving ingle inglenook ingleside inglobate inglobe inglorious ingloriously ingloriousness inglutition ingluvial ingluvies ingluviitis ingoing Ingomar ingot ingotman ingraft ingrain ingrained ingrainedly ingrainedness Ingram ingrammaticism ingrandize ingrate ingrateful ingratefully ingratefulness ingrately ingratiate ingratiating ingratiatingly ingratiation ingratiatory ingratitude ingravescent ingravidate ingravidation ingredient ingress ingression ingressive ingressiveness ingross ingrow ingrown ingrownness ingrowth inguen inguinal inguinoabdominal inguinocrural inguinocutaneous inguinodynia inguinolabial inguinoscrotal Inguklimiut ingulf ingulfment ingurgitate ingurgitation Ingush inhabit inhabitability inhabitable inhabitancy inhabitant inhabitation inhabitative inhabitativeness inhabited inhabitedness inhabiter inhabitiveness inhabitress inhalant inhalation inhalator inhale inhalement inhalent inhaler inharmonic inharmonical inharmonious inharmoniously inharmoniousness inharmony inhaul inhauler inhaust inhaustion inhearse inheaven inhere inherence inherency inherent inherently inherit inheritability inheritable inheritableness inheritably inheritage inheritance inheritor inheritress inheritrice inheritrix inhesion inhiate inhibit inhibitable inhibiter inhibition inhibitionist inhibitive inhibitor inhibitory inhomogeneity inhomogeneous inhomogeneously inhospitable inhospitableness inhospitably inhospitality inhuman inhumane inhumanely inhumanism inhumanity inhumanize inhumanly inhumanness inhumate inhumation inhumationist inhume inhumer inhumorous inhumorously Inia inial inidoneity inidoneous Inigo inimicable inimical inimicality inimically inimicalness inimitability inimitable inimitableness inimitably iniome Iniomi iniomous inion iniquitable iniquitably iniquitous iniquitously iniquitousness iniquity inirritability inirritable inirritant inirritative inissuable initial initialer initialist initialize initially initiant initiary initiate initiation initiative initiatively initiator initiatorily initiatory initiatress initiatrix initis initive inject injectable injection injector injelly injudicial injudicially injudicious injudiciously injudiciousness Injun injunct injunction injunctive injunctively injurable injure injured injuredly injuredness injurer injurious injuriously injuriousness injury injustice ink inkberry inkbush inken inker Inkerman inket inkfish inkholder inkhorn inkhornism inkhornist inkhornize inkhornizer inkindle inkiness inkish inkle inkless inklike inkling inkmaker inkmaking inknot inkosi inkpot Inkra inkroot inks inkshed inkslinger inkslinging inkstain inkstand inkstandish inkstone inkweed inkwell inkwood inkwriter inky inlagation inlaid inlaik inlake inland inlander inlandish inlaut inlaw inlawry inlay inlayer inlaying inleague inleak inleakage inlet inlier inlook inlooker inly inlying inmate inmeats inmixture inmost inn innascibility innascible innate innately innateness innatism innative innatural innaturality innaturally inneity inner innerly innermore innermost innermostly innerness innervate innervation innervational innerve inness innest innet innholder inning inninmorite Innisfail innkeeper innless innocence innocency innocent innocently innocentness innocuity innocuous innocuously innocuousness innominable innominables innominata innominate innominatum innovant innovate innovation innovational innovationist innovative innovator innovatory innoxious innoxiously innoxiousness innuendo Innuit innumerability innumerable innumerableness innumerably innumerous innutrient innutrition innutritious innutritive innyard Ino inobedience inobedient inobediently inoblast inobnoxious inobscurable inobservable inobservance inobservancy inobservant inobservantly inobservantness inobservation inobtainable inobtrusive inobtrusively inobtrusiveness inobvious Inocarpus inoccupation Inoceramus inochondritis inochondroma inoculability inoculable inoculant inocular inoculate inoculation inoculative inoculator inoculum inocystoma inocyte Inodes inodorous inodorously inodorousness inoepithelioma inoffending inoffensive inoffensively inoffensiveness inofficial inofficially inofficiosity inofficious inofficiously inofficiousness inogen inogenesis inogenic inogenous inoglia inohymenitic inolith inoma inominous inomyoma inomyositis inomyxoma inone inoneuroma inoperable inoperative inoperativeness inopercular Inoperculata inoperculate inopinable inopinate inopinately inopine inopportune inopportunely inopportuneness inopportunism inopportunist inopportunity inoppressive inoppugnable inopulent inorb inorderly inordinacy inordinary inordinate inordinately inordinateness inorganic inorganical inorganically inorganizable inorganization inorganized inoriginate inornate inosclerosis inoscopy inosculate inosculation inosic inosin inosinic inosite inositol inostensible inostensibly inotropic inower inoxidability inoxidable inoxidizable inoxidize inparabola inpardonable inpatient inpayment inpensioner inphase inpolygon inpolyhedron inport inpour inpush input inquaintance inquartation inquest inquestual inquiet inquietation inquietly inquietness inquietude Inquilinae inquiline inquilinism inquilinity inquilinous inquinate inquination inquirable inquirant inquiration inquire inquirendo inquirent inquirer inquiring inquiringly inquiry inquisite inquisition inquisitional inquisitionist inquisitive inquisitively inquisitiveness inquisitor inquisitorial inquisitorially inquisitorialness inquisitorious inquisitorship inquisitory inquisitress inquisitrix inquisiturient inradius inreality inrigged inrigger inrighted inring inro inroad inroader inroll inrooted inrub inrun inrunning inruption inrush insack insagacity insalivate insalivation insalubrious insalubrity insalutary insalvability insalvable insane insanely insaneness insanify insanitariness insanitary insanitation insanity insapiency insapient insatiability insatiable insatiableness insatiably insatiate insatiated insatiately insatiateness insatiety insatisfaction insatisfactorily insaturable inscenation inscibile inscience inscient inscribable inscribableness inscribe inscriber inscript inscriptible inscription inscriptional inscriptioned inscriptionist inscriptionless inscriptive inscriptively inscriptured inscroll inscrutability inscrutable inscrutableness inscrutables inscrutably insculp insculpture insea inseam insect Insecta insectan insectarium insectary insectean insected insecticidal insecticide insectiferous insectiform insectifuge insectile insectine insection insectival Insectivora insectivore insectivorous insectlike insectmonger insectologer insectologist insectology insectproof insecure insecurely insecureness insecurity insee inseer inselberg inseminate insemination insenescible insensate insensately insensateness insense insensibility insensibilization insensibilize insensibilizer insensible insensibleness insensibly insensitive insensitiveness insensitivity insensuous insentience insentiency insentient inseparability inseparable inseparableness inseparably inseparate inseparately insequent insert insertable inserted inserter insertion insertional insertive inserviceable insessor Insessores insessorial inset insetter inseverable inseverably inshave insheathe inshell inshining inship inshoe inshoot inshore inside insider insidiosity insidious insidiously insidiousness insight insightful insigne insignia insignificance insignificancy insignificant insignificantly insimplicity insincere insincerely insincerity insinking insinuant insinuate insinuating insinuatingly insinuation insinuative insinuatively insinuativeness insinuator insinuatory insinuendo insipid insipidity insipidly insipidness insipience insipient insipiently insist insistence insistency insistent insistently insister insistingly insistive insititious insnare insnarement insnarer insobriety insociability insociable insociableness insociably insocial insocially insofar insolate insolation insole insolence insolency insolent insolently insolentness insolid insolidity insolubility insoluble insolubleness insolubly insolvability insolvable insolvably insolvence insolvency insolvent insomnia insomniac insomnious insomnolence insomnolency insomnolent insomuch insonorous insooth insorb insorbent insouciance insouciant insouciantly insoul inspan inspeak inspect inspectability inspectable inspectingly inspection inspectional inspectioneer inspective inspector inspectoral inspectorate inspectorial inspectorship inspectress inspectrix inspheration insphere inspirability inspirable inspirant inspiration inspirational inspirationalism inspirationally inspirationist inspirative inspirator inspiratory inspiratrix inspire inspired inspiredly inspirer inspiring inspiringly inspirit inspiriter inspiriting inspiritingly inspiritment inspirometer inspissant inspissate inspissation inspissator inspissosis inspoke inspoken inspreith instability instable install installant installation installer installment instance instancy instanding instant instantaneity instantaneous instantaneously instantaneousness instanter instantial instantly instantness instar instate instatement instaurate instauration instaurator instead instealing insteam insteep instellation instep instigant instigate instigatingly instigation instigative instigator instigatrix instill instillation instillator instillatory instiller instillment instinct instinctive instinctively instinctivist instinctivity instinctual instipulate institor institorial institorian institory institute instituter institution institutional institutionalism institutionalist institutionality institutionalization institutionalize institutionally institutionary institutionize institutive institutively institutor institutress institutrix instonement instratified instreaming instrengthen instressed instroke instruct instructed instructedly instructedness instructer instructible instruction instructional instructionary instructive instructively instructiveness instructor instructorship instructress instrument instrumental instrumentalism instrumentalist instrumentality instrumentalize instrumentally instrumentary instrumentate instrumentation instrumentative instrumentist instrumentman insuavity insubduable insubjection insubmergible insubmersible insubmission insubmissive insubordinate insubordinately insubordinateness insubordination insubstantial insubstantiality insubstantiate insubstantiation insubvertible insuccess insuccessful insucken insuetude insufferable insufferableness insufferably insufficience insufficiency insufficient insufficiently insufflate insufflation insufflator insula insulance insulant insular insularism insularity insularize insularly insulary insulate insulated insulating insulation insulator insulin insulize insulse insulsity insult insultable insultant insultation insulter insulting insultingly insultproof insunk insuperability insuperable insuperableness insuperably insupportable insupportableness insupportably insupposable insuppressible insuppressibly insuppressive insurability insurable insurance insurant insure insured insurer insurge insurgence insurgency insurgent insurgentism insurgescence insurmountability insurmountable insurmountableness insurmountably insurpassable insurrect insurrection insurrectional insurrectionally insurrectionary insurrectionism insurrectionist insurrectionize insurrectory insusceptibility insusceptible insusceptibly insusceptive inswamp inswarming insweeping inswell inswept inswing inswinger intabulate intact intactile intactly intactness intagliated intagliation intaglio intagliotype intake intaker intangibility intangible intangibleness intangibly intarissable intarsia intarsiate intarsist intastable intaxable intechnicality integer integrability integrable integral integrality integralization integralize integrally integrand integrant integraph integrate integration integrative integrator integrifolious integrious integriously integripalliate integrity integrodifferential integropallial Integropallialia Integropalliata integropalliate integument integumental integumentary integumentation inteind intellect intellectation intellected intellectible intellection intellective intellectively intellectual intellectualism intellectualist intellectualistic intellectualistically intellectuality intellectualization intellectualize intellectualizer intellectually intellectualness intelligence intelligenced intelligencer intelligency intelligent intelligential intelligently intelligentsia intelligibility intelligible intelligibleness intelligibly intelligize intemerate intemerately intemerateness intemeration intemperable intemperably intemperament intemperance intemperate intemperately intemperateness intemperature intempestive intempestively intempestivity intemporal intemporally intenability intenable intenancy intend intendance intendancy intendant intendantism intendantship intended intendedly intendedness intendence intender intendible intending intendingly intendit intendment intenerate inteneration intenible intensate intensation intensative intense intensely intenseness intensification intensifier intensify intension intensional intensionally intensitive intensity intensive intensively intensiveness intent intention intentional intentionalism intentionality intentionally intentioned intentionless intentive intentively intentiveness intently intentness inter interabsorption interacademic interaccessory interaccuse interacinar interacinous interact interaction interactional interactionism interactionist interactive interactivity interadaptation interadditive interadventual interaffiliation interagency interagent interagglutinate interagglutination interagree interagreement interalar interallied interally interalveolar interambulacral interambulacrum interamnian interangular interanimate interannular interantagonism interantennal interantennary interapophyseal interapplication interarboration interarch interarcualis interarmy interarticular interartistic interarytenoid interassociation interassure interasteroidal interastral interatomic interatrial interattrition interaulic interaural interauricular interavailability interavailable interaxal interaxial interaxillary interaxis interbalance interbanded interbank interbedded interbelligerent interblend interbody interbonding interborough interbourse interbrachial interbrain interbranch interbranchial interbreath interbreed interbrigade interbring interbronchial intercadence intercadent intercalare intercalarily intercalarium intercalary intercalate intercalation intercalative intercalatory intercale intercalm intercanal intercanalicular intercapillary intercardinal intercarotid intercarpal intercarpellary intercarrier intercartilaginous intercaste intercatenated intercausative intercavernous intercede interceder intercellular intercensal intercentral intercentrum intercept intercepter intercepting interception interceptive interceptor interceptress intercerebral intercession intercessional intercessionary intercessionment intercessive intercessor intercessorial intercessory interchaff interchange interchangeability interchangeable interchangeableness interchangeably interchanger interchapter intercharge interchase intercheck interchoke interchondral interchurch Intercidona interciliary intercilium intercircle intercirculate intercirculation intercision intercitizenship intercity intercivic intercivilization interclash interclasp interclass interclavicle interclavicular interclerical intercloud interclub intercoastal intercoccygeal intercoccygean intercohesion intercollege intercollegian intercollegiate intercolline intercolonial intercolonially intercolonization intercolumn intercolumnal intercolumnar intercolumniation intercom intercombat intercombination intercombine intercome intercommission intercommon intercommonable intercommonage intercommoner intercommunal intercommune intercommuner intercommunicability intercommunicable intercommunicate intercommunication intercommunicative intercommunicator intercommunion intercommunity intercompany intercomparable intercompare intercomparison intercomplexity intercomplimentary interconal interconciliary intercondenser intercondylar intercondylic intercondyloid interconfessional interconfound interconnect interconnection intercontinental intercontorted intercontradiction intercontradictory interconversion interconvertibility interconvertible interconvertibly intercooler intercooling intercoracoid intercorporate intercorpuscular intercorrelate intercorrelation intercortical intercosmic intercosmically intercostal intercostally intercostobrachial intercostohumeral intercotylar intercounty intercourse intercoxal intercranial intercreate intercrescence intercrinal intercrop intercross intercrural intercrust intercrystalline intercrystallization intercrystallize intercultural interculture intercurl intercurrence intercurrent intercurrently intercursation intercuspidal intercutaneous intercystic interdash interdebate interdenominational interdental interdentally interdentil interdepartmental interdepartmentally interdepend interdependable interdependence interdependency interdependent interdependently interderivative interdespise interdestructive interdestructiveness interdetermination interdetermine interdevour interdict interdiction interdictive interdictor interdictory interdictum interdifferentiation interdiffuse interdiffusion interdiffusive interdiffusiveness interdigital interdigitate interdigitation interdine interdiscal interdispensation interdistinguish interdistrict interdivision interdome interdorsal interdrink intereat interelectrode interelectrodic interempire interenjoy interentangle interentanglement interepidemic interepimeral interepithelial interequinoctial interessee interest interested interestedly interestedness interester interesting interestingly interestingness interestless interestuarine interface interfacial interfactional interfamily interfascicular interfault interfector interfederation interfemoral interfenestral interfenestration interferant interfere interference interferent interferential interferer interfering interferingly interferingness interferometer interferometry interferric interfertile interfertility interfibrillar interfibrillary interfibrous interfilamentar interfilamentary interfilamentous interfilar interfiltrate interfinger interflange interflashing interflow interfluence interfluent interfluminal interfluous interfluve interfluvial interflux interfold interfoliaceous interfoliar interfoliate interfollicular interforce interfraternal interfraternity interfret interfretted interfriction interfrontal interfruitful interfulgent interfuse interfusion interganglionic intergenerant intergenerating intergeneration intergential intergesture intergilt interglacial interglandular interglobular interglyph intergossip intergovernmental intergradation intergrade intergradient intergraft intergranular intergrapple intergrave intergroupal intergrow intergrown intergrowth intergular intergyral interhabitation interhemal interhemispheric interhostile interhuman interhyal interhybridize interim interimist interimistic interimistical interimistically interimperial interincorporation interindependence interindicate interindividual interinfluence interinhibition interinhibitive interinsert interinsular interinsurance interinsurer interinvolve interionic interior interiority interiorize interiorly interiorness interirrigation interisland interjacence interjacency interjacent interjaculate interjaculatory interjangle interjealousy interject interjection interjectional interjectionalize interjectionally interjectionary interjectionize interjectiveness interjector interjectorily interjectory interjectural interjoin interjoist interjudgment interjunction interkinesis interkinetic interknit interknot interknow interknowledge interlaboratory interlace interlaced interlacedly interlacement interlacery interlacustrine interlaid interlake interlamellar interlamellation interlaminar interlaminate interlamination interlanguage interlap interlapse interlard interlardation interlardment interlatitudinal interlaudation interlay interleaf interleague interleave interleaver interlibel interlibrary interlie interligamentary interligamentous interlight interlimitation interline interlineal interlineally interlinear interlinearily interlinearly interlineary interlineate interlineation interlinement interliner Interlingua interlingual interlinguist interlinguistic interlining interlink interloan interlobar interlobate interlobular interlocal interlocally interlocate interlocation interlock interlocker interlocular interloculus interlocution interlocutive interlocutor interlocutorily interlocutory interlocutress interlocutrice interlocutrix interloop interlope interloper interlot interlucation interlucent interlude interluder interludial interlunar interlunation interlying intermalleolar intermammary intermammillary intermandibular intermanorial intermarginal intermarine intermarriage intermarriageable intermarry intermason intermastoid intermat intermatch intermaxilla intermaxillar intermaxillary intermaze intermeasurable intermeasure intermeddle intermeddlement intermeddler intermeddlesome intermeddlesomeness intermeddling intermeddlingly intermediacy intermediae intermedial intermediary intermediate intermediately intermediateness intermediation intermediator intermediatory intermedium intermedius intermeet intermelt intermembral intermembranous intermeningeal intermenstrual intermenstruum interment intermental intermention intermercurial intermesenterial intermesenteric intermesh intermessage intermessenger intermetacarpal intermetallic intermetameric intermetatarsal intermew intermewed intermewer intermezzo intermigration interminability interminable interminableness interminably interminant interminate intermine intermingle intermingledom interminglement interminister interministerial interministerium intermission intermissive intermit intermitted intermittedly intermittence intermittency intermittent intermittently intermitter intermitting intermittingly intermix intermixedly intermixtly intermixture intermobility intermodification intermodillion intermodulation intermolar intermolecular intermomentary intermontane intermorainic intermotion intermountain intermundane intermundial intermundian intermundium intermunicipal intermunicipality intermural intermuscular intermutation intermutual intermutually intermutule intern internal internality internalization internalize internally internalness internals internarial internasal internation international internationalism internationalist internationality internationalization internationalize internationally interneciary internecinal internecine internecion internecive internee internetted interneural interneuronic internidal internist internment internobasal internodal internode internodial internodian internodium internodular internship internuclear internuncial internunciary internunciatory internuncio internuncioship internuncius internuptial interobjective interoceanic interoceptive interoceptor interocular interoffice interolivary interopercle interopercular interoperculum interoptic interorbital interorbitally interoscillate interosculant interosculate interosculation interosseal interosseous interownership interpage interpalatine interpalpebral interpapillary interparenchymal interparental interparenthetical interparenthetically interparietal interparietale interparliament interparliamentary interparoxysmal interparty interpause interpave interpeal interpectoral interpeduncular interpel interpellant interpellate interpellation interpellator interpenetrable interpenetrant interpenetrate interpenetration interpenetrative interpenetratively interpermeate interpersonal interpervade interpetaloid interpetiolar interpetiolary interphalangeal interphase interphone interpiece interpilaster interpilastering interplacental interplait interplanetary interplant interplanting interplay interplea interplead interpleader interpledge interpleural interplical interplicate interplication interplight interpoint interpolable interpolar interpolary interpolate interpolater interpolation interpolative interpolatively interpolator interpole interpolitical interpolity interpollinate interpolymer interpone interportal interposable interposal interpose interposer interposing interposingly interposition interposure interpour interprater interpressure interpret interpretability interpretable interpretableness interpretably interpretament interpretation interpretational interpretative interpretatively interpreter interpretership interpretive interpretively interpretorial interpretress interprismatic interproduce interprofessional interproglottidal interproportional interprotoplasmic interprovincial interproximal interproximate interpterygoid interpubic interpulmonary interpunct interpunction interpunctuate interpunctuation interpupillary interquarrel interquarter interrace interracial interracialism interradial interradially interradiate interradiation interradium interradius interrailway interramal interramicorn interramification interreceive interreflection interregal interregimental interregional interregna interregnal interregnum interreign interrelate interrelated interrelatedly interrelatedness interrelation interrelationship interreligious interrenal interrenalism interrepellent interrepulsion interrer interresponsibility interresponsible interreticular interreticulation interrex interrhyme interright interriven interroad interrogability interrogable interrogant interrogate interrogatedness interrogatee interrogatingly interrogation interrogational interrogative interrogatively interrogator interrogatorily interrogatory interrogatrix interrogee interroom interrule interrun interrupt interrupted interruptedly interruptedness interrupter interruptible interrupting interruptingly interruption interruptive interruptively interruptor interruptory intersale intersalute interscapilium interscapular interscapulum interscene interscholastic interschool interscience interscribe interscription interseaboard interseamed intersect intersectant intersection intersectional intersegmental interseminal intersentimental interseptal intersertal intersesamoid intersession intersessional interset intersex intersexual intersexualism intersexuality intershade intershifting intershock intershoot intershop intersidereal intersituate intersocial intersocietal intersociety intersole intersolubility intersoluble intersomnial intersomnious intersonant intersow interspace interspatial interspatially interspeaker interspecial interspecific interspersal intersperse interspersedly interspersion interspheral intersphere interspicular interspinal interspinalis interspinous interspiral interspiration intersporal intersprinkle intersqueeze interstadial interstage interstaminal interstapedial interstate interstation interstellar interstellary intersterile intersterility intersternal interstice intersticed interstimulate interstimulation interstitial interstitially interstitious interstratification interstratify interstreak interstream interstreet interstrial interstriation interstrive intersubjective intersubsistence intersubstitution intersuperciliary intersusceptation intersystem intersystematical intertalk intertangle intertanglement intertarsal interteam intertentacular intertergal interterminal interterritorial intertessellation intertexture interthing interthreaded interthronging intertidal intertie intertill intertillage intertinge intertissued intertone intertongue intertonic intertouch intertown intertrabecular intertrace intertrade intertrading intertraffic intertragian intertransformability intertransformable intertransmissible intertransmission intertranspicuous intertransversal intertransversalis intertransversary intertransverse intertrappean intertribal intertriginous intertriglyph intertrigo intertrinitarian intertrochanteric intertropic intertropical intertropics intertrude intertuberal intertubercular intertubular intertwin intertwine intertwinement intertwining intertwiningly intertwist intertwistingly Intertype interungular interungulate interunion interuniversity interurban interureteric intervaginal interval intervale intervalley intervallic intervallum intervalvular intervarietal intervary intervascular intervein interveinal intervenant intervene intervener intervenience interveniency intervenient intervenium intervention interventional interventionism interventionist interventive interventor interventral interventralia interventricular intervenular interverbal interversion intervert intervertebra intervertebral intervertebrally intervesicular interview interviewable interviewee interviewer intervillous intervisibility intervisible intervisit intervisitation intervital intervocal intervocalic intervolute intervolution intervolve interwar interweave interweavement interweaver interweaving interweavingly interwed interweld interwhiff interwhile interwhistle interwind interwish interword interwork interworks interworld interworry interwound interwove interwoven interwovenly interwrap interwreathe interwrought interxylary interzonal interzone interzooecial interzygapophysial intestable intestacy intestate intestation intestinal intestinally intestine intestineness intestiniform intestinovesical intext intextine intexture inthrall inthrallment inthrong inthronistic inthronization inthronize inthrow inthrust intil intima intimacy intimal intimate intimately intimateness intimater intimation intimidate intimidation intimidator intimidatory intimidity intimity intinction intine intitule into intoed intolerability intolerable intolerableness intolerably intolerance intolerancy intolerant intolerantly intolerantness intolerated intolerating intoleration intonable intonate intonation intonator intone intonement intoner intoothed intorsion intort intortillage intown intoxation intoxicable intoxicant intoxicate intoxicated intoxicatedly intoxicatedness intoxicating intoxicatingly intoxication intoxicative intoxicator intrabiontic intrabranchial intrabred intrabronchial intrabuccal intracalicular intracanalicular intracanonical intracapsular intracardiac intracardial intracarpal intracarpellary intracartilaginous intracellular intracellularly intracephalic intracerebellar intracerebral intracerebrally intracervical intrachordal intracistern intracity intraclitelline intracloacal intracoastal intracoelomic intracolic intracollegiate intracommunication intracompany intracontinental intracorporeal intracorpuscular intracortical intracosmic intracosmical intracosmically intracostal intracranial intracranially intractability intractable intractableness intractably intractile intracutaneous intracystic intrada intradepartmental intradermal intradermally intradermic intradermically intradermo intradistrict intradivisional intrados intraduodenal intradural intraecclesiastical intraepiphyseal intraepithelial intrafactory intrafascicular intrafissural intrafistular intrafoliaceous intraformational intrafusal intragastric intragemmal intraglacial intraglandular intraglobular intragroup intragroupal intragyral intrahepatic intrahyoid intraimperial intrait intrajugular intralamellar intralaryngeal intralaryngeally intraleukocytic intraligamentary intraligamentous intralingual intralobar intralobular intralocular intralogical intralumbar intramammary intramarginal intramastoid intramatrical intramatrically intramedullary intramembranous intrameningeal intramental intrametropolitan intramolecular intramontane intramorainic intramundane intramural intramuralism intramuscular intramuscularly intramyocardial intranarial intranasal intranatal intranational intraneous intraneural intranidal intranquil intranquillity intranscalency intranscalent intransferable intransformable intransfusible intransgressible intransient intransigency intransigent intransigentism intransigentist intransigently intransitable intransitive intransitively intransitiveness intransitivity intranslatable intransmissible intransmutability intransmutable intransparency intransparent intrant intranuclear intraoctave intraocular intraoral intraorbital intraorganization intraossal intraosseous intraosteal intraovarian intrapair intraparenchymatous intraparietal intraparochial intraparty intrapelvic intrapericardiac intrapericardial intraperineal intraperiosteal intraperitoneal intraperitoneally intrapetiolar intraphilosophic intrapial intraplacental intraplant intrapleural intrapolar intrapontine intraprostatic intraprotoplasmic intrapsychic intrapsychical intrapsychically intrapulmonary intrapyretic intrarachidian intrarectal intrarelation intrarenal intraretinal intrarhachidian intraschool intrascrotal intrasegmental intraselection intrasellar intraseminal intraseptal intraserous intrashop intraspecific intraspinal intrastate intrastromal intrasusception intrasynovial intratarsal intratelluric intraterritorial intratesticular intrathecal intrathoracic intrathyroid intratomic intratonsillar intratrabecular intratracheal intratracheally intratropical intratubal intratubular intratympanic intravaginal intravalvular intravasation intravascular intravenous intravenously intraventricular intraverbal intraversable intravertebral intravertebrally intravesical intravital intravitelline intravitreous intraxylary intreat intrench intrenchant intrencher intrenchment intrepid intrepidity intrepidly intrepidness intricacy intricate intricately intricateness intrication intrigant intrigue intrigueproof intriguer intriguery intriguess intriguing intriguingly intrine intrinse intrinsic intrinsical intrinsicality intrinsically intrinsicalness introactive introceptive introconversion introconvertibility introconvertible introdden introduce introducee introducement introducer introducible introduction introductive introductively introductor introductorily introductoriness introductory introductress introflex introflexion introgression introgressive introinflection introit introitus introject introjection introjective intromissibility intromissible intromission intromissive intromit intromittence intromittent intromitter intropression intropulsive introreception introrsal introrse introrsely introsensible introsentient introspect introspectable introspection introspectional introspectionism introspectionist introspective introspectively introspectiveness introspectivism introspectivist introspector introsuction introsuscept introsusception introthoracic introtraction introvenient introverse introversibility introversible introversion introversive introversively introvert introverted introvertive introvision introvolution intrudance intrude intruder intruding intrudingly intrudress intruse intrusion intrusional intrusionism intrusionist intrusive intrusively intrusiveness intrust intubate intubation intubationist intubator intube intue intuent intuicity intuit intuitable intuition intuitional intuitionalism intuitionalist intuitionally intuitionism intuitionist intuitionistic intuitionless intuitive intuitively intuitiveness intuitivism intuitivist intumesce intumescence intumescent inturbidate inturn inturned inturning intussuscept intussusception intussusceptive intwist inula inulaceous inulase inulin inuloid inumbrate inumbration inunct inunction inunctum inunctuosity inunctuous inundable inundant inundate inundation inundator inundatory inunderstandable inurbane inurbanely inurbaneness inurbanity inure inured inuredness inurement inurn inusitate inusitateness inusitation inustion inutile inutilely inutility inutilized inutterable invaccinate invaccination invadable invade invader invaginable invaginate invagination invalescence invalid invalidate invalidation invalidator invalidcy invalidhood invalidish invalidism invalidity invalidly invalidness invalidship invalorous invaluable invaluableness invaluably invalued Invar invariability invariable invariableness invariably invariance invariancy invariant invariantive invariantively invariantly invaried invasion invasionist invasive invecked invected invection invective invectively invectiveness invectivist invector inveigh inveigher inveigle inveiglement inveigler inveil invein invendibility invendible invendibleness invenient invent inventable inventary inventer inventful inventibility inventible inventibleness invention inventional inventionless inventive inventively inventiveness inventor inventoriable inventorial inventorially inventory inventress inventurous inveracious inveracity inverisimilitude inverity inverminate invermination invernacular Inverness inversable inversatile inverse inversed inversedly inversely inversion inversionist inversive invert invertase invertebracy invertebral Invertebrata invertebrate invertebrated inverted invertedly invertend inverter invertibility invertible invertile invertin invertive invertor invest investable investible investigable investigatable investigate investigating investigatingly investigation investigational investigative investigator investigatorial investigatory investitive investitor investiture investment investor inveteracy inveterate inveterately inveterateness inviability invictive invidious invidiously invidiousness invigilance invigilancy invigilation invigilator invigor invigorant invigorate invigorating invigoratingly invigoratingness invigoration invigorative invigoratively invigorator invinate invination invincibility invincible invincibleness invincibly inviolability inviolable inviolableness inviolably inviolacy inviolate inviolated inviolately inviolateness invirile invirility invirtuate inviscate inviscation inviscid inviscidity invised invisibility invisible invisibleness invisibly invitable invital invitant invitation invitational invitatory invite invitee invitement inviter invitiate inviting invitingly invitingness invitress invitrifiable invivid invocable invocant invocate invocation invocative invocator invocatory invoice invoke invoker involatile involatility involucel involucellate involucellated involucral involucrate involucre involucred involucriform involucrum involuntarily involuntariness involuntary involute involuted involutedly involutely involution involutional involutionary involutorial involutory involve involved involvedly involvedness involvement involvent involver invulnerability invulnerable invulnerableness invulnerably invultuation inwale inwall inwandering inward inwardly inwardness inwards inweave inwedged inweed inweight inwick inwind inwit inwith inwood inwork inworn inwound inwoven inwrap inwrapment inwreathe inwrit inwrought inyoite inyoke Io io Iodamoeba iodate iodation iodhydrate iodhydric iodhydrin iodic iodide iodiferous iodinate iodination iodine iodinium iodinophil iodinophilic iodinophilous iodism iodite iodization iodize iodizer iodo iodobehenate iodobenzene iodobromite iodocasein iodochloride iodochromate iodocresol iododerma iodoethane iodoform iodogallicin iodohydrate iodohydric iodohydrin iodol iodomercurate iodomercuriate iodomethane iodometric iodometrical iodometry iodonium iodopsin iodoso iodosobenzene iodospongin iodotannic iodotherapy iodothyrin iodous iodoxy iodoxybenzene iodyrite iolite ion Ione Ioni Ionian Ionic ionic Ionicism Ionicization Ionicize Ionidium Ionism Ionist ionium ionizable Ionization ionization Ionize ionize ionizer ionogen ionogenic ionone Ionornis ionosphere ionospheric Ionoxalis iontophoresis Ioskeha iota iotacism iotacismus iotacist iotization iotize Iowa Iowan Ipalnemohuani ipecac ipecacuanha ipecacuanhic Iphimedia Iphis ipid Ipidae ipil ipomea Ipomoea ipomoein ipseand ipsedixitish ipsedixitism ipsedixitist ipseity ipsilateral Ira iracund iracundity iracundulous irade Iran Irani Iranian Iranic Iranism Iranist Iranize Iraq Iraqi Iraqian irascent irascibility irascible irascibleness irascibly irate irately ire ireful irefully irefulness Irelander ireless Irena irenarch Irene irene irenic irenical irenically irenicism irenicist irenicon irenics irenicum Iresine Irfan Irgun Irgunist irian Iriartea Iriarteaceae Iricism Iricize irid Iridaceae iridaceous iridadenosis iridal iridalgia iridate iridauxesis iridectome iridectomize iridectomy iridectropium iridemia iridencleisis iridentropium irideous irideremia irides iridesce iridescence iridescency iridescent iridescently iridial iridian iridiate iridic iridical iridin iridine iridiocyte iridiophore iridioplatinum iridious iridite iridium iridization iridize iridoavulsion iridocapsulitis iridocele iridoceratitic iridochoroiditis iridocoloboma iridoconstrictor iridocyclitis iridocyte iridodesis iridodiagnosis iridodialysis iridodonesis iridokinesia iridomalacia iridomotor Iridomyrmex iridoncus iridoparalysis iridophore iridoplegia iridoptosis iridopupillary iridorhexis iridosclerotomy iridosmine iridosmium iridotasis iridotome iridotomy iris irisated irisation iriscope irised Irish Irisher Irishian Irishism Irishize Irishly Irishman Irishness Irishry Irishwoman Irishy irisin irislike irisroot iritic iritis irk irksome irksomely irksomeness Irma Iroha irok iroko iron ironback ironbark ironbound ironbush ironclad irone ironer ironfisted ironflower ironhanded ironhandedly ironhandedness ironhard ironhead ironheaded ironhearted ironheartedly ironheartedness ironical ironically ironicalness ironice ironish ironism ironist ironize ironless ironlike ironly ironmaker ironmaking ironman ironmaster ironmonger ironmongering ironmongery ironness ironshod ironshot ironside ironsided ironsides ironsmith ironstone ironware ironweed ironwood ironwork ironworked ironworker ironworking ironworks ironwort irony Iroquoian Iroquois Irpex irradiance irradiancy irradiant irradiate irradiated irradiatingly irradiation irradiative irradiator irradicable irradicate irrarefiable irrationability irrationable irrationably irrational irrationalism irrationalist irrationalistic irrationality irrationalize irrationally irrationalness irreality irrealizable irrebuttable irreceptive irreceptivity irreciprocal irreciprocity irreclaimability irreclaimable irreclaimableness irreclaimably irreclaimed irrecognition irrecognizability irrecognizable irrecognizably irrecognizant irrecollection irreconcilability irreconcilable irreconcilableness irreconcilably irreconcile irreconcilement irreconciliability irreconciliable irreconciliableness irreconciliably irreconciliation irrecordable irrecoverable irrecoverableness irrecoverably irrecusable irrecusably irredeemability irredeemable irredeemableness irredeemably irredeemed irredenta irredential Irredentism Irredentist irredressibility irredressible irredressibly irreducibility irreducible irreducibleness irreducibly irreductibility irreductible irreduction irreferable irreflection irreflective irreflectively irreflectiveness irreflexive irreformability irreformable irrefragability irrefragable irrefragableness irrefragably irrefrangibility irrefrangible irrefrangibleness irrefrangibly irrefusable irrefutability irrefutable irrefutableness irrefutably irregardless irregeneracy irregenerate irregeneration irregular irregularism irregularist irregularity irregularize irregularly irregularness irregulate irregulated irregulation irrelate irrelated irrelation irrelative irrelatively irrelativeness irrelevance irrelevancy irrelevant irrelevantly irreliability irrelievable irreligion irreligionism irreligionist irreligionize irreligiosity irreligious irreligiously irreligiousness irreluctant irremeable irremeably irremediable irremediableness irremediably irrememberable irremissibility irremissible irremissibleness irremissibly irremission irremissive irremovability irremovable irremovableness irremovably irremunerable irrenderable irrenewable irrenunciable irrepair irrepairable irreparability irreparable irreparableness irreparably irrepassable irrepealability irrepealable irrepealableness irrepealably irrepentance irrepentant irrepentantly irreplaceable irreplaceably irrepleviable irreplevisable irreportable irreprehensible irreprehensibleness irreprehensibly irrepresentable irrepresentableness irrepressibility irrepressible irrepressibleness irrepressibly irrepressive irreproachability irreproachable irreproachableness irreproachably irreproducible irreproductive irreprovable irreprovableness irreprovably irreptitious irrepublican irresilient irresistance irresistibility irresistible irresistibleness irresistibly irresoluble irresolubleness irresolute irresolutely irresoluteness irresolution irresolvability irresolvable irresolvableness irresolved irresolvedly irresonance irresonant irrespectability irrespectable irrespectful irrespective irrespectively irrespirable irrespondence irresponsibility irresponsible irresponsibleness irresponsibly irresponsive irresponsiveness irrestrainable irrestrainably irrestrictive irresultive irresuscitable irresuscitably irretention irretentive irretentiveness irreticence irreticent irretraceable irretraceably irretractable irretractile irretrievability irretrievable irretrievableness irretrievably irrevealable irrevealably irreverence irreverend irreverendly irreverent irreverential irreverentialism irreverentially irreverently irreversibility irreversible irreversibleness irreversibly irrevertible irreviewable irrevisable irrevocability irrevocable irrevocableness irrevocably irrevoluble irrigable irrigably irrigant irrigate irrigation irrigational irrigationist irrigative irrigator irrigatorial irrigatory irriguous irriguousness irrision irrisor Irrisoridae irrisory irritability irritable irritableness irritably irritament irritancy irritant irritate irritatedly irritating irritatingly irritation irritative irritativeness irritator irritatory Irritila irritomotile irritomotility irrorate irrotational irrotationally irrubrical irrupt irruptible irruption irruptive irruptively Irvin Irving Irvingesque Irvingiana Irvingism Irvingite Irwin is Isaac Isabel isabelina isabelita Isabella Isabelle Isabelline isabnormal isaconitine isacoustic isadelphous Isadora isagoge isagogic isagogical isagogically isagogics isagon Isaiah Isaian isallobar isallotherm isamine Isander isandrous isanemone isanomal isanomalous isanthous isapostolic Isaria isarioid isatate isatic isatide isatin isatinic Isatis isatogen isatogenic Isaurian Isawa isazoxy isba Iscariot Iscariotic Iscariotical Iscariotism ischemia ischemic ischiac ischiadic ischiadicus ischial ischialgia ischialgic ischiatic ischidrosis ischioanal ischiobulbar ischiocapsular ischiocaudal ischiocavernosus ischiocavernous ischiocele ischiocerite ischiococcygeal ischiofemoral ischiofibular ischioiliac ischioneuralgia ischioperineal ischiopodite ischiopubic ischiopubis ischiorectal ischiorrhogic ischiosacral ischiotibial ischiovaginal ischiovertebral ischium ischocholia ischuretic ischuria ischury Ischyodus Isegrim isenergic isentropic isepiptesial isepiptesis iserine iserite isethionate isethionic Iseum Isfahan Ishmael Ishmaelite Ishmaelitic Ishmaelitish Ishmaelitism ishpingo ishshakku Isiac Isiacal Isidae isidiiferous isidioid isidiophorous isidiose isidium isidoid Isidore Isidorian Isidoric Isinai isindazole isinglass Isis Islam Islamic Islamism Islamist Islamistic Islamite Islamitic Islamitish Islamization Islamize island islander islandhood islandic islandish islandless islandlike islandman islandress islandry islandy islay isle isleless islesman islet Isleta isleted isleward islot ism Ismaelism Ismaelite Ismaelitic Ismaelitical Ismaelitish Ismaili Ismailian Ismailite ismal ismatic ismatical ismaticalness ismdom ismy Isnardia iso isoabnormal isoagglutination isoagglutinative isoagglutinin isoagglutinogen isoalantolactone isoallyl isoamarine isoamide isoamyl isoamylamine isoamylene isoamylethyl isoamylidene isoantibody isoantigen isoapiole isoasparagine isoaurore isobar isobarbaloin isobarbituric isobare isobaric isobarism isobarometric isobase isobath isobathic isobathytherm isobathythermal isobathythermic isobenzofuran isobilateral isobilianic isobiogenetic isoborneol isobornyl isobront isobronton isobutane isobutyl isobutylene isobutyraldehyde isobutyrate isobutyric isobutyryl isocamphor isocamphoric isocaproic isocarbostyril Isocardia Isocardiidae isocarpic isocarpous isocellular isocephalic isocephalism isocephalous isocephaly isocercal isocercy isochasm isochasmic isocheim isocheimal isocheimenal isocheimic isocheimonal isochlor isochlorophyll isochlorophyllin isocholanic isocholesterin isocholesterol isochor isochoric isochromatic isochronal isochronally isochrone isochronic isochronical isochronism isochronize isochronon isochronous isochronously isochroous isocinchomeronic isocinchonine isocitric isoclasite isoclimatic isoclinal isocline isoclinic isocodeine isocola isocolic isocolon isocoria isocorybulbin isocorybulbine isocorydine isocoumarin isocracy isocrat isocratic isocreosol isocrotonic isocrymal isocryme isocrymic isocyanate isocyanic isocyanide isocyanine isocyano isocyanogen isocyanurate isocyanuric isocyclic isocymene isocytic isodactylism isodactylous isodiabatic isodialuric isodiametric isodiametrical isodiazo isodiazotate isodimorphic isodimorphism isodimorphous isodomic isodomous isodomum isodont isodontous isodrome isodulcite isodurene isodynamia isodynamic isodynamical isoelectric isoelectrically isoelectronic isoelemicin isoemodin isoenergetic isoerucic Isoetaceae Isoetales Isoetes isoeugenol isoflavone isoflor isogamete isogametic isogametism isogamic isogamous isogamy isogen isogenesis isogenetic isogenic isogenotype isogenotypic isogenous isogeny isogeotherm isogeothermal isogeothermic isogloss isoglossal isognathism isognathous isogon isogonal isogonality isogonally isogonic isogoniostat isogonism isograft isogram isograph isographic isographical isographically isography isogynous isohaline isohalsine isohel isohemopyrrole isoheptane isohesperidin isohexyl isohydric isohydrocyanic isohydrosorbic isohyet isohyetal isoimmune isoimmunity isoimmunization isoimmunize isoindazole isoindigotin isoindole isoionone isokeraunic isokeraunographic isokeraunophonic Isokontae isokontan isokurtic isolability isolable isolapachol isolate isolated isolatedly isolating isolation isolationism isolationist isolative Isolde isolecithal isoleucine isolichenin isolinolenic isologous isologue isology Isoloma isolysin isolysis isomagnetic isomaltose isomastigate isomelamine isomenthone isomer Isomera isomere isomeric isomerical isomerically isomeride isomerism isomerization isomerize isomeromorphism isomerous isomery isometric isometrical isometrically isometrograph isometropia isometry isomorph isomorphic isomorphism isomorphous Isomyaria isomyarian isoneph isonephelic isonergic isonicotinic isonitramine isonitrile isonitroso isonomic isonomous isonomy isonuclear isonym isonymic isonymy isooleic isoosmosis isopachous isopag isoparaffin isopectic isopelletierin isopelletierine isopentane isoperimeter isoperimetric isoperimetrical isoperimetry isopetalous isophanal isophane isophasal isophene isophenomenal isophoria isophorone isophthalic isophthalyl isophyllous isophylly isopicramic isopiestic isopiestically isopilocarpine isoplere isopleth Isopleura isopleural isopleuran isopleurous isopod Isopoda isopodan isopodiform isopodimorphous isopodous isopogonous isopolite isopolitical isopolity isopoly isoprene isopropenyl isopropyl isopropylacetic isopropylamine isopsephic isopsephism Isoptera isopterous isoptic isopulegone isopurpurin isopycnic isopyre isopyromucic isopyrrole isoquercitrin isoquinine isoquinoline isorcinol isorhamnose isorhodeose isorithm isorosindone isorrhythmic isorropic isosaccharic isosaccharin isoscele isosceles isoscope isoseismal isoseismic isoseismical isoseist isoserine isosmotic Isospondyli isospondylous isospore isosporic isosporous isospory isostasist isostasy isostatic isostatical isostatically isostemonous isostemony isostere isosteric isosterism isostrychnine isosuccinic isosulphide isosulphocyanate isosulphocyanic isosultam isotac isoteles isotely isotheral isothere isotherm isothermal isothermally isothermic isothermical isothermobath isothermobathic isothermous isotherombrose isothiocyanates isothiocyanic isothiocyano isothujone isotimal isotome isotomous isotonia isotonic isotonicity isotony isotope isotopic isotopism isotopy isotrehalose Isotria isotrimorphic isotrimorphism isotrimorphous isotron isotrope isotropic isotropism isotropous isotropy isotype isotypic isotypical isovalerate isovalerianate isovalerianic isovaleric isovalerone isovaline isovanillic isovoluminal isoxanthine isoxazine isoxazole isoxime isoxylene isoyohimbine isozooid ispaghul ispravnik Israel Israeli Israelite Israeliteship Israelitic Israelitish Israelitism Israelitize issanguila Issedoi Issedones issei issite issuable issuably issuance issuant issue issueless issuer issuing ist isthmi Isthmia isthmial isthmian isthmiate isthmic isthmoid isthmus istiophorid Istiophoridae Istiophorus istle istoke Istrian Istvaeones isuret isuretine Isuridae isuroid Isurus Iswara it Ita itabirite itacism itacist itacistic itacolumite itaconate itaconic Itala Itali Italian Italianate Italianately Italianation Italianesque Italianish Italianism Italianist Italianity Italianization Italianize Italianizer Italianly Italic Italical Italically Italican Italicanist Italici Italicism italicization italicize italics Italiote italite Italomania Italon Italophile itamalate itamalic itatartaric itatartrate Itaves itch itchiness itching itchingly itchless itchproof itchreed itchweed itchy itcze Itea Iteaceae Itelmes item iteming itemization itemize itemizer itemy Iten Itenean iter iterable iterance iterancy iterant iterate iteration iterative iteratively iterativeness Ithaca Ithacan Ithacensian ithagine Ithaginis ither Ithiel ithomiid Ithomiidae Ithomiinae ithyphallic Ithyphallus ithyphyllous itineracy itinerancy itinerant itinerantly itinerarian Itinerarium itinerary itinerate itineration itmo Ito Itoism Itoist Itoland Itonama Itonaman Itonia itonidid Itonididae itoubou its itself Ituraean iturite Itylus Itys Itza itzebu iva Ivan ivied ivin ivoried ivorine ivoriness ivorist ivory ivorylike ivorytype ivorywood ivy ivybells ivyberry ivyflower ivylike ivyweed ivywood ivywort iwa iwaiwa iwis Ixia Ixiaceae Ixiama Ixil Ixion Ixionian Ixodes ixodian ixodic ixodid Ixodidae Ixora iyo Izar izar izard Izcateco Izchak Izdubar izle izote iztle Izumi izzard Izzy J j Jaalin jab Jabarite jabbed jabber jabberer jabbering jabberingly jabberment Jabberwock jabberwockian Jabberwocky jabbing jabbingly jabble jabers jabia jabiru jaborandi jaborine jabot jaboticaba jabul jacal Jacaltec Jacalteca jacamar Jacamaralcyon jacameropine Jacamerops jacami jacamin Jacana jacana Jacanidae Jacaranda jacare jacate jacchus jacent jacinth jacinthe Jack jack jackal jackanapes jackanapish jackaroo jackass jackassery jackassification jackassism jackassness jackbird jackbox jackboy jackdaw jackeen jacker jacket jacketed jacketing jacketless jacketwise jackety jackfish jackhammer jackknife jackleg jackman jacko jackpudding jackpuddinghood jackrod jacksaw jackscrew jackshaft jackshay jacksnipe Jackson Jacksonia Jacksonian Jacksonite jackstay jackstone jackstraw jacktan jackweed jackwood Jacky Jackye Jacob jacobaea jacobaean Jacobean Jacobian Jacobic Jacobin Jacobinia Jacobinic Jacobinical Jacobinically Jacobinism Jacobinization Jacobinize Jacobite Jacobitely Jacobitiana Jacobitic Jacobitical Jacobitically Jacobitish Jacobitishly Jacobitism jacobsite Jacobson jacobus jacoby jaconet Jacqueminot Jacques jactance jactancy jactant jactation jactitate jactitation jacu jacuaru jaculate jaculation jaculative jaculator jaculatorial jaculatory jaculiferous Jacunda jacutinga jadder jade jaded jadedly jadedness jadeite jadery jadesheen jadeship jadestone jadish jadishly jadishness jady jaeger jag Jaga Jagannath Jagannatha jagat Jagatai Jagataic Jagath jager jagged jaggedly jaggedness jagger jaggery jaggy jagir jagirdar jagla jagless jagong jagrata jagua jaguar jaguarete Jahve Jahvist Jahvistic jail jailage jailbird jaildom jailer jaileress jailering jailership jailhouse jailish jailkeeper jaillike jailmate jailward jailyard Jaime Jain Jaina Jainism Jainist Jaipuri jajman Jake jake jakes jako Jakob Jakun Jalalaean jalap jalapa jalapin jalkar jalloped jalopy jalouse jalousie jalousied jalpaite Jam jam jama Jamaica Jamaican jaman jamb jambalaya jambeau jambo jambolan jambone jambool jamboree Jambos jambosa jambstone jamdani James Jamesian Jamesina jamesonite jami Jamie jamlike jammedness jammer jammy Jamnia jampan jampani jamrosade jamwood Jan janapa janapan Jane jane Janet jangada Janghey jangkar jangle jangler jangly Janice janiceps Janiculan Janiculum Janiform janissary janitor janitorial janitorship janitress janitrix Janizarian Janizary jank janker jann jannock Janos Jansenism Jansenist Jansenistic Jansenistical Jansenize Janthina Janthinidae jantu janua Januarius January Janus Januslike jaob Jap jap japaconine japaconitine Japan japan Japanee Japanese Japanesque Japanesquely Japanesquery Japanesy Japanicize Japanism Japanization Japanize japanned Japanner japanner japannery Japannish Japanolatry Japanologist Japanology Japanophile Japanophobe Japanophobia jape japer japery Japetus Japheth Japhetic Japhetide Japhetite japing japingly japish japishly japishness Japonic japonica Japonically Japonicize Japonism Japonize Japonizer Japygidae japygoid Japyx Jaqueline Jaquesian jaquima jar jara jaragua jararaca jararacussu jarbird jarble jarbot jardiniere Jared jarfly jarful jarg jargon jargonal jargoneer jargonelle jargoner jargonesque jargonic jargonish jargonist jargonistic jargonium jargonization jargonize jarkman Jarl jarl jarldom jarless jarlship Jarmo jarnut jarool jarosite jarra jarrah jarring jarringly jarringness jarry jarvey Jarvis jasey jaseyed Jasione Jasminaceae jasmine jasmined jasminewood Jasminum jasmone Jason jaspachate jaspagate Jasper jasper jasperated jaspered jasperize jasperoid jaspery jaspidean jaspideous jaspilite jaspis jaspoid jasponyx jaspopal jass jassid Jassidae jassoid Jat jatamansi Jateorhiza jateorhizine jatha jati Jatki Jatni jato Jatropha jatrophic jatrorrhizine Jatulian jaudie jauk jaun jaunce jaunder jaundice jaundiceroot jaunt jauntie jauntily jauntiness jauntingly jaunty jaup Java Javahai javali Javan Javanee Javanese javelin javelina javeline javelineer javer Javitero jaw jawab jawbation jawbone jawbreaker jawbreaking jawbreakingly jawed jawfall jawfallen jawfish jawfoot jawfooted jawless jawsmith jawy Jay jay Jayant Jayesh jayhawk jayhawker jaypie jaywalk jaywalker jazerant Jazyges jazz jazzer jazzily jazziness jazzy jealous jealously jealousness jealousy Jeames Jean jean Jean-Christophe Jean-Pierre Jeanette Jeanie Jeanne Jeannette Jeannie Jeanpaulia jeans Jeany Jebus Jebusi Jebusite Jebusitic Jebusitical Jebusitish jecoral jecorin jecorize jed jedcock jedding jeddock jeel jeep jeer jeerer jeering jeeringly jeerproof jeery jeewhillijers jeewhillikens Jef Jeff jeff jefferisite Jeffersonia Jeffersonian Jeffersonianism jeffersonite Jeffery Jeffie Jeffrey Jehovah Jehovic Jehovism Jehovist Jehovistic jehu jehup jejunal jejunator jejune jejunely jejuneness jejunitis jejunity jejunoduodenal jejunoileitis jejunostomy jejunotomy jejunum jelab jelerang jelick jell jellica jellico jellied jelliedness jellification jellify jellily jelloid jelly jellydom jellyfish jellyleaf jellylike Jelske jelutong Jem jemadar Jemez Jemima jemmily jemminess Jemmy jemmy Jenine jenkin jenna jennerization jennerize jennet jenneting Jennie jennier Jennifer Jenny jenny Jenson jentacular jeofail jeopard jeoparder jeopardize jeopardous jeopardously jeopardousness jeopardy jequirity Jerahmeel Jerahmeelites Jerald jerboa jereed jeremejevite jeremiad Jeremiah Jeremian Jeremianic Jeremias Jeremy jerez jerib jerk jerker jerkily jerkin jerkined jerkiness jerkingly jerkish jerksome jerkwater jerky jerl jerm jermonal Jeroboam Jerome Jeromian Jeronymite jerque jerquer Jerrie Jerry jerry jerryism Jersey jersey Jerseyan jerseyed Jerseyite Jerseyman jert Jerusalem jervia jervina jervine Jesper Jess jess jessakeed jessamine jessamy jessant Jesse Jessean jessed Jessica Jessie jessur jest jestbook jestee jester jestful jesting jestingly jestingstock jestmonger jestproof jestwise jestword Jesu Jesuate Jesuit Jesuited Jesuitess Jesuitic Jesuitical Jesuitically Jesuitish Jesuitism Jesuitist Jesuitize Jesuitocracy Jesuitry Jesus jet jetbead jete Jethro Jethronian jetsam jettage jetted jetter jettied jettiness jettingly jettison jetton jetty jettyhead jettywise jetware Jew jewbird jewbush Jewdom jewel jeweler jewelhouse jeweling jewelless jewellike jewelry jewelsmith jewelweed jewely Jewess jewfish Jewhood Jewish Jewishly Jewishness Jewism Jewless Jewlike Jewling Jewry Jewship Jewstone Jewy jezail Jezebel Jezebelian Jezebelish jezekite jeziah Jezreelite jharal jheel jhool jhow Jhuria Ji Jianyun jib jibbah jibber jibbings jibby jibe jibhead jibi jibman jiboa jibstay jicama Jicaque Jicaquean jicara Jicarilla jiff jiffle jiffy jig jigamaree jigger jiggerer jiggerman jiggers jigget jiggety jigginess jiggish jiggle jiggly jiggumbob jiggy jiglike jigman jihad jikungu Jill jillet jillflirt jilt jiltee jilter jiltish Jim jimbang jimberjaw jimberjawed jimjam Jimmy jimmy jimp jimply jimpness jimpricute jimsedge Jin jina jincamas Jincan Jinchao jing jingal Jingbai jingbang jingle jingled jinglejangle jingler jinglet jingling jinglingly jingly jingo jingodom jingoish jingoism jingoist jingoistic jinja jinjili jink jinker jinket jinkle jinks jinn jinnestan jinni jinniwink jinniyeh Jinny jinny jinriki jinrikiman jinrikisha jinshang jinx jipijapa jipper jiqui jirble jirga Jiri jirkinet Jisheng Jitendra jiti jitneur jitneuse jitney jitneyman jitro jitter jitterbug jitters jittery jiva Jivaran Jivaro Jivaroan jive jixie Jo jo Joachim Joachimite Joan Joanna Joanne Joannite joaquinite Job job jobade jobarbe jobation jobber jobbernowl jobbernowlism jobbery jobbet jobbing jobbish jobble jobholder jobless joblessness jobman jobmaster jobmistress jobmonger jobo jobsmith Jocasta Jocelin Joceline Jocelyn joch Jochen Jock jock jocker jockey jockeydom jockeyish jockeyism jockeylike jockeyship jocko jockteleg jocoque jocose jocosely jocoseness jocoseriosity jocoserious jocosity jocote jocu jocular jocularity jocularly jocularness joculator jocum jocuma jocund jocundity jocundly jocundness jodel jodelr jodhpurs Jodo Joe joe joebush Joel joewood Joey joey jog jogger joggle joggler jogglety jogglework joggly jogtrottism Johan Johann Johanna Johannean Johannes johannes Johannine Johannisberger Johannist Johannite johannite John Johnadreams Johnathan Johnian johnin Johnnie Johnny johnnycake johnnydom Johnsmas Johnsonese Johnsonian Johnsoniana Johnsonianism Johnsonianly Johnsonism johnstrupite join joinable joinant joinder joiner joinery joining joiningly joint jointage jointed jointedly jointedness jointer jointing jointist jointless jointly jointress jointure jointureless jointuress jointweed jointworm jointy joist joisting joistless jojoba joke jokeless jokelet jokeproof joker jokesmith jokesome jokesomeness jokester jokingly jokish jokist jokul joky joll jolleyman jollier jollification jollify jollily jolliness jollity jollop jolloped jolly jollytail Joloano jolt jolter jolterhead jolterheaded jolterheadedness jolthead joltiness jolting joltingly joltless joltproof jolty Jon Jonah Jonahesque Jonahism Jonas Jonathan Jonathanization Jones Jonesian Jong jonglery jongleur Joni jonque jonquil jonquille Jonsonian Jonval jonvalization jonvalize jookerie joola joom Joon Jophiel Jordan jordan Jordanian jordanite joree Jorge Jorist jorum Jos Jose josefite joseite Joseph Josepha Josephine Josephinism josephinite Josephism Josephite Josh josh josher joshi Joshua Josiah josie Josip joskin joss jossakeed josser jostle jostlement jostler jot jota jotation jotisi Jotnian jotter jotting jotty joubarb Joubert joug jough jouk joukerypawkery joule joulean joulemeter jounce journal journalese journalish journalism journalist journalistic journalistically journalization journalize journalizer journey journeycake journeyer journeying journeyman journeywoman journeywork journeyworker jours joust jouster Jova Jove Jovial jovial jovialist jovialistic joviality jovialize jovially jovialness jovialty Jovian Jovianly Jovicentric Jovicentrical Jovicentrically jovilabe Joviniamish Jovinian Jovinianist Jovite jow jowar jowari jowel jower jowery jowl jowler jowlish jowlop jowly jowpy jowser jowter joy joyance joyancy joyant Joyce joyful joyfully joyfulness joyhop joyleaf joyless joylessly joylessness joylet joyous joyously joyousness joyproof joysome joyweed Jozy Ju Juan Juang juba jubate jubbah jubbe jube juberous jubilance jubilancy jubilant jubilantly jubilarian jubilate jubilatio jubilation jubilatory jubilean jubilee jubilist jubilization jubilize jubilus juck juckies Jucuna jucundity jud Judaeomancy Judaeophile Judaeophilism Judaeophobe Judaeophobia Judah Judahite Judaic Judaica Judaical Judaically Judaism Judaist Judaistic Judaistically Judaization Judaize Judaizer Judas Judaslike judcock Jude Judean judex Judge judge judgeable judgelike judger judgeship judgingly judgmatic judgmatical judgmatically judgment Judica judicable judicate judication judicative judicator judicatorial judicatory judicature judices judiciable judicial judiciality judicialize judicially judicialness judiciarily judiciary judicious judiciously judiciousness Judith judo Judophobism Judy Juergen jufti jug Juga jugal jugale Jugatae jugate jugated jugation juger jugerum jugful jugger Juggernaut juggernaut Juggernautish juggins juggle jugglement juggler jugglery juggling jugglingly Juglandaceae juglandaceous Juglandales juglandin Juglans juglone jugular Jugulares jugulary jugulate jugulum jugum Jugurthine Juha juice juiceful juiceless juicily juiciness juicy jujitsu juju jujube jujuism jujuist juke jukebox Jule julep Jules Juletta Julia Julian Juliana Juliane Julianist Julianto julid Julidae julidan Julie Julien julienite julienne Juliet Julietta julio Julius juloid Juloidea juloidian julole julolidin julolidine julolin juloline Julus July Julyflower Jumada Jumana jumart jumba jumble jumblement jumbler jumblingly jumbly jumbo jumboesque jumboism jumbuck jumby jumelle jument jumentous jumfru jumillite jumma jump jumpable jumper jumperism jumpiness jumpingly jumpness jumprock jumpseed jumpsome jumpy Jun Juncaceae juncaceous Juncaginaceae juncaginaceous juncagineous junciform juncite Junco Juncoides juncous junction junctional junctive juncture Juncus June june Juneberry Junebud junectomy Juneflower Jungermannia Jungermanniaceae jungermanniaceous Jungermanniales jungle jungled jungleside junglewards junglewood jungli jungly juniata junior juniorate juniority juniorship juniper Juniperaceae Juniperus Junius junk junkboard Junker junker Junkerdom junkerdom junkerish Junkerism junkerism junket junketer junketing junking junkman Juno Junoesque Junonia Junonian junt junta junto jupati jupe Jupiter jupon Jur Jura jural jurally jurament juramentado juramental juramentally juramentum Jurane jurant jurara Jurassic jurat juration jurative jurator juratorial juratory jure jurel Jurevis Juri juridic juridical juridically juring jurisconsult jurisdiction jurisdictional jurisdictionalism jurisdictionally jurisdictive jurisprudence jurisprudent jurisprudential jurisprudentialist jurisprudentially jurist juristic juristical juristically juror jurupaite jury juryless juryman jurywoman jusquaboutisme jusquaboutist jussel Jussi Jussiaea Jussiaean Jussieuan jussion jussive jussory just justen justice justicehood justiceless justicelike justicer justiceship justiceweed Justicia justiciability justiciable justicial justiciar justiciarship justiciary justiciaryship justicies justifiability justifiable justifiableness justifiably justification justificative justificator justificatory justifier justify justifying justifyingly Justin Justina Justine Justinian Justinianian Justinianist justly justment justness justo Justus jut Jute jute Jutic Jutish jutka Jutlander Jutlandish jutting juttingly jutty Juturna Juvavian juvenal Juvenalian juvenate juvenescence juvenescent juvenile juvenilely juvenileness juvenilify juvenilism juvenility juvenilize Juventas juventude Juverna juvia juvite juxtalittoral juxtamarine juxtapose juxtaposit juxtaposition juxtapositional juxtapositive juxtapyloric juxtaspinal juxtaterrestrial juxtatropical Juyas Juza Jwahar Jynginae jyngine Jynx jynx K k ka Kababish Kabaka kabaragoya Kabard Kabardian kabaya Kabbeljaws kabel kaberu kabiet Kabirpanthi Kabistan Kabonga kabuki Kabuli Kabyle Kachari Kachin kachin Kadaga Kadarite kadaya Kadayan Kaddish kadein kadikane kadischi Kadmi kados Kadu kaempferol Kaf Kafa kaferita Kaffir kaffir kaffiyeh Kaffraria Kaffrarian Kafir kafir Kafiri kafirin kafiz Kafka Kafkaesque kafta kago kagu kaha kahar kahau kahikatea kahili kahu kahuna kai Kaibab Kaibartha kaid kaik kaikara kaikawaka kail kailyard kailyarder kailyardism Kaimo Kainah kainga kainite kainsi kainyn kairine kairoline kaiser kaiserdom kaiserism kaisership kaitaka Kaithi kaiwhiria kaiwi Kaj Kajar kajawah kajugaru kaka Kakan kakapo kakar kakarali kakariki Kakatoe Kakatoidae kakawahie kaki kakidrosis kakistocracy kakkak kakke kakortokite kala kaladana kalamalo kalamansanai Kalamian Kalanchoe Kalandariyah Kalang Kalapooian kalashnikov kalasie Kaldani kale kaleidophon kaleidophone kaleidoscope kaleidoscopic kaleidoscopical kaleidoscopically Kalekah kalema Kalendae kalends kalewife kaleyard kali kalian Kaliana kaliborite kalidium kaliform kaligenous Kalinga kalinite kaliophilite kalipaya Kalispel kalium kallah kallege kallilite Kallima kallitype Kalmarian Kalmia Kalmuck kalo kalogeros kalokagathia kalon kalong kalpis kalsomine kalsominer kalumpang kalumpit Kalwar kalymmaukion kalymmocyte kamachile kamacite kamahi kamala kamaloka kamansi kamao Kamares kamarezite kamarupa kamarupic kamas Kamasin Kamass kamassi Kamba kambal kamboh Kamchadal Kamchatkan kame kameeldoorn kameelthorn Kamel kamelaukion kamerad kamias kamichi kamik kamikaze Kamiya kammalan kammererite kamperite kampong kamptomorph kan kana kanae kanagi Kanaka kanap kanara Kanarese kanari kanat Kanauji Kanawari Kanawha kanchil kande Kandelia kandol kaneh kanephore kanephoros Kaneshite Kanesian kang kanga kangani kangaroo kangarooer Kangli Kanji Kankanai kankie kannume kanoon Kanred kans Kansa Kansan kantele kanteletar kanten Kanthan Kantian Kantianism Kantism Kantist Kanuri Kanwar kaoliang kaolin kaolinate kaolinic kaolinite kaolinization kaolinize kapa kapai kapeika kapok kapp kappa kappe kappland kapur kaput Karabagh karagan Karaism Karaite Karaitism karaka Karakatchan Karakul karakul Karamojo karamu karaoke Karatas karate Karaya karaya karbi karch kareao kareeta Karel karela Karelian Karen Karharbari Kari karite Karl Karling Karluk karma Karmathian karmic karmouth karo kaross karou karree karri Karroo karroo karrusel karsha Karshuni Karst karst karstenite karstic kartel Karthli kartometer kartos Kartvel Kartvelian karwar Karwinskia karyaster karyenchyma karyochrome karyochylema karyogamic karyogamy karyokinesis karyokinetic karyologic karyological karyologically karyology karyolymph Karyolysidae karyolysis Karyolysus karyolytic karyomere karyomerite karyomicrosome karyomitoic karyomitome karyomiton karyomitosis karyomitotic karyon karyoplasm karyoplasma karyoplasmatic karyoplasmic karyopyknosis karyorrhexis karyoschisis karyosome karyotin karyotype kasa kasbah kasbeke kascamiol Kasha Kashan kasher kashga kashi kashima Kashmiri Kashmirian Kashoubish kashruth Kashube Kashubian Kashyapa kasida Kasikumuk Kaska Kaskaskia kasm kasolite kassabah Kassak Kassite kassu kastura Kasubian kat Katabanian katabasis katabatic katabella katabolic katabolically katabolism katabolite katabolize katabothron katachromasis katacrotic katacrotism katagenesis katagenetic katakana katakinesis katakinetic katakinetomer katakinetomeric katakiribori katalase katalysis katalyst katalytic katalyze katamorphism kataphoresis kataphoretic kataphoric kataphrenia kataplasia kataplectic kataplexy katar katastate katastatic katathermometer katatonia katatonic katatype katchung katcina Kate kath Katha katha kathal Katharina Katharine katharometer katharsis kathartic kathemoglobin kathenotheism Kathleen kathodic Kathopanishad Kathryn Kathy Katie Katik Katinka katipo Katipunan Katipuneros katmon katogle Katrine Katrinka katsup Katsuwonidae katuka Katukina katun katurai Katy katydid Kauravas kauri kava kavaic kavass Kavi Kaw kawaka Kawchodinne kawika Kay kay kayak kayaker Kayan Kayasth Kayastha kayles kayo Kayvan Kazak kazi kazoo Kazuhiro kea keach keacorn Keatsian keawe keb kebab kebbie kebbuck kechel keck keckle keckling kecksy kecky ked Kedar Kedarite keddah kedge kedger kedgeree kedlock Kedushshah Kee keech keek keeker keel keelage keelbill keelblock keelboat keelboatman keeled keeler keelfat keelhale keelhaul keelie keeling keelivine keelless keelman keelrake keelson keen keena keened keener keenly keenness keep keepable keeper keeperess keepering keeperless keepership keeping keepsake keepsaky keepworthy keerogue Kees keeshond keest keet keeve Keewatin kef keffel kefir kefiric Kefti Keftian Keftiu keg kegler kehaya kehillah kehoeite Keid keilhauite keita Keith keitloa Kekchi kekotene kekuna kelchin keld Kele kele kelebe kelectome keleh kelek kelep Kelima kelk kell kella kellion kellupweed Kelly kelly keloid keloidal kelp kelper kelpfish kelpie kelpware kelpwort kelpy kelt kelter Keltoi kelty Kelvin kelvin kelyphite Kemal Kemalism Kemalist kemb kemp kemperyman kempite kemple kempster kempt kempy Ken ken kenaf Kenai kenareh kench kend kendir kendyr Kenelm Kenipsim kenlore kenmark Kenn Kennebec kennebecker kennebunker Kennedya kennel kennelly kennelman kenner Kenneth kenning kenningwort kenno keno kenogenesis kenogenetic kenogenetically kenogeny kenosis kenotic kenoticism kenoticist kenotism kenotist kenotoxin kenotron Kenseikai kensington Kensitite kenspac kenspeck kenspeckle Kent kent kentallenite Kentia Kenticism Kentish Kentishman kentledge Kenton kentrogon kentrolite Kentuckian Kentucky kenyte kep kepi Keplerian kept Ker keracele keralite kerana keraphyllocele keraphyllous kerasin kerasine kerat keratalgia keratectasia keratectomy Keraterpeton keratin keratinization keratinize keratinoid keratinose keratinous keratitis keratoangioma keratocele keratocentesis keratoconjunctivitis keratoconus keratocricoid keratode keratodermia keratogenic keratogenous keratoglobus keratoglossus keratohelcosis keratohyal keratoid Keratoidea keratoiritis Keratol keratoleukoma keratolysis keratolytic keratoma keratomalacia keratome keratometer keratometry keratomycosis keratoncus keratonosus keratonyxis keratophyre keratoplastic keratoplasty keratorrhexis keratoscope keratoscopy keratose keratosis keratotome keratotomy keratto keraulophon keraulophone Keraunia keraunion keraunograph keraunographic keraunography keraunophone keraunophonic keraunoscopia keraunoscopy kerbstone kerchief kerchiefed kerchoo kerchug kerchunk kerectomy kerel Keres Keresan Kerewa kerf kerflap kerflop kerflummox Kerite Kermanji Kermanshah kermes kermesic kermesite kermis kern kernel kerneled kernelless kernelly kerner kernetty kernish kernite kernos kerogen kerosene kerplunk Kerri Kerria kerrie kerrikerri kerril kerrite Kerry kerry kersantite kersey kerseymere kerslam kerslosh kersmash kerugma kerwham kerygma kerygmatic kerykeion kerystic kerystics Keryx kesslerman kestrel ket keta ketal ketapang ketazine ketch ketchcraft ketchup ketembilla keten ketene ketimide ketimine ketipate ketipic keto ketogen ketogenesis ketogenic ketoheptose ketohexose ketoketene ketol ketole ketolysis ketolytic ketone ketonemia ketonic ketonimid ketonimide ketonimin ketonimine ketonization ketonize ketonuria ketose ketoside ketosis ketosuccinic ketoxime kette ketting kettle kettlecase kettledrum kettledrummer kettleful kettlemaker kettlemaking kettler ketty Ketu ketuba ketupa ketyl keup Keuper keurboom kevalin Kevan kevel kevelhead Kevin kevutzah Kevyn Keweenawan keweenawite kewpie kex kexy key keyage keyboard keyed keyhole keyless keylet keylock Keynesian Keynesianism keynote keynoter keyseater keyserlick keysmith keystone keystoned Keystoner keyway Kha khaddar khadi khagiarite khahoon khaiki khair khaja khajur khakanship khaki khakied Khaldian khalifa Khalifat Khalkha khalsa Khami khamsin Khamti khan khanate khanda khandait khanjar khanjee khankah khansamah khanum khar kharaj Kharia Kharijite Kharoshthi kharouba kharroubah Khartoumer kharua Kharwar Khasa Khasi khass khat khatib khatri Khatti Khattish Khaya Khazar Khazarian khediva khedival khedivate khedive khediviah khedivial khediviate khepesh Kherwari Kherwarian khet Khevzur khidmatgar Khila khilat khir khirka Khitan Khivan Khlysti Khmer Khoja khoja khoka Khokani Khond Khorassan khot Khotan Khotana Khowar khu Khuai khubber khula khuskhus Khussak khutbah khutuktu Khuzi khvat Khwarazmian kiack kiaki kialee kiang Kiangan kiaugh kibber kibble kibbler kibblerman kibe kibei kibitka kibitz kibitzer kiblah kibosh kiby kick kickable Kickapoo kickback kickee kicker kicking kickish kickless kickoff kickout kickseys kickshaw kickup Kidder kidder Kidderminster kiddier kiddish kiddush kiddushin kiddy kidhood kidlet kidling kidnap kidnapee kidnaper kidney kidneyroot kidneywort Kids kidskin kidsman kiefekil Kieffer kiekie kiel kier Kieran kieselguhr kieserite kiestless kieye Kiho kikar Kikatsik kikawaeo kike Kiki kiki Kikki Kikongo kiku kikuel kikumon Kikuyu kil kiladja kilah kilampere kilan kilbrickenite kildee kilderkin kileh kilerg kiley Kilhamite kilhig kiliare kilim kill killable killadar Killarney killas killcalf killcrop killcu killdeer killeekillee killeen killer killick killifish killing killingly killingness killinite killogie killweed killwort killy Kilmarnock kiln kilneye kilnhole kilnman kilnrib kilo kiloampere kilobar kilocalorie kilocycle kilodyne kilogauss kilogram kilojoule kiloliter kilolumen kilometer kilometrage kilometric kilometrical kiloparsec kilostere kiloton kilovar kilovolt kilowatt kilp kilt kilter kiltie kilting Kiluba Kim kim kimbang kimberlin kimberlite Kimberly Kimbundu Kimeridgian kimigayo Kimmo kimnel kimono kimonoed kin kina kinaesthesia kinaesthesis kinah kinase kinbote Kinch kinch kinchin kinchinmort kincob kind kindergarten kindergartener kindergartening kindergartner Kinderhook kindheart kindhearted kindheartedly kindheartedness kindle kindler kindlesome kindlily kindliness kindling kindly kindness kindred kindredless kindredly kindredness kindredship kinematic kinematical kinematically kinematics kinematograph kinemometer kineplasty kinepox kinesalgia kinescope kinesiatric kinesiatrics kinesic kinesics kinesimeter kinesiologic kinesiological kinesiology kinesiometer kinesis kinesitherapy kinesodic kinesthesia kinesthesis kinesthetic kinetic kinetical kinetically kinetics kinetochore kinetogenesis kinetogenetic kinetogenetically kinetogenic kinetogram kinetograph kinetographer kinetographic kinetography kinetomer kinetomeric kinetonema kinetonucleus kinetophone kinetophonograph kinetoplast kinetoscope kinetoscopic King king kingbird kingbolt kingcob kingcraft kingcup kingdom kingdomed kingdomful kingdomless kingdomship kingfish kingfisher kinghead kinghood kinghunter kingless kinglessness kinglet kinglihood kinglike kinglily kingliness kingling kingly kingmaker kingmaking kingpiece kingpin kingrow kingship kingsman Kingu kingweed kingwood Kinipetu kink kinkable kinkaider kinkajou kinkcough kinkhab kinkhost kinkily kinkiness kinkle kinkled kinkly kinksbush kinky kinless kinnikinnick kino kinofluous kinology kinoplasm kinoplasmic Kinorhyncha kinospore Kinosternidae Kinosternon kinotannic kinsfolk kinship kinsman kinsmanly kinsmanship kinspeople kinswoman kintar Kintyre kioea Kioko kiosk kiotome Kiowa Kiowan Kioway kip kipage Kipchak kipe Kiplingese Kiplingism kippeen kipper kipperer kippy kipsey kipskin Kiranti Kirghiz Kirghizean kiri Kirillitsa kirimon Kirk kirk kirker kirkify kirking kirkinhead kirklike kirkman kirktown kirkward kirkyard Kirman kirmew kirn kirombo kirsch Kirsten Kirsty kirtle kirtled Kirundi kirve kirver kischen kish Kishambala kishen kishon kishy kiskatom Kislev kismet kismetic kisra kiss kissability kissable kissableness kissage kissar kisser kissing kissingly kissproof kisswise kissy kist kistful kiswa Kiswahili Kit kit kitab kitabis Kitalpha Kitamat Kitan kitar kitcat kitchen kitchendom kitchener kitchenette kitchenful kitchenless kitchenmaid kitchenman kitchenry kitchenward kitchenwards kitchenware kitchenwife kitcheny kite kiteflier kiteflying kith kithe kithless kitish Kitkahaxki Kitkehahki kitling Kitlope Kittatinny kittel kitten kittendom kittenhearted kittenhood kittenish kittenishly kittenishness kittenless kittenship kitter kittereen kitthoge kittiwake kittle kittlepins kittles kittlish kittly kittock kittul Kitty kitty kittysol Kitunahan kiva kiver kivikivi kivu Kiwai Kiwanian Kiwanis kiwi kiwikiwi kiyas kiyi Kizil Kizilbash Kjeldahl kjeldahlization kjeldahlize klafter klaftern klam Klamath Klan Klanism Klansman Klanswoman klaprotholite Klaskino Klaudia Klaus klavern Klaxon klaxon Klebsiella kleeneboc Kleinian Kleistian klendusic klendusity klendusive klepht klephtic klephtism kleptic kleptistic kleptomania kleptomaniac kleptomanist kleptophobia klicket Klikitat Kling Klingsor klip klipbok klipdachs klipdas klipfish klippe klippen klipspringer klister klockmannite klom Klondike Klondiker klootchman klop klops klosh Kluxer klystron kmet knab knabble knack knackebrod knacker knackery knacky knag knagged knaggy knap knapbottle knape knappan Knapper knapper knappish knappishly knapsack knapsacked knapsacking knapweed knar knark knarred knarry Knautia knave knavery knaveship knavess knavish knavishly knavishness knawel knead kneadability kneadable kneader kneading kneadingly knebelite knee kneebrush kneecap kneed kneehole kneel kneeler kneelet kneeling kneelingly kneepad kneepan kneepiece kneestone Kneiffia Kneippism knell knelt Knesset knet knew knez knezi kniaz kniazi knick knicker Knickerbocker knickerbockered knickerbockers knickered knickers knickknack knickknackatory knickknacked knickknackery knickknacket knickknackish knickknacky knickpoint knife knifeboard knifeful knifeless knifelike knifeman knifeproof knifer knifesmith knifeway knight knightage knightess knighthead knighthood Knightia knightless knightlihood knightlike knightliness knightling knightly knightship knightswort Kniphofia Knisteneaux knit knitback knitch knitted knitter knitting knittle knitwear knitweed knitwork knived knivey knob knobbed knobber knobbiness knobble knobbler knobbly knobby knobkerrie knoblike knobstick knobstone knobular knobweed knobwood knock knockabout knockdown knockemdown knocker knocking knockless knockoff knockout knockstone knockup knoll knoller knolly knop knopite knopped knopper knoppy knopweed knorhaan Knorria knosp knosped Knossian knot knotberry knotgrass knothole knothorn knotless knotlike knotroot knotted knotter knottily knottiness knotting knotty knotweed knotwork knotwort knout know knowability knowable knowableness knowe knower knowing knowingly knowingness knowledge knowledgeable knowledgeableness knowledgeably knowledged knowledgeless knowledgement knowledging known knowperts Knoxian Knoxville knoxvillite knub knubbly knubby knublet knuckle knucklebone knuckled knuckler knuckling knuckly knuclesome Knudsen knur knurl knurled knurling knurly Knut knut Knute knutty knyaz knyazi Ko ko koa koae koala koali Koasati kob koban kobellite kobi kobird kobold kobong kobu Kobus Koch Kochab Kochia kochliarion koda Kodagu Kodak kodak kodaker kodakist kodakry Kodashim kodro kodurite Koeberlinia Koeberliniaceae koeberliniaceous koechlinite Koeksotenok koel Koellia Koelreuteria koenenite Koeri koff koft koftgar koftgari koggelmannetje Kogia Kohathite Koheleth kohemp Kohen Kohistani Kohl kohl Kohlan kohlrabi kohua koi Koiari Koibal koil koila koilanaglyphic koilon koimesis Koine koine koinon koinonia Koipato Koitapu kojang Kojiki kokako kokam kokan kokerboom kokil kokio koklas koklass Koko koko kokoon Kokoona kokoromiko kokowai kokra koksaghyz koku kokum kokumin kokumingun Kol kola kolach Kolarian Koldaji kolea koleroga kolhoz Koli kolinski kolinsky Kolis kolkhos kolkhoz Kolkka kollast kollaster koller kollergang kolo kolobion kolobus kolokolo kolsun koltunna koltunnor Koluschan Kolush Komati komatik kombu Kome Komi kominuter kommetje kommos komondor kompeni Komsomol kon kona konak Konariot Konde Kongo Kongoese Kongolese kongoni kongsbergite kongu Konia Koniaga Koniga konimeter koninckite konini koniology koniscope konjak Konkani Konomihu Konrad konstantin Konstantinos kontakion Konyak kooka kookaburra kookeree kookery kookri koolah kooletah kooliman koolokamba Koolooly koombar koomkie Koorg kootcha Kootenay kop Kopagmiut kopeck koph kopi koppa koppen koppite Koprino kor Kora kora koradji Korah Korahite Korahitic korait korakan Koran Korana Koranic Koranist korari Kore kore Korean korec koreci Koreish Koreishite korero Koreshan Koreshanity kori korimako korin Kornephorus kornerupine kornskeppa kornskeppur korntonde korntonder korntunna korntunnur Koroa koromika koromiko korona korova korrel korrigum korumburra koruna Korwa Kory Koryak korymboi korymbos korzec kos Kosalan Koschei kosher Kosimo kosin kosmokrator Koso kosong kosotoxin Kossaean Kossean Kosteletzkya koswite Kota kotal Kotar koto Kotoko kotschubeite kottigite kotuku kotukutuku kotwal kotwalee kotyle kotylos kou koulan Koungmiut kouza kovil Kowagmiut kowhai kowtow koyan kozo Kpuesi Kra kra kraal kraft Krag kragerite krageroite krait kraken krakowiak kral Krama krama Krameria Krameriaceae krameriaceous kran krantzite Krapina kras krasis kratogen kratogenic Kraunhia kraurite kraurosis kraurotic krausen krausite kraut kreis Kreistag kreistle kreittonite krelos kremersite kremlin krems kreng krennerite Krepi kreplech kreutzer kriegspiel krieker Krigia krimmer krina Kriophoros Kris Krishna Krishnaism Krishnaist Krishnaite Krishnaitic Kristen Kristi Kristian Kristin Kristinaux krisuvigite kritarchy Krithia Kriton kritrima krobyloi krobylos krocket krohnkite krome kromeski kromogram kromskop krona krone kronen kroner Kronion kronor kronur Kroo kroon krosa krouchka kroushka Kru Krugerism Krugerite Kruman krummhorn kryokonite krypsis kryptic krypticism kryptocyanine kryptol kryptomere krypton Krzysztof Kshatriya Kshatriyahood Kua Kuan kuan Kuar Kuba kuba Kubachi Kubanka kubba Kubera kubuklion Kuchean kuchen kudize kudos Kudrun kudu kudzu Kuehneola kuei Kufic kuge kugel Kuhnia Kui kuichua Kuki kukoline kukri kuku kukui Kukulcan kukupa Kukuruku kula kulack Kulah kulah kulaite kulak kulakism Kulanapan kulang Kuldip Kuli kulimit kulkarni kullaite Kullani kulm kulmet Kulturkampf Kulturkreis Kuman kumbi kumhar kumiss kummel Kumni kumquat kumrah Kumyk kunai Kunbi Kundry Kuneste kung kunk kunkur Kunmiut kunzite Kuomintang kupfernickel kupfferite kuphar kupper Kuranko kurbash kurchicine kurchine Kurd Kurdish Kurdistan kurgan Kuri Kurilian Kurku kurmburra Kurmi Kuroshio kurrajong Kurt kurtosis Kuruba Kurukh kuruma kurumaya Kurumba kurung kurus kurvey kurveyor kusa kusam Kusan kusha Kushshu kusimansel kuskite kuskos kuskus Kuskwogmiut Kustenau kusti Kusum kusum kutcha Kutchin Kutenai kuttab kuttar kuttaur kuvasz Kuvera kvass kvint kvinter Kwakiutl kwamme kwan Kwannon Kwapa kwarta kwarterka kwazoku kyack kyah kyar kyat kyaung Kybele Kyklopes Kyklops kyl Kyle kyle kylite kylix Kylo kymation kymatology kymbalon kymogram kymograph kymographic kynurenic kynurine kyphoscoliosis kyphoscoliotic Kyphosidae kyphosis kyphotic Kyrie kyrine kyschtymite kyte Kyu Kyung Kyurin Kyurinish L l la laager laang lab Laban labara labarum labba labber labdacism labdacismus labdanum labefact labefactation labefaction labefy label labeler labella labellate labeller labelloid labellum labia labial labialism labialismus labiality labialization labialize labially Labiatae labiate labiated labidophorous Labidura Labiduridae labiella labile lability labilization labilize labioalveolar labiocervical labiodental labioglossal labioglossolaryngeal labioglossopharyngeal labiograph labioguttural labiolingual labiomancy labiomental labionasal labiopalatal labiopalatalize labiopalatine labiopharyngeal labioplasty labiose labiotenaculum labiovelar labioversion labis labium lablab labor laborability laborable laborage laborant laboratorial laboratorian laboratory labordom labored laboredly laboredness laborer laboress laborhood laboring laboringly laborious laboriously laboriousness laborism laborist laborite laborless laborous laborously laborousness laborsaving laborsome laborsomely laborsomeness Laboulbenia Laboulbeniaceae laboulbeniaceous Laboulbeniales labour labra Labrador Labradorean labradorite labradoritic labral labret labretifery Labridae labroid Labroidea labrosaurid labrosauroid Labrosaurus labrose labrum Labrus labrusca labrys Laburnum labyrinth labyrinthal labyrinthally labyrinthian labyrinthibranch labyrinthibranchiate Labyrinthibranchii labyrinthic labyrinthical labyrinthically Labyrinthici labyrinthiform labyrinthine labyrinthitis Labyrinthodon labyrinthodont Labyrinthodonta labyrinthodontian labyrinthodontid labyrinthodontoid Labyrinthula Labyrinthulidae lac lacca laccaic laccainic laccase laccol laccolith laccolithic laccolitic lace lacebark laced Lacedaemonian laceflower laceleaf laceless lacelike lacemaker lacemaking laceman lacepiece lacepod lacer lacerability lacerable lacerant lacerate lacerated lacerately laceration lacerative Lacerta Lacertae lacertian Lacertid Lacertidae lacertiform Lacertilia lacertilian lacertiloid lacertine lacertoid lacertose lacery lacet lacewing lacewoman lacewood lacework laceworker laceybark lache Lachenalia laches Lachesis Lachnanthes Lachnosterna lachryma lachrymae lachrymaeform lachrymal lachrymally lachrymalness lachrymary lachrymation lachrymator lachrymatory lachrymiform lachrymist lachrymogenic lachrymonasal lachrymosal lachrymose lachrymosely lachrymosity lachrymous lachsa lacily Lacinaria laciness lacing lacinia laciniate laciniated laciniation laciniform laciniola laciniolate laciniose lacinula lacinulate lacinulose lacis lack lackadaisical lackadaisicality lackadaisically lackadaisicalness lackadaisy lackaday lacker lackey lackeydom lackeyed lackeyism lackeyship lackland lackluster lacklusterness lacklustrous lacksense lackwit lackwittedly lackwittedness lacmoid lacmus Laconian Laconic laconic laconica laconically laconicalness laconicism laconicum laconism laconize laconizer Lacosomatidae lacquer lacquerer lacquering lacquerist lacroixite lacrosse lacrosser lacrym lactagogue lactalbumin lactam lactamide lactant lactarene lactarious lactarium Lactarius lactary lactase lactate lactation lactational lacteal lactean lactenin lacteous lactesce lactescence lactescency lactescent lactic lacticinia lactid lactide lactiferous lactiferousness lactific lactifical lactification lactiflorous lactifluous lactiform lactifuge lactify lactigenic lactigenous lactigerous lactim lactimide lactinate lactivorous lacto lactobacilli Lactobacillus lactobacillus lactobutyrometer lactocele lactochrome lactocitrate lactodensimeter lactoflavin lactoglobulin lactoid lactol lactometer lactone lactonic lactonization lactonize lactophosphate lactoproteid lactoprotein lactoscope lactose lactoside lactosuria lactothermometer lactotoxin lactovegetarian Lactuca lactucarium lactucerin lactucin lactucol lactucon lactyl lacuna lacunae lacunal lacunar lacunaria lacunary lacune lacunose lacunosity lacunule lacunulose lacuscular lacustral lacustrian lacustrine lacwork lacy lad Ladakhi ladakin ladanigerous ladanum ladder laddered laddering ladderlike ladderway ladderwise laddery laddess laddie laddikie laddish laddock lade lademan laden lader ladhood ladies ladify Ladik Ladin lading Ladino ladkin ladle ladleful ladler ladlewood ladrone ladronism ladronize lady ladybird ladybug ladyclock ladydom ladyfinger ladyfish ladyfly ladyfy ladyhood ladyish ladyism ladykin ladykind ladyless ladylike ladylikely ladylikeness ladyling ladylintywhite ladylove ladyly ladyship Ladytide Laelia laemodipod Laemodipoda laemodipodan laemodipodiform laemodipodous laemoparalysis laemostenosis laeotropic laeotropism Laestrygones laet laeti laetic Laevigrada laevoduction laevogyrate laevogyre laevogyrous laevolactic laevorotation laevorotatory laevotartaric laevoversion lafayette Lafite lag lagan lagarto lagen lagena Lagenaria lagend lageniform lager Lagerstroemia Lagetta lagetto laggar laggard laggardism laggardly laggardness lagged laggen lagger laggin lagging laglast lagna lagniappe lagomorph Lagomorpha lagomorphic lagomorphous Lagomyidae lagonite lagoon lagoonal lagoonside lagophthalmos lagopode lagopodous lagopous Lagopus Lagorchestes lagostoma Lagostomus Lagothrix Lagrangian Lagthing Lagting Laguncularia Lagunero Lagurus lagwort Lahnda Lahontan Lahuli Lai lai Laibach laic laical laicality laically laich laicism laicity laicization laicize laicizer laid laigh lain laine laiose lair lairage laird lairdess lairdie lairdly lairdocracy lairdship lairless lairman lairstone lairy laitance laity Lak lak lakarpite lakatoi lake lakeland lakelander lakeless lakelet lakelike lakemanship laker lakeside lakeward lakeweed lakie laking lakish lakishness lakism lakist Lakota Lakshmi laky lalang lall Lallan Lalland lallation lalling lalo laloneurosis lalopathy lalophobia laloplegia lam lama lamaic Lamaism Lamaist Lamaistic Lamaite Lamanism Lamanite Lamano lamantin lamany Lamarckia Lamarckian Lamarckianism Lamarckism lamasary lamasery lamastery lamb Lamba lamba Lambadi lambale lambaste lambda lambdacism lambdoid lambdoidal lambeau lambency lambent lambently lamber Lambert lambert lambhood lambie lambiness lambish lambkill lambkin Lamblia lambliasis lamblike lambling lambly lamboys lambrequin lambsdown lambskin lambsuccory lamby lame lamedh lameduck lamel lamella lamellar Lamellaria Lamellariidae lamellarly lamellary lamellate lamellated lamellately lamellation lamellibranch Lamellibranchia Lamellibranchiata lamellibranchiate lamellicorn lamellicornate Lamellicornes Lamellicornia lamellicornous lamelliferous lamelliform lamellirostral lamellirostrate Lamellirostres lamelloid lamellose lamellosity lamellule lamely lameness lament lamentable lamentableness lamentably lamentation lamentational lamentatory lamented lamentedly lamenter lamentful lamenting lamentingly lamentive lamentory lamester lamestery lameter lametta lamia Lamiaceae lamiaceous lamiger lamiid Lamiidae Lamiides Lamiinae lamin lamina laminability laminable laminae laminar Laminaria Laminariaceae laminariaceous Laminariales laminarian laminarin laminarioid laminarite laminary laminate laminated lamination laminboard laminectomy laminiferous laminiform laminiplantar laminiplantation laminitis laminose laminous lamish Lamista lamiter Lamium Lammas lammas Lammastide lammer lammergeier lammock lammy Lamna lamnectomy lamnid Lamnidae lamnoid lamp lampad lampadary lampadedromy lampadephore lampadephoria lampadite lampas lampatia lampblack lamper lampern lampers lampflower lampfly lampful lamphole lamping lampion lampist lampistry lampless lamplet lamplight lamplighted lamplighter lamplit lampmaker lampmaking lampman Lampong lampoon lampooner lampoonery lampoonist lamppost lamprey Lampridae lamprophony lamprophyre lamprophyric lamprotype Lampsilis Lampsilus lampstand lampwick lampyrid Lampyridae lampyrine Lampyris Lamus Lamut lamziekte lan Lana lanameter Lanao Lanarkia lanarkite lanas lanate lanated lanaz Lancaster Lancasterian Lancastrian Lance lance lanced lancegay lancelet lancelike lancely lanceman lanceolar lanceolate lanceolated lanceolately lanceolation lancepesade lancepod lanceproof lancer lances lancet lanceted lanceteer lancewood lancha lanciers lanciferous lanciform lancinate lancination land landamman landau landaulet landaulette landblink landbook landdrost landed lander landesite landfall landfast landflood landgafol landgravate landgrave landgraveship landgravess landgraviate landgravine landholder landholdership landholding landimere landing landlady landladydom landladyhood landladyish landladyship landless landlessness landlike landline landlock landlocked landlook landlooker landloper landlord landlordism landlordly landlordry landlordship landlouper landlouping landlubber landlubberish landlubberly landlubbing landman landmark Landmarker landmil landmonger landocracy landocrat Landolphia landolphia landowner landownership landowning landplane landraker landreeve landright landsale landscape landscapist landshard landship landsick landside landskip landslide landslip Landsmaal landsman landspout landspringy Landsting landstorm Landsturm Landuman landwaiter landward landwash landways Landwehr landwhin landwire landwrack lane lanete laneway laney langaha langarai langbanite langbeinite langca Langhian langi langite langlauf langlaufer langle Lango Langobard Langobardic langoon langooty langrage langsat Langsdorffia langsettle Langshan langspiel langsyne language languaged languageless langued Languedocian languescent languet languid languidly languidness languish languisher languishing languishingly languishment languor languorous languorously langur laniariform laniary laniate laniferous lanific laniflorous laniform lanigerous Laniidae laniiform Laniinae lanioid lanista Lanital Lanius lank lanket lankily lankiness lankish lankly lankness lanky lanner lanneret Lanny lanolin lanose lanosity lansat lansdowne lanseh lansfordite lansknecht lanson lansquenet lant lantaca Lantana lanterloo lantern lanternflower lanternist lanternleaf lanternman lanthana lanthanide lanthanite Lanthanotidae Lanthanotus lanthanum lanthopine lantum lanuginose lanuginous lanuginousness lanugo lanum Lanuvian lanx lanyard Lao Laodicean Laodiceanism Laotian lap lapacho lapachol lapactic Lapageria laparectomy laparocele laparocholecystotomy laparocolectomy laparocolostomy laparocolotomy laparocolpohysterotomy laparocolpotomy laparocystectomy laparocystotomy laparoelytrotomy laparoenterostomy laparoenterotomy laparogastroscopy laparogastrotomy laparohepatotomy laparohysterectomy laparohysteropexy laparohysterotomy laparoileotomy laparomyitis laparomyomectomy laparomyomotomy laparonephrectomy laparonephrotomy laparorrhaphy laparosalpingectomy laparosalpingotomy laparoscopy laparosplenectomy laparosplenotomy laparostict Laparosticti laparothoracoscopy laparotome laparotomist laparotomize laparotomy laparotrachelotomy lapboard lapcock Lapeirousia lapel lapeler lapelled lapful lapicide lapidarian lapidarist lapidary lapidate lapidation lapidator lapideon lapideous lapidescent lapidicolous lapidific lapidification lapidify lapidist lapidity lapidose lapilliform lapillo lapillus Lapith Lapithae Lapithaean Laplacian Lapland Laplander Laplandian Laplandic Laplandish lapon Laportea Lapp Lappa lappaceous lappage lapped lapper lappet lappeted Lappic lapping Lappish Lapponese Lapponian Lappula lapsability lapsable Lapsana lapsation lapse lapsed lapser lapsi lapsing lapsingly lapstone lapstreak lapstreaked lapstreaker Laputa Laputan laputically lapwing lapwork laquear laquearian laqueus Lar lar Laralia Laramide Laramie larboard larbolins larbowlines larcener larcenic larcenish larcenist larcenous larcenously larceny larch larchen lard lardacein lardaceous larder larderellite larderer larderful larderlike lardiform lardite Lardizabalaceae lardizabalaceous lardon lardworm lardy lareabell Larentiidae large largebrained largehanded largehearted largeheartedness largely largemouth largemouthed largen largeness largess larghetto largifical largish largition largitional largo Lari lari Laria lariat larick larid Laridae laridine larigo larigot lariid Lariidae larin Larinae larine larithmics Larix larixin lark larker larkiness larking larkingly larkish larkishness larklike larkling larksome larkspur larky larmier larmoyant Larnaudian larnax laroid larrigan larrikin larrikinalian larrikiness larrikinism larriman larrup Larry larry Lars larsenite Larunda Larus larva Larvacea larvae larval Larvalia larvarium larvate larve larvicidal larvicide larvicolous larviform larvigerous larvikite larviparous larviposit larviposition larvivorous larvule laryngal laryngalgia laryngeal laryngeally laryngean laryngeating laryngectomy laryngemphraxis laryngendoscope larynges laryngic laryngismal laryngismus laryngitic laryngitis laryngocele laryngocentesis laryngofission laryngofissure laryngograph laryngography laryngological laryngologist laryngology laryngometry laryngoparalysis laryngopathy laryngopharyngeal laryngopharyngitis laryngophony laryngophthisis laryngoplasty laryngoplegia laryngorrhagia laryngorrhea laryngoscleroma laryngoscope laryngoscopic laryngoscopical laryngoscopist laryngoscopy laryngospasm laryngostasis laryngostenosis laryngostomy laryngostroboscope laryngotome laryngotomy laryngotracheal laryngotracheitis laryngotracheoscopy laryngotracheotomy laryngotyphoid laryngovestibulitis larynx las lasa lasarwort lascar lascivious lasciviously lasciviousness laser Laserpitium laserwort lash lasher lashingly lashless lashlite Lasi lasianthous Lasiocampa lasiocampid Lasiocampidae Lasiocampoidea lasiocarpous Lasius lask lasket Laspeyresia laspring lasque lass lasset lassie lassiehood lassieish lassitude lasslorn lasso lassock lassoer last lastage laster lasting lastingly lastingness lastly lastness lastre lastspring lasty lat lata latah Latakia Latania Latax latch latcher latchet latching latchkey latchless latchman latchstring late latebra latebricole latecomer latecoming lated lateen lateener lately laten latence latency lateness latensification latent latentize latently latentness later latera laterad lateral lateralis laterality lateralization lateralize laterally Lateran latericumbent lateriflexion laterifloral lateriflorous laterifolious Laterigradae laterigrade laterinerved laterite lateritic lateritious lateriversion laterization lateroabdominal lateroanterior laterocaudal laterocervical laterodeviation laterodorsal lateroduction lateroflexion lateromarginal lateronuchal lateroposition lateroposterior lateropulsion laterostigmatal laterostigmatic laterotemporal laterotorsion lateroventral lateroversion latescence latescent latesome latest latewhile latex latexosis lath lathe lathee latheman lathen lather latherability latherable lathereeve latherer latherin latheron latherwort lathery lathesman lathhouse lathing Lathraea lathwork lathy lathyric lathyrism Lathyrus Latian latibulize latices laticiferous laticlave laticostate latidentate latifundian latifundium latigo Latimeria Latin Latinate Latiner Latinesque Latinian Latinic Latiniform Latinism latinism Latinist Latinistic Latinistical Latinitaster Latinity Latinization Latinize Latinizer Latinless Latinus lation latipennate latiplantar latirostral Latirostres latirostrous Latirus latisept latiseptal latiseptate latish latisternal latitancy latitant latitat latite latitude latitudinal latitudinally latitudinarian latitudinarianisn latitudinary latitudinous latomy Latona Latonian Latooka latrant latration latreutic latria Latrididae latrine Latris latro latrobe latrobite latrocinium Latrodectus latron latten lattener latter latterkin latterly lattermath lattermost latterness lattice latticed latticewise latticework latticing latticinio Latuka latus Latvian lauan laubanite laud laudability laudable laudableness laudably laudanidine laudanin laudanine laudanosine laudanum laudation laudative laudator laudatorily laudatory lauder Laudian Laudianism laudification Laudism Laudist laudist laugh laughable laughableness laughably laughee laugher laughful laughing laughingly laughingstock laughsome laughter laughterful laughterless laughworthy laughy lauia laumonite laumontite laun launce launch launcher launchful launchways laund launder launderability launderable launderer laundry laundrymaid laundryman laundryowner laundrywoman laur Laura laura Lauraceae lauraceous lauraldehyde laurate laurdalite laureate laureated laureateship laureation Laurel laurel laureled laurellike laurelship laurelwood Laurence Laurencia Laurent Laurentian Laurentide laureole Laurianne lauric Laurie laurin laurinoxylon laurionite laurite Laurocerasus laurone laurotetanine Laurus laurustine laurustinus laurvikite lauryl lautarite lautitious lava lavable lavabo lavacre lavage lavaliere lavalike Lavandula lavanga lavant lavaret Lavatera lavatic lavation lavational lavatorial lavatory lave laveer Lavehr lavement lavender lavenite laver Laverania laverock laverwort lavialite lavic Lavinia lavish lavisher lavishing lavishingly lavishly lavishment lavishness lavolta lavrovite law lawbook lawbreaker lawbreaking lawcraft lawful lawfully lawfulness lawgiver lawgiving lawing lawish lawk lawlants lawless lawlessly lawlessness lawlike lawmaker lawmaking lawman lawmonger lawn lawned lawner lawnlet lawnlike lawny lawproof Lawrence lawrencite Lawrie lawrightman Lawson Lawsoneve Lawsonia lawsonite lawsuit lawsuiting lawter Lawton lawyer lawyeress lawyerism lawyerlike lawyerling lawyerly lawyership lawyery lawzy lax laxate laxation laxative laxatively laxativeness laxiflorous laxifoliate laxifolious laxism laxist laxity laxly laxness lay layaway layback layboy layer layerage layered layery layette Layia laying layland layman laymanship layne layoff layout layover layship laystall laystow laywoman Laz lazar lazaret lazaretto Lazarist lazarlike lazarly lazarole Lazarus laze lazily laziness lazule lazuli lazuline lazulite lazulitic lazurite lazy lazybird lazybones lazyboots lazyhood lazyish lazylegs lazyship lazzarone lazzaroni Lea lea leach leacher leachman leachy Lead lead leadable leadableness leadage leadback leaded leaden leadenhearted leadenheartedness leadenly leadenness leadenpated leader leaderess leaderette leaderless leadership leadhillite leadin leadiness leading leadingly leadless leadman leadoff leadout leadproof Leads leadsman leadstone leadway leadwood leadwork leadwort leady leaf leafage leafboy leafcup leafdom leafed leafen leafer leafery leafgirl leafit leafless leaflessness leaflet leafleteer leaflike leafstalk leafwork leafy league leaguelong leaguer Leah leak leakage leakance leaker leakiness leakless leakproof leaky leal lealand leally lealness lealty leam leamer lean Leander leaner leaning leanish leanly leanness leant leap leapable leaper leapfrog leapfrogger leapfrogging leaping leapingly leapt Lear lear Learchus learn learnable learned learnedly learnedness learner learnership learning learnt Learoyd leasable lease leasehold leaseholder leaseholding leaseless leasemonger leaser leash leashless leasing leasow least leastways leastwise leat leath leather leatherback leatherbark leatherboard leatherbush leathercoat leathercraft leatherer Leatherette leatherfish leatherflower leatherhead leatherine leatheriness leathering leatherize leatherjacket leatherleaf leatherlike leathermaker leathermaking leathern leatherneck Leatheroid leatherroot leatherside Leatherstocking leatherware leatherwing leatherwood leatherwork leatherworker leatherworking leathery leathwake leatman leave leaved leaveless leavelooker leaven leavening leavenish leavenless leavenous leaver leaverwood leaves leaving leavy leawill leban Lebanese lebbek lebensraum Lebistes lebrancho lecama lecaniid Lecaniinae lecanine Lecanium lecanomancer lecanomancy lecanomantic Lecanora Lecanoraceae lecanoraceous lecanorine lecanoroid lecanoscopic lecanoscopy lech Lechea lecher lecherous lecherously lecherousness lechery lechriodont Lechriodonta lechuguilla lechwe Lecidea Lecideaceae lecideaceous lecideiform lecideine lecidioid lecithal lecithalbumin lecithality lecithin lecithinase lecithoblast lecithoprotein leck lecker lecontite lecotropal lectern lection lectionary lectisternium lector lectorate lectorial lectorship lectotype lectress lectrice lectual lecture lecturee lectureproof lecturer lectureship lecturess lecturette lecyth lecythid Lecythidaceae lecythidaceous Lecythis lecythoid lecythus led Leda lede leden lederite ledge ledged ledgeless ledger ledgerdom ledging ledgment ledgy Ledidae ledol Ledum Lee lee leeangle leeboard leech leecheater leecher leechery leeches leechkin leechlike leechwort leed leefang leeftail leek leekish leeky leep leepit leer leerily leeringly leerish leerness leeroway Leersia leery lees leet leetman leewan leeward leewardly leewardmost leewardness leeway leewill left leftish leftism leftist leftments leftmost leftness leftover leftward leftwardly leftwards leg legacy legal legalese legalism legalist legalistic legalistically legality legalization legalize legally legalness legantine legatary legate legatee legateship legatine legation legationary legative legato legator legatorial legend legenda legendarian legendary legendic legendist legendless Legendrian legendry leger legerdemain legerdemainist legerity leges legged legger legginess legging legginged leggy leghorn legibility legible legibleness legibly legific legion legionary legioned legioner legionnaire legionry legislate legislation legislational legislativ legislative legislatively legislator legislatorial legislatorially legislatorship legislatress legislature legist legit legitim legitimacy legitimate legitimately legitimateness legitimation legitimatist legitimatize legitimism legitimist legitimistic legitimity legitimization legitimize leglen legless leglessness leglet leglike legman legoa legpiece legpull legpuller legpulling legrope legua leguan Leguatia leguleian leguleious legume legumelin legumen legumin leguminiform Leguminosae leguminose leguminous Lehi lehr lehrbachite lehrman lehua lei Leibnitzian Leibnitzianism Leicester Leif Leigh leighton Leila leimtype leiocephalous leiocome leiodermatous leiodermia leiomyofibroma leiomyoma leiomyomatous leiomyosarcoma leiophyllous Leiophyllum Leiothrix Leiotrichan Leiotriches Leiotrichi Leiotrichidae Leiotrichinae leiotrichine leiotrichous leiotrichy leiotropic Leipoa Leishmania leishmaniasis Leisten leister leisterer leisurable leisurably leisure leisured leisureful leisureless leisureliness leisurely leisureness Leith leitmotiv Leitneria Leitneriaceae leitneriaceous Leitneriales lek lekach lekane lekha Lelia Lemaireocereus leman Lemanea Lemaneaceae lemel lemma lemmata lemming lemmitis lemmoblastic lemmocyte Lemmus Lemna Lemnaceae lemnaceous lemnad Lemnian lemniscate lemniscatic lemniscus lemography lemology lemon lemonade Lemonias Lemoniidae Lemoniinae lemonish lemonlike lemonweed lemonwood lemony Lemosi Lemovices lempira Lemuel lemur lemures Lemuria Lemurian lemurian lemurid Lemuridae lemuriform Lemurinae lemurine lemuroid Lemuroidea Len Lena lenad Lenaea Lenaean Lenaeum Lenaeus Lenape lenard Lenca Lencan lench lend lendable lendee lender Lendu lene length lengthen lengthener lengther lengthful lengthily lengthiness lengthsman lengthsome lengthsomeness lengthways lengthwise lengthy lenience leniency lenient leniently lenify Leninism Leninist Leninite lenis lenitic lenitive lenitively lenitiveness lenitude lenity lennilite Lennoaceae lennoaceous lennow Lenny leno Lenora lens lensed lensless lenslike Lent lent Lenten Lententide lenth lenthways Lentibulariaceae lentibulariaceous lenticel lenticellate lenticle lenticonus lenticula lenticular lenticulare lenticularis lenticularly lenticulate lenticulated lenticule lenticulostriate lenticulothalamic lentiform lentigerous lentiginous lentigo lentil Lentilla lentisc lentiscine lentisco lentiscus lentisk lentitude lentitudinous lento lentoid lentor lentous lenvoi lenvoy Lenzites Leo Leon Leonard Leonardesque Leonato leoncito Leonese leonhardite Leonid Leonine leonine leoninely leonines Leonis Leonist leonite Leonnoys Leonora Leonotis leontiasis Leontocebus leontocephalous Leontodon Leontopodium Leonurus leopard leoparde leopardess leopardine leopardite leopardwood Leopold Leopoldinia leopoldite Leora leotard lepa Lepadidae lepadoid Lepanto lepargylic Lepargyraea Lepas Lepcha leper leperdom lepered lepidene lepidine Lepidium lepidoblastic Lepidodendraceae lepidodendraceous lepidodendrid lepidodendroid Lepidodendron lepidoid Lepidoidei lepidolite lepidomelane Lepidophloios lepidophyllous Lepidophyllum lepidophyte lepidophytic lepidoporphyrin lepidopter Lepidoptera lepidopteral lepidopteran lepidopterid lepidopterist lepidopterological lepidopterologist lepidopterology lepidopteron lepidopterous Lepidosauria lepidosaurian Lepidosiren Lepidosirenidae lepidosirenoid lepidosis Lepidosperma Lepidospermae Lepidosphes Lepidostei lepidosteoid Lepidosteus Lepidostrobus lepidote Lepidotes lepidotic Lepidotus Lepidurus Lepilemur Lepiota Lepisma Lepismatidae Lepismidae lepismoid Lepisosteidae Lepisosteus lepocyte Lepomis leporid Leporidae leporide leporiform leporine Leporis Lepospondyli lepospondylous Leposternidae Leposternon lepothrix lepra Lepralia lepralian leprechaun lepric leproid leprologic leprologist leprology leproma lepromatous leprosarium leprose leprosery leprosied leprosis leprosity leprosy leprous leprously leprousness Leptamnium Leptandra leptandrin leptid Leptidae leptiform Leptilon leptinolite Leptinotarsa leptite Leptocardia leptocardian Leptocardii leptocentric leptocephalan leptocephali leptocephalia leptocephalic leptocephalid Leptocephalidae leptocephaloid leptocephalous Leptocephalus leptocephalus leptocephaly leptocercal leptochlorite leptochroa leptochrous leptoclase leptodactyl Leptodactylidae leptodactylous Leptodactylus leptodermatous leptodermous Leptodora Leptodoridae Leptogenesis leptokurtic Leptolepidae Leptolepis Leptolinae leptomatic leptome Leptomedusae leptomedusan leptomeningeal leptomeninges leptomeningitis leptomeninx leptometer leptomonad Leptomonas Lepton lepton leptonecrosis leptonema leptopellic Leptophis leptophyllous leptoprosope leptoprosopic leptoprosopous leptoprosopy Leptoptilus Leptorchis leptorrhin leptorrhine leptorrhinian leptorrhinism leptosome leptosperm Leptospermum Leptosphaeria Leptospira leptospirosis leptosporangiate Leptostraca leptostracan leptostracous Leptostromataceae Leptosyne leptotene Leptothrix Leptotrichia Leptotyphlopidae Leptotyphlops leptus leptynite Lepus Ler Lernaea Lernaeacea Lernaean Lernaeidae lernaeiform lernaeoid Lernaeoides lerot lerp lerret Lerwa Les Lesath Lesbia Lesbian Lesbianism lesche Lesgh lesion lesional lesiy Leskea Leskeaceae leskeaceous Lesleya Leslie Lespedeza Lesquerella less lessee lesseeship lessen lessener lesser lessive lessn lessness lesson lessor lest Lester lestiwarite lestobiosis lestobiotic Lestodon Lestosaurus lestrad Lestrigon Lestrigonian let letch letchy letdown lete lethal lethality lethalize lethally lethargic lethargical lethargically lethargicalness lethargize lethargus lethargy Lethe Lethean lethiferous Lethocerus lethologica Letitia Leto letoff Lett lettable letten letter lettered letterer letteret lettergram letterhead letterin lettering letterleaf letterless letterpress letterspace letterweight letterwood Lettic Lettice Lettish lettrin lettsomite lettuce Letty letup leu Leucadendron Leucadian leucaemia leucaemic Leucaena leucaethiop leucaethiopic leucaniline leucanthous leucaugite leucaurin leucemia leucemic Leucetta leuch leuchaemia leuchemia leuchtenbergite Leucichthys Leucifer Leuciferidae leucine Leucippus leucism leucite leucitic leucitis leucitite leucitohedron leucitoid Leuckartia Leuckartiidae leuco leucobasalt leucoblast leucoblastic Leucobryaceae Leucobryum leucocarpous leucochalcite leucocholic leucocholy leucochroic leucocidic leucocidin leucocism leucocrate leucocratic Leucocrinum leucocyan leucocytal leucocyte leucocythemia leucocythemic leucocytic leucocytoblast leucocytogenesis leucocytoid leucocytology leucocytolysin leucocytolysis leucocytolytic leucocytometer leucocytopenia leucocytopenic leucocytoplania leucocytopoiesis leucocytosis leucocytotherapy leucocytotic Leucocytozoon leucoderma leucodermatous leucodermic leucoencephalitis leucogenic leucoid leucoindigo leucoindigotin Leucojaceae Leucojum leucolytic leucoma leucomaine leucomatous leucomelanic leucomelanous leucon Leuconostoc leucopenia leucopenic leucophane leucophanite leucophoenicite leucophore leucophyllous leucophyre leucoplakia leucoplakial leucoplast leucoplastid leucopoiesis leucopoietic leucopyrite leucoquinizarin leucorrhea leucorrheal leucoryx leucosis Leucosolenia Leucosoleniidae leucospermous leucosphenite leucosphere leucospheric leucostasis Leucosticte leucosyenite leucotactic Leucothea Leucothoe leucotic leucotome leucotomy leucotoxic leucous leucoxene leucyl leud leuk leukemia leukemic leukocidic leukocidin leukosis leukotic leuma Leung lev Levana levance Levant levant Levanter levanter Levantine levator levee level leveler levelheaded levelheadedly levelheadedness leveling levelish levelism levelly levelman levelness lever leverage leverer leveret leverman levers leverwood Levi leviable leviathan levier levigable levigate levigation levigator levin levining levir levirate leviratical leviration Levis Levisticum levitant levitate levitation levitational levitative levitator Levite Levitical Leviticalism Leviticality Levitically Leviticalness Leviticism Leviticus Levitism levity levo levoduction levogyrate levogyre levogyrous levolactic levolimonene levorotation levorotatory levotartaric levoversion levulic levulin levulinic levulose levulosuria levy levyist levynite Lew lew Lewanna lewd lewdly lewdness Lewie Lewis lewis Lewisia Lewisian lewisite lewisson lewth Lex lexia lexical lexicalic lexicality lexicographer lexicographian lexicographic lexicographical lexicographically lexicographist lexicography lexicologic lexicological lexicologist lexicology lexicon lexiconist lexiconize lexigraphic lexigraphical lexigraphically lexigraphy lexiphanic lexiphanicism ley leyland leysing Lezghian lherzite lherzolite Lhota li liability liable liableness liaison liana liang liar liard Lias Liassic Liatris libament libaniferous libanophorous libanotophorous libant libate libation libationary libationer libatory libber libbet libbra Libby libel libelant libelee libeler libelist libellary libellate Libellula libellulid Libellulidae libelluloid libelous libelously Liber liber liberal Liberalia liberalism liberalist liberalistic liberality liberalization liberalize liberalizer liberally liberalness liberate liberation liberationism liberationist liberative liberator liberatory liberatress Liberia Liberian liberomotor libertarian libertarianism Libertas liberticidal liberticide libertinage libertine libertinism liberty libertyless libethenite libidibi libidinal libidinally libidinosity libidinous libidinously libidinousness libido Libitina libken Libocedrus Libra libra libral librarian librarianess librarianship librarious librarius library libraryless librate libration libratory libretti librettist libretto Librid libriform libroplast Libyan Libytheidae Libytheinae Licania licareol licca licensable license licensed licensee licenseless licenser licensor licensure licentiate licentiateship licentiation licentious licentiously licentiousness lich licham lichanos lichen lichenaceous lichened Lichenes licheniasis lichenic lichenicolous licheniform lichenin lichenism lichenist lichenivorous lichenization lichenize lichenlike lichenographer lichenographic lichenographical lichenographist lichenography lichenoid lichenologic lichenological lichenologist lichenology Lichenopora Lichenoporidae lichenose licheny lichi Lichnophora Lichnophoridae Licinian licit licitation licitly licitness lick licker lickerish lickerishly lickerishness licking lickpenny lickspit lickspittle lickspittling licorice licorn licorne lictor lictorian Licuala lid Lida lidded lidder Lide lidflower lidgate lidless lie liebenerite Liebfraumilch liebigite lied lief liege liegedom liegeful liegefully liegeless liegely liegeman lieger lien lienal lienculus lienee lienic lienitis lienocele lienogastric lienointestinal lienomalacia lienomedullary lienomyelogenous lienopancreatic lienor lienorenal lienotoxin lienteria lienteric lientery lieproof lieprooflier lieproofliest lier lierne lierre liesh liespfund lieu lieue lieutenancy lieutenant lieutenantry lieutenantship Lievaart lieve lievrite Lif life lifeblood lifeboat lifeboatman lifeday lifedrop lifeful lifefully lifefulness lifeguard lifehold lifeholder lifeless lifelessly lifelessness lifelet lifelike lifelikeness lifeline lifelong lifer liferent liferenter liferentrix liferoot lifesaver lifesaving lifesome lifesomely lifesomeness lifespring lifetime lifeward lifework lifey lifo lift liftable lifter lifting liftless liftman ligable ligament ligamental ligamentary ligamentous ligamentously ligamentum ligas ligate ligation ligator ligature ligeance ligger light lightable lightboat lightbrained lighten lightener lightening lighter lighterage lighterful lighterman lightface lightful lightfulness lighthead lightheaded lightheadedly lightheadedness lighthearted lightheartedly lightheartedness lighthouse lighthouseman lighting lightish lightkeeper lightless lightlessness lightly lightman lightmanship lightmouthed lightness lightning lightninglike lightningproof lightproof lightroom lightscot lightship lightsman lightsome lightsomely lightsomeness lighttight lightwards lightweight lightwood lightwort lignaloes lignatile ligne ligneous lignescent lignicole lignicoline lignicolous ligniferous lignification ligniform lignify lignin ligninsulphonate ligniperdous lignite lignitic lignitiferous lignitize lignivorous lignocellulose lignoceric lignography lignone lignose lignosity lignosulphite lignosulphonate lignum ligroine ligula ligular Ligularia ligulate ligulated ligule Liguliflorae liguliflorous liguliform ligulin liguloid Liguorian ligure Ligurian ligurite ligurition Ligusticum ligustrin Ligustrum Ligyda Ligydidae Lihyanite liin lija likability likable likableness like likelihead likelihood likeliness likely liken likeness liker likesome likeways likewise likin liking liknon Lila lilac lilaceous lilacin lilacky lilacthroat lilactide Lilaeopsis lile Liliaceae liliaceous Liliales Lilian lilied liliform Liliiflorae Lilith Lilium lill lillianite lillibullero Lilliput Lilliputian Lilliputianize lilt liltingly liltingness lily lilyfy lilyhanded lilylike lilywood lilywort lim Lima Limacea limacel limaceous Limacidae limaciform Limacina limacine limacinid Limacinidae limacoid limacon limaille liman limation Limawood Limax limb limbal limbat limbate limbation limbeck limbed limber limberham limberly limberness limbers limbic limbie limbiferous limbless limbmeal limbo limboinfantum limbous Limbu Limburger limburgite limbus limby lime limeade Limean limeberry limebush limehouse limekiln limeless limelight limelighter limelike limeman limen limequat limer Limerick limes limestone limetta limettin limewash limewater limewort limey Limicolae limicoline limicolous Limidae liminal liminary liminess liming limit limitable limitableness limital limitarian limitary limitate limitation limitative limitatively limited limitedly limitedness limiter limiting limitive limitless limitlessly limitlessness limitrophe limivorous limma limmer limmock limmu limn limnanth Limnanthaceae limnanthaceous Limnanthemum Limnanthes limner limnery limnetic Limnetis limniad limnimeter limnimetric limnite limnobiologic limnobiological limnobiologically limnobiology limnobios Limnobium Limnocnida limnograph limnologic limnological limnologically limnologist limnology limnometer limnophile limnophilid Limnophilidae limnophilous limnoplankton Limnorchis Limnoria Limnoriidae limnorioid Limodorum limoid limonene limoniad limonin limonite limonitic limonitization limonium Limosa limose Limosella Limosi limous limousine limp limper limpet limphault limpid limpidity limpidly limpidness limpily limpin limpiness limping limpingly limpingness limpish limpkin limply limpness limpsy limpwort limpy limsy limu limulid Limulidae limuloid Limuloidea Limulus limurite limy Lin lin Lina lina linable Linaceae linaceous linaga linage linaloa linalol linalool linamarin Linanthus Linaria linarite linch linchbolt linchet linchpin linchpinned lincloth Lincoln Lincolnian Lincolniana Lincolnlike linctus Linda lindackerite lindane linden Linder linder Lindera Lindleyan lindo lindoite Lindsay Lindsey line linea lineage lineaged lineal lineality lineally lineament lineamental lineamentation lineameter linear linearifolius linearity linearization linearize linearly lineate lineated lineation lineature linecut lined lineiform lineless linelet lineman linen Linene linenette linenize linenizer linenman lineocircular lineograph lineolate lineolated liner linesman Linet linewalker linework ling linga Lingayat lingberry lingbird linge lingel lingenberry linger lingerer lingerie lingo lingonberry Lingoum lingtow lingtowman lingua linguacious linguaciousness linguadental linguaeform lingual linguale linguality lingualize lingually linguanasal Linguata Linguatula Linguatulida Linguatulina linguatuline linguatuloid linguet linguidental linguiform linguipotence linguist linguister linguistic linguistical linguistically linguistician linguistics linguistry lingula lingulate lingulated Lingulella lingulid Lingulidae linguliferous linguliform linguloid linguodental linguodistal linguogingival linguopalatal linguopapillitis linguoversion lingwort lingy linha linhay linie liniment linin lininess lining linitis liniya linja linje link linkable linkage linkboy linked linkedness linker linking linkman links linksmith linkwork linky Linley linn Linnaea Linnaean Linnaeanism linnaeite Linne linnet lino linolate linoleic linolein linolenate linolenic linolenin linoleum linolic linolin linometer linon Linopteris Linos Linotype linotype linotyper linotypist linous linoxin linoxyn linpin Linsang linseed linsey linstock lint lintel linteled linteling linten linter lintern lintie lintless lintonite lintseed lintwhite linty Linum Linus linwood liny Linyphia Linyphiidae liodermia liomyofibroma liomyoma lion lioncel Lionel lionel lionesque lioness lionet lionheart lionhearted lionheartedness lionhood lionism lionizable lionization lionize lionizer lionlike lionly lionproof lionship Liothrix Liotrichi Liotrichidae liotrichine lip lipa lipacidemia lipaciduria Lipan Liparian liparian liparid Liparidae Liparididae Liparis liparite liparocele liparoid liparomphalus liparous lipase lipectomy lipemia Lipeurus lipide lipin lipless liplet liplike lipoblast lipoblastoma Lipobranchia lipocaic lipocardiac lipocele lipoceratous lipocere lipochondroma lipochrome lipochromogen lipoclasis lipoclastic lipocyte lipodystrophia lipodystrophy lipoferous lipofibroma lipogenesis lipogenetic lipogenic lipogenous lipogram lipogrammatic lipogrammatism lipogrammatist lipography lipohemia lipoid lipoidal lipoidemia lipoidic lipolysis lipolytic lipoma lipomata lipomatosis lipomatous lipometabolic lipometabolism lipomorph lipomyoma lipomyxoma lipopexia lipophagic lipophore lipopod Lipopoda lipoprotein liposarcoma liposis liposome lipostomy lipothymial lipothymic lipothymy lipotrophic lipotrophy lipotropic lipotropy lipotype Lipotyphla lipovaccine lipoxenous lipoxeny lipped lippen lipper lipperings Lippia lippiness lipping lippitude lippitudo lippy lipsanographer lipsanotheca lipstick lipuria lipwork liquable liquamen liquate liquation liquefacient liquefaction liquefactive liquefiable liquefier liquefy liquesce liquescence liquescency liquescent liqueur liquid liquidable Liquidambar liquidamber liquidate liquidation liquidator liquidatorship liquidity liquidize liquidizer liquidless liquidly liquidness liquidogenic liquidogenous liquidy liquiform liquor liquorer liquorish liquorishly liquorishness liquorist liquorless lira lirate liration lire lirella lirellate lirelliform lirelline lirellous Liriodendron liripipe liroconite lis Lisa Lisbon Lise lisere Lisette lish lisk Lisle lisle lisp lisper lispingly lispund liss Lissamphibia lissamphibian Lissencephala lissencephalic lissencephalous Lissoflagellata lissoflagellate lissom lissome lissomely lissomeness lissotrichan Lissotriches lissotrichous lissotrichy List list listable listed listedness listel listen listener listening lister Listera listerellosis Listeria Listerian Listerine Listerism Listerize listing listless listlessly listlessness listred listwork Lisuarte lit litaneutical litany litanywise litas litation litch litchi lite liter literacy literaily literal literalism literalist literalistic literality literalization literalize literalizer literally literalminded literalmindedness literalness literarian literariness literary literaryism literate literati literation literatist literato literator literature literatus literose literosity lith lithagogue lithangiuria lithanthrax litharge lithe lithectasy lithectomy lithely lithemia lithemic litheness lithesome lithesomeness lithi lithia lithiasis lithiastic lithiate lithic lithifaction lithification lithify lithite lithium litho lithobiid Lithobiidae lithobioid Lithobius Lithocarpus lithocenosis lithochemistry lithochromatic lithochromatics lithochromatographic lithochromatography lithochromography lithochromy lithoclase lithoclast lithoclastic lithoclasty lithoculture lithocyst lithocystotomy Lithodes lithodesma lithodialysis lithodid Lithodidae lithodomous Lithodomus lithofracteur lithofractor lithogenesis lithogenetic lithogenous lithogeny lithoglyph lithoglypher lithoglyphic lithoglyptic lithoglyptics lithograph lithographer lithographic lithographical lithographically lithographize lithography lithogravure lithoid lithoidite litholabe litholapaxy litholatrous litholatry lithologic lithological lithologically lithologist lithology litholysis litholyte litholytic lithomancy lithomarge lithometer lithonephria lithonephritis lithonephrotomy lithontriptic lithontriptist lithontriptor lithopedion lithopedium lithophagous lithophane lithophanic lithophany lithophilous lithophone lithophotography lithophotogravure lithophthisis lithophyl lithophyllous lithophysa lithophysal lithophyte lithophytic lithophytous lithopone lithoprint lithoscope lithosian lithosiid Lithosiidae Lithosiinae lithosis lithosol lithosperm lithospermon lithospermous Lithospermum lithosphere lithotint lithotome lithotomic lithotomical lithotomist lithotomize lithotomous lithotomy lithotony lithotresis lithotripsy lithotriptor lithotrite lithotritic lithotritist lithotrity lithotype lithotypic lithotypy lithous lithoxyl lithsman Lithuanian Lithuanic lithuresis lithuria lithy liticontestation litigable litigant litigate litigation litigationist litigator litigatory litigiosity litigious litigiously litigiousness Litiopa litiscontest litiscontestation litiscontestational litmus Litopterna Litorina Litorinidae litorinoid litotes litra Litsea litster litten litter litterateur litterer littermate littery little littleleaf littleneck littleness littlewale littling littlish littoral Littorella littress lituiform lituite Lituites Lituitidae Lituola lituoline lituoloid liturate liturgical liturgically liturgician liturgics liturgiological liturgiologist liturgiology liturgism liturgist liturgistic liturgistical liturgize liturgy litus lituus Litvak Lityerses litz Liukiu Liv livability livable livableness live liveborn lived livedo livelihood livelily liveliness livelong lively liven liveness liver liverance liverberry livered liverhearted liverheartedness liveried liverish liverishness liverleaf liverless Liverpudlian liverwort liverwurst livery liverydom liveryless liveryman livestock Livian livid lividity lividly lividness livier living livingless livingly livingness livingstoneite Livish Livistona Livonian livor livre liwan lixive lixivial lixiviate lixiviation lixiviator lixivious lixivium Liyuan Liz Liza lizard lizardtail Lizzie llama Llanberisslate Llandeilo Llandovery llano llautu Lleu Llew Lloyd Lludd llyn Lo lo Loa loa loach load loadage loaded loaden loader loading loadless loadpenny loadsome loadstone loaf loafer loaferdom loaferish loafing loafingly loaflet loaghtan loam loamily loaminess loaming loamless Loammi loamy loan loanable loaner loanin loanmonger loanword Loasa Loasaceae loasaceous loath loathe loather loathful loathfully loathfulness loathing loathingly loathliness loathly loathness loathsome loathsomely loathsomeness Loatuko loave lob Lobachevskian lobal Lobale lobar Lobaria Lobata Lobatae lobate lobated lobately lobation lobber lobbish lobby lobbyer lobbyism lobbyist lobbyman lobcock lobe lobectomy lobed lobefoot lobefooted lobeless lobelet Lobelia Lobeliaceae lobeliaceous lobelin lobeline lobellated lobfig lobiform lobigerous lobing lobiped loblolly lobo lobola lobopodium Lobosa lobose lobotomy lobscourse lobscouse lobscouser lobster lobstering lobsterish lobsterlike lobsterproof lobtail lobular Lobularia lobularly lobulate lobulated lobulation lobule lobulette lobulose lobulous lobworm loca locable local locale localism localist localistic locality localizable localization localize localizer locally localness locanda Locarnist Locarnite Locarnize Locarno locate location locational locative locator locellate locellus loch lochage lochan lochetic lochia lochial lochiocolpos lochiocyte lochiometra lochiometritis lochiopyra lochiorrhagia lochiorrhea lochioschesis Lochlin lochometritis lochoperitonitis lochopyra lochus lochy loci lociation lock lockable lockage Lockatong lockbox locked locker lockerman locket lockful lockhole Lockian Lockianism locking lockjaw lockless locklet lockmaker lockmaking lockman lockout lockpin Lockport lockram locksman locksmith locksmithery locksmithing lockspit lockup lockwork locky loco locodescriptive locofoco Locofocoism locoism locomobile locomobility locomote locomotility locomotion locomotive locomotively locomotiveman locomotiveness locomotivity locomotor locomotory locomutation locoweed Locrian Locrine loculament loculamentose loculamentous locular loculate loculated loculation locule loculicidal loculicidally loculose loculus locum locus locust locusta locustal locustberry locustelle locustid Locustidae locusting locustlike locution locutor locutorship locutory lod Loddigesia lode lodemanage lodesman lodestar lodestone lodestuff lodge lodgeable lodged lodgeful lodgeman lodgepole lodger lodgerdom lodging lodginghouse lodgings lodgment Lodha lodicule Lodoicea Lodowic Lodowick Lodur Loegria loess loessal loessial loessic loessland loessoid lof lofstelle loft lofter loftily loftiness lofting loftless loftman loftsman lofty log loganberry Logania Loganiaceae loganiaceous loganin logaoedic logarithm logarithmal logarithmetic logarithmetical logarithmetically logarithmic logarithmical logarithmically logarithmomancy logbook logcock loge logeion logeum loggat logged logger loggerhead loggerheaded loggia loggin logging loggish loghead logheaded logia logic logical logicalist logicality logicalization logicalize logically logicalness logicaster logician logicism logicist logicity logicize logicless logie login logion logistic logistical logistician logistics logium loglet loglike logman logocracy logodaedaly logogogue logogram logogrammatic logograph logographer logographic logographical logographically logography logogriph logogriphic logoi logolatry logology logomach logomacher logomachic logomachical logomachist logomachize logomachy logomancy logomania logomaniac logometer logometric logometrical logometrically logopedia logopedics logorrhea logos logothete logotype logotypy Logres Logria Logris logroll logroller logrolling logway logwise logwood logwork logy lohan Lohana Lohar lohoch loimic loimography loimology loin loincloth loined loir Lois Loiseleuria loiter loiterer loiteringly loiteringness loka lokao lokaose lokapala loke loket lokiec Lokindra Lokman Lola Loliginidae Loligo Lolium loll Lollard Lollardian Lollardism Lollardist Lollardize Lollardlike Lollardry Lollardy loller lollingite lollingly lollipop lollop lollopy lolly Lolo loma lomastome lomatine lomatinous Lomatium Lombard lombard Lombardeer Lombardesque Lombardian Lombardic lomboy Lombrosian loment lomentaceous Lomentaria lomentariaceous lomentum lomita lommock Lonchocarpus Lonchopteridae Londinensian Londoner Londonese Londonesque Londonian Londonish Londonism Londonization Londonize Londony Londres lone lonelihood lonelily loneliness lonely loneness lonesome lonesomely lonesomeness long longa longan longanimity longanimous Longaville longbeak longbeard longboat longbow longcloth longe longear longer longeval longevity longevous longfelt longfin longful longhair longhand longhead longheaded longheadedly longheadedness longhorn longicaudal longicaudate longicone longicorn Longicornia longilateral longilingual longiloquence longimanous longimetric longimetry longing longingly longingness Longinian longinquity longipennate longipennine longirostral longirostrate longirostrine Longirostrines longisection longish longitude longitudinal longitudinally longjaw longleaf longlegs longly longmouthed longness Longobard Longobardi Longobardian Longobardic longs longshanks longshore longshoreman longsome longsomely longsomeness longspun longspur longtail longue longulite longway longways longwise longwool longwork longwort Lonhyn Lonicera Lonk lonquhard lontar loo looby lood loof loofah loofie loofness look looker looking lookout lookum loom loomer loomery looming loon loonery looney loony loop looper loopful loophole looping loopist looplet looplike loopy loose loosely loosemouthed loosen loosener looseness looser loosestrife loosing loosish loot lootable looten looter lootie lootiewallah lootsman lop lope loper Lopezia lophiid Lophiidae lophine Lophiodon lophiodont Lophiodontidae lophiodontoid Lophiola Lophiomyidae Lophiomyinae Lophiomys lophiostomate lophiostomous lophobranch lophobranchiate Lophobranchii lophocalthrops lophocercal Lophocome Lophocomi Lophodermium lophodont Lophophora lophophoral lophophore Lophophorinae lophophorine Lophophorus lophophytosis Lophopoda Lophornis Lophortyx lophosteon lophotriaene lophotrichic lophotrichous Lophura lopolith loppard lopper loppet lopping loppy lopseed lopsided lopsidedly lopsidedness lopstick loquacious loquaciously loquaciousness loquacity loquat loquence loquent loquently Lora lora loral loran lorandite loranskite Loranthaceae loranthaceous Loranthus lorarius lorate lorcha Lord lord lording lordkin lordless lordlet lordlike lordlily lordliness lordling lordly lordolatry lordosis lordotic lordship lordwood lordy lore loreal lored loreless Loren Lorenzan lorenzenite Lorenzo Lorettine lorettoite lorgnette Lori lori loric lorica loricarian Loricariidae loricarioid Loricata loricate Loricati lorication loricoid Lorien lorikeet lorilet lorimer loriot loris Lorius lormery lorn lornness loro Lorraine Lorrainer Lorrainese lorriker lorry lors lorum lory losable losableness lose losel loselism losenger loser losh losing loss lossenite lossless lossproof lost lostling lostness Lot lot Lota lota lotase lote lotebush Lotharingian lotic lotiform lotion lotment Lotophagi lotophagous lotophagously lotrite lots Lotta Lotte lotter lottery Lottie lotto Lotuko lotus lotusin lotuslike Lou louch louchettes loud louden loudering loudish loudly loudmouthed loudness louey lough lougheen Louie Louiqa Louis Louisa Louise Louisiana Louisianian louisine louk Loukas loukoum loulu lounder lounderer lounge lounger lounging loungingly loungy Loup loup loupe lour lourdy louse louseberry lousewort lousily lousiness louster lousy lout louter louther loutish loutishly loutishness loutrophoros louty louvar louver louvered louvering louverwork Louvre lovability lovable lovableness lovably lovage love lovebird loveflower loveful lovelass loveless lovelessly lovelessness lovelihead lovelily loveliness loveling lovelock lovelorn lovelornness lovely loveman lovemate lovemonger loveproof lover loverdom lovered loverhood lovering loverless loverliness loverly lovership loverwise lovesick lovesickness lovesome lovesomely lovesomeness loveworth loveworthy loving lovingly lovingness low lowa lowan lowbell lowborn lowboy lowbred lowdah lowder loweite Lowell lower lowerable lowerclassman lowerer lowering loweringly loweringness lowermost lowery lowigite lowish lowishly lowishness lowland lowlander lowlily lowliness lowly lowmen lowmost lown lowness lownly lowth Lowville lowwood lowy lox loxia loxic Loxiinae loxoclase loxocosm loxodograph Loxodon loxodont Loxodonta loxodontous loxodrome loxodromic loxodromical loxodromically loxodromics loxodromism Loxolophodon loxolophodont Loxomma loxophthalmus Loxosoma Loxosomidae loxotic loxotomy loy loyal loyalism loyalist loyalize loyally loyalness loyalty Loyd Loyolism Loyolite lozenge lozenged lozenger lozengeways lozengewise lozengy Lu Luba lubber lubbercock Lubberland lubberlike lubberliness lubberly lube lubra lubric lubricant lubricate lubrication lubricational lubricative lubricator lubricatory lubricious lubricity lubricous lubrifaction lubrification lubrify lubritorian lubritorium Luc Lucan Lucania lucanid Lucanidae Lucanus lucarne Lucayan lucban Lucchese luce lucence lucency lucent Lucentio lucently Luceres lucern lucernal Lucernaria lucernarian Lucernariidae lucerne lucet Luchuan Lucia Lucian Luciana lucible lucid lucida lucidity lucidly lucidness lucifee Lucifer luciferase Luciferian Luciferidae luciferin luciferoid luciferous luciferously luciferousness lucific luciform lucifugal lucifugous lucigen Lucile Lucilia lucimeter Lucina Lucinacea Lucinda Lucinidae lucinoid Lucite Lucius lucivee luck lucken luckful luckie luckily luckiness luckless lucklessly lucklessness Lucknow lucky lucration lucrative lucratively lucrativeness lucre Lucrece Lucretia Lucretian Lucretius lucriferous lucriferousness lucrific lucrify Lucrine luctation luctiferous luctiferousness lucubrate lucubration lucubrator lucubratory lucule luculent luculently Lucullan lucullite Lucuma lucumia Lucumo lucumony Lucy lucy ludden Luddism Luddite Ludditism ludefisk Ludgate Ludgathian Ludgatian Ludian ludibrious ludibry ludicropathetic ludicroserious ludicrosity ludicrosplenetic ludicrous ludicrously ludicrousness ludification ludlamite Ludlovian Ludlow ludo Ludolphian Ludwig ludwigite lue Luella lues luetic luetically lufberry lufbery luff Luffa Lug lug Luganda luge luger luggage luggageless luggar lugged lugger luggie Luggnagg lugmark Lugnas lugsail lugsome lugubriosity lugubrious lugubriously lugubriousness lugworm luhinga Lui Luian Luigi luigino Luis Luiseno Luite lujaurite Lukas Luke luke lukely lukeness lukewarm lukewarmish lukewarmly lukewarmness lukewarmth Lula lulab lull lullaby luller Lullian lulliloo lullingly Lulu lulu Lum lum lumachel lumbaginous lumbago lumbang lumbar lumbarization lumbayao lumber lumberdar lumberdom lumberer lumbering lumberingly lumberingness lumberjack lumberless lumberly lumberman lumbersome lumberyard lumbocolostomy lumbocolotomy lumbocostal lumbodorsal lumbodynia lumbosacral lumbovertebral lumbrical lumbricalis Lumbricidae lumbriciform lumbricine lumbricoid lumbricosis Lumbricus lumbrous lumen luminaire Luminal luminal luminance luminant luminarious luminarism luminarist luminary luminate lumination luminative luminator lumine luminesce luminescence luminescent luminiferous luminificent luminism luminist luminologist luminometer luminosity luminous luminously luminousness lummox lummy lump lumper lumpet lumpfish lumpily lumpiness lumping lumpingly lumpish lumpishly lumpishness lumpkin lumpman lumpsucker lumpy luna lunacy lunambulism lunar lunare Lunaria lunarian lunarist lunarium lunary lunate lunatellus lunately lunatic lunatically lunation lunatize lunatum lunch luncheon luncheoner luncheonette luncheonless luncher lunchroom Lunda Lundinarium lundress lundyfoot lune Lunel lunes lunette lung lunge lunged lungeous lunger lungfish lungflower lungful lungi lungie lungis lungless lungmotor lungsick lungworm lungwort lungy lunicurrent luniform lunisolar lunistice lunistitial lunitidal Lunka lunkhead lunn lunoid lunt lunula lunular Lunularia lunulate lunulated lunule lunulet lunulite Lunulites Luo lupanarian lupanine lupe lupeol lupeose Lupercal Lupercalia Lupercalian Luperci lupetidine lupicide Lupid lupiform lupinaster lupine lupinin lupinine lupinosis lupinous Lupinus lupis lupoid lupous lupulic lupulin lupuline lupulinic lupulinous lupulinum lupulus lupus lupuserythematosus Lur lura lural lurch lurcher lurchingfully lurchingly lurchline lurdan lurdanism lure lureful lurement lurer luresome lurg lurgworm Luri lurid luridity luridly luridness luringly lurk lurker lurkingly lurkingness lurky lurrier lurry Lusatian Luscinia luscious lusciously lusciousness lush Lushai lushburg Lushei lusher lushly lushness lushy Lusiad Lusian Lusitania Lusitanian lusk lusky lusory lust luster lusterer lusterless lusterware lustful lustfully lustfulness lustihead lustily lustiness lustless lustra lustral lustrant lustrate lustration lustrative lustratory lustreless lustrical lustrification lustrify lustrine lustring lustrous lustrously lustrousness lustrum lusty lut lutaceous lutanist lutany Lutao lutation Lutayo lute luteal lutecia lutecium lutein luteinization luteinize lutelet lutemaker lutemaking luteo luteocobaltic luteofulvous luteofuscescent luteofuscous luteolin luteolous luteoma luteorufescent luteous luteovirescent luter lutescent lutestring Lutetia Lutetian lutetium luteway lutfisk Luther Lutheran Lutheranic Lutheranism Lutheranize Lutheranizer Lutherism Lutherist luthern luthier lutianid Lutianidae lutianoid Lutianus lutidine lutidinic luting lutist Lutjanidae Lutjanus lutose Lutra Lutraria Lutreola lutrin Lutrinae lutrine lutulence lutulent Luvaridae Luvian Luvish Luwian lux luxate luxation luxe Luxemburger Luxemburgian luxulianite luxuriance luxuriancy luxuriant luxuriantly luxuriantness luxuriate luxuriation luxurious luxuriously luxuriousness luxurist luxury luxus Luzula Lwo ly lyam lyard Lyas Lycaena lycaenid Lycaenidae lycanthrope lycanthropia lycanthropic lycanthropist lycanthropize lycanthropous lycanthropy lyceal lyceum Lychnic Lychnis lychnomancy lychnoscope lychnoscopic Lycian lycid Lycidae Lycium Lycodes Lycodidae lycodoid lycopene Lycoperdaceae lycoperdaceous Lycoperdales lycoperdoid Lycoperdon lycoperdon Lycopersicon lycopin lycopod lycopode Lycopodiaceae lycopodiaceous Lycopodiales Lycopodium Lycopsida Lycopsis Lycopus lycorine Lycosa lycosid Lycosidae lyctid Lyctidae Lyctus Lycus lyddite Lydia Lydian lydite lye Lyencephala lyencephalous lyery lygaeid Lygaeidae Lygeum Lygodium Lygosoma lying lyingly Lymantria lymantriid Lymantriidae lymhpangiophlebitis Lymnaea lymnaean lymnaeid Lymnaeidae lymph lymphad lymphadenectasia lymphadenectasis lymphadenia lymphadenitis lymphadenoid lymphadenoma lymphadenopathy lymphadenosis lymphaemia lymphagogue lymphangeitis lymphangial lymphangiectasis lymphangiectatic lymphangiectodes lymphangiitis lymphangioendothelioma lymphangiofibroma lymphangiology lymphangioma lymphangiomatous lymphangioplasty lymphangiosarcoma lymphangiotomy lymphangitic lymphangitis lymphatic lymphatical lymphation lymphatism lymphatitis lymphatolysin lymphatolysis lymphatolytic lymphectasia lymphedema lymphemia lymphenteritis lymphoblast lymphoblastic lymphoblastoma lymphoblastosis lymphocele lymphocyst lymphocystosis lymphocyte lymphocythemia lymphocytic lymphocytoma lymphocytomatosis lymphocytosis lymphocytotic lymphocytotoxin lymphodermia lymphoduct lymphogenic lymphogenous lymphoglandula lymphogranuloma lymphoid lymphoidectomy lymphology lymphoma lymphomatosis lymphomatous lymphomonocyte lymphomyxoma lymphopathy lymphopenia lymphopenial lymphopoiesis lymphopoietic lymphoprotease lymphorrhage lymphorrhagia lymphorrhagic lymphorrhea lymphosarcoma lymphosarcomatosis lymphosarcomatous lymphosporidiosis lymphostasis lymphotaxis lymphotome lymphotomy lymphotoxemia lymphotoxin lymphotrophic lymphotrophy lymphous lymphuria lymphy lyncean Lynceus lynch lynchable lyncher Lyncid lyncine Lyndon Lynette Lyngbyaceae Lyngbyeae Lynn Lynne Lynnette lynnhaven lynx Lyomeri lyomerous Lyon Lyonese Lyonetia lyonetiid Lyonetiidae Lyonnais lyonnaise Lyonnesse lyophile lyophilization lyophilize lyophobe Lyopoma Lyopomata lyopomatous lyotrope lypemania Lyperosia lypothymia lyra Lyraid lyrate lyrated lyrately lyraway lyre lyrebird lyreflower lyreman lyretail lyric lyrical lyrically lyricalness lyrichord lyricism lyricist lyricize Lyrid lyriform lyrism lyrist Lyrurus lys Lysander lysate lyse Lysenkoism lysidine lysigenic lysigenous lysigenously Lysiloma Lysimachia Lysimachus lysimeter lysin lysine lysis Lysistrata lysogen lysogenesis lysogenetic lysogenic lysozyme lyssa lyssic lyssophobia lyterian Lythraceae lythraceous Lythrum lytic lytta lyxose M m Ma ma maam maamselle Maarten Mab Maba Mabel Mabellona mabi Mabinogion mabolo Mac mac macaasim macabre macabresque Macaca macaco Macacus macadam Macadamia macadamite macadamization macadamize macadamizer Macaglia macan macana Macanese macao macaque Macaranga Macarani Macareus macarism macarize macaroni macaronic macaronical macaronically macaronicism macaronism macaroon Macartney Macassar Macassarese macaw Macbeth Maccabaeus Maccabean Maccabees maccaboy macco maccoboy Macduff mace macedoine Macedon Macedonian Macedonic macehead maceman macer macerate macerater maceration Macflecknoe machairodont Machairodontidae Machairodontinae Machairodus machan machar machete Machetes machi Machiavel Machiavellian Machiavellianism Machiavellianly Machiavellic Machiavellism machiavellist Machiavellistic machicolate machicolation machicoulis Machicui machila Machilidae Machilis machin machinability machinable machinal machinate machination machinator machine machineful machineless machinelike machinely machineman machinemonger machiner machinery machinification machinify machinism machinist machinization machinize machinoclast machinofacture machinotechnique machinule Machogo machopolyp machree macies Macigno macilence macilency macilent mack mackenboy mackerel mackereler mackereling Mackinaw mackins mackintosh mackintoshite mackle macklike macle Macleaya macled Maclura Maclurea maclurin Macmillanite maco Macon maconite Macracanthorhynchus macracanthrorhynchiasis macradenous macrame macrander macrandrous macrauchene Macrauchenia macraucheniid Macraucheniidae macraucheniiform macrauchenioid macrencephalic macrencephalous macro macroanalysis macroanalyst macroanalytical macrobacterium macrobian macrobiosis macrobiote macrobiotic macrobiotics Macrobiotus macroblast macrobrachia macrocarpous Macrocentrinae Macrocentrus macrocephalia macrocephalic macrocephalism macrocephalous macrocephalus macrocephaly macrochaeta macrocheilia Macrochelys macrochemical macrochemically macrochemistry Macrochira macrochiran Macrochires macrochiria Macrochiroptera macrochiropteran macrocladous macroclimate macroclimatic macrococcus macrocoly macroconidial macroconidium macroconjugant macrocornea macrocosm macrocosmic macrocosmical macrocosmology macrocosmos macrocrystalline macrocyst Macrocystis macrocyte macrocythemia macrocytic macrocytosis macrodactyl macrodactylia macrodactylic macrodactylism macrodactylous macrodactyly macrodiagonal macrodomatic macrodome macrodont macrodontia macrodontism macroelement macroergate macroevolution macrofarad macrogamete macrogametocyte macrogamy macrogastria macroglossate macroglossia macrognathic macrognathism macrognathous macrogonidium macrograph macrographic macrography macrolepidoptera macrolepidopterous macrology macromandibular macromania macromastia macromazia macromelia macromeral macromere macromeric macromerite macromeritic macromesentery macrometer macromethod macromolecule macromyelon macromyelonal macron macronuclear macronucleus macronutrient macropetalous macrophage macrophagocyte macrophagus Macrophoma macrophotograph macrophotography macrophyllous macrophysics macropia macropinacoid macropinacoidal macroplankton macroplasia macroplastia macropleural macropodia Macropodidae Macropodinae macropodine macropodous macroprism macroprosopia macropsia macropteran macropterous Macropus Macropygia macropyramid macroreaction Macrorhamphosidae Macrorhamphosus macrorhinia Macrorhinus macroscelia Macroscelides macroscian macroscopic macroscopical macroscopically macroseism macroseismic macroseismograph macrosepalous macroseptum macrosmatic macrosomatia macrosomatous macrosomia macrosplanchnic macrosporange macrosporangium macrospore macrosporic Macrosporium macrosporophore macrosporophyl macrosporophyll Macrostachya macrostomatous macrostomia macrostructural macrostructure macrostylospore macrostylous macrosymbiont macrothere Macrotheriidae macrotherioid Macrotherium macrotherm macrotia macrotin Macrotolagus macrotome macrotone macrotous macrourid Macrouridae Macrourus Macrozamia macrozoogonidium macrozoospore Macrura macrural macruran macruroid macrurous mactation Mactra Mactridae mactroid macuca macula macular maculate maculated maculation macule maculicole maculicolous maculiferous maculocerebral maculopapular maculose Macusi macuta mad Madagascan Madagascar Madagascarian Madagass madam madame madapollam madarosis madarotic madbrain madbrained madcap madden maddening maddeningly maddeningness madder madderish madderwort madding maddingly maddish maddle made Madecase madefaction madefy Madegassy Madeira Madeiran Madeline madeline Madelon madescent Madge madhouse madhuca Madhva Madi Madia madid madidans Madiga madisterium madling madly madman madnep madness mado Madoc Madonna Madonnahood Madonnaish Madonnalike madoqua Madotheca madrague Madras madrasah Madrasi madreperl Madrepora Madreporacea madreporacean Madreporaria madreporarian madrepore madreporian madreporic madreporiform madreporite madreporitic Madrid madrier madrigal madrigaler madrigaletto madrigalian madrigalist Madrilene Madrilenian madrona madship madstone Madurese maduro madweed madwoman madwort mae Maeandra Maeandrina maeandrine maeandriniform maeandrinoid maeandroid Maecenas Maecenasship maegbote Maelstrom Maemacterion maenad maenadic maenadism maenaite Maenalus Maenidae Maeonian Maeonides maestri maestro maffia maffick mafficker maffle mafflin mafic mafoo mafura mag Maga Magadhi magadis magadize Magahi Magalensia magani magas magazinable magazinage magazine magazinelet magaziner magazinette magazinish magazinism magazinist magaziny Magdalen Magdalene Magdalenian mage Magellan Magellanian Magellanic magenta magged Maggie maggle maggot maggotiness maggotpie maggoty Maggy Magh Maghi Maghrib Maghribi Magi magi Magian Magianism magic magical magicalize magically magicdom magician magicianship magicked magicking Magindanao magiric magirics magirist magiristic magirological magirologist magirology Magism magister magisterial magisteriality magisterially magisterialness magistery magistracy magistral magistrality magistrally magistrand magistrant magistrate magistrateship magistratic magistratical magistratically magistrative magistrature Maglemose Maglemosean Maglemosian magma magmatic magnanimity magnanimous magnanimously magnanimousness magnascope magnascopic magnate magnecrystallic magnelectric magneoptic magnes magnesia magnesial magnesian magnesic magnesioferrite magnesite magnesium magnet magneta magnetic magnetical magnetically magneticalness magnetician magnetics magnetiferous magnetification magnetify magnetimeter magnetism magnetist magnetite magnetitic magnetizability magnetizable magnetization magnetize magnetizer magneto magnetobell magnetochemical magnetochemistry magnetod magnetodynamo magnetoelectric magnetoelectrical magnetoelectricity magnetogenerator magnetogram magnetograph magnetographic magnetoid magnetomachine magnetometer magnetometric magnetometrical magnetometrically magnetometry magnetomotive magnetomotor magneton magnetooptic magnetooptical magnetooptics magnetophone magnetophonograph magnetoplumbite magnetoprinter magnetoscope magnetostriction magnetotelegraph magnetotelephone magnetotherapy magnetotransmitter magnetron magnicaudate magnicaudatous magnifiable magnific magnifical magnifically Magnificat magnification magnificative magnifice magnificence magnificent magnificently magnificentness magnifico magnifier magnify magniloquence magniloquent magniloquently magniloquy magnipotence magnipotent magnirostrate magnisonant magnitude magnitudinous magnochromite magnoferrite Magnolia magnolia Magnoliaceae magnoliaceous magnum Magnus Magog magot magpie magpied magpieish magsman maguari maguey Magyar Magyaran Magyarism Magyarization Magyarize Mah maha mahaleb mahalla mahant mahar maharaja maharajrana maharana maharanee maharani maharao Maharashtri maharawal maharawat mahatma mahatmaism Mahayana Mahayanism Mahayanist Mahayanistic Mahdi Mahdian Mahdiship Mahdism Mahdist Mahesh Mahi Mahican mahmal Mahmoud mahmudi mahoe mahoganize mahogany mahoitre maholi maholtine Mahomet Mahometry mahone Mahonia Mahori Mahound mahout Mahra Mahran Mahri mahseer mahua mahuang Maia Maiacca Maianthemum maid Maida maidan maiden maidenhair maidenhead maidenhood maidenish maidenism maidenlike maidenliness maidenly maidenship maidenweed maidhood Maidie maidish maidism maidkin maidlike maidling maidservant Maidu maidy maiefic maieutic maieutical maieutics maigre maiid Maiidae mail mailable mailbag mailbox mailclad mailed mailer mailguard mailie maillechort mailless mailman mailplane maim maimed maimedly maimedness maimer maimon Maimonidean Maimonist main Mainan Maine mainferre mainlander mainly mainmast mainmortable mainour mainpast mainpernable mainpernor mainpin mainport mainpost mainprise mains mainsail mainsheet mainspring mainstay Mainstreeter Mainstreetism maint maintain maintainable maintainableness maintainer maintainment maintainor maintenance Maintenon maintop maintopman maioid Maioidea maioidean Maioli Maiongkong Maipure mairatour maire maisonette Maithili maitlandite Maitreya Maius maize maizebird maizenic maizer Maja Majagga majagua Majesta majestic majestical majestically majesticalness majesticness majestious majesty majestyship Majlis majo majolica majolist majoon Major major majorate majoration Majorcan majorette Majorism Majorist Majoristic majority majorize majorship majuscular majuscule makable Makah Makaraka Makari Makassar make makebate makedom makefast maker makeress makership makeshift makeshiftiness makeshiftness makeshifty makeweight makhzan maki makimono making makluk mako Makonde makroskelic Maku Makua makuk mal mala malaanonang Malabar Malabarese malabathrum malacanthid Malacanthidae malacanthine Malacanthus Malacca Malaccan malaccident Malaceae malaceous malachite malacia Malaclemys Malaclypse Malacobdella Malacocotylea malacoderm Malacodermatidae malacodermatous Malacodermidae malacodermous malacoid malacolite malacological malacologist malacology malacon malacophilous malacophonous malacophyllous malacopod Malacopoda malacopodous malacopterygian Malacopterygii malacopterygious Malacoscolices Malacoscolicine Malacosoma Malacostraca malacostracan malacostracology malacostracous malactic maladaptation maladdress maladive maladjust maladjusted maladjustive maladjustment maladminister maladministration maladministrator maladroit maladroitly maladroitness maladventure malady Malaga Malagasy Malagigi malagma malaguena malahack malaise malakin malalignment malambo malandered malanders malandrous malanga malapaho malapert malapertly malapertness malapi malapplication malappointment malappropriate malappropriation malaprop malapropian malapropish malapropism malapropoism malapropos Malapterurus malar malaria malarial malariaproof malarin malarioid malariologist malariology malarious malarkey malaroma malarrangement malasapsap malassimilation malassociation malate malati malattress malax malaxable malaxage malaxate malaxation malaxator malaxerman Malaxis Malay Malayalam Malayalim Malayan Malayic Malayize Malayoid Malaysian malbehavior malbrouck malchite Malchus Malcolm malconceived malconduct malconformation malconstruction malcontent malcontented malcontentedly malcontentedness malcontentism malcontently malcontentment malconvenance malcreated malcultivation maldeveloped maldevelopment maldigestion maldirection maldistribution Maldivian maldonite malduck Male male malease maleate Malebolge Malebolgian Malebolgic Malebranchism Malecite maledicent maledict malediction maledictive maledictory maleducation malefaction malefactor malefactory malefactress malefical malefically maleficence maleficent maleficial maleficiate maleficiation maleic maleinoid malella Malemute maleness malengine maleo maleruption Malesherbia Malesherbiaceae malesherbiaceous malevolence malevolency malevolent malevolently malexecution malfeasance malfeasant malfed malformation malformed malfortune malfunction malgovernment malgrace malguzar malguzari malhonest malhygiene mali malic malice maliceful maliceproof malicho malicious maliciously maliciousness malicorium malidentification maliferous maliform malign malignance malignancy malignant malignantly malignation maligner malignify malignity malignly malignment malik malikadna malikala malikana Maliki Malikite maline malines malinfluence malinger malingerer malingery Malinois malinowskite malinstitution malinstruction malintent malism malison malist malistic malkin Malkite mall malladrite mallangong mallard mallardite malleability malleabilization malleable malleableize malleableized malleableness malleablize malleal mallear malleate malleation mallee Malleifera malleiferous malleiform mallein malleinization malleinize mallemaroking mallemuck malleoincudal malleolable malleolar malleolus mallet malleus Malling Mallophaga mallophagan mallophagous malloseismic Mallotus mallow mallowwort Malloy mallum mallus malm Malmaison malmignatte malmsey malmstone malmy malnourished malnourishment malnutrite malnutrition malo malobservance malobservation maloccluded malocclusion malodor malodorant malodorous malodorously malodorousness malojilla malonate malonic malonyl malonylurea Malope maloperation malorganization malorganized malouah malpais Malpighia Malpighiaceae malpighiaceous Malpighian malplaced malpoise malposed malposition malpractice malpractioner malpraxis malpresentation malproportion malproportioned malpropriety malpublication malreasoning malrotation malshapen malt maltable maltase malter Maltese maltha Malthe malthouse Malthusian Malthusianism Malthusiast maltiness malting maltman Malto maltobiose maltodextrin maltodextrine maltolte maltose maltreat maltreatment maltreator maltster malturned maltworm malty malunion Malurinae malurine Malurus Malus Malva Malvaceae malvaceous Malvales malvasia malvasian Malvastrum malversation malverse malvoisie malvolition Mam mamba mambo mameliere mamelonation mameluco Mameluke Mamercus Mamers Mamertine Mamie Mamilius mamlatdar mamma mammal mammalgia Mammalia mammalian mammaliferous mammality mammalogical mammalogist mammalogy mammary mammate Mammea mammectomy mammee mammer Mammifera mammiferous mammiform mammilla mammillaplasty mammillar Mammillaria mammillary mammillate mammillated mammillation mammilliform mammilloid mammitis mammock mammogen mammogenic mammogenically mammon mammondom mammoniacal mammonish mammonism mammonist mammonistic mammonite mammonitish mammonization mammonize mammonolatry Mammonteus mammoth mammothrept mammula mammular Mammut Mammutidae mammy mamo man mana Manabozho manacle Manacus manage manageability manageable manageableness manageably managee manageless management managemental manager managerdom manageress managerial managerially managership managery manaism manakin manal manas Manasquan manatee Manatidae manatine manatoid Manatus manavel manavelins Manavendra manbird manbot manche Manchester Manchesterdom Manchesterism Manchesterist Manchestrian manchet manchineel Manchu Manchurian mancinism mancipable mancipant mancipate mancipation mancipative mancipatory mancipee mancipium manciple mancipleship mancipular mancono Mancunian mancus mand Mandaean Mandaeism Mandaic Mandaite mandala Mandalay mandament mandamus Mandan mandant mandarah mandarin mandarinate mandarindom mandariness mandarinic mandarinism mandarinize mandarinship mandatary mandate mandatee mandation mandative mandator mandatorily mandatory mandatum Mande mandelate mandelic mandible mandibula mandibular mandibulary Mandibulata mandibulate mandibulated mandibuliform mandibulohyoid mandibulomaxillary mandibulopharyngeal mandibulosuspensorial mandil mandilion Mandingan Mandingo mandola mandolin mandolinist mandolute mandom mandora mandore mandra mandragora mandrake mandrel mandriarch mandrill mandrin mandruka mandua manducable manducate manducation manducatory mandyas mane maned manege manei maneless manent manerial manes manesheet maness Manetti Manettia maneuver maneuverability maneuverable maneuverer maneuvrability maneuvrable maney Manfred Manfreda manful manfully manfulness mang manga mangabeira mangabey mangal manganapatite manganate manganblende manganbrucite manganeisen manganese manganesian manganetic manganhedenbergite manganic manganiferous manganite manganium manganize Manganja manganocalcite manganocolumbite manganophyllite manganosiderite manganosite manganostibiite manganotantalite manganous manganpectolite Mangar Mangbattu mange mangeao mangel mangelin manger mangerite mangi Mangifera mangily manginess mangle mangleman mangler mangling manglingly mango mangona mangonel mangonism mangonization mangonize mangosteen mangrass mangrate mangrove Mangue mangue mangy Mangyan manhandle Manhattan Manhattanite Manhattanize manhead manhole manhood mani mania maniable maniac maniacal maniacally manic Manicaria manicate Manichaean Manichaeanism Manichaeanize Manichaeism Manichaeist Manichee manichord manicole manicure manicurist manid Manidae manienie manifest manifestable manifestant manifestation manifestational manifestationist manifestative manifestatively manifested manifestedness manifester manifestive manifestly manifestness manifesto manifold manifolder manifoldly manifoldness manifoldwise maniform manify Manihot manikin manikinism Manila manila manilla manille manioc maniple manipulable manipular manipulatable manipulate manipulation manipulative manipulatively manipulator manipulatory Manipuri Manis manism manist manistic manito Manitoban manitrunk maniu Manius Maniva manjak Manjeri mank mankeeper mankin mankind manless manlessly manlessness manlet manlihood manlike manlikely manlikeness manlily manliness manling manly Mann manna mannan mannequin manner mannerable mannered mannerhood mannering mannerism mannerist manneristic manneristical manneristically mannerize mannerless mannerlessness mannerliness mannerly manners mannersome manness Mannheimar mannide mannie manniferous mannify mannikinism manning mannish mannishly mannishness mannite mannitic mannitol mannitose mannoheptite mannoheptitol mannoheptose mannoketoheptose mannonic mannosan mannose Manny manny mano Manobo manoc manograph Manolis manometer manometric manometrical manometry manomin manor manorial manorialism manorialize manorship manoscope manostat manostatic manque manred manrent manroot manrope Mans mansard mansarded manscape manse manservant manship mansion mansional mansionary mansioned mansioneer mansionry manslaughter manslaughterer manslaughtering manslaughterous manslayer manslaying manso mansonry manstealer manstealing manstopper manstopping mansuete mansuetely mansuetude mant manta mantal manteau mantel mantelet manteline mantelletta mantellone mantelpiece mantelshelf manteltree manter mantes mantevil mantic manticism manticore mantid Mantidae mantilla Mantinean mantis Mantisia Mantispa mantispid Mantispidae mantissa mantistic mantle mantled mantlet mantling Manto manto Mantodea mantoid Mantoidea mantologist mantology mantra mantrap mantua mantuamaker mantuamaking Mantuan Mantzu manual manualii manualism manualist manualiter manually manuao manubrial manubriated manubrium manucaption manucaptor manucapture manucode Manucodia manucodiata manuduce manuduction manuductor manuductory Manuel manufactory manufacturable manufactural manufacture manufacturer manufacturess manuka manul manuma manumea manumisable manumission manumissive manumit manumitter manumotive manurable manurage manurance manure manureless manurer manurial manurially manus manuscript manuscriptal manuscription manuscriptural manusina manustupration manutagi Manvantara manward manwards manway manweed manwise Manx Manxman Manxwoman many manyberry Manyema manyfold manyness manyplies manyroot manyways manywhere manywise manzana manzanilla manzanillo manzanita Manzas manzil mao maomao Maori Maoridom Maoriland Maorilander map mapach mapau maphrian mapland maple maplebush mapo mappable mapper Mappila mappist mappy Mapuche mapwise maquahuitl maquette maqui Maquiritare maquis Mar mar Mara marabotin marabou Marabout marabuto maraca Maracaibo maracan maracock marae Maragato marajuana marakapas maral maranatha marang Maranha Maranham Maranhao Maranta Marantaceae marantaceous marantic marara mararie marasca maraschino marasmic Marasmius marasmoid marasmous marasmus Maratha Marathi marathon marathoner Marathonian Maratism Maratist Marattia Marattiaceae marattiaceous Marattiales maraud marauder maravedi Maravi marbelize marble marbled marblehead marbleheader marblehearted marbleization marbleize marbleizer marblelike marbleness marbler marbles marblewood marbling marblish marbly marbrinus Marc marc Marcan marcantant marcasite marcasitic marcasitical Marcel marcel marceline Marcella marcella marceller Marcellian Marcellianism marcello marcescence marcescent Marcgravia Marcgraviaceae marcgraviaceous March march Marchantia Marchantiaceae marchantiaceous Marchantiales marcher marchetto marchioness marchite marchland marchman Marchmont marchpane Marci Marcia marcid Marcionism Marcionist Marcionite Marcionitic Marcionitish Marcionitism Marcite Marco marco Marcobrunner Marcomanni Marconi marconi marconigram marconigraph marconigraphy marcor Marcos Marcosian marcottage mardy mare mareblob Mareca marechal Marehan Marek marekanite maremma maremmatic maremmese marengo marennin Mareotic Mareotid Marfik marfire margarate Margarelon Margaret margaric margarin margarine margarita margaritaceous margarite margaritiferous margaritomancy Margarodes margarodid Margarodinae margarodite Margaropus margarosanite margay marge margeline margent Margery Margie margin marginal marginalia marginality marginalize marginally marginate marginated margination margined Marginella Marginellidae marginelliform marginiform margining marginirostral marginoplasty margosa Margot margravate margrave margravely margravial margraviate margravine Marguerite marguerite marhala Marheshvan Mari Maria maria marialite Mariamman Marian Mariana Marianic Marianne Marianolatrist Marianolatry maricolous marid Marie mariengroschen marigenous marigold marigram marigraph marigraphic marijuana marikina Marilla Marilyn marimba marimonda marina marinade marinate marinated marine mariner marinheiro marinist marinorama Mario mariola Mariolater Mariolatrous Mariolatry Mariology Marion marionette Mariou Mariposan mariposite maris marish marishness Marist maritage marital maritality maritally mariticidal mariticide Maritime maritime maritorious mariupolite marjoram Marjorie Mark mark marka Markab markdown Markeb marked markedly markedness marker market marketability marketable marketableness marketably marketeer marketer marketing marketman marketstead marketwise markfieldite Markgenossenschaft markhor marking markka markless markman markmoot Marko markshot marksman marksmanly marksmanship markswoman markup Markus markweed markworthy marl Marla marlaceous marlberry marled Marlena marler marli marlin marline marlinespike marlite marlitic marllike marlock Marlovian Marlowesque Marlowish Marlowism marlpit marly marm marmalade marmalady Marmar marmarization marmarize marmarosis marmatite marmelos marmennill marmit marmite marmolite marmoraceous marmorate marmorated marmoration marmoreal marmoreally marmorean marmoric Marmosa marmose marmoset marmot Marmota Marnix maro marocain marok Maronian Maronist Maronite maroon marooner maroquin Marpessa marplot marplotry marque marquee Marquesan marquess marquetry marquis marquisal marquisate marquisdom marquise marquisette marquisina marquisotte marquisship marquito marranism marranize marrano marree Marrella marrer marriable marriage marriageability marriageable marriageableness marriageproof married marrier marron marrot marrow marrowbone marrowed marrowfat marrowish marrowless marrowlike marrowsky marrowskyer marrowy Marrubium Marrucinian marry marryer marrying marrymuffe Mars Marsala Marsdenia marseilles Marsh marsh Marsha marshal marshalate marshalcy marshaler marshaless Marshall marshalman marshalment Marshalsea marshalship marshberry marshbuck marshfire marshflower marshiness marshite marshland marshlander marshlike marshlocks marshman marshwort marshy Marsi Marsian Marsilea Marsileaceae marsileaceous Marsilia Marsiliaceae marsipobranch Marsipobranchia Marsipobranchiata marsipobranchiate Marsipobranchii marsoon Marspiter Marssonia Marssonina marsupial Marsupialia marsupialian marsupialization marsupialize marsupian Marsupiata marsupiate marsupium Mart mart martagon martel marteline martellate martellato marten martensite martensitic Martes martext Martha martial martialism Martialist martiality martialization martialize martially martialness Martian Martin martin martinet martineta martinetish martinetishness martinetism martinetship Martinez martingale martinico Martinism Martinist Martinmas martinoe martite Martius martlet Martu Marty Martyn Martynia Martyniaceae martyniaceous martyr martyrdom martyress martyrium martyrization martyrize martyrizer martyrlike martyrly martyrolatry martyrologic martyrological martyrologist martyrologistic martyrologium martyrology martyrship martyry maru marvel marvelment marvelous marvelously marvelousness marvelry marver Marvin Marwari Marxian Marxianism Marxism Marxist Mary mary marybud Maryland Marylander Marylandian Marymass marysole marzipan mas masa Masai Masanao Masanobu masaridid Masarididae Masaridinae Masaris mascagnine mascagnite mascally mascara mascaron mascled mascleless mascot mascotism mascotry Mascouten mascularity masculate masculation masculine masculinely masculineness masculinism masculinist masculinity masculinization masculinize masculist masculofeminine masculonucleus masculy masdeu Masdevallia mash masha mashal mashallah mashelton masher mashie mashing mashman Mashona Mashpee mashru mashy masjid mask masked Maskegon maskelynite masker maskette maskflower Maskins masklike Maskoi maskoid maslin masochism masochist masochistic Mason mason masoned masoner masonic Masonite masonite masonry masonwork masooka masoola Masora Masorete Masoreth Masoretic Maspiter masque masquer masquerade masquerader Mass mass massa massacre massacrer massage massager massageuse massagist Massalia Massalian massaranduba massasauga masse massebah massecuite massedly massedness Massekhoth massel masser masseter masseteric masseur masseuse massicot massier massiest massif Massilia Massilian massily massiness massive massively massiveness massivity masskanne massless masslike Massmonger massotherapy massoy massula massy mast mastaba mastadenitis mastadenoma mastage mastalgia mastatrophia mastatrophy mastauxe mastax mastectomy masted master masterable masterate masterdom masterer masterful masterfully masterfulness masterhood masterless masterlessness masterlike masterlily masterliness masterling masterly masterman mastermind masterous masterpiece masterproof mastership masterwork masterwort mastery mastful masthead masthelcosis mastic masticability masticable masticate mastication masticator masticatory mastiche masticic Masticura masticurous mastiff Mastigamoeba mastigate mastigium mastigobranchia mastigobranchial Mastigophora mastigophoran mastigophoric mastigophorous mastigopod Mastigopoda mastigopodous mastigote mastigure masting mastitis mastless mastlike mastman mastocarcinoma mastoccipital mastochondroma mastochondrosis mastodon mastodonsaurian Mastodonsaurus mastodont mastodontic Mastodontidae mastodontine mastodontoid mastodynia mastoid mastoidal mastoidale mastoideal mastoidean mastoidectomy mastoideocentesis mastoideosquamous mastoiditis mastoidohumeral mastoidohumeralis mastoidotomy mastological mastologist mastology mastomenia mastoncus mastooccipital mastoparietal mastopathy mastopexy mastoplastia mastorrhagia mastoscirrhus mastosquamose mastotomy mastotympanic masturbate masturbation masturbational masturbator masturbatory mastwood masty masu Masulipatam masurium Mat mat Matabele Matacan matachin matachina mataco matadero matador mataeological mataeologue mataeology Matagalpa Matagalpan matagory matagouri matai matajuelo matalan matamata matamoro matanza matapan matapi Matar matara Matatua Matawan matax matboard match matchable matchableness matchably matchboard matchboarding matchbook matchbox matchcloth matchcoat matcher matching matchless matchlessly matchlessness matchlock matchmaker matchmaking matchmark Matchotic matchsafe matchstick matchwood matchy mate mategriffon matehood mateless matelessness matelote mately mater materfamilias material materialism materialist materialistic materialistical materialistically materiality materialization materialize materializee materializer materially materialman materialness materiate materiation materiel maternal maternality maternalize maternally maternalness maternity maternology mateship matey matezite matfelon matgrass math mathematic mathematical mathematically mathematicals mathematician mathematicize mathematics mathematize mathemeg mathes mathesis mathetic Mathurin matico matildite matin matinal matinee mating matins matipo matka matless matlockite matlow matmaker matmaking matra matral Matralia matranee matrass matreed matriarch matriarchal matriarchalism matriarchate matriarchic matriarchist matriarchy matric matrical Matricaria matrices matricidal matricide matricula matriculable matriculant matricular matriculate matriculation matriculator matriculatory Matrigan matriheritage matriherital matrilineal matrilineally matrilinear matrilinearism matriliny matrilocal matrimonial matrimonially matrimonious matrimoniously matrimony matriotism matripotestal matris matrix matroclinic matroclinous matrocliny matron matronage matronal Matronalia matronhood matronism matronize matronlike matronliness matronly matronship matronymic matross Mats matsu matsuri Matt matta mattamore Mattapony mattaro mattboard matte matted mattedly mattedness matter matterate matterative matterful matterfulness matterless mattery Matteuccia Matthaean Matthew Matthias Matthieu Matthiola Matti matti matting mattock mattoid mattoir mattress mattulla Matty maturable maturate maturation maturative mature maturely maturement matureness maturer maturescence maturescent maturing maturish maturity matutinal matutinally matutinary matutine matutinely matweed maty matzo matzoon matzos matzoth mau maucherite Maud maud maudle maudlin maudlinism maudlinize maudlinly maudlinwort mauger maugh Maugis maul Maulawiyah mauler mauley mauling maulstick Maumee maumet maumetry Maun maun maund maunder maunderer maundful maundy maunge Maurandia Maureen Mauretanian Mauri Maurice Maurist Mauritia Mauritian Mauser mausolea mausoleal mausolean mausoleum mauther mauve mauveine mauvette mauvine maux maverick mavis Mavortian mavournin mavrodaphne maw mawbound mawk mawkish mawkishly mawkishness mawky mawp Max maxilla maxillar maxillary maxilliferous maxilliform maxilliped maxillipedary maxillodental maxillofacial maxillojugal maxillolabial maxillomandibular maxillopalatal maxillopalatine maxillopharyngeal maxillopremaxillary maxilloturbinal maxillozygomatic maxim maxima maximal Maximalism Maximalist maximally maximate maximation maximed maximist maximistic maximite maximization maximize maximizer Maximon maximum maximus maxixe maxwell May may Maya maya Mayaca Mayacaceae mayacaceous Mayan Mayance Mayathan maybe Maybird Maybloom maybush Maycock maycock Mayda mayday Mayer Mayey Mayeye Mayfair mayfish Mayflower Mayfowl mayhap mayhappen mayhem Maying Maylike maynt Mayo Mayologist mayonnaise mayor mayoral mayoralty mayoress mayorship Mayoruna Maypole Maypoling maypop maysin mayten Maytenus Maythorn Maytide Maytime mayweed Maywings Maywort maza mazalgia Mazama mazame Mazanderani mazapilite mazard mazarine Mazatec Mazateco Mazda Mazdaism Mazdaist Mazdakean Mazdakite Mazdean maze mazed mazedly mazedness mazeful mazement mazer Mazhabi mazic mazily maziness mazocacothesis mazodynia mazolysis mazolytic mazopathia mazopathic mazopexy Mazovian mazuca mazuma Mazur Mazurian mazurka mazut mazy mazzard Mazzinian Mazzinianism Mazzinist mbalolo Mbaya mbori Mbuba Mbunda Mcintosh Mckay Mdewakanton me meable meaching mead meader meadow meadowbur meadowed meadower meadowing meadowink meadowland meadowless meadowsweet meadowwort meadowy meadsman meager meagerly meagerness meagre meak meal mealable mealberry mealer mealies mealily mealiness mealless mealman mealmonger mealmouth mealmouthed mealproof mealtime mealy mealymouth mealymouthed mealymouthedly mealymouthedness mealywing mean meander meanderingly meandrine meandriniform meandrite meandrous meaned meaner meaning meaningful meaningfully meaningless meaninglessly meaninglessness meaningly meaningness meanish meanly meanness meant Meantes meantone meanwhile mease measle measled measledness measles measlesproof measly measondue measurability measurable measurableness measurably measuration measure measured measuredly measuredness measureless measurelessly measurelessness measurely measurement measurer measuring meat meatal meatbird meatcutter meated meathook meatily meatiness meatless meatman meatometer meatorrhaphy meatoscope meatoscopy meatotome meatotomy meatus meatworks meaty Mebsuta Mecaptera mecate Mecca Meccan Meccano Meccawee Mechael mechanal mechanality mechanalize mechanic mechanical mechanicalism mechanicalist mechanicality mechanicalization mechanicalize mechanically mechanicalness mechanician mechanicochemical mechanicocorpuscular mechanicointellectual mechanicotherapy mechanics mechanism mechanist mechanistic mechanistically mechanization mechanize mechanizer mechanolater mechanology mechanomorphic mechanomorphism mechanotherapeutic mechanotherapeutics mechanotherapist mechanotherapy Mechir Mechitaristican Mechlin mechoacan meckelectomy Meckelian Mecklenburgian mecodont Mecodonta mecometer mecometry mecon meconic meconidium meconin meconioid meconium meconology meconophagism meconophagist Mecoptera mecopteran mecopteron mecopterous medal medaled medalet medalist medalize medallary medallic medallically medallion medallionist meddle meddlecome meddlement meddler meddlesome meddlesomely meddlesomeness meddling meddlingly Mede Medellin Medeola Media media mediacid mediacy mediad mediaevalize mediaevally medial medialization medialize medialkaline medially Median median medianic medianimic medianimity medianism medianity medianly mediant mediastinal mediastine mediastinitis mediastinotomy mediastinum mediate mediately mediateness mediating mediatingly mediation mediative mediatization mediatize mediator mediatorial mediatorialism mediatorially mediatorship mediatory mediatress mediatrice mediatrix Medic medic medicable Medicago medical medically medicament medicamental medicamentally medicamentary medicamentation medicamentous medicaster medicate medication medicative medicator medicatory Medicean Medici medicinable medicinableness medicinal medicinally medicinalness medicine medicinelike medicinemonger mediciner medico medicobotanical medicochirurgic medicochirurgical medicodental medicolegal medicolegally medicomania medicomechanic medicomechanical medicomoral medicophysical medicopsychological medicopsychology medicostatistic medicosurgical medicotopographic medicozoologic mediety Medieval medieval medievalism medievalist medievalistic medievalize medievally medifixed mediglacial medimn medimno medimnos medimnus Medina Medinilla medino medio medioanterior mediocarpal medioccipital mediocre mediocrist mediocrity mediocubital mediodepressed mediodigital mediodorsal mediodorsally mediofrontal mediolateral mediopalatal mediopalatine mediopassive mediopectoral medioperforate mediopontine medioposterior mediosilicic mediostapedial mediotarsal medioventral medisance medisect medisection Medish Medism meditant meditate meditating meditatingly meditation meditationist meditatist meditative meditatively meditativeness meditator mediterranean Mediterraneanism Mediterraneanization Mediterraneanize mediterraneous medithorax Meditrinalia meditullium medium mediumism mediumistic mediumization mediumize mediumship medius Medize Medizer medjidie medlar medley Medoc medregal medrick medrinaque medulla medullar medullary medullate medullated medullation medullispinal medullitis medullization medullose Medusa Medusaean medusal medusalike medusan medusiferous medusiform medusoid meebos meece meed meedless Meehan meek meeken meekhearted meekheartedness meekling meekly meekness Meekoceras Meeks meered meerkat meerschaum meese meet meetable meeten meeter meeterly meethelp meethelper meeting meetinger meetinghouse meetly meetness Meg megabar megacephalia megacephalic megacephaly megacerine Megaceros megacerotine Megachile megachilid Megachilidae Megachiroptera megachiropteran megachiropterous megacolon megacosm megacoulomb megacycle megadont Megadrili megadynamics megadyne Megaera megaerg megafarad megafog megagamete megagametophyte megajoule megakaryocyte Megalactractus Megaladapis Megalaema Megalaemidae Megalania megaleme Megalensian megalerg Megalesia Megalesian megalesthete megalethoscope Megalichthyidae Megalichthys megalith megalithic Megalobatrachus megaloblast megaloblastic megalocardia megalocarpous megalocephalia megalocephalic megalocephalous megalocephaly Megaloceros megalochirous megalocornea megalocyte megalocytosis megalodactylia megalodactylism megalodactylous Megalodon megalodont megalodontia Megalodontidae megaloenteron megalogastria megaloglossia megalograph megalography megalohepatia megalokaryocyte megalomania megalomaniac megalomaniacal megalomelia Megalonychidae Megalonyx megalopa megalopenis megalophonic megalophonous megalophthalmus megalopia megalopic Megalopidae Megalopinae megalopine megaloplastocyte megalopolis megalopolitan megalopolitanism megalopore megalops megalopsia Megaloptera Megalopyge Megalopygidae Megalornis Megalornithidae megalosaur megalosaurian Megalosauridae megalosauroid Megalosaurus megaloscope megaloscopy megalosphere megalospheric megalosplenia megalosyndactyly megaloureter Megaluridae Megamastictora megamastictoral megamere megameter megampere Meganeura Meganthropus meganucleus megaparsec megaphone megaphonic megaphotographic megaphotography megaphyllous Megaphyton megapod megapode Megapodidae Megapodiidae Megapodius megaprosopous Megaptera Megapterinae megapterine Megarensian Megarhinus Megarhyssa Megarian Megarianism Megaric megaron megasclere megascleric megasclerous megasclerum megascope megascopic megascopical megascopically megaseism megaseismic megaseme Megasoma megasporange megasporangium megaspore megasporic megasporophyll megasynthetic megathere megatherian Megatheriidae megatherine megatherioid Megatherium megatherm megathermic megatheroid megaton megatype megatypy megavolt megawatt megaweber megazooid megazoospore megerg Meggy megilp megmho megohm megohmit megohmmeter megophthalmus megotalc Megrel Megrez megrim megrimish mehalla mehari meharist Mehelya mehmandar Mehrdad mehtar mehtarship Meibomia Meibomian meile mein meinie meio meiobar meionite meiophylly meiosis meiotaxy meiotic Meissa Meistersinger meith Meithei meizoseismal meizoseismic mejorana Mekbuda Mekhitarist mekometer mel mela melaconite melada meladiorite melagabbro melagra melagranite Melaleuca melalgia melam melamed melamine melampodium Melampsora Melampsoraceae Melampus melampyritol Melampyrum melanagogal melanagogue melancholia melancholiac melancholic melancholically melancholily melancholiness melancholious melancholiously melancholiousness melancholish melancholist melancholize melancholomaniac melancholy melancholyish Melanchthonian Melanconiaceae melanconiaceous Melanconiales Melanconium melanemia melanemic Melanesian melange melanger melangeur Melania melanian melanic melaniferous Melaniidae melanilin melaniline melanin Melanippe Melanippus melanism melanistic melanite melanitic melanize melano melanoblast melanocarcinoma melanocerite Melanochroi Melanochroid melanochroite melanochroous melanocomous melanocrate melanocratic melanocyte Melanodendron melanoderma melanodermia melanodermic Melanogaster melanogen Melanoi melanoid melanoidin melanoma melanopathia melanopathy melanophore melanoplakia Melanoplus melanorrhagia melanorrhea Melanorrhoea melanosarcoma melanosarcomatosis melanoscope melanose melanosed melanosis melanosity melanospermous melanotekite melanotic melanotrichous melanous melanterite Melanthaceae melanthaceous Melanthium melanure melanuresis melanuria melanuric melaphyre Melas melasma melasmic melassigenic Melastoma Melastomaceae melastomaceous melastomad melatope melaxuma Melburnian Melcarth melch Melchite Melchora meld melder meldometer meldrop mele Meleager Meleagridae Meleagrina Meleagrinae meleagrine Meleagris melebiose melee melena melene melenic Meles Meletian Meletski melezitase melezitose Melia Meliaceae meliaceous Meliadus Melian Melianthaceae melianthaceous Melianthus meliatin melibiose melic Melica Melicent melicera meliceric meliceris melicerous Melicerta Melicertidae melichrous melicitose Melicocca melicraton melilite melilitite melilot Melilotus Melinae Melinda meline Melinis melinite Meliola meliorability meliorable meliorant meliorate meliorater melioration meliorative meliorator meliorism meliorist melioristic meliority meliphagan Meliphagidae meliphagidan meliphagous meliphanite Melipona Meliponinae meliponine melisma melismatic melismatics Melissa melissyl melissylic Melitaea melitemia melithemia melitis melitose melitriose melittologist melittology melituria melituric mell mellaginous mellate mellay melleous meller Mellifera melliferous mellificate mellification mellifluence mellifluent mellifluently mellifluous mellifluously mellifluousness mellimide mellisonant mellisugent mellit mellitate mellite mellitic Mellivora Mellivorinae mellivorous mellon mellonides mellophone mellow mellowly mellowness mellowy mellsman Melocactus melocoton melodeon melodia melodial melodially melodic melodica melodically melodicon melodics melodiograph melodion melodious melodiously melodiousness melodism melodist melodize melodizer melodram melodrama melodramatic melodramatical melodramatically melodramaticism melodramatics melodramatist melodramatize melodrame melody melodyless meloe melogram Melogrammataceae melograph melographic meloid Meloidae melologue Melolontha Melolonthidae melolonthidan Melolonthides Melolonthinae melolonthine melomane melomania melomaniac melomanic melon meloncus Melonechinus melongena melongrower melonist melonite Melonites melonlike melonmonger melonry melophone melophonic melophonist melopiano meloplast meloplastic meloplasty melopoeia melopoeic melos melosa Melospiza Melothria melotragedy melotragic melotrope melt meltability meltable meltage melted meltedness melteigite melter melters melting meltingly meltingness melton Meltonian Melungeon Melursus mem member membered memberless membership membracid Membracidae membracine membral membrally membrana membranaceous membranaceously membranate membrane membraned membraneless membranelike membranelle membraneous membraniferous membraniform membranin Membranipora Membraniporidae membranocalcareous membranocartilaginous membranocoriaceous membranocorneous membranogenic membranoid membranology membranonervous membranosis membranous membranously membranula membranule membretto memento meminna Memnon Memnonian Memnonium memo memoir memoirism memoirist memorabilia memorability memorable memorableness memorably memoranda memorandist memorandize memorandum memorative memoria memorial memorialist memorialization memorialize memorializer memorially memoried memorious memorist memorizable memorization memorize memorizer memory memoryless Memphian Memphite men menaccanite menaccanitic menace menaceable menaceful menacement menacer menacing menacingly menacme menadione menage menagerie menagerist menald Menangkabau menarche Menaspis mend mendable mendacious mendaciously mendaciousness mendacity Mendaite Mende mendee Mendelian Mendelianism Mendelianist Mendelism Mendelist Mendelize Mendelssohnian Mendelssohnic mendelyeevite mender Mendi mendicancy mendicant mendicate mendication mendicity mending mendipite mendole mendozite mends meneghinite menfolk Menfra meng Mengwe menhaden menhir menial menialism meniality menially Menic menilite meningeal meninges meningic meningina meningism meningitic meningitis meningocele meningocephalitis meningocerebritis meningococcal meningococcemia meningococcic meningococcus meningocortical meningoencephalitis meningoencephalocele meningomalacia meningomyclitic meningomyelitis meningomyelocele meningomyelorrhaphy meningorachidian meningoradicular meningorhachidian meningorrhagia meningorrhea meningorrhoea meningosis meningospinal meningotyphoid meninting meninx meniscal meniscate menisciform meniscitis meniscoid meniscoidal Meniscotheriidae Meniscotherium meniscus menisperm Menispermaceae menispermaceous menispermine Menispermum Menkalinan Menkar Menkib menkind mennom Mennonist Mennonite Menobranchidae Menobranchus menognath menognathous menologium menology menometastasis Menominee menopausal menopause menopausic menophania menoplania Menopoma Menorah Menorhyncha menorhynchous menorrhagia menorrhagic menorrhagy menorrhea menorrheic menorrhoea menorrhoeic menoschesis menoschetic menosepsis menostasia menostasis menostatic menostaxis Menotyphla menotyphlic menoxenia mensa mensal mensalize mense menseful menseless menses Menshevik Menshevism Menshevist mensk menstrual menstruant menstruate menstruation menstruous menstruousness menstruum mensual mensurability mensurable mensurableness mensurably mensural mensuralist mensurate mensuration mensurational mensurative Ment mentagra mental mentalis mentalism mentalist mentalistic mentality mentalization mentalize mentally mentary mentation Mentha Menthaceae menthaceous menthadiene menthane menthene menthenol menthenone menthol mentholated menthone menthyl menticide menticultural menticulture mentiferous mentiform mentigerous mentimeter mentimutation mention mentionability mentionable mentionless mentoanterior mentobregmatic mentocondylial mentohyoid mentolabial mentomeckelian mentonniere mentoposterior mentor mentorial mentorism mentorship mentum Mentzelia menu Menura Menurae Menuridae meny Menyanthaceae Menyanthaceous Menyanthes menyie menzie Menziesia Meo Mephisto Mephistophelean Mephistopheleanly Mephistopheles Mephistophelic Mephistophelistic mephitic mephitical Mephitinae mephitine mephitis mephitism Mer Merak meralgia meraline Merat Meratia merbaby mercal mercantile mercantilely mercantilism mercantilist mercantilistic mercantility mercaptal mercaptan mercaptides mercaptids mercapto mercaptol mercaptole Mercator Mercatorial mercatorial Mercedarian Mercedes Mercedinus Mercedonius mercenarily mercenariness mercenary mercer merceress mercerization mercerize mercerizer mercership mercery merch merchandisable merchandise merchandiser merchant merchantable merchantableness merchanter merchanthood merchantish merchantlike merchantly merchantman merchantry merchantship merchet Mercian merciful mercifully mercifulness merciless mercilessly mercilessness merciment mercurate mercuration Mercurean mercurial Mercurialis mercurialism mercuriality mercurialization mercurialize mercurially mercurialness mercuriamines mercuriammonium Mercurian mercuriate mercuric mercuride mercurification mercurify Mercurius mercurization mercurize Mercurochrome mercurophen mercurous Mercury mercy mercyproof merdivorous mere Meredithian merel merely merenchyma merenchymatous meresman merestone meretricious meretriciously meretriciousness meretrix merfold merfolk merganser merge mergence merger mergh Merginae Mergulus Mergus meriah mericarp merice Merida meridian Meridion Meridionaceae Meridional meridional meridionality meridionally meril meringue meringued Merino Meriones meriquinoid meriquinoidal meriquinone meriquinonic meriquinonoid merism merismatic merismoid merist meristele meristelic meristem meristematic meristematically meristic meristically meristogenous merit meritable merited meritedly meriter meritful meritless meritmonger meritmongering meritmongery meritorious meritoriously meritoriousness merk merkhet merkin merl merle merlette merlin merlon Merlucciidae Merluccius mermaid mermaiden merman Mermis mermithaner mermithergate Mermithidae mermithization mermithized mermithogyne Mermnad Mermnadae mermother mero meroblastic meroblastically merocele merocelic merocerite meroceritic merocrystalline merocyte Merodach merogamy merogastrula merogenesis merogenetic merogenic merognathite merogonic merogony merohedral merohedric merohedrism meroistic Meroitic meromorphic Meromyaria meromyarian merop Merope Meropes meropia Meropidae meropidan meroplankton meroplanktonic meropodite meropoditic Merops merorganization merorganize meros merosomal Merosomata merosomatous merosome merosthenic Merostomata merostomatous merostome merostomous merosymmetrical merosymmetry merosystematic merotomize merotomy merotropism merotropy Merovingian meroxene Merozoa merozoite merpeople merribauks merribush Merril merriless merrily merriment merriness merrow merry merrymake merrymaker merrymaking merryman merrymeeting merrythought merrytrotter merrywing merse Mertensia Merton Merula meruline merulioid Merulius merveileux merwinite merwoman Merychippus merycism merycismus Merycoidodon Merycoidodontidae Merycopotamidae Merycopotamus Mes mesa mesabite mesaconate mesaconic mesad Mesadenia mesadenia mesail mesal mesalike mesally mesameboid mesange mesaortitis mesaraic mesaraical mesarch mesarteritic mesarteritis Mesartim mesaticephal mesaticephali mesaticephalic mesaticephalism mesaticephalous mesaticephaly mesatipellic mesatipelvic mesatiskelic mesaxonic mescal Mescalero mescaline mescalism mesdames mese mesectoderm mesem Mesembryanthemaceae Mesembryanthemum mesembryo mesembryonic mesencephalic mesencephalon mesenchyma mesenchymal mesenchymatal mesenchymatic mesenchymatous mesenchyme mesendoderm mesenna mesenterial mesenteric mesenterical mesenterically mesenteriform mesenteriolum mesenteritic mesenteritis mesenteron mesenteronic mesentery mesentoderm mesepimeral mesepimeron mesepisternal mesepisternum mesepithelial mesepithelium mesethmoid mesethmoidal mesh Meshech meshed meshrabiyeh meshwork meshy mesiad mesial mesially mesian mesic mesically mesilla mesiobuccal mesiocervical mesioclusion mesiodistal mesiodistally mesiogingival mesioincisal mesiolabial mesiolingual mesion mesioocclusal mesiopulpal mesioversion Mesitae Mesites Mesitidae mesitite mesityl mesitylene mesitylenic mesmerian mesmeric mesmerical mesmerically mesmerism mesmerist mesmerite mesmerizability mesmerizable mesmerization mesmerize mesmerizee mesmerizer mesmeromania mesmeromaniac mesnality mesnalty mesne meso mesoappendicitis mesoappendix mesoarial mesoarium mesobar mesobenthos mesoblast mesoblastema mesoblastemic mesoblastic mesobranchial mesobregmate mesocaecal mesocaecum mesocardia mesocardium mesocarp mesocentrous mesocephal mesocephalic mesocephalism mesocephalon mesocephalous mesocephaly mesochilium mesochondrium mesochroic mesocoele mesocoelian mesocoelic mesocolic mesocolon mesocoracoid mesocranial mesocratic mesocuneiform mesode mesoderm mesodermal mesodermic Mesodesma Mesodesmatidae Mesodesmidae Mesodevonian Mesodevonic mesodic mesodisilicic mesodont Mesoenatides mesofurca mesofurcal mesogaster mesogastral mesogastric mesogastrium mesogloea mesogloeal mesognathic mesognathion mesognathism mesognathous mesognathy mesogyrate mesohepar Mesohippus mesokurtic mesolabe mesole mesolecithal mesolimnion mesolite mesolithic mesologic mesological mesology mesomere mesomeric mesomerism mesometral mesometric mesometrium mesomorph mesomorphic mesomorphous mesomorphy Mesomyodi mesomyodian mesomyodous meson mesonasal Mesonemertini mesonephric mesonephridium mesonephritic mesonephros mesonic mesonotal mesonotum Mesonychidae Mesonyx mesoparapteral mesoparapteron mesopectus mesoperiodic mesopetalum mesophile mesophilic mesophilous mesophragm mesophragma mesophragmal mesophryon mesophyll mesophyllous mesophyllum mesophyte mesophytic mesophytism mesopic mesoplankton mesoplanktonic mesoplast mesoplastic mesoplastral mesoplastron mesopleural mesopleuron Mesoplodon mesoplodont mesopodial mesopodiale mesopodium mesopotamia Mesopotamian mesopotamic mesoprescutal mesoprescutum mesoprosopic mesopterygial mesopterygium mesopterygoid mesorchial mesorchium Mesore mesorectal mesorectum Mesoreodon mesorrhin mesorrhinal mesorrhinian mesorrhinism mesorrhinium mesorrhiny mesosalpinx mesosaur Mesosauria Mesosaurus mesoscapula mesoscapular mesoscutal mesoscutellar mesoscutellum mesoscutum mesoseismal mesoseme mesosiderite mesosigmoid mesoskelic mesosoma mesosomatic mesosome mesosperm mesospore mesosporic mesosporium mesostasis mesosternal mesosternebra mesosternebral mesosternum mesostethium Mesostoma Mesostomatidae mesostomid mesostyle mesostylous Mesosuchia mesosuchian Mesotaeniaceae Mesotaeniales mesotarsal mesotartaric Mesothelae mesothelial mesothelium mesotherm mesothermal mesothesis mesothet mesothetic mesothetical mesothoracic mesothoracotheca mesothorax mesothorium mesotonic mesotroch mesotrocha mesotrochal mesotrochous mesotron mesotropic mesotympanic mesotype mesovarian mesovarium mesoventral mesoventrally mesoxalate mesoxalic mesoxalyl Mesozoa mesozoan Mesozoic mespil Mespilus Mespot mesquite Mesropian mess message messagery Messalian messaline messan Messapian messe messelite messenger messengership messer messet Messiah Messiahship Messianic Messianically messianically Messianism Messianist Messianize Messias messieurs messily messin Messines Messinese messiness messing messman messmate messor messroom messrs messtin messuage messy mestee mester mestiza mestizo mestome Mesua Mesvinian mesymnion met meta metabasis metabasite metabatic metabiological metabiology metabiosis metabiotic metabiotically metabismuthic metabisulphite metabletic Metabola metabola metabole Metabolia metabolian metabolic metabolism metabolite metabolizable metabolize metabolon metabolous metaboly metaborate metaboric metabranchial metabrushite metabular metacarpal metacarpale metacarpophalangeal metacarpus metacenter metacentral metacentric metacentricity metachemic metachemistry Metachlamydeae metachlamydeous metachromasis metachromatic metachromatin metachromatinic metachromatism metachrome metachronism metachrosis metacinnabarite metacism metacismus metaclase metacneme metacoele metacoelia metaconal metacone metaconid metaconule metacoracoid metacrasis metacresol metacromial metacromion metacryst metacyclic metacymene metad metadiabase metadiazine metadiorite metadiscoidal metadromous metafluidal metaformaldehyde metafulminuric metagalactic metagalaxy metagaster metagastric metagastrula metage Metageitnion metagelatin metagenesis metagenetic metagenetically metagenic metageometer metageometrical metageometry metagnath metagnathism metagnathous metagnomy metagnostic metagnosticism metagram metagrammatism metagrammatize metagraphic metagraphy metahewettite metahydroxide metaigneous metainfective metakinesis metakinetic metal metalammonium metalanguage metalbumin metalcraft metaldehyde metalepsis metaleptic metaleptical metaleptically metaler metaline metalined metaling metalinguistic metalinguistics metalism metalist metalization metalize metallary metalleity metallic metallical metallically metallicity metallicize metallicly metallics metallide metallifacture metalliferous metallification metalliform metallify metallik metalline metallism metallization metallize metallochrome metallochromy metallogenetic metallogenic metallogeny metallograph metallographer metallographic metallographical metallographist metallography metalloid metalloidal metallometer metallophone metalloplastic metallorganic metallotherapeutic metallotherapy metallurgic metallurgical metallurgically metallurgist metallurgy metalmonger metalogic metalogical metaloph metalorganic metaloscope metaloscopy metaluminate metaluminic metalware metalwork metalworker metalworking metalworks metamathematical metamathematics metamer metameral metamere metameric metamerically metameride metamerism metamerization metamerized metamerous metamery metamorphic metamorphism metamorphize metamorphopsia metamorphopsy metamorphosable metamorphose metamorphoser metamorphoses metamorphosian metamorphosic metamorphosical metamorphosis metamorphostical metamorphotic metamorphous metamorphy Metamynodon metanalysis metanauplius Metanemertini metanephric metanephritic metanephron metanephros metanepionic metanilic metanitroaniline metanomen metanotal metanotum metantimonate metantimonic metantimonious metantimonite metantimonous metanym metaorganism metaparapteral metaparapteron metapectic metapectus metapepsis metapeptone metaperiodic metaphase metaphenomenal metaphenomenon metaphenylene metaphenylenediamin metaphenylenediamine metaphloem metaphonical metaphonize metaphony metaphor metaphoric metaphorical metaphorically metaphoricalness metaphorist metaphorize metaphosphate metaphosphoric metaphosphorous metaphragm metaphragmal metaphrase metaphrasis metaphrast metaphrastic metaphrastical metaphrastically metaphyseal metaphysic metaphysical metaphysically metaphysician metaphysicianism metaphysicist metaphysicize metaphysicous metaphysics metaphysis metaphyte metaphytic metaphyton metaplasia metaplasis metaplasm metaplasmic metaplast metaplastic metapleural metapleure metapleuron metaplumbate metaplumbic metapneumonic metapneustic metapodial metapodiale metapodium metapolitic metapolitical metapolitician metapolitics metapophyseal metapophysial metapophysis metapore metapostscutellar metapostscutellum metaprescutal metaprescutum metaprotein metapsychic metapsychical metapsychics metapsychism metapsychist metapsychological metapsychology metapsychosis metapterygial metapterygium metapterygoid metarabic metarhyolite metarossite metarsenic metarsenious metarsenite metasaccharinic metascutal metascutellar metascutellum metascutum metasedimentary metasilicate metasilicic metasoma metasomal metasomasis metasomatic metasomatism metasomatosis metasome metasperm Metaspermae metaspermic metaspermous metastability metastable metastannate metastannic metastasis metastasize metastatic metastatical metastatically metasternal metasternum metasthenic metastibnite metastigmate metastoma metastome metastrophe metastrophic metastyle metatantalic metatarsal metatarsale metatarse metatarsophalangeal metatarsus metatatic metatatically metataxic metate metathalamus metatheology Metatheria metatherian metatheses metathesis metathetic metathetical metathetically metathoracic metathorax metatitanate metatitanic metatoluic metatoluidine metatracheal metatrophic metatungstic metatype metatypic Metaurus metavanadate metavanadic metavauxite metavoltine metaxenia metaxite metaxylem metaxylene metayer Metazoa metazoal metazoan metazoea metazoic metazoon mete metel metempiric metempirical metempirically metempiricism metempiricist metempirics metempsychic metempsychosal metempsychose metempsychoses metempsychosical metempsychosis metempsychosize metemptosis metencephalic metencephalon metensarcosis metensomatosis metenteron metenteronic meteogram meteograph meteor meteorgraph meteoric meteorical meteorically meteorism meteorist meteoristic meteorital meteorite meteoritic meteoritics meteorization meteorize meteorlike meteorogram meteorograph meteorographic meteorography meteoroid meteoroidal meteorolite meteorolitic meteorologic meteorological meteorologically meteorologist meteorology meteorometer meteoroscope meteoroscopy meteorous metepencephalic metepencephalon metepimeral metepimeron metepisternal metepisternum meter meterage metergram meterless meterman metership metestick metewand meteyard methacrylate methacrylic methadone methanal methanate methane methanoic methanolysis methanometer metheglin methemoglobin methemoglobinemia methemoglobinuria methenamine methene methenyl mether methid methide methine methinks methiodide methionic methionine methobromide method methodaster methodeutic methodic methodical methodically methodicalness methodics methodism Methodist methodist Methodistic Methodistically Methodisty methodization Methodize methodize methodizer methodless methodological methodologically methodologist methodology Methody methought methoxide methoxychlor methoxyl methronic Methuselah methyl methylacetanilide methylal methylamine methylaniline methylanthracene methylate methylation methylator methylcholanthrene methylene methylenimine methylenitan methylethylacetic methylglycine methylglycocoll methylglyoxal methylic methylmalonic methylnaphthalene methylol methylolurea methylosis methylotic methylpentose methylpentoses methylpropane methylsulfanol metic meticulosity meticulous meticulously meticulousness metier Metin metis Metoac metochous metochy metoestrous metoestrum Metol metonym metonymic metonymical metonymically metonymous metonymously metonymy metope Metopias metopic metopion metopism Metopoceros metopomancy metopon metoposcopic metoposcopical metoposcopist metoposcopy metosteal metosteon metoxazine metoxenous metoxeny metra metralgia metranate metranemia metratonia Metrazol metrectasia metrectatic metrectomy metrectopia metrectopic metrectopy metreless metreship metreta metrete metretes metria metric metrical metrically metrician metricism metricist metricize metrics Metridium metrification metrifier metrify metriocephalic metrist metritis metrocampsis metrocarat metrocarcinoma metrocele metroclyst metrocolpocele metrocracy metrocratic metrocystosis metrodynia metrofibroma metrological metrologist metrologue metrology metrolymphangitis metromalacia metromalacoma metromalacosis metromania metromaniac metromaniacal metrometer metroneuria metronome metronomic metronomical metronomically metronymic metronymy metroparalysis metropathia metropathic metropathy metroperitonitis metrophlebitis metrophotography metropole metropolis metropolitan metropolitanate metropolitancy metropolitanism metropolitanize metropolitanship metropolite metropolitic metropolitical metropolitically metroptosia metroptosis metroradioscope metrorrhagia metrorrhagic metrorrhea metrorrhexis metrorthosis metrosalpingitis metrosalpinx metroscirrhus metroscope metroscopy Metrosideros metrostaxis metrostenosis metrosteresis metrostyle metrosynizesis metrotherapist metrotherapy metrotome metrotomy Metroxylon mettar mettle mettled mettlesome mettlesomely mettlesomeness metusia metze Meum meuse meute Mev mew meward mewer mewl mewler Mexica Mexican Mexicanize Mexitl Mexitli meyerhofferite mezcal Mezentian Mezentism Mezentius mezereon mezereum mezuzah mezzanine mezzo mezzograph mezzotint mezzotinter mezzotinto mho mhometer mi Miami miamia mian Miao Miaotse Miaotze miaow miaower Miaplacidus miargyrite miarolitic mias miaskite miasm miasma miasmal miasmata miasmatic miasmatical miasmatically miasmatize miasmatology miasmatous miasmic miasmology miasmous Miastor miaul miauler mib mica micaceous micacious micacite Micah micasization micasize micate mication Micawberish Micawberism mice micellar micelle Michabo Michabou Michael Michaelites Michaelmas Michaelmastide miche Micheal Michel Michelangelesque Michelangelism Michelia Michelle micher Michiel Michigamea Michigan michigan Michigander Michiganite miching Michoacan Michoacano micht Mick mick Mickey mickle Micky Micmac mico miconcave Miconia micramock Micrampelis micranatomy micrander micrandrous micraner micranthropos Micraster micrencephalia micrencephalic micrencephalous micrencephalus micrencephaly micrergate micresthete micrify micro microammeter microampere microanalysis microanalyst microanalytical microangstrom microapparatus microbal microbalance microbar microbarograph microbattery microbe microbeless microbeproof microbial microbian microbic microbicidal microbicide microbiologic microbiological microbiologically microbiologist microbiology microbion microbiosis microbiota microbiotic microbious microbism microbium microblast microblepharia microblepharism microblephary microbrachia microbrachius microburet microburette microburner microcaltrop microcardia microcardius microcarpous Microcebus microcellular microcentrosome microcentrum microcephal microcephalia microcephalic microcephalism microcephalous microcephalus microcephaly microceratous microchaeta microcharacter microcheilia microcheiria microchemic microchemical microchemically microchemistry microchiria Microchiroptera microchiropteran microchiropterous microchromosome microchronometer microcinema microcinematograph microcinematographic microcinematography Microcitrus microclastic microclimate microclimatic microclimatologic microclimatological microclimatology microcline microcnemia microcoat micrococcal Micrococceae Micrococcus microcoleoptera microcolon microcolorimeter microcolorimetric microcolorimetrically microcolorimetry microcolumnar microcombustion microconidial microconidium microconjugant Microconodon microconstituent microcopy microcoria microcosm microcosmal microcosmian microcosmic microcosmical microcosmography microcosmology microcosmos microcosmus microcoulomb microcranous microcrith microcryptocrystalline microcrystal microcrystalline microcrystallogeny microcrystallography microcrystalloscopy microcurie Microcyprini microcyst microcyte microcythemia microcytosis microdactylia microdactylism microdactylous microdentism microdentous microdetection microdetector microdetermination microdiactine microdissection microdistillation microdont microdontism microdontous microdose microdrawing Microdrili microdrive microelectrode microelectrolysis microelectroscope microelement microerg microestimation microeutaxitic microevolution microexamination microfarad microfauna microfelsite microfelsitic microfilaria microfilm microflora microfluidal microfoliation microfossil microfungus microfurnace Microgadus microgalvanometer microgamete microgametocyte microgametophyte microgamy Microgaster microgastria Microgastrinae microgastrine microgeological microgeologist microgeology microgilbert microglia microglossia micrognathia micrognathic micrognathous microgonidial microgonidium microgram microgramme microgranite microgranitic microgranitoid microgranular microgranulitic micrograph micrographer micrographic micrographical micrographically micrographist micrography micrograver microgravimetric microgroove microgyne microgyria microhenry microhepatia microhistochemical microhistology microhm microhmmeter Microhymenoptera microhymenopteron microinjection microjoule microlepidopter microlepidoptera microlepidopteran microlepidopterist microlepidopteron microlepidopterous microleukoblast microlevel microlite microliter microlith microlithic microlitic micrologic micrological micrologically micrologist micrologue micrology microlux micromania micromaniac micromanipulation micromanipulator micromanometer Micromastictora micromazia micromeasurement micromechanics micromelia micromelic micromelus micromembrane micromeral micromere Micromeria micromeric micromerism micromeritic micromeritics micromesentery micrometallographer micrometallography micrometallurgy micrometer micromethod micrometrical micrometrically micrometry micromicrofarad micromicron micromil micromillimeter micromineralogical micromineralogy micromorph micromotion micromotoscope micromyelia micromyeloblast micron Micronesian micronization micronize micronometer micronuclear micronucleus micronutrient microorganic microorganism microorganismal micropaleontology micropantograph microparasite microparasitic micropathological micropathologist micropathology micropegmatite micropegmatitic micropenis microperthite microperthitic micropetalous micropetrography micropetrologist micropetrology microphage microphagocyte microphagous microphagy microphakia microphallus microphone microphonic microphonics microphonograph microphot microphotograph microphotographic microphotography microphotometer microphotoscope microphthalmia microphthalmic microphthalmos microphthalmus microphyllous microphysical microphysics microphysiography microphytal microphyte microphytic microphytology micropia micropin micropipette microplakite microplankton microplastocyte microplastometer micropodal Micropodi micropodia Micropodidae Micropodiformes micropoecilitic micropoicilitic micropoikilitic micropolariscope micropolarization micropore microporosity microporous microporphyritic microprint microprojector micropsia micropsy micropterism micropterous Micropterus micropterygid Micropterygidae micropterygious Micropterygoidea Micropteryx Micropus micropylar micropyle micropyrometer microradiometer microreaction microrefractometer microrhabdus microrheometer microrheometric microrheometrical Microrhopias Microsauria microsaurian microsclere microsclerous microsclerum microscopal microscope microscopial microscopic microscopical microscopically microscopics Microscopid microscopist Microscopium microscopize microscopy microsecond microsection microseism microseismic microseismical microseismograph microseismology microseismometer microseismometrograph microseismometry microseme microseptum microsmatic microsmatism microsoma microsomatous microsome microsomia microsommite Microsorex microspecies microspectroscope microspectroscopic microspectroscopy Microspermae microspermous Microsphaera microsphaeric microsphere microspheric microspherulitic microsplanchnic microsplenia microsplenic microsporange microsporangium microspore microsporiasis microsporic Microsporidia microsporidian Microsporon microsporophore microsporophyll microsporosis microsporous Microsporum microstat microsthene Microsthenes microsthenic microstomatous microstome microstomia microstomous microstructural microstructure Microstylis microstylospore microstylous microsublimation microtasimeter microtechnic microtechnique microtelephone microtelephonic Microthelyphonida microtheos microtherm microthermic microthorax Microthyriaceae microtia Microtinae microtine microtitration microtome microtomic microtomical microtomist microtomy microtone Microtus microtypal microtype microtypical microvolt microvolume microvolumetric microwatt microwave microweber microzoa microzoal microzoan microzoaria microzoarian microzoary microzoic microzone microzooid microzoology microzoon microzoospore microzyma microzyme microzymian micrurgic micrurgical micrurgist micrurgy Micrurus miction micturate micturition mid midafternoon midautumn midaxillary midbrain midday midden middenstead middle middlebreaker middlebuster middleman middlemanism middlemanship middlemost middler middlesplitter middlewards middleway middleweight middlewoman middling middlingish middlingly middlingness middlings middorsal middy mide Mider midevening midewiwin midfacial midforenoon midfrontal midge midget midgety midgy midheaven Midianite Midianitish Mididae midiron midland Midlander Midlandize midlandward midlatitude midleg midlenting midmain midmandibular midmonth midmonthly midmorn midmorning midmost midnight midnightly midnoon midparent midparentage midparental midpit midrange midrash midrashic midrib midribbed midriff mids midseason midsentence midship midshipman midshipmanship midshipmite midships midspace midst midstory midstout midstream midstreet midstroke midstyled midsummer midsummerish midsummery midtap midvein midverse midward midwatch midway midweek midweekly Midwest Midwestern Midwesterner midwestward midwife midwifery midwinter midwinterly midwintry midwise midyear Miek mien miersite Miescherian miff miffiness miffy mig might mightily mightiness mightless mightnt mighty mightyhearted mightyship miglio migmatite migniardise mignon mignonette mignonne mignonness Migonitis migraine migrainoid migrainous migrant migrate migration migrational migrationist migrative migrator migratorial migratory Miguel miharaite mihrab mijakite mijl mikado mikadoate mikadoism Mikael Mikania Mikasuki Mike mike Mikey Miki mikie Mikir Mil mil mila milady milammeter Milan Milanese Milanion milarite milch milcher milchy mild milden milder mildew mildewer mildewy mildhearted mildheartedness mildish mildly mildness Mildred mile mileage Miledh milepost miler Miles Milesian milesima Milesius milestone mileway milfoil milha miliaceous miliarensis miliaria miliarium miliary Milicent milieu Miliola milioliform milioline miliolite miliolitic militancy militant militantly militantness militarily militariness militarism militarist militaristic militaristically militarization militarize military militaryism militaryment militaster militate militation militia militiaman militiate milium milk milkbush milken milker milkeress milkfish milkgrass milkhouse milkily milkiness milking milkless milklike milkmaid milkman milkness milkshed milkshop milksick milksop milksopism milksoppery milksopping milksoppish milksoppy milkstone milkweed milkwood milkwort milky mill Milla milla millable millage millboard millclapper millcourse milldam mille milled millefiori milleflorous millefoliate millenarian millenarianism millenarist millenary millennia millennial millennialism millennialist millennially millennian millenniarism millenniary millennium millepede Millepora millepore milleporiform milleporine milleporite milleporous millepunctate miller milleress millering Millerism Millerite millerite millerole millesimal millesimally millet Millettia millfeed millful millhouse milliad milliammeter milliamp milliampere milliamperemeter milliangstrom milliard milliardaire milliare milliarium milliary millibar millicron millicurie Millie millieme milliequivalent millifarad millifold milliform milligal milligrade milligram milligramage millihenry millilambert millile milliliter millilux millimeter millimicron millimolar millimole millincost milline milliner millinerial millinering millinery milling Millingtonia millinormal millinormality millioctave millioersted million millionaire millionairedom millionairess millionairish millionairism millionary millioned millioner millionfold millionism millionist millionize millionocracy millions millionth milliphot millipoise millisecond millistere Millite millithrum millivolt millivoltmeter millman millocracy millocrat millocratism millosevichite millowner millpond millpool millpost millrace millrynd millsite millstock millstone millstream milltail millward millwork millworker millwright millwrighting Milly Milner milner Milo milo milord milpa milreis milsey milsie milt milter miltlike Miltonia Miltonian Miltonic Miltonically Miltonism Miltonist Miltonize Miltos miltsick miltwaste milty Milvago Milvinae milvine milvinous Milvus milzbrand mim mima mimbar mimble Mimbreno Mime mime mimeo mimeograph mimeographic mimeographically mimeographist mimer mimesis mimester mimetene mimetesite mimetic mimetical mimetically mimetism mimetite Mimi mimiambi mimiambic mimiambics mimic mimical mimically mimicism mimicker mimicry Mimidae Miminae mimine miminypiminy mimly mimmation mimmest mimmock mimmocking mimmocky mimmood mimmoud mimmouthed mimmouthedness mimodrama mimographer mimography mimologist Mimosa Mimosaceae mimosaceous mimosis mimosite mimotype mimotypic mimp Mimpei mimsey Mimulus Mimus Mimusops min Mina mina minable minacious minaciously minaciousness minacity Minaean Minahassa Minahassan Minahassian minar minaret minareted minargent minasragrite minatorial minatorially minatorily minatory minaway mince mincemeat mincer minchery minchiate mincing mincingly mincingness Mincopi Mincopie mind minded Mindel Mindelian minder Mindererus mindful mindfully mindfulness minding mindless mindlessly mindlessness mindsight mine mineowner miner mineragraphic mineragraphy mineraiogic mineral mineralizable mineralization mineralize mineralizer mineralogical mineralogically mineralogist mineralogize mineralogy Minerva minerval Minervan Minervic minery mines minette mineworker Ming ming minge mingelen mingle mingleable mingledly minglement mingler minglingly Mingo Mingrelian minguetite mingwort mingy minhag minhah miniaceous miniate miniator miniature miniaturist minibus minicam minicamera Miniconjou minienize minification minify minikin minikinly minim minima minimacid minimal minimalism Minimalist minimalkaline minimally minimetric minimifidian minimifidianism minimism minimistic Minimite minimitude minimization minimize minimizer minimum minimus minimuscular mining minion minionette minionism minionly minionship minish minisher minishment minister ministeriable ministerial ministerialism ministerialist ministeriality ministerially ministerialness ministerium ministership ministrable ministrant ministration ministrative ministrator ministrer ministress ministry ministryship minitant Minitari minium miniver minivet mink minkery minkish Minkopi Minnehaha minnesinger minnesong Minnesotan Minnetaree Minnie minnie minniebush minning minnow minny mino Minoan minoize minometer minor minorage minorate minoration Minorca Minorcan Minoress minoress Minorist Minorite minority minorship Minos minot Minotaur Minseito minsitive minster minsteryard minstrel minstreless minstrelship minstrelsy mint mintage Mintaka mintbush minter mintmaker mintmaking mintman mintmaster minty minuend minuet minuetic minuetish minus minuscular minuscule minutary minutation minute minutely minuteman minuteness minuter minuthesis minutia minutiae minutial minutiose minutiously minutissimic minverite minx minxish minxishly minxishness minxship miny Minyadidae Minyae Minyan minyan Minyas miocardia Miocene Miocenic Miohippus miolithic mioplasmia miothermic miqra miquelet mir Mira Mirabel Mirabell mirabiliary Mirabilis mirabilite Mirac Mirach mirach miracidial miracidium miracle miraclemonger miraclemongering miraclist miraculist miraculize miraculosity miraculous miraculously miraculousness mirador mirage miragy Mirak Miramolin Mirana Miranda mirandous Miranha Miranhan mirate mirbane mird mirdaha mire mirepoix Mirfak Miriam Miriamne mirid Miridae mirific miriness mirish mirk mirkiness mirksome mirliton Miro miro Mirounga mirror mirrored mirrorize mirrorlike mirrorscope mirrory mirth mirthful mirthfully mirthfulness mirthless mirthlessly mirthlessness mirthsome mirthsomeness miry miryachit mirza misaccent misaccentuation misachievement misacknowledge misact misadapt misadaptation misadd misaddress misadjust misadmeasurement misadministration misadvantage misadventure misadventurer misadventurous misadventurously misadvertence misadvice misadvise misadvised misadvisedly misadvisedness misaffected misaffection misaffirm misagent misaim misalienate misalignment misallegation misallege misalliance misallotment misallowance misally misalphabetize misalter misanalyze misandry misanswer misanthrope misanthropia misanthropic misanthropical misanthropically misanthropism misanthropist misanthropize misanthropy misapparel misappear misappearance misappellation misapplication misapplier misapply misappoint misappointment misappraise misappraisement misappreciate misappreciation misappreciative misapprehend misapprehendingly misapprehensible misapprehension misapprehensive misapprehensively misapprehensiveness misappropriate misappropriately misappropriation misarchism misarchist misarrange misarrangement misarray misascribe misascription misasperse misassay misassent misassert misassign misassociate misassociation misatone misattend misattribute misattribution misaunter misauthorization misauthorize misaward misbandage misbaptize misbecome misbecoming misbecomingly misbecomingness misbefitting misbeget misbegin misbegotten misbehave misbehavior misbeholden misbelief misbelieve misbeliever misbelievingly misbelove misbeseem misbestow misbestowal misbetide misbias misbill misbind misbirth misbode misborn misbrand misbuild misbusy miscalculate miscalculation miscalculator miscall miscaller miscanonize miscarriage miscarriageable miscarry miscast miscasualty misceability miscegenate miscegenation miscegenationist miscegenator miscegenetic miscegine miscellanarian miscellanea miscellaneity miscellaneous miscellaneously miscellaneousness miscellanist miscellany mischallenge mischance mischanceful mischancy mischaracterization mischaracterize mischarge mischief mischiefful mischieve mischievous mischievously mischievousness mischio mischoice mischoose mischristen miscibility miscible miscipher misclaim misclaiming misclass misclassification misclassify miscognizant miscoin miscoinage miscollocation miscolor miscoloration miscommand miscommit miscommunicate miscompare miscomplacence miscomplain miscomplaint miscompose miscomprehend miscomprehension miscomputation miscompute misconceive misconceiver misconception misconclusion miscondition misconduct misconfer misconfidence misconfident misconfiguration misconjecture misconjugate misconjugation misconjunction misconsecrate misconsequence misconstitutional misconstruable misconstruct misconstruction misconstructive misconstrue misconstruer miscontinuance misconvenient misconvey miscook miscookery miscorrect miscorrection miscounsel miscount miscovet miscreancy miscreant miscreate miscreation miscreative miscreator miscredited miscredulity miscreed miscript miscrop miscue miscultivated misculture miscurvature miscut misdate misdateful misdaub misdeal misdealer misdecide misdecision misdeclaration misdeclare misdeed misdeem misdeemful misdefine misdeformed misdeliver misdelivery misdemean misdemeanant misdemeanist misdemeanor misdentition misderivation misderive misdescribe misdescriber misdescription misdescriptive misdesire misdetermine misdevise misdevoted misdevotion misdiet misdirect misdirection misdispose misdisposition misdistinguish misdistribute misdistribution misdivide misdivision misdo misdoer misdoing misdoubt misdower misdraw misdread misdrive mise misease misecclesiastic misedit miseducate miseducation miseducative miseffect misemphasis misemphasize misemploy misemployment misencourage misendeavor misenforce misengrave misenite misenjoy misenroll misentitle misenunciation Misenus miser miserabilism miserabilist miserabilistic miserability miserable miserableness miserably miserdom miserected Miserere miserhood misericord Misericordia miserism miserliness miserly misery misesteem misestimate misestimation misexample misexecute misexecution misexpectation misexpend misexpenditure misexplain misexplanation misexplication misexposition misexpound misexpress misexpression misexpressive misfaith misfare misfashion misfather misfault misfeasance misfeasor misfeature misfield misfigure misfile misfire misfit misfond misform misformation misfortunate misfortunately misfortune misfortuned misfortuner misframe misgauge misgesture misgive misgiving misgivingly misgo misgotten misgovern misgovernance misgovernment misgovernor misgracious misgraft misgrave misground misgrow misgrown misgrowth misguess misguggle misguidance misguide misguided misguidedly misguidedness misguider misguiding misguidingly mishandle mishap mishappen Mishikhwutmetunne mishmash mishmee Mishmi Mishnah Mishnaic Mishnic Mishnical Mishongnovi misidentification misidentify Misima misimagination misimagine misimpression misimprove misimprovement misimputation misimpute misincensed misincite misinclination misincline misinfer misinference misinflame misinform misinformant misinformation misinformer misingenuity misinspired misinstruct misinstruction misinstructive misintelligence misintelligible misintend misintention misinter misinterment misinterpret misinterpretable misinterpretation misinterpreter misintimation misjoin misjoinder misjudge misjudgement misjudger misjudgingly misjudgment miskeep misken miskenning miskill miskindle misknow misknowledge misky mislabel mislabor mislanguage mislay mislayer mislead misleadable misleader misleading misleadingly misleadingness mislear misleared mislearn misled mislest mislight mislike misliken mislikeness misliker mislikingly mislippen mislive mislocate mislocation mislodge mismade mismake mismanage mismanageable mismanagement mismanager mismarriage mismarry mismatch mismatchment mismate mismeasure mismeasurement mismenstruation misminded mismingle mismotion mismove misname misnarrate misnatured misnavigation Misniac misnomed misnomer misnumber misnurture misnutrition misobedience misobey misobservance misobserve misocapnic misocapnist misocatholic misoccupy misogallic misogamic misogamist misogamy misogyne misogynic misogynical misogynism misogynist misogynistic misogynistical misogynous misogyny misohellene misologist misology misomath misoneism misoneist misoneistic misopaterist misopedia misopedism misopedist misopinion misopolemical misorder misordination misorganization misorganize misoscopist misosophist misosophy misotheism misotheist misotheistic misotramontanism misotyranny misoxene misoxeny mispage mispagination mispaint misparse mispart mispassion mispatch mispay misperceive misperception misperform misperformance mispersuade misperuse misphrase mispick mispickel misplace misplacement misplant misplay misplead mispleading misplease mispoint mispoise mispolicy misposition mispossessed mispractice mispraise misprejudiced misprincipled misprint misprisal misprision misprize misprizer misproceeding misproduce misprofess misprofessor mispronounce mispronouncement mispronunciation misproportion misproposal mispropose misproud misprovide misprovidence misprovoke mispunctuate mispunctuation mispurchase mispursuit misput misqualify misquality misquotation misquote misquoter misraise misrate misread misreader misrealize misreason misreceive misrecital misrecite misreckon misrecognition misrecognize misrecollect misrefer misreference misreflect misreform misregulate misrehearsal misrehearse misrelate misrelation misreliance misremember misremembrance misrender misrepeat misreport misreporter misreposed misrepresent misrepresentation misrepresentative misrepresenter misreprint misrepute misresemblance misresolved misresult misreward misrhyme misrhymer misrule miss missable missal missay missayer misseem missel missemblance missentence misserve misservice misset misshape misshapen misshapenly misshapenness misshood missible missile missileproof missiness missing missingly mission missional missionarize missionary missionaryship missioner missionize missionizer missis Missisauga missish missishness Mississippi Mississippian missive missmark missment Missouri Missourian Missourianism missourite misspeak misspeech misspell misspelling misspend misspender misstate misstatement misstater misstay misstep missuade missuggestion missummation missuppose missy missyish missyllabication missyllabify mist mistakable mistakableness mistakably mistake mistakeful mistaken mistakenly mistakenness mistakeproof mistaker mistaking mistakingly mistassini mistaught mistbow misteach misteacher misted mistell mistempered mistend mistendency Mister mister misterm mistetch mistfall mistflower mistful misthink misthought misthread misthrift misthrive misthrow mistic mistide mistify mistigris mistily mistime mistiness mistitle mistle mistless mistletoe mistone mistonusk mistook mistouch mistradition mistrain mistral mistranscribe mistranscript mistranscription mistranslate mistranslation mistreat mistreatment mistress mistressdom mistresshood mistressless mistressly mistrial mistrist mistrust mistruster mistrustful mistrustfully mistrustfulness mistrusting mistrustingly mistrustless mistry mistryst misturn mistutor misty mistyish misunderstand misunderstandable misunderstander misunderstanding misunderstandingly misunderstood misunderstoodness misura misusage misuse misuseful misusement misuser misusurped misvaluation misvalue misventure misventurous misvouch miswed miswisdom miswish misword misworship misworshiper misworshipper miswrite misyoke miszealous Mitakshara Mitanni Mitannian Mitannish mitapsis Mitch mitchboard Mitchell Mitchella mite Mitella miteproof miter mitered miterer miterflower miterwort Mithra Mithraea Mithraeum Mithraic Mithraicism Mithraicist Mithraicize Mithraism Mithraist Mithraistic Mithraitic Mithraize Mithras Mithratic Mithriac mithridate Mithridatic mithridatic mithridatism mithridatize miticidal miticide mitigable mitigant mitigate mitigatedly mitigation mitigative mitigator mitigatory mitis mitochondria mitochondrial mitogenetic mitome mitosis mitosome mitotic mitotically Mitra mitra mitrailleuse mitral mitrate mitre mitrer Mitridae mitriform Mitsukurina Mitsukurinidae mitsumata mitt mittelhand Mittelmeer mitten mittened mittimus mitty Mitu Mitua mity miurus mix mixable mixableness mixblood Mixe mixed mixedly mixedness mixen mixer mixeress mixhill mixible mixite mixobarbaric mixochromosome Mixodectes Mixodectidae mixolydian mixoploid mixoploidy Mixosaurus mixotrophic Mixtec Mixtecan mixtiform mixtilineal mixtilion mixtion mixture mixy Mizar mizmaze Mizpah Mizraim mizzen mizzenmast mizzenmastman mizzentopman mizzle mizzler mizzly mizzonite mizzy mlechchha mneme mnemic Mnemiopsis mnemonic mnemonical mnemonicalist mnemonically mnemonicon mnemonics mnemonism mnemonist mnemonization mnemonize Mnemosyne mnemotechnic mnemotechnical mnemotechnics mnemotechnist mnemotechny mnesic mnestic Mnevis Mniaceae mniaceous mnioid Mniotiltidae Mnium Mo mo Moabite Moabitess Moabitic Moabitish moan moanful moanfully moanification moaning moaningly moanless Moaria Moarian moat Moattalite mob mobable mobbable mobber mobbish mobbishly mobbishness mobbism mobbist mobby mobcap mobed mobile Mobilian mobilianer mobiliary mobility mobilizable mobilization mobilize mobilometer moble moblike mobocracy mobocrat mobocratic mobocratical mobolatry mobproof mobship mobsman mobster Mobula Mobulidae moccasin Mocha mocha Mochica mochras mock mockable mockado mockbird mocker mockernut mockery mockful mockfully mockground mockingbird mockingstock mocmain Mocoa Mocoan mocomoco mocuck Mod modal modalism modalist modalistic modality modalize modally mode model modeler modeless modelessness modeling modelist modeller modelmaker modelmaking modena Modenese moderant moderantism moderantist moderate moderately moderateness moderation moderationist moderatism moderatist moderato moderator moderatorship moderatrix Modern modern moderner modernicide modernish modernism modernist modernistic modernity modernizable modernization modernize modernizer modernly modernness modest modestly modestness modesty modiation modicity modicum modifiability modifiable modifiableness modifiably modificability modificable modification modificationist modificative modificator modificatory modifier modify modillion modiolar Modiolus modiolus modish modishly modishness modist modiste modistry modius Modoc Modred modulability modulant modular modulate modulation modulative modulator modulatory module Modulidae modulo modulus modumite Moe Moed Moehringia moellon moerithere moeritherian Moeritheriidae Moeritherium mofette moff mofussil mofussilite mog mogador mogadore mogdad moggan moggy Moghan mogigraphia mogigraphic mogigraphy mogilalia mogilalism mogiphonia mogitocia mogo mogographia Mogollon Mograbi Mogrebbin moguey Mogul mogulship Moguntine moha mohabat mohair Mohammad Mohammedan Mohammedanism Mohammedanization Mohammedanize Mohammedism Mohammedist Mohammedization Mohammedize mohar Mohave Mohawk Mohawkian mohawkite Mohegan mohel Mohican Mohineyam mohnseed moho Mohock Mohockism mohr Mohrodendron mohur Moi moider moidore moieter moiety moil moiler moiles moiley moiling moilingly moilsome moineau Moingwena moio Moira moire moirette moise Moism moissanite moist moisten moistener moistful moistify moistish moistishness moistless moistly moistness moisture moistureless moistureproof moisty moit moity mojarra Mojo mojo mokaddam moke moki mokihana moko moksha mokum moky Mola mola molal Molala molality molar molariform molarimeter molarity molary Molasse molasses molassied molassy molave mold moldability moldable moldableness Moldavian moldavite moldboard molder moldery moldiness molding moldmade moldproof moldwarp moldy Mole mole molecast molecula molecular molecularist molecularity molecularly molecule molehead moleheap molehill molehillish molehilly moleism molelike molendinar molendinary molengraaffite moleproof moler moleskin molest molestation molester molestful molestfully Molge Molgula Molidae molimen moliminous molinary moline Molinia Molinism Molinist Molinistic molka Moll molland Mollberg molle mollescence mollescent molleton mollichop mollicrush mollie mollienisia mollient molliently mollifiable mollification mollifiedly mollifier mollify mollifying mollifyingly mollifyingness molligrant molligrubs mollipilose Mollisiaceae mollisiose mollities mollitious mollitude Molluginaceae Mollugo Mollusca molluscan molluscivorous molluscoid Molluscoida molluscoidal molluscoidan Molluscoidea molluscoidean molluscous molluscousness molluscum mollusk Molly molly mollycoddle mollycoddler mollycoddling mollycosset mollycot mollyhawk molman Moloch Molochize Molochship moloid moloker molompi molosse Molossian molossic Molossidae molossine molossoid molossus Molothrus molpe molrooken molt molten moltenly molter Molucca Moluccan Moluccella Moluche moly molybdate molybdena molybdenic molybdeniferous molybdenite molybdenous molybdenum molybdic molybdite molybdocardialgia molybdocolic molybdodyspepsia molybdomancy molybdomenite molybdonosus molybdoparesis molybdophyllite molybdosis molybdous molysite mombin momble Mombottu mome moment momenta momental momentally momentaneall momentaneity momentaneous momentaneously momentaneousness momentarily momentariness momentary momently momentous momentously momentousness momentum momiology momism momme mommet mommy momo Momordica Momotidae Momotinae Momotus Momus Mon mon mona Monacan monacanthid Monacanthidae monacanthine monacanthous Monacha monachal monachate Monachi monachism monachist monachization monachize monactin monactine monactinellid monactinellidan monad monadelph Monadelphia monadelphian monadelphous monadic monadical monadically monadiform monadigerous Monadina monadism monadistic monadnock monadology monaene monal monamniotic Monanday monander Monandria monandrian monandric monandrous monandry monanthous monapsal monarch monarchal monarchally monarchess monarchial monarchian monarchianism monarchianist monarchianistic monarchic monarchical monarchically monarchism monarchist monarchistic monarchize monarchizer monarchlike monarchomachic monarchomachist monarchy Monarda Monardella monarthritis monarticular monas Monasa Monascidiae monascidian monase monaster monasterial monasterially monastery monastic monastical monastically monasticism monasticize monatomic monatomicity monatomism monaulos monaural monaxial monaxile monaxon monaxonial monaxonic Monaxonida monazine monazite Monbuttu monchiquite Monday Mondayish Mondayishness Mondayland mone Monegasque Monel monel monembryary monembryonic monembryony monepic monepiscopacy monepiscopal moner Monera moneral moneran monergic monergism monergist monergistic moneric moneron Monerozoa monerozoan monerozoic monerula Moneses monesia monetarily monetary monetite monetization monetize money moneyage moneybag moneybags moneyed moneyer moneyflower moneygrub moneygrubber moneygrubbing moneylender moneylending moneyless moneymonger moneymongering moneysaving moneywise moneywort mong mongcorn monger mongering mongery Monghol Mongholian Mongibel mongler Mongo Mongol Mongolian Mongolianism Mongolic Mongolioid Mongolish Mongolism Mongolization Mongolize Mongoloid mongoose Mongoyo mongrel mongreldom mongrelish mongrelism mongrelity mongrelization mongrelize mongrelly mongrelness mongst monheimite monial Monias Monica moniker monilated monilethrix Monilia Moniliaceae moniliaceous Moniliales monilicorn moniliform moniliformly monilioid moniment Monimia Monimiaceae monimiaceous monimolite monimostylic monism monist monistic monistical monistically monition monitive monitor monitorial monitorially monitorish monitorship monitory monitress monitrix monk monkbird monkcraft monkdom monkery monkess monkey monkeyboard monkeyface monkeyfy monkeyhood monkeyish monkeyishly monkeyishness monkeylike monkeynut monkeypod monkeypot monkeyry monkeyshine monkeytail monkfish monkflower monkhood monkish monkishly monkishness monkism monklike monkliness monkly monkmonger monkship monkshood Monmouth monmouthite monny Mono mono monoacetate monoacetin monoacid monoacidic monoamide monoamine monoamino monoammonium monoazo monobacillary monobase monobasic monobasicity monoblastic monoblepsia monoblepsis monobloc monobranchiate monobromacetone monobromated monobromide monobrominated monobromination monobromized monobromoacetanilide monobromoacetone monobutyrin monocalcium monocarbide monocarbonate monocarbonic monocarboxylic monocardian monocarp monocarpal monocarpellary monocarpian monocarpic monocarpous monocellular monocentric monocentrid Monocentridae Monocentris monocentroid monocephalous monocercous monoceros monocerous monochasial monochasium Monochlamydeae monochlamydeous monochlor monochloracetic monochloranthracene monochlorbenzene monochloride monochlorinated monochlorination monochloro monochloroacetic monochlorobenzene monochloromethane monochoanitic monochord monochordist monochordize monochroic monochromasy monochromat monochromate monochromatic monochromatically monochromatism monochromator monochrome monochromic monochromical monochromically monochromist monochromous monochromy monochronic monochronous monociliated monocle monocled monocleid monoclinal monoclinally monocline monoclinian monoclinic monoclinism monoclinometric monoclinous Monoclonius Monocoelia monocoelian monocoelic Monocondyla monocondylar monocondylian monocondylic monocondylous monocormic monocot monocotyledon Monocotyledones monocotyledonous monocracy monocrat monocratic monocrotic monocrotism monocular monocularity monocularly monoculate monocule monoculist monoculous monocultural monoculture monoculus monocyanogen monocycle monocyclic Monocyclica monocystic Monocystidae Monocystidea Monocystis monocyte monocytic monocytopoiesis monodactyl monodactylate monodactyle monodactylism monodactylous monodactyly monodelph Monodelphia monodelphian monodelphic monodelphous monodermic monodic monodically monodimetric monodist monodize monodomous Monodon monodont Monodonta monodontal monodram monodrama monodramatic monodramatist monodromic monodromy monody monodynamic monodynamism Monoecia monoecian monoecious monoeciously monoeciousness monoecism monoeidic monoestrous monoethanolamine monoethylamine monofilament monofilm monoflagellate monoformin monogamian monogamic monogamist monogamistic monogamous monogamously monogamousness monogamy monoganglionic monogastric monogene Monogenea monogeneity monogeneous monogenesis monogenesist monogenesy monogenetic Monogenetica monogenic monogenism monogenist monogenistic monogenous monogeny monoglot monoglycerid monoglyceride monogoneutic monogonoporic monogonoporous monogony monogram monogrammatic monogrammatical monogrammed monogrammic monograph monographer monographic monographical monographically monographist monography monograptid Monograptidae Monograptus monogynic monogynious monogynist monogynoecial monogynous monogyny monohybrid monohydrate monohydrated monohydric monohydrogen monohydroxy monoicous monoid monoketone monolater monolatrist monolatrous monolatry monolayer monoline monolingual monolinguist monoliteral monolith monolithal monolithic monolobular monolocular monologian monologic monological monologist monologize monologue monologuist monology monomachist monomachy monomania monomaniac monomaniacal monomastigate monomeniscous monomer monomeric monomerous monometallic monometallism monometallist monometer monomethyl monomethylated monomethylic monometric monometrical monomial monomict monomineral monomineralic monomolecular monomolybdate Monomorium monomorphic monomorphism monomorphous Monomya Monomyaria monomyarian mononaphthalene mononch Mononchus mononeural Monongahela mononitrate mononitrated mononitration mononitride mononitrobenzene mononomial mononomian monont mononuclear mononucleated mononucleosis mononychous mononym mononymic mononymization mononymize mononymy monoousian monoousious monoparental monoparesis monoparesthesia monopathic monopathy monopectinate monopersonal monopersulfuric monopersulphuric Monopetalae monopetalous monophagism monophagous monophagy monophase monophasia monophasic monophobia monophone monophonic monophonous monophony monophotal monophote monophthalmic monophthalmus monophthong monophthongal monophthongization monophthongize monophyletic monophyleticism monophylite monophyllous monophyodont monophyodontism Monophysite Monophysitic Monophysitical Monophysitism monopitch monoplacula monoplacular monoplaculate monoplane monoplanist monoplasmatic monoplast monoplastic monoplegia monoplegic Monopneumoa monopneumonian monopneumonous monopode monopodial monopodially monopodic monopodium monopodous monopody monopolar monopolaric monopolarity monopole monopolism monopolist monopolistic monopolistically monopolitical monopolizable monopolization monopolize monopolizer monopolous monopoly monopolylogist monopolylogue monopotassium monoprionid monoprionidian monopsonistic monopsony monopsychism monopteral Monopteridae monopteroid monopteron monopteros monopterous monoptic monoptical monoptote monoptotic Monopylaea Monopylaria monopylean monopyrenous monorail monorailroad monorailway monorchid monorchidism monorchis monorchism monorganic Monorhina monorhinal monorhine monorhyme monorhymed monorhythmic monosaccharide monosaccharose monoschemic monoscope monose monosemic monosepalous monoservice monosilane monosilicate monosilicic monosiphonic monosiphonous monosodium monosomatic monosomatous monosome monosomic monosperm monospermal monospermic monospermous monospermy monospherical monospondylic monosporangium monospore monospored monosporiferous monosporous monostele monostelic monostelous monostely monostich monostichous Monostomata Monostomatidae monostomatous monostome Monostomidae monostomous Monostomum monostromatic monostrophe monostrophic monostrophics monostylous monosubstituted monosubstitution monosulfone monosulfonic monosulphide monosulphone monosulphonic monosyllabic monosyllabical monosyllabically monosyllabism monosyllabize monosyllable monosymmetric monosymmetrical monosymmetrically monosymmetry monosynthetic monotelephone monotelephonic monotellurite Monothalama monothalamian monothalamous monothecal monotheism monotheist monotheistic monotheistical monotheistically Monothelete Monotheletian Monotheletic Monotheletism monothelious Monothelism Monothelitic Monothelitism monothetic monotic monotint Monotocardia monotocardiac monotocardian monotocous monotomous monotone monotonic monotonical monotonically monotonist monotonize monotonous monotonously monotonousness monotony monotremal Monotremata monotremate monotrematous monotreme monotremous monotrichous monotriglyph monotriglyphic Monotrocha monotrochal monotrochian monotrochous Monotropa Monotropaceae monotropaceous monotrophic monotropic Monotropsis monotropy monotypal monotype monotypic monotypical monotypous monoureide monovalence monovalency monovalent monovariant monoverticillate monovoltine monovular monoxenous monoxide monoxime monoxyle monoxylic monoxylon monoxylous Monozoa monozoan monozoic monozygotic Monroeism Monroeist monrolite monseigneur monsieur monsieurship monsignor monsignorial Monsoni monsoon monsoonal monsoonish monsoonishly monster Monstera monsterhood monsterlike monstership monstrance monstrate monstration monstrator monstricide monstriferous monstrification monstrify monstrosity monstrous monstrously monstrousness Mont montage Montagnac Montagnais Montana montana Montanan montane montanic montanin Montanism Montanist Montanistic Montanistical montanite Montanize montant Montargis Montauk montbretia monte montebrasite monteith montem Montenegrin Montepulciano Monterey Montes Montesco Montesinos Montessorian Montessorianism Montezuma montgolfier month monthly monthon Montia monticellite monticle monticoline monticulate monticule Monticulipora Monticuliporidae monticuliporidean monticuliporoid monticulose monticulous monticulus montiform montigeneous montilla montjoy montmartrite Montmorency montmorilonite monton Montrachet montroydite Montu monture Monty Monumbo monument monumental monumentalism monumentality monumentalization monumentalize monumentally monumentary monumentless monumentlike monzodiorite monzogabbro monzonite monzonitic moo Mooachaht mooch moocha moocher moochulka mood mooder moodily moodiness moodish moodishly moodishness moodle moody mooing mool moolet moolings mools moolum moon moonack moonbeam moonbill moonblink mooncalf mooncreeper moondown moondrop mooned mooner moonery mooneye moonface moonfaced moonfall moonfish moonflower moonglade moonglow moonhead moonily mooniness mooning moonish moonite moonja moonjah moonless moonlet moonlight moonlighted moonlighter moonlighting moonlighty moonlike moonlikeness moonlit moonlitten moonman moonpath moonpenny moonproof moonraker moonraking moonrise moonsail moonscape moonseed moonset moonshade moonshine moonshiner moonshining moonshiny moonsick moonsickness moonstone moontide moonwalker moonwalking moonward moonwards moonway moonwort moony moop Moor moor moorage moorball moorband moorberry moorbird moorburn moorburner moorburning Moore moorflower moorfowl mooring Moorish moorish moorishly moorishness moorland moorlander Moorman moorman moorn moorpan moors Moorship moorsman moorstone moortetter moorup moorwort moory moosa moose mooseberry moosebird moosebush moosecall mooseflower moosehood moosemise moosetongue moosewob moosewood moosey moost moot mootable mooter mooth mooting mootman mootstead mootworthy mop Mopan mopane mopboard mope moper moph mophead mopheaded moping mopingly mopish mopishly mopishness mopla mopper moppet moppy mopstick mopsy mopus Moquelumnan moquette Moqui mor mora Moraceae moraceous Moraea morainal moraine morainic moral morale moralism moralist moralistic moralistically morality moralization moralize moralizer moralizingly moralless morally moralness morals Moran morass morassic morassweed morassy morat morate moration moratoria moratorium moratory Moravian Moravianism Moravianized Moravid moravite moray morbid morbidity morbidize morbidly morbidness morbiferal morbiferous morbific morbifical morbifically morbify morbility morbillary morbilli morbilliform morbillous morcellate morcellated morcellation Morchella Morcote mordacious mordaciously mordacity mordancy mordant mordantly Mordella mordellid Mordellidae mordelloid mordenite mordent mordicate mordication mordicative mordore Mordv Mordva Mordvin Mordvinian more moreen morefold moreish morel morella morello morencite moreness morenita morenosite Moreote moreover morepork mores Moresque morfrey morg morga Morgan morgan Morgana morganatic morganatical morganatically morganic morganite morganize morgay morgen morgengift morgenstern morglay morgue moribund moribundity moribundly moric moriche moriform morigerate morigeration morigerous morigerously morigerousness morillon morin Morinaceae Morinda morindin morindone morinel Moringa Moringaceae moringaceous moringad Moringua moringuid Moringuidae moringuoid morion Moriori Moriscan Morisco Morisonian Morisonianism morkin morlop mormaor mormaordom mormaorship mormo Mormon mormon Mormondom Mormoness Mormonism Mormonist Mormonite Mormonweed Mormoops mormyr mormyre mormyrian mormyrid Mormyridae mormyroid Mormyrus morn morne morned morning morningless morningly mornings morningtide morningward mornless mornlike morntime mornward Moro moro moroc Moroccan Morocco morocco morocota morological morologically morologist morology moromancy moron moroncy morong moronic Moronidae moronism moronity moronry Moropus morosaurian morosauroid Morosaurus morose morosely moroseness morosis morosity moroxite morph morphallaxis morphea Morphean morpheme morphemic morphemics morphetic Morpheus morphew morphia morphiate morphic morphically morphinate morphine morphinic morphinism morphinist morphinization morphinize morphinomania morphinomaniac morphiomania morphiomaniac Morpho morphogenesis morphogenetic morphogenic morphogeny morphographer morphographic morphographical morphographist morphography morpholine morphologic morphological morphologically morphologist morphology morphometrical morphometry morphon morphonomic morphonomy morphophonemic morphophonemically morphophonemics morphophyly morphoplasm morphoplasmic morphosis morphotic morphotropic morphotropism morphotropy morphous Morrenian Morrhua morrhuate morrhuine morricer Morris morris Morrisean morrow morrowing morrowless morrowmass morrowspeech morrowtide morsal Morse morse morsel morselization morselize morsing morsure mort mortacious mortal mortalism mortalist mortality mortalize mortally mortalness mortalwise mortar mortarboard mortarize mortarless mortarlike mortarware mortary mortbell mortcloth mortersheen mortgage mortgageable mortgagee mortgagor morth morthwyrtha mortician mortier mortiferous mortiferously mortiferousness mortific mortification mortified mortifiedly mortifiedness mortifier mortify mortifying mortifyingly Mortimer mortise mortiser mortling mortmain mortmainer Morton mortuarian mortuary mortuous morula morular morulation morule moruloid Morus morvin morwong Mosaic mosaic Mosaical mosaical mosaically mosaicism mosaicist Mosaicity Mosaism Mosaist mosaist mosandrite mosasaur Mosasauri Mosasauria mosasaurian mosasaurid Mosasauridae mosasauroid Mosasaurus Mosatenan moschate moschatel moschatelline Moschi Moschidae moschiferous Moschinae moschine Moschus Moscow Mose Moselle Moses mosesite Mosetena mosette mosey Mosgu moskeneer mosker Moslem Moslemah Moslemic Moslemin Moslemism Moslemite Moslemize moslings mosque mosquelet mosquish mosquital Mosquito mosquito mosquitobill mosquitocidal mosquitocide mosquitoey mosquitoish mosquitoproof moss mossback mossberry mossbunker mossed mosser mossery mossful mosshead Mossi mossiness mossless mosslike mosstrooper mosstroopery mosstrooping mosswort mossy mossyback most moste Mosting mostlike mostlings mostly mostness Mosul Mosur mot Motacilla motacillid Motacillidae Motacillinae motacilline motatorious motatory Motazilite mote moted motel moteless moter motet motettist motey moth mothed mother motherdom mothered motherer mothergate motherhood motheriness mothering motherkin motherland motherless motherlessness motherlike motherliness motherling motherly mothership mothersome motherward motherwise motherwort mothery mothless mothlike mothproof mothworm mothy motif motific motile motility motion motionable motional motionless motionlessly motionlessness motitation motivate motivation motivational motive motiveless motivelessly motivelessness motiveness motivity motley motleyness motmot motofacient motograph motographic motomagnetic motoneuron motophone motor motorable motorboat motorboatman motorbus motorcab motorcade motorcar motorcycle motorcyclist motordom motordrome motored motorial motoric motoring motorism motorist motorium motorization motorize motorless motorman motorneer motorphobe motorphobia motorphobiac motorway motory Motozintlec Motozintleca motricity Mott mott motte mottle mottled mottledness mottlement mottler mottling motto mottoed mottoless mottolike mottramite motyka mou moucharaby mouchardism mouche mouchrabieh moud moudie moudieman moudy mouflon Mougeotia Mougeotiaceae mouillation mouille mouillure moujik moul mould moulded moule moulin moulinage moulinet moulleen moulrush mouls moulter mouly mound moundiness moundlet moundwork moundy mount mountable mountably mountain mountained mountaineer mountainet mountainette mountainless mountainlike mountainous mountainously mountainousness mountainside mountaintop mountainward mountainwards mountainy mountant mountebank mountebankery mountebankish mountebankism mountebankly mounted mounter Mountie mounting mountingly mountlet mounture moup mourn mourner mourneress mournful mournfully mournfulness mourning mourningly mournival mournsome mouse mousebane mousebird mousefish mousehawk mousehole mousehound Mouseion mousekin mouselet mouselike mouseproof mouser mousery mouseship mousetail mousetrap mouseweb mousey mousily mousiness mousing mousingly mousle mousmee Mousoni mousquetaire mousse Mousterian moustoc mousy mout moutan mouth mouthable mouthbreeder mouthed mouther mouthful mouthily mouthiness mouthing mouthingly mouthishly mouthless mouthlike mouthpiece mouthroot mouthwash mouthwise mouthy mouton moutonnee mouzah mouzouna movability movable movableness movably movant move moveability moveableness moveably moveless movelessly movelessness movement mover movie moviedom movieize movieland moving movingly movingness mow mowable mowana mowburn mowburnt mowch mowcht mower mowha mowie mowing mowland mown mowra mowrah mowse mowstead mowt mowth moxa moxieberry Moxo moy moyen moyenless moyenne moyite moyle moyo Mozambican mozambique Mozarab Mozarabian Mozarabic Mozartean mozemize mozing mozzetta Mpangwe Mpondo mpret Mr Mrs Mru mu muang mubarat mucago mucaro mucedin mucedinaceous mucedine mucedinous much muchfold muchly muchness mucic mucid mucidness muciferous mucific muciform mucigen mucigenous mucilage mucilaginous mucilaginously mucilaginousness mucin mucinogen mucinoid mucinous muciparous mucivore mucivorous muck muckender Mucker mucker muckerish muckerism mucket muckiness muckite muckle muckluck muckman muckment muckmidden muckna muckrake muckraker mucksweat mucksy muckthrift muckweed muckworm mucky mucluc mucocele mucocellulose mucocellulosic mucocutaneous mucodermal mucofibrous mucoflocculent mucoid mucomembranous muconic mucoprotein mucopurulent mucopus mucor Mucoraceae mucoraceous Mucorales mucorine mucorioid mucormycosis mucorrhea mucosa mucosal mucosanguineous mucose mucoserous mucosity mucosocalcareous mucosogranular mucosopurulent mucososaccharine mucous mucousness mucro mucronate mucronately mucronation mucrones mucroniferous mucroniform mucronulate mucronulatous muculent Mucuna mucus mucusin mud mudar mudbank mudcap mudd mudde mudden muddify muddily muddiness mudding muddish muddle muddlebrained muddledom muddlehead muddleheaded muddleheadedness muddlement muddleproof muddler muddlesome muddlingly muddy muddybrained muddybreast muddyheaded mudee Mudejar mudfish mudflow mudguard mudhead mudhole mudhopper mudir mudiria mudland mudlark mudlarker mudless mudproof mudra mudsill mudskipper mudslinger mudslinging mudspate mudstain mudstone mudsucker mudtrack mudweed mudwort Muehlenbeckia muermo muezzin muff muffed muffet muffetee muffin muffineer muffish muffishness muffle muffled muffleman muffler mufflin muffy mufti mufty mug muga mugearite mugful mugg mugger mugget muggily mugginess muggins muggish muggles Muggletonian Muggletonianism muggy mughouse mugience mugiency mugient Mugil Mugilidae mugiliform mugiloid mugweed mugwort mugwump mugwumpery mugwumpian mugwumpism muhammadi Muharram Muhlenbergia muid Muilla muir muirburn muircock muirfowl muishond muist mujtahid Mukden mukluk Mukri muktar muktatma mukti mulaprakriti mulatta mulatto mulattoism mulattress mulberry mulch mulcher Mulciber Mulcibirian mulct mulctable mulctary mulctation mulctative mulctatory mulctuary mulder mule muleback mulefoot mulefooted muleman muleta muleteer muletress muletta mulewort muley mulga muliebral muliebria muliebrile muliebrity muliebrous mulier mulierine mulierose mulierosity mulish mulishly mulishness mulism mulita mulk mull mulla mullah mullar mullein mullenize muller Mullerian mullet mulletry mullets mulley mullid Mullidae mulligan mulligatawny mulligrubs mullion mullite mullock mullocker mullocky mulloid mulloway mulmul mulse mulsify mult multangular multangularly multangularness multangulous multangulum Multani multanimous multarticulate multeity multiangular multiareolate multiarticular multiarticulate multiarticulated multiaxial multiblade multibladed multibranched multibranchiate multibreak multicamerate multicapitate multicapsular multicarinate multicarinated multicellular multicentral multicentric multicharge multichord multichrome multiciliate multiciliated multicipital multicircuit multicoccous multicoil multicolor multicolored multicolorous multicomponent multiconductor multiconstant multicore multicorneal multicostate multicourse multicrystalline multicuspid multicuspidate multicycle multicylinder multicylindered multidentate multidenticulate multidenticulated multidigitate multidimensional multidirectional multidisperse multiengine multiengined multiexhaust multifaced multifaceted multifactorial multifamilial multifarious multifariously multifariousness multiferous multifetation multifibered multifid multifidly multifidous multifidus multifilament multifistular multiflagellate multiflagellated multiflash multiflorous multiflow multiflue multifocal multifoil multifoiled multifold multifoliate multifoliolate multiform multiformed multiformity multifurcate multiganglionic multigap multigranulate multigranulated Multigraph multigraph multigrapher multiguttulate multigyrate multihead multihearth multihued multijet multijugate multijugous multilaciniate multilamellar multilamellate multilamellous multilaminar multilaminate multilaminated multilateral multilaterally multilighted multilineal multilinear multilingual multilinguist multilirate multiliteral multilobar multilobate multilobe multilobed multilobular multilobulate multilobulated multilocation multilocular multiloculate multiloculated multiloquence multiloquent multiloquious multiloquous multiloquy multimacular multimammate multimarble multimascular multimedial multimetalic multimetallism multimetallist multimillion multimillionaire multimodal multimodality multimolecular multimotor multimotored multinational multinervate multinervose multinodal multinodate multinodous multinodular multinomial multinominal multinominous multinuclear multinucleate multinucleated multinucleolar multinucleolate multinucleolated multiovular multiovulate multipara multiparient multiparity multiparous multipartisan multipartite multiped multiperforate multiperforated multipersonal multiphase multiphaser multiphotography multipinnate multiplane multiple multiplepoinding multiplet multiplex multipliable multipliableness multiplicability multiplicable multiplicand multiplicate multiplication multiplicational multiplicative multiplicatively multiplicator multiplicity multiplier multiply multiplying multipointed multipolar multipole multiported multipotent multipresence multipresent multiradial multiradiate multiradiated multiradicate multiradicular multiramified multiramose multiramous multirate multireflex multirooted multirotation multirotatory multisaccate multisacculate multisacculated multiscience multiseated multisect multisector multisegmental multisegmentate multisegmented multisensual multiseptate multiserial multiserially multiseriate multishot multisiliquous multisonous multispeed multispermous multispicular multispiculate multispindle multispinous multispiral multispired multistage multistaminate multistoried multistory multistratified multistratous multistriate multisulcate multisulcated multisyllabic multisyllability multisyllable multitarian multitentaculate multitheism multithreaded multititular multitoed multitoned multitube Multituberculata multituberculate multituberculated multituberculism multituberculy multitubular multitude multitudinal multitudinary multitudinism multitudinist multitudinistic multitudinosity multitudinous multitudinously multitudinousness multiturn multivagant multivalence multivalency multivalent multivalve multivalved multivalvular multivane multivariant multivarious multiversant multiverse multivibrator multivincular multivious multivocal multivocalness multivoiced multivolent multivoltine multivolumed multivorous multocular multum multungulate multure multurer mum mumble mumblebee mumblement mumbler mumbling mumblingly mummer mummery mummichog mummick mummied mummification mummiform mummify mumming mummy mummydom mummyhood mummylike mumness mump mumper mumphead mumpish mumpishly mumpishness mumps mumpsimus mumruffin mun Munandi Muncerian munch Munchausenism Munchausenize muncheel muncher munchet mund Munda mundane mundanely mundaneness mundanism mundanity Mundari mundatory mundic mundificant mundification mundifier mundify mundil mundivagant mundle mung munga munge mungey mungo mungofa munguba mungy Munia Munich Munichism municipal municipalism municipalist municipality municipalization municipalize municipalizer municipally municipium munific munificence munificency munificent munificently munificentness muniment munition munitionary munitioneer munitioner munitions munity munj munjeet munjistin munnion Munnopsidae Munnopsis Munsee munshi munt Muntiacus muntin Muntingia muntjac Munychia Munychian Munychion Muong Muphrid Mura mura Muradiyah Muraena Muraenidae muraenoid murage mural muraled muralist murally Muran Muranese murasakite Murat Muratorian murchy murder murderer murderess murdering murderingly murderish murderment murderous murderously murderousness murdrum mure murenger murex murexan murexide murga murgavi murgeon muriate muriated muriatic muricate muricid Muricidae muriciform muricine muricoid muriculate murid Muridae muridism Muriel muriform muriformly Murillo Murinae murine murinus muriti murium murk murkily murkiness murkish murkly murkness murksome murky murlin murly Murmi murmur murmuration murmurator murmurer murmuring murmuringly murmurish murmurless murmurlessly murmurous murmurously muromontite Murph murphy murra murrain Murray Murraya murre murrelet murrey murrhine murrina murrnong murshid Murthy murumuru Murut muruxi murva murza Murzim Mus Musa Musaceae musaceous Musaeus musal Musales Musalmani musang musar Musca muscade muscadel muscadine Muscadinia muscardine Muscardinidae Muscardinus Muscari muscariform muscarine muscat muscatel muscatorium Musci Muscicapa Muscicapidae muscicapine muscicide muscicole muscicoline muscicolous muscid Muscidae musciform Muscinae muscle muscled muscleless musclelike muscling muscly Muscogee muscoid Muscoidea muscologic muscological muscologist muscology muscone muscose muscoseness muscosity muscot muscovadite muscovado Muscovi Muscovite muscovite Muscovitic muscovitization muscovitize muscovy muscular muscularity muscularize muscularly musculation musculature muscule musculin musculoarterial musculocellular musculocutaneous musculodermic musculoelastic musculofibrous musculointestinal musculoligamentous musculomembranous musculopallial musculophrenic musculospinal musculospiral musculotegumentary musculotendinous Muse muse mused museful musefully museist museless muselike museographist museography museologist museology muser musery musette museum museumize Musgu mush musha mushaa Mushabbihite mushed musher mushhead mushheaded mushheadedness mushily mushiness mushla mushmelon mushrebiyeh mushroom mushroomer mushroomic mushroomlike mushroomy mushru mushy music musical musicale musicality musicalization musicalize musically musicalness musicate musician musiciana musicianer musicianly musicianship musicker musicless musiclike musicmonger musico musicoartistic musicodramatic musicofanatic musicographer musicography musicological musicologist musicologue musicology musicomania musicomechanical musicophilosophical musicophobia musicophysical musicopoetic musicotherapy musicproof musie musily musimon musing musingly musk muskat muskeg muskeggy muskellunge musket musketade musketeer musketlike musketoon musketproof musketry muskflower Muskhogean muskie muskiness muskish musklike muskmelon Muskogee muskrat muskroot Muskwaki muskwood musky muslin muslined muslinet musnud Musophaga Musophagi Musophagidae musophagine musquash musquashroot musquashweed musquaspen musquaw musrol muss mussable mussably Mussaenda mussal mussalchee mussel musseled musseler mussily mussiness mussitate mussitation mussuk Mussulman Mussulmanic Mussulmanish Mussulmanism Mussulwoman mussurana mussy must mustache mustached mustachial mustachio mustachioed mustafina Mustahfiz mustang mustanger mustard mustarder mustee Mustela mustelid Mustelidae musteline mustelinous musteloid Mustelus muster musterable musterdevillers musterer mustermaster mustify mustily mustiness mustnt musty muta Mutabilia mutability mutable mutableness mutably mutafacient mutage mutagenic mutant mutarotate mutarotation mutase mutate mutation mutational mutationally mutationism mutationist mutative mutatory mutawalli Mutazala mutch mute mutedly mutely muteness Muter mutesarif mutescence mutessarifat muth muthmannite muthmassel mutic muticous mutilate mutilation mutilative mutilator mutilatory Mutilla mutillid Mutillidae mutilous mutineer mutinous mutinously mutinousness mutiny Mutisia Mutisiaceae mutism mutist mutistic mutive mutivity mutoscope mutoscopic mutsje mutsuddy mutt mutter mutterer muttering mutteringly mutton muttonbird muttonchop muttonfish muttonhead muttonheaded muttonhood muttonmonger muttonwood muttony mutual mutualism mutualist mutualistic mutuality mutualization mutualize mutually mutualness mutuary mutuatitious mutulary mutule mutuum mux Muysca muyusa muzhik Muzo muzz muzzily muzziness muzzle muzzler muzzlewood muzzy Mwa my Mya Myacea myal myalgia myalgic myalism myall Myaria myarian myasthenia myasthenic myatonia myatonic myatony myatrophy mycele mycelia mycelial mycelian mycelioid mycelium myceloid Mycenaean Mycetes mycetism mycetocyte mycetogenesis mycetogenetic mycetogenic mycetogenous mycetoid mycetological mycetology mycetoma mycetomatous Mycetophagidae mycetophagous mycetophilid Mycetophilidae mycetous Mycetozoa mycetozoan mycetozoon Mycobacteria Mycobacteriaceae Mycobacterium mycocecidium mycocyte mycoderm mycoderma mycodermatoid mycodermatous mycodermic mycodermitis mycodesmoid mycodomatium mycogastritis Mycogone mycohaemia mycohemia mycoid mycologic mycological mycologically mycologist mycologize mycology mycomycete Mycomycetes mycomycetous mycomyringitis mycophagist mycophagous mycophagy mycophyte Mycoplana mycoplasm mycoplasmic mycoprotein mycorhiza mycorhizal mycorrhizal mycose mycosin mycosis mycosozin Mycosphaerella Mycosphaerellaceae mycosterol mycosymbiosis mycotic mycotrophic Mycteria mycteric mycterism Myctodera myctophid Myctophidae Myctophum Mydaidae mydaleine mydatoxine Mydaus mydine mydriasine mydriasis mydriatic mydriatine myectomize myectomy myectopia myectopy myelalgia myelapoplexy myelasthenia myelatrophy myelauxe myelemia myelencephalic myelencephalon myelencephalous myelic myelin myelinate myelinated myelination myelinic myelinization myelinogenesis myelinogenetic myelinogeny myelitic myelitis myeloblast myeloblastic myelobrachium myelocele myelocerebellar myelocoele myelocyst myelocystic myelocystocele myelocyte myelocythaemia myelocythemia myelocytic myelocytosis myelodiastasis myeloencephalitis myeloganglitis myelogenesis myelogenetic myelogenous myelogonium myeloic myeloid myelolymphangioma myelolymphocyte myeloma myelomalacia myelomatoid myelomatosis myelomenia myelomeningitis myelomeningocele myelomere myelon myelonal myeloneuritis myelonic myeloparalysis myelopathic myelopathy myelopetal myelophthisis myeloplast myeloplastic myeloplax myeloplegia myelopoiesis myelopoietic myelorrhagia myelorrhaphy myelosarcoma myelosclerosis myelospasm myelospongium myelosyphilis myelosyphilosis myelosyringosis myelotherapy Myelozoa myelozoan myentasis myenteric myenteron myesthesia mygale mygalid mygaloid Myiarchus myiasis myiferous myiodesopsia myiosis myitis mykiss myliobatid Myliobatidae myliobatine myliobatoid Mylodon mylodont Mylodontidae mylohyoid mylohyoidean mylonite mylonitic Mymar mymarid Mymaridae myna Mynheer mynpacht mynpachtbrief myoalbumin myoalbumose myoatrophy myoblast myoblastic myocardiac myocardial myocardiogram myocardiograph myocarditic myocarditis myocardium myocele myocellulitis myoclonic myoclonus myocoele myocoelom myocolpitis myocomma myocyte myodegeneration Myodes myodiastasis myodynamia myodynamic myodynamics myodynamiometer myodynamometer myoedema myoelectric myoendocarditis myoepicardial myoepithelial myofibril myofibroma myogen myogenesis myogenetic myogenic myogenous myoglobin myoglobulin myogram myograph myographer myographic myographical myographist myography myohematin myoid myoidema myokinesis myolemma myolipoma myoliposis myologic myological myologist myology myolysis myoma myomalacia myomancy myomantic myomatous myomectomy myomelanosis myomere myometritis myometrium myomohysterectomy myomorph Myomorpha myomorphic myomotomy myoneme myoneural myoneuralgia myoneurasthenia myoneure myoneuroma myoneurosis myonosus myopachynsis myoparalysis myoparesis myopathia myopathic myopathy myope myoperitonitis myophan myophore myophorous myophysical myophysics myopia myopic myopical myopically myoplasm myoplastic myoplasty myopolar Myoporaceae myoporaceous myoporad Myoporum myoproteid myoprotein myoproteose myops myopy myorrhaphy myorrhexis myosalpingitis myosarcoma myosarcomatous myosclerosis myoscope myoseptum myosin myosinogen myosinose myosis myositic myositis myosote Myosotis myospasm myospasmia Myosurus myosuture myosynizesis myotacismus Myotalpa Myotalpinae myotasis myotenotomy myothermic myotic myotome myotomic myotomy myotonia myotonic myotonus myotony myotrophy myowun Myoxidae myoxine Myoxus Myra myrabalanus myrabolam myrcene Myrcia myrcia myriacanthous myriacoulomb myriad myriaded myriadfold myriadly myriadth myriagram myriagramme myrialiter myrialitre myriameter myriametre Myrianida myriapod Myriapoda myriapodan myriapodous myriarch myriarchy myriare Myrica myrica Myricaceae myricaceous Myricales myricetin myricin Myrick myricyl myricylic Myrientomata myringa myringectomy myringitis myringodectomy myringodermatitis myringomycosis myringoplasty myringotome myringotomy myriological myriologist myriologue myriophyllite myriophyllous Myriophyllum Myriopoda myriopodous myriorama myrioscope myriosporous myriotheism Myriotrichia Myriotrichiaceae myriotrichiaceous myristate myristic Myristica myristica Myristicaceae myristicaceous Myristicivora myristicivorous myristin myristone Myrmecia Myrmecobiinae myrmecobine Myrmecobius myrmecochorous myrmecochory myrmecoid myrmecoidy myrmecological myrmecologist myrmecology Myrmecophaga Myrmecophagidae myrmecophagine myrmecophagoid myrmecophagous myrmecophile myrmecophilism myrmecophilous myrmecophily myrmecophobic myrmecophyte myrmecophytic myrmekite Myrmeleon Myrmeleonidae Myrmeleontidae Myrmica myrmicid Myrmicidae myrmicine myrmicoid Myrmidon Myrmidonian myrmotherine myrobalan Myron myron myronate myronic myrosin myrosinase Myrothamnaceae myrothamnaceous Myrothamnus Myroxylon myrrh myrrhed myrrhic myrrhine Myrrhis myrrhol myrrhophore myrrhy Myrsinaceae myrsinaceous myrsinad Myrsiphyllum Myrtaceae myrtaceous myrtal Myrtales myrtiform Myrtilus myrtle myrtleberry myrtlelike myrtol Myrtus mysel myself mysell Mysian mysid Mysidacea Mysidae mysidean Mysis mysogynism mysoid mysophobia Mysore mysosophist mysost myst mystacial Mystacocete Mystacoceti mystagogic mystagogical mystagogically mystagogue mystagogy mystax mysterial mysteriarch mysteriosophic mysteriosophy mysterious mysteriously mysteriousness mysterize mystery mystes mystic mystical mysticality mystically mysticalness Mysticete mysticete Mysticeti mysticetous mysticism mysticity mysticize mysticly mystific mystifically mystification mystificator mystificatory mystifiedly mystifier mystify mystifyingly mytacism myth mythical mythicalism mythicality mythically mythicalness mythicism mythicist mythicize mythicizer mythification mythify mythism mythist mythize mythland mythmaker mythmaking mythoclast mythoclastic mythogenesis mythogonic mythogony mythographer mythographist mythography mythogreen mythoheroic mythohistoric mythologema mythologer mythological mythologically mythologist mythologize mythologizer mythologue mythology mythomania mythomaniac mythometer mythonomy mythopastoral mythopoeic mythopoeism mythopoeist mythopoem mythopoesis mythopoesy mythopoet mythopoetic mythopoetize mythopoetry mythos mythus Mytilacea mytilacean mytilaceous Mytiliaspis mytilid Mytilidae mytiliform mytiloid mytilotoxine Mytilus myxa myxadenitis myxadenoma myxaemia myxamoeba myxangitis myxasthenia myxedema myxedematoid myxedematous myxedemic myxemia Myxine Myxinidae myxinoid Myxinoidei myxo Myxobacteria Myxobacteriaceae myxobacteriaceous Myxobacteriales myxoblastoma myxochondroma myxochondrosarcoma Myxococcus myxocystoma myxocyte myxoenchondroma myxofibroma myxofibrosarcoma myxoflagellate myxogaster Myxogasteres Myxogastrales Myxogastres myxogastric myxogastrous myxoglioma myxoid myxoinoma myxolipoma myxoma myxomatosis myxomatous Myxomycetales myxomycete Myxomycetes myxomycetous myxomyoma myxoneuroma myxopapilloma Myxophyceae myxophycean Myxophyta myxopod Myxopoda myxopodan myxopodium myxopodous myxopoiesis myxorrhea myxosarcoma Myxospongiae myxospongian Myxospongida myxospore Myxosporidia myxosporidian Myxosporidiida Myxosporium myxosporous Myxothallophyta myxotheca Myzodendraceae myzodendraceous Myzodendron Myzomyia myzont Myzontes Myzostoma Myzostomata myzostomatous myzostome myzostomid Myzostomida Myzostomidae myzostomidan myzostomous N n na naa naam Naaman Naassenes nab nabak Nabal Nabalism Nabalite Nabalitic Nabaloi Nabalus Nabataean Nabatean Nabathaean Nabathean Nabathite nabber Nabby nabk nabla nable nabob nabobery nabobess nabobical nabobish nabobishly nabobism nabobry nabobship Nabothian nabs Nabu nacarat nacarine nace nacelle nach nachani Nachitoch Nachitoches Nachschlag Nacionalista nacket nacre nacred nacreous nacrine nacrite nacrous nacry nadder Nadeem nadir nadiral nadorite nae naebody naegate naegates nael Naemorhedinae naemorhedine Naemorhedus naether naething nag Naga naga nagaika nagana nagara Nagari nagatelite nagger naggin nagging naggingly naggingness naggish naggle naggly naggy naght nagkassar nagmaal nagman nagnag nagnail nagor nagsman nagster nagual nagualism nagualist nagyagite Nahanarvali Nahane Nahani Naharvali Nahor Nahua Nahuan Nahuatl Nahuatlac Nahuatlan Nahuatleca Nahuatlecan Nahum naiad Naiadaceae naiadaceous Naiadales Naiades naiant Naias naid naif naifly naig naigie naik nail nailbin nailbrush nailer naileress nailery nailhead nailing nailless naillike nailprint nailproof nailrod nailshop nailsick nailsmith nailwort naily Naim nain nainsel nainsook naio naipkin Nair nairy nais naish naissance naissant naither naive naively naiveness naivete naivety Naja nak nake naked nakedish nakedize nakedly nakedness nakedweed nakedwood naker nakhlite nakhod nakhoda Nakir nako Nakomgilisala nakong nakoo Nakula Nalita nallah nam Nama namability namable Namaqua namaqua Namaquan namaycush namaz namazlik Nambe namda name nameability nameable nameboard nameless namelessly namelessness nameling namely namer namesake naming nammad Nan nan Nana nana Nanaimo nanawood Nance Nancy nancy Nanda Nandi nandi Nandina nandine nandow nandu nane nanes nanga nanism nanization nankeen Nankin nankin Nanking Nankingese nannander nannandrium nannandrous Nannette nannoplankton Nanny nanny nannyberry nannybush nanocephalia nanocephalic nanocephalism nanocephalous nanocephalus nanocephaly nanoid nanomelia nanomelous nanomelus nanosoma nanosomia nanosomus nanpie nant Nanticoke nantle nantokite Nantz naological naology naometry Naomi Naos naos Naosaurus Naoto nap napa Napaea Napaean napal napalm nape napead napecrest napellus naperer napery naphtha naphthacene naphthalate naphthalene naphthaleneacetic naphthalenesulphonic naphthalenic naphthalenoid naphthalic naphthalidine naphthalin naphthaline naphthalization naphthalize naphthalol naphthamine naphthanthracene naphthene naphthenic naphthinduline naphthionate naphtho naphthoic naphthol naphtholate naphtholize naphtholsulphonate naphtholsulphonic naphthoquinone naphthoresorcinol naphthosalol naphthous naphthoxide naphthyl naphthylamine naphthylaminesulphonic naphthylene naphthylic naphtol Napierian napiform napkin napkining napless naplessness Napoleon napoleon Napoleonana Napoleonic Napoleonically Napoleonism Napoleonist Napoleonistic napoleonite Napoleonize napoo nappe napped napper nappiness napping nappishness nappy naprapath naprapathy napron napthionic napu nar Narcaciontes Narcaciontidae narceine narcism Narciss Narcissan narcissi Narcissine narcissism narcissist narcissistic Narcissus narcist narcistic narcoanalysis narcoanesthesia Narcobatidae Narcobatoidea Narcobatus narcohypnia narcohypnosis narcolepsy narcoleptic narcoma narcomania narcomaniac narcomaniacal narcomatous Narcomedusae narcomedusan narcose narcosis narcostimulant narcosynthesis narcotherapy narcotia narcotic narcotical narcotically narcoticalness narcoticism narcoticness narcotina narcotine narcotinic narcotism narcotist narcotization narcotize narcous nard nardine nardoo Nardus Naren Narendra nares Naresh narghile nargil narial naric narica naricorn nariform narine naringenin naringin nark narky narr narra Narraganset narras narratable narrate narrater narration narrational narrative narratively narrator narratory narratress narratrix narrawood narrow narrower narrowhearted narrowheartedness narrowingness narrowish narrowly narrowness narrowy narsarsukite narsinga narthecal Narthecium narthex narwhal narwhalian nary nasab nasal Nasalis nasalis nasalism nasality nasalization nasalize nasally nasalward nasalwards nasard Nascan Nascapi nascence nascency nascent nasch naseberry nasethmoid nash nashgab nashgob Nashim Nashira Nashua nasi nasial nasicorn Nasicornia nasicornous Nasiei nasiform nasilabial nasillate nasillation nasioalveolar nasiobregmatic nasioinial nasiomental nasion nasitis Naskhi nasoalveola nasoantral nasobasilar nasobronchial nasobuccal nasoccipital nasociliary nasoethmoidal nasofrontal nasolabial nasolachrymal nasological nasologist nasology nasomalar nasomaxillary nasonite nasoorbital nasopalatal nasopalatine nasopharyngeal nasopharyngitis nasopharynx nasoprognathic nasoprognathism nasorostral nasoscope nasoseptal nasosinuitis nasosinusitis nasosubnasal nasoturbinal nasrol Nassa Nassau Nassellaria nassellarian Nassidae nassology nast nastaliq nastic nastika nastily nastiness nasturtion nasturtium nasty Nasua nasus nasute nasuteness nasutiform nasutus nat natability nataka Natal natal Natalia Natalian Natalie natality nataloin natals natant natantly Nataraja natation natational natator natatorial natatorious natatorium natatory natch natchbone Natchez Natchezan Natchitoches natchnee Nate nates Nathan Nathanael Nathaniel nathe nather nathless Natica Naticidae naticiform naticine Natick naticoid natiform natimortality nation national nationalism nationalist nationalistic nationalistically nationality nationalization nationalize nationalizer nationally nationalness nationalty nationhood nationless nationwide native natively nativeness nativism nativist nativistic nativity natr Natraj Natricinae natricine natrium Natrix natrochalcite natrojarosite natrolite natron Natt natter nattered natteredness natterjack nattily nattiness nattle natty natuary natural naturalesque naturalism naturalist naturalistic naturalistically naturality naturalization naturalize naturalizer naturally naturalness nature naturecraft naturelike naturing naturism naturist naturistic naturistically naturize naturopath naturopathic naturopathist naturopathy naucrar naucrary naufragous nauger naught naughtily naughtiness naughty naujaite naumachia naumachy naumannite Naumburgia naumk naumkeag naumkeager naunt nauntle naupathia nauplial naupliiform nauplioid nauplius nauropometer nauscopy nausea nauseant nauseaproof nauseate nauseatingly nauseation nauseous nauseously nauseousness Nauset naut nautch nauther nautic nautical nauticality nautically nautics nautiform Nautilacea nautilacean nautilicone nautiliform nautilite nautiloid Nautiloidea nautiloidean nautilus Navaho Navajo naval navalese navalism navalist navalistic navalistically navally navar navarch navarchy Navarrese Navarrian nave navel naveled navellike navelwort navet navette navew navicella navicert navicula Naviculaceae naviculaeform navicular naviculare naviculoid naviform navigability navigable navigableness navigably navigant navigate navigation navigational navigator navigerous navipendular navipendulum navite navvy navy naw nawab nawabship nawt nay Nayar Nayarit Nayarita nayaur naysay naysayer nayward nayword Nazarate Nazarean Nazarene Nazarenism Nazarite Nazariteship Nazaritic Nazaritish Nazaritism naze Nazerini Nazi Nazify Naziism nazim nazir Nazirate Nazirite Naziritic Nazism ne nea Neal neal neallotype Neanderthal Neanderthaler Neanderthaloid neanic neanthropic neap neaped Neapolitan nearable nearabout nearabouts nearaivays nearaway nearby Nearctic Nearctica nearest nearish nearly nearmost nearness nearsighted nearsightedly nearsightedness nearthrosis neat neaten neath neatherd neatherdess neathmost neatify neatly neatness neb neback Nebaioth Nebalia Nebaliacea nebalian Nebaliidae nebalioid nebbed nebbuck nebbuk nebby nebel nebelist nebenkern Nebiim Nebraskan nebris nebula nebulae nebular nebularization nebularize nebulated nebulation nebule nebulescent nebuliferous nebulite nebulium nebulization nebulize nebulizer nebulose nebulosity nebulous nebulously nebulousness Necator necessar necessarian necessarianism necessarily necessariness necessary necessism necessist necessitarian necessitarianism necessitate necessitatedly necessitatingly necessitation necessitative necessitous necessitously necessitousness necessitude necessity neck neckar neckatee neckband neckcloth necked necker neckercher neckerchief neckful neckguard necking neckinger necklace necklaced necklaceweed neckless necklet necklike neckline neckmold neckpiece neckstock necktie necktieless neckward neckwear neckweed neckyoke necrectomy necremia necrobacillary necrobacillosis necrobiosis necrobiotic necrogenic necrogenous necrographer necrolatry necrologic necrological necrologically necrologist necrologue necrology necromancer necromancing necromancy necromantic necromantically necromorphous necronite necropathy Necrophaga necrophagan necrophagous necrophile necrophilia necrophilic necrophilism necrophilistic necrophilous necrophily necrophobia necrophobic Necrophorus necropoleis necropoles necropolis necropolitan necropsy necroscopic necroscopical necroscopy necrose necrosis necrotic necrotization necrotize necrotomic necrotomist necrotomy necrotype necrotypic Nectandra nectar nectareal nectarean nectared nectareous nectareously nectareousness nectarial nectarian nectaried nectariferous nectarine Nectarinia Nectariniidae nectarious nectarium nectarivorous nectarize nectarlike nectarous nectary nectiferous nectocalycine nectocalyx Nectonema nectophore nectopod Nectria nectriaceous Nectrioidaceae Necturidae Necturus Ned nedder neddy Nederlands nee neebor neebour need needer needfire needful needfully needfulness needgates needham needily neediness needing needle needlebill needlebook needlebush needlecase needled needlefish needleful needlelike needlemaker needlemaking needleman needlemonger needleproof needler needles needless needlessly needlessness needlestone needlewoman needlewood needlework needleworked needleworker needling needly needments needs needsome needy neeger neeld neele neelghan neem neencephalic neencephalon Neengatu neep neepour neer neese neet neetup neeze nef nefandous nefandousness nefarious nefariously nefariousness nefast neffy neftgil negate negatedness negation negationalist negationist negative negatively negativeness negativer negativism negativist negativistic negativity negator negatory negatron neger neginoth neglect neglectable neglectedly neglectedness neglecter neglectful neglectfully neglectfulness neglectingly neglection neglective neglectively neglector neglectproof negligee negligence negligency negligent negligently negligibility negligible negligibleness negligibly negotiability negotiable negotiant negotiate negotiation negotiator negotiatory negotiatress negotiatrix Negress negrillo negrine Negritian Negritic Negritize Negrito Negritoid Negro negro negrodom Negrofy negrohead negrohood Negroid Negroidal negroish Negroism Negroization Negroize negrolike Negroloid Negrophil Negrophile Negrophilism Negrophilist Negrophobe Negrophobia Negrophobiac Negrophobist Negrotic Negundo Negus negus Nehantic Nehemiah nehiloth nei neif neigh neighbor neighbored neighborer neighboress neighborhood neighboring neighborless neighborlike neighborliness neighborly neighborship neighborstained neighbourless neighbourlike neighbourship neigher Neil Neillia neiper Neisseria Neisserieae neist neither Nejd Nejdi Nekkar nekton nektonic Nelken Nell Nellie Nelly nelson nelsonite nelumbian Nelumbium Nelumbo Nelumbonaceae nema nemaline Nemalion Nemalionaceae Nemalionales nemalite Nemastomaceae Nematelmia nematelminth Nematelminthes nemathece nemathecial nemathecium Nemathelmia nemathelminth Nemathelminthes nematic nematoblast nematoblastic Nematocera nematoceran nematocerous nematocide nematocyst nematocystic Nematoda nematode nematodiasis nematogene nematogenic nematogenous nematognath Nematognathi nematognathous nematogone nematogonous nematoid Nematoidea nematoidean nematologist nematology Nematomorpha nematophyton Nematospora nematozooid Nembutal Nemean Nemertea nemertean Nemertina nemertine Nemertinea nemertinean Nemertini nemertoid nemeses Nemesia nemesic Nemesis Nemichthyidae Nemichthys Nemocera nemoceran nemocerous Nemopanthus Nemophila nemophilist nemophilous nemophily nemoral Nemorensian nemoricole Nengahiba nenta nenuphar neo neoacademic neoanthropic Neoarctic neoarsphenamine Neobalaena Neobeckia neoblastic neobotanist neobotany Neocene Neoceratodus neocerotic neoclassic neoclassicism neoclassicist Neocomian neocosmic neocracy neocriticism neocyanine neocyte neocytosis neodamode neodidymium neodymium Neofabraea neofetal neofetus Neofiber neoformation neoformative Neogaea Neogaean neogamous neogamy Neogene neogenesis neogenetic Neognathae neognathic neognathous neogrammarian neogrammatical neographic neohexane Neohipparion neoholmia neoholmium neoimpressionism neoimpressionist neolalia neolater neolatry neolith neolithic neologian neologianism neologic neological neologically neologism neologist neologistic neologistical neologization neologize neology neomedievalism neomenia neomenian Neomeniidae neomiracle neomodal neomorph Neomorpha neomorphic neomorphism Neomylodon neon neonatal neonate neonatus neonomian neonomianism neontology neonychium neopagan neopaganism neopaganize Neopaleozoic neopallial neopallium neoparaffin neophilism neophilological neophilologist neophobia neophobic neophrastic Neophron neophyte neophytic neophytish neophytism Neopieris neoplasia neoplasm neoplasma neoplasmata neoplastic neoplasticism neoplasty Neoplatonic Neoplatonician Neoplatonism Neoplatonist neoprene neorama neorealism Neornithes neornithic Neosalvarsan Neosorex Neosporidia neossin neossology neossoptile neostriatum neostyle neoteinia neoteinic neotenia neotenic neoteny neoteric neoterically neoterism neoterist neoteristic neoterize neothalamus Neotoma Neotragus Neotremata Neotropic Neotropical neotype neovitalism neovolcanic Neowashingtonia neoytterbium neoza Neozoic Nep nep Nepa Nepal Nepalese Nepali Nepenthaceae nepenthaceous nepenthe nepenthean Nepenthes nepenthes neper Neperian Nepeta nephalism nephalist Nephele nephele nepheligenous nepheline nephelinic nephelinite nephelinitic nephelinitoid nephelite Nephelium nephelognosy nepheloid nephelometer nephelometric nephelometrical nephelometrically nephelometry nephelorometer nepheloscope nephesh nephew nephewship Nephila Nephilinae Nephite nephogram nephograph nephological nephologist nephology nephoscope nephradenoma nephralgia nephralgic nephrapostasis nephratonia nephrauxe nephrectasia nephrectasis nephrectomize nephrectomy nephrelcosis nephremia nephremphraxis nephria nephric nephridia nephridial nephridiopore nephridium nephrism nephrite nephritic nephritical nephritis nephroabdominal nephrocardiac nephrocele nephrocoele nephrocolic nephrocolopexy nephrocoloptosis nephrocystitis nephrocystosis nephrocyte nephrodinic Nephrodium nephroerysipelas nephrogastric nephrogenetic nephrogenic nephrogenous nephrogonaduct nephrohydrosis nephrohypertrophy nephroid Nephrolepis nephrolith nephrolithic nephrolithotomy nephrologist nephrology nephrolysin nephrolysis nephrolytic nephromalacia nephromegaly nephromere nephron nephroncus nephroparalysis nephropathic nephropathy nephropexy nephrophthisis nephropore Nephrops Nephropsidae nephroptosia nephroptosis nephropyelitis nephropyeloplasty nephropyosis nephrorrhagia nephrorrhaphy nephros nephrosclerosis nephrosis nephrostoma nephrostome nephrostomial nephrostomous nephrostomy nephrotome nephrotomize nephrotomy nephrotoxic nephrotoxicity nephrotoxin nephrotuberculosis nephrotyphoid nephrotyphus nephrozymosis Nepidae nepionic nepman nepotal nepote nepotic nepotious nepotism nepotist nepotistical nepouite Neptune Neptunean Neptunian neptunism neptunist neptunium Nereid Nereidae nereidiform Nereidiformia Nereis nereite Nereocystis Neri Nerine nerine Nerita neritic Neritidae Neritina neritoid Nerium Neroic Neronian Neronic Neronize nerterology Nerthridae Nerthrus nerval nervate nervation nervature nerve nerveless nervelessly nervelessness nervelet nerveproof nerver nerveroot nervid nerviduct Nervii nervily nervimotion nervimotor nervimuscular nervine nerviness nerving nervish nervism nervomuscular nervosanguineous nervose nervosism nervosity nervous nervously nervousness nervular nervule nervulet nervulose nervuration nervure nervy nescience nescient nese nesh neshly neshness Nesiot nesiote Neskhi Neslia Nesogaea Nesogaean Nesokia Nesonetta Nesotragus Nespelim nesquehonite ness nesslerization Nesslerize nesslerize nest nestable nestage nester nestful nestiatria nestitherapy nestle nestler nestlike nestling Nestor Nestorian Nestorianism Nestorianize Nestorianizer nestorine nesty Net net netball netbraider netbush netcha Netchilik nete neter netful neth netheist nether Netherlander Netherlandian Netherlandic Netherlandish nethermore nethermost netherstock netherstone netherward netherwards Nethinim neti netleaf netlike netmaker netmaking netman netmonger netop netsman netsuke nettable Nettapus netted netter Nettie netting Nettion nettle nettlebed nettlebird nettlefire nettlefish nettlefoot nettlelike nettlemonger nettler nettlesome nettlewort nettling nettly Netty netty netwise network Neudeckian neugroschen neuma neumatic neumatize neume neumic neurad neuradynamia neural neurale neuralgia neuralgiac neuralgic neuralgiform neuralgy neuralist neurapophyseal neurapophysial neurapophysis neurarthropathy neurasthenia neurasthenic neurasthenical neurasthenically neurataxia neurataxy neuration neuratrophia neuratrophic neuratrophy neuraxial neuraxis neuraxon neuraxone neurectasia neurectasis neurectasy neurectome neurectomic neurectomy neurectopia neurectopy neurenteric neurepithelium neurergic neurexairesis neurhypnology neurhypnotist neuriatry neuric neurilema neurilematic neurilemma neurilemmal neurilemmatic neurilemmatous neurilemmitis neurility neurin neurine neurinoma neurism neurite neuritic neuritis neuroanatomical neuroanatomy neurobiotactic neurobiotaxis neuroblast neuroblastic neuroblastoma neurocanal neurocardiac neurocele neurocentral neurocentrum neurochemistry neurochitin neurochondrite neurochord neurochorioretinitis neurocirculatory neurocity neuroclonic neurocoele neurocoelian neurocyte neurocytoma neurodegenerative neurodendrite neurodendron neurodermatitis neurodermatosis neurodermitis neurodiagnosis neurodynamic neurodynia neuroepidermal neuroepithelial neuroepithelium neurofibril neurofibrilla neurofibrillae neurofibrillar neurofibroma neurofibromatosis neurofil neuroganglion neurogastralgia neurogastric neurogenesis neurogenetic neurogenic neurogenous neuroglandular neuroglia neurogliac neuroglial neurogliar neuroglic neuroglioma neurogliosis neurogram neurogrammic neurographic neurography neurohistology neurohumor neurohumoral neurohypnology neurohypnotic neurohypnotism neurohypophysis neuroid neurokeratin neurokyme neurological neurologist neurologize neurology neurolymph neurolysis neurolytic neuroma neuromalacia neuromalakia neuromast neuromastic neuromatosis neuromatous neuromere neuromerism neuromerous neuromimesis neuromimetic neuromotor neuromuscular neuromusculature neuromyelitis neuromyic neuron neuronal neurone neuronic neuronism neuronist neuronophagia neuronophagy neuronym neuronymy neuroparalysis neuroparalytic neuropath neuropathic neuropathical neuropathically neuropathist neuropathological neuropathologist neuropathology neuropathy Neurope neurophagy neurophil neurophile neurophilic neurophysiological neurophysiology neuropile neuroplasm neuroplasmic neuroplasty neuroplexus neuropodial neuropodium neuropodous neuropore neuropsychiatric neuropsychiatrist neuropsychiatry neuropsychic neuropsychological neuropsychologist neuropsychology neuropsychopathic neuropsychopathy neuropsychosis neuropter Neuroptera neuropteran Neuropteris neuropterist neuropteroid Neuropteroidea neuropterological neuropterology neuropteron neuropterous neuroretinitis neurorrhaphy Neurorthoptera neurorthopteran neurorthopterous neurosal neurosarcoma neurosclerosis neuroses neurosis neuroskeletal neuroskeleton neurosome neurospasm neurospongium neurosthenia neurosurgeon neurosurgery neurosurgical neurosuture neurosynapse neurosyphilis neurotendinous neurotension neurotherapeutics neurotherapist neurotherapy neurothlipsis neurotic neurotically neuroticism neuroticize neurotization neurotome neurotomical neurotomist neurotomize neurotomy neurotonic neurotoxia neurotoxic neurotoxin neurotripsy neurotrophic neurotrophy neurotropic neurotropism neurovaccination neurovaccine neurovascular neurovisceral neurula neurypnological neurypnologist neurypnology Neustrian neuter neuterdom neuterlike neuterly neuterness neutral neutralism neutralist neutrality neutralization neutralize neutralizer neutrally neutralness neutrino neutroceptive neutroceptor neutroclusion Neutrodyne neutrologistic neutron neutropassive neutrophile neutrophilia neutrophilic neutrophilous Nevada Nevadan nevadite neve nevel never neverland nevermore nevertheless Neville nevo nevoid Nevome nevoy nevus nevyanskite new Newar Newari newberyite newcal Newcastle newcome newcomer newel newelty newfangle newfangled newfangledism newfangledly newfangledness newfanglement Newfoundland Newfoundlander Newichawanoc newing newings newish newlandite newly newlywed Newmanism Newmanite Newmanize newmarket newness Newport news newsbill newsboard newsboat newsboy newscast newscaster newscasting newsful newsiness newsless newslessness newsletter newsman newsmonger newsmongering newsmongery newspaper newspaperdom newspaperese newspaperish newspaperized newspaperman newspaperwoman newspapery newsprint newsreader newsreel newsroom newssheet newsstand newsteller newsworthiness newsworthy newsy newt newtake newton Newtonian Newtonianism Newtonic Newtonist newtonite nexal next nextly nextness nexum nexus neyanda ngai ngaio ngapi Ngoko Nguyen Nhan Nheengatu ni niacin Niagara Niagaran Niall Niantic Nias Niasese niata nib nibbana nibbed nibber nibble nibbler nibblingly nibby niblick niblike nibong nibs nibsome Nicaean Nicaragua Nicaraguan Nicarao niccolic niccoliferous niccolite niccolous Nice nice niceish niceling nicely Nicene niceness Nicenian Nicenist nicesome nicetish nicety Nichael niche nichelino nicher Nicholas Nici Nick nick nickel nickelage nickelic nickeliferous nickeline nickeling nickelization nickelize nickellike nickelodeon nickelous nickeltype nicker nickerpecker nickey Nickie Nickieben nicking nickle nickname nicknameable nicknamee nicknameless nicknamer Nickneven nickstick nicky Nicobar Nicobarese Nicodemite Nicodemus Nicol Nicolaitan Nicolaitanism Nicolas nicolayite Nicolette Nicolo nicolo Nicomachean nicotia nicotian Nicotiana nicotianin nicotic nicotinamide nicotine nicotinean nicotined nicotineless nicotinian nicotinic nicotinism nicotinize nicotism nicotize nictate nictation nictitant nictitate nictitation nid nidal nidamental nidana nidation nidatory niddering niddick niddle nide nidge nidget nidgety nidi nidicolous nidificant nidificate nidification nidificational nidifugous nidify niding nidologist nidology nidor nidorosity nidorous nidorulent nidulant Nidularia Nidulariaceae nidulariaceous Nidulariales nidulate nidulation nidulus nidus niece nieceless nieceship niellated nielled niellist niello Niels niepa Nierembergia Niersteiner Nietzschean Nietzscheanism Nietzscheism nieve nieveta nievling nife nifesima niffer nific nifle nifling nifty nig Nigel Nigella Nigerian niggard niggardize niggardliness niggardling niggardly niggardness nigger niggerdom niggerfish niggergoose niggerhead niggerish niggerism niggerling niggertoe niggerweed niggery niggle niggler niggling nigglingly niggly nigh nighly nighness night nightcap nightcapped nightcaps nightchurr nightdress nighted nightfall nightfish nightflit nightfowl nightgown nighthawk nightie nightingale nightingalize nightjar nightless nightlessness nightlike nightlong nightly nightman nightmare nightmarish nightmarishly nightmary nights nightshade nightshine nightshirt nightstock nightstool nighttide nighttime nightwalker nightwalking nightward nightwards nightwear nightwork nightworker nignay nignye nigori nigranilin nigraniline nigre nigrescence nigrescent nigresceous nigrescite nigrification nigrified nigrify nigrine Nigritian nigrities nigritude nigritudinous nigrosine nigrous nigua Nihal nihilianism nihilianistic nihilification nihilify nihilism nihilist nihilistic nihilitic nihility nikau Nikeno nikethamide Nikko niklesite Nikolai nil Nile nilgai Nilometer Nilometric Niloscope Nilot Nilotic Nilous nilpotent Nils nim nimb nimbated nimbed nimbi nimbiferous nimbification nimble nimblebrained nimbleness nimbly nimbose nimbosity nimbus nimbused nimiety niminy nimious Nimkish nimmer Nimrod Nimrodian Nimrodic Nimrodical Nimrodize nimshi Nina nincom nincompoop nincompoopery nincompoophood nincompoopish nine ninebark ninefold nineholes ninepegs ninepence ninepenny ninepin ninepins ninescore nineted nineteen nineteenfold nineteenth nineteenthly ninetieth ninety ninetyfold ninetyish ninetyknot Ninevite Ninevitical Ninevitish Ning Ningpo Ninja ninny ninnyhammer ninnyish ninnyism ninnyship ninnywatch Ninon ninon Ninox ninth ninthly nintu ninut niobate Niobe Niobean niobic Niobid Niobite niobite niobium niobous niog niota Nip nip nipa nipcheese niphablepsia niphotyphlosis Nipissing Nipmuc nipper nipperkin nippers nippily nippiness nipping nippingly nippitate nipple nippleless nipplewort Nipponese Nipponism nipponium Nipponize nippy nipter Niquiran nirles nirmanakaya nirvana nirvanic Nisaean Nisan nisei Nishada nishiki nisnas nispero Nisqualli nisse nisus nit nitch nitchevo Nitella nitency nitently niter niterbush nitered nither nithing nitid nitidous nitidulid Nitidulidae nito niton nitramine nitramino nitranilic nitraniline nitrate nitratine nitration nitrator Nitrian nitriary nitric nitridation nitride nitriding nitridization nitridize nitrifaction nitriferous nitrifiable nitrification nitrifier nitrify nitrile Nitriot nitrite nitro nitroalizarin nitroamine nitroaniline Nitrobacter nitrobacteria Nitrobacteriaceae Nitrobacterieae nitrobarite nitrobenzene nitrobenzol nitrobenzole nitrocalcite nitrocellulose nitrocellulosic nitrochloroform nitrocotton nitroform nitrogelatin nitrogen nitrogenate nitrogenation nitrogenic nitrogenization nitrogenize nitrogenous nitroglycerin nitrohydrochloric nitrolamine nitrolic nitrolime nitromagnesite nitrometer nitrometric nitromuriate nitromuriatic nitronaphthalene nitroparaffin nitrophenol nitrophilous nitrophyte nitrophytic nitroprussiate nitroprussic nitroprusside nitrosamine nitrosate nitrosification nitrosify nitrosite nitrosobacteria nitrosochloride Nitrosococcus Nitrosomonas nitrososulphuric nitrostarch nitrosulphate nitrosulphonic nitrosulphuric nitrosyl nitrosylsulphuric nitrotoluene nitrous nitroxyl nitryl nitter nitty nitwit Nitzschia Nitzschiaceae Niuan Niue nival nivation nivellate nivellation nivellator nivellization nivenite niveous nivicolous nivosity nix nixie niyoga Nizam nizam nizamate nizamut nizy njave No no noa Noachian Noachic Noachical Noachite Noah Noahic Noam nob nobber nobbily nobble nobbler nobbut nobby nobiliary nobilify nobilitate nobilitation nobility noble noblehearted nobleheartedly nobleheartedness nobleman noblemanly nobleness noblesse noblewoman nobley nobly nobody nobodyness nobs nocake Nocardia nocardiosis nocent nocerite nociassociation nociceptive nociceptor nociperception nociperceptive nock nocket nocktat noctambulant noctambulation noctambule noctambulism noctambulist noctambulistic noctambulous Nocten noctidial noctidiurnal noctiferous noctiflorous Noctilio Noctilionidae Noctiluca noctiluca noctilucal noctilucan noctilucence noctilucent Noctilucidae noctilucin noctilucine noctilucous noctiluminous noctipotent noctivagant noctivagation noctivagous noctograph noctovision Noctuae noctuid Noctuidae noctuiform noctule nocturia nocturn nocturnal nocturnally nocturne nocuity nocuous nocuously nocuousness nod nodal nodality nodated nodder nodding noddingly noddle noddy node noded nodi nodiak nodical nodicorn nodiferous nodiflorous nodiform Nodosaria nodosarian nodosariform nodosarine nodose nodosity nodous nodular nodulate nodulated nodulation nodule noduled nodulize nodulose nodulous nodulus nodus noegenesis noegenetic Noel noel noematachograph noematachometer noematachometic Noemi Noetic noetic noetics nog nogada Nogai nogal noggen noggin nogging noghead nogheaded nohow Nohuntsik noibwood noil noilage noiler noily noint nointment noir noise noiseful noisefully noiseless noiselessly noiselessness noisemaker noisemaking noiseproof noisette noisily noisiness noisome noisomely noisomeness noisy nokta Nolascan nolition Noll noll nolle nolleity nollepros nolo noma nomad nomadian nomadic nomadical nomadically Nomadidae nomadism nomadization nomadize nomancy nomarch nomarchy Nomarthra nomarthral nombril nome Nomeidae nomenclate nomenclative nomenclator nomenclatorial nomenclatorship nomenclatory nomenclatural nomenclature nomenclaturist Nomeus nomial nomic nomina nominable nominal nominalism nominalist nominalistic nominality nominally nominate nominated nominately nomination nominatival nominative nominatively nominator nominatrix nominature nominee nomineeism nominy nomism nomisma nomismata nomistic nomocanon nomocracy nomogenist nomogenous nomogeny nomogram nomograph nomographer nomographic nomographical nomographically nomography nomological nomologist nomology nomopelmous nomophylax nomophyllous nomos nomotheism nomothete nomothetes nomothetic nomothetical non Nona nonabandonment nonabdication nonabiding nonability nonabjuration nonabjurer nonabolition nonabridgment nonabsentation nonabsolute nonabsolution nonabsorbable nonabsorbent nonabsorptive nonabstainer nonabstaining nonabstemious nonabstention nonabstract nonacademic nonacceding nonacceleration nonaccent nonacceptance nonacceptant nonacceptation nonaccess nonaccession nonaccessory nonaccidental nonaccompaniment nonaccompanying nonaccomplishment nonaccredited nonaccretion nonachievement nonacid nonacknowledgment nonacosane nonacoustic nonacquaintance nonacquiescence nonacquiescent nonacquisitive nonacquittal nonact nonactinic nonaction nonactionable nonactive nonactuality nonaculeate nonacute nonadditive nonadecane nonadherence nonadherent nonadhesion nonadhesive nonadjacent nonadjectival nonadjournment nonadjustable nonadjustive nonadjustment nonadministrative nonadmiring nonadmission nonadmitted nonadoption Nonadorantes nonadornment nonadult nonadvancement nonadvantageous nonadventitious nonadventurous nonadverbial nonadvertence nonadvertency nonadvocate nonaerating nonaerobiotic nonaesthetic nonaffection nonaffiliated nonaffirmation nonage nonagenarian nonagency nonagent nonagesimal nonagglutinative nonagglutinator nonaggression nonaggressive nonagon nonagrarian nonagreement nonagricultural nonahydrate nonaid nonair nonalarmist nonalcohol nonalcoholic nonalgebraic nonalienating nonalienation nonalignment nonalkaloidal nonallegation nonallegorical nonalliterated nonalliterative nonallotment nonalluvial nonalphabetic nonaltruistic nonaluminous nonamalgamable nonamendable nonamino nonamotion nonamphibious nonamputation nonanalogy nonanalytical nonanalyzable nonanalyzed nonanaphoric nonanaphthene nonanatomical nonancestral nonane nonanesthetized nonangelic nonangling nonanimal nonannexation nonannouncement nonannuitant nonannulment nonanoic nonanonymity nonanswer nonantagonistic nonanticipative nonantigenic nonapologetic nonapostatizing nonapostolic nonapparent nonappealable nonappearance nonappearer nonappearing nonappellate nonappendicular nonapplication nonapply nonappointment nonapportionable nonapposable nonappraisal nonappreciation nonapprehension nonappropriation nonapproval nonaqueous nonarbitrable nonarcing nonargentiferous nonaristocratic nonarithmetical nonarmament nonarmigerous nonaromatic nonarraignment nonarrival nonarsenical nonarterial nonartesian nonarticulated nonarticulation nonartistic nonary nonascendancy nonascertainable nonascertaining nonascetic nonascription nonaseptic nonaspersion nonasphalt nonaspirate nonaspiring nonassault nonassent nonassentation nonassented nonassenting nonassertion nonassertive nonassessable nonassessment nonassignable nonassignment nonassimilable nonassimilating nonassimilation nonassistance nonassistive nonassociable nonassortment nonassurance nonasthmatic nonastronomical nonathletic nonatmospheric nonatonement nonattached nonattachment nonattainment nonattendance nonattendant nonattention nonattestation nonattribution nonattributive nonaugmentative nonauricular nonauriferous nonauthentication nonauthoritative nonautomatic nonautomotive nonavoidance nonaxiomatic nonazotized nonbachelor nonbacterial nonbailable nonballoting nonbanishment nonbankable nonbarbarous nonbaronial nonbase nonbasement nonbasic nonbasing nonbathing nonbearded nonbearing nonbeing nonbeliever nonbelieving nonbelligerent nonbending nonbenevolent nonbetrayal nonbeverage nonbilabiate nonbilious nonbinomial nonbiological nonbitter nonbituminous nonblack nonblameless nonbleeding nonblended nonblockaded nonblocking nonblooded nonblooming nonbodily nonbookish nonborrower nonbotanical nonbourgeois nonbranded nonbreakable nonbreeder nonbreeding nonbroodiness nonbroody nonbrowsing nonbudding nonbulbous nonbulkhead nonbureaucratic nonburgage nonburgess nonburnable nonburning nonbursting nonbusiness nonbuying noncabinet noncaffeine noncaking Noncalcarea noncalcareous noncalcified noncallability noncallable noncancellable noncannibalistic noncanonical noncanonization noncanvassing noncapillarity noncapillary noncapital noncapitalist noncapitalistic noncapitulation noncapsizable noncapture noncarbonate noncareer noncarnivorous noncarrier noncartelized noncaste noncastigation noncataloguer noncatarrhal noncatechizable noncategorical noncathedral noncatholicity noncausality noncausation nonce noncelebration noncelestial noncellular noncellulosic noncensored noncensorious noncensus noncentral noncereal noncerebral nonceremonial noncertain noncertainty noncertified nonchafing nonchalance nonchalant nonchalantly nonchalantness nonchalky nonchallenger nonchampion nonchangeable nonchanging noncharacteristic nonchargeable nonchastisement nonchastity nonchemical nonchemist nonchivalrous nonchokable nonchokebore nonchronological nonchurch nonchurched nonchurchgoer nonciliate noncircuit noncircuital noncircular noncirculation noncitation noncitizen noncivilized nonclaim nonclaimable nonclassable nonclassical nonclassifiable nonclassification nonclastic nonclearance noncleistogamic nonclergyable nonclerical nonclimbable nonclinical nonclose nonclosure nonclotting noncoagulability noncoagulable noncoagulation noncoalescing noncock noncoercion noncoercive noncognate noncognition noncognitive noncognizable noncognizance noncoherent noncohesion noncohesive noncoinage noncoincidence noncoincident noncoincidental noncoking noncollaboration noncollaborative noncollapsible noncollectable noncollection noncollegiate noncollinear noncolloid noncollusion noncollusive noncolonial noncoloring noncom noncombat noncombatant noncombination noncombining noncombustible noncombustion noncome noncoming noncommemoration noncommencement noncommendable noncommensurable noncommercial noncommissioned noncommittal noncommittalism noncommittally noncommittalness noncommonable noncommorancy noncommunal noncommunicable noncommunicant noncommunicating noncommunication noncommunion noncommunist noncommunistic noncommutative noncompearance noncompensating noncompensation noncompetency noncompetent noncompeting noncompetitive noncompetitively noncomplaisance noncompletion noncompliance noncomplicity noncomplying noncomposite noncompoundable noncompounder noncomprehension noncompressible noncompression noncompulsion noncomputation noncon nonconcealment nonconceiving nonconcentration nonconception nonconcern nonconcession nonconciliating nonconcludency nonconcludent nonconcluding nonconclusion nonconcordant nonconcur nonconcurrence nonconcurrency nonconcurrent noncondensable noncondensation noncondensible noncondensing noncondimental nonconditioned noncondonation nonconducive nonconductibility nonconductible nonconducting nonconduction nonconductive nonconductor nonconfederate nonconferrable nonconfession nonconficient nonconfident nonconfidential nonconfinement nonconfirmation nonconfirmative nonconfiscable nonconfiscation nonconfitent nonconflicting nonconform nonconformable nonconformably nonconformance nonconformer nonconforming nonconformism nonconformist nonconformistical nonconformistically nonconformitant nonconformity nonconfutation noncongealing noncongenital noncongestion noncongratulatory noncongruent nonconjectural nonconjugal nonconjugate nonconjunction nonconnection nonconnective nonconnivance nonconnotative nonconnubial nonconscientious nonconscious nonconscription nonconsecration nonconsecutive nonconsent nonconsenting nonconsequence nonconsequent nonconservation nonconservative nonconserving nonconsideration nonconsignment nonconsistorial nonconsoling nonconsonant nonconsorting nonconspirator nonconspiring nonconstituent nonconstitutional nonconstraint nonconstruable nonconstruction nonconstructive nonconsular nonconsultative nonconsumable nonconsumption noncontact noncontagion noncontagionist noncontagious noncontagiousness noncontamination noncontemplative noncontending noncontent noncontention noncontentious noncontentiously nonconterminous noncontiguity noncontiguous noncontinental noncontingent noncontinuance noncontinuation noncontinuous noncontraband noncontraction noncontradiction noncontradictory noncontributing noncontribution noncontributor noncontributory noncontrivance noncontrolled noncontrolling noncontroversial nonconvective nonconvenable nonconventional nonconvergent nonconversable nonconversant nonconversational nonconversion nonconvertible nonconveyance nonconviction nonconvivial noncoplanar noncopying noncoring noncorporate noncorporeality noncorpuscular noncorrection noncorrective noncorrelation noncorrespondence noncorrespondent noncorresponding noncorroboration noncorroborative noncorrodible noncorroding noncorrosive noncorruption noncortical noncosmic noncosmopolitism noncostraight noncottager noncotyledonous noncounty noncranking noncreation noncreative noncredence noncredent noncredibility noncredible noncreditor noncreeping noncrenate noncretaceous noncriminal noncriminality noncrinoid noncritical noncrucial noncruciform noncrusading noncrushability noncrushable noncrustaceous noncrystalline noncrystallizable noncrystallized noncrystallizing nonculmination nonculpable noncultivated noncultivation nonculture noncumulative noncurantist noncurling noncurrency noncurrent noncursive noncurtailment noncuspidate noncustomary noncutting noncyclic noncyclical nonda nondamageable nondamnation nondancer nondangerous nondatival nondealer nondebtor nondecadence nondecadent nondecalcified nondecane nondecasyllabic nondecatoic nondecaying nondeceivable nondeception nondeceptive Nondeciduata nondeciduate nondeciduous nondecision nondeclarant nondeclaration nondeclarer nondecomposition nondecoration nondedication nondeduction nondefalcation nondefamatory nondefaulting nondefection nondefendant nondefense nondefensive nondeference nondeferential nondefiance nondefilement nondefining nondefinition nondefinitive nondeforestation nondegenerate nondegeneration nondegerming nondegradation nondegreased nondehiscent nondeist nondelegable nondelegate nondelegation nondeleterious nondeliberate nondeliberation nondelineation nondeliquescent nondelirious nondeliverance nondelivery nondemand nondemise nondemobilization nondemocratic nondemonstration nondendroid nondenial nondenominational nondenominationalism nondense nondenumerable nondenunciation nondepartmental nondeparture nondependence nondependent nondepletion nondeportation nondeported nondeposition nondepositor nondepravity nondepreciating nondepressed nondepression nondeprivable nonderivable nonderivative nonderogatory nondescript nondesecration nondesignate nondesigned nondesire nondesirous nondesisting nondespotic nondesquamative nondestructive nondesulphurized nondetachable nondetailed nondetention nondetermination nondeterminist nondeterrent nondetest nondetonating nondetrimental nondevelopable nondevelopment nondeviation nondevotional nondexterous nondiabetic nondiabolic nondiagnosis nondiagonal nondiagrammatic nondialectal nondialectical nondialyzing nondiametral nondiastatic nondiathermanous nondiazotizable nondichogamous nondichogamy nondichotomous nondictation nondictatorial nondictionary nondidactic nondieting nondifferentation nondifferentiable nondiffractive nondiffusing nondigestion nondilatable nondilution nondiocesan nondiphtheritic nondiphthongal nondiplomatic nondipterous nondirection nondirectional nondisagreement nondisappearing nondisarmament nondisbursed nondiscernment nondischarging nondisciplinary nondisclaim nondisclosure nondiscontinuance nondiscordant nondiscountable nondiscovery nondiscretionary nondiscrimination nondiscriminatory nondiscussion nondisestablishment nondisfigurement nondisfranchised nondisingenuous nondisintegration nondisinterested nondisjunct nondisjunction nondisjunctional nondisjunctive nondismemberment nondismissal nondisparaging nondisparate nondispensation nondispersal nondispersion nondisposal nondisqualifying nondissenting nondissolution nondistant nondistinctive nondistortion nondistribution nondistributive nondisturbance nondivergence nondivergent nondiversification nondivinity nondivisible nondivisiblity nondivision nondivisional nondivorce nondo nondoctrinal nondocumentary nondogmatic nondoing nondomestic nondomesticated nondominant nondonation nondramatic nondrinking nondropsical nondrying nonduality nondumping nonduplication nondutiable nondynastic nondyspeptic none nonearning noneastern noneatable nonecclesiastical nonechoic noneclectic noneclipsing nonecompense noneconomic nonedible noneditor noneditorial noneducable noneducation noneducational noneffective noneffervescent noneffete nonefficacious nonefficacy nonefficiency nonefficient noneffusion nonego nonegoistical nonejection nonelastic nonelasticity nonelect nonelection nonelective nonelector nonelectric nonelectrical nonelectrification nonelectrified nonelectrized nonelectrocution nonelectrolyte noneleemosynary nonelemental nonelementary nonelimination nonelopement nonemanating nonemancipation nonembarkation nonembellishment nonembezzlement nonembryonic nonemendation nonemergent nonemigration nonemission nonemotional nonemphatic nonemphatical nonempirical nonemploying nonemployment nonemulative nonenactment nonenclosure nonencroachment nonencyclopedic nonendemic nonendorsement nonenduring nonene nonenemy nonenergic nonenforceability nonenforceable nonenforcement nonengagement nonengineering nonenrolled nonent nonentailed nonenteric nonentertainment nonentitative nonentitive nonentitize nonentity nonentityism nonentomological nonentrant nonentres nonentry nonenumerated nonenunciation nonenvious nonenzymic nonephemeral nonepic nonepicurean nonepileptic nonepiscopal nonepiscopalian nonepithelial nonepochal nonequal nonequation nonequatorial nonequestrian nonequilateral nonequilibrium nonequivalent nonequivocating nonerasure nonerecting nonerection nonerotic nonerroneous nonerudite noneruption nones nonescape nonespionage nonespousal nonessential nonesthetic nonesuch nonet noneternal noneternity nonetheless nonethereal nonethical nonethnological nonethyl noneugenic noneuphonious nonevacuation nonevanescent nonevangelical nonevaporation nonevasion nonevasive noneviction nonevident nonevidential nonevil nonevolutionary nonevolutionist nonevolving nonexaction nonexaggeration nonexamination nonexcavation nonexcepted nonexcerptible nonexcessive nonexchangeability nonexchangeable nonexciting nonexclamatory nonexclusion nonexclusive nonexcommunicable nonexculpation nonexcusable nonexecution nonexecutive nonexemplary nonexemplificatior nonexempt nonexercise nonexertion nonexhibition nonexistence nonexistent nonexistential nonexisting nonexoneration nonexotic nonexpansion nonexpansive nonexpansively nonexpectation nonexpendable nonexperience nonexperienced nonexperimental nonexpert nonexpiation nonexpiry nonexploitation nonexplosive nonexportable nonexportation nonexposure nonexpulsion nonextant nonextempore nonextended nonextensile nonextension nonextensional nonextensive nonextenuatory nonexteriority nonextermination nonexternal nonexternality nonextinction nonextortion nonextracted nonextraction nonextraditable nonextradition nonextraneous nonextreme nonextrication nonextrinsic nonexuding nonexultation nonfabulous nonfacetious nonfacial nonfacility nonfacing nonfact nonfactious nonfactory nonfactual nonfacultative nonfaculty nonfaddist nonfading nonfailure nonfalse nonfamily nonfamous nonfanatical nonfanciful nonfarm nonfastidious nonfat nonfatal nonfatalistic nonfatty nonfavorite nonfeasance nonfeasor nonfeatured nonfebrile nonfederal nonfederated nonfeldspathic nonfelonious nonfelony nonfenestrated nonfermentability nonfermentable nonfermentation nonfermentative nonferrous nonfertile nonfertility nonfestive nonfeudal nonfibrous nonfiction nonfictional nonfiduciary nonfighter nonfigurative nonfilamentous nonfimbriate nonfinancial nonfinding nonfinishing nonfinite nonfireproof nonfiscal nonfisherman nonfissile nonfixation nonflaky nonflammable nonfloatation nonfloating nonfloriferous nonflowering nonflowing nonfluctuating nonfluid nonfluorescent nonflying nonfocal nonfood nonforeclosure nonforeign nonforeknowledge nonforest nonforested nonforfeitable nonforfeiting nonforfeiture nonform nonformal nonformation nonformulation nonfortification nonfortuitous nonfossiliferous nonfouling nonfrat nonfraternity nonfrauder nonfraudulent nonfreedom nonfreeman nonfreezable nonfreeze nonfreezing nonfricative nonfriction nonfrosted nonfruition nonfrustration nonfulfillment nonfunctional nonfundable nonfundamental nonfungible nonfuroid nonfusion nonfuturition nonfuturity nongalactic nongalvanized nonganglionic nongas nongaseous nongassy nongelatinizing nongelatinous nongenealogical nongenerative nongenetic nongentile nongeographical nongeological nongeometrical nongermination nongerundial nongildsman nongipsy nonglacial nonglandered nonglandular nonglare nonglucose nonglucosidal nonglucosidic nongod nongold nongolfer nongospel nongovernmental nongraduate nongraduated nongraduation nongrain nongranular nongraphitic nongrass nongratuitous nongravitation nongravity nongray nongreasy nongreen nongregarious nongremial nongrey nongrooming nonguarantee nonguard nonguttural nongymnast nongypsy nonhabitable nonhabitual nonhalation nonhallucination nonhandicap nonhardenable nonharmonic nonharmonious nonhazardous nonheading nonhearer nonheathen nonhedonistic nonhepatic nonhereditarily nonhereditary nonheritable nonheritor nonhero nonhieratic nonhistoric nonhistorical nonhomaloidal nonhomogeneity nonhomogeneous nonhomogenous nonhostile nonhouseholder nonhousekeeping nonhuman nonhumanist nonhumorous nonhumus nonhunting nonhydrogenous nonhydrolyzable nonhygrometric nonhygroscopic nonhypostatic nonic noniconoclastic nonideal nonidealist nonidentical nonidentity nonidiomatic nonidolatrous nonidyllic nonignitible nonignominious nonignorant nonillion nonillionth nonillumination nonillustration nonimaginary nonimbricating nonimitative nonimmateriality nonimmersion nonimmigrant nonimmigration nonimmune nonimmunity nonimmunized nonimpact nonimpairment nonimpartment nonimpatience nonimpeachment nonimperative nonimperial nonimplement nonimportation nonimporting nonimposition nonimpregnated nonimpressionist nonimprovement nonimputation nonincandescent nonincarnated nonincitement noninclination noninclusion noninclusive nonincrease nonincreasing nonincrusting nonindependent nonindictable nonindictment nonindividual nonindividualistic noninductive noninductively noninductivity nonindurated nonindustrial noninfallibilist noninfallible noninfantry noninfected noninfection noninfectious noninfinite noninfinitely noninflammability noninflammable noninflammatory noninflectional noninfluence noninformative noninfraction noninhabitant noninheritable noninherited noninitial noninjurious noninjury noninoculation noninquiring noninsect noninsertion noninstitution noninstruction noninstructional noninstructress noninstrumental noninsurance nonintegrable nonintegrity nonintellectual nonintelligence nonintelligent nonintent nonintention noninterchangeability noninterchangeable nonintercourse noninterference noninterferer noninterfering nonintermittent noninternational noninterpolation noninterposition noninterrupted nonintersecting nonintersector nonintervention noninterventionalist noninterventionist nonintoxicant nonintoxicating nonintrospective nonintrospectively nonintrusion nonintrusionism nonintrusionist nonintuitive noninverted noninvidious noninvincibility noniodized nonion nonionized nonionizing nonirate nonirradiated nonirrational nonirreparable nonirrevocable nonirrigable nonirrigated nonirrigating nonirrigation nonirritable nonirritant nonirritating nonisobaric nonisotropic nonissuable nonius nonjoinder nonjudicial nonjurable nonjurant nonjuress nonjuring nonjurist nonjuristic nonjuror nonjurorism nonjury nonjurying nonknowledge nonkosher nonlabeling nonlactescent nonlaminated nonlanguage nonlaying nonleaded nonleaking nonlegal nonlegato nonlegume nonlepidopterous nonleprous nonlevel nonlevulose nonliability nonliable nonliberation nonlicensed nonlicentiate nonlicet nonlicking nonlife nonlimitation nonlimiting nonlinear nonlipoidal nonliquefying nonliquid nonliquidating nonliquidation nonlister nonlisting nonliterary nonlitigious nonliturgical nonliving nonlixiviated nonlocal nonlocalized nonlogical nonlosable nonloser nonlover nonloving nonloxodromic nonluminescent nonluminosity nonluminous nonluster nonlustrous nonly nonmagnetic nonmagnetizable nonmaintenance nonmajority nonmalarious nonmalicious nonmalignant nonmalleable nonmammalian nonmandatory nonmanifest nonmanifestation nonmanila nonmannite nonmanual nonmanufacture nonmanufactured nonmanufacturing nonmarine nonmarital nonmaritime nonmarket nonmarriage nonmarriageable nonmarrying nonmartial nonmastery nonmaterial nonmaterialistic nonmateriality nonmaternal nonmathematical nonmathematician nonmatrimonial nonmatter nonmechanical nonmechanistic nonmedical nonmedicinal nonmedullated nonmelodious nonmember nonmembership nonmenial nonmental nonmercantile nonmetal nonmetallic nonmetalliferous nonmetallurgical nonmetamorphic nonmetaphysical nonmeteoric nonmeteorological nonmetric nonmetrical nonmetropolitan nonmicrobic nonmicroscopical nonmigratory nonmilitant nonmilitary nonmillionaire nonmimetic nonmineral nonmineralogical nonminimal nonministerial nonministration nonmiraculous nonmischievous nonmiscible nonmissionary nonmobile nonmodal nonmodern nonmolar nonmolecular nonmomentary nonmonarchical nonmonarchist nonmonastic nonmonist nonmonogamous nonmonotheistic nonmorainic nonmoral nonmorality nonmortal nonmotile nonmotoring nonmotorist nonmountainous nonmucilaginous nonmucous nonmulched nonmultiple nonmunicipal nonmuscular nonmusical nonmussable nonmutationally nonmutative nonmutual nonmystical nonmythical nonmythological nonnant nonnarcotic nonnasal nonnat nonnational nonnative nonnatural nonnaturalism nonnaturalistic nonnaturality nonnaturalness nonnautical nonnaval nonnavigable nonnavigation nonnebular nonnecessary nonnecessity nonnegligible nonnegotiable nonnegotiation nonnephritic nonnervous nonnescience nonnescient nonneutral nonneutrality nonnitrogenized nonnitrogenous nonnoble nonnomination nonnotification nonnotional nonnucleated nonnumeral nonnutrient nonnutritious nonnutritive nonobedience nonobedient nonobjection nonobjective nonobligatory nonobservable nonobservance nonobservant nonobservation nonobstetrical nonobstructive nonobvious nonoccidental nonocculting nonoccupant nonoccupation nonoccupational nonoccurrence nonodorous nonoecumenic nonoffender nonoffensive nonofficeholding nonofficial nonofficially nonofficinal nonoic nonoily nonolfactory nonomad nononerous nonopacity nonopening nonoperating nonoperative nonopposition nonoppressive nonoptical nonoptimistic nonoptional nonorchestral nonordination nonorganic nonorganization nonoriental nonoriginal nonornamental nonorthodox nonorthographical nonoscine nonostentation nonoutlawry nonoutrage nonoverhead nonoverlapping nonowner nonoxidating nonoxidizable nonoxidizing nonoxygenated nonoxygenous nonpacific nonpacification nonpacifist nonpagan nonpaid nonpainter nonpalatal nonpapal nonpapist nonpar nonparallel nonparalytic nonparasitic nonparasitism nonpareil nonparent nonparental nonpariello nonparishioner nonparliamentary nonparlor nonparochial nonparous nonpartial nonpartiality nonparticipant nonparticipating nonparticipation nonpartisan nonpartisanship nonpartner nonparty nonpassenger nonpasserine nonpastoral nonpatentable nonpatented nonpaternal nonpathogenic nonpause nonpaying nonpayment nonpeak nonpeaked nonpearlitic nonpecuniary nonpedestrian nonpedigree nonpelagic nonpeltast nonpenal nonpenalized nonpending nonpensionable nonpensioner nonperception nonperceptual nonperfection nonperforated nonperforating nonperformance nonperformer nonperforming nonperiodic nonperiodical nonperishable nonperishing nonperjury nonpermanent nonpermeability nonpermeable nonpermissible nonpermission nonperpendicular nonperpetual nonperpetuity nonpersecution nonperseverance nonpersistence nonpersistent nonperson nonpersonal nonpersonification nonpertinent nonperversive nonphagocytic nonpharmaceutical nonphenolic nonphenomenal nonphilanthropic nonphilological nonphilosophical nonphilosophy nonphonetic nonphosphatic nonphosphorized nonphotobiotic nonphysical nonphysiological nonpickable nonpigmented nonplacental nonplacet nonplanar nonplane nonplanetary nonplantowning nonplastic nonplate nonplausible nonpleading nonplus nonplusation nonplushed nonplutocratic nonpoet nonpoetic nonpoisonous nonpolar nonpolarizable nonpolarizing nonpolitical nonponderosity nonponderous nonpopery nonpopular nonpopularity nonporous nonporphyritic nonport nonportability nonportable nonportrayal nonpositive nonpossession nonposthumous nonpostponement nonpotential nonpower nonpractical nonpractice nonpraedial nonpreaching nonprecious nonprecipitation nonpredatory nonpredestination nonpredicative nonpredictable nonpreference nonpreferential nonpreformed nonpregnant nonprehensile nonprejudicial nonprelatical nonpremium nonpreparation nonprepayment nonprepositional nonpresbyter nonprescribed nonprescriptive nonpresence nonpresentation nonpreservation nonpresidential nonpress nonpressure nonprevalence nonprevalent nonpriestly nonprimitive nonprincipiate nonprincipled nonprobable nonprocreation nonprocurement nonproducer nonproducing nonproduction nonproductive nonproductively nonproductiveness nonprofane nonprofessed nonprofession nonprofessional nonprofessionalism nonprofessorial nonproficience nonproficiency nonproficient nonprofit nonprofiteering nonprognostication nonprogressive nonprohibitable nonprohibition nonprohibitive nonprojection nonprojective nonprojectively nonproletarian nonproliferous nonprolific nonprolongation nonpromiscuous nonpromissory nonpromotion nonpromulgation nonpronunciation nonpropagandistic nonpropagation nonprophetic nonpropitiation nonproportional nonproprietary nonproprietor nonprorogation nonproscriptive nonprosecution nonprospect nonprotection nonprotective nonproteid nonprotein nonprotestation nonprotractile nonprotractility nonproven nonprovided nonprovidential nonprovocation nonpsychic nonpsychological nonpublic nonpublication nonpublicity nonpueblo nonpulmonary nonpulsating nonpumpable nonpunctual nonpunctuation nonpuncturable nonpunishable nonpunishing nonpunishment nonpurchase nonpurchaser nonpurgative nonpurification nonpurposive nonpursuit nonpurulent nonpurveyance nonputrescent nonputrescible nonputting nonpyogenic nonpyritiferous nonqualification nonquality nonquota nonracial nonradiable nonradiating nonradical nonrailroader nonranging nonratability nonratable nonrated nonratifying nonrational nonrationalist nonrationalized nonrayed nonreaction nonreactive nonreactor nonreader nonreading nonrealistic nonreality nonrealization nonreasonable nonreasoner nonrebel nonrebellious nonreceipt nonreceiving nonrecent nonreception nonrecess nonrecipient nonreciprocal nonreciprocating nonreciprocity nonrecital nonreclamation nonrecluse nonrecognition nonrecognized nonrecoil nonrecollection nonrecommendation nonreconciliation nonrecourse nonrecoverable nonrecovery nonrectangular nonrectified nonrecuperation nonrecurrent nonrecurring nonredemption nonredressing nonreducing nonreference nonrefillable nonreflector nonreformation nonrefraction nonrefrigerant nonrefueling nonrefutation nonregardance nonregarding nonregenerating nonregenerative nonregent nonregimented nonregistered nonregistrability nonregistrable nonregistration nonregression nonregulation nonrehabilitation nonreigning nonreimbursement nonreinforcement nonreinstatement nonrejection nonrejoinder nonrelapsed nonrelation nonrelative nonrelaxation nonrelease nonreliance nonreligion nonreligious nonreligiousness nonrelinquishment nonremanie nonremedy nonremembrance nonremission nonremonstrance nonremuneration nonremunerative nonrendition nonrenewable nonrenewal nonrenouncing nonrenunciation nonrepair nonreparation nonrepayable nonrepealing nonrepeat nonrepeater nonrepentance nonrepetition nonreplacement nonreplicate nonreportable nonreprehensible nonrepresentation nonrepresentational nonrepresentationalism nonrepresentative nonrepression nonreprisal nonreproduction nonreproductive nonrepublican nonrepudiation nonrequirement nonrequisition nonrequital nonrescue nonresemblance nonreservation nonreserve nonresidence nonresidency nonresident nonresidental nonresidenter nonresidential nonresidentiary nonresidentor nonresidual nonresignation nonresinifiable nonresistance nonresistant nonresisting nonresistive nonresolvability nonresolvable nonresonant nonrespectable nonrespirable nonresponsibility nonrestitution nonrestraint nonrestricted nonrestriction nonrestrictive nonresumption nonresurrection nonresuscitation nonretaliation nonretention nonretentive nonreticence nonretinal nonretirement nonretiring nonretraceable nonretractation nonretractile nonretraction nonretrenchment nonretroactive nonreturn nonreturnable nonrevaluation nonrevealing nonrevelation nonrevenge nonrevenue nonreverse nonreversed nonreversible nonreversing nonreversion nonrevertible nonreviewable nonrevision nonrevival nonrevocation nonrevolting nonrevolutionary nonrevolving nonrhetorical nonrhymed nonrhyming nonrhythmic nonriding nonrigid nonrioter nonriparian nonritualistic nonrival nonromantic nonrotatable nonrotating nonrotative nonround nonroutine nonroyal nonroyalist nonrubber nonruminant Nonruminantia nonrun nonrupture nonrural nonrustable nonsabbatic nonsaccharine nonsacerdotal nonsacramental nonsacred nonsacrifice nonsacrificial nonsailor nonsalable nonsalaried nonsale nonsaline nonsalutary nonsalutation nonsalvation nonsanctification nonsanction nonsanctity nonsane nonsanguine nonsanity nonsaponifiable nonsatisfaction nonsaturated nonsaturation nonsaving nonsawing nonscalding nonscaling nonscandalous nonschematized nonschismatic nonscholastic nonscience nonscientific nonscientist nonscoring nonscraping nonscriptural nonscripturalist nonscrutiny nonseasonal nonsecession nonseclusion nonsecrecy nonsecret nonsecretarial nonsecretion nonsecretive nonsecretory nonsectarian nonsectional nonsectorial nonsecular nonsecurity nonsedentary nonseditious nonsegmented nonsegregation nonseizure nonselected nonselection nonselective nonself nonselfregarding nonselling nonsenatorial nonsense nonsensible nonsensical nonsensicality nonsensically nonsensicalness nonsensification nonsensify nonsensitive nonsensitiveness nonsensitized nonsensorial nonsensuous nonsentence nonsentient nonseparation nonseptate nonseptic nonsequacious nonsequaciousness nonsequestration nonserial nonserif nonserious nonserous nonserviential nonservile nonsetter nonsetting nonsettlement nonsexual nonsexually nonshaft nonsharing nonshatter nonshedder nonshipper nonshipping nonshredding nonshrinkable nonshrinking nonsiccative nonsidereal nonsignatory nonsignature nonsignificance nonsignificant nonsignification nonsignificative nonsilicated nonsiliceous nonsilver nonsimplification nonsine nonsinging nonsingular nonsinkable nonsinusoidal nonsiphonage nonsister nonsitter nonsitting nonskeptical nonskid nonskidding nonskipping nonslaveholding nonslip nonslippery nonslipping nonsludging nonsmoker nonsmoking nonsmutting nonsocial nonsocialist nonsocialistic nonsociety nonsociological nonsolar nonsoldier nonsolicitation nonsolid nonsolidified nonsolution nonsolvency nonsolvent nonsonant nonsovereign nonspalling nonsparing nonsparking nonspeaker nonspeaking nonspecial nonspecialist nonspecialized nonspecie nonspecific nonspecification nonspecificity nonspecified nonspectacular nonspectral nonspeculation nonspeculative nonspherical nonspill nonspillable nonspinning nonspinose nonspiny nonspiral nonspirit nonspiritual nonspirituous nonspontaneous nonspored nonsporeformer nonsporeforming nonsporting nonspottable nonsprouting nonstainable nonstaining nonstampable nonstandard nonstandardized nonstanzaic nonstaple nonstarch nonstarter nonstarting nonstatement nonstatic nonstationary nonstatistical nonstatutory nonstellar nonsticky nonstimulant nonstipulation nonstock nonstooping nonstop nonstrategic nonstress nonstretchable nonstretchy nonstriated nonstriker nonstriking nonstriped nonstructural nonstudent nonstudious nonstylized nonsubject nonsubjective nonsubmission nonsubmissive nonsubordination nonsubscriber nonsubscribing nonsubscription nonsubsiding nonsubsidy nonsubsistence nonsubstantial nonsubstantialism nonsubstantialist nonsubstantiality nonsubstantiation nonsubstantive nonsubstitution nonsubtraction nonsuccess nonsuccessful nonsuccession nonsuccessive nonsuccour nonsuction nonsuctorial nonsufferance nonsuffrage nonsugar nonsuggestion nonsuit nonsulphurous nonsummons nonsupplication nonsupport nonsupporter nonsupporting nonsuppositional nonsuppressed nonsuppression nonsuppurative nonsurface nonsurgical nonsurrender nonsurvival nonsurvivor nonsuspect nonsustaining nonsustenance nonswearer nonswearing nonsweating nonswimmer nonswimming nonsyllabic nonsyllabicness nonsyllogistic nonsyllogizing nonsymbiotic nonsymbiotically nonsymbolic nonsymmetrical nonsympathetic nonsympathizer nonsympathy nonsymphonic nonsymptomatic nonsynchronous nonsyndicate nonsynodic nonsynonymous nonsyntactic nonsyntactical nonsynthesized nonsyntonic nonsystematic nontabular nontactical nontan nontangential nontannic nontannin nontariff nontarnishable nontarnishing nontautomeric nontautomerizable nontax nontaxability nontaxable nontaxonomic nonteachable nonteacher nonteaching nontechnical nontechnological nonteetotaler nontelegraphic nonteleological nontelephonic nontemporal nontemporizing nontenant nontenure nontenurial nonterm nonterminating nonterrestrial nonterritorial nonterritoriality nontestamentary nontextual nontheatrical nontheistic nonthematic nontheological nontheosophical nontherapeutic nonthinker nonthinking nonthoracic nonthoroughfare nonthreaded nontidal nontillable nontimbered nontitaniferous nontitular nontolerated nontopographical nontourist nontoxic nontraction nontrade nontrader nontrading nontraditional nontragic nontrailing nontransferability nontransferable nontransgression nontransient nontransitional nontranslocation nontransmission nontransparency nontransparent nontransportation nontransposing nontransposition nontraveler nontraveling nontreasonable nontreated nontreatment nontreaty nontrespass nontrial nontribal nontribesman nontributary nontrier nontrigonometrical nontronite nontropical nontrunked nontruth nontuberculous nontuned nonturbinated nontutorial nontyphoidal nontypical nontypicalness nontypographical nontyrannical nonubiquitous nonulcerous nonultrafilterable nonumbilical nonumbilicate nonumbrellaed nonunanimous nonuncial nonundergraduate nonunderstandable nonunderstanding nonunderstandingly nonunderstood nonundulatory nonuniform nonuniformist nonuniformitarian nonuniformity nonuniformly nonunion nonunionism nonunionist nonunique nonunison nonunited nonuniversal nonuniversity nonupholstered nonuple nonuplet nonupright nonurban nonurgent nonusage nonuse nonuser nonusing nonusurping nonuterine nonutile nonutilitarian nonutility nonutilized nonutterance nonvacant nonvaccination nonvacuous nonvaginal nonvalent nonvalidity nonvaluation nonvalve nonvanishing nonvariable nonvariant nonvariation nonvascular nonvassal nonvegetative nonvenereal nonvenomous nonvenous nonventilation nonverbal nonverdict nonverminous nonvernacular nonvertebral nonvertical nonvertically nonvesicular nonvesting nonvesture nonveteran nonveterinary nonviable nonvibratile nonvibration nonvibrator nonvibratory nonvicarious nonvictory nonvillager nonvillainous nonvindication nonvinous nonvintage nonviolation nonviolence nonvirginal nonvirile nonvirtue nonvirtuous nonvirulent nonviruliferous nonvisaed nonvisceral nonviscid nonviscous nonvisional nonvisitation nonvisiting nonvisual nonvisualized nonvital nonvitreous nonvitrified nonviviparous nonvocal nonvocalic nonvocational nonvolant nonvolatile nonvolatilized nonvolcanic nonvolition nonvoluntary nonvortical nonvortically nonvoter nonvoting nonvulcanizable nonvulvar nonwalking nonwar nonwasting nonwatertight nonweakness nonwestern nonwetted nonwhite nonwinged nonwoody nonworker nonworking nonworship nonwrinkleable nonya nonyielding nonyl nonylene nonylenic nonylic nonzealous nonzero nonzodiacal nonzonal nonzonate nonzoological noodle noodledom noodleism nook nooked nookery nooking nooklet nooklike nooky noological noologist noology noometry noon noonday noonflower nooning noonlight noonlit noonstead noontide noontime noonwards noop nooscopic noose nooser Nootka nopal Nopalea nopalry nope nopinene nor Nora Norah norard norate noration norbergite Norbert Norbertine norcamphane nordcaper nordenskioldine Nordic Nordicism Nordicist Nordicity Nordicization Nordicize nordmarkite noreast noreaster norelin Norfolk Norfolkian norgine nori noria Noric norie norimon norite norland norlander norlandism norleucine Norm norm Norma norma normal normalcy normalism normalist normality normalization normalize normalizer normally normalness Norman Normanesque Normanish Normanism Normanist Normanization Normanize Normanizer Normanly Normannic normated normative normatively normativeness normless normoblast normoblastic normocyte normocytic normotensive Norn Norna nornicotine nornorwest noropianic norpinic Norridgewock Norroway Norroy Norse norsel Norseland norseler Norseman Norsk north northbound northeast northeaster northeasterly northeastern northeasternmost northeastward northeastwardly northeastwards norther northerliness northerly northern northerner northernize northernly northernmost northernness northest northfieldite northing northland northlander northlight Northman northmost northness Northumber Northumbrian northupite northward northwardly northwards northwest northwester northwesterly northwestern northwestward northwestwardly northwestwards Norumbega norward norwards Norway Norwegian norwest norwester norwestward Nosairi Nosairian nosarian nose nosean noseanite noseband nosebanded nosebleed nosebone noseburn nosed nosegay nosegaylike noseherb nosehole noseless noselessly noselessness noselike noselite Nosema Nosematidae nosepiece nosepinch noser nosesmart nosethirl nosetiology nosewards nosewheel nosewise nosey nosine nosing nosism nosocomial nosocomium nosogenesis nosogenetic nosogenic nosogeny nosogeography nosographer nosographic nosographical nosographically nosography nosohaemia nosohemia nosological nosologically nosologist nosology nosomania nosomycosis nosonomy nosophobia nosophyte nosopoetic nosopoietic nosotaxy nosotrophy nostalgia nostalgic nostalgically nostalgy nostic Nostoc Nostocaceae nostocaceous nostochine nostologic nostology nostomania Nostradamus nostrificate nostrification nostril nostriled nostrility nostrilsome nostrum nostrummonger nostrummongership nostrummongery Nosu nosy not notabilia notability notable notableness notably notacanthid Notacanthidae notacanthoid notacanthous Notacanthus notaeal notaeum notal notalgia notalgic Notalia notan notandum notanencephalia notarial notarially notariate notarikon notarize notary notaryship notate notation notational notative notator notch notchboard notched notchel notcher notchful notching notchweed notchwing notchy note notebook notecase noted notedly notedness notehead noteholder notekin Notelaea noteless notelessly notelessness notelet notencephalocele notencephalus noter notewise noteworthily noteworthiness noteworthy notharctid Notharctidae Notharctus nother nothing nothingarian nothingarianism nothingism nothingist nothingize nothingless nothingly nothingness nothingology Nothofagus Notholaena nothosaur Nothosauri nothosaurian Nothosauridae Nothosaurus nothous notice noticeability noticeable noticeably noticer Notidani notidanian notidanid Notidanidae notidanidan notidanoid Notidanus notifiable notification notified notifier notify notifyee notion notionable notional notionalist notionality notionally notionalness notionary notionate notioned notionist notionless Notiosorex notitia Notkerian notocentrous notocentrum notochord notochordal notodontian notodontid Notodontidae notodontoid Notogaea Notogaeal Notogaean Notogaeic notommatid Notommatidae Notonecta notonectal notonectid Notonectidae notopodial notopodium notopterid Notopteridae notopteroid Notopterus notorhizal Notorhynchus notoriety notorious notoriously notoriousness Notornis Notoryctes Notostraca Nototherium Nototrema nototribe notour notourly Notropis notself Nottoway notum Notungulata notungulate Notus notwithstanding Nou nougat nougatine nought noumeaite noumeite noumenal noumenalism noumenalist noumenality noumenalize noumenally noumenism noumenon noun nounal nounally nounize nounless noup nourice nourish nourishable nourisher nourishing nourishingly nourishment nouriture nous nouther nova novaculite novalia Novanglian Novanglican novantique novarsenobenzene novate Novatian Novatianism Novatianist novation novative novator novatory novatrix novcic novel novelcraft noveldom novelese novelesque novelet novelette noveletter novelettish novelettist noveletty novelish novelism novelist novelistic novelistically novelization novelize novella novelless novellike novelly novelmongering novelness novelry novelty novelwright novem novemarticulate November Novemberish novemcostate novemdigitate novemfid novemlobate novemnervate novemperfoliate novena novenary novendial novene novennial novercal Novial novice novicehood novicelike noviceship noviciate novilunar novitial novitiate novitiateship novitiation novity Novo Novocain novodamus Novorolsky now nowaday nowadays nowanights noway noways nowed nowel nowhat nowhen nowhence nowhere nowhereness nowheres nowhit nowhither nowise nowness Nowroze nowt nowy noxa noxal noxally noxious noxiously noxiousness noy noyade noyau Nozi nozzle nozzler nth nu nuance nub Nuba nubbin nubble nubbling nubbly nubby nubecula nubia Nubian nubiferous nubiform nubigenous nubilate nubilation nubile nubility nubilous Nubilum nucal nucament nucamentaceous nucellar nucellus nucha nuchal nuchalgia nuciculture nuciferous nuciform nucin nucivorous nucleal nuclear nucleary nuclease nucleate nucleation nucleator nuclei nucleiferous nucleiform nuclein nucleinase nucleoalbumin nucleoalbuminuria nucleofugal nucleohistone nucleohyaloplasm nucleohyaloplasma nucleoid nucleoidioplasma nucleolar nucleolated nucleole nucleoli nucleolinus nucleolocentrosome nucleoloid nucleolus nucleolysis nucleomicrosome nucleon nucleone nucleonics nucleopetal nucleoplasm nucleoplasmatic nucleoplasmic nucleoprotein nucleoside nucleotide nucleus nuclide nuclidic Nucula Nuculacea nuculanium nucule nuculid Nuculidae nuculiform nuculoid Nuda nudate nudation Nudd nuddle nude nudely nudeness Nudens nudge nudger nudibranch Nudibranchia nudibranchian nudibranchiate nudicaudate nudicaul nudifier nudiflorous nudiped nudish nudism nudist nuditarian nudity nugacious nugaciousness nugacity nugator nugatoriness nugatory nuggar nugget nuggety nugify nugilogue Nugumiut nuisance nuisancer nuke Nukuhivan nul null nullable nullah nullibicity nullibility nullibiquitous nullibist nullification nullificationist nullificator nullifidian nullifier nullify nullipara nulliparity nulliparous nullipennate Nullipennes nulliplex nullipore nulliporous nullism nullisome nullisomic nullity nulliverse nullo Numa Numantine numb number numberable numberer numberful numberless numberous numbersome numbfish numbing numbingly numble numbles numbly numbness numda numdah numen Numenius numerable numerableness numerably numeral numerant numerary numerate numeration numerative numerator numerical numerically numericalness numerist numero numerology numerose numerosity numerous numerously numerousness Numida Numidae Numidian Numididae Numidinae numinism numinous numinously numismatic numismatical numismatically numismatician numismatics numismatist numismatography numismatologist numismatology nummary nummi nummiform nummular Nummularia nummulary nummulated nummulation nummuline Nummulinidae nummulite Nummulites nummulitic Nummulitidae nummulitoid nummuloidal nummus numskull numskulled numskulledness numskullery numskullism numud nun nunatak nunbird nunch nuncheon nunciate nunciative nunciatory nunciature nuncio nuncioship nuncle nuncupate nuncupation nuncupative nuncupatively nundinal nundination nundine nunhood Nunki nunky nunlet nunlike nunnari nunnated nunnation nunnery nunni nunnify nunnish nunnishness nunship Nupe Nuphar nuptial nuptiality nuptialize nuptially nuptials nuque nuraghe nurhag nurly nursable nurse nursedom nursegirl nursehound nursekeeper nursekin nurselet nurselike nursemaid nurser nursery nurserydom nurseryful nurserymaid nurseryman nursetender nursing nursingly nursle nursling nursy nurturable nurtural nurture nurtureless nurturer nurtureship Nusairis Nusakan nusfiah nut nutant nutarian nutate nutation nutational nutbreaker nutcake nutcrack nutcracker nutcrackers nutcrackery nutgall nuthatch nuthook nutjobber nutlet nutlike nutmeg nutmegged nutmeggy nutpecker nutpick nutramin nutria nutrice nutricial nutricism nutrient nutrify nutriment nutrimental nutritial nutrition nutritional nutritionally nutritionist nutritious nutritiously nutritiousness nutritive nutritively nutritiveness nutritory nutseed nutshell Nuttallia nuttalliasis nuttalliosis nutted nutter nuttery nuttily nuttiness nutting nuttish nuttishness nutty nuzzer nuzzerana nuzzle Nyamwezi Nyanja nyanza Nyaya nychthemer nychthemeral nychthemeron Nyctaginaceae nyctaginaceous Nyctaginia nyctalope nyctalopia nyctalopic nyctalopy Nyctanthes Nyctea Nyctereutes nycteribiid Nycteribiidae Nycteridae nycterine Nycteris Nycticorax Nyctimene nyctinastic nyctinasty nyctipelagic Nyctipithecinae nyctipithecine Nyctipithecus nyctitropic nyctitropism nyctophobia nycturia Nydia nye nylast nylon nymil nymph nympha nymphae Nymphaea Nymphaeaceae nymphaeaceous nymphaeum nymphal nymphalid Nymphalidae Nymphalinae nymphaline nympheal nymphean nymphet nymphic nymphical nymphid nymphine Nymphipara nymphiparous nymphish nymphitis nymphlike nymphlin nymphly Nymphoides nympholepsia nympholepsy nympholept nympholeptic nymphomania nymphomaniac nymphomaniacal Nymphonacea nymphosis nymphotomy nymphwise Nyoro Nyroca Nyssa Nyssaceae nystagmic nystagmus nyxis O o oadal oaf oafdom oafish oafishly oafishness oak oakberry Oakboy oaken oakenshaw Oakesia oaklet oaklike oakling oaktongue oakum oakweb oakwood oaky oam Oannes oar oarage oarcock oared oarfish oarhole oarial oarialgia oaric oariocele oariopathic oariopathy oariotomy oaritic oaritis oarium oarless oarlike oarlock oarlop oarman oarsman oarsmanship oarswoman oarweed oary oasal oasean oases oasis oasitic oast oasthouse oat oatbin oatcake oatear oaten oatenmeal oatfowl oath oathay oathed oathful oathlet oathworthy oatland oatlike oatmeal oatseed oaty Obadiah obambulate obambulation obambulatory oban Obbenite obbligato obclavate obclude obcompressed obconical obcordate obcordiform obcuneate obdeltoid obdiplostemonous obdiplostemony obdormition obduction obduracy obdurate obdurately obdurateness obduration obe obeah obeahism obeche obedience obediency obedient obediential obedientially obedientialness obedientiar obedientiary obediently obeisance obeisant obeisantly obeism obelia obeliac obelial obelion obeliscal obeliscar obelisk obeliskoid obelism obelize obelus Oberon obese obesely obeseness obesity obex obey obeyable obeyer obeyingly obfuscable obfuscate obfuscation obfuscator obfuscity obfuscous obi Obidicut obispo obit obitual obituarian obituarily obituarist obituarize obituary object objectable objectation objectative objectee objecthood objectification objectify objection objectionability objectionable objectionableness objectionably objectional objectioner objectionist objectival objectivate objectivation objective objectively objectiveness objectivism objectivist objectivistic objectivity objectivize objectization objectize objectless objectlessly objectlessness objector objicient objuration objure objurgate objurgation objurgative objurgatively objurgator objurgatorily objurgatory objurgatrix oblanceolate oblate oblately oblateness oblation oblational oblationary oblatory oblectate oblectation obley obligable obligancy obligant obligate obligation obligational obligative obligativeness obligator obligatorily obligatoriness obligatory obligatum oblige obliged obligedly obligedness obligee obligement obliger obliging obligingly obligingness obligistic obligor obliquangular obliquate obliquation oblique obliquely obliqueness obliquitous obliquity obliquus obliterable obliterate obliteration obliterative obliterator oblivescence oblivial obliviality oblivion oblivionate oblivionist oblivionize oblivious obliviously obliviousness obliviscence obliviscible oblocutor oblong oblongatal oblongated oblongish oblongitude oblongitudinal oblongly oblongness obloquial obloquious obloquy obmutescence obmutescent obnebulate obnounce obnoxiety obnoxious obnoxiously obnoxiousness obnubilate obnubilation obnunciation oboe oboist obol Obolaria obolary obole obolet obolus obomegoid Obongo oboval obovate obovoid obpyramidal obpyriform Obrazil obreption obreptitious obreptitiously obrogate obrogation obrotund obscene obscenely obsceneness obscenity obscurancy obscurant obscurantic obscurantism obscurantist obscuration obscurative obscure obscuredly obscurely obscurement obscureness obscurer obscurism obscurist obscurity obsecrate obsecration obsecrationary obsecratory obsede obsequence obsequent obsequial obsequience obsequiosity obsequious obsequiously obsequiousness obsequity obsequium obsequy observability observable observableness observably observance observancy observandum observant Observantine Observantist observantly observantness observation observational observationalism observationally observative observatorial observatory observe observedly observer observership observing observingly obsess obsessingly obsession obsessional obsessionist obsessive obsessor obsidian obsidianite obsidional obsidionary obsidious obsignate obsignation obsignatory obsolesce obsolescence obsolescent obsolescently obsolete obsoletely obsoleteness obsoletion obsoletism obstacle obstetric obstetrical obstetrically obstetricate obstetrication obstetrician obstetrics obstetricy obstetrist obstetrix obstinacious obstinacy obstinance obstinate obstinately obstinateness obstination obstinative obstipation obstreperate obstreperosity obstreperous obstreperously obstreperousness obstriction obstringe obstruct obstructant obstructedly obstructer obstructingly obstruction obstructionism obstructionist obstructive obstructively obstructiveness obstructivism obstructivity obstructor obstruent obstupefy obtain obtainable obtainal obtainance obtainer obtainment obtect obtected obtemper obtemperate obtenebrate obtenebration obtention obtest obtestation obtriangular obtrude obtruder obtruncate obtruncation obtruncator obtrusion obtrusionist obtrusive obtrusively obtrusiveness obtund obtundent obtunder obtundity obturate obturation obturator obturatory obturbinate obtusangular obtuse obtusely obtuseness obtusifid obtusifolious obtusilingual obtusilobous obtusion obtusipennate obtusirostrate obtusish obtusity obumbrant obumbrate obumbration obvallate obvelation obvention obverse obversely obversion obvert obvertend obviable obviate obviation obviative obviator obvious obviously obviousness obvolute obvoluted obvolution obvolutive obvolve obvolvent ocarina Occamism Occamist Occamistic Occamite occamy occasion occasionable occasional occasionalism occasionalist occasionalistic occasionality occasionally occasionalness occasionary occasioner occasionless occasive occident occidental Occidentalism Occidentalist occidentality Occidentalization Occidentalize occidentally occiduous occipital occipitalis occipitally occipitoanterior occipitoatlantal occipitoatloid occipitoaxial occipitoaxoid occipitobasilar occipitobregmatic occipitocalcarine occipitocervical occipitofacial occipitofrontal occipitofrontalis occipitohyoid occipitoiliac occipitomastoid occipitomental occipitonasal occipitonuchal occipitootic occipitoparietal occipitoposterior occipitoscapular occipitosphenoid occipitosphenoidal occipitotemporal occipitothalamic occiput occitone occlude occludent occlusal occluse occlusion occlusive occlusiveness occlusocervical occlusocervically occlusogingival occlusometer occlusor occult occultate occultation occulter occulting occultism occultist occultly occultness occupable occupance occupancy occupant occupation occupational occupationalist occupationally occupationless occupative occupiable occupier occupy occur occurrence occurrent occursive ocean oceaned oceanet oceanful Oceanian oceanic Oceanican oceanity oceanographer oceanographic oceanographical oceanographically oceanographist oceanography oceanology oceanophyte oceanside oceanward oceanwards oceanways oceanwise ocellar ocellary ocellate ocellated ocellation ocelli ocellicyst ocellicystic ocelliferous ocelliform ocelligerous ocellus oceloid ocelot och ochava ochavo ocher ocherish ocherous ochery ochidore ochlesis ochlesitic ochletic ochlocracy ochlocrat ochlocratic ochlocratical ochlocratically ochlophobia ochlophobist Ochna Ochnaceae ochnaceous ochone Ochotona Ochotonidae Ochozoma ochraceous Ochrana ochrea ochreate ochreous ochro ochrocarpous ochroid ochroleucous ochrolite Ochroma ochronosis ochronosus ochronotic ochrous ocht Ocimum ock oclock Ocneria ocote Ocotea ocotillo ocque ocracy ocrea ocreaceous Ocreatae ocreate ocreated octachloride octachord octachordal octachronous Octacnemus octacolic octactinal octactine Octactiniae octactinian octad octadecahydrate octadecane octadecanoic octadecyl octadic octadrachm octaemeron octaeteric octaeterid octagon octagonal octagonally octahedral octahedric octahedrical octahedrite octahedroid octahedron octahedrous octahydrate octahydrated octakishexahedron octamerism octamerous octameter octan octanaphthene Octandria octandrian octandrious octane octangle octangular octangularness Octans octant octantal octapla octaploid octaploidic octaploidy octapodic octapody octarch octarchy octarius octarticulate octary octasemic octastich octastichon octastrophic octastyle octastylos octateuch octaval octavalent octavarium octave Octavia Octavian octavic octavina Octavius octavo octenary octene octennial octennially octet octic octillion octillionth octine octingentenary octoad octoalloy octoate octobass October octobrachiate Octobrist octocentenary octocentennial octochord Octocoralla octocorallan Octocorallia octocoralline octocotyloid octodactyl octodactyle octodactylous octodecimal octodecimo octodentate octodianome Octodon octodont Octodontidae Octodontinae octoechos octofid octofoil octofoiled octogamy octogenarian octogenarianism octogenary octogild octoglot Octogynia octogynian octogynious octogynous octoic octoid octolateral octolocular octomeral octomerous octometer octonal octonare octonarian octonarius octonary octonematous octonion octonocular octoon octopartite octopean octoped octopede octopetalous octophthalmous octophyllous octopi octopine octoploid octoploidic octoploidy octopod Octopoda octopodan octopodes octopodous octopolar octopus octoradial octoradiate octoradiated octoreme octoroon octose octosepalous octospermous octospore octosporous octostichous octosyllabic octosyllable octovalent octoyl octroi octroy octuor octuple octuplet octuplex octuplicate octuplication octuply octyl octylene octyne ocuby ocular ocularist ocularly oculary oculate oculated oculauditory oculiferous oculiform oculigerous Oculina oculinid Oculinidae oculinoid oculist oculistic oculocephalic oculofacial oculofrontal oculomotor oculomotory oculonasal oculopalpebral oculopupillary oculospinal oculozygomatic oculus ocydrome ocydromine Ocydromus Ocypete Ocypoda ocypodan Ocypode ocypodian Ocypodidae ocypodoid Ocyroe Ocyroidae Od od oda Odacidae odacoid odal odalborn odalisk odalisque odaller odalman odalwoman Odax odd oddish oddity oddlegs oddly oddman oddment oddments oddness Odds odds Oddsbud oddsman ode odel odelet Odelsthing Odelsting odeon odeum odic odically Odin Odinian Odinic Odinism Odinist odinite Odinitic odiometer odious odiously odiousness odist odium odiumproof Odobenidae Odobenus Odocoileus odograph odology odometer odometrical odometry Odonata odontagra odontalgia odontalgic Odontaspidae Odontaspididae Odontaspis odontatrophia odontatrophy odontexesis odontiasis odontic odontist odontitis odontoblast odontoblastic odontocele Odontocete odontocete Odontoceti odontocetous odontochirurgic odontoclasis odontoclast odontodynia odontogen odontogenesis odontogenic odontogeny Odontoglossae odontoglossal odontoglossate Odontoglossum Odontognathae odontognathic odontognathous odontograph odontographic odontography odontohyperesthesia odontoid Odontolcae odontolcate odontolcous odontolite odontolith odontological odontologist odontology odontoloxia odontoma odontomous odontonecrosis odontoneuralgia odontonosology odontopathy odontophoral odontophore Odontophoridae Odontophorinae odontophorine odontophorous Odontophorus odontoplast odontoplerosis Odontopteris Odontopteryx odontorhynchous Odontormae Odontornithes odontornithic odontorrhagia odontorthosis odontoschism odontoscope odontosis odontostomatous odontostomous Odontosyllis odontotechny odontotherapia odontotherapy odontotomy Odontotormae odontotripsis odontotrypy odoom odophone odor odorant odorate odorator odored odorful odoriferant odoriferosity odoriferous odoriferously odoriferousness odorific odorimeter odorimetry odoriphore odorivector odorize odorless odorometer odorosity odorous odorously odorousness odorproof Odostemon Ods odso odum odyl odylic odylism odylist odylization odylize Odynerus Odyssean Odyssey Odz Odzookers Odzooks oe Oecanthus oecist oecodomic oecodomical oecoparasite oecoparasitism oecophobia oecumenian oecumenic oecumenical oecumenicalism oecumenicity oecus oedemerid Oedemeridae oedicnemine Oedicnemus Oedipal Oedipean Oedipus Oedogoniaceae oedogoniaceous Oedogoniales Oedogonium oenanthaldehyde oenanthate Oenanthe oenanthic oenanthol oenanthole oenanthyl oenanthylate oenanthylic oenin Oenocarpus oenochoe oenocyte oenocytic oenolin oenological oenologist oenology oenomancy Oenomaus oenomel oenometer oenophilist oenophobist oenopoetic Oenothera Oenotheraceae oenotheraceous Oenotrian oer oersted oes oesophageal oesophagi oesophagismus oesophagostomiasis Oesophagostomum oesophagus oestradiol Oestrelata oestrian oestriasis oestrid Oestridae oestrin oestriol oestroid oestrous oestrual oestruate oestruation oestrum oestrus of Ofer off offal offaling offbeat offcast offcome offcut offend offendable offendant offended offendedly offendedness offender offendible offendress offense offenseful offenseless offenselessly offenseproof offensible offensive offensively offensiveness offer offerable offeree offerer offering offeror offertorial offertory offgoing offgrade offhand offhanded offhandedly offhandedness office officeholder officeless officer officerage officeress officerhood officerial officerism officerless officership official officialdom officialese officialism officiality officialization officialize officially officialty officiant officiary officiate officiation officiator officinal officinally officious officiously officiousness offing offish offishly offishness offlet offlook offprint offsaddle offscape offscour offscourer offscouring offscum offset offshoot offshore offsider offspring offtake offtype offuscate offuscation offward offwards oflete Ofo oft often oftenness oftens oftentime oftentimes ofter oftest oftly oftness ofttime ofttimes oftwhiles Og ogaire Ogallala ogam ogamic Ogboni Ogcocephalidae Ogcocephalus ogdoad ogdoas ogee ogeed ogganition ogham oghamic Oghuz ogival ogive ogived Oglala ogle ogler ogmic Ogor Ogpu ogre ogreish ogreishly ogreism ogress ogrish ogrism ogtiern ogum Ogygia Ogygian oh ohelo ohia Ohio Ohioan ohm ohmage ohmic ohmmeter oho ohoy oidioid oidiomycosis oidiomycotic Oidium oii oikology oikoplast oil oilberry oilbird oilcan oilcloth oilcoat oilcup oildom oiled oiler oilery oilfish oilhole oilily oiliness oilless oillessness oillet oillike oilman oilmonger oilmongery oilometer oilpaper oilproof oilproofing oilseed oilskin oilskinned oilstock oilstone oilstove oiltight oiltightness oilway oily oilyish oime oinochoe oinology oinomancy oinomania oinomel oint ointment Oireachtas oisin oisivity oitava oiticica Ojibwa Ojibway Ok oka okapi Okapia okee okenite oket oki okia Okie Okinagan Oklafalaya Oklahannali Oklahoma Oklahoman okoniosis okonite okra okrug okshoofd okthabah Okuari okupukupu Olacaceae olacaceous Olaf olam olamic Olax Olcha Olchi Old old olden Oldenburg older oldermost oldfangled oldfangledness Oldfieldia Oldhamia oldhamite oldhearted oldish oldland oldness oldster oldwife Ole Olea Oleaceae oleaceous Oleacina Oleacinidae oleaginous oleaginousness oleana oleander oleandrin Olearia olease oleaster oleate olecranal olecranarthritis olecranial olecranian olecranoid olecranon olefiant olefin olefine olefinic Oleg oleic oleiferous olein olena olenellidian Olenellus olenid Olenidae olenidian olent Olenus oleo oleocalcareous oleocellosis oleocyst oleoduct oleograph oleographer oleographic oleography oleomargaric oleomargarine oleometer oleoptene oleorefractometer oleoresin oleoresinous oleosaccharum oleose oleosity oleostearate oleostearin oleothorax oleous Oleraceae oleraceous olericultural olericulturally olericulture Oleron Olethreutes olethreutid Olethreutidae olfact olfactible olfaction olfactive olfactology olfactometer olfactometric olfactometry olfactor olfactorily olfactory olfacty Olga oliban olibanum olid oligacanthous oligaemia oligandrous oliganthous oligarch oligarchal oligarchic oligarchical oligarchically oligarchism oligarchist oligarchize oligarchy oligemia oligidria oligist oligistic oligistical oligocarpous Oligocene Oligochaeta oligochaete oligochaetous oligochete oligocholia oligochrome oligochromemia oligochronometer oligochylia oligoclase oligoclasite oligocystic oligocythemia oligocythemic oligodactylia oligodendroglia oligodendroglioma oligodipsia oligodontous oligodynamic oligogalactia oligohemia oligohydramnios oligolactia oligomenorrhea oligomerous oligomery oligometochia oligometochic Oligomyodae oligomyodian oligomyoid Oligonephria oligonephric oligonephrous oligonite oligopepsia oligopetalous oligophagous oligophosphaturia oligophrenia oligophrenic oligophyllous oligoplasmia oligopnea oligopolistic oligopoly oligoprothesy oligoprothetic oligopsonistic oligopsony oligopsychia oligopyrene oligorhizous oligosepalous oligosialia oligosideric oligosiderite oligosite oligospermia oligospermous oligostemonous oligosyllabic oligosyllable oligosynthetic oligotokous oligotrichia oligotrophic oligotrophy oligotropic oliguresis oliguretic oliguria Olinia Oliniaceae oliniaceous olio oliphant oliprance olitory Oliva oliva olivaceous olivary Olive olive Olivean olived Olivella oliveness olivenite Oliver Oliverian oliverman oliversmith olivescent olivet Olivetan Olivette olivewood Olivia Olividae Olivier oliviferous oliviform olivil olivile olivilin olivine olivinefels olivinic olivinite olivinitic olla ollamh ollapod ollenite Ollie ollock olm Olneya Olof ological ologist ologistic ology olomao olona Olonets Olonetsian Olonetsish Olor oloroso olpe Olpidiaster Olpidium Olson oltonde oltunna olycook olykoek Olympia Olympiad Olympiadic Olympian Olympianism Olympianize Olympianly Olympianwise Olympic Olympicly Olympicness Olympieion Olympionic Olympus Olynthiac Olynthian Olynthus om omadhaun omagra Omagua Omaha omalgia Oman Omani omao Omar omarthritis omasitis omasum omber ombrette ombrifuge ombrograph ombrological ombrology ombrometer ombrophile ombrophilic ombrophilous ombrophily ombrophobe ombrophobous ombrophoby ombrophyte ombudsman ombudsmanship omega omegoid omelet omelette omen omened omenology omental omentectomy omentitis omentocele omentofixation omentopexy omentoplasty omentorrhaphy omentosplenopexy omentotomy omentulum omentum omer omicron omina ominous ominously ominousness omissible omission omissive omissively omit omitis omittable omitter omlah Ommastrephes Ommastrephidae ommateal ommateum ommatidial ommatidium ommatophore ommatophorous Ommiad Ommiades omneity omniactive omniactuality omniana omniarch omnibenevolence omnibenevolent omnibus omnibusman omnicausality omnicompetence omnicompetent omnicorporeal omnicredulity omnicredulous omnidenominational omnierudite omniessence omnifacial omnifarious omnifariously omnifariousness omniferous omnific omnificent omnifidel omniform omniformal omniformity omnify omnigenous omnigerent omnigraph omnihuman omnihumanity omnilegent omnilingual omniloquent omnilucent omnimental omnimeter omnimode omnimodous omninescience omninescient omniparent omniparient omniparity omniparous omnipatient omnipercipience omnipercipiency omnipercipient omniperfect omnipotence omnipotency omnipotent omnipotentiality omnipotently omnipregnant omnipresence omnipresent omnipresently omniprevalence omniprevalent omniproduction omniprudent omnirange omniregency omnirepresentative omnirepresentativeness omnirevealing omniscience omnisciency omniscient omnisciently omniscope omniscribent omniscriptive omnisentience omnisentient omnisignificance omnisignificant omnispective omnist omnisufficiency omnisufficient omnitemporal omnitenent omnitolerant omnitonal omnitonality omnitonic omnitude omnium omnivagant omnivalence omnivalent omnivalous omnivarious omnividence omnivident omnivision omnivolent Omnivora omnivoracious omnivoracity omnivorant omnivore omnivorous omnivorously omnivorousness omodynia omohyoid omoideum omophagia omophagist omophagous omophagy omophorion omoplate omoplatoscopy omostegite omosternal omosternum omphacine omphacite omphalectomy omphalic omphalism omphalitis omphalocele omphalode omphalodium omphalogenous omphaloid omphaloma omphalomesaraic omphalomesenteric omphaloncus omphalopagus omphalophlebitis omphalopsychic omphalopsychite omphalorrhagia omphalorrhea omphalorrhexis omphalos omphalosite omphaloskepsis omphalospinous omphalotomy omphalotripsy omphalus on Ona ona onager Onagra onagra Onagraceae onagraceous Onan onanism onanist onanistic onca once oncetta Onchidiidae Onchidium Onchocerca onchocerciasis onchocercosis oncia Oncidium oncin oncograph oncography oncologic oncological oncology oncome oncometer oncometric oncometry oncoming Oncorhynchus oncosimeter oncosis oncosphere oncost oncostman oncotomy ondagram ondagraph ondameter ondascope ondatra ondine ondogram ondograph ondometer ondoscope ondy one oneanother oneberry onefold onefoldness onegite onehearted onehow Oneida oneiric oneirocrit oneirocritic oneirocritical oneirocritically oneirocriticism oneirocritics oneirodynia oneirologist oneirology oneiromancer oneiromancy oneiroscopic oneiroscopist oneiroscopy oneirotic oneism onement oneness oner onerary onerative onerosity onerous onerously onerousness onery oneself onesigned onetime onewhere oneyer onfall onflemed onflow onflowing ongaro ongoing onhanger onicolo oniomania oniomaniac onion onionet onionized onionlike onionpeel onionskin oniony onirotic Oniscidae onisciform oniscoid Oniscoidea oniscoidean Oniscus onium onkilonite onkos onlay onlepy onliest onliness onlook onlooker onlooking only onmarch Onmun Onobrychis onocentaur Onoclea onofrite Onohippidium onolatry onomancy onomantia onomastic onomasticon onomatologist onomatology onomatomania onomatope onomatoplasm onomatopoeia onomatopoeial onomatopoeian onomatopoeic onomatopoeical onomatopoeically onomatopoesis onomatopoesy onomatopoetic onomatopoetically onomatopy onomatous onomomancy Onondaga Onondagan Ononis Onopordon Onosmodium onrush onrushing ons onset onsetter onshore onside onsight onslaught onstand onstanding onstead onsweep onsweeping ontal Ontarian Ontaric onto ontocycle ontocyclic ontogenal ontogenesis ontogenetic ontogenetical ontogenetically ontogenic ontogenically ontogenist ontogeny ontography ontologic ontological ontologically ontologism ontologist ontologistic ontologize ontology ontosophy onus onwaiting onward onwardly onwardness onwards onycha onychatrophia onychauxis onychia onychin onychitis onychium onychogryposis onychoid onycholysis onychomalacia onychomancy onychomycosis onychonosus onychopathic onychopathology onychopathy onychophagist onychophagy Onychophora onychophoran onychophorous onychophyma onychoptosis onychorrhexis onychoschizia onychosis onychotrophy onym onymal onymancy onymatic onymity onymize onymous onymy onyx onyxis onyxitis onza ooangium ooblast ooblastic oocyesis oocyst Oocystaceae oocystaceous oocystic Oocystis oocyte oodles ooecial ooecium oofbird ooftish oofy oogamete oogamous oogamy oogenesis oogenetic oogeny ooglea oogone oogonial oogoniophore oogonium oograph ooid ooidal ookinesis ookinete ookinetic oolak oolemma oolite oolitic oolly oologic oological oologically oologist oologize oology oolong oomancy oomantia oometer oometric oometry oomycete Oomycetes oomycetous oons oont oopak oophoralgia oophorauxe oophore oophorectomy oophoreocele oophorhysterectomy oophoric oophoridium oophoritis oophoroepilepsy oophoroma oophoromalacia oophoromania oophoron oophoropexy oophororrhaphy oophorosalpingectomy oophorostomy oophorotomy oophyte oophytic ooplasm ooplasmic ooplast oopod oopodal ooporphyrin oorali oord ooscope ooscopy oosperm oosphere oosporange oosporangium oospore Oosporeae oosporic oosporiferous oosporous oostegite oostegitic ootheca oothecal ootid ootocoid Ootocoidea ootocoidean ootocous ootype ooze oozily ooziness oozooid oozy opacate opacification opacifier opacify opacite opacity opacous opacousness opah opal opaled opalesce opalescence opalescent opalesque Opalina opaline opalinid Opalinidae opalinine opalish opalize opaloid opaque opaquely opaqueness Opata opdalite ope Opegrapha opeidoscope opelet open openable openband openbeak openbill opencast opener openhanded openhandedly openhandedness openhead openhearted openheartedly openheartedness opening openly openmouthed openmouthedly openmouthedness openness openside openwork opera operability operabily operable operae operagoer operalogue operameter operance operancy operand operant operatable operate operatee operatic operatical operatically operating operation operational operationalism operationalist operationism operationist operative operatively operativeness operativity operatize operator operatory operatrix opercle opercled opercula opercular Operculata operculate operculated operculiferous operculiform operculigenous operculigerous operculum operetta operette operettist operose operosely operoseness operosity Ophelia ophelimity Ophian ophiasis ophic ophicalcite Ophicephalidae ophicephaloid Ophicephalus Ophichthyidae ophichthyoid ophicleide ophicleidean ophicleidist Ophidia ophidian Ophidiidae Ophidiobatrachia ophidioid Ophidion ophidiophobia ophidious ophidologist ophidology Ophiobatrachia Ophiobolus Ophioglossaceae ophioglossaceous Ophioglossales Ophioglossum ophiography ophioid ophiolater ophiolatrous ophiolatry ophiolite ophiolitic ophiologic ophiological ophiologist ophiology ophiomancy ophiomorph Ophiomorpha ophiomorphic ophiomorphous Ophion ophionid Ophioninae ophionine ophiophagous ophiophilism ophiophilist ophiophobe ophiophobia ophiophoby ophiopluteus Ophiosaurus ophiostaphyle ophiouride Ophis Ophisaurus Ophism Ophite ophite Ophitic ophitic Ophitism Ophiuchid Ophiuchus ophiuran ophiurid Ophiurida ophiuroid Ophiuroidea ophiuroidean ophryon Ophrys ophthalaiater ophthalmagra ophthalmalgia ophthalmalgic ophthalmatrophia ophthalmectomy ophthalmencephalon ophthalmetrical ophthalmia ophthalmiac ophthalmiatrics ophthalmic ophthalmious ophthalmist ophthalmite ophthalmitic ophthalmitis ophthalmoblennorrhea ophthalmocarcinoma ophthalmocele ophthalmocopia ophthalmodiagnosis ophthalmodiastimeter ophthalmodynamometer ophthalmodynia ophthalmography ophthalmoleucoscope ophthalmolith ophthalmologic ophthalmological ophthalmologist ophthalmology ophthalmomalacia ophthalmometer ophthalmometric ophthalmometry ophthalmomycosis ophthalmomyositis ophthalmomyotomy ophthalmoneuritis ophthalmopathy ophthalmophlebotomy ophthalmophore ophthalmophorous ophthalmophthisis ophthalmoplasty ophthalmoplegia ophthalmoplegic ophthalmopod ophthalmoptosis ophthalmorrhagia ophthalmorrhea ophthalmorrhexis Ophthalmosaurus ophthalmoscope ophthalmoscopic ophthalmoscopical ophthalmoscopist ophthalmoscopy ophthalmostasis ophthalmostat ophthalmostatometer ophthalmothermometer ophthalmotomy ophthalmotonometer ophthalmotonometry ophthalmotrope ophthalmotropometer ophthalmy opianic opianyl opiate opiateproof opiatic Opiconsivia opificer opiism Opilia Opiliaceae opiliaceous Opiliones Opilionina opilionine Opilonea Opimian opinability opinable opinably opinant opination opinative opinatively opinator opine opiner opiniaster opiniastre opiniastrety opiniastrous opiniater opiniative opiniatively opiniativeness opiniatreness opiniatrety opinion opinionable opinionaire opinional opinionate opinionated opinionatedly opinionatedness opinionately opinionative opinionatively opinionativeness opinioned opinionedness opinionist opiomania opiomaniac opiophagism opiophagy opiparous opisometer opisthenar opisthion opisthobranch Opisthobranchia opisthobranchiate Opisthocoelia opisthocoelian opisthocoelous opisthocome Opisthocomi Opisthocomidae opisthocomine opisthocomous opisthodetic opisthodome opisthodomos opisthodomus opisthodont opisthogastric Opisthoglossa opisthoglossal opisthoglossate opisthoglyph Opisthoglypha opisthoglyphic opisthoglyphous Opisthognathidae opisthognathism opisthognathous opisthograph opisthographal opisthographic opisthographical opisthography opisthogyrate opisthogyrous Opisthoparia opisthoparian opisthophagic opisthoporeia opisthorchiasis Opisthorchis opisthosomal Opisthothelae opisthotic opisthotonic opisthotonoid opisthotonos opisthotonus opium opiumism opobalsam opodeldoc opodidymus opodymus opopanax Oporto opossum opotherapy Oppian oppidan oppilate oppilation oppilative opponency opponent opportune opportuneless opportunely opportuneness opportunism opportunist opportunistic opportunistically opportunity opposability opposable oppose opposed opposeless opposer opposing opposingly opposit opposite oppositely oppositeness oppositiflorous oppositifolious opposition oppositional oppositionary oppositionism oppositionist oppositionless oppositious oppositipetalous oppositipinnate oppositipolar oppositisepalous oppositive oppositively oppositiveness opposure oppress oppressed oppressible oppression oppressionist oppressive oppressively oppressiveness oppressor opprobriate opprobrious opprobriously opprobriousness opprobrium opprobry oppugn oppugnacy oppugnance oppugnancy oppugnant oppugnate oppugnation oppugner opsigamy opsimath opsimathy opsiometer opsisform opsistype opsonic opsoniferous opsonification opsonify opsonin opsonist opsonium opsonization opsonize opsonogen opsonoid opsonology opsonometry opsonophilia opsonophilic opsonophoric opsonotherapy opsy opt optable optableness optably optant optate optation optative optatively opthalmophorium opthalmoplegy opthalmothermometer optic optical optically optician opticist opticity opticochemical opticociliary opticon opticopapillary opticopupillary optics optigraph optimacy optimal optimate optimates optime optimism optimist optimistic optimistical optimistically optimity optimization optimize optimum option optional optionality optionalize optionally optionary optionee optionor optive optoblast optogram optography optological optologist optology optomeninx optometer optometrical optometrist optometry optophone optotechnics optotype Opulaster opulence opulency opulent opulently opulus Opuntia Opuntiaceae Opuntiales opuntioid opus opuscular opuscule opusculum oquassa or ora orabassu orach oracle oracular oracularity oracularly oracularness oraculate oraculous oraculously oraculousness oraculum orad orage oragious Orakzai oral oraler oralism oralist orality oralization oralize orally oralogist oralogy Orang orang orange orangeade orangebird Orangeism Orangeist orangeleaf Orangeman orangeman oranger orangeroot orangery orangewoman orangewood orangey orangism orangist orangite orangize orangutan orant Oraon orarian orarion orarium orary orate oration orational orationer orator oratorial oratorially Oratorian oratorian Oratorianism Oratorianize oratoric oratorical oratorically oratorio oratorize oratorlike oratorship oratory oratress oratrix orb orbed orbic orbical Orbicella orbicle orbicular orbicularis orbicularity orbicularly orbicularness orbiculate orbiculated orbiculately orbiculation orbiculatocordate orbiculatoelliptical Orbiculoidea orbific Orbilian Orbilius orbit orbital orbitale orbitar orbitary orbite orbitelar Orbitelariae orbitelarian orbitele orbitelous orbitofrontal Orbitoides Orbitolina orbitolite Orbitolites orbitomalar orbitomaxillary orbitonasal orbitopalpebral orbitosphenoid orbitosphenoidal orbitostat orbitotomy orbitozygomatic orbless orblet Orbulina orby orc Orca Orcadian orcanet orcein orchamus orchard orcharding orchardist orchardman orchat orchel orchella orchesis orchesography orchester Orchestia orchestian orchestic orchestiid Orchestiidae orchestra orchestral orchestraless orchestrally orchestrate orchestrater orchestration orchestrator orchestre orchestric orchestrina orchestrion orchialgia orchic orchichorea orchid Orchidaceae orchidacean orchidaceous Orchidales orchidalgia orchidectomy orchideous orchideously orchidist orchiditis orchidocele orchidocelioplasty orchidologist orchidology orchidomania orchidopexy orchidoplasty orchidoptosis orchidorrhaphy orchidotherapy orchidotomy orchiectomy orchiencephaloma orchiepididymitis orchil orchilla orchilytic orchiocatabasis orchiocele orchiodynia orchiomyeloma orchioncus orchioneuralgia orchiopexy orchioplasty orchiorrhaphy orchioscheocele orchioscirrhus orchiotomy Orchis orchitic orchitis orchotomy orcin orcinol Orcinus ordain ordainable ordainer ordainment ordanchite ordeal order orderable ordered orderedness orderer orderless orderliness orderly ordinable ordinal ordinally ordinance ordinand ordinant ordinar ordinarily ordinariness ordinarius ordinary ordinaryship ordinate ordinately ordination ordinative ordinatomaculate ordinator ordinee ordines ordnance ordonnance ordonnant ordosite Ordovian Ordovices Ordovician ordu ordure ordurous ore oread Oreamnos Oreas orecchion orectic orective oreillet orellin oreman orenda orendite Oreocarya Oreodon oreodont Oreodontidae oreodontine oreodontoid Oreodoxa Oreophasinae oreophasine Oreophasis Oreortyx oreotragine Oreotragus Oreotrochilus Orestean Oresteia oreweed orewood orexis orf orfgild organ organal organbird organdy organella organelle organer organette organic organical organically organicalness organicism organicismal organicist organicistic organicity organific organing organism organismal organismic organist organistic organistrum organistship organity organizability organizable organization organizational organizationally organizationist organizatory organize organized organizer organless organoantimony organoarsenic organobismuth organoboron organochordium organogel organogen organogenesis organogenetic organogenic organogenist organogeny organogold organographic organographical organographist organography organoid organoiron organolead organoleptic organolithium organologic organological organologist organology organomagnesium organomercury organometallic organon organonomic organonomy organonym organonymal organonymic organonymy organopathy organophil organophile organophilic organophone organophonic organophyly organoplastic organoscopy organosilicon organosilver organosodium organosol organotherapy organotin organotrophic organotropic organotropically organotropism organotropy organozinc organry organule organum organzine orgasm orgasmic orgastic orgeat orgia orgiac orgiacs orgiasm orgiast orgiastic orgiastical orgic orgue orguinette orgulous orgulously orgy orgyia Orias Oribatidae oribi orichalceous orichalch orichalcum oriconic oricycle oriel oriency orient Oriental oriental Orientalia orientalism orientalist orientality orientalization orientalize orientally Orientalogy orientate orientation orientative orientator orientite orientization orientize oriently orientness orifacial orifice orificial oriflamb oriflamme oriform origan origanized Origanum Origenian Origenic Origenical Origenism Origenist Origenistic Origenize origin originable original originalist originality originally originalness originant originarily originary originate origination originative originatively originator originatress originist orignal orihon orihyperbola orillion orillon orinasal orinasality oriole Oriolidae Oriolus Orion Oriskanian orismologic orismological orismology orison orisphere oristic Oriya Orkhon Orkneyan Orlando orle orlean Orleanism Orleanist Orleanistic Orleans orlet orleways orlewise orlo orlop Ormazd ormer ormolu Ormond orna ornament ornamental ornamentalism ornamentalist ornamentality ornamentalize ornamentally ornamentary ornamentation ornamenter ornamentist ornate ornately ornateness ornation ornature orneriness ornery ornis orniscopic orniscopist orniscopy ornithic ornithichnite ornithine Ornithischia ornithischian ornithivorous ornithobiographical ornithobiography ornithocephalic Ornithocephalidae ornithocephalous Ornithocephalus ornithocoprolite ornithocopros ornithodelph Ornithodelphia ornithodelphian ornithodelphic ornithodelphous Ornithodoros Ornithogaea Ornithogaean Ornithogalum ornithogeographic ornithogeographical ornithography ornithoid Ornitholestes ornitholite ornitholitic ornithologic ornithological ornithologically ornithologist ornithology ornithomancy ornithomantia ornithomantic ornithomantist Ornithomimidae Ornithomimus ornithomorph ornithomorphic ornithomyzous ornithon Ornithopappi ornithophile ornithophilist ornithophilite ornithophilous ornithophily ornithopod Ornithopoda ornithopter Ornithoptera Ornithopteris Ornithorhynchidae ornithorhynchous Ornithorhynchus ornithosaur Ornithosauria ornithosaurian Ornithoscelida ornithoscelidan ornithoscopic ornithoscopist ornithoscopy ornithosis ornithotomical ornithotomist ornithotomy ornithotrophy Ornithurae ornithuric ornithurous ornoite oroanal Orobanchaceae orobanchaceous Orobanche orobancheous orobathymetric Orobatoidea Orochon orocratic orodiagnosis orogen orogenesis orogenesy orogenetic orogenic orogeny orograph orographic orographical orographically orography oroheliograph Orohippus orohydrographic orohydrographical orohydrography oroide orolingual orological orologist orology orometer orometric orometry Oromo oronasal oronoco Orontium oropharyngeal oropharynx orotherapy Orotinan orotund orotundity orphan orphancy orphandom orphange orphanhood orphanism orphanize orphanry orphanship orpharion Orphean Orpheist orpheon orpheonist orpheum Orpheus Orphic Orphical Orphically Orphicism Orphism Orphize orphrey orphreyed orpiment orpine Orpington orrery orrhoid orrhology orrhotherapy orris orrisroot orseille orseilline orsel orselle orseller orsellic orsellinate orsellinic Orson ort ortalid Ortalidae ortalidian Ortalis ortet Orthagoriscus orthal orthantimonic Ortheris orthian orthic orthicon orthid Orthidae Orthis orthite orthitic ortho orthoarsenite orthoaxis orthobenzoquinone orthobiosis orthoborate orthobrachycephalic orthocarbonic orthocarpous Orthocarpus orthocenter orthocentric orthocephalic orthocephalous orthocephaly orthoceracone Orthoceran Orthoceras Orthoceratidae orthoceratite orthoceratitic orthoceratoid orthochlorite orthochromatic orthochromatize orthoclase orthoclasite orthoclastic orthocoumaric orthocresol orthocymene orthodiaene orthodiagonal orthodiagram orthodiagraph orthodiagraphic orthodiagraphy orthodiazin orthodiazine orthodolichocephalic orthodomatic orthodome orthodontia orthodontic orthodontics orthodontist orthodox orthodoxal orthodoxality orthodoxally orthodoxian orthodoxical orthodoxically orthodoxism orthodoxist orthodoxly orthodoxness orthodoxy orthodromic orthodromics orthodromy orthoepic orthoepical orthoepically orthoepist orthoepistic orthoepy orthoformic orthogamous orthogamy orthogenesis orthogenetic orthogenic orthognathic orthognathism orthognathous orthognathus orthognathy orthogneiss orthogonal orthogonality orthogonally orthogonial orthograde orthogranite orthograph orthographer orthographic orthographical orthographically orthographist orthographize orthography orthohydrogen orthologer orthologian orthological orthology orthometopic orthometric orthometry Orthonectida orthonitroaniline orthopath orthopathic orthopathically orthopathy orthopedia orthopedic orthopedical orthopedically orthopedics orthopedist orthopedy orthophenylene orthophonic orthophony orthophoria orthophoric orthophosphate orthophosphoric orthophyre orthophyric orthopinacoid orthopinacoidal orthoplastic orthoplasy orthoplumbate orthopnea orthopneic orthopod Orthopoda orthopraxis orthopraxy orthoprism orthopsychiatric orthopsychiatrical orthopsychiatrist orthopsychiatry orthopter Orthoptera orthopteral orthopteran orthopterist orthopteroid Orthopteroidea orthopterological orthopterologist orthopterology orthopteron orthopterous orthoptic orthopyramid orthopyroxene orthoquinone orthorhombic Orthorrhapha orthorrhaphous orthorrhaphy orthoscope orthoscopic orthose orthosemidin orthosemidine orthosilicate orthosilicic orthosis orthosite orthosomatic orthospermous orthostatic orthostichous orthostichy orthostyle orthosubstituted orthosymmetric orthosymmetrical orthosymmetrically orthosymmetry orthotactic orthotectic orthotic orthotolidin orthotolidine orthotoluic orthotoluidin orthotoluidine orthotomic orthotomous orthotone orthotonesis orthotonic orthotonus orthotropal orthotropic orthotropism orthotropous orthotropy orthotype orthotypous orthovanadate orthovanadic orthoveratraldehyde orthoveratric orthoxazin orthoxazine orthoxylene orthron ortiga ortive Ortol ortolan Ortrud ortstein ortygan Ortygian Ortyginae ortygine Ortyx Orunchun orvietan orvietite Orvieto Orville ory Orycteropodidae Orycteropus oryctics oryctognostic oryctognostical oryctognostically oryctognosy Oryctolagus oryssid Oryssidae Oryssus Oryx Oryza oryzenin oryzivorous Oryzomys Oryzopsis Oryzorictes Oryzorictinae Os os Osage osamin osamine osazone Osc Oscan Oscar Oscarella Oscarellidae oscella oscheal oscheitis oscheocarcinoma oscheocele oscheolith oscheoma oscheoncus oscheoplasty Oschophoria oscillance oscillancy oscillant Oscillaria Oscillariaceae oscillariaceous oscillate oscillating oscillation oscillative oscillatively oscillator Oscillatoria Oscillatoriaceae oscillatoriaceous oscillatorian oscillatory oscillogram oscillograph oscillographic oscillography oscillometer oscillometric oscillometry oscilloscope oscin oscine Oscines oscinian Oscinidae oscinine Oscinis oscitance oscitancy oscitant oscitantly oscitate oscitation oscnode osculable osculant oscular oscularity osculate osculation osculatory osculatrix oscule osculiferous osculum oscurrantist ose osela oshac Osiandrian oside osier osiered osierlike osiery Osirian Osiride Osiridean Osirification Osirify Osiris Osirism Oskar Osmanie Osmanli Osmanthus osmate osmatic osmatism osmazomatic osmazomatous osmazome Osmeridae Osmerus osmesis osmeterium osmetic osmic osmidrosis osmin osmina osmious osmiridium osmium osmodysphoria osmogene osmograph osmolagnia osmology osmometer osmometric osmometry Osmond osmondite osmophore osmoregulation Osmorhiza osmoscope osmose osmosis osmotactic osmotaxis osmotherapy osmotic osmotically osmous osmund Osmunda Osmundaceae osmundaceous osmundine Osnaburg Osnappar osoberry osone osophy osotriazine osotriazole osphradial osphradium osphresiolagnia osphresiologic osphresiologist osphresiology osphresiometer osphresiometry osphresiophilia osphresis osphretic Osphromenidae osphyalgia osphyalgic osphyarthritis osphyitis osphyocele osphyomelitis osprey ossal ossarium ossature osse ossein osselet ossements osseoalbuminoid osseoaponeurotic osseocartilaginous osseofibrous osseomucoid osseous osseously Osset Ossetian Ossetic Ossetine Ossetish Ossian Ossianesque Ossianic Ossianism Ossianize ossicle ossicular ossiculate ossicule ossiculectomy ossiculotomy ossiculum ossiferous ossific ossification ossified ossifier ossifluence ossifluent ossiform ossifrage ossifrangent ossify ossivorous ossuarium ossuary ossypite ostalgia Ostara ostariophysan Ostariophyseae Ostariophysi ostariophysial ostariophysous ostarthritis osteal ostealgia osteanabrosis osteanagenesis ostearthritis ostearthrotomy ostectomy osteectomy osteectopia osteectopy Osteichthyes ostein osteitic osteitis ostemia ostempyesis ostensibility ostensible ostensibly ostension ostensive ostensively ostensorium ostensory ostent ostentate ostentation ostentatious ostentatiously ostentatiousness ostentive ostentous osteoaneurysm osteoarthritis osteoarthropathy osteoarthrotomy osteoblast osteoblastic osteoblastoma osteocachetic osteocarcinoma osteocartilaginous osteocele osteocephaloma osteochondritis osteochondrofibroma osteochondroma osteochondromatous osteochondropathy osteochondrophyte osteochondrosarcoma osteochondrous osteoclasia osteoclasis osteoclast osteoclastic osteoclasty osteocolla osteocomma osteocranium osteocystoma osteodentin osteodentinal osteodentine osteoderm osteodermal osteodermatous osteodermia osteodermis osteodiastasis osteodynia osteodystrophy osteoencephaloma osteoenchondroma osteoepiphysis osteofibroma osteofibrous osteogangrene osteogen osteogenesis osteogenetic osteogenic osteogenist osteogenous osteogeny osteoglossid Osteoglossidae osteoglossoid Osteoglossum osteographer osteography osteohalisteresis osteoid Osteolepidae Osteolepis osteolite osteologer osteologic osteological osteologically osteologist osteology osteolysis osteolytic osteoma osteomalacia osteomalacial osteomalacic osteomancy osteomanty osteomatoid osteomere osteometric osteometrical osteometry osteomyelitis osteoncus osteonecrosis osteoneuralgia osteopaedion osteopath osteopathic osteopathically osteopathist osteopathy osteopedion osteoperiosteal osteoperiostitis osteopetrosis osteophage osteophagia osteophlebitis osteophone osteophony osteophore osteophyma osteophyte osteophytic osteoplaque osteoplast osteoplastic osteoplasty osteoporosis osteoporotic osteorrhaphy osteosarcoma osteosarcomatous osteosclerosis osteoscope osteosis osteosteatoma osteostixis osteostomatous osteostomous osteostracan Osteostraci osteosuture osteosynovitis osteosynthesis osteothrombosis osteotome osteotomist osteotomy osteotribe osteotrite osteotrophic osteotrophy Ostertagia ostial ostiary ostiate Ostic ostiolar ostiolate ostiole ostitis ostium ostleress Ostmannic ostmark Ostmen ostosis Ostracea ostracean ostraceous Ostraciidae ostracine ostracioid Ostracion ostracism ostracizable ostracization ostracize ostracizer ostracod Ostracoda ostracode ostracoderm Ostracodermi ostracodous ostracoid Ostracoidea ostracon ostracophore Ostracophori ostracophorous ostracum Ostraeacea ostraite Ostrea ostreaceous ostreger ostreicultural ostreiculture ostreiculturist Ostreidae ostreiform ostreodynamometer ostreoid ostreophage ostreophagist ostreophagous ostrich ostrichlike Ostrogoth Ostrogothian Ostrogothic Ostrya Ostyak Oswald Oswegan otacoustic otacousticon Otaheitan otalgia otalgic otalgy Otaria otarian Otariidae Otariinae otariine otarine otarioid otary otate otectomy otelcosis Otello Othake othelcosis Othello othematoma othemorrhea otheoscope other otherdom otherest othergates otherguess otherhow otherism otherist otherness othersome othertime otherwards otherwhence otherwhere otherwhereness otherwheres otherwhile otherwhiles otherwhither otherwise otherwiseness otherworld otherworldliness otherworldly otherworldness Othin Othinism othmany Othonna othygroma otiant otiatric otiatrics otiatry otic oticodinia Otidae Otides Otididae otidiform otidine Otidiphaps otidium otiorhynchid Otiorhynchidae Otiorhynchinae otiose otiosely otioseness otiosity Otis otitic otitis otkon Oto otoantritis otoblennorrhea otocariasis otocephalic otocephaly otocerebritis otocleisis otoconial otoconite otoconium otocrane otocranial otocranic otocranium Otocyon otocyst otocystic otodynia otodynic otoencephalitis otogenic otogenous otographical otography Otogyps otohemineurasthenia otolaryngologic otolaryngologist otolaryngology otolite otolith Otolithidae Otolithus otolitic otological otologist otology Otomaco otomassage Otomi Otomian Otomitlan otomucormycosis otomyces otomycosis otonecrectomy otoneuralgia otoneurasthenia otopathic otopathy otopharyngeal otophone otopiesis otoplastic otoplasty otopolypus otopyorrhea otopyosis otorhinolaryngologic otorhinolaryngologist otorhinolaryngology otorrhagia otorrhea otorrhoea otosalpinx otosclerosis otoscope otoscopic otoscopy otosis otosphenal otosteal otosteon ototomy Otozoum ottajanite ottar ottavarima Ottawa otter otterer otterhound ottinger ottingkar Otto otto Ottoman Ottomanean Ottomanic Ottomanism Ottomanization Ottomanize Ottomanlike Ottomite ottrelife Ottweilian Otuquian oturia Otus Otyak ouabain ouabaio ouabe ouachitite ouakari ouananiche oubliette ouch Oudemian oudenarde Oudenodon oudenodont ouenite ouf ough ought oughtness oughtnt Ouija ouistiti oukia oulap ounce ounds ouphe ouphish our Ouranos ourie ouroub Ourouparia ours ourself ourselves oust ouster out outact outadmiral Outagami outage outambush outarde outargue outask outawe outbabble outback outbacker outbake outbalance outban outbanter outbar outbargain outbark outbawl outbeam outbear outbearing outbeg outbeggar outbelch outbellow outbent outbetter outbid outbidder outbirth outblacken outblaze outbleat outbleed outbless outbloom outblossom outblot outblow outblowing outblown outbluff outblunder outblush outbluster outboard outboast outbolting outbond outbook outborn outborough outbound outboundaries outbounds outbow outbowed outbowl outbox outbrag outbranch outbranching outbrave outbray outbrazen outbreak outbreaker outbreaking outbreath outbreathe outbreather outbred outbreed outbreeding outbribe outbridge outbring outbrother outbud outbuild outbuilding outbulge outbulk outbully outburn outburst outbustle outbuy outbuzz outby outcant outcaper outcarol outcarry outcase outcast outcaste outcasting outcastness outcavil outchamber outcharm outchase outchatter outcheat outchide outcity outclamor outclass outclerk outclimb outcome outcomer outcoming outcompass outcomplete outcompliment outcorner outcountry outcourt outcrawl outcricket outcrier outcrop outcropper outcross outcrossing outcrow outcrowd outcry outcull outcure outcurse outcurve outcut outdaciousness outdance outdare outdate outdated outdazzle outdevil outdispatch outdistance outdistrict outdo outdodge outdoer outdoor outdoorness outdoors outdoorsman outdraft outdragon outdraw outdream outdress outdrink outdrive outdure outdwell outdweller outdwelling outeat outecho outed outedge outen outer outerly outermost outerness outerwear outeye outeyed outfable outface outfall outfame outfangthief outfast outfawn outfeast outfeat outfeeding outfence outferret outfiction outfield outfielder outfieldsman outfight outfighter outfighting outfigure outfish outfit outfitter outflame outflank outflanker outflanking outflare outflash outflatter outfling outfloat outflourish outflow outflue outflung outflunky outflush outflux outfly outfold outfool outfoot outform outfort outfreeman outfront outfroth outfrown outgabble outgain outgallop outgamble outgame outgang outgarment outgarth outgas outgate outgauge outgaze outgeneral outgive outgiving outglad outglare outgleam outglitter outgloom outglow outgnaw outgo outgoer outgoing outgoingness outgone outgreen outgrin outground outgrow outgrowing outgrowth outguard outguess outgun outgush outhammer outhasten outhaul outhauler outhear outheart outhector outheel outher outhire outhiss outhit outhold outhorror outhouse outhousing outhowl outhue outhumor outhunt outhurl outhut outhymn outhyperbolize outimage outing outinvent outish outissue outjazz outjest outjet outjetting outjinx outjockey outjourney outjuggle outjump outjut outkeeper outkick outkill outking outkiss outkitchen outknave outknee outlabor outlaid outlance outland outlander outlandish outlandishlike outlandishly outlandishness outlash outlast outlaugh outlaunch outlaw outlawry outlay outlean outleap outlearn outlegend outlength outlengthen outler outlet outlie outlier outlighten outlimb outlimn outline outlinear outlined outlineless outliner outlinger outlip outlipped outlive outliver outlodging outlook outlooker outlord outlove outlung outluster outly outlying outmagic outmalaprop outman outmaneuver outmantle outmarch outmarriage outmarry outmaster outmatch outmate outmeasure outmerchant outmiracle outmode outmoded outmost outmount outmouth outmove outname outness outnight outnoise outnook outnumber outoffice outoven outpace outpage outpaint outparagon outparamour outparish outpart outpass outpassion outpath outpatient outpay outpayment outpeal outpeep outpeer outpension outpensioner outpeople outperform outpick outpicket outpipe outpitch outpity outplace outplan outplay outplayed outplease outplod outplot outpocketing outpoint outpoise outpoison outpoll outpomp outpop outpopulate outporch outport outporter outportion outpost outpouching outpour outpourer outpouring outpractice outpraise outpray outpreach outpreen outprice outprodigy outproduce outpromise outpry outpull outpupil outpurl outpurse outpush output outputter outquaff outquarters outqueen outquestion outquibble outquote outrace outrage outrageous outrageously outrageousness outrageproof outrager outraging outrail outrance outrange outrank outrant outrap outrate outraught outrave outray outre outreach outread outreason outreckon outredden outrede outreign outrelief outremer outreness outrhyme outrick outride outrider outriding outrig outrigger outriggered outriggerless outrigging outright outrightly outrightness outring outrival outroar outrogue outroll outromance outrooper outroot outrove outrow outroyal outrun outrunner outrush outsail outsaint outsally outsatisfy outsavor outsay outscent outscold outscore outscorn outscour outscouring outscream outsea outseam outsearch outsee outseek outsell outsentry outsert outservant outset outsetting outsettlement outsettler outshadow outshake outshame outshape outsharp outsharpen outsheathe outshift outshine outshiner outshoot outshot outshoulder outshout outshove outshow outshower outshriek outshrill outshut outside outsided outsidedness outsideness outsider outsift outsigh outsight outsin outsing outsit outsize outsized outskill outskip outskirmish outskirmisher outskirt outskirter outslander outslang outsleep outslide outslink outsmart outsmell outsmile outsnatch outsnore outsoar outsole outsoler outsonnet outsophisticate outsound outspan outsparkle outspeak outspeaker outspeech outspeed outspell outspend outspent outspill outspin outspirit outspit outsplendor outspoken outspokenly outspokenness outsport outspout outspread outspring outsprint outspue outspurn outspurt outstagger outstair outstand outstander outstanding outstandingly outstandingness outstare outstart outstarter outstartle outstate outstation outstatistic outstature outstay outsteal outsteam outstep outsting outstink outstood outstorm outstrain outstream outstreet outstretch outstretcher outstride outstrike outstrip outstrive outstroke outstrut outstudent outstudy outstunt outsubtle outsuck outsucken outsuffer outsuitor outsulk outsum outsuperstition outswagger outswarm outswear outsweep outsweeping outsweeten outswell outswift outswim outswindle outswing outswirl outtaken outtalent outtalk outtask outtaste outtear outtease outtell outthieve outthink outthreaten outthrob outthrough outthrow outthrust outthruster outthunder outthwack outtinkle outtire outtoil outtongue outtop outtower outtrade outtrail outtravel outtrick outtrot outtrump outturn outturned outtyrannize outusure outvalue outvanish outvaunt outvelvet outvenom outvictor outvie outvier outvigil outvillage outvillain outvociferate outvoice outvote outvoter outvoyage outwait outwake outwale outwalk outwall outwallop outwander outwar outwarble outward outwardly outwardmost outwardness outwards outwash outwaste outwatch outwater outwave outwealth outweapon outwear outweary outweave outweed outweep outweigh outweight outwell outwent outwhirl outwick outwile outwill outwind outwindow outwing outwish outwit outwith outwittal outwitter outwoe outwoman outwood outword outwore outwork outworker outworld outworn outworth outwrangle outwrench outwrest outwrestle outwriggle outwring outwrite outwrought outyard outyell outyelp outyield outzany ouzel Ova ova Ovaherero oval ovalbumin ovalescent ovaliform ovalish ovalization ovalize ovally ovalness ovaloid ovalwise Ovambo Ovampo Ovangangela ovant ovarial ovarian ovarin ovarioabdominal ovariocele ovariocentesis ovariocyesis ovariodysneuria ovariohysterectomy ovariole ovariolumbar ovariorrhexis ovariosalpingectomy ovariosteresis ovariostomy ovariotomist ovariotomize ovariotomy ovariotubal ovarious ovaritis ovarium ovary ovate ovateconical ovated ovately ovation ovational ovationary ovatoacuminate ovatoconical ovatocordate ovatocylindraceous ovatodeltoid ovatoellipsoidal ovatoglobose ovatolanceolate ovatooblong ovatoorbicular ovatopyriform ovatoquadrangular ovatorotundate ovatoserrate ovatotriangular oven ovenbird ovenful ovenlike ovenly ovenman ovenpeel ovenstone ovenware ovenwise over overability overable overabound overabsorb overabstain overabstemious overabstemiousness overabundance overabundant overabundantly overabuse overaccentuate overaccumulate overaccumulation overaccuracy overaccurate overaccurately overact overaction overactive overactiveness overactivity overacute overaddiction overadvance overadvice overaffect overaffirmation overafflict overaffliction overage overageness overaggravate overaggravation overagitate overagonize overall overalled overalls overambitioned overambitious overambling overanalyze overangelic overannotate overanswer overanxiety overanxious overanxiously overappareled overappraisal overappraise overapprehended overapprehension overapprehensive overapt overarch overargue overarm overartificial overartificiality overassail overassert overassertion overassertive overassertively overassertiveness overassess overassessment overassumption overattached overattachment overattention overattentive overattentively overawe overawful overawn overawning overbake overbalance overballast overbalm overbanded overbandy overbank overbanked overbark overbarren overbarrenness overbase overbaseness overbashful overbashfully overbashfulness overbattle overbear overbearance overbearer overbearing overbearingly overbearingness overbeat overbeating overbeetling overbelief overbend overbepatched overberg overbet overbias overbid overbig overbigness overbillow overbit overbite overbitten overbitter overbitterly overbitterness overblack overblame overblaze overbleach overblessed overblessedness overblind overblindly overblithe overbloom overblouse overblow overblowing overblown overboard overboast overboastful overbodice overboding overbody overboil overbold overboldly overboldness overbook overbookish overbooming overborne overborrow overbought overbound overbounteous overbounteously overbounteousness overbow overbowed overbowl overbrace overbragging overbrained overbranch overbrave overbravely overbravery overbray overbreak overbreathe overbred overbreed overbribe overbridge overbright overbrightly overbrightness overbrilliancy overbrilliant overbrilliantly overbrim overbrimmingly overbroaden overbroil overbrood overbrow overbrown overbrowse overbrush overbrutal overbrutality overbrutalize overbrutally overbubbling overbuild overbuilt overbulk overbulky overbumptious overburden overburdeningly overburdensome overburn overburned overburningly overburnt overburst overburthen overbusily overbusiness overbusy overbuy overby overcall overcanny overcanopy overcap overcapable overcapably overcapacity overcape overcapitalization overcapitalize overcaptious overcaptiously overcaptiousness overcard overcare overcareful overcarefully overcareless overcarelessly overcarelessness overcaring overcarking overcarry overcast overcasting overcasual overcasually overcatch overcaution overcautious overcautiously overcautiousness overcentralization overcentralize overcertification overcertify overchafe overchannel overchant overcharge overchargement overcharger overcharitable overcharitably overcharity overchase overcheap overcheaply overcheapness overcheck overcherish overchidden overchief overchildish overchildishness overchill overchlorinate overchoke overchrome overchurch overcirculate overcircumspect overcircumspection overcivil overcivility overcivilization overcivilize overclaim overclamor overclasp overclean overcleanly overcleanness overcleave overclever overcleverness overclimb overcloak overclog overclose overclosely overcloseness overclothe overclothes overcloud overcloy overcluster overcoached overcoat overcoated overcoating overcoil overcold overcoldly overcollar overcolor overcomable overcome overcomer overcomingly overcommand overcommend overcommon overcommonly overcommonness overcompensate overcompensation overcompensatory overcompetition overcompetitive overcomplacency overcomplacent overcomplacently overcomplete overcomplex overcomplexity overcompliant overcompound overconcentrate overconcentration overconcern overconcerned overcondensation overcondense overconfidence overconfident overconfidently overconfute overconquer overconscientious overconscious overconsciously overconsciousness overconservatism overconservative overconservatively overconsiderate overconsiderately overconsideration overconsume overconsumption overcontented overcontentedly overcontentment overcontract overcontraction overcontribute overcontribution overcook overcool overcoolly overcopious overcopiously overcopiousness overcorned overcorrect overcorrection overcorrupt overcorruption overcorruptly overcostly overcount overcourteous overcourtesy overcover overcovetous overcovetousness overcow overcoy overcoyness overcram overcredit overcredulity overcredulous overcredulously overcreed overcreep overcritical overcritically overcriticalness overcriticism overcriticize overcrop overcross overcrow overcrowd overcrowded overcrowdedly overcrowdedness overcrown overcrust overcry overcull overcultivate overcultivation overculture overcultured overcumber overcunning overcunningly overcunningness overcup overcured overcurious overcuriously overcuriousness overcurl overcurrency overcurrent overcurtain overcustom overcut overcutter overcutting overdaintily overdaintiness overdainty overdamn overdance overdangle overdare overdaringly overdarken overdash overdazed overdazzle overdeal overdear overdearly overdearness overdeck overdecorate overdecoration overdecorative overdeeming overdeep overdeepen overdeeply overdeliberate overdeliberation overdelicacy overdelicate overdelicately overdelicious overdeliciously overdelighted overdelightedly overdemand overdemocracy overdepress overdepressive overdescant overdesire overdesirous overdesirousness overdestructive overdestructively overdestructiveness overdetermination overdetermined overdevelop overdevelopment overdevoted overdevotedly overdevotion overdiffuse overdiffusely overdiffuseness overdigest overdignified overdignifiedly overdignifiedness overdignify overdignity overdiligence overdiligent overdiligently overdilute overdilution overdischarge overdiscipline overdiscount overdiscourage overdiscouragement overdistance overdistant overdistantly overdistantness overdistempered overdistention overdiverse overdiversely overdiversification overdiversify overdiversity overdo overdoctrinize overdoer overdogmatic overdogmatically overdogmatism overdome overdominate overdone overdoor overdosage overdose overdoubt overdoze overdraft overdrain overdrainage overdramatic overdramatically overdrape overdrapery overdraw overdrawer overdream overdrench overdress overdrifted overdrink overdrip overdrive overdriven overdroop overdrowsed overdry overdubbed overdue overdunged overdure overdust overdye overeager overeagerly overeagerness overearnest overearnestly overearnestness overeasily overeasiness overeasy overeat overeaten overedge overedit overeducate overeducated overeducation overeducative overeffort overegg overelaborate overelaborately overelaboration overelate overelegance overelegancy overelegant overelegantly overelliptical overembellish overembellishment overembroider overemotional overemotionality overemotionalize overemphasis overemphasize overemphatic overemphatically overemphaticness overempired overemptiness overempty overenter overenthusiasm overenthusiastic overentreat overentry overequal overestimate overestimation overexcelling overexcitability overexcitable overexcitably overexcite overexcitement overexercise overexert overexerted overexertedly overexertedness overexertion overexpand overexpansion overexpansive overexpect overexpectant overexpectantly overexpenditure overexpert overexplain overexplanation overexpose overexposure overexpress overexquisite overexquisitely overextend overextension overextensive overextreme overexuberant overeye overeyebrowed overface overfacile overfacilely overfacility overfactious overfactiousness overfag overfagged overfaint overfaith overfaithful overfaithfully overfall overfamed overfamiliar overfamiliarity overfamiliarly overfamous overfanciful overfancy overfar overfast overfastidious overfastidiously overfastidiousness overfasting overfat overfatigue overfatten overfavor overfavorable overfavorably overfear overfearful overfearfully overfearfulness overfeast overfeatured overfed overfee overfeed overfeel overfellowlike overfellowly overfelon overfeminine overfeminize overfertile overfertility overfestoon overfew overfierce overfierceness overfile overfill overfilm overfine overfinished overfish overfit overfix overflatten overfleece overfleshed overflexion overfling overfloat overflog overflood overflorid overfloridness overflourish overflow overflowable overflower overflowing overflowingly overflowingness overflown overfluency overfluent overfluently overflush overflutter overfly overfold overfond overfondle overfondly overfondness overfoolish overfoolishly overfoolishness overfoot overforce overforged overformed overforward overforwardly overforwardness overfought overfoul overfoully overfrail overfrailty overfranchised overfrank overfrankly overfrankness overfraught overfree overfreedom overfreely overfreight overfrequency overfrequent overfrequently overfret overfrieze overfrighted overfrighten overfroth overfrown overfrozen overfruited overfruitful overfull overfullness overfunctioning overfurnish overgaiter overgalled overgamble overgang overgarment overgarrison overgaze overgeneral overgeneralize overgenerally overgenerosity overgenerous overgenerously overgenial overgeniality overgentle overgently overget overgifted overgild overgilted overgird overgirded overgirdle overglad overgladly overglance overglass overglaze overglide overglint overgloom overgloominess overgloomy overglorious overgloss overglut overgo overgoad overgod overgodliness overgodly overgood overgorge overgovern overgovernment overgown overgrace overgracious overgrade overgrain overgrainer overgrasping overgrateful overgratefully overgratification overgratify overgratitude overgraze overgreasiness overgreasy overgreat overgreatly overgreatness overgreed overgreedily overgreediness overgreedy overgrieve overgrievous overgrind overgross overgrossly overgrossness overground overgrow overgrown overgrowth overguilty overgun overhair overhalf overhand overhanded overhandicap overhandle overhang overhappy overharass overhard overharden overhardness overhardy overharsh overharshly overharshness overhaste overhasten overhastily overhastiness overhasty overhate overhatted overhaughty overhaul overhauler overhead overheadiness overheadman overheady overheap overhear overhearer overheartily overhearty overheat overheatedly overheave overheaviness overheavy overheight overheighten overheinous overheld overhelp overhelpful overhigh overhighly overhill overhit overholiness overhollow overholy overhomeliness overhomely overhonest overhonestly overhonesty overhonor overhorse overhot overhotly overhour overhouse overhover overhuge overhuman overhumanity overhumanize overhung overhunt overhurl overhurriedly overhurry overhusk overhysterical overidealism overidealistic overidle overidly overillustrate overillustration overimaginative overimaginativeness overimitate overimitation overimitative overimitatively overimport overimportation overimpress overimpressible overinclinable overinclination overinclined overincrust overincurious overindividualism overindividualistic overindulge overindulgence overindulgent overindulgently overindustrialization overindustrialize overinflate overinflation overinflative overinfluence overinfluential overinform overink overinsist overinsistence overinsistent overinsistently overinsolence overinsolent overinsolently overinstruct overinstruction overinsurance overinsure overintellectual overintellectuality overintense overintensely overintensification overintensity overinterest overinterested overinterestedness overinventoried overinvest overinvestment overiodize overirrigate overirrigation overissue overitching overjacket overjade overjaded overjawed overjealous overjealously overjealousness overjob overjocular overjoy overjoyful overjoyfully overjoyous overjudge overjudging overjudgment overjudicious overjump overjust overjutting overkeen overkeenness overkeep overkick overkind overkindly overkindness overking overknavery overknee overknow overknowing overlabor overlace overlactation overlade overlaid overlain overland Overlander overlander overlanguaged overlap overlard overlarge overlargely overlargeness overlascivious overlast overlate overlaudation overlaudatory overlaugh overlaunch overlave overlavish overlavishly overlax overlaxative overlaxly overlaxness overlay overlayer overlead overleaf overlean overleap overlearn overlearned overlearnedly overlearnedness overleather overleave overleaven overleer overleg overlegislation overleisured overlength overlettered overlewd overlewdly overlewdness overliberal overliberality overliberally overlicentious overlick overlie overlier overlift overlight overlighted overlightheaded overlightly overlightsome overliking overline overling overlinger overlinked overlip overlipping overlisted overlisten overliterary overlittle overlive overliveliness overlively overliver overload overloath overlock overlocker overlofty overlogical overlogically overlong overlook overlooker overloose overlord overlordship overloud overloup overlove overlover overlow overlowness overloyal overloyally overloyalty overlubricatio overluscious overlush overlustiness overlusty overluxuriance overluxuriant overluxurious overly overlying overmagnify overmagnitude overmajority overmalapert overman overmantel overmantle overmany overmarch overmark overmarking overmarl overmask overmast overmaster overmasterful overmasterfully overmasterfulness overmastering overmasteringly overmatch overmatter overmature overmaturity overmean overmeanly overmeanness overmeasure overmeddle overmeek overmeekly overmeekness overmellow overmellowness overmelodied overmelt overmerciful overmercifulness overmerit overmerrily overmerry overmettled overmickle overmighty overmild overmill overminute overminutely overminuteness overmix overmoccasin overmodest overmodestly overmodesty overmodulation overmoist overmoisten overmoisture overmortgage overmoss overmost overmotor overmount overmounts overmourn overmournful overmournfully overmuch overmuchness overmultiplication overmultiply overmultitude overname overnarrow overnarrowly overnationalization overnear overneat overneatness overneglect overnegligence overnegligent overnervous overnervously overnervousness overnet overnew overnice overnicely overniceness overnicety overnigh overnight overnimble overnipping overnoise overnotable overnourish overnoveled overnumber overnumerous overnumerousness overnurse overobedience overobedient overobediently overobese overobjectify overoblige overobsequious overobsequiously overobsequiousness overoffend overoffensive overofficered overofficious overorder overornamented overpained overpainful overpainfully overpainfulness overpaint overpamper overpart overparted overpartial overpartiality overpartially overparticular overparticularly overpass overpassionate overpassionately overpassionateness overpast overpatient overpatriotic overpay overpayment overpeer overpending overpensive overpensiveness overpeople overpepper overperemptory overpersuade overpersuasion overpert overpessimism overpessimistic overpet overphysic overpick overpicture overpinching overpitch overpitched overpiteous overplace overplaced overplacement overplain overplant overplausible overplay overplease overplenitude overplenteous overplenteously overplentiful overplenty overplot overplow overplumb overplume overplump overplumpness overplus overply overpointed overpoise overpole overpolemical overpolish overpolitic overponderous overpopular overpopularity overpopularly overpopulate overpopulation overpopulous overpopulousness overpositive overpossess overpot overpotent overpotential overpour overpower overpowerful overpowering overpoweringly overpoweringness overpraise overpray overpreach overprecise overpreciseness overpreface overpregnant overpreoccupation overpreoccupy overpress overpressure overpresumption overpresumptuous overprice overprick overprint overprize overprizer overprocrastination overproduce overproduction overproductive overproficient overprolific overprolix overprominence overprominent overprominently overpromise overprompt overpromptly overpromptness overprone overproneness overpronounced overproof overproportion overproportionate overproportionated overproportionately overproportioned overprosperity overprosperous overprotect overprotract overprotraction overproud overproudly overprove overprovender overprovide overprovident overprovidently overprovision overprovocation overprovoke overprune overpublic overpublicity overpuff overpuissant overpunish overpunishment overpurchase overquantity overquarter overquell overquick overquickly overquiet overquietly overquietness overrace overrack overrake overrange overrank overrankness overrapture overrapturize overrash overrashly overrashness overrate overrational overrationalize overravish overreach overreacher overreaching overreachingly overreachingness overread overreader overreadily overreadiness overready overrealism overrealistic overreckon overrecord overrefine overrefined overrefinement overreflection overreflective overregister overregistration overregular overregularity overregularly overregulate overregulation overrelax overreliance overreliant overreligion overreligious overremiss overremissly overremissness overrennet overrent overreplete overrepletion overrepresent overrepresentation overrepresentative overreserved overresolute overresolutely overrestore overrestrain overretention overreward overrich overriches overrichness override overrife overrigged overright overrighteous overrighteously overrighteousness overrigid overrigidity overrigidly overrigorous overrigorously overrim overriot overripe overripely overripen overripeness overrise overroast overroll overroof overrooted overrough overroughly overroughness overroyal overrude overrudely overrudeness overruff overrule overruler overruling overrulingly overrun overrunner overrunning overrunningly overrush overrusset overrust oversad oversadly oversadness oversaid oversail oversale oversaliva oversalt oversalty oversand oversanded oversanguine oversanguinely oversapless oversated oversatisfy oversaturate oversaturation oversauce oversauciness oversaucy oversave overscare overscatter overscented oversceptical overscepticism overscore overscour overscratch overscrawl overscream overscribble overscrub overscruple overscrupulosity overscrupulous overscrupulously overscrupulousness overscurf overscutched oversea overseal overseam overseamer oversearch overseas overseason overseasoned overseated oversecure oversecurely oversecurity oversee overseed overseen overseer overseerism overseership overseethe oversell oversend oversensible oversensibly oversensitive oversensitively oversensitiveness oversententious oversentimental oversentimentalism oversentimentalize oversentimentally overserious overseriously overseriousness overservice overservile overservility overset oversetter oversettle oversettled oversevere overseverely overseverity oversew overshade overshadow overshadower overshadowing overshadowingly overshadowment overshake oversharp oversharpness overshave oversheet overshelving overshepherd overshine overshirt overshoe overshoot overshort overshorten overshortly overshot overshoulder overshowered overshrink overshroud oversick overside oversight oversilence oversilent oversilver oversimple oversimplicity oversimplification oversimplify oversimply oversize oversized overskim overskip overskipper overskirt overslack overslander overslaugh overslavish overslavishly oversleep oversleeve overslide overslight overslip overslope overslow overslowly overslowness overslur oversmall oversman oversmite oversmitten oversmoke oversmooth oversmoothly oversmoothness oversnow oversoak oversoar oversock oversoft oversoftly oversoftness oversold oversolemn oversolemnity oversolemnly oversolicitous oversolicitously oversolicitousness oversoon oversoothing oversophisticated oversophistication oversorrow oversorrowed oversot oversoul oversound oversour oversourly oversourness oversow overspacious overspaciousness overspan overspangled oversparing oversparingly oversparingness oversparred overspatter overspeak overspecialization overspecialize overspeculate overspeculation overspeculative overspeech overspeed overspeedily overspeedy overspend overspill overspin oversplash overspread overspring oversprinkle oversprung overspun oversqueak oversqueamish oversqueamishness overstaff overstaid overstain overstale overstalled overstand overstaring overstate overstately overstatement overstay overstayal oversteadfast oversteadfastness oversteady overstep overstiff overstiffness overstifle overstimulate overstimulation overstimulative overstir overstitch overstock overstoop overstoping overstore overstory overstout overstoutly overstowage overstowed overstrain overstrait overstraiten overstraitly overstraitness overstream overstrength overstress overstretch overstrew overstrict overstrictly overstrictness overstride overstrident overstridently overstrike overstring overstriving overstrong overstrongly overstrung overstud overstudied overstudious overstudiously overstudiousness overstudy overstuff oversublime oversubscribe oversubscriber oversubscription oversubtile oversubtle oversubtlety oversubtly oversufficiency oversufficient oversufficiently oversuperstitious oversupply oversure oversurety oversurge oversurviving oversusceptibility oversusceptible oversuspicious oversuspiciously overswarm overswarth oversway oversweated oversweep oversweet oversweeten oversweetly oversweetness overswell overswift overswim overswimmer overswing overswinging overswirling oversystematic oversystematically oversystematize overt overtakable overtake overtaker overtalk overtalkative overtalkativeness overtalker overtame overtamely overtameness overtapped overtare overtariff overtarry overtart overtask overtax overtaxation overteach overtechnical overtechnicality overtedious overtediously overteem overtell overtempt overtenacious overtender overtenderly overtenderness overtense overtensely overtenseness overtension overterrible overtest overthick overthin overthink overthought overthoughtful overthriftily overthriftiness overthrifty overthrong overthrow overthrowable overthrowal overthrower overthrust overthwart overthwartly overthwartness overthwartways overthwartwise overtide overtight overtightly overtill overtimbered overtime overtimer overtimorous overtimorously overtimorousness overtinseled overtint overtip overtipple overtire overtiredness overtitle overtly overtness overtoe overtoil overtoise overtone overtongued overtop overtopple overtorture overtower overtrace overtrack overtrade overtrader overtrailed overtrain overtrample overtravel overtread overtreatment overtrick overtrim overtrouble overtrue overtrump overtrust overtrustful overtruthful overtruthfully overtumble overture overturn overturnable overturner overtutor overtwine overtwist overtype overuberous overunionized overunsuitable overurbanization overurge overuse overusual overusually overvaliant overvaluable overvaluation overvalue overvariety overvault overvehemence overvehement overveil overventilate overventilation overventuresome overventurous overview overvoltage overvote overwade overwages overwake overwalk overwander overward overwash overwasted overwatch overwatcher overwater overwave overway overwealth overwealthy overweaponed overwear overweary overweather overweave overweb overween overweener overweening overweeningly overweeningness overweep overweigh overweight overweightage overwell overwelt overwet overwetness overwheel overwhelm overwhelmer overwhelming overwhelmingly overwhelmingness overwhipped overwhirl overwhisper overwide overwild overwilily overwilling overwillingly overwily overwin overwind overwing overwinter overwiped overwisdom overwise overwisely overwithered overwoman overwomanize overwomanly overwood overwooded overwoody overword overwork overworld overworn overworry overworship overwound overwove overwoven overwrap overwrest overwrested overwrestle overwrite overwroth overwrought overyear overyoung overyouthful overzeal overzealous overzealously overzealousness ovest ovey Ovibos Ovibovinae ovibovine ovicapsular ovicapsule ovicell ovicellular ovicidal ovicide ovicular oviculated oviculum ovicyst ovicystic Ovidae Ovidian oviducal oviduct oviductal oviferous ovification oviform ovigenesis ovigenetic ovigenic ovigenous ovigerm ovigerous ovile Ovillus Ovinae ovine ovinia ovipara oviparal oviparity oviparous oviparously oviparousness oviposit oviposition ovipositor Ovis ovisac oviscapt ovism ovispermary ovispermiduct ovist ovistic ovivorous ovocyte ovoelliptic ovoflavin ovogenesis ovogenetic ovogenous ovogonium ovoid ovoidal ovolemma ovolo ovological ovologist ovology ovolytic ovomucoid ovoplasm ovoplasmic ovopyriform ovorhomboid ovorhomboidal ovotesticular ovotestis ovovitellin Ovovivipara ovoviviparism ovoviviparity ovoviviparous ovoviviparously ovoviviparousness Ovula ovular ovularian ovulary ovulate ovulation ovule ovuliferous ovuligerous ovulist ovum ow owd owe owelty Owen Owenia Owenian Owenism Owenist Owenite Owenize ower owerance owerby owercome owergang owerloup owertaen owerword owght owing owk owl owldom owler owlery owlet Owlglass owlhead owling owlish owlishly owlishness owlism owllight owllike Owlspiegle owly own owner ownerless ownership ownhood ownness ownself ownwayish owregane owrehip owrelay owse owsen owser owtchah owyheeite ox oxacid oxadiazole oxalacetic oxalaldehyde oxalamid oxalamide oxalan oxalate oxaldehyde oxalemia oxalic Oxalidaceae oxalidaceous Oxalis oxalite oxalodiacetic oxalonitril oxalonitrile oxaluramid oxaluramide oxalurate oxaluria oxaluric oxalyl oxalylurea oxamate oxamethane oxamic oxamid oxamide oxamidine oxammite oxan oxanate oxane oxanic oxanilate oxanilic oxanilide oxazine oxazole oxbane oxberry oxbird oxbiter oxblood oxbow oxboy oxbrake oxcart oxcheek oxdiacetic oxdiazole oxea oxeate oxen oxeote oxer oxetone oxeye oxfly Oxford Oxfordian Oxfordism Oxfordist oxgang oxgoad oxharrow oxhead oxheal oxheart oxhide oxhoft oxhorn oxhouse oxhuvud oxidability oxidable oxidant oxidase oxidate oxidation oxidational oxidative oxidator oxide oxidic oxidimetric oxidimetry oxidizability oxidizable oxidization oxidize oxidizement oxidizer oxidizing oxidoreductase oxidoreduction oxidulated oximate oximation oxime oxland oxlike oxlip oxman oxmanship oxoindoline Oxonian oxonic oxonium Oxonolatry oxozone oxozonide oxpecker oxphony oxreim oxshoe oxskin oxtail oxter oxtongue oxwort oxy oxyacanthine oxyacanthous oxyacetylene oxyacid Oxyaena Oxyaenidae oxyaldehyde oxyamine oxyanthracene oxyanthraquinone oxyaphia oxyaster oxybaphon Oxybaphus oxybenzaldehyde oxybenzene oxybenzoic oxybenzyl oxyberberine oxyblepsia oxybromide oxybutyria oxybutyric oxycalcium oxycalorimeter oxycamphor oxycaproic oxycarbonate oxycellulose oxycephalic oxycephalism oxycephalous oxycephaly oxychlorate oxychloric oxychloride oxycholesterol oxychromatic oxychromatin oxychromatinic oxycinnamic oxycobaltammine Oxycoccus oxycopaivic oxycoumarin oxycrate oxycyanide oxydactyl Oxydendrum oxydiact oxyesthesia oxyether oxyethyl oxyfatty oxyfluoride oxygas oxygen oxygenant oxygenate oxygenation oxygenator oxygenerator oxygenic oxygenicity oxygenium oxygenizable oxygenize oxygenizement oxygenizer oxygenous oxygeusia oxygnathous oxyhalide oxyhaloid oxyhematin oxyhemocyanin oxyhemoglobin oxyhexactine oxyhexaster oxyhydrate oxyhydric oxyhydrogen oxyiodide oxyketone oxyl Oxylabracidae Oxylabrax oxyluciferin oxyluminescence oxyluminescent oxymandelic oxymel oxymethylene oxymoron oxymuriate oxymuriatic oxynaphthoic oxynaphtoquinone oxynarcotine oxyneurin oxyneurine oxynitrate oxyntic oxyophitic oxyopia Oxyopidae oxyosphresia oxypetalous oxyphenol oxyphenyl oxyphile oxyphilic oxyphilous oxyphonia oxyphosphate oxyphthalic oxyphyllous oxyphyte oxypicric Oxypolis oxyproline oxypropionic oxypurine oxypycnos oxyquinaseptol oxyquinoline oxyquinone oxyrhine oxyrhinous oxyrhynch oxyrhynchous oxyrhynchus Oxyrrhyncha oxyrrhynchid oxysalicylic oxysalt oxystearic Oxystomata oxystomatous oxystome oxysulphate oxysulphide oxyterpene oxytocia oxytocic oxytocin oxytocous oxytoluene oxytoluic oxytone oxytonesis oxytonical oxytonize Oxytricha Oxytropis oxytylotate oxytylote oxyuriasis oxyuricide Oxyuridae oxyurous oxywelding Oyana oyapock oyer oyster oysterage oysterbird oystered oysterer oysterfish oystergreen oysterhood oysterhouse oystering oysterish oysterishness oysterlike oysterling oysterman oysterous oysterroot oysterseed oystershell oysterwife oysterwoman Ozan Ozark ozarkite ozena Ozias ozobrome ozocerite ozokerit ozokerite ozonate ozonation ozonator ozone ozoned ozonic ozonide ozoniferous ozonification ozonify Ozonium ozonization ozonize ozonizer ozonometer ozonometry ozonoscope ozonoscopic ozonous ozophen ozophene ozostomia ozotype P p pa paal paar paauw Paba pabble Pablo pablo pabouch pabular pabulary pabulation pabulatory pabulous pabulum pac paca pacable Pacaguara pacate pacation pacative pacay pacaya Paccanarist Pacchionian Pace pace paceboard paced pacemaker pacemaking pacer pachak pachisi pachnolite pachometer Pachomian Pachons Pacht pachyacria pachyaemia pachyblepharon pachycarpous pachycephal pachycephalia pachycephalic pachycephalous pachycephaly pachychilia pachycholia pachychymia pachycladous pachydactyl pachydactylous pachydactyly pachyderm pachyderma pachydermal Pachydermata pachydermatocele pachydermatoid pachydermatosis pachydermatous pachydermatously pachydermia pachydermial pachydermic pachydermoid pachydermous pachyemia pachyglossal pachyglossate pachyglossia pachyglossous pachyhaemia pachyhaemic pachyhaemous pachyhematous pachyhemia pachyhymenia pachyhymenic Pachylophus pachylosis Pachyma pachymenia pachymenic pachymeningitic pachymeningitis pachymeninx pachymeter pachynathous pachynema pachynsis pachyntic pachyodont pachyotia pachyotous pachyperitonitis pachyphyllous pachypleuritic pachypod pachypodous pachypterous Pachyrhizus pachyrhynchous pachysalpingitis Pachysandra pachysaurian pachysomia pachysomous pachystichous Pachystima pachytene pachytrichous Pachytylus pachyvaginitis pacifiable pacific pacifical pacifically pacificate pacification pacificator pacificatory pacificism pacificist pacificity pacifier pacifism pacifist pacifistic pacifistically pacify pacifyingly Pacinian pack packable package packbuilder packcloth packer packery packet packhouse packless packly packmaker packmaking packman packmanship packness packsack packsaddle packstaff packthread packwall packwaller packware packway paco Pacolet pacouryuva pact paction pactional pactionally Pactolian Pactolus pad padcloth Padda padder padding paddle paddlecock paddled paddlefish paddlelike paddler paddlewood paddling paddock paddockride paddockstone paddockstool Paddy paddy paddybird Paddyism paddymelon Paddywack paddywatch Paddywhack paddywhack padella padfoot padge Padina padishah padle padlike padlock padmasana padmelon padnag padpiece Padraic Padraig padre padroadist padroado padronism padstone padtree Paduan Paduanism paduasoy Padus paean paeanism paeanize paedarchy paedatrophia paedatrophy paediatry paedogenesis paedogenetic paedometer paedometrical paedomorphic paedomorphism paedonymic paedonymy paedopsychologist paedotribe paedotrophic paedotrophist paedotrophy paegel paegle Paelignian paenula paeon Paeonia Paeoniaceae Paeonian paeonic paetrick paga pagan Paganalia Paganalian pagandom paganic paganical paganically paganish paganishly paganism paganist paganistic paganity paganization paganize paganizer paganly paganry pagatpat Page page pageant pageanted pageanteer pageantic pageantry pagedom pageful pagehood pageless pagelike pager pageship pagina paginal paginary paginate pagination pagiopod Pagiopoda pagoda pagodalike pagodite pagoscope pagrus Paguma pagurian pagurid Paguridae Paguridea pagurine Pagurinea paguroid Paguroidea Pagurus pagus pah paha Pahareen Pahari Paharia pahi Pahlavi pahlavi pahmi paho pahoehoe Pahouin pahutan Paiconeca paideutic paideutics paidological paidologist paidology paidonosology paigle paik pail pailful paillasse paillette pailletted pailou paimaneh pain pained painful painfully painfulness paining painingly painkiller painless painlessly painlessness painproof painstaker painstaking painstakingly painstakingness painsworthy paint paintability paintable paintableness paintably paintbox paintbrush painted paintedness painter painterish painterlike painterly paintership paintiness painting paintingness paintless paintpot paintproof paintress paintrix paintroot painty paip pair paired pairedness pairer pairment pairwise pais paisa paisanite Paisley Paiute paiwari pajahuello pajama pajamaed pajock Pajonism Pakawa Pakawan pakchoi pakeha Pakhpuluk Pakhtun Pakistani paktong pal Pala palace palaced palacelike palaceous palaceward palacewards paladin palaeanthropic Palaearctic Palaeechini palaeechinoid Palaeechinoidea palaeechinoidean palaeentomology palaeethnologic palaeethnological palaeethnologist palaeethnology Palaeeudyptes Palaeic palaeichthyan Palaeichthyes palaeichthyic Palaemon palaemonid Palaemonidae palaemonoid palaeoalchemical palaeoanthropic palaeoanthropography palaeoanthropology Palaeoanthropus palaeoatavism palaeoatavistic palaeobiogeography palaeobiologist palaeobiology palaeobotanic palaeobotanical palaeobotanically palaeobotanist palaeobotany Palaeocarida palaeoceanography Palaeocene palaeochorology palaeoclimatic palaeoclimatology Palaeoconcha palaeocosmic palaeocosmology Palaeocrinoidea palaeocrystal palaeocrystallic palaeocrystalline palaeocrystic palaeocyclic palaeodendrologic palaeodendrological palaeodendrologically palaeodendrologist palaeodendrology Palaeodictyoptera palaeodictyopteran palaeodictyopteron palaeodictyopterous palaeoencephalon palaeoeremology palaeoethnic palaeoethnologic palaeoethnological palaeoethnologist palaeoethnology palaeofauna Palaeogaea Palaeogaean palaeogene palaeogenesis palaeogenetic palaeogeographic palaeogeography palaeoglaciology palaeoglyph Palaeognathae palaeognathic palaeognathous palaeograph palaeographer palaeographic palaeographical palaeographically palaeographist palaeography palaeoherpetologist palaeoherpetology palaeohistology palaeohydrography palaeolatry palaeolimnology palaeolith palaeolithic palaeolithical palaeolithist palaeolithoid palaeolithy palaeological palaeologist palaeology Palaeomastodon palaeometallic palaeometeorological palaeometeorology Palaeonemertea palaeonemertean palaeonemertine Palaeonemertinea Palaeonemertini palaeoniscid Palaeoniscidae palaeoniscoid Palaeoniscum Palaeoniscus palaeontographic palaeontographical palaeontography palaeopathology palaeopedology palaeophile palaeophilist Palaeophis palaeophysiography palaeophysiology palaeophytic palaeophytological palaeophytologist palaeophytology palaeoplain palaeopotamology palaeopsychic palaeopsychological palaeopsychology palaeoptychology Palaeornis Palaeornithinae palaeornithine palaeornithological palaeornithology palaeosaur Palaeosaurus palaeosophy Palaeospondylus Palaeostraca palaeostracan palaeostriatal palaeostriatum palaeostylic palaeostyly palaeotechnic palaeothalamus Palaeothentes Palaeothentidae palaeothere palaeotherian Palaeotheriidae palaeotheriodont palaeotherioid Palaeotherium palaeotheroid Palaeotropical palaeotype palaeotypic palaeotypical palaeotypically palaeotypographical palaeotypographist palaeotypography palaeovolcanic Palaeozoic palaeozoological palaeozoologist palaeozoology palaestra palaestral palaestrian palaestric palaestrics palaetiological palaetiologist palaetiology palafitte palagonite palagonitic Palaic Palaihnihan palaiotype palaite palama palamate palame Palamedea palamedean Palamedeidae Palamite Palamitism palampore palander palanka palankeen palanquin palapalai Palapteryx Palaquium palar palas palatability palatable palatableness palatably palatal palatalism palatality palatalization palatalize palate palated palateful palatefulness palateless palatelike palatial palatially palatialness palatian palatic palatinal palatinate palatine palatineship Palatinian palatinite palation palatist palatitis palative palatization palatize palatoalveolar palatodental palatoglossal palatoglossus palatognathous palatogram palatograph palatography palatomaxillary palatometer palatonasal palatopharyngeal palatopharyngeus palatoplasty palatoplegia palatopterygoid palatoquadrate palatorrhaphy palatoschisis Palatua Palau Palaung palaver palaverer palaverist palaverment palaverous palay palazzi palberry palch pale palea paleaceous paleanthropic Palearctic paleate palebelly palebuck palechinoid paled paledness paleencephalon paleentomology paleethnographer paleethnologic paleethnological paleethnologist paleethnology paleface palehearted paleichthyologic paleichthyologist paleichthyology paleiform palely Paleman paleness Palenque paleoalchemical paleoandesite paleoanthropic paleoanthropography paleoanthropological paleoanthropologist paleoanthropology Paleoanthropus paleoatavism paleoatavistic paleobiogeography paleobiologist paleobiology paleobotanic paleobotanical paleobotanically paleobotanist paleobotany paleoceanography Paleocene paleochorology paleoclimatic paleoclimatologist paleoclimatology Paleoconcha paleocosmic paleocosmology paleocrystal paleocrystallic paleocrystalline paleocrystic paleocyclic paleodendrologic paleodendrological paleodendrologically paleodendrologist paleodendrology paleoecologist paleoecology paleoencephalon paleoeremology paleoethnic paleoethnography paleoethnologic paleoethnological paleoethnologist paleoethnology paleofauna Paleogene paleogenesis paleogenetic paleogeographic paleogeography paleoglaciology paleoglyph paleograph paleographer paleographic paleographical paleographically paleographist paleography paleoherpetologist paleoherpetology paleohistology paleohydrography paleoichthyology paleokinetic paleola paleolate paleolatry paleolimnology paleolith paleolithic paleolithical paleolithist paleolithoid paleolithy paleological paleologist paleology paleomammalogy paleometallic paleometeorological paleometeorology paleontographic paleontographical paleontography paleontologic paleontological paleontologically paleontologist paleontology paleopathology paleopedology paleophysiography paleophysiology paleophytic paleophytological paleophytologist paleophytology paleopicrite paleoplain paleopotamoloy paleopsychic paleopsychological paleopsychology paleornithological paleornithology paleostriatal paleostriatum paleostylic paleostyly paleotechnic paleothalamus paleothermal paleothermic Paleotropical paleovolcanic paleoytterbium Paleozoic paleozoological paleozoologist paleozoology paler Palermitan Palermo Pales Palesman Palestinian palestra palestral palestrian palestric palet paletiology paletot palette paletz palewise palfrey palfreyed palgat Pali pali Palicourea palification paliform paligorskite palikar palikarism palikinesia palila palilalia Palilia Palilicium palillogia palilogetic palilogy palimbacchic palimbacchius palimpsest palimpsestic palinal palindrome palindromic palindromical palindromically palindromist paling palingenesia palingenesian palingenesis palingenesist palingenesy palingenetic palingenetically palingenic palingenist palingeny palinode palinodial palinodic palinodist palinody palinurid Palinuridae palinuroid Palinurus paliphrasia palirrhea palisade palisading palisado palisander palisfy palish palistrophia Paliurus palkee pall palla palladammine Palladia palladia Palladian Palladianism palladic palladiferous palladinize palladion palladious Palladium palladium palladiumize palladize palladodiammine palladosammine palladous pallae pallah pallall pallanesthesia Pallas pallasite pallbearer palled pallescence pallescent pallesthesia pallet palleting palletize pallette pallholder palli pallial palliard palliasse Palliata palliata palliate palliation palliative palliatively palliator palliatory pallid pallidiflorous pallidipalpate palliditarsate pallidity pallidiventrate pallidly pallidness palliness Palliobranchiata palliobranchiate palliocardiac pallioessexite pallion palliopedal palliostratus pallium Palliyan pallograph pallographic pallometric pallone pallor Pallu Palluites pallwise pally palm palma Palmaceae palmaceous palmad Palmae palmanesthesia palmar palmarian palmary palmate palmated palmately palmatifid palmatiform palmatilobate palmatilobed palmation palmatiparted palmatipartite palmatisect palmatisected palmature palmcrist palmed Palmella Palmellaceae palmellaceous palmelloid palmer palmerite palmery palmesthesia palmette palmetto palmetum palmful palmicolous palmiferous palmification palmiform palmigrade palmilobate palmilobated palmilobed palminervate palminerved palmiped Palmipedes palmipes palmist palmister palmistry palmitate palmite palmitic palmitin palmitinic palmito palmitoleic palmitone palmiveined palmivorous palmlike palmo palmodic palmoscopy palmospasmus palmula palmus palmwise palmwood palmy palmyra Palmyrene Palmyrenian palolo palombino palometa palomino palosapis palouser paloverde palp palpability palpable palpableness palpably palpacle palpal palpate palpation palpatory palpebra palpebral palpebrate palpebration palpebritis palped palpi palpicorn Palpicornia palpifer palpiferous palpiform palpiger palpigerous palpitant palpitate palpitatingly palpitation palpless palpocil palpon palpulus palpus palsgrave palsgravine palsied palsification palstave palster palsy palsylike palsywort palt Palta palter palterer palterly paltrily paltriness paltry paludal paludament paludamentum paludial paludian paludic Paludicella Paludicolae paludicole paludicoline paludicolous paludiferous Paludina paludinal paludine paludinous paludism paludose paludous paludrin paludrine palule palulus Palus palus palustral palustrian palustrine paly palynology Pam pam pambanmanche Pamela pament pameroon Pamir Pamiri Pamirian Pamlico pamment Pampanga Pampangan Pampango pampas pampean pamper pampered pamperedly pamperedness pamperer pamperize pampero pamphagous pampharmacon Pamphiliidae Pamphilius pamphlet pamphletage pamphletary pamphleteer pamphleter pamphletful pamphletic pamphletical pamphletize pamphletwise pamphysical pamphysicism pampilion pampiniform pampinocele pamplegia pampootee pampootie pampre pamprodactyl pamprodactylism pamprodactylous pampsychism pampsychist Pamunkey Pan pan panace Panacea panacea panacean panaceist panache panached panachure panada panade Panagia panagiarion Panak Panaka panama Panamaian Panaman Panamanian Panamano Panamic Panamint Panamist panapospory panarchic panarchy panaris panaritium panarteritis panarthritis panary panatela Panathenaea Panathenaean Panathenaic panatrophy panautomorphic panax Panayan Panayano panbabylonian panbabylonism Panboeotian pancake pancarditis panchama panchayat pancheon panchion panchromatic panchromatism panchromatization panchromatize panchway panclastic panconciliatory pancosmic pancosmism pancosmist pancratian pancratiast pancratiastic pancratic pancratical pancratically pancration pancratism pancratist pancratium pancreas pancreatalgia pancreatectomize pancreatectomy pancreatemphraxis pancreathelcosis pancreatic pancreaticoduodenal pancreaticoduodenostomy pancreaticogastrostomy pancreaticosplenic pancreatin pancreatism pancreatitic pancreatitis pancreatization pancreatize pancreatoduodenectomy pancreatoenterostomy pancreatogenic pancreatogenous pancreatoid pancreatolipase pancreatolith pancreatomy pancreatoncus pancreatopathy pancreatorrhagia pancreatotomy pancreectomy pancreozymin pancyclopedic pand panda pandal pandan Pandanaceae pandanaceous Pandanales Pandanus pandaram Pandarctos pandaric Pandarus pandation Pandean pandect Pandectist pandemia pandemian pandemic pandemicity pandemoniac Pandemoniacal Pandemonian pandemonic pandemonism Pandemonium pandemonium Pandemos pandemy pandenominational pander panderage panderer panderess panderism panderize panderly Panderma pandermite panderous pandership pandestruction pandiabolism pandiculation Pandion Pandionidae pandita pandle pandlewhew Pandora pandora Pandorea Pandoridae Pandorina Pandosto pandour pandowdy pandrop pandura pandurate pandurated panduriform pandy pane panecclesiastical paned panegoism panegoist panegyric panegyrical panegyrically panegyricize panegyricon panegyricum panegyris panegyrist panegyrize panegyrizer panegyry paneity panel panela panelation paneler paneless paneling panelist panellation panelling panelwise panelwork panentheism panesthesia panesthetic paneulogism panfil panfish panful pang Pangaea pangamic pangamous pangamously pangamy pangane Pangasinan pangen pangene pangenesis pangenetic pangenetically pangenic pangful pangi Pangium pangless panglessly panglima Pangloss Panglossian Panglossic pangolin pangrammatist Pangwe panhandle panhandler panharmonic panharmonicon panhead panheaded Panhellenic Panhellenios Panhellenism Panhellenist Panhellenium panhidrosis panhuman panhygrous panhyperemia panhysterectomy Pani panic panical panically panicful panichthyophagous panicked panicky panicle panicled paniclike panicmonger panicmongering paniconograph paniconographic paniconography Panicularia paniculate paniculated paniculately paniculitis Panicum panidiomorphic panidrosis panification panimmunity Paninean Panionia Panionian Panionic Paniquita Paniquitan panisc panisca paniscus panisic panivorous Panjabi panjandrum pank pankin pankration panleucopenia panlogical panlogism panlogistical panman panmelodicon panmelodion panmerism panmeristic panmixia panmixy panmnesia panmug panmyelophthisis Panna pannade pannage pannam pannationalism panne pannel panner pannery panneuritic panneuritis pannicle pannicular pannier panniered pannierman pannikin panning Pannonian Pannonic pannose pannosely pannum pannus pannuscorium Panoan panocha panoche panococo panoistic panomphaic panomphean panomphic panophobia panophthalmia panophthalmitis panoplied panoplist panoply panoptic panoptical panopticon panoram panorama panoramic panoramical panoramically panoramist panornithic Panorpa Panorpatae panorpian panorpid Panorpidae Panos panosteitis panostitis panotitis panotype panouchi panpathy panpharmacon panphenomenalism panphobia Panpipe panplegia panpneumatism panpolism panpsychic panpsychism panpsychist panpsychistic panscientist pansciolism pansciolist pansclerosis pansclerotic panse pansexism pansexual pansexualism pansexualist pansexuality pansexualize panshard panside pansideman pansied pansinuitis pansinusitis pansmith pansophic pansophical pansophically pansophism pansophist pansophy panspermatism panspermatist panspermia panspermic panspermism panspermist panspermy pansphygmograph panstereorama pansy pansylike pant pantachromatic pantacosm pantagamy pantagogue pantagraph pantagraphic pantagraphical Pantagruel Pantagruelian Pantagruelic Pantagruelically Pantagrueline pantagruelion Pantagruelism Pantagruelist Pantagruelistic Pantagruelistical Pantagruelize pantaleon pantaletless pantalets pantaletted pantalgia pantalon Pantalone pantaloon pantalooned pantaloonery pantaloons pantameter pantamorph pantamorphia pantamorphic pantanemone pantanencephalia pantanencephalic pantaphobia pantarbe pantarchy pantas pantascope pantascopic Pantastomatida Pantastomina pantatrophia pantatrophy pantatype pantechnic pantechnicon pantelegraph pantelegraphy panteleologism pantelephone pantelephonic Pantelis pantellerite panter panterer Pantheian pantheic pantheism pantheist pantheistic pantheistical pantheistically panthelematism panthelism pantheologist pantheology pantheon pantheonic pantheonization pantheonize panther pantheress pantherine pantherish pantherlike pantherwood pantheum pantie panties pantile pantiled pantiling panting pantingly pantisocracy pantisocrat pantisocratic pantisocratical pantisocratist pantle pantler panto pantochrome pantochromic pantochromism pantochronometer Pantocrator pantod Pantodon Pantodontidae pantoffle pantofle pantoganglitis pantogelastic pantoglossical pantoglot pantoglottism pantograph pantographer pantographic pantographical pantographically pantography pantoiatrical pantologic pantological pantologist pantology pantomancer pantometer pantometric pantometrical pantometry pantomime pantomimic pantomimical pantomimically pantomimicry pantomimish pantomimist pantomimus pantomnesia pantomnesic pantomorph pantomorphia pantomorphic panton pantoon pantopelagian pantophagic pantophagist pantophagous pantophagy pantophile pantophobia pantophobic pantophobous pantoplethora pantopod Pantopoda pantopragmatic pantopterous pantoscope pantoscopic pantosophy Pantostomata pantostomate pantostomatous pantostome pantotactic pantothenate pantothenic Pantotheria pantotherian pantotype pantoum pantropic pantropical pantry pantryman pantrywoman pants pantun panty pantywaist panung panurgic panurgy panyar Panzer panzoism panzootia panzootic panzooty Paola paolo paon pap papa papability papable papabot papacy papagallo Papago papain papal papalism papalist papalistic papalization papalize papalizer papally papalty papane papaphobia papaphobist papaprelatical papaprelatist paparchical paparchy papaship Papaver Papaveraceae papaveraceous Papaverales papaverine papaverous papaw papaya Papayaceae papayaceous papayotin papboat pape papelonne paper paperback paperbark paperboard papered paperer paperful paperiness papering paperlike papermaker papermaking papermouth papern papershell paperweight papery papess papeterie papey Paphian Paphiopedilum Papiamento papicolar papicolist Papilio Papilionaceae papilionaceous Papiliones papilionid Papilionidae Papilionides Papilioninae papilionine papilionoid Papilionoidea papilla papillae papillar papillary papillate papillated papillectomy papilledema papilliferous papilliform papillitis papilloadenocystoma papillocarcinoma papilloedema papilloma papillomatosis papillomatous papillon papilloretinitis papillosarcoma papillose papillosity papillote papillous papillulate papillule Papinachois Papio papion papish papisher papism Papist papist papistic papistical papistically papistlike papistly papistry papize papless papmeat papolater papolatrous papolatry papoose papooseroot Pappea pappescent pappi pappiferous pappiform pappose pappox pappus pappy papreg paprica paprika Papuan papula papular papulate papulated papulation papule papuliferous papuloerythematous papulopustular papulopustule papulose papulosquamous papulous papulovesicular papyr papyraceous papyral papyrean papyri papyrian papyrin papyrine papyritious papyrocracy papyrograph papyrographer papyrographic papyrography papyrological papyrologist papyrology papyrophobia papyroplastics papyrotamia papyrotint papyrotype papyrus Paque paquet par para paraaminobenzoic parabanate parabanic parabaptism parabaptization parabasal parabasic parabasis parabema parabematic parabenzoquinone parabiosis parabiotic parablast parablastic parable parablepsia parablepsis parablepsy parableptic parabola parabolanus parabolic parabolical parabolicalism parabolically parabolicness paraboliform parabolist parabolization parabolize parabolizer paraboloid paraboloidal parabomb parabotulism parabranchia parabranchial parabranchiate parabulia parabulic paracanthosis paracarmine paracasein paracaseinate Paracelsian Paracelsianism Paracelsic Paracelsist Paracelsistic Paracelsus paracentesis paracentral paracentric paracentrical paracephalus paracerebellar paracetaldehyde parachaplain paracholia parachor parachordal parachrea parachroia parachroma parachromatism parachromatophorous parachromatopsia parachromatosis parachrome parachromoparous parachromophoric parachromophorous parachronism parachronistic parachrose parachute parachutic parachutism parachutist paraclete paracmasis paracme paracoele paracoelian paracolitis paracolon paracolpitis paracolpium paracondyloid paracone paraconic paraconid paraconscious paracorolla paracotoin paracoumaric paracresol Paracress paracusia paracusic paracyanogen paracyesis paracymene paracystic paracystitis paracystium parade paradeful paradeless paradelike paradenitis paradental paradentitis paradentium parader paraderm paradiastole paradiazine paradichlorbenzene paradichlorbenzol paradichlorobenzene paradichlorobenzol paradidymal paradidymis paradigm paradigmatic paradigmatical paradigmatically paradigmatize parading paradingly paradiplomatic paradisaic paradisaically paradisal paradise Paradisea paradisean Paradiseidae Paradiseinae Paradisia paradisiac paradisiacal paradisiacally paradisial paradisian paradisic paradisical parado paradoctor parados paradoses paradox paradoxal paradoxer paradoxial paradoxic paradoxical paradoxicalism paradoxicality paradoxically paradoxicalness paradoxician Paradoxides paradoxidian paradoxism paradoxist paradoxographer paradoxographical paradoxology paradoxure Paradoxurinae paradoxurine Paradoxurus paradoxy paradromic paraenesis paraenesize paraenetic paraenetical paraengineer paraffin paraffine paraffiner paraffinic paraffinize paraffinoid paraffiny paraffle parafle parafloccular paraflocculus paraform paraformaldehyde parafunction paragammacism paraganglion paragaster paragastral paragastric paragastrula paragastrular parage paragenesia paragenesis paragenetic paragenic paragerontic parageusia parageusic parageusis paragglutination paraglenal paraglobin paraglobulin paraglossa paraglossal paraglossate paraglossia paraglycogen paragnath paragnathism paragnathous paragnathus paragneiss paragnosia paragoge paragogic paragogical paragogically paragogize paragon paragonimiasis Paragonimus paragonite paragonitic paragonless paragram paragrammatist paragraph paragrapher paragraphia paragraphic paragraphical paragraphically paragraphism paragraphist paragraphistical paragraphize Paraguay Paraguayan parah paraheliotropic paraheliotropism parahematin parahemoglobin parahepatic Parahippus parahopeite parahormone parahydrogen paraiba Paraiyan parakeet parakeratosis parakilya parakinesia parakinetic paralactate paralalia paralambdacism paralambdacismus paralaurionite paraldehyde parale paralectotype paraleipsis paralepsis paralexia paralexic paralgesia paralgesic paralinin paralipomena Paralipomenon paralipsis paralitical parallactic parallactical parallactically parallax parallel parallelable parallelepiped parallelepipedal parallelepipedic parallelepipedon parallelepipedonal paralleler parallelinervate parallelinerved parallelinervous parallelism parallelist parallelistic parallelith parallelization parallelize parallelizer parallelless parallelly parallelodrome parallelodromous parallelogram parallelogrammatic parallelogrammatical parallelogrammic parallelogrammical parallelograph parallelometer parallelopiped parallelopipedon parallelotropic parallelotropism parallelwise parallepipedous paralogia paralogical paralogician paralogism paralogist paralogistic paralogize paralogy paraluminite paralyses paralysis paralytic paralytical paralytically paralyzant paralyzation paralyze paralyzedly paralyzer paralyzingly param paramagnet paramagnetic paramagnetism paramandelic paramarine paramastigate paramastitis paramastoid paramatta Paramecidae Paramecium paramedian paramelaconite paramenia parament paramere parameric parameron paramese paramesial parameter parametric parametrical parametritic parametritis parametrium paramide paramilitary paramimia paramine paramiographer paramitome paramnesia paramo Paramoecium paramorph paramorphia paramorphic paramorphine paramorphism paramorphosis paramorphous paramount paramountcy paramountly paramountness paramountship paramour paramuthetic paramyelin paramylum paramyoclonus paramyosinogen paramyotone paramyotonia paranasal paranatellon parandrus paranema paranematic paranephric paranephritic paranephritis paranephros paranepionic paranete parang paranitraniline paranitrosophenol paranoia paranoiac paranoid paranoidal paranoidism paranomia paranormal paranosic paranthelion paranthracene Paranthropus paranuclear paranucleate paranucleic paranuclein paranucleinic paranucleus paranymph paranymphal parao paraoperation Parapaguridae paraparesis paraparetic parapathia parapathy parapegm parapegma paraperiodic parapet parapetalous parapeted parapetless paraph paraphasia paraphasic paraphemia paraphenetidine paraphenylene paraphenylenediamine parapherna paraphernal paraphernalia paraphernalian paraphia paraphilia paraphimosis paraphonia paraphonic paraphototropism paraphrasable paraphrase paraphraser paraphrasia paraphrasian paraphrasis paraphrasist paraphrast paraphraster paraphrastic paraphrastical paraphrastically paraphrenia paraphrenic paraphrenitis paraphyllium paraphysate paraphysical paraphysiferous paraphysis paraplasis paraplasm paraplasmic paraplastic paraplastin paraplectic paraplegia paraplegic paraplegy parapleuritis parapleurum parapod parapodial parapodium parapophysial parapophysis parapraxia parapraxis paraproctitis paraproctium paraprostatitis Parapsida parapsidal parapsidan parapsis parapsychical parapsychism parapsychological parapsychology parapsychosis parapteral parapteron parapterum paraquadrate paraquinone Pararctalia Pararctalian pararectal pararek parareka pararhotacism pararosaniline pararosolic pararthria parasaboteur parasalpingitis parasang parascene parascenium parasceve paraschematic parasecretion paraselene paraselenic parasemidin parasemidine parasexuality parashah parasigmatism parasigmatismus Parasita parasital parasitary parasite parasitelike parasitemia parasitic Parasitica parasitical parasitically parasiticalness parasiticidal parasiticide Parasitidae parasitism parasitize parasitogenic parasitoid parasitoidism parasitological parasitologist parasitology parasitophobia parasitosis parasitotrope parasitotropic parasitotropism parasitotropy paraskenion parasol parasoled parasolette paraspecific parasphenoid parasphenoidal paraspotter paraspy parastas parastatic parastemon parastemonal parasternal parasternum parastichy parastyle parasubphonate parasubstituted Parasuchia parasuchian parasympathetic parasympathomimetic parasynapsis parasynaptic parasynaptist parasyndesis parasynesis parasynetic parasynovitis parasynthesis parasynthetic parasyntheton parasyphilis parasyphilitic parasyphilosis parasystole paratactic paratactical paratactically paratartaric parataxis parate paraterminal Paratheria paratherian parathesis parathetic parathion parathormone parathymic parathyroid parathyroidal parathyroidectomize parathyroidectomy parathyroprival parathyroprivia parathyroprivic paratitla paratitles paratoloid paratoluic paratoluidine paratomial paratomium paratonic paratonically paratorium paratory paratracheal paratragedia paratragoedia paratransversan paratrichosis paratrimma paratriptic paratroop paratrooper paratrophic paratrophy paratuberculin paratuberculosis paratuberculous paratungstate paratungstic paratype paratyphlitis paratyphoid paratypic paratypical paratypically paravaginitis paravail paravane paravauxite paravent paravertebral paravesical paraxial paraxially paraxon paraxonic paraxylene Parazoa parazoan parazonium parbake Parbate parboil parbuckle parcel parceling parcellary parcellate parcellation parcelling parcellization parcellize parcelment parcelwise parcenary parcener parcenership parch parchable parchedly parchedness parcheesi parchemin parcher parchesi parching parchingly parchisi parchment parchmenter parchmentize parchmentlike parchmenty parchy parcidentate parciloquy parclose parcook pard pardalote Pardanthus pardao parded pardesi pardine pardner pardnomastic pardo pardon pardonable pardonableness pardonably pardonee pardoner pardoning pardonless pardonmonger pare paregoric Pareiasauri Pareiasauria pareiasaurian Pareiasaurus Pareioplitae parel parelectronomic parelectronomy parella paren parencephalic parencephalon parenchym parenchyma parenchymal parenchymatic parenchymatitis parenchymatous parenchymatously parenchyme parenchymous parent parentage parental Parentalia parentalism parentality parentally parentdom parentela parentelic parenteral parenterally parentheses parenthesis parenthesize parenthetic parenthetical parentheticality parenthetically parentheticalness parenthood parenticide parentless parentlike parentship Pareoean parepididymal parepididymis parepigastric parer parerethesis parergal parergic parergon paresis paresthesia paresthesis paresthetic parethmoid paretic paretically pareunia parfait parfilage parfleche parfocal pargana pargasite parge pargeboard parget pargeter pargeting pargo parhelia parheliacal parhelic parhelion parhomologous parhomology parhypate pari pariah pariahdom pariahism pariahship parial Parian parian Pariasauria Pariasaurus Paridae paridigitate paridrosis paries parietal Parietales Parietaria parietary parietes parietofrontal parietojugal parietomastoid parietoquadrate parietosphenoid parietosphenoidal parietosplanchnic parietosquamosal parietotemporal parietovaginal parietovisceral parify parigenin pariglin Parilia Parilicium parilla parillin parimutuel Parinarium parine paring paripinnate Paris parish parished parishen parishional parishionally parishionate parishioner parishionership Parisian Parisianism Parisianization Parisianize Parisianly Parisii parisis parisology parison parisonic paristhmic paristhmion parisyllabic parisyllabical Pariti Paritium parity parivincular park parka parkee parker parkin parking Parkinsonia Parkinsonism parkish parklike parkward parkway parky parlamento parlance parlando Parlatoria parlatory parlay parle parley parleyer parliament parliamental parliamentarian parliamentarianism parliamentarily parliamentariness parliamentarism parliamentarization parliamentarize parliamentary parliamenteer parliamenteering parliamenter parling parlish parlor parlorish parlormaid parlous parlously parlousness parly Parma parma parmacety parmak Parmelia Parmeliaceae parmeliaceous parmelioid Parmentiera Parmesan Parmese parnas Parnassia Parnassiaceae parnassiaceous Parnassian Parnassianism Parnassiinae Parnassism Parnassus parnel Parnellism Parnellite parnorpine paroarion paroarium paroccipital paroch parochial parochialic parochialism parochialist parochiality parochialization parochialize parochially parochialness parochin parochine parochiner parode parodiable parodial parodic parodical parodinia parodist parodistic parodistically parodize parodontitis parodos parody parodyproof paroecious paroeciously paroeciousness paroecism paroecy paroemia paroemiac paroemiographer paroemiography paroemiologist paroemiology paroicous parol parolable parole parolee parolfactory paroli parolist paromoeon paromologetic paromologia paromology paromphalocele paromphalocelic paronomasia paronomasial paronomasian paronomasiastic paronomastical paronomastically paronychia paronychial paronychium paronym paronymic paronymization paronymize paronymous paronymy paroophoric paroophoritis paroophoron paropsis paroptesis paroptic parorchid parorchis parorexia Parosela parosmia parosmic parosteal parosteitis parosteosis parostosis parostotic Parotia parotic parotid parotidean parotidectomy parotiditis parotis parotitic parotitis parotoid parous parousia parousiamania parovarian parovariotomy parovarium paroxazine paroxysm paroxysmal paroxysmalist paroxysmally paroxysmic paroxysmist paroxytone paroxytonic paroxytonize parpal parquet parquetage parquetry parr Parra parrel parrhesia parrhesiastic parriable parricidal parricidally parricide parricided parricidial parricidism Parridae parrier parrock parrot parroter parrothood parrotism parrotize parrotlet parrotlike parrotry parrotwise parroty parry parsable parse parsec Parsee Parseeism parser parsettensite Parsi Parsic Parsiism parsimonious parsimoniously parsimoniousness parsimony Parsism parsley parsleylike parsleywort parsnip parson parsonage parsonarchy parsondom parsoned parsonese parsoness parsonet parsonhood parsonic parsonical parsonically parsoning parsonish parsonity parsonize parsonlike parsonly parsonolatry parsonology parsonry parsonship Parsonsia parsonsite parsony Part part partakable partake partaker partan partanfull partanhanded parted partedness parter parterre parterred partheniad Partheniae parthenian parthenic Parthenium parthenocarpelly parthenocarpic parthenocarpical parthenocarpically parthenocarpous parthenocarpy Parthenocissus parthenogenesis parthenogenetic parthenogenetically parthenogenic parthenogenitive parthenogenous parthenogeny parthenogonidium Parthenolatry parthenology Parthenon Parthenopaeus parthenoparous Parthenope Parthenopean Parthenos parthenosperm parthenospore Parthian partial partialism partialist partialistic partiality partialize partially partialness partiary partible particate participability participable participance participancy participant participantly participate participatingly participation participative participatively participator participatory participatress participial participiality participialize participially participle particle particled particular particularism particularist particularistic particularistically particularity particularization particularize particularly particularness particulate partigen partile partimembered partimen partinium partisan partisanism partisanize partisanship partite partition partitional partitionary partitioned partitioner partitioning partitionist partitionment partitive partitively partitura partiversal partivity partless partlet partly partner partnerless partnership parto partook partridge partridgeberry partridgelike partridgewood partridging partschinite parture parturiate parturience parturiency parturient parturifacient parturition parturitive party partyism partyist partykin partyless partymonger partyship Parukutu parulis parumbilical parure paruria Parus parvanimity parvenu parvenudom parvenuism parvicellular parviflorous parvifoliate parvifolious parvipotent parvirostrate parvis parviscient parvitude parvolin parvoline parvule paryphodrome pasan pasang Pascal Pasch Pascha paschal paschalist Paschaltide paschite pascoite pascuage pascual pascuous pasgarde pash pasha pashadom pashalik pashaship pashm pashmina Pashto pasi pasigraphic pasigraphical pasigraphy pasilaly Pasitelean pasmo Paspalum pasqueflower pasquil pasquilant pasquiler pasquilic Pasquin pasquin pasquinade pasquinader Pasquinian Pasquino pass passable passableness passably passade passado passage passageable passageway Passagian passalid Passalidae Passalus Passamaquoddy passant passback passbook Passe passe passee passegarde passement passementerie passen passenger Passer passer Passeres passeriform Passeriformes Passerina passerine passewa passibility passible passibleness Passiflora Passifloraceae passifloraceous Passiflorales passimeter passing passingly passingness passion passional passionary passionate passionately passionateness passionative passioned passionflower passionful passionfully passionfulness Passionist passionist passionless passionlessly passionlessness passionlike passionometer passionproof Passiontide passionwise passionwort passir passival passivate passivation passive passively passiveness passivism passivist passivity passkey passless passman passo passometer passout passover passoverish passpenny passport passportless passulate passulation passus passway passwoman password passworts passymeasure past paste pasteboard pasteboardy pasted pastedness pastedown pastel pastelist paster pasterer pastern pasterned pasteur Pasteurella Pasteurelleae pasteurellosis Pasteurian pasteurism pasteurization pasteurize pasteurizer pastiche pasticheur pastil pastile pastille pastime pastimer Pastinaca pastiness pasting pastness pastophor pastophorion pastophorium pastophorus pastor pastorage pastoral pastorale pastoralism pastoralist pastorality pastoralize pastorally pastoralness pastorate pastoress pastorhood pastorium pastorize pastorless pastorlike pastorling pastorly pastorship pastose pastosity pastrami pastry pastryman pasturability pasturable pasturage pastural pasture pastureless pasturer pasturewise pasty pasul Pat pat pata pataca patacao pataco patagial patagiate patagium Patagon patagon Patagones Patagonian pataka patamar patao patapat pataque Pataria Patarin Patarine Patarinism patas patashte Patavian patavinity patball patballer patch patchable patcher patchery patchily patchiness patchleaf patchless patchouli patchwise patchword patchwork patchworky patchy pate patefaction patefy patel patella patellar patellaroid patellate Patellidae patellidan patelliform patelline patellofemoral patelloid patellula patellulate paten patency patener patent patentability patentable patentably patentee patently patentor pater patera patercove paterfamiliar paterfamiliarly paterfamilias pateriform paterissa paternal paternalism paternalist paternalistic paternalistically paternality paternalize paternally paternity paternoster paternosterer patesi patesiate path Pathan pathbreaker pathed pathema pathematic pathematically pathematology pathetic pathetical pathetically patheticalness patheticate patheticly patheticness pathetism pathetist pathetize pathfarer pathfinder pathfinding pathic pathicism pathless pathlessness pathlet pathoanatomical pathoanatomy pathobiological pathobiologist pathobiology pathochemistry pathodontia pathogen pathogene pathogenesis pathogenesy pathogenetic pathogenic pathogenicity pathogenous pathogeny pathogerm pathogermic pathognomic pathognomical pathognomonic pathognomonical pathognomy pathognostic pathographical pathography pathologic pathological pathologically pathologicoanatomic pathologicoanatomical pathologicoclinical pathologicohistological pathologicopsychological pathologist pathology patholysis patholytic pathomania pathometabolism pathomimesis pathomimicry pathoneurosis pathonomia pathonomy pathophobia pathophoresis pathophoric pathophorous pathoplastic pathoplastically pathopoeia pathopoiesis pathopoietic pathopsychology pathopsychosis pathoradiography pathos pathosocial Pathrusim pathway pathwayed pathy patible patibulary patibulate patience patiency patient patientless patiently patientness patina patinate patination patine patined patinize patinous patio patisserie patly Patmian Patmos patness patnidar pato patois patola patonce patria patrial patriarch patriarchal patriarchalism patriarchally patriarchate patriarchdom patriarched patriarchess patriarchic patriarchical patriarchically patriarchism patriarchist patriarchship patriarchy Patrice patrice Patricia Patrician patrician patricianhood patricianism patricianly patricianship patriciate patricidal patricide Patricio Patrick patrico patrilineal patrilineally patrilinear patriliny patrilocal patrimonial patrimonially patrimony patrin Patriofelis patriolatry patriot patrioteer patriotess patriotic patriotical patriotically patriotics patriotism patriotly patriotship Patripassian Patripassianism Patripassianist Patripassianly patrist patristic patristical patristically patristicalness patristicism patristics patrix patrizate patrization patrocinium patroclinic patroclinous patrocliny patrogenesis patrol patroller patrollotism patrolman patrologic patrological patrologist patrology patron patronage patronal patronate patrondom patroness patronessship patronite patronizable patronization patronize patronizer patronizing patronizingly patronless patronly patronomatology patronship patronym patronymic patronymically patronymy patroon patroonry patroonship patruity Patsy patta pattable patte pattee patten pattened pattener patter patterer patterist pattern patternable patterned patterner patterning patternize patternless patternlike patternmaker patternmaking patternwise patterny pattu Patty patty pattypan patu patulent patulous patulously patulousness Patuxent patwari Patwin paty pau pauciarticulate pauciarticulated paucidentate pauciflorous paucifoliate paucifolious paucify paucijugate paucilocular pauciloquent pauciloquently pauciloquy paucinervate paucipinnate pauciplicate pauciradiate pauciradiated paucispiral paucispirated paucity paughty paukpan Paul Paula paular pauldron Pauliad Paulian Paulianist Pauliccian Paulicianism paulie paulin Paulina Pauline Paulinia Paulinian Paulinism Paulinist Paulinistic Paulinistically Paulinity Paulinize Paulinus Paulism Paulist Paulista Paulite paulopast paulopost paulospore Paulownia Paulus Paumari paunch paunched paunchful paunchily paunchiness paunchy paup pauper pauperage pauperate pauperdom pauperess pauperism pauperitic pauperization pauperize pauperizer Paurometabola paurometabolic paurometabolism paurometabolous paurometaboly pauropod Pauropoda pauropodous pausably pausal pausation pause pauseful pausefully pauseless pauselessly pausement pauser pausingly paussid Paussidae paut pauxi pavage pavan pavane pave pavement pavemental paver pavestone Pavetta Pavia pavid pavidity pavier pavilion paving pavior Paviotso paviour pavis pavisade pavisado paviser pavisor Pavo pavonated pavonazzetto pavonazzo Pavoncella Pavonia pavonian pavonine pavonize pavy paw pawdite pawer pawing pawk pawkery pawkily pawkiness pawkrie pawky pawl pawn pawnable pawnage pawnbroker pawnbrokerage pawnbrokeress pawnbrokering pawnbrokery pawnbroking Pawnee pawnee pawner pawnie pawnor pawnshop pawpaw Pawtucket pax paxilla paxillar paxillary paxillate paxilliferous paxilliform Paxillosa paxillose paxillus paxiuba paxwax pay payability payable payableness payably Payagua Payaguan payday payed payee payeny payer paying paymaster paymastership payment paymistress Payni paynim paynimhood paynimry Paynize payoff payong payor payroll paysagist Pazend pea peaberry peace peaceable peaceableness peaceably peacebreaker peacebreaking peaceful peacefully peacefulness peaceless peacelessness peacelike peacemaker peacemaking peaceman peacemonger peacemongering peacetime peach peachberry peachblossom peachblow peachen peacher peachery peachick peachify peachiness peachlet peachlike peachwood peachwort peachy peacoat peacock peacockery peacockish peacockishly peacockishness peacockism peacocklike peacockly peacockwise peacocky peacod peafowl peag peage peahen peai peaiism peak peaked peakedly peakedness peaker peakily peakiness peaking peakish peakishly peakishness peakless peaklike peakward peaky peakyish peal pealike pean peanut pear pearceite pearl pearlberry pearled pearler pearlet pearlfish pearlfruit pearlike pearlin pearliness pearling pearlish pearlite pearlitic pearlsides pearlstone pearlweed pearlwort pearly pearmain pearmonger peart pearten peartly peartness pearwood peasant peasantess peasanthood peasantism peasantize peasantlike peasantly peasantry peasantship peasecod peaselike peasen peashooter peason peastake peastaking peastick peasticking peastone peasy peat peatery peathouse peatman peatship peatstack peatwood peaty peavey peavy Peba peba Peban pebble pebbled pebblehearted pebblestone pebbleware pebbly pebrine pebrinous pecan peccability peccable peccadillo peccancy peccant peccantly peccantness peccary peccation peccavi pech pecht pecite peck pecked pecker peckerwood pecket peckful peckhamite peckiness peckish peckishly peckishness peckle peckled peckly Pecksniffian Pecksniffianism Pecksniffism pecky Pecopteris pecopteroid Pecora Pecos pectase pectate pecten pectic pectin Pectinacea pectinacean pectinaceous pectinal pectinase pectinate pectinated pectinately pectination pectinatodenticulate pectinatofimbricate pectinatopinnate pectineal pectineus pectinibranch Pectinibranchia pectinibranchian Pectinibranchiata pectinibranchiate pectinic pectinid Pectinidae pectiniferous pectiniform pectinirostrate pectinite pectinogen pectinoid pectinose pectinous pectizable pectization pectize pectocellulose pectolite pectora pectoral pectoralgia pectoralis pectoralist pectorally pectoriloquial pectoriloquism pectoriloquous pectoriloquy pectosase pectose pectosic pectosinase pectous pectunculate Pectunculus pectus peculate peculation peculator peculiar peculiarism peculiarity peculiarize peculiarly peculiarness peculiarsome peculium pecuniarily pecuniary pecuniosity pecunious ped peda pedage pedagog pedagogal pedagogic pedagogical pedagogically pedagogics pedagogism pedagogist pedagogue pedagoguery pedagoguish pedagoguism pedagogy pedal pedaler pedalfer pedalferic Pedaliaceae pedaliaceous pedalian pedalier Pedalion pedalism pedalist pedaliter pedality Pedalium pedanalysis pedant pedantesque pedantess pedanthood pedantic pedantical pedantically pedanticalness pedanticism pedanticly pedanticness pedantism pedantize pedantocracy pedantocrat pedantocratic pedantry pedary Pedata pedate pedated pedately pedatifid pedatiform pedatilobate pedatilobed pedatinerved pedatipartite pedatisect pedatisected pedatrophia pedder peddle peddler peddleress peddlerism peddlery peddling peddlingly pedee pedelion pederast pederastic pederastically pederasty pedes pedesis pedestal pedestrial pedestrially pedestrian pedestrianate pedestrianism pedestrianize pedetentous Pedetes Pedetidae Pedetinae pediadontia pediadontic pediadontist pedialgia Pediastrum pediatric pediatrician pediatrics pediatrist pediatry pedicab pedicel pediceled pedicellar pedicellaria pedicellate pedicellated pedicellation pedicelled pedicelliform Pedicellina pedicellus pedicle pedicular Pedicularia Pedicularis pediculate pediculated Pediculati pedicule Pediculi pediculicidal pediculicide pediculid Pediculidae Pediculina pediculine pediculofrontal pediculoid pediculoparietal pediculophobia pediculosis pediculous Pediculus pedicure pedicurism pedicurist pediferous pediform pedigerous pedigraic pedigree pedigreeless pediluvium Pedimana pedimanous pediment pedimental pedimented pedimentum Pedioecetes pedion pedionomite Pedionomus pedipalp pedipalpal pedipalpate Pedipalpi Pedipalpida pedipalpous pedipalpus pedipulate pedipulation pedipulator pedlar pedlary pedobaptism pedobaptist pedocal pedocalcic pedodontia pedodontic pedodontist pedodontology pedograph pedological pedologist pedologistical pedologistically pedology pedometer pedometric pedometrical pedometrically pedometrician pedometrist pedomorphic pedomorphism pedomotive pedomotor pedophilia pedophilic pedotribe pedotrophic pedotrophist pedotrophy pedrail pedregal pedrero Pedro pedro pedule pedum peduncle peduncled peduncular Pedunculata pedunculate pedunculated pedunculation pedunculus pee peed peek peekaboo peel peelable peele peeled peeledness peeler peelhouse peeling Peelism Peelite peelman peen peenge peeoy peep peeper peepeye peephole peepy peer peerage peerdom peeress peerhood peerie peeringly peerless peerlessly peerlessness peerling peerly peership peery peesash peesoreh peesweep peetweet peeve peeved peevedly peevedness peever peevish peevishly peevishness peewee Peg peg pega pegall peganite Peganum Pegasean Pegasian Pegasid pegasid Pegasidae pegasoid Pegasus pegboard pegbox pegged pegger pegging peggle Peggy peggy pegless peglet peglike pegman pegmatite pegmatitic pegmatization pegmatize pegmatoid pegmatophyre pegology pegomancy Peguan pegwood Pehlevi peho Pehuenche peignoir peine peirameter peirastic peirastically peisage peise peiser Peitho peixere pejorate pejoration pejorationist pejorative pejoratively pejorism pejorist pejority pekan Pekin pekin Peking Pekingese pekoe peladic pelage pelagial Pelagian pelagian Pelagianism Pelagianize Pelagianizer pelagic Pelagothuria pelamyd pelanos Pelargi pelargic Pelargikon pelargomorph Pelargomorphae pelargomorphic pelargonate pelargonic pelargonidin pelargonin pelargonium Pelasgi Pelasgian Pelasgic Pelasgikon Pelasgoi Pele pelean pelecan Pelecani Pelecanidae Pelecaniformes Pelecanoides Pelecanoidinae Pelecanus pelecypod Pelecypoda pelecypodous pelelith pelerine Peleus Pelew pelf Pelias pelican pelicanry pelick pelicometer Pelides Pelidnota pelike peliom pelioma peliosis pelisse pelite pelitic pell Pellaea pellage pellagra pellagragenic pellagrin pellagrose pellagrous pellar pellard pellas pellate pellation peller pellet pelleted pelletierine pelletlike pellety Pellian pellicle pellicula pellicular pellicularia pelliculate pellicule pellile pellitory pellmell pellock pellotine pellucent pellucid pellucidity pellucidly pellucidness Pelmanism Pelmanist Pelmanize pelmatic pelmatogram Pelmatozoa pelmatozoan pelmatozoic pelmet Pelobates pelobatid Pelobatidae pelobatoid Pelodytes pelodytid Pelodytidae pelodytoid Pelomedusa pelomedusid Pelomedusidae pelomedusoid Pelomyxa pelon Pelopaeus Pelopid Pelopidae Peloponnesian Pelops peloria pelorian peloriate peloric pelorism pelorization pelorize pelorus pelota pelotherapy peloton pelt pelta Peltandra peltast peltate peltated peltately peltatifid peltation peltatodigitate pelter pelterer peltiferous peltifolious peltiform Peltigera Peltigeraceae peltigerine peltigerous peltinerved pelting peltingly peltless peltmonger Peltogaster peltry pelu peludo Pelusios pelveoperitonitis pelves Pelvetia pelvic pelviform pelvigraph pelvigraphy pelvimeter pelvimetry pelviolithotomy pelvioperitonitis pelvioplasty pelvioradiography pelvioscopy pelviotomy pelviperitonitis pelvirectal pelvis pelvisacral pelvisternal pelvisternum pelycogram pelycography pelycology pelycometer pelycometry pelycosaur Pelycosauria pelycosaurian pembina Pembroke pemican pemmican pemmicanization pemmicanize pemphigoid pemphigous pemphigus pen penacute Penaea Penaeaceae penaeaceous penal penalist penality penalizable penalization penalize penally penalty penance penanceless penang penannular penates penbard pencatite pence pencel penceless penchant penchute pencil penciled penciler penciliform penciling pencilled penciller pencillike pencilling pencilry pencilwood pencraft pend penda pendant pendanted pendanting pendantlike pendecagon pendeloque pendency pendent pendentive pendently pendicle pendicler pending pendle pendom pendragon pendragonish pendragonship pendulant pendular pendulate pendulation pendule penduline pendulosity pendulous pendulously pendulousness pendulum pendulumlike Penelope Penelopean Penelophon Penelopinae penelopine peneplain peneplanation peneplane peneseismic penetrability penetrable penetrableness penetrably penetral penetralia penetralian penetrance penetrancy penetrant penetrate penetrating penetratingly penetratingness penetration penetrative penetratively penetrativeness penetrativity penetrator penetrology penetrometer penfieldite penfold penful penghulu pengo penguin penguinery penhead penholder penial penicillate penicillated penicillately penicillation penicilliform penicillin Penicillium penide penile peninsula peninsular peninsularism peninsularity peninsulate penintime peninvariant penis penistone penitence penitencer penitent Penitentes penitential penitentially penitentiary penitentiaryship penitently penk penkeeper penknife penlike penmaker penmaking penman penmanship penmaster penna pennaceous Pennacook pennae pennage Pennales pennant Pennaria Pennariidae Pennatae pennate pennated pennatifid pennatilobate pennatipartite pennatisect pennatisected Pennatula Pennatulacea pennatulacean pennatulaceous pennatularian pennatulid Pennatulidae pennatuloid penneech penneeck penner pennet penni pennia pennied penniferous penniform pennigerous penniless pennilessly pennilessness pennill penninervate penninerved penning penninite pennipotent Pennisetum penniveined pennon pennoned pennopluma pennoplume pennorth Pennsylvania Pennsylvanian Penny penny pennybird pennycress pennyearth pennyflower pennyhole pennyleaf pennyrot pennyroyal pennysiller pennystone pennyweight pennywinkle pennywort pennyworth Penobscot penologic penological penologist penology penorcon penrack penroseite Pensacola penscript penseful pensefulness penship pensile pensileness pensility pension pensionable pensionably pensionary pensioner pensionership pensionless pensive pensived pensively pensiveness penster penstick penstock pensum pensy pent penta pentabasic pentabromide pentacapsular pentacarbon pentacarbonyl pentacarpellary pentace pentacetate pentachenium pentachloride pentachord pentachromic pentacid pentacle pentacoccous pentacontane pentacosane Pentacrinidae pentacrinite pentacrinoid Pentacrinus pentacron pentacrostic pentactinal pentactine pentacular pentacyanic pentacyclic pentad pentadactyl Pentadactyla pentadactylate pentadactyle pentadactylism pentadactyloid pentadecagon pentadecahydrate pentadecahydrated pentadecane pentadecatoic pentadecoic pentadecyl pentadecylic pentadelphous pentadicity pentadiene pentadodecahedron pentadrachm pentadrachma pentaerythrite pentaerythritol pentafid pentafluoride pentagamist pentaglossal pentaglot pentaglottical pentagon pentagonal pentagonally pentagonohedron pentagonoid pentagram pentagrammatic pentagyn Pentagynia pentagynian pentagynous pentahalide pentahedral pentahedrical pentahedroid pentahedron pentahedrous pentahexahedral pentahexahedron pentahydrate pentahydrated pentahydric pentahydroxy pentail pentaiodide pentalobate pentalogue pentalogy pentalpha Pentamera pentameral pentameran pentamerid Pentameridae pentamerism pentameroid pentamerous Pentamerus pentameter pentamethylene pentamethylenediamine pentametrist pentametrize pentander Pentandria pentandrian pentandrous pentane pentanedione pentangle pentangular pentanitrate pentanoic pentanolide pentanone pentapetalous Pentaphylacaceae pentaphylacaceous Pentaphylax pentaphyllous pentaploid pentaploidic pentaploidy pentapody pentapolis pentapolitan pentapterous pentaptote pentaptych pentaquine pentarch pentarchical pentarchy pentasepalous pentasilicate pentaspermous pentaspheric pentaspherical pentastich pentastichous pentastichy pentastome Pentastomida pentastomoid pentastomous Pentastomum pentastyle pentastylos pentasulphide pentasyllabic pentasyllabism pentasyllable Pentateuch Pentateuchal pentateuchal pentathionate pentathionic pentathlete pentathlon pentathlos pentatomic pentatomid Pentatomidae Pentatomoidea pentatone pentatonic pentatriacontane pentavalence pentavalency pentavalent penteconter pentecontoglossal Pentecost Pentecostal pentecostal pentecostalism pentecostalist pentecostarion pentecoster pentecostys Pentelic Pentelican pentene penteteric penthemimer penthemimeral penthemimeris Penthestes penthiophen penthiophene Penthoraceae Penthorum penthouse penthouselike penthrit penthrite pentimento pentine pentiodide pentit pentite pentitol pentlandite pentobarbital pentode pentoic pentol pentosan pentosane pentose pentoside pentosuria pentoxide pentremital pentremite Pentremites Pentremitidae pentrit pentrite pentrough Pentstemon pentstock penttail pentyl pentylene pentylic pentylidene pentyne Pentzia penuchi penult penultima penultimate penultimatum penumbra penumbrae penumbral penumbrous penurious penuriously penuriousness penury Penutian penwiper penwoman penwomanship penworker penwright peon peonage peonism peony people peopledom peoplehood peopleize peopleless peopler peoplet peoplish Peoria Peorian peotomy pep peperine peperino Peperomia pepful Pephredo pepinella pepino peplos peplosed peplum peplus pepo peponida peponium pepper pepperbox peppercorn peppercornish peppercorny pepperer peppergrass pepperidge pepperily pepperiness pepperish pepperishly peppermint pepperoni pepperproof pepperroot pepperweed pepperwood pepperwort peppery peppily peppin peppiness peppy pepsin pepsinate pepsinhydrochloric pepsiniferous pepsinogen pepsinogenic pepsinogenous pepsis peptic peptical pepticity peptidase peptide peptizable peptization peptize peptizer peptogaster peptogenic peptogenous peptogeny peptohydrochloric peptolysis peptolytic peptonaemia peptonate peptone peptonemia peptonic peptonization peptonize peptonizer peptonoid peptonuria peptotoxine Pepysian Pequot Per per Peracarida peracephalus peracetate peracetic peracid peracidite peract peracute peradventure peragrate peragration Perakim peramble perambulant perambulate perambulation perambulator perambulatory Perameles Peramelidae perameline perameloid Peramium Peratae Perates perbend perborate perborax perbromide Perca percale percaline percarbide percarbonate percarbonic perceivability perceivable perceivableness perceivably perceivance perceivancy perceive perceivedly perceivedness perceiver perceiving perceivingness percent percentable percentably percentage percentaged percental percentile percentual percept perceptibility perceptible perceptibleness perceptibly perception perceptional perceptionalism perceptionism perceptive perceptively perceptiveness perceptivity perceptual perceptually Percesoces percesocine Perceval perch percha perchable perchance percher Percheron perchlorate perchlorethane perchlorethylene perchloric perchloride perchlorinate perchlorination perchloroethane perchloroethylene perchromate perchromic percid Percidae perciform Perciformes percipience percipiency percipient Percival perclose percnosome percoct percoid Percoidea percoidean percolable percolate percolation percolative percolator percomorph Percomorphi percomorphous percompound percontation percontatorial percribrate percribration percrystallization perculsion perculsive percur percurration percurrent percursory percuss percussion percussional percussioner percussionist percussionize percussive percussively percussiveness percussor percutaneous percutaneously percutient Percy percylite Perdicinae perdicine perdition perditionable Perdix perdricide perdu perduellion perdurability perdurable perdurableness perdurably perdurance perdurant perdure perduring perduringly Perean peregrin peregrina peregrinate peregrination peregrinator peregrinatory peregrine peregrinity peregrinoid pereion pereiopod pereira pereirine peremptorily peremptoriness peremptory perendinant perendinate perendination perendure perennate perennation perennial perenniality perennialize perennially perennibranch Perennibranchiata perennibranchiate perequitate peres Pereskia perezone perfect perfectation perfected perfectedly perfecter perfecti perfectibilian perfectibilism perfectibilist perfectibilitarian perfectibility perfectible perfecting perfection perfectionate perfectionation perfectionator perfectioner perfectionism perfectionist perfectionistic perfectionize perfectionizement perfectionizer perfectionment perfectism perfectist perfective perfectively perfectiveness perfectivity perfectivize perfectly perfectness perfecto perfector perfectuation perfervent perfervid perfervidity perfervidly perfervidness perfervor perfervour perfidious perfidiously perfidiousness perfidy perfilograph perflate perflation perfluent perfoliate perfoliation perforable perforant Perforata perforate perforated perforation perforationproof perforative perforator perforatorium perforatory perforce perforcedly perform performable performance performant performative performer perfrication perfumatory perfume perfumed perfumeless perfumer perfumeress perfumery perfumy perfunctionary perfunctorily perfunctoriness perfunctorious perfunctoriously perfunctorize perfunctory perfuncturate perfusate perfuse perfusion perfusive Pergamene pergameneous Pergamenian pergamentaceous Pergamic pergamyn pergola perhalide perhalogen perhaps perhazard perhorresce perhydroanthracene perhydrogenate perhydrogenation perhydrogenize peri periacinal periacinous periactus periadenitis periamygdalitis perianal periangiocholitis periangioma periangitis perianth perianthial perianthium periaortic periaortitis periapical periappendicitis periappendicular periapt Periarctic periareum periarterial periarteritis periarthric periarthritis periarticular periaster periastral periastron periastrum periatrial periauricular periaxial periaxillary periaxonal periblast periblastic periblastula periblem peribolos peribolus peribranchial peribronchial peribronchiolar peribronchiolitis peribronchitis peribulbar peribursal pericaecal pericaecitis pericanalicular pericapsular pericardia pericardiac pericardiacophrenic pericardial pericardicentesis pericardiectomy pericardiocentesis pericardiolysis pericardiomediastinitis pericardiophrenic pericardiopleural pericardiorrhaphy pericardiosymphysis pericardiotomy pericarditic pericarditis pericardium pericardotomy pericarp pericarpial pericarpic pericarpium pericarpoidal pericecal pericecitis pericellular pericemental pericementitis pericementoclasia pericementum pericenter pericentral pericentric pericephalic pericerebral perichaete perichaetial perichaetium perichete pericholangitis pericholecystitis perichondral perichondrial perichondritis perichondrium perichord perichordal perichoresis perichorioidal perichoroidal perichylous pericladium periclase periclasia periclasite periclaustral Periclean Pericles periclinal periclinally pericline periclinium periclitate periclitation pericolitis pericolpitis periconchal periconchitis pericopal pericope pericopic pericorneal pericowperitis pericoxitis pericranial pericranitis pericranium pericristate Pericu periculant pericycle pericycloid pericyclone pericyclonic pericystic pericystitis pericystium pericytial peridendritic peridental peridentium peridentoclasia periderm peridermal peridermic Peridermium peridesm peridesmic peridesmitis peridesmium peridial peridiastole peridiastolic perididymis perididymitis peridiiform Peridineae Peridiniaceae peridiniaceous peridinial Peridiniales peridinian peridinid Peridinidae Peridinieae Peridiniidae Peridinium peridiole peridiolum peridium peridot peridotic peridotite peridotitic periductal periegesis periegetic perielesis periencephalitis perienteric perienteritis perienteron periependymal periesophageal periesophagitis perifistular perifoliary perifollicular perifolliculitis perigangliitis periganglionic perigastric perigastritis perigastrula perigastrular perigastrulation perigeal perigee perigemmal perigenesis perigenital perigeum periglandular perigloea periglottic periglottis perignathic perigon perigonadial perigonal perigone perigonial perigonium perigraph perigraphic perigynial perigynium perigynous perigyny perihelial perihelian perihelion perihelium perihepatic perihepatitis perihermenial perihernial perihysteric perijejunitis perijove perikaryon perikronion peril perilabyrinth perilabyrinthitis perilaryngeal perilaryngitis perilenticular periligamentous Perilla perilless perilobar perilous perilously perilousness perilsome perilymph perilymphangial perilymphangitis perilymphatic perimartium perimastitis perimedullary perimeningitis perimeter perimeterless perimetral perimetric perimetrical perimetrically perimetritic perimetritis perimetrium perimetry perimorph perimorphic perimorphism perimorphous perimyelitis perimysial perimysium perine perineal perineocele perineoplastic perineoplasty perineorrhaphy perineoscrotal perineostomy perineosynthesis perineotomy perineovaginal perineovulvar perinephral perinephrial perinephric perinephritic perinephritis perinephrium perineptunium perineum perineural perineurial perineuritis perineurium perinium perinuclear periocular period periodate periodic periodical periodicalism periodicalist periodicalize periodically periodicalness periodicity periodide periodize periodogram periodograph periodology periodontal periodontia periodontic periodontist periodontitis periodontium periodontoclasia periodontologist periodontology periodontum periodoscope perioeci perioecians perioecic perioecid perioecus perioesophageal perioikoi periomphalic perionychia perionychium perionyx perionyxis perioophoritis periophthalmic periophthalmitis periople perioplic perioptic perioptometry perioral periorbit periorbita periorbital periorchitis periost periostea periosteal periosteitis periosteoalveolar periosteoma periosteomedullitis periosteomyelitis periosteophyte periosteorrhaphy periosteotome periosteotomy periosteous periosteum periostitic periostitis periostoma periostosis periostotomy periostracal periostracum periotic periovular peripachymeningitis peripancreatic peripancreatitis peripapillary Peripatetic peripatetic peripatetical peripatetically peripateticate Peripateticism Peripatidae Peripatidea peripatize peripatoid Peripatopsidae Peripatopsis Peripatus peripenial peripericarditis peripetalous peripetasma peripeteia peripetia peripety periphacitis peripharyngeal peripherad peripheral peripherally peripherial peripheric peripherical peripherically peripherocentral peripheroceptor peripheromittor peripheroneural peripherophose periphery periphlebitic periphlebitis periphractic periphrase periphrases periphrasis periphrastic periphrastical periphrastically periphraxy periphyllum periphyse periphysis Periplaneta periplasm periplast periplastic periplegmatic peripleural peripleuritis Periploca periplus peripneumonia peripneumonic peripneumony peripneustic peripolar peripolygonal periportal periproct periproctal periproctitis periproctous periprostatic periprostatitis peripteral peripterous periptery peripylephlebitis peripyloric perique perirectal perirectitis perirenal perisalpingitis perisarc perisarcal perisarcous perisaturnium periscian periscians periscii perisclerotic periscopal periscope periscopic periscopical periscopism perish perishability perishable perishableness perishably perished perishing perishingly perishless perishment perisigmoiditis perisinuitis perisinuous perisinusitis perisoma perisomal perisomatic perisome perisomial perisperm perispermal perispermatitis perispermic perisphere perispheric perispherical perisphinctean Perisphinctes Perisphinctidae perisphinctoid perisplanchnic perisplanchnitis perisplenetic perisplenic perisplenitis perispome perispomenon perispondylic perispondylitis perispore Perisporiaceae perisporiaceous Perisporiales perissad perissodactyl Perissodactyla perissodactylate perissodactyle perissodactylic perissodactylism perissodactylous perissologic perissological perissology perissosyllabic peristalith peristalsis peristaltic peristaltically peristaphyline peristaphylitis peristele peristerite peristeromorph Peristeromorphae peristeromorphic peristeromorphous peristeronic peristerophily peristeropod peristeropodan peristeropode Peristeropodes peristeropodous peristethium peristole peristoma peristomal peristomatic peristome peristomial peristomium peristrephic peristrephical peristrumitis peristrumous peristylar peristyle peristylium peristylos peristylum perisynovial perisystole perisystolic perit perite peritectic peritendineum peritenon perithece perithecial perithecium perithelial perithelioma perithelium perithoracic perithyreoiditis perithyroiditis peritomize peritomous peritomy peritoneal peritonealgia peritoneally peritoneocentesis peritoneoclysis peritoneomuscular peritoneopathy peritoneopericardial peritoneopexy peritoneoplasty peritoneoscope peritoneoscopy peritoneotomy peritoneum peritonism peritonital peritonitic peritonitis peritonsillar peritonsillitis peritracheal peritrema peritrematous peritreme peritrich Peritricha peritrichan peritrichic peritrichous peritrichously peritroch peritrochal peritrochanteric peritrochium peritrochoid peritropal peritrophic peritropous perityphlic perityphlitic perityphlitis periumbilical periungual periuranium periureteric periureteritis periurethral periurethritis periuterine periuvular perivaginal perivaginitis perivascular perivasculitis perivenous perivertebral perivesical perivisceral perivisceritis perivitellin perivitelline periwig periwigpated periwinkle periwinkled periwinkler perizonium perjink perjinkety perjinkities perjinkly perjure perjured perjuredly perjuredness perjurer perjuress perjurious perjuriously perjuriousness perjurous perjury perjurymonger perjurymongering perk perkily Perkin perkin perkiness perking perkingly perkish perknite perky Perla perlaceous Perlaria perle perlection perlid Perlidae perligenous perlingual perlingually perlite perlitic perloir perlustrate perlustration perlustrator perm permafrost Permalloy permalloy permanence permanency permanent permanently permanentness permanganate permanganic permansive permeability permeable permeableness permeably permeameter permeance permeant permeate permeation permeative permeator Permiak Permian permillage permirific permissibility permissible permissibleness permissibly permission permissioned permissive permissively permissiveness permissory permit permittable permitted permittedly permittee permitter permittivity permixture Permocarboniferous permonosulphuric permoralize permutability permutable permutableness permutably permutate permutation permutational permutationist permutator permutatorial permutatory permute permuter pern pernancy pernasal pernavigate Pernettia pernicious perniciously perniciousness pernicketiness pernickety pernine Pernis pernitrate pernitric pernoctation pernor pernyi peroba perobrachius perocephalus perochirus perodactylus Perodipus Perognathinae Perognathus Peromedusae Peromela peromelous peromelus Peromyscus peronate peroneal peroneocalcaneal peroneotarsal peroneotibial peronial peronium Peronospora Peronosporaceae peronosporaceous Peronosporales peropod Peropoda peropodous peropus peroral perorally perorate peroration perorational perorative perorator peroratorical peroratorically peroratory perosis perosmate perosmic perosomus perotic perovskite peroxidase peroxidate peroxidation peroxide peroxidic peroxidize peroxidizement peroxy peroxyl perozonid perozonide perpend perpendicular perpendicularity perpendicularly perpera perperfect perpetrable perpetrate perpetration perpetrator perpetratress perpetratrix perpetuable perpetual perpetualism perpetualist perpetuality perpetually perpetualness perpetuana perpetuance perpetuant perpetuate perpetuation perpetuator perpetuity perplantar perplex perplexable perplexed perplexedly perplexedness perplexer perplexing perplexingly perplexity perplexment perplication perquadrat perquest perquisite perquisition perquisitor perradial perradially perradiate perradius perridiculous perrier Perrinist perron perruche perrukery perruthenate perruthenic Perry perry perryman Persae persalt perscent perscribe perscrutate perscrutation perscrutator perse Persea persecute persecutee persecuting persecutingly persecution persecutional persecutive persecutiveness persecutor persecutory persecutress persecutrix Perseid perseite perseitol perseity persentiscency Persephassa Persephone Persepolitan perseverance perseverant perseverate perseveration persevere persevering perseveringly Persian Persianist Persianization Persianize Persic Persicaria persicary Persicize persico persicot persienne persiennes persiflage persiflate persilicic persimmon Persis persis Persism persist persistence persistency persistent persistently persister persisting persistingly persistive persistively persistiveness persnickety person persona personable personableness personably personage personal personalia personalism personalist personalistic personality personalization personalize personally personalness personalty personate personately personating personation personative personator personed personeity personifiable personifiant personification personificative personificator personifier personify personization personize personnel personship perspection perspective perspectived perspectiveless perspectively perspectivity perspectograph perspectometer perspicacious perspicaciously perspicaciousness perspicacity perspicuity perspicuous perspicuously perspicuousness perspirability perspirable perspirant perspirate perspiration perspirative perspiratory perspire perspiringly perspiry perstringe perstringement persuadability persuadable persuadableness persuadably persuade persuaded persuadedly persuadedness persuader persuadingly persuasibility persuasible persuasibleness persuasibly persuasion persuasive persuasively persuasiveness persuasory persulphate persulphide persulphocyanate persulphocyanic persulphuric persymmetric persymmetrical pert pertain pertaining pertainment perten perthiocyanate perthiocyanic perthiotophyre perthite perthitic perthitically perthosite pertinacious pertinaciously pertinaciousness pertinacity pertinence pertinency pertinent pertinently pertinentness pertish pertly pertness perturb perturbability perturbable perturbance perturbancy perturbant perturbate perturbation perturbational perturbatious perturbative perturbator perturbatory perturbatress perturbatrix perturbed perturbedly perturbedness perturber perturbing perturbingly perturbment Pertusaria Pertusariaceae pertuse pertused pertusion pertussal pertussis perty Peru Perugian Peruginesque peruke perukeless perukier perukiership perula Perularia perulate perule Perun perusable perusal peruse peruser Peruvian Peruvianize pervade pervadence pervader pervading pervadingly pervadingness pervagate pervagation pervalvar pervasion pervasive pervasively pervasiveness perverse perversely perverseness perversion perversity perversive pervert perverted pervertedly pervertedness perverter pervertibility pervertible pervertibly pervertive perviability perviable pervicacious pervicaciously pervicaciousness pervicacity pervigilium pervious perviously perviousness pervulgate pervulgation perwitsky pes pesa Pesach pesade pesage Pesah peseta peshkar peshkash peshwa peshwaship peskily peskiness pesky peso pess pessary pessimal pessimism pessimist pessimistic pessimistically pessimize pessimum pessomancy pessoner pessular pessulus pest Pestalozzian Pestalozzianism peste pester pesterer pesteringly pesterment pesterous pestersome pestful pesthole pesthouse pesticidal pesticide pestiduct pestiferous pestiferously pestiferousness pestifugous pestify pestilence pestilenceweed pestilencewort pestilent pestilential pestilentially pestilentialness pestilently pestle pestological pestologist pestology pestproof pet petal petalage petaled Petalia petaliferous petaliform Petaliidae petaline petalism petalite petalled petalless petallike petalocerous petalodic petalodont petalodontid Petalodontidae petalodontoid Petalodus petalody petaloid petaloidal petaloideous petalomania petalon Petalostemon petalous petalwise petaly petard petardeer petardier petary Petasites petasos petasus petaurine petaurist Petaurista Petauristidae Petauroides Petaurus petchary petcock Pete pete peteca petechiae petechial petechiate peteman Peter peter Peterkin Peterloo peterman peternet petersham peterwort petful petiolar petiolary Petiolata petiolate petiolated petiole petioled Petioliventres petiolular petiolulate petiolule petiolus petit petite petiteness petitgrain petition petitionable petitional petitionarily petitionary petitionee petitioner petitionist petitionproof petitor petitory Petiveria Petiveriaceae petkin petling peto Petr Petrarchal Petrarchan Petrarchesque Petrarchian Petrarchianism Petrarchism Petrarchist Petrarchistic Petrarchistical Petrarchize petrary petre Petrea petrean petreity petrel petrescence petrescent Petricola Petricolidae petricolous petrie petrifaction petrifactive petrifiable petrific petrificant petrificate petrification petrified petrifier petrify Petrine Petrinism Petrinist Petrinize petrissage Petrobium Petrobrusian petrochemical petrochemistry Petrogale petrogenesis petrogenic petrogeny petroglyph petroglyphic petroglyphy petrograph petrographer petrographic petrographical petrographically petrography petrohyoid petrol petrolage petrolatum petrolean petrolene petroleous petroleum petrolic petroliferous petrolific petrolist petrolithic petrolization petrolize petrologic petrological petrologically petromastoid Petromyzon Petromyzonidae petromyzont Petromyzontes Petromyzontidae petromyzontoid petronel petronella petropharyngeal petrophilous petrosa petrosal Petroselinum petrosilex petrosiliceous petrosilicious petrosphenoid petrosphenoidal petrosphere petrosquamosal petrosquamous petrostearin petrostearine petrosum petrotympanic petrous petroxolin pettable petted pettedly pettedness petter pettichaps petticoat petticoated petticoaterie petticoatery petticoatism petticoatless petticoaty pettifog pettifogger pettifoggery pettifogging pettifogulize pettifogulizer pettily pettiness pettingly pettish pettitoes pettle petty pettyfog petulance petulancy petulant petulantly petune Petunia petuntse petwood petzite Peucedanum Peucetii peucites peuhl Peul Peumus Peutingerian pew pewage pewdom pewee pewfellow pewful pewholder pewing pewit pewless pewmate pewter pewterer pewterwort pewtery pewy Peyerian peyote peyotl peyton peytrel pezantic Peziza Pezizaceae pezizaceous pezizaeform Pezizales peziziform pezizoid pezograph Pezophaps Pfaffian pfeffernuss Pfeifferella pfennig pfui pfund Phaca Phacelia phacelite phacella Phacidiaceae Phacidiales phacitis phacoanaphylaxis phacocele phacochere phacocherine phacochoere phacochoerid phacochoerine phacochoeroid Phacochoerus phacocyst phacocystectomy phacocystitis phacoglaucoma phacoid phacoidal phacoidoscope phacolite phacolith phacolysis phacomalacia phacometer phacopid Phacopidae Phacops phacosclerosis phacoscope phacotherapy Phaeacian Phaedo phaeism phaenantherous phaenanthery phaenogam Phaenogamia phaenogamian phaenogamic phaenogamous phaenogenesis phaenogenetic phaenological phaenology phaenomenal phaenomenism phaenomenon phaenozygous phaeochrous Phaeodaria phaeodarian phaeophore Phaeophyceae phaeophycean phaeophyceous phaeophyll Phaeophyta phaeophytin phaeoplast Phaeosporales phaeospore Phaeosporeae phaeosporous Phaet Phaethon Phaethonic Phaethontes Phaethontic Phaethontidae Phaethusa phaeton phage phagedena phagedenic phagedenical phagedenous Phagineae phagocytable phagocytal phagocyte phagocyter phagocytic phagocytism phagocytize phagocytoblast phagocytolysis phagocytolytic phagocytose phagocytosis phagodynamometer phagolysis phagolytic phagomania phainolion Phainopepla Phajus Phalacrocoracidae phalacrocoracine Phalacrocorax phalacrosis Phalaecean Phalaecian Phalaenae Phalaenidae phalaenopsid Phalaenopsis phalangal phalange phalangeal phalangean phalanger Phalangeridae Phalangerinae phalangerine phalanges phalangette phalangian phalangic phalangid Phalangida phalangidan Phalangidea phalangidean Phalangides phalangiform Phalangigrada phalangigrade phalangigrady phalangiid Phalangiidae phalangist Phalangista Phalangistidae phalangistine phalangite phalangitic phalangitis Phalangium phalangologist phalangology phalansterial phalansterian phalansterianism phalansteric phalansterism phalansterist phalanstery phalanx phalanxed phalarica Phalaris Phalarism phalarope Phalaropodidae phalera phalerate phalerated Phaleucian Phallaceae phallaceous Phallales phallalgia phallaneurysm phallephoric phallic phallical phallicism phallicist phallin phallism phallist phallitis phallocrypsis phallodynia phalloid phalloncus phalloplasty phallorrhagia phallus Phanar Phanariot Phanariote phanatron phaneric phanerite Phanerocarpae Phanerocarpous Phanerocephala phanerocephalous phanerocodonic phanerocryst phanerocrystalline phanerogam Phanerogamia phanerogamian phanerogamic phanerogamous phanerogamy phanerogenetic phanerogenic Phaneroglossa phaneroglossal phaneroglossate phaneromania phaneromere phaneromerous phaneroscope phanerosis phanerozoic phanerozonate Phanerozonia phanic phano phansigar phantascope phantasia Phantasiast Phantasiastic phantasist phantasize phantasm phantasma phantasmagoria phantasmagorial phantasmagorially phantasmagorian phantasmagoric phantasmagorical phantasmagorist phantasmagory phantasmal phantasmalian phantasmality phantasmally phantasmascope phantasmata Phantasmatic phantasmatic phantasmatical phantasmatically phantasmatography phantasmic phantasmical phantasmically Phantasmist phantasmogenesis phantasmogenetic phantasmograph phantasmological phantasmology phantast phantasy phantom phantomatic phantomic phantomical phantomically Phantomist phantomize phantomizer phantomland phantomlike phantomnation phantomry phantomship phantomy phantoplex phantoscope Pharaoh Pharaonic Pharaonical Pharbitis phare Phareodus Pharian Pharisaean Pharisaic pharisaical pharisaically pharisaicalness Pharisaism Pharisaist Pharisean Pharisee pharisee Phariseeism pharmacal pharmaceutic pharmaceutical pharmaceutically pharmaceutics pharmaceutist pharmacic pharmacist pharmacite pharmacodiagnosis pharmacodynamic pharmacodynamical pharmacodynamics pharmacoendocrinology pharmacognosia pharmacognosis pharmacognosist pharmacognostical pharmacognostically pharmacognostics pharmacognosy pharmacography pharmacolite pharmacologia pharmacologic pharmacological pharmacologically pharmacologist pharmacology pharmacomania pharmacomaniac pharmacomaniacal pharmacometer pharmacopedia pharmacopedic pharmacopedics pharmacopeia pharmacopeial pharmacopeian pharmacophobia pharmacopoeia pharmacopoeial pharmacopoeian pharmacopoeist pharmacopolist pharmacoposia pharmacopsychology pharmacosiderite pharmacotherapy pharmacy pharmakos pharmic pharmuthi pharology Pharomacrus pharos Pharsalian pharyngal pharyngalgia pharyngalgic pharyngeal pharyngectomy pharyngemphraxis pharynges pharyngic pharyngismus pharyngitic pharyngitis pharyngoamygdalitis pharyngobranch pharyngobranchial pharyngobranchiate Pharyngobranchii pharyngocele pharyngoceratosis pharyngodynia pharyngoepiglottic pharyngoepiglottidean pharyngoesophageal pharyngoglossal pharyngoglossus pharyngognath Pharyngognathi pharyngognathous pharyngographic pharyngography pharyngokeratosis pharyngolaryngeal pharyngolaryngitis pharyngolith pharyngological pharyngology pharyngomaxillary pharyngomycosis pharyngonasal pharyngopalatine pharyngopalatinus pharyngoparalysis pharyngopathy pharyngoplasty pharyngoplegia pharyngoplegic pharyngoplegy pharyngopleural Pharyngopneusta pharyngopneustal pharyngorhinitis pharyngorhinoscopy pharyngoscleroma pharyngoscope pharyngoscopy pharyngospasm pharyngotherapy pharyngotomy pharyngotonsillitis pharyngotyphoid pharyngoxerosis pharynogotome pharynx Phascaceae phascaceous Phascogale Phascolarctinae Phascolarctos phascolome Phascolomyidae Phascolomys Phascolonus Phascum phase phaseal phaseless phaselin phasemeter phasemy Phaseolaceae phaseolin phaseolous phaseolunatin Phaseolus phaseometer phases Phasianella Phasianellidae phasianic phasianid Phasianidae Phasianinae phasianine phasianoid Phasianus phasic Phasiron phasis phasm phasma phasmatid Phasmatida Phasmatidae Phasmatodea phasmatoid Phasmatoidea phasmatrope phasmid Phasmida Phasmidae phasmoid phasogeneous phasotropy pheal pheasant pheasantry pheasantwood Phebe Phecda Phegopteris Pheidole phellandrene phellem Phellodendron phelloderm phellodermal phellogen phellogenetic phellogenic phellonic phelloplastic phelloplastics phelonion phemic Phemie phenacaine phenacetin phenaceturic phenacite Phenacodontidae Phenacodus phenacyl phenakism phenakistoscope Phenalgin phenanthrene phenanthridine phenanthridone phenanthrol phenanthroline phenarsine phenate phenazine phenazone phene phenegol phenene phenethyl phenetidine phenetole phengite phengitical phenic phenicate phenicious phenicopter phenin phenmiazine phenobarbital phenocoll phenocopy phenocryst phenocrystalline phenogenesis phenogenetic phenol phenolate phenolic phenolization phenolize phenological phenologically phenologist phenology phenoloid phenolphthalein phenolsulphonate phenolsulphonephthalein phenolsulphonic phenomena phenomenal phenomenalism phenomenalist phenomenalistic phenomenalistically phenomenality phenomenalization phenomenalize phenomenally phenomenic phenomenical phenomenism phenomenist phenomenistic phenomenize phenomenological phenomenologically phenomenology phenomenon phenoplast phenoplastic phenoquinone phenosafranine phenosal phenospermic phenospermy phenothiazine phenotype phenotypic phenotypical phenotypically phenoxazine phenoxid phenoxide phenozygous Pheny phenyl phenylacetaldehyde phenylacetamide phenylacetic phenylalanine phenylamide phenylamine phenylate phenylation phenylboric phenylcarbamic phenylcarbimide phenylene phenylenediamine phenylethylene phenylglycine phenylglycolic phenylglyoxylic phenylhydrazine phenylhydrazone phenylic phenylmethane pheon pheophyl pheophyll pheophytin Pherecratean Pherecratian Pherecratic Pherephatta pheretrer Pherkad Pherophatta Phersephatta Phersephoneia phew phi phial phiale phialful phialide phialine phiallike phialophore phialospore Phidiac Phidian Phigalian Phil Philadelphian Philadelphianism philadelphite Philadelphus philadelphy philalethist philamot Philander philander philanderer philanthid Philanthidae philanthrope philanthropian philanthropic philanthropical philanthropically philanthropinism philanthropinist Philanthropinum philanthropism philanthropist philanthropistic philanthropize philanthropy Philanthus philantomba philarchaist philaristocracy philatelic philatelical philatelically philatelism philatelist philatelistic philately Philathea philathletic philematology Philepitta Philepittidae Philesia Philetaerus philharmonic philhellene philhellenic philhellenism philhellenist philhippic philhymnic philiater Philip Philippa Philippan Philippe Philippian Philippic philippicize Philippine Philippines Philippism Philippist Philippistic Philippizate philippize philippizer philippus Philistia Philistian Philistine Philistinely Philistinian Philistinic Philistinish Philistinism Philistinize Phill philliloo Phillip phillipsine phillipsite Phillis Phillyrea phillyrin philobiblian philobiblic philobiblical philobiblist philobotanic philobotanist philobrutish philocalic philocalist philocaly philocathartic philocatholic philocomal Philoctetes philocubist philocynic philocynical philocynicism philocyny philodemic Philodendron philodespot philodestructiveness Philodina Philodinidae philodox philodoxer philodoxical philodramatic philodramatist philofelist philofelon philogarlic philogastric philogeant philogenitive philogenitiveness philograph philographic philogynaecic philogynist philogynous philogyny Philohela philohellenian philokleptic philoleucosis philologaster philologastry philologer philologian philologic philological philologically philologist philologistic philologize philologue philology Philomachus philomath philomathematic philomathematical philomathic philomathical philomathy philomel Philomela philomelanist philomuse philomusical philomystic philonatural philoneism Philonian Philonic Philonism Philonist philonium philonoist philopagan philopater philopatrian philopena philophilosophos philopig philoplutonic philopoet philopogon philopolemic philopolemical philopornist philoprogeneity philoprogenitive philoprogenitiveness philopterid Philopteridae philopublican philoradical philorchidaceous philornithic philorthodox philosoph philosophaster philosophastering philosophastry philosophedom philosopheme philosopher philosopheress philosophership philosophic philosophical philosophically philosophicalness philosophicide philosophicohistorical philosophicojuristic philosophicolegal philosophicoreligious philosophicotheological philosophism philosophist philosophister philosophistic philosophistical philosophization philosophize philosophizer philosophling philosophobia philosophocracy philosophuncule philosophunculist philosophy philotadpole philotechnic philotechnical philotechnist philothaumaturgic philotheism philotheist philotheistic philotheosophical philotherian philotherianism Philotria Philoxenian philoxygenous philozoic philozoist philozoonist philter philterer philterproof philtra philtrum Philydraceae philydraceous Philyra phimosed phimosis phimotic Phineas Phiomia Phiroze phit phiz phizes phizog phlebalgia phlebangioma phlebarteriectasia phlebarteriodialysis phlebectasia phlebectasis phlebectasy phlebectomy phlebectopia phlebectopy phlebemphraxis phlebenteric phlebenterism phlebitic phlebitis Phlebodium phlebogram phlebograph phlebographical phlebography phleboid phleboidal phlebolite phlebolith phlebolithiasis phlebolithic phlebolitic phlebological phlebology phlebometritis phlebopexy phleboplasty phleborrhage phleborrhagia phleborrhaphy phleborrhexis phlebosclerosis phlebosclerotic phlebostasia phlebostasis phlebostenosis phlebostrepsis phlebothrombosis phlebotome phlebotomic phlebotomical phlebotomically phlebotomist phlebotomization phlebotomize Phlebotomus phlebotomus phlebotomy Phlegethon Phlegethontal Phlegethontic phlegm phlegma phlegmagogue phlegmasia phlegmatic phlegmatical phlegmatically phlegmaticalness phlegmaticly phlegmaticness phlegmatism phlegmatist phlegmatous phlegmless phlegmon phlegmonic phlegmonoid phlegmonous phlegmy Phleum phlobaphene phlobatannin phloem phloeophagous phloeoterma phlogisma phlogistian phlogistic phlogistical phlogisticate phlogistication phlogiston phlogistonism phlogistonist phlogogenetic phlogogenic phlogogenous phlogopite phlogosed Phlomis phloretic phloroglucic phloroglucin phlorone phloxin pho phobiac phobic phobism phobist phobophobia Phobos phoby phoca phocacean phocaceous Phocaean Phocaena Phocaenina phocaenine phocal Phocean phocenate phocenic phocenin Phocian phocid Phocidae phociform Phocinae phocine phocodont Phocodontia phocodontic Phocoena phocoid phocomelia phocomelous phocomelus Phoebe phoebe Phoebean Phoenicaceae phoenicaceous Phoenicales phoenicean Phoenician Phoenicianism Phoenicid phoenicite Phoenicize phoenicochroite Phoenicopteridae Phoenicopteriformes phoenicopteroid Phoenicopteroideae phoenicopterous Phoenicopterus Phoeniculidae Phoeniculus phoenicurous phoenigm Phoenix phoenix phoenixity phoenixlike phoh pholad Pholadacea pholadian pholadid Pholadidae Pholadinea pholadoid Pholas pholcid Pholcidae pholcoid Pholcus pholido pholidolite pholidosis Pholidota pholidote Pholiota Phoma Phomopsis phon phonal phonasthenia phonate phonation phonatory phonautogram phonautograph phonautographic phonautographically phone phoneidoscope phoneidoscopic Phonelescope phoneme phonemic phonemics phonendoscope phonesis phonestheme phonetic phonetical phonetically phonetician phoneticism phoneticist phoneticization phoneticize phoneticogrammatical phoneticohieroglyphic phonetics phonetism phonetist phonetization phonetize phoniatrics phoniatry phonic phonics phonikon phonism phono phonocamptic phonocinematograph phonodeik phonodynamograph phonoglyph phonogram phonogramic phonogramically phonogrammatic phonogrammatical phonogrammic phonogrammically phonograph phonographer phonographic phonographical phonographically phonographist phonography phonolite phonolitic phonologer phonologic phonological phonologically phonologist phonology phonometer phonometric phonometry phonomimic phonomotor phonopathy phonophile phonophobia phonophone phonophore phonophoric phonophorous phonophote phonophotography phonophotoscope phonophotoscopic phonoplex phonoscope phonotelemeter phonotype phonotyper phonotypic phonotypical phonotypically phonotypist phonotypy phony phoo Phora Phoradendron phoranthium phoresis phoresy phoria phorid Phoridae phorminx Phormium phorology phorometer phorometric phorometry phorone phoronic phoronid Phoronida Phoronidea Phoronis phoronomia phoronomic phoronomically phoronomics phoronomy Phororhacidae Phororhacos phoroscope phorozooid phos phose phosgene phosgenic phosgenite phosis phosphagen phospham phosphamic phosphamide phosphamidic phosphammonium phosphatase phosphate phosphated phosphatemia phosphatese phosphatic phosphatide phosphation phosphatization phosphatize phosphaturia phosphaturic phosphene phosphenyl phosphide phosphinate phosphine phosphinic phosphite phospho phosphoaminolipide phosphocarnic phosphocreatine phosphoferrite phosphoglycerate phosphoglyceric phosphoglycoprotein phospholipide phospholipin phosphomolybdate phosphomolybdic phosphonate phosphonic phosphonium phosphophyllite phosphoprotein phosphor phosphorate phosphore phosphoreal phosphorent phosphoreous phosphoresce phosphorescence phosphorescent phosphorescently phosphoreted phosphorhidrosis phosphori phosphoric phosphorical phosphoriferous phosphorism phosphorite phosphoritic phosphorize phosphorogen phosphorogenic phosphorograph phosphorographic phosphorography phosphoroscope phosphorous phosphoruria phosphorus phosphoryl phosphorylase phosphorylation phosphosilicate phosphotartaric phosphotungstate phosphotungstic phosphowolframic phosphuranylite phosphuret phosphuria phosphyl phossy phot photaesthesia photaesthesis photaesthetic photal photalgia photechy photelectrograph photeolic photerythrous photesthesis photic photics Photinia Photinian Photinianism photism photistic photo photoactinic photoactivate photoactivation photoactive photoactivity photoaesthetic photoalbum photoalgraphy photoanamorphosis photoaquatint Photobacterium photobathic photobiotic photobromide photocampsis photocatalysis photocatalyst photocatalytic photocatalyzer photocell photocellulose photoceptor photoceramic photoceramics photoceramist photochemic photochemical photochemically photochemigraphy photochemist photochemistry photochloride photochlorination photochromascope photochromatic photochrome photochromic photochromography photochromolithograph photochromoscope photochromotype photochromotypy photochromy photochronograph photochronographic photochronographical photochronographically photochronography photocollograph photocollographic photocollography photocollotype photocombustion photocompose photocomposition photoconductivity photocopier photocopy photocrayon photocurrent photodecomposition photodensitometer photodermatic photodermatism photodisintegration photodissociation photodrama photodramatic photodramatics photodramatist photodramaturgic photodramaturgy photodrome photodromy photodynamic photodynamical photodynamically photodynamics photodysphoria photoelastic photoelasticity photoelectric photoelectrical photoelectrically photoelectricity photoelectron photoelectrotype photoemission photoemissive photoengrave photoengraver photoengraving photoepinastic photoepinastically photoepinasty photoesthesis photoesthetic photoetch photoetcher photoetching photofilm photofinish photofinisher photofinishing photofloodlamp photogalvanograph photogalvanographic photogalvanography photogastroscope photogelatin photogen photogene photogenetic photogenic photogenically photogenous photoglyph photoglyphic photoglyphography photoglyphy photoglyptic photoglyptography photogram photogrammeter photogrammetric photogrammetrical photogrammetry photograph photographable photographee photographer photographeress photographess photographic photographical photographically photographist photographize photographometer photography photogravure photogravurist photogyric photohalide photoheliograph photoheliographic photoheliography photoheliometer photohyponastic photohyponastically photohyponasty photoimpression photoinactivation photoinduction photoinhibition photointaglio photoionization photoisomeric photoisomerization photokinesis photokinetic photolith photolitho photolithograph photolithographer photolithographic photolithography photologic photological photologist photology photoluminescence photoluminescent photolysis photolyte photolytic photoma photomacrograph photomagnetic photomagnetism photomap photomapper photomechanical photomechanically photometeor photometer photometric photometrical photometrically photometrician photometrist photometrograph photometry photomezzotype photomicrogram photomicrograph photomicrographer photomicrographic photomicrography photomicroscope photomicroscopic photomicroscopy photomontage photomorphosis photomural photon photonastic photonasty photonegative photonephograph photonephoscope photoneutron photonosus photooxidation photooxidative photopathic photopathy photoperceptive photoperimeter photoperiod photoperiodic photoperiodism photophane photophile photophilic photophilous photophily photophobe photophobia photophobic photophobous photophone photophonic photophony photophore photophoresis photophosphorescent photophygous photophysical photophysicist photopia photopic photopile photopitometer photoplay photoplayer photoplaywright photopography photopolarigraph photopolymerization photopositive photoprint photoprinter photoprinting photoprocess photoptometer photoradio photoradiogram photoreception photoreceptive photoreceptor photoregression photorelief photoresistance photosalt photosantonic photoscope photoscopic photoscopy photosculptural photosculpture photosensitive photosensitiveness photosensitivity photosensitization photosensitize photosensitizer photosensory photospectroheliograph photospectroscope photospectroscopic photospectroscopical photospectroscopy photosphere photospheric photostability photostable Photostat photostat photostationary photostereograph photosurveying photosyntax photosynthate photosynthesis photosynthesize photosynthetic photosynthetically photosynthometer phototachometer phototachometric phototachometrical phototachometry phototactic phototactically phototactism phototaxis phototaxy phototechnic phototelegraph phototelegraphic phototelegraphically phototelegraphy phototelephone phototelephony phototelescope phototelescopic phototheodolite phototherapeutic phototherapeutics phototherapic phototherapist phototherapy photothermic phototonic phototonus phototopographic phototopographical phototopography phototrichromatic phototrope phototrophic phototrophy phototropic phototropically phototropism phototropy phototube phototype phototypic phototypically phototypist phototypographic phototypography phototypy photovisual photovitrotype photovoltaic photoxylography photozinco photozincograph photozincographic photozincography photozincotype photozincotypy photuria Phractamphibia phragma Phragmidium Phragmites phragmocone phragmoconic Phragmocyttares phragmocyttarous phragmoid phragmosis phrasable phrasal phrasally phrase phraseable phraseless phrasemaker phrasemaking phraseman phrasemonger phrasemongering phrasemongery phraseogram phraseograph phraseographic phraseography phraseological phraseologically phraseologist phraseology phraser phrasify phrasiness phrasing phrasy phrator phratral phratria phratriac phratrial phratry phreatic phreatophyte phrenesia phrenesiac phrenesis phrenetic phrenetically phreneticness phrenic phrenicectomy phrenicocolic phrenicocostal phrenicogastric phrenicoglottic phrenicohepatic phrenicolienal phrenicopericardiac phrenicosplenic phrenicotomy phrenics phrenitic phrenitis phrenocardia phrenocardiac phrenocolic phrenocostal phrenodynia phrenogastric phrenoglottic phrenogram phrenograph phrenography phrenohepatic phrenologer phrenologic phrenological phrenologically phrenologist phrenologize phrenology phrenomagnetism phrenomesmerism phrenopathia phrenopathic phrenopathy phrenopericardiac phrenoplegia phrenoplegy phrenosin phrenosinic phrenospasm phrenosplenic phronesis Phronima Phronimidae phrontisterion phrontisterium phrontistery Phryganea phryganeid Phryganeidae phryganeoid Phrygian Phrygianize phrygium Phryma Phrymaceae phrymaceous phrynid Phrynidae phrynin phrynoid Phrynosoma phthalacene phthalan phthalanilic phthalate phthalazin phthalazine phthalein phthaleinometer phthalic phthalid phthalide phthalimide phthalin phthalocyanine phthalyl phthanite Phthartolatrae phthinoid phthiocol phthiriasis Phthirius phthirophagous phthisic phthisical phthisicky phthisiogenesis phthisiogenetic phthisiogenic phthisiologist phthisiology phthisiophobia phthisiotherapeutic phthisiotherapy phthisipneumonia phthisipneumony phthisis phthongal phthongometer phthor phthoric phu phugoid phulkari phulwa phulwara phut Phyciodes phycite Phycitidae phycitol phycochromaceae phycochromaceous phycochrome Phycochromophyceae phycochromophyceous phycocyanin phycocyanogen Phycodromidae phycoerythrin phycography phycological phycologist phycology Phycomyces phycomycete Phycomycetes phycomycetous phycophaein phycoxanthin phycoxanthine phygogalactic phyla phylacobiosis phylacobiotic phylacteric phylacterical phylacteried phylacterize phylactery phylactic phylactocarp phylactocarpal Phylactolaema Phylactolaemata phylactolaematous Phylactolema Phylactolemata phylarch phylarchic phylarchical phylarchy phyle phylephebic phylesis phyletic phyletically phyletism phylic Phyllachora Phyllactinia phyllade Phyllanthus phyllary Phyllaurea phylliform phyllin phylline Phyllis phyllite phyllitic Phyllitis Phyllium phyllobranchia phyllobranchial phyllobranchiate Phyllocactus phyllocarid Phyllocarida phyllocaridan Phylloceras phyllocerate Phylloceratidae phylloclad phylloclade phyllocladioid phyllocladium phyllocladous phyllocyanic phyllocyanin phyllocyst phyllocystic phyllode phyllodial phyllodination phyllodineous phyllodiniation phyllodinous phyllodium Phyllodoce phyllody phylloerythrin phyllogenetic phyllogenous phylloid phylloidal phylloideous phyllomancy phyllomania phyllome phyllomic phyllomorph phyllomorphic phyllomorphosis phyllomorphy Phyllophaga phyllophagous phyllophore phyllophorous phyllophyllin phyllophyte phyllopod Phyllopoda phyllopodan phyllopode phyllopodiform phyllopodium phyllopodous phylloporphyrin Phyllopteryx phylloptosis phyllopyrrole phyllorhine phyllorhinine phylloscopine Phylloscopus phyllosiphonic phyllosoma Phyllosomata phyllosome Phyllospondyli phyllospondylous Phyllostachys Phyllosticta Phyllostoma Phyllostomatidae Phyllostomatinae phyllostomatoid phyllostomatous phyllostome Phyllostomidae Phyllostominae phyllostomine phyllostomous Phyllostomus phyllotactic phyllotactical phyllotaxis phyllotaxy phyllous phylloxanthin Phylloxera phylloxeran phylloxeric Phylloxeridae phyllozooid phylogenetic phylogenetical phylogenetically phylogenic phylogenist phylogeny phylogerontic phylogerontism phylography phylology phylon phyloneanic phylonepionic phylum phyma phymata phymatic phymatid Phymatidae Phymatodes phymatoid phymatorhysin phymatosis Phymosia Physa physagogue Physalia physalian Physaliidae Physalis physalite Physalospora Physapoda Physaria Physcia Physciaceae physcioid Physcomitrium Physeter Physeteridae Physeterinae physeterine physeteroid Physeteroidea physharmonica physianthropy physiatric physiatrical physiatrics physic physical physicalism physicalist physicalistic physicalistically physicality physically physicalness physician physicianary physiciancy physicianed physicianer physicianess physicianless physicianly physicianship physicism physicist physicked physicker physicking physicky physicoastronomical physicobiological physicochemic physicochemical physicochemically physicochemist physicochemistry physicogeographical physicologic physicological physicomathematical physicomathematics physicomechanical physicomedical physicomental physicomorph physicomorphic physicomorphism physicooptics physicophilosophical physicophilosophy physicophysiological physicopsychical physicosocial physicotheological physicotheologist physicotheology physicotherapeutic physicotherapeutics physicotherapy physics Physidae physiform physiochemical physiochemically physiocracy physiocrat physiocratic physiocratism physiocratist physiogenesis physiogenetic physiogenic physiogeny physiognomic physiognomical physiognomically physiognomics physiognomist physiognomize physiognomonic physiognomonical physiognomy physiogony physiographer physiographic physiographical physiographically physiography physiolater physiolatrous physiolatry physiologer physiologian physiological physiologically physiologicoanatomic physiologist physiologize physiologue physiologus physiology physiopathological physiophilist physiophilosopher physiophilosophical physiophilosophy physiopsychic physiopsychical physiopsychological physiopsychology physiosociological physiosophic physiosophy physiotherapeutic physiotherapeutical physiotherapeutics physiotherapist physiotherapy physiotype physiotypy physique physiqued physitheism physitheistic physitism physiurgic physiurgy physocarpous Physocarpus physocele physoclist Physoclisti physoclistic physoclistous Physoderma physogastric physogastrism physogastry physometra Physonectae physonectous Physophorae physophoran physophore physophorous physopod Physopoda physopodan Physostegia Physostigma physostigmine physostomatous physostome Physostomi physostomous phytalbumose phytase Phytelephas Phyteus phytic phytiferous phytiform phytin phytivorous phytobacteriology phytobezoar phytobiological phytobiology phytochemical phytochemistry phytochlorin phytocidal phytodynamics phytoecological phytoecologist phytoecology Phytoflagellata phytogamy phytogenesis phytogenetic phytogenetical phytogenetically phytogenic phytogenous phytogeny phytogeographer phytogeographic phytogeographical phytogeographically phytogeography phytoglobulin phytograph phytographer phytographic phytographical phytographist phytography phytohormone phytoid phytol Phytolacca Phytolaccaceae phytolaccaceous phytolatrous phytolatry phytolithological phytolithologist phytolithology phytologic phytological phytologically phytologist phytology phytoma Phytomastigina Phytomastigoda phytome phytomer phytometer phytometric phytometry phytomonad Phytomonadida Phytomonadina Phytomonas phytomorphic phytomorphology phytomorphosis phyton phytonic phytonomy phytooecology phytopaleontologic phytopaleontological phytopaleontologist phytopaleontology phytoparasite phytopathogen phytopathogenic phytopathologic phytopathological phytopathologist phytopathology Phytophaga phytophagan phytophagic Phytophagineae phytophagous phytophagy phytopharmacologic phytopharmacology phytophenological phytophenology phytophil phytophilous Phytophthora phytophylogenetic phytophylogenic phytophylogeny phytophysiological phytophysiology phytoplankton phytopsyche phytoptid Phytoptidae phytoptose phytoptosis Phytoptus phytorhodin phytosaur Phytosauria phytosaurian phytoserologic phytoserological phytoserologically phytoserology phytosis phytosociologic phytosociological phytosociologically phytosociologist phytosociology phytosterin phytosterol phytostrote phytosynthesis phytotaxonomy phytotechny phytoteratologic phytoteratological phytoteratologist phytoteratology Phytotoma Phytotomidae phytotomist phytotomy phytotopographical phytotopography phytotoxic phytotoxin phytovitellin Phytozoa phytozoan Phytozoaria phytozoon phytyl pi Pia pia piaba piacaba piacle piacular piacularity piacularly piacularness piaculum piaffe piaffer pial pialyn pian pianette pianic pianino pianism pianissimo pianist pianiste pianistic pianistically Piankashaw piannet piano pianoforte pianofortist pianograph Pianokoto Pianola pianola pianolist pianologue piarhemia piarhemic Piarist Piaroa Piaroan Piaropus Piarroan piassava Piast piaster piastre piation piazine piazza piazzaed piazzaless piazzalike piazzian pibcorn piblokto pibroch pic Pica pica picador picadura Picae pical picamar picara Picard picarel picaresque Picariae picarian Picarii picaro picaroon picary picayune picayunish picayunishly picayunishness piccadill piccadilly piccalilli piccolo piccoloist pice Picea Picene picene Picenian piceoferruginous piceotestaceous piceous piceworth pichi pichiciago pichuric pichurim Pici Picidae piciform Piciformes Picinae picine pick pickaback pickable pickableness pickage pickaninny pickaroon pickaway pickax picked pickedly pickedness pickee pickeer picker pickerel pickerelweed pickering pickeringite pickery picket picketboat picketeer picketer pickfork pickietar pickings pickle picklelike pickleman pickler pickleweed pickleworm picklock pickman pickmaw picknick picknicker pickover pickpocket pickpocketism pickpocketry pickpole pickpurse pickshaft picksman picksmith picksome picksomeness pickthank pickthankly pickthankness pickthatch picktooth pickup pickwick Pickwickian Pickwickianism Pickwickianly pickwork picky picnic picnicker picnickery Picnickian picnickish picnicky pico picofarad picoid picoline picolinic picot picotah picotee picotite picqueter picra picramic Picramnia picrasmin picrate picrated picric Picris picrite picrocarmine Picrodendraceae Picrodendron picroerythrin picrol picrolite picromerite picropodophyllin picrorhiza picrorhizin picrotin picrotoxic picrotoxin picrotoxinin picryl Pict pict pictarnie Pictavi Pictish Pictland pictogram pictograph pictographic pictographically pictography Pictones pictoradiogram pictorial pictorialism pictorialist pictorialization pictorialize pictorially pictorialness pictoric pictorical pictorically picturability picturable picturableness picturably pictural picture picturecraft pictured picturedom picturedrome pictureful pictureless picturelike picturely picturemaker picturemaking picturer picturesque picturesquely picturesqueness picturesquish picturization picturize pictury picucule picuda picudilla picudo picul piculet piculule Picumninae Picumnus Picunche Picuris Picus pidan piddle piddler piddling piddock pidgin pidjajap pie piebald piebaldism piebaldly piebaldness piece pieceable pieceless piecemaker piecemeal piecemealwise piecen piecener piecer piecette piecewise piecework pieceworker piecing piecrust pied piedfort piedly piedmont piedmontal Piedmontese piedmontite piedness Piegan piehouse pieless pielet pielum piemag pieman piemarker pien pienanny piend piepan pieplant piepoudre piepowder pieprint pier pierage Piercarlo Pierce pierce pierceable pierced piercel pierceless piercent piercer piercing piercingly piercingness pierdrop Pierette pierhead Pierian pierid Pieridae Pierides Pieridinae pieridine Pierinae pierine Pieris pierless pierlike Pierre Pierrot pierrot pierrotic pieshop Piet piet pietas Piete Pieter pietic pietism Pietist pietist pietistic pietistical pietistically pietose piety piewife piewipe piewoman piezo piezochemical piezochemistry piezocrystallization piezoelectric piezoelectrically piezoelectricity piezometer piezometric piezometrical piezometry piff piffle piffler pifine pig pigbelly pigdan pigdom pigeon pigeonable pigeonberry pigeoneer pigeoner pigeonfoot pigeongram pigeonhearted pigeonhole pigeonholer pigeonman pigeonry pigeontail pigeonweed pigeonwing pigeonwood pigface pigfish pigflower pigfoot pigful piggery piggin pigging piggish piggishly piggishness piggle piggy pighead pigheaded pigheadedly pigheadedness pigherd pightle pigless piglet pigling piglinghood pigly pigmaker pigmaking pigman pigment pigmental pigmentally pigmentary pigmentation pigmentize pigmentolysis pigmentophage pigmentose Pigmy pignolia pignon pignorate pignoration pignoratitious pignorative pignus pignut pigpen pigritude pigroot pigsconce pigskin pigsney pigstick pigsticker pigsty pigtail pigwash pigweed pigwidgeon pigyard piitis pik pika pike piked pikel pikelet pikeman pikemonger piker pikestaff piketail pikey piki piking pikle piky pilage pilandite pilapil Pilar pilar pilary pilaster pilastered pilastering pilastrade pilastraded pilastric Pilate Pilatian pilau pilaued pilch pilchard pilcher pilcorn pilcrow pile Pilea pileata pileate pileated piled pileiform pileolated pileolus pileorhiza pileorhize pileous piler piles pileus pileweed pilework pileworm pilewort pilfer pilferage pilferer pilfering pilferingly pilferment pilgarlic pilgarlicky pilger pilgrim pilgrimage pilgrimager pilgrimatic pilgrimatical pilgrimdom pilgrimer pilgrimess pilgrimism pilgrimize pilgrimlike pilgrimwise pili pilidium pilifer piliferous piliform piligan piliganine piligerous pilikai pililloo pilimiction pilin piline piling pilipilula pilkins pill pillage pillageable pillagee pillager pillar pillared pillaret pillaring pillarist pillarize pillarlet pillarlike pillarwise pillary pillas pillbox pilled pilledness pillet pilleus pillion pilliver pilliwinks pillmaker pillmaking pillmonger pillorization pillorize pillory pillow pillowcase pillowing pillowless pillowmade pillowwork pillowy pillworm pillwort pilm pilmy Pilobolus pilocarpidine pilocarpine Pilocarpus Pilocereus pilocystic piloerection pilomotor pilon pilonidal pilori pilose pilosebaceous pilosine pilosis pilosism pilosity Pilot pilot pilotage pilotaxitic pilotee pilothouse piloting pilotism pilotless pilotman pilotry pilotship pilotweed pilous Pilpai Pilpay pilpul pilpulist pilpulistic piltock pilula pilular Pilularia pilule pilulist pilulous pilum Pilumnus pilus pilwillet pily Pim Pima Piman pimaric pimelate Pimelea pimelic pimelite pimelitis Pimenta pimento pimenton pimgenet pimienta pimiento pimlico pimola pimp pimperlimpimp pimpernel pimpery Pimpinella pimping pimpish Pimpla pimple pimpleback pimpled pimpleproof Pimplinae pimpliness pimplo pimploe pimplous pimply pimpship pin pina Pinaceae pinaceous pinaces pinachrome pinacle Pinacoceras Pinacoceratidae pinacocytal pinacocyte pinacoid pinacoidal pinacol pinacolate pinacolic pinacolin pinacone pinacoteca pinaculum Pinacyanol pinafore pinakiolite pinakoidal pinakotheke Pinal Pinaleno Pinales pinang pinaster pinatype pinaverdol pinax pinball pinbefore pinbone pinbush pincase pincement pincer pincerlike pincers pincerweed pinch pinchable pinchback pinchbeck pinchbelly pinchcock pinchcommons pinchcrust pinche pinched pinchedly pinchedness pinchem pincher pinchfist pinchfisted pinchgut pinching pinchingly pinchpenny Pincian Pinckneya pincoffin pincpinc Pinctada pincushion pincushiony pind pinda Pindari Pindaric pindarical pindarically Pindarism Pindarist Pindarize Pindarus pinder pindling pindy pine pineal pinealism pinealoma pineapple pined pinedrops pineland pinene piner pinery pinesap pinetum pineweed pinewoods piney pinfall pinfeather pinfeathered pinfeatherer pinfeathery pinfish pinfold Ping ping pingle pingler pingue pinguecula pinguedinous pinguefaction pinguefy pinguescence pinguescent Pinguicula pinguicula Pinguiculaceae pinguiculaceous pinguid pinguidity pinguiferous pinguin pinguinitescent pinguite pinguitude pinguitudinous pinhead pinheaded pinheadedness pinhold pinhole pinhook pinic pinicoline pinicolous piniferous piniform pining piningly pinion pinioned pinionless pinionlike pinipicrin pinitannic pinite pinitol pinivorous pinjane pinjra pink pinkberry pinked pinkeen pinken pinker Pinkerton Pinkertonism pinkeye pinkfish pinkie pinkify pinkily pinkiness pinking pinkish pinkishness pinkly pinkness pinkroot pinksome Pinkster pinkweed pinkwood pinkwort pinky pinless pinlock pinmaker Pinna pinna pinnace pinnacle pinnaclet pinnae pinnaglobin pinnal pinnate pinnated pinnatedly pinnately pinnatifid pinnatifidly pinnatilobate pinnatilobed pinnation pinnatipartite pinnatiped pinnatisect pinnatisected pinnatodentate pinnatopectinate pinnatulate pinned pinnel pinner pinnet Pinnidae pinniferous pinniform pinnigerous Pinnigrada pinnigrade pinninervate pinninerved pinning pinningly pinniped Pinnipedia pinnipedian pinnisect pinnisected pinnitarsal pinnitentaculate pinniwinkis pinnock pinnoite pinnotere pinnothere Pinnotheres pinnotherian Pinnotheridae pinnula pinnular pinnulate pinnulated pinnule pinnulet pinny pino pinochle pinocytosis pinole pinoleum pinolia pinolin pinon pinonic pinpillow pinpoint pinprick pinproof pinrail pinrowed pinscher pinsons pint pinta pintadera pintado pintadoite pintail pintano pinte pintle pinto pintura pinulus Pinus pinweed pinwing pinwork pinworm piny pinyl pinyon pioneer pioneerdom pioneership pionnotes pioscope pioted piotine Piotr piotty pioury pious piously piousness Pioxe pip pipa pipage pipal pipe pipeage pipecoline pipecolinic piped pipefish pipeful pipelayer pipeless pipelike pipeline pipeman pipemouth Piper piper Piperaceae piperaceous Piperales piperate piperazin piperazine piperic piperide piperideine piperidge piperidide piperidine piperine piperitious piperitone piperly piperno piperoid piperonal piperonyl pipery piperylene pipestapple pipestem pipestone pipet pipette pipewalker pipewood pipework pipewort pipi Pipidae Pipil Pipile Pipilo piping pipingly pipingness pipiri pipistrel pipistrelle Pipistrellus pipit pipkin pipkinet pipless pipped pipper pippin pippiner pippinface pippy Pipra Pipridae Piprinae piprine piproid pipsissewa Piptadenia Piptomeris pipunculid Pipunculidae pipy piquable piquance piquancy piquant piquantly piquantness pique piquet piquia piqure pir piracy piragua Piranga piranha pirate piratelike piratery piratess piratical piratically piratism piratize piraty Pirene Piricularia pirijiri piripiri piririgua pirl pirn pirner pirnie pirny Piro pirogue pirol piroplasm Piroplasma piroplasmosis pirouette pirouetter pirouettist pirr pirraura pirrmaw pirssonite Pisaca pisaca pisachee Pisan pisang pisanite Pisauridae pisay piscary Piscataqua Piscataway piscation piscatology piscator piscatorial piscatorialist piscatorially piscatorian piscatorious piscatory Pisces piscian piscicapture piscicapturist piscicolous piscicultural pisciculturally pisciculture pisciculturist Piscid Piscidia piscifauna pisciferous pisciform piscina piscinal piscine piscinity Piscis piscivorous pisco pise pish pishaug pishogue Pishquow pishu Pisidium pisiform Pisistratean Pisistratidae pisk pisky pismire pismirism piso pisolite pisolitic Pisonia piss pissabed pissant pist pistache pistachio Pistacia pistacite pistareen Pistia pistic pistil pistillaceous pistillar pistillary pistillate pistillid pistilliferous pistilliform pistilligerous pistilline pistillode pistillody pistilloid pistilogy pistle Pistoiese pistol pistole pistoleer pistolet pistolgram pistolgraph pistollike pistolography pistology pistolproof pistolwise piston pistonhead pistonlike pistrix Pisum pit pita Pitahauerat Pitahauirata pitahaya pitanga pitangua pitapat pitapatation pitarah pitau Pitawas pitaya pitayita Pitcairnia pitch pitchable pitchblende pitcher pitchered pitcherful pitcherlike pitcherman pitchfork pitchhole pitchi pitchiness pitching pitchlike pitchman pitchometer pitchout pitchpike pitchpole pitchpoll pitchstone pitchwork pitchy piteous piteously piteousness pitfall pith pithecan pithecanthrope pithecanthropic pithecanthropid Pithecanthropidae pithecanthropoid Pithecanthropus Pithecia pithecian Pitheciinae pitheciine pithecism pithecoid Pithecolobium pithecological pithecometric pithecomorphic pithecomorphism pithful pithily pithiness pithless pithlessly Pithoegia Pithoigia pithole pithos pithsome pithwork pithy pitiability pitiable pitiableness pitiably pitiedly pitiedness pitier pitiful pitifully pitifulness pitikins pitiless pitilessly pitilessness pitless pitlike pitmaker pitmaking pitman pitmark pitmirk pitometer pitpan pitpit pitside Pitta pittacal pittance pittancer pitted pitter pitticite Pittidae pittine pitting Pittism Pittite pittite pittoid Pittosporaceae pittosporaceous pittospore Pittosporum Pittsburgher pituital pituitary pituite pituitous pituitousness Pituitrin pituri pitwood pitwork pitwright pity pitying pityingly Pitylus pityocampa pityproof pityriasic pityriasis Pityrogramma pityroid piuri piuricapsular pivalic pivot pivotal pivotally pivoter pix pixie pixilated pixilation pixy pize pizza pizzeria pizzicato pizzle placability placable placableness placably Placaean placard placardeer placarder placate placater placation placative placatively placatory placcate place placeable Placean placebo placeful placeless placelessly placemaker placemaking placeman placemanship placement placemonger placemongering placenta placental Placentalia placentalian placentary placentate placentation placentiferous placentiform placentigerous placentitis placentoid placentoma placer placet placewoman placid placidity placidly placidness placitum plack placket plackless placochromatic placode placoderm placodermal placodermatous Placodermi placodermoid placodont Placodontia Placodus placoganoid placoganoidean Placoganoidei placoid placoidal placoidean Placoidei Placoides Placophora placophoran placoplast placula placuntitis placuntoma Placus pladaroma pladarosis plaga plagal plagate plage Plagianthus plagiaplite plagiarical plagiarism plagiarist plagiaristic plagiaristically plagiarization plagiarize plagiarizer plagiary plagihedral plagiocephalic plagiocephalism plagiocephaly Plagiochila plagioclase plagioclasite plagioclastic plagioclinal plagiodont plagiograph plagioliparite plagionite plagiopatagium plagiophyre Plagiostomata plagiostomatous plagiostome Plagiostomi plagiostomous plagiotropic plagiotropically plagiotropism plagiotropous plagium plagose plagosity plague plagued plagueful plagueless plagueproof plaguer plaguesome plaguesomeness plaguily plaguy plaice plaid plaided plaidie plaiding plaidman plaidy plain plainback plainbacks plainer plainful plainhearted plainish plainly plainness plainscraft plainsfolk plainsman plainsoled plainstones plainswoman plaint plaintail plaintiff plaintiffship plaintile plaintive plaintively plaintiveness plaintless plainward plaister plait plaited plaiter plaiting plaitless plaitwork plak plakat plan planable planaea planar Planaria planarian Planarida planaridan planariform planarioid planarity planate planation planch plancheite plancher planchet planchette planching planchment plancier Planckian plandok plane planeness planer Planera planet planeta planetable planetabler planetal planetaria planetarian planetarily planetarium planetary planeted planetesimal planeticose planeting planetist planetkin planetless planetlike planetogeny planetography planetoid planetoidal planetologic planetologist planetology planetule planform planful planfully planfulness plang plangency plangent plangently plangor plangorous planicaudate planicipital planidorsate planifolious planiform planigraph planilla planimetric planimetrical planimetry planineter planipennate Planipennia planipennine planipetalous planiphyllous planirostral planirostrate planiscope planiscopic planish planisher planispheral planisphere planispheric planispherical planispiral planity plank plankage plankbuilt planker planking plankless planklike planksheer plankter planktologist planktology plankton planktonic planktont plankways plankwise planky planless planlessly planlessness planner planoblast planoblastic Planococcus planoconical planocylindric planoferrite planogamete planograph planographic planographist planography planohorizontal planolindrical planometer planometry planomiller planoorbicular Planorbidae planorbiform planorbine Planorbis planorboid planorotund Planosarcina planosol planosome planospiral planospore planosubulate plant planta plantable plantad Plantae plantage Plantaginaceae plantaginaceous Plantaginales plantagineous Plantago plantain plantal plantar plantaris plantarium plantation plantationlike plantdom planter planterdom planterly plantership Plantigrada plantigrade plantigrady planting plantivorous plantless plantlet plantlike plantling plantocracy plantsman plantula plantular plantule planula planulan planular planulate planuliform planuloid Planuloidea planuria planury planxty plap plappert plaque plaquette plash plasher plashet plashingly plashment plashy plasm plasma plasmagene plasmapheresis plasmase plasmatic plasmatical plasmation plasmatoparous plasmatorrhexis plasmic plasmocyte plasmocytoma plasmode plasmodesm plasmodesma plasmodesmal plasmodesmic plasmodesmus plasmodia plasmodial plasmodiate plasmodic plasmodiocarp plasmodiocarpous Plasmodiophora Plasmodiophoraceae Plasmodiophorales plasmodium plasmogen plasmolysis plasmolytic plasmolytically plasmolyzability plasmolyzable plasmolyze plasmoma Plasmon Plasmopara plasmophagous plasmophagy plasmoptysis plasmosoma plasmosome plasmotomy plasome plass plasson plastein plaster plasterbill plasterboard plasterer plasteriness plastering plasterlike plasterwise plasterwork plastery Plastic plastic plastically plasticimeter Plasticine plasticine plasticism plasticity plasticization plasticize plasticizer plasticly plastics plastid plastidium plastidome Plastidozoa plastidular plastidule plastify plastin plastinoid plastisol plastochondria plastochron plastochrone plastodynamia plastodynamic plastogamic plastogamy plastogene plastomere plastometer plastosome plastotype plastral plastron plastrum plat Plataean Platalea Plataleidae plataleiform Plataleinae plataleine platan Platanaceae platanaceous platane platanist Platanista Platanistidae platano Platanus platband platch plate platea plateasm plateau plateaux plated plateful plateholder plateiasmus platelayer plateless platelet platelike platemaker platemaking plateman platen plater platerer plateresque platery plateway platework plateworker platform platformally platformed platformer platformish platformism platformist platformistic platformless platformy platic platicly platilla platina platinamine platinammine platinate Platine plating platinic platinichloric platinichloride platiniferous platiniridium platinite platinization platinize platinochloric platinochloride platinocyanic platinocyanide platinoid platinotype platinous platinum platinumsmith platitude platitudinal platitudinarian platitudinarianism platitudinism platitudinist platitudinization platitudinize platitudinizer platitudinous platitudinously platitudinousness Platoda platode Platodes platoid Platonesque platonesque Platonian Platonic Platonical Platonically Platonicalness Platonician Platonicism Platonism Platonist Platonistic Platonization Platonize Platonizer platoon platopic platosamine platosammine Platt Plattdeutsch platted platten platter platterface platterful platting plattnerite platty platurous platy platybasic platybrachycephalic platybrachycephalous platybregmatic platycarpous Platycarpus Platycarya platycelian platycelous platycephalic Platycephalidae platycephalism platycephaloid platycephalous Platycephalus platycephaly Platycercinae platycercine Platycercus Platycerium platycheiria platycnemia platycnemic Platycodon platycoria platycrania platycranial Platyctenea platycyrtean platydactyl platydactyle platydactylous platydolichocephalic platydolichocephalous platyfish platyglossal platyglossate platyglossia Platyhelmia platyhelminth Platyhelminthes platyhelminthic platyhieric platykurtic platylobate platymeria platymeric platymery platymesaticephalic platymesocephalic platymeter platymyoid platynite platynotal platyodont platyope platyopia platyopic platypellic platypetalous platyphyllous platypod Platypoda platypodia platypodous Platyptera platypus platypygous Platyrhina Platyrhini platyrhynchous platyrrhin Platyrrhina platyrrhine Platyrrhini platyrrhinian platyrrhinic platyrrhinism platyrrhiny platysma platysmamyoides platysomid Platysomidae Platysomus platystaphyline Platystemon platystencephalia platystencephalic platystencephalism platystencephaly platysternal Platysternidae Platystomidae platystomous platytrope platytropy plaud plaudation plaudit plaudite plauditor plauditory plauenite plausibility plausible plausibleness plausibly plausive plaustral Plautine Plautus play playa playability playable playback playbill playbook playbox playboy playboyism playbroker playcraft playcraftsman playday playdown player playerdom playeress playfellow playfellowship playfield playfolk playful playfully playfulness playgoer playgoing playground playhouse playingly playless playlet playlike playmaker playmaking playman playmare playmate playmonger playmongering playock playpen playreader playroom playscript playsome playsomely playsomeness playstead plaything playtime playward playwoman playwork playwright playwrightess playwrighting playwrightry playwriter playwriting plaza plazolite plea pleach pleached pleacher plead pleadable pleadableness pleader pleading pleadingly pleadingness pleaproof pleasable pleasableness pleasance pleasant pleasantable pleasantish pleasantly pleasantness pleasantry pleasantsome please pleasedly pleasedness pleaseman pleaser pleaship pleasing pleasingly pleasingness pleasurability pleasurable pleasurableness pleasurably pleasure pleasureful pleasurehood pleasureless pleasurelessly pleasureman pleasurement pleasuremonger pleasureproof pleasurer pleasuring pleasurist pleasurous pleat pleater pleatless pleb plebe plebeian plebeiance plebeianize plebeianly plebeianness plebeity plebianism plebicolar plebicolist plebificate plebification plebify plebiscitarian plebiscitarism plebiscitary plebiscite plebiscitic plebiscitum plebs pleck Plecoptera plecopteran plecopterid plecopterous Plecotinae plecotine Plecotus plectognath Plectognathi plectognathic plectognathous plectopter plectopteran plectopterous plectospondyl Plectospondyli plectospondylous plectre plectridial plectridium plectron plectrum pled pledge pledgeable pledgee pledgeless pledgeor pledger pledgeshop pledget pledgor Plegadis plegaphonia plegometer Pleiades pleiobar pleiochromia pleiochromic pleiomastia pleiomazia pleiomerous pleiomery pleion Pleione pleionian pleiophyllous pleiophylly pleiotaxis pleiotropic pleiotropically pleiotropism Pleistocene Pleistocenic pleistoseist plemochoe plemyrameter plenarily plenariness plenarium plenarty plenary plenicorn pleniloquence plenilunal plenilunar plenilunary plenilune plenipo plenipotence plenipotent plenipotential plenipotentiality plenipotentiarily plenipotentiarize Plenipotentiary plenipotentiary plenipotentiaryship plenish plenishing plenishment plenism plenist plenitide plenitude plenitudinous plenshing plenteous plenteously plenteousness plentiful plentifully plentifulness plentify plenty plenum pleny pleochroic pleochroism pleochroitic pleochromatic pleochromatism pleochroous pleocrystalline pleodont pleomastia pleomastic pleomazia pleometrosis pleometrotic pleomorph pleomorphic pleomorphism pleomorphist pleomorphous pleomorphy pleon pleonal pleonasm pleonast pleonaste pleonastic pleonastical pleonastically pleonectic pleonexia pleonic pleophyletic pleopod pleopodite Pleospora Pleosporaceae plerergate plerocercoid pleroma pleromatic plerome pleromorph plerophoric plerophory plerosis plerotic Plesianthropus plesiobiosis plesiobiotic plesiomorphic plesiomorphism plesiomorphous plesiosaur Plesiosauri Plesiosauria plesiosaurian plesiosauroid Plesiosaurus plesiotype plessigraph plessimeter plessimetric plessimetry plessor Plethodon plethodontid Plethodontidae plethora plethoretic plethoretical plethoric plethorical plethorically plethorous plethory plethysmograph plethysmographic plethysmographically plethysmography pleura Pleuracanthea Pleuracanthidae Pleuracanthini pleuracanthoid Pleuracanthus pleural pleuralgia pleuralgic pleurapophysial pleurapophysis pleurectomy pleurenchyma pleurenchymatous pleuric pleuriseptate pleurisy pleurite pleuritic pleuritical pleuritically pleuritis Pleurobrachia Pleurobrachiidae pleurobranch pleurobranchia pleurobranchial pleurobranchiate pleurobronchitis Pleurocapsa Pleurocapsaceae pleurocapsaceous pleurocarp Pleurocarpi pleurocarpous pleurocele pleurocentesis pleurocentral pleurocentrum Pleurocera pleurocerebral Pleuroceridae pleuroceroid Pleurococcaceae pleurococcaceous Pleurococcus Pleurodelidae Pleurodira pleurodiran pleurodire pleurodirous pleurodiscous pleurodont pleurodynia pleurodynic pleurogenic pleurogenous pleurohepatitis pleuroid pleurolith pleurolysis pleuron Pleuronectes pleuronectid Pleuronectidae pleuronectoid Pleuronema pleuropedal pleuropericardial pleuropericarditis pleuroperitonaeal pleuroperitoneal pleuroperitoneum pleuropneumonia pleuropneumonic pleuropodium pleuropterygian Pleuropterygii pleuropulmonary pleurorrhea Pleurosaurus Pleurosigma pleurospasm pleurosteal Pleurosteon pleurostict Pleurosticti Pleurostigma pleurothotonic pleurothotonus Pleurotoma Pleurotomaria Pleurotomariidae pleurotomarioid Pleurotomidae pleurotomine pleurotomoid pleurotomy pleurotonic pleurotonus Pleurotremata pleurotribal pleurotribe pleurotropous Pleurotus pleurotyphoid pleurovisceral pleurum pleuston pleustonic plew plex plexal plexicose plexiform pleximeter pleximetric pleximetry plexodont plexometer plexor plexure plexus pliability pliable pliableness pliably pliancy pliant pliantly pliantness plica plicable plical plicate plicated plicately plicateness plicater plicatile plication plicative plicatocontorted plicatocristate plicatolacunose plicatolobate plicatopapillose plicator plicatoundulate plicatulate plicature pliciferous pliciform plied plier plies pliers plight plighted plighter plim plimsoll Plinian plinth plinther plinthiform plinthless plinthlike Pliny Plinyism Pliocene Pliohippus Pliopithecus pliosaur pliosaurian Pliosauridae Pliosaurus pliothermic Pliotron pliskie plisky ploat ploce Ploceidae ploceiform Ploceinae Ploceus plock plod plodder plodderly plodding ploddingly ploddingness plodge Ploima ploimate plomb plook plop ploration ploratory plosion plosive plot plote plotful Plotinian Plotinic Plotinical Plotinism Plotinist Plotinize plotless plotlessness plotproof plottage plotted plotter plottery plotting plottingly plotty plough ploughmanship ploughtail plouk plouked plouky plounce plousiocracy plout Plouteneion plouter plover ploverlike plovery plow plowable plowbote plowboy plower plowfish plowfoot plowgang plowgate plowgraith plowhead plowing plowjogger plowland plowlight plowline plowmaker plowman plowmanship plowmell plowpoint Plowrightia plowshare plowshoe plowstaff plowstilt plowtail plowwise plowwoman plowwright ploy ployment Pluchea pluck pluckage plucked pluckedness plucker Pluckerian pluckily pluckiness pluckless plucklessness plucky plud pluff pluffer pluffy plug plugboard plugdrawer pluggable plugged plugger plugging pluggingly pluggy plughole plugless pluglike plugman plugtray plugtree plum pluma plumaceous plumach plumade plumage plumaged plumagery plumasite plumate Plumatella plumatellid Plumatellidae plumatelloid plumb plumbable plumbage Plumbaginaceae plumbaginaceous plumbagine plumbaginous plumbago plumbate plumbean plumbeous plumber plumbership plumbery plumbet plumbic plumbiferous plumbing plumbism plumbisolvent plumbite plumbless plumbness plumbog plumbojarosite plumboniobate plumbosolvency plumbosolvent plumbous plumbum plumcot plumdamas plumdamis plume plumed plumeless plumelet plumelike plumemaker plumemaking plumeopicean plumeous plumer plumery plumet plumette plumicorn plumier Plumiera plumieride plumification plumiform plumiformly plumify plumigerous pluminess plumiped plumipede plumist plumless plumlet plumlike plummer plummet plummeted plummetless plummy plumose plumosely plumoseness plumosity plumous plump plumpen plumper plumping plumpish plumply plumpness plumps plumpy plumula plumulaceous plumular Plumularia plumularian Plumulariidae plumulate plumule plumuliform plumulose plumy plunder plunderable plunderage plunderbund plunderer plunderess plundering plunderingly plunderless plunderous plunderproof plunge plunger plunging plungingly plunk plunther plup plupatriotic pluperfect pluperfectly pluperfectness plural pluralism pluralist pluralistic pluralistically plurality pluralization pluralize pluralizer plurally plurative plurennial pluriaxial pluricarinate pluricarpellary pluricellular pluricentral pluricipital pluricuspid pluricuspidate pluridentate pluries plurifacial plurifetation plurification pluriflagellate pluriflorous plurifoliate plurifoliolate plurify pluriglandular pluriguttulate plurilateral plurilingual plurilingualism plurilingualist plurilocular plurimammate plurinominal plurinucleate pluripara pluriparity pluriparous pluripartite pluripetalous pluripotence pluripotent pluripresence pluriseptate pluriserial pluriseriate pluriseriated plurisetose plurispiral plurisporous plurisyllabic plurisyllable plurivalent plurivalve plurivorous plurivory plus plush plushed plushette plushily plushiness plushlike plushy Plusia Plusiinae plusquamperfect plussage Plutarchian Plutarchic Plutarchical Plutarchically plutarchy pluteal plutean pluteiform Plutella pluteus Pluto plutocracy plutocrat plutocratic plutocratical plutocratically plutolatry plutological plutologist plutology plutomania Plutonian plutonian plutonic Plutonion plutonism plutonist plutonite Plutonium plutonium plutonometamorphism plutonomic plutonomist plutonomy pluvial pluvialiform pluvialine Pluvialis pluvian pluvine pluviograph pluviographic pluviographical pluviography pluviometer pluviometric pluviometrical pluviometrically pluviometry pluvioscope pluviose pluviosity pluvious ply plyer plying plyingly Plymouth Plymouthism Plymouthist Plymouthite Plynlymmon plywood pneodynamics pneograph pneomanometer pneometer pneometry pneophore pneoscope pneuma pneumarthrosis pneumathaemia pneumatic pneumatical pneumatically pneumaticity pneumatics pneumatism pneumatist pneumatize pneumatized pneumatocardia pneumatocele pneumatochemical pneumatochemistry pneumatocyst pneumatocystic pneumatode pneumatogenic pneumatogenous pneumatogram pneumatograph pneumatographer pneumatographic pneumatography pneumatolitic pneumatologic pneumatological pneumatologist pneumatology pneumatolysis pneumatolytic Pneumatomachian Pneumatomachist Pneumatomachy pneumatometer pneumatometry pneumatomorphic pneumatonomy pneumatophany pneumatophilosophy pneumatophobia pneumatophonic pneumatophony pneumatophore pneumatophorous pneumatorrhachis pneumatoscope pneumatosic pneumatosis pneumatotactic pneumatotherapeutics pneumatotherapy Pneumatria pneumaturia pneumectomy pneumobacillus Pneumobranchia Pneumobranchiata pneumocele pneumocentesis pneumochirurgia pneumococcal pneumococcemia pneumococcic pneumococcous pneumococcus pneumoconiosis pneumoderma pneumodynamic pneumodynamics pneumoencephalitis pneumoenteritis pneumogastric pneumogram pneumograph pneumographic pneumography pneumohemothorax pneumohydropericardium pneumohydrothorax pneumolith pneumolithiasis pneumological pneumology pneumolysis pneumomalacia pneumomassage Pneumometer pneumomycosis pneumonalgia pneumonectasia pneumonectomy pneumonedema pneumonia pneumonic pneumonitic pneumonitis pneumonocace pneumonocarcinoma pneumonocele pneumonocentesis pneumonocirrhosis pneumonoconiosis pneumonodynia pneumonoenteritis pneumonoerysipelas pneumonographic pneumonography pneumonokoniosis pneumonolith pneumonolithiasis pneumonolysis pneumonomelanosis pneumonometer pneumonomycosis pneumonoparesis pneumonopathy pneumonopexy pneumonophorous pneumonophthisis pneumonopleuritis pneumonorrhagia pneumonorrhaphy pneumonosis pneumonotherapy pneumonotomy pneumony pneumopericardium pneumoperitoneum pneumoperitonitis pneumopexy pneumopleuritis pneumopyothorax pneumorrachis pneumorrhachis pneumorrhagia pneumotactic pneumotherapeutics pneumotherapy pneumothorax pneumotomy pneumotoxin pneumotropic pneumotropism pneumotyphoid pneumotyphus pneumoventriculography Po po Poa Poaceae poaceous poach poachable poacher poachiness poachy Poales poalike pob pobby Poblacht poblacion pobs pochade pochard pochay poche pochette pocilliform pock pocket pocketable pocketableness pocketbook pocketed pocketer pocketful pocketing pocketknife pocketless pocketlike pockety pockhouse pockily pockiness pockmanteau pockmantie pockmark pockweed pockwood pocky poco pococurante pococuranteism pococurantic pococurantish pococurantism pococurantist pocosin poculary poculation poculent poculiform pod podagra podagral podagric podagrical podagrous podal podalgia podalic Podaliriidae Podalirius Podarge Podargidae Podarginae podargine podargue Podargus podarthral podarthritis podarthrum podatus Podaxonia podaxonial podded podder poddidge poddish poddle poddy podelcoma podeon podesta podesterate podetiiform podetium podex podge podger podgily podginess podgy podial podiatrist podiatry podical Podiceps podices Podicipedidae podilegous podite poditic poditti podium podler podley podlike podobranch podobranchia podobranchial podobranchiate podocarp Podocarpaceae Podocarpineae podocarpous Podocarpus podocephalous pododerm pododynia podogyn podogyne podogynium Podolian podolite podology podomancy podomere podometer podometry Podophrya Podophryidae Podophthalma Podophthalmata podophthalmate podophthalmatous Podophthalmia podophthalmian podophthalmic podophthalmite podophthalmitic podophthalmous Podophyllaceae podophyllic podophyllin podophyllotoxin podophyllous Podophyllum podophyllum podoscaph podoscapher podoscopy Podosomata podosomatous podosperm Podosphaera Podostemaceae podostemaceous podostemad Podostemon Podostemonaceae podostemonaceous Podostomata podostomatous podotheca podothecal Podozamites Podsnap Podsnappery podsol podsolic podsolization podsolize Podunk Podura poduran podurid Poduridae podware podzol podzolic podzolization podzolize poe Poecile Poeciliidae poecilitic Poecilocyttares poecilocyttarous poecilogonous poecilogony poecilomere poecilonym poecilonymic poecilonymy poecilopod Poecilopoda poecilopodous poem poematic poemet poemlet Poephaga poephagous Poephagus poesie poesiless poesis poesy poet poetaster poetastering poetasterism poetastery poetastress poetastric poetastrical poetastry poetcraft poetdom poetesque poetess poethood poetic poetical poeticality poetically poeticalness poeticism poeticize poeticness poetics poeticule poetito poetization poetize poetizer poetless poetlike poetling poetly poetomachia poetress poetry poetryless poetship poetwise pogamoggan pogge poggy Pogo Pogonatum Pogonia pogoniasis pogoniate pogonion pogonip pogoniris pogonite pogonological pogonologist pogonology pogonotomy pogonotrophy pogrom pogromist pogromize pogy poh poha pohickory pohna pohutukawa poi Poiana Poictesme poietic poignance poignancy poignant poignantly poignet poikilitic poikiloblast poikiloblastic poikilocyte poikilocythemia poikilocytosis poikilotherm poikilothermic poikilothermism poil poilu poimenic poimenics Poinciana poind poindable poinder poinding Poinsettia point pointable pointage pointed pointedly pointedness pointel pointer pointful pointfully pointfulness pointillism pointillist pointing pointingly pointless pointlessly pointlessness pointlet pointleted pointmaker pointman pointment pointrel pointsman pointswoman pointways pointwise pointy poisable poise poised poiser poison poisonable poisonful poisonfully poisoning poisonless poisonlessness poisonmaker poisonous poisonously poisonousness poisonproof poisonweed poisonwood poitrail poitrel poivrade pokable Pokan Pokanoket poke pokeberry poked pokeful pokeloken pokeout poker pokerish pokerishly pokerishness pokeroot pokeweed pokey pokily pokiness poking Pokom Pokomam Pokomo pokomoo Pokonchi pokunt poky pol Polab Polabian Polabish polacca Polack polack polacre Polander Polanisia polar polaric Polarid polarigraphic polarimeter polarimetric polarimetry Polaris polariscope polariscopic polariscopically polariscopist polariscopy polaristic polaristrobometer polarity polarizability polarizable polarization polarize polarizer polarly polarogram polarograph polarographic polarographically polarography Polaroid polarward polaxis poldavis poldavy polder polderboy polderman Pole pole polearm poleax poleaxe poleaxer poleburn polecat polehead poleless poleman polemarch polemic polemical polemically polemician polemicist polemics polemist polemize Polemoniaceae polemoniaceous Polemoniales Polemonium polemoscope polenta poler polesetter Polesian polesman polestar poleward polewards poley poliad poliadic Polian polianite Polianthes police policed policedom policeless policeman policemanish policemanism policemanlike policemanship policewoman Polichinelle policial policize policizer policlinic policy policyholder poliencephalitis poliencephalomyelitis poligar poligarship poligraphical Polinices polio polioencephalitis polioencephalomyelitis poliomyelitis poliomyelopathy polioneuromere poliorcetic poliorcetics poliosis polis Polish polish polishable polished polishedly polishedness polisher polishment polisman polissoir Polistes politarch politarchic Politbureau Politburo polite politeful politely politeness politesse politic political politicalism politicalize politically politicaster politician politicious politicist politicize politicizer politicly politico politicomania politicophobia politics politied Politique politist politize polity politzerization politzerize polk polka Poll poll pollable pollack polladz pollage pollakiuria pollam pollan pollarchy pollard pollbook polled pollen pollened polleniferous pollenigerous pollenite pollenivorous pollenless pollenlike pollenproof pollent poller polleten pollex pollical pollicar pollicate pollicitation pollinar pollinarium pollinate pollination pollinator pollinctor pollincture polling pollinia pollinic pollinical polliniferous pollinigerous pollinium pollinivorous pollinization pollinize pollinizer pollinodial pollinodium pollinoid pollinose pollinosis polliwig polliwog pollock polloi pollster pollucite pollutant pollute polluted pollutedly pollutedness polluter polluting pollutingly pollution Pollux pollux Polly Pollyanna Pollyannish pollywog polo poloconic polocyte poloist polonaise Polonese Polonia Polonial Polonian Polonism polonium Polonius Polonization Polonize polony polos polska polt poltergeist poltfoot poltfooted poltina poltinnik poltophagic poltophagist poltophagy poltroon poltroonery poltroonish poltroonishly poltroonism poluphloisboic poluphloisboiotatotic poluphloisboiotic polverine poly polyacanthus polyacid polyacoustic polyacoustics polyact polyactinal polyactine Polyactinia polyad polyadelph Polyadelphia polyadelphian polyadelphous polyadenia polyadenitis polyadenoma polyadenous polyadic polyaffectioned polyalcohol polyamide polyamylose Polyandria polyandria polyandrian polyandrianism polyandric polyandrious polyandrism polyandrist polyandrium polyandrous polyandry Polyangium polyangular polyantha polyanthous polyanthus polyanthy polyarch polyarchal polyarchical polyarchist polyarchy polyarteritis polyarthric polyarthritic polyarthritis polyarthrous polyarticular polyatomic polyatomicity polyautographic polyautography polyaxial polyaxon polyaxone polyaxonic polybasic polybasicity polybasite polyblast Polyborinae polyborine Polyborus polybranch Polybranchia polybranchian Polybranchiata polybranchiate polybromid polybromide polybunous polybuny polybuttoned polycarboxylic Polycarp polycarpellary polycarpic Polycarpon polycarpous polycarpy polycellular polycentral polycentric polycephalic polycephalous polycephaly Polychaeta polychaete polychaetous polychasial polychasium polychloride polychoerany polychord polychotomous polychotomy polychrest polychrestic polychrestical polychresty polychroic polychroism polychromasia polychromate polychromatic polychromatism polychromatist polychromatize polychromatophil polychromatophile polychromatophilia polychromatophilic polychrome polychromia polychromic polychromism polychromize polychromous polychromy polychronious polyciliate polycitral polyclad Polycladida polycladine polycladose polycladous polyclady Polycletan polyclinic polyclona polycoccous Polycodium polyconic polycormic polycotyl polycotyledon polycotyledonary polycotyledonous polycotyledony polycotylous polycotyly polycracy polycrase polycratic polycrotic polycrotism polycrystalline polyctenid Polyctenidae polycttarian polycyanide polycyclic polycycly polycyesis polycystic polycythemia polycythemic Polycyttaria polydactyl polydactyle polydactylism polydactylous Polydactylus polydactyly polydaemoniac polydaemonism polydaemonist polydaemonistic polydemic polydenominational polydental polydermous polydermy polydigital polydimensional polydipsia polydisperse polydomous polydymite polydynamic polyeidic polyeidism polyembryonate polyembryonic polyembryony polyemia polyemic polyenzymatic polyergic Polyergus polyester polyesthesia polyesthetic polyethnic polyethylene polyfenestral polyflorous polyfoil polyfold Polygala Polygalaceae polygalaceous polygalic polygam Polygamia polygamian polygamic polygamical polygamically polygamist polygamistic polygamize polygamodioecious polygamous polygamously polygamy polyganglionic polygastric polygene polygenesic polygenesis polygenesist polygenetic polygenetically polygenic polygenism polygenist polygenistic polygenous polygeny polyglandular polyglobulia polyglobulism polyglossary polyglot polyglotry polyglottal polyglottally polyglotted polyglotter polyglottery polyglottic polyglottically polyglottism polyglottist polyglottonic polyglottous polyglotwise polyglycerol polygon Polygonaceae polygonaceous polygonal Polygonales polygonally Polygonatum Polygonella polygoneutic polygoneutism Polygonia polygonic polygonically polygonoid polygonous Polygonum polygony Polygordius polygram polygrammatic polygraph polygrapher polygraphic polygraphy polygroove polygrooved polygyn polygynaiky Polygynia polygynian polygynic polygynious polygynist polygynoecial polygynous polygyny polygyral polygyria polyhaemia polyhaemic polyhalide polyhalite polyhalogen polyharmonic polyharmony polyhedral polyhedric polyhedrical polyhedroid polyhedron polyhedrosis polyhedrous polyhemia polyhidrosis polyhistor polyhistorian polyhistoric polyhistory polyhybrid polyhydric polyhydroxy polyideic polyideism polyidrosis polyiodide polykaryocyte polylaminated polylemma polylepidous polylinguist polylith polylithic polylobular polylogy polyloquent polymagnet polymastia polymastic Polymastiga polymastigate Polymastigida Polymastigina polymastigous polymastism Polymastodon polymastodont polymasty polymath polymathic polymathist polymathy polymazia polymelia polymelian polymely polymer polymere polymeria polymeric polymeride polymerism polymerization polymerize polymerous polymetallism polymetameric polymeter polymethylene polymetochia polymetochic polymicrian polymicrobial polymicrobic polymicroscope polymignite Polymixia polymixiid Polymixiidae Polymnestor Polymnia polymnite polymolecular polymolybdate polymorph Polymorpha polymorphean polymorphic polymorphism polymorphistic polymorphonuclear polymorphonucleate polymorphosis polymorphous polymorphy Polymyaria polymyarian Polymyarii Polymyodi polymyodian polymyodous polymyoid polymyositis polymythic polymythy polynaphthene polynemid Polynemidae polynemoid Polynemus Polynesian polynesic polyneural polyneuric polyneuritic polyneuritis polyneuropathy polynodal Polynoe polynoid Polynoidae polynome polynomial polynomialism polynomialist polynomic polynucleal polynuclear polynucleate polynucleated polynucleolar polynucleosis Polyodon polyodont polyodontal polyodontia Polyodontidae polyodontoid polyoecious polyoeciously polyoeciousness polyoecism polyoecy polyoicous polyommatous polyonomous polyonomy polyonychia polyonym polyonymal polyonymic polyonymist polyonymous polyonymy polyophthalmic polyopia polyopic polyopsia polyopsy polyorama polyorchidism polyorchism polyorganic polyose polyoxide polyoxymethylene polyp polypage polypaged polypapilloma polyparasitic polyparasitism polyparesis polyparia polyparian polyparium polyparous polypary polypean polyped Polypedates polypeptide polypetal Polypetalae polypetalous Polyphaga polyphage polyphagia polyphagian polyphagic polyphagist polyphagous polyphagy polyphalangism polypharmacal polypharmacist polypharmacon polypharmacy polypharmic polyphasal polyphase polyphaser Polypheme polyphemian polyphemic polyphemous polyphenol polyphloesboean polyphloisboioism polyphloisboism polyphobia polyphobic polyphone polyphoned polyphonia polyphonic polyphonical polyphonism polyphonist polyphonium polyphonous polyphony polyphore polyphosphoric polyphotal polyphote polyphylesis polyphyletic polyphyletically polyphylety polyphylline polyphyllous polyphylly polyphylogeny polyphyly polyphyodont Polypi polypi polypian polypide polypidom Polypifera polypiferous polypigerous polypinnate polypite Polyplacophora polyplacophoran polyplacophore polyplacophorous polyplastic Polyplectron polyplegia polyplegic polyploid polyploidic polyploidy polypnoea polypnoeic polypod Polypoda polypodia Polypodiaceae polypodiaceous Polypodium polypodous polypody polypoid polypoidal Polypomorpha polypomorphic Polyporaceae polyporaceous polypore polyporite polyporoid polyporous Polyporus polypose polyposis polypotome polypous polypragmacy polypragmatic polypragmatical polypragmatically polypragmatism polypragmatist polypragmaty polypragmist polypragmon polypragmonic polypragmonist polyprene polyprism polyprismatic polyprothetic polyprotodont Polyprotodontia polypseudonymous polypsychic polypsychical polypsychism polypterid Polypteridae polypteroid Polypterus polyptote polyptoton polyptych polypus polyrhizal polyrhizous polyrhythmic polyrhythmical polysaccharide polysaccharose Polysaccum polysalicylide polysarcia polysarcous polyschematic polyschematist polyscope polyscopic polysemant polysemantic polysemeia polysemia polysemous polysemy polysensuous polysensuousness polysepalous polyseptate polyserositis polysided polysidedness polysilicate polysilicic Polysiphonia polysiphonic polysiphonous polysomatic polysomatous polysomaty polysomia polysomic polysomitic polysomous polysomy polyspast polyspaston polyspermal polyspermatous polyspermia polyspermic polyspermous polyspermy polyspondylic polyspondylous polyspondyly Polyspora polysporangium polyspore polyspored polysporic polysporous polystachyous polystaurion polystele polystelic polystemonous polystichoid polystichous Polystichum Polystictus Polystomata Polystomatidae polystomatous polystome Polystomea Polystomella Polystomidae polystomium polystylar polystyle polystylous polystyrene polysulphide polysulphuration polysulphurization polysyllabic polysyllabical polysyllabically polysyllabicism polysyllabicity polysyllabism polysyllable polysyllogism polysyllogistic polysymmetrical polysymmetrically polysymmetry polysyndetic polysyndetically polysyndeton polysynthesis polysynthesism polysynthetic polysynthetical polysynthetically polysyntheticism polysynthetism polysynthetize polytechnic polytechnical polytechnics polytechnist polyterpene Polythalamia polythalamian polythalamic polythalamous polythecial polytheism polytheist polytheistic polytheistical polytheistically polytheize polythelia polythelism polythely polythene polythionic polytitanic polytocous polytokous polytoky polytomous polytomy polytonal polytonalism polytonality polytone polytonic polytony polytope polytopic polytopical Polytrichaceae polytrichaceous polytrichia polytrichous Polytrichum polytrochal polytrochous polytrope polytrophic polytropic polytungstate polytungstic polytype polytypic polytypical polytypy polyuresis polyuria polyuric polyvalence polyvalent polyvinyl polyvinylidene polyvirulent polyvoltine Polyzoa polyzoal polyzoan polyzoarial polyzoarium polyzoary polyzoic polyzoism polyzonal polyzooid polyzoon polzenite pom pomace Pomaceae pomacentrid Pomacentridae pomacentroid Pomacentrus pomaceous pomade Pomaderris Pomak pomander pomane pomarine pomarium pomate pomato pomatomid Pomatomidae Pomatomus pomatorhine pomatum pombe pombo pome pomegranate pomelo Pomeranian pomeridian pomerium pomewater pomey pomfret pomiculture pomiculturist pomiferous pomiform pomivorous Pommard pomme pommee pommel pommeled pommeler pommet pommey pommy Pomo pomological pomologically pomologist pomology Pomona pomonal pomonic pomp pompa Pompadour pompadour pompal pompano Pompeian Pompeii pompelmous Pompey pompey pompholix pompholygous pompholyx pomphus pompier pompilid Pompilidae pompiloid Pompilus pompion pompist pompless pompoleon pompon pomposity pompous pompously pompousness pompster Pomptine pomster pon Ponca ponce ponceau poncelet poncho ponchoed Poncirus pond pondage pondbush ponder ponderability ponderable ponderableness ponderal ponderance ponderancy ponderant ponderary ponderate ponderation ponderative ponderer pondering ponderingly ponderling ponderment ponderomotive ponderosapine ponderosity ponderous ponderously ponderousness pondfish pondful pondgrass pondlet pondman Pondo pondok pondokkie Pondomisi pondside pondus pondweed pondwort pondy pone ponent Ponera Poneramoeba ponerid Poneridae Ponerinae ponerine poneroid ponerology poney pong ponga pongee Pongidae Pongo poniard ponica ponier ponja pont Pontac Pontacq pontage pontal Pontederia Pontederiaceae pontederiaceous pontee pontes pontianak Pontic pontic ponticello ponticular ponticulus pontifex pontiff pontific pontifical pontificalia pontificalibus pontificality pontifically pontificate pontification pontifices pontificial pontificially pontificious pontify pontil pontile pontin Pontine pontine pontist pontlevis ponto Pontocaspian pontocerebellar ponton pontonier pontoon pontooneer pontooner pontooning Pontus pontvolant pony ponzite pooa pooch pooder poodle poodledom poodleish poodleship poof poogye pooh poohpoohist pook pooka pookaun pookoo pool pooler pooli poolroom poolroot poolside poolwort pooly poon poonac poonga poonghie poop pooped poophyte poophytic poor poorhouse poorish poorliness poorling poorly poorlyish poormaster poorness poorweed poorwill poot Pop pop popadam popal popcorn popdock pope Popean popedom popeholy popehood popeism popeler popeless popelike popeline popely popery popeship popess popeye popeyed popglove popgun popgunner popgunnery Popian popify popinac popinjay Popish popish popishly popishness popjoy poplar poplared Poplilia poplin poplinette popliteal popliteus poplolly Popocracy Popocrat Popolari Popoloco popomastic popover Popovets poppa poppability poppable poppean poppel popper poppet poppethead poppied poppin popple popply poppy poppycock poppycockish poppyfish poppyhead poppylike poppywort popshop populace popular popularism Popularist popularity popularization popularize popularizer popularly popularness populate population populational populationist populationistic populationless populator populicide populin Populism Populist Populistic populous populously populousness Populus popweed poral porbeagle porcate porcated porcelain porcelainization porcelainize porcelainlike porcelainous porcelaneous porcelanic porcelanite porcelanous Porcellana porcellanian porcellanid Porcellanidae porcellanize porch porched porching porchless porchlike porcine Porcula porcupine porcupinish pore pored porelike Porella porencephalia porencephalic porencephalitis porencephalon porencephalous porencephalus porencephaly porer porge porger porgy Poria poricidal Porifera poriferal poriferan poriferous poriform porimania poriness poring poringly poriomanic porism porismatic porismatical porismatically poristic poristical porite Porites Poritidae poritoid pork porkburger porker porkery porket porkfish porkish porkless porkling porkman Porkopolis porkpie porkwood porky pornerastic pornocracy pornocrat pornograph pornographer pornographic pornographically pornographist pornography pornological Porocephalus porodine porodite porogam porogamic porogamous porogamy porokaiwhiria porokeratosis Porokoto poroma porometer porophyllous poroplastic poroporo pororoca poros poroscope poroscopic poroscopy porose poroseness porosimeter porosis porosity porotic porotype porous porously porousness porpentine porphine Porphyra Porphyraceae porphyraceous porphyratin Porphyrean porphyria Porphyrian porphyrian Porphyrianist porphyrin porphyrine porphyrinuria Porphyrio porphyrion porphyrite porphyritic porphyroblast porphyroblastic porphyrogene porphyrogenite porphyrogenitic porphyrogenitism porphyrogeniture porphyrogenitus porphyroid porphyrophore porphyrous porphyry Porpita porpitoid porpoise porpoiselike porporate porr porraceous porrect porrection porrectus porret porridge porridgelike porridgy porriginous porrigo Porrima porringer porriwiggle porry port porta portability portable portableness portably portage portague portahepatis portail portal portaled portalled portalless portamento portance portass portatile portative portcrayon portcullis porteacid ported porteligature portend portendance portendment Porteno portension portent portention portentosity portentous portentously portentousness porteous porter porterage Porteranthus porteress porterhouse porterlike porterly portership portfire portfolio portglaive portglave portgrave Porthetria Portheus porthole porthook porthors porthouse Portia portia portico porticoed portiere portiered portifory portify portio portiomollis portion portionable portional portionally portioner portionist portionize portionless portitor Portlandian portlast portless portlet portligature portlily portliness portly portman portmanmote portmanteau portmanteaux portmantle portmantologism portment portmoot porto portoise portolan portolano Portor portrait portraitist portraitlike portraiture portray portrayable portrayal portrayer portrayist portrayment portreeve portreeveship portress portside portsider portsman portuary portugais Portugal Portugalism Portugee Portuguese Portulaca Portulacaceae portulacaceous Portulacaria portulan Portunalia portunian Portunidae Portunus portway porty porule porulose porulous porus porwigle pory Porzana posadaship posca pose Poseidon Poseidonian posement poser poseur posey posh posing posingly posit position positional positioned positioner positionless positival positive positively positiveness positivism positivist positivistic positivistically positivity positivize positor positron positum positure Posnanian posnet posole posologic posological posologist posology pospolite poss posse posseman possess possessable possessed possessedly possessedness possessing possessingly possessingness possession possessional possessionalism possessionalist possessionary possessionate possessioned possessioner possessionist possessionless possessionlessness possessival possessive possessively possessiveness possessor possessoress possessorial possessoriness possessorship possessory posset possibilism possibilist possibilitate possibility possible possibleness possibly possum possumwood post postabdomen postabdominal postable postabortal postacetabular postadjunct postage postal postallantoic postally postalveolar postament postamniotic postanal postanesthetic postantennal postaortic postapoplectic postappendicular postarterial postarthritic postarticular postarytenoid postaspirate postaspirated postasthmatic postatrial postauditory postauricular postaxiad postaxial postaxially postaxillary postbag postbaptismal postbox postboy postbrachial postbrachium postbranchial postbreakfast postbronchial postbuccal postbulbar postbursal postcaecal postcalcaneal postcalcarine postcanonical postcardiac postcardinal postcarnate postcarotid postcart postcartilaginous postcatarrhal postcava postcaval postcecal postcenal postcentral postcentrum postcephalic postcerebellar postcerebral postcesarean postcibal postclassic postclassical postclassicism postclavicle postclavicula postclavicular postclimax postclitellian postclival postcolon postcolonial postcolumellar postcomitial postcommissural postcommissure postcommunicant Postcommunion postconceptive postcondylar postconfinement postconnubial postconsonantal postcontact postcontract postconvalescent postconvulsive postcordial postcornu postcosmic postcostal postcoxal postcritical postcrural postcubital postdate postdental postdepressive postdetermined postdevelopmental postdiagnostic postdiaphragmatic postdiastolic postdicrotic postdigestive postdigital postdiluvial postdiluvian postdiphtheric postdiphtheritic postdisapproved postdisseizin postdisseizor postdoctoral postdoctorate postdural postdysenteric posted posteen postelection postelementary postembryonal postembryonic postemporal postencephalitic postencephalon postenteral postentry postepileptic poster posterette posteriad posterial posterior posterioric posteriorically posterioristic posterioristically posteriority posteriorly posteriormost posteriors posteriorums posterish posterishness posterist posterity posterize postern posteroclusion posterodorsad posterodorsal posterodorsally posteroexternal posteroinferior posterointernal posterolateral posteromedial posteromedian posteromesial posteroparietal posterosuperior posterotemporal posteroterminal posteroventral posteruptive postesophageal posteternity postethmoid postexilian postexilic postexist postexistence postexistency postexistent postface postfact postfebrile postfemoral postfetal postfix postfixal postfixation postfixed postfixial postflection postflexion postform postfoveal postfrontal postfurca postfurcal postganglionic postgangrenal postgastric postgeminum postgenial postgeniture postglacial postglenoid postglenoidal postgonorrheic postgracile postgraduate postgrippal posthabit posthaste posthemiplegic posthemorrhagic posthepatic posthetomist posthetomy posthexaplaric posthippocampal posthitis postholder posthole posthouse posthumeral posthumous posthumously posthumousness posthumus posthyoid posthypnotic posthypnotically posthypophyseal posthypophysis posthysterical postic postical postically posticous posticteric posticum postil postilion postilioned postillate postillation postillator postimpressionism postimpressionist postimpressionistic postinfective postinfluenzal posting postingly postintestinal postique postischial postjacent postjugular postlabial postlachrymal postlaryngeal postlegitimation postlenticular postless postlike postliminary postliminiary postliminious postliminium postliminous postliminy postloitic postloral postlude postludium postluetic postmalarial postmamillary postmammary postman postmandibular postmaniacal postmarital postmark postmarriage postmaster postmasterlike postmastership postmastoid postmaturity postmaxillary postmaximal postmeatal postmedia postmedial postmedian postmediastinal postmediastinum postmedullary postmeiotic postmeningeal postmenstrual postmental postmeridian postmeridional postmesenteric postmillenarian postmillenarianism postmillennial postmillennialism postmillennialist postmillennian postmineral postmistress postmortal postmortuary postmundane postmuscular postmutative postmycotic postmyxedematous postnarial postnaris postnasal postnatal postnate postnati postnecrotic postnephritic postneural postneuralgic postneuritic postneurotic postnodular postnominal postnotum postnuptial postnuptially postobituary postocular postolivary postomental postoperative postoptic postoral postorbital postordination postorgastic postosseous postotic postpagan postpaid postpalatal postpalatine postpalpebral postpaludal postparalytic postparietal postparotid postparotitic postparoxysmal postparturient postpatellar postpathological postpericardial postpharyngeal postphlogistic postphragma postphrenic postphthisic postpituitary postplace postplegic postpneumonic postponable postpone postponement postponence postponer postpontile postpose postposited postposition postpositional postpositive postpositively postprandial postprandially postpredicament postprophesy postprostate postpubertal postpubescent postpubic postpubis postpuerperal postpulmonary postpupillary postpycnotic postpyloric postpyramidal postpyretic postrachitic postramus postrectal postreduction postremogeniture postremote postrenal postresurrection postresurrectional postretinal postrheumatic postrhinal postrider postrorse postrostral postrubeolar postsaccular postsacral postscalenus postscapula postscapular postscapularis postscarlatinal postscenium postscorbutic postscribe postscript postscriptum postscutellar postscutellum postseason postsigmoid postsign postspasmodic postsphenoid postsphenoidal postsphygmic postspinous postsplenial postsplenic poststernal poststertorous postsuppurative postsurgical postsynaptic postsynsacral postsyphilitic postsystolic posttabetic posttarsal posttetanic postthalamic postthoracic postthyroidal posttibial posttonic posttoxic posttracheal posttrapezoid posttraumatic posttreaty posttubercular posttussive posttympanic posttyphoid postulancy postulant postulantship postulata postulate postulation postulational postulator postulatory postulatum postulnar postumbilical postumbonal postural posture posturer postureteric posturist posturize postuterine postvaccinal postvaricellar postvarioloid postvelar postvenereal postvenous postverbal Postverta postvertebral postvesical postvide postvocalic postwar postward postwise postwoman postxyphoid postyard postzygapophysial postzygapophysis posy pot potability potable potableness potagerie potagery potamic Potamobiidae Potamochoerus Potamogale Potamogalidae Potamogeton Potamogetonaceae potamogetonaceous potamological potamologist potamology potamometer Potamonidae potamophilous potamoplankton potash potashery potass potassa potassamide potassic potassiferous potassium potate potation potative potato potatoes potator potatory Potawatami Potawatomi potbank potbellied potbelly potboil potboiler potboy potboydom potch potcher potcherman potcrook potdar pote potecary poteen potence potency potent potentacy potentate potential potentiality potentialization potentialize potentially potentialness potentiate potentiation Potentilla potentiometer potentiometric potentize potently potentness poter Poterium potestal potestas potestate potestative poteye potful potgirl potgun pothanger pothead pothecary potheen pother potherb potherment pothery pothole pothook pothookery Pothos pothouse pothousey pothunt pothunter pothunting poticary potichomania potichomanist potifer Potiguara potion potlatch potleg potlicker potlid potlike potluck potmaker potmaking potman potomania potomato potometer potong potoo Potoroinae potoroo Potorous potpie potpourri potrack potsherd potshoot potshooter potstick potstone pott pottage pottagy pottah potted potter potterer potteress potteringly pottery Pottiaceae potting pottinger pottle pottled potto potty potwaller potwalling potware potwhisky potwork potwort pouce poucer poucey pouch pouched pouchful pouchless pouchlike pouchy poudrette pouf poulaine poulard poulardize poulp poulpe poult poulter poulterer poulteress poultice poulticewise poultry poultrydom poultryist poultryless poultrylike poultryman poultryproof pounamu pounce pounced pouncer pouncet pouncing pouncingly pound poundage poundal poundcake pounder pounding poundkeeper poundless poundlike poundman poundmaster poundmeal poundstone poundworth pour pourer pourie pouring pouringly pourparler pourparley pourpiece pourpoint pourpointer pouser poussette pout pouter poutful pouting poutingly pouty poverish poverishment poverty povertyweed Povindah pow powder powderable powdered powderer powderiness powdering powderization powderize powderizer powderlike powderman powdery powdike powdry powellite power powerboat powered powerful powerfully powerfulness powerhouse powerless powerlessly powerlessness powermonger Powhatan powitch powldoody pownie powsoddy powsowdy powwow powwower powwowism pox poxy poy poyou pozzolanic pozzuolana pozzuolanic praam prabble prabhu practic practicability practicable practicableness practicably practical practicalism practicalist practicality practicalization practicalize practicalizer practically practicalness practicant practice practiced practicedness practicer practician practicianism practicum practitional practitioner practitionery prad Pradeep pradhana praeabdomen praeacetabular praeanal praecava praecipe praecipuum praecoces praecocial praecognitum praecoracoid praecordia praecordial praecordium praecornu praecox praecuneus praedial praedialist praediality praeesophageal praefect praefectorial praefectus praefervid praefloration praefoliation praehallux praelabrum praelection praelector praelectorship praelectress praeludium praemaxilla praemolar praemunire praenarial Praenestine Praenestinian praeneural praenomen praenomina praenominal praeoperculum praepositor praepostor praepostorial praepubis praepuce praescutum Praesepe praesertim Praesian praesidium praesphenoid praesternal praesternum praestomium praesystolic praetaxation praetexta praetor praetorial Praetorian praetorian praetorianism praetorium praetorship praezygapophysis pragmatic pragmatica pragmatical pragmaticality pragmatically pragmaticalness pragmaticism pragmatics pragmatism pragmatist pragmatistic pragmatize pragmatizer prairie prairiecraft prairied prairiedom prairielike prairieweed prairillon praisable praisableness praisably praise praiseful praisefully praisefulness praiseless praiseproof praiser praiseworthy praising praisingly praisworthily praisworthiness Prajapati prajna Prakash Prakrit prakriti Prakritic Prakritize praline pralltriller pram Pramnian prana prance pranceful prancer prancing prancingly prancy prandial prandially prank pranked pranker prankful prankfulness pranking prankingly prankish prankishly prankishness prankle pranksome pranksomeness prankster pranky prase praseocobaltic praseodidymium praseodymia praseodymium praseolite prasine prasinous prasoid prasophagous prasophagy prastha prat pratal Pratap Pratapwant prate prateful pratement pratensian Prater prater pratey pratfall pratiloma Pratincola pratincole pratincoline pratincolous prating pratingly pratique pratiyasamutpada Pratt prattfall prattle prattlement prattler prattling prattlingly prattly prau Pravin pravity prawn prawner prawny Praxean Praxeanist praxinoscope praxiology praxis Praxitelean pray praya prayer prayerful prayerfully prayerfulness prayerless prayerlessly prayerlessness prayermaker prayermaking prayerwise prayful praying prayingly prayingwise preabdomen preabsorb preabsorbent preabstract preabundance preabundant preabundantly preaccept preacceptance preaccess preaccessible preaccidental preaccidentally preaccommodate preaccommodating preaccommodatingly preaccommodation preaccomplish preaccomplishment preaccord preaccordance preaccount preaccounting preaccredit preaccumulate preaccumulation preaccusation preaccuse preaccustom preaccustomed preacetabular preach preachable preacher preacherdom preacheress preacherize preacherless preacherling preachership preachieved preachification preachify preachily preachiness preaching preachingly preachman preachment preachy preacid preacidity preacidly preacidness preacknowledge preacknowledgment preacquaint preacquaintance preacquire preacquired preacquit preacquittal preact preaction preactive preactively preactivity preacute preacutely preacuteness preadamic preadamite preadamitic preadamitical preadamitism preadapt preadaptable preadaptation preaddition preadditional preaddress preadequacy preadequate preadequately preadhere preadherence preadherent preadjectival preadjective preadjourn preadjournment preadjunct preadjust preadjustable preadjustment preadministration preadministrative preadministrator preadmire preadmirer preadmission preadmit preadmonish preadmonition preadolescent preadopt preadoption preadoration preadore preadorn preadornment preadult preadulthood preadvance preadvancement preadventure preadvertency preadvertent preadvertise preadvertisement preadvice preadvisable preadvise preadviser preadvisory preadvocacy preadvocate preaestival preaffect preaffection preaffidavit preaffiliate preaffiliation preaffirm preaffirmation preaffirmative preafflict preaffliction preafternoon preaged preaggravate preaggravation preaggression preaggressive preagitate preagitation preagonal preagony preagree preagreement preagricultural preagriculture prealarm prealcohol prealcoholic prealgebra prealgebraic prealkalic preallable preallably preallegation preallege prealliance preallied preallot preallotment preallow preallowable preallowably preallowance preallude preallusion preally prealphabet prealphabetical prealtar prealteration prealveolar preamalgamation preambassadorial preambition preambitious preamble preambled preambling preambular preambulary preambulate preambulation preambulatory preanal preanaphoral preanesthetic preanimism preannex preannounce preannouncement preannouncer preantepenult preantepenultimate preanterior preanticipate preantiquity preantiseptic preaortic preappearance preapperception preapplication preappoint preappointment preapprehension preapprise preapprobation preapproval preapprove preaptitude prearm prearrange prearrangement prearrest prearrestment prearticulate preartistic preascertain preascertainment preascitic preaseptic preassigned preassume preassurance preassure preataxic preattachment preattune preaudience preauditory preaver preavowal preaxiad preaxial preaxially prebachelor prebacillary prebake prebalance preballot preballoting prebankruptcy prebaptismal prebaptize prebarbaric prebarbarous prebargain prebasal prebasilar prebeleve prebelief prebeliever prebelieving prebellum prebeloved prebend prebendal prebendary prebendaryship prebendate prebenediction prebeneficiary prebenefit prebeset prebestow prebestowal prebetray prebetrayal prebetrothal prebid prebidding prebill prebless preblessing preblockade preblooming preboast preboding preboil preborn preborrowing preboyhood prebrachial prebrachium prebreathe prebridal prebroadcasting prebromidic prebronchial prebronze prebrute prebuccal prebudget prebudgetary prebullying preburlesque preburn precalculable precalculate precalculation precampaign precancel precancellation precancerous precandidacy precandidature precanning precanonical precant precantation precanvass precapillary precapitalist precapitalistic precaptivity precapture precarcinomatous precardiac precaria precarious precariously precariousness precarium precarnival precartilage precartilaginous precary precast precation precative precatively precatory precaudal precausation precaution precautional precautionary precautious precautiously precautiousness precava precaval precedable precede precedence precedency precedent precedentable precedentary precedented precedential precedentless precedently preceder preceding precelebrant precelebrate precelebration precensure precensus precent precentor precentorial precentorship precentory precentral precentress precentrix precentrum precept preception preceptist preceptive preceptively preceptor preceptoral preceptorate preceptorial preceptorially preceptorship preceptory preceptress preceptual preceptually preceramic precerebellar precerebral precerebroid preceremonial preceremony precertification precertify preces precess precession precessional prechallenge prechampioned prechampionship precharge prechart precheck prechemical precherish prechildhood prechill prechloric prechloroform prechoice prechoose prechordal prechoroid preciation precinct precinction precinctive preciosity precious preciously preciousness precipe precipice precipiced precipitability precipitable precipitance precipitancy precipitant precipitantly precipitantness precipitate precipitated precipitatedly precipitately precipitation precipitative precipitator precipitin precipitinogen precipitinogenic precipitous precipitously precipitousness precirculate precirculation precis precise precisely preciseness precisian precisianism precisianist precision precisional precisioner precisionism precisionist precisionize precisive precitation precite precited precivilization preclaim preclaimant preclaimer preclassic preclassical preclassification preclassified preclassify preclean precleaner precleaning preclerical preclimax preclinical preclival precloacal preclose preclosure preclothe precludable preclude preclusion preclusive preclusively precoagulation precoccygeal precocial precocious precociously precociousness precocity precogitate precogitation precognition precognitive precognizable precognizant precognize precognosce precoil precoiler precoincidence precoincident precoincidently precollapsable precollapse precollect precollectable precollection precollector precollege precollegiate precollude precollusion precollusive precolor precolorable precoloration precoloring precombat precombatant precombination precombine precombustion precommand precommend precomment precommercial precommissural precommissure precommit precommune precommunicate precommunication precommunion precompare precomparison precompass precompel precompensate precompensation precompilation precompile precompiler precompleteness precompletion precompliance precompliant precomplicate precomplication precompose precomposition precompound precompounding precompoundly precomprehend precomprehension precomprehensive precompress precompulsion precomradeship preconceal preconcealment preconcede preconceivable preconceive preconceived preconcentrate preconcentrated preconcentratedly preconcentration preconcept preconception preconceptional preconceptual preconcern preconcernment preconcert preconcerted preconcertedly preconcertedness preconcertion preconcertive preconcession preconcessive preconclude preconclusion preconcur preconcurrence preconcurrent preconcurrently precondemn precondemnation precondensation precondense precondition preconditioned preconduct preconduction preconductor precondylar precondyloid preconfer preconference preconfess preconfession preconfide preconfiguration preconfigure preconfine preconfinedly preconfinemnt preconfirm preconfirmation preconflict preconform preconformity preconfound preconfuse preconfusedly preconfusion precongenial precongested precongestion precongestive precongratulate precongratulation precongressional preconizance preconization preconize preconizer preconjecture preconnection preconnective preconnubial preconquer preconquest preconquestal preconquestual preconscious preconsciously preconsciousness preconsecrate preconsecration preconsent preconsider preconsideration preconsign preconsolation preconsole preconsolidate preconsolidated preconsolidation preconsonantal preconspiracy preconspirator preconspire preconstituent preconstitute preconstruct preconstruction preconsult preconsultation preconsultor preconsume preconsumer preconsumption precontact precontain precontained precontemn precontemplate precontemplation precontemporaneous precontemporary precontend precontent precontention precontently precontentment precontest precontinental precontract precontractive precontractual precontribute precontribution precontributive precontrivance precontrive precontrol precontrolled precontroversial precontroversy preconvention preconversation preconversational preconversion preconvert preconvey preconveyal preconveyance preconvict preconviction preconvince precook precooker precool precooler precooling precopy precoracoid precordia precordial precordiality precordially precordium precorneal precornu precoronation precorrect precorrection precorrectly precorrectness precorrespond precorrespondence precorrespondent precorridor precorrupt precorruption precorruptive precorruptly precoruptness precosmic precosmical precostal precounsel precounsellor precourse precover precovering precox precreate precreation precreative precredit precreditor precreed precritical precriticism precriticize precrucial precrural precrystalline precultivate precultivation precultural preculturally preculture precuneal precuneate precuneus precure precurrent precurricular precurriculum precursal precurse precursive precursor precursory precurtain precut precyclone precyclonic precynical precyst precystic predable predacean predaceous predaceousness predacity predamage predamn predamnation predark predarkness predata predate predation predatism predative predator predatorily predatoriness predatory predawn preday predaylight predaytime predazzite predealer predealing predeath predeathly predebate predebater predebit predebtor predecay predecease predeceaser predeceive predeceiver predeception predecession predecessor predecessorship predecide predecision predecisive predeclaration predeclare predeclination predecline predecree prededicate prededuct prededuction predefault predefeat predefect predefective predefence predefend predefense predefiance predeficiency predeficient predefine predefinite predefinition predefray predefrayal predefy predegeneracy predegenerate predegree predeication predelay predelegate predelegation predeliberate predeliberately predeliberation predelineate predelineation predelinquency predelinquent predelinquently predeliver predelivery predella predelude predelusion predemand predemocracy predemocratic predemonstrate predemonstration predemonstrative predenial predental predentary Predentata predentate predeny predepart predepartmental predeparture predependable predependence predependent predeplete predepletion predeposit predepository predepreciate predepreciation predepression predeprivation predeprive prederivation prederive predescend predescent predescribe predescription predesert predeserter predesertion predeserve predeserving predesign predesignate predesignation predesignatory predesirous predesolate predesolation predespair predesperate predespicable predespise predespond predespondency predespondent predestinable predestinarian predestinarianism predestinate predestinately predestination predestinational predestinationism predestinationist predestinative predestinator predestine predestiny predestitute predestitution predestroy predestruction predetach predetachment predetail predetain predetainer predetect predetention predeterminability predeterminable predeterminant predeterminate predeterminately predetermination predeterminative predetermine predeterminer predeterminism predeterministic predetest predetestation predetrimental predevelop predevelopment predevise predevote predevotion predevour prediagnosis prediagnostic predial prediastolic prediatory predicability predicable predicableness predicably predicament predicamental predicamentally predicant predicate predication predicational predicative predicatively predicator predicatory predicrotic predict predictability predictable predictably predictate predictation prediction predictional predictive predictively predictiveness predictor predictory prediet predietary predifferent predifficulty predigest predigestion predikant predilect predilected predilection prediligent prediligently prediluvial prediluvian prediminish prediminishment prediminution predine predinner prediphtheritic prediploma prediplomacy prediplomatic predirect predirection predirector predisability predisable predisadvantage predisadvantageous predisadvantageously predisagree predisagreeable predisagreement predisappointment predisaster predisastrous prediscern prediscernment predischarge prediscipline predisclose predisclosure prediscontent prediscontented prediscontentment prediscontinuance prediscontinuation prediscontinue prediscount prediscountable prediscourage prediscouragement prediscourse prediscover prediscoverer prediscovery prediscreet prediscretion prediscretionary prediscriminate prediscrimination prediscriminator prediscuss prediscussion predisgrace predisguise predisgust predislike predismiss predismissal predismissory predisorder predisordered predisorderly predispatch predispatcher predisperse predispersion predisplace predisplacement predisplay predisponency predisponent predisposable predisposal predispose predisposed predisposedly predisposedness predisposition predispositional predisputant predisputation predispute predisregard predisrupt predisruption predissatisfaction predissolution predissolve predissuade predistinct predistinction predistinguish predistress predistribute predistribution predistributor predistrict predistrust predistrustful predisturb predisturbance prediversion predivert predivide predividend predivider predivinable predivinity predivision predivorce predivorcement predoctorate predocumentary predomestic predominance predominancy predominant predominantly predominate predominately predominatingly predomination predominator predonate predonation predonor predoom predorsal predoubt predoubter predoubtful predraft predrainage predramatic predraw predrawer predread predreadnought predrill predriller predrive predriver predry preduplicate preduplication predusk predwell predynamite predynastic preen preener preeze prefab prefabricate prefabrication prefabricator preface prefaceable prefacer prefacial prefacist prefactor prefactory prefamiliar prefamiliarity prefamiliarly prefamous prefashion prefatial prefator prefatorial prefatorially prefatorily prefatory prefavor prefavorable prefavorably prefavorite prefearful prefearfully prefeast prefect prefectly prefectoral prefectorial prefectorially prefectorian prefectship prefectual prefectural prefecture prefecundation prefecundatory prefederal prefelic prefer preferability preferable preferableness preferably preferee preference preferent preferential preferentialism preferentialist preferentially preferment prefermentation preferred preferredly preferredness preferrer preferrous prefertile prefertility prefertilization prefertilize prefervid prefestival prefeudal prefeudalic prefeudalism prefiction prefictional prefigurate prefiguration prefigurative prefiguratively prefigurativeness prefigure prefigurement prefiller prefilter prefinal prefinance prefinancial prefine prefinish prefix prefixable prefixal prefixally prefixation prefixed prefixedly prefixion prefixture preflagellate preflatter preflattery preflavor preflavoring preflection preflexion preflight preflood prefloration preflowering prefoliation prefool preforbidden preforceps preforgive preforgiveness preforgotten preform preformant preformation preformationary preformationism preformationist preformative preformed preformism preformist preformistic preformulate preformulation prefortunate prefortunately prefortune prefoundation prefounder prefragrance prefragrant prefrankness prefraternal prefraternally prefraud prefreeze prefreshman prefriendly prefriendship prefright prefrighten prefrontal prefulfill prefulfillment prefulgence prefulgency prefulgent prefunction prefunctional prefuneral prefungoidal prefurlough prefurnish pregain pregainer pregalvanize preganglionic pregather pregathering pregeminum pregenerate pregeneration pregenerosity pregenerous pregenerously pregenial pregeniculatum pregeniculum pregenital pregeological pregirlhood preglacial pregladden pregladness preglenoid preglenoidal preglobulin pregnability pregnable pregnance pregnancy pregnant pregnantly pregnantness pregolden pregolfing pregracile pregracious pregrade pregraduation pregranite pregranitic pregratification pregratify pregreet pregreeting pregrievance pregrowth preguarantee preguarantor preguard preguess preguidance preguide preguilt preguiltiness preguilty pregust pregustant pregustation pregustator pregustic prehallux prehalter prehandicap prehandle prehaps preharden preharmonious preharmoniousness preharmony preharsh preharshness preharvest prehatred prehaunt prehaunted prehaustorium prehazard prehazardous preheal prehearing preheat preheated preheater prehemiplegic prehend prehensible prehensile prehensility prehension prehensive prehensiveness prehensor prehensorial prehensory prehepatic prehepaticus preheroic prehesitancy prehesitate prehesitation prehexameral prehistorian prehistoric prehistorical prehistorically prehistorics prehistory prehnite prehnitic preholder preholding preholiday prehorizon prehorror prehostile prehostility prehuman prehumiliate prehumiliation prehumor prehunger prehydration prehypophysis preidea preidentification preidentify preignition preilluminate preillumination preillustrate preillustration preimage preimaginary preimagination preimagine preimbibe preimbue preimitate preimitation preimitative preimmigration preimpair preimpairment preimpart preimperial preimport preimportance preimportant preimportantly preimportation preimposal preimpose preimposition preimpress preimpression preimpressive preimprove preimprovement preinaugural preinaugurate preincarnate preincentive preinclination preincline preinclude preinclusion preincorporate preincorporation preincrease preindebted preindebtedness preindemnification preindemnify preindemnity preindependence preindependent preindependently preindesignate preindicant preindicate preindication preindispose preindisposition preinduce preinducement preinduction preinductive preindulge preindulgence preindulgent preindustrial preindustry preinfect preinfection preinfer preinference preinflection preinflectional preinflict preinfluence preinform preinformation preinhabit preinhabitant preinhabitation preinhere preinherit preinheritance preinitial preinitiate preinitiation preinjure preinjurious preinjury preinquisition preinscribe preinscription preinsert preinsertion preinsinuate preinsinuating preinsinuatingly preinsinuation preinsinuative preinspect preinspection preinspector preinspire preinstall preinstallation preinstill preinstillation preinstruct preinstruction preinstructional preinstructive preinsula preinsular preinsulate preinsulation preinsult preinsurance preinsure preintellectual preintelligence preintelligent preintelligently preintend preintention preintercede preintercession preinterchange preintercourse preinterest preinterfere preinterference preinterpret preinterpretation preinterpretative preinterview preintone preinvent preinvention preinventive preinventory preinvest preinvestigate preinvestigation preinvestigator preinvestment preinvitation preinvite preinvocation preinvolve preinvolvement preiotization preiotize preirrigation preirrigational preissuance preissue prejacent prejournalistic prejudge prejudgement prejudger prejudgment prejudication prejudicative prejudicator prejudice prejudiced prejudicedly prejudiceless prejudiciable prejudicial prejudicially prejudicialness prejudicious prejudiciously prejunior prejurisdiction prejustification prejustify prejuvenile Prekantian prekindergarten prekindle preknit preknow preknowledge prelabel prelabial prelabor prelabrum prelachrymal prelacrimal prelacteal prelacy prelanguage prelapsarian prelate prelatehood prelateship prelatess prelatial prelatic prelatical prelatically prelaticalness prelation prelatish prelatism prelatist prelatize prelatry prelature prelaunch prelaunching prelawful prelawfully prelawfulness prelease prelect prelection prelector prelectorship prelectress prelecture prelegacy prelegal prelegate prelegatee prelegend prelegendary prelegislative preliability preliable prelibation preliberal preliberality preliberally preliberate preliberation prelicense prelim preliminarily preliminary prelimit prelimitate prelimitation prelingual prelinguistic prelinpinpin preliquidate preliquidation preliteral preliterally preliteralness preliterary preliterate preliterature prelithic prelitigation preloan prelocalization prelocate prelogic prelogical preloral preloreal preloss prelude preluder preludial preludious preludiously preludium preludize prelumbar prelusion prelusive prelusively prelusorily prelusory preluxurious premachine premadness premaintain premaintenance premake premaker premaking premandibular premanhood premaniacal premanifest premanifestation premankind premanufacture premanufacturer premanufacturing premarital premarriage premarry premastery prematch premate prematerial prematernity prematrimonial prematuration premature prematurely prematureness prematurity premaxilla premaxillary premeasure premeasurement premechanical premedia premedial premedian premedic premedical premedicate premedication premedieval premedievalism premeditate premeditatedly premeditatedness premeditatingly premeditation premeditative premeditator premegalithic prememorandum premenace premenstrual premention premeridian premerit premetallic premethodical premial premiant premiate premidnight premidsummer premier premieral premiere premieress premierjus premiership premilitary premillenarian premillenarianism premillennial premillennialism premillennialist premillennialize premillennially premillennian preminister preministry premious premisal premise premisory premisrepresent premisrepresentation premiss premium premix premixer premixture premodel premodern premodification premodify premolar premold premolder premolding premonarchial premonetary Premongolian premonish premonishment premonition premonitive premonitor premonitorily premonitory premonopolize premonopoly Premonstrant Premonstratensian premonumental premoral premorality premorally premorbid premorbidly premorbidness premorning premorse premortal premortification premortify premortuary premosaic premotion premourn premove premovement premover premuddle premultiplication premultiplier premultiply premundane premunicipal premunition premunitory premusical premuster premutative premutiny premycotic premyelocyte premythical prename Prenanthes prenares prenarial prenaris prenasal prenatal prenatalist prenatally prenational prenative prenatural prenaval prender prendre prenebular prenecessitate preneglect preneglectful prenegligence prenegligent prenegotiate prenegotiation preneolithic prenephritic preneural preneuralgic prenight prenoble prenodal prenominal prenominate prenomination prenominical prenotation prenotice prenotification prenotify prenotion prentice prenticeship prenumber prenumbering prenuncial prenuptial prenursery preobedience preobedient preobject preobjection preobjective preobligate preobligation preoblige preobservance preobservation preobservational preobserve preobstruct preobstruction preobtain preobtainable preobtrude preobtrusion preobtrusive preobviate preobvious preobviously preobviousness preoccasioned preoccipital preocclusion preoccultation preoccupancy preoccupant preoccupate preoccupation preoccupative preoccupied preoccupiedly preoccupiedness preoccupier preoccupy preoccur preoccurrence preoceanic preocular preodorous preoffend preoffense preoffensive preoffensively preoffensiveness preoffer preoffering preofficial preofficially preominate preomission preomit preopen preopening preoperate preoperation preoperative preoperatively preoperator preopercle preopercular preoperculum preopinion preopinionated preoppose preopposition preoppress preoppression preoppressor preoptic preoptimistic preoption preoral preorally preorbital preordain preorder preordination preorganic preorganization preorganize preoriginal preoriginally preornamental preoutfit preoutline preoverthrow prep prepainful prepalatal prepalatine prepaleolithic prepanic preparable preparation preparationist preparative preparatively preparator preparatorily preparatory prepardon prepare prepared preparedly preparedness preparement preparental preparer preparietal preparingly preparliamentary preparoccipital preparoxysmal prepartake preparticipation prepartisan prepartition prepartnership prepatellar prepatent prepatriotic prepave prepavement prepay prepayable prepayment prepeduncle prepenetrate prepenetration prepenial prepense prepensely prepeople preperceive preperception preperceptive preperitoneal prepersuade prepersuasion prepersuasive preperusal preperuse prepetition prephragma prephthisical prepigmental prepink prepious prepituitary preplace preplacement preplacental preplan preplant prepledge preplot prepoetic prepoetical prepoison prepolice prepolish prepolitic prepolitical prepolitically prepollence prepollency prepollent prepollex preponder preponderance preponderancy preponderant preponderantly preponderate preponderately preponderating preponderatingly preponderation preponderous preponderously prepontile prepontine preportray preportrayal prepose preposition prepositional prepositionally prepositive prepositively prepositor prepositorial prepositure prepossess prepossessed prepossessing prepossessingly prepossessingness prepossession prepossessionary prepossessor preposterous preposterously preposterousness prepostorship prepotence prepotency prepotent prepotential prepotently prepractical prepractice preprandial prepreference prepreparation preprice preprimary preprimer preprimitive preprint preprofess preprofessional preprohibition prepromise prepromote prepromotion prepronounce prepronouncement preprophetic preprostatic preprove preprovide preprovision preprovocation preprovoke preprudent preprudently prepsychological prepsychology prepuberal prepubertal prepuberty prepubescent prepubic prepubis prepublication prepublish prepuce prepunctual prepunish prepunishment prepupa prepupal prepurchase prepurchaser prepurpose preputial preputium prepyloric prepyramidal prequalification prequalify prequarantine prequestion prequotation prequote preracing preradio prerailroad prerailroadite prerailway preramus prerational prereadiness preready prerealization prerealize prerebellion prereceipt prereceive prereceiver prerecital prerecite prereckon prereckoning prerecognition prerecognize prerecommend prerecommendation prereconcile prereconcilement prereconciliation prerectal preredeem preredemption prereduction prerefer prereference prerefine prerefinement prereform prereformation prereformatory prerefusal prerefuse preregal preregister preregistration preregulate preregulation prereject prerejection prerejoice prerelate prerelation prerelationship prerelease prereligious prereluctation preremit preremittance preremorse preremote preremoval preremove preremunerate preremuneration prerenal prerent prerental prereport prerepresent prerepresentation prereption prerepublican prerequest prerequire prerequirement prerequisite prerequisition preresemblance preresemble preresolve preresort prerespectability prerespectable prerespiration prerespire preresponsibility preresponsible prerestoration prerestrain prerestraint prerestrict prerestriction prereturn prereveal prerevelation prerevenge prereversal prereverse prereview prerevise prerevision prerevival prerevolutionary prerheumatic prerich prerighteous prerighteously prerighteousness prerogatival prerogative prerogatived prerogatively prerogativity prerolandic preromantic preromanticism preroute preroutine preroyal preroyally preroyalty prerupt preruption presacral presacrifice presacrificial presage presageful presagefully presager presagient presaging presagingly presalvation presanctification presanctified presanctify presanguine presanitary presartorial presatisfaction presatisfactory presatisfy presavage presavagery presay presbyacousia presbyacusia presbycousis presbycusis presbyope presbyophrenia presbyophrenic presbyopia presbyopic presbyopy presbyte presbyter presbyteral presbyterate presbyterated presbyteress presbyteria presbyterial presbyterially Presbyterian Presbyterianism Presbyterianize Presbyterianly presbyterium presbytership presbytery presbytia presbytic Presbytinae Presbytis presbytism prescapula prescapular prescapularis prescholastic preschool prescience prescient prescientific presciently prescind prescindent prescission prescored prescout prescribable prescribe prescriber prescript prescriptibility prescriptible prescription prescriptionist prescriptive prescriptively prescriptiveness prescriptorial prescrive prescutal prescutum preseal presearch preseason preseasonal presecular presecure presee preselect presell preseminal preseminary presence presenced presenceless presenile presenility presensation presension present presentability presentable presentableness presentably presental presentation presentational presentationism presentationist presentative presentatively presentee presentence presenter presential presentiality presentially presentialness presentient presentiment presentimental presentist presentive presentively presentiveness presently presentment presentness presentor preseparate preseparation preseparator preservability preservable preserval preservation preservationist preservative preservatize preservatory preserve preserver preserveress preses presession preset presettle presettlement presexual preshadow preshape preshare presharpen preshelter preship preshipment preshortage preshorten preshow preside presidence presidencia presidency president presidente presidentess presidential presidentially presidentiary presidentship presider presidial presidially presidiary presidio presidium presift presign presignal presignificance presignificancy presignificant presignification presignificative presignificator presignify presimian preslavery Presley presmooth presocial presocialism presocialist presolar presolicit presolicitation presolution presolve presophomore presound prespecialist prespecialize prespecific prespecifically prespecification prespecify prespeculate prespeculation presphenoid presphenoidal presphygmic prespinal prespinous prespiracular presplendor presplenomegalic prespoil prespontaneity prespontaneous prespontaneously prespread presprinkle prespur press pressable pressboard pressdom pressel presser pressfat pressful pressgang pressible pressing pressingly pressingness pression pressive pressman pressmanship pressmark pressor presspack pressroom pressurage pressural pressure pressureless pressureproof pressurize pressurizer presswoman presswork pressworker prest prestabilism prestability prestable prestamp prestandard prestandardization prestandardize prestant prestate prestation prestatistical presteam presteel prester presternal presternum prestidigital prestidigitate prestidigitation prestidigitator prestidigitatorial prestige prestigiate prestigiation prestigiator prestigious prestigiously prestigiousness prestimulate prestimulation prestimulus prestissimo presto prestock prestomial prestomium prestorage prestore prestraighten prestrain prestrengthen prestress prestretch prestricken prestruggle prestubborn prestudious prestudiously prestudiousness prestudy presubdue presubiculum presubject presubjection presubmission presubmit presubordinate presubordination presubscribe presubscriber presubscription presubsist presubsistence presubsistent presubstantial presubstitute presubstitution presuccess presuccessful presuccessfully presuffer presuffering presufficiency presufficient presufficiently presuffrage presuggest presuggestion presuggestive presuitability presuitable presuitably presumable presumably presume presumedly presumer presuming presumption presumptious presumptiously presumptive presumptively presumptuous presumptuously presumptuousness presuperficial presuperficiality presuperficially presuperfluity presuperfluous presuperfluously presuperintendence presuperintendency presupervise presupervision presupervisor presupplemental presupplementary presupplicate presupplication presupply presupport presupposal presuppose presupposition presuppositionless presuppress presuppression presuppurative presupremacy presupreme presurgery presurgical presurmise presurprisal presurprise presurrender presurround presurvey presusceptibility presusceptible presuspect presuspend presuspension presuspicion presuspicious presuspiciously presuspiciousness presustain presutural preswallow presylvian presympathize presympathy presymphonic presymphony presymphysial presymptom presymptomatic presynapsis presynaptic presystematic presystematically presystole presystolic pretabulate pretabulation pretan pretangible pretangibly pretannage pretardily pretardiness pretardy pretariff pretaste preteach pretechnical pretechnically pretelegraph pretelegraphic pretelephone pretelephonic pretell pretemperate pretemperately pretemporal pretend pretendant pretended pretendedly pretender Pretenderism pretendership pretendingly pretendingness pretense pretenseful pretenseless pretension pretensional pretensionless pretensive pretensively pretensiveness pretentative pretentious pretentiously pretentiousness pretercanine preterchristian preterconventional preterdetermined preterdeterminedly preterdiplomatic preterdiplomatically preterequine preteressential pretergress pretergression preterhuman preterience preterient preterintentional preterist preterit preteriteness preterition preteritive preteritness preterlabent preterlegal preterlethal preterminal pretermission pretermit pretermitter preternative preternatural preternaturalism preternaturalist preternaturality preternaturally preternaturalness preternormal preternotorious preternuptial preterpluperfect preterpolitical preterrational preterregular preterrestrial preterritorial preterroyal preterscriptural preterseasonable pretersensual pretervection pretest pretestify pretestimony pretext pretexted pretextuous pretheological prethoracic prethoughtful prethoughtfully prethoughtfulness prethreaten prethrill prethrust pretibial pretimeliness pretimely pretincture pretire pretoken pretone pretonic pretorial pretorship pretorsional pretorture pretournament pretrace pretracheal pretraditional pretrain pretraining pretransact pretransaction pretranscribe pretranscription pretranslate pretranslation pretransmission pretransmit pretransport pretransportation pretravel pretreat pretreatment pretreaty pretrematic pretribal pretry prettification prettifier prettify prettikin prettily prettiness pretty prettyface prettyish prettyism pretubercular pretuberculous pretympanic pretyphoid pretypify pretypographical pretyrannical pretyranny pretzel preultimate preultimately preumbonal preunderstand preundertake preunion preunite preutilizable preutilization preutilize prevacate prevacation prevaccinate prevaccination prevail prevailance prevailer prevailingly prevailingness prevailment prevalence prevalency prevalent prevalently prevalentness prevalescence prevalescent prevalid prevalidity prevalidly prevaluation prevalue prevariation prevaricate prevarication prevaricator prevaricatory prevascular prevegetation prevelar prevenance prevenancy prevene prevenience prevenient preveniently prevent preventability preventable preventative preventer preventible preventingly prevention preventionism preventionist preventive preventively preventiveness preventorium preventure preverb preverbal preverification preverify prevernal preversion prevertebral prevesical preveto previctorious previde previdence preview previgilance previgilant previgilantly previolate previolation previous previously previousness previse previsibility previsible previsibly prevision previsional previsit previsitor previsive previsor prevocal prevocalic prevocally prevocational prevogue prevoid prevoidance prevolitional prevolunteer prevomer prevotal prevote prevoyance prevoyant prevue prewar prewarn prewarrant prewash preweigh prewelcome prewhip prewilling prewillingly prewillingness prewire prewireless prewitness prewonder prewonderment preworldliness preworldly preworship preworthily preworthiness preworthy prewound prewrap prexy prey preyer preyful preyingly preyouthful prezonal prezone prezygapophysial prezygapophysis prezygomatic Pria priacanthid Priacanthidae priacanthine Priacanthus Priapean Priapic priapism Priapulacea priapulid Priapulida Priapulidae priapuloid Priapuloidea Priapulus Priapus Priapusian Price price priceable priceably priced priceite priceless pricelessness pricer prich prick prickant pricked pricker pricket prickfoot pricking prickingly prickish prickle prickleback prickled pricklefish prickless prickliness prickling pricklingly pricklouse prickly pricklyback prickmadam prickmedainty prickproof pricks prickseam prickshot prickspur pricktimber prickwood pricky pride prideful pridefully pridefulness prideless pridelessly prideling prideweed pridian priding pridingly pridy pried prier priest priestal priestcap priestcraft priestdom priesteen priestery priestess priestfish priesthood priestianity priestish priestism priestless priestlet priestlike priestliness priestling priestly priestship priestshire prig prigdom prigger priggery priggess priggish priggishly priggishness priggism prighood prigman prill prillion prim prima primacy primage primal primality primar primarian primaried primarily primariness primary primatal primate Primates primateship primatial primatic primatical primavera primaveral prime primegilt primely primeness primer primero primerole primeval primevalism primevally primeverose primevity primevous primevrin Primianist primigene primigenial primigenian primigenious primigenous primigravida primine priming primipara primiparity primiparous primipilar primitiae primitial primitias primitive primitively primitivism primitivist primitivistic primitivity primly primness primogenetrix primogenial primogenital primogenitary primogenitive primogenitor primogeniture primogenitureship primogenous primoprime primoprimitive primordality primordia primordial primordialism primordially primordiate primordium primosity primost primp primrose primrosed primrosetide primrosetime primrosy primsie Primula primula Primulaceae primulaceous Primulales primulaverin primulaveroside primulic primuline Primulinus Primus primus primwort primy prince princeage princecraft princedom princehood Princeite princekin princeless princelet princelike princeliness princeling princely princeps princeship princess princessdom princesse princesslike princessly princewood princified princify principal principality principally principalness principalship principate Principes principes principia principiant principiate principiation principium principle principulus princock princox prine pringle prink prinker prinkle prinky print printability printable printableness printed printer printerdom printerlike printery printing printless printline printscript printworks Priodon priodont Priodontes prion prionid Prionidae Prioninae prionine Prionodesmacea prionodesmacean prionodesmaceous prionodesmatic Prionodon prionodont Prionopinae prionopine Prionops Prionus prior prioracy prioral priorate prioress prioristic prioristically priorite priority priorly priorship priory prisable prisage prisal priscan Priscian Priscianist Priscilla Priscillian Priscillianism Priscillianist prism prismal prismatic prismatical prismatically prismatization prismatize prismatoid prismatoidal prismed prismoid prismoidal prismy prisometer prison prisonable prisondom prisoner prisonful prisonlike prisonment prisonous priss prissily prissiness prissy pristane pristine Pristipomatidae Pristipomidae Pristis Pristodus pritch Pritchardia pritchel prithee prius privacity privacy privant private privateer privateersman privately privateness privation privative privatively privativeness privet privilege privileged privileger privily priviness privity privy prizable prize prizeable prizeholder prizeman prizer prizery prizetaker prizeworthy pro proa proabolitionist proabsolutism proabsolutist proabstinence proacademic proacceptance proacquisition proacquittal proaction proactor proaddition proadjournment proadministration proadmission proadoption proadvertising proaesthetic proaggressionist proagitation proagrarian proagreement proagricultural proagule proairesis proairplane proal proalcoholism proalien proalliance proallotment proalteration proamateur proambient proamendment proamnion proamniotic proamusement proanaphora proanaphoral proanarchic proangiosperm proangiospermic proangiospermous proanimistic proannexation proannexationist proantarctic proanthropos proapostolic proappointment proapportionment proappreciation proappropriation proapproval proaquatic proarbitration proarbitrationist proarchery proarctic proaristocratic proarmy Proarthri proassessment proassociation proatheist proatheistic proathletic proatlas proattack proattendance proauction proaudience proaulion proauthor proauthority proautomobile proavian proaviation Proavis proaward prob probabiliorism probabiliorist probabilism probabilist probabilistic probability probabilize probabl probable probableness probably probachelor probal proballoon probang probanishment probankruptcy probant probargaining probaseball probasketball probate probathing probatical probation probational probationary probationer probationerhood probationership probationism probationist probationship probative probatively probator probatory probattle probattleship probe probeable probeer prober probetting probiology probituminous probity problem problematic problematical problematically problematist problematize problemdom problemist problemistic problemize problemwise problockade probonding probonus proborrowing proboscidal proboscidate Proboscidea proboscidean proboscideous proboscides proboscidial proboscidian proboscidiferous proboscidiform probosciform probosciformed Probosciger proboscis proboscislike probouleutic proboulevard probowling proboxing proboycott probrick probridge probroadcasting probudget probudgeting probuilding probusiness probuying procacious procaciously procacity procaine procambial procambium procanal procancellation procapital procapitalism procapitalist procarnival procarp procarpium procarrier procatalectic procatalepsis procatarctic procatarxis procathedral Procavia Procaviidae procedendo procedural procedure proceed proceeder proceeding proceeds proceleusmatic Procellaria procellarian procellarid Procellariidae Procellariiformes procellariine procellas procello procellose procellous procensorship procensure procentralization procephalic procercoid procereal procerebral procerebrum proceremonial proceremonialism proceremonialist proceres procerite proceritic procerity procerus process processal procession processional processionalist processionally processionary processioner processionist processionize processionwise processive processor processual procharity prochein prochemical prochlorite prochondral prochoos prochordal prochorion prochorionic prochromosome prochronic prochronism prochronize prochurch prochurchian procidence procident procidentia procivic procivilian procivism proclaim proclaimable proclaimant proclaimer proclaiming proclaimingly proclamation proclamator proclamatory proclassic proclassical proclergy proclerical proclericalism procline proclisis proclitic proclive proclivitous proclivity proclivous proclivousness Procne procnemial Procoelia procoelia procoelian procoelous procoercive procollectivistic procollegiate procombat procombination procomedy procommemoration procomment procommercial procommission procommittee procommunal procommunism procommunist procommutation procompensation procompetition procompromise procompulsion proconcentration proconcession proconciliation procondemnation proconfederationist proconference proconfession proconfessionist proconfiscation proconformity Proconnesian proconquest proconscription proconscriptive proconservation proconservationist proconsolidation proconstitutional proconstitutionalism proconsul proconsular proconsulary proconsulate proconsulship proconsultation procontinuation proconvention proconventional proconviction procoracoid procoracoidal procorporation procosmetic procosmopolitan procotton procourt procrastinate procrastinating procrastinatingly procrastination procrastinative procrastinatively procrastinator procrastinatory procreant procreate procreation procreative procreativeness procreator procreatory procreatress procreatrix procremation Procris procritic procritique Procrustean Procrusteanism Procrusteanize Procrustes procrypsis procryptic procryptically proctal proctalgia proctalgy proctatresia proctatresy proctectasia proctectomy procteurynter proctitis proctocele proctoclysis proctocolitis proctocolonoscopy proctocystoplasty proctocystotomy proctodaeal proctodaeum proctodynia proctoelytroplastic proctologic proctological proctologist proctology proctoparalysis proctoplastic proctoplasty proctoplegia proctopolypus proctoptoma proctoptosis proctor proctorage proctoral proctorial proctorially proctorical proctorization proctorize proctorling proctorrhagia proctorrhaphy proctorrhea proctorship proctoscope proctoscopic proctoscopy proctosigmoidectomy proctosigmoiditis proctospasm proctostenosis proctostomy proctotome proctotomy proctotresia proctotrypid Proctotrypidae proctotrypoid Proctotrypoidea proctovalvotomy Proculian procumbent procurable procuracy procural procurance procurate procuration procurative procurator procuratorate procuratorial procuratorship procuratory procuratrix procure procurement procurer procuress procurrent procursive procurvation procurved Procyon Procyonidae procyoniform Procyoniformia Procyoninae procyonine proczarist prod prodatary prodder proddle prodecoration prodefault prodefiance prodelay prodelision prodemocratic Prodenia prodenominational prodentine prodeportation prodespotic prodespotism prodialogue prodigal prodigalish prodigalism prodigality prodigalize prodigally prodigiosity prodigious prodigiously prodigiousness prodigus prodigy prodisarmament prodisplay prodissoconch prodissolution prodistribution prodition proditorious proditoriously prodivision prodivorce prodproof prodramatic prodroma prodromal prodromatic prodromatically prodrome prodromic prodromous prodromus producal produce produceable produceableness produced producent producer producership producibility producible producibleness product producted productibility productible productid Productidae productile production productional productionist productive productively productiveness productivity productoid productor productory productress Productus proecclesiastical proeconomy proeducation proeducational proegumenal proelectric proelectrical proelectrification proelectrocution proelimination proem proembryo proembryonic proemial proemium proemployee proemptosis proenforcement proenlargement proenzym proenzyme proepimeron proepiscopist proepisternum proequality proethical proethnic proethnically proetid Proetidae Proetus proevolution proevolutionist proexamination proexecutive proexemption proexercise proexperiment proexpert proexporting proexposure proextension proextravagance prof profaculty profanable profanableness profanably profanation profanatory profanchise profane profanely profanement profaneness profaner profanism profanity profanize profarmer profection profectional profectitious profederation profeminism profeminist proferment profert profess professable professed professedly profession professional professionalism professionalist professionality professionalization professionalize professionally professionist professionize professionless professive professively professor professorate professordom professoress professorial professorialism professorially professoriate professorlike professorling professorship professory proffer profferer proficience proficiency proficient proficiently proficientness profiction proficuous proficuously profile profiler profilist profilograph profit profitability profitable profitableness profitably profiteer profiteering profiter profiting profitless profitlessly profitlessness profitmonger profitmongering profitproof proflated proflavine profligacy profligate profligately profligateness profligation proflogger profluence profluent profluvious profluvium proforeign profound profoundly profoundness profraternity profugate profulgent profunda profundity profuse profusely profuseness profusion profusive profusively profusiveness prog progambling progamete progamic proganosaur Proganosauria progenerate progeneration progenerative progenital progenitive progenitiveness progenitor progenitorial progenitorship progenitress progenitrix progeniture progenity progeny progeotropic progeotropism progeria progermination progestational progesterone progestin progger proglottic proglottid proglottidean proglottis prognathi prognathic prognathism prognathous prognathy progne prognose prognosis prognostic prognosticable prognostically prognosticate prognostication prognosticative prognosticator prognosticatory progoneate progospel progovernment program programist programistic programma programmar programmatic programmatically programmatist programmer progrede progrediency progredient progress progresser progression progressional progressionally progressionary progressionism progressionist progressism progressist progressive progressively progressiveness progressivism progressivist progressivity progressor proguardian Progymnasium progymnosperm progymnospermic progymnospermous progypsy prohaste prohibit prohibiter prohibition prohibitionary prohibitionism prohibitionist prohibitive prohibitively prohibitiveness prohibitor prohibitorily prohibitory proholiday prohostility prohuman prohumanistic prohydrotropic prohydrotropism proidealistic proimmunity proinclusion proincrease proindemnity proindustrial proinjunction proinnovationist proinquiry proinsurance prointervention proinvestment proirrigation projacient project projectable projectedly projectile projecting projectingly projection projectional projectionist projective projectively projectivity projector projectress projectrix projecture projicience projicient projiciently projournalistic projudicial proke prokeimenon proker prokindergarten proklausis prolabium prolabor prolacrosse prolactin prolamin prolan prolapse prolapsus prolarva prolarval prolate prolately prolateness prolation prolative prolatively proleague proleaguer prolectite proleg prolegate prolegislative prolegomena prolegomenal prolegomenary prolegomenist prolegomenon prolegomenous proleniency prolepsis proleptic proleptical proleptically proleptics proletairism proletarian proletarianism proletarianization proletarianize proletarianly proletarianness proletariat proletariatism proletarization proletarize proletary proletcult proleucocyte proleukocyte prolicense prolicidal prolicide proliferant proliferate proliferation proliferative proliferous proliferously prolific prolificacy prolifical prolifically prolificalness prolificate prolification prolificity prolificly prolificness prolificy prolify proligerous proline proliquor proliterary proliturgical proliturgist prolix prolixity prolixly prolixness prolocution prolocutor prolocutorship prolocutress prolocutrix prologist prologize prologizer prologos prologue prologuelike prologuer prologuist prologuize prologuizer prologus prolong prolongable prolongableness prolongably prolongate prolongation prolonge prolonger prolongment prolusion prolusionize prolusory prolyl promachinery promachos promagisterial promagistracy promagistrate promajority promammal Promammalia promammalian promarriage promatrimonial promatrimonialist promaximum promemorial promenade promenader promenaderess promercantile promercy promerger promeristem promerit promeritor Promethea Promethean Prometheus promethium promic promilitarism promilitarist promilitary prominence prominency prominent prominently prominimum proministry prominority promisable promiscuity promiscuous promiscuously promiscuousness promise promisee promiseful promiseless promisemonger promiseproof promiser promising promisingly promisingness promisor promissionary promissive promissor promissorily promissory promitosis promittor promnesia promoderation promoderationist promodernist promodernistic promonarchic promonarchical promonarchicalness promonarchist promonopolist promonopoly promontoried promontory promoral promorph promorphological promorphologically promorphologist promorphology promotable promote promotement promoter promotion promotional promotive promotiveness promotor promotorial promotress promotrix promovable promovent prompt promptbook prompter promptitude promptive promptly promptness promptress promptuary prompture promulgate promulgation promulgator promulge promulger promuscidate promuscis promycelial promycelium promythic pronaos pronate pronation pronational pronationalism pronationalist pronationalistic pronative pronatoflexor pronator pronaval pronavy prone pronegotiation pronegro pronegroism pronely proneness pronephric pronephridiostome pronephron pronephros proneur prong prongbuck pronged pronger pronghorn pronglike pronic pronograde pronominal pronominalize pronominally pronomination pronotal pronotum pronoun pronounal pronounce pronounceable pronounced pronouncedly pronouncement pronounceness pronouncer pronpl pronto Pronuba pronuba pronubial pronuclear pronucleus pronumber pronunciability pronunciable pronuncial pronunciamento pronunciation pronunciative pronunciator pronunciatory pronymph pronymphal proo prooemiac prooemion prooemium proof proofer proofful proofing proofless prooflessly proofness proofread proofreader proofreading proofroom proofy prop propadiene propaedeutic propaedeutical propaedeutics propagability propagable propagableness propagand propaganda propagandic propagandism propagandist propagandistic propagandistically propagandize propagate propagation propagational propagative propagator propagatory propagatress propago propagulum propale propalinal propane propanedicarboxylic propanol propanone propapist proparasceve propargyl propargylic Proparia proparian proparliamental proparoxytone proparoxytonic proparticipation propatagial propatagian propatagium propatriotic propatriotism propatronage propayment propellable propellant propellent propeller propelment propend propendent propene propenoic propense propensely propenseness propension propensitude propensity propenyl propenylic proper properispome properispomenon properitoneal properly properness propertied property propertyless propertyship propessimism propessimist prophase prophasis prophecy prophecymonger prophesiable prophesier prophesy prophet prophetess prophethood prophetic prophetical propheticality prophetically propheticalness propheticism propheticly prophetism prophetize prophetless prophetlike prophetry prophetship prophilosophical prophloem prophoric prophototropic prophototropism prophylactic prophylactical prophylactically prophylaxis prophylaxy prophyll prophyllum propination propine propinoic propinquant propinque propinquity propinquous propiolaldehyde propiolate propiolic propionate propione Propionibacterieae Propionibacterium propionic propionitril propionitrile propionyl Propithecus propitiable propitial propitiate propitiatingly propitiation propitiative propitiator propitiatorily propitiatory propitious propitiously propitiousness proplasm proplasma proplastic propless propleural propleuron proplex proplexus Propliopithecus propodeal propodeon propodeum propodial propodiale propodite propoditic propodium propolis propolitical propolization propolize propone proponement proponent proponer propons Propontic propooling propopery proportion proportionability proportionable proportionableness proportionably proportional proportionalism proportionality proportionally proportionate proportionately proportionateness proportioned proportioner proportionless proportionment proposable proposal proposant propose proposer proposition propositional propositionally propositionize propositus propound propounder propoundment propoxy proppage propper propraetor propraetorial propraetorian proprecedent propriation proprietage proprietarian proprietariat proprietarily proprietary proprietor proprietorial proprietorially proprietorship proprietory proprietous proprietress proprietrix propriety proprioception proprioceptive proprioceptor propriospinal proprium proprivilege proproctor proprofit proprovincial proprovost props propterygial propterygium proptosed proptosis propublication propublicity propugnacled propugnaculum propugnation propugnator propugner propulsation propulsatory propulsion propulsity propulsive propulsor propulsory propunishment propupa propupal propurchase Propus propwood propygidium propyl propylacetic propylaeum propylamine propylation propylene propylic propylidene propylite propylitic propylitization propylon propyne propynoic proquaestor proracing prorailroad prorata proratable prorate proration prore proreader prorealism prorealist prorealistic proreality prorean prorebate prorebel prorecall proreciprocation prorecognition proreconciliation prorector prorectorate proredemption proreduction proreferendum proreform proreformist proregent prorelease Proreptilia proreptilian proreption prorepublican proresearch proreservationist proresignation prorestoration prorestriction prorevision prorevisionist prorevolution prorevolutionary prorevolutionist prorhinal Prorhipidoglossomorpha proritual proritualistic prorogate prorogation prorogator prorogue proroguer proromance proromantic proromanticism proroyal proroyalty prorrhesis prorsad prorsal proruption prosabbath prosabbatical prosacral prosaic prosaical prosaically prosaicalness prosaicism prosaicness prosaism prosaist prosar Prosarthri prosateur proscapula proscapular proscenium proscholastic proschool proscientific proscolecine proscolex proscribable proscribe proscriber proscript proscription proscriptional proscriptionist proscriptive proscriptively proscriptiveness proscutellar proscutellum proscynemata prose prosecrecy prosecretin prosect prosection prosector prosectorial prosectorium prosectorship prosecutable prosecute prosecution prosecutor prosecutrix proselenic proselike proselyte proselyter proselytical proselytingly proselytism proselytist proselytistic proselytization proselytize proselytizer proseman proseminar proseminary proseminate prosemination prosencephalic prosencephalon prosenchyma prosenchymatous proseneschal proser Proserpinaca prosethmoid proseucha proseuche prosification prosifier prosify prosiliency prosilient prosiliently prosilverite prosily Prosimiae prosimian prosiness prosing prosingly prosiphon prosiphonal prosiphonate prosish prosist proslambanomenos proslave proslaver proslavery proslaveryism prosneusis proso prosobranch Prosobranchia Prosobranchiata prosobranchiate prosocele prosodal prosode prosodemic prosodetic prosodiac prosodiacal prosodiacally prosodial prosodially prosodian prosodic prosodical prosodically prosodion prosodist prosodus prosody prosogaster prosogyrate prosogyrous prosoma prosomal prosomatic prosonomasia prosopalgia prosopalgic prosopantritis prosopectasia prosophist prosopic prosopically Prosopis prosopite Prosopium prosoplasia prosopography prosopon prosoponeuralgia prosopoplegia prosopoplegic prosopopoeia prosopopoeial prosoposchisis prosopospasm prosopotocia prosopyl prosopyle prosorus prospect prospection prospective prospectively prospectiveness prospectless prospector prospectus prospectusless prospeculation prosper prosperation prosperity prosperous prosperously prosperousness prospicience prosporangium prosport pross prossy prostatauxe prostate prostatectomy prostatelcosis prostatic prostaticovesical prostatism prostatitic prostatitis prostatocystitis prostatocystotomy prostatodynia prostatolith prostatomegaly prostatometer prostatomyomectomy prostatorrhea prostatorrhoea prostatotomy prostatovesical prostatovesiculectomy prostatovesiculitis prostemmate prostemmatic prosternal prosternate prosternum prostheca prosthenic prosthesis prosthetic prosthetically prosthetics prosthetist prosthion prosthionic prosthodontia prosthodontist Prostigmin prostitute prostitutely prostitution prostitutor prostomial prostomiate prostomium prostrate prostration prostrative prostrator prostrike prostyle prostylos prosubmission prosubscription prosubstantive prosubstitution prosuffrage prosupervision prosupport prosurgical prosurrender prosy prosyllogism prosyndicalism prosyndicalist protactic protactinium protagon protagonism protagonist Protagorean Protagoreanism protalbumose protamine protandric protandrism protandrous protandrously protandry protanomal protanomalous protanope protanopia protanopic protargentum protargin Protargol protariff protarsal protarsus protasis protaspis protatic protatically protax protaxation protaxial protaxis prote Protea protea Proteaceae proteaceous protead protean proteanly proteanwise protease protechnical protect protectant protectible protecting protectingly protectingness protection protectional protectionate protectionism protectionist protectionize protectionship protective protectively protectiveness Protectograph protector protectoral protectorate protectorial protectorian protectorless protectorship protectory protectress protectrix protege protegee protegulum proteic Proteida Proteidae proteide proteidean proteidogenous proteiform protein proteinaceous proteinase proteinic proteinochromogen proteinous proteinuria Proteles Protelidae Protelytroptera protelytropteran protelytropteron protelytropterous protemperance protempirical protemporaneous protend protension protensity protensive protensively proteoclastic proteogenous proteolysis proteolytic proteopectic proteopexic proteopexis proteopexy proteosaurid Proteosauridae Proteosaurus proteose Proteosoma proteosomal proteosome proteosuria protephemeroid Protephemeroidea proterandrous proterandrousness proterandry proteranthous proterobase proteroglyph Proteroglypha proteroglyphic proteroglyphous proterogynous proterogyny proterothesis proterotype Proterozoic protervity protest protestable protestancy protestant Protestantish Protestantishly protestantism Protestantize Protestantlike Protestantly protestation protestator protestatory protester protestingly protestive protestor protetrarch Proteus protevangel protevangelion protevangelium protext prothalamia prothalamion prothalamium prothallia prothallial prothallic prothalline prothallium prothalloid prothallus protheatrical protheca prothesis prothetic prothetical prothetically prothonotarial prothonotariat prothonotary prothonotaryship prothoracic prothorax prothrift prothrombin prothrombogen prothyl prothysteron protide protiodide protist Protista protistan protistic protistological protistologist protistology protiston Protium protium proto protoactinium protoalbumose protoamphibian protoanthropic protoapostate protoarchitect Protoascales Protoascomycetes protobacco Protobasidii Protobasidiomycetes protobasidiomycetous protobasidium protobishop protoblast protoblastic protoblattoid Protoblattoidea Protobranchia Protobranchiata protobranchiate protocalcium protocanonical Protocaris protocaseose protocatechualdehyde protocatechuic Protoceras Protoceratidae Protoceratops protocercal protocerebral protocerebrum protochemist protochemistry protochloride protochlorophyll Protochorda Protochordata protochordate protochromium protochronicler protocitizen protoclastic protocneme Protococcaceae protococcaceous protococcal Protococcales protococcoid Protococcus protocol protocolar protocolary Protocoleoptera protocoleopteran protocoleopteron protocoleopterous protocolist protocolization protocolize protoconch protoconchal protocone protoconid protoconule protoconulid protocopper protocorm protodeacon protoderm protodevil Protodonata protodonatan protodonate protodont Protodonta protodramatic protodynastic protoelastose protoepiphyte protoforaminifer protoforester protogaster protogelatose protogenal protogenes protogenesis protogenetic protogenic protogenist Protogeometric protogine protoglobulose protogod protogonous protogospel protograph protogynous protogyny protohematoblast Protohemiptera protohemipteran protohemipteron protohemipterous protoheresiarch Protohippus protohistorian protohistoric protohistory protohomo protohuman Protohydra protohydrogen Protohymenoptera protohymenopteran protohymenopteron protohymenopterous protoiron protoleration protoleucocyte protoleukocyte protolithic protoliturgic protolog protologist protoloph protoma protomagister protomagnate protomagnesium protomala protomalal protomalar protomammal protomammalian protomanganese protomartyr Protomastigida protome protomeristem protomerite protomeritic protometal protometallic protometaphrast Protominobacter Protomonadina protomonostelic protomorph protomorphic Protomycetales protomyosinose proton protone protonegroid protonema protonemal protonematal protonematoid protoneme Protonemertini protonephridial protonephridium protonephros protoneuron protoneurone protonic protonickel protonitrate protonotater protonym protonymph protonymphal protopapas protopappas protoparent protopathia protopathic protopathy protopatriarchal protopatrician protopattern protopectin protopectinase protopepsia Protoperlaria protoperlarian protophilosophic protophloem protophyll Protophyta protophyte protophytic protopin protopine protoplasm protoplasma protoplasmal protoplasmatic protoplasmic protoplast protoplastic protopod protopodial protopodite protopoditic protopoetic protopope protoporphyrin protopragmatic protopresbyter protopresbytery protoprism protoproteose protoprotestant protopteran Protopteridae protopteridophyte protopterous Protopterus protopyramid protore protorebel protoreligious protoreptilian Protorohippus protorosaur Protorosauria protorosaurian Protorosauridae protorosauroid Protorosaurus Protorthoptera protorthopteran protorthopteron protorthopterous protosalt protosaurian protoscientific Protoselachii protosilicate protosilicon protosinner Protosiphon Protosiphonaceae protosiphonaceous protosocial protosolution protospasm Protosphargis Protospondyli protospore Protostega Protostegidae protostele protostelic protostome protostrontium protosulphate protosulphide protosyntonose prototaxites prototheca protothecal prototheme protothere Prototheria prototherian prototitanium Prototracheata prototraitor prototroch prototrochal prototrophic prototypal prototype prototypic prototypical prototypically prototypographer prototyrant protovanadium protoveratrine protovertebra protovertebral protovestiary protovillain protovum protoxide protoxylem Protozoa protozoacidal protozoacide protozoal protozoan protozoea protozoean protozoiasis protozoic protozoological protozoologist protozoology protozoon protozoonal Protracheata protracheate protract protracted protractedly protractedness protracter protractible protractile protractility protraction protractive protractor protrade protradition protraditional protragedy protragical protragie protransfer protranslation protransubstantiation protravel protreasurer protreaty Protremata protreptic protreptical protriaene protropical protrudable protrude protrudent protrusible protrusile protrusion protrusive protrusively protrusiveness protuberance protuberancy protuberant protuberantial protuberantly protuberantness protuberate protuberosity protuberous Protura proturan protutor protutory protyl protyle Protylopus protype proudful proudhearted proudish proudishly proudling proudly proudness prouniformity prounion prounionist prouniversity proustite provability provable provableness provably provaccinist provand provant provascular prove provect provection proved proveditor provedly provedor provedore proven provenance Provencal Provencalize Provence Provencial provender provenience provenient provenly proventricular proventricule proventriculus prover proverb proverbial proverbialism proverbialist proverbialize proverbially proverbic proverbiologist proverbiology proverbize proverblike provicar provicariate providable providance provide provided providence provident providential providentialism providentially providently providentness provider providing providore providoring province provincial provincialate provincialism provincialist provinciality provincialization provincialize provincially provincialship provinciate provinculum provine proving provingly provision provisional provisionality provisionally provisionalness provisionary provisioner provisioneress provisionless provisionment provisive proviso provisor provisorily provisorship provisory provitamin provivisection provivisectionist provocant provocation provocational provocative provocatively provocativeness provocator provocatory provokable provoke provokee provoker provoking provokingly provokingness provolunteering provost provostal provostess provostorial provostry provostship prow prowar prowarden prowaterpower prowed prowersite prowess prowessed prowessful prowl prowler prowling prowlingly proxenet proxenete proxenetism proxenos proxenus proxeny proxically proximad proximal proximally proximate proximately proximateness proximation proximity proximo proximobuccal proximolabial proximolingual proxy proxyship proxysm prozone prozoning prozygapophysis prozymite prude prudelike prudely Prudence prudence prudent prudential prudentialism prudentialist prudentiality prudentially prudentialness prudently prudery prudish prudishly prudishness prudist prudity Prudy Prue pruh pruinate pruinescence pruinose pruinous prulaurasin prunable prunableness prunably Prunaceae prunase prunasin prune prunell Prunella prunella prunelle Prunellidae prunello pruner prunetin prunetol pruniferous pruniform pruning prunitrin prunt prunted Prunus prurience pruriency prurient pruriently pruriginous prurigo pruriousness pruritic pruritus prusiano Prussian Prussianism Prussianization Prussianize Prussianizer prussiate prussic Prussification Prussify prut prutah pry pryer prying pryingly pryingness pryler pryproof pryse prytaneum prytanis prytanize prytany psalis psalm psalmic psalmist psalmister psalmistry psalmless psalmodial psalmodic psalmodical psalmodist psalmodize psalmody psalmograph psalmographer psalmography psalmy psaloid psalter psalterial psalterian psalterion psalterist psalterium psaltery psaltes psaltress psammite psammitic psammocarcinoma psammocharid Psammocharidae psammogenous psammolithic psammologist psammology psammoma psammophile psammophilous Psammophis psammophyte psammophytic psammosarcoma psammotherapy psammous Psaronius pschent Psedera Pselaphidae Pselaphus psellism psellismus psephism psephisma psephite psephitic psephomancy Psephurus Psetta pseudaconine pseudaconitine pseudacusis pseudalveolar pseudambulacral pseudambulacrum pseudamoeboid pseudamphora pseudandry pseudangina pseudankylosis pseudaphia pseudaposematic pseudaposporous pseudapospory pseudapostle pseudarachnidan pseudarthrosis pseudataxic pseudatoll pseudaxine pseudaxis Pseudechis pseudelephant pseudelminth pseudelytron pseudembryo pseudembryonic pseudencephalic pseudencephalus pseudepigraph pseudepigrapha pseudepigraphal pseudepigraphic pseudepigraphical pseudepigraphous pseudepigraphy pseudepiploic pseudepiploon pseudepiscopacy pseudepiscopy pseudepisematic pseudesthesia pseudhalteres pseudhemal pseudimaginal pseudimago pseudisodomum pseudo pseudoacaccia pseudoacademic pseudoacademical pseudoaccidental pseudoacid pseudoaconitine pseudoacromegaly pseudoadiabatic pseudoaesthetic pseudoaffectionate pseudoalkaloid pseudoalum pseudoalveolar pseudoamateurish pseudoamatory pseudoanaphylactic pseudoanaphylaxis pseudoanatomic pseudoanatomical pseudoancestral pseudoanemia pseudoanemic pseudoangelic pseudoangina pseudoankylosis pseudoanthorine pseudoanthropoid pseudoanthropological pseudoanthropology pseudoantique pseudoapologetic pseudoapoplectic pseudoapoplexy pseudoappendicitis pseudoaquatic pseudoarchaic pseudoarchaism pseudoarchaist pseudoaristocratic pseudoarthrosis pseudoarticulation pseudoartistic pseudoascetic pseudoastringent pseudoasymmetrical pseudoasymmetry pseudoataxia pseudobacterium pseudobasidium pseudobenevolent pseudobenthonic pseudobenthos pseudobinary pseudobiological pseudoblepsia pseudoblepsis pseudobrachial pseudobrachium pseudobranch pseudobranchia pseudobranchial pseudobranchiate Pseudobranchus pseudobrookite pseudobrotherly pseudobulb pseudobulbar pseudobulbil pseudobulbous pseudobutylene pseudocandid pseudocapitulum pseudocarbamide pseudocarcinoid pseudocarp pseudocarpous pseudocartilaginous pseudocele pseudocelian pseudocelic pseudocellus pseudocentric pseudocentrous pseudocentrum Pseudoceratites pseudoceratitic pseudocercaria pseudoceryl pseudocharitable pseudochemical pseudochina pseudochromesthesia pseudochromia pseudochromosome pseudochronism pseudochronologist pseudochrysalis pseudochrysolite pseudochylous pseudocirrhosis pseudoclassic pseudoclassical pseudoclassicism pseudoclerical Pseudococcinae Pseudococcus pseudococtate pseudocollegiate pseudocolumella pseudocolumellar pseudocommissure pseudocommisural pseudocompetitive pseudoconcha pseudoconclude pseudocone pseudoconglomerate pseudoconglomeration pseudoconhydrine pseudoconjugation pseudoconservative pseudocorneous pseudocortex pseudocosta pseudocotyledon pseudocotyledonal pseudocritical pseudocroup pseudocrystalline pseudocubic pseudocultivated pseudocultural pseudocumene pseudocumenyl pseudocumidine pseudocumyl pseudocyclosis pseudocyesis pseudocyst pseudodeltidium pseudodementia pseudodemocratic pseudoderm pseudodermic pseudodiagnosis pseudodiastolic pseudodiphtheria pseudodiphtheritic pseudodipteral pseudodipterally pseudodipteros pseudodont pseudodox pseudodoxal pseudodoxy pseudodramatic pseudodysentery pseudoedema pseudoelectoral pseudoembryo pseudoembryonic pseudoemotional pseudoencephalitic pseudoenthusiastic pseudoephedrine pseudoepiscopal pseudoequalitarian pseudoerotic pseudoeroticism pseudoerysipelas pseudoerysipelatous pseudoerythrin pseudoethical pseudoetymological pseudoeugenics pseudoevangelical pseudofamous pseudofarcy pseudofeminine pseudofever pseudofeverish pseudofilaria pseudofilarian pseudofinal pseudofluctuation pseudofluorescence pseudofoliaceous pseudoform pseudofossil pseudogalena pseudoganglion pseudogaseous pseudogaster pseudogastrula pseudogeneral pseudogeneric pseudogenerous pseudogenteel pseudogenus pseudogeometry pseudogermanic pseudogeusia pseudogeustia pseudoglanders pseudoglioma pseudoglobulin pseudoglottis pseudograph pseudographeme pseudographer pseudographia pseudographize pseudography pseudograsserie Pseudogryphus pseudogyne pseudogynous pseudogyny pseudogyrate pseudohallucination pseudohallucinatory pseudohalogen pseudohemal pseudohermaphrodite pseudohermaphroditic pseudohermaphroditism pseudoheroic pseudohexagonal pseudohistoric pseudohistorical pseudoholoptic pseudohuman pseudohydrophobia pseudohyoscyamine pseudohypertrophic pseudohypertrophy pseudoidentical pseudoimpartial pseudoindependent pseudoinfluenza pseudoinsane pseudoinsoluble pseudoisatin pseudoism pseudoisomer pseudoisomeric pseudoisomerism pseudoisotropy pseudojervine pseudolabial pseudolabium pseudolalia Pseudolamellibranchia Pseudolamellibranchiata pseudolamellibranchiate pseudolaminated Pseudolarix pseudolateral pseudolatry pseudolegal pseudolegendary pseudoleucite pseudoleucocyte pseudoleukemia pseudoleukemic pseudoliberal pseudolichen pseudolinguistic pseudoliterary pseudolobar pseudological pseudologically pseudologist pseudologue pseudology pseudolunule pseudomalachite pseudomalaria pseudomancy pseudomania pseudomaniac pseudomantic pseudomantist pseudomasculine pseudomedical pseudomedieval pseudomelanosis pseudomembrane pseudomembranous pseudomeningitis pseudomenstruation pseudomer pseudomeric pseudomerism pseudomery pseudometallic pseudometameric pseudometamerism pseudomica pseudomilitarist pseudomilitaristic pseudomilitary pseudoministerial pseudomiraculous pseudomitotic pseudomnesia pseudomodern pseudomodest Pseudomonas pseudomonastic pseudomonoclinic pseudomonocotyledonous pseudomonocyclic pseudomonotropy pseudomoral pseudomorph pseudomorphia pseudomorphic pseudomorphine pseudomorphism pseudomorphose pseudomorphosis pseudomorphous pseudomorula pseudomorular pseudomucin pseudomucoid pseudomultilocular pseudomultiseptate pseudomythical pseudonarcotic pseudonational pseudonavicella pseudonavicellar pseudonavicula pseudonavicular pseudoneuropter Pseudoneuroptera pseudoneuropteran pseudoneuropterous pseudonitrole pseudonitrosite pseudonuclein pseudonucleolus pseudonychium pseudonym pseudonymal pseudonymic pseudonymity pseudonymous pseudonymously pseudonymousness pseudonymuncle pseudonymuncule pseudopapaverine pseudoparalysis pseudoparalytic pseudoparaplegia pseudoparasitic pseudoparasitism pseudoparenchyma pseudoparenchymatous pseudoparenchyme pseudoparesis pseudoparthenogenesis pseudopatriotic pseudopediform pseudopelletierine pseudopercular pseudoperculate pseudoperculum pseudoperianth pseudoperidium pseudoperiodic pseudoperipteral pseudopermanent pseudoperoxide pseudoperspective Pseudopeziza pseudophallic pseudophellandrene pseudophenanthrene pseudophenanthroline pseudophenocryst pseudophilanthropic pseudophilosophical Pseudophoenix pseudopionnotes pseudopious pseudoplasm pseudoplasma pseudoplasmodium pseudopneumonia pseudopod pseudopodal pseudopodia pseudopodial pseudopodian pseudopodiospore pseudopodium pseudopoetic pseudopoetical pseudopolitic pseudopolitical pseudopopular pseudopore pseudoporphyritic pseudopregnancy pseudopregnant pseudopriestly pseudoprimitive pseudoprimitivism pseudoprincely pseudoproboscis pseudoprofessional pseudoprofessorial pseudoprophetic pseudoprophetical pseudoprosperous pseudopsia pseudopsychological pseudoptics pseudoptosis pseudopupa pseudopupal pseudopurpurin pseudopyriform pseudoquinol pseudorabies pseudoracemic pseudoracemism pseudoramose pseudoramulus pseudorealistic pseudoreduction pseudoreformed pseudoregal pseudoreligious pseudoreminiscence pseudorganic pseudorheumatic pseudorhombohedral pseudoromantic pseudorunic pseudosacred pseudosacrilegious pseudosalt pseudosatirical pseudoscarlatina Pseudoscarus pseudoscholarly pseudoscholastic pseudoscientific Pseudoscines pseudoscinine pseudosclerosis pseudoscope pseudoscopic pseudoscopically pseudoscopy pseudoscorpion Pseudoscorpiones Pseudoscorpionida pseudoscutum pseudosematic pseudosensational pseudoseptate pseudoservile pseudosessile pseudosiphonal pseudosiphuncal pseudoskeletal pseudoskeleton pseudoskink pseudosmia pseudosocial pseudosocialistic pseudosolution pseudosoph pseudosopher pseudosophical pseudosophist pseudosophy pseudospectral pseudosperm pseudospermic pseudospermium pseudospermous pseudosphere pseudospherical pseudospiracle pseudospiritual pseudosporangium pseudospore pseudosquamate pseudostalactite pseudostalactitical pseudostalagmite pseudostalagmitical pseudostereoscope pseudostereoscopic pseudostereoscopism pseudostigma pseudostigmatic pseudostoma pseudostomatous pseudostomous pseudostratum pseudosubtle Pseudosuchia pseudosuchian pseudosweating pseudosyllogism pseudosymmetric pseudosymmetrical pseudosymmetry pseudosymptomatic pseudosyphilis pseudosyphilitic pseudotabes pseudotachylite pseudotetanus pseudotetragonal Pseudotetramera pseudotetrameral pseudotetramerous pseudotrachea pseudotracheal pseudotribal pseudotributary Pseudotrimera pseudotrimeral pseudotrimerous pseudotropine Pseudotsuga pseudotubercular pseudotuberculosis pseudotuberculous pseudoturbinal pseudotyphoid pseudoval pseudovarian pseudovary pseudovelar pseudovelum pseudoventricle pseudoviaduct pseudoviperine pseudoviscosity pseudoviscous pseudovolcanic pseudovolcano pseudovum pseudowhorl pseudoxanthine pseudoyohimbine pseudozealot pseudozoea pseudozoogloeal psha Pshav pshaw psi Psidium psilanthropic psilanthropism psilanthropist psilanthropy psiloceran Psiloceras psiloceratan psiloceratid Psiloceratidae psiloi psilology psilomelane psilomelanic Psilophytales psilophyte Psilophyton psilosis psilosopher psilosophy Psilotaceae psilotaceous psilothrum psilotic Psilotum psithurism Psithyrus psittaceous psittaceously Psittaci Psittacidae Psittaciformes Psittacinae psittacine psittacinite psittacism psittacistic Psittacomorphae psittacomorphic psittacosis Psittacus psoadic psoas psoatic psocid Psocidae psocine psoitis psomophagic psomophagist psomophagy psora Psoralea psoriasic psoriasiform psoriasis psoriatic psoriatiform psoric psoroid Psorophora psorophthalmia psorophthalmic Psoroptes psoroptic psorosis psorosperm psorospermial psorospermiasis psorospermic psorospermiform psorospermosis psorous pssimistical pst psych psychagogic psychagogos psychagogue psychagogy psychal psychalgia psychanalysis psychanalysist psychanalytic psychasthenia psychasthenic Psyche psyche Psychean psycheometry psychesthesia psychesthetic psychiasis psychiater psychiatria psychiatric psychiatrical psychiatrically psychiatrist psychiatrize psychiatry psychic psychical psychically Psychichthys psychicism psychicist psychics psychid Psychidae psychism psychist psychoanalysis psychoanalyst psychoanalytic psychoanalytical psychoanalytically psychoanalyze psychoanalyzer psychoautomatic psychobiochemistry psychobiologic psychobiological psychobiology psychobiotic psychocatharsis psychoclinic psychoclinical psychoclinicist Psychoda psychodiagnostics Psychodidae psychodispositional psychodrama psychodynamic psychodynamics psychoeducational psychoepilepsy psychoethical psychofugal psychogalvanic psychogalvanometer psychogenesis psychogenetic psychogenetical psychogenetically psychogenetics psychogenic psychogeny psychognosis psychognostic psychognosy psychogonic psychogonical psychogony psychogram psychograph psychographer psychographic psychographist psychography psychoid psychokinesia psychokinesis psychokinetic psychokyme psycholepsy psycholeptic psychologer psychologian psychologic psychological psychologically psychologics psychologism psychologist psychologize psychologue psychology psychomachy psychomancy psychomantic psychometer psychometric psychometrical psychometrically psychometrician psychometrics psychometrist psychometrize psychometry psychomonism psychomoral psychomorphic psychomorphism psychomotility psychomotor psychon psychoneural psychoneurological psychoneurosis psychoneurotic psychonomic psychonomics psychonomy psychony psychoorganic psychopannychian psychopannychism psychopannychist psychopannychistic psychopannychy psychopanychite psychopath psychopathia psychopathic psychopathist psychopathologic psychopathological psychopathologist psychopathy psychopetal psychophobia psychophysic psychophysical psychophysically psychophysicist psychophysics psychophysiologic psychophysiological psychophysiologically psychophysiologist psychophysiology psychoplasm psychopomp psychopompos psychorealism psychorealist psychorealistic psychoreflex psychorhythm psychorhythmia psychorhythmic psychorhythmical psychorhythmically psychorrhagic psychorrhagy psychosarcous psychosensorial psychosensory psychoses psychosexual psychosexuality psychosexually psychosis psychosocial psychosomatic psychosomatics psychosome psychosophy psychostasy psychostatic psychostatical psychostatically psychostatics psychosurgeon psychosurgery psychosynthesis psychosynthetic psychotaxis psychotechnical psychotechnician psychotechnics psychotechnological psychotechnology psychotheism psychotherapeutic psychotherapeutical psychotherapeutics psychotherapeutist psychotherapist psychotherapy psychotic Psychotria psychotrine psychovital Psychozoic psychroesthesia psychrograph psychrometer psychrometric psychrometrical psychrometry psychrophile psychrophilic psychrophobia psychrophore psychrophyte psychurgy psykter Psylla psylla psyllid Psyllidae psyllium ptarmic Ptarmica ptarmical ptarmigan Ptelea Ptenoglossa ptenoglossate Pteranodon pteranodont Pteranodontidae pteraspid Pteraspidae Pteraspis ptereal pterergate Pterian pteric Pterichthyodes Pterichthys pterideous pteridium pteridography pteridoid pteridological pteridologist pteridology pteridophilism pteridophilist pteridophilistic Pteridophyta pteridophyte pteridophytic pteridophytous pteridosperm Pteridospermae Pteridospermaphyta pteridospermaphytic pteridospermous pterion Pteris Pterobranchia pterobranchiate pterocarpous Pterocarpus Pterocarya Pterocaulon Pterocera Pteroceras Pterocles Pterocletes Pteroclidae Pteroclomorphae pteroclomorphic pterodactyl Pterodactyli pterodactylian pterodactylic pterodactylid Pterodactylidae pterodactyloid pterodactylous Pterodactylus pterographer pterographic pterographical pterography pteroid pteroma pteromalid Pteromalidae Pteromys pteropaedes pteropaedic pteropegal pteropegous pteropegum pterophorid Pterophoridae Pterophorus Pterophryne pteropid Pteropidae pteropine pteropod Pteropoda pteropodal pteropodan pteropodial Pteropodidae pteropodium pteropodous Pteropsida Pteropus pterosaur Pterosauri Pterosauria pterosaurian pterospermous Pterospora Pterostemon Pterostemonaceae pterostigma pterostigmal pterostigmatic pterostigmatical pterotheca pterothorax pterotic pteroylglutamic pterygial pterygiophore pterygium pterygobranchiate pterygode pterygodum Pterygogenea pterygoid pterygoidal pterygoidean pterygomalar pterygomandibular pterygomaxillary pterygopalatal pterygopalatine pterygopharyngeal pterygopharyngean pterygophore pterygopodium pterygoquadrate pterygosphenoid pterygospinous pterygostaphyline Pterygota pterygote pterygotous pterygotrabecular Pterygotus pteryla pterylographic pterylographical pterylography pterylological pterylology pterylosis Ptilichthyidae Ptiliidae Ptilimnium ptilinal ptilinum Ptilocercus Ptilonorhynchidae Ptilonorhynchinae ptilopaedes ptilopaedic ptilosis Ptilota ptinid Ptinidae ptinoid Ptinus ptisan ptochocracy ptochogony ptochology Ptolemaean Ptolemaian Ptolemaic Ptolemaical Ptolemaism Ptolemaist Ptolemean Ptolemy ptomain ptomaine ptomainic ptomatropine ptosis ptotic ptyalagogic ptyalagogue ptyalectasis ptyalin ptyalism ptyalize ptyalocele ptyalogenic ptyalolith ptyalolithiasis ptyalorrhea Ptychoparia ptychoparid ptychopariid ptychopterygial ptychopterygium Ptychosperma ptysmagogue ptyxis pu pua puan pub pubal pubble puberal pubertal pubertic puberty puberulent puberulous pubes pubescence pubescency pubescent pubian pubic pubigerous pubiotomy pubis public Publican publican publicanism publication publichearted publicheartedness publicism publicist publicity publicize publicly publicness Publilian publish publishable publisher publisheress publishership publishment pubococcygeal pubofemoral puboiliac puboischiac puboischial puboischiatic puboprostatic puborectalis pubotibial pubourethral pubovesical Puccinia Pucciniaceae pucciniaceous puccinoid puccoon puce pucelage pucellas pucelle Puchanahua pucherite puchero puck pucka puckball pucker puckerbush puckerel puckerer puckermouth puckery puckfist puckish puckishly puckishness puckle pucklike puckling puckneedle puckrel puckster pud puddee puddening pudder pudding puddingberry puddinghead puddingheaded puddinghouse puddinglike puddingwife puddingy puddle puddled puddlelike puddler puddling puddly puddock puddy pudency pudenda pudendal pudendous pudendum pudent pudge pudgily pudginess pudgy pudiano pudibund pudibundity pudic pudical pudicitia pudicity pudsey pudsy Pudu pudu pueblito Pueblo pueblo Puebloan puebloization puebloize Puelche Puelchean Pueraria puerer puericulture puerile puerilely puerileness puerilism puerility puerman puerpera puerperal puerperalism puerperant puerperium puerperous puerpery puff puffback puffball puffbird puffed puffer puffery puffily puffin puffiness puffinet puffing puffingly Puffinus pufflet puffwig puffy pug pugged pugger puggi pugginess pugging puggish puggle puggree puggy pugh pugil pugilant pugilism pugilist pugilistic pugilistical pugilistically puglianite pugman pugmill pugmiller pugnacious pugnaciously pugnaciousness pugnacity Puinavi Puinavian Puinavis puisne puissance puissant puissantly puissantness puist puistie puja Pujunan puka pukatea pukateine puke pukeko puker pukeweed Pukhtun pukish pukishness pukras puku puky pul pulahan pulahanism pulasan pulaskite Pulaya Pulayan pulchrify pulchritude pulchritudinous pule pulegol pulegone puler Pulex pulghere puli Pulian pulicarious pulicat pulicene pulicid Pulicidae pulicidal pulicide pulicine pulicoid pulicose pulicosity pulicous puling pulingly pulish pulk pulka pull pullable pullback pullboat pulldevil pulldoo pulldown pulldrive pullen puller pullery pullet pulley pulleyless pulli Pullman Pullmanize pullorum pullulant pullulate pullulation pullus pulmobranchia pulmobranchial pulmobranchiate pulmocardiac pulmocutaneous pulmogastric pulmometer pulmometry pulmonal pulmonar Pulmonaria pulmonarian pulmonary Pulmonata pulmonate pulmonated pulmonectomy pulmonic pulmonifer Pulmonifera pulmoniferous pulmonitis Pulmotor pulmotracheal Pulmotrachearia pulmotracheary pulmotracheate pulp pulpaceous pulpal pulpalgia pulpamenta pulpboard pulpectomy pulpefaction pulper pulpifier pulpify pulpily pulpiness pulpit pulpital pulpitarian pulpiteer pulpiter pulpitful pulpitic pulpitical pulpitically pulpitis pulpitish pulpitism pulpitize pulpitless pulpitly pulpitolatry pulpitry pulpless pulplike pulpotomy pulpous pulpousness pulpstone pulpwood pulpy pulque pulsant pulsatance pulsate pulsatile pulsatility Pulsatilla pulsation pulsational pulsative pulsatively pulsator pulsatory pulse pulseless pulselessly pulselessness pulselike pulsellum pulsidge pulsific pulsimeter pulsion pulsive pulsojet pulsometer pultaceous pulton pulu pulveraceous pulverant pulverate pulveration pulvereous pulverin pulverizable pulverizate pulverization pulverizator pulverize pulverizer pulverous pulverulence pulverulent pulverulently pulvic pulvil pulvillar pulvilliform pulvillus pulvinar Pulvinaria pulvinarian pulvinate pulvinated pulvinately pulvination pulvinic pulviniform pulvino pulvinule pulvinulus pulvinus pulviplume pulwar puly puma Pume pumicate pumice pumiced pumiceous pumicer pumiciform pumicose pummel pummice pump pumpable pumpage pumpellyite pumper pumpernickel pumpkin pumpkinification pumpkinify pumpkinish pumpkinity pumple pumpless pumplike pumpman pumpsman pumpwright pun puna punaise punalua punaluan Punan punatoo punch punchable punchboard puncheon puncher punchinello punching punchless punchlike punchproof punchy punct punctal punctate punctated punctation punctator puncticular puncticulate puncticulose punctiform punctiliar punctilio punctiliomonger punctiliosity punctilious punctiliously punctiliousness punctist punctographic punctual punctualist punctuality punctually punctualness punctuate punctuation punctuational punctuationist punctuative punctuator punctuist punctulate punctulated punctulation punctule punctulum punctum puncturation puncture punctured punctureless punctureproof puncturer pundigrion pundit pundita punditic punditically punditry pundonor pundum puneca pung punga pungapung pungar pungence pungency pungent pungently punger pungey pungi pungle pungled Punic Punica Punicaceae punicaceous puniceous punicial punicin punicine punily puniness punish punishability punishable punishableness punishably punisher punishment punishmentproof punition punitional punitionally punitive punitively punitiveness punitory Punjabi punjum punk punkah punketto punkie punkwood punky punless punlet punnable punnage punner punnet punnic punnical punnigram punningly punnology Puno punproof punster punstress punt punta puntabout puntal puntel punter punti puntil puntist Puntlatsh punto puntout puntsman punty puny punyish punyism pup pupa pupahood pupal puparial puparium pupate pupation pupelo Pupidae pupiferous pupiform pupigenous pupigerous pupil pupilability pupilage pupilar pupilate pupildom pupiled pupilize pupillarity pupillary pupilless Pupillidae pupillometer pupillometry pupilloscope pupilloscoptic pupilloscopy Pupipara pupiparous Pupivora pupivore pupivorous pupoid puppet puppetdom puppeteer puppethood puppetish puppetism puppetize puppetlike puppetly puppetman puppetmaster puppetry puppify puppily Puppis puppy puppydom puppyfish puppyfoot puppyhood puppyish puppyism puppylike puppysnatch pupulo Pupuluca pupunha Puquina Puquinan pur purana puranic puraque Purasati Purbeck Purbeckian purblind purblindly purblindness purchasability purchasable purchase purchaser purchasery purdah purdy pure pureblood purebred pured puree purehearted purely pureness purer purfle purfled purfler purfling purfly purga purgation purgative purgatively purgatorial purgatorian purgatory purge purgeable purger purgery purging purificant purification purificative purificator purificatory purifier puriform purify purine puriri purism purist puristic puristical Puritan puritandom Puritaness puritanic puritanical puritanically puritanicalness Puritanism puritanism Puritanize Puritanizer puritanlike Puritanly puritano purity Purkinje Purkinjean purl purler purlhouse purlicue purlieu purlieuman purlin purlman purloin purloiner purohepatitis purolymph puromucous purpart purparty purple purplelip purplely purpleness purplescent purplewood purplewort purplish purplishness purply purport purportless purpose purposedly purposeful purposefully purposefulness purposeless purposelessly purposelessness purposelike purposely purposer purposive purposively purposiveness purposivism purposivist purposivistic purpresture purpura purpuraceous purpurate purpure purpureal purpurean purpureous purpurescent purpuric purpuriferous purpuriform purpurigenous purpurin purpurine purpuriparous purpurite purpurize purpurogallin purpurogenous purpuroid purpuroxanthin purr purre purree purreic purrel purrer purring purringly purrone purry purse pursed purseful purseless purselike purser pursership Purshia pursily pursiness purslane purslet pursley pursuable pursual pursuance pursuant pursuantly pursue pursuer pursuit pursuitmeter pursuivant pursy purtenance Puru Puruha purulence purulency purulent purulently puruloid Purupuru purusha purushartha purvey purveyable purveyal purveyance purveyancer purveyor purveyoress purview purvoe purwannah pus Puschkinia Puseyism Puseyistical Puseyite push pushball pushcart pusher pushful pushfully pushfulness pushing pushingly pushingness pushmobile pushover pushpin Pushtu pushwainling pusillanimity pusillanimous pusillanimously pusillanimousness puss pusscat pussley pusslike pussy pussycat pussyfoot pussyfooted pussyfooter pussyfooting pussyfootism pussytoe pustulant pustular pustulate pustulated pustulation pustulatous pustule pustuled pustulelike pustuliform pustulose pustulous put putage putamen putaminous putanism putation putationary putative putatively putback putchen putcher puteal putelee puther puthery putid putidly putidness putlog putois Putorius putredinal putredinous putrefacient putrefactible putrefaction putrefactive putrefactiveness putrefiable putrefier putrefy putresce putrescence putrescency putrescent putrescibility putrescible putrescine putricide putrid putridity putridly putridness putrifacted putriform putrilage putrilaginous putrilaginously putschism putschist putt puttee putter putterer putteringly puttier puttock putty puttyblower puttyhead puttyhearted puttylike puttyroot puttywork puture puxy Puya Puyallup puzzle puzzleation puzzled puzzledly puzzledness puzzledom puzzlehead puzzleheaded puzzleheadedly puzzleheadedness puzzleman puzzlement puzzlepate puzzlepated puzzlepatedness puzzler puzzling puzzlingly puzzlingness pya pyal pyarthrosis pyche Pycnanthemum pycnia pycnial pycnid pycnidia pycnidial pycnidiophore pycnidiospore pycnidium pycniospore pycnite pycnium Pycnocoma pycnoconidium pycnodont Pycnodonti Pycnodontidae pycnodontoid Pycnodus pycnogonid Pycnogonida pycnogonidium pycnogonoid pycnometer pycnometochia pycnometochic pycnomorphic pycnomorphous Pycnonotidae Pycnonotinae pycnonotine Pycnonotus pycnosis pycnospore pycnosporic pycnostyle pycnotic pyelectasis pyelic pyelitic pyelitis pyelocystitis pyelogram pyelograph pyelographic pyelography pyelolithotomy pyelometry pyelonephritic pyelonephritis pyelonephrosis pyeloplasty pyeloscopy pyelotomy pyeloureterogram pyemesis pyemia pyemic pygal pygalgia pygarg pygargus pygidial pygidid Pygididae Pygidium pygidium pygmaean Pygmalion pygmoid Pygmy pygmy pygmydom pygmyhood pygmyish pygmyism pygmyship pygmyweed Pygobranchia Pygobranchiata pygobranchiate pygofer pygopagus pygopod Pygopodes Pygopodidae pygopodine pygopodous Pygopus pygostyle pygostyled pygostylous pyic pyin pyjama pyjamaed pyke pyknatom pyknic pyknotic pyla Pylades pylagore pylangial pylangium pylar pylephlebitic pylephlebitis pylethrombophlebitis pylethrombosis pylic pylon pyloralgia pylorectomy pyloric pyloristenosis pyloritis pylorocleisis pylorodilator pylorogastrectomy pyloroplasty pyloroptosis pyloroschesis pyloroscirrhus pyloroscopy pylorospasm pylorostenosis pylorostomy pylorus pyobacillosis pyocele pyoctanin pyocyanase pyocyanin pyocyst pyocyte pyodermatitis pyodermatosis pyodermia pyodermic pyogenesis pyogenetic pyogenic pyogenin pyogenous pyohemothorax pyoid pyolabyrinthitis pyolymph pyometra pyometritis pyonephritis pyonephrosis pyonephrotic pyopericarditis pyopericardium pyoperitoneum pyoperitonitis pyophagia pyophthalmia pyophylactic pyoplania pyopneumocholecystitis pyopneumocyst pyopneumopericardium pyopneumoperitoneum pyopneumoperitonitis pyopneumothorax pyopoiesis pyopoietic pyoptysis pyorrhea pyorrheal pyorrheic pyosalpingitis pyosalpinx pyosepticemia pyosepticemic pyosis pyospermia pyotherapy pyothorax pyotoxinemia pyoureter pyovesiculosis pyoxanthose pyr pyracanth Pyracantha Pyraceae pyracene pyral Pyrales pyralid Pyralidae pyralidan pyralidid Pyralididae pyralidiform Pyralidoidea pyralis pyraloid Pyrameis pyramid pyramidaire pyramidal pyramidale pyramidalis Pyramidalism Pyramidalist pyramidally pyramidate Pyramidella pyramidellid Pyramidellidae pyramider pyramides pyramidia pyramidic pyramidical pyramidically pyramidicalness pyramidion Pyramidist pyramidize pyramidlike pyramidoattenuate pyramidoidal pyramidologist pyramidoprismatic pyramidwise pyramoidal pyran pyranometer pyranyl pyrargyrite Pyrausta Pyraustinae pyrazine pyrazole pyrazoline pyrazolone pyrazolyl pyre pyrectic pyrena pyrene Pyrenean pyrenematous pyrenic pyrenin pyrenocarp pyrenocarpic pyrenocarpous Pyrenochaeta pyrenodean pyrenodeine pyrenodeous pyrenoid pyrenolichen Pyrenomycetales pyrenomycete Pyrenomycetes Pyrenomycetineae pyrenomycetous Pyrenopeziza pyrethrin Pyrethrum pyrethrum pyretic pyreticosis pyretogenesis pyretogenetic pyretogenic pyretogenous pyretography pyretology pyretolysis pyretotherapy pyrewinkes Pyrex pyrex pyrexia pyrexial pyrexic pyrexical pyrgeometer pyrgocephalic pyrgocephaly pyrgoidal pyrgologist pyrgom pyrheliometer pyrheliometric pyrheliometry pyrheliophor pyribole pyridazine pyridic pyridine pyridinium pyridinize pyridone pyridoxine pyridyl pyriform pyriformis pyrimidine pyrimidyl pyritaceous pyrite pyrites pyritic pyritical pyritiferous pyritization pyritize pyritohedral pyritohedron pyritoid pyritology pyritous pyro pyroacetic pyroacid pyroantimonate pyroantimonic pyroarsenate pyroarsenic pyroarsenious pyroarsenite pyrobelonite pyrobituminous pyroborate pyroboric pyrocatechin pyrocatechinol pyrocatechol pyrocatechuic pyrocellulose pyrochemical pyrochemically pyrochlore pyrochromate pyrochromic pyrocinchonic pyrocitric pyroclastic pyrocoll pyrocollodion pyrocomenic pyrocondensation pyroconductivity pyrocotton pyrocrystalline Pyrocystis Pyrodine pyroelectric pyroelectricity pyrogallate pyrogallic pyrogallol pyrogen pyrogenation pyrogenesia pyrogenesis pyrogenetic pyrogenetically pyrogenic pyrogenous pyroglutamic pyrognomic pyrognostic pyrognostics pyrograph pyrographer pyrographic pyrography pyrogravure pyroguaiacin pyroheliometer pyroid Pyrola Pyrolaceae pyrolaceous pyrolater pyrolatry pyroligneous pyrolignic pyrolignite pyrolignous pyrolite pyrollogical pyrologist pyrology pyrolusite pyrolysis pyrolytic pyrolyze pyromachy pyromagnetic pyromancer pyromancy pyromania pyromaniac pyromaniacal pyromantic pyromeconic pyromellitic pyrometallurgy pyrometamorphic pyrometamorphism pyrometer pyrometric pyrometrical pyrometrically pyrometry Pyromorphidae pyromorphism pyromorphite pyromorphous pyromotor pyromucate pyromucic pyromucyl pyronaphtha pyrone Pyronema pyronine pyronomics pyronyxis pyrope pyropen pyrophanite pyrophanous pyrophile pyrophilous pyrophobia pyrophone pyrophoric pyrophorous pyrophorus pyrophosphate pyrophosphoric pyrophosphorous pyrophotograph pyrophotography pyrophotometer pyrophyllite pyrophysalite pyropuncture pyropus pyroracemate pyroracemic pyroscope pyroscopy pyrosis pyrosmalite Pyrosoma Pyrosomatidae pyrosome Pyrosomidae pyrosomoid pyrosphere pyrostat pyrostereotype pyrostilpnite pyrosulphate pyrosulphite pyrosulphuric pyrosulphuryl pyrotantalate pyrotartaric pyrotartrate pyrotechnian pyrotechnic pyrotechnical pyrotechnically pyrotechnician pyrotechnics pyrotechnist pyrotechny pyroterebic pyrotheology Pyrotheria Pyrotherium pyrotic pyrotoxin pyrotritaric pyrotritartric pyrouric pyrovanadate pyrovanadic pyroxanthin pyroxene pyroxenic pyroxenite pyroxmangite pyroxonium pyroxyle pyroxylene pyroxylic pyroxylin Pyrrhic pyrrhic pyrrhichian pyrrhichius pyrrhicist Pyrrhocoridae Pyrrhonean Pyrrhonian Pyrrhonic Pyrrhonism Pyrrhonist Pyrrhonistic Pyrrhonize pyrrhotine pyrrhotism pyrrhotist pyrrhotite pyrrhous Pyrrhuloxia Pyrrhus pyrrodiazole pyrrol pyrrole pyrrolic pyrrolidine pyrrolidone pyrrolidyl pyrroline pyrrolylene pyrrophyllin pyrroporphyrin pyrrotriazole pyrroyl pyrryl pyrrylene Pyrula Pyrularia pyruline pyruloid Pyrus pyruvaldehyde pyruvate pyruvic pyruvil pyruvyl pyrylium Pythagorean Pythagoreanism Pythagoreanize Pythagoreanly Pythagoric Pythagorical Pythagorically Pythagorism Pythagorist Pythagorize Pythagorizer Pythia Pythiaceae Pythiacystis Pythiad Pythiambic Pythian Pythic Pythios Pythium Pythius pythogenesis pythogenetic pythogenic pythogenous python pythoness pythonic pythonical pythonid Pythonidae pythoniform Pythoninae pythonine pythonism Pythonissa pythonist pythonize pythonoid pythonomorph Pythonomorpha pythonomorphic pythonomorphous pyuria pyvuril pyx Pyxidanthera pyxidate pyxides pyxidium pyxie Pyxis pyxis Q q qasida qere qeri qintar Qoheleth qoph qua quab quabird quachil quack quackery quackhood quackish quackishly quackishness quackism quackle quacksalver quackster quacky quad quadded quaddle Quader Quadi quadmeter quadra quadrable quadragenarian quadragenarious Quadragesima quadragesimal quadragintesimal quadral quadrangle quadrangled quadrangular quadrangularly quadrangularness quadrangulate quadrans quadrant quadrantal quadrantes Quadrantid quadrantile quadrantlike quadrantly quadrat quadrate quadrated quadrateness quadratic quadratical quadratically quadratics Quadratifera quadratiferous quadratojugal quadratomandibular quadratosquamosal quadratrix quadratum quadrature quadratus quadrauricular quadrennia quadrennial quadrennially quadrennium quadriad quadrialate quadriannulate quadriarticulate quadriarticulated quadribasic quadric quadricapsular quadricapsulate quadricarinate quadricellular quadricentennial quadriceps quadrichord quadriciliate quadricinium quadricipital quadricone quadricorn quadricornous quadricostate quadricotyledonous quadricovariant quadricrescentic quadricrescentoid quadricuspid quadricuspidal quadricuspidate quadricycle quadricycler quadricyclist quadridentate quadridentated quadriderivative quadridigitate quadriennial quadriennium quadrienniumutile quadrifarious quadrifariously quadrifid quadrifilar quadrifocal quadrifoil quadrifoliate quadrifoliolate quadrifolious quadrifolium quadriform quadrifrons quadrifrontal quadrifurcate quadrifurcated quadrifurcation quadriga quadrigabled quadrigamist quadrigate quadrigatus quadrigeminal quadrigeminate quadrigeminous quadrigeminum quadrigenarious quadriglandular quadrihybrid quadrijugal quadrijugate quadrijugous quadrilaminar quadrilaminate quadrilateral quadrilaterally quadrilateralness quadrilingual quadriliteral quadrille quadrilled quadrillion quadrillionth quadrilobate quadrilobed quadrilocular quadriloculate quadrilogue quadrilogy quadrimembral quadrimetallic quadrimolecular quadrimum quadrinodal quadrinomial quadrinomical quadrinominal quadrinucleate quadrioxalate quadriparous quadripartite quadripartitely quadripartition quadripennate quadriphosphate quadriphyllous quadripinnate quadriplanar quadriplegia quadriplicate quadriplicated quadripolar quadripole quadriportico quadriporticus quadripulmonary quadriquadric quadriradiate quadrireme quadrisect quadrisection quadriseptate quadriserial quadrisetose quadrispiral quadristearate quadrisulcate quadrisulcated quadrisulphide quadrisyllabic quadrisyllabical quadrisyllable quadrisyllabous quadriternate quadritubercular quadrituberculate quadriurate quadrivalence quadrivalency quadrivalent quadrivalently quadrivalve quadrivalvular quadrivial quadrivious quadrivium quadrivoltine quadroon quadrual Quadrula quadrum Quadrumana quadrumanal quadrumane quadrumanous quadruped quadrupedal quadrupedan quadrupedant quadrupedantic quadrupedantical quadrupedate quadrupedation quadrupedism quadrupedous quadruplane quadruplator quadruple quadrupleness quadruplet quadruplex quadruplicate quadruplication quadruplicature quadruplicity quadruply quadrupole quaedam Quaequae quaesitum quaestor quaestorial quaestorian quaestorship quaestuary quaff quaffer quaffingly quag quagga quagginess quaggle quaggy quagmire quagmiry quahog quail quailberry quailery quailhead quaillike quaily quaint quaintance quaintise quaintish quaintly quaintness Quaitso quake quakeful quakeproof Quaker quaker quakerbird Quakerdom Quakeress Quakeric Quakerish Quakerishly Quakerishness Quakerism Quakerization Quakerize Quakerlet Quakerlike Quakerly Quakership Quakery quaketail quakiness quaking quakingly quaky quale qualifiable qualification qualificative qualificator qualificatory qualified qualifiedly qualifiedness qualifier qualify qualifyingly qualimeter qualitative qualitatively qualitied quality qualityless qualityship qualm qualminess qualmish qualmishly qualmishness qualmproof qualmy qualmyish qualtagh Quamasia Quamoclit quan quandary quandong quandy quannet quant quanta quantic quantical quantifiable quantifiably quantification quantifier quantify quantimeter quantitate quantitative quantitatively quantitativeness quantitied quantitive quantitively quantity quantivalence quantivalency quantivalent quantization quantize quantometer quantulum quantum Quapaw quaquaversal quaquaversally quar quarantinable quarantine quarantiner quaranty quardeel quare quarenden quarender quarentene quark quarl quarle quarred quarrel quarreled quarreler quarreling quarrelingly quarrelproof quarrelsome quarrelsomely quarrelsomeness quarriable quarried quarrier quarry quarryable quarrying quarryman quarrystone quart quartan quartane quartation quartenylic quarter quarterage quarterback quarterdeckish quartered quarterer quartering quarterization quarterland quarterly quarterman quartermaster quartermasterlike quartermastership quartern quarterpace quarters quartersaw quartersawed quarterspace quarterstaff quarterstetch quartet quartette quartetto quartful quartic quartile quartine quartiparous quarto Quartodeciman quartodecimanism quartole quartz quartzic quartziferous quartzite quartzitic quartzless quartzoid quartzose quartzous quartzy quash Quashee quashey quashy quasi quasijudicial Quasimodo quasky quassation quassative Quassia quassiin quassin quat quata quatch quatercentenary quatern quaternal quaternarian quaternarius quaternary quaternate quaternion quaternionic quaternionist quaternitarian quaternity quaters quatertenses quatorzain quatorze quatrain quatral quatrayle quatre quatrefeuille quatrefoil quatrefoiled quatrefoliated quatrible quatrin quatrino quatrocentism quatrocentist quatrocento Quatsino quattie quattrini quatuor quatuorvirate quauk quave quaver quaverer quavering quaveringly quaverous quavery quaverymavery quaw quawk quay quayage quayful quaylike quayman quayside quaysider qubba queach queachy queak queal quean queanish queasily queasiness queasom queasy quebrachamine quebrachine quebrachitol quebracho quebradilla Quechua Quechuan quedful queechy queen queencake queencraft queencup queendom queenfish queenhood queening queenite queenless queenlet queenlike queenliness queenly queenright queenroot queensberry queenship queenweed queenwood queer queerer queerish queerishness queerity queerly queerness queersome queery queest queesting queet queeve quegh quei queintise quelch Quelea quell queller quemado queme quemeful quemefully quemely quench quenchable quenchableness quencher quenchless quenchlessly quenchlessness quenelle quenselite quercetagetin quercetic quercetin quercetum quercic Querciflorae quercimeritrin quercin quercine quercinic quercitannic quercitannin quercite quercitin quercitol quercitrin quercitron quercivorous Quercus Querecho Querendi Querendy querent Queres querier queriman querimonious querimoniously querimoniousness querimony querist querken querl quern quernal Quernales quernstone querulent querulential querulist querulity querulosity querulous querulously querulousness query querying queryingly queryist quesited quesitive quest quester questeur questful questingly question questionability questionable questionableness questionably questionary questionee questioner questioningly questionist questionless questionlessly questionnaire questionous questionwise questman questor questorial questorship quet quetch quetenite quetzal queue quey Quiangan quiapo quib quibble quibbleproof quibbler quibblingly quiblet quica Quiche quick quickbeam quickborn quicken quickenance quickenbeam quickener quickfoot quickhatch quickhearted quickie quicklime quickly quickness quicksand quicksandy quickset quicksilver quicksilvering quicksilverish quicksilverishness quicksilvery quickstep quickthorn quickwork quid Quidae quiddative quidder Quiddist quiddit quidditative quidditatively quiddity quiddle quiddler quidnunc quiesce quiescence quiescency quiescent quiescently quiet quietable quieten quietener quieter quieting quietism quietist quietistic quietive quietlike quietly quietness quietsome quietude quietus quiff quiffing Quiina Quiinaceae quiinaceous quila quiles Quileute quilkin quill Quillagua quillai quillaic Quillaja quillaja quillback quilled quiller quillet quilleted quillfish quilling quilltail quillwork quillwort quilly quilt quilted quilter quilting Quimbaya Quimper quin quina quinacrine Quinaielt quinaldic quinaldine quinaldinic quinaldinium quinaldyl quinamicine quinamidine quinamine quinanisole quinaquina quinarian quinarius quinary quinate quinatoxine Quinault quinazoline quinazolyl quince quincentenary quincentennial quincewort quinch quincubital quincubitalism quincuncial quincuncially quincunx quincunxial quindecad quindecagon quindecangle quindecasyllabic quindecemvir quindecemvirate quindecennial quindecim quindecima quindecylic quindene quinetum quingentenary quinhydrone quinia quinible quinic quinicine quinidia quinidine quinin quinina quinine quininiazation quininic quininism quininize quiniretin quinisext quinisextine quinism quinite quinitol quinizarin quinize quink quinnat quinnet Quinnipiac quinoa quinocarbonium quinoform quinogen quinoid quinoidal quinoidation quinoidine quinol quinoline quinolinic quinolinium quinolinyl quinologist quinology quinolyl quinometry quinone quinonediimine quinonic quinonimine quinonization quinonize quinonoid quinonyl quinopyrin quinotannic quinotoxine quinova quinovatannic quinovate quinovic quinovin quinovose quinoxaline quinoxalyl quinoyl quinquagenarian quinquagenary Quinquagesima quinquagesimal quinquarticular Quinquatria Quinquatrus quinquecapsular quinquecostate quinquedentate quinquedentated quinquefarious quinquefid quinquefoliate quinquefoliated quinquefoliolate quinquegrade quinquejugous quinquelateral quinqueliteral quinquelobate quinquelobated quinquelobed quinquelocular quinqueloculine quinquenary quinquenerval quinquenerved quinquennalia quinquennia quinquenniad quinquennial quinquennialist quinquennially quinquennium quinquepartite quinquepedal quinquepedalian quinquepetaloid quinquepunctal quinquepunctate quinqueradial quinqueradiate quinquereme quinquertium quinquesect quinquesection quinqueseptate quinqueserial quinqueseriate quinquesyllabic quinquesyllable quinquetubercular quinquetuberculate quinquevalence quinquevalency quinquevalent quinquevalve quinquevalvous quinquevalvular quinqueverbal quinqueverbial quinquevir quinquevirate quinquiliteral quinquina quinquino quinse quinsied quinsy quinsyberry quinsywort quint quintad quintadena quintadene quintain quintal quintan quintant quintary quintato quinte quintelement quintennial quinternion quinteron quinteroon quintessence quintessential quintessentiality quintessentially quintessentiate quintet quintette quintetto quintic quintile Quintilis Quintillian quintillion quintillionth Quintin quintin quintiped Quintius quinto quintocubital quintocubitalism quintole quinton quintroon quintuple quintuplet quintuplicate quintuplication quintuplinerved quintupliribbed quintus quinuclidine quinyl quinze quinzieme quip quipful quipo quipper quippish quippishness quippy quipsome quipsomeness quipster quipu quira quire quirewise Quirinal Quirinalia quirinca quiritarian quiritary Quirite Quirites quirk quirkiness quirkish quirksey quirksome quirky quirl quirquincho quirt quis quisby quiscos quisle quisling Quisqualis quisqueite quisquilian quisquiliary quisquilious quisquous quisutsch quit quitch quitclaim quite Quitemoca Quiteno quitrent quits quittable quittance quitted quitter quittor Quitu quiver quivered quiverer quiverful quivering quiveringly quiverish quiverleaf quivery Quixote quixotic quixotical quixotically quixotism quixotize quixotry quiz quizzability quizzable quizzacious quizzatorial quizzee quizzer quizzery quizzical quizzicality quizzically quizzicalness quizzification quizzify quizziness quizzingly quizzish quizzism quizzity quizzy Qung quo quod quoddies quoddity quodlibet quodlibetal quodlibetarian quodlibetary quodlibetic quodlibetical quodlibetically quoilers quoin quoined quoining quoit quoiter quoitlike quoits quondam quondamly quondamship quoniam quop Quoratean quorum quot quota quotability quotable quotableness quotably quotation quotational quotationally quotationist quotative quote quotee quoteless quotennial quoter quoteworthy quoth quotha quotidian quotidianly quotidianness quotient quotiety quotingly quotity quotlibet quotum Qurti R r ra raad Raanan raash Rab rab raband rabanna rabat rabatine rabatte rabattement rabbanist rabbanite rabbet rabbeting rabbi rabbin rabbinate rabbindom Rabbinic rabbinic Rabbinica rabbinical rabbinically rabbinism rabbinist rabbinistic rabbinistical rabbinite rabbinize rabbinship rabbiship rabbit rabbitberry rabbiter rabbithearted rabbitlike rabbitmouth rabbitproof rabbitroot rabbitry rabbitskin rabbitweed rabbitwise rabbitwood rabbity rabble rabblelike rabblement rabbleproof rabbler rabblesome rabboni rabbonim Rabelaisian Rabelaisianism Rabelaism Rabi rabic rabid rabidity rabidly rabidness rabies rabietic rabific rabiform rabigenic Rabin rabinet rabirubia rabitic rabulistic rabulous raccoon raccoonberry raccroc race raceabout racebrood racecourse racegoer racegoing racelike racemate racemation raceme racemed racemic racemiferous racemiform racemism racemization racemize racemocarbonate racemocarbonic racemomethylate racemose racemosely racemous racemously racemule racemulose racer raceway rach rache Rachel rachial rachialgia rachialgic rachianalgesia Rachianectes rachianesthesia rachicentesis rachides rachidial rachidian rachiform Rachiglossa rachiglossate rachigraph rachilla rachiocentesis rachiococainize rachiocyphosis rachiodont rachiodynia rachiometer rachiomyelitis rachioparalysis rachioplegia rachioscoliosis rachiotome rachiotomy rachipagus rachis rachischisis rachitic rachitis rachitism rachitogenic rachitome rachitomous rachitomy Rachycentridae Rachycentron racial racialism racialist raciality racialization racialize racially racily raciness racing racinglike racism racist rack rackabones rackan rackboard racker racket racketeer racketeering racketer racketing racketlike racketproof racketry rackett rackettail rackety rackful racking rackingly rackle rackless rackmaster rackproof rackrentable rackway rackwork racloir racon raconteur racoon Racovian racy rad rada radar radarman radarscope raddle raddleman raddlings radectomy Radek radiability radiable radial radiale radialia radiality radialization radialize radially radian radiance radiancy radiant radiantly Radiata radiate radiated radiately radiateness radiatics radiatiform radiation radiational radiative radiatopatent radiatoporose radiatoporous radiator radiatory radiatostriate radiatosulcate radiature radical radicalism radicality radicalization radicalize radically radicalness radicand radicant radicate radicated radicating radication radicel radices radicicola radicicolous radiciferous radiciflorous radiciform radicivorous radicle radicolous radicose Radicula radicular radicule radiculectomy radiculitis radiculose radiectomy radiescent radiferous radii radio radioacoustics radioactinium radioactivate radioactive radioactively radioactivity radioamplifier radioanaphylaxis radioautograph radioautographic radioautography radiobicipital radiobroadcast radiobroadcaster radiobroadcasting radiobserver radiocarbon radiocarpal radiocast radiocaster radiochemical radiochemistry radiocinematograph radioconductor radiode radiodermatitis radiodetector radiodiagnosis radiodigital radiodontia radiodontic radiodontist radiodynamic radiodynamics radioelement radiogenic radiogoniometer radiogoniometric radiogoniometry radiogram radiograph radiographer radiographic radiographical radiographically radiography radiohumeral radioisotope Radiolaria radiolarian radiolead radiolite Radiolites radiolitic Radiolitidae radiolocation radiolocator radiologic radiological radiologist radiology radiolucency radiolucent radioluminescence radioluminescent radioman radiomedial radiometallography radiometeorograph radiometer radiometric radiometrically radiometry radiomicrometer radiomovies radiomuscular radionecrosis radioneuritis radionics radiopacity radiopalmar radiopaque radiopelvimetry radiophare radiophone radiophonic radiophony radiophosphorus radiophotograph radiophotography radiopraxis radioscope radioscopic radioscopical radioscopy radiosensibility radiosensitive radiosensitivity radiosonde radiosonic radiostereoscopy radiosurgery radiosurgical radiosymmetrical radiotechnology radiotelegram radiotelegraph radiotelegraphic radiotelegraphy radiotelephone radiotelephonic radiotelephony radioteria radiothallium radiotherapeutic radiotherapeutics radiotherapeutist radiotherapist radiotherapy radiothermy radiothorium radiotoxemia radiotransparency radiotransparent radiotrician Radiotron radiotropic radiotropism radiovision radish radishlike radium radiumization radiumize radiumlike radiumproof radiumtherapy radius radix radknight radman radome radon radsimir radula radulate raduliferous raduliform Rafael Rafe raff Raffaelesque raffe raffee raffery raffia raffinase raffinate raffing raffinose raffish raffishly raffishness raffle raffler Rafflesia rafflesia Rafflesiaceae rafflesiaceous Rafik raft raftage rafter raftiness raftlike raftman raftsman rafty rag raga ragabash ragabrash ragamuffin ragamuffinism ragamuffinly rage rageful ragefully rageless rageous rageously rageousness rageproof rager ragesome ragfish ragged raggedly raggedness raggedy raggee ragger raggery raggety raggil raggily ragging raggle raggled raggy raghouse Raghu raging ragingly raglan raglanite raglet raglin ragman Ragnar ragout ragpicker ragseller ragshag ragsorter ragstone ragtag ragtime ragtimer ragtimey ragule raguly ragweed ragwort rah Rahanwin rahdar rahdaree Rahul Raia raia Raiae raid raider raidproof Raif Raiidae raiiform rail railage railbird railer railhead railing railingly raillery railless raillike railly railman railroad railroadana railroader railroadiana railroading railroadish railroadship railway railwaydom railwayless Raimannia raiment raimentless rain rainband rainbird rainbound rainbow rainbowlike rainbowweed rainbowy rainburst raincoat raindrop Rainer rainer rainfall rainfowl rainful rainily raininess rainless rainlessness rainlight rainproof rainproofer rainspout rainstorm raintight rainwash rainworm rainy raioid Rais rais raisable raise raised raiseman raiser raisin raising raisiny Raj raj Raja raja Rajah rajah Rajarshi rajaship Rajasthani rajbansi Rajeev Rajendra Rajesh Rajidae Rajiv Rajput rakan rake rakeage rakeful rakehell rakehellish rakehelly raker rakery rakesteel rakestele rakh Rakhal raki rakily raking rakish rakishly rakishness rakit rakshasa raku Ralf rallentando ralliance Rallidae rallier ralliform Rallinae ralline Rallus rally Ralph ralph ralstonite Ram ram Rama ramada Ramadoss ramage Ramaism Ramaite ramal Raman Ramanan ramanas ramarama ramass ramate rambeh ramberge ramble rambler rambling ramblingly ramblingness Rambo rambong rambooze Rambouillet rambunctious rambutan ramdohrite rame rameal Ramean ramed ramekin ramellose rament ramentaceous ramental ramentiferous ramentum rameous ramequin Rameses Rameseum Ramesh Ramessid Ramesside ramet ramex ramfeezled ramgunshoch ramhead ramhood rami ramicorn ramie ramiferous ramificate ramification ramified ramiflorous ramiform ramify ramigerous Ramillie Ramillied ramiparous Ramiro ramisection ramisectomy Ramism Ramist Ramistical ramlike ramline rammack rammel rammelsbergite rammer rammerman rammish rammishly rammishness rammy Ramneek Ramnenses Ramnes Ramon Ramona Ramoosii ramose ramosely ramosity ramosopalmate ramosopinnate ramososubdivided ramous ramp rampacious rampaciously rampage rampageous rampageously rampageousness rampager rampagious rampancy rampant rampantly rampart ramped ramper Ramphastidae Ramphastides Ramphastos rampick rampike ramping rampingly rampion rampire rampler ramplor rampsman ramrace ramrod ramroddy ramscallion ramsch Ramsey ramshackle ramshackled ramshackleness ramshackly ramson ramstam ramtil ramular ramule ramuliferous ramulose ramulous ramulus ramus ramuscule Ramusi Ran ran Rana rana ranal Ranales ranarian ranarium Ranatra rance rancel rancellor rancelman rancer rancescent ranch ranche rancher rancheria ranchero ranchless ranchman rancho ranchwoman rancid rancidification rancidify rancidity rancidly rancidness rancor rancorous rancorously rancorousness rancorproof Rand rand Randal Randall Randallite randan randannite Randell randem rander Randia randing randir Randite randle Randolph random randomish randomization randomize randomly randomness randomwise Randy randy rane Ranella Ranere rang rangatira range ranged rangeless rangeman ranger rangership rangework rangey Rangifer rangiferine ranginess ranging rangle rangler rangy rani ranid Ranidae raniferous raniform Ranina Raninae ranine raninian ranivorous Ranjit rank ranked ranker rankish rankle rankless ranklingly rankly rankness ranksman rankwise rann rannel rannigal ranny Ranquel ransack ransacker ransackle ransel ranselman ransom ransomable ransomer ransomfree ransomless ranstead rant rantan rantankerous rantepole ranter Ranterism ranting rantingly rantipole rantock ranty ranula ranular Ranunculaceae ranunculaceous Ranunculales ranunculi Ranunculus Ranzania Raoulia rap Rapaces rapaceus rapacious rapaciously rapaciousness rapacity rapakivi Rapallo Rapanea Rapateaceae rapateaceous rape rapeful raper rapeseed Raphael Raphaelesque Raphaelic Raphaelism Raphaelite Raphaelitism raphania Raphanus raphany raphe Raphia raphide raphides raphidiferous raphidiid Raphidiidae Raphidodea Raphidoidea Raphiolepis raphis rapic rapid rapidity rapidly rapidness rapier rapiered rapillo rapine rapiner raping rapinic rapist raploch rappage rapparee rappe rappel rapper rapping Rappist rappist Rappite rapport rapscallion rapscallionism rapscallionly rapscallionry rapt raptatorial raptatory raptly raptness raptor Raptores raptorial raptorious raptril rapture raptured raptureless rapturist rapturize rapturous rapturously rapturousness raptury raptus rare rarebit rarefaction rarefactional rarefactive rarefiable rarefication rarefier rarefy rarely rareness rareripe Rareyfy rariconstant rarish rarity Rarotongan ras rasa Rasalas Rasalhague rasamala rasant rascacio rascal rascaldom rascaless rascalion rascalism rascality rascalize rascallike rascallion rascally rascalry rascalship rasceta rascette rase rasen Rasenna raser rasgado rash rasher rashful rashing rashlike rashly rashness Rashti rasion Raskolnik Rasores rasorial rasp raspatorium raspatory raspberriade raspberry raspberrylike rasped rasper rasping raspingly raspingness raspings raspish raspite raspy rasse Rasselas rassle Rastaban raster rastik rastle Rastus rasure rat rata ratability ratable ratableness ratably ratafee ratafia ratal ratanhia rataplan ratbite ratcatcher ratcatching ratch ratchel ratchelly ratcher ratchet ratchetlike ratchety ratching ratchment rate rated ratel rateless ratement ratepayer ratepaying rater ratfish rath rathe rathed rathely ratheness rather ratherest ratheripe ratherish ratherly rathest rathite Rathnakumar rathole rathskeller raticidal raticide ratification ratificationist ratifier ratify ratihabition ratine rating ratio ratiocinant ratiocinate ratiocination ratiocinative ratiocinator ratiocinatory ratiometer ration rationable rationably rational rationale rationalism rationalist rationalistic rationalistical rationalistically rationalisticism rationality rationalizable rationalization rationalize rationalizer rationally rationalness rationate rationless rationment Ratitae ratite ratitous ratlike ratline ratliner ratoon ratooner ratproof ratsbane ratskeller rattage rattail rattan ratteen ratten rattener ratter rattery ratti rattinet rattish rattle rattlebag rattlebones rattlebox rattlebrain rattlebrained rattlebush rattled rattlehead rattleheaded rattlejack rattlemouse rattlenut rattlepate rattlepated rattlepod rattleproof rattler rattleran rattleroot rattlertree rattles rattleskull rattleskulled rattlesnake rattlesome rattletrap rattleweed rattlewort rattling rattlingly rattlingness rattly ratton rattoner rattrap Rattus ratty ratwa ratwood raucid raucidity raucity raucous raucously raucousness raught raugrave rauk raukle Raul rauli raun raunge raupo rauque Rauraci Raurici Rauwolfia ravage ravagement ravager rave ravehook raveinelike ravel raveler ravelin raveling ravelly ravelment ravelproof raven Ravenala ravendom ravenduck Ravenelia ravener ravenhood ravening ravenish ravenlike ravenous ravenously ravenousness ravenry ravens Ravensara ravensara ravenstone ravenwise raver Ravi ravigote ravin ravinate Ravindran Ravindranath ravine ravined ravinement raviney raving ravingly ravioli ravish ravishedly ravisher ravishing ravishingly ravishment ravison ravissant raw rawboned rawbones rawhead rawhide rawhider rawish rawishness rawness rax Ray ray raya rayage Rayan rayed rayful rayless raylessness raylet Raymond rayon rayonnance rayonnant raze razee razer razoo razor razorable razorback razorbill razoredge razorless razormaker razormaking razorman razorstrop Razoumofskya razz razzia razzly re rea reaal reabandon reabolish reabolition reabridge reabsence reabsent reabsolve reabsorb reabsorption reabuse reacceptance reaccess reaccession reacclimatization reacclimatize reaccommodate reaccompany reaccomplish reaccomplishment reaccord reaccost reaccount reaccredit reaccrue reaccumulate reaccumulation reaccusation reaccuse reaccustom reacetylation reach reachable reacher reachieve reachievement reaching reachless reachy reacidification reacidify reacknowledge reacknowledgment reacquaint reacquaintance reacquire reacquisition react reactance reactant reaction reactional reactionally reactionariness reactionarism reactionarist reactionary reactionaryism reactionism reactionist reactivate reactivation reactive reactively reactiveness reactivity reactological reactology reactor reactualization reactualize reactuate read readability readable readableness readably readapt readaptability readaptable readaptation readaptive readaptiveness readd readdition readdress reader readerdom readership readhere readhesion readily readiness reading readingdom readjourn readjournment readjudicate readjust readjustable readjuster readjustment readmeasurement readminister readmiration readmire readmission readmit readmittance readopt readoption readorn readvance readvancement readvent readventure readvertency readvertise readvertisement readvise readvocate ready reaeration reaffect reaffection reaffiliate reaffiliation reaffirm reaffirmance reaffirmation reaffirmer reafflict reafford reafforest reafforestation reaffusion reagency reagent reaggravate reaggravation reaggregate reaggregation reaggressive reagin reagitate reagitation reagree reagreement reak Real real realarm reales realest realgar realienate realienation realign realignment realism realist realistic realistically realisticize reality realive realizability realizable realizableness realizably realization realize realizer realizing realizingly reallegation reallege reallegorize realliance reallocate reallocation reallot reallotment reallow reallowance reallude reallusion really realm realmless realmlet realness realter realteration realtor realty ream reamage reamalgamate reamalgamation reamass reambitious reamend reamendment reamer reamerer reaminess reamputation reamuse reamy reanalysis reanalyze reanchor reanimalize reanimate reanimation reanneal reannex reannexation reannotate reannounce reannouncement reannoy reannoyance reanoint reanswer reanvil reanxiety reap reapable reapdole reaper reapologize reapology reapparel reapparition reappeal reappear reappearance reappease reapplaud reapplause reappliance reapplicant reapplication reapplier reapply reappoint reappointment reapportion reapportionment reapposition reappraisal reappraise reappraisement reappreciate reappreciation reapprehend reapprehension reapproach reapprobation reappropriate reappropriation reapproval reapprove rear rearbitrate rearbitration rearer reargue reargument rearhorse rearisal rearise rearling rearm rearmament rearmost rearousal rearouse rearrange rearrangeable rearrangement rearranger rearray rearrest rearrival rearrive rearward rearwardly rearwardness rearwards reascend reascendancy reascendant reascendency reascendent reascension reascensional reascent reascertain reascertainment reashlar reasiness reask reason reasonability reasonable reasonableness reasonably reasoned reasonedly reasoner reasoning reasoningly reasonless reasonlessly reasonlessness reasonproof reaspire reassail reassault reassay reassemblage reassemble reassembly reassent reassert reassertion reassertor reassess reassessment reasseverate reassign reassignation reassignment reassimilate reassimilation reassist reassistance reassociate reassociation reassort reassortment reassume reassumption reassurance reassure reassured reassuredly reassurement reassurer reassuring reassuringly reastiness reastonish reastonishment reastray reasty reasy reattach reattachment reattack reattain reattainment reattempt reattend reattendance reattention reattentive reattest reattire reattract reattraction reattribute reattribution reatus reaudit reauthenticate reauthentication reauthorization reauthorize reavail reavailable reave reaver reavoid reavoidance reavouch reavow reawait reawake reawaken reawakening reawakenment reaward reaware reb rebab reback rebag rebait rebake rebalance rebale reballast reballot reban rebandage rebanish rebanishment rebankrupt rebankruptcy rebaptism rebaptismal rebaptization rebaptize rebaptizer rebar rebarbarization rebarbarize rebarbative rebargain rebase rebasis rebatable rebate rebateable rebatement rebater rebathe rebato rebawl rebeamer rebear rebeat rebeautify rebec Rebecca Rebeccaism Rebeccaites rebeck rebecome rebed rebeg rebeget rebeggar rebegin rebeginner rebeginning rebeguile rebehold Rebekah rebel rebeldom rebelief rebelieve rebeller rebellike rebellion rebellious rebelliously rebelliousness rebellow rebelly rebelong rebelove rebelproof rebemire rebend rebenediction rebenefit rebeset rebesiege rebestow rebestowal rebetake rebetray rebewail rebia rebias rebid rebill rebillet rebilling rebind rebirth rebite reblade reblame reblast rebleach reblend rebless reblock rebloom reblossom reblot reblow reblue rebluff reblunder reboant reboantic reboard reboast rebob reboil reboiler reboise reboisement rebold rebolt rebone rebook rebop rebore reborn reborrow rebottle Reboulia rebounce rebound reboundable rebounder reboundingness rebourbonize rebox rebrace rebraid rebranch rebrand rebrandish rebreathe rebreed rebrew rebribe rebrick rebridge rebring rebringer rebroach rebroadcast rebronze rebrown rebrush rebrutalize rebubble rebuckle rebud rebudget rebuff rebuffable rebuffably rebuffet rebuffproof rebuild rebuilder rebuilt rebukable rebuke rebukeable rebukeful rebukefully rebukefulness rebukeproof rebuker rebukingly rebulk rebunch rebundle rebunker rebuoy rebuoyage reburden reburgeon reburial reburn reburnish reburst rebury rebus rebush rebusy rebut rebute rebutment rebuttable rebuttal rebutter rebutton rebuy recable recadency recage recalcination recalcine recalcitrance recalcitrant recalcitrate recalcitration recalculate recalculation recalesce recalescence recalescent recalibrate recalibration recalk recall recallable recallist recallment recampaign recancel recancellation recandescence recandidacy recant recantation recanter recantingly recanvas recap recapacitate recapitalization recapitalize recapitulate recapitulation recapitulationist recapitulative recapitulator recapitulatory recappable recapper recaption recaptivate recaptivation recaptor recapture recapturer recarbon recarbonate recarbonation recarbonization recarbonize recarbonizer recarburization recarburize recarburizer recarnify recarpet recarriage recarrier recarry recart recarve recase recash recasket recast recaster recasting recatalogue recatch recaulescence recausticize recce recco reccy recede recedence recedent receder receipt receiptable receiptless receiptor receipts receivability receivable receivables receivablness receival receive received receivedness receiver receivership recelebrate recelebration recement recementation recency recense recension recensionist recensor recensure recensus recent recenter recently recentness recentralization recentralize recentre recept receptacle receptacular receptaculite Receptaculites receptaculitid Receptaculitidae receptaculitoid receptaculum receptant receptibility receptible reception receptionism receptionist receptitious receptive receptively receptiveness receptivity receptor receptoral receptorial receptual receptually recercelee recertificate recertify recess recesser recession recessional recessionary recessive recessively recessiveness recesslike recessor Rechabite Rechabitism rechafe rechain rechal rechallenge rechamber rechange rechant rechaos rechar recharge recharter rechase rechaser rechasten rechaw recheat recheck recheer recherche rechew rechip rechisel rechoose rechristen rechuck rechurn recidivation recidive recidivism recidivist recidivistic recidivity recidivous recipe recipiangle recipience recipiency recipiend recipiendary recipient recipiomotor reciprocable reciprocal reciprocality reciprocalize reciprocally reciprocalness reciprocate reciprocation reciprocative reciprocator reciprocatory reciprocitarian reciprocity recircle recirculate recirculation recision recission recissory recitable recital recitalist recitatif recitation recitationalism recitationist recitative recitatively recitativical recitativo recite recitement reciter recivilization recivilize reck reckla reckless recklessly recklessness reckling reckon reckonable reckoner reckoning reclaim reclaimable reclaimableness reclaimably reclaimant reclaimer reclaimless reclaimment reclama reclamation reclang reclasp reclass reclassification reclassify reclean recleaner recleanse reclear reclearance reclimb reclinable reclinate reclinated reclination recline recliner reclose reclothe reclothing recluse reclusely recluseness reclusery reclusion reclusive reclusiveness reclusory recoach recoagulation recoal recoast recoat recock recoct recoction recode recodification recodify recogitate recogitation recognition recognitive recognitor recognitory recognizability recognizable recognizably recognizance recognizant recognize recognizedly recognizee recognizer recognizingly recognizor recognosce recohabitation recoil recoiler recoilingly recoilment recoin recoinage recoiner recoke recollapse recollate recollation Recollect recollectable recollected recollectedly recollectedness recollectible recollection recollective recollectively recollectiveness Recollet recolonization recolonize recolor recomb recombination recombine recomember recomfort recommand recommence recommencement recommencer recommend recommendability recommendable recommendableness recommendably recommendation recommendatory recommendee recommender recommission recommit recommitment recommittal recommunicate recommunion recompact recompare recomparison recompass recompel recompensable recompensate recompensation recompense recompenser recompensive recompete recompetition recompetitor recompilation recompile recompilement recomplain recomplaint recomplete recompletion recompliance recomplicate recomplication recomply recompose recomposer recomposition recompound recomprehend recomprehension recompress recompression recomputation recompute recon reconceal reconcealment reconcede reconceive reconcentrate reconcentration reconception reconcert reconcession reconcilability reconcilable reconcilableness reconcilably reconcile reconcilee reconcileless reconcilement reconciler reconciliability reconciliable reconciliate reconciliation reconciliative reconciliator reconciliatory reconciling reconcilingly reconclude reconclusion reconcoct reconcrete reconcur recondemn recondemnation recondensation recondense recondite reconditely reconditeness recondition recondole reconduct reconduction reconfer reconfess reconfide reconfine reconfinement reconfirm reconfirmation reconfiscate reconfiscation reconform reconfound reconfront reconfuse reconfusion recongeal recongelation recongest recongestion recongratulate recongratulation reconjoin reconjunction reconnaissance reconnect reconnection reconnoissance reconnoiter reconnoiterer reconnoiteringly reconnoitre reconnoitrer reconnoitringly reconquer reconqueror reconquest reconsecrate reconsecration reconsent reconsider reconsideration reconsign reconsignment reconsole reconsolidate reconsolidation reconstituent reconstitute reconstitution reconstruct reconstructed reconstruction reconstructional reconstructionary reconstructionist reconstructive reconstructiveness reconstructor reconstrue reconsult reconsultation recontact recontemplate recontemplation recontend recontest recontinuance recontinue recontract recontraction recontrast recontribute recontribution recontrivance recontrive recontrol reconvalesce reconvalescence reconvalescent reconvene reconvention reconventional reconverge reconverse reconversion reconvert reconvertible reconvey reconveyance reconvict reconviction reconvince reconvoke recook recool recooper recopper recopy recopyright record recordable recordant recordation recordative recordatively recordatory recordedly recorder recordership recording recordist recordless recork recorporification recorporify recorrect recorrection recorrupt recorruption recostume recounsel recount recountable recountal recountenance recounter recountless recoup recoupable recouper recouple recoupment recourse recover recoverability recoverable recoverableness recoverance recoveree recoverer recoveringly recoverless recoveror recovery recramp recrank recrate recreance recreancy recreant recreantly recreantness recrease recreate recreation recreational recreationist recreative recreatively recreativeness recreator recreatory recredit recrement recremental recrementitial recrementitious recrescence recrew recriminate recrimination recriminative recriminator recriminatory recriticize recroon recrop recross recrowd recrown recrucify recrudency recrudesce recrudescence recrudescency recrudescent recruit recruitable recruitage recruital recruitee recruiter recruithood recruiting recruitment recruity recrush recrusher recrystallization recrystallize rect recta rectal rectalgia rectally rectangle rectangled rectangular rectangularity rectangularly rectangularness rectangulate rectangulometer rectectomy recti rectifiable rectification rectificative rectificator rectificatory rectified rectifier rectify rectigrade Rectigraph rectilineal rectilineally rectilinear rectilinearism rectilinearity rectilinearly rectilinearness rectilineation rectinerved rection rectipetality rectirostral rectischiac rectiserial rectitic rectitis rectitude rectitudinous recto rectoabdominal rectocele rectoclysis rectococcygeal rectococcygeus rectocolitic rectocolonic rectocystotomy rectogenital rectopexy rectoplasty rector rectoral rectorate rectoress rectorial rectorrhaphy rectorship rectory rectoscope rectoscopy rectosigmoid rectostenosis rectostomy rectotome rectotomy rectovaginal rectovesical rectress rectricial rectrix rectum rectus recubant recubate recultivate recultivation recumbence recumbency recumbent recumbently recuperability recuperance recuperate recuperation recuperative recuperativeness recuperator recuperatory recur recure recureful recureless recurl recurrence recurrency recurrent recurrently recurrer recurring recurringly recurse recursion recursive recurtain recurvant recurvate recurvation recurvature recurve Recurvirostra recurvirostral Recurvirostridae recurvopatent recurvoternate recurvous recusance recusancy recusant recusation recusative recusator recuse recushion recussion recut recycle Red red redact redaction redactional redactor redactorial redamage redamnation redan redare redargue redargution redargutive redargutory redarken redarn redart redate redaub redawn redback redbait redbeard redbelly redberry redbill redbird redbone redbreast redbrush redbuck redbud redcap redcoat redd redden reddendo reddendum reddening redder redding reddingite reddish reddishness reddition reddleman reddock reddsman reddy rede redeal redebate redebit redeceive redecide redecimate redecision redeck redeclaration redeclare redecline redecorate redecoration redecrease redecussate rededicate rededication rededicatory rededuct rededuction redeed redeem redeemability redeemable redeemableness redeemably redeemer redeemeress redeemership redeemless redefault redefeat redefecate redefer redefiance redefine redefinition redeflect redefy redeify redelay redelegate redelegation redeliberate redeliberation redeliver redeliverance redeliverer redelivery redemand redemandable redemise redemolish redemonstrate redemonstration redemptible Redemptine redemption redemptional redemptioner Redemptionist redemptionless redemptive redemptively redemptor redemptorial Redemptorist redemptory redemptress redemptrice redenigrate redeny redepend redeploy redeployment redeposit redeposition redepreciate redepreciation redeprive rederivation redescend redescent redescribe redescription redesertion redeserve redesign redesignate redesignation redesire redesirous redesman redespise redetect redetention redetermination redetermine redevelop redeveloper redevelopment redevise redevote redevotion redeye redfin redfinch redfish redfoot redhead redheaded redheadedly redheadedness redhearted redhibition redhibitory redhoop redia redictate redictation redient redifferentiate redifferentiation redig redigest redigestion rediminish redingote redintegrate redintegration redintegrative redintegrator redip redipper redirect redirection redisable redisappear redisburse redisbursement redischarge rediscipline rediscount rediscourage rediscover rediscoverer rediscovery rediscuss rediscussion redisembark redismiss redispatch redispel redisperse redisplay redispose redisposition redispute redissect redissection redisseise redisseisin redisseisor redisseize redisseizin redisseizor redissoluble redissolution redissolvable redissolve redistend redistill redistillation redistiller redistinguish redistrain redistrainer redistribute redistributer redistribution redistributive redistributor redistributory redistrict redisturb redive rediversion redivert redivertible redivide redivision redivive redivivous redivivus redivorce redivorcement redivulge redivulgence redjacket redknees redleg redlegs redly redmouth redness redo redock redocket redolence redolency redolent redolently redominate redondilla redoom redouble redoublement redoubler redoubling redoubt redoubtable redoubtableness redoubtably redoubted redound redowa redox redpoll redraft redrag redrape redraw redrawer redream redredge redress redressable redressal redresser redressible redressive redressless redressment redressor redrill redrive redroot redry redsear redshank redshirt redskin redstart redstreak redtab redtail redthroat redtop redub redubber reduce reduceable reduceableness reduced reducement reducent reducer reducibility reducible reducibleness reducibly reducing reduct reductant reductase reductibility reduction reductional reductionism reductionist reductionistic reductive reductively reductor reductorial redue Redunca redundance redundancy redundant redundantly reduplicate reduplication reduplicative reduplicatively reduplicatory reduplicature reduviid Reduviidae reduvioid Reduvius redux redward redware redweed redwing redwithe redwood redye Ree ree reechy reed reedbird reedbuck reedbush reeded reeden reeder reediemadeasy reedily reediness reeding reedish reedition reedless reedlike reedling reedmaker reedmaking reedman reedplot reedwork reedy reef reefable reefer reefing reefy reek reeker reekingly reeky reel reelable reeled reeler reelingly reelrall reem reeming reemish reen reenge reeper Rees reese reeshle reesk reesle reest reester reestle reesty reet reetam reetle reeve reeveland reeveship ref reface refacilitate refall refallow refan refascinate refascination refashion refashioner refashionment refasten refathered refavor refect refection refectionary refectioner refective refectorarian refectorary refectorer refectorial refectorian refectory refederate refeed refeel refeign refel refence refer referable referee reference referenda referendal referendary referendaryship referendum referent referential referentially referently referment referral referrer referrible referribleness refertilization refertilize refetch refight refigure refill refillable refilm refilter refinable refinage refinance refind refine refined refinedly refinedness refinement refiner refinery refinger refining refiningly refinish refire refit refitment refix refixation refixture reflag reflagellate reflame reflash reflate reflation reflationism reflect reflectance reflected reflectedly reflectedness reflectent reflecter reflectibility reflectible reflecting reflectingly reflection reflectional reflectionist reflectionless reflective reflectively reflectiveness reflectivity reflectometer reflectometry reflector reflectoscope refledge reflee reflex reflexed reflexibility reflexible reflexism reflexive reflexively reflexiveness reflexivity reflexly reflexness reflexogenous reflexological reflexologist reflexology refling refloat refloatation reflog reflood refloor reflorescence reflorescent reflourish reflourishment reflow reflower refluctuation refluence refluency refluent reflush reflux refluxed refly refocillate refocillation refocus refold refoment refont refool refoot reforbid reforce reford reforecast reforest reforestation reforestization reforestize reforestment reforfeit reforfeiture reforge reforger reforget reforgive reform reformability reformable reformableness reformado reformandum Reformati reformation reformational reformationary reformationist reformative reformatively reformatness reformatory reformed reformedly reformer reformeress reformingly reformism reformist reformistic reformproof reformulate reformulation reforsake refortification refortify reforward refound refoundation refounder refract refractable refracted refractedly refractedness refractile refractility refracting refraction refractional refractionate refractionist refractive refractively refractiveness refractivity refractometer refractometric refractometry refractor refractorily refractoriness refractory refracture refragability refragable refragableness refrain refrainer refrainment reframe refrangent refrangibility refrangible refrangibleness refreeze refrenation refrenzy refresh refreshant refreshen refreshener refresher refreshful refreshfully refreshing refreshingly refreshingness refreshment refrigerant refrigerate refrigerating refrigeration refrigerative refrigerator refrigeratory refrighten refringence refringency refringent refront refrustrate reft refuel refueling refuge refugee refugeeism refugeeship refulge refulgence refulgency refulgent refulgently refulgentness refunction refund refunder refundment refurbish refurbishment refurl refurnish refurnishment refusable refusal refuse refuser refusing refusingly refusion refusive refutability refutable refutably refutal refutation refutative refutatory refute refuter reg regain regainable regainer regainment regal regale Regalecidae Regalecus regalement regaler regalia regalian regalism regalist regality regalize regallop regally regalness regalvanization regalvanize regard regardable regardance regardancy regardant regarder regardful regardfully regardfulness regarding regardless regardlessly regardlessness regarment regarnish regarrison regather regatta regauge regelate regelation regency regeneracy regenerance regenerant regenerate regenerateness regeneration regenerative regeneratively regenerator regeneratory regeneratress regeneratrix regenesis regent regental regentess regentship regerminate regermination reges reget Regga Reggie regia regicidal regicide regicidism regift regifuge regild regill regime regimen regimenal regiment regimental regimentaled regimentalled regimentally regimentals regimentary regimentation regiminal regin reginal Reginald region regional regionalism regionalist regionalistic regionalization regionalize regionally regionary regioned register registered registerer registership registrability registrable registral registrant registrar registrarship registrary registrate registration registrational registrationist registrator registrer registry regive regladden reglair reglaze regle reglement reglementary reglementation reglementist reglet reglorified regloss reglove reglow reglue regma regmacarp regnal regnancy regnant regnerable regolith regorge regovern regradation regrade regraduate regraduation regraft regrant regrasp regrass regrate regrater regratification regratify regrating regratingly regrator regratress regravel regrede regreen regreet regress regression regressionist regressive regressively regressiveness regressivity regressor regret regretful regretfully regretfulness regretless regrettable regrettableness regrettably regretter regrettingly regrind regrinder regrip regroup regroupment regrow regrowth reguarantee reguard reguardant reguide regula regulable regular Regulares Regularia regularity regularization regularize regularizer regularly regularness regulatable regulate regulated regulation regulationist regulative regulatively regulator regulatorship regulatory regulatress regulatris reguli reguline regulize Regulus regulus regur regurge regurgitant regurgitate regurgitation regush reh rehabilitate rehabilitation rehabilitative rehair rehale rehallow rehammer rehandicap rehandle rehandler rehandling rehang rehappen reharden reharm reharmonize reharness reharrow reharvest rehash rehaul rehazard rehead reheal reheap rehear rehearing rehearsal rehearse rehearser rehearten reheat reheater Reheboth rehedge reheel reheighten Rehoboam Rehoboth Rehobothan rehoe rehoist rehollow rehonor rehonour rehood rehook rehoop rehouse rehumanize rehumble rehumiliate rehumiliation rehung rehybridize rehydrate rehydration rehypothecate rehypothecation rehypothecator reichsgulden Reichsland Reichslander reichsmark reichspfennig reichstaler Reid reidentification reidentify reif reification reify reign reignite reignition reignore reillume reilluminate reillumination reillumine reillustrate reillustration reim reimage reimagination reimagine reimbark reimbarkation reimbibe reimbody reimbursable reimburse reimbursement reimburser reimbush reimbushment reimkennar reimmerge reimmerse reimmersion reimmigrant reimmigration reimpact reimpark reimpart reimpatriate reimpatriation reimpel reimplant reimplantation reimply reimport reimportation reimportune reimpose reimposition reimposure reimpregnate reimpress reimpression reimprint reimprison reimprisonment reimprove reimprovement reimpulse rein reina reinability reinaugurate reinauguration reincapable reincarnadine reincarnate reincarnation reincarnationism reincarnationist reincense reincentive reincidence reincidency reincite reinclination reincline reinclude reinclusion reincorporate reincorporation reincrease reincrudate reincrudation reinculcate reincur reindebted reindebtedness reindeer reindependence reindicate reindication reindict reindictment reindifferent reindorse reinduce reinducement reindue reindulge reindulgence Reiner reinette reinfect reinfection reinfectious reinfer reinfest reinfestation reinflame reinflate reinflation reinflict reinfliction reinfluence reinforce reinforcement reinforcer reinform reinfuse reinfusion reingraft reingratiate reingress reinhabit reinhabitation Reinhard reinherit reinitiate reinitiation reinject reinjure reinless reinoculate reinoculation reinquire reinquiry reins reinsane reinsanity reinscribe reinsert reinsertion reinsist reinsman reinspect reinspection reinspector reinsphere reinspiration reinspire reinspirit reinstall reinstallation reinstallment reinstalment reinstate reinstatement reinstation reinstator reinstauration reinstil reinstill reinstitute reinstitution reinstruct reinstruction reinsult reinsurance reinsure reinsurer reintegrate reintegration reintend reinter reintercede reintercession reinterchange reinterest reinterfere reinterference reinterment reinterpret reinterpretation reinterrogate reinterrogation reinterrupt reinterruption reintervene reintervention reinterview reinthrone reintimate reintimation reintitule reintrench reintroduce reintroduction reintrude reintrusion reintuition reintuitive reinvade reinvasion reinvent reinvention reinventor reinversion reinvert reinvest reinvestigate reinvestigation reinvestiture reinvestment reinvigorate reinvigoration reinvitation reinvite reinvoice reinvolve Reinwardtia reirrigate reirrigation reis reisolation reissuable reissue reissuement reissuer reit reitbok reitbuck reitemize reiter reiterable reiterance reiterant reiterate reiterated reiteratedly reiteratedness reiteration reiterative reiteratively reiver rejail Rejang reject rejectable rejectableness rejectage rejectamenta rejecter rejectingly rejection rejective rejectment rejector rejerk rejoice rejoiceful rejoicement rejoicer rejoicing rejoicingly rejoin rejoinder rejolt rejourney rejudge rejumble rejunction rejustification rejustify rejuvenant rejuvenate rejuvenation rejuvenative rejuvenator rejuvenesce rejuvenescence rejuvenescent rejuvenize Reki rekick rekill rekindle rekindlement rekindler reking rekiss reknit reknow rel relabel relace relacquer relade reladen relais relament relamp reland relap relapper relapsable relapse relapseproof relapser relapsing relast relaster relata relatability relatable relatch relate related relatedness relater relatinization relation relational relationality relationally relationary relationism relationist relationless relationship relatival relative relatively relativeness relativism relativist relativistic relativity relativization relativize relator relatrix relatum relaunch relax relaxable relaxant relaxation relaxative relaxatory relaxed relaxedly relaxedness relaxer relay relayman relbun relead releap relearn releasable release releasee releasement releaser releasor releather relection relegable relegate relegation relend relent relenting relentingly relentless relentlessly relentlessness relentment relessee relessor relet reletter relevance relevancy relevant relevantly relevate relevation relevator relevel relevy reliability reliable reliableness reliably reliance reliant reliantly reliberate relic relicary relicense relick reliclike relicmonger relict relicted reliction relief reliefless relier relievable relieve relieved relievedly reliever relieving relievingly relievo relift religate religation relight relightable relighten relightener relighter religion religionary religionate religioner religionism religionist religionistic religionize religionless religiose religiosity religious religiously religiousness relime relimit relimitation reline reliner relink relinquent relinquish relinquisher relinquishment reliquaire reliquary reliquefy reliquiae reliquian reliquidate reliquidation reliquism relish relishable relisher relishing relishingly relishsome relishy relist relisten relitigate relive Rellyan Rellyanism Rellyanite reload reloan relocable relocate relocation relocator relock relodge relook relose relost relot relove relower relucent reluct reluctance reluctancy reluctant reluctantly reluctate reluctation reluctivity relume relumine rely remade remagnetization remagnetize remagnification remagnify remail remain remainder remainderman remaindership remainer remains remaintain remaintenance remake remaker reman remanage remanagement remanation remancipate remancipation remand remandment remanence remanency remanent remanet remanipulate remanipulation remantle remanufacture remanure remap remarch remargin remark remarkability remarkable remarkableness remarkably remarkedly remarker remarket remarque remarriage remarry remarshal remask remass remast remasticate remastication rematch rematerialize remble Rembrandt Rembrandtesque Rembrandtish Rembrandtism remeant remeasure remeasurement remede remediable remediableness remediably remedial remedially remediation remediless remedilessly remedilessness remeditate remeditation remedy remeet remelt remember rememberability rememberable rememberably rememberer remembrance remembrancer remembrancership rememorize remenace remend remerge remetal remex Remi remica remicate remication remicle remiform remigate remigation remiges remigial remigrant remigrate remigration Remijia remilitarization remilitarize remill remimic remind remindal reminder remindful remindingly remineralization remineralize remingle reminisce reminiscence reminiscenceful reminiscencer reminiscency reminiscent reminiscential reminiscentially reminiscently reminiscer reminiscitory remint remiped remirror remise remisrepresent remisrepresentation remiss remissful remissibility remissible remissibleness remission remissive remissively remissiveness remissly remissness remissory remisunderstand remit remitment remittable remittal remittance remittancer remittee remittence remittency remittent remittently remitter remittitur remittor remix remixture remnant remnantal remobilization remobilize Remoboth remock remodel remodeler remodeller remodelment remodification remodify remolade remold remollient remonetization remonetize remonstrance remonstrant remonstrantly remonstrate remonstrating remonstratingly remonstration remonstrative remonstratively remonstrator remonstratory remontado remontant remontoir remop remora remord remorse remorseful remorsefully remorsefulness remorseless remorselessly remorselessness remorseproof remortgage remote remotely remoteness remotion remotive remould remount removability removable removableness removably removal remove removed removedly removedness removement remover removing remultiplication remultiply remunerability remunerable remunerably remunerate remuneration remunerative remuneratively remunerativeness remunerator remuneratory remurmur Remus remuster remutation renable renably renail Renaissance renaissance Renaissancist Renaissant renal rename Renardine renascence renascency renascent renascible renascibleness renature renavigate renavigation rencontre rencounter renculus rend render renderable renderer rendering renderset rendezvous rendibility rendible rendition rendlewood rendrock rendzina reneague Renealmia renecessitate reneg renegade renegadism renegado renegation renege reneger reneglect renegotiable renegotiate renegotiation renegotiations renegue renerve renes renet renew renewability renewable renewably renewal renewedly renewedness renewer renewment renicardiac renickel renidification renidify reniform Renilla Renillidae renin renipericardial reniportal renipuncture renish renishly renitence renitency renitent renk renky renne rennet renneting rennin renniogen renocutaneous renogastric renography renointestinal renominate renomination renopericardial renopulmonary renormalize renotation renotice renotification renotify renounce renounceable renouncement renouncer renourish renovate renovater renovatingly renovation renovative renovator renovatory renovize renown renowned renownedly renownedness renowner renownful renownless rensselaerite rent rentability rentable rentage rental rentaler rentaller rented rentee renter rentless rentrant rentrayeuse Renu renumber renumerate renumeration renunciable renunciance renunciant renunciate renunciation renunciative renunciator renunciatory renunculus renverse renvoi renvoy reobject reobjectivization reobjectivize reobligate reobligation reoblige reobscure reobservation reobserve reobtain reobtainable reobtainment reoccasion reoccupation reoccupy reoccur reoccurrence reoffend reoffense reoffer reoffset reoil reometer reomission reomit reopen reoperate reoperation reoppose reopposition reoppress reoppression reorchestrate reordain reorder reordinate reordination reorganization reorganizationist reorganize reorganizer reorient reorientation reornament reoutfit reoutline reoutput reoutrage reovercharge reoverflow reovertake reoverwork reown reoxidation reoxidize reoxygenate reoxygenize rep repace repacification repacify repack repackage repacker repaganization repaganize repaganizer repage repaint repair repairable repairableness repairer repairman repale repand repandly repandodentate repandodenticulate repandolobate repandous repandousness repanel repaper reparability reparable reparably reparagraph reparate reparation reparative reparatory repark repartable repartake repartee reparticipate reparticipation repartition repartitionable repass repassable repassage repasser repast repaste repasture repatch repatency repatent repatriable repatriate repatriation repatronize repattern repave repavement repawn repay repayable repayal repaying repayment repeal repealability repealable repealableness repealer repealist repealless repeat repeatability repeatable repeatal repeated repeatedly repeater repeg repel repellance repellant repellence repellency repellent repellently repeller repelling repellingly repellingness repen repenetrate repension repent repentable repentance repentant repentantly repenter repentingly repeople reperceive repercept reperception repercolation repercuss repercussion repercussive repercussively repercussiveness repercutient reperform reperformance reperfume reperible repermission repermit reperplex repersonalization repersonalize repersuade repersuasion repertoire repertorial repertorily repertorium repertory reperusal reperuse repetend repetition repetitional repetitionary repetitious repetitiously repetitiousness repetitive repetitively repetitiveness repetitory repetticoat repew Rephael rephase rephonate rephosphorization rephosphorize rephotograph rephrase repic repick repicture repiece repile repin repine repineful repinement repiner repiningly repipe repique repitch repkie replace replaceability replaceable replacement replacer replait replan replane replant replantable replantation replanter replaster replate replay replead repleader repleat repledge repledger replenish replenisher replenishingly replenishment replete repletely repleteness repletion repletive repletively repletory repleviable replevin replevisable replevisor replevy repliant replica replicate replicated replicatile replication replicative replicatively replicatory replier replight replod replot replotment replotter replough replow replum replume replunder replunge reply replyingly repocket repoint repolish repoll repollute repolon repolymerization repolymerize reponder repone repope repopulate repopulation report reportable reportage reportedly reporter reporteress reporterism reportership reportingly reportion reportorial reportorially reposal repose reposed reposedly reposedness reposeful reposefully reposefulness reposer reposit repositary reposition repositor repository repossess repossession repossessor repost repostpone repot repound repour repowder repp repped repractice repray repreach reprecipitate reprecipitation repredict reprefer reprehend reprehendable reprehendatory reprehender reprehensibility reprehensible reprehensibleness reprehensibly reprehension reprehensive reprehensively reprehensory repreparation reprepare represcribe represent representability representable representamen representant representation representational representationalism representationalist representationary representationism representationist representative representatively representativeness representativeship representativity representer representment represide repress repressed repressedly represser repressible repressibly repression repressionary repressionist repressive repressively repressiveness repressment repressor repressory repressure reprice reprieval reprieve repriever reprimand reprimander reprimanding reprimandingly reprime reprimer reprint reprinter reprisal reprisalist reprise repristinate repristination reprivatization reprivatize reprivilege reproach reproachable reproachableness reproachably reproacher reproachful reproachfully reproachfulness reproachingly reproachless reproachlessness reprobacy reprobance reprobate reprobateness reprobater reprobation reprobationary reprobationer reprobative reprobatively reprobator reprobatory reproceed reprocess reproclaim reproclamation reprocurable reprocure reproduce reproduceable reproducer reproducibility reproducible reproduction reproductionist reproductive reproductively reproductiveness reproductivity reproductory reprofane reprofess reprohibit repromise repromulgate repromulgation repronounce repronunciation reproof reproofless repropagate repropitiate repropitiation reproportion reproposal repropose reprosecute reprosecution reprosper reprotect reprotection reprotest reprovable reprovableness reprovably reproval reprove reprover reprovide reprovingly reprovision reprovocation reprovoke reprune reps reptant reptatorial reptatory reptile reptiledom reptilelike reptilferous Reptilia reptilian reptiliary reptiliform reptilious reptiliousness reptilism reptility reptilivorous reptiloid republic republican republicanism republicanization republicanize republicanizer republication republish republisher republishment repuddle repudiable repudiate repudiation repudiationist repudiative repudiator repudiatory repuff repugn repugnable repugnance repugnancy repugnant repugnantly repugnantness repugnate repugnatorial repugner repullulate repullulation repullulative repullulescent repulpit repulse repulseless repulseproof repulser repulsion repulsive repulsively repulsiveness repulsory repulverize repump repunish repunishment repurchase repurchaser repurge repurification repurify repurple repurpose repursue repursuit reputability reputable reputableness reputably reputation reputationless reputative reputatively repute reputed reputedly reputeless requalification requalify requarantine requeen requench request requester requestion requiem Requienia requiescence requin requirable require requirement requirer requisite requisitely requisiteness requisition requisitionary requisitioner requisitionist requisitor requisitorial requisitory requit requitable requital requitative requite requiteful requitement requiter requiz requotation requote rerack reracker reradiation rerail reraise rerake rerank rerate reread rereader rerebrace reredos reree rereel rereeve rerefief reregister reregistration reregulate reregulation rereign reremouse rerent rerental reresupper rerig rering rerise rerival rerivet rerob rerobe reroll reroof reroot rerope reroute rerow reroyalize rerub rerummage rerun resaca resack resacrifice resaddle resail resalable resale resalt resalutation resalute resalvage resample resanctify resanction resatisfaction resatisfy resaw resawer resawyer resay resazurin rescan reschedule rescind rescindable rescinder rescindment rescissible rescission rescissory rescore rescramble rescratch rescribe rescript rescription rescriptive rescriptively rescrub rescuable rescue rescueless rescuer reseal reseam research researcher researchful researchist reseat resecrete resecretion resect resection resectional Reseda reseda Resedaceae resedaceous resee reseed reseek resegment resegmentation reseise reseiser reseize reseizer reseizure reselect reselection reself resell reseller resemblable resemblance resemblant resemble resembler resemblingly reseminate resend resene resensation resensitization resensitize resent resentationally resentence resenter resentful resentfullness resentfully resentience resentingly resentless resentment resepulcher resequent resequester resequestration reserene reservable reserval reservation reservationist reservatory reserve reserved reservedly reservedness reservee reserveful reserveless reserver reservery reservice reservist reservoir reservor reset resettable resetter resettle resettlement resever resew resex resh reshake reshape reshare resharpen reshave reshear reshearer resheathe reshelve reshift reshine reshingle reship reshipment reshipper reshoe reshoot reshoulder reshovel reshower reshrine reshuffle reshun reshunt reshut reshuttle resiccate reside residence residencer residency resident residental residenter residential residentiality residentially residentiary residentiaryship residentship resider residua residual residuary residuation residue residuent residuous residuum resift resigh resign resignal resignatary resignation resignationism resigned resignedly resignedness resignee resigner resignful resignment resile resilement resilial resiliate resilience resiliency resilient resilifer resiliometer resilition resilium resilver resin resina resinaceous resinate resinbush resiner resinfiable resing resinic resiniferous resinification resinifluous resiniform resinify resinize resink resinlike resinoelectric resinoextractive resinogenous resinoid resinol resinolic resinophore resinosis resinous resinously resinousness resinovitreous resiny resipiscence resipiscent resist resistability resistable resistableness resistance resistant resistantly resister resistful resistibility resistible resistibleness resistibly resisting resistingly resistive resistively resistiveness resistivity resistless resistlessly resistlessness resistor resitting resize resizer resketch reskin reslash reslate reslay reslide reslot resmell resmelt resmile resmooth resnap resnatch resnatron resnub resoak resoap resoften resoil resojourn resolder resole resolemnize resolicit resolidification resolidify resolubility resoluble resolubleness resolute resolutely resoluteness resolution resolutioner resolutionist resolutory resolvability resolvable resolvableness resolvancy resolve resolved resolvedly resolvedness resolvent resolver resolvible resonance resonancy resonant resonantly resonate resonator resonatory resoothe resorb resorbence resorbent resorcin resorcine resorcinism resorcinol resorcinolphthalein resorcinum resorcylic resorption resorptive resort resorter resorufin resought resound resounder resounding resoundingly resource resourceful resourcefully resourcefulness resourceless resourcelessness resoutive resow resp respace respade respan respangle resparkle respeak respect respectability respectabilize respectable respectableness respectably respectant respecter respectful respectfully respectfulness respecting respective respectively respectiveness respectless respectlessly respectlessness respectworthy respell respersive respin respirability respirable respirableness respiration respirational respirative respirator respiratored respiratorium respiratory respire respirit respirometer respite respiteless resplend resplendence resplendency resplendent resplendently resplice resplit respoke respond responde respondence respondency respondent respondentia responder responsal responsary response responseless responser responsibility responsible responsibleness responsibly responsion responsive responsively responsiveness responsivity responsorial responsory respot respray respread respring resprout respue resquare resqueak ressaidar ressala ressaldar ressaut rest restable restack restaff restain restainable restake restamp restandardization restandardize restant restart restate restatement restaur restaurant restaurate restaurateur restauration restbalk resteal resteel resteep restem restep rester resterilize restes restful restfully restfulness restharrow resthouse Restiaceae restiaceous restiad restibrachium restiff restiffen restiffener restiffness restifle restiform restigmatize restimulate restimulation resting restingly Restio Restionaceae restionaceous restipulate restipulation restipulatory restir restis restitch restitute restitution restitutionism restitutionist restitutive restitutor restitutory restive restively restiveness restless restlessly restlessness restock restopper restorable restorableness restoral restoration restorationer restorationism restorationist restorative restoratively restorativeness restorator restoratory restore restorer restow restowal restproof restraighten restrain restrainability restrained restrainedly restrainedness restrainer restraining restrainingly restraint restraintful restrap restratification restream restrengthen restress restretch restrict restricted restrictedly restrictedness restriction restrictionary restrictionist restrictive restrictively restrictiveness restrike restring restringe restringency restringent restrip restrive restroke restudy restuff restward restwards resty restyle resubject resubjection resubjugate resublimation resublime resubmerge resubmission resubmit resubordinate resubscribe resubscriber resubscription resubstitute resubstitution resucceed resuck resudation resue resuffer resufferance resuggest resuggestion resuing resuit result resultance resultancy resultant resultantly resultative resultful resultfully resulting resultingly resultive resultless resultlessly resultlessness resumability resumable resume resumer resummon resummons resumption resumptive resumptively resun resup resuperheat resupervise resupinate resupinated resupination resupine resupply resupport resuppose resupposition resuppress resuppression resurface resurge resurgence resurgency resurgent resurprise resurrect resurrectible resurrection resurrectional resurrectionary resurrectioner resurrectioning resurrectionism resurrectionist resurrectionize resurrective resurrector resurrender resurround resurvey resuscitable resuscitant resuscitate resuscitation resuscitative resuscitator resuspect resuspend resuspension reswage reswallow resward reswarm reswear resweat resweep reswell reswill reswim resyllabification resymbolization resymbolize resynthesis resynthesize ret retable retack retackle retag retail retailer retailment retailor retain retainability retainable retainableness retainal retainder retainer retainership retaining retake retaker retaliate retaliation retaliationist retaliative retaliator retaliatory retalk retama retame retan retanner retape retard retardance retardant retardate retardation retardative retardatory retarded retardence retardent retarder retarding retardingly retardive retardment retardure retare retariff retaste retation retattle retax retaxation retch reteach retecious retelegraph retelephone retell retelling retem retemper retempt retemptation retenant retender retene retent retention retentionist retentive retentively retentiveness retentivity retentor Retepora retepore Reteporidae retest retexture rethank rethatch rethaw rethe retheness rethicken rethink rethrash rethread rethreaten rethresh rethresher rethrill rethrive rethrone rethrow rethrust rethunder retia retial Retiariae retiarian retiarius retiary reticella reticello reticence reticency reticent reticently reticket reticle reticula reticular Reticularia reticularian reticularly reticulary reticulate reticulated reticulately reticulation reticulatocoalescent reticulatogranulate reticulatoramose reticulatovenose reticule reticuled reticulin reticulitis reticulocyte reticulocytosis reticuloramose Reticulosa reticulose reticulovenose reticulum retie retier retiform retighten retile retill retimber retime retin retina retinacular retinaculate retinaculum retinal retinalite retinasphalt retinasphaltum retincture retinene retinerved retinian retinispora retinite retinitis retinize retinker retinoblastoma retinochorioid retinochorioidal retinochorioiditis retinoid retinol retinopapilitis retinophoral retinophore retinoscope retinoscopic retinoscopically retinoscopist retinoscopy Retinospora retinue retinula retinular retinule retip retiracied retiracy retirade retiral retire retired retiredly retiredness retirement retirer retiring retiringly retiringness retistene retoast retold retolerate retoleration retomb retonation retook retool retooth retoother retort retortable retorted retorter retortion retortive retorture retoss retotal retouch retoucher retouching retouchment retour retourable retrace retraceable retracement retrack retract retractability retractable retractation retracted retractibility retractible retractile retractility retraction retractive retractively retractiveness retractor retrad retrade retradition retrahent retrain retral retrally retramp retrample retranquilize retranscribe retranscription retransfer retransference retransfigure retransform retransformation retransfuse retransit retranslate retranslation retransmission retransmissive retransmit retransmute retransplant retransport retransportation retravel retraverse retraxit retread retreat retreatal retreatant retreater retreatful retreating retreatingness retreative retreatment retree retrench retrenchable retrencher retrenchment retrial retribute retribution retributive retributively retributor retributory retricked retrievability retrievable retrievableness retrievably retrieval retrieve retrieveless retrievement retriever retrieverish retrim retrimmer retrip retroact retroaction retroactive retroactively retroactivity retroalveolar retroauricular retrobronchial retrobuccal retrobulbar retrocaecal retrocardiac retrocecal retrocede retrocedence retrocedent retrocervical retrocession retrocessional retrocessionist retrocessive retrochoir retroclavicular retroclusion retrocognition retrocognitive retrocolic retroconsciousness retrocopulant retrocopulation retrocostal retrocouple retrocoupler retrocurved retrodate retrodeviation retrodisplacement retroduction retrodural retroesophageal retroflected retroflection retroflex retroflexed retroflexion retroflux retroform retrofract retrofracted retrofrontal retrogastric retrogenerative retrogradation retrogradatory retrograde retrogradely retrogradient retrogradingly retrogradism retrogradist retrogress retrogression retrogressionist retrogressive retrogressively retrohepatic retroinfection retroinsular retroiridian retroject retrojection retrojugular retrolabyrinthine retrolaryngeal retrolingual retrolocation retromammary retromammillary retromandibular retromastoid retromaxillary retromigration retromingent retromingently retromorphosed retromorphosis retronasal retroperitoneal retroperitoneally retropharyngeal retropharyngitis retroplacental retroplexed retroposed retroposition retropresbyteral retropubic retropulmonary retropulsion retropulsive retroreception retrorectal retroreflective retrorenal retrorse retrorsely retroserrate retroserrulate retrospect retrospection retrospective retrospectively retrospectiveness retrospectivity retrosplenic retrostalsis retrostaltic retrosternal retrosusception retrot retrotarsal retrotemporal retrothyroid retrotracheal retrotransfer retrotransference retrotympanic retrousse retrovaccinate retrovaccination retrovaccine retroverse retroversion retrovert retrovision retroxiphoid retrude retrue retrusible retrusion retrust retry retted retter rettery retting rettory retube retuck retumble retumescence retune returban returf returfer return returnability returnable returned returner returnless returnlessly retuse retwine retwist retying retype retzian Reub Reuben Reubenites Reuchlinian Reuchlinism Reuel reundercut reundergo reundertake reundulate reundulation reune reunfold reunification reunify reunion reunionism reunionist reunionistic reunitable reunite reunitedly reuniter reunition reunitive reunpack reuphold reupholster reuplift reurge reuse reutilization reutilize reutter reutterance rev revacate revaccinate revaccination revalenta revalescence revalescent revalidate revalidation revalorization revalorize revaluate revaluation revalue revamp revamper revampment revaporization revaporize revarnish revary reve reveal revealability revealable revealableness revealed revealedly revealer revealing revealingly revealingness revealment revegetate revegetation revehent reveil reveille revel revelability revelant revelation revelational revelationer revelationist revelationize revelative revelator revelatory reveler revellent revelly revelment revelrout revelry revenant revend revender revendicate revendication reveneer revenge revengeable revengeful revengefully revengefulness revengeless revengement revenger revengingly revent reventilate reventure revenual revenue revenued revenuer rever reverable reverb reverbatory reverberant reverberate reverberation reverberative reverberator reverberatory reverbrate reverdure revere revered reverence reverencer reverend reverendly reverendship reverent reverential reverentiality reverentially reverentialness reverently reverentness reverer reverie reverification reverify reverist revers reversability reversable reversal reverse reversed reversedly reverseful reverseless reversely reversement reverser reverseways reversewise reversi reversibility reversible reversibleness reversibly reversification reversifier reversify reversing reversingly reversion reversionable reversional reversionally reversionary reversioner reversionist reversis reversist reversive reverso revert revertal reverter revertibility revertible revertive revertively revery revest revestiary revestry revet revete revetement revetment revibrate revibration revibrational revictorious revictory revictual revictualment revie review reviewability reviewable reviewage reviewal reviewer revieweress reviewish reviewless revigorate revigoration revile revilement reviler reviling revilingly revindicate revindication reviolate reviolation revirescence revirescent Revisable revisable revisableness revisal revise Revised revisee reviser revisership revisible revision revisional revisionary revisionism revisionist revisit revisitant revisitation revisor revisory revisualization revisualize revitalization revitalize revitalizer revivability revivable revivably revival revivalism revivalist revivalistic revivalize revivatory revive revivement reviver revivification revivifier revivify reviving revivingly reviviscence reviviscency reviviscent reviviscible revivor revocability revocable revocableness revocably revocation revocative revocatory revoice revokable revoke revokement revoker revokingly revolant revolatilize revolt revolter revolting revoltingly revoltress revolubility revoluble revolubly revolunteer revolute revoluted revolution revolutional revolutionally revolutionarily revolutionariness revolutionary revolutioneering revolutioner revolutionism revolutionist revolutionize revolutionizement revolutionizer revolvable revolvably revolve revolvement revolvency revolver revolving revolvingly revomit revote revue revuette revuist revulsed revulsion revulsionary revulsive revulsively rewade rewager rewake rewaken rewall rewallow reward rewardable rewardableness rewardably rewardedly rewarder rewardful rewardfulness rewarding rewardingly rewardless rewardproof rewarehouse rewarm rewarn rewash rewater rewave rewax rewaybill rewayle reweaken rewear reweave rewed reweigh reweigher reweight rewelcome reweld rewend rewet rewhelp rewhirl rewhisper rewhiten rewiden rewin rewind rewinder rewirable rewire rewish rewithdraw rewithdrawal rewood reword rework reworked rewound rewove rewoven rewrap rewrite rewriter Rex rex rexen reyield Reynard Reynold reyoke reyouth rezbanyite rhabdite rhabditiform Rhabditis rhabdium Rhabdocarpum Rhabdocoela rhabdocoelan rhabdocoele Rhabdocoelida rhabdocoelidan rhabdocoelous rhabdoid rhabdoidal rhabdolith rhabdom rhabdomal rhabdomancer rhabdomancy rhabdomantic rhabdomantist Rhabdomonas rhabdomyoma rhabdomyosarcoma rhabdomysarcoma rhabdophane rhabdophanite Rhabdophora rhabdophoran Rhabdopleura rhabdopod rhabdos rhabdosome rhabdosophy rhabdosphere rhabdus Rhacianectes Rhacomitrium Rhacophorus Rhadamanthine Rhadamanthus Rhadamanthys Rhaetian Rhaetic rhagades rhagadiform rhagiocrin rhagionid Rhagionidae rhagite Rhagodia rhagon rhagonate rhagose rhamn Rhamnaceae rhamnaceous rhamnal Rhamnales rhamnetin rhamninase rhamninose rhamnite rhamnitol rhamnohexite rhamnohexitol rhamnohexose rhamnonic rhamnose rhamnoside Rhamnus rhamphoid Rhamphorhynchus Rhamphosuchus rhamphotheca Rhapidophyllum Rhapis rhapontic rhaponticin rhapontin rhapsode rhapsodic rhapsodical rhapsodically rhapsodie rhapsodism rhapsodist rhapsodistic rhapsodize rhapsodomancy rhapsody Rhaptopetalaceae rhason rhasophore rhatania rhatany rhe Rhea rhea rheadine Rheae rhebok rhebosis rheeboc rheebok rheen rhegmatype rhegmatypy Rhegnopteri rheic Rheidae Rheiformes rhein rheinic rhema rhematic rhematology rheme Rhemish Rhemist Rhenish rhenium rheobase rheocrat rheologist rheology rheometer rheometric rheometry rheophile rheophore rheophoric rheoplankton rheoscope rheoscopic rheostat rheostatic rheostatics rheotactic rheotan rheotaxis rheotome rheotrope rheotropic rheotropism rhesian rhesus rhetor rhetoric rhetorical rhetorically rhetoricalness rhetoricals rhetorician rhetorize Rheum rheum rheumarthritis rheumatalgia rheumatic rheumatical rheumatically rheumaticky rheumatism rheumatismal rheumatismoid rheumative rheumatiz rheumatize rheumatoid rheumatoidal rheumatoidally rheumed rheumic rheumily rheuminess rheumy Rhexia rhexis rhigolene rhigosis rhigotic Rhina rhinal rhinalgia Rhinanthaceae Rhinanthus rhinarium rhincospasm rhine Rhineland Rhinelander rhinencephalic rhinencephalon rhinencephalous rhinenchysis Rhineodon Rhineodontidae rhinestone Rhineura rhineurynter Rhinidae rhinion rhinitis rhino Rhinobatidae Rhinobatus rhinobyon rhinocaul rhinocele rhinocelian rhinocerial rhinocerian rhinocerine rhinoceroid rhinoceros rhinoceroslike rhinocerotic Rhinocerotidae rhinocerotiform rhinocerotine rhinocerotoid rhinochiloplasty Rhinoderma rhinodynia rhinogenous rhinolalia rhinolaryngology rhinolaryngoscope rhinolite rhinolith rhinolithic rhinological rhinologist rhinology rhinolophid Rhinolophidae rhinolophine rhinopharyngeal rhinopharyngitis rhinopharynx Rhinophidae Rhinophis rhinophonia rhinophore rhinophyma rhinoplastic rhinoplasty rhinopolypus Rhinoptera Rhinopteridae rhinorrhagia rhinorrhea rhinorrheal rhinoscleroma rhinoscope rhinoscopic rhinoscopy rhinosporidiosis Rhinosporidium rhinotheca rhinothecal Rhinthonic Rhinthonica rhipidate rhipidion Rhipidistia rhipidistian rhipidium Rhipidoglossa rhipidoglossal rhipidoglossate Rhipidoptera rhipidopterous rhipiphorid Rhipiphoridae Rhipiptera rhipipteran rhipipterous Rhipsalis Rhiptoglossa rhizanthous rhizautoicous Rhizina Rhizinaceae rhizine rhizinous Rhizobium rhizocarp Rhizocarpeae rhizocarpean rhizocarpian rhizocarpic rhizocarpous rhizocaul rhizocaulus Rhizocephala rhizocephalan rhizocephalous rhizocorm Rhizoctonia rhizoctoniose rhizodermis Rhizodus Rhizoflagellata rhizoflagellate rhizogen rhizogenetic rhizogenic rhizogenous rhizoid rhizoidal rhizoma rhizomatic rhizomatous rhizome rhizomelic rhizomic rhizomorph rhizomorphic rhizomorphoid rhizomorphous rhizoneure rhizophagous rhizophilous Rhizophora Rhizophoraceae rhizophoraceous rhizophore rhizophorous rhizophyte rhizoplast rhizopod Rhizopoda rhizopodal rhizopodan rhizopodist rhizopodous Rhizopogon Rhizopus rhizosphere Rhizostomae Rhizostomata rhizostomatous rhizostome rhizostomous Rhizota rhizotaxis rhizotaxy rhizote rhizotic rhizotomi rhizotomy rho Rhoda rhodaline Rhodamine rhodamine rhodanate Rhodanian rhodanic rhodanine rhodanthe rhodeose Rhodes Rhodesian Rhodesoid rhodeswood Rhodian rhodic rhoding rhodinol rhodite rhodium rhodizite rhodizonic Rhodobacteriaceae Rhodobacterioideae rhodochrosite Rhodococcus Rhodocystis rhodocyte rhododendron rhodolite Rhodomelaceae rhodomelaceous rhodonite Rhodope rhodophane Rhodophyceae rhodophyceous rhodophyll Rhodophyllidaceae Rhodophyta rhodoplast rhodopsin Rhodora Rhodoraceae rhodorhiza rhodosperm Rhodospermeae rhodospermin rhodospermous Rhodospirillum Rhodothece Rhodotypos Rhodymenia Rhodymeniaceae rhodymeniaceous Rhodymeniales Rhoeadales Rhoecus Rhoeo rhomb rhombencephalon rhombenporphyr rhombic rhombical rhombiform rhomboclase rhomboganoid Rhomboganoidei rhombogene rhombogenic rhombogenous rhombohedra rhombohedral rhombohedrally rhombohedric rhombohedron rhomboid rhomboidal rhomboidally rhomboideus rhomboidly rhomboquadratic rhomborectangular rhombos rhombovate Rhombozoa rhombus rhonchal rhonchial rhonchus Rhonda rhopalic rhopalism rhopalium Rhopalocera rhopaloceral rhopalocerous Rhopalura rhotacism rhotacismus rhotacistic rhotacize rhubarb rhubarby rhumb rhumba rhumbatron Rhus rhyacolite rhyme rhymeless rhymelet rhymemaker rhymemaking rhymeproof rhymer rhymery rhymester rhymewise rhymic rhymist rhymy Rhynchobdellae Rhynchobdellida Rhynchocephala Rhynchocephali Rhynchocephalia rhynchocephalian rhynchocephalic rhynchocephalous Rhynchocoela rhynchocoelan rhynchocoelic rhynchocoelous rhyncholite Rhynchonella Rhynchonellacea Rhynchonellidae rhynchonelloid Rhynchophora rhynchophoran rhynchophore rhynchophorous Rhynchopinae Rhynchops Rhynchosia Rhynchospora Rhynchota rhynchotal rhynchote rhynchotous rhynconellid Rhyncostomi Rhynia Rhyniaceae Rhynocheti Rhynsburger rhyobasalt rhyodacite rhyolite rhyolitic rhyotaxitic rhyparographer rhyparographic rhyparographist rhyparography rhypography rhyptic rhyptical rhysimeter Rhyssa rhythm rhythmal rhythmic rhythmical rhythmicality rhythmically rhythmicity rhythmicize rhythmics rhythmist rhythmizable rhythmization rhythmize rhythmless rhythmometer rhythmopoeia rhythmproof Rhytidodon rhytidome rhytidosis Rhytina Rhytisma rhyton ria rial riancy riant riantly riata rib ribald ribaldish ribaldly ribaldrous ribaldry riband Ribandism Ribandist ribandlike ribandmaker ribandry ribat ribaudequin ribaudred ribband ribbandry ribbed ribber ribbet ribbidge ribbing ribble ribbon ribbonback ribboner ribbonfish Ribbonism ribbonlike ribbonmaker Ribbonman ribbonry ribbonweed ribbonwood ribbony ribby ribe Ribes Ribhus ribless riblet riblike riboflavin ribonic ribonuclease ribonucleic ribose ribroast ribroaster ribroasting ribskin ribspare Ribston ribwork ribwort Ric Ricardian Ricardianism Ricardo Riccia Ricciaceae ricciaceous Ricciales rice ricebird riceland ricer ricey Rich rich Richard Richardia Richardsonia richdom Richebourg richellite richen riches richesse richling richly Richmond Richmondena richness richt richterite richweed ricin ricine ricinelaidic ricinelaidinic ricinic ricinine ricininic ricinium ricinoleate ricinoleic ricinolein ricinolic Ricinulei Ricinus ricinus Rick rick rickardite ricker ricketily ricketiness ricketish rickets Rickettsia rickettsial Rickettsiales rickettsialpox rickety rickey rickle rickmatic rickrack ricksha rickshaw rickstaddle rickstand rickstick Ricky rickyard ricochet ricolettaite ricrac rictal rictus rid ridable ridableness ridably riddam riddance riddel ridden ridder ridding riddle riddlemeree riddler riddling riddlingly riddlings ride rideable rideau riden rident rider ridered rideress riderless ridge ridgeband ridgeboard ridgebone ridged ridgel ridgelet ridgelike ridgeling ridgepiece ridgeplate ridgepole ridgepoled ridger ridgerope ridgetree ridgeway ridgewise ridgil ridging ridgingly ridgling ridgy ridibund ridicule ridiculer ridiculize ridiculosity ridiculous ridiculously ridiculousness riding ridingman ridotto rie riebeckite riem Riemannean Riemannian riempie rier Riesling rife rifely rifeness Riff riff Riffi Riffian riffle riffler riffraff Rifi Rifian rifle riflebird rifledom rifleman riflemanship rifleproof rifler riflery rifleshot rifling rift rifter riftless rifty rig rigadoon rigamajig rigamarole rigation rigbane Rigel Rigelian rigescence rigescent riggald rigger rigging riggish riggite riggot right rightabout righten righteous righteously righteousness righter rightful rightfully rightfulness rightheaded righthearted rightist rightle rightless rightlessness rightly rightmost rightness righto rightship rightward rightwardly rightwards righty rigid rigidify rigidist rigidity rigidly rigidness rigidulous rigling rigmaree rigmarole rigmarolery rigmarolic rigmarolish rigmarolishly rignum rigol rigolette rigor rigorism rigorist rigoristic rigorous rigorously rigorousness rigsby rigsdaler Rigsmaal Rigsmal rigwiddie rigwiddy Rik Rikari rikisha rikk riksha rikshaw Riksmaal Riksmal rilawa rile riley rill rillet rillett rillette rillock rillstone rilly rim rima rimal rimate rimbase rime rimeless rimer rimester rimfire rimiform rimland rimless rimmaker rimmaking rimmed rimmer rimose rimosely rimosity rimous rimpi rimple rimption rimrock rimu rimula rimulose rimy Rinaldo rinceau rinch rincon Rind rind Rinde rinded rinderpest rindle rindless rindy rine ring ringable Ringatu ringbark ringbarker ringbill ringbird ringbolt ringbone ringboned ringcraft ringdove ringe ringed ringent ringer ringeye ringgiver ringgiving ringgoer ringhals ringhead ringiness ringing ringingly ringingness ringite ringle ringlead ringleader ringleaderless ringleadership ringless ringlet ringleted ringlety ringlike ringmaker ringmaking ringman ringmaster ringneck ringsail ringside ringsider ringster ringtail ringtaw ringtime ringtoss ringwalk ringwall ringwise ringworm ringy rink rinka rinker rinkite rinncefada rinneite rinner rinsable rinse rinser rinsing rinthereout rintherout Rio rio riot rioter rioting riotingly riotist riotistic riotocracy riotous riotously riotousness riotproof riotry rip ripa ripal riparial riparian Riparii riparious ripcord ripe ripelike ripely ripen ripener ripeness ripening ripeningly riper ripgut ripicolous ripidolite ripienist ripieno ripier ripost riposte rippable ripper ripperman rippet rippier ripping rippingly rippingness rippit ripple rippleless rippler ripplet rippling ripplingly ripply rippon riprap riprapping ripsack ripsaw ripsnorter ripsnorting Ripuarian ripup riroriro risala risberm rise risen riser rishi rishtadar risibility risible risibleness risibles risibly rising risk risker riskful riskfulness riskily riskiness riskish riskless riskproof risky risorial risorius risp risper risque risquee Riss rissel risser Rissian rissle Rissoa rissoid Rissoidae rist ristori rit Rita rita Ritalynne ritardando Ritchey rite riteless ritelessness ritling ritornel ritornelle ritornello Ritschlian Ritschlianism rittingerite ritual ritualism ritualist ritualistic ritualistically rituality ritualize ritualless ritually ritzy riva rivage rival rivalable rivaless rivalism rivality rivalize rivalless rivalrous rivalry rivalship rive rivel rivell riven river riverain riverbank riverbush riverdamp rivered riverhead riverhood riverine riverish riverless riverlet riverlike riverling riverly riverman riverscape riverside riversider riverward riverwards riverwash riverway riverweed riverwise rivery rivet riveter rivethead riveting rivetless rivetlike Rivina riving rivingly Rivinian rivose Rivularia Rivulariaceae rivulariaceous rivulation rivulet rivulose rix rixatrix rixy riyal riziform rizzar rizzle rizzom rizzomed rizzonite Ro roach roachback road roadability roadable roadbed roadblock roadbook roadcraft roaded roader roadfellow roadhead roadhouse roading roadite roadless roadlessness roadlike roadman roadmaster roadside roadsider roadsman roadstead roadster roadstone roadtrack roadway roadweed roadwise roadworthiness roadworthy roam roamage roamer roaming roamingly roan roanoke roar roarer roaring roaringly roast roastable roaster roasting roastingly Rob rob robalito robalo roband robber robberproof robbery Robbin robbin robbing robe robeless Robenhausian rober roberd Roberdsman Robert Roberta Roberto Robigalia Robigus Robin robin robinet robing Robinia robinin robinoside roble robomb roborant roborate roboration roborative roborean roboreous robot robotesque robotian robotism robotistic robotization robotize robotlike robotry robur roburite robust robustful robustfully robustfulness robustic robusticity robustious robustiously robustiousness robustity robustly robustness roc rocambole Roccella Roccellaceae roccellic roccellin roccelline Rochea rochelime Rochelle rocher rochet rocheted rock rockable rockably rockaby rockabye rockallite Rockaway rockaway rockbell rockberry rockbird rockborn rockbrush rockcist rockcraft rockelay rocker rockery rocket rocketeer rocketer rocketlike rocketor rocketry rockety rockfall rockfish rockfoil rockhair rockhearted Rockies rockiness rocking rockingly rockish rocklay rockless rocklet rocklike rockling rockman rockrose rockshaft rockslide rockstaff rocktree rockward rockwards rockweed rockwood rockwork rocky rococo Rocouyenne rocta Rod rod rodd roddikin roddin rodding rode Rodent rodent Rodentia rodential rodentially rodentian rodenticidal rodenticide rodentproof rodeo Roderic Roderick rodge Rodger rodham Rodinal Rodinesque roding rodingite rodknight rodless rodlet rodlike rodmaker rodman Rodney rodney Rodolph Rodolphus rodomont rodomontade rodomontadist rodomontador rodsman rodster rodwood roe roeblingite roebuck roed roelike roentgen roentgenism roentgenization roentgenize roentgenogram roentgenograph roentgenographic roentgenographically roentgenography roentgenologic roentgenological roentgenologically roentgenologist roentgenology roentgenometer roentgenometry roentgenoscope roentgenoscopic roentgenoscopy roentgenotherapy roentgentherapy roer roestone roey rog rogan rogation Rogationtide rogative rogatory Roger roger Rogero rogersite roggle Rogue rogue roguedom rogueling roguery rogueship roguing roguish roguishly roguishness rohan Rohilla rohob rohun rohuna roi roid roil roily Roist roister roisterer roistering roisteringly roisterly roisterous roisterously roit Rok roka roke rokeage rokee rokelay roker rokey roky Roland Rolandic role roleo Rolf Rolfe roll rollable rollback rolled rollejee roller rollerer rollermaker rollermaking rollerman rollerskater rollerskating rolley rolleyway rolleywayman rolliche rollichie rollick rollicker rollicking rollickingly rollickingness rollicksome rollicksomeness rollicky rolling rollingly Rollinia rollix rollmop Rollo rollock rollway roloway Romaean Romagnese Romagnol Romagnole Romaic romaika Romain romaine Romaji romal Roman Romance romance romancealist romancean romanceful romanceish romanceishness romanceless romancelet romancelike romancemonger romanceproof romancer romanceress romancical romancing romancist romancy Romandom Romane Romanes Romanese Romanesque Romanhood Romanian Romanic Romaniform Romanish Romanism Romanist Romanistic Romanite Romanity romanium Romanization Romanize Romanizer Romanly Romansch Romansh romantic romantical romanticalism romanticality romantically romanticalness romanticism romanticist romanticistic romanticity romanticize romanticly romanticness romantism romantist Romany romanza romaunt rombos rombowline Rome romeite Romeo romerillo romero Romescot Romeshot Romeward Romewards Romic Romipetal Romish Romishly Romishness rommack Rommany Romney Romneya romp romper romping rompingly rompish rompishly rompishness rompu rompy Romulian Romulus Ron Ronald roncador Roncaglian roncet ronco rond rondache rondacher rondawel ronde rondeau rondel rondelet Rondeletia rondelier rondelle rondellier rondino rondle rondo rondoletto rondure rone Rong Ronga rongeur Ronni ronquil Ronsardian Ronsardism Ronsardist Ronsardize Ronsdorfer Ronsdorfian rontgen ronyon rood roodebok roodle roodstone roof roofage roofer roofing roofless rooflet rooflike roofman rooftree roofward roofwise roofy rooibok rooinek rook rooker rookeried rookery rookie rookish rooklet rooklike rooky rool room roomage roomed roomer roomful roomie roomily roominess roomkeeper roomless roomlet roommate roomstead roomth roomthily roomthiness roomthy roomward roomy roon roorback roosa Roosevelt Rooseveltian roost roosted rooster roosterfish roosterhood roosterless roosters roostership Root root rootage rootcap rooted rootedly rootedness rooter rootery rootfast rootfastness roothold rootiness rootle rootless rootlessness rootlet rootlike rootling rootstalk rootstock rootwalt rootward rootwise rootworm rooty roove ropable rope ropeable ropeband ropebark ropedance ropedancer ropedancing ropelayer ropelaying ropelike ropemaker ropemaking ropeman roper roperipe ropery ropes ropesmith ropetrick ropewalk ropewalker ropeway ropework ropily ropiness roping ropish ropishness ropp ropy roque roquelaure roquer roquet roquette roquist roral roratorio Rori roric Roridula Roridulaceae roriferous rorifluent Roripa Rorippa roritorious rorqual rorty rorulent rory Rosa Rosabel Rosabella Rosaceae rosacean rosaceous rosal Rosales Rosalia Rosalie Rosalind Rosaline Rosamond rosanilin rosaniline rosarian rosario rosarium rosaruby rosary rosated Roschach roscherite roscid roscoelite rose roseal roseate roseately rosebay rosebud rosebush rosed rosedrop rosefish rosehead rosehill rosehiller roseine rosel roseless roselet roselike roselite rosella rosellate roselle Rosellinia rosemary Rosenbergia rosenbuschite roseola roseolar roseoliform roseolous roseous roseroot rosery roset rosetan rosetangle rosetime Rosetta rosette rosetted rosetty rosetum rosety roseways rosewise rosewood rosewort Rosicrucian Rosicrucianism rosied rosier rosieresite rosilla rosillo rosily rosin rosinate rosinduline Rosine rosiness rosinous rosinweed rosinwood rosiny rosland rosmarine Rosmarinus Rosminian Rosminianism rosoli rosolic rosolio rosolite rosorial Ross ross rosser rossite rostel rostellar Rostellaria rostellarian rostellate rostelliform rostellum roster rostra rostral rostrally rostrate rostrated rostriferous rostriform rostroantennary rostrobranchial rostrocarinate rostrocaudal rostroid rostrolateral rostrular rostrulate rostrulum rostrum rosular rosulate rosy rot rota rotacism Rotal rotal Rotala Rotalia rotalian rotaliform rotaliiform rotaman rotameter rotan Rotanev rotang Rotarian Rotarianism rotarianize Rotary rotary rotascope rotatable rotate rotated rotating rotation rotational rotative rotatively rotativism rotatodentate rotatoplane rotator Rotatoria rotatorian rotatory rotch rote rotella rotenone roter rotge rotgut rother rothermuck rotifer Rotifera rotiferal rotiferan rotiferous rotiform rotisserie roto rotograph rotogravure rotor rotorcraft rotproof Rotse rottan rotten rottenish rottenly rottenness rottenstone rotter rotting rottle rottlera rottlerin rottock rottolo rotula rotulad rotular rotulet rotulian rotuliform rotulus rotund rotunda rotundate rotundifoliate rotundifolious rotundiform rotundify rotundity rotundly rotundness rotundo rotundotetragonal roub roucou roud roue rouelle rouge rougeau rougeberry rougelike rougemontite rougeot rough roughage roughcast roughcaster roughdraft roughdraw roughdress roughdry roughen roughener rougher roughet roughhearted roughheartedness roughhew roughhewer roughhewn roughhouse roughhouser roughhousing roughhousy roughie roughing roughings roughish roughishly roughishness roughleg roughly roughness roughometer roughride roughrider roughroot roughscuff roughsetter roughshod roughslant roughsome roughstring roughstuff roughtail roughtailed roughwork roughwrought roughy rougy rouille rouky roulade rouleau roulette Rouman Roumeliote roun rounce rounceval rouncy round roundabout roundaboutly roundaboutness rounded roundedly roundedness roundel roundelay roundeleer rounder roundfish roundhead roundheaded roundheadedness roundhouse rounding roundish roundishness roundlet roundline roundly roundmouthed roundness roundnose roundnosed roundridge roundseam roundsman roundtail roundtop roundtree roundup roundwise roundwood roundworm roundy roup rouper roupet roupily roupingwife roupit roupy rouse rouseabout rousedness rousement rouser rousing rousingly Rousseau Rousseauan Rousseauism Rousseauist Rousseauistic Rousseauite Roussellian roussette Roussillon roust roustabout rouster rousting rout route router routh routhercock routhie routhiness routhy routinary routine routineer routinely routing routinish routinism routinist routinization routinize routivarite routous routously rouvillite rove rover rovet rovetto roving rovingly rovingness row rowable rowan rowanberry rowboat rowdily rowdiness rowdy rowdydow rowdydowdy rowdyish rowdyishly rowdyishness rowdyism rowdyproof rowed rowel rowelhead rowen Rowena rower rowet rowiness rowing Rowland rowlandite Rowleian rowlet Rowley Rowleyan rowlock rowport rowty rowy rox Roxana Roxane Roxanne Roxburgh Roxburghiaceae Roxbury Roxie Roxolani Roxy roxy Roy royal royale royalet royalism royalist royalization royalize royally royalty Royena royet royetness royetous royetously Roystonea royt rozum Rua ruach ruana rub rubasse rubato rubbed rubber rubberer rubberize rubberless rubberneck rubbernecker rubbernose rubbers rubberstone rubberwise rubbery rubbing rubbingstone rubbish rubbishing rubbishingly rubbishly rubbishry rubbishy rubble rubbler rubblestone rubblework rubbly rubdown Rube rubedinous rubedity rubefacient rubefaction rubelet rubella rubelle rubellite rubellosis Rubensian rubeola rubeolar rubeoloid ruberythric ruberythrinic rubescence rubescent Rubia Rubiaceae rubiaceous Rubiales rubianic rubiate rubiator rubican rubicelle Rubicola Rubicon rubiconed rubicund rubicundity rubidic rubidine rubidium rubied rubific rubification rubificative rubify rubiginous rubijervine rubine rubineous rubious ruble rublis rubor rubric rubrica rubrical rubricality rubrically rubricate rubrication rubricator rubrician rubricism rubricist rubricity rubricize rubricose rubrific rubrification rubrify rubrisher rubrospinal rubstone Rubus ruby rubylike rubytail rubythroat rubywise rucervine Rucervus Ruchbah ruche ruching ruck rucker ruckle ruckling rucksack rucksey ruckus rucky ructation ruction rud rudas Rudbeckia rudd rudder rudderhead rudderhole rudderless rudderlike rudderpost rudderstock ruddied ruddily ruddiness ruddle ruddleman ruddock ruddy ruddyish rude rudely rudeness rudented rudenture ruderal rudesby Rudesheimer rudge rudiment rudimental rudimentarily rudimentariness rudimentary rudimentation rudish Rudista Rudistae rudistan rudistid rudity Rudmasday Rudolf Rudolph Rudolphus Rudy rue rueful ruefully ruefulness ruelike ruelle Ruellia ruen ruer ruesome ruesomeness ruewort rufescence rufescent ruff ruffable ruffed ruffer ruffian ruffianage ruffiandom ruffianhood ruffianish ruffianism ruffianize ruffianlike ruffianly ruffiano ruffin ruffle ruffled ruffleless rufflement ruffler rufflike ruffliness ruffling ruffly ruficarpous ruficaudate ruficoccin ruficornate rufigallic rufoferruginous rufofulvous rufofuscous rufopiceous rufotestaceous rufous rufter rufulous Rufus rufus rug ruga rugate Rugbeian Rugby rugged ruggedly ruggedness Rugger rugging ruggle ruggy rugheaded ruglike rugmaker rugmaking Rugosa rugosa rugose rugosely rugosity rugous rugulose ruin ruinable ruinate ruination ruinatious ruinator ruined ruiner ruing ruiniform ruinlike ruinous ruinously ruinousness ruinproof Rukbat rukh rulable Rulander rule ruledom ruleless rulemonger ruler rulership ruling rulingly rull ruller rullion Rum rum rumal Ruman Rumanian rumbelow rumble rumblegarie rumblegumption rumblement rumbler rumbling rumblingly rumbly rumbo rumbooze rumbowline rumbowling rumbullion rumbumptious rumbustical rumbustious rumbustiousness rumchunder Rumelian rumen rumenitis rumenocentesis rumenotomy Rumex rumfustian rumgumption rumgumptious ruminal ruminant Ruminantia ruminantly ruminate ruminating ruminatingly rumination ruminative ruminatively ruminator rumkin rumless rumly rummage rummager rummagy rummer rummily rumminess rummish rummy rumness rumney rumor rumorer rumormonger rumorous rumorproof rumourmonger rump rumpad rumpadder rumpade Rumper rumple rumpless rumply rumpscuttle rumpuncheon rumpus rumrunner rumrunning rumshop rumswizzle rumtytoo run runabout runagate runaround runaway runback runboard runby runch runchweed runcinate rundale Rundi rundle rundlet rune runecraft runed runefolk runeless runelike runer runesmith runestaff runeword runfish rung runghead rungless runholder runic runically runiform runite runkeeper runkle runkly runless runlet runman runnable runnel runner runnet running runningly runny runoff runologist runology runout runover runproof runrig runround runt runted runtee runtiness runtish runtishly runtishness runty runway rupa rupee Rupert rupestral rupestrian rupestrine rupia rupiah rupial Rupicapra Rupicaprinae rupicaprine Rupicola Rupicolinae rupicoline rupicolous rupie rupitic Ruppia ruptile ruption ruptive ruptuary rupturable rupture ruptured rupturewort rural ruralism ruralist ruralite rurality ruralization ruralize rurally ruralness rurban ruridecanal rurigenous Ruritania Ruritanian ruru Rus Rusa Ruscus ruse rush rushbush rushed rushen rusher rushiness rushing rushingly rushingness rushland rushlight rushlighted rushlike rushlit rushy Rusin rusine rusk ruskin Ruskinian rusky rusma rusot ruspone Russ russel Russelia Russell Russellite Russene russet russeting russetish russetlike russety Russia russia Russian Russianism Russianist Russianization Russianize Russification Russificator Russifier Russify Russine Russism Russniak Russolatrous Russolatry Russomania Russomaniac Russomaniacal Russophile Russophilism Russophilist Russophobe Russophobia Russophobiac Russophobism Russophobist russud Russula rust rustable rustful rustic rustical rustically rusticalness rusticate rustication rusticator rusticial rusticism rusticity rusticize rusticly rusticness rusticoat rustily rustiness rustle rustler rustless rustling rustlingly rustlingness rustly rustproof rustre rustred Rusty rusty rustyback rustyish ruswut rut Ruta rutabaga Rutaceae rutaceous rutaecarpine rutate rutch rutelian Rutelinae Ruth ruth ruthenate Ruthene Ruthenian ruthenic ruthenious ruthenium ruthenous ruther rutherford rutherfordine rutherfordite ruthful ruthfully ruthfulness ruthless ruthlessly ruthlessness rutic rutidosis rutilant rutilated rutile rutilous rutin rutinose Rutiodon ruttee rutter ruttiness ruttish ruttishly ruttishness rutty Rutuli rutyl rutylene ruvid rux rvulsant ryal ryania rybat ryder rye ryen Rymandra ryme Rynchospora rynchosporous rynd rynt ryot ryotwar ryotwari rype rypeck rytidosis Rytina Ryukyu S s sa saa Saad Saan Saarbrucken sab Saba sabadilla sabadine sabadinine Sabaean Sabaeanism Sabaeism sabaigrass Sabaism Sabaist Sabal Sabalaceae sabalo Saban sabanut Sabaoth Sabathikos Sabazian Sabazianism Sabazios sabbat Sabbatarian Sabbatarianism Sabbatary Sabbatean Sabbath sabbath Sabbathaian Sabbathaic Sabbathaist Sabbathbreaker Sabbathbreaking Sabbathism Sabbathize Sabbathkeeper Sabbathkeeping Sabbathless Sabbathlike Sabbathly Sabbatia sabbatia Sabbatian Sabbatic sabbatic Sabbatical sabbatical Sabbatically Sabbaticalness sabbatine sabbatism Sabbatist Sabbatization Sabbatize sabbaton sabbitha sabdariffa sabe sabeca Sabella sabella sabellan Sabellaria sabellarian Sabelli Sabellian Sabellianism Sabellianize sabellid Sabellidae sabelloid saber saberbill sabered saberleg saberlike saberproof sabertooth saberwing Sabia Sabiaceae sabiaceous Sabian Sabianism sabicu Sabik Sabina sabina Sabine sabine Sabinian sabino Sabir sable sablefish sableness sably sabora saboraim sabot sabotage saboted saboteur sabotine Sabra sabra sabretache Sabrina Sabromin sabromin Sabuja sabuline sabulite sabulose sabulosity sabulous sabulum saburra saburral saburration sabutan sabzi Sac sac Sacae sacalait sacaline sacaton sacatra sacbrood saccade saccadic Saccammina saccate saccated Saccha saccharamide saccharase saccharate saccharated saccharephidrosis saccharic saccharide sacchariferous saccharification saccharifier saccharify saccharilla saccharimeter saccharimetric saccharimetrical saccharimetry saccharin saccharinate saccharinated saccharine saccharineish saccharinely saccharinic saccharinity saccharization saccharize saccharobacillus saccharobiose saccharobutyric saccharoceptive saccharoceptor saccharochemotropic saccharocolloid saccharofarinaceous saccharogalactorrhea saccharogenic saccharohumic saccharoid saccharoidal saccharolactonic saccharolytic saccharometabolic saccharometabolism saccharometer saccharometric saccharometry saccharomucilaginous Saccharomyces saccharomyces Saccharomycetaceae saccharomycetaceous Saccharomycetales saccharomycete Saccharomycetes saccharomycetic saccharomycosis saccharon saccharonate saccharone saccharonic saccharophylly saccharorrhea saccharoscope saccharose saccharostarchy saccharosuria saccharotriose saccharous saccharulmic saccharulmin Saccharum saccharum saccharuria sacciferous sacciform Saccobranchiata saccobranchiate Saccobranchus saccoderm Saccolabium saccolabium saccomyian saccomyid Saccomyidae Saccomyina saccomyine saccomyoid Saccomyoidea saccomyoidean Saccomys Saccopharyngidae Saccopharynx Saccorhiza saccos saccular sacculate sacculated sacculation saccule Sacculina sacculoutricular sacculus saccus sacellum sacerdocy sacerdotage sacerdotal sacerdotalism sacerdotalist sacerdotalize sacerdotally sacerdotical sacerdotism sachamaker sachem sachemdom sachemic sachemship sachet Sacheverell Sacian sack sackage sackamaker sackbag sackbut sackcloth sackclothed sackdoudle sacked sacken sacker sackful sacking sackless sacklike sackmaker sackmaking sackman sacktime saclike saco sacope sacque sacra sacrad sacral sacralgia sacralization sacrament sacramental sacramentalism sacramentalist sacramentality sacramentally sacramentalness Sacramentarian sacramentarian sacramentarianism sacramentarist Sacramentary sacramentary sacramenter sacramentism sacramentize Sacramento sacramentum sacraria sacrarial sacrarium sacrectomy sacred sacredly sacredness sacrificable sacrificant Sacrificati sacrification sacrificator sacrificatory sacrificature sacrifice sacrificer sacrificial sacrificially sacrificing sacrilege sacrileger sacrilegious sacrilegiously sacrilegiousness sacrilegist sacrilumbal sacrilumbalis sacring Sacripant sacrist sacristan sacristy sacro sacrocaudal sacrococcygeal sacrococcygean sacrococcygeus sacrococcyx sacrocostal sacrocotyloid sacrocotyloidean sacrocoxalgia sacrocoxitis sacrodorsal sacrodynia sacrofemoral sacroiliac sacroinguinal sacroischiac sacroischiadic sacroischiatic sacrolumbal sacrolumbalis sacrolumbar sacropectineal sacroperineal sacropictorial sacroposterior sacropubic sacrorectal sacrosanct sacrosanctity sacrosanctness sacrosciatic sacrosecular sacrospinal sacrospinalis sacrospinous sacrotomy sacrotuberous sacrovertebral sacrum sad Sadachbia Sadalmelik Sadalsuud sadden saddening saddeningly saddik saddirham saddish saddle saddleback saddlebag saddlebow saddlecloth saddled saddleleaf saddleless saddlelike saddlenose saddler saddlery saddlesick saddlesore saddlesoreness saddlestead saddletree saddlewise saddling Sadducaic Sadducean Sadducee Sadduceeism Sadduceeist Sadducism Sadducize sade sadh sadhe sadhearted sadhu sadic Sadie sadiron sadism sadist sadistic sadistically Sadite sadly sadness sado sadomasochism Sadr sadr saecula saeculum Saeima saernaite saeter saeume Safar safari Safavi Safawid safe safeblower safeblowing safebreaker safebreaking safecracking safeguard safeguarder safehold safekeeper safekeeping safelight safely safemaker safemaking safen safener safeness safety Saffarian Saffarid saffian safflor safflorite safflow safflower saffron saffroned saffrontree saffronwood saffrony Safi Safine Safini safranin safranine safranophile safrole saft sag saga sagaciate sagacious sagaciously sagaciousness sagacity Sagai sagaie sagaman sagamite sagamore sagapenum sagathy sage sagebrush sagebrusher sagebush sageleaf sagely sagene sageness sagenite sagenitic Sageretia sagerose sageship sagewood sagger sagging saggon saggy saghavart Sagina saginate sagination saging Sagitarii sagitta sagittal sagittally Sagittaria Sagittariid Sagittarius sagittarius Sagittary sagittary sagittate Sagittid sagittiferous sagittiform sagittocyst sagittoid sagless sago sagoin sagolike Sagra saguaro Saguerus sagum saguran sagvandite sagwire sagy sah Sahadeva Sahaptin Sahara Saharan Saharian Saharic sahh sahib Sahibah Sahidic sahme Saho sahoukar sahukar sai saic said Saidi Saify saiga Saiid sail sailable sailage sailboat sailcloth sailed sailer sailfish sailflying sailing sailingly sailless sailmaker sailmaking sailor sailoring sailorizing sailorless sailorlike sailorly sailorman sailorproof sailplane sailship sailsman saily saim saimiri saimy sain Sainfoin saint saintdom sainted saintess sainthood saintish saintism saintless saintlike saintlily saintliness saintling saintly saintologist saintology Saintpaulia saintship saip Saiph sair sairly sairve sairy Saite saithe Saitic Saiva Saivism saj sajou Sak Saka Sakai Sakalava sake sakeber sakeen Sakel Sakelarides Sakell Sakellaridis saker sakeret Sakha saki sakieh Sakkara Saktism sakulya Sakyamuni Sal sal salaam salaamlike salability salable salableness salably salaceta salacious salaciously salaciousness salacity salacot salad salading salago salagrama salal salamandarin salamander salamanderlike Salamandra salamandrian Salamandridae salamandriform Salamandrina salamandrine salamandroid salambao Salaminian salamo salampore salangane salangid Salangidae Salar salar salariat salaried salary salaryless salat salay sale salegoer salele salema salenixon salep saleratus saleroom salesclerk Salesian saleslady salesman salesmanship salespeople salesperson salesroom saleswoman salework saleyard salfern Salian Saliaric Salic salic Salicaceae salicaceous Salicales Salicariaceae salicetum salicin salicional salicorn Salicornia salicyl salicylal salicylaldehyde salicylamide salicylanilide salicylase salicylate salicylic salicylide salicylidene salicylism salicylize salicylous salicyluric salicylyl salience salient Salientia salientian saliently saliferous salifiable salification salify saligenin saligot salimeter salimetry Salina salina Salinan salination saline Salinella salinelle salineness saliniferous salinification saliniform salinity salinize salinometer salinometry salinosulphureous salinoterreous Salisburia Salish Salishan salite salited Saliva saliva salival Salivan salivant salivary salivate salivation salivator salivatory salivous Salix salix salle sallee salleeman sallenders sallet sallier salloo sallow sallowish sallowness sallowy Sally sally Sallybloom sallyman sallywood Salm salma salmagundi salmiac salmine salmis Salmo Salmon salmon salmonberry Salmonella salmonella salmonellae salmonellosis salmonet salmonid Salmonidae salmoniform salmonlike salmonoid Salmonoidea Salmonoidei salmonsite salmwood salnatron Salol salol Salome salometer salometry salomon Salomonia Salomonian Salomonic salon saloon saloonist saloonkeeper saloop Salopian salopian salp Salpa salpa salpacean salpian salpicon Salpidae salpiform Salpiglossis salpiglossis salpingectomy salpingemphraxis salpinges salpingian salpingion salpingitic salpingitis salpingocatheterism salpingocele salpingocyesis salpingomalleus salpingonasal salpingopalatal salpingopalatine salpingoperitonitis salpingopexy salpingopharyngeal salpingopharyngeus salpingopterygoid salpingorrhaphy salpingoscope salpingostaphyline salpingostenochoria salpingostomatomy salpingostomy salpingotomy salpinx salpoid salse salsifis salsify salsilla Salsola Salsolaceae salsolaceous salsuginous salt salta saltant saltarella saltarello saltary saltate saltation saltativeness Saltator saltator Saltatoria saltatorial saltatorian saltatoric saltatorious saltatory saltbush saltcat saltcatch saltcellar salted saltee salten salter saltern saltery saltfat saltfoot salthouse saltier saltierra saltierwise Saltigradae saltigrade saltimbanco saltimbank saltimbankery saltine saltiness salting saltish saltishly saltishness saltless saltlessness saltly saltmaker saltmaking saltman saltmouth saltness saltometer saltorel saltpan saltpeter saltpetrous saltpond saltspoon saltspoonful saltsprinkler saltus saltweed saltwife saltworker saltworks saltwort salty salubrify salubrious salubriously salubriousness salubrity saluki salung salutarily salutariness salutary salutation salutational salutationless salutatious salutatorian salutatorily salutatorium salutatory salute saluter salutiferous salutiferously Salva salvability salvable salvableness salvably Salvadora salvadora Salvadoraceae salvadoraceous Salvadoran Salvadorian salvage salvageable salvagee salvageproof salvager salvaging Salvarsan salvarsan salvatella salvation salvational salvationism salvationist salvatory salve salveline Salvelinus salver salverform Salvia salvianin salvific salvifical salvifically Salvinia Salviniaceae salviniaceous Salviniales salviol salvo salvor salvy Salwey salzfelle Sam sam Samadera samadh samadhi samaj Samal saman Samandura Samani Samanid Samantha samara samaria samariform Samaritan Samaritaness Samaritanism samarium Samarkand samaroid samarra samarskite Samas samba Sambal sambal sambaqui sambar Sambara Sambathe sambhogakaya Sambo sambo Sambucaceae Sambucus sambuk sambuke sambunigrin Samburu same samekh samel sameliness samely samen sameness samesome Samgarnebo samh Samhain samhita Samian samiel Samir samiresite samiri samisen Samish samite samkara samlet sammel sammer sammier Sammy sammy Samnani Samnite Samoan Samogitian samogonka Samolus Samosatenian samothere Samotherium Samothracian samovar Samoyed Samoyedic samp sampaguita sampaloc sampan samphire sampi sample sampleman sampler samplery sampling Sampsaean Samsam samsara samshu Samsien samskara Samson samson Samsoness Samsonian Samsonic Samsonistic samsonite Samucan Samucu Samuel samurai Samydaceae San san sanability sanable sanableness sanai Sanand sanative sanativeness sanatoria sanatorium sanatory Sanballat sanbenito Sanche sancho sanct sancta sanctanimity sanctifiable sanctifiableness sanctifiably sanctificate sanctification sanctified sanctifiedly sanctifier sanctify sanctifyingly sanctilogy sanctiloquent sanctimonial sanctimonious sanctimoniously sanctimoniousness sanctimony sanction sanctionable sanctionary sanctionative sanctioner sanctionist sanctionless sanctionment sanctitude sanctity sanctologist Sanctology sanctorium sanctuaried sanctuarize sanctuary sanctum Sanctus Sancy sancyite sand sandak sandal sandaled sandaliform sandaling sandalwood sandalwort sandan sandarac sandaracin sandastros Sandawe sandbag sandbagger sandbank sandbin sandblast sandboard sandbox sandboy sandbur sandclub sandculture sanded Sandeep Sandemanian Sandemanianism Sandemanism Sander sander sanderling sanders sandfish sandflower sandglass sandheat sandhi sandiferous sandiness sanding Sandip sandiver sandix sandlapper sandless sandlike sandling sandman sandnatter sandnecker sandpaper sandpaperer sandpeep sandpiper sandproof Sandra sandrock sandspit sandspur sandstay sandstone sandstorm sandust sandweed sandweld sandwich sandwood sandworm sandwort Sandy sandy sandyish sane sanely saneness Sanetch Sanford Sanforized sang sanga Sangamon sangar sangaree sangei sanger sangerbund sangerfest Sanggil sangha Sangho Sangir Sangirese sanglant sangley Sangraal sangreeroot sangrel sangsue sanguicolous sanguifacient sanguiferous sanguification sanguifier sanguifluous sanguimotor sanguimotory sanguinaceous Sanguinaria sanguinarily sanguinariness sanguinary sanguine sanguineless sanguinely sanguineness sanguineobilious sanguineophlegmatic sanguineous sanguineousness sanguineovascular sanguinicolous sanguiniferous sanguinification sanguinism sanguinity sanguinivorous sanguinocholeric sanguinolency sanguinolent sanguinopoietic sanguinous Sanguisorba Sanguisorbaceae sanguisuge sanguisugent sanguisugous sanguivorous Sanhedrim Sanhedrin Sanhedrist Sanhita sanicle Sanicula sanidine sanidinic sanidinite sanies sanification sanify sanious sanipractic sanitarian sanitarily sanitarist sanitarium sanitary sanitate sanitation sanitationist sanitist sanitize Sanity sanity sanjak sanjakate sanjakbeg sanjakship Sanjay Sanjeev Sanjib sank sankha Sankhya sannaite Sannoisian sannup sannyasi sannyasin sanopurulent sanoserous Sanpoil sans Sansar sansei Sansevieria sanshach sansi Sanskrit Sanskritic Sanskritist Sanskritization Sanskritize sant Santa Santal santal Santalaceae santalaceous Santalales Santali santalic santalin santalol Santalum santalwood santapee Santee santene Santiago santimi santims santir Santo Santolina santon santonica santonin santoninic santorinite Santos sanukite Sanvitalia Sanyakoan sao Saoshyant sap sapa sapajou sapan sapanwood sapbush sapek Saperda sapful Sapharensian saphead sapheaded sapheadedness saphena saphenal saphenous saphie sapid sapidity sapidless sapidness sapience sapiency sapient sapiential sapientially sapientize sapiently sapin sapinda Sapindaceae sapindaceous Sapindales sapindaship Sapindus Sapium sapiutan saple sapless saplessness sapling saplinghood sapo sapodilla sapogenin saponaceous saponaceousness saponacity Saponaria saponarin saponary Saponi saponifiable saponification saponifier saponify saponin saponite sapophoric sapor saporific saporosity saporous Sapota sapota Sapotaceae sapotaceous sapote sapotilha sapotilla sapotoxin sappanwood sappare sapper Sapphic sapphic sapphire sapphireberry sapphired sapphirewing sapphiric sapphirine Sapphism Sapphist Sappho sappiness sapping sapples sappy sapremia sapremic saprine saprocoll saprodil saprodontia saprogenic saprogenous Saprolegnia Saprolegniaceae saprolegniaceous Saprolegniales saprolegnious saprolite saprolitic sapropel sapropelic sapropelite saprophagan saprophagous saprophile saprophilous saprophyte saprophytic saprophytically saprophytism saprostomous saprozoic sapsago sapskull sapsuck sapsucker sapucaia sapucainha sapwood sapwort Saqib sar Sara saraad sarabacan Sarabaite saraband Saracen Saracenian Saracenic Saracenical Saracenism Saracenlike Sarada saraf Sarah Sarakolet Sarakolle Saramaccaner Saran sarangi sarangousty Saratoga Saratogan Saravan Sarawakese sarawakite Sarawan sarbacane sarbican sarcasm sarcasmproof sarcast sarcastic sarcastical sarcastically sarcasticalness sarcasticness sarcelle sarcenet sarcilis Sarcina sarcine sarcitis sarcle sarcler sarcoadenoma Sarcobatus sarcoblast sarcocarcinoma sarcocarp sarcocele Sarcococca Sarcocolla sarcocollin sarcocyst Sarcocystidea sarcocystidean sarcocystidian Sarcocystis sarcocystoid sarcocyte sarcode sarcoderm Sarcodes sarcodic sarcodictyum Sarcodina sarcodous sarcoenchondroma sarcogenic sarcogenous sarcoglia Sarcogyps sarcoid sarcolactic sarcolemma sarcolemmic sarcolemmous sarcoline sarcolite sarcologic sarcological sarcologist sarcology sarcolysis sarcolyte sarcolytic sarcoma sarcomatoid sarcomatosis sarcomatous sarcomere Sarcophaga sarcophagal sarcophagi sarcophagic sarcophagid Sarcophagidae sarcophagine sarcophagize sarcophagous sarcophagus sarcophagy sarcophile sarcophilous Sarcophilus sarcoplasm sarcoplasma sarcoplasmatic sarcoplasmic sarcoplast sarcoplastic sarcopoietic Sarcopsylla Sarcopsyllidae Sarcoptes sarcoptic sarcoptid Sarcoptidae Sarcorhamphus sarcosepsis sarcosepta sarcoseptum sarcosine sarcosis sarcosoma sarcosperm sarcosporid Sarcosporida Sarcosporidia sarcosporidial sarcosporidian sarcosporidiosis sarcostosis sarcostyle sarcotheca sarcotherapeutics sarcotherapy sarcotic sarcous Sarcura Sard sard sardachate Sardanapalian Sardanapalus sardel Sardian sardine sardinewise Sardinian sardius Sardoin sardonic sardonical sardonically sardonicism sardonyx sare sargasso Sargassum sargassum sargo Sargonic Sargonid Sargonide sargus sari sarif Sarigue sarigue sarinda sarip sark sarkar sarkful sarkical sarkine sarking sarkinite sarkit sarkless sarlak sarlyk Sarmatian Sarmatic sarmatier sarment sarmenta sarmentaceous sarmentiferous sarmentose sarmentous sarmentum sarna sarod saron sarong saronic saronide saros Sarothamnus Sarothra sarothrum sarpler sarpo sarra Sarracenia sarracenia Sarraceniaceae sarraceniaceous sarracenial Sarraceniales sarraf sarrazin sarrusophone sarrusophonist sarsa sarsaparilla sarsaparillin Sarsar Sarsechim sarsen sarsenet Sarsi Sart sart sartage sartain Sartish sartor sartoriad sartorial sartorially sartorian sartorite sartorius Saruk sarus Sarvarthasiddha sarwan Sarzan sasa sasan sasani sasanqua sash sashay sashery sashing sashless sasin sasine saskatoon sassaby sassafac sassafrack sassafras Sassak Sassan Sassanian Sassanid Sassanidae Sassanide Sassenach sassolite sassy sassywood Sastean sat satable Satan satan Satanael Satanas satang satanic satanical satanically satanicalness Satanism Satanist satanist Satanistic Satanity satanize Satanology Satanophany Satanophil Satanophobia Satanship satara satchel satcheled sate sateen sateenwood sateless satelles satellitarian satellite satellited satellitesimal satellitian satellitic satellitious satellitium satellitoid satellitory satelloid satiability satiable satiableness satiably satiate satiation Satieno satient satiety satin satinbush satine satined satinette satinfin satinflower satinite satinity satinize satinleaf satinlike satinpod satinwood satiny satire satireproof satiric satirical satirically satiricalness satirist satirizable satirize satirizer satisdation satisdiction satisfaction satisfactional satisfactionist satisfactionless satisfactive satisfactorily satisfactoriness satisfactorious satisfactory satisfiable satisfice satisfied satisfiedly satisfiedness satisfier satisfy satisfying satisfyingly satisfyingness satispassion satlijk Satrae satrap satrapal satrapess satrapic satrapical satrapy satron Satsuma sattle sattva satura saturability saturable saturant saturate saturated saturater saturation saturator Saturday Satureia Saturn Saturnal Saturnale Saturnalia saturnalia Saturnalian saturnalian Saturnia Saturnian saturnian Saturnicentric saturniid Saturniidae Saturnine saturnine saturninely saturnineness saturninity saturnism saturnity saturnize Saturnus satyagrahi satyashodak satyr satyresque satyress satyriasis satyric Satyridae Satyrinae satyrine satyrion satyrism satyrlike satyromaniac sauce sauceboat saucebox saucedish sauceless sauceline saucemaker saucemaking sauceman saucepan sauceplate saucer saucerful saucerleaf saucerless saucerlike saucily sauciness saucy Sauerbraten sauerkraut sauf sauger saugh saughen Saul sauld saulie sault saulter Saulteur saum saumon saumont Saumur Saumya sauna saunders saunderswood saunter saunterer sauntering saunteringly sauqui saur Saura Sauraseni Saurauia Saurauiaceae saurel Sauria saurian sauriasis sauriosis Saurischia saurischian Sauroctonos saurodont Saurodontidae Saurognathae saurognathism saurognathous Sauromatian saurophagous sauropod Sauropoda sauropodous sauropsid Sauropsida sauropsidan sauropsidian Sauropterygia sauropterygian Saurornithes saurornithic Saururaceae saururaceous Saururae saururan saururous Saururus saury sausage sausagelike sausinger Saussurea saussurite saussuritic saussuritization saussuritize saut saute sauterelle sauterne sauternes sauteur sauty Sauvagesia sauve sauvegarde savable savableness savacu savage savagedom savagely savageness savagerous savagery savagess savagism savagize savanilla savanna Savannah savant Savara savarin savation save saved saveloy saver Savery savin saving savingly savingness savior savioress saviorhood saviorship Saviour Savitar Savitri savola Savonarolist Savonnerie savor savored savorer savorily savoriness savoringly savorless savorous savorsome savory savour savoy Savoyard savoyed savoying savssat savvy saw sawah Sawaiori sawali Sawan sawarra sawback sawbelly sawbill sawbones sawbuck sawbwa sawder sawdust sawdustish sawdustlike sawdusty sawed sawer sawfish sawfly sawhorse sawing sawish sawlike sawmaker sawmaking sawman sawmill sawmiller sawmilling sawmon sawmont sawn Sawney sawney sawsetter sawsharper sawsmith sawt sawway sawworker sawwort sawyer sax saxatile saxboard saxcornet Saxe saxhorn Saxicava saxicavous Saxicola saxicole Saxicolidae Saxicolinae saxicoline saxicolous Saxifraga Saxifragaceae saxifragaceous saxifragant saxifrage saxifragous saxifrax saxigenous Saxish Saxon Saxondom Saxonian Saxonic Saxonical Saxonically Saxonish Saxonism Saxonist saxonite Saxonization Saxonize Saxonly Saxony saxophone saxophonist saxotromba saxpence saxten saxtie saxtuba say saya sayability sayable sayableness Sayal sayer sayette sayid saying sazen Sbaikian sblood sbodikins scab scabbard scabbardless scabbed scabbedness scabbery scabbily scabbiness scabble scabbler scabbling scabby scabellum scaberulous scabid scabies scabietic scabinus Scabiosa scabiosity scabious scabish scabland scabrate scabrescent scabrid scabridity scabridulous scabrities scabriusculose scabriusculous scabrosely scabrous scabrously scabrousness scabwort scacchic scacchite scad scaddle scads Scaean scaff scaffer scaffery scaffie scaffle scaffold scaffoldage scaffolder scaffolding scaglia scagliola scagliolist scala scalable scalableness scalably scalage scalar scalare Scalaria scalarian scalariform Scalariidae scalarwise scalation scalawag scalawaggery scalawaggy scald scaldberry scalded scalder scaldfish scaldic scalding scaldweed scaldy scale scaleback scalebark scaleboard scaled scaledrake scalefish scaleful scaleless scalelet scalelike scaleman scalena scalene scalenohedral scalenohedron scalenon scalenous scalenum scalenus scalepan scaleproof scaler scales scalesman scalesmith scaletail scalewing scalewise scalework scalewort scaliger scaliness scaling scall scalled scallion scallola scallom scallop scalloper scalloping scallopwise scalma scaloni Scalops Scalopus scalp scalpeen scalpel scalpellar scalpellic scalpellum scalpellus scalper scalping scalpless scalpriform scalprum scalpture scalt scaly scalytail scam scamander Scamandrius scamble scambler scambling scamell scamler scamles scammoniate scammonin scammony scammonyroot scamp scampavia scamper scamperer scamphood scamping scampingly scampish scampishly scampishness scampsman scan scandal scandalization scandalize scandalizer scandalmonger scandalmongering scandalmongery scandalmonging scandalous scandalously scandalousness scandalproof scandaroon scandent scandia Scandian scandic scandicus Scandinavia Scandinavian Scandinavianism scandium Scandix Scania Scanian Scanic scanmag scannable scanner scanning scanningly scansion scansionist Scansores scansorial scansorious scant scanties scantily scantiness scantity scantle scantling scantlinged scantly scantness scanty scap scape scapegallows scapegoat scapegoatism scapegrace scapel scapeless scapement scapethrift scapha Scaphander Scaphandridae scaphion Scaphiopodidae Scaphiopus scaphism scaphite Scaphites Scaphitidae scaphitoid scaphocephalic scaphocephalism scaphocephalous scaphocephalus scaphocephaly scaphocerite scaphoceritic scaphognathite scaphognathitic scaphoid scapholunar scaphopod Scaphopoda scaphopodous scapiform scapigerous scapoid scapolite scapolitization scapose scapple scappler scapula scapulalgia scapular scapulare scapulary scapulated scapulectomy scapulet scapulimancy scapuloaxillary scapulobrachial scapuloclavicular scapulocoracoid scapulodynia scapulohumeral scapulopexy scapuloradial scapulospinal scapulothoracic scapuloulnar scapulovertebral scapus scar scarab scarabaean scarabaei scarabaeid Scarabaeidae scarabaeidoid scarabaeiform Scarabaeinae scarabaeoid scarabaeus scarabee scaraboid Scaramouch scaramouch scarce scarcelins scarcely scarcement scarcen scarceness scarcity scare scarebabe scarecrow scarecrowish scarecrowy scareful scarehead scaremonger scaremongering scareproof scarer scaresome scarf scarface scarfed scarfer scarflike scarfpin scarfskin scarfwise scarfy scarid Scaridae scarification scarificator scarifier scarify scarily scariose scarious scarlatina scarlatinal scarlatiniform scarlatinoid scarlatinous scarless scarlet scarletberry scarletseed scarlety scarman scarn scaroid scarp scarpines scarping scarpment scarproof scarred scarrer scarring scarry scart scarth Scarus scarus scarved scary scase scasely scat scatch scathe scatheful scatheless scathelessly scathing scathingly Scaticook scatland scatologia scatologic scatological scatology scatomancy scatophagid Scatophagidae scatophagoid scatophagous scatophagy scatoscopy scatter scatterable scatteration scatteraway scatterbrain scatterbrained scatterbrains scattered scatteredly scatteredness scatterer scattergood scattering scatteringly scatterling scattermouch scattery scatty scatula scaturient scaul scaum scaup scauper scaur scaurie scaut scavage scavel scavenage scavenge scavenger scavengerism scavengership scavengery scavenging scaw scawd scawl scazon scazontic sceat scelalgia scelerat scelidosaur scelidosaurian scelidosauroid Scelidosaurus Scelidotherium Sceliphron sceloncus Sceloporus scelotyrbe scena scenario scenarioist scenarioization scenarioize scenarist scenarization scenarize scenary scend scene scenecraft Scenedesmus sceneful sceneman scenery sceneshifter scenewright scenic scenical scenically scenist scenite scenograph scenographer scenographic scenographical scenographically scenography Scenopinidae scent scented scenter scentful scenting scentless scentlessness scentproof scentwood scepsis scepter scepterdom sceptered scepterless sceptic sceptral sceptropherous sceptrosophy sceptry scerne sceuophorion sceuophylacium sceuophylax schaapsteker Schaefferia schairerite schalmei schalmey schalstein schanz schapbachite schappe schapped schapping scharf Scharlachberger schatchen Scheat Schedar schediasm schediastic Schedius schedular schedulate schedule schedulize scheelite scheffel schefferite schelling Schellingian Schellingianism Schellingism schelly scheltopusik schema schemata schematic schematically schematism schematist schematization schematize schematizer schematogram schematograph schematologetically schematomancy schematonics scheme schemeful schemeless schemer schemery scheming schemingly schemist schemy schene schepel schepen scherm scherzando scherzi scherzo schesis Scheuchzeria Scheuchzeriaceae scheuchzeriaceous schiavone Schiedam schiffli schiller schillerfels schillerization schillerize schilling schimmel schindylesis schindyletic Schinus schipperke Schisandra Schisandraceae schism schisma schismatic schismatical schismatically schismaticalness schismatism schismatist schismatize schismic schismless schist schistaceous schistic schistocelia schistocephalus Schistocerca schistocoelia schistocormia schistocormus schistocyte schistocytosis schistoglossia schistoid schistomelia schistomelus schistoprosopia schistoprosopus schistorrhachis schistoscope schistose schistosity Schistosoma schistosome schistosomia schistosomiasis schistosomus schistosternia schistothorax schistous schistus Schizaea Schizaeaceae schizaeaceous Schizanthus schizanthus schizaxon schizocarp schizocarpic schizocarpous schizochroal schizocoele schizocoelic schizocoelous schizocyte schizocytosis schizodinic schizogamy schizogenesis schizogenetic schizogenetically schizogenic schizogenous schizogenously schizognath Schizognathae schizognathism schizognathous schizogonic schizogony Schizogregarinae schizogregarine Schizogregarinida schizoid schizoidism Schizolaenaceae schizolaenaceous schizolite schizolysigenous Schizomeria schizomycete Schizomycetes schizomycetic schizomycetous schizomycosis Schizonemertea schizonemertean schizonemertine Schizoneura Schizonotus schizont schizopelmous Schizopetalon schizophasia Schizophragma schizophrene schizophrenia schizophreniac schizophrenic Schizophyceae Schizophyllum Schizophyta schizophyte schizophytic schizopod Schizopoda schizopodal schizopodous schizorhinal schizospore schizostele schizostelic schizostely schizothecal schizothoracic schizothyme schizothymia schizothymic schizotrichia Schizotrypanum schiztic Schlauraffenland Schleichera schlemiel schlemihl schlenter schlieren schlieric schloop Schmalkaldic schmaltz schmelz schmelze schnabel Schnabelkanne schnapper schnapps schnauzer schneider Schneiderian schnitzel schnorchel schnorkel schnorrer scho schochat schochet schoenobatic schoenobatist Schoenocaulon Schoenus schoenus Schoharie schola scholae scholaptitude scholar scholarch scholardom scholarian scholarism scholarless scholarlike scholarliness scholarly scholarship scholasm scholastic scholastical scholastically scholasticate scholasticism scholasticly scholia scholiast scholiastic scholion scholium Schomburgkia schone schonfelsite Schoodic School school schoolable schoolbag schoolbook schoolbookish schoolboy schoolboydom schoolboyhood schoolboyish schoolboyishly schoolboyishness schoolboyism schoolbutter schoolcraft schooldame schooldom schooled schoolery schoolfellow schoolfellowship schoolful schoolgirl schoolgirlhood schoolgirlish schoolgirlishly schoolgirlishness schoolgirlism schoolgirly schoolgoing schoolhouse schooling schoolingly schoolish schoolkeeper schoolkeeping schoolless schoollike schoolmaam schoolmaamish schoolmaid schoolman schoolmaster schoolmasterhood schoolmastering schoolmasterish schoolmasterishly schoolmasterishness schoolmasterism schoolmasterly schoolmastership schoolmastery schoolmate schoolmiss schoolmistress schoolmistressy schoolroom schoolteacher schoolteacherish schoolteacherly schoolteachery schoolteaching schooltide schooltime schoolward schoolwork schoolyard schoon schooner Schopenhauereanism Schopenhauerian Schopenhauerism schoppen schorenbergite schorl schorlaceous schorlomite schorlous schorly schottische schottish schout schraubthaler Schrebera schreiner schreinerize schriesheimite Schrund schtoff schuh schuhe schuit schule schultenite schungite schuss schute schwa schwabacher Schwalbea schwarz Schwarzian schweizer schweizerkase Schwendenerian Schwenkfelder Schwenkfeldian Sciadopitys Sciaena sciaenid Sciaenidae sciaeniform Sciaeniformes sciaenoid scialytic sciamachy Scian sciapod sciapodous Sciara sciarid Sciaridae Sciarinae sciatheric sciatherical sciatherically sciatic sciatica sciatical sciatically sciaticky scibile science scienced scient sciential scientician scientific scientifical scientifically scientificalness scientificogeographical scientificohistorical scientificophilosophical scientificopoetic scientificoreligious scientificoromantic scientintically scientism Scientist scientist scientistic scientistically scientize scientolism scilicet Scilla scillain scillipicrin Scillitan scillitin scillitoxin Scillonian scimitar scimitared scimitarpod scincid Scincidae scincidoid scinciform scincoid scincoidian Scincomorpha Scincus scind sciniph scintilla scintillant scintillantly scintillate scintillating scintillatingly scintillation scintillator scintillescent scintillize scintillometer scintilloscope scintillose scintillously scintle scintler scintling sciograph sciographic sciography sciolism sciolist sciolistic sciolous sciomachiology sciomachy sciomancy sciomantic scion sciophilous sciophyte scioptic sciopticon scioptics scioptric sciosophist sciosophy Sciot scioterical scioterique sciotheism sciotheric sciotherical sciotherically scious scirenga Scirophoria Scirophorion Scirpus scirrhi scirrhogastria scirrhoid scirrhoma scirrhosis scirrhous scirrhus scirrosity scirtopod Scirtopoda scirtopodous scissel scissible scissile scission scissiparity scissor scissorbill scissorbird scissorer scissoring scissorium scissorlike scissorlikeness scissors scissorsbird scissorsmith scissorstail scissortail scissorwise scissura scissure Scissurella scissurellid Scissurellidae Scitaminales Scitamineae sciurid Sciuridae sciurine sciuroid sciuromorph Sciuromorpha sciuromorphic Sciuropterus Sciurus sclaff sclate sclater Sclav Sclavonian sclaw scler sclera scleral scleranth Scleranthaceae Scleranthus scleratogenous sclere sclerectasia sclerectomy scleredema sclereid sclerema sclerencephalia sclerenchyma sclerenchymatous sclerenchyme sclererythrin scleretinite Scleria scleriasis sclerification sclerify sclerite scleritic scleritis sclerized sclerobase sclerobasic scleroblast scleroblastema scleroblastemic scleroblastic sclerocauly sclerochorioiditis sclerochoroiditis scleroconjunctival scleroconjunctivitis sclerocornea sclerocorneal sclerodactylia sclerodactyly scleroderm Scleroderma scleroderma Sclerodermaceae Sclerodermata Sclerodermatales sclerodermatitis sclerodermatous Sclerodermi sclerodermia sclerodermic sclerodermite sclerodermitic sclerodermitis sclerodermous sclerogen Sclerogeni sclerogenoid sclerogenous scleroid scleroiritis sclerokeratitis sclerokeratoiritis scleroma scleromata scleromeninx scleromere sclerometer sclerometric scleronychia scleronyxis Scleropages Scleroparei sclerophthalmia sclerophyll sclerophyllous sclerophylly scleroprotein sclerosal sclerosarcoma Scleroscope scleroscope sclerose sclerosed scleroseptum sclerosis scleroskeletal scleroskeleton Sclerospora sclerostenosis Sclerostoma sclerostomiasis sclerotal sclerote sclerotia sclerotial sclerotic sclerotica sclerotical scleroticectomy scleroticochorioiditis scleroticochoroiditis scleroticonyxis scleroticotomy Sclerotinia sclerotinial sclerotiniose sclerotioid sclerotitic sclerotitis sclerotium sclerotized sclerotoid sclerotome sclerotomic sclerotomy sclerous scleroxanthin sclerozone scliff sclim sclimb scoad scob scobby scobicular scobiform scobs scoff scoffer scoffery scoffing scoffingly scoffingstock scofflaw scog scoggan scogger scoggin scogginism scogginist scoinson scoke scolb scold scoldable scoldenore scolder scolding scoldingly scoleces scoleciasis scolecid Scolecida scoleciform scolecite scolecoid scolecology scolecophagous scolecospore scoleryng scolex Scolia scolia scolices scoliid Scoliidae scoliograptic scoliokyposis scoliometer scolion scoliorachitic scoliosis scoliotic scoliotone scolite scollop scolog scolopaceous Scolopacidae scolopacine Scolopax Scolopendra scolopendra Scolopendrella Scolopendrellidae scolopendrelloid scolopendrid Scolopendridae scolopendriform scolopendrine Scolopendrium scolopendroid scolophore scolopophore Scolymus scolytid Scolytidae scolytoid Scolytus Scomber scomberoid Scombresocidae Scombresox scombrid Scombridae scombriform Scombriformes scombrine scombroid Scombroidea scombroidean scombrone sconce sconcer sconcheon sconcible scone scoon scoop scooped scooper scoopful scooping scoopingly scoot scooter scopa scoparin scoparius scopate scope scopeless scopelid Scopelidae scopeliform scopelism scopeloid Scopelus scopet scopic Scopidae scopiferous scopiform scopiformly scopine scopiped scopola scopolamine scopoleine scopoletin scopoline scopperil scops scoptical scoptically scoptophilia scoptophiliac scoptophilic scoptophobia scopula Scopularia scopularian scopulate scopuliferous scopuliform scopuliped Scopulipedes scopulite scopulous scopulousness Scopus scorbute scorbutic scorbutical scorbutically scorbutize scorbutus scorch scorched scorcher scorching scorchingly scorchingness scorchproof score scoreboard scorebook scored scorekeeper scorekeeping scoreless scorer scoria scoriac scoriaceous scoriae scorification scorifier scoriform scorify scoring scorious scorn scorned scorner scornful scornfully scornfulness scorningly scornproof scorny scorodite Scorpaena scorpaenid Scorpaenidae scorpaenoid scorpene scorper Scorpidae Scorpididae Scorpii Scorpiid Scorpio scorpioid scorpioidal Scorpioidea scorpion Scorpiones scorpionic scorpionid Scorpionida Scorpionidea Scorpionis scorpionweed scorpionwort Scorpiurus Scorpius scorse scortation scortatory Scorzonera Scot scot scotale Scotch scotch scotcher Scotchery Scotchification Scotchify Scotchiness scotching Scotchman scotchman Scotchness Scotchwoman Scotchy scote scoter scoterythrous Scotia scotia Scotic scotino Scotism Scotist Scotistic Scotistical Scotize Scotlandwards scotodinia scotogram scotograph scotographic scotography scotoma scotomata scotomatic scotomatical scotomatous scotomia scotomic scotomy scotophobia scotopia scotopic scotoscope scotosis Scots Scotsman Scotswoman Scott Scotticism Scotticize Scottie Scottification Scottify Scottish Scottisher Scottishly Scottishman Scottishness Scotty scouch scouk scoundrel scoundreldom scoundrelish scoundrelism scoundrelly scoundrelship scoup scour scourage scoured scourer scouress scourfish scourge scourger scourging scourgingly scouriness scouring scourings scourway scourweed scourwort scoury scouse scout scoutcraft scoutdom scouter scouth scouther scouthood scouting scoutingly scoutish scoutmaster scoutwatch scove scovel scovillite scovy scow scowbank scowbanker scowder scowl scowler scowlful scowling scowlingly scowlproof scowman scrab scrabble scrabbled scrabbler scrabe scrae scraffle scrag scragged scraggedly scraggedness scragger scraggily scragginess scragging scraggled scraggling scraggly scraggy scraily scram scramasax scramble scramblement scrambler scrambling scramblingly scrambly scrampum scran scranch scrank scranky scrannel scranning scranny scrap scrapable scrapbook scrape scrapeage scraped scrapepenny scraper scrapie scraping scrapingly scrapler scraplet scrapling scrapman scrapmonger scrappage scrapped scrapper scrappet scrappily scrappiness scrapping scrappingly scrapple scrappler scrappy scrapworks scrapy scrat scratch scratchable scratchably scratchback scratchboard scratchbrush scratchcard scratchcarding scratchcat scratcher scratches scratchification scratchiness scratching scratchingly scratchless scratchlike scratchman scratchproof scratchweed scratchwork scratchy scrath scratter scrattle scrattling scrauch scrauchle scraunch scraw scrawk scrawl scrawler scrawliness scrawly scrawm scrawnily scrawniness scrawny scray scraze screak screaking screaky scream screamer screaminess screaming screamingly screamproof screamy scree screech screechbird screecher screechily screechiness screeching screechingly screechy screed screek screel screeman screen screenable screenage screencraft screendom screened screener screening screenless screenlike screenman screenplay screensman screenwise screenwork screenwriter screeny screet screeve screeved screever screich screigh screve screver screw screwable screwage screwball screwbarrel screwdrive screwdriver screwed screwer screwhead screwiness screwing screwish screwless screwlike screwman screwmatics screwship screwsman screwstem screwstock screwwise screwworm screwy scribable scribacious scribaciousness scribal scribatious scribatiousness scribblage scribblative scribblatory scribble scribbleable scribbled scribbledom scribbleism scribblemania scribblement scribbleomania scribbler scribbling scribblingly scribbly scribe scriber scribeship scribing scribism scribophilous scride scrieve scriever scriggle scriggler scriggly scrike scrim scrime scrimer scrimmage scrimmager scrimp scrimped scrimpily scrimpiness scrimpingly scrimply scrimpness scrimption scrimpy scrimshander scrimshandy scrimshank scrimshanker scrimshaw scrimshon scrimshorn scrin scrinch scrine scringe scriniary scrip scripee scripless scrippage script scription scriptitious scriptitiously scriptitory scriptive scriptor scriptorial scriptorium scriptory scriptural Scripturalism scripturalism Scripturalist scripturalist Scripturality scripturality scripturalize scripturally scripturalness Scripturarian Scripture scripture Scriptured scriptured Scriptureless scripturiency scripturient Scripturism scripturism Scripturist scripula scripulum scritch scritoire scrivaille scrive scrivello scriven scrivener scrivenership scrivenery scrivening scrivenly scriver scrob scrobble scrobe scrobicula scrobicular scrobiculate scrobiculated scrobicule scrobiculus scrobis scrod scrodgill scroff scrofula scrofularoot scrofulaweed scrofulide scrofulism scrofulitic scrofuloderm scrofuloderma scrofulorachitic scrofulosis scrofulotuberculous scrofulous scrofulously scrofulousness scrog scroggy scrolar scroll scrolled scrollery scrollhead scrollwise scrollwork scrolly scronach scroo scrooch scrooge scroop Scrophularia Scrophulariaceae scrophulariaceous scrota scrotal scrotectomy scrotiform scrotitis scrotocele scrotofemoral scrotum scrouge scrouger scrounge scrounger scrounging scrout scrow scroyle scrub scrubbable scrubbed scrubber scrubbery scrubbily scrubbiness scrubbird scrubbly scrubboard scrubby scrubgrass scrubland scrubwood scruf scruff scruffle scruffman scruffy scruft scrum scrummage scrummager scrump scrumple scrumption scrumptious scrumptiously scrumptiousness scrunch scrunchy scrunge scrunger scrunt scruple scrupleless scrupler scruplesome scruplesomeness scrupula scrupular scrupuli scrupulist scrupulosity scrupulous scrupulously scrupulousness scrupulum scrupulus scrush scrutability scrutable scrutate scrutation scrutator scrutatory scrutinant scrutinate scrutineer scrutinization scrutinize scrutinizer scrutinizingly scrutinous scrutinously scrutiny scruto scrutoire scruze scry scryer scud scuddaler scuddawn scudder scuddick scuddle scuddy scudi scudler scudo scuff scuffed scuffer scuffle scuffler scufflingly scuffly scuffy scuft scufter scug scuggery sculch sculduddery scull sculler scullery scullful scullion scullionish scullionize scullionship scullog sculp sculper sculpin sculpt sculptile sculptitory sculptograph sculptography Sculptor sculptor Sculptorid sculptress sculptural sculpturally sculpturation sculpture sculptured sculpturer sculpturesque sculpturesquely sculpturesqueness sculpturing sculsh scum scumber scumble scumbling scumboard scumfish scumless scumlike scummed scummer scumming scummy scumproof scun scuncheon scunder scunner scup scupful scuppaug scupper scuppernong scuppet scuppler scur scurdy scurf scurfer scurfily scurfiness scurflike scurfy scurrier scurrile scurrilist scurrility scurrilize scurrilous scurrilously scurrilousness scurry scurvied scurvily scurviness scurvish scurvy scurvyweed scusation scuse scut scuta scutage scutal scutate scutated scutatiform scutation scutch scutcheon scutcheoned scutcheonless scutcheonlike scutcheonwise scutcher scutching scute scutel scutella scutellae scutellar Scutellaria scutellarin scutellate scutellated scutellation scutellerid Scutelleridae scutelliform scutelligerous scutelliplantar scutelliplantation scutellum scutibranch Scutibranchia scutibranchian scutibranchiate scutifer scutiferous scutiform scutiger Scutigera scutigeral Scutigeridae scutigerous scutiped scutter scuttle scuttlebutt scuttleful scuttleman scuttler scuttling scuttock scutty scutula scutular scutulate scutulated scutulum Scutum scutum scybala scybalous scybalum scye scyelite Scyld Scylla Scyllaea Scyllaeidae scyllarian Scyllaridae scyllaroid Scyllarus Scyllidae Scylliidae scyllioid Scylliorhinidae scylliorhinoid Scylliorhinus scyllite scyllitol Scyllium scypha scyphae scyphate scyphi scyphiferous scyphiform scyphiphorous scyphistoma scyphistomae scyphistomoid scyphistomous scyphoi scyphomancy Scyphomedusae scyphomedusan scyphomedusoid scyphophore Scyphophori scyphophorous scyphopolyp scyphose scyphostoma Scyphozoa scyphozoan scyphula scyphulus scyphus scyt scytale Scyth scythe scytheless scythelike scytheman scythesmith scythestone scythework Scythian Scythic Scythize scytitis scytoblastema scytodepsic Scytonema Scytonemataceae scytonemataceous scytonematoid scytonematous Scytopetalaceae scytopetalaceous Scytopetalum sdeath sdrucciola se sea seabeach seabeard Seabee seaberry seaboard seaborderer seabound seacannie seacatch seacoast seaconny seacraft seacrafty seacunny seadog seadrome seafardinger seafare seafarer seafaring seaflood seaflower seafolk Seaforthia seafowl Seaghan seagirt seagoer seagoing seah seahound seak seal sealable sealant sealch sealed sealer sealery sealess sealet sealette sealflower sealike sealine sealing sealless seallike sealskin sealwort Sealyham seam seaman seamancraft seamanite seamanlike seamanly seamanship seamark Seamas seambiter seamed seamer seaminess seaming seamless seamlessly seamlessness seamlet seamlike seamost seamrend seamrog seamster seamstress Seamus seamy Sean seance seapiece seaplane seaport seaquake sear searce searcer search searchable searchableness searchant searcher searcheress searcherlike searchership searchful searching searchingly searchingness searchless searchlight searchment searcloth seared searedness searer searing searlesite searness seary Seasan seascape seascapist seascout seascouting seashine seashore seasick seasickness seaside seasider season seasonable seasonableness seasonably seasonal seasonality seasonally seasonalness seasoned seasonedly seasoner seasoning seasoninglike seasonless seastrand seastroke seat seatang seated seater seathe seating seatless seatrain seatron seatsman seatwork seave seavy seawant seaward seawardly seaware seaway seaweed seaweedy seawife seawoman seaworn seaworthiness seaworthy seax Seba sebacate sebaceous sebacic sebait Sebastian sebastianite Sebastichthys Sebastodes sebate sebesten sebiferous sebific sebilla sebiparous sebkha sebolith seborrhagia seborrhea seborrheal seborrheic seborrhoic Sebright sebum sebundy sec secability secable Secale secalin secaline secalose Secamone secancy secant secantly secateur secede Seceder seceder secern secernent secernment secesh secesher Secessia Secession secession Secessional secessional secessionalist Secessiondom secessioner secessionism secessionist sech Sechium Sechuana seck Seckel seclude secluded secludedly secludedness secluding secluse seclusion seclusionist seclusive seclusively seclusiveness secodont secohm secohmmeter second secondar secondarily secondariness secondary seconde seconder secondhand secondhanded secondhandedly secondhandedness secondly secondment secondness secos secpar secque secre secrecy secret secreta secretage secretagogue secretarial secretarian Secretariat secretariat secretariate secretary secretaryship secrete secretin secretion secretional secretionary secretitious secretive secretively secretiveness secretly secretmonger secretness secreto secretomotor secretor secretory secretum sect sectarial sectarian sectarianism sectarianize sectarianly sectarism sectarist sectary sectator sectile sectility section sectional sectionalism sectionalist sectionality sectionalization sectionalize sectionally sectionary sectionist sectionize sectioplanography sectism sectist sectiuncle sective sector sectoral sectored sectorial sectroid sectwise secular secularism secularist secularistic secularity secularization secularize secularizer secularly secularness secund secundate secundation secundiflorous secundigravida secundine secundipara secundiparity secundiparous secundly secundogeniture secundoprimary secundus securable securance secure securely securement secureness securer securicornate securifer Securifera securiferous securiform Securigera securigerous securitan security Sedaceae Sedan sedan Sedang sedanier Sedat sedate sedately sedateness sedation sedative sedent Sedentaria sedentarily sedentariness sedentary sedentation Seder sederunt sedge sedged sedgelike sedging sedgy sedigitate sedigitated sedile sedilia sediment sedimental sedimentarily sedimentary sedimentate sedimentation sedimentous sedimetric sedimetrical sedition seditionary seditionist seditious seditiously seditiousness sedjadeh Sedovic seduce seduceable seducee seducement seducer seducible seducing seducingly seducive seduct seduction seductionist seductive seductively seductiveness seductress sedulity sedulous sedulously sedulousness Sedum sedum see seeable seeableness Seebeck seecatch seech seed seedage seedbed seedbird seedbox seedcake seedcase seedeater seeded Seeder seeder seedful seedgall seedily seediness seedkin seedless seedlessness seedlet seedlike seedling seedlip seedman seedness seedsman seedstalk seedtime seedy seege seeing seeingly seeingness seek seeker Seekerism seeking seel seelful seely seem seemable seemably seemer seeming seemingly seemingness seemless seemlihead seemlily seemliness seemly seen seenie Seenu seep seepage seeped seepweed seepy seer seerband seercraft seeress seerfish seerhand seerhood seerlike seerpaw seership seersucker seesaw seesawiness seesee seethe seething seethingly seetulputty Sefekhet seg seggar seggard segged seggrom Seginus segment segmental segmentally segmentary segmentate segmentation segmented sego segol segolate segreant segregable segregant segregate segregateness segregation segregational segregationist segregative segregator Sehyo seiche Seid Seidel seidel Seidlitz seigneur seigneurage seigneuress seigneurial seigneury seignior seigniorage seignioral seignioralty seigniorial seigniority seigniorship seigniory seignorage seignoral seignorial seignorize seignory seilenoi seilenos seine seiner seirospore seirosporic seise seism seismal seismatical seismetic seismic seismically seismicity seismism seismochronograph seismogram seismograph seismographer seismographic seismographical seismography seismologic seismological seismologically seismologist seismologue seismology seismometer seismometric seismometrical seismometrograph seismometry seismomicrophone seismoscope seismoscopic seismotectonic seismotherapy seismotic seit seity Seiurus Seiyuhonto Seiyukai seizable seize seizer seizin seizing seizor seizure sejant sejoin sejoined sejugate sejugous sejunct sejunctive sejunctively sejunctly Sekane Sekani Sekar Seker Sekhwan sekos selachian Selachii selachoid Selachoidei Selachostome Selachostomi selachostomous seladang Selaginaceae Selaginella Selaginellaceae selaginellaceous selagite Selago selah selamin selamlik selbergite Selbornian seldom seldomcy seldomer seldomly seldomness seldor seldseen sele select selectable selected selectedly selectee selection selectionism selectionist selective selectively selectiveness selectivity selectly selectman selectness selector Selena selenate Selene selenian seleniate selenic Selenicereus selenide Selenidera seleniferous selenigenous selenion selenious Selenipedium selenite selenitic selenitical selenitiferous selenitish selenium seleniuret selenobismuthite selenocentric selenodont Selenodonta selenodonty selenograph selenographer selenographic selenographical selenographically selenographist selenography selenolatry selenological selenologist selenology selenomancy selenoscope selenosis selenotropic selenotropism selenotropy selensilver selensulphur Seleucian Seleucid Seleucidae Seleucidan Seleucidean Seleucidian Seleucidic self selfcide selfdom selfful selffulness selfheal selfhood selfish selfishly selfishness selfism selfist selfless selflessly selflessness selfly selfness selfpreservatory selfsame selfsameness selfward selfwards selictar seligmannite selihoth Selina Selinuntine selion Seljuk Seljukian sell sella sellable sellably sellaite sellar sellate sellenders seller Selli sellie selliform selling sellout selly selsoviet selsyn selt Selter Seltzer seltzogene Selung selva selvage selvaged selvagee selvedge selzogene Semaeostomae Semaeostomata Semang semanteme semantic semantical semantically semantician semanticist semantics semantological semantology semantron semaphore semaphoric semaphorical semaphorically semaphorist semarum semasiological semasiologically semasiologist semasiology semateme sematic sematographic sematography sematology sematrope semball semblable semblably semblance semblant semblative semble seme Semecarpus semeed semeia semeiography semeiologic semeiological semeiologist semeiology semeion semeiotic semeiotical semeiotics semelfactive semelincident semen semence Semeostoma semese semester semestral semestrial semi semiabstracted semiaccomplishment semiacid semiacidified semiacquaintance semiadherent semiadjectively semiadnate semiaerial semiaffectionate semiagricultural Semiahmoo semialbinism semialcoholic semialien semiallegiance semialpine semialuminous semiamplexicaul semiamplitude semianarchist semianatomical semianatropal semianatropous semiangle semiangular semianimal semianimate semianimated semiannealed semiannual semiannually semiannular semianthracite semiantiministerial semiantique semiape semiaperiodic semiaperture semiappressed semiaquatic semiarborescent semiarc semiarch semiarchitectural semiarid semiaridity semiarticulate semiasphaltic semiatheist semiattached semiautomatic semiautomatically semiautonomous semiaxis semibacchanalian semibachelor semibald semibalked semiball semiballoon semiband semibarbarian semibarbarianism semibarbaric semibarbarism semibarbarous semibaronial semibarren semibase semibasement semibastion semibay semibeam semibejan semibelted semibifid semibituminous semibleached semiblind semiblunt semibody semiboiled semibolshevist semibolshevized semibouffant semibourgeois semibreve semibull semiburrowing semic semicadence semicalcareous semicalcined semicallipygian semicanal semicanalis semicannibalic semicantilever semicarbazide semicarbazone semicarbonate semicarbonize semicardinal semicartilaginous semicastrate semicastration semicatholicism semicaudate semicelestial semicell semicellulose semicentenarian semicentenary semicentennial semicentury semichannel semichaotic semichemical semicheviot semichevron semichiffon semichivalrous semichoric semichorus semichrome semicircle semicircled semicircular semicircularity semicircularly semicircularness semicircumference semicircumferentor semicircumvolution semicirque semicitizen semicivilization semicivilized semiclassic semiclassical semiclause semicleric semiclerical semiclimber semiclimbing semiclose semiclosed semiclosure semicoagulated semicoke semicollapsible semicollar semicollegiate semicolloid semicolloquial semicolon semicolonial semicolumn semicolumnar semicoma semicomatose semicombined semicombust semicomic semicomical semicommercial semicompact semicompacted semicomplete semicomplicated semiconceal semiconcrete semiconducting semiconductor semicone semiconfident semiconfinement semiconfluent semiconformist semiconformity semiconic semiconical semiconnate semiconnection semiconoidal semiconscious semiconsciously semiconsciousness semiconservative semiconsonant semiconsonantal semiconspicuous semicontinent semicontinuum semicontraction semicontradiction semiconvergence semiconvergent semiconversion semiconvert semicordate semicordated semicoriaceous semicorneous semicoronate semicoronated semicoronet semicostal semicostiferous semicotton semicotyle semicounterarch semicountry semicrepe semicrescentic semicretin semicretinism semicriminal semicroma semicrome semicrustaceous semicrystallinc semicubical semicubit semicup semicupium semicupola semicured semicurl semicursive semicurvilinear semicyclic semicycloid semicylinder semicylindric semicylindrical semicynical semidaily semidangerous semidark semidarkness semidead semideaf semidecay semidecussation semidefinite semideific semideification semideistical semideity semidelight semidelirious semideltaic semidemented semidenatured semidependence semidependent semideponent semidesert semidestructive semidetached semidetachment semideveloped semidiagrammatic semidiameter semidiapason semidiapente semidiaphaneity semidiaphanous semidiatessaron semidifference semidigested semidigitigrade semidigression semidilapidation semidine semidirect semidisabled semidisk semiditone semidiurnal semidivided semidivine semidocumentary semidodecagon semidole semidome semidomed semidomestic semidomesticated semidomestication semidomical semidormant semidouble semidrachm semidramatic semidress semidressy semidried semidry semidrying semiductile semidull semiduplex semiduration semieducated semieffigy semiegg semiegret semielastic semielision semiellipse semiellipsis semiellipsoidal semielliptic semielliptical semienclosed semiengaged semiequitant semierect semieremitical semiessay semiexecutive semiexpanded semiexplanation semiexposed semiexternal semiextinct semiextinction semifable semifabulous semifailure semifamine semifascia semifasciated semifashion semifast semifatalistic semiferal semiferous semifeudal semifeudalism semifib semifiction semifictional semifigurative semifigure semifinal semifinalist semifine semifinish semifinished semifiscal semifistular semifit semifitting semifixed semiflashproof semiflex semiflexed semiflexible semiflexion semiflexure semiflint semifloating semifloret semifloscular semifloscule semiflosculose semiflosculous semifluctuant semifluctuating semifluid semifluidic semifluidity semifoaming semiforbidding semiforeign semiform semiformal semiformed semifossil semifossilized semifrantic semifriable semifrontier semifuddle semifunctional semifused semifusion semify semigala semigelatinous semigentleman semigenuflection semigirder semiglaze semiglazed semiglobe semiglobose semiglobular semiglobularly semiglorious semiglutin semigod semigovernmental semigrainy semigranitic semigranulate semigravel semigroove semihand semihard semiharden semihardy semihastate semihepatization semiherbaceous semiheterocercal semihexagon semihexagonal semihiant semihiatus semihibernation semihigh semihistorical semihobo semihonor semihoral semihorny semihostile semihot semihuman semihumanitarian semihumanized semihumbug semihumorous semihumorously semihyaline semihydrate semihydrobenzoinic semihyperbola semihyperbolic semihyperbolical semijealousy semijubilee semijudicial semijuridical semilanceolate semilatent semilatus semileafless semilegendary semilegislative semilens semilenticular semilethal semiliberal semilichen semiligneous semilimber semilined semiliquid semiliquidity semiliterate semilocular semilogarithmic semilogical semilong semilooper semiloose semiloyalty semilucent semilunar semilunare semilunary semilunate semilunation semilune semiluxation semiluxury semimachine semimade semimadman semimagical semimagnetic semimajor semimalignant semimanufacture semimanufactured semimarine semimarking semimathematical semimature semimechanical semimedicinal semimember semimembranosus semimembranous semimenstrual semimercerized semimessianic semimetal semimetallic semimetamorphosis semimicrochemical semimild semimilitary semimill semimineral semimineralized semiminim semiminor semimolecule semimonastic semimonitor semimonopoly semimonster semimonthly semimoron semimucous semimute semimystic semimystical semimythical seminaked seminal seminality seminally seminaphthalidine seminaphthylamine seminar seminarcosis seminarial seminarian seminarianism seminarist seminaristic seminarize seminary seminasal seminase seminatant seminate semination seminationalization seminative seminebulous seminecessary seminegro seminervous seminiferal seminiferous seminific seminifical seminification seminist seminium seminivorous seminocturnal Seminole seminoma seminomad seminomadic seminomata seminonconformist seminonflammable seminonsensical seminormal seminose seminovel seminovelty seminude seminudity seminule seminuliferous seminuria seminvariant seminvariantive semioblivion semioblivious semiobscurity semioccasional semioccasionally semiocclusive semioctagonal semiofficial semiofficially semiography Semionotidae Semionotus semiopacity semiopacous semiopal semiopalescent semiopaque semiopened semiorb semiorbicular semiorbicularis semiorbiculate semiordinate semiorganized semioriental semioscillation semiosseous semiostracism semiotic semiotician semioval semiovaloid semiovate semioviparous semiovoid semiovoidal semioxidated semioxidized semioxygenated semioxygenized semipagan semipalmate semipalmated semipalmation semipanic semipapal semipapist semiparallel semiparalysis semiparameter semiparasitic semiparasitism semipaste semipastoral semipasty semipause semipeace semipectinate semipectinated semipectoral semiped semipedal semipellucid semipellucidity semipendent semipenniform semiperfect semiperimeter semiperimetry semiperiphery semipermanent semipermeability semipermeable semiperoid semiperspicuous semipertinent semipervious semipetaloid semipetrified semiphase semiphilologist semiphilosophic semiphilosophical semiphlogisticated semiphonotypy semiphosphorescent semipinacolic semipinacolin semipinnate semipiscine semiplantigrade semiplastic semiplumaceous semiplume semipolar semipolitical semipolitician semipoor semipopish semipopular semiporcelain semiporous semiporphyritic semiportable semipostal semipractical semiprecious semipreservation semiprimigenous semiprivacy semiprivate semipro semiprofane semiprofessional semiprofessionalized semipronation semiprone semipronominal semiproof semiproselyte semiprosthetic semiprostrate semiprotectorate semiproven semipublic semipupa semipurulent semiputrid semipyramidal semipyramidical semipyritic semiquadrangle semiquadrantly semiquadrate semiquantitative semiquantitatively semiquartile semiquaver semiquietism semiquietist semiquinquefid semiquintile semiquote semiradial semiradiate Semiramis Semiramize semirapacious semirare semirattlesnake semiraw semirebellion semirecondite semirecumbent semirefined semireflex semiregular semirelief semireligious semireniform semirepublican semiresinous semiresolute semirespectability semirespectable semireticulate semiretirement semiretractile semireverberatory semirevolute semirevolution semirevolutionist semirhythm semiriddle semirigid semiring semiroll semirotary semirotating semirotative semirotatory semirotund semirotunda semiround semiroyal semiruin semirural semirustic semis semisacerdotal semisacred semisagittate semisaint semisaline semisaltire semisaprophyte semisaprophytic semisarcodic semisatiric semisaturation semisavage semisavagedom semisavagery semiscenic semischolastic semiscientific semiseafaring semisecondary semisecrecy semisecret semisection semisedentary semisegment semisensuous semisentient semisentimental semiseparatist semiseptate semiserf semiserious semiseriously semiseriousness semiservile semisevere semiseverely semiseverity semisextile semishady semishaft semisheer semishirker semishrub semishrubby semisightseeing semisilica semisimious semisimple semisingle semisixth semiskilled semislave semismelting semismile semisocial semisocialism semisociative semisocinian semisoft semisolemn semisolemnity semisolemnly semisolid semisolute semisomnambulistic semisomnolence semisomnous semisopor semisovereignty semispan semispeculation semisphere semispheric semispherical semispheroidal semispinalis semispiral semispiritous semispontaneity semispontaneous semispontaneously semispontaneousness semisport semisporting semisquare semistagnation semistaminate semistarvation semistarved semistate semisteel semistiff semistill semistock semistory semistratified semistriate semistriated semistuporous semisubterranean semisuburban semisuccess semisuccessful semisuccessfully semisucculent semisupernatural semisupinated semisupination semisupine semisuspension semisymmetric semita semitact semitae semitailored semital semitandem semitangent semitaur Semite semitechnical semiteetotal semitelic semitendinosus semitendinous semiterete semiterrestrial semitertian semitesseral semitessular semitheological semithoroughfare Semitic Semiticism Semiticize Semitics semitime Semitism Semitist Semitization Semitize semitonal semitonally semitone semitonic semitonically semitontine semitorpid semitour semitrailer semitrained semitransept semitranslucent semitransparency semitransparent semitransverse semitreasonable semitrimmed semitropic semitropical semitropics semitruth semituberous semitubular semiuncial semiundressed semiuniversalist semiupright semiurban semiurn semivalvate semivault semivector semivegetable semivertebral semiverticillate semivibration semivirtue semiviscid semivital semivitreous semivitrification semivitrified semivocal semivocalic semivolatile semivolcanic semivoluntary semivowel semivulcanized semiwaking semiwarfare semiweekly semiwild semiwoody semiyearly semmet semmit Semnae Semnones Semnopithecinae semnopithecine Semnopithecus semola semolella semolina semological semology Semostomae semostomeous semostomous semperannual sempergreen semperidentical semperjuvenescent sempervirent sempervirid Sempervivum sempitern sempiternal sempiternally sempiternity sempiternize sempiternous sempstrywork semsem semuncia semuncial sen Senaah senaite senam senarian senarius senarmontite senary senate senator senatorial senatorially senatorian senatorship senatory senatress senatrices senatrix sence Senci sencion send sendable sendal sendee sender sending Seneca Senecan Senecio senecioid senecionine senectitude senectude senectuous senega Senegal Senegalese Senegambian senegin senesce senescence senescent seneschal seneschally seneschalship seneschalsy seneschalty sengreen senicide Senijextee senile senilely senilism senility senilize senior seniority seniorship Senlac Senna senna sennegrass sennet sennight sennit sennite senocular Senones Senonian sensa sensable sensal sensate sensation sensational sensationalism sensationalist sensationalistic sensationalize sensationally sensationary sensationish sensationism sensationist sensationistic sensationless sensatorial sensatory sense sensed senseful senseless senselessly senselessness sensibilia sensibilisin sensibilitist sensibilitous sensibility sensibilium sensibilization sensibilize sensible sensibleness sensibly sensical sensifacient sensiferous sensific sensificatory sensifics sensify sensigenous sensile sensilia sensilla sensillum sension sensism sensist sensistic sensitive sensitively sensitiveness sensitivity sensitization sensitize sensitizer sensitometer sensitometric sensitometry sensitory sensive sensize senso sensomobile sensomobility sensomotor sensoparalysis sensor sensoria sensorial sensoriglandular sensorimotor sensorimuscular sensorium sensorivascular sensorivasomotor sensorivolitional sensory sensual sensualism sensualist sensualistic sensuality sensualization sensualize sensually sensualness sensuism sensuist sensum sensuosity sensuous sensuously sensuousness sensyne sent sentence sentencer sentential sententially sententiarian sententiarist sententiary sententiosity sententious sententiously sententiousness sentience sentiendum sentient sentiently sentiment sentimental sentimentalism sentimentalist sentimentality sentimentalization sentimentalize sentimentalizer sentimentally sentimenter sentimentless sentinel sentinellike sentinelship sentinelwise sentisection sentition sentry Senusi Senusian Senusism sepad sepal sepaled sepaline sepalled sepalody sepaloid separability separable separableness separably separata separate separatedly separately separateness separates separatical separating separation separationism separationist separatism separatist separatistic separative separatively separativeness separator separatory separatress separatrix separatum Sepharad Sephardi Sephardic Sephardim Sepharvites sephen sephiric sephirothic sepia sepiaceous sepialike sepian sepiarian sepiary sepic sepicolous Sepiidae sepiment sepioid Sepioidea Sepiola Sepiolidae sepiolite sepion sepiost sepiostaire sepium sepone sepoy seppuku seps Sepsidae sepsine sepsis Sept sept septa septal septan septane septangle septangled septangular septangularness septarian septariate septarium septate septated septation septatoarticulate septavalent septave septcentenary septectomy September Septemberer Septemberism Septemberist Septembral Septembrian Septembrist Septembrize Septembrizer septemdecenary septemfid septemfluous septemfoliate septemfoliolate septemia septempartite septemplicate septemvious septemvir septemvirate septemviri septenar septenarian septenarius septenary septenate septendecennial septendecimal septennary septennate septenniad septennial septennialist septenniality septennially septennium septenous Septentrio Septentrion septentrional septentrionality septentrionally septentrionate septentrionic septerium septet septfoil Septi Septibranchia Septibranchiata septic septical septically septicemia septicemic septicidal septicidally septicity septicization septicolored septicopyemia septicopyemic septier septifarious septiferous septifluous septifolious septiform septifragal septifragally septilateral septile septillion septillionth septimal septimanal septimanarian septime septimetritis septimole septinsular septipartite septisyllabic septisyllable septivalent septleva Septobasidium septocosta septocylindrical Septocylindrium septodiarrhea septogerm Septogloeum septoic septole septomarginal septomaxillary septonasal Septoria septotomy septship septuagenarian septuagenarianism septuagenary septuagesima Septuagint septuagint Septuagintal septulate septulum septum septuncial septuor septuple septuplet septuplicate septuplication sepulcher sepulchral sepulchralize sepulchrally sepulchrous sepultural sepulture sequa sequacious sequaciously sequaciousness sequacity Sequan Sequani Sequanian sequel sequela sequelae sequelant sequence sequencer sequency sequent sequential sequentiality sequentially sequently sequest sequester sequestered sequesterment sequestra sequestrable sequestral sequestrate sequestration sequestrator sequestratrices sequestratrix sequestrectomy sequestrotomy sequestrum sequin sequitur Sequoia ser sera serab Serabend seragli seraglio serai serail seral seralbumin seralbuminous serang serape Serapea Serapeum seraph seraphic seraphical seraphically seraphicalness seraphicism seraphicness seraphim seraphina seraphine seraphism seraphlike seraphtide Serapias Serapic Serapis Serapist serasker seraskerate seraskier seraskierat serau seraw Serb Serbdom Serbian Serbize Serbonian Serbophile Serbophobe sercial serdab Serdar Sere sere Serean sereh Serena serenade serenader serenata serenate Serendib serendibite serendipity serendite serene serenely sereneness serenify serenissime serenissimi serenissimo serenity serenize Serenoa Serer Seres sereward serf serfage serfdom serfhood serfish serfishly serfishness serfism serflike serfship Serge serge sergeancy Sergeant sergeant sergeantcy sergeantess sergeantry sergeantship sergeanty sergedesoy Sergei serger sergette serging Sergio Sergiu Sergius serglobulin Seri serial serialist seriality serialization serialize serially Serian seriary seriate seriately seriatim seriation Seric Sericana sericate sericated sericea sericeotomentose sericeous sericicultural sericiculture sericiculturist sericin sericipary sericite sericitic sericitization Sericocarpus sericteria sericterium serictery sericultural sericulture sericulturist seriema series serif serific Seriform serigraph serigrapher serigraphy serimeter serin serine serinette seringa seringal seringhi Serinus serio seriocomedy seriocomic seriocomical seriocomically seriogrotesque Seriola Seriolidae serioline serioludicrous seriopantomimic serioridiculous seriosity serious seriously seriousness seripositor Serjania serjeant serment sermo sermocination sermocinatrix sermon sermoneer sermoner sermonesque sermonet sermonettino sermonic sermonically sermonics sermonish sermonism sermonist sermonize sermonizer sermonless sermonoid sermonolatry sermonology sermonproof sermonwise sermuncle sernamby sero seroalbumin seroalbuminuria seroanaphylaxis serobiological serocolitis serocyst serocystic serodermatosis serodermitis serodiagnosis serodiagnostic seroenteritis seroenzyme serofibrinous serofibrous serofluid serogelatinous serohemorrhagic serohepatitis seroimmunity serolactescent serolemma serolin serolipase serologic serological serologically serologist serology seromaniac seromembranous seromucous seromuscular seron seronegative seronegativity seroon seroot seroperitoneum serophthisis serophysiology seroplastic seropneumothorax seropositive seroprevention seroprognosis seroprophylaxis seroprotease seropuriform seropurulent seropus seroreaction serosa serosanguineous serosanguinolent seroscopy serositis serosity serosynovial serosynovitis serotherapeutic serotherapeutics serotherapist serotherapy serotina serotinal serotine serotinous serotoxin serous serousness serovaccine serow serozyme Serpari serpedinous Serpens Serpent serpent serpentaria Serpentarian Serpentarii serpentarium Serpentarius serpentary serpentcleide serpenteau Serpentes serpentess Serpentian serpenticidal serpenticide Serpentid serpentiferous serpentiform serpentina serpentine serpentinely Serpentinian serpentinic serpentiningly serpentinization serpentinize serpentinoid serpentinous Serpentis serpentivorous serpentize serpentlike serpently serpentoid serpentry serpentwood serphid Serphidae serphoid Serphoidea serpierite serpiginous serpiginously serpigo serpivolant serpolet Serpula serpula Serpulae serpulae serpulan serpulid Serpulidae serpulidan serpuline serpulite serpulitic serpuloid serra serradella serrage serran serrana serranid Serranidae Serrano serrano serranoid Serranus Serrasalmo serrate serrated serratic serratiform serratile serration serratirostral serratocrenate serratodentate serratodenticulate serratoglandulous serratospinose serrature serricorn Serricornia Serridentines Serridentinus serried serriedly serriedness Serrifera serriferous serriform serriped serrirostrate serrulate serrulated serrulation serry sert serta Sertularia sertularian Sertulariidae sertularioid sertule sertulum sertum serum serumal serut servable servage serval servaline servant servantcy servantdom servantess servantless servantlike servantry servantship servation serve servente serventism server servery servet Servetian Servetianism Servian service serviceability serviceable serviceableness serviceably serviceberry serviceless servicelessness serviceman Servidor servidor servient serviential serviette servile servilely servileness servilism servility servilize serving servingman servist Servite servitor servitorial servitorship servitress servitrix servitude serviture Servius servo servomechanism servomotor servulate serwamby sesame sesamoid sesamoidal sesamoiditis Sesamum Sesban Sesbania sescuple Seseli Seshat Sesia Sesiidae sesma sesqui sesquialter sesquialtera sesquialteral sesquialteran sesquialterous sesquibasic sesquicarbonate sesquicentennial sesquichloride sesquiduplicate sesquihydrate sesquihydrated sesquinona sesquinonal sesquioctava sesquioctaval sesquioxide sesquipedal sesquipedalian sesquipedalianism sesquipedality sesquiplicate sesquiquadrate sesquiquarta sesquiquartal sesquiquartile sesquiquinta sesquiquintal sesquiquintile sesquisalt sesquiseptimal sesquisextal sesquisilicate sesquisquare sesquisulphate sesquisulphide sesquisulphuret sesquiterpene sesquitertia sesquitertial sesquitertian sesquitertianal sess sessile sessility Sessiliventres session sessional sessionary sessions sesterce sestertium sestet sesti sestiad Sestian sestina sestine sestole sestuor Sesuto Sesuvium set seta setaceous setaceously setae setal Setaria setarious setback setbolt setdown setfast Seth seth sethead Sethian Sethic Sethite Setibo setier Setifera setiferous setiform setigerous setiparous setirostral setline setness setoff seton Setophaga Setophaginae setophagine setose setous setout setover setscrew setsman sett settable settaine settee setter settergrass setterwort setting settle settleable settled settledly settledness settlement settler settlerdom settling settlings settlor settsman setula setule setuliform setulose setulous setup setwall setwise setwork seugh Sevastopol seven sevenbark sevener sevenfold sevenfolded sevenfoldness sevennight sevenpence sevenpenny sevenscore seventeen seventeenfold seventeenth seventeenthly seventh seventhly seventieth seventy seventyfold sever severable several severalfold severality severalize severally severalness severalth severalty severance severation severe severedly severely severeness severer Severian severingly severish severity severization severize severy Sevillian sew sewable sewage sewan sewed sewellel sewen sewer sewerage sewered sewerless sewerlike sewerman sewery sewing sewless sewn sewround sex sexadecimal sexagenarian sexagenarianism sexagenary Sexagesima sexagesimal sexagesimally sexagesimals sexagonal sexangle sexangled sexangular sexangularly sexannulate sexarticulate sexcentenary sexcuspidate sexdigital sexdigitate sexdigitated sexdigitism sexed sexenary sexennial sexennially sexennium sexern sexfarious sexfid sexfoil sexhood sexifid sexillion sexiped sexipolar sexisyllabic sexisyllable sexitubercular sexivalence sexivalency sexivalent sexless sexlessly sexlessness sexlike sexlocular sexly sexological sexologist sexology sexpartite sexradiate sext sextactic sextain sextan sextans Sextant sextant sextantal sextar sextarii sextarius sextary sextennial sextern sextet sextic sextile Sextilis sextillion sextillionth sextipara sextipartite sextipartition sextiply sextipolar sexto sextodecimo sextole sextolet sexton sextoness sextonship sextry sextubercular sextuberculate sextula sextulary sextumvirate sextuple sextuplet sextuplex sextuplicate sextuply sexual sexuale sexualism sexualist sexuality sexualization sexualize sexually sexuous sexupara sexuparous sexy sey seybertite Seymeria Seymour sfoot Sgad sgraffiato sgraffito sh sha shaatnez shab Shaban shabash Shabbath shabbed shabbify shabbily shabbiness shabble shabby shabbyish shabrack shabunder Shabuoth shachle shachly shack shackanite shackatory shackbolt shackland shackle shacklebone shackledom shackler shacklewise shackling shackly shacky shad shadbelly shadberry shadbird shadbush shadchan shaddock shade shaded shadeful shadeless shadelessness shader shadetail shadflower shadily shadine shadiness shading shadkan shadoof Shadow shadow shadowable shadowbox shadowboxing shadowed shadower shadowfoot shadowgram shadowgraph shadowgraphic shadowgraphist shadowgraphy shadowily shadowiness shadowing shadowishly shadowist shadowland shadowless shadowlessness shadowlike shadowly shadowy shadrach shady shaffle Shafiite shaft shafted shafter shaftfoot shafting shaftless shaftlike shaftman shaftment shaftsman shaftway shafty shag shaganappi shagbag shagbark shagged shaggedness shaggily shagginess shaggy Shagia shaglet shaglike shagpate shagrag shagreen shagreened shagroon shagtail shah Shahaptian shaharith shahdom shahi Shahid shahin shahzada Shai Shaigia shaikh Shaikiyeh shaitan Shaiva Shaivism Shaka shakable shake shakeable shakebly shakedown shakefork shaken shakenly shakeout shakeproof Shaker shaker shakerag Shakerdom Shakeress Shakerism Shakerlike shakers shakescene Shakespearean Shakespeareana Shakespeareanism Shakespeareanly Shakespearize Shakespearolater Shakespearolatry shakha Shakil shakily shakiness shaking shakingly shako shaksheer Shakta Shakti shakti Shaktism shaku shaky Shakyamuni Shalako shale shalelike shaleman shall shallal shallon shalloon shallop shallopy shallot shallow shallowbrained shallowhearted shallowish shallowist shallowly shallowness shallowpate shallowpated shallows shallowy shallu shalom shalt shalwar shaly Sham sham shama shamable shamableness shamably shamal shamalo shaman shamaness shamanic shamanism shamanist shamanistic shamanize shamateur shamba Shambala shamble shambling shamblingly shambrier Shambu shame shameable shamed shameface shamefaced shamefacedly shamefacedness shamefast shamefastly shamefastness shameful shamefully shamefulness shameless shamelessly shamelessness shameproof shamer shamesick shameworthy shamianah Shamim shamir Shammar shammed shammer shammick shamming shammish shammock shammocking shammocky shammy shampoo shampooer shamrock shamroot shamsheer Shan shan shanachas shanachie Shandean shandry shandrydan Shandy shandy shandygaff Shandyism Shane Shang Shangalla shangan Shanghai shanghai shanghaier shank Shankar shanked shanker shankings shankpiece shanksman shanna Shannon shanny shansa shant Shantung shanty shantylike shantyman shantytown shap shapable Shape shape shaped shapeful shapeless shapelessly shapelessness shapeliness shapely shapen shaper shapeshifter shapesmith shaping shapingly shapometer shaps Shaptan shapy sharable Sharada Sharan shard Shardana sharded shardy share shareable sharebone sharebroker sharecrop sharecropper shareholder shareholdership shareman sharepenny sharer shareship sharesman sharewort Sharezer shargar Shari Sharia Sharira shark sharkful sharkish sharklet sharklike sharkship sharkskin sharky sharn sharnbud sharny Sharon sharp sharpen sharpener sharper sharpie sharpish sharply sharpness sharps sharpsaw sharpshin sharpshod sharpshooter sharpshooting sharptail sharpware sharpy Sharra sharrag sharry Shasta shastaite Shastan shaster shastra shastraik shastri shastrik shat shatan shathmont Shatter shatter shatterbrain shatterbrained shatterer shatterheaded shattering shatteringly shatterment shatterpated shatterproof shatterwit shattery shattuckite shauchle shaugh shaul Shaula shaup shauri shauwe shavable shave shaveable shaved shavee shaveling shaven shaver shavery Shavese shavester shavetail shaveweed Shavian Shaviana Shavianism shaving shavings Shaw shaw Shawanese Shawano shawl shawled shawling shawlless shawllike shawlwise shawm Shawn Shawnee shawneewood shawny Shawwal shawy shay Shaysite she shea sheading sheaf sheafage sheaflike sheafripe sheafy sheal shealing Shean shear shearbill sheard shearer sheargrass shearhog shearing shearless shearling shearman shearmouse shears shearsman sheartail shearwater shearwaters sheat sheatfish sheath sheathbill sheathe sheathed sheather sheathery sheathing sheathless sheathlike sheathy sheave sheaved sheaveless sheaveman shebang Shebat shebeen shebeener Shechem Shechemites shed shedded shedder shedding sheder shedhand shedlike shedman shedwise shee sheely sheen sheenful sheenless sheenly sheeny sheep sheepback sheepberry sheepbine sheepbiter sheepbiting sheepcote sheepcrook sheepfaced sheepfacedly sheepfacedness sheepfold sheepfoot sheepgate sheephead sheepheaded sheephearted sheepherder sheepherding sheephook sheephouse sheepify sheepish sheepishly sheepishness sheepkeeper sheepkeeping sheepkill sheepless sheeplet sheeplike sheepling sheepman sheepmaster sheepmonger sheepnose sheepnut sheeppen sheepshank sheepshead sheepsheadism sheepshear sheepshearer sheepshearing sheepshed sheepskin sheepsplit sheepsteal sheepstealer sheepstealing sheepwalk sheepwalker sheepweed sheepy sheer sheered sheering sheerly sheerness sheet sheetage sheeted sheeter sheetflood sheetful sheeting sheetless sheetlet sheetlike sheetling sheetways sheetwise sheetwork sheetwriting sheety Sheffield shehitah sheik sheikdom sheikhlike sheikhly sheiklike sheikly Sheila shekel Shekinah Shel shela sheld sheldapple shelder sheldfowl sheldrake shelduck shelf shelfback shelffellow shelfful shelflist shelfmate shelfpiece shelfroom shelfworn shelfy shell shellac shellacker shellacking shellapple shellback shellblow shellblowing shellbound shellburst shellcracker shelleater shelled sheller Shelleyan Shelleyana shellfire shellfish shellfishery shellflower shellful shellhead shelliness shelling shellman shellmonger shellproof shellshake shellum shellwork shellworker shelly shellycoat shelta shelter shelterage sheltered shelterer shelteringly shelterless shelterlessness shelterwood sheltery sheltron shelty shelve shelver shelving shelvingly shelvingness shelvy Shelyak Shemaka sheminith Shemite Shemitic Shemitish Shemu Shen shenanigan shend sheng Shenshai Sheol sheolic shepherd shepherdage shepherddom shepherdess shepherdhood Shepherdia shepherdish shepherdism shepherdize shepherdless shepherdlike shepherdling shepherdly shepherdry sheppeck sheppey shepstare sher Sherani Sherardia sherardize sherardizer Sheratan Sheraton sherbacha sherbet sherbetlee sherbetzide sheriat sherif sherifa sherifate sheriff sheriffalty sheriffdom sheriffess sheriffhood sheriffry sheriffship sheriffwick sherifi sherifian sherify sheristadar Sheriyat sherlock Sherman Sherpa Sherramoor Sherri sherry Sherrymoor sherryvallies Shesha sheth Shetland Shetlander Shetlandic sheugh sheva shevel sheveled shevri shewa shewbread shewel sheyle shi Shiah shibah shibar shibboleth shibbolethic shibuichi shice shicer shicker shickered shide shied shiel shield shieldable shieldboard shielddrake shielded shielder shieldflower shielding shieldless shieldlessly shieldlessness shieldlike shieldling shieldmaker shieldmay shieldtail shieling shier shies shiest shift shiftable shiftage shifter shiftful shiftfulness shiftily shiftiness shifting shiftingly shiftingness shiftless shiftlessly shiftlessness shifty Shigella shiggaion shigram shih Shiism Shiite Shiitic Shik shikar shikara shikargah shikari shikasta shikimi shikimic shikimole shikimotoxin shikken shiko shikra shilf shilfa Shilh Shilha shill shilla shillaber shillelagh shillet shillety shillhouse shillibeer shilling shillingless shillingsworth shilloo Shilluh Shilluk Shiloh shilpit shim shimal Shimei shimmer shimmering shimmeringly shimmery shimmy Shimonoseki shimose shimper shin Shina shinaniging shinarump shinbone shindig shindle shindy shine shineless shiner shingle shingled shingler shingles shinglewise shinglewood shingling shingly shinily shininess shining shiningly shiningness shinleaf Shinnecock shinner shinnery shinning shinny shinplaster shintiyan Shinto Shintoism Shintoist Shintoistic Shintoize shinty Shinwari shinwood shiny shinza ship shipboard shipbound shipboy shipbreaking shipbroken shipbuilder shipbuilding shipcraft shipentine shipful shipkeeper shiplap shipless shiplessly shiplet shipload shipman shipmanship shipmast shipmaster shipmate shipmatish shipment shipowner shipowning shippable shippage shipped shipper shipping shipplane shippo shippon shippy shipshape shipshapely shipside shipsmith shipward shipwards shipway shipwork shipworm shipwreck shipwrecky shipwright shipwrightery shipwrightry shipyard shirakashi shirallee Shiraz shire shirehouse shireman shirewick shirk shirker shirky shirl shirlcock Shirley shirpit shirr shirring shirt shirtband shirtiness shirting shirtless shirtlessness shirtlike shirtmaker shirtmaking shirtman shirttail shirtwaist shirty Shirvan shish shisham shisn shita shitepoke shither shittah shittim shittimwood shiv Shivaism Shivaist Shivaistic Shivaite shivaree shive shiver shivereens shiverer shivering shiveringly shiverproof shiversome shiverweed shivery shivey shivoo shivy shivzoku Shkupetar Shlu Shluh Sho sho Shoa shoad shoader shoal shoalbrain shoaler shoaliness shoalness shoalwise shoaly shoat shock shockability shockable shockedness shocker shockheaded shocking shockingly shockingness shocklike shockproof shod shodden shoddily shoddiness shoddy shoddydom shoddyism shoddyite shoddylike shoddyward shoddywards shode shoder shoe shoebill shoebinder shoebindery shoebinding shoebird shoeblack shoeboy shoebrush shoecraft shoeflower shoehorn shoeing shoeingsmith shoelace shoeless shoemaker shoemaking shoeman shoepack shoer shoescraper shoeshine shoeshop shoesmith shoestring shoewoman shoful shog shogaol shoggie shoggle shoggly shogi shogun shogunal shogunate shohet shoji Shojo shola shole Shona shone shoneen shonkinite shoo shood shoofa shoofly shooi shook shool shooldarry shooler shoop shoopiltie shoor shoot shootable shootboard shootee shooter shoother shooting shootist shootman shop shopboard shopbook shopboy shopbreaker shopbreaking shopfolk shopful shopgirl shopgirlish shophar shopkeeper shopkeeperess shopkeeperish shopkeeperism shopkeepery shopkeeping shopland shoplet shoplifter shoplifting shoplike shopmaid shopman shopmark shopmate shopocracy shopocrat shoppe shopper shopping shoppish shoppishness shoppy shopster shoptalk shopwalker shopwear shopwife shopwindow shopwoman shopwork shopworker shopworn shoq Shor shor shoran shore Shorea shoreberry shorebush shored shoregoing shoreland shoreless shoreman shorer shoreside shoresman shoreward shorewards shoreweed shoreyer shoring shorling shorn short shortage shortbread shortcake shortchange shortchanger shortclothes shortcoat shortcomer shortcoming shorten shortener shortening shorter shortfall shorthand shorthanded shorthandedness shorthander shorthead shorthorn Shortia shortish shortly shortness shorts shortschat shortsighted shortsightedly shortsightedness shortsome shortstaff shortstop shorttail Shortzy Shoshonean shoshonite shot shotbush shote shotgun shotless shotlike shotmaker shotman shotproof shotsman shotstar shott shotted shotten shotter shotty Shotweld shou should shoulder shouldered shoulderer shoulderette shouldering shouldna shouldnt shoupeltin shout shouter shouting shoutingly shoval shove shovegroat shovel shovelard shovelbill shovelboard shovelfish shovelful shovelhead shovelmaker shovelman shovelnose shovelweed shover show showable showance showbird showboard showboat showboater showboating showcase showdom showdown shower showerer showerful showeriness showerless showerlike showerproof showery showily showiness showing showish showless showman showmanism showmanry showmanship shown showpiece showroom showup showworthy showy showyard shoya shrab shraddha shradh shraf shrag shram shrank shrap shrapnel shrave shravey shreadhead shred shredcock shredder shredding shreddy shredless shredlike Shree shree shreeve shrend shrew shrewd shrewdish shrewdly shrewdness shrewdom shrewdy shrewish shrewishly shrewishness shrewlike shrewly shrewmouse shrewstruck shriek shrieker shriekery shriekily shriekiness shriekingly shriekproof shrieky shrieval shrievalty shrift shrike shrill shrilling shrillish shrillness shrilly shrimp shrimper shrimpfish shrimpi shrimpish shrimpishness shrimplike shrimpy shrinal Shrine shrine shrineless shrinelet shrinelike Shriner shrink shrinkable shrinkage shrinkageproof shrinker shrinkhead shrinking shrinkingly shrinkproof shrinky shrip shrite shrive shrivel shriven shriver shriving shroff shrog Shropshire shroud shrouded shrouding shroudless shroudlike shroudy Shrove shrove shrover Shrovetide shrub shrubbed shrubbery shrubbiness shrubbish shrubby shrubland shrubless shrublet shrublike shrubwood shruff shrug shruggingly shrunk shrunken shrups Shtokavski shtreimel Shu shuba shubunkin shuck shucker shucking shuckins shuckpen shucks shudder shudderful shudderiness shudderingly shuddersome shuddery shuff shuffle shuffleboard shufflecap shuffler shufflewing shuffling shufflingly shug Shuhali Shukria Shukulumbwe shul Shulamite shuler shulwaurs shumac shun Shunammite shune shunless shunnable shunner shunt shunter shunting shure shurf shush shusher Shuswap shut shutdown shutness shutoff Shutoku shutout shuttance shutten shutter shuttering shutterless shutterwise shutting shuttle shuttlecock shuttleheaded shuttlelike shuttlewise Shuvra shwanpan shy Shyam shydepoke shyer shyish Shylock Shylockism shyly shyness shyster si Sia siak sial sialaden sialadenitis sialadenoncus sialagogic sialagogue sialagoguic sialemesis Sialia sialic sialid Sialidae sialidan Sialis sialoangitis sialogenous sialoid sialolith sialolithiasis sialology sialorrhea sialoschesis sialosemeiology sialosis sialostenosis sialosyrinx sialozemia Siam siamang Siamese sib Sibbaldus sibbed sibbens sibber sibboleth sibby Siberian Siberic siberite sibilance sibilancy sibilant sibilantly sibilate sibilatingly sibilator sibilatory sibilous sibilus Sibiric sibling sibness sibrede sibship sibyl sibylesque sibylic sibylism sibylla sibylline sibyllist sic Sicambri Sicambrian Sicana Sicani Sicanian sicarian sicarious sicarius sicca siccaneous siccant siccate siccation siccative siccimeter siccity sice Sicel Siceliot Sicilian sicilian siciliana Sicilianism sicilica sicilicum sicilienne sicinnian sick sickbed sicken sickener sickening sickeningly sicker sickerly sickerness sickhearted sickish sickishly sickishness sickle sicklebill sickled sicklelike sickleman sicklemia sicklemic sicklepod sickler sicklerite sickless sickleweed sicklewise sicklewort sicklied sicklily sickliness sickling sickly sickness sicknessproof sickroom sicsac sicula sicular Siculi Siculian Sicyonian Sicyonic Sicyos Sid Sida Sidalcea sidder Siddha Siddhanta Siddhartha Siddhi siddur side sideage sidearm sideboard sidebone sidebones sideburns sidecar sidecarist sidecheck sided sidedness sideflash sidehead sidehill sidekicker sidelang sideless sideline sideling sidelings sidelingwise sidelong sidenote sidepiece sider sideral sideration siderealize sidereally siderean siderin siderism siderite sideritic Sideritis siderognost siderographic siderographical siderographist siderography siderolite siderology sideromagnetic sideromancy sideromelane sideronatrite sideronym sideroscope siderose siderosis siderostat siderostatic siderotechny siderous Sideroxylon sidership siderurgical siderurgy sides sidesaddle sideshake sideslip sidesman sidesplitter sidesplitting sidesplittingly sidesway sideswipe sideswiper sidetrack sidewalk sideward sidewards sideway sideways sidewinder sidewipe sidewiper sidewise sidhe sidi siding sidle sidler sidling sidlingly Sidney Sidonian Sidrach sidth sidy sie siege siegeable siegecraft siegenite sieger siegework Siegfried Sieglingia Siegmund Siegurd Siena Sienese sienna sier siering sierozem Sierra sierra sierran siesta siestaland Sieva sieve sieveful sievelike siever Sieversia sievings sievy sifac sifaka Sifatite sife siffilate siffle sifflement sifflet sifflot sift siftage sifted sifter sifting sig Siganidae Siganus sigatoka Sigaultian sigger sigh sigher sighful sighfully sighing sighingly sighingness sighless sighlike sight sightable sighted sighten sightening sighter sightful sightfulness sighthole sighting sightless sightlessly sightlessness sightlily sightliness sightly sightproof sightworthiness sightworthy sighty sigil sigilative Sigillaria Sigillariaceae sigillariaceous sigillarian sigillarid sigillarioid sigillarist sigillaroid sigillary sigillate sigillated sigillation sigillistic sigillographer sigillographical sigillography sigillum sigla siglarian siglos Sigma sigma sigmaspire sigmate sigmatic sigmation sigmatism sigmodont Sigmodontes sigmoid sigmoidal sigmoidally sigmoidectomy sigmoiditis sigmoidopexy sigmoidoproctostomy sigmoidorectostomy sigmoidoscope sigmoidoscopy sigmoidostomy Sigmund sign signable signal signalee signaler signalese signaletic signaletics signalism signalist signality signalize signally signalman signalment signary signatary signate signation signator signatory signatural signature signatureless signaturist signboard signee signer signet signetwise signifer signifiable significal significance significancy significant significantly significantness significate signification significatist significative significatively significativeness significator significatory significatrix significature significavit significian significs signifier signify signior signiorship signist signless signlike signman signorial signorship signory signpost signum signwriter Sigurd Sihasapa Sika sika sikar sikatch sike sikerly sikerness siket Sikh sikhara Sikhism sikhra Sikinnis Sikkimese Siksika sil silage silaginoid silane Silas silbergroschen silcrete sile silen Silenaceae silenaceous Silenales silence silenced silencer silency Silene sileni silenic silent silential silentiary silentious silentish silently silentness silenus silesia Silesian Siletz silex silexite silhouette silhouettist silhouettograph silica silicam silicane silicate silication silicatization Silicea silicean siliceocalcareous siliceofelspathic siliceofluoric siliceous silicic silicicalcareous silicicolous silicide silicidize siliciferous silicification silicifluoric silicifluoride silicify siliciophite silicious Silicispongiae silicium siliciuretted silicize silicle silico silicoacetic silicoalkaline silicoaluminate silicoarsenide silicocalcareous silicochloroform silicocyanide silicoethane silicoferruginous Silicoflagellata Silicoflagellatae silicoflagellate Silicoflagellidae silicofluoric silicofluoride silicohydrocarbon Silicoidea silicomagnesian silicomanganese silicomethane silicon silicone siliconize silicononane silicopropane silicosis Silicospongiae silicotalcose silicotic silicotitanate silicotungstate silicotungstic silicula silicular silicule siliculose siliculous silicyl Silipan siliqua siliquaceous siliquae Siliquaria Siliquariidae silique siliquiferous siliquiform siliquose siliquous silk silkalene silkaline silked silken silker silkflower silkgrower silkie silkily silkiness silklike silkman silkness silksman silktail silkweed silkwoman silkwood silkwork silkworks silkworm silky sill sillabub silladar Sillaginidae Sillago sillandar sillar siller Sillery sillibouk sillikin sillily sillimanite silliness sillock sillograph sillographer sillographist sillometer sillon silly sillyhood sillyhow sillyish sillyism sillyton silo siloist Silpha silphid Silphidae silphium silt siltage siltation silting siltlike silty silundum Silures Silurian Siluric silurid Siluridae Siluridan siluroid Siluroidei Silurus silva silvan silvanity silvanry Silvanus silvendy silver silverback silverbeater silverbelly silverberry silverbill silverboom silverbush silvered silverer silvereye silverfin silverfish silverhead silverily silveriness silvering silverish silverite silverize silverizer silverleaf silverless silverlike silverling silverly silvern silverness silverpoint silverrod silverside silversides silverskin silversmith silversmithing silverspot silvertail silvertip silvertop silvervine silverware silverweed silverwing silverwood silverwork silverworker silvery Silvester Silvia silvical silvicolous silvics silvicultural silviculturally silviculture silviculturist Silvius Silybum silyl Sim sima Simaba simal simar Simarouba Simaroubaceae simaroubaceous simball simbil simblin simblot Simblum sime Simeon Simeonism Simeonite Simia simiad simial simian simianity simiesque Simiidae Simiinae similar similarity similarize similarly similative simile similimum similiter similitive similitude similitudinize simility similize similor simioid simious simiousness simity simkin simlin simling simmer simmeringly simmon simnel simnelwise simoleon Simon simoniac simoniacal simoniacally Simonian Simonianism simonious simonism Simonist simonist simony simool simoom simoon Simosaurus simous simp simpai simper simperer simperingly simple simplehearted simpleheartedly simpleheartedness simpleness simpler simpleton simpletonian simpletonianism simpletonic simpletonish simpletonism simplex simplexed simplexity simplicident Simplicidentata simplicidentate simplicist simplicitarian simplicity simplicize simplification simplificative simplificator simplified simplifiedly simplifier simplify simplism simplist simplistic simply simsim simson simulacra simulacral simulacre simulacrize simulacrum simulance simulant simular simulate simulation simulative simulatively simulator simulatory simulcast simuler simuliid Simuliidae simulioid Simulium simultaneity simultaneous simultaneously simultaneousness sin sina Sinae Sinaean Sinaic sinaite Sinaitic sinal sinalbin Sinaloa sinamay sinamine sinapate sinapic sinapine sinapinic Sinapis sinapis sinapism sinapize sinapoline sinarchism sinarchist sinarquism sinarquist sinarquista sinawa sincaline since sincere sincerely sincereness sincerity sincipital sinciput sind sinder Sindhi sindle sindoc sindon sindry sine sinecural sinecure sinecureship sinecurism sinecurist Sinesian sinew sinewed sinewiness sinewless sinewous sinewy sinfonia sinfonie sinfonietta sinful sinfully sinfulness sing singability singable singableness singally singarip singe singed singeing singeingly singer singey Singfo singh Singhalese singillatim singing singingly singkamas single singlebar singled singlehanded singlehandedly singlehandedness singlehearted singleheartedly singleheartedness singlehood singleness singler singles singlestick singlesticker singlet singleton singletree singlings singly Singpho Singsing singsong singsongy Singspiel singspiel singstress singular singularism singularist singularity singularization singularize singularly singularness singult singultous singultus sinh Sinhalese Sinian Sinic Sinicism Sinicization Sinicize Sinico Sinification Sinify sinigrin sinigrinase sinigrosid sinigroside Sinisian Sinism sinister sinisterly sinisterness sinisterwise sinistrad sinistral sinistrality sinistrally sinistration sinistrin sinistrocerebral sinistrocular sinistrodextral sinistrogyrate sinistrogyration sinistrogyric sinistromanual sinistrorsal sinistrorsally sinistrorse sinistrous sinistrously sinistruous Sinite Sinitic sink sinkable sinkage sinker sinkerless sinkfield sinkhead sinkhole sinking Sinkiuse sinkless sinklike sinkroom sinkstone sinky sinless sinlessly sinlessness sinlike sinnable sinnableness sinnen sinner sinneress sinnership sinnet Sinningia sinningly sinningness sinoatrial sinoauricular Sinogram sinoidal Sinolog Sinologer Sinological Sinologist Sinologue Sinology sinomenine Sinonism Sinophile Sinophilism sinopia Sinopic sinopite sinople sinproof Sinsiga sinsion sinsring sinsyne sinter Sinto sintoc Sintoism Sintoist Sintsink Sintu sinuate sinuated sinuatedentate sinuately sinuation sinuatocontorted sinuatodentate sinuatodentated sinuatopinnatifid sinuatoserrated sinuatoundulate sinuatrial sinuauricular sinuitis sinuose sinuosely sinuosity sinuous sinuously sinuousness Sinupallia sinupallial Sinupallialia Sinupalliata sinupalliate sinus sinusal sinusitis sinuslike sinusoid sinusoidal sinusoidally sinuventricular sinward siol Sion sion Sionite Siouan Sioux sip sipage sipe siper siphoid siphon siphonaceous siphonage siphonal Siphonales Siphonaptera siphonapterous Siphonaria siphonariid Siphonariidae Siphonata siphonate Siphoneae siphoneous siphonet siphonia siphonial Siphoniata siphonic Siphonifera siphoniferous siphoniform siphonium siphonless siphonlike Siphonobranchiata siphonobranchiate Siphonocladales Siphonocladiales siphonogam Siphonogama siphonogamic siphonogamous siphonogamy siphonoglyph siphonoglyphe siphonognathid Siphonognathidae siphonognathous Siphonognathus Siphonophora siphonophoran siphonophore siphonophorous siphonoplax siphonopore siphonorhinal siphonorhine siphonosome siphonostele siphonostelic siphonostely Siphonostoma Siphonostomata siphonostomatous siphonostome siphonostomous siphonozooid siphonula siphorhinal siphorhinian siphosome siphuncle siphuncled siphuncular Siphunculata siphunculate siphunculated Sipibo sipid sipidity Siping siping sipling sipper sippet sippingly sippio Sipunculacea sipunculacean sipunculid Sipunculida sipunculoid Sipunculoidea Sipunculus sipylite Sir sir sircar sirdar sirdarship sire Siredon sireless siren sirene Sirenia sirenian sirenic sirenical sirenically Sirenidae sirening sirenize sirenlike sirenoid Sirenoidea Sirenoidei sireny sireship siress sirgang Sirian sirian Sirianian siriasis siricid Siricidae Siricoidea sirih siriometer Sirione siris Sirius sirkeer sirki sirky sirloin sirloiny Sirmian Sirmuellera siroc sirocco siroccoish siroccoishly sirpea sirple sirpoon sirrah sirree sirship siruaballi siruelas sirup siruped siruper sirupy Siryan Sis sis sisal siscowet sise sisel siserara siserary siserskite sish sisham sisi siskin Sisley sismotherapy siss Sisseton sissification sissify sissiness sissoo Sissu sissy sissyish sissyism sist Sistani sister sisterhood sisterin sistering sisterize sisterless sisterlike sisterliness sisterly sistern Sistine sistle sistomensin sistrum Sistrurus Sisymbrium Sisyphean Sisyphian Sisyphides Sisyphism Sisyphist Sisyphus Sisyrinchium sisyrinchium sit Sita sitao sitar sitatunga sitch site sitfast sith sithcund sithe sithement sithence sithens sitient sitio sitiology sitiomania sitiophobia Sitka Sitkan sitology sitomania Sitophilus sitophobia sitophobic sitosterin sitosterol sitotoxism Sitta sittee sitten sitter Sittidae Sittinae sittine sitting sittringy situal situate situated situation situational situla situlae situs Sium Siusi Siuslaw Siva siva Sivaism Sivaist Sivaistic Sivaite Sivan Sivapithecus sivathere Sivatheriidae Sivatheriinae sivatherioid Sivatherium siver sivvens Siwan Siwash siwash six sixain sixer sixfoil sixfold sixhaend sixhynde sixpence sixpenny sixpennyworth sixscore sixsome sixte sixteen sixteener sixteenfold sixteenmo sixteenth sixteenthly sixth sixthet sixthly sixtieth Sixtowns Sixtus sixty sixtyfold sixtypenny sizable sizableness sizably sizal sizar sizarship size sizeable sizeableness sized sizeman sizer sizes siziness sizing sizy sizygia sizygium sizz sizzard sizzing sizzle sizzling sizzlingly Sjaak sjambok Sjouke skaddle skaff skaffie skag skaillie skainsmate skair skaitbird skal skalawag skaldship skance Skanda skandhas skart skasely Skat skat skate skateable skater skatikas skatiku skating skatist skatole skatosine skatoxyl skaw skean skeanockle skedaddle skedaddler skedge skedgewith skedlock skee skeed skeeg skeel skeeling skeely skeen skeenyie skeer skeered skeery skeesicks skeet Skeeter skeeter skeezix Skef skeg skegger skeif skeigh skeily skein skeiner skeipp skel skelder skelderdrake skeldrake skeletal skeletin skeletogenous skeletogeny skeletomuscular skeleton skeletonian skeletonic skeletonization skeletonize skeletonizer skeletonless skeletonweed skeletony skelf skelgoose skelic skell skellat skeller skelloch skellum skelly skelp skelper skelpin skelping skelter Skeltonian Skeltonic Skeltonical Skeltonics skemmel skemp sken skene skeo skeough skep skepful skeppist skeppund skeptic skeptical skeptically skepticalness skepticism skepticize sker skere skerret skerrick skerry sketch sketchability sketchable sketchbook sketchee sketcher sketchily sketchiness sketching sketchingly sketchist sketchlike sketchy skete sketiotai skeuomorph skeuomorphic skevish skew skewback skewbacked skewbald skewed skewer skewerer skewerwood skewings skewl skewly skewness skewwhiff skewwise skewy skey skeyting ski skiagram skiagraph skiagrapher skiagraphic skiagraphical skiagraphically skiagraphy skiameter skiametry skiapod skiapodous skiascope skiascopy skibby skibslast skice skid skidded skidder skidding skiddingly skiddoo skiddy Skidi skidpan skidproof skidway skied skieppe skiepper skier skies skiff skiffless skiffling skift skiing skijore skijorer skijoring skil skilder skildfel skilfish skill skillagalee skilled skillenton skillessness skillet skillful skillfully skillfulness skilligalee skilling skillion skilly skilpot skilts skim skimback skime skimmed skimmer skimmerton Skimmia skimming skimmingly skimmington skimmity skimp skimpily skimpiness skimpingly skimpy skin skinbound skinch skinflint skinflintily skinflintiness skinflinty skinful skink skinker skinking skinkle skinless skinlike skinned skinner skinnery skinniness skinning skinny skintight skinworm skiogram skiograph skiophyte Skip skip skipbrain Skipetar skipjack skipjackly skipkennel skipman skippable skippel skipper skippered skippership skippery skippet skipping skippingly skipple skippund skippy skiptail skirl skirlcock skirling skirmish skirmisher skirmishing skirmishingly skirp skirr skirreh skirret skirt skirtboard skirted skirter skirting skirtingly skirtless skirtlike skirty skirwhit skirwort skit skite skiter skither Skitswish Skittaget Skittagetan skitter skittish skittishly skittishness skittle skittled skittler skittles skitty skittyboot skiv skive skiver skiverwood skiving skivvies sklate sklater sklent skleropelite sklinter skoal Skodaic skogbolite Skoinolon skokiaan Skokomish skomerite skoo skookum Skopets skoptsy skout skraeling skraigh skrike skrimshander skrupul skua skulduggery skulk skulker skulking skulkingly skull skullbanker skullcap skulled skullery skullfish skullful skully skulp skun skunk skunkbill skunkbush skunkdom skunkery skunkhead skunkish skunklet skunktop skunkweed skunky Skupshtina skuse skutterudite sky skybal skycraft Skye skyey skyful skyish skylark skylarker skyless skylight skylike skylook skyman skyphoi skyphos skyplast skyre skyrgaliard skyrocket skyrockety skysail skyscape skyscraper skyscraping skyshine skyugle skyward skywards skyway skywrite skywriter skywriting sla slab slabbed slabber slabberer slabbery slabbiness slabbing slabby slabman slabness slabstone slack slackage slacked slacken slackener slacker slackerism slacking slackingly slackly slackness slad sladang slade slae slag slaggability slaggable slagger slagging slaggy slagless slaglessness slagman slain slainte slaister slaistery slait slake slakeable slakeless slaker slaking slaky slam slammakin slammerkin slammock slammocking slammocky slamp slampamp slampant slander slanderer slanderful slanderfully slandering slanderingly slanderous slanderously slanderousness slanderproof slane slang slangily slanginess slangish slangishly slangism slangkop slangous slangster slanguage slangular slangy slank slant slantindicular slantindicularly slanting slantingly slantingways slantly slantways slantwise slap slapdash slapdashery slape slaphappy slapjack slapper slapping slapstick slapsticky slare slart slarth Slartibartfast slash slashed slasher slashing slashingly slashy slat slatch slate slateful slatelike slatemaker slatemaking slater slateworks slateyard slath slather slatify slatiness slating slatish slatted slatter slattern slatternish slatternliness slatternly slatternness slattery slatting slaty slaughter slaughterer slaughterhouse slaughteringly slaughterman slaughterous slaughterously slaughteryard slaum Slav Slavdom Slave slave slaveborn slaved slaveholder slaveholding slaveland slaveless slavelet slavelike slaveling slavemonger slaveowner slaveownership slavepen slaver slaverer slavering slaveringly slavery Slavey slavey Slavi Slavian Slavic Slavicism Slavicize Slavification Slavify slavikite slaving Slavish slavish slavishly slavishness Slavism Slavist Slavistic Slavization Slavize slavocracy slavocrat slavocratic Slavonian Slavonianize Slavonic Slavonically Slavonicize Slavonish Slavonism Slavonization Slavonize Slavophile Slavophilism Slavophobe Slavophobist slaw slay slayable slayer slaying sleathy sleave sleaved sleaziness sleazy Sleb sleck sled sledded sledder sledding sledful sledge sledgeless sledgemeter sledger sledging sledlike slee sleech sleechy sleek sleeken sleeker sleeking sleekit sleekly sleekness sleeky sleep sleeper sleepered sleepful sleepfulness sleepify sleepily sleepiness sleeping sleepingly sleepland sleepless sleeplessly sleeplessness sleeplike sleepmarken sleepproof sleepry sleepwaker sleepwaking sleepwalk sleepwalker sleepwalking sleepward sleepwort sleepy sleepyhead sleer sleet sleetiness sleeting sleetproof sleety sleeve sleeveband sleeveboard sleeved sleeveen sleevefish sleeveful sleeveless sleevelessness sleevelet sleevelike sleever sleigh sleigher sleighing sleight sleightful sleighty slendang slender slenderish slenderize slenderly slenderness slent slepez slept slete sleuth sleuthdog sleuthful sleuthhound sleuthlike slew slewed slewer slewing sley sleyer slice sliceable sliced slicer slich slicht slicing slicingly slick slicken slickens slickenside slicker slickered slickery slicking slickly slickness slid slidable slidableness slidably slidage slidden slidder sliddery slide slideable slideableness slideably slided slidehead slideman slideproof slider slideway sliding slidingly slidingness slidometer slifter slight slighted slighter slightily slightiness slighting slightingly slightish slightly slightness slighty slim slime slimeman slimer slimily sliminess slimish slimishness slimly slimmish slimness slimpsy slimsy slimy sline sling slingball slinge slinger slinging slingshot slingsman slingstone slink slinker slinkily slinkiness slinking slinkingly slinkskin slinkweed slinky slip slipback slipband slipboard slipbody slipcase slipcoach slipcoat slipe slipgibbet sliphorn sliphouse slipknot slipless slipman slipover slippage slipped slipper slippered slipperflower slipperily slipperiness slipperlike slipperweed slipperwort slippery slipperyback slipperyroot slippiness slipping slippingly slipproof slippy slipshod slipshoddiness slipshoddy slipshodness slipshoe slipslap slipslop slipsloppish slipsloppism slipsole slipstep slipstring sliptopped slipway slirt slish slit slitch slite slither slithering slitheroo slithers slithery slithy slitless slitlike slitshell slitted slitter slitting slitty slitwise slive sliver sliverer sliverlike sliverproof slivery sliving slivovitz sloan Sloanea slob slobber slobberchops slobberer slobbers slobbery slobby slock slocken slod slodder slodge slodger sloe sloeberry sloebush sloetree slog slogan sloganeer sloganize slogger slogging slogwood sloka sloke slommock slon slone slonk sloo sloom sloomy sloop sloopman sloosh slop slopdash slope sloped slopely slopeness sloper slopeways slopewise sloping slopingly slopingness slopmaker slopmaking sloppage slopped sloppery sloppily sloppiness slopping sloppy slops slopseller slopselling slopshop slopstone slopwork slopworker slopy slorp slosh slosher sloshily sloshiness sloshy slot slote sloted sloth slothful slothfully slothfulness slothound slotted slotter slottery slotting slotwise slouch sloucher slouchily slouchiness slouching slouchingly slouchy slough sloughiness sloughy slour sloush Slovak Slovakian Slovakish sloven Slovene Slovenian Slovenish slovenlike slovenliness slovenly slovenwood Slovintzi slow slowbellied slowbelly slowdown slowgoing slowheaded slowhearted slowheartedness slowhound slowish slowly slowmouthed slowpoke slowrie slows slowworm sloyd slub slubber slubberdegullion slubberer slubbering slubberingly slubberly slubbery slubbing slubby slud sludder sluddery sludge sludged sludger sludgy slue sluer slug slugabed sluggard sluggarding sluggardize sluggardliness sluggardly sluggardness sluggardry slugged slugger slugging sluggingly sluggish sluggishly sluggishness sluggy sluglike slugwood sluice sluicelike sluicer sluiceway sluicing sluicy sluig sluit slum slumber slumberer slumberful slumbering slumberingly slumberland slumberless slumberous slumberously slumberousness slumberproof slumbersome slumbery slumbrous slumdom slumgullion slumgum slumland slummage slummer slumminess slumming slummock slummocky slummy slump slumpproof slumproof slumpwork slumpy slumward slumwise slung slungbody slunge slunk slunken slur slurbow slurp slurry slush slusher slushily slushiness slushy slut slutch slutchy sluther sluthood slutter sluttery sluttikin sluttish sluttishly sluttishness slutty sly slyboots slyish slyly slyness slype sma smachrie smack smackee smacker smackful smacking smackingly smacksman smaik Smalcaldian Smalcaldic small smallage smallclothes smallcoal smallen smaller smallhearted smallholder smalling smallish smallmouth smallmouthed smallness smallpox smalls smallsword smalltime smallware smally smalm smalt smalter smaltine smaltite smalts smaragd smaragdine smaragdite smaragdus smarm smarmy smart smarten smarting smartingly smartish smartism smartless smartly smartness smartweed smarty smash smashable smashage smashboard smasher smashery smashing smashingly smashment smashup smatter smatterer smattering smatteringly smattery smaze smear smearcase smeared smearer smeariness smearless smeary smectic smectis smectite Smectymnuan Smectymnuus smeddum smee smeech smeek smeeky smeer smeeth smegma smell smellable smellage smelled smeller smellful smellfungi smellfungus smelliness smelling smellproof smellsome smelly smelt smelter smelterman smeltery smeltman smeth smethe smeuse smew smich smicker smicket smiddie smiddum smidge smidgen smifligate smifligation smiggins Smilacaceae smilacaceous Smilaceae smilaceous smilacin Smilacina Smilax smilax smile smileable smileage smileful smilefulness smileless smilelessly smilelessness smilemaker smilemaking smileproof smiler smilet smiling smilingly smilingness Smilodon smily Smintheus Sminthian sminthurid Sminthuridae Sminthurus smirch smircher smirchless smirchy smiris smirk smirker smirking smirkingly smirkish smirkle smirkly smirky smirtle smit smitch smite smiter smith smitham smithcraft smither smithereens smithery Smithian Smithianism smithing smithite Smithsonian smithsonite smithwork smithy smithydander smiting smitten smitting smock smocker smockface smocking smockless smocklike smog smokables smoke smokeable smokebox smokebush smoked smokefarthings smokehouse smokejack smokeless smokelessly smokelessness smokelike smokeproof smoker smokery smokestack smokestone smoketight smokewood smokily smokiness smoking smokish smoky smokyseeming smolder smolderingness smolt smooch smoochy smoodge smoodger smook smoorich Smoos smoot smooth smoothable smoothback smoothbore smoothbored smoothcoat smoothen smoother smoothification smoothify smoothing smoothingly smoothish smoothly smoothmouthed smoothness smoothpate smopple smore smorgasbord smote smother smotherable smotheration smothered smotherer smotheriness smothering smotheringly smothery smotter smouch smoucher smous smouse smouser smout smriti smudge smudged smudgedly smudgeless smudgeproof smudger smudgily smudginess smudgy smug smuggery smuggish smuggishly smuggishness smuggle smuggleable smuggler smugglery smuggling smugism smugly smugness smuisty smur smurr smurry smuse smush smut smutch smutchin smutchless smutchy smutproof smutted smutter smuttily smuttiness smutty Smyrna Smyrnaite Smyrnean Smyrniot Smyrniote smyth smytrie snab snabbie snabble snack snackle snackman snaff snaffle snaffles snafu snag snagbush snagged snagger snaggled snaggletooth snaggy snagrel snail snaileater snailery snailfish snailflower snailish snailishly snaillike snails snaily snaith snake snakebark snakeberry snakebird snakebite snakefish snakeflower snakehead snakeholing snakeleaf snakeless snakelet snakelike snakeling snakemouth snakeneck snakeology snakephobia snakepiece snakepipe snakeproof snaker snakeroot snakery snakeship snakeskin snakestone snakeweed snakewise snakewood snakeworm snakewort snakily snakiness snaking snakish snaky snap snapback snapbag snapberry snapdragon snape snaper snaphead snapholder snapjack snapless snappable snapped snapper snappily snappiness snapping snappingly snappish snappishly snappishness snapps snappy snaps snapsack snapshot snapshotter snapweed snapwood snapwort snapy snare snareless snarer snaringly snark snarl snarler snarleyyow snarlingly snarlish snarly snary snaste snatch snatchable snatched snatcher snatchily snatching snatchingly snatchproof snatchy snath snathe snavel snavvle snaw snead sneak sneaker sneakiness sneaking sneakingly sneakingness sneakish sneakishly sneakishness sneaksby sneaksman sneaky sneap sneath sneathe sneb sneck sneckdraw sneckdrawing sneckdrawn snecker snecket sned snee sneer sneerer sneerful sneerfulness sneering sneeringly sneerless sneery sneesh sneeshing sneest sneesty sneeze sneezeless sneezeproof sneezer sneezeweed sneezewood sneezewort sneezing sneezy snell snelly Snemovna snerp snew snib snibble snibbled snibbler snibel snicher snick snickdraw snickdrawing snicker snickering snickeringly snickersnee snicket snickey snickle sniddle snide snideness sniff sniffer sniffily sniffiness sniffing sniffingly sniffish sniffishness sniffle sniffler sniffly sniffy snift snifter snifty snig snigger sniggerer sniggering sniggle sniggler sniggoringly snip snipe snipebill snipefish snipelike sniper sniperscope sniping snipish snipjack snipnose snipocracy snipper snippersnapper snipperty snippet snippetiness snippety snippiness snipping snippish snippy snipsnapsnorum sniptious snipy snirl snirt snirtle snitch snitcher snite snithe snithy snittle snivel sniveled sniveler sniveling snively snivy snob snobber snobbery snobbess snobbing snobbish snobbishly snobbishness snobbism snobby snobdom snobling snobocracy snobocrat snobographer snobography snobologist snobonomer snobscat snocher snock snocker snod snodly snoek snoeking snog snoga Snohomish snoke Snonowas snood snooded snooding snook snooker snookered snoop snooper snooperscope snoopy snoose snoot snootily snootiness snooty snoove snooze snoozer snooziness snoozle snoozy snop Snoqualmie Snoquamish snore snoreless snorer snoring snoringly snork snorkel snorker snort snorter snorting snortingly snortle snorty snot snotter snottily snottiness snotty snouch snout snouted snouter snoutish snoutless snoutlike snouty Snow snow Snowball snowball snowbank snowbell snowberg snowberry snowbird snowblink snowbound snowbreak snowbush snowcap snowcraft Snowdonian snowdrift snowdrop snowfall snowflake snowflight snowflower snowfowl snowhammer snowhouse snowie snowily snowiness snowish snowk snowl snowland snowless snowlike snowmanship snowmobile snowplow snowproof snowscape snowshade snowshed snowshine snowshoe snowshoed snowshoeing snowshoer snowslide snowslip snowstorm snowsuit snowworm snowy snozzle snub snubbable snubbed snubbee snubber snubbiness snubbing snubbingly snubbish snubbishly snubbishness snubby snubproof snuck snudge snuff snuffbox snuffboxer snuffcolored snuffer snuffers snuffiness snuffing snuffingly snuffish snuffle snuffler snuffles snuffless snuffliness snuffling snufflingly snuffly snuffman snuffy snug snugger snuggery snuggish snuggle snugify snugly snugness snum snup snupper snur snurl snurly snurp snurt snuzzle sny snying so soak soakage soakaway soaked soaken soaker soaking soakingly soakman soaky soally soam soap soapbark soapberry soapbox soapboxer soapbubbly soapbush soaper soapery soapfish soapily soapiness soaplees soapless soaplike soapmaker soapmaking soapmonger soaprock soaproot soapstone soapsud soapsuddy soapsuds soapsudsy soapweed soapwood soapwort soapy soar soarability soarable soarer soaring soaringly soary sob sobber sobbing sobbingly sobby sobeit sober soberer sobering soberingly soberize soberlike soberly soberness sobersault sobersided sobersides soberwise sobful soboles soboliferous sobproof Sobralia sobralite Sobranje sobrevest sobriety sobriquet sobriquetical soc socage socager soccer soccerist soccerite soce socht sociability sociable sociableness sociably social Sociales socialism socialist socialistic socialite sociality socializable socialization socialize socializer socially socialness sociation sociative societal societally societarian societarianism societary societified societism societist societologist societology society societyish societyless socii Socinian Socinianism Socinianistic Socinianize sociobiological sociocentric sociocracy sociocrat sociocratic sociocultural sociodrama sociodramatic socioeconomic socioeducational sociogenesis sociogenetic sociogeny sociography sociolatry sociolegal sociologian sociologic sociological sociologically sociologism sociologist sociologistic sociologize sociologizer sociologizing sociology sociomedical sociometric sociometry socionomic socionomics socionomy sociophagous sociopolitical socioreligious socioromantic sociostatic sociotechnical socius sock sockdolager socker socket socketful socketless sockeye sockless socklessness sockmaker sockmaking socky socle socman socmanry soco Socorrito Socotran Socotri Socotrine Socratean Socratic Socratical Socratically Socraticism Socratism Socratist Socratize sod soda sodaclase sodaic sodaless sodalist sodalite sodalithite sodality sodamide sodbuster sodded sodden soddenly soddenness sodding soddite soddy sodic sodio sodioaluminic sodioaurous sodiocitrate sodiohydric sodioplatinic sodiosalicylate sodiotartrate sodium sodless sodoku Sodom sodomic Sodomist Sodomite sodomitess sodomitic sodomitical sodomitically Sodomitish sodomy sodwork sody soe soekoe soever sofa sofane sofar soffit Sofia Sofoklis Sofronia soft softa softball softbrained soften softener softening softhead softheaded softhearted softheartedly softheartedness softhorn softish softling softly softner softness softship softtack softwood softy sog Soga Sogdian Sogdianese Sogdianian Sogdoite soger soget soggarth soggendalite soggily sogginess sogging soggy soh soho Soiesette soiesette soil soilage soiled soiling soilless soilproof soilure soily soiree soixantine Soja soja sojourn sojourner sojourney sojournment sok soka soke sokeman sokemanemot sokemanry soken Sokoki Sokotri Sokulk Sol sol sola solace solaceful solacement solaceproof solacer solacious solaciously solaciousness solan Solanaceae solanaceous solanal Solanales solander solaneine solaneous solanidine solanine Solanum solanum solar solarism solarist solaristic solaristically solaristics Solarium solarium solarization solarize solarometer solate solatia solation solatium solay sold soldado Soldan soldan soldanel Soldanella soldanelle soldanrie solder solderer soldering solderless soldi soldier soldierbird soldierbush soldierdom soldieress soldierfish soldierhearted soldierhood soldiering soldierize soldierlike soldierliness soldierly soldierproof soldiership soldierwise soldierwood soldiery soldo sole Solea solea soleas solecism solecist solecistic solecistical solecistically solecize solecizer Soleidae soleiform soleil soleless solely solemn solemncholy solemnify solemnitude solemnity solemnization solemnize solemnizer solemnly solemnness Solen solen solenacean solenaceous soleness solenette solenial Solenidae solenite solenitis solenium solenoconch Solenoconcha solenocyte Solenodon solenodont Solenodontidae solenogaster Solenogastres solenoglyph Solenoglypha solenoglyphic solenoid solenoidal solenoidally Solenopsis solenostele solenostelic solenostomid Solenostomidae solenostomoid solenostomous Solenostomus solent solentine solepiece soleplate soleprint soler Solera soles soleus soleyn solfataric solfeggio solferino soli soliative solicit solicitant solicitation solicitationism solicited solicitee soliciter soliciting solicitor solicitorship solicitous solicitously solicitousness solicitress solicitrix solicitude solicitudinous solid Solidago solidago solidaric solidarily solidarism solidarist solidaristic solidarity solidarize solidary solidate solidi solidifiability solidifiable solidifiableness solidification solidifier solidiform solidify solidish solidism solidist solidistic solidity solidly solidness solidum Solidungula solidungular solidungulate solidus solifidian solifidianism solifluction solifluctional soliform Solifugae solifuge solifugean solifugid solifugous soliloquacious soliloquist soliloquium soliloquize soliloquizer soliloquizing soliloquizingly soliloquy solilunar Solio solio soliped solipedal solipedous solipsism solipsismal solipsist solipsistic solist solitaire solitarian solitarily solitariness solitary soliterraneous solitidal solitude solitudinarian solitudinize solitudinous solivagant solivagous sollar solleret Sollya solmizate solmization solo solod solodi solodization solodize soloecophanes soloist Solomon Solomonian Solomonic Solomonical Solomonitic Solon solon solonchak solonetz solonetzic solonetzicity Solonian Solonic solonist soloth solotink solotnik solpugid Solpugida Solpugidea Solpugides solstice solsticion solstitia solstitial solstitially solstitium solubility solubilization solubilize soluble solubleness solubly solum solute solution solutional solutioner solutionist solutize solutizer Solutrean solvability solvable solvableness solvate solvation solve solvement solvency solvend solvent solvently solventproof solver solvolysis solvolytic solvolyze solvsbergite Solyma Solymaean soma somacule Somal somal Somali somaplasm Somaschian somasthenia somata somatasthenia Somateria somatic somatical somatically somaticosplanchnic somaticovisceral somatics somatism somatist somatization somatochrome somatocyst somatocystic somatoderm somatogenetic somatogenic somatognosis somatognostic somatologic somatological somatologically somatologist somatology somatome somatomic somatophyte somatophytic somatoplasm somatopleural somatopleure somatopleuric somatopsychic somatosplanchnic somatotonia somatotonic somatotropic somatotropically somatotropism somatotype somatotyper somatotypy somatous somber somberish somberly somberness sombre sombrerite sombrero sombreroed sombrous sombrously sombrousness some somebody someday somedeal somegate somehow someone somepart someplace somers somersault somerset Somersetian somervillite somesthesia somesthesis somesthetic something somethingness sometime sometimes someway someways somewhat somewhatly somewhatness somewhen somewhence somewhere somewheres somewhile somewhiles somewhither somewhy somewise somital somite somitic somma sommaite sommelier somnambulance somnambulancy somnambulant somnambular somnambulary somnambulate somnambulation somnambulator somnambule somnambulency somnambulic somnambulically somnambulism somnambulist somnambulistic somnambulize somnambulous somnial somniative somnifacient somniferous somniferously somnific somnifuge somnify somniloquacious somniloquence somniloquent somniloquism somniloquist somniloquize somniloquous somniloquy Somniosus somnipathist somnipathy somnivolency somnivolent somnolence somnolency somnolent somnolently somnolescence somnolescent somnolism somnolize somnopathy somnorific somnus sompay sompne sompner Son son sonable sonance sonancy sonant sonantal sonantic sonantina sonantized sonar sonata sonatina sonation Sonchus sond sondation sondeli Sonderbund sonderclass Sondergotter Sondylomorum soneri song songbird songbook songcraft songfest songful songfully songfulness Songhai Songish songish songland songle songless songlessly songlessness songlet songlike songman Songo Songoi songster songstress songworthy songwright songy sonhood sonic soniferous sonification soniou Sonja sonk sonless sonlike sonlikeness sonly Sonneratia Sonneratiaceae sonneratiaceous sonnet sonnetary sonneteer sonneteeress sonnetic sonneting sonnetish sonnetist sonnetize sonnetlike sonnetwise sonnikins Sonny sonny sonobuoy sonometer Sonoran sonorant sonorescence sonorescent sonoric sonoriferous sonoriferously sonorific sonority sonorophone sonorosity sonorous sonorously sonorousness Sonrai sons sonship sonsy sontag soodle soodly Soohong sook Sooke sooky sool sooloos soon sooner soonish soonly Soorah soorawn soord soorkee Soot soot sooter sooterkin sooth soothe soother sootherer soothful soothing soothingly soothingness soothless soothsay soothsayer soothsayership soothsaying sootily sootiness sootless sootlike sootproof sooty sootylike sop sope soph Sopheric Sopherim Sophia sophia Sophian sophic sophical sophically sophiologic sophiology sophism Sophist sophister sophistic sophistical sophistically sophisticalness sophisticant sophisticate sophisticated sophistication sophisticative sophisticator sophisticism Sophistress sophistress sophistry Sophoclean sophomore sophomoric sophomorical sophomorically Sophora sophoria Sophronia sophronize Sophy sophy sopite sopition sopor soporiferous soporiferously soporiferousness soporific soporifical soporifically soporose sopper soppiness sopping soppy soprani sopranino sopranist soprano sora Sorabian sorage soral Sorb sorb Sorbaria sorbate sorbefacient sorbent Sorbian sorbic sorbile sorbin sorbinose Sorbish sorbite sorbitic sorbitize sorbitol Sorbonic Sorbonical Sorbonist Sorbonne sorbose sorboside Sorbus sorbus sorcer sorcerer sorceress sorcering sorcerous sorcerously sorcery sorchin sorda Sordaria Sordariaceae sordawalite sordellina Sordello sordes sordid sordidity sordidly sordidness sordine sordino sordor sore soredia soredial sorediate sorediferous sorediform soredioid soredium soree sorefalcon sorefoot sorehawk sorehead soreheaded soreheadedly soreheadedness sorehearted sorehon sorely sorema soreness Sorex sorgho Sorghum sorghum sorgo sori soricid Soricidae soricident Soricinae soricine soricoid Soricoidea soriferous sorite sorites soritical sorn sornare sornari sorner sorning soroban Soroptimist sororal sororate sororial sororially sororicidal sororicide sorority sororize sorose sorosis sorosphere Sorosporella Sorosporium sorption sorra Sorrel sorrel sorrento sorrily sorriness sorroa sorrow sorrower sorrowful sorrowfully sorrowfulness sorrowing sorrowingly sorrowless sorrowproof sorrowy sorry sorryhearted sorryish sort sortable sortably sortal sortation sorted sorter sortie sortilege sortileger sortilegic sortilegious sortilegus sortilegy sortiment sortition sortly sorty sorus sorva sory sosh soshed Sosia soso sosoish Sospita soss sossle sostenuto sot Sotadean Sotadic Soter Soteres soterial soteriologic soteriological soteriology Sothiac Sothiacal Sothic Sothis Sotho sotie Sotik sotnia sotnik sotol sots sottage sotted sotter sottish sottishly sottishness sou souari soubise soubrette soubrettish soucar souchet Souchong souchong souchy soud soudagur souffle souffleed sough sougher soughing sought Souhegan soul soulack soulcake souled Souletin soulful soulfully soulfulness soulical soulish soulless soullessly soullessness soullike Soulmass soulsaving soulward souly soum soumansite soumarque sound soundable soundage soundboard sounder soundful soundheaded soundheadedness soundhearted soundheartednes sounding soundingly soundingness soundless soundlessly soundlessness soundly soundness soundproof soundproofing soup soupbone soupcon souper souple soupless souplike soupspoon soupy sour sourbelly sourberry sourbread sourbush sourcake source sourceful sourcefulness sourceless sourcrout sourdeline sourdine soured souredness souren sourer sourhearted souring sourish sourishly sourishness sourjack sourling sourly sourness sourock soursop sourtop sourweed sourwood soury sousaphone sousaphonist souse souser souslik soutane souter souterrain South south southard southbound Southcottian Southdown southeast southeaster southeasterly southeastern southeasternmost southeastward southeastwardly southeastwards souther southerland southerliness southerly southermost southern Southerner southerner southernism southernize southernliness southernly southernmost southernness southernwood southing southland southlander southmost southness southpaw Southron southron Southronie Southumbrian southward southwardly southwards southwest southwester southwesterly southwestern Southwesterner southwesternmost southwestward southwestwardly souvenir souverain souwester sov sovereign sovereigness sovereignly sovereignness sovereignship sovereignty soviet sovietdom sovietic sovietism sovietist sovietization sovietize sovite sovkhose sovkhoz sovran sovranty sow sowable sowan sowans sowar sowarry sowback sowbacked sowbane sowbelly sowbread sowdones sowel sowens sower sowfoot sowing sowins sowl sowle sowlike sowlth sown sowse sowt sowte Soxhlet soy soya soybean Soyot sozin sozolic sozzle sozzly spa Space space spaceband spaced spaceful spaceless spacer spacesaving spaceship spaciness spacing spaciosity spaciotemporal spacious spaciously spaciousness spack spacy spad spade spadebone spaded spadefish spadefoot spadeful spadelike spademan spader spadesman spadewise spadework spadger spadiceous spadices spadicifloral spadiciflorous spadiciform spadicose spadilla spadille spading spadix spadone spadonic spadonism spadrone spadroon spae spaebook spaecraft spaedom spaeman spaer spaewife spaewoman spaework spaewright spaghetti Spagnuoli spagyric spagyrical spagyrically spagyrist spahi spaid spaik spairge spak Spalacidae spalacine Spalax spald spalder spalding spale spall spallation spaller spalling spalpeen spalt span spancel spandle spandrel spandy spane spanemia spanemy spang spanghew spangle spangled spangler spanglet spangly spangolite Spaniard Spaniardization Spaniardize Spaniardo spaniel spaniellike spanielship spaning Spaniol Spaniolate Spanioli Spaniolize spanipelagic Spanish Spanishize Spanishly spank spanker spankily spanking spankingly spanky spanless spann spannel spanner spannerman spanopnoea spanpiece spantoon spanule spanworm Spar spar sparable sparada sparadrap sparagrass sparagus Sparassis sparassodont Sparassodonta Sparaxis sparaxis sparch spare spareable spareless sparely spareness sparer sparerib sparesome Sparganiaceae Sparganium sparganium sparganosis sparganum sparge sparger spargosis sparhawk sparid Sparidae sparing sparingly sparingness spark sparkback sparked sparker sparkiness sparking sparkish sparkishly sparkishness sparkle sparkleberry sparkler sparkless sparklessly sparklet sparklike sparkliness sparkling sparklingly sparklingness sparkly sparkproof sparks sparky sparlike sparling sparm Sparmannia Sparnacian sparoid sparpiece sparred sparrer sparring sparringly sparrow sparrowbill sparrowcide sparrowdom sparrowgrass sparrowish sparrowless sparrowlike sparrowtail sparrowtongue sparrowwort sparrowy sparry sparse sparsedly sparsely sparsile sparsioplast sparsity spart Spartacan Spartacide Spartacism Spartacist spartacist Spartan Spartanhood Spartanic Spartanically Spartanism Spartanize Spartanlike Spartanly sparteine sparterie sparth Spartiate Spartina Spartium spartle Sparus sparver spary spasm spasmatic spasmatical spasmatomancy spasmed spasmic spasmodic spasmodical spasmodically spasmodicalness spasmodism spasmodist spasmolytic spasmophilia spasmophilic spasmotin spasmotoxin spasmous Spass spastic spastically spasticity spat spatalamancy Spatangida Spatangina spatangoid Spatangoida Spatangoidea spatangoidean Spatangus spatchcock spate spatha spathaceous spathal spathe spathed spatheful spathic Spathiflorae spathilae spathilla spathose spathous spathulate Spathyema spatial spatiality spatialization spatialize spatially spatiate spatiation spatilomancy spatiotemporal spatling spatted spatter spatterdashed spatterdasher spatterdock spattering spatteringly spatterproof spatterwork spatting spattle spattlehoe Spatula spatula spatulamancy spatular spatulate spatulation spatule spatuliform spatulose spave spaver spavie spavied spaviet spavin spavindy spavined spawn spawneater spawner spawning spawny spay spayad spayard spaying speak speakable speakableness speakably speaker speakeress speakership speakhouse speakies speaking speakingly speakingness speakless speaklessly speal spealbone spean spear spearcast spearer spearfish spearflower spearhead spearing spearman spearmanship spearmint spearproof spearsman spearwood spearwort speary spec specchie spece special specialism specialist specialistic speciality specialization specialize specialized specializer specially specialness specialty speciation specie species speciestaler specifiable specific specifical specificality specifically specificalness specificate specification specificative specificatively specificity specificize specificly specificness specifier specifist specify specillum specimen specimenize speciology speciosity specious speciously speciousness speck specked speckedness speckfall speckiness specking speckle specklebelly specklebreast speckled speckledbill speckledness speckless specklessly specklessness speckling speckly speckproof specks specksioneer specky specs spectacle spectacled spectacleless spectaclelike spectaclemaker spectaclemaking spectacles spectacular spectacularism spectacularity spectacularly spectator spectatordom spectatorial spectatorship spectatory spectatress spectatrix specter spectered specterlike spectra spectral spectralism spectrality spectrally spectralness spectrobolograph spectrobolographic spectrobolometer spectrobolometric spectrochemical spectrochemistry spectrocolorimetry spectrocomparator spectroelectric spectrogram spectrograph spectrographic spectrographically spectrography spectroheliogram spectroheliograph spectroheliographic spectrohelioscope spectrological spectrologically spectrology spectrometer spectrometric spectrometry spectromicroscope spectromicroscopical spectrophobia spectrophone spectrophonic spectrophotoelectric spectrophotograph spectrophotography spectrophotometer spectrophotometric spectrophotometry spectropolarimeter spectropolariscope spectropyrheliometer spectropyrometer spectroradiometer spectroradiometric spectroradiometry spectroscope spectroscopic spectroscopically spectroscopist spectroscopy spectrotelescope spectrous spectrum spectry specula specular Specularia specularly speculate speculation speculatist speculative speculatively speculativeness speculativism speculator speculatory speculatrices speculatrix speculist speculum specus sped speech speechcraft speecher speechful speechfulness speechification speechifier speechify speeching speechless speechlessly speechlessness speechlore speechmaker speechmaking speechment speed speedaway speedboat speedboating speedboatman speeder speedful speedfully speedfulness speedily speediness speeding speedingly speedless speedometer speedster speedway speedwell speedy speel speelken speelless speen speer speering speerity speiskobalt speiss spekboom spelaean spelder spelding speldring speleological speleologist speleology spelk spell spellable spellbind spellbinder spellbinding spellbound spellcraft spelldown speller spellful spelling spellingdown spellingly spellmonger spellproof spellword spellwork spelt spelter spelterman speltoid speltz speluncar speluncean spelunk spelunker spence Spencean Spencer spencer Spencerian Spencerianism Spencerism spencerite spend spendable spender spendful spendible spending spendless spendthrift spendthrifty Spenerism spense Spenserian spent speos Speotyto sperable Speranza sperate Spergula Spergularia sperity sperket sperling sperm sperma spermaceti spermacetilike spermaduct spermalist Spermaphyta spermaphyte spermaphytic spermarium spermary spermashion spermatangium spermatheca spermathecal spermatic spermatically spermatid spermatiferous spermatin spermatiogenous spermation spermatiophore spermatism spermatist spermatitis spermatium spermatize spermatoblast spermatoblastic spermatocele spermatocyst spermatocystic spermatocystitis spermatocytal spermatocyte spermatogemma spermatogenesis spermatogenetic spermatogenic spermatogenous spermatogeny spermatogonial spermatogonium spermatoid spermatolysis spermatolytic spermatophoral spermatophore spermatophorous Spermatophyta spermatophyte spermatophytic spermatoplasm spermatoplasmic spermatoplast spermatorrhea spermatospore spermatotheca spermatova spermatovum spermatoxin spermatozoa spermatozoal spermatozoan spermatozoic spermatozoid spermatozoon spermaturia spermic spermidine spermiducal spermiduct spermigerous spermine spermiogenesis spermism spermist spermoblast spermoblastic spermocarp spermocenter spermoderm spermoduct spermogenesis spermogenous spermogone spermogoniferous spermogonium spermogonous spermologer spermological spermologist spermology spermolysis spermolytic spermophile spermophiline Spermophilus spermophore spermophorium Spermophyta spermophyte spermophytic spermosphere spermotheca spermotoxin spermous spermoviduct spermy speronara speronaro sperone sperrylite spessartite spet spetch spetrophoby speuchan spew spewer spewiness spewing spewy spex sphacel Sphacelaria Sphacelariaceae sphacelariaceous Sphacelariales sphacelate sphacelated sphacelation sphacelia sphacelial sphacelism sphaceloderma Sphaceloma sphacelotoxin sphacelous sphacelus Sphaeralcea sphaeraphides Sphaerella sphaerenchyma Sphaeriaceae sphaeriaceous Sphaeriales sphaeridia sphaeridial sphaeridium Sphaeriidae Sphaerioidaceae sphaeristerium sphaerite Sphaerium sphaeroblast Sphaerobolaceae Sphaerobolus Sphaerocarpaceae Sphaerocarpales Sphaerocarpus sphaerocobaltite Sphaerococcaceae sphaerococcaceous Sphaerococcus sphaerolite sphaerolitic Sphaeroma Sphaeromidae Sphaerophoraceae Sphaerophorus Sphaeropsidaceae Sphaeropsidales Sphaeropsis sphaerosiderite sphaerosome sphaerospore Sphaerostilbe Sphaerotheca Sphaerotilus sphagion Sphagnaceae sphagnaceous Sphagnales sphagnicolous sphagnologist sphagnology sphagnous Sphagnum sphagnum Sphakiot sphalerite Sphargis sphecid Sphecidae Sphecina Sphecoidea spheges sphegid Sphegidae Sphegoidea sphendone sphene sphenethmoid sphenethmoidal sphenic sphenion Sphenisci Spheniscidae Sphenisciformes spheniscine spheniscomorph Spheniscomorphae spheniscomorphic Spheniscus sphenobasilar sphenobasilic sphenocephalia sphenocephalic sphenocephalous sphenocephaly Sphenodon sphenodon sphenodont Sphenodontia Sphenodontidae sphenoethmoid sphenoethmoidal sphenofrontal sphenogram sphenographic sphenographist sphenography sphenoid sphenoidal sphenoiditis sphenolith sphenomalar sphenomandibular sphenomaxillary sphenopalatine sphenoparietal sphenopetrosal Sphenophorus Sphenophyllaceae sphenophyllaceous Sphenophyllales Sphenophyllum Sphenopteris sphenosquamosal sphenotemporal sphenotic sphenotribe sphenotripsy sphenoturbinal sphenovomerine sphenozygomatic spherable spheral spherality spheraster spheration sphere sphereless spheric spherical sphericality spherically sphericalness sphericist sphericity sphericle sphericocylindrical sphericotetrahedral sphericotriangular spherics spheriform spherify spheroconic spherocrystal spherograph spheroidal spheroidally spheroidic spheroidical spheroidically spheroidicity spheroidism spheroidity spheroidize spheromere spherometer spheroquartic spherula spherular spherulate spherule spherulite spherulitic spherulitize sphery spheterize Sphex sphexide sphincter sphincteral sphincteralgia sphincterate sphincterectomy sphincterial sphincteric sphincterismus sphincteroscope sphincteroscopy sphincterotomy sphindid Sphindidae Sphindus sphingal sphinges sphingid Sphingidae sphingiform sphingine sphingoid sphingometer sphingomyelin sphingosine Sphingurinae Sphingurus sphinx sphinxian sphinxianness sphinxlike Sphoeroides sphragide sphragistic sphragistics sphygmia sphygmic sphygmochronograph sphygmodic sphygmogram sphygmograph sphygmographic sphygmography sphygmoid sphygmology sphygmomanometer sphygmomanometric sphygmomanometry sphygmometer sphygmometric sphygmophone sphygmophonic sphygmoscope sphygmus Sphyraena sphyraenid Sphyraenidae sphyraenoid Sphyrapicus Sphyrna Sphyrnidae Spica spica spical spicant Spicaria spicate spicated spiccato spice spiceable spiceberry spicebush spicecake spiced spiceful spicehouse spiceland spiceless spicelike spicer spicery spicewood spiciferous spiciform spicigerous spicilege spicily spiciness spicing spick spicket spickle spicknel spicose spicosity spicous spicousness spicula spiculae spicular spiculate spiculated spiculation spicule spiculiferous spiculiform spiculigenous spiculigerous spiculofiber spiculose spiculous spiculum spiculumamoris spicy spider spidered spiderflower spiderish spiderless spiderlike spiderling spiderly spiderweb spiderwork spiderwort spidery spidger spied spiegel spiegeleisen spiel spieler spier spiff spiffed spiffily spiffiness spiffing spiffy spiflicate spiflicated spiflication spig Spigelia Spigeliaceae Spigelian spiggoty spignet spigot Spike spike spikebill spiked spikedness spikefish spikehorn spikelet spikelike spikenard spiker spiketail spiketop spikeweed spikewise spikily spikiness spiking spiky Spilanthes spile spilehole spiler spileworm spilikin spiling spilite spilitic spill spillage spiller spillet spillproof spillway spilly Spilogale spiloma spilosite spilt spilth spilus spin spina spinacene spinaceous spinach spinachlike Spinacia spinae spinage spinal spinales spinalis spinally spinate spinder spindlage spindle spindleage spindled spindleful spindlehead spindlelegs spindlelike spindler spindleshanks spindletail spindlewise spindlewood spindleworm spindliness spindling spindly spindrift spine spinebill spinebone spined spinel spineless spinelessly spinelessness spinelet spinelike spinescence spinescent spinet spinetail spingel spinibulbar spinicarpous spinicerebellar spinidentate spiniferous Spinifex spinifex spiniform spinifugal spinigerous spinigrade spininess spinipetal spinitis spinituberculate spink spinnable spinnaker spinner spinneret spinnerular spinnerule spinnery spinney spinning spinningly spinobulbar spinocarpous spinocerebellar spinogalvanization spinoglenoid spinoid spinomuscular spinoneural spinoperipheral spinose spinosely spinoseness spinosity spinosodentate spinosodenticulate spinosotubercular spinosotuberculate spinosympathetic spinotectal spinothalamic spinotuberculous spinous spinousness Spinozism Spinozist Spinozistic spinster spinsterdom spinsterhood spinsterial spinsterish spinsterishly spinsterism spinsterlike spinsterly spinsterous spinstership spinstress spintext spinthariscope spinthariscopic spintherism spinulate spinulation spinule spinulescent spinuliferous spinuliform Spinulosa spinulose spinulosely spinulosociliate spinulosodentate spinulosodenticulate spinulosogranulate spinulososerrate spinulous spiny spionid Spionidae Spioniformia spiracle spiracula spiracular spiraculate spiraculiferous spiraculiform spiraculum Spiraea Spiraeaceae spiral spirale spiraled spiraliform spiralism spirality spiralization spiralize spirally spiraloid spiraltail spiralwise spiran spirant Spiranthes spiranthic spiranthy spirantic spirantize spiraster spirate spirated spiration spire spirea spired spiregrass spireless spirelet spireme spirepole spireward spirewise spiricle Spirifer Spirifera Spiriferacea spiriferid Spiriferidae spiriferoid spiriferous spiriform spirignath spirignathous spirilla Spirillaceae spirillaceous spirillar spirillolysis spirillosis spirillotropic spirillotropism spirillum spiring spirit spiritally spiritdom spirited spiritedly spiritedness spiriter spiritful spiritfully spiritfulness spirithood spiriting spiritism spiritist spiritistic spiritize spiritland spiritleaf spiritless spiritlessly spiritlessness spiritlike spiritmonger spiritous spiritrompe spiritsome spiritual spiritualism spiritualist spiritualistic spiritualistically spirituality spiritualization spiritualize spiritualizer spiritually spiritualness spiritualship spiritualty spirituosity spirituous spirituously spirituousness spiritus spiritweed spirity spirivalve spirket spirketing spirling spiro Spirobranchia Spirobranchiata spirobranchiate Spirochaeta Spirochaetaceae spirochaetal Spirochaetales Spirochaete spirochetal spirochete spirochetemia spirochetic spirocheticidal spirocheticide spirochetosis spirochetotic Spirodela spirogram spirograph spirographidin spirographin Spirographis Spirogyra spiroid spiroloculine spirometer spirometric spirometrical spirometry Spironema spiropentane Spirophyton Spirorbis spiroscope Spirosoma spirous spirt Spirula spirulate spiry spise spissated spissitude Spisula spit spital spitball spitballer spitbox spitchcock spite spiteful spitefully spitefulness spiteless spiteproof spitfire spitful spithamai spithame spitish spitpoison spitscocked spitstick spitted spitten spitter spitting spittle spittlefork spittlestaff spittoon spitz Spitzenburg spitzkop spiv spivery Spizella spizzerinctum Splachnaceae splachnaceous splachnoid Splachnum splacknuck splairge splanchnapophysial splanchnapophysis splanchnectopia splanchnemphraxis splanchnesthesia splanchnesthetic splanchnic splanchnoblast splanchnocoele splanchnoderm splanchnodiastasis splanchnodynia splanchnographer splanchnographical splanchnography splanchnolith splanchnological splanchnologist splanchnology splanchnomegalia splanchnomegaly splanchnopathy splanchnopleural splanchnopleure splanchnopleuric splanchnoptosia splanchnoptosis splanchnosclerosis splanchnoscopy splanchnoskeletal splanchnoskeleton splanchnosomatic splanchnotomical splanchnotomy splanchnotribe splash splashboard splashed splasher splashiness splashing splashingly splashproof splashy splat splatch splatcher splatchy splathering splatter splatterdash splatterdock splatterer splatterfaced splatterwork splay splayed splayer splayfoot splayfooted splaymouth splaymouthed spleen spleenful spleenfully spleenish spleenishly spleenishness spleenless spleenwort spleeny spleet spleetnew splenadenoma splenalgia splenalgic splenalgy splenatrophia splenatrophy splenauxe splenculus splendacious splendaciously splendaciousness splendent splendently splender splendescent splendid splendidly splendidness splendiferous splendiferously splendiferousness splendor splendorous splendorproof splendourproof splenectama splenectasis splenectomist splenectomize splenectomy splenectopia splenectopy splenelcosis splenemia splenemphraxis spleneolus splenepatitis splenetic splenetical splenetically splenetive splenial splenic splenical splenicterus splenification spleniform splenitis splenitive splenium splenius splenization splenoblast splenocele splenoceratosis splenocleisis splenocolic splenocyte splenodiagnosis splenodynia splenography splenohemia splenoid splenolaparotomy splenology splenolymph splenolymphatic splenolysin splenolysis splenoma splenomalacia splenomedullary splenomegalia splenomegalic splenomegaly splenomyelogenous splenoncus splenonephric splenopancreatic splenoparectama splenoparectasis splenopathy splenopexia splenopexis splenopexy splenophrenic splenopneumonia splenoptosia splenoptosis splenorrhagia splenorrhaphy splenotomy splenotoxin splenotyphoid splenulus splenunculus splet spleuchan splice spliceable splicer splicing splinder spline splineway splint splintage splinter splinterd splinterless splinternew splinterproof splintery splintwood splinty split splitbeak splitfinger splitfruit splitmouth splitnew splitsaw splittail splitten splitter splitting splitworm splodge splodgy splore splosh splotch splotchily splotchiness splotchy splother splunge splurge splurgily splurgy splurt spluther splutter splutterer spoach Spock spode spodiosite spodium spodogenic spodogenous spodomancy spodomantic spodumene spoffish spoffle spoffy spogel spoil spoilable spoilage spoilation spoiled spoiler spoilfive spoilful spoiling spoilless spoilment spoilsman spoilsmonger spoilsport spoilt Spokan spoke spokeless spoken spokeshave spokesman spokesmanship spokester spokeswoman spokeswomanship spokewise spoky spole spolia spoliarium spoliary spoliate spoliation spoliator spoliatory spolium spondaic spondaical spondaize spondean spondee spondiac Spondiaceae Spondias spondulics spondyl spondylalgia spondylarthritis spondylarthrocace spondylexarthrosis spondylic spondylid Spondylidae spondylioid spondylitic spondylitis spondylium spondylizema spondylocace Spondylocladium spondylodiagnosis spondylodidymia spondylodymus spondyloid spondylolisthesis spondylolisthetic spondylopathy spondylopyosis spondyloschisis spondylosis spondylosyndesis spondylotherapeutics spondylotherapist spondylotherapy spondylotomy spondylous Spondylus spondylus spong sponge spongecake sponged spongeful spongeless spongelet spongelike spongeous spongeproof sponger spongewood Spongiae spongian spongicolous spongiculture Spongida spongiferous spongiform Spongiidae Spongilla spongillid Spongillidae spongilline spongily spongin sponginblast sponginblastic sponginess sponging spongingly spongioblast spongioblastoma spongiocyte spongiolin spongiopilin spongioplasm spongioplasmic spongiose spongiosity spongiousness Spongiozoa spongiozoon spongoblast spongoblastic spongoid spongology spongophore Spongospora spongy sponsal sponsalia sponsibility sponsible sponsing sponsion sponsional sponson sponsor sponsorial sponsorship sponspeck spontaneity spontaneous spontaneously spontaneousness spontoon spoof spoofer spoofery spoofish spook spookdom spookery spookily spookiness spookish spookism spookist spookological spookologist spookology spooky spool spooler spoolful spoollike spoolwood spoom spoon spoonbill spoondrift spooner spoonerism spooneyism spooneyly spooneyness spoonflower spoonful spoonhutch spoonily spooniness spooning spoonism spoonless spoonlike spoonmaker spoonmaking spoonways spoonwood spoony spoonyism spoor spoorer spoot spor sporabola sporaceous sporades sporadial sporadic sporadical sporadically sporadicalness sporadicity sporadism sporadosiderite sporal sporange sporangia sporangial sporangidium sporangiferous sporangiform sporangioid sporangiola sporangiole sporangiolum sporangiophore sporangiospore sporangite Sporangites sporangium sporation spore spored sporeformer sporeforming sporeling sporicide sporid sporidesm sporidia sporidial sporidiferous sporidiole sporidiolum sporidium sporiferous sporification sporiparity sporiparous sporoblast Sporobolus sporocarp sporocarpium Sporochnaceae Sporochnus sporocyst sporocystic sporocystid sporocyte sporodochia sporodochium sporoduct sporogenesis sporogenic sporogenous sporogeny sporogone sporogonial sporogonic sporogonium sporogony sporoid sporologist sporomycosis sporont sporophore sporophoric sporophorous sporophydium sporophyll sporophyllary sporophyllum sporophyte sporophytic sporoplasm sporosac sporostegium sporostrote sporotrichosis sporotrichotic Sporotrichum sporous Sporozoa sporozoal sporozoan sporozoic sporozoite sporozoon sporran sport sportability sportable sportance sporter sportful sportfully sportfulness sportily sportiness sporting sportingly sportive sportively sportiveness sportless sportling sportly sports sportsman sportsmanlike sportsmanliness sportsmanly sportsmanship sportsome sportswear sportswoman sportswomanly sportswomanship sportula sportulae sporty sporular sporulate sporulation sporule sporuliferous sporuloid sposh sposhy spot spotless spotlessly spotlessness spotlight spotlighter spotlike spotrump spotsman spottable spotted spottedly spottedness spotteldy spotter spottily spottiness spotting spottle spotty spoucher spousage spousal spousally spouse spousehood spouseless spousy spout spouter spoutiness spouting spoutless spoutlike spoutman spouty sprachle sprack sprackish sprackle sprackly sprackness sprad spraddle sprag spragger spraggly spraich sprain spraint spraints sprang sprangle sprangly sprank sprat spratter spratty sprauchle sprawl sprawler sprawling sprawlingly sprawly spray sprayboard sprayer sprayey sprayful sprayfully sprayless spraylike sprayproof spread spreadation spreadboard spreaded spreader spreadhead spreading spreadingly spreadingness spreadover spready spreaghery spreath spreckle spree spreeuw Sprekelia spreng sprent spret sprew sprewl spridhogue spried sprier spriest sprig sprigged sprigger spriggy sprightful sprightfully sprightfulness sprightlily sprightliness sprightly sprighty spriglet sprigtail Spring spring springal springald springboard springbok springbuck springe springer springerle springfinger springfish springful springhaas springhalt springhead springhouse springily springiness springing springingly springle springless springlet springlike springly springmaker springmaking springtail springtide springtime springtrap springwood springworm springwort springwurzel springy sprink sprinkle sprinkled sprinkleproof sprinkler sprinklered sprinkling sprint sprinter sprit sprite spritehood spritsail sprittail sprittie spritty sproat sprocket sprod sprogue sproil sprong sprose sprottle sprout sproutage sprouter sproutful sprouting sproutland sproutling sprowsy spruce sprucely spruceness sprucery sprucification sprucify sprue spruer sprug spruiker spruit sprung sprunny sprunt spruntly spry spryly spryness spud Spudboy spudder spuddle spuddy spuffle spug spuilyie spuilzie spuke spume spumescence spumescent spumiferous spumification spumiform spumone spumose spumous spumy spun spung spunk spunkie spunkily spunkiness spunkless spunky spunny spur spurflower spurgall spurge spurgewort spuriae spuriosity spurious spuriously spuriousness Spurius spurl spurless spurlet spurlike spurling spurmaker spurmoney spurn spurner spurnpoint spurnwater spurproof spurred spurrer spurrial spurrier spurrings spurrite spurry spurt spurter spurtive spurtively spurtle spurway spurwing spurwinged spurwort sput sputa sputative sputter sputterer sputtering sputteringly sputtery sputum sputumary sputumose sputumous Spy spy spyboat spydom spyer spyfault spyglass spyhole spyism spyproof Spyros spyship spytower squab squabash squabasher squabbed squabbish squabble squabbler squabbling squabblingly squabbly squabby squacco squad squaddy squadrate squadrism squadron squadrone squadroned squail squailer squalene Squali squalid Squalida Squalidae squalidity squalidly squalidness squaliform squall squaller squallery squallish squally squalm Squalodon squalodont Squalodontidae squaloid Squaloidei squalor Squalus squam squama squamaceous squamae Squamariaceae Squamata squamate squamated squamatine squamation squamatogranulous squamatotuberculate squame squamella squamellate squamelliferous squamelliform squameous squamiferous squamiform squamify squamigerous squamipennate Squamipennes squamipinnate Squamipinnes squamocellular squamoepithelial squamoid squamomastoid squamoparietal squamopetrosal squamosa squamosal squamose squamosely squamoseness squamosis squamosity squamosodentated squamosoimbricated squamosomaxillary squamosoparietal squamosoradiate squamosotemporal squamosozygomatic squamosphenoid squamosphenoidal squamotemporal squamous squamously squamousness squamozygomatic Squamscot squamula squamulae squamulate squamulation squamule squamuliform squamulose squander squanderer squanderingly squandermania squandermaniac squantum squarable square squareage squarecap squared squaredly squareface squareflipper squarehead squarelike squarely squareman squaremouth squareness squarer squaretail squarewise squaring squarish squarishly squark squarrose squarrosely squarrous squarrulose squarson squarsonry squary squash squashberry squasher squashily squashiness squashy squat Squatarola squatarole Squatina squatina squatinid Squatinidae squatinoid Squatinoidei squatly squatment squatmore squatness squattage squatted squatter squatterarchy squatterdom squatterproof squattily squattiness squatting squattingly squattish squattocracy squattocratic squatty squatwise squaw squawberry squawbush squawdom squawfish squawflower squawk squawker squawkie squawking squawkingly squawky Squawmish squawroot Squawtits squawweed Squaxon squdge squdgy squeak squeaker squeakery squeakily squeakiness squeaking squeakingly squeaklet squeakproof squeaky squeakyish squeal squeald squealer squealing squeam squeamish squeamishly squeamishness squeamous squeamy Squedunk squeege squeegee squeezability squeezable squeezableness squeezably squeeze squeezeman squeezer squeezing squeezingly squeezy squelch squelcher squelchily squelchiness squelching squelchingly squelchingness squelchy squench squencher squeteague squib squibber squibbery squibbish squiblet squibling squid squiddle squidge squidgereen squidgy squiffed squiffer squiffy squiggle squiggly squilgee squilgeer Squill Squilla squilla squillagee squillery squillian squillid Squillidae squilloid Squilloidea squimmidge squin squinance squinancy squinch squinny squinsy squint squinted squinter squinting squintingly squintingness squintly squintness squinty squirage squiralty squire squirearch squirearchal squirearchical squirearchy squiredom squireen squirehood squireless squirelet squirelike squireling squirely squireocracy squireship squiress squiret squirewise squirish squirism squirk squirm squirminess squirming squirmingly squirmy squirr squirrel squirrelfish squirrelian squirreline squirrelish squirrellike squirrelproof squirreltail squirt squirter squirtiness squirting squirtingly squirtish squirty squish squishy squit squitch squitchy squitter squoze squush squushy sraddha sramana Sri sri Sridhar Sridharan Srikanth Srinivas Srinivasan Sriram Srivatsan sruti Ssi ssu st staab Staatsrat stab stabber stabbing stabbingly stabile stabilify stabilist stabilitate stability stabilization stabilizator stabilize stabilizer stable stableboy stableful stablekeeper stablelike stableman stableness stabler stablestand stableward stablewards stabling stablishment stably staboy stabproof stabulate stabulation stabwort staccato Stacey stacher stachydrin stachydrine stachyose Stachys stachys Stachytarpheta Stachyuraceae stachyuraceous Stachyurus stack stackage stackencloud stacker stackfreed stackful stackgarth Stackhousia Stackhousiaceae stackhousiaceous stackless stackman stackstand stackyard stacte stactometer Stacy stadda staddle staddling stade stadholder stadholderate stadholdership stadhouse stadia stadic stadimeter stadiometer stadion stadium stafette staff staffed staffelite staffer staffless staffman stag stagbush stage stageability stageable stageableness stageably stagecoach stagecoaching stagecraft staged stagedom stagehand stagehouse stageland stagelike stageman stager stagery stagese stagewise stageworthy stagewright staggard staggart staggarth Stagger stagger staggerbush staggerer staggering staggeringly staggers staggerweed staggerwort staggery staggie staggy staghead staghorn staghound staghunt staghunter staghunting stagiary stagily staginess staging Stagirite Stagiritic staglike stagmometer stagnance stagnancy stagnant stagnantly stagnantness stagnate stagnation stagnatory stagnature stagnicolous stagnize stagnum Stagonospora stagskin stagworm stagy Stahlhelm Stahlhelmer Stahlhelmist Stahlian Stahlianism Stahlism staia staid staidly staidness stain stainability stainable stainableness stainably stainer stainful stainierite staining stainless stainlessly stainlessness stainproof staio stair stairbeak stairbuilder stairbuilding staircase staired stairhead stairless stairlike stairstep stairway stairwise stairwork stairy staith staithman staiver stake stakehead stakeholder stakemaster staker stakerope Stakhanovism Stakhanovite stalactic stalactical stalactiform stalactital stalactite stalactited stalactitic stalactitical stalactitically stalactitiform stalactitious stalagma stalagmite stalagmitic stalagmitical stalagmitically stalagmometer stalagmometric stalagmometry stale stalely stalemate staleness staling Stalinism Stalinist Stalinite stalk stalkable stalked stalker stalkily stalkiness stalking stalkingly stalkless stalklet stalklike stalko stalky stall stallage stallar stallboard stallenger staller stallership stalling stallion stallionize stallman stallment stalwart stalwartism stalwartize stalwartly stalwartness stam stambha stambouline stamen stamened stamin stamina staminal staminate stamineal stamineous staminiferous staminigerous staminode staminodium staminody stammel stammer stammerer stammering stammeringly stammeringness stammerwort stamnos stamp stampable stampage stampedable stampede stampeder stampedingly stampee stamper stampery stamphead Stampian stamping stample stampless stampman stampsman stampweed Stan stance stanch stanchable stanchel stancheled stancher stanchion stanchless stanchly stanchness stand standage standard standardbred standardizable standardization standardize standardized standardizer standardwise standee standel standelwelks standelwort stander standergrass standerwort standfast standing standish standoff standoffish standoffishness standout standpat standpatism standpatter standpipe standpoint standpost standstill stane stanechat stang Stangeria stanhope Stanhopea stanine Stanislaw stanjen stank stankie Stanley Stanly stannane stannary stannate stannator stannel stanner stannery stannic stannide stanniferous stannite stanno stannotype stannous stannoxyl stannum stannyl stanza stanzaed stanzaic stanzaical stanzaically stanze stap stapedectomy stapedial stapediform stapediovestibular stapedius Stapelia stapelia stapes staphisagria staphyle Staphylea Staphyleaceae staphyleaceous staphylectomy staphyledema staphylematoma staphylic staphyline staphylinic staphylinid Staphylinidae staphylinideous Staphylinoidea Staphylinus staphylion staphylitis staphyloangina staphylococcal staphylococci staphylococcic Staphylococcus staphylococcus staphylodermatitis staphylodialysis staphyloedema staphylohemia staphylolysin staphyloma staphylomatic staphylomatous staphylomycosis staphyloncus staphyloplastic staphyloplasty staphyloptosia staphyloptosis staphyloraphic staphylorrhaphic staphylorrhaphy staphyloschisis staphylosis staphylotome staphylotomy staphylotoxin staple stapled stapler staplewise stapling Star star starblind starbloom starboard starbolins starbright Starbuck starch starchboard starched starchedly starchedness starcher starchflower starchily starchiness starchless starchlike starchly starchmaker starchmaking starchman starchness starchroot starchworks starchwort starchy starcraft stardom stare staree starer starets starfish starflower starfruit starful stargaze stargazer stargazing staring staringly stark starken starkly starkness starky starless starlessly starlessness starlet starlight starlighted starlights starlike starling starlit starlite starlitten starmonger starn starnel starnie starnose Staroobriadtsi starost starosta starosty starred starrily starriness starring starringly starry starshake starshine starship starshoot starshot starstone starstroke start starter startful startfulness starthroat starting startingly startish startle startler startling startlingly startlingness startlish startlishness startly startor starty starvation starve starveacre starved starvedly starveling starver starvy starward starwise starworm starwort stary stases stash stashie stasidion stasimetric stasimon stasimorphy stasiphobia stasis stassfurtite statable statal statant statcoulomb State state statecraft stated statedly stateful statefully statefulness statehood Statehouse stateless statelet statelich statelily stateliness stately statement statemonger statequake stater stateroom statesboy stateside statesider statesman statesmanese statesmanlike statesmanly statesmanship statesmonger stateswoman stateway statfarad stathmoi stathmos static statical statically Statice staticproof statics station stational stationarily stationariness stationary stationer stationery stationman stationmaster statiscope statism statist statistic statistical statistically statistician statisticize statistics statistology stative statoblast statocracy statocyst statolatry statolith statolithic statometer stator statoreceptor statorhab statoscope statospore statuarism statuarist statuary statue statuecraft statued statueless statuelike statuesque statuesquely statuesqueness statuette stature statured status statutable statutableness statutably statutary statute statutorily statutory statvolt staucher stauk staumer staun staunch staunchable staunchly staunchness staup stauracin stauraxonia stauraxonial staurion staurolatry staurolite staurolitic staurology Stauromedusae stauromedusan stauropegial stauropegion stauroscope stauroscopic stauroscopically staurotide stauter stave staveable staveless staver stavers staverwort stavesacre stavewise stavewood staving stavrite staw stawn staxis stay stayable stayed stayer staylace stayless staylessness staymaker staymaking staynil stays staysail stayship stchi stead steadfast steadfastly steadfastness steadier steadily steadiment steadiness steading steadman steady steadying steadyingly steadyish steak steal stealability stealable stealage stealed stealer stealing stealingly stealth stealthful stealthfully stealthily stealthiness stealthless stealthlike stealthwise stealthy stealy steam steamboat steamboating steamboatman steamcar steamer steamerful steamerless steamerload steamily steaminess steaming steamless steamlike steampipe steamproof steamship steamtight steamtightness steamy stean steaning steapsin stearate stearic steariform stearin stearolactone stearone stearoptene stearrhea stearyl steatin steatite steatitic steatocele steatogenous steatolysis steatolytic steatoma steatomatous steatopathic steatopyga steatopygia steatopygic steatopygous Steatornis Steatornithes Steatornithidae steatorrhea steatosis stech stechados steckling steddle Stedman steed steedless steedlike steek steekkan steekkannen steel Steelboy steeler steelhead steelhearted steelification steelify steeliness steeling steelless steellike steelmaker steelmaking steelproof steelware steelwork steelworker steelworks steely steelyard Steen steen steenboc steenbock steenbok Steenie steenkirk steenstrupine steenth steep steepdown steepen steeper steepgrass steepish steeple steeplebush steeplechase steeplechaser steeplechasing steepled steepleless steeplelike steepletop steeply steepness steepweed steepwort steepy steer steerability steerable steerage steerageway steerer steering steeringly steerling steerman steermanship steersman steerswoman steeve steevely steever steeving Stefan steg steganogram steganographical steganographist steganography Steganophthalmata steganophthalmate steganophthalmatous Steganophthalmia steganopod steganopodan Steganopodes steganopodous stegnosis stegnotic stegocarpous Stegocephalia stegocephalian stegocephalous Stegodon stegodont stegodontine Stegomus Stegomyia stegosaur Stegosauria stegosaurian stegosauroid Stegosaurus steid steigh Stein stein Steinberger steinbok Steinerian steinful steinkirk Steironema stekan stela stelae stelai stelar stele stell Stella stella stellar Stellaria stellary stellate stellated stellately stellature stelleridean stellerine stelliferous stellification stelliform stellify stelling stellionate stelliscript Stellite stellite stellular stellularly stellulate stelography stem stema stemhead stemless stemlet stemlike stemma stemmata stemmatiform stemmatous stemmed stemmer stemmery stemming stemmy Stemona Stemonaceae stemonaceous stemple stempost stemson stemwards stemware sten stenar stench stenchel stenchful stenching stenchion stenchy stencil stenciler stencilmaker stencilmaking stend steng stengah stenion steno stenobathic stenobenthic stenobragmatic stenobregma stenocardia stenocardiac Stenocarpus stenocephalia stenocephalic stenocephalous stenocephaly stenochoria stenochrome stenochromy stenocoriasis stenocranial stenocrotaphia Stenofiber stenog stenogastric stenogastry Stenoglossa stenograph stenographer stenographic stenographical stenographically stenographist stenography stenohaline stenometer stenopaic Stenopelmatidae stenopetalous stenophile Stenophragma stenophyllous stenorhyncous stenosed stenosepalous stenosis stenosphere stenostomatous stenostomia Stenotaphrum stenotelegraphy stenothermal stenothorax stenotic stenotype stenotypic stenotypist stenotypy stent stenter stenterer stenton Stentor stentorian stentorianly stentorine stentorious stentoriously stentoriousness stentoronic stentorophonic stentrel step stepaunt stepbairn stepbrother stepbrotherhood stepchild stepdame stepdaughter stepfather stepfatherhood stepfatherly stepgrandchild stepgrandfather stepgrandmother stepgrandson Stephan Stephana stephane stephanial Stephanian stephanic Stephanie stephanion stephanite Stephanoceros Stephanokontae stephanome stephanos Stephanotis stephanotis Stephanurus Stephe Stephen stepladder stepless steplike stepminnie stepmother stepmotherhood stepmotherless stepmotherliness stepmotherly stepnephew stepniece stepparent steppe stepped steppeland stepper stepping steppingstone steprelation steprelationship stepsire stepsister stepson stepstone stept stepuncle stepway stepwise steradian stercobilin stercolin stercophagic stercophagous stercoraceous stercoral Stercoranism Stercoranist Stercorariidae Stercorariinae stercorarious Stercorarius stercorary stercorate stercoration stercorean stercoremia stercoreous Stercorianism stercoricolous Stercorist stercorite stercorol stercorous stercovorous Sterculia Sterculiaceae sterculiaceous sterculiad stere stereagnosis Sterelmintha sterelminthic sterelminthous stereo stereobate stereobatic stereoblastula stereocamera stereocampimeter stereochemic stereochemical stereochemically stereochemistry stereochromatic stereochromatically stereochrome stereochromic stereochromically stereochromy stereocomparagraph stereocomparator stereoelectric stereofluoroscopic stereofluoroscopy stereogastrula stereognosis stereognostic stereogoniometer stereogram stereograph stereographer stereographic stereographical stereographically stereography stereoisomer stereoisomeric stereoisomerical stereoisomeride stereoisomerism stereomatrix stereome stereomer stereomeric stereomerical stereomerism stereometer stereometric stereometrical stereometrically stereometry stereomicrometer stereomonoscope stereoneural stereophantascope stereophonic stereophony stereophotogrammetry stereophotograph stereophotographic stereophotography stereophotomicrograph stereophotomicrography stereophysics stereopicture stereoplanigraph stereoplanula stereoplasm stereoplasma stereoplasmic stereopsis stereoptician stereopticon stereoradiograph stereoradiography Stereornithes stereornithic stereoroentgenogram stereoroentgenography stereoscope stereoscopic stereoscopically stereoscopism stereoscopist stereoscopy Stereospondyli stereospondylous stereostatic stereostatics stereotactic stereotactically stereotaxis stereotelemeter stereotelescope stereotomic stereotomical stereotomist stereotomy stereotropic stereotropism stereotypable stereotype stereotyped stereotyper stereotypery stereotypic stereotypical stereotyping stereotypist stereotypographer stereotypography stereotypy Stereum sterhydraulic steri steric sterically sterics steride sterigma sterigmata sterigmatic sterile sterilely sterileness sterilisable sterility sterilizability sterilizable sterilization sterilize sterilizer sterin sterk sterlet Sterling sterling sterlingly sterlingness Stern stern Sterna sterna sternad sternage sternal sternalis sternbergite sterncastle sterneber sternebra sternebrae sternebral sterned sternforemost Sterninae sternite sternitic sternly sternman sternmost sternness Sterno sternoclavicular sternocleidomastoid sternoclidomastoid sternocoracoid sternocostal sternofacial sternofacialis sternoglossal sternohumeral sternohyoid sternohyoidean sternomancy sternomastoid sternomaxillary sternonuchal sternopericardiac sternopericardial sternoscapular sternothere Sternotherus sternothyroid sternotracheal sternotribe sternovertebral sternoxiphoid sternpost sternson sternum sternutation sternutative sternutator sternutatory sternward sternway sternways sternworks stero steroid sterol Sterope sterrinck stert stertor stertorious stertoriously stertoriousness stertorous stertorously stertorousness sterve Stesichorean stet stetch stetharteritis stethogoniometer stethograph stethographic stethokyrtograph stethometer stethometric stethometry stethoparalysis stethophone stethophonometer stethoscope stethoscopic stethoscopical stethoscopically stethoscopist stethoscopy stethospasm Stevan Steve stevedorage stevedore stevedoring stevel Steven steven Stevensonian Stevensoniana Stevia stevia stew stewable steward stewardess stewardly stewardry stewardship Stewart Stewartia stewartry stewarty stewed stewpan stewpond stewpot stewy stey sthenia sthenic sthenochire stib stibbler stibblerig stibethyl stibial stibialism stibiate stibiated stibic stibiconite stibine stibious stibium stibnite stibonium sticcado stich sticharion sticheron stichic stichically stichid stichidium stichomancy stichometric stichometrical stichometrically stichometry stichomythic stichomythy stick stickability stickable stickadore stickadove stickage stickball sticked sticker stickers stickfast stickful stickily stickiness sticking stickit stickle stickleaf stickleback stickler stickless sticklike stickling stickly stickpin sticks stickseed sticksmanship sticktail sticktight stickum stickwater stickweed stickwork sticky Sticta Stictaceae Stictidaceae stictiform Stictis stid stiddy stife stiff stiffen stiffener stiffening stiffhearted stiffish stiffleg stifflike stiffly stiffneck stiffness stiffrump stifftail stifle stifledly stifler stifling stiflingly stigma stigmai stigmal stigmaria stigmarian stigmarioid stigmasterol stigmata stigmatal stigmatic stigmatical stigmatically stigmaticalness stigmatiferous stigmatiform stigmatism stigmatist stigmatization stigmatize stigmatizer stigmatoid stigmatose stigme stigmeology stigmonose stigonomancy Stikine Stilbaceae Stilbella stilbene stilbestrol stilbite stilboestrol Stilbum stile stileman stilet stiletto stilettolike still stillage stillatitious stillatory stillbirth stillborn stiller stillhouse stillicide stillicidium stilliform stilling Stillingia stillion stillish stillman stillness stillroom stillstand Stillwater stilly Stilophora Stilophoraceae stilpnomelane stilpnosiderite stilt stiltbird stilted stilter stiltify stiltiness stiltish stiltlike Stilton stilty stim stime stimpart stimpert stimulability stimulable stimulance stimulancy stimulant stimulate stimulatingly stimulation stimulative stimulator stimulatory stimulatress stimulatrix stimuli stimulogenous stimulus stimy stine sting stingaree stingareeing stingbull stinge stinger stingfish stingily stinginess stinging stingingly stingingness stingless stingo stingproof stingray stingtail stingy stink stinkard stinkardly stinkball stinkberry stinkbird stinkbug stinkbush stinkdamp stinker stinkhorn stinking stinkingly stinkingness stinkpot stinkstone stinkweed stinkwood stinkwort stint stinted stintedly stintedness stinter stintingly stintless stinty stion stionic Stipa stipe stiped stipel stipellate stipend stipendial stipendiarian stipendiary stipendiate stipendium stipendless stipes stipiform stipitate stipitiform stipiture Stipiturus stippen stipple stippled stippler stippling stipply stipula stipulable stipulaceous stipulae stipular stipulary stipulate stipulation stipulator stipulatory stipule stipuled stipuliferous stipuliform stir stirabout stirk stirless stirlessly stirlessness stirp stirpicultural stirpiculture stirpiculturist stirps stirra stirrable stirrage stirrer stirring stirringly stirrup stirrupless stirruplike stirrupwise stitch stitchbird stitchdown stitcher stitchery stitching stitchlike stitchwhile stitchwork stitchwort stite stith stithy stive stiver stivy Stizolobium stoa stoach stoat stoater stob stocah stoccado stoccata stochastic stochastical stochastically stock stockade stockannet stockbow stockbreeder stockbreeding Stockbridge stockbroker stockbrokerage stockbroking stockcar stocker stockfather stockfish stockholder stockholding stockhouse stockily stockiness stockinet stocking stockinger stockingless stockish stockishly stockishness stockjobber stockjobbery stockjobbing stockjudging stockkeeper stockkeeping stockless stocklike stockmaker stockmaking stockman stockowner stockpile stockpot stockproof stockrider stockriding stocks stockstone stocktaker stocktaking Stockton stockwork stockwright stocky stockyard stod stodge stodger stodgery stodgily stodginess stodgy stoechas stoep stof stoff stog stoga stogie stogy Stoic stoic stoical stoically stoicalness stoicharion stoichiological stoichiology stoichiometric stoichiometrical stoichiometrically stoichiometry Stoicism stoicism Stokavci Stokavian Stokavski stoke stokehold stokehole stoker stokerless Stokesia stokesite stola stolae stole stoled stolelike stolen stolenly stolenness stolenwise stolewise stolid stolidity stolidly stolidness stolist stolkjaerre stollen stolon stolonate stoloniferous stoloniferously stolonlike stolzite stoma stomacace stomach stomachable stomachal stomacher stomachful stomachfully stomachfulness stomachic stomachically stomachicness stomaching stomachless stomachlessness stomachy stomapod Stomapoda stomapodiform stomapodous stomata stomatal stomatalgia stomate stomatic stomatiferous stomatitic stomatitis stomatocace Stomatoda stomatodaeal stomatodaeum stomatode stomatodeum stomatodynia stomatogastric stomatograph stomatography stomatolalia stomatologic stomatological stomatologist stomatology stomatomalacia stomatomenia stomatomy stomatomycosis stomatonecrosis stomatopathy Stomatophora stomatophorous stomatoplastic stomatoplasty stomatopod Stomatopoda stomatopodous stomatorrhagia stomatoscope stomatoscopy stomatose stomatosepsis stomatotomy stomatotyphus stomatous stomenorrhagia stomium stomodaea stomodaeal stomodaeum Stomoisia stomoxys stomp stomper stonable stond Stone stone stoneable stonebird stonebiter stoneboat stonebow stonebrash stonebreak stonebrood stonecast stonechat stonecraft stonecrop stonecutter stoned stonedamp stonefish stonegale stonegall stonehand stonehatch stonehead stonehearted Stonehenge stonelayer stonelaying stoneless stonelessness stonelike stoneman stonemason stonemasonry stonen stonepecker stoner stoneroot stoneseed stoneshot stonesmatch stonesmich stonesmitch stonesmith stonewall stonewaller stonewally stoneware stoneweed stonewise stonewood stonework stoneworker stonewort stoneyard stong stonied stonifiable stonify stonily stoniness stoning stonish stonishment stonker stony stonyhearted stonyheartedly stonyheartedness stood stooded stooden stoof stooge stook stooker stookie stool stoolball stoollike stoon stoond stoop stooper stoopgallant stooping stoopingly stoory stoot stoothing stop stopa stopback stopblock stopboard stopcock stope stoper stopgap stophound stoping stopless stoplessness stopover stoppability stoppable stoppableness stoppably stoppage stopped stopper stopperless stoppeur stopping stoppit stopple stopwater stopwork storable storage storax store storeen storehouse storehouseman storekeep storekeeper storekeeping storeman storer storeroom storeship storesman storge storiate storiation storied storier storiette storify storiological storiologist storiology stork storken storkish storklike storkling storkwise storm stormable Stormberg stormbird stormbound stormcock stormer stormful stormfully stormfulness stormily storminess storming stormingly stormish stormless stormlessness stormlike stormproof stormward stormwind stormwise stormy Storting story storybook storyless storymaker storymonger storyteller storytelling storywise storywork stosh stoss stosston stot stotinka stotter stotterel stoun stound stoundmeal stoup stoupful stour stouring stourliness stourness stoury stoush stout stouten stouth stouthearted stoutheartedly stoutheartedness stoutish stoutly stoutness stoutwood stouty stove stovebrush stoveful stovehouse stoveless stovemaker stovemaking stoveman stoven stovepipe stover stovewood stow stowable stowage stowaway stowbord stowbordman stowce stowdown stower stowing stownlins stowwood stra strabism strabismal strabismally strabismic strabismical strabismometer strabismometry strabismus strabometer strabometry strabotome strabotomy strack strackling stract Strad strad stradametrical straddle straddleback straddlebug straddler straddleways straddlewise straddling straddlingly strade stradine stradiot Stradivari Stradivarius stradl stradld stradlings strae strafe strafer Straffordian strag straggle straggler straggling stragglingly straggly stragular stragulum straight straightabout straightaway straightedge straighten straightener straightforward straightforwardly straightforwardness straightforwards straighthead straightish straightly straightness straighttail straightup straightwards straightway straightways straightwise straik strain strainable strainableness strainably strained strainedly strainedness strainer strainerman straining strainingly strainless strainlessly strainproof strainslip straint strait straiten straitlacedness straitlacing straitly straitness straitsman straitwork Straka strake straked straky stram stramash stramazon stramineous stramineously strammel strammer stramonium stramony stramp strand strandage strander stranding strandless strandward strang strange strangeling strangely strangeness stranger strangerdom strangerhood strangerlike strangership strangerwise strangle strangleable stranglement strangler strangles strangletare strangleweed strangling stranglingly strangulable strangulate strangulation strangulative strangulatory strangullion strangurious strangury stranner strany strap straphang straphanger straphead strapless straplike strappable strappado strappan strapped strapper strapping strapple strapwork strapwort strass strata stratagem stratagematic stratagematical stratagematically stratagematist stratagemical stratagemically stratal stratameter stratege strategetic strategetics strategi strategian strategic strategical strategically strategics strategist strategize strategos strategy Stratfordian strath strathspey strati stratic straticulate straticulation stratification stratified stratiform stratify stratigrapher stratigraphic stratigraphical stratigraphically stratigraphist stratigraphy Stratiomyiidae Stratiotes stratlin stratochamber stratocracy stratocrat stratocratic stratographic stratographical stratographically stratography stratonic Stratonical stratopedarch stratoplane stratose stratosphere stratospheric stratospherical stratotrainer stratous stratum stratus straucht strauchten stravage strave straw strawberry strawberrylike strawbill strawboard strawbreadth strawen strawer strawflower strawfork strawless strawlike strawman strawmote strawsmall strawsmear strawstack strawstacker strawwalker strawwork strawworm strawy strawyard stray strayaway strayer strayling stre streahte streak streaked streakedly streakedness streaker streakily streakiness streaklike streakwise streaky stream streamer streamful streamhead streaminess streaming streamingly streamless streamlet streamlike streamline streamlined streamliner streamling streamside streamward streamway streamwort streamy streck streckly stree streek streel streeler streen streep street streetage streetcar streetful streetless streetlet streetlike streets streetside streetwalker streetwalking streetward streetway streetwise streite streke Strelitz Strelitzi strelitzi Strelitzia Streltzi streltzi stremma stremmatograph streng strengite strength strengthen strengthener strengthening strengtheningly strengthful strengthfulness strengthily strengthless strengthlessly strengthlessness strengthy strent strenth strenuity strenuosity strenuous strenuously strenuousness strepen strepent strepera streperous strephonade strephosymbolia strepitant strepitantly strepitation strepitous strepor Strepsiceros strepsiceros strepsinema Strepsiptera strepsipteral strepsipteran strepsipteron strepsipterous strepsis strepsitene streptaster streptobacilli streptobacillus Streptocarpus streptococcal streptococci streptococcic Streptococcus streptococcus streptolysin Streptomyces streptomycin Streptoneura streptoneural streptoneurous streptosepticemia streptothricial streptothricin streptothricosis Streptothrix streptotrichal streptotrichosis stress stresser stressful stressfully stressless stresslessness stret stretch stretchable stretchberry stretcher stretcherman stretchiness stretchneck stretchproof stretchy stretman strette stretti stretto strew strewage strewer strewment strewn strey streyne stria striae strial Striaria Striariaceae striatal striate striated striation striatum striature strich striche strick stricken strickenly strickenness stricker strickle strickler strickless strict striction strictish strictly strictness stricture strictured strid stridden striddle stride strideleg stridelegs stridence stridency strident stridently strider strideways stridhan stridhana stridhanum stridingly stridling stridlins stridor stridulant stridulate stridulation stridulator stridulatory stridulent stridulous stridulously stridulousness strife strifeful strifeless strifemaker strifemaking strifemonger strifeproof striffen strig Striga striga strigae strigal strigate Striges striggle stright Strigidae Strigiformes strigil strigilate strigilation strigilator strigiles strigilis strigillose strigilous Striginae strigine strigose strigous strigovite Strigula Strigulaceae strigulose strike strikeboat strikebreaker strikebreaking strikeless striker striking strikingly strikingness strind string stringboard stringcourse stringed stringency stringene stringent stringently stringentness stringer stringful stringhalt stringhalted stringhaltedness stringiness stringing stringless stringlike stringmaker stringmaking stringman stringpiece stringsman stringways stringwood stringy stringybark strinkle striola striolae striolate striolated striolet strip stripe striped stripeless striper striplet stripling strippage stripped stripper stripping strippit strippler stript stripy strit strive strived striven striver striving strivingly Strix strix stroam strobic strobila strobilaceous strobilae strobilate strobilation strobile strobili strobiliferous strobiliform strobiline strobilization strobiloid Strobilomyces Strobilophyta strobilus stroboscope stroboscopic stroboscopical stroboscopy strobotron strockle stroddle strode stroil stroke stroker strokesman stroking stroky strold stroll strolld stroller strom stroma stromal stromata Stromateidae stromateoid stromatic stromatiform stromatology Stromatopora Stromatoporidae stromatoporoid Stromatoporoidea stromatous stromb Strombidae strombiform strombite stromboid strombolian strombuliferous strombuliform Strombus strome stromeyerite stromming strone strong strongback strongbark strongbox strongbrained strongfully stronghand stronghead strongheadedly strongheadedness stronghearted stronghold strongish stronglike strongly strongness strongylate strongyle strongyliasis strongylid Strongylidae strongylidosis strongyloid Strongyloides strongyloidosis strongylon Strongyloplasmata Strongylosis strongylosis Strongylus strontia strontian strontianiferous strontianite strontic strontion strontitic strontium strook strooken stroot strop strophaic strophanhin Strophanthus Stropharia strophe strophic strophical strophically strophiolate strophiolated strophiole strophoid Strophomena Strophomenacea strophomenid Strophomenidae strophomenoid strophosis strophotaxis strophulus stropper stroppings stroth stroud strouding strounge stroup strouthiocamel strouthiocamelian strouthocamelian strove strow strowd strown stroy stroyer stroygood strub strubbly struck strucken structural structuralism structuralist structuralization structuralize structurally structuration structure structured structureless structurely structurist strudel strue struggle struggler struggling strugglingly Struldbrug Struldbruggian Struldbruggism strum struma strumae strumatic strumaticness strumectomy Strumella strumiferous strumiform strumiprivic strumiprivous strumitis strummer strumose strumous strumousness strumpet strumpetlike strumpetry strumstrum strumulose strung strunt strut struth struthian struthiform Struthio struthioid Struthiomimus Struthiones Struthionidae struthioniform Struthioniformes Struthiopteris struthious struthonine strutter strutting struttingly struv struvite strych strychnia strychnic strychnin strychnine strychninic strychninism strychninization strychninize strychnize strychnol Strychnos Strymon Stu Stuart Stuartia stub stubachite stubb stubbed stubbedness stubber stubbiness stubble stubbleberry stubbled stubbleward stubbly stubborn stubbornhearted stubbornly stubbornness stubboy stubby stubchen stuber stuboy stubrunner stucco stuccoer stuccowork stuccoworker stuccoyer stuck stuckling stucturelessness stud studbook studder studdie studding studdle stude student studenthood studentless studentlike studentry studentship studerite studfish studflower studhorse studia studiable studied studiedly studiedness studier studio studious studiously studiousness Studite Studium studium studwork study stue stuff stuffed stuffender stuffer stuffgownsman stuffily stuffiness stuffing stuffy stug stuggy stuiver stull stuller stulm stultification stultifier stultify stultiloquence stultiloquently stultiloquious stultioquy stultloquent stum stumble stumbler stumbling stumblingly stumbly stumer stummer stummy stump stumpage stumper stumpily stumpiness stumpish stumpless stumplike stumpling stumpnose stumpwise stumpy stun Stundism Stundist stung stunk stunkard stunner stunning stunningly stunpoll stunsail stunsle stunt stunted stuntedly stuntedness stunter stuntiness stuntness stunty stupa stupe stupefacient stupefaction stupefactive stupefactiveness stupefied stupefiedness stupefier stupefy stupend stupendly stupendous stupendously stupendousness stupent stupeous stupex stupid stupidhead stupidish stupidity stupidly stupidness stupor stuporific stuporose stuporous stupose stupp stuprate stupration stuprum stupulose sturdied sturdily sturdiness sturdy sturdyhearted sturgeon sturine Sturiones sturionine sturk Sturmian Sturnella Sturnidae sturniform Sturninae sturnine sturnoid Sturnus sturt sturtan sturtin sturtion sturtite stuss stut stutter stutterer stuttering stutteringly sty styan styca styceric stycerin stycerinol stychomythia styful styfziekte Stygial Stygian stylar Stylaster Stylasteridae stylate style stylebook styledom styleless stylelessness stylelike styler stylet stylewort Stylidiaceae stylidiaceous Stylidium styliferous styliform styline styling stylish stylishly stylishness stylist stylistic stylistical stylistically stylistics stylite stylitic stylitism stylization stylize stylizer stylo styloauricularis stylobate Stylochus styloglossal styloglossus stylogonidium stylograph stylographic stylographical stylographically stylography stylohyal stylohyoid stylohyoidean stylohyoideus styloid stylolite stylolitic stylomandibular stylomastoid stylomaxillary stylometer Stylommatophora stylommatophorous stylomyloid Stylonurus Stylonychia stylopharyngeal stylopharyngeus stylopid Stylopidae stylopization stylopized stylopod stylopodium Stylops stylops Stylosanthes stylospore stylosporous stylostegium stylotypite stylus stymie Stymphalian Stymphalid Stymphalides Styphelia styphnate styphnic stypsis styptic styptical stypticalness stypticity stypticness Styracaceae styracaceous styracin Styrax styrax styrene Styrian styrogallol styrol styrolene styrone styryl styrylic stythe styward Styx Styxian suability suable suably suade Suaeda suaharo Sualocin Suanitian suant suantly suasible suasion suasionist suasive suasively suasiveness suasory suavastika suave suavely suaveness suaveolent suavify suaviloquence suaviloquent suavity sub subabbot subabdominal subability subabsolute subacademic subaccount subacetate subacid subacidity subacidly subacidness subacidulous subacrid subacrodrome subacromial subact subacuminate subacute subacutely subadditive subadjacent subadjutor subadministrate subadministration subadministrator subadult subaduncate subaerate subaeration subaerial subaerially subaetheric subaffluent subage subagency subagent subaggregate subah subahdar subahdary subahship subaid Subakhmimic subalary subalate subalgebra subalkaline suballiance subalmoner subalpine subaltern subalternant subalternate subalternately subalternating subalternation subalternity subanal subandean subangled subangular subangulate subangulated subanniversary subantarctic subantichrist subantique Subanun subapical subaponeurotic subapostolic subapparent subappearance subappressed subapprobation subapterous subaquatic subaquean subaqueous subarachnoid subarachnoidal subarachnoidean subarboraceous subarboreal subarborescent subarch subarchesporial subarchitect subarctic subarcuate subarcuated subarcuation subarea subareolar subareolet Subarian subarmor subarouse subarrhation subartesian subarticle subarytenoid subascending subassemblage subassembly subassociation subastragalar subastragaloid subastral subastringent subatom subatomic subattenuate subattenuated subattorney subaud subaudible subaudition subauditionist subauditor subauditur subaural subauricular subautomatic subaverage subaxillar subaxillary subbailie subbailiff subbailiwick subballast subband subbank subbasal subbasaltic subbase subbasement subbass subbeadle subbeau subbias subbifid subbing subbituminous subbookkeeper subboreal subbourdon subbrachycephalic subbrachycephaly subbrachyskelic subbranch subbranched subbranchial subbreed subbrigade subbrigadier subbroker subbromid subbromide subbronchial subbureau subcaecal subcalcareous subcalcarine subcaliber subcallosal subcampanulate subcancellate subcandid subcantor subcapsular subcaptain subcaption subcarbide subcarbonate Subcarboniferous subcarbureted subcarburetted subcardinal subcarinate subcartilaginous subcase subcash subcashier subcasino subcast subcaste subcategory subcaudal subcaudate subcaulescent subcause subcavate subcavity subcelestial subcell subcellar subcenter subcentral subcentrally subchairman subchamberer subchancel subchanter subchapter subchaser subchela subchelate subcheliform subchief subchloride subchondral subchordal subchorioid subchorioidal subchorionic subchoroid subchoroidal subcinctorium subcineritious subcingulum subcircuit subcircular subcision subcity subclaim Subclamatores subclan subclass subclassify subclause subclavate subclavia subclavian subclavicular subclavioaxillary subclaviojugular subclavius subclerk subclimate subclimax subclinical subclover subcoastal subcollateral subcollector subcollegiate subcolumnar subcommander subcommendation subcommended subcommissary subcommissaryship subcommission subcommissioner subcommit subcommittee subcompany subcompensate subcompensation subcompressed subconcave subconcession subconcessionaire subconchoidal subconference subconformable subconical subconjunctival subconjunctively subconnate subconnect subconnivent subconscience subconscious subconsciously subconsciousness subconservator subconsideration subconstable subconstellation subconsul subcontained subcontest subcontiguous subcontinent subcontinental subcontinual subcontinued subcontinuous subcontract subcontracted subcontractor subcontraoctave subcontrariety subcontrarily subcontrary subcontrol subconvex subconvolute subcool subcoracoid subcordate subcordiform subcoriaceous subcorneous subcorporation subcortex subcortical subcortically subcorymbose subcosta subcostal subcostalis subcouncil subcranial subcreative subcreek subcrenate subcrepitant subcrepitation subcrescentic subcrest subcriminal subcrossing subcrureal subcrureus subcrust subcrustaceous subcrustal subcrystalline subcubical subcuboidal subcultrate subcultural subculture subcurate subcurator subcuratorship subcurrent subcutaneous subcutaneously subcutaneousness subcuticular subcutis subcyaneous subcyanide subcylindric subcylindrical subdatary subdate subdeacon subdeaconate subdeaconess subdeaconry subdeaconship subdealer subdean subdeanery subdeb subdebutante subdecanal subdecimal subdecuple subdeducible subdefinition subdelegate subdelegation subdelirium subdeltaic subdeltoid subdeltoidal subdemonstrate subdemonstration subdenomination subdentate subdentated subdented subdenticulate subdepartment subdeposit subdepository subdepot subdepressed subdeputy subderivative subdermal subdeterminant subdevil subdiaconal subdiaconate subdial subdialect subdialectal subdialectally subdiapason subdiapente subdiaphragmatic subdichotomize subdichotomous subdichotomously subdichotomy subdie subdilated subdirector subdiscoidal subdisjunctive subdistich subdistichous subdistinction subdistinguish subdistinguished subdistrict subdititious subdititiously subdivecious subdiversify subdividable subdivide subdivider subdividing subdividingly subdivine subdivisible subdivision subdivisional subdivisive subdoctor subdolent subdolichocephalic subdolichocephaly subdolous subdolously subdolousness subdominant subdorsal subdorsally subdouble subdrain subdrainage subdrill subdruid subduable subduableness subduably subdual subduce subduct subduction subdue subdued subduedly subduedness subduement subduer subduing subduingly subduple subduplicate subdural subdurally subecho subectodermal subedit subeditor subeditorial subeditorship subeffective subelection subelectron subelement subelementary subelliptic subelliptical subelongate subemarginate subencephalon subencephaltic subendocardial subendorse subendorsement subendothelial subendymal subenfeoff subengineer subentire subentitle subentry subepidermal subepiglottic subepithelial subepoch subequal subequality subequally subequatorial subequilateral subequivalve suber suberane suberate suberect subereous suberic suberiferous suberification suberiform suberin suberinization suberinize Suberites Suberitidae suberization suberize suberone suberose suberous subescheator subesophageal subessential subetheric subexaminer subexcitation subexcite subexecutor subexternal subface subfacies subfactor subfactorial subfactory subfalcate subfalcial subfalciform subfamily subfascial subfastigiate subfebrile subferryman subfestive subfeu subfeudation subfeudatory subfibrous subfief subfigure subfissure subfix subflavor subflexuose subfloor subflooring subflora subflush subfluvial subfocal subfoliar subforeman subform subformation subfossil subfossorial subfoundation subfraction subframe subfreshman subfrontal subfulgent subfumigation subfumose subfunctional subfusc subfuscous subfusiform subfusk subgalea subgallate subganger subgape subgelatinous subgeneric subgenerical subgenerically subgeniculate subgenital subgens subgenual subgenus subgeometric subget subgit subglabrous subglacial subglacially subglenoid subglobose subglobosely subglobular subglobulose subglossal subglossitis subglottic subglumaceous subgod subgoverness subgovernor subgrade subgranular subgrin subgroup subgular subgwely subgyre subgyrus subhalid subhalide subhall subharmonic subhastation subhatchery subhead subheading subheadquarters subheadwaiter subhealth subhedral subhemispherical subhepatic subherd subhero subhexagonal subhirsute subhooked subhorizontal subhornblendic subhouse subhuman subhumid subhyaline subhyaloid subhymenial subhymenium subhyoid subhyoidean subhypothesis subhysteria subicle subicteric subicular subiculum subidar subidea subideal subimaginal subimago subimbricate subimbricated subimposed subimpressed subincandescent subincident subincise subincision subincomplete subindex subindicate subindication subindicative subindices subindividual subinduce subinfer subinfeud subinfeudate subinfeudation subinfeudatory subinflammation subinflammatory subinform subingression subinguinal subinitial subinoculate subinoculation subinsert subinsertion subinspector subinspectorship subintegumental subintellection subintelligential subintelligitur subintent subintention subintercessor subinternal subinterval subintestinal subintroduce subintroduction subintroductory subinvoluted subinvolution subiodide subirrigate subirrigation subitane subitaneous subitem Subiya subjacency subjacent subjacently subjack subject subjectability subjectable subjectdom subjected subjectedly subjectedness subjecthood subjectibility subjectible subjectification subjectify subjectile subjection subjectional subjectist subjective subjectively subjectiveness subjectivism subjectivist subjectivistic subjectivistically subjectivity subjectivize subjectivoidealistic subjectless subjectlike subjectness subjectship subjee subjicible subjoin subjoinder subjoint subjudge subjudiciary subjugable subjugal subjugate subjugation subjugator subjugular subjunct subjunction subjunctive subjunctively subjunior subking subkingdom sublabial sublaciniate sublacustrine sublanate sublanceolate sublanguage sublapsarian sublapsarianism sublapsary sublaryngeal sublate sublateral sublation sublative subleader sublease sublecturer sublegislation sublegislature sublenticular sublessee sublessor sublet sublethal sublettable subletter sublevaminous sublevate sublevation sublevel sublibrarian sublicense sublicensee sublid sublieutenancy sublieutenant subligation sublighted sublimable sublimableness sublimant sublimate sublimation sublimational sublimationist sublimator sublimatory sublime sublimed sublimely sublimeness sublimer subliminal subliminally sublimish sublimitation sublimity sublimize sublinear sublineation sublingua sublinguae sublingual sublinguate sublittoral sublobular sublong subloral subloreal sublot sublumbar sublunar sublunary sublunate sublustrous subluxate subluxation submaid submain submakroskelic submammary subman submanager submania submanic submanor submarginal submarginally submarginate submargined submarine submariner submarinism submarinist submarshal submaster submaxilla submaxillary submaximal submeaning submedial submedian submediant submediation submediocre submeeting submember submembranaceous submembranous submeningeal submental submentum submerge submerged submergement submergence submergibility submergible submerse submersed submersibility submersible submersion submetallic submeter submetering submicron submicroscopic submicroscopically submiliary submind subminimal subminister submiss submissible submission submissionist submissive submissively submissiveness submissly submissness submit submittal submittance submitter submittingly submolecule submonition submontagne submontane submontanely submontaneous submorphous submortgage submotive submountain submucosa submucosal submucous submucronate submultiple submundane submuriate submuscular Submytilacea subnarcotic subnasal subnascent subnatural subnect subnervian subness subneural subnex subnitrate subnitrated subniveal subnivean subnormal subnormality subnotation subnote subnotochordal subnubilar subnucleus subnude subnumber subnuvolar suboblique subobscure subobscurely subobtuse suboccipital subocean suboceanic suboctave suboctile suboctuple subocular suboesophageal suboffice subofficer subofficial subolive subopaque subopercle subopercular suboperculum subopposite suboptic suboptimal suboptimum suboral suborbicular suborbiculate suborbiculated suborbital suborbitar suborbitary subordain suborder subordinacy subordinal subordinary subordinate subordinately subordinateness subordinating subordinatingly subordination subordinationism subordinationist subordinative suborganic suborn subornation subornative suborner Suboscines suboval subovate subovated suboverseer subovoid suboxidation suboxide subpackage subpagoda subpallial subpalmate subpanel subparagraph subparallel subpart subpartition subpartitioned subpartitionment subparty subpass subpassage subpastor subpatron subpattern subpavement subpectinate subpectoral subpeduncle subpeduncular subpedunculate subpellucid subpeltate subpeltated subpentagonal subpentangular subpericardial subperiod subperiosteal subperiosteally subperitoneal subperitoneally subpermanent subpermanently subperpendicular subpetiolar subpetiolate subpharyngeal subphosphate subphratry subphrenic subphylar subphylum subpial subpilose subpimp subpiston subplacenta subplant subplantigrade subplat subpleural subplinth subplot subplow subpodophyllous subpoena subpoenal subpolar subpolygonal subpool subpopular subpopulation subporphyritic subport subpostmaster subpostmastership subpostscript subpotency subpotent subpreceptor subpreceptorial subpredicate subpredication subprefect subprefectorial subprefecture subprehensile subpress subprimary subprincipal subprior subprioress subproblem subproctor subproduct subprofessional subprofessor subprofessoriate subprofitable subproportional subprotector subprovince subprovincial subpubescent subpubic subpulmonary subpulverizer subpunch subpunctuation subpurchaser subpurlin subputation subpyramidal subpyriform subquadrangular subquadrate subquality subquestion subquinquefid subquintuple Subra subrace subradial subradiance subradiate subradical subradius subradular subrailway subrameal subramose subramous subrange subrational subreader subreason subrebellion subrectangular subrector subreference subregent subregion subregional subregular subreguli subregulus subrelation subreligion subreniform subrent subrepand subrepent subreport subreptary subreption subreptitious subreputable subresin subretinal subrhombic subrhomboid subrhomboidal subrictal subrident subridently subrigid subrision subrisive subrisory subrogate subrogation subroot subrostral subround subrule subruler subsacral subsale subsaline subsalt subsample subsartorial subsatiric subsatirical subsaturated subsaturation subscapular subscapularis subscapulary subschedule subscheme subschool subscience subscleral subsclerotic subscribable subscribe subscriber subscribership subscript subscription subscriptionist subscriptive subscriptively subscripture subscrive subscriver subsea subsecive subsecretarial subsecretary subsect subsection subsecurity subsecute subsecutive subsegment subsemifusa subsemitone subsensation subsensible subsensual subsensuous subsept subseptuple subsequence subsequency subsequent subsequential subsequentially subsequently subsequentness subseries subserosa subserous subserrate subserve subserviate subservience subserviency subservient subserviently subservientness subsessile subset subsewer subsextuple subshaft subsheriff subshire subshrub subshrubby subside subsidence subsidency subsident subsider subsidiarie subsidiarily subsidiariness subsidiary subsiding subsidist subsidizable subsidization subsidize subsidizer subsidy subsilicate subsilicic subsill subsimilation subsimious subsimple subsinuous subsist subsistence subsistency subsistent subsistential subsistingly subsizar subsizarship subsmile subsneer subsocial subsoil subsoiler subsolar subsolid subsonic subsorter subsovereign subspace subspatulate subspecialist subspecialize subspecialty subspecies subspecific subspecifically subsphenoidal subsphere subspherical subspherically subspinous subspiral subspontaneous subsquadron substage substalagmite substalagmitic substance substanceless substanch substandard substandardize substant substantiability substantial substantialia substantialism substantialist substantiality substantialize substantially substantialness substantiate substantiation substantiative substantiator substantify substantious substantival substantivally substantive substantively substantiveness substantivity substantivize substantize substation substernal substituent substitutable substitute substituted substituter substituting substitutingly substitution substitutional substitutionally substitutionary substitutive substitutively substock substoreroom substory substract substraction substratal substrate substrati substrative substrator substratose substratosphere substratospheric substratum substriate substruct substruction substructional substructural substructure substylar substyle subsulfid subsulfide subsulphate subsulphid subsulphide subsult subsultive subsultorily subsultorious subsultory subsultus subsumable subsume subsumption subsumptive subsuperficial subsurety subsurface subsyndicate subsynod subsynodical subsystem subtack subtacksman subtangent subtarget subtartarean subtectal subtegminal subtegulaneous subtemperate subtenancy subtenant subtend subtense subtenure subtepid subteraqueous subterbrutish subtercelestial subterconscious subtercutaneous subterethereal subterfluent subterfluous subterfuge subterhuman subterjacent subtermarine subterminal subternatural subterpose subterposition subterrane subterraneal subterranean subterraneanize subterraneanly subterraneous subterraneously subterraneousness subterranity subterraqueous subterrene subterrestrial subterritorial subterritory subtersensual subtersensuous subtersuperlative subtersurface subtertian subtext subthalamic subthalamus subthoracic subthrill subtile subtilely subtileness subtilin subtilism subtilist subtility subtilization subtilize subtilizer subtill subtillage subtilty subtitle subtitular subtle subtleness subtlety subtlist subtly subtone subtonic subtorrid subtotal subtotem subtower subtract subtracter subtraction subtractive subtrahend subtranslucent subtransparent subtransverse subtrapezoidal subtread subtreasurer subtreasurership subtreasury subtrench subtriangular subtriangulate subtribal subtribe subtribual subtrifid subtrigonal subtrihedral subtriplicate subtriplicated subtriquetrous subtrist subtrochanteric subtrochlear subtropic subtropical subtropics subtrousers subtrude subtruncate subtrunk subtuberant subtunic subtunnel subturbary subturriculate subturriculated subtutor subtwined subtype subtypical subulate subulated subulicorn Subulicornia subuliform subultimate subumbellate subumbonal subumbral subumbrella subumbrellar subuncinate subunequal subungual subunguial Subungulata subungulate subunit subuniverse suburb suburban suburbandom suburbanhood suburbanism suburbanite suburbanity suburbanization suburbanize suburbanly suburbed suburbia suburbican suburbicarian suburbicary suburethral subursine subvaginal subvaluation subvarietal subvariety subvassal subvassalage subvein subvendee subvene subvention subventionary subventioned subventionize subventitious subventive subventral subventricose subvermiform subversal subverse subversed subversion subversionary subversive subversivism subvert subvertebral subverter subvertible subvertical subverticillate subvesicular subvestment subvicar subvicarship subvillain subvirate subvirile subvisible subvitalized subvitreous subvocal subvola subwarden subwater subway subwealthy subweight subwink subworker subworkman subzonal subzone subzygomatic succade succedanea succedaneous succedaneum succedent succeed succeedable succeeder succeeding succeedingly succent succentor succenturiate succenturiation success successful successfully successfulness succession successional successionally successionist successionless successive successively successiveness successivity successless successlessly successlessness successor successoral successorship successory succi succin succinamate succinamic succinamide succinanil succinate succinct succinctly succinctness succinctorium succinctory succincture succinic succiniferous succinimide succinite succinoresinol succinosulphuric succinous succinyl Succisa succise succivorous succor succorable succorer succorful succorless succorrhea succory succotash succourful succourless succous succub succuba succubae succube succubine succubous succubus succula succulence succulency succulent succulently succulentness succulous succumb succumbence succumbency succumbent succumber succursal succuss succussation succussatory succussion succussive such suchlike suchness Suchos suchwise sucivilized suck suckable suckabob suckage suckauhock sucken suckener sucker suckerel suckerfish suckerlike suckfish suckhole sucking suckle suckler suckless suckling suckstone suclat sucramine sucrate sucre sucroacid sucrose suction suctional Suctoria suctorial suctorian suctorious sucupira sucuri sucuriu sucuruju sud sudadero sudamen sudamina sudaminal Sudan Sudanese Sudani Sudanian Sudanic sudarium sudary sudate sudation sudatorium sudatory Sudburian sudburite sudd sudden suddenly suddenness suddenty Sudder sudder suddle suddy Sudic sudiform sudoral sudoresis sudoric sudoriferous sudoriferousness sudorific sudoriparous sudorous Sudra suds sudsman sudsy Sue sue Suecism suede suer Suerre Suessiones suet suety Sueve Suevi Suevian Suevic Sufeism suff suffect suffection suffer sufferable sufferableness sufferably sufferance sufferer suffering sufferingly suffete suffice sufficeable sufficer sufficiency sufficient sufficiently sufficientness sufficing sufficingly sufficingness suffiction suffix suffixal suffixation suffixion suffixment sufflaminate sufflamination sufflate sufflation sufflue suffocate suffocating suffocatingly suffocation suffocative Suffolk suffragan suffraganal suffraganate suffragancy suffraganeous suffragatory suffrage suffragette suffragettism suffragial suffragism suffragist suffragistic suffragistically suffragitis suffrago suffrutescent suffrutex suffruticose suffruticous suffruticulose suffumigate suffumigation suffusable suffuse suffused suffusedly suffusion suffusive Sufi Sufiism Sufiistic Sufism Sufistic sugamo sugan sugar sugarberry sugarbird sugarbush sugared sugarelly sugarer sugarhouse sugariness sugarless sugarlike sugarplum sugarsweet sugarworks sugary sugent sugescent suggest suggestable suggestedness suggester suggestibility suggestible suggestibleness suggestibly suggesting suggestingly suggestion suggestionability suggestionable suggestionism suggestionist suggestionize suggestive suggestively suggestiveness suggestivity suggestment suggestress suggestum suggillate suggillation sugh sugi Sugih suguaro suhuaro Sui suicidal suicidalism suicidally suicidalwise suicide suicidical suicidism suicidist suid Suidae suidian suiform suilline suimate Suina suine suing suingly suint Suiogoth Suiogothic Suiones suisimilar suist suit suitability suitable suitableness suitably suitcase suite suithold suiting suitor suitoress suitorship suity suji Suk Sukey sukiyaki sukkenye Suku Sula Sulaba Sulafat Sulaib sulbasutra sulcal sulcalization sulcalize sulcar sulcate sulcated sulcation sulcatoareolate sulcatocostate sulcatorimose sulciform sulcomarginal sulcular sulculate sulculus sulcus suld sulea sulfa sulfacid sulfadiazine sulfaguanidine sulfamate sulfamerazin sulfamerazine sulfamethazine sulfamethylthiazole sulfamic sulfamidate sulfamide sulfamidic sulfamine sulfaminic sulfamyl sulfanilamide sulfanilic sulfanilylguanidine sulfantimonide sulfapyrazine sulfapyridine sulfaquinoxaline sulfarsenide sulfarsenite sulfarseniuret sulfarsphenamine Sulfasuxidine sulfatase sulfathiazole sulfatic sulfatize sulfato sulfazide sulfhydrate sulfhydric sulfhydryl sulfindigotate sulfindigotic sulfindylic sulfion sulfionide sulfoacid sulfoamide sulfobenzide sulfobenzoate sulfobenzoic sulfobismuthite sulfoborite sulfocarbamide sulfocarbimide sulfocarbolate sulfocarbolic sulfochloride sulfocyan sulfocyanide sulfofication sulfogermanate sulfohalite sulfohydrate sulfoindigotate sulfoleic sulfolysis sulfomethylic sulfonamic sulfonamide sulfonate sulfonation sulfonator sulfonephthalein sulfonethylmethane sulfonic sulfonium sulfonmethane sulfonyl sulfophthalein sulfopurpurate sulfopurpuric sulforicinate sulforicinic sulforicinoleate sulforicinoleic sulfoselenide sulfosilicide sulfostannide sulfotelluride sulfourea sulfovinate sulfovinic sulfowolframic sulfoxide sulfoxism sulfoxylate sulfoxylic sulfurage sulfuran sulfurate sulfuration sulfurator sulfurea sulfureous sulfureously sulfureousness sulfuret sulfuric sulfurization sulfurize sulfurosyl sulfurous sulfury sulfuryl Sulidae Sulides Suliote sulk sulka sulker sulkily sulkiness sulky sulkylike sull sulla sullage Sullan sullen sullenhearted sullenly sullenness sulliable sullow sully sulpha sulphacid sulphaldehyde sulphamate sulphamic sulphamidate sulphamide sulphamidic sulphamine sulphaminic sulphamino sulphammonium sulphamyl sulphanilate sulphanilic sulphantimonate sulphantimonial sulphantimonic sulphantimonide sulphantimonious sulphantimonite sulpharsenate sulpharseniate sulpharsenic sulpharsenide sulpharsenious sulpharsenite sulpharseniuret sulpharsphenamine sulphatase sulphate sulphated sulphatic sulphation sulphatization sulphatize sulphato sulphatoacetic sulphatocarbonic sulphazide sulphazotize sulphbismuthite sulphethylate sulphethylic sulphhemoglobin sulphichthyolate sulphidation sulphide sulphidic sulphidize sulphimide sulphinate sulphindigotate sulphine sulphinic sulphinide sulphinyl sulphitation sulphite sulphitic sulphmethemoglobin sulpho sulphoacetic sulphoamid sulphoamide sulphoantimonate sulphoantimonic sulphoantimonious sulphoantimonite sulphoarsenic sulphoarsenious sulphoarsenite sulphoazotize sulphobenzide sulphobenzoate sulphobenzoic sulphobismuthite sulphoborite sulphobutyric sulphocarbamic sulphocarbamide sulphocarbanilide sulphocarbimide sulphocarbolate sulphocarbolic sulphocarbonate sulphocarbonic sulphochloride sulphochromic sulphocinnamic sulphocyan sulphocyanate sulphocyanic sulphocyanide sulphocyanogen sulphodichloramine sulphofication sulphofy sulphogallic sulphogel sulphogermanate sulphogermanic sulphohalite sulphohaloid sulphohydrate sulphoichthyolate sulphoichthyolic sulphoindigotate sulphoindigotic sulpholeate sulpholeic sulpholipin sulpholysis sulphonal sulphonalism sulphonamic sulphonamide sulphonamido sulphonamine sulphonaphthoic sulphonate sulphonated sulphonation sulphonator sulphoncyanine sulphone sulphonephthalein sulphonethylmethane sulphonic sulphonium sulphonmethane sulphonphthalein sulphonyl sulphoparaldehyde sulphophosphate sulphophosphite sulphophosphoric sulphophosphorous sulphophthalein sulphophthalic sulphopropionic sulphoproteid sulphopupuric sulphopurpurate sulphoricinate sulphoricinic sulphoricinoleate sulphoricinoleic sulphosalicylic sulphoselenide sulphoselenium sulphosilicide sulphosol sulphostannate sulphostannic sulphostannide sulphostannite sulphostannous sulphosuccinic sulphosulphurous sulphotannic sulphotelluride sulphoterephthalic sulphothionyl sulphotoluic sulphotungstate sulphotungstic sulphourea sulphovanadate sulphovinate sulphovinic sulphowolframic sulphoxide sulphoxism sulphoxylate sulphoxylic sulphoxyphosphate sulphozincate sulphur sulphurage sulphuran sulphurate sulphuration sulphurator sulphurea sulphurean sulphureity sulphureonitrous sulphureosaline sulphureosuffused sulphureous sulphureously sulphureousness sulphureovirescent sulphuret sulphureted sulphuric sulphuriferous sulphurity sulphurization sulphurize sulphurless sulphurlike sulphurosyl sulphurous sulphurously sulphurousness sulphurproof sulphurweed sulphurwort sulphury sulphuryl sulphydrate sulphydric sulphydryl Sulpician sultam sultan sultana sultanaship sultanate sultane sultanesque sultaness sultanian sultanic sultanin sultanism sultanist sultanize sultanlike sultanry sultanship sultone sultrily sultriness sultry Sulu Suluan sulung sulvanite sulvasutra sum sumac Sumak Sumass Sumatra sumatra Sumatran sumbul sumbulic Sumdum Sumerian Sumerology Sumitro sumless sumlessness summability summable summage summand summar summarily summariness summarist summarization summarize summarizer summary summate summation summational summative summatory summed summer summerbird summercastle summerer summerhead summeriness summering summerings summerish summerite summerize summerland summerlay summerless summerlike summerliness summerling summerly summerproof summertide summertime summertree summerward summerwood summery summist summit summital summitless summity summon summonable summoner summoningly summons summula summulist summut sumner Sumo sump sumpage sumper sumph sumphish sumphishly sumphishness sumphy sumpit sumpitan sumple sumpman sumpsimus sumpter sumption sumptuary sumptuosity sumptuous sumptuously sumptuousness sun sunbeam sunbeamed sunbeamy sunberry sunbird sunblink sunbonnet sunbonneted sunbow sunbreak sunburn sunburned sunburnedness sunburnproof sunburnt sunburntness sunburst suncherchor suncup sundae Sundanese Sundanesian sundang Sundar Sundaresan sundari Sunday Sundayfied Sundayish Sundayism Sundaylike Sundayness Sundayproof sundek sunder sunderable sunderance sunderer sunderment sunderwise sundew sundial sundik sundog sundown sundowner sundowning sundra sundri sundries sundriesman sundrily sundriness sundrops sundry sundryman sune sunfall sunfast sunfish sunfisher sunfishery sunflower Sung sung sungha sunglade sunglass sunglo sunglow Sunil sunk sunken sunket sunkland sunlamp sunland sunless sunlessly sunlessness sunlet sunlight sunlighted sunlike sunlit sunn Sunna Sunni Sunniah sunnily sunniness Sunnism Sunnite sunnud sunny sunnyhearted sunnyheartedness sunproof sunquake sunray sunrise sunrising sunroom sunscald sunset sunsetting sunsetty sunshade sunshine sunshineless sunshining sunshiny sunsmit sunsmitten sunspot sunspotted sunspottedness sunspottery sunspotty sunsquall sunstone sunstricken sunstroke sunt sunup sunward sunwards sunway sunways sunweed sunwise sunyie Suomi Suomic suovetaurilia sup supa Supai supari supawn supe supellex super superabduction superabhor superability superable superableness superably superabnormal superabominable superabomination superabound superabstract superabsurd superabundance superabundancy superabundant superabundantly superaccession superaccessory superaccommodating superaccomplished superaccrue superaccumulate superaccumulation superaccurate superacetate superachievement superacid superacidulated superacknowledgment superacquisition superacromial superactive superactivity superacute superadaptable superadd superaddition superadditional superadequate superadequately superadjacent superadministration superadmirable superadmiration superadorn superadornment superaerial superaesthetical superaffiliation superaffiuence superagency superaggravation superagitation superagrarian superalbal superalbuminosis superalimentation superalkaline superalkalinity superallowance superaltar superaltern superambitious superambulacral superanal superangelic superangelical superanimal superannuate superannuation superannuitant superannuity superapology superappreciation superaqueous superarbiter superarbitrary superarctic superarduous superarrogant superarseniate superartificial superartificially superaspiration superassertion superassociate superassume superastonish superastonishment superattachment superattainable superattendant superattraction superattractive superauditor superaural superaverage superavit superaward superaxillary superazotation superb superbelief superbeloved superbenefit superbenevolent superbenign superbias superbious superbity superblessed superblunder superbly superbness superbold superborrow superbrain superbrave superbrute superbuild superbungalow superbusy supercabinet supercalender supercallosal supercandid supercanine supercanonical supercanonization supercanopy supercapable supercaption supercarbonate supercarbonization supercarbonize supercarbureted supercargo supercargoship supercarpal supercatastrophe supercatholic supercausal supercaution supercelestial supercensure supercentral supercentrifuge supercerebellar supercerebral superceremonious supercharge supercharged supercharger superchemical superchivalrous superciliary superciliosity supercilious superciliously superciliousness supercilium supercivil supercivilization supercivilized superclaim superclass superclassified supercloth supercoincidence supercolossal supercolumnar supercolumniation supercombination supercombing supercommendation supercommentary supercommentator supercommercial supercompetition supercomplete supercomplex supercomprehension supercompression superconception superconductive superconductivity superconductor superconfident superconfirmation superconformable superconformist superconformity superconfusion supercongestion superconscious superconsciousness superconsecrated superconsequency superconservative superconstitutional supercontest supercontribution supercontrol supercool supercordial supercorporation supercow supercredit supercrescence supercrescent supercrime supercritic supercritical supercrowned supercrust supercube supercultivated supercurious supercycle supercynical superdainty superdanger superdebt superdeclamatory superdecoration superdeficit superdeity superdejection superdelegate superdelicate superdemand superdemocratic superdemonic superdemonstration superdensity superdeposit superdesirous superdevelopment superdevilish superdevotion superdiabolical superdiabolically superdicrotic superdifficult superdiplomacy superdirection superdiscount superdistention superdistribution superdividend superdivine superdivision superdoctor superdominant superdomineering superdonation superdose superdramatist superdreadnought superdubious superduplication superdural superdying superearthly supereconomy superedification superedify supereducation supereffective supereffluence supereffluently superego superelaborate superelastic superelated superelegance superelementary superelevated superelevation supereligible supereloquent supereminence supereminency supereminent supereminently superemphasis superemphasize superendorse superendorsement superendow superenergetic superenforcement superengrave superenrollment superepic superepoch superequivalent supererogant supererogantly supererogate supererogation supererogative supererogator supererogatorily supererogatory superespecial superessential superessentially superestablish superestablishment supereternity superether superethical superethmoidal superevangelical superevident superexacting superexalt superexaltation superexaminer superexceed superexceeding superexcellence superexcellency superexcellent superexcellently superexceptional superexcitation superexcited superexcitement superexcrescence superexert superexertion superexiguity superexist superexistent superexpand superexpansion superexpectation superexpenditure superexplicit superexport superexpressive superexquisite superexquisitely superexquisiteness superextend superextension superextol superextreme superfamily superfantastic superfarm superfat superfecundation superfecundity superfee superfeminine superfervent superfetate superfetation superfeudation superfibrination superficial superficialism superficialist superficiality superficialize superficially superficialness superficiary superficies superfidel superfinance superfine superfinical superfinish superfinite superfissure superfit superfix superfleet superflexion superfluent superfluid superfluitance superfluity superfluous superfluously superfluousness superflux superfoliaceous superfoliation superfolly superformal superformation superformidable superfortunate superfriendly superfrontal superfructified superfulfill superfulfillment superfunction superfunctional superfuse superfusibility superfusible superfusion supergaiety supergallant supergene supergeneric supergenerosity supergenerous supergenual supergiant superglacial superglorious superglottal supergoddess supergoodness supergovern supergovernment supergraduate supergrant supergratification supergratify supergravitate supergravitation superguarantee supergun superhandsome superhearty superheat superheater superheresy superhero superheroic superhet superheterodyne superhighway superhirudine superhistoric superhistorical superhive superhuman superhumanity superhumanize superhumanly superhumanness superhumeral superhypocrite superideal superignorant superillustrate superillustration superimpend superimpending superimpersonal superimply superimportant superimposable superimpose superimposed superimposition superimposure superimpregnated superimpregnation superimprobable superimproved superincentive superinclination superinclusive superincomprehensible superincrease superincumbence superincumbency superincumbent superincumbently superindependent superindiction superindifference superindifferent superindignant superindividual superindividualism superindividualist superinduce superinducement superinduct superinduction superindulgence superindulgent superindustrious superindustry superinenarrable superinfection superinfer superinference superinfeudation superinfinite superinfinitely superinfirmity superinfluence superinformal superinfuse superinfusion superingenious superingenuity superinitiative superinjustice superinnocent superinquisitive superinsaniated superinscription superinsist superinsistence superinsistent superinstitute superinstitution superintellectual superintend superintendence superintendency superintendent superintendential superintendentship superintender superintense superintolerable superinundation superior superioress superiority superiorly superiorness superiorship superirritability superius superjacent superjudicial superjurisdiction superjustification superknowledge superlabial superlaborious superlactation superlapsarian superlaryngeal superlation superlative superlatively superlativeness superlenient superlie superlikelihood superline superlocal superlogical superloyal superlucky superlunary superlunatical superluxurious supermagnificent supermagnificently supermalate superman supermanhood supermanifest supermanism supermanliness supermanly supermannish supermarginal supermarine supermarket supermarvelous supermasculine supermaterial supermathematical supermaxilla supermaxillary supermechanical supermedial supermedicine supermediocre supermental supermentality supermetropolitan supermilitary supermishap supermixture supermodest supermoisten supermolten supermoral supermorose supermunicipal supermuscan supermystery supernacular supernaculum supernal supernalize supernally supernatant supernatation supernation supernational supernationalism supernatural supernaturaldom supernaturalism supernaturalist supernaturality supernaturalize supernaturally supernaturalness supernature supernecessity supernegligent supernormal supernormally supernormalness supernotable supernova supernumeral supernumerariness supernumerary supernumeraryship supernumerous supernutrition superoanterior superobedience superobedient superobese superobject superobjection superobjectionable superobligation superobstinate superoccipital superoctave superocular superodorsal superoexternal superoffensive superofficious superofficiousness superofrontal superointernal superolateral superomedial superoposterior superopposition superoptimal superoptimist superoratorical superorbital superordain superorder superordinal superordinary superordinate superordination superorganic superorganism superorganization superorganize superornament superornamental superosculate superoutput superoxalate superoxide superoxygenate superoxygenation superparamount superparasite superparasitic superparasitism superparliamentary superpassage superpatient superpatriotic superpatriotism superperfect superperfection superperson superpersonal superpersonalism superpetrosal superphlogisticate superphlogistication superphosphate superphysical superpigmentation superpious superplausible superplease superplus superpolite superpolitic superponderance superponderancy superponderant superpopulation superposable superpose superposed superposition superpositive superpower superpowered superpraise superprecarious superprecise superprelatical superpreparation superprinting superprobability superproduce superproduction superproportion superprosperous superpublicity superpure superpurgation superquadrupetal superqualify superquote superradical superrational superrationally superreaction superrealism superrealist superrefine superrefined superrefinement superreflection superreform superreformation superregal superregeneration superregenerative superregistration superregulation superreliance superremuneration superrenal superrequirement superrespectable superresponsible superrestriction superreward superrheumatized superrighteous superromantic superroyal supersacerdotal supersacral supersacred supersacrifice supersafe supersagacious supersaint supersaintly supersalesman supersaliency supersalient supersalt supersanction supersanguine supersanity supersarcastic supersatisfaction supersatisfy supersaturate supersaturation superscandal superscholarly superscientific superscribe superscript superscription superscrive superseaman supersecret supersecretion supersecular supersecure supersedable supersede supersedeas supersedence superseder supersedure superselect superseminate supersemination superseminator supersensible supersensibly supersensitive supersensitiveness supersensitization supersensory supersensual supersensualism supersensualist supersensualistic supersensuality supersensually supersensuous supersensuousness supersentimental superseptal superseptuaginarian superseraphical superserious superservice superserviceable superserviceableness superserviceably supersesquitertial supersession supersessive supersevere supershipment supersignificant supersilent supersimplicity supersimplify supersincerity supersingular supersistent supersize supersmart supersocial supersoil supersolar supersolemn supersolemness supersolemnity supersolemnly supersolicit supersolicitation supersolid supersonant supersonic supersovereign supersovereignty superspecialize superspecies superspecification supersphenoid supersphenoidal superspinous superspiritual superspirituality supersquamosal superstage superstamp superstandard superstate superstatesman superstimulate superstimulation superstition superstitionist superstitionless superstitious superstitiously superstitiousness superstoical superstrain superstrata superstratum superstrenuous superstrict superstrong superstruct superstruction superstructor superstructory superstructural superstructure superstuff superstylish supersublimated supersuborder supersubsist supersubstantial supersubstantiality supersubstantiate supersubtilized supersubtle supersufficiency supersufficient supersulcus supersulphate supersulphuret supersulphureted supersulphurize supersuperabundance supersuperabundant supersuperabundantly supersuperb supersuperior supersupremacy supersupreme supersurprise supersuspicious supersweet supersympathy supersyndicate supersystem supertare supertartrate supertax supertaxation supertemporal supertempt supertemptation supertension superterranean superterraneous superterrene superterrestrial superthankful superthorough superthyroidism supertoleration supertonic supertotal supertower supertragic supertragical supertrain supertramp supertranscendent supertranscendently supertreason supertrivial supertuchun supertunic supertutelary superugly superultrafrostified superunfit superunit superunity superuniversal superuniverse superurgent supervalue supervast supervene supervenience supervenient supervenosity supervention supervestment supervexation supervictorious supervigilant supervigorous supervirulent supervisal supervisance supervise supervision supervisionary supervisive supervisor supervisorial supervisorship supervisory supervisual supervisure supervital supervive supervolition supervoluminous supervolute superwager superwealthy superweening superwise superwoman superworldly superwrought superyacht superzealous supinate supination supinator supine supinely supineness suppedaneum supper suppering supperless suppertime supperwards supping supplace supplant supplantation supplanter supplantment supple supplejack supplely supplement supplemental supplementally supplementarily supplementary supplementation supplementer suppleness suppletion suppletive suppletively suppletorily suppletory suppliable supplial suppliance suppliancy suppliant suppliantly suppliantness supplicancy supplicant supplicantly supplicat supplicate supplicating supplicatingly supplication supplicationer supplicative supplicator supplicatory supplicavit supplice supplier suppling supply support supportability supportable supportableness supportably supportance supporter supportful supporting supportingly supportive supportless supportlessly supportress supposable supposableness supposably supposal suppose supposed supposedly supposer supposing supposition suppositional suppositionally suppositionary suppositionless suppositious supposititious supposititiously supposititiousness suppositive suppositively suppository suppositum suppost suppress suppressal suppressed suppressedly suppresser suppressible suppression suppressionist suppressive suppressively suppressor supprise suppurant suppurate suppuration suppurative suppuratory suprabasidorsal suprabranchial suprabuccal supracaecal supracargo supracaudal supracensorious supracentenarian suprachorioid suprachorioidal suprachorioidea suprachoroid suprachoroidal suprachoroidea supraciliary supraclavicle supraclavicular supraclusion supracommissure supraconduction supraconductor supracondylar supracondyloid supraconscious supraconsciousness supracoralline supracostal supracoxal supracranial supracretaceous supradecompound supradental supradorsal supradural suprafeminine suprafine suprafoliaceous suprafoliar supraglacial supraglenoid supraglottic supragovernmental suprahepatic suprahistorical suprahuman suprahumanity suprahyoid suprailiac suprailium supraintellectual suprainterdorsal suprajural supralabial supralapsarian supralapsarianism supralateral supralegal supraliminal supraliminally supralineal supralinear supralocal supralocally supraloral supralunar supralunary supramammary supramarginal supramarine supramastoid supramaxilla supramaxillary supramaximal suprameatal supramechanical supramedial supramental supramolecular supramoral supramortal supramundane supranasal supranational supranatural supranaturalism supranaturalist supranaturalistic supranature supranervian supraneural supranormal supranuclear supraoccipital supraocclusion supraocular supraoesophagal supraoesophageal supraoptimal supraoptional supraoral supraorbital supraorbitar supraordinary supraordinate supraordination suprapapillary suprapedal suprapharyngeal supraposition supraprotest suprapubian suprapubic suprapygal supraquantivalence supraquantivalent suprarational suprarationalism suprarationality suprarenal suprarenalectomize suprarenalectomy suprarenalin suprarenine suprarimal suprasaturate suprascapula suprascapular suprascapulary suprascript suprasegmental suprasensible suprasensitive suprasensual suprasensuous supraseptal suprasolar suprasoriferous suprasphanoidal supraspinal supraspinate supraspinatus supraspinous suprasquamosal suprastandard suprastapedial suprastate suprasternal suprastigmal suprasubtle supratemporal supraterraneous supraterrestrial suprathoracic supratonsillar supratrochlear supratropical supratympanic supravaginal supraventricular supraversion supravital supraworld supremacy suprematism supreme supremely supremeness supremity sur sura suraddition surah surahi sural suralimentation suranal surangular surat surbase surbased surbasement surbate surbater surbed surcease surcharge surcharger surcingle surcoat surcrue surculi surculigerous surculose surculous surculus surd surdation surdeline surdent surdimutism surdity surdomute sure surely sureness sures Suresh surette surety suretyship surexcitation surf surface surfaced surfacedly surfaceless surfacely surfaceman surfacer surfacing surfactant surfacy surfbird surfboard surfboarding surfboat surfboatman surfeit surfeiter surfer surficial surfle surflike surfman surfmanship surfrappe surfuse surfusion surfy surge surgeful surgeless surgent surgeon surgeoncy surgeoness surgeonfish surgeonless surgeonship surgeproof surgerize surgery surgical surgically surginess surging surgy Suriana Surianaceae Suricata suricate suriga Surinam surinamine surlily surliness surly surma surmark surmaster surmisable surmisal surmisant surmise surmised surmisedly surmiser surmount surmountable surmountableness surmountal surmounted surmounter surmullet surname surnamer surnap surnay surnominal surpass surpassable surpasser surpassing surpassingly surpassingness surpeopled surplice surpliced surplicewise surplician surplus surplusage surpreciation surprint surprisable surprisal surprise surprisedly surprisement surpriseproof surpriser surprising surprisingly surprisingness surquedry surquidry surquidy surra surrealism surrealist surrealistic surrealistically surrebound surrebut surrebuttal surrebutter surrection surrejoin surrejoinder surrenal surrender surrenderee surrenderer surrenderor surreption surreptitious surreptitiously surreptitiousness surreverence surreverently surrey surrogacy surrogate surrogateship surrogation surrosion surround surrounded surroundedly surrounder surrounding surroundings sursaturation sursolid sursumduction sursumvergence sursumversion surtax surtout surturbrand surveillance surveillant survey surveyable surveyage surveyal surveyance surveying surveyor surveyorship survigrous survivability survivable survival survivalism survivalist survivance survivancy survive surviver surviving survivor survivoress survivorship Surya Sus Susan Susanchite Susanna Susanne susannite suscept susceptance susceptibility susceptible susceptibleness susceptibly susception susceptive susceptiveness susceptivity susceptor suscitate suscitation susi Susian Susianian Susie suslik susotoxin suspect suspectable suspected suspectedness suspecter suspectful suspectfulness suspectible suspectless suspector suspend suspended suspender suspenderless suspenders suspendibility suspendible suspensation suspense suspenseful suspensely suspensibility suspensible suspension suspensive suspensively suspensiveness suspensoid suspensor suspensorial suspensorium suspensory suspercollate suspicion suspicionable suspicional suspicionful suspicionless suspicious suspiciously suspiciousness suspiration suspiratious suspirative suspire suspirious Susquehanna Sussex sussexite Sussexman sussultatory sussultorial sustain sustainable sustained sustainer sustaining sustainingly sustainment sustanedly sustenance sustenanceless sustentacula sustentacular sustentaculum sustentation sustentational sustentative sustentator sustention sustentive sustentor Susu susu Susuhunan Susuidae Susumu susurr susurrant susurrate susurration susurringly susurrous susurrus Sutaio suterbery suther Sutherlandia sutile sutler sutlerage sutleress sutlership sutlery Suto sutor sutorial sutorian sutorious sutra Suttapitaka suttee sutteeism sutten suttin suttle Sutu sutural suturally suturation suture Suu suum Suwandi suwarro suwe Suyog suz Suzan Suzanne suzerain suzeraine suzerainship suzerainty Suzy Svan Svanetian Svanish Svante Svantovit svarabhakti svarabhaktic Svarloka svelte Svetambara sviatonosite swa Swab swab swabber swabberly swabble Swabian swack swacken swacking swad swaddle swaddlebill swaddler swaddling swaddy Swadeshi Swadeshism swag swagbellied swagbelly swage swager swagger swaggerer swaggering swaggeringly swaggie swaggy swaglike swagman swagsman Swahilese Swahili Swahilian Swahilize swaimous swain swainish swainishness swainship Swainsona swainsona swaird swale swaler swaling swalingly swallet swallo swallow swallowable swallower swallowlike swallowling swallowpipe swallowtail swallowwort swam swami swamp swampable swampberry swamper swampish swampishness swampland swampside swampweed swampwood swampy Swamy swan swandown swanflower swang swangy swanherd swanhood swanimote swank swanker swankily swankiness swanking swanky swanlike swanmark swanmarker swanmarking swanneck swannecked swanner swannery swannish swanny swanskin Swantevit swanweed swanwort swap swape swapper swapping swaraj swarajism swarajist swarbie sward swardy sware swarf swarfer swarm swarmer swarming swarmy swarry swart swartback swarth swarthily swarthiness swarthness swarthy swartish swartly swartness swartrutter swartrutting swarty Swartzbois Swartzia swarve swash swashbuckle swashbuckler swashbucklerdom swashbucklering swashbucklery swashbuckling swasher swashing swashway swashwork swashy swastika swastikaed Swat swat swatch Swatchel swatcher swatchway swath swathable swathband swathe swatheable swather swathy Swati Swatow swatter swattle swaver sway swayable swayed swayer swayful swaying swayingly swayless Swazi Swaziland sweal sweamish swear swearer swearingly swearword sweat sweatband sweatbox sweated sweater sweatful sweath sweatily sweatiness sweating sweatless sweatproof sweatshop sweatweed sweaty Swede Swedenborgian Swedenborgianism Swedenborgism swedge Swedish sweeny sweep sweepable sweepage sweepback sweepboard sweepdom sweeper sweeperess sweepforward sweeping sweepingly sweepingness sweepings sweepstake sweepwasher sweepwashings sweepy sweer sweered sweet sweetberry sweetbread sweetbrier sweetbriery sweeten sweetener sweetening sweetfish sweetful sweetheart sweetheartdom sweethearted sweetheartedness sweethearting sweetheartship sweetie sweeting sweetish sweetishly sweetishness sweetleaf sweetless sweetlike sweetling sweetly sweetmaker sweetmeat sweetmouthed sweetness sweetroot sweetshop sweetsome sweetsop sweetwater sweetweed sweetwood sweetwort sweety swego swelchie swell swellage swelldom swelldoodle swelled sweller swellfish swelling swellish swellishness swellmobsman swellness swelltoad swelly swelp swelt swelter sweltering swelteringly swelth sweltry swelty swep swept swerd Swertia swerve swerveless swerver swervily swick swidge Swietenia swift swiften swifter swiftfoot swiftlet swiftlike swiftness swifty swig swigger swiggle swile swill swillbowl swiller swilltub swim swimmable swimmer swimmeret swimmily swimminess swimming swimmingly swimmingness swimmist swimmy swimsuit swimy Swinburnesque Swinburnian swindle swindleable swindledom swindler swindlership swindlery swindling swindlingly swine swinebread swinecote swinehead swineherd swineherdship swinehood swinehull swinelike swinely swinepipe swinery swinestone swinesty swiney swing swingable swingback swingdevil swingdingle swinge swingeing swinger swinging swingingly Swingism swingle swinglebar swingletail swingletree swingstock swingtree swingy swinish swinishly swinishness swink swinney swipe swiper swipes swiple swipper swipy swird swire swirl swirlingly swirly swirring swish swisher swishing swishingly swishy Swiss swiss Swissess swissing switch switchback switchbacker switchboard switched switchel switcher switchgear switching switchkeeper switchlike switchman switchy switchyard swith swithe swithen swither Swithin Switzer Switzeress swivel swiveled swiveleye swiveleyed swivellike swivet swivetty swiz swizzle swizzler swob swollen swollenly swollenness swom swonken swoon swooned swooning swooningly swoony swoop swooper swoosh sword swordbill swordcraft swordfish swordfisherman swordfishery swordfishing swordick swording swordless swordlet swordlike swordmaker swordmaking swordman swordmanship swordplay swordplayer swordproof swordsman swordsmanship swordsmith swordster swordstick swordswoman swordtail swordweed swore sworn swosh swot swotter swounds swow swum swung swungen swure syagush sybarism sybarist Sybarital Sybaritan Sybarite Sybaritic Sybaritical Sybaritically Sybaritish sybaritism Sybil sybotic sybotism sycamine sycamore syce sycee sychnocarpous sycock sycoma sycomancy Sycon Syconaria syconarian syconate Sycones syconid Syconidae syconium syconoid syconus sycophancy sycophant sycophantic sycophantical sycophantically sycophantish sycophantishly sycophantism sycophantize sycophantry sycosiform sycosis Syd Sydneian Sydneyite sye Syed syenite syenitic syenodiorite syenogabbro sylid syllab syllabarium syllabary syllabatim syllabation syllabe syllabi syllabic syllabical syllabically syllabicate syllabication syllabicness syllabification syllabify syllabism syllabize syllable syllabled syllabus syllepsis sylleptic sylleptical sylleptically Syllidae syllidian Syllis sylloge syllogism syllogist syllogistic syllogistical syllogistically syllogistics syllogization syllogize syllogizer sylph sylphic sylphid sylphidine sylphish sylphize sylphlike Sylphon sylphy sylva sylvae sylvage Sylvan sylvan sylvanesque sylvanite sylvanitic sylvanity sylvanize sylvanly sylvanry sylvate sylvatic Sylvester sylvester sylvestral sylvestrene Sylvestrian sylvestrian Sylvestrine Sylvia Sylvian sylvic Sylvicolidae sylvicoline Sylviidae Sylviinae sylviine sylvine sylvinite sylvite symbasic symbasical symbasically symbasis symbiogenesis symbiogenetic symbiogenetically symbion symbiont symbiontic symbionticism symbiosis symbiot symbiote symbiotic symbiotically symbiotics symbiotism symbiotrophic symblepharon symbol symbolaeography symbolater symbolatrous symbolatry symbolic symbolical symbolically symbolicalness symbolicly symbolics symbolism symbolist symbolistic symbolistical symbolistically symbolization symbolize symbolizer symbolofideism symbological symbologist symbolography symbology symbololatry symbolology symbolry symbouleutic symbranch Symbranchia symbranchiate symbranchoid symbranchous symmachy symmedian symmelia symmelian symmelus symmetalism symmetral symmetric symmetrical symmetricality symmetrically symmetricalness symmetrist symmetrization symmetrize symmetroid symmetrophobia symmetry symmorphic symmorphism sympalmograph sympathectomize sympathectomy sympathetectomy sympathetic sympathetical sympathetically sympatheticism sympatheticity sympatheticness sympatheticotonia sympatheticotonic sympathetoblast sympathicoblast sympathicotonia sympathicotonic sympathicotripsy sympathism sympathist sympathize sympathizer sympathizing sympathizingly sympathoblast sympatholysis sympatholytic sympathomimetic sympathy sympatric sympatry Sympetalae sympetalous Symphalangus symphenomena symphenomenal symphile symphilic symphilism symphilous symphily symphogenous symphonetic symphonia symphonic symphonically symphonion symphonious symphoniously symphonist symphonize symphonous symphony Symphoricarpos symphoricarpous symphrase symphronistic symphyantherous symphycarpous Symphyla symphylan symphyllous symphylous symphynote symphyogenesis symphyogenetic symphyostemonous symphyseal symphyseotomy symphysial symphysian symphysic symphysion symphysiotomy symphysis symphysodactylia symphysotomy symphysy Symphyta symphytic symphytically symphytism symphytize Symphytum sympiesometer symplasm symplectic Symplegades symplesite Symplocaceae symplocaceous Symplocarpus symploce Symplocos sympode sympodia sympodial sympodially sympodium sympolity symposia symposiac symposiacal symposial symposiarch symposiast symposiastic symposion symposium symptom symptomatic symptomatical symptomatically symptomatics symptomatize symptomatography symptomatological symptomatologically symptomatology symptomical symptomize symptomless symptosis symtomology synacme synacmic synacmy synactic synadelphite synaeresis synagogal synagogian synagogical synagogism synagogist synagogue synalgia synalgic synallactic synallagmatic synaloepha synanastomosis synange synangia synangial synangic synangium synanthema synantherological synantherologist synantherology synantherous synanthesis synanthetic synanthic synanthous synanthrose synanthy synaphea synaposematic synapse synapses Synapsida synapsidan synapsis synaptai synaptase synapte synaptene Synaptera synapterous synaptic synaptical synaptically synapticula synapticulae synapticular synapticulate synapticulum Synaptosauria synaptychus synarchical synarchism synarchy synarmogoid Synarmogoidea synarquism synartesis synartete synartetic synarthrodia synarthrodial synarthrodially synarthrosis Synascidiae synascidian synastry synaxar synaxarion synaxarist synaxarium synaxary synaxis sync Syncarida syncarp syncarpia syncarpium syncarpous syncarpy syncategorematic syncategorematical syncategorematically syncategoreme syncephalic syncephalus syncerebral syncerebrum synch synchitic synchondoses synchondrosial synchondrosially synchondrosis synchondrotomy synchoresis synchro synchroflash synchromesh synchronal synchrone synchronic synchronical synchronically synchronism synchronistic synchronistical synchronistically synchronizable synchronization synchronize synchronized synchronizer synchronograph synchronological synchronology synchronous synchronously synchronousness synchrony synchroscope synchrotron synchysis Synchytriaceae Synchytrium syncladous synclastic synclinal synclinally syncline synclinical synclinore synclinorial synclinorian synclinorium synclitic syncliticism synclitism syncoelom syncopal syncopate syncopated syncopation syncopator syncope syncopic syncopism syncopist syncopize syncotyledonous syncracy syncraniate syncranterian syncranteric syncrasy syncretic syncretical syncreticism syncretion syncretism syncretist syncretistic syncretistical syncretize syncrisis Syncrypta syncryptic syncytia syncytial syncytioma syncytiomata syncytium syndactyl syndactylia syndactylic syndactylism syndactylous syndactyly syndectomy synderesis syndesis syndesmectopia syndesmitis syndesmography syndesmology syndesmoma Syndesmon syndesmoplasty syndesmorrhaphy syndesmosis syndesmotic syndesmotomy syndetic syndetical syndetically syndic syndical syndicalism syndicalist syndicalistic syndicalize syndicate syndicateer syndication syndicator syndicship syndoc syndrome syndromic syndyasmian Syndyoceras syne synecdoche synecdochic synecdochical synecdochically synecdochism synechia synechiological synechiology synechological synechology synechotomy synechthran synechthry synecology synecphonesis synectic synecticity Synedra synedral Synedria synedria synedrial synedrian Synedrion synedrion Synedrium synedrium synedrous syneidesis synema synemmenon synenergistic synenergistical synenergistically synentognath Synentognathi synentognathous syneresis synergastic synergetic synergia synergic synergically synergid synergidae synergidal synergism synergist synergistic synergistical synergistically synergize synergy synerize synesis synesthesia synesthetic synethnic syngamic syngamous syngamy Syngenesia syngenesian syngenesious syngenesis syngenetic syngenic syngenism syngenite Syngnatha Syngnathi syngnathid Syngnathidae syngnathoid syngnathous Syngnathus syngraph synizesis synkaryon synkatathesis synkinesia synkinesis synkinetic synneurosis synneusis synochoid synochus synocreate synod synodal synodalian synodalist synodally synodical synodically synodist synodite synodontid Synodontidae synodontoid synodsman Synodus synoecete synoeciosis synoecious synoeciously synoeciousness synoecism synoecize synoecy synoicous synomosy synonym synonymatic synonymic synonymical synonymicon synonymics synonymist synonymity synonymize synonymous synonymously synonymousness synonymy synophthalmus synopses synopsis synopsize synopsy synoptic synoptical synoptically Synoptist synoptist Synoptistic synorchidism synorchism synorthographic synosteology synosteosis synostose synostosis synostotic synostotical synostotically synousiacs synovectomy synovia synovial synovially synoviparous synovitic synovitis synpelmous synrhabdosome synsacral synsacrum synsepalous synspermous synsporous syntactic syntactical syntactically syntactician syntactics syntagma syntan syntasis syntax syntaxis syntaxist syntechnic syntectic syntelome syntenosis synteresis syntexis syntheme synthermal syntheses synthesis synthesism synthesist synthesization synthesize synthesizer synthete synthetic synthetical synthetically syntheticism synthetism synthetist synthetization synthetize synthetizer synthol synthroni synthronoi synthronos synthronus syntomia syntomy syntone syntonic syntonical syntonically syntonin syntonization syntonize syntonizer syntonolydian syntonous syntony syntripsis syntrope syntrophic syntropic syntropical syntropy syntype syntypic syntypicism Synura synusia synusiast syodicon sypher syphilide syphilidography syphilidologist syphiliphobia syphilis syphilitic syphilitically syphilization syphilize syphiloderm syphilodermatous syphilogenesis syphilogeny syphilographer syphilography syphiloid syphilologist syphilology syphiloma syphilomatous syphilophobe syphilophobia syphilophobic syphilopsychosis syphilosis syphilous Syracusan syre Syriac Syriacism Syriacist Syrian Syrianic Syrianism Syrianize Syriarch Syriasm syringa syringadenous syringe syringeal syringeful syringes syringin syringitis syringium syringocoele syringomyelia syringomyelic syringotome syringotomy syrinx Syriologist Syrma syrma Syrmian Syrnium Syrophoenician syrphian syrphid Syrphidae syrt syrtic Syrtis syrup syruped syruper syruplike syrupy Syryenian syssarcosis syssel sysselman syssiderite syssitia syssition systaltic systasis systatic system systematic systematical systematicality systematically systematician systematicness systematics systematism systematist systematization systematize systematizer systematology systemed systemic systemically systemist systemizable systemization systemize systemizer systemless systemproof systemwise systilius systolated systole systolic systyle systylous Syun syzygetic syzygetically syzygial syzygium syzygy szaibelyite Szekler szlachta szopelka T t ta taa Taal Taalbond taar Tab tab tabacin tabacosis tabacum tabanid Tabanidae tabaniform tabanuco Tabanus tabard tabarded tabaret Tabasco tabasheer tabashir tabaxir tabbarea tabber tabbinet Tabby tabby Tabebuia tabefaction tabefy tabella Tabellaria Tabellariaceae tabellion taberdar taberna tabernacle tabernacler tabernacular Tabernaemontana tabernariae tabes tabescence tabescent tabet tabetic tabetiform tabetless tabic tabid tabidly tabidness tabific tabifical tabinet Tabira Tabitha tabitude tabla tablature table tableau tableaux tablecloth tableclothwise tableclothy tabled tablefellow tablefellowship tableful tableity tableland tableless tablelike tablemaid tablemaker tablemaking tableman tablemate tabler tables tablespoon tablespoonful tablet tabletary tableware tablewise tabling tablinum Tabloid tabloid tabog taboo tabooism tabooist taboot taboparalysis taboparesis taboparetic tabophobia tabor taborer taboret taborin Taborite tabour tabourer tabouret tabret Tabriz tabu tabula tabulable tabular tabulare tabularium tabularization tabularize tabularly tabulary Tabulata tabulate tabulated tabulation tabulator tabulatory tabule tabuliform tabut tacahout tacamahac Tacana Tacanan Tacca Taccaceae taccaceous taccada tach Tachardia Tachardiinae tache tacheless tacheography tacheometer tacheometric tacheometry tacheture tachhydrite tachibana Tachina Tachinaria tachinarian tachinid Tachinidae tachiol tachistoscope tachistoscopic tachogram tachograph tachometer tachometry tachoscope tachycardia tachycardiac tachygen tachygenesis tachygenetic tachygenic tachyglossal tachyglossate Tachyglossidae Tachyglossus tachygraph tachygrapher tachygraphic tachygraphical tachygraphically tachygraphist tachygraphometer tachygraphometry tachygraphy tachyhydrite tachyiatry tachylalia tachylite tachylyte tachylytic tachymeter tachymetric tachymetry tachyphagia tachyphasia tachyphemia tachyphrasia tachyphrenia tachypnea tachyscope tachyseism tachysterol tachysystole tachythanatous tachytomy tachytype tacit Tacitean tacitly tacitness taciturn taciturnist taciturnity taciturnly tack tacker tacket tackety tackey tackiness tacking tackingly tackle tackled tackleless tackleman tackler tackless tackling tackproof tacksman tacky taclocus tacmahack tacnode Taconian Taconic taconite tacso Tacsonia tact tactable tactful tactfully tactfulness tactic tactical tactically tactician tactics tactile tactilist tactility tactilogical tactinvariant taction tactite tactive tactless tactlessly tactlessness tactometer tactor tactosol tactual tactualist tactuality tactually tactus tacuacine Taculli Tad tad tade Tadjik Tadousac tadpole tadpoledom tadpolehood tadpolelike tadpolism tae tael taen taenia taeniacidal taeniacide Taeniada taeniafuge taenial taenian taeniasis Taeniata taeniate taenicide Taenidia taenidium taeniform taenifuge taeniiform Taeniobranchia taeniobranchiate Taeniodonta Taeniodontia Taeniodontidae Taenioglossa taenioglossate taenioid taeniosome Taeniosomi taeniosomous taenite taennin Taetsia taffarel tafferel taffeta taffety taffle taffrail Taffy taffy taffylike taffymaker taffymaking taffywise tafia tafinagh taft tafwiz tag Tagabilis Tagakaolo Tagal Tagala Tagalize Tagalo Tagalog tagasaste Tagassu Tagassuidae tagatose Tagaur Tagbanua tagboard Tagetes tagetol tagetone tagged tagger taggle taggy Taghlik tagilite Tagish taglet Tagliacotian Tagliacozzian taglike taglock tagrag tagraggery tagsore tagtail tagua taguan Tagula tagwerk taha Tahami taheen tahil tahin Tahiti Tahitian tahkhana Tahltan tahr tahseeldar tahsil tahsildar Tahsin tahua Tai tai taiaha taich taiga taigle taiglesome taihoa taikhana tail tailage tailband tailboard tailed tailender tailer tailet tailfirst tailflower tailforemost tailge tailhead tailing tailings taille tailless taillessly taillessness taillie taillight taillike tailor tailorage tailorbird tailorcraft tailordom tailoress tailorhood tailoring tailorism tailorization tailorize tailorless tailorlike tailorly tailorman tailorship tailorwise tailory tailpiece tailpin tailpipe tailrace tailsman tailstock Tailte tailward tailwards tailwise taily tailzee tailzie taimen taimyrite tain Tainan Taino taint taintable taintless taintlessly taintlessness taintment taintor taintproof tainture taintworm Tainui taipan Taipi Taiping taipo tairge tairger tairn taisch taise Taisho taissle taistrel taistril Tait tait taiver taivers taivert Taiwanhemp Taiyal taj Tajik takable takamaka Takao takar Takayuki take takedown takedownable takeful Takelma taken taker Takeuchi Takhaar Takhtadjy Takilman takin taking takingly takingness takings Takitumu takosis takt Taku taky takyr Tal tal tala talabon talahib Talaing talaje talak talalgia Talamanca Talamancan talanton talao talapoin talar talari talaria talaric talayot talbot talbotype talc talcer Talcher talcky talclike talcochlorite talcoid talcomicaceous talcose talcous talcum tald tale talebearer talebearing talebook talecarrier talecarrying taled taleful Talegallinae Talegallus talemaster talemonger talemongering talent talented talentless talepyet taler tales talesman taleteller taletelling tali Taliacotian taliage taliation taliera taligrade Talinum talion talionic talipat taliped talipedic talipes talipomanus talipot talis talisay Talishi talisman talismanic talismanical talismanically talismanist talite Talitha talitol talk talkability talkable talkathon talkative talkatively talkativeness talker talkfest talkful talkie talkiness talking talkworthy talky tall tallage tallageability tallageable tallboy tallegalane taller tallero talles tallet talliable talliage talliar talliate tallier tallis tallish tallit tallith tallness talloel tallote tallow tallowberry tallower tallowiness tallowing tallowish tallowlike tallowmaker tallowmaking tallowman tallowroot tallowweed tallowwood tallowy tallwood tally tallyho tallyman tallymanship tallywag tallywalka tallywoman talma talmouse Talmud Talmudic Talmudical Talmudism Talmudist Talmudistic Talmudistical Talmudization Talmudize talocalcaneal talocalcanean talocrural talofibular talon talonavicular taloned talonic talonid taloscaphoid talose talotibial Talpa talpacoti talpatate talpetate talpicide talpid Talpidae talpiform talpify talpine talpoid talthib Taltushtuntude Taluche Taluhet taluk taluka talukdar talukdari talus taluto talwar talwood Talyshin tam Tama tamability tamable tamableness tamably Tamaceae Tamachek tamacoare tamale Tamanac Tamanaca Tamanaco tamandu tamandua tamanoas tamanoir tamanowus tamanu Tamara tamara tamarack tamaraite tamarao Tamaricaceae tamaricaceous tamarin tamarind Tamarindus tamarisk Tamarix Tamaroa tamas tamasha Tamashek Tamaulipecan tambac tambaroora tamber tambo tamboo Tambookie tambookie tambor Tambouki tambour tamboura tambourer tambouret tambourgi tambourin tambourinade tambourine tambourist tambreet Tambuki tamburan tamburello Tame tame tamehearted tameheartedness tamein tameless tamelessly tamelessness tamely tameness tamer Tamerlanism Tamias tamidine Tamil Tamilian Tamilic tamis tamise tamlung Tammanial Tammanize Tammany Tammanyism Tammanyite Tammanyize tammie tammock Tammy tammy Tamonea Tamoyo tamp tampala tampan tampang tamper tamperer tamperproof tampin tamping tampion tampioned tampon tamponade tamponage tamponment tampoon Tamul Tamulian Tamulic Tamus Tamworth Tamzine tan tana tanacetin tanacetone Tanacetum tanacetyl tanach tanager Tanagra Tanagraean Tanagridae tanagrine tanagroid Tanaidacea tanaist tanak Tanaka Tanala tanan tanbark tanbur tancel Tanchelmian tanchoir tandan tandem tandemer tandemist tandemize tandemwise tandle tandour Tandy tane tanekaha Tang tang tanga Tangaloa tangalung tangantangan Tangaridae Tangaroa Tangaroan tanged tangeite tangelo tangence tangency tangent tangental tangentally tangential tangentiality tangentially tangently tanger Tangerine tangfish tangham tanghan tanghin Tanghinia tanghinin tangi tangibile tangibility tangible tangibleness tangibly tangie Tangier tangilin Tangipahoa tangka tanglad tangle tangleberry tanglefish tanglefoot tanglement tangleproof tangler tangleroot tanglesome tangless tanglewrack tangling tanglingly tangly tango tangoreceptor tangram tangs tangue tanguile tangum tangun Tangut tangy tanh tanha tanhouse tania tanica tanier tanist tanistic tanistry tanistship Tanite Tanitic tanjib tanjong tank tanka tankage tankah tankard tanked tanker tankerabogus tankert tankette tankful tankle tankless tanklike tankmaker tankmaking tankman tankodrome tankroom tankwise tanling tannable tannage tannaic tannaim tannaitic tannalbin tannase tannate tanned tanner tannery tannic tannide tanniferous tannin tannined tanning tanninlike tannocaffeic tannogallate tannogallic tannogelatin tannogen tannoid tannometer tannyl Tano tanoa Tanoan tanproof tanquam Tanquelinian tanquen tanrec tanstuff tansy tantadlin tantafflin tantalate Tantalean Tantalian Tantalic tantalic tantaliferous tantalifluoride tantalite tantalization tantalize tantalizer tantalizingly tantalizingness tantalofluoride tantalum Tantalus tantamount tantara tantarabobus tantarara tanti tantivy tantle Tantony tantra tantric tantrik tantrism tantrist tantrum tantum tanwood tanworks Tanya tanyard Tanyoan Tanystomata tanystomatous tanystome tanzeb tanzib Tanzine tanzy Tao tao Taoism Taoist Taoistic Taonurus Taos taotai taoyin tap Tapa tapa Tapachula Tapachulteca tapacolo tapaculo Tapacura tapadera tapadero Tapajo tapalo tapamaker tapamaking tapas tapasvi Tape tape Tapeats tapeinocephalic tapeinocephalism tapeinocephaly tapeless tapelike tapeline tapemaker tapemaking tapeman tapen taper taperbearer tapered taperer tapering taperingly taperly tapermaker tapermaking taperness taperwise tapesium tapestring tapestry tapestrylike tapet tapetal tapete tapeti tapetless tapetum tapework tapeworm taphephobia taphole taphouse Taphria Taphrina Taphrinaceae tapia Tapijulapane tapinceophalism tapinocephalic tapinocephaly Tapinoma tapinophobia tapinophoby tapinosis tapioca tapir Tapiridae tapiridian tapirine Tapiro tapiroid Tapirus tapis tapism tapist taplash taplet Tapleyism tapmost tapnet tapoa Taposa tapoun tappa tappable tappableness tappall tappaul tappen tapper tapperer Tappertitian tappet tappietoorie tapping tappoon Taprobane taproom taproot taprooted taps tapster tapsterlike tapsterly tapstress tapu tapul Tapuya Tapuyan Tapuyo taqua tar tara tarabooka taraf tarafdar tarage Tarahumar Tarahumara Tarahumare Tarahumari Tarai tarairi tarakihi Taraktogenos taramellite Taramembe Taranchi tarand Tarandean Tarandian tarantara tarantass tarantella tarantism tarantist tarantula tarantular tarantulary tarantulated tarantulid Tarantulidae tarantulism tarantulite tarantulous tarapatch taraph tarapin Tarapon Tarasc Tarascan Tarasco tarassis tarata taratah taratantara taratantarize tarau taraxacerin taraxacin Taraxacum Tarazed tarbadillo tarbet tarboard tarbogan tarboggin tarboosh tarbooshed tarboy tarbrush tarbush tarbuttite Tardenoisian Tardigrada tardigrade tardigradous tardily tardiness tarditude tardive tardle tardy tare tarea tarefa tarefitch tarentala tarente Tarentine tarentism tarentola tarepatch Tareq tarfa tarflower targe targeman targer target targeted targeteer targetlike targetman Targum Targumic Targumical Targumist Targumistic Targumize Tarheel Tarheeler tarhood tari Tariana tarie tariff tariffable tariffication tariffism tariffist tariffite tariffize tariffless tarin Tariri tariric taririnic tarish Tarkalani Tarkani tarkashi tarkeean tarkhan tarlatan tarlataned tarletan tarlike tarltonize Tarmac tarmac tarman Tarmi tarmined tarn tarnal tarnally tarnation tarnish tarnishable tarnisher tarnishment tarnishproof tarnlike tarnside taro taroc tarocco tarok taropatch tarot tarp tarpan tarpaulin tarpaulinmaker Tarpeia Tarpeian tarpon tarpot tarpum Tarquin Tarquinish tarr tarrack tarradiddle tarradiddler tarragon tarragona tarras tarrass Tarrateen Tarratine tarred tarrer tarri tarriance tarrie tarrier tarrify tarrily tarriness tarrish tarrock tarrow tarry tarrying tarryingly tarryingness tars tarsadenitis tarsal tarsale tarsalgia tarse tarsectomy tarsectopia tarsi tarsia tarsier Tarsiidae tarsioid Tarsipedidae Tarsipedinae Tarsipes tarsitis Tarsius tarsochiloplasty tarsoclasis tarsomalacia tarsome tarsometatarsal tarsometatarsus tarsonemid Tarsonemidae Tarsonemus tarsophalangeal tarsophyma tarsoplasia tarsoplasty tarsoptosis tarsorrhaphy tarsotarsal tarsotibal tarsotomy tarsus tart tartago Tartan tartan tartana tartane Tartar tartar tartarated Tartarean Tartareous tartareous tartaret Tartarian Tartaric tartaric Tartarin tartarish Tartarism Tartarization tartarization Tartarize tartarize Tartarized Tartarlike tartarly Tartarology tartarous tartarproof tartarum Tartarus Tartary tartemorion tarten tartish tartishly tartle tartlet tartly tartness tartramate tartramic tartramide tartrate tartrated tartratoferric tartrazine tartrazinic tartro tartronate tartronic tartronyl tartronylurea tartrous tartryl tartrylic Tartufe tartufery tartufian tartufish tartufishly tartufism tartwoman Taruma Tarumari tarve Tarvia tarweed tarwhine tarwood tarworks taryard Taryba Tarzan Tarzanish tasajo tascal tasco taseometer tash tasheriff tashie tashlik Tashnagist Tashnakist tashreef tashrif Tasian tasimeter tasimetric tasimetry task taskage tasker taskit taskless tasklike taskmaster taskmastership taskmistress tasksetter tasksetting taskwork taslet Tasmanian tasmanite Tass tass tassago tassah tassal tassard tasse tassel tasseler tasselet tasselfish tassellus tasselmaker tasselmaking tassely tasser tasset tassie tassoo tastable tastableness tastably taste tasteable tasteableness tasteably tasted tasteful tastefully tastefulness tastekin tasteless tastelessly tastelessness tasten taster tastily tastiness tasting tastingly tasty tasu Tat tat Tatar Tatarian Tataric Tatarization Tatarize Tatary tataupa tatbeb tatchy tate tater Tates tath Tatian Tatianist tatie tatinek tatler tatou tatouay tatpurusha Tatsanottine tatsman tatta tatter tatterdemalion tatterdemalionism tatterdemalionry tattered tatteredly tatteredness tatterly tatterwallop tattery tatther tattied tatting tattle tattlement tattler tattlery tattletale tattling tattlingly tattoo tattooage tattooer tattooing tattooist tattooment tattva tatty Tatu tatu tatukira Tatusia Tatusiidae tau Taube Tauchnitz taught taula Tauli taum taun Taungthu taunt taunter taunting tauntingly tauntingness Taunton tauntress taupe taupo taupou taur tauranga taurean Tauri Taurian taurian Tauric tauric tauricide tauricornous Taurid Tauridian tauriferous tauriform taurine Taurini taurite taurobolium tauroboly taurocephalous taurocholate taurocholic taurocol taurocolla Tauroctonus taurodont tauroesque taurokathapsia taurolatry tauromachian tauromachic tauromachy tauromorphic tauromorphous taurophile taurophobe Tauropolos Taurotragus Taurus tauryl taut tautaug tauted tautegorical tautegory tauten tautirite tautit tautly tautness tautochrone tautochronism tautochronous tautog tautologic tautological tautologically tautologicalness tautologism tautologist tautologize tautologizer tautologous tautologously tautology tautomer tautomeral tautomeric tautomerism tautomerizable tautomerization tautomerize tautomery tautometer tautometric tautometrical tautomorphous tautonym tautonymic tautonymy tautoousian tautoousious tautophonic tautophonical tautophony tautopodic tautopody tautosyllabic tautotype tautourea tautousian tautousious tautozonal tautozonality tav Tavast Tavastian Tave tave tavell taver tavern taverner tavernize tavernless tavernlike tavernly tavernous tavernry tavernwards tavers tavert Tavghi tavistockite tavola tavolatite Tavy taw tawa tawdered tawdrily tawdriness tawdry tawer tawery Tawgi tawie tawite tawkee tawkin tawn tawney tawnily tawniness tawnle tawny tawpi tawpie taws tawse tawtie tax taxability taxable taxableness taxably Taxaceae taxaceous taxameter taxaspidean taxation taxational taxative taxatively taxator taxeater taxeating taxed taxeme taxemic taxeopod Taxeopoda taxeopodous taxeopody taxer taxgatherer taxgathering taxi taxiable taxiarch taxiauto taxibus taxicab Taxidea taxidermal taxidermic taxidermist taxidermize taxidermy taximan taximeter taximetered taxine taxing taxingly taxinomic taxinomist taxinomy taxiplane taxis taxite taxitic taxless taxlessly taxlessness taxman Taxodiaceae Taxodium taxodont taxology taxometer taxon taxonomer taxonomic taxonomical taxonomically taxonomist taxonomy taxor taxpaid taxpayer taxpaying Taxus taxwax taxy tay Tayassu Tayassuidae tayer Taygeta tayir Taylor Taylorism Taylorite taylorite Taylorize tayra Tayrona taysaam tazia Tcawi tch tchai tcharik tchast tche tcheirek Tcheka Tcherkess tchervonets tchervonetz Tchetchentsish Tchetnitsi Tchi tchick tchu Tchwi tck Td te tea teaberry teaboard teabox teaboy teacake teacart teach teachability teachable teachableness teachably teache teacher teacherage teacherdom teacheress teacherhood teacherless teacherlike teacherly teachership teachery teaching teachingly teachless teachment teachy teacup teacupful tead teadish teaer teaey teagardeny teagle Teague Teagueland Teaguelander teahouse teaish teaism teak teakettle teakwood teal tealeafy tealery tealess teallite team teamaker teamaking teaman teameo teamer teaming teamland teamless teamman teammate teamsman teamster teamwise teamwork tean teanal teap teapot teapotful teapottykin teapoy tear tearable tearableness tearably tearage tearcat teardown teardrop tearer tearful tearfully tearfulness tearing tearless tearlessly tearlessness tearlet tearlike tearoom tearpit tearproof tearstain teart tearthroat tearthumb teary teasable teasableness teasably tease teaseable teaseableness teaseably teasehole teasel teaseler teaseller teasellike teaselwort teasement teaser teashop teasiness teasing teasingly teasler teaspoon teaspoonful teasy teat teataster teated teatfish teathe teather teatime teatlike teatling teatman teaty teave teaware teaze teazer tebbet Tebet Tebeth Tebu tec Teca teca tecali Tech tech techily techiness technetium technic technica technical technicalism technicalist technicality technicalize technically technicalness technician technicism technicist technicological technicology Technicolor technicon technics techniphone technique techniquer technism technist technocausis technochemical technochemistry technocracy technocrat technocratic technographer technographic technographical technographically technography technolithic technologic technological technologically technologist technologue technology technonomic technonomy technopsychology techous techy teck Tecla tecnoctonia tecnology Teco Tecoma tecomin tecon Tecpanec tectal tectibranch Tectibranchia tectibranchian Tectibranchiata tectibranchiate tectiform tectocephalic tectocephaly tectological tectology Tectona tectonic tectonics tectorial tectorium Tectosages tectosphere tectospinal Tectospondyli tectospondylic tectospondylous tectrices tectricial tectum tecum tecuma Tecuna Ted ted Teda tedder Teddy tedescan tedge tediosity tedious tediously tediousness tediousome tedisome tedium tee teedle teel teem teemer teemful teemfulness teeming teemingly teemingness teemless teems teen teenage teenet teens teensy teenty teeny teer teerer teest Teeswater teet teetaller teetan teeter teeterboard teeterer teetertail teeth teethache teethbrush teethe teethful teethily teething teethless teethlike teethridge teethy teeting teetotal teetotaler teetotalism teetotalist teetotally teetotum teetotumism teetotumize teetotumwise teety teevee teewhaap teff teg Tegean Tegeticula tegmen tegmental tegmentum tegmina tegminal Tegmine tegua teguexin Teguima tegula tegular tegularly tegulated tegumen tegument tegumental tegumentary tegumentum tegurium Teheran tehseel tehseeldar tehsil tehsildar Tehuantepecan Tehueco Tehuelche Tehuelchean Tehuelet Teian teicher teiglech Teiidae teil teind teindable teinder teinland teinoscope teioid Teiresias Tejon tejon teju tekiah Tekintsi Tekke tekke tekken Tekkintzi teknonymous teknonymy tektite tekya telacoustic telakucha telamon telang telangiectasia telangiectasis telangiectasy telangiectatic telangiosis Telanthera telar telarian telary telautogram telautograph telautographic telautographist telautography telautomatic telautomatically telautomatics Telchines Telchinic tele teleanemograph teleangiectasia telebarograph telebarometer telecast telecaster telechemic telechirograph telecinematography telecode telecommunication telecryptograph telectroscope teledendrion teledendrite teledendron teledu telega telegenic Telegn telegnosis telegnostic telegonic telegonous telegony telegram telegrammatic telegrammic telegraph telegraphee telegrapheme telegrapher telegraphese telegraphic telegraphical telegraphically telegraphist telegraphone telegraphophone telegraphoscope telegraphy Telegu telehydrobarometer Telei Teleia teleianthous teleiosis telekinematography telekinesis telekinetic telelectric telelectrograph telelectroscope telemanometer Telemark telemark Telembi telemechanic telemechanics telemechanism telemetacarpal telemeteorograph telemeteorographic telemeteorography telemeter telemetric telemetrical telemetrist telemetrograph telemetrographic telemetrography telemetry telemotor telencephal telencephalic telencephalon telenergic telenergy teleneurite teleneuron Telenget telengiscope Telenomus teleobjective Teleocephali teleocephalous Teleoceras Teleodesmacea teleodesmacean teleodesmaceous teleodont teleologic teleological teleologically teleologism teleologist teleology teleometer teleophobia teleophore teleophyte teleoptile teleorganic teleoroentgenogram teleoroentgenography teleosaur teleosaurian Teleosauridae Teleosaurus teleost teleostean Teleostei teleosteous teleostomate teleostome Teleostomi teleostomian teleostomous teleotemporal teleotrocha teleozoic teleozoon telepathic telepathically telepathist telepathize telepathy telepheme telephone telephoner telephonic telephonical telephonically telephonist telephonograph telephonographic telephony telephote telephoto telephotograph telephotographic telephotography Telephus telepicture teleplasm teleplasmic teleplastic telepost teleprinter teleradiophone teleran telergic telergical telergically telergy telescope telescopic telescopical telescopically telescopiform telescopist Telescopium telescopy telescriptor teleseism teleseismic teleseismology teleseme telesia telesis telesmeter telesomatic telespectroscope telestereograph telestereography telestereoscope telesterion telesthesia telesthetic telestial telestic telestich teletactile teletactor teletape teletherapy telethermogram telethermograph telethermometer telethermometry telethon teletopometer teletranscription Teletype teletype teletyper teletypesetter teletypewriter teletyping Teleut teleuto teleutoform teleutosorus teleutospore teleutosporic teleutosporiferous teleview televiewer televise television televisional televisionary televisor televisual televocal televox telewriter Telfairia telfairic telfer telferage telford telfordize telharmonic telharmonium telharmony teli telial telic telical telically teliferous Telinga teliosorus teliospore teliosporic teliosporiferous teliostage telium tell tellable tellach tellee teller tellership telligraph Tellima Tellina Tellinacea tellinacean tellinaceous telling tellingly Tellinidae tellinoid tellsome tellt telltale telltalely telltruth tellural tellurate telluret tellureted tellurethyl telluretted tellurhydric tellurian telluric telluride telluriferous tellurion tellurism tellurist tellurite tellurium tellurize telluronium tellurous telmatological telmatology teloblast teloblastic telocentric telodendrion telodendron telodynamic telokinesis telolecithal telolemma telome telomic telomitic telonism Teloogoo Telopea telophase telophragma telopsis teloptic telosynapsis telosynaptic telosynaptist teloteropathic teloteropathically teloteropathy Telotremata telotrematous telotroch telotrocha telotrochal telotrochous telotrophic telotype telpath telpher telpherage telpherman telpherway telson telsonic telt Telugu telurgy telyn Tema temacha temalacatl Teman teman Temanite tembe temblor Tembu temenos temerarious temerariously temerariousness temeritous temerity temerous temerously temerousness temiak temin Temiskaming Temne Temnospondyli temnospondylous temp Tempe Tempean temper tempera temperability temperable temperably temperality temperament temperamental temperamentalist temperamentally temperamented temperance temperate temperately temperateness temperative temperature tempered temperedly temperedness temperer temperish temperless tempersome tempery tempest tempestical tempestive tempestively tempestivity tempestuous tempestuously tempestuousness tempesty tempi Templar templar templardom templarism templarlike templarlikeness templary template templater temple templed templeful templeless templelike templet Templetonia templeward templize tempo tempora temporal temporale temporalism temporalist temporality temporalize temporally temporalness temporalty temporaneous temporaneously temporaneousness temporarily temporariness temporary temporator temporization temporizer temporizing temporizingly temporoalar temporoauricular temporocentral temporocerebellar temporofacial temporofrontal temporohyoid temporomalar temporomandibular temporomastoid temporomaxillary temporooccipital temporoparietal temporopontine temporosphenoid temporosphenoidal temporozygomatic tempre temprely tempt temptability temptable temptableness temptation temptational temptationless temptatious temptatory tempter tempting temptingly temptingness temptress Tempyo temse temser temulence temulency temulent temulentive temulently ten tenability tenable tenableness tenably tenace tenacious tenaciously tenaciousness tenacity tenaculum tenai tenaille tenaillon Tenaktak tenancy tenant tenantable tenantableness tenanter tenantism tenantless tenantlike tenantry tenantship tench tenchweed Tencteri tend tendance tendant tendence tendency tendent tendential tendentious tendentiously tendentiousness tender tenderability tenderable tenderably tenderee tenderer tenderfoot tenderfootish tenderful tenderfully tenderheart tenderhearted tenderheartedly tenderheartedness tenderish tenderize tenderling tenderloin tenderly tenderness tenderometer tendersome tendinal tending tendingly tendinitis tendinous tendinousness tendomucoid tendon tendonous tendoplasty tendosynovitis tendotome tendotomy tendour tendovaginal tendovaginitis tendresse tendril tendriled tendriliferous tendrillar tendrilly tendrilous tendron tenebra Tenebrae tenebricose tenebrific tenebrificate Tenebrio tenebrionid Tenebrionidae tenebrious tenebriously tenebrity tenebrose tenebrosity tenebrous tenebrously tenebrousness tenectomy tenement tenemental tenementary tenementer tenementization tenementize tenendas tenendum tenent teneral Teneriffe tenesmic tenesmus tenet tenfold tenfoldness teng tengere tengerite Tenggerese tengu teniacidal teniacide tenible Tenino tenio tenline tenmantale tennantite tenne tenner Tennessean tennis tennisdom tennisy Tennysonian Tennysonianism Tenochtitlan tenodesis tenodynia tenography tenology tenomyoplasty tenomyotomy tenon tenonectomy tenoner Tenonian tenonitis tenonostosis tenontagra tenontitis tenontodynia tenontography tenontolemmitis tenontology tenontomyoplasty tenontomyotomy tenontophyma tenontoplasty tenontothecitis tenontotomy tenophony tenophyte tenoplastic tenoplasty tenor tenorist tenorister tenorite tenorless tenoroon tenorrhaphy tenositis tenostosis tenosuture tenotome tenotomist tenotomize tenotomy tenovaginitis tenpence tenpenny tenpin tenrec Tenrecidae tense tenseless tenselessness tensely tenseness tensibility tensible tensibleness tensibly tensify tensile tensilely tensileness tensility tensimeter tensiometer tension tensional tensionless tensity tensive tenson tensor tent tentability tentable tentacle tentacled tentaclelike tentacula tentacular Tentaculata tentaculate tentaculated Tentaculifera tentaculite Tentaculites Tentaculitidae tentaculocyst tentaculoid tentaculum tentage tentamen tentation tentative tentatively tentativeness tented tenter tenterbelly tenterer tenterhook tentful tenth tenthly tenthmeter tenthredinid Tenthredinidae tenthredinoid Tenthredinoidea Tenthredo tentiform tentigo tentillum tention tentless tentlet tentlike tentmaker tentmaking tentmate tentorial tentorium tenture tentwards tentwise tentwork tentwort tenty tenuate tenues tenuicostate tenuifasciate tenuiflorous tenuifolious tenuious tenuiroster tenuirostral tenuirostrate Tenuirostres tenuis tenuistriate tenuity tenuous tenuously tenuousness tenure tenurial tenurially teocalli teopan teosinte Teotihuacan tepache tepal Tepanec Tepecano tepee tepefaction tepefy Tepehua Tepehuane tepetate Tephillah tephillin tephramancy tephrite tephritic tephroite tephromalacia tephromyelitic Tephrosia tephrosis tepid tepidarium tepidity tepidly tepidness tepomporize teponaztli tepor tequila Tequistlateca Tequistlatecan tera teraglin terakihi teramorphous terap teraphim teras teratical teratism teratoblastoma teratogenesis teratogenetic teratogenic teratogenous teratogeny teratoid teratological teratologist teratology teratoma teratomatous teratoscopy teratosis terbia terbic terbium tercel tercelet tercentenarian tercentenarize tercentenary tercentennial tercer terceron tercet terchloride tercia tercine tercio terdiurnal terebate terebella terebellid Terebellidae terebelloid terebellum terebene terebenic terebenthene terebic terebilic terebinic terebinth Terebinthaceae terebinthial terebinthian terebinthic terebinthina terebinthinate terebinthine terebinthinous Terebinthus terebra terebral terebrant Terebrantia terebrate terebration Terebratula terebratular terebratulid Terebratulidae terebratuliform terebratuline terebratulite terebratuloid Terebridae Teredinidae teredo terek Terence Terentian terephthalate terephthalic Teresa Teresian Teresina terete teretial tereticaudate teretifolious teretipronator teretiscapular teretiscapularis teretish tereu Tereus terfez Terfezia Terfeziaceae tergal tergant tergeminate tergeminous tergiferous tergite tergitic tergiversant tergiversate tergiversation tergiversator tergiversatory tergiverse tergolateral tergum Teri Teriann terlinguaite term terma termagancy Termagant termagant termagantish termagantism termagantly termage termatic termen termer Termes termillenary termin terminability terminable terminableness terminably terminal Terminalia Terminaliaceae terminalization terminalized terminally terminant terminate termination terminational terminative terminatively terminator terminatory termine terminer termini terminine terminism terminist terministic terminize termino terminological terminologically terminologist terminology terminus termital termitarium termitary termite termitic termitid Termitidae termitophagous termitophile termitophilous termless termlessly termlessness termly termolecular termon termor termtime tern terna ternal ternar ternariant ternarious ternary ternate ternately ternatipinnate ternatisect ternatopinnate terne terneplate ternery ternion ternize ternlet Ternstroemia Ternstroemiaceae teroxide terp terpadiene terpane terpene terpeneless terphenyl terpilene terpin terpine terpinene terpineol terpinol terpinolene terpodion Terpsichore terpsichoreal terpsichoreally Terpsichorean terpsichorean Terraba terrace terraceous terracer terracette terracewards terracewise terracework terraciform terracing terraculture terraefilial terraefilian terrage terrain terral terramara terramare Terrance terrane terranean terraneous Terrapene terrapin terraquean terraqueous terraqueousness terrar terrarium terrazzo terrella terremotive Terrence terrene terrenely terreneness terreplein terrestrial terrestrialism terrestriality terrestrialize terrestrially terrestrialness terrestricity terrestrious terret terreted Terri terribility terrible terribleness terribly terricole terricoline terricolous terrier terrierlike terrific terrifical terrifically terrification terrificly terrificness terrifiedly terrifier terrify terrifying terrifyingly terrigenous terrine Territelae territelarian territorial territorialism territorialist territoriality territorialization territorialize territorially territorian territoried territory terron terror terrorful terrorific terrorism terrorist terroristic terroristical terrorization terrorize terrorizer terrorless terrorproof terrorsome Terry terry terse tersely terseness tersion tersulphate tersulphide tersulphuret tertenant tertia tertial tertian tertiana tertianship tertiarian tertiary tertiate tertius terton tertrinal Tertullianism Tertullianist teruncius terutero Teruyuki tervalence tervalency tervalent tervariant tervee terzetto terzina terzo tesack tesarovitch teschenite teschermacherite teskere teskeria Tess tessara tessarace tessaraconter tessaradecad tessaraglot tessaraphthong tessarescaedecahedron tessel tessella tessellar tessellate tessellated tessellation tessera tesseract tesseradecade tesseraic tesseral Tesserants tesserarian tesserate tesserated tesseratomic tesseratomy tessular test testa testable Testacea testacean testaceography testaceology testaceous testaceousness testacy testament testamental testamentally testamentalness testamentarily testamentary testamentate testamentation testamentum testamur testar testata testate testation testator testatorship testatory testatrices testatrix testatum teste tested testee tester testes testibrachial testibrachium testicardinate testicardine Testicardines testicle testicond testicular testiculate testiculated testiere testificate testification testificator testificatory testifier testify testily testimonial testimonialist testimonialization testimonialize testimonializer testimonium testimony testiness testing testingly testis teston testone testoon testor testosterone testril testudinal Testudinaria testudinarious Testudinata testudinate testudinated testudineal testudineous Testudinidae testudinous testudo testy Tesuque tetanic tetanical tetanically tetaniform tetanigenous tetanilla tetanine tetanism tetanization tetanize tetanoid tetanolysin tetanomotor tetanospasmin tetanotoxin tetanus tetany tetarcone tetarconid tetard tetartemorion tetartocone tetartoconid tetartohedral tetartohedrally tetartohedrism tetartohedron tetartoid tetartosymmetry tetch tetchy tete tetel teterrimous teth tethelin tether tetherball tethery tethydan Tethys Teton tetra tetraamylose tetrabasic tetrabasicity Tetrabelodon tetrabelodont tetrabiblos tetraborate tetraboric tetrabrach tetrabranch Tetrabranchia tetrabranchiate tetrabromid tetrabromide tetrabromo tetrabromoethane tetracadactylity tetracarboxylate tetracarboxylic tetracarpellary tetraceratous tetracerous Tetracerus tetrachical tetrachlorid tetrachloride tetrachloro tetrachloroethane tetrachloroethylene tetrachloromethane tetrachord tetrachordal tetrachordon tetrachoric tetrachotomous tetrachromatic tetrachromic tetrachronous tetracid tetracoccous tetracoccus tetracolic tetracolon tetracoral Tetracoralla tetracoralline tetracosane tetract tetractinal tetractine tetractinellid Tetractinellida tetractinellidan tetractinelline tetractinose tetracyclic tetrad tetradactyl tetradactylous tetradactyly tetradarchy tetradecane tetradecanoic tetradecapod Tetradecapoda tetradecapodan tetradecapodous tetradecyl Tetradesmus tetradiapason tetradic Tetradite tetradrachma tetradrachmal tetradrachmon tetradymite Tetradynamia tetradynamian tetradynamious tetradynamous tetraedron tetraedrum tetraethylsilane tetrafluoride tetrafolious tetragamy tetragenous tetraglot tetraglottic tetragon tetragonal tetragonally tetragonalness Tetragonia Tetragoniaceae tetragonidium tetragonous tetragonus tetragram tetragrammatic Tetragrammaton tetragrammatonic tetragyn Tetragynia tetragynian tetragynous tetrahedral tetrahedrally tetrahedric tetrahedrite tetrahedroid tetrahedron tetrahexahedral tetrahexahedron tetrahydrate tetrahydrated tetrahydric tetrahydride tetrahydro tetrahydroxy tetraiodid tetraiodide tetraiodo tetraiodophenolphthalein tetrakaidecahedron tetraketone tetrakisazo tetrakishexahedron tetralemma Tetralin tetralogic tetralogue tetralogy tetralophodont tetramastia tetramastigote Tetramera tetrameral tetrameralian tetrameric tetramerism tetramerous tetrameter tetramethyl tetramethylammonium tetramethylene tetramethylium tetramin tetramine tetrammine tetramorph tetramorphic tetramorphism tetramorphous tetrander Tetrandria tetrandrian tetrandrous tetrane tetranitrate tetranitro tetranitroaniline tetranuclear Tetranychus Tetrao Tetraodon tetraodont Tetraodontidae tetraonid Tetraonidae Tetraoninae tetraonine Tetrapanax tetrapartite tetrapetalous tetraphalangeate tetrapharmacal tetrapharmacon tetraphenol tetraphony tetraphosphate tetraphyllous tetrapla tetraplegia tetrapleuron tetraploid tetraploidic tetraploidy tetraplous Tetrapneumona Tetrapneumones tetrapneumonian tetrapneumonous tetrapod Tetrapoda tetrapodic tetrapody tetrapolar tetrapolis tetrapolitan tetrapous tetraprostyle tetrapteran tetrapteron tetrapterous tetraptote Tetrapturus tetraptych tetrapylon tetrapyramid tetrapyrenous tetraquetrous tetrarch tetrarchate tetrarchic tetrarchy tetrasaccharide tetrasalicylide tetraselenodont tetraseme tetrasemic tetrasepalous tetraskelion tetrasome tetrasomic tetrasomy tetraspermal tetraspermatous tetraspermous tetraspheric tetrasporange tetrasporangiate tetrasporangium tetraspore tetrasporic tetrasporiferous tetrasporous tetraster tetrastich tetrastichal tetrastichic Tetrastichidae tetrastichous Tetrastichus tetrastoon tetrastyle tetrastylic tetrastylos tetrastylous tetrasubstituted tetrasubstitution tetrasulphide tetrasyllabic tetrasyllable tetrasymmetry tetrathecal tetratheism tetratheite tetrathionates tetrathionic tetratomic tetratone tetravalence tetravalency tetravalent tetraxial tetraxon Tetraxonia tetraxonian tetraxonid Tetraxonida tetrazane tetrazene tetrazin tetrazine tetrazo tetrazole tetrazolium tetrazolyl tetrazone tetrazotization tetrazotize tetrazyl tetremimeral tetrevangelium tetric tetrical tetricity tetricous tetrigid Tetrigidae tetriodide Tetrix tetrobol tetrobolon tetrode Tetrodon tetrodont Tetrodontidae tetrole tetrolic tetronic tetronymal tetrose tetroxalate tetroxide tetrsyllabical tetryl tetrylene tetter tetterish tetterous tetterwort tettery Tettigidae tettigoniid Tettigoniidae tettix Tetum Teucer Teucri Teucrian teucrin Teucrium teufit teuk Teutolatry Teutomania Teutomaniac Teuton Teutondom Teutonesque Teutonia Teutonic Teutonically Teutonicism Teutonism Teutonist Teutonity Teutonization Teutonize Teutonomania Teutonophobe Teutonophobia Teutophil Teutophile Teutophilism Teutophobe Teutophobia Teutophobism teviss tew Tewa tewel tewer tewit tewly tewsome Texan Texas Texcocan texguino text textarian textbook textbookless textiferous textile textilist textlet textman textorial textrine textual textualism textualist textuality textually textuarist textuary textural texturally texture textureless tez Tezcatlipoca Tezcatzoncatl Tezcucan tezkere th tha thack thacker Thackerayan Thackerayana Thackerayesque thackless Thad Thai Thais thakur thakurate thalamencephalic thalamencephalon thalami thalamic Thalamiflorae thalamifloral thalamiflorous thalamite thalamium thalamocele thalamocoele thalamocortical thalamocrural thalamolenticular thalamomammillary thalamopeduncular Thalamophora thalamotegmental thalamotomy thalamus Thalarctos thalassal Thalassarctos thalassian thalassic thalassinid Thalassinidea thalassinidian thalassinoid thalassiophyte thalassiophytous thalasso Thalassochelys thalassocracy thalassocrat thalassographer thalassographic thalassographical thalassography thalassometer thalassophilous thalassophobia thalassotherapy thalattology thalenite thaler Thalesia Thalesian Thalessa Thalia Thaliacea thaliacean Thalian Thaliard Thalictrum thalli thallic thalliferous thalliform thalline thallious thallium thallochlore thallodal thallogen thallogenic thallogenous thalloid thallome Thallophyta thallophyte thallophytic thallose thallous thallus thalposis thalpotic thalthan thameng Thamesis Thamnidium thamnium thamnophile Thamnophilinae thamnophiline Thamnophilus Thamnophis Thamudean Thamudene Thamudic thamuria Thamus Thamyras than thana thanadar thanage thanan thanatism thanatist thanatobiologic thanatognomonic thanatographer thanatography thanatoid thanatological thanatologist thanatology thanatomantic thanatometer thanatophidia thanatophidian thanatophobe thanatophobia thanatophobiac thanatophoby thanatopsis Thanatos thanatosis thanatotic thanatousia thane thanedom thanehood thaneland thaneship thank thankee thanker thankful thankfully thankfulness thankless thanklessly thanklessness thanks thanksgiver thanksgiving thankworthily thankworthiness thankworthy thapes Thapsia thapsia thar Tharen tharf tharfcake Thargelion tharginyah tharm Thasian Thaspium that thatch thatcher thatching thatchless thatchwood thatchwork thatchy thatn thatness thats thaught Thaumantian Thaumantias thaumasite thaumatogeny thaumatography thaumatolatry thaumatology thaumatrope thaumatropical thaumaturge thaumaturgia thaumaturgic thaumaturgical thaumaturgics thaumaturgism thaumaturgist thaumaturgy thaumoscopic thave thaw thawer thawless thawn thawy The the Thea Theaceae theaceous theah theandric theanthropic theanthropical theanthropism theanthropist theanthropology theanthropophagy theanthropos theanthroposophy theanthropy thearchic thearchy theasum theat theater theatergoer theatergoing theaterless theaterlike theaterward theaterwards theaterwise Theatine theatral theatric theatricable theatrical theatricalism theatricality theatricalization theatricalize theatrically theatricalness theatricals theatrician theatricism theatricize theatrics theatrize theatrocracy theatrograph theatromania theatromaniac theatron theatrophile theatrophobia theatrophone theatrophonic theatropolis theatroscope theatry theave theb Thebaic Thebaid thebaine Thebais thebaism Theban Thebesian theca thecae thecal Thecamoebae thecaphore thecasporal thecaspore thecaspored thecasporous Thecata thecate thecia thecitis thecium Thecla thecla theclan thecodont thecoglossate thecoid Thecoidea Thecophora Thecosomata thecosomatous thee theek theeker theelin theelol Theemim theer theet theetsee theezan theft theftbote theftdom theftless theftproof theftuous theftuously thegether thegidder thegither thegn thegndom thegnhood thegnland thegnlike thegnly thegnship thegnworthy theiform Theileria theine theinism their theirn theirs theirselves theirsens theism theist theistic theistical theistically thelalgia Thelemite thelemite Thelephora Thelephoraceae Theligonaceae theligonaceous Theligonum thelitis thelium Thelodontidae Thelodus theloncus thelorrhagia Thelphusa thelphusian Thelphusidae thelyblast thelyblastic thelyotokous thelyotoky Thelyphonidae Thelyphonus thelyplasty thelytocia thelytoky thelytonic them thema themata thematic thematical thematically thematist theme themeless themelet themer Themis themis Themistian themsel themselves then thenabouts thenadays thenal thenar thenardite thence thenceafter thenceforth thenceforward thenceforwards thencefrom thenceward thenness Theo theoanthropomorphic theoanthropomorphism theoastrological Theobald Theobroma theobromic theobromine theocentric theocentricism theocentrism theochristic theocollectivism theocollectivist theocracy theocrasia theocrasical theocrasy theocrat theocratic theocratical theocratically theocratist Theocritan Theocritean theodemocracy theodicaea theodicean theodicy theodidact theodolite theodolitic Theodora Theodore Theodoric Theodosia Theodosian Theodotian theodrama theody theogamy theogeological theognostic theogonal theogonic theogonism theogonist theogony theohuman theokrasia theoktonic theoktony theolatrous theolatry theolepsy theoleptic theologal theologaster theologastric theologate theologeion theologer theologi theologian theologic theological theologically theologician theologicoastronomical theologicoethical theologicohistorical theologicometaphysical theologicomilitary theologicomoral theologiconatural theologicopolitical theologics theologism theologist theologium theologization theologize theologizer theologoumena theologoumenon theologue theologus theology theomachia theomachist theomachy theomammomist theomancy theomania theomaniac theomantic theomastix theomicrist theomisanthropist theomorphic theomorphism theomorphize theomythologer theomythology theonomy theopantism Theopaschist Theopaschitally Theopaschite Theopaschitic Theopaschitism theopathetic theopathic theopathy theophagic theophagite theophagous theophagy Theophania theophania theophanic theophanism theophanous theophany Theophila theophilanthrope theophilanthropic theophilanthropism theophilanthropist theophilanthropy theophile theophilist theophilosophic Theophilus theophobia theophoric theophorous Theophrastaceae theophrastaceous Theophrastan Theophrastean theophylline theophysical theopneust theopneusted theopneustia theopneustic theopneusty theopolitician theopolitics theopolity theopsychism theorbist theorbo theorem theorematic theorematical theorematically theorematist theoremic theoretic theoretical theoreticalism theoretically theoretician theoreticopractical theoretics theoria theoriai theoric theorical theorically theorician theoricon theorics theorism theorist theorization theorize theorizer theorum theory theoryless theorymonger theosoph theosopheme theosophic theosophical theosophically theosophism theosophist theosophistic theosophistical theosophize theosophy theotechnic theotechnist theotechny theoteleological theoteleology theotherapy Theotokos theow theowdom theowman Theraean theralite therapeusis Therapeutae Therapeutic therapeutic therapeutical therapeutically therapeutics therapeutism therapeutist Theraphosa theraphose theraphosid Theraphosidae theraphosoid therapist therapsid Therapsida therapy therblig there thereabouts thereabove thereacross thereafter thereafterward thereagainst thereamong thereamongst thereanent thereanents therearound thereas thereat thereaway thereaways therebeside therebesides therebetween thereby thereckly therefor therefore therefrom therehence therein thereinafter thereinbefore thereinto therence thereness thereof thereoid thereologist thereology thereon thereout thereover thereright theres Theresa therese therethrough theretill thereto theretofore theretoward thereunder thereuntil thereunto thereup thereupon Thereva therevid Therevidae therewhile therewith therewithal therewithin Theria theriac theriaca theriacal therial therianthropic therianthropism theriatrics theridiid Theridiidae Theridion theriodic theriodont Theriodonta Theriodontia theriolatry theriomancy theriomaniac theriomimicry theriomorph theriomorphic theriomorphism theriomorphosis theriomorphous theriotheism theriotrophical theriozoic therm thermacogenesis thermae thermal thermalgesia thermality thermally thermanalgesia thermanesthesia thermantic thermantidote thermatologic thermatologist thermatology thermesthesia thermesthesiometer thermetograph thermetrograph thermic thermically Thermidorian thermion thermionic thermionically thermionics thermistor Thermit thermit thermite thermo thermoammeter thermoanalgesia thermoanesthesia thermobarograph thermobarometer thermobattery thermocautery thermochemic thermochemical thermochemically thermochemist thermochemistry thermochroic thermochrosy thermocline thermocouple thermocurrent thermodiffusion thermoduric thermodynamic thermodynamical thermodynamically thermodynamician thermodynamicist thermodynamics thermodynamist thermoelectric thermoelectrical thermoelectrically thermoelectricity thermoelectrometer thermoelectromotive thermoelement thermoesthesia thermoexcitory thermogalvanometer thermogen thermogenerator thermogenesis thermogenetic thermogenic thermogenous thermogeny thermogeographical thermogeography thermogram thermograph thermography thermohyperesthesia thermojunction thermokinematics thermolabile thermolability thermological thermology thermoluminescence thermoluminescent thermolysis thermolytic thermolyze thermomagnetic thermomagnetism thermometamorphic thermometamorphism thermometer thermometerize thermometric thermometrical thermometrically thermometrograph thermometry thermomotive thermomotor thermomultiplier thermonastic thermonasty thermonatrite thermoneurosis thermoneutrality thermonous thermonuclear thermopair thermopalpation thermopenetration thermoperiod thermoperiodic thermoperiodicity thermoperiodism thermophile thermophilic thermophilous thermophobous thermophone thermophore thermophosphor thermophosphorescence thermopile thermoplastic thermoplasticity thermoplegia thermopleion thermopolymerization thermopolypnea thermopolypneic Thermopsis thermoradiotherapy thermoreduction thermoregulation thermoregulator thermoresistance thermoresistant thermos thermoscope thermoscopic thermoscopical thermoscopically thermosetting thermosiphon thermostability thermostable thermostat thermostatic thermostatically thermostatics thermostimulation thermosynthesis thermosystaltic thermosystaltism thermotactic thermotank thermotaxic thermotaxis thermotelephone thermotensile thermotension thermotherapeutics thermotherapy thermotic thermotical thermotically thermotics thermotropic thermotropism thermotropy thermotype thermotypic thermotypy thermovoltaic therodont theroid therolatry therologic therological therologist therology Theromora Theromores theromorph Theromorpha theromorphia theromorphic theromorphism theromorphological theromorphology theromorphous Theron theropod Theropoda theropodous thersitean Thersites thersitical thesauri thesaurus these Thesean theses Theseum Theseus thesial thesicle thesis Thesium Thesmophoria Thesmophorian Thesmophoric thesmothetae thesmothete thesmothetes thesocyte Thespesia Thespesius Thespian Thessalian Thessalonian thestreen theta thetch thetic thetical thetically thetics thetin thetine Thetis theurgic theurgical theurgically theurgist theurgy Thevetia thevetin thew thewed thewless thewness thewy they theyll theyre thiacetic thiadiazole thialdine thiamide thiamin thiamine thianthrene thiasi thiasine thiasite thiasoi thiasos thiasote thiasus thiazine thiazole thiazoline thick thickbrained thicken thickener thickening thicket thicketed thicketful thickety thickhead thickheaded thickheadedly thickheadedness thickish thickleaf thicklips thickly thickneck thickness thicknessing thickset thickskin thickskull thickskulled thickwind thickwit thief thiefcraft thiefdom thiefland thiefmaker thiefmaking thiefproof thieftaker thiefwise Thielavia Thielaviopsis thienone thienyl Thierry thievable thieve thieveless thiever thievery thieving thievingly thievish thievishly thievishness thig thigger thigging thigh thighbone thighed thight thightness thigmonegative thigmopositive thigmotactic thigmotactically thigmotaxis thigmotropic thigmotropically thigmotropism Thilanottine thilk thill thiller thilly thimber thimble thimbleberry thimbled thimbleflower thimbleful thimblelike thimblemaker thimblemaking thimbleman thimblerig thimblerigger thimbleriggery thimblerigging thimbleweed thin thinbrained thine thing thingal thingamabob thinghood thinginess thingish thingless thinglet thinglike thinglikeness thingliness thingly thingman thingness thingstead thingum thingumajig thingumbob thingummy thingy Think think thinkable thinkableness thinkably thinker thinkful thinking thinkingly thinkingpart thinkling thinly thinner thinness thinning thinnish Thinocoridae Thinocorus thinolite thio thioacetal thioacetic thioalcohol thioaldehyde thioamide thioantimonate thioantimoniate thioantimonious thioantimonite thioarsenate thioarseniate thioarsenic thioarsenious thioarsenite Thiobacillus Thiobacteria thiobacteria Thiobacteriales thiobismuthite thiocarbamic thiocarbamide thiocarbamyl thiocarbanilide thiocarbimide thiocarbonate thiocarbonic thiocarbonyl thiochloride thiochrome thiocresol thiocyanate thiocyanation thiocyanic thiocyanide thiocyano thiocyanogen thiodiazole thiodiphenylamine thiofuran thiofurane thiofurfuran thiofurfurane thiogycolic thiohydrate thiohydrolysis thiohydrolyze thioindigo thioketone thiol thiolacetic thiolactic thiolic thionamic thionaphthene thionate thionation thioneine thionic thionine thionitrite thionium thionobenzoic thionthiolic thionurate thionyl thionylamine thiophen thiophene thiophenic thiophenol thiophosgene thiophosphate thiophosphite thiophosphoric thiophosphoryl thiophthene thiopyran thioresorcinol thiosinamine Thiospira thiostannate thiostannic thiostannite thiostannous thiosulphate thiosulphonic thiosulphuric Thiothrix thiotolene thiotungstate thiotungstic thiouracil thiourea thiourethan thiourethane thioxene thiozone thiozonide thir third thirdborough thirdings thirdling thirdly thirdness thirdsman thirl thirlage thirling thirst thirster thirstful thirstily thirstiness thirsting thirstingly thirstland thirstle thirstless thirstlessness thirstproof thirsty thirt thirteen thirteener thirteenfold thirteenth thirteenthly thirtieth thirty thirtyfold thirtyish this thishow thislike thisn thisness thissen thistle thistlebird thistled thistledown thistlelike thistleproof thistlery thistlish thistly thiswise thither thitherto thitherward thitsiol thiuram thivel thixle thixolabile thixotropic thixotropy Thlaspi Thlingchadinne Thlinget thlipsis Tho tho thob thocht thof thoft thoftfellow thoke thokish thole tholeiite tholepin tholi tholoi tholos tholus Thomaean Thomas Thomasa Thomasine thomasing Thomasite thomisid Thomisidae Thomism Thomist Thomistic Thomistical Thomite Thomomys thomsenolite Thomsonian Thomsonianism thomsonite thon thonder Thondracians Thondraki Thondrakians thone thong Thonga thonged thongman thongy thoo thooid thoom thoracalgia thoracaorta thoracectomy thoracentesis thoraces thoracic Thoracica thoracical thoracicoabdominal thoracicoacromial thoracicohumeral thoracicolumbar thoraciform thoracispinal thoracoabdominal thoracoacromial thoracobronchotomy thoracoceloschisis thoracocentesis thoracocyllosis thoracocyrtosis thoracodelphus thoracodidymus thoracodorsal thoracodynia thoracogastroschisis thoracograph thoracohumeral thoracolumbar thoracolysis thoracomelus thoracometer thoracometry thoracomyodynia thoracopagus thoracoplasty thoracoschisis thoracoscope thoracoscopy Thoracostei thoracostenosis thoracostomy Thoracostraca thoracostracan thoracostracous thoracotomy thoral thorascope thorax thore thoria thorianite thoriate thoric thoriferous thorina thorite thorium thorn thornback thornbill thornbush thorned thornen thornhead thornily thorniness thornless thornlessness thornlet thornlike thornproof thornstone thorntail thorny thoro thorocopagous thorogummite thoron thorough Thoroughbred thoroughbred thoroughbredness thoroughfare thoroughfarer thoroughfaresome thoroughfoot thoroughgoing thoroughgoingly thoroughgoingness thoroughgrowth thoroughly thoroughness thoroughpaced thoroughpin thoroughsped thoroughstem thoroughstitch thoroughstitched thoroughwax thoroughwort thorp thort thorter thortveitite Thos Those those thou though thought thoughted thoughten thoughtful thoughtfully thoughtfulness thoughtkin thoughtless thoughtlessly thoughtlessness thoughtlet thoughtness thoughtsick thoughty thousand thousandfold thousandfoldly thousandth thousandweight thouse thow thowel thowless thowt Thraces Thracian thrack thraep thrail thrain thrall thrallborn thralldom thram thrammle thrang thrangity thranite thranitic thrap thrapple thrash thrashel thrasher thrasherman thrashing thrasonic thrasonical thrasonically thrast Thraupidae thrave thraver thraw thrawcrook thrawn thrawneen Thrax thread threadbare threadbareness threadbarity threaded threaden threader threadfin threadfish threadflower threadfoot threadiness threadle threadless threadlet threadlike threadmaker threadmaking threadway threadweed threadworm thready threap threaper threat threaten threatenable threatener threatening threateningly threatful threatfully threatless threatproof three threefold threefolded threefoldedness threefoldly threefoldness threeling threeness threepence threepenny threepennyworth threescore threesome thremmatology threne threnetic threnetical threnode threnodial threnodian threnodic threnodical threnodist threnody threnos threonin threonine threose threpsology threptic thresh threshel thresher thresherman threshingtime threshold Threskiornithidae Threskiornithinae threw thribble thrice thricecock thridacium thrift thriftbox thriftily thriftiness thriftless thriftlessly thriftlessness thriftlike thrifty thrill thriller thrillful thrillfully thrilling thrillingly thrillingness thrillproof thrillsome thrilly thrimble thrimp Thrinax thring thrinter thrioboly thrip thripel Thripidae thripple thrips thrive thriveless thriven thriver thriving thrivingly thrivingness thro throat throatal throatband throated throatful throatily throatiness throating throatlash throatlatch throatless throatlet throatroot throatstrap throatwort throaty throb throbber throbbingly throbless throck throdden throddy throe thrombase thrombin thromboangiitis thromboarteritis thrombocyst thrombocyte thrombocytopenia thrombogen thrombogenic thromboid thrombokinase thrombolymphangitis thrombopenia thrombophlebitis thromboplastic thromboplastin thrombose thrombosis thrombostasis thrombotic thrombus thronal throne thronedom throneless thronelet thronelike throneward throng thronger throngful throngingly thronize thropple throstle throstlelike throttle throttler throttling throttlingly throu throuch throucht through throughbear throughbred throughcome throughgang throughganging throughgoing throughgrow throughknow throughout throughput throve throw throwaway throwback throwdown thrower throwing thrown throwoff throwout throwster throwwort thrum thrummer thrummers thrummy thrumwort thrush thrushel thrushlike thrushy thrust thruster thrustful thrustfulness thrusting thrustings thrutch thrutchings Thruthvang thruv thrymsa Thryonomys Thuan Thuban Thucydidean thud thudding thuddingly thug thugdom thuggee thuggeeism thuggery thuggess thuggish thuggism Thuidium Thuja thujene thujin thujone Thujopsis thujyl Thule thulia thulir thulite thulium thulr thuluth thumb thumbbird thumbed thumber thumbkin thumble thumbless thumblike thumbmark thumbnail thumbpiece thumbprint thumbrope thumbscrew thumbstall thumbstring thumbtack thumby thumlungur thump thumper thumping thumpingly Thunar Thunbergia thunbergilene thunder thunderation thunderball thunderbearer thunderbearing thunderbird thunderblast thunderbolt thunderburst thunderclap thundercloud thundercrack thunderer thunderfish thunderflower thunderful thunderhead thunderheaded thundering thunderingly thunderless thunderlike thunderous thunderously thunderousness thunderpeal thunderplump thunderproof thundershower thundersmite thundersquall thunderstick thunderstone thunderstorm thunderstrike thunderstroke thunderstruck thunderwood thunderworm thunderwort thundery thundrous thundrously thung thunge Thunnidae Thunnus Thunor thuoc Thurberia thurible thuribuler thuribulum thurifer thuriferous thurificate thurificati thurification thurify Thuringian thuringite Thurio thurl thurm thurmus Thurnia Thurniaceae thurrock Thursday thurse thurt thus thusgate Thushi thusly thusness thuswise thutter Thuyopsis thwack thwacker thwacking thwackingly thwackstave thwaite thwart thwartedly thwarteous thwarter thwarting thwartingly thwartly thwartman thwartness thwartover thwartsaw thwartship thwartships thwartways thwartwise thwite thwittle thy Thyestean Thyestes thyine thylacine thylacitis Thylacoleo Thylacynus thymacetin Thymallidae Thymallus thymate thyme thymectomize thymectomy thymegol Thymelaea Thymelaeaceae thymelaeaceous Thymelaeales thymelcosis thymele thymelic thymelical thymelici thymene thymetic thymic thymicolymphatic thymine thymiosis thymitis thymocyte thymogenic thymol thymolate thymolize thymolphthalein thymolsulphonephthalein thymoma thymonucleic thymopathy thymoprivic thymoprivous thymopsyche thymoquinone thymotactic thymotic Thymus thymus thymy thymyl thymylic thynnid Thynnidae Thyraden thyratron thyreoadenitis thyreoantitoxin thyreoarytenoid thyreoarytenoideus thyreocervical thyreocolloid Thyreocoridae thyreoepiglottic thyreogenic thyreogenous thyreoglobulin thyreoglossal thyreohyal thyreohyoid thyreoid thyreoidal thyreoideal thyreoidean thyreoidectomy thyreoiditis thyreoitis thyreolingual thyreoprotein thyreosis thyreotomy thyreotoxicosis thyreotropic thyridial Thyrididae thyridium Thyris thyrisiferous thyroadenitis thyroantitoxin thyroarytenoid thyroarytenoideus thyrocardiac thyrocele thyrocervical thyrocolloid thyrocricoid thyroepiglottic thyroepiglottidean thyrogenic thyroglobulin thyroglossal thyrohyal thyrohyoid thyrohyoidean thyroid thyroidal thyroidea thyroideal thyroidean thyroidectomize thyroidectomy thyroidism thyroiditis thyroidization thyroidless thyroidotomy thyroiodin thyrolingual thyronine thyroparathyroidectomize thyroparathyroidectomy thyroprival thyroprivia thyroprivic thyroprivous thyroprotein Thyrostraca thyrostracan thyrotherapy thyrotomy thyrotoxic thyrotoxicosis thyrotropic thyroxine thyrse thyrsiflorous thyrsiform thyrsoid thyrsoidal thyrsus Thysanocarpus thysanopter Thysanoptera thysanopteran thysanopteron thysanopterous Thysanoura thysanouran thysanourous Thysanura thysanuran thysanurian thysanuriform thysanurous thysel thyself thysen Ti ti Tiahuanacan Tiam tiang tiao tiar tiara tiaralike tiarella Tiatinagua tib Tibbie Tibbu tibby Tiberian Tiberine Tiberius tibet Tibetan tibey tibia tibiad tibiae tibial tibiale tibicinist tibiocalcanean tibiofemoral tibiofibula tibiofibular tibiometatarsal tibionavicular tibiopopliteal tibioscaphoid tibiotarsal tibiotarsus Tibouchina tibourbou tiburon Tiburtine tic tical ticca tice ticement ticer Tichodroma tichodrome tichorrhine tick tickbean tickbird tickeater ticked ticken ticker ticket ticketer ticketing ticketless ticketmonger tickey tickicide tickie ticking tickle tickleback ticklebrain tickled ticklely ticklenburg tickleness tickleproof tickler ticklesome tickless tickleweed tickling ticklingly ticklish ticklishly ticklishness tickly tickney tickproof tickseed tickseeded ticktack ticktacker ticktacktoe ticktick ticktock tickweed ticky ticul Ticuna Ticunan tid tidal tidally tidbit tiddle tiddledywinks tiddler tiddley tiddling tiddlywink tiddlywinking tiddy tide tided tideful tidehead tideland tideless tidelessness tidelike tidely tidemaker tidemaking tidemark tiderace tidesman tidesurveyor Tideswell tidewaiter tidewaitership tideward tidewater tideway tidiable tidily tidiness tiding tidingless tidings tidley tidological tidology tidy tidyism tidytips tie tieback tied Tiefenthal tiemaker tiemaking tiemannite tien tiepin tier tierce tierced tierceron tiered tierer tierlike tiersman tietick tiewig tiewigged tiff tiffany tiffanyite tiffie tiffin tiffish tiffle tiffy tifinagh tift tifter tig tige tigella tigellate tigelle tigellum tigellus tiger tigerbird tigereye tigerflower tigerfoot tigerhearted tigerhood tigerish tigerishly tigerishness tigerism tigerkin tigerlike tigerling tigerly tigernut tigerproof tigerwood tigery Tigger tigger tight tighten tightener tightfisted tightish tightly tightness tightrope tights tightwad tightwire tiglaldehyde tiglic tiglinic tignum Tigrai Tigre Tigrean tigress tigresslike Tigridia Tigrina tigrine Tigris tigroid tigrolysis tigrolytic tigtag Tigua Tigurine Tiki tikitiki tikka tikker tiklin tikolosh tikor tikur til tilaite tilaka tilasite tilbury Tilda tilde tile tiled tilefish tilelike tilemaker tilemaking tiler tileroot tilery tileseed tilestone tileways tilework tileworks tilewright tileyard Tilia Tiliaceae tiliaceous tilikum tiling till tillable Tillaea Tillaeastrum tillage Tillamook Tillandsia tiller tillering tillerless tillerman Tilletia Tilletiaceae tilletiaceous tilley tillite tillodont Tillodontia Tillodontidae tillot tillotter tilly tilmus tilpah Tilsit tilt tiltable tiltboard tilter tilth tilting tiltlike tiltmaker tiltmaking tiltup tilty tiltyard tilyer Tim timable Timaeus Timalia Timaliidae Timaliinae timaliine timaline Timani timar timarau timawa timazite timbal timbale timbang timbe timber timbered timberer timberhead timbering timberjack timberland timberless timberlike timberling timberman timbermonger timbern timbersome timbertuned timberwood timberwork timberwright timbery timberyard Timbira timbo timbre timbrel timbreled timbreler timbrologist timbrology timbromania timbromaniac timbromanist timbrophilic timbrophilism timbrophilist timbrophily time timeable timecard timed timeful timefully timefulness timekeep timekeeper timekeepership timeless timelessly timelessness Timelia Timeliidae timeliine timelily timeliness timeling timely timenoguy timeous timeously timepiece timepleaser timeproof timer times timesaver timesaving timeserver timeserving timeservingness timetable timetaker timetaking timeward timework timeworker timeworn Timias timid timidity timidly timidness timing timish timist Timne Timo timocracy timocratic timocratical Timon timon timoneer Timonian Timonism Timonist Timonize timor Timorese timorous timorously timorousness Timote Timotean Timothean Timothy timothy timpani timpanist timpano Timucua Timucuan Timuquan Timuquanan tin Tina Tinamidae tinamine tinamou tinampipi tincal tinchel tinchill tinclad tinct tinction tinctorial tinctorially tinctorious tinctumutation tincture tind tindal tindalo tinder tinderbox tindered tinderish tinderlike tinderous tindery tine tinea tineal tinean tined tinegrass tineid Tineidae Tineina tineine tineman tineoid Tineoidea tinetare tinety tineweed tinful Ting ting tinge tinged tinger Tinggian tingi tingibility tingible tingid Tingidae Tingis tingitid Tingitidae tinglass tingle tingler tingletangle tingling tinglingly tinglish tingly tingtang tinguaite tinguaitic Tinguian tinguy tinhorn tinhouse tinily tininess tining tink tinker tinkerbird tinkerdom tinkerer tinkerlike tinkerly tinkershire tinkershue tinkerwise tinkle tinkler tinklerman tinkling tinklingly tinkly tinlet tinlike tinman Tinne tinned tinner tinnery tinnet Tinni tinnified tinnily tinniness tinning tinnitus tinnock tinny Tino Tinoceras tinosa tinsel tinsellike tinselly tinselmaker tinselmaking tinselry tinselweaver tinselwork tinsman tinsmith tinsmithing tinsmithy tinstone tinstuff tint tinta tintage tintamarre tintarron tinted tinter tintie tintiness tinting tintingly tintinnabula tintinnabulant tintinnabular tintinnabulary tintinnabulate tintinnabulation tintinnabulatory tintinnabulism tintinnabulist tintinnabulous tintinnabulum tintist tintless tintometer tintometric tintometry tinty tintype tintyper tinwald tinware tinwoman tinwork tinworker tinworking tiny tinzenite Tionontates Tionontati Tiou tip tipburn tipcart tipcat tipe tipful tiphead Tiphia Tiphiidae tipiti tiple tipless tiplet tipman tipmost tiponi tippable tipped tippee tipper tippet tipping tipple tippleman tippler tipply tipproof tippy tipsification tipsifier tipsify tipsily tipsiness tipstaff tipster tipstock tipsy tiptail tipteerer tiptilt tiptoe tiptoeing tiptoeingly tiptop tiptopness tiptopper tiptoppish tiptoppishness tiptopsome Tipula Tipularia tipulid Tipulidae tipuloid Tipuloidea tipup Tipura tirade tiralee tire tired tiredly tiredness tiredom tirehouse tireless tirelessly tirelessness tiremaid tiremaker tiremaking tireman tirer tireroom tiresmith tiresome tiresomely tiresomeness tiresomeweed tirewoman Tirhutia tiriba tiring tiringly tirl tirma tirocinium Tirolean Tirolese Tironian tirr tirralirra tirret Tirribi tirrivee tirrlie tirrwirr tirthankara Tirurai tirve tirwit tisane tisar Tishiya Tishri Tisiphone tissual tissue tissued tissueless tissuelike tissuey tisswood tiswin tit Titan titanate titanaugite Titanesque Titaness titania Titanian Titanic titanic Titanical Titanically Titanichthyidae Titanichthys titaniferous titanifluoride Titanism titanite titanitic titanium Titanlike titano titanocolumbate titanocyanide titanofluoride Titanolater Titanolatry Titanomachia Titanomachy titanomagnetite titanoniobate titanosaur Titanosaurus titanosilicate titanothere Titanotheridae Titanotherium titanous titanyl titar titbit titbitty tite titer titeration titfish tithable tithal tithe tithebook titheless tithemonger tithepayer tither titheright tithing tithingman tithingpenny tithonic tithonicity tithonographic tithonometer Tithymalopsis Tithymalus titi Titian titian Titianesque Titianic titien Tities titilate titillability titillant titillater titillating titillatingly titillation titillative titillator titillatory titivate titivation titivator titlark title titleboard titled titledom titleholder titleless titleproof titler titleship titlike titling titlist titmal titman Titmarsh Titmarshian titmouse Titoism Titoist titoki titrable titratable titrate titration titre titrimetric titrimetry titter titterel titterer tittering titteringly tittery tittie tittle tittlebat tittler tittup tittupy titty tittymouse titubancy titubant titubantly titubate titubation titular titularity titularly titulary titulation titule titulus Titurel Titus tiver Tivoli tivoli tivy Tiwaz tiza tizeur tizzy tjanting tji tjosite tlaco Tlakluit Tlapallan Tlascalan Tlingit tmema Tmesipteris tmesis to toa toad toadback toadeat toadeater toader toadery toadess toadfish toadflax toadflower toadhead toadier toadish toadless toadlet toadlike toadlikeness toadling toadpipe toadroot toadship toadstone toadstool toadstoollike toadwise toady toadyish toadyism toadyship Toag toast toastable toastee toaster toastiness toastmaster toastmastery toastmistress toasty toat toatoa Toba tobacco tobaccofied tobaccoism tobaccoite tobaccoless tobaccolike tobaccoman tobacconalian tobacconist tobacconistical tobacconize tobaccophil tobaccoroot tobaccoweed tobaccowood tobaccoy tobe Tobiah Tobias Tobikhar tobine tobira toboggan tobogganeer tobogganer tobogganist Toby toby tobyman tocalote toccata Tocharese Tocharian Tocharic Tocharish tocher tocherless tock toco Tocobaga tocodynamometer tocogenetic tocogony tocokinin tocological tocologist tocology tocome tocometer tocopherol tocororo tocsin tocusso Tod tod Toda today todayish Todd todder toddick toddite toddle toddlekins toddler toddy toddyize toddyman tode Todea Todidae Todus tody toe toeboard toecap toecapped toed toeless toelike toellite toenail toeplate Toerless toernebohmite toetoe toff toffee toffeeman toffing toffish toffy toffyman Tofieldia Toft toft tofter toftman toftstead tofu tog toga togaed togalike togata togate togated togawise together togetherhood togetheriness togetherness toggel toggery toggle toggler togless togs togt togue toher toheroa toho Tohome tohubohu tohunga toi toil toiled toiler toilet toileted toiletry toilette toiletted toiletware toilful toilfully toilinet toiling toilingly toilless toillessness toilsome toilsomely toilsomeness toilworn toise toit toitish toity Tokay tokay toke Tokelau token tokened tokenless toko tokology tokonoma tokopat tol tolamine tolan tolane tolbooth told toldo tole Toledan Toledo Toledoan tolerability tolerable tolerableness tolerablish tolerably tolerance tolerancy Tolerant tolerant tolerantism tolerantly tolerate toleration tolerationism tolerationist tolerative tolerator tolerism Toletan tolfraedic tolguacha tolidine tolite toll tollable tollage tollbooth Tollefsen toller tollery tollgate tollgatherer tollhouse tolliker tolling tollkeeper tollman tollmaster tollpenny tolltaker tolly Tolowa tolpatch tolpatchery tolsester tolsey Tolstoyan Tolstoyism Tolstoyist tolt Toltec Toltecan tolter tolu tolualdehyde toluate toluene toluic toluide toluidide toluidine toluidino toluido Toluifera tolunitrile toluol toluquinaldine tolusafranine toluyl toluylene toluylenediamine toluylic tolyl tolylene tolylenediamine Tolypeutes tolypeutine Tom Toma tomahawk tomahawker tomalley toman Tomas tomatillo tomato tomb tombac tombal tombe tombic tombless tomblet tomblike tombola tombolo tomboy tomboyful tomboyish tomboyishly tomboyishness tomboyism tombstone tomcat tomcod tome tomeful tomelet toment tomentose tomentous tomentulose tomentum tomfool tomfoolery tomfoolish tomfoolishness tomial tomin tomish Tomistoma tomium tomjohn Tomkin tomkin Tommer Tomming Tommy tommy tommybag tommycod tommyrot tomnoddy tomnoup tomogram tomographic tomography Tomopteridae Tomopteris tomorn tomorrow tomorrower tomorrowing tomorrowness tomosis Tompion tompiper tompon tomtate tomtit Tomtitmouse ton tonal tonalamatl tonalist tonalite tonalitive tonality tonally tonant tonation tondino tone toned toneless tonelessly tonelessness toneme toneproof toner tonetic tonetically tonetician tonetics tong Tonga tonga Tongan Tongas tonger tongkang tongman Tongrian tongs tongsman tongue tonguecraft tongued tonguedoughty tonguefence tonguefencer tongueflower tongueful tongueless tonguelet tonguelike tongueman tonguemanship tongueplay tongueproof tonguer tongueshot tonguesman tonguesore tonguester tonguetip tonguey tonguiness tonguing tonic tonically tonicity tonicize tonicobalsamic tonicoclonic tonicostimulant tonify tonight Tonikan tonish tonishly tonishness tonite tonitrocirrus tonitruant tonitruone tonitruous tonjon tonk Tonkawa Tonkawan tonkin Tonkinese tonlet Tonna tonnage tonneau tonneaued tonner tonnish tonnishly tonnishness tonoclonic tonogram tonograph tonological tonology tonometer tonometric tonometry tonophant tonoplast tonoscope tonotactic tonotaxis tonous tonsbergite tonsil tonsilectomy tonsilitic tonsillar tonsillary tonsillectome tonsillectomic tonsillectomize tonsillectomy tonsillith tonsillitic tonsillitis tonsillolith tonsillotome tonsillotomy tonsilomycosis tonsor tonsorial tonsurate tonsure tonsured tontine tontiner Tonto tonus Tony tony tonyhoop too toodle toodleloodle took tooken tool toolbox toolbuilder toolbuilding tooler toolhead toolholder toolholding tooling toolless toolmaker toolmaking toolman toolmark toolmarking toolplate toolroom toolsetter toolslide toolsmith toolstock toolstone toom toomly toon Toona toonwood toop toorie toorock tooroo toosh toot tooter tooth toothache toothaching toothachy toothbill toothbrush toothbrushy toothchiseled toothcomb toothcup toothdrawer toothdrawing toothed toother toothflower toothful toothill toothing toothless toothlessly toothlessness toothlet toothleted toothlike toothpick toothplate toothproof toothsome toothsomely toothsomeness toothstick toothwash toothwork toothwort toothy tootle tootler tootlish tootsy toozle toozoo top topalgia toparch toparchia toparchical toparchy topass Topatopa topaz topazfels topazine topazite topazolite topazy topcap topcast topchrome topcoat topcoating tope topectomy topee topeewallah topeng topepo toper toperdom topesthesia topflight topfull topgallant toph tophaceous tophaike Tophet tophetic tophetize tophus tophyperidrosis topi topia topiarian topiarist topiarius topiary topic topical topicality topically topinambou Topinish topknot topknotted topless toplighted toplike topline toploftical toploftily toploftiness toplofty topmaker topmaking topman topmast topmost topmostly topnotch topnotcher topo topoalgia topochemical topognosia topognosis topograph topographer topographic topographical topographically topographics topographist topographize topographometric topography topolatry topologic topological topologist topology toponarcosis toponym toponymal toponymic toponymical toponymics toponymist toponymy topophobia topophone topotactic topotaxis topotype topotypic topotypical topped topper toppiece topping toppingly toppingness topple toppler topply toppy toprail toprope tops topsail topsailite topside topsl topsman topsoil topstone topswarm Topsy topsyturn toptail topwise toque Tor tor tora torah Toraja toral toran torbanite torbanitic torbernite torc torcel torch torchbearer torchbearing torcher torchless torchlight torchlighted torchlike torchman torchon torchweed torchwood torchwort torcular torculus tordrillite tore toreador tored Torenia torero toreumatography toreumatology toreutic toreutics torfaceous torfel torgoch Torgot toric Toriest Torified torii Torilis Torinese Toriness torma tormen torment tormenta tormentable tormentation tormentative tormented tormentedly tormentful tormentil tormentilla tormenting tormentingly tormentingness tormentive tormentor tormentous tormentress tormentry tormentum tormina torminal torminous tormodont torn tornachile tornade tornadic tornado tornadoesque tornadoproof tornal tornaria tornarian tornese torney tornillo Tornit tornote tornus toro toroid toroidal torolillo Toromona Torontonian tororokombu Torosaurus torose torosity torotoro torous torpedineer Torpedinidae torpedinous torpedo torpedoer torpedoist torpedolike torpedoplane torpedoproof torpent torpescence torpescent torpid torpidity torpidly torpidness torpify torpitude torpor torporific torporize torquate torquated torque torqued torques torrefaction torrefication torrefy torrent torrentful torrentfulness torrential torrentiality torrentially torrentine torrentless torrentlike torrentuous torrentwise Torreya Torricellian torrid torridity torridly torridness Torridonian Torrubia torsade torse torsel torsibility torsigraph torsile torsimeter torsiogram torsiograph torsiometer torsion torsional torsionally torsioning torsionless torsive torsk torso torsoclusion torsometer torsoocclusion Torsten tort torta torteau torticollar torticollis torticone tortile tortility tortilla tortille tortious tortiously tortive tortoise tortoiselike Tortonian tortrices tortricid Tortricidae Tortricina tortricine tortricoid Tortricoidea Tortrix tortula Tortulaceae tortulaceous tortulous tortuose tortuosity tortuous tortuously tortuousness torturable torturableness torture tortured torturedly tortureproof torturer torturesome torturing torturingly torturous torturously toru torula torulaceous torulaform toruliform torulin toruloid torulose torulosis torulous torulus torus torve torvid torvity torvous Tory tory Torydom Toryess Toryfication Toryfy toryhillite Toryish Toryism Toryistic Toryize Toryship toryweed tosaphist tosaphoth toscanite Tosephta Tosephtas tosh toshakhana tosher toshery toshly toshnail toshy tosily Tosk Toskish toss tosser tossicated tossily tossing tossingly tossment tosspot tossup tossy tost tosticate tostication toston tosy tot total totalitarian totalitarianism totality totalization totalizator totalize totalizer totally totalness totanine Totanus totaquin totaquina totaquine totara totchka tote toteload totem totemic totemically totemism totemist totemistic totemite totemization totemy toter tother totient Totipalmatae totipalmate totipalmation totipotence totipotency totipotent totipotential totipotentiality totitive toto Totonac Totonacan Totonaco totora Totoro totquot totter totterer tottergrass tottering totteringly totterish tottery Tottie totting tottle tottlish totty tottyhead totuava totum toty totyman tou toucan toucanet Toucanid touch touchable touchableness touchback touchbell touchbox touchdown touched touchedness toucher touchhole touchily touchiness touching touchingly touchingness touchless touchline touchous touchpan touchpiece touchstone touchwood touchy Toufic toug tough toughen toughener toughhead toughhearted toughish toughly toughness tought tould toumnah Tounatea toup toupee toupeed toupet tour touraco tourbillion tourer tourette touring tourism tourist touristdom touristic touristproof touristry touristship touristy tourize tourmaline tourmalinic tourmaliniferous tourmalinization tourmalinize tourmalite tourn tournament tournamental tournant tournasin tournay tournee Tournefortia Tournefortian tourney tourneyer tourniquet tourte tousche touse touser tousle tously tousy tout touter Tovah tovar Tovaria Tovariaceae tovariaceous tovarish tow towable towage towai towan toward towardliness towardly towardness towards towboat towcock towd towel towelette toweling towelry tower towered towering toweringly towerless towerlet towerlike towerman towerproof towerwise towerwork towerwort towery towght towhead towheaded towhee towing towkay towlike towline towmast town towned townee towner townet townfaring townfolk townful towngate townhood townify towniness townish townishly townishness townist townland townless townlet townlike townling townly townman townsboy townscape Townsendia Townsendite townsfellow townsfolk township townside townsite townsman townspeople townswoman townward townwards townwear towny towpath towrope towser towy tox toxa toxalbumic toxalbumin toxalbumose toxamin toxanemia toxaphene toxcatl toxemia toxemic toxic toxicaemia toxical toxically toxicant toxicarol toxication toxicemia toxicity toxicodendrol Toxicodendron toxicoderma toxicodermatitis toxicodermatosis toxicodermia toxicodermitis toxicogenic toxicognath toxicohaemia toxicohemia toxicoid toxicologic toxicological toxicologically toxicologist toxicology toxicomania toxicopathic toxicopathy toxicophagous toxicophagy toxicophidia toxicophobia toxicosis toxicotraumatic toxicum toxidermic toxidermitis toxifer Toxifera toxiferous toxigenic toxihaemia toxihemia toxiinfection toxiinfectious toxin toxinemia toxinfection toxinfectious toxinosis toxiphobia toxiphobiac toxiphoric toxitabellae toxity Toxodon toxodont Toxodontia toxogenesis Toxoglossa toxoglossate toxoid toxology toxolysis toxon toxone toxonosis toxophil toxophile toxophilism toxophilite toxophilitic toxophilitism toxophilous toxophily toxophoric toxophorous toxoplasmosis toxosis toxosozin Toxostoma toxotae Toxotes Toxotidae Toxylon toy toydom toyer toyful toyfulness toyhouse toying toyingly toyish toyishly toyishness toyland toyless toylike toymaker toymaking toyman toyon toyshop toysome toytown toywoman toywort toze tozee tozer tra trabacolo trabal trabant trabascolo trabea trabeae trabeatae trabeated trabeation trabecula trabecular trabecularism trabeculate trabeculated trabeculation trabecule trabuch trabucho Tracaulon trace traceability traceable traceableness traceably traceless tracelessly tracer traceried tracery Tracey trachea tracheaectasy tracheal trachealgia trachealis trachean Trachearia trachearian tracheary Tracheata tracheate tracheation tracheid tracheidal tracheitis trachelagra trachelate trachelectomopexia trachelectomy trachelismus trachelitis trachelium tracheloacromialis trachelobregmatic tracheloclavicular trachelocyllosis trachelodynia trachelology trachelomastoid trachelopexia tracheloplasty trachelorrhaphy tracheloscapular Trachelospermum trachelotomy trachenchyma tracheobronchial tracheobronchitis tracheocele tracheochromatic tracheoesophageal tracheofissure tracheolar tracheolaryngeal tracheolaryngotomy tracheole tracheolingual tracheopathia tracheopathy tracheopharyngeal Tracheophonae tracheophone tracheophonesis tracheophonine tracheophony tracheoplasty tracheopyosis tracheorrhagia tracheoschisis tracheoscopic tracheoscopist tracheoscopy tracheostenosis tracheostomy tracheotome tracheotomist tracheotomize tracheotomy Trachinidae trachinoid Trachinus trachitis trachle Trachodon trachodont trachodontid Trachodontidae Trachoma trachomatous Trachomedusae trachomedusan trachyandesite trachybasalt trachycarpous Trachycarpus trachychromatic trachydolerite trachyglossate Trachylinae trachyline Trachymedusae trachymedusan trachyphonia trachyphonous Trachypteridae trachypteroid Trachypterus trachyspermous trachyte trachytic trachytoid tracing tracingly track trackable trackage trackbarrow tracked tracker trackhound trackingscout tracklayer tracklaying trackless tracklessly tracklessness trackman trackmanship trackmaster trackscout trackshifter tracksick trackside trackwalker trackway trackwork tract tractability tractable tractableness tractably tractarian Tractarianism tractarianize tractate tractator tractatule tractellate tractellum tractiferous tractile tractility traction tractional tractioneering Tractite tractlet tractor tractoration tractorism tractorist tractorization tractorize tractory tractrix Tracy tradable tradal trade tradecraft tradeful tradeless trademaster trader tradership Tradescantia tradesfolk tradesman tradesmanlike tradesmanship tradesmanwise tradespeople tradesperson tradeswoman tradiment trading tradite tradition traditional traditionalism traditionalist traditionalistic traditionality traditionalize traditionally traditionarily traditionary traditionate traditionately traditioner traditionism traditionist traditionitis traditionize traditionless traditionmonger traditious traditive traditor traditores traditorship traduce traducement traducent traducer traducian traducianism traducianist traducianistic traducible traducing traducingly traduction traductionist trady traffic trafficability trafficable trafficableness trafficless trafficway trafflicker trafflike trag tragacanth tragacantha tragacanthin tragal Tragasol tragedial tragedian tragedianess tragedical tragedienne tragedietta tragedist tragedization tragedize tragedy tragelaph tragelaphine Tragelaphus tragi tragic tragical tragicality tragically tragicalness tragicaster tragicize tragicly tragicness tragicofarcical tragicoheroicomic tragicolored tragicomedian tragicomedy tragicomic tragicomical tragicomicality tragicomically tragicomipastoral tragicoromantic tragicose tragopan Tragopogon Tragulidae Tragulina traguline traguloid Traguloidea Tragulus tragus trah traheen traik trail trailer trailery trailiness trailing trailingly trailless trailmaker trailmaking trailman trailside trailsman traily train trainable trainage trainagraph trainband trainbearer trainbolt trainboy trained trainee trainer trainful training trainless trainload trainman trainmaster trainsick trainster traintime trainway trainy traipse trait traitless traitor traitorhood traitorism traitorize traitorlike traitorling traitorous traitorously traitorousness traitorship traitorwise traitress traject trajectile trajection trajectitious trajectory trajet tralatician tralaticiary tralatition tralatitious tralatitiously tralira Trallian tram trama tramal tramcar trame Trametes tramful tramless tramline tramman trammel trammeled trammeler trammelhead trammeling trammelingly trammelled trammellingly trammer tramming trammon tramontane tramp trampage trampdom tramper trampess tramphood trampish trampishly trampism trample trampler tramplike trampolin trampoline trampoose trampot tramroad tramsmith tramway tramwayman tramyard Tran trance tranced trancedly tranceful trancelike tranchefer tranchet trancoidal traneen trank tranka tranker trankum tranky tranquil tranquility tranquilization tranquilize tranquilizer tranquilizing tranquilizingly tranquillity tranquillization tranquillize tranquilly tranquilness transaccidentation transact transaction transactional transactionally transactioneer transactor transalpine transalpinely transalpiner transamination transanimate transanimation transannular transapical transappalachian transaquatic transarctic transatlantic transatlantically transatlantican transatlanticism transaudient transbaikal transbaikalian transbay transboard transborder transcalency transcalent transcalescency transcalescent Transcaucasian transceiver transcend transcendence transcendency transcendent transcendental transcendentalism transcendentalist transcendentalistic transcendentality transcendentalize transcendentally transcendently transcendentness transcendible transcending transcendingly transcendingness transcension transchannel transcolor transcoloration transconductance transcondylar transcondyloid transconscious transcontinental transcorporate transcorporeal transcortical transcreate transcribable transcribble transcribbler transcribe transcriber transcript transcription transcriptional transcriptionally transcriptitious transcriptive transcriptively transcriptural transcrystalline transcurrent transcurrently transcurvation transdermic transdesert transdialect transdiaphragmatic transdiurnal transducer transduction transect transection transelement transelementate transelementation transempirical transenna transept transeptal transeptally transequatorial transessentiate transeunt transexperiential transfashion transfeature transfer transferability transferable transferableness transferably transferal transferee transference transferent transferential transferography transferor transferotype transferred transferrer transferribility transferring transferror transferrotype transfigurate transfiguration transfigurative transfigure transfigurement transfiltration transfinite transfix transfixation transfixion transfixture transfluent transfluvial transflux transforation transform transformability transformable transformance transformation transformationist transformative transformator transformer transforming transformingly transformism transformist transformistic transfrontal transfrontier transfuge transfugitive transfuse transfuser transfusible transfusion transfusionist transfusive transfusively transgredient transgress transgressible transgressing transgressingly transgression transgressional transgressive transgressively transgressor transhape transhuman transhumanate transhumanation transhumance transhumanize transhumant transience transiency transient transiently transientness transigence transigent transiliac transilience transiliency transilient transilluminate transillumination transilluminator transimpression transincorporation transindividual transinsular transire transischiac transisthmian transistor transit transitable transiter transition transitional transitionally transitionalness transitionary transitionist transitival transitive transitively transitiveness transitivism transitivity transitman transitorily transitoriness transitory transitus Transjordanian translade translatable translatableness translate translater translation translational translationally translative translator translatorese translatorial translatorship translatory translatress translatrix translay transleithan transletter translinguate transliterate transliteration transliterator translocalization translocate translocation translocatory translucence translucency translucent translucently translucid transmarginal transmarine transmaterial transmateriation transmedial transmedian transmental transmentation transmeridional transmethylation transmigrant transmigrate transmigration transmigrationism transmigrationist transmigrative transmigratively transmigrator transmigratory transmissibility transmissible transmission transmissional transmissionist transmissive transmissively transmissiveness transmissivity transmissometer transmissory transmit transmittable transmittal transmittance transmittancy transmittant transmitter transmittible transmogrification transmogrifier transmogrify transmold transmontane transmorphism transmundane transmural transmuscle transmutability transmutable transmutableness transmutably transmutation transmutational transmutationist transmutative transmutatory transmute transmuter transmuting transmutive transmutual transnatation transnational transnatural transnaturation transnature transnihilation transnormal transocean transoceanic transocular transom transomed transonic transorbital transpacific transpadane transpalatine transpalmar transpanamic transparence transparency transparent transparentize transparently transparentness transparietal transparish transpeciate transpeciation transpeer transpenetrable transpeninsular transperitoneal transperitoneally transpersonal transphenomenal transphysical transpicuity transpicuous transpicuously transpierce transpirability transpirable transpiration transpirative transpiratory transpire transpirometer transplace transplant transplantability transplantable transplantar transplantation transplantee transplanter transplendency transplendent transplendently transpleural transpleurally transpolar transponibility transponible transpontine transport transportability transportable transportableness transportal transportance transportation transportational transportationist transportative transported transportedly transportedness transportee transporter transporting transportingly transportive transportment transposability transposable transposableness transposal transpose transposer transposition transpositional transpositive transpositively transpositor transpository transpour transprint transprocess transprose transproser transpulmonary transpyloric transradiable transrational transreal transrectification transrhenane transrhodanian transriverine transsegmental transsensual transseptal transsepulchral transshape transshift transship transshipment transsolid transstellar transsubjective transtemporal Transteverine transthalamic transthoracic transubstantial transubstantially transubstantiate transubstantiation transubstantiationalist transubstantiationite transubstantiative transubstantiatively transubstantiatory transudate transudation transudative transudatory transude transumpt transumption transumptive transuranian transuranic transuranium transuterine transvaal Transvaaler Transvaalian transvaluate transvaluation transvalue transvasate transvasation transvase transvectant transvection transvenom transverbate transverbation transverberate transverberation transversal transversale transversalis transversality transversally transversan transversary transverse transversely transverseness transverser transversion transversive transversocubital transversomedial transversospinal transversovertical transversum transversus transvert transverter transvest transvestism transvestite transvestitism transvolation transwritten Transylvanian trant tranter trantlum Tranzschelia trap Trapa Trapaceae trapaceous trapball trapes trapezate trapeze trapezia trapezial trapezian trapeziform trapezing trapeziometacarpal trapezist trapezium trapezius trapezohedral trapezohedron trapezoid trapezoidal trapezoidiform trapfall traphole trapiferous traplight traplike trapmaker trapmaking trappean trapped trapper trapperlike trappiness trapping trappingly Trappist trappist Trappistine trappoid trappose trappous trappy traprock traps trapshoot trapshooter trapshooting trapstick trapunto trasformism trash trashery trashify trashily trashiness traship trashless trashrack trashy trass Trastevere Trasteverine trasy traulism trauma traumasthenia traumatic traumatically traumaticin traumaticine traumatism traumatize traumatology traumatonesis traumatopnea traumatopyra traumatosis traumatotactic traumatotaxis traumatropic traumatropism Trautvetteria travail travale travally travated trave travel travelability travelable traveldom traveled traveler traveleress travelerlike traveling travellability travellable travelled traveller travelogue traveloguer traveltime traversable traversal traversary traverse traversed traversely traverser traversewise traversework traversing traversion travertin travertine travestier travestiment travesty Travis travis travois travoy trawl trawlboat trawler trawlerman trawlnet tray trayful traylike treacher treacherous treacherously treacherousness treachery treacle treaclelike treaclewort treacliness treacly tread treadboard treader treading treadle treadler treadmill treadwheel treason treasonable treasonableness treasonably treasonful treasonish treasonist treasonless treasonmonger treasonous treasonously treasonproof treasurable treasure treasureless treasurer treasurership treasuress treasurous treasury treasuryship treat treatable treatableness treatably treatee treater treating treatise treatiser treatment treator treaty treatyist treatyite treatyless Trebellian treble trebleness trebletree trebly trebuchet trecentist trechmannite treckschuyt Treculia treddle tredecile tredille tree treebeard treebine treed treefish treeful treehair treehood treeify treeiness treeless treelessness treelet treelike treeling treemaker treemaking treeman treen treenail treescape treeship treespeeler treetop treeward treewards treey tref trefgordd trefle trefoil trefoiled trefoillike trefoilwise tregadyne tregerg tregohm trehala trehalase trehalose treillage trek trekker trekometer trekpath trellis trellised trellislike trelliswork Trema Tremandra Tremandraceae tremandraceous Trematoda trematode Trematodea Trematodes trematoid Trematosaurus tremble tremblement trembler trembling tremblingly tremblingness tremblor trembly Tremella Tremellaceae tremellaceous Tremellales tremelliform tremelline tremellineous tremelloid tremellose tremendous tremendously tremendousness tremetol tremie tremolando tremolant tremolist tremolite tremolitic tremolo tremor tremorless tremorlessly tremulant tremulate tremulation tremulous tremulously tremulousness trenail trench trenchancy trenchant trenchantly trenchantness trenchboard trenched trencher trencherless trencherlike trenchermaker trenchermaking trencherman trencherside trencherwise trencherwoman trenchful trenchlet trenchlike trenchmaster trenchmore trenchward trenchwise trenchwork trend trendle Trent trental Trentepohlia Trentepohliaceae trentepohliaceous Trentine Trenton trepan trepanation trepang trepanize trepanner trepanning trepanningly trephination trephine trephiner trephocyte trephone trepid trepidancy trepidant trepidate trepidation trepidatory trepidity trepidly trepidness Treponema treponematous treponemiasis treponemiatic treponemicidal treponemicide Trepostomata trepostomatous Treron Treronidae Treroninae tresaiel trespass trespassage trespasser trespassory tress tressed tressful tressilate tressilation tressless tresslet tresslike tresson tressour tressure tressured tressy trest trestle trestletree trestlewise trestlework trestling tret trevally trevet Trevor trews trewsman Trey trey tri triable triableness triace triacetamide triacetate triacetonamine triachenium triacid triacontaeterid triacontane triaconter triact triactinal triactine triad triadelphous Triadenum triadic triadical triadically triadism triadist triaene triaenose triage triagonal triakisicosahedral triakisicosahedron triakisoctahedral triakisoctahedrid triakisoctahedron triakistetrahedral triakistetrahedron trial trialate trialism trialist triality trialogue triamid triamide triamine triamino triammonium triamylose triander Triandria triandrian triandrous triangle triangled triangler triangleways trianglewise trianglework Triangula triangular triangularity triangularly triangulate triangulately triangulation triangulator Triangulid trianguloid triangulopyramidal triangulotriangular Triangulum triannual triannulate Trianon Triantaphyllos triantelope trianthous triapsal triapsidal triarch triarchate triarchy triarctic triarcuated triareal triarii Triarthrus triarticulate Trias Triassic triaster triatic Triatoma triatomic triatomicity triaxial triaxon triaxonian triazane triazin triazine triazo triazoic triazole triazolic tribade tribadism tribady tribal tribalism tribalist tribally tribarred tribase tribasic tribasicity tribasilar tribble tribe tribeless tribelet tribelike tribesfolk tribeship tribesman tribesmanship tribespeople tribeswoman triblastic triblet triboelectric triboelectricity tribofluorescence tribofluorescent Tribolium triboluminescence triboluminescent tribometer Tribonema Tribonemaceae tribophosphorescence tribophosphorescent tribophosphoroscope triborough tribrac tribrach tribrachial tribrachic tribracteate tribracteolate tribromacetic tribromide tribromoethanol tribromophenol tribromphenate tribromphenol tribual tribually tribular tribulate tribulation tribuloid Tribulus tribuna tribunal tribunate tribune tribuneship tribunitial tribunitian tribunitiary tribunitive tributable tributarily tributariness tributary tribute tributer tributist tributorian tributyrin trica tricae tricalcic tricalcium tricapsular tricar tricarballylic tricarbimide tricarbon tricarboxylic tricarinate tricarinated tricarpellary tricarpellate tricarpous tricaudal tricaudate trice tricellular tricenarious tricenarium tricenary tricennial tricentenarian tricentenary tricentennial tricentral tricephal tricephalic tricephalous tricephalus triceps Triceratops triceria tricerion tricerium trichatrophia trichauxis Trichechidae trichechine trichechodont Trichechus trichevron trichi trichia trichiasis Trichilia Trichina trichina trichinae trichinal Trichinella trichiniasis trichiniferous trichinization trichinize trichinoid trichinopoly trichinoscope trichinoscopy trichinosed trichinosis trichinotic trichinous trichite trichitic trichitis trichiurid Trichiuridae trichiuroid Trichiurus trichloride trichlormethane trichloro trichloroacetic trichloroethylene trichloromethane trichloromethyl trichobacteria trichobezoar trichoblast trichobranchia trichobranchiate trichocarpous trichocephaliasis Trichocephalus trichoclasia trichoclasis trichocyst trichocystic trichode Trichoderma Trichodesmium Trichodontidae trichoepithelioma trichogen trichogenous trichoglossia Trichoglossidae Trichoglossinae trichoglossine Trichogramma Trichogrammatidae trichogyne trichogynial trichogynic trichoid Tricholaena trichological trichologist trichology Tricholoma trichoma Trichomanes trichomaphyte trichomatose trichomatosis trichomatous trichome trichomic trichomonad Trichomonadidae Trichomonas trichomoniasis trichomycosis trichonosus trichopathic trichopathy trichophore trichophoric trichophyllous trichophyte trichophytia trichophytic Trichophyton trichophytosis Trichoplax trichopore trichopter Trichoptera trichoptera trichopteran trichopteron trichopterous trichopterygid Trichopterygidae trichord trichorrhea trichorrhexic trichorrhexis Trichosanthes trichoschisis trichosis trichosporange trichosporangial trichosporangium Trichosporum trichostasis Trichostema trichostrongyle trichostrongylid Trichostrongylus trichothallic trichotillomania trichotomic trichotomism trichotomist trichotomize trichotomous trichotomously trichotomy trichroic trichroism trichromat trichromate trichromatic trichromatism trichromatist trichrome trichromic trichronous trichuriasis Trichuris trichy Tricia tricinium tricipital tricircular trick tricker trickery trickful trickily trickiness tricking trickingly trickish trickishly trickishness trickle trickless tricklet tricklike trickling tricklingly trickly trickment trickproof tricksical tricksily tricksiness tricksome trickster trickstering trickstress tricksy tricktrack tricky triclad Tricladida triclinate triclinia triclinial tricliniarch tricliniary triclinic triclinium triclinohedric tricoccose tricoccous tricolette tricolic tricolon tricolor tricolored tricolumnar tricompound triconch Triconodon triconodont Triconodonta triconodontid triconodontoid triconodonty triconsonantal triconsonantalism tricophorous tricorn tricornered tricornute tricorporal tricorporate tricoryphean tricosane tricosanone tricostate tricosyl tricosylic tricot tricotine tricotyledonous tricresol tricrotic tricrotism tricrotous tricrural tricurvate tricuspal tricuspid tricuspidal tricuspidate tricuspidated tricussate tricyanide tricycle tricyclene tricycler tricyclic tricyclist Tricyrtis Tridacna Tridacnidae tridactyl tridactylous tridaily triddler tridecane tridecene tridecilateral tridecoic tridecyl tridecylene tridecylic trident tridental tridentate tridentated tridentiferous Tridentine Tridentinian tridepside tridermic tridiametral tridiapason tridigitate tridimensional tridimensionality tridimensioned tridiurnal tridominium tridrachm triduan triduum tridymite tridynamous tried triedly trielaidin triene triennial trienniality triennially triennium triens triental Trientalis triequal trier trierarch trierarchal trierarchic trierarchy trierucin trieteric trieterics triethanolamine triethyl triethylamine triethylstibine trifa trifacial trifarious trifasciated triferous trifid trifilar trifistulary triflagellate trifle trifledom trifler triflet trifling triflingly triflingness trifloral triflorate triflorous trifluoride trifocal trifoil trifold trifoliate trifoliated trifoliolate trifoliosis Trifolium trifolium trifoly triforial triforium triform triformed triformin triformity triformous trifoveolate trifuran trifurcal trifurcate trifurcation trig trigamist trigamous trigamy trigeminal trigeminous trigeneric trigesimal trigger triggered triggerfish triggerless trigintal trigintennial Trigla triglandular triglid Triglidae triglochid Triglochin triglochin triglot trigly triglyceride triglyceryl triglyph triglyphal triglyphed triglyphic triglyphical trigness trigon Trigona trigonal trigonally trigone Trigonella trigonelline trigoneutic trigoneutism Trigonia Trigoniaceae trigoniacean trigoniaceous trigonic trigonid Trigoniidae trigonite trigonitis trigonocephalic trigonocephalous Trigonocephalus trigonocephaly trigonocerous trigonododecahedron trigonodont trigonoid trigonometer trigonometric trigonometrical trigonometrician trigonometry trigonon trigonotype trigonous trigonum trigram trigrammatic trigrammatism trigrammic trigraph trigraphic triguttulate trigyn Trigynia trigynian trigynous trihalide trihedral trihedron trihemeral trihemimer trihemimeral trihemimeris trihemiobol trihemiobolion trihemitetartemorion trihoral trihourly trihybrid trihydrate trihydrated trihydric trihydride trihydrol trihydroxy trihypostatic trijugate trijugous trijunction trikaya trike triker trikeria trikerion triketo triketone trikir trilabe trilabiate trilamellar trilamellated trilaminar trilaminate trilarcenous trilateral trilaterality trilaterally trilateralness trilaurin trilby trilemma trilinear trilineate trilineated trilingual trilinguar trilinolate trilinoleate trilinolenate trilinolenin Trilisa trilit trilite triliteral triliteralism triliterality triliterally triliteralness trilith trilithic trilithon trill trillachan trillet trilli Trilliaceae trilliaceous trillibub trilliin trilling trillion trillionaire trillionize trillionth Trillium trillium trillo trilobate trilobated trilobation trilobe trilobed Trilobita trilobite trilobitic trilocular triloculate trilogic trilogical trilogist trilogy Trilophodon trilophodont triluminar triluminous trim trimacer trimacular trimargarate trimargarin trimastigate trimellitic trimembral trimensual trimer Trimera trimercuric Trimeresurus trimeric trimeride trimerite trimerization trimerous trimesic trimesinic trimesitic trimesitinic trimester trimestral trimestrial trimesyl trimetalism trimetallic trimeter trimethoxy trimethyl trimethylacetic trimethylamine trimethylbenzene trimethylene trimethylmethane trimethylstibine trimetric trimetrical trimetrogon trimly trimmer trimming trimmingly trimness trimodal trimodality trimolecular trimonthly trimoric trimorph trimorphic trimorphism trimorphous trimotor trimotored trimstone trimtram trimuscular trimyristate trimyristin trin Trinacrian trinal trinality trinalize trinary trinational trindle trine trinely trinervate trinerve trinerved trineural Tringa tringine tringle tringoid Trinidadian trinidado Trinil Trinitarian trinitarian Trinitarianism trinitrate trinitration trinitride trinitrin trinitro trinitrocarbolic trinitrocellulose trinitrocresol trinitroglycerin trinitromethane trinitrophenol trinitroresorcin trinitrotoluene trinitroxylene trinitroxylol Trinity trinity trinityhood trink trinkerman trinket trinketer trinketry trinkety trinkle trinklement trinklet trinkums Trinobantes trinoctial trinodal trinode trinodine trinol trinomial trinomialism trinomialist trinomiality trinomially trinopticon Trinorantum Trinovant Trinovantes trintle trinucleate Trinucleus Trio trio triobol triobolon trioctile triocular triode triodia triodion Triodon Triodontes Triodontidae triodontoid Triodontoidea Triodontoidei Triodontophorus Trioecia trioecious trioeciously trioecism triolcous triole trioleate triolefin trioleic triolein triolet triology Trionychidae trionychoid Trionychoideachid trionychoidean trionym trionymal Trionyx trioperculate Triopidae Triops trior triorchis triorchism triorthogonal triose Triosteum triovulate trioxazine trioxide trioxymethylene triozonide trip tripal tripaleolate tripalmitate tripalmitin tripara tripart triparted tripartedly tripartible tripartient tripartite tripartitely tripartition tripaschal tripe tripedal tripel tripelike tripeman tripemonger tripennate tripenny tripeptide tripersonal tripersonalism tripersonalist tripersonality tripersonally tripery tripeshop tripestone tripetaloid tripetalous tripewife tripewoman triphammer triphane triphase triphaser Triphasia triphasic triphenyl triphenylamine triphenylated triphenylcarbinol triphenylmethane triphenylmethyl triphenylphosphine triphibian triphibious triphony Triphora triphthong triphyletic triphyline triphylite triphyllous Triphysite tripinnate tripinnated tripinnately tripinnatifid tripinnatisect Tripitaka triplane Triplaris triplasian triplasic triple tripleback triplefold triplegia tripleness triplet tripletail tripletree triplewise triplex triplexity triplicate triplication triplicative triplicature Triplice Triplicist triplicity triplicostate tripliform triplinerved tripling triplite triploblastic triplocaulescent triplocaulous Triplochitonaceae triploid triploidic triploidite triploidy triplopia triplopy triplum triplumbic triply tripmadam tripod tripodal tripodial tripodian tripodic tripodical tripody tripointed tripolar tripoli Tripoline tripoline Tripolitan tripolite tripos tripotassium trippant tripper trippet tripping trippingly trippingness trippist tripple trippler Tripsacum tripsill tripsis tripsome tripsomely triptane tripterous triptote triptych triptyque tripudial tripudiant tripudiary tripudiate tripudiation tripudist tripudium tripunctal tripunctate tripy Tripylaea tripylaean Tripylarian tripylarian tripyrenous triquadrantal triquetra triquetral triquetric triquetrous triquetrously triquetrum triquinate triquinoyl triradial triradially triradiate triradiated triradiately triradiation Triratna trirectangular triregnum trireme trirhombohedral trirhomboidal triricinolein trisaccharide trisaccharose trisacramentarian Trisagion trisalt trisazo trisceptral trisect trisected trisection trisector trisectrix triseme trisemic trisensory trisepalous triseptate triserial triserially triseriate triseriatim trisetose Trisetum trishna trisilane trisilicane trisilicate trisilicic trisinuate trisinuated triskele triskelion trismegist trismegistic trismic trismus trisoctahedral trisoctahedron trisodium trisome trisomic trisomy trisonant Trisotropis trispast trispaston trispermous trispinose trisplanchnic trisporic trisporous trisquare trist tristachyous Tristam Tristan Tristania tristate tristearate tristearin tristeness tristetrahedron tristeza tristful tristfully tristfulness tristich Tristichaceae tristichic tristichous tristigmatic tristigmatose tristiloquy tristisonous Tristram tristylous trisubstituted trisubstitution trisul trisula trisulcate trisulcated trisulphate trisulphide trisulphone trisulphonic trisulphoxide trisylabic trisyllabical trisyllabically trisyllabism trisyllabity trisyllable tritactic tritagonist tritangent tritangential tritanope tritanopia tritanopic tritaph trite Triteleia tritely tritemorion tritencephalon triteness triternate triternately triterpene tritetartemorion tritheism tritheist tritheistic tritheistical tritheite tritheocracy trithing trithioaldehyde trithiocarbonate trithiocarbonic trithionate trithionic Trithrinax tritical triticality tritically triticalness triticeous triticeum triticin triticism triticoid Triticum triticum tritish tritium tritocerebral tritocerebrum tritocone tritoconid Tritogeneia tritolo Tritoma tritomite Triton triton tritonal tritonality tritone Tritoness Tritonia Tritonic Tritonidae tritonoid tritonous tritonymph tritonymphal tritopatores tritopine tritor tritoral tritorium tritoxide tritozooid tritriacontane trittichan tritubercular Trituberculata trituberculism trituberculy triturable tritural triturate trituration triturator triturature triturium Triturus trityl Tritylodon Triumfetta Triumph triumph triumphal triumphance triumphancy triumphant triumphantly triumphator triumpher triumphing triumphwise triumvir triumviral triumvirate triumviri triumvirship triunal triune triungulin triunification triunion triunitarian triunity triunsaturated triurid Triuridaceae Triuridales Triuris trivalence trivalency trivalent trivalerin trivalve trivalvular trivant trivantly trivariant triverbal triverbial trivet trivetwise trivia trivial trivialism trivialist triviality trivialize trivially trivialness trivirga trivirgate trivium trivoltine trivvet triweekly Trix Trixie Trixy trizoic trizomal trizonal trizone Trizonia Troad troat troca trocaical trocar Trochaic trochaic trochaicality trochal trochalopod Trochalopoda trochalopodous trochanter trochanteric trochanterion trochantin trochantinian trochart trochate troche trocheameter trochee trocheeize trochelminth Trochelminthes trochi trochid Trochidae trochiferous trochiform Trochila Trochili trochili trochilic trochilics trochilidae trochilidine trochilidist trochiline trochilopodous Trochilus trochilus troching trochiscation trochiscus trochite trochitic Trochius trochlea trochlear trochleariform trochlearis trochleary trochleate trochleiform trochocephalia trochocephalic trochocephalus trochocephaly Trochodendraceae trochodendraceous Trochodendron trochoid trochoidal trochoidally trochoides trochometer trochophore Trochosphaera Trochosphaerida trochosphere trochospherical Trochozoa trochozoic trochozoon Trochus trochus trock troco troctolite trod trodden trode troegerite Troezenian troft trog trogger troggin troglodytal troglodyte Troglodytes troglodytic troglodytical Troglodytidae Troglodytinae troglodytish troglodytism trogon Trogones Trogonidae Trogoniformes trogonoid trogs trogue Troiades Troic troika troilite Trojan troke troker troll trolldom trolleite troller trolley trolleyer trolleyful trolleyman trollflower trollimog trolling Trollius trollman trollol trollop Trollopean Trollopeanism trollopish trollops trollopy trolly tromba trombe trombiculid trombidiasis Trombidiidae Trombidium trombone trombonist trombony trommel tromometer tromometric tromometrical tromometry tromp trompe trompil trompillo tromple tron trona tronador tronage tronc trondhjemite trone troner troolie troop trooper trooperess troopfowl troopship troopwise troostite troostitic troot tropacocaine tropaeolaceae tropaeolaceous tropaeolin Tropaeolum tropaion tropal troparia troparion tropary tropate trope tropeic tropeine troper tropesis trophaea trophaeum trophal trophallactic trophallaxis trophectoderm trophedema trophema trophesial trophesy trophi trophic trophical trophically trophicity trophied Trophis trophism trophobiont trophobiosis trophobiotic trophoblast trophoblastic trophochromatin trophocyte trophoderm trophodisc trophodynamic trophodynamics trophogenesis trophogenic trophogeny trophology trophonema trophoneurosis trophoneurotic Trophonian trophonucleus trophopathy trophophore trophophorous trophophyte trophoplasm trophoplasmatic trophoplasmic trophoplast trophosomal trophosome trophosperm trophosphere trophospongia trophospongial trophospongium trophospore trophotaxis trophotherapy trophothylax trophotropic trophotropism trophozoite trophozooid trophy trophyless trophywort tropic tropical Tropicalia Tropicalian tropicality tropicalization tropicalize tropically tropicopolitan tropidine Tropidoleptus tropine tropism tropismatic tropist tropistic tropocaine tropologic tropological tropologically tropologize tropology tropometer tropopause tropophil tropophilous tropophyte tropophytic troposphere tropostereoscope tropoyl troptometer tropyl trostera trot trotcozy troth trothful trothless trothlike trothplight trotlet trotline trotol trotter trottie trottles trottoir trottoired trotty trotyl troubadour troubadourish troubadourism troubadourist trouble troubledly troubledness troublemaker troublemaking troublement troubleproof troubler troublesome troublesomely troublesomeness troubling troublingly troublous troublously troublousness troubly trough troughful troughing troughlike troughster troughway troughwise troughy trounce trouncer troupand troupe trouper troupial trouse trouser trouserdom trousered trouserettes trouserian trousering trouserless trousers trousseau trousseaux trout troutbird trouter troutflower troutful troutiness troutless troutlet troutlike trouty trouvere trouveur trove troveless trover trow trowel trowelbeak troweler trowelful trowelman trowing trowlesworthite trowman trowth Troy troy Troynovant Troytown truancy truandise truant truantcy truantism truantlike truantly truantness truantry truantship trub trubu truce trucebreaker trucebreaking truceless trucemaker trucemaking trucial trucidation truck truckage trucker truckful trucking truckle truckler trucklike truckling trucklingly truckload truckman truckmaster trucks truckster truckway truculence truculency truculent truculental truculently truculentness truddo trudellite trudge trudgen trudger Trudy true trueborn truebred truehearted trueheartedly trueheartedness truelike truelove trueness truepenny truer truff truffle truffled trufflelike truffler trufflesque trug truish truism truismatic truistic truistical trull Trullan truller trullization trullo truly trumbash trummel trump trumper trumperiness trumpery trumpet trumpetbush trumpeter trumpeting trumpetless trumpetlike trumpetry trumpetweed trumpetwood trumpety trumph trumpie trumpless trumplike trun truncage truncal truncate truncated Truncatella Truncatellidae truncately truncation truncator truncatorotund truncatosinuate truncature trunch trunched truncheon truncheoned truncher trunchman trundle trundlehead trundler trundleshot trundletail trundling trunk trunkback trunked trunkfish trunkful trunking trunkless trunkmaker trunknose trunkway trunkwork trunnel trunnion trunnioned trunnionless trush trusion truss trussed trussell trusser trussing trussmaker trussmaking trusswork trust trustability trustable trustableness trustably trustee trusteeism trusteeship trusten truster trustful trustfully trustfulness trustification trustify trustihood trustily trustiness trusting trustingly trustingness trustle trustless trustlessly trustlessness trustman trustmonger trustwoman trustworthily trustworthiness trustworthy trusty truth truthable truthful truthfully truthfulness truthify truthiness truthless truthlessly truthlessness truthlike truthlikeness truthsman truthteller truthtelling truthy Trutta truttaceous truvat truxillic truxilline try trygon Trygonidae tryhouse Trying trying tryingly tryingness tryma tryout tryp trypa trypan trypaneid Trypaneidae trypanocidal trypanocide trypanolysin trypanolysis trypanolytic Trypanosoma trypanosoma trypanosomacidal trypanosomacide trypanosomal trypanosomatic Trypanosomatidae trypanosomatosis trypanosomatous trypanosome trypanosomiasis trypanosomic Tryparsamide Trypeta trypetid Trypetidae Tryphena Tryphosa trypiate trypograph trypographic trypsin trypsinize trypsinogen tryptase tryptic tryptogen tryptone tryptonize tryptophan trysail tryst tryster trysting tryt tryworks tsadik tsamba tsantsa tsar tsardom tsarevitch tsarina tsaritza tsarship tsatlee Tsattine tscharik tscheffkinite Tscherkess tsere tsessebe tsetse Tshi tsia Tsiltaden Tsimshian tsine tsingtauite tsiology Tsoneca Tsonecan tst tsuba tsubo Tsuga Tsuma tsumebite tsun tsunami tsungtu Tsutsutsi tu tua Tualati Tuamotu Tuamotuan Tuan tuan Tuareg tuarn tuart tuatara tuatera tuath tub Tuba tuba tubae tubage tubal tubaphone tubar tubate tubatoxin Tubatulabal tubba tubbable tubbal tubbeck tubber tubbie tubbiness tubbing tubbish tubboe tubby tube tubeflower tubeform tubeful tubehead tubehearted tubeless tubelet tubelike tubemaker tubemaking tubeman tuber Tuberaceae tuberaceous Tuberales tuberation tubercle tubercled tuberclelike tubercula tubercular Tubercularia Tuberculariaceae tuberculariaceous tubercularization tubercularize tubercularly tubercularness tuberculate tuberculated tuberculatedly tuberculately tuberculation tuberculatogibbous tuberculatonodose tuberculatoradiate tuberculatospinous tubercule tuberculed tuberculid tuberculide tuberculiferous tuberculiform tuberculin tuberculinic tuberculinization tuberculinize tuberculization tuberculize tuberculocele tuberculocidin tuberculoderma tuberculoid tuberculoma tuberculomania tuberculomata tuberculophobia tuberculoprotein tuberculose tuberculosectorial tuberculosed tuberculosis tuberculotherapist tuberculotherapy tuberculotoxin tuberculotrophic tuberculous tuberculously tuberculousness tuberculum tuberiferous tuberiform tuberin tuberization tuberize tuberless tuberoid tuberose tuberosity tuberous tuberously tuberousness tubesmith tubework tubeworks tubfish tubful tubicen tubicinate tubicination Tubicola Tubicolae tubicolar tubicolous tubicorn tubicornous tubifacient tubifer tubiferous Tubifex Tubificidae Tubiflorales tubiflorous tubiform tubig tubik tubilingual Tubinares tubinarial tubinarine tubing Tubingen tubiparous Tubipora tubipore tubiporid Tubiporidae tubiporoid tubiporous tublet tublike tubmaker tubmaking tubman tuboabdominal tubocurarine tubolabellate tuboligamentous tuboovarial tuboovarian tuboperitoneal tuborrhea tubotympanal tubovaginal tubular Tubularia tubularia Tubulariae tubularian Tubularida tubularidan Tubulariidae tubularity tubularly tubulate tubulated tubulation tubulator tubulature tubule tubulet tubuli tubulibranch tubulibranchian Tubulibranchiata tubulibranchiate Tubulidentata tubulidentate Tubulifera tubuliferan tubuliferous tubulifloral tubuliflorous tubuliform Tubulipora tubulipore tubuliporid Tubuliporidae tubuliporoid tubulization tubulodermoid tubuloracemose tubulosaccular tubulose tubulostriato tubulous tubulously tubulousness tubulure tubulus tubwoman Tucana Tucanae tucandera Tucano tuchit tuchun tuchunate tuchunism tuchunize tuck Tuckahoe tuckahoe tucker tuckermanity tucket tucking tuckner tuckshop tucktoo tucky tucum tucuma tucuman Tucuna tudel Tudesque Tudor Tudoresque tue tueiron Tuesday tufa tufaceous tufalike tufan tuff tuffaceous tuffet tuffing tuft tuftaffeta tufted tufter tufthunter tufthunting tuftily tufting tuftlet tufty tug tugboat tugboatman tugger tuggery tugging tuggingly tughra tugless tuglike tugman tugrik tugui tugurium tui tuik tuille tuillette tuilyie tuism tuition tuitional tuitionary tuitive tuke tukra Tukuler Tukulor tula Tulalip tulare tularemia tulasi Tulbaghia tulchan tulchin tule tuliac tulip Tulipa tulipflower tulipiferous tulipist tuliplike tulipomania tulipomaniac tulipwood tulipy tulisan Tulkepaia tulle Tullian tullibee Tulostoma tulsi Tulu tulwar tum tumasha tumatakuru tumatukuru tumbak tumbester tumble tumblebug tumbled tumbledung tumbler tumblerful tumblerlike tumblerwise tumbleweed tumblification tumbling tumblingly tumbly Tumboa tumbrel tume tumefacient tumefaction tumefy tumescence tumescent tumid tumidity tumidly tumidness Tumion tummals tummel tummer tummock tummy tumor tumored tumorlike tumorous tump tumpline tumtum tumular tumulary tumulate tumulation tumuli tumulose tumulosity tumulous tumult tumultuarily tumultuariness tumultuary tumultuate tumultuation tumultuous tumultuously tumultuousness tumulus Tumupasa tun Tuna tuna tunable tunableness tunably tunbellied tunbelly tunca tund tundagslatta tunder tundish tundra tundun tune Tunebo tuned tuneful tunefully tunefulness tuneless tunelessly tunelessness tunemaker tunemaking tuner tunesome tunester tunful tung Tunga Tungan tungate tungo tungstate tungsten tungstenic tungsteniferous tungstenite tungstic tungstite tungstosilicate tungstosilicic Tungus Tungusian Tungusic tunhoof tunic Tunica Tunican tunicary Tunicata tunicate tunicated tunicin tunicked tunicle tunicless tuniness tuning tunish Tunisian tunist tunk Tunker tunket tunlike tunmoot tunna tunnel tunneled tunneler tunneling tunnelist tunnelite tunnellike tunnelly tunnelmaker tunnelmaking tunnelman tunnelway tunner tunnery Tunnit tunnland tunnor tunny tuno tunu tuny tup Tupaia Tupaiidae tupakihi tupanship tupara tupek tupelo Tupi Tupian tupik Tupinamba Tupinaqui tupman tuppence tuppenny Tupperian Tupperish Tupperism Tupperize tupuna tuque tur turacin Turacus Turanian Turanianism Turanism turanose turb turban turbaned turbanesque turbanette turbanless turbanlike turbantop turbanwise turbary turbeh Turbellaria turbellarian turbellariform turbescency turbid turbidimeter turbidimetric turbidimetry turbidity turbidly turbidness turbinaceous turbinage turbinal turbinate turbinated turbination turbinatoconcave turbinatocylindrical turbinatoglobose turbinatostipitate turbine turbinectomy turbined turbinelike Turbinella Turbinellidae turbinelloid turbiner turbines Turbinidae turbiniform turbinoid turbinotome turbinotomy turbit turbith turbitteen Turbo turbo turboalternator turboblower turbocompressor turbodynamo turboexciter turbofan turbogenerator turbomachine turbomotor turbopump turbosupercharge turbosupercharger turbot turbotlike turboventilator turbulence turbulency turbulent turbulently turbulentness Turcian Turcic Turcification Turcism Turcize Turco turco Turcoman Turcophilism turcopole turcopolier turd Turdetan Turdidae turdiform Turdinae turdine turdoid Turdus tureen tureenful turf turfage turfdom turfed turfen turfiness turfing turfite turfless turflike turfman turfwise turfy turgency turgent turgently turgesce turgescence turgescency turgescent turgescible turgid turgidity turgidly turgidness turgite turgoid turgor turgy Turi turicata turio turion turioniferous turjaite turjite Turk turk Turkana Turkdom Turkeer turken Turkery Turkess Turkey turkey turkeyback turkeyberry turkeybush Turkeydom turkeyfoot Turkeyism turkeylike Turki Turkic Turkicize Turkification Turkify turkis Turkish Turkishly Turkishness Turkism Turkize turkle Turklike Turkman Turkmen Turkmenian Turkologist Turkology Turkoman Turkomania Turkomanic Turkomanize Turkophil Turkophile Turkophilia Turkophilism Turkophobe Turkophobist turlough Turlupin turm turma turment turmeric turmit turmoil turmoiler turn turnable turnabout turnagain turnaround turnaway turnback turnbout turnbuckle turncap turncoat turncoatism turncock turndown turndun turned turnel turner Turnera Turneraceae turneraceous Turneresque Turnerian Turnerism turnerite turnery turney turngate turnhall Turnhalle Turnices Turnicidae turnicine Turnicomorphae turnicomorphic turning turningness turnip turniplike turnipweed turnipwise turnipwood turnipy Turnix turnix turnkey turnoff turnout turnover turnpike turnpiker turnpin turnplate turnplow turnrow turns turnscrew turnsheet turnskin turnsole turnspit turnstile turnstone turntable turntail turnup turnwrest turnwrist Turonian turp turpantineweed turpentine turpentineweed turpentinic turpeth turpethin turpid turpidly turpitude turps turquoise turquoiseberry turquoiselike turr turret turreted turrethead turretlike turrical turricle turricula turriculae turricular turriculate turriferous turriform turrigerous Turrilepas turrilite Turrilites turriliticone Turrilitidae Turritella turritella turritellid Turritellidae turritelloid turse Tursenoi Tursha tursio Tursiops Turtan turtle turtleback turtlebloom turtledom turtledove turtlehead turtleize turtlelike turtler turtlet turtling turtosa tururi turus Turveydrop Turveydropdom Turveydropian turwar Tusayan Tuscan Tuscanism Tuscanize Tuscanlike Tuscany Tuscarora tusche Tusculan Tush tush tushed Tushepaw tusher tushery tusk tuskar tusked Tuskegee tusker tuskish tuskless tusklike tuskwise tusky tussah tussal tusser tussicular Tussilago tussis tussive tussle tussock tussocked tussocker tussocky tussore tussur tut tutania tutball tute tutee tutela tutelage tutelar tutelary Tutelo tutenag tuth tutin tutiorism tutiorist tutly tutman tutor tutorage tutorer tutoress tutorhood tutorial tutorially tutoriate tutorism tutorization tutorize tutorless tutorly tutorship tutory tutoyer tutress tutrice tutrix tuts tutsan tutster tutti tuttiman tutty tutu tutulus Tututni tutwork tutworker tutworkman tuwi tux tuxedo tuyere Tuyuneiri tuza Tuzla tuzzle twa Twaddell twaddle twaddledom twaddleize twaddlement twaddlemonger twaddler twaddlesome twaddling twaddlingly twaddly twaddy twae twaesome twafauld twagger twain twaite twal twale twalpenny twalpennyworth twalt Twana twang twanger twanginess twangle twangler twangy twank twanker twanking twankingly twankle twanky twant twarly twas twasome twat twatchel twatterlight twattle twattler twattling tway twayblade twazzy tweag tweak tweaker tweaky twee tweed tweeded tweedle tweedledee tweedledum tweedy tweeg tweel tween tweenlight tweeny tweesh tweesht tweest tweet tweeter tweeze tweezer tweezers tweil twelfhynde twelfhyndeman twelfth twelfthly Twelfthtide twelve twelvefold twelvehynde twelvehyndeman twelvemo twelvemonth twelvepence twelvepenny twelvescore twentieth twentiethly twenty twentyfold twentymo twere twerp Twi twibil twibilled twice twicer twicet twichild twick twiddle twiddler twiddling twiddly twifoil twifold twifoldly twig twigful twigged twiggen twigger twiggy twigless twiglet twiglike twigsome twigwithy twilight twilightless twilightlike twilighty twilit twill twilled twiller twilling twilly twilt twin twinable twinberry twinborn twindle twine twineable twinebush twineless twinelike twinemaker twinemaking twiner twinflower twinfold twinge twingle twinhood twiningly twinism twink twinkle twinkledum twinkleproof twinkler twinkles twinkless twinkling twinklingly twinkly twinleaf twinlike twinling twinly twinned twinner twinness twinning twinship twinsomeness twinter twiny twire twirk twirl twirler twirligig twirly twiscar twisel twist twistable twisted twistedly twistened twister twisterer twistical twistification twistily twistiness twisting twistingly twistiways twistiwise twistle twistless twisty twit twitch twitchel twitcheling twitcher twitchet twitchety twitchfire twitchily twitchiness twitchingly twitchy twite twitlark twitten twitter twitteration twitterboned twitterer twittering twitteringly twitterly twittery twittingly twitty twixt twixtbrain twizzened twizzle two twodecker twofold twofoldly twofoldness twoling twoness twopence twopenny twosome twyblade twyhynde Tybalt Tyburn Tyburnian Tyche tychism tychite Tychonian Tychonic tychoparthenogenesis tychopotamic tycoon tycoonate tyddyn tydie tye tyee tyg Tyigh tying tyke tyken tykhana tyking tylarus tyleberry Tylenchus Tyler Tylerism Tylerite Tylerize tylion tyloma tylopod Tylopoda tylopodous Tylosaurus tylose tylosis tylosteresis Tylostoma Tylostomaceae tylostylar tylostyle tylostylote tylostylus Tylosurus tylotate tylote tylotic tylotoxea tylotoxeate tylotus tylus tymbalon tymp tympan tympana tympanal tympanectomy tympani tympanic tympanichord tympanichordal tympanicity tympaniform tympaning tympanism tympanist tympanites tympanitic tympanitis tympanocervical tympanohyal tympanomalleal tympanomandibular tympanomastoid tympanomaxillary tympanon tympanoperiotic tympanosis tympanosquamosal tympanostapedial tympanotemporal tympanotomy Tympanuchus tympanum tympany tynd Tyndallization Tyndallize tyndallmeter Tynwald typal typarchical type typecast Typees typeholder typer typescript typeset typesetter typesetting typewrite typewriter typewriting Typha Typhaceae typhaceous typhemia typhia typhic typhinia typhization typhlatonia typhlatony typhlectasis typhlectomy typhlenteritis typhlitic typhlitis typhloalbuminuria typhlocele typhloempyema typhloenteritis typhlohepatitis typhlolexia typhlolithiasis typhlology typhlomegaly Typhlomolge typhlon typhlopexia typhlopexy typhlophile typhlopid Typhlopidae Typhlops typhloptosis typhlosis typhlosolar typhlosole typhlostenosis typhlostomy typhlotomy typhobacillosis Typhoean typhoemia typhogenic typhoid typhoidal typhoidin typhoidlike typholysin typhomalaria typhomalarial typhomania typhonia Typhonian Typhonic typhonic typhoon typhoonish typhopneumonia typhose typhosepsis typhosis typhotoxine typhous Typhula typhus typic typica typical typicality typically typicalness typicon typicum typification typifier typify typist typo typobar typocosmy typographer typographia typographic typographical typographically typographist typography typolithographic typolithography typologic typological typologically typologist typology typomania typometry typonym typonymal typonymic typonymous typophile typorama typoscript typotelegraph typotelegraphy typothere Typotheria Typotheriidae typothetae typp typtological typtologist typtology typy tyramine tyranness Tyranni tyrannial tyrannic tyrannical tyrannically tyrannicalness tyrannicidal tyrannicide tyrannicly Tyrannidae Tyrannides Tyranninae tyrannine tyrannism tyrannize tyrannizer tyrannizing tyrannizingly tyrannoid tyrannophobia tyrannosaur Tyrannosaurus tyrannous tyrannously tyrannousness Tyrannus tyranny tyrant tyrantcraft tyrantlike tyrantship tyre tyremesis Tyrian tyriasis tyro tyrocidin tyrocidine tyroglyphid Tyroglyphidae Tyroglyphus Tyrolean Tyrolese Tyrolienne tyrolite tyrology tyroma tyromancy tyromatous tyrone tyronic tyronism tyrosinase tyrosine tyrosinuria tyrosyl tyrotoxicon tyrotoxine Tyrr Tyrrhene Tyrrheni Tyrrhenian Tyrsenoi Tyrtaean tysonite tyste tyt Tyto Tytonidae Tzaam Tzapotec tzaritza Tzendal Tzental tzolkin tzontle Tzotzil Tzutuhil U u uang Uaraycu Uarekena Uaupe uayeb Ubbenite Ubbonite uberant uberous uberously uberousness uberty ubi ubication ubiety Ubii Ubiquarian ubiquarian ubiquious Ubiquist ubiquit Ubiquitarian ubiquitarian Ubiquitarianism ubiquitariness ubiquitary Ubiquitism Ubiquitist ubiquitous ubiquitously ubiquitousness ubiquity ubussu Uca Ucal Ucayale Uchean Uchee uckia Ud udal udaler udaller udalman udasi udder uddered udderful udderless udderlike udell Udi Udic Udish udo Udolphoish udometer udometric udometry udomograph Uds Ueueteotl ug Ugandan Ugarono ugh uglification uglifier uglify uglily ugliness uglisome ugly Ugrian Ugric Ugroid ugsome ugsomely ugsomeness uhlan uhllo uhtensang uhtsong Uigur Uigurian Uiguric uily uinal Uinta uintaite uintathere Uintatheriidae Uintatherium uintjie Uirina Uitotan uitspan uji ukase uke ukiyoye Ukrainer Ukrainian ukulele ula ulatrophia ulcer ulcerable ulcerate ulceration ulcerative ulcered ulceromembranous ulcerous ulcerously ulcerousness ulcery ulcuscle ulcuscule ule ulema ulemorrhagia ulerythema uletic Ulex ulex ulexine ulexite Ulidia Ulidian uliginose uliginous ulitis ull ulla ullage ullaged ullagone uller ulling ullmannite ulluco Ulmaceae ulmaceous Ulmaria ulmic ulmin ulminic ulmo ulmous Ulmus ulna ulnad ulnae ulnar ulnare ulnaria ulnocarpal ulnocondylar ulnometacarpal ulnoradial uloborid Uloboridae Uloborus ulocarcinoma uloid Ulonata uloncus Ulophocinae ulorrhagia ulorrhagy ulorrhea Ulothrix Ulotrichaceae ulotrichaceous Ulotrichales ulotrichan Ulotriches Ulotrichi ulotrichous ulotrichy ulrichite ulster ulstered ulsterette Ulsterian ulstering Ulsterite Ulsterman ulterior ulteriorly ultima ultimacy ultimata ultimate ultimately ultimateness ultimation ultimatum ultimity ultimo ultimobranchial ultimogenitary ultimogeniture ultimum Ultonian ultra ultrabasic ultrabasite ultrabelieving ultrabenevolent ultrabrachycephalic ultrabrachycephaly ultrabrilliant ultracentenarian ultracentenarianism ultracentralizer ultracentrifuge ultraceremonious ultrachurchism ultracivil ultracomplex ultraconcomitant ultracondenser ultraconfident ultraconscientious ultraconservatism ultraconservative ultracordial ultracosmopolitan ultracredulous ultracrepidarian ultracrepidarianism ultracrepidate ultracritical ultradandyism ultradeclamatory ultrademocratic ultradespotic ultradignified ultradiscipline ultradolichocephalic ultradolichocephaly ultradolichocranial ultraeducationist ultraeligible ultraelliptic ultraemphasis ultraenergetic ultraenforcement ultraenthusiasm ultraenthusiastic ultraepiscopal ultraevangelical ultraexcessive ultraexclusive ultraexpeditious ultrafantastic ultrafashionable ultrafastidious ultrafederalist ultrafeudal ultrafidian ultrafidianism ultrafilter ultrafilterability ultrafilterable ultrafiltrate ultrafiltration ultraformal ultrafrivolous ultragallant ultragaseous ultragenteel ultragood ultragrave ultraheroic ultrahonorable ultrahuman ultraimperialism ultraimperialist ultraimpersonal ultrainclusive ultraindifferent ultraindulgent ultraingenious ultrainsistent ultraintimate ultrainvolved ultraism ultraist ultraistic ultralaborious ultralegality ultralenient ultraliberal ultraliberalism ultralogical ultraloyal ultraluxurious ultramarine ultramaternal ultramaximal ultramelancholy ultramicrochemical ultramicrochemist ultramicrochemistry ultramicrometer ultramicron ultramicroscope ultramicroscopic ultramicroscopical ultramicroscopy ultraminute ultramoderate ultramodern ultramodernism ultramodernist ultramodernistic ultramodest ultramontane ultramontanism ultramontanist ultramorose ultramulish ultramundane ultranational ultranationalism ultranationalist ultranatural ultranegligent ultranice ultranonsensical ultraobscure ultraobstinate ultraofficious ultraoptimistic ultraornate ultraorthodox ultraorthodoxy ultraoutrageous ultrapapist ultraparallel ultraperfect ultrapersuasive ultraphotomicrograph ultrapious ultraplanetary ultraplausible ultrapopish ultraproud ultraprudent ultraradical ultraradicalism ultrarapid ultrareactionary ultrared ultrarefined ultrarefinement ultrareligious ultraremuneration ultrarepublican ultrarevolutionary ultrarevolutionist ultraritualism ultraromantic ultraroyalism ultraroyalist ultrasanguine ultrascholastic ultraselect ultraservile ultrasevere ultrashrewd ultrasimian ultrasolemn ultrasonic ultrasonics ultraspartan ultraspecialization ultraspiritualism ultrasplendid ultrastandardization ultrastellar ultrasterile ultrastrenuous ultrastrict ultrasubtle ultrasystematic ultratechnical ultratense ultraterrene ultraterrestrial ultratotal ultratrivial ultratropical ultraugly ultrauncommon ultraurgent ultravicious ultraviolent ultraviolet ultravirtuous ultravirus ultravisible ultrawealthy ultrawise ultrayoung ultrazealous ultrazodiacal ultroneous ultroneously ultroneousness ulu Ulua ulua uluhi ululant ululate ululation ululative ululatory ululu Ulva Ulvaceae ulvaceous Ulvales Ulvan Ulyssean Ulysses um umangite Umatilla Umaua umbeclad umbel umbeled umbella Umbellales umbellar umbellate umbellated umbellately umbellet umbellic umbellifer Umbelliferae umbelliferone umbelliferous umbelliflorous umbelliform umbelloid Umbellula Umbellularia umbellulate umbellule Umbellulidae umbelluliferous umbelwort umber umbethink umbilectomy umbilic umbilical umbilically umbilicar Umbilicaria umbilicate umbilicated umbilication umbilici umbiliciform umbilicus umbiliform umbilroot umble umbo umbolateral umbonal umbonate umbonated umbonation umbone umbones umbonial umbonic umbonulate umbonule Umbra umbra umbracious umbraciousness umbraculate umbraculiferous umbraculiform umbraculum umbrae umbrage umbrageous umbrageously umbrageousness umbral umbrally umbratile umbrel umbrella umbrellaed umbrellaless umbrellalike umbrellawise umbrellawort umbrette Umbrian Umbriel umbriferous umbriferously umbriferousness umbril umbrine umbrose umbrosity umbrous Umbundu ume umiak umiri umlaut ump umph umpirage umpire umpirer umpireship umpiress umpirism Umpqua umpteen umpteenth umptekite umptieth umpty umquhile umu un Una unabandoned unabased unabasedly unabashable unabashed unabashedly unabatable unabated unabatedly unabating unabatingly unabbreviated unabetted unabettedness unabhorred unabiding unabidingly unabidingness unability unabject unabjured unable unableness unably unabolishable unabolished unabraded unabrased unabridgable unabridged unabrogated unabrupt unabsent unabsolute unabsolvable unabsolved unabsolvedness unabsorb unabsorbable unabsorbed unabsorbent unabstract unabsurd unabundance unabundant unabundantly unabused unacademic unacademical unaccelerated unaccent unaccented unaccentuated unaccept unacceptability unacceptable unacceptableness unacceptably unacceptance unacceptant unaccepted unaccessibility unaccessible unaccessibleness unaccessibly unaccessional unaccessory unaccidental unaccidentally unaccidented unacclimated unacclimation unacclimatization unacclimatized unaccommodable unaccommodated unaccommodatedness unaccommodating unaccommodatingly unaccommodatingness unaccompanable unaccompanied unaccompanying unaccomplishable unaccomplished unaccomplishedness unaccord unaccordable unaccordance unaccordant unaccorded unaccording unaccordingly unaccostable unaccosted unaccountability unaccountable unaccountableness unaccountably unaccounted unaccoutered unaccoutred unaccreditated unaccredited unaccrued unaccumulable unaccumulate unaccumulated unaccumulation unaccuracy unaccurate unaccurately unaccurateness unaccursed unaccusable unaccusably unaccuse unaccusing unaccustom unaccustomed unaccustomedly unaccustomedness unachievable unachieved unaching unacidulated unacknowledged unacknowledgedness unacknowledging unacknowledgment unacoustic unacquaint unacquaintable unacquaintance unacquainted unacquaintedly unacquaintedness unacquiescent unacquirable unacquirableness unacquirably unacquired unacquit unacquittable unacquitted unacquittedness unact unactability unactable unacted unacting unactinic unaction unactivated unactive unactively unactiveness unactivity unactorlike unactual unactuality unactually unactuated unacute unacutely unadapt unadaptability unadaptable unadaptableness unadaptably unadapted unadaptedly unadaptedness unadaptive unadd unaddable unadded unaddicted unaddictedness unadditional unaddress unaddressed unadequate unadequately unadequateness unadherence unadherent unadherently unadhesive unadjacent unadjacently unadjectived unadjourned unadjournment unadjudged unadjust unadjustably unadjusted unadjustment unadministered unadmirable unadmire unadmired unadmiring unadmissible unadmissibly unadmission unadmittable unadmittableness unadmittably unadmitted unadmittedly unadmitting unadmonished unadopt unadoptable unadoptably unadopted unadoption unadorable unadoration unadored unadoring unadorn unadornable unadorned unadornedly unadornedness unadornment unadult unadulterate unadulterated unadulteratedly unadulteratedness unadulterately unadulterous unadulterously unadvanced unadvancedly unadvancedness unadvancement unadvancing unadvantaged unadvantageous unadventured unadventuring unadventurous unadventurously unadverse unadversely unadverseness unadvertency unadvertised unadvertisement unadvertising unadvisability unadvisable unadvisableness unadvisably unadvised unadvisedly unadvisedness unadvocated unaerated unaesthetic unaesthetical unafeard unafeared unaffable unaffably unaffected unaffectedly unaffectedness unaffecting unaffectionate unaffectionately unaffectioned unaffianced unaffied unaffiliated unaffiliation unaffirmation unaffirmed unaffixed unafflicted unafflictedly unafflicting unaffliction unaffordable unafforded unaffranchised unaffrighted unaffrightedly unaffronted unafire unafloat unaflow unafraid unaged unaggravated unaggravating unaggregated unaggression unaggressive unaggressively unaggressiveness unaghast unagile unagility unaging unagitated unagitatedly unagitatedness unagitation unagonize unagrarian unagreeable unagreeableness unagreeably unagreed unagreeing unagreement unagricultural unaidable unaided unaidedly unaiding unailing unaimed unaiming unaired unaisled Unakhotana unakin unakite unal Unalachtigo unalarm unalarmed unalarming Unalaska unalcoholized unaldermanly unalert unalertly unalertness unalgebraical unalienable unalienableness unalienably unalienated unalignable unaligned unalike unalimentary unalist unalive unallayable unallayably unallayed unalleged unallegorical unalleviably unalleviated unalleviation unalliable unallied unalliedly unalliedness unallotment unallotted unallow unallowable unallowed unallowedly unallowing unalloyed unallurable unallured unalluring unalluringly unalmsed unalone unaloud unalphabeted unalphabetic unalphabetical unalterability unalterable unalterableness unalterably unalteration unaltered unaltering unalternated unamalgamable unamalgamated unamalgamating unamassed unamazed unamazedly unambiguity unambiguous unambiguously unambiguousness unambition unambitious unambitiously unambitiousness unambrosial unambush unamenability unamenable unamenableness unamenably unamend unamendable unamended unamendedly unamending unamendment unamerced Unami unamiability unamiable unamiableness unamiably unamicable unamicably unamiss unamo unamortization unamortized unample unamplifiable unamplified unamply unamputated unamusable unamusably unamused unamusement unamusing unamusingly unamusive unanalogical unanalogous unanalogously unanalogousness unanalytic unanalytical unanalyzable unanalyzed unanalyzing unanatomizable unanatomized unancestored unancestried unanchor unanchored unanchylosed unancient unaneled unangelic unangelical unangrily unangry unangular unanimalized unanimate unanimated unanimatedly unanimatedness unanimately unanimism unanimist unanimistic unanimistically unanimity unanimous unanimously unanimousness unannealed unannex unannexed unannexedly unannexedness unannihilable unannihilated unannotated unannounced unannoyed unannoying unannullable unannulled unanointed unanswerability unanswerable unanswerableness unanswerably unanswered unanswering unantagonistic unantagonizable unantagonized unantagonizing unanticipated unanticipating unanticipatingly unanticipation unanticipative unantiquated unantiquatedness unantique unantiquity unanxiety unanxious unanxiously unanxiousness unapart unapocryphal unapologetic unapologizing unapostatized unapostolic unapostolical unapostolically unapostrophized unappalled unappareled unapparent unapparently unapparentness unappealable unappealableness unappealably unappealed unappealing unappeasable unappeasableness unappeasably unappeased unappeasedly unappeasedness unappendaged unapperceived unappertaining unappetizing unapplauded unapplauding unapplausive unappliable unappliableness unappliably unapplianced unapplicable unapplicableness unapplicably unapplied unapplying unappoint unappointable unappointableness unappointed unapportioned unapposite unappositely unappraised unappreciable unappreciableness unappreciably unappreciated unappreciating unappreciation unappreciative unappreciatively unappreciativeness unapprehendable unapprehendableness unapprehendably unapprehended unapprehending unapprehensible unapprehensibleness unapprehension unapprehensive unapprehensively unapprehensiveness unapprenticed unapprised unapprisedly unapprisedness unapproachability unapproachable unapproachableness unapproached unapproaching unapprobation unappropriable unappropriate unappropriated unappropriately unappropriateness unappropriation unapprovable unapprovableness unapprovably unapproved unapproving unapprovingly unapproximate unapproximately unaproned unapropos unapt unaptitude unaptly unaptness unarbitrarily unarbitrariness unarbitrary unarbitrated unarch unarchdeacon unarched unarchitectural unarduous unarguable unarguableness unarguably unargued unarguing unargumentative unargumentatively unarisen unarising unaristocratic unaristocratically unarithmetical unarithmetically unark unarm unarmed unarmedly unarmedness unarmored unarmorial unaromatized unarousable unaroused unarousing unarraignable unarraigned unarranged unarray unarrayed unarrestable unarrested unarresting unarrival unarrived unarriving unarrogance unarrogant unarrogating unarted unartful unartfully unartfulness unarticled unarticulate unarticulated unartificial unartificiality unartificially unartistic unartistical unartistically unartistlike unary unascendable unascendableness unascended unascertainable unascertainableness unascertainably unascertained unashamed unashamedly unashamedness unasinous unaskable unasked unasking unasleep unaspersed unasphalted unaspirated unaspiring unaspiringly unaspiringness unassailable unassailableness unassailably unassailed unassailing unassassinated unassaultable unassaulted unassayed unassaying unassembled unassented unassenting unasserted unassertive unassertiveness unassessable unassessableness unassessed unassibilated unassiduous unassignable unassignably unassigned unassimilable unassimilated unassimilating unassimilative unassisted unassisting unassociable unassociably unassociated unassociative unassociativeness unassoiled unassorted unassuageable unassuaged unassuaging unassuetude unassumable unassumed unassuming unassumingly unassumingness unassured unassuredly unassuredness unassuring unasterisk unastonish unastonished unastonishment unastray unathirst unathletically unatmospheric unatonable unatoned unatoning unattach unattachable unattached unattackable unattackableness unattackably unattacked unattainability unattainable unattainableness unattainably unattained unattaining unattainment unattaint unattainted unattaintedly unattempered unattemptable unattempted unattempting unattendance unattendant unattended unattentive unattenuated unattested unattestedness unattire unattired unattractable unattractableness unattracted unattracting unattractive unattractively unattractiveness unattributable unattributed unattuned unau unauctioned unaudible unaudibleness unaudibly unaudienced unaudited unaugmentable unaugmented unauspicious unauspiciously unauspiciousness unaustere unauthentic unauthentical unauthentically unauthenticated unauthenticity unauthorish unauthoritative unauthoritatively unauthoritativeness unauthoritied unauthoritiveness unauthorizable unauthorize unauthorized unauthorizedly unauthorizedness unautomatic unautumnal unavailability unavailable unavailableness unavailably unavailed unavailful unavailing unavailingly unavengeable unavenged unavenging unavenued unaveraged unaverred unaverted unavertible unavertibleness unavertibly unavian unavoidable unavoidableness unavoidably unavoidal unavoided unavoiding unavouchable unavouchableness unavouchably unavouched unavowable unavowableness unavowably unavowed unavowedly unawakable unawakableness unawake unawaked unawakened unawakenedness unawakening unawaking unawardable unawardableness unawardably unawarded unaware unawared unawaredly unawareness unawares unaway unawed unawful unawfully unawkward unawned unaxled unazotized unbackboarded unbacked unbackward unbadged unbaffled unbaffling unbag unbagged unbailable unbailableness unbailed unbain unbait unbaited unbaized unbaked unbalance unbalanceable unbalanceably unbalanced unbalancement unbalancing unbalconied unbale unbalked unballast unballasted unballoted unbandage unbandaged unbanded unbanished unbank unbankable unbankableness unbankably unbanked unbankrupt unbannered unbaptize unbaptized unbar unbarb unbarbarize unbarbarous unbarbed unbarbered unbare unbargained unbark unbarking unbaronet unbarrable unbarred unbarrel unbarreled unbarren unbarrenness unbarricade unbarricaded unbarricadoed unbase unbased unbasedness unbashful unbashfully unbashfulness unbasket unbastardized unbaste unbasted unbastilled unbastinadoed unbated unbathed unbating unbatted unbatten unbatterable unbattered unbattling unbay unbe unbeached unbeaconed unbeaded unbear unbearable unbearableness unbearably unbeard unbearded unbearing unbeast unbeatable unbeatableness unbeatably unbeaten unbeaued unbeauteous unbeauteously unbeauteousness unbeautified unbeautiful unbeautifully unbeautifulness unbeautify unbeavered unbeclogged unbeclouded unbecome unbecoming unbecomingly unbecomingness unbed unbedabbled unbedaggled unbedashed unbedaubed unbedded unbedecked unbedewed unbedimmed unbedinned unbedizened unbedraggled unbefit unbefitting unbefittingly unbefittingness unbefool unbefriend unbefriended unbefringed unbeget unbeggar unbegged unbegilt unbeginning unbeginningly unbeginningness unbegirded unbegirt unbegot unbegotten unbegottenly unbegottenness unbegreased unbegrimed unbegrudged unbeguile unbeguiled unbeguileful unbegun unbehaving unbeheaded unbeheld unbeholdable unbeholden unbeholdenness unbeholding unbehoveful unbehoving unbeing unbejuggled unbeknown unbeknownst unbelied unbelief unbeliefful unbelieffulness unbelievability unbelievable unbelievableness unbelievably unbelieve unbelieved unbeliever unbelieving unbelievingly unbelievingness unbell unbellicose unbelligerent unbelonging unbeloved unbelt unbemoaned unbemourned unbench unbend unbendable unbendableness unbendably unbended unbending unbendingly unbendingness unbendsome unbeneficed unbeneficent unbeneficial unbenefitable unbenefited unbenefiting unbenetted unbenevolence unbenevolent unbenevolently unbenight unbenighted unbenign unbenignant unbenignantly unbenignity unbenignly unbent unbenumb unbenumbed unbequeathable unbequeathed unbereaved unbereft unberouged unberth unberufen unbeseem unbeseeming unbeseemingly unbeseemingness unbeseemly unbeset unbesieged unbesmeared unbesmirched unbesmutted unbesot unbesought unbespeak unbespoke unbespoken unbesprinkled unbestarred unbestowed unbet unbeteared unbethink unbethought unbetide unbetoken unbetray unbetrayed unbetraying unbetrothed unbetterable unbettered unbeveled unbewailed unbewailing unbewilder unbewildered unbewilled unbewitch unbewitched unbewitching unbewrayed unbewritten unbias unbiasable unbiased unbiasedly unbiasedness unbibulous unbickered unbickering unbid unbidable unbiddable unbidden unbigged unbigoted unbilled unbillet unbilleted unbind unbindable unbinding unbiographical unbiological unbirdlike unbirdlimed unbirdly unbirthday unbishop unbishoply unbit unbiting unbitt unbitted unbitten unbitter unblacked unblackened unblade unblamable unblamableness unblamably unblamed unblaming unblanched unblanketed unblasphemed unblasted unblazoned unbleached unbleaching unbled unbleeding unblemishable unblemished unblemishedness unblemishing unblenched unblenching unblenchingly unblendable unblended unblent unbless unblessed unblessedness unblest unblighted unblightedly unblightedness unblind unblindfold unblinking unblinkingly unbliss unblissful unblistered unblithe unblithely unblock unblockaded unblocked unblooded unbloodied unbloodily unbloodiness unbloody unbloom unbloomed unblooming unblossomed unblossoming unblotted unbloused unblown unblued unbluestockingish unbluffed unbluffing unblunder unblundered unblundering unblunted unblurred unblush unblushing unblushingly unblushingness unboarded unboasted unboastful unboastfully unboasting unboat unbodied unbodiliness unbodily unboding unbodkined unbody unbodylike unbog unboggy unbohemianize unboiled unboisterous unbokel unbold unbolden unboldly unboldness unbolled unbolster unbolstered unbolt unbolted unbombast unbondable unbondableness unbonded unbone unboned unbonnet unbonneted unbonny unbooked unbookish unbooklearned unboot unbooted unboraxed unborder unbordered unbored unboring unborn unborne unborough unborrowed unborrowing unbosom unbosomer unbossed unbotanical unbothered unbothering unbottle unbottom unbottomed unbought unbound unboundable unboundableness unboundably unbounded unboundedly unboundedness unboundless unbounteous unbountiful unbountifully unbountifulness unbow unbowable unbowdlerized unbowed unbowel unboweled unbowered unbowing unbowingness unbowled unbowsome unbox unboxed unboy unboyish unboylike unbrace unbraced unbracedness unbracelet unbraceleted unbracing unbragged unbragging unbraid unbraided unbrailed unbrained unbran unbranched unbranching unbrand unbranded unbrandied unbrave unbraved unbravely unbraze unbreachable unbreached unbreaded unbreakable unbreakableness unbreakably unbreakfasted unbreaking unbreast unbreath unbreathable unbreathableness unbreathed unbreathing unbred unbreech unbreeched unbreezy unbrent unbrewed unbribable unbribableness unbribably unbribed unbribing unbrick unbridegroomlike unbridgeable unbridged unbridle unbridled unbridledly unbridledness unbridling unbrief unbriefed unbriefly unbright unbrightened unbrilliant unbrimming unbrined unbrittle unbroached unbroad unbroadcasted unbroidered unbroiled unbroke unbroken unbrokenly unbrokenness unbronzed unbrooch unbrooded unbrookable unbrookably unbrothered unbrotherlike unbrotherliness unbrotherly unbrought unbrown unbrowned unbruised unbrushed unbrutalize unbrutalized unbrute unbrutelike unbrutify unbrutize unbuckle unbuckramed unbud unbudded unbudgeability unbudgeable unbudgeableness unbudgeably unbudged unbudgeted unbudging unbuffed unbuffered unbuffeted unbuild unbuilded unbuilt unbulky unbulled unbulletined unbumped unbumptious unbunched unbundle unbundled unbung unbungling unbuoyant unbuoyed unburden unburdened unburdenment unburdensome unburdensomeness unburgessed unburiable unburial unburied unburlesqued unburly unburn unburnable unburned unburning unburnished unburnt unburrow unburrowed unburst unburstable unburstableness unburthen unbury unbush unbusied unbusily unbusiness unbusinesslike unbusk unbuskin unbuskined unbustling unbusy unbutchered unbutcherlike unbuttered unbutton unbuttoned unbuttonment unbuttressed unbuxom unbuxomly unbuxomness unbuyable unbuyableness unbuying unca uncabined uncabled uncadenced uncage uncaged uncake uncalcareous uncalcified uncalcined uncalculable uncalculableness uncalculably uncalculated uncalculating uncalculatingly uncalendered uncalk uncalked uncall uncalled uncallow uncallower uncalm uncalmed uncalmly uncalumniated uncambered uncamerated uncamouflaged uncanceled uncancellable uncancelled uncandid uncandidly uncandidness uncandied uncandor uncaned uncankered uncanned uncannily uncanniness uncanny uncanonic uncanonical uncanonically uncanonicalness uncanonize uncanonized uncanopied uncantoned uncantonized uncanvassably uncanvassed uncap uncapable uncapableness uncapably uncapacious uncapacitate uncaparisoned uncapitalized uncapped uncapper uncapsizable uncapsized uncaptained uncaptioned uncaptious uncaptiously uncaptivate uncaptivated uncaptivating uncaptived uncapturable uncaptured uncarbonated uncarboned uncarbureted uncarded uncardinal uncardinally uncareful uncarefully uncarefulness uncaressed uncargoed Uncaria uncaricatured uncaring uncarnate uncarnivorous uncaroled uncarpentered uncarpeted uncarriageable uncarried uncart uncarted uncartooned uncarved uncase uncased uncasemated uncask uncasked uncasketed uncasque uncassock uncast uncaste uncastigated uncastle uncastled uncastrated uncasual uncatalogued uncatchable uncate uncatechised uncatechisedness uncatechized uncatechizedness uncategorized uncathedraled uncatholcity uncatholic uncatholical uncatholicalness uncatholicize uncatholicly uncaucusable uncaught uncausatively uncaused uncauterized uncautious uncautiously uncautiousness uncavalier uncavalierly uncave unceasable unceased unceasing unceasingly unceasingness unceded unceiled unceilinged uncelebrated uncelebrating uncelestial uncelestialized uncellar uncement uncemented uncementing uncensorable uncensored uncensorious uncensoriously uncensoriousness uncensurable uncensured uncensuring uncenter uncentered uncentral uncentrality uncentrally uncentred uncentury uncereclothed unceremented unceremonial unceremonious unceremoniously unceremoniousness uncertain uncertainly uncertainness uncertainty uncertifiable uncertifiableness uncertificated uncertified uncertifying uncertitude uncessant uncessantly uncessantness unchafed unchain unchainable unchained unchair unchaired unchalked unchallengeable unchallengeableness unchallengeably unchallenged unchallenging unchambered unchamfered unchampioned unchance unchancellor unchancy unchange unchangeability unchangeable unchangeableness unchangeably unchanged unchangedness unchangeful unchangefulness unchanging unchangingly unchangingness unchanneled unchannelled unchanted unchaperoned unchaplain unchapleted unchapter unchaptered uncharacter uncharactered uncharacteristic uncharacteristically uncharacterized uncharge unchargeable uncharged uncharging uncharily unchariness unchariot uncharitable uncharitableness uncharitably uncharity uncharm uncharmable uncharmed uncharming uncharnel uncharred uncharted unchartered unchary unchased unchaste unchastely unchastened unchasteness unchastisable unchastised unchastising unchastity unchatteled unchauffeured unchawed uncheat uncheated uncheating uncheck uncheckable unchecked uncheckered uncheerable uncheered uncheerful uncheerfully uncheerfulness uncheerily uncheeriness uncheering uncheery unchemical unchemically uncherished uncherishing unchested unchevroned unchewable unchewableness unchewed unchid unchidden unchided unchiding unchidingly unchild unchildish unchildishly unchildishness unchildlike unchilled unchiming unchinked unchipped unchiseled unchiselled unchivalric unchivalrous unchivalrously unchivalrousness unchivalry unchloridized unchoicely unchokable unchoked uncholeric unchoosable unchopped unchoral unchorded unchosen unchrisom unchristen unchristened unchristian unchristianity unchristianize unchristianized unchristianlike unchristianly unchristianness unchronicled unchronological unchronologically unchurch unchurched unchurchlike unchurchly unchurn unci uncia uncial uncialize uncially uncicatrized unciferous unciform unciliated uncinal Uncinaria uncinariasis uncinariatic Uncinata uncinate uncinated uncinatum uncinch uncinct uncinctured uncini Uncinula uncinus uncipher uncircular uncircularized uncirculated uncircumcised uncircumcisedness uncircumcision uncircumlocutory uncircumscribable uncircumscribed uncircumscribedness uncircumscript uncircumscriptible uncircumscription uncircumspect uncircumspection uncircumspectly uncircumspectness uncircumstanced uncircumstantial uncirostrate uncite uncited uncitied uncitizen uncitizenlike uncitizenly uncity uncivic uncivil uncivilish uncivility uncivilizable uncivilization uncivilize uncivilized uncivilizedly uncivilizedness uncivilly uncivilness unclad unclaimed unclaiming unclamorous unclamp unclamped unclarified unclarifying unclarity unclashing unclasp unclasped unclassable unclassableness unclassably unclassed unclassible unclassical unclassically unclassifiable unclassifiableness unclassification unclassified unclassify unclassifying unclawed unclay unclayed uncle unclead unclean uncleanable uncleaned uncleanlily uncleanliness uncleanly uncleanness uncleansable uncleanse uncleansed uncleansedness unclear uncleared unclearing uncleavable uncleave uncledom uncleft unclehood unclement unclemently unclementness unclench unclergy unclergyable unclerical unclericalize unclerically unclericalness unclerklike unclerkly uncleship unclever uncleverly uncleverness unclew unclick uncliented unclify unclimaxed unclimb unclimbable unclimbableness unclimbably unclimbed unclimbing unclinch uncling unclinical unclip unclipped unclipper uncloak uncloakable uncloaked unclog unclogged uncloister uncloistered uncloistral unclosable unclose unclosed uncloseted unclothe unclothed unclothedly unclothedness unclotted uncloud unclouded uncloudedly uncloudedness uncloudy unclout uncloven uncloyable uncloyed uncloying unclub unclubbable unclubby unclustered unclustering unclutch unclutchable unclutched unclutter uncluttered unco uncoach uncoachable uncoachableness uncoached uncoacted uncoagulable uncoagulated uncoagulating uncoat uncoated uncoatedness uncoaxable uncoaxed uncoaxing uncock uncocked uncockneyfy uncocted uncodded uncoddled uncoded uncodified uncoerced uncoffer uncoffin uncoffined uncoffle uncogent uncogged uncogitable uncognizable uncognizant uncognized uncognoscibility uncognoscible uncoguidism uncoherent uncoherently uncoherentness uncohesive uncoif uncoifed uncoil uncoiled uncoin uncoined uncoked uncoking uncollapsed uncollapsible uncollar uncollared uncollated uncollatedness uncollected uncollectedly uncollectedness uncollectible uncollectibleness uncollectibly uncolleged uncollegian uncollegiate uncolloquial uncolloquially uncolonellike uncolonial uncolonize uncolonized uncolorable uncolorably uncolored uncoloredly uncoloredness uncoloured uncolouredly uncolouredness uncolt uncoly uncombable uncombatable uncombated uncombed uncombinable uncombinableness uncombinably uncombine uncombined uncombining uncombiningness uncombustible uncome uncomelily uncomeliness uncomely uncomfort uncomfortable uncomfortableness uncomfortably uncomforted uncomforting uncomfy uncomic uncommanded uncommandedness uncommanderlike uncommemorated uncommenced uncommendable uncommendableness uncommendably uncommended uncommensurability uncommensurable uncommensurableness uncommensurate uncommented uncommenting uncommerciable uncommercial uncommercially uncommercialness uncommingled uncomminuted uncommiserated uncommiserating uncommissioned uncommitted uncommitting uncommixed uncommodious uncommodiously uncommodiousness uncommon uncommonable uncommonly uncommonness uncommonplace uncommunicable uncommunicableness uncommunicably uncommunicated uncommunicating uncommunicative uncommunicatively uncommunicativeness uncommutable uncommutative uncommuted uncompact uncompacted Uncompahgre uncompahgrite uncompaniable uncompanied uncompanioned uncomparable uncomparably uncompared uncompass uncompassable uncompassed uncompassion uncompassionate uncompassionated uncompassionately uncompassionateness uncompassionating uncompassioned uncompatible uncompatibly uncompellable uncompelled uncompelling uncompensable uncompensated uncompetent uncompetitive uncompiled uncomplacent uncomplained uncomplaining uncomplainingly uncomplainingness uncomplaint uncomplaisance uncomplaisant uncomplaisantly uncomplemental uncompletable uncomplete uncompleted uncompletely uncompleteness uncomplex uncompliability uncompliable uncompliableness uncompliance uncompliant uncomplicated uncomplimentary uncomplimented uncomplimenting uncomplying uncomposable uncomposeable uncomposed uncompoundable uncompounded uncompoundedly uncompoundedness uncompounding uncomprehended uncomprehending uncomprehendingly uncomprehendingness uncomprehensible uncomprehension uncomprehensive uncomprehensively uncomprehensiveness uncompressed uncompressible uncomprised uncomprising uncomprisingly uncompromised uncompromising uncompromisingly uncompromisingness uncompulsive uncompulsory uncomputable uncomputableness uncomputably uncomputed uncomraded unconcatenated unconcatenating unconcealable unconcealableness unconcealably unconcealed unconcealing unconcealingly unconcealment unconceded unconceited unconceivable unconceivableness unconceivably unconceived unconceiving unconcern unconcerned unconcernedly unconcernedness unconcerning unconcernment unconcertable unconcerted unconcertedly unconcertedness unconcessible unconciliable unconciliated unconciliatedness unconciliating unconciliatory unconcludable unconcluded unconcluding unconcludingness unconclusive unconclusively unconclusiveness unconcocted unconcordant unconcrete unconcreted unconcurrent unconcurring uncondemnable uncondemned uncondensable uncondensableness uncondensed uncondensing uncondescending uncondescension uncondition unconditional unconditionality unconditionally unconditionalness unconditionate unconditionated unconditionately unconditioned unconditionedly unconditionedness uncondoled uncondoling unconducing unconducive unconduciveness unconducted unconductive unconductiveness unconfected unconfederated unconferred unconfess unconfessed unconfessing unconfided unconfidence unconfident unconfidential unconfidentialness unconfidently unconfiding unconfinable unconfine unconfined unconfinedly unconfinedness unconfinement unconfining unconfirm unconfirmative unconfirmed unconfirming unconfiscable unconfiscated unconflicting unconflictingly unconflictingness unconformability unconformable unconformableness unconformably unconformed unconformedly unconforming unconformist unconformity unconfound unconfounded unconfoundedly unconfrontable unconfronted unconfusable unconfusably unconfused unconfusedly unconfutable unconfuted unconfuting uncongeal uncongealable uncongealed uncongenial uncongeniality uncongenially uncongested unconglobated unconglomerated unconglutinated uncongratulate uncongratulated uncongratulating uncongregated uncongregational uncongressional uncongruous unconjecturable unconjectured unconjoined unconjugal unconjugated unconjunctive unconjured unconnected unconnectedly unconnectedness unconned unconnived unconniving unconquerable unconquerableness unconquerably unconquered unconscienced unconscient unconscientious unconscientiously unconscientiousness unconscionable unconscionableness unconscionably unconscious unconsciously unconsciousness unconsecrate unconsecrated unconsecratedly unconsecratedness unconsecration unconsecutive unconsent unconsentaneous unconsented unconsenting unconsequential unconsequentially unconsequentialness unconservable unconservative unconserved unconserving unconsiderable unconsiderate unconsiderately unconsiderateness unconsidered unconsideredly unconsideredness unconsidering unconsideringly unconsignable unconsigned unconsistent unconsociable unconsociated unconsolable unconsolably unconsolatory unconsoled unconsolidated unconsolidating unconsolidation unconsoling unconsonancy unconsonant unconsonantly unconsonous unconspicuous unconspicuously unconspicuousness unconspired unconspiring unconspiringly unconspiringness unconstancy unconstant unconstantly unconstantness unconstellated unconstipated unconstituted unconstitutional unconstitutionalism unconstitutionality unconstitutionally unconstrainable unconstrained unconstrainedly unconstrainedness unconstraining unconstraint unconstricted unconstruable unconstructed unconstructive unconstructural unconstrued unconsular unconsult unconsultable unconsulted unconsulting unconsumable unconsumed unconsuming unconsummate unconsummated unconsumptive uncontagious uncontainable uncontainableness uncontainably uncontained uncontaminable uncontaminate uncontaminated uncontemned uncontemnedly uncontemplated uncontemporaneous uncontemporary uncontemptuous uncontended uncontending uncontent uncontentable uncontented uncontentedly uncontentedness uncontenting uncontentingness uncontentious uncontentiously uncontentiousness uncontestable uncontestableness uncontestably uncontested uncontestedly uncontestedness uncontinence uncontinent uncontinental uncontinented uncontinently uncontinual uncontinued uncontinuous uncontorted uncontract uncontracted uncontractedness uncontractile uncontradictable uncontradictableness uncontradictably uncontradicted uncontradictedly uncontradictious uncontradictory uncontrastable uncontrasted uncontrasting uncontributed uncontributing uncontributory uncontrite uncontrived uncontriving uncontrol uncontrollability uncontrollable uncontrollableness uncontrollably uncontrolled uncontrolledly uncontrolledness uncontrolling uncontroversial uncontroversially uncontrovertable uncontrovertableness uncontrovertably uncontroverted uncontrovertedly uncontrovertible uncontrovertibleness uncontrovertibly unconvenable unconvened unconvenience unconvenient unconveniently unconventional unconventionalism unconventionality unconventionalize unconventionally unconventioned unconversable unconversableness unconversably unconversant unconversational unconversion unconvert unconverted unconvertedly unconvertedness unconvertibility unconvertible unconveyable unconveyed unconvicted unconvicting unconvince unconvinced unconvincedly unconvincedness unconvincibility unconvincible unconvincing unconvincingly unconvincingness unconvoluted unconvoyed unconvulsed uncookable uncooked uncooled uncoop uncooped uncoopered uncooping uncope uncopiable uncopied uncopious uncopyrighted uncoquettish uncoquettishly uncord uncorded uncordial uncordiality uncordially uncording uncore uncored uncork uncorked uncorker uncorking uncorned uncorner uncoronated uncoroneted uncorporal uncorpulent uncorrect uncorrectable uncorrected uncorrectible uncorrectly uncorrectness uncorrelated uncorrespondency uncorrespondent uncorresponding uncorrigible uncorrigibleness uncorrigibly uncorroborated uncorroded uncorrugated uncorrupt uncorrupted uncorruptedly uncorruptedness uncorruptibility uncorruptible uncorruptibleness uncorruptibly uncorrupting uncorruption uncorruptive uncorruptly uncorruptness uncorseted uncosseted uncost uncostliness uncostly uncostumed uncottoned uncouch uncouched uncouching uncounselable uncounseled uncounsellable uncounselled uncountable uncountableness uncountably uncounted uncountenanced uncounteracted uncounterbalanced uncounterfeit uncounterfeited uncountermandable uncountermanded uncountervailed uncountess uncountrified uncouple uncoupled uncoupler uncourageous uncoursed uncourted uncourteous uncourteously uncourteousness uncourtierlike uncourting uncourtlike uncourtliness uncourtly uncous uncousinly uncouth uncouthie uncouthly uncouthness uncouthsome uncovenant uncovenanted uncover uncoverable uncovered uncoveredly uncoveted uncoveting uncovetingly uncovetous uncowed uncowl uncoy uncracked uncradled uncraftily uncraftiness uncrafty uncram uncramp uncramped uncrampedness uncranked uncrannied uncrated uncravatted uncraven uncraving uncravingly uncrazed uncream uncreased uncreatability uncreatable uncreatableness uncreate uncreated uncreatedness uncreating uncreation uncreative uncreativeness uncreaturely uncredentialed uncredentialled uncredibility uncredible uncredibly uncreditable uncreditableness uncreditably uncredited uncrediting uncredulous uncreeping uncreosoted uncrest uncrested uncrevassed uncrib uncried uncrime uncriminal uncriminally uncrinkle uncrinkled uncrinkling uncrippled uncrisp uncritical uncritically uncriticisable uncriticised uncriticising uncriticisingly uncriticism uncriticizable uncriticized uncriticizing uncriticizingly uncrochety uncrook uncrooked uncrooking uncropped uncropt uncross uncrossable uncrossableness uncrossed uncrossexaminable uncrossexamined uncrossly uncrowded uncrown uncrowned uncrowning uncrucified uncrudded uncrude uncruel uncrumbled uncrumple uncrumpling uncrushable uncrushed uncrusted uncrying uncrystaled uncrystalled uncrystalline uncrystallizability uncrystallizable uncrystallized unction unctional unctioneer unctionless unctious unctiousness unctorium unctuose unctuosity unctuous unctuously unctuousness uncubbed uncubic uncuckold uncuckolded uncudgelled uncuffed uncular unculled uncultivability uncultivable uncultivate uncultivated uncultivation unculturable unculture uncultured uncumber uncumbered uncumbrous uncunning uncunningly uncunningness uncupped uncurable uncurableness uncurably uncurb uncurbable uncurbed uncurbedly uncurbing uncurd uncurdled uncurdling uncured uncurious uncuriously uncurl uncurled uncurling uncurrent uncurrently uncurrentness uncurricularized uncurried uncurse uncursed uncursing uncurst uncurtailed uncurtain uncurtained uncus uncushioned uncusped uncustomable uncustomarily uncustomariness uncustomary uncustomed uncut uncuth uncuticulate uncuttable uncynical uncynically uncypress undabbled undaggled undaily undaintiness undainty undallying undam undamageable undamaged undamaging undamasked undammed undamming undamn undamped undancing undandiacal undandled undangered undangerous undangerousness undared undaring undark undarken undarkened undarned undashed undatable undate undateable undated undatedness undaub undaubed undaughter undaughterliness undaughterly undauntable undaunted undauntedly undauntedness undaunting undawned undawning undazed undazing undazzle undazzled undazzling unde undead undeadened undeaf undealable undealt undean undear undebarred undebased undebatable undebated undebating undebauched undebilitated undebilitating undecagon undecanaphthene undecane undecatoic undecayable undecayableness undecayed undecayedness undecaying undeceased undeceitful undeceivable undeceivableness undeceivably undeceive undeceived undeceiver undeceiving undecency undecennary undecennial undecent undecently undeception undeceptious undeceptitious undeceptive undecidable undecide undecided undecidedly undecidedness undeciding undecimal undeciman undecimole undecipher undecipherability undecipherable undecipherably undeciphered undecision undecisive undecisively undecisiveness undeck undecked undeclaimed undeclaiming undeclamatory undeclarable undeclare undeclared undeclinable undeclinableness undeclinably undeclined undeclining undecocted undecoic undecolic undecomposable undecomposed undecompounded undecorated undecorative undecorous undecorously undecorousness undecorticated undecoyed undecreased undecreasing undecree undecreed undecried undecyl undecylenic undecylic undedicate undedicated undeducible undeducted undeeded undeemed undeemous undeemously undeep undefaceable undefaced undefalcated undefamed undefaming undefatigable undefaulted undefaulting undefeasible undefeat undefeatable undefeated undefeatedly undefeatedness undefecated undefectible undefective undefectiveness undefendable undefendableness undefendably undefended undefending undefense undefensed undefensible undeferential undeferentially undeferred undefiant undeficient undefied undefilable undefiled undefiledly undefiledness undefinable undefinableness undefinably undefine undefined undefinedly undefinedness undeflected undeflowered undeformed undeformedness undefrauded undefrayed undeft undegeneracy undegenerate undegenerated undegenerating undegraded undegrading undeification undeified undeify undeistical undejected undelated undelayable undelayed undelayedly undelaying undelayingly undelectable undelectably undelegated undeleted undeliberate undeliberated undeliberately undeliberateness undeliberating undeliberatingly undeliberative undeliberativeness undelible undelicious undelight undelighted undelightful undelightfully undelightfulness undelighting undelightsome undelimited undelineated undeliverable undeliverableness undelivered undelivery undeludable undelude undeluded undeluding undeluged undelusive undelusively undelve undelved undelylene undemagnetizable undemanded undemised undemocratic undemocratically undemocratize undemolishable undemolished undemonstrable undemonstrably undemonstratable undemonstrated undemonstrative undemonstratively undemonstrativeness undemure undemurring unden undeniable undeniableness undeniably undenied undeniedly undenizened undenominated undenominational undenominationalism undenominationalist undenominationalize undenominationally undenoted undenounced undenuded undepartableness undepartably undeparted undeparting undependable undependableness undependably undependent undepending undephlegmated undepicted undepleted undeplored undeported undeposable undeposed undeposited undepraved undepravedness undeprecated undepreciated undepressed undepressible undepressing undeprivable undeprived undepurated undeputed under underabyss underaccident underaccommodated underact underacted underacting underaction underactor underadjustment underadmiral underadventurer underage underagency underagent underagitation underaid underaim underair underalderman underanged underarch underargue underarm underaverage underback underbailiff underbake underbalance underballast underbank underbarber underbarring underbasal underbeadle underbeak underbeam underbear underbearer underbearing underbeat underbeaten underbed underbelly underbeveling underbid underbidder underbill underbillow underbishop underbishopric underbit underbite underbitted underbitten underboard underboated underbodice underbody underboil underboom underborn underborne underbottom underbough underbought underbound underbowed underbowser underbox underboy underbrace underbraced underbranch underbreath underbreathing underbred underbreeding underbrew underbridge underbrigadier underbright underbrim underbrush underbubble underbud underbuild underbuilder underbuilding underbuoy underburn underburned underburnt underbursar underbury underbush underbutler underbuy undercanopy undercanvass undercap undercapitaled undercapitalization undercapitalize undercaptain undercarder undercarriage undercarry undercarter undercarve undercarved undercase undercasing undercast undercause underceiling undercellar undercellarer underchamber underchamberlain underchancellor underchanter underchap undercharge undercharged underchief underchime underchin underchord underchurched undercircle undercitizen underclad underclass underclassman underclay underclearer underclerk underclerkship undercliff underclift undercloak undercloth underclothe underclothed underclothes underclothing underclub underclutch undercoachman undercoat undercoated undercoater undercoating undercollector undercolor undercolored undercoloring undercommander undercomment undercompounded underconcerned undercondition underconsciousness underconstable underconsume underconsumption undercook undercool undercooper undercorrect undercountenance undercourse undercourtier undercover undercovering undercovert undercrawl undercreep undercrest undercrier undercroft undercrop undercrust undercry undercrypt undercup undercurl undercurrent undercurve undercut undercutter undercutting underdauber underdeacon underdead underdebauchee underdeck underdepth underdevelop underdevelopment underdevil underdialogue underdig underdip underdish underdistinction underdistributor underditch underdive underdo underdoctor underdoer underdog underdoing underdone underdose underdot underdown underdraft underdrag underdrain underdrainage underdrainer underdraught underdraw underdrawers underdrawn underdress underdressed underdrift underdrive underdriven underdrudgery underdrumming underdry underdunged underearth undereat undereaten underedge undereducated underemployment underengraver underenter underer underescheator underestimate underestimation underexcited underexercise underexpose underexposure undereye underface underfaction underfactor underfaculty underfalconer underfall underfarmer underfeathering underfeature underfed underfeed underfeeder underfeeling underfeet underfellow underfiend underfill underfilling underfinance underfind underfire underfitting underflame underflannel underfleece underflood underfloor underflooring underflow underfold underfolded underfong underfoot underfootage underfootman underforebody underform underfortify underframe underframework underframing underfreight underfrequency underfringe underfrock underfur underfurnish underfurnisher underfurrow undergabble undergamekeeper undergaoler undergarb undergardener undergarment undergarnish undergauge undergear undergeneral undergentleman undergird undergirder undergirding undergirdle undergirth underglaze undergloom underglow undergnaw undergo undergod undergoer undergoing undergore undergoverness undergovernment undergovernor undergown undergrad undergrade undergraduate undergraduatedom undergraduateness undergraduateship undergraduatish undergraduette undergraining undergrass undergreen undergrieve undergroan underground undergrounder undergroundling undergrove undergrow undergrowl undergrown undergrowth undergrub underguard underguardian undergunner underhabit underhammer underhand underhanded underhandedly underhandedness underhang underhanging underhangman underhatch underhead underheat underheaven underhelp underhew underhid underhill underhint underhistory underhive underhold underhole underhonest underhorse underhorsed underhousemaid underhum underhung underided underinstrument underisive underissue underivable underivative underived underivedly underivedness underjacket underjailer underjanitor underjaw underjawed underjobbing underjudge underjungle underkeel underkeeper underkind underking underkingdom underlaborer underlaid underlain underland underlanguaged underlap underlapper underlash underlaundress underlawyer underlay underlayer underlaying underleaf underlease underleather underlegate underlessee underlet underletter underlevel underlever underlid underlie underlier underlieutenant underlife underlift underlight underliking underlimbed underlimit underline underlineation underlineman underlinement underlinen underliner underling underlining underlip underlive underload underlock underlodging underloft underlook underlooker underlout underlunged underly underlye underlying undermade undermaid undermaker underman undermanager undermanned undermanning undermark undermarshal undermarshalman undermasted undermaster undermatch undermatched undermate undermath undermeal undermeaning undermeasure undermediator undermelody undermentioned undermiller undermimic underminable undermine underminer undermining underminingly underminister underministry undermist undermoated undermoney undermoral undermost undermotion undermount undermountain undermusic undermuslin undern undername undernatural underneath underness underniceness undernote undernoted undernourish undernourished undernourishment undernsong underntide underntime undernurse undernutrition underoccupied underofficer underofficered underofficial underogating underogatory underopinion underorb underorganization underorseman underoverlooker underoxidize underpacking underpaid underpain underpainting underpan underpants underparticipation underpartner underpass underpassion underpay underpayment underpeep underpeer underpen underpeopled underpetticoat underpetticoated underpick underpier underpilaster underpile underpin underpinner underpinning underpitch underpitched underplain underplan underplant underplate underplay underplot underplotter underply underpoint underpole underpopulate underpopulation underporch underporter underpose underpossessor underpot underpower underpraise underprefect underprentice underpresence underpresser underpressure underprice underpriest underprincipal underprint underprior underprivileged underprize underproduce underproduction underproductive underproficient underprompt underprompter underproof underprop underproportion underproportioned underproposition underpropped underpropper underpropping underprospect underpry underpuke underqualified underqueen underquote underranger underrate underratement underrating underreach underread underreader underrealize underrealm underream underreamer underreceiver underreckon underrecompense underregion underregistration underrent underrented underrenting underrepresent underrepresentation underrespected underriddle underriding underrigged underring underripe underripened underriver underroarer underroast underrobe underrogue underroll underroller underroof underroom underroot underrooted underrower underrule underruler underrun underrunning undersacristan undersailed undersally undersap undersatisfaction undersaturate undersaturation undersavior undersaw undersawyer underscale underscheme underschool underscoop underscore underscribe underscript underscrub underscrupulous undersea underseam underseaman undersearch underseas underseated undersecretary undersecretaryship undersect undersee underseeded underseedman undersell underseller underselling undersense undersequence underservant underserve underservice underset undersetter undersetting undersettle undersettler undersettling undersexton undershapen undersharp undersheathing undershepherd undersheriff undersheriffry undersheriffship undersheriffwick undershield undershine undershining undershire undershirt undershoe undershoot undershore undershorten undershot undershrievalty undershrieve undershrievery undershrub undershrubbiness undershrubby undershunter undershut underside undersight undersighted undersign undersignalman undersigner undersill undersinging undersitter undersize undersized underskin underskirt undersky undersleep undersleeve underslip underslope undersluice underslung undersneer undersociety undersoil undersole undersomething undersong undersorcerer undersort undersoul undersound undersovereign undersow underspar undersparred underspecies underspecified underspend undersphere underspin underspinner undersplice underspore underspread underspring undersprout underspurleather undersquare understaff understage understain understairs understamp understand understandability understandable understandableness understandably understander understanding understandingly understandingness understate understatement understay understeer understem understep understeward understewardship understimulus understock understocking understood understory understrain understrap understrapper understrapping understratum understream understress understrew understride understriding understrife understrike understring understroke understrung understudy understuff understuffing undersuck undersuggestion undersuit undersupply undersupport undersurface underswain underswamp undersward underswearer undersweat undersweep underswell undertakable undertake undertakement undertaker undertakerish undertakerlike undertakerly undertakery undertaking undertakingly undertalk undertapster undertaxed underteacher underteamed underteller undertenancy undertenant undertenter undertenure underterrestrial undertest underthane underthaw underthief underthing underthink underthirst underthought underthroating underthrob underthrust undertide undertided undertie undertime undertimed undertint undertitle undertone undertoned undertook undertow undertrader undertrained undertread undertreasurer undertreat undertribe undertrick undertrodden undertruck undertrump undertruss undertub undertune undertunic underturf underturn underturnkey undertutor undertwig undertype undertyrant underusher undervaluation undervalue undervaluement undervaluer undervaluing undervaluinglike undervaluingly undervalve undervassal undervaulted undervaulting undervegetation underventilation underverse undervest undervicar underviewer undervillain undervinedresser undervitalized undervocabularied undervoice undervoltage underwage underwaist underwaistcoat underwalk underward underwarden underwarmth underwarp underwash underwatch underwatcher underwater underwave underway underweapon underwear underweft underweigh underweight underweighted underwent underwheel underwhistle underwind underwing underwit underwitch underwitted underwood underwooded underwork underworker underworking underworkman underworld underwrap underwrite underwriter underwriting underwrought underyield underyoke underzeal underzealot undescendable undescended undescendible undescribable undescribably undescribed undescried undescript undescriptive undescrying undesert undeserted undeserting undeserve undeserved undeservedly undeservedness undeserver undeserving undeservingly undeservingness undesign undesignated undesigned undesignedly undesignedness undesigning undesigningly undesigningness undesirability undesirable undesirableness undesirably undesire undesired undesiredly undesiring undesirous undesirously undesirousness undesisting undespaired undespairing undespairingly undespatched undespised undespising undespoiled undespondent undespondently undesponding undespotic undestined undestroyable undestroyed undestructible undestructive undetachable undetached undetailed undetainable undetained undetectable undetected undetectible undeteriorated undeteriorating undeterminable undeterminate undetermination undetermined undetermining undeterred undeterring undetested undetesting undethronable undethroned undetracting undetractingly undetrimental undevelopable undeveloped undeveloping undeviated undeviating undeviatingly undevil undevious undeviously undevisable undevised undevoted undevotion undevotional undevoured undevout undevoutly undevoutness undewed undewy undexterous undexterously undextrous undextrously undiademed undiagnosable undiagnosed undialed undialyzed undiametric undiamonded undiapered undiaphanous undiatonic undichotomous undictated undid undidactic undies undieted undifferenced undifferent undifferential undifferentiated undifficult undiffident undiffracted undiffused undiffusible undiffusive undig undigenous undigest undigestable undigested undigestible undigesting undigestion undigged undight undighted undigitated undignified undignifiedly undignifiedness undignify undiked undilapidated undilatable undilated undilatory undiligent undiligently undilute undiluted undilution undiluvial undim undimensioned undimerous undimidiate undiminishable undiminishableness undiminishably undiminished undiminishing undiminutive undimmed undimpled Undine undine undined undinted undiocesed undiphthongize undiplomaed undiplomatic undipped undirect undirected undirectional undirectly undirectness undirk undisabled undisadvantageous undisagreeable undisappearing undisappointable undisappointed undisappointing undisarmed undisastrous undisbanded undisbarred undisburdened undisbursed undiscardable undiscarded undiscerned undiscernedly undiscernible undiscernibleness undiscernibly undiscerning undiscerningly undischargeable undischarged undiscipled undisciplinable undiscipline undisciplined undisciplinedness undisclaimed undisclosed undiscolored undiscomfitable undiscomfited undiscomposed undisconcerted undisconnected undiscontinued undiscordant undiscording undiscounted undiscourageable undiscouraged undiscouraging undiscoursed undiscoverable undiscoverableness undiscoverably undiscovered undiscreditable undiscredited undiscreet undiscreetly undiscreetness undiscretion undiscriminated undiscriminating undiscriminatingly undiscriminatingness undiscriminative undiscursive undiscussable undiscussed undisdained undisdaining undiseased undisestablished undisfigured undisfranchised undisfulfilled undisgorged undisgraced undisguisable undisguise undisguised undisguisedly undisguisedness undisgusted undisheartened undished undisheveled undishonored undisillusioned undisinfected undisinheritable undisinherited undisintegrated undisinterested undisjoined undisjointed undisliked undislocated undislodgeable undislodged undismantled undismay undismayable undismayed undismayedly undismembered undismissed undismounted undisobedient undisobeyed undisobliging undisordered undisorderly undisorganized undisowned undisowning undisparaged undisparity undispassionate undispatchable undispatched undispatching undispellable undispelled undispensable undispensed undispensing undispersed undispersing undisplaced undisplanted undisplay undisplayable undisplayed undisplaying undispleased undispose undisposed undisposedness undisprivacied undisprovable undisproved undisproving undisputable undisputableness undisputably undisputatious undisputatiously undisputed undisputedly undisputedness undisputing undisqualifiable undisqualified undisquieted undisreputable undisrobed undisrupted undissected undissembled undissembledness undissembling undissemblingly undisseminated undissenting undissevered undissimulated undissipated undissociated undissoluble undissolute undissolvable undissolved undissolving undissonant undissuadable undissuadably undissuade undistanced undistant undistantly undistasted undistasteful undistempered undistend undistended undistilled undistinct undistinctive undistinctly undistinctness undistinguish undistinguishable undistinguishableness undistinguishably undistinguished undistinguishing undistinguishingly undistorted undistorting undistracted undistractedly undistractedness undistracting undistractingly undistrained undistraught undistress undistressed undistributed undistrusted undistrustful undisturbable undisturbance undisturbed undisturbedly undisturbedness undisturbing undisturbingly unditched undithyrambic undittoed undiuretic undiurnal undivable undivergent undiverging undiverse undiversified undiverted undivertible undivertibly undiverting undivested undivestedly undividable undividableness undividably undivided undividedly undividedness undividing undivinable undivined undivinelike undivinely undivining undivisible undivisive undivorceable undivorced undivorcedness undivorcing undivulged undivulging undizened undizzied undo undoable undock undocked undoctor undoctored undoctrinal undoctrined undocumentary undocumented undocumentedness undodged undoer undoffed undog undogmatic undogmatical undoing undoingness undolled undolorous undomed undomestic undomesticate undomesticated undomestication undomicilable undomiciled undominated undomineering undominical undominoed undon undonated undonating undone undoneness undonkey undonnish undoomed undoped undormant undose undosed undoting undotted undouble undoubled undoubtable undoubtableness undoubtably undoubted undoubtedly undoubtedness undoubtful undoubtfully undoubtfulness undoubting undoubtingly undoubtingness undouched undoughty undovelike undoweled undowered undowned undowny undrab undraftable undrafted undrag undragoned undragooned undrainable undrained undramatic undramatical undramatically undramatizable undramatized undrape undraped undraperied undraw undrawable undrawn undreaded undreadful undreadfully undreading undreamed undreaming undreamlike undreamt undreamy undredged undreggy undrenched undress undressed undried undrillable undrilled undrinkable undrinkableness undrinkably undrinking undripping undrivable undrivableness undriven undronelike undrooping undropped undropsical undrossy undrowned undrubbed undrugged undrunk undrunken undry undryable undrying undualize undub undubbed undubitable undubitably unducal unduchess undue unduelling undueness undug unduke undulant undular undularly undulatance undulate undulated undulately undulating undulatingly undulation undulationist undulative undulatory undull undulled undullness unduloid undulose undulous unduly undumped unduncelike undunged undupable unduped unduplicability unduplicable unduplicity undurable undurableness undurably undust undusted unduteous undutiable undutiful undutifully undutifulness unduty undwarfed undwelt undwindling undy undye undyeable undyed undying undyingly undyingness uneager uneagerly uneagerness uneagled unearly unearned unearnest unearth unearthed unearthliness unearthly unease uneaseful uneasefulness uneasily uneasiness uneastern uneasy uneatable uneatableness uneaten uneath uneating unebbed unebbing unebriate uneccentric unecclesiastical unechoed unechoing uneclectic uneclipsed uneconomic uneconomical uneconomically uneconomicalness uneconomizing unecstatic unedge unedged unedible unedibleness unedibly unedified unedifying uneditable unedited uneducable uneducableness uneducably uneducate uneducated uneducatedly uneducatedness uneducative uneduced uneffaceable uneffaceably uneffaced uneffected uneffectible uneffective uneffectless uneffectual uneffectually uneffectualness uneffectuated uneffeminate uneffeminated uneffervescent uneffete unefficacious unefficient uneffigiated uneffused uneffusing uneffusive unegoist unegoistical unegoistically unegregious unejaculated unejected unelaborate unelaborated unelaborately unelaborateness unelapsed unelastic unelasticity unelated unelating unelbowed unelderly unelect unelectable unelected unelective unelectric unelectrical unelectrified unelectrify unelectrifying unelectrized unelectronic uneleemosynary unelegant unelegantly unelegantness unelemental unelementary unelevated unelicited unelided unelidible uneligibility uneligible uneligibly uneliminated unelongated uneloped uneloping uneloquent uneloquently unelucidated unelucidating uneluded unelusive unemaciated unemancipable unemancipated unemasculated unembalmed unembanked unembarrassed unembarrassedly unembarrassedness unembarrassing unembarrassment unembased unembattled unembayed unembellished unembezzled unembittered unemblazoned unembodied unembodiment unembossed unembowelled unembowered unembraceable unembraced unembroidered unembroiled unembryonic unemendable unemended unemerged unemerging unemigrating uneminent uneminently unemitted unemolumentary unemolumented unemotional unemotionalism unemotionally unemotionalness unemotioned unempaneled unemphatic unemphatical unemphatically unempirical unempirically unemploy unemployability unemployable unemployableness unemployably unemployed unemployment unempoisoned unempowered unempt unemptiable unemptied unempty unemulative unemulous unemulsified unenabled unenacted unenameled unenamored unencamped unenchafed unenchant unenchanted unencircled unenclosed unencompassed unencored unencounterable unencountered unencouraged unencouraging unencroached unencroaching unencumber unencumbered unencumberedly unencumberedness unencumbering unencysted unendable unendamaged unendangered unendeared unendeavored unended unending unendingly unendingness unendorsable unendorsed unendowed unendowing unendued unendurability unendurable unendurably unendured unenduring unenduringly unenergetic unenergized unenervated unenfeebled unenfiladed unenforceable unenforced unenforcedly unenforcedness unenforcibility unenfranchised unengaged unengaging unengendered unengineered unenglish unengraved unengraven unengrossed unenhanced unenjoined unenjoyable unenjoyed unenjoying unenjoyingly unenkindled unenlarged unenlightened unenlightening unenlisted unenlivened unenlivening unennobled unennobling unenounced unenquired unenquiring unenraged unenraptured unenrichable unenrichableness unenriched unenriching unenrobed unenrolled unenshrined unenslave unenslaved unensnared unensouled unensured unentailed unentangle unentangleable unentangled unentanglement unentangler unenterable unentered unentering unenterprise unenterprised unenterprising unenterprisingly unenterprisingness unentertainable unentertained unentertaining unentertainingly unentertainingness unenthralled unenthralling unenthroned unenthusiasm unenthusiastic unenthusiastically unenticed unenticing unentire unentitled unentombed unentomological unentrance unentranced unentrapped unentreated unentreating unentrenched unentwined unenumerable unenumerated unenveloped unenvenomed unenviable unenviably unenvied unenviedly unenvious unenviously unenvironed unenvying unenwoven unepauleted unephemeral unepic unepicurean unepigrammatic unepilogued unepiscopal unepiscopally unepistolary unepitaphed unepithelial unepitomized unequable unequableness unequably unequal unequalable unequaled unequality unequalize unequalized unequally unequalness unequated unequatorial unequestrian unequiangular unequiaxed unequilateral unequilibrated unequine unequipped unequitable unequitableness unequitably unequivalent unequivalve unequivalved unequivocal unequivocally unequivocalness uneradicable uneradicated unerasable unerased unerasing unerect unerected unermined uneroded unerrable unerrableness unerrably unerrancy unerrant unerratic unerring unerringly unerringness unerroneous unerroneously unerudite unerupted uneruptive unescaladed unescalloped unescapable unescapableness unescapably unescaped unescheated uneschewable uneschewably uneschewed Unesco unescorted unescutcheoned unesoteric unespied unespousable unespoused unessayed unessence unessential unessentially unessentialness unestablish unestablishable unestablished unestablishment unesteemed unestimable unestimableness unestimably unestimated unestopped unestranged unetched uneternal uneternized unethereal unethic unethical unethically unethicalness unethnological unethylated unetymological unetymologizable uneucharistical uneugenic uneulogized uneuphemistical uneuphonic uneuphonious uneuphoniously uneuphoniousness unevacuated unevadable unevaded unevaluated unevanescent unevangelic unevangelical unevangelized unevaporate unevaporated unevasive uneven unevenly unevenness uneventful uneventfully uneventfulness uneverted unevicted unevidenced unevident unevidential unevil unevinced unevirated uneviscerated unevitable unevitably unevokable unevoked unevolutionary unevolved unexacerbated unexact unexacted unexactedly unexacting unexactingly unexactly unexactness unexaggerable unexaggerated unexaggerating unexalted unexaminable unexamined unexamining unexampled unexampledness unexasperated unexasperating unexcavated unexceedable unexceeded unexcelled unexcellent unexcelling unexceptable unexcepted unexcepting unexceptionability unexceptionable unexceptionableness unexceptionably unexceptional unexceptionally unexceptionalness unexceptive unexcerpted unexcessive unexchangeable unexchangeableness unexchanged unexcised unexcitability unexcitable unexcited unexciting unexclaiming unexcludable unexcluded unexcluding unexclusive unexclusively unexclusiveness unexcogitable unexcogitated unexcommunicated unexcoriated unexcorticated unexcrescent unexcreted unexcruciating unexculpable unexculpably unexculpated unexcursive unexcusable unexcusableness unexcusably unexcused unexcusedly unexcusedness unexcusing unexecrated unexecutable unexecuted unexecuting unexecutorial unexemplary unexemplifiable unexemplified unexempt unexempted unexemptible unexempting unexercisable unexercise unexercised unexerted unexhalable unexhaled unexhausted unexhaustedly unexhaustedness unexhaustible unexhaustibleness unexhaustibly unexhaustion unexhaustive unexhaustiveness unexhibitable unexhibitableness unexhibited unexhilarated unexhilarating unexhorted unexhumed unexigent unexilable unexiled unexistence unexistent unexisting unexonerable unexonerated unexorable unexorableness unexorbitant unexorcisable unexorcisably unexorcised unexotic unexpandable unexpanded unexpanding unexpansive unexpectable unexpectant unexpected unexpectedly unexpectedness unexpecting unexpectingly unexpectorated unexpedient unexpeditated unexpedited unexpeditious unexpelled unexpendable unexpended unexpensive unexpensively unexpensiveness unexperience unexperienced unexperiencedness unexperient unexperiential unexperimental unexperimented unexpert unexpertly unexpertness unexpiable unexpiated unexpired unexpiring unexplainable unexplainableness unexplainably unexplained unexplainedly unexplainedness unexplaining unexplanatory unexplicable unexplicableness unexplicably unexplicated unexplicit unexplicitly unexplicitness unexploded unexploitation unexploited unexplorable unexplorative unexplored unexplosive unexportable unexported unexporting unexposable unexposed unexpostulating unexpoundable unexpounded unexpress unexpressable unexpressableness unexpressably unexpressed unexpressedly unexpressible unexpressibleness unexpressibly unexpressive unexpressively unexpressiveness unexpressly unexpropriable unexpropriated unexpugnable unexpunged unexpurgated unexpurgatedly unexpurgatedness unextended unextendedly unextendedness unextendible unextensible unextenuable unextenuated unextenuating unexterminable unexterminated unexternal unexternality unexterritoriality unextinct unextinctness unextinguishable unextinguishableness unextinguishably unextinguished unextirpated unextolled unextortable unextorted unextractable unextracted unextradited unextraneous unextraordinary unextravagance unextravagant unextravagating unextravasated unextreme unextricable unextricated unextrinsic unextruded unexuberant unexuded unexultant uneye uneyeable uneyed unfabled unfabling unfabricated unfabulous unfacaded unface unfaceable unfaced unfaceted unfacetious unfacile unfacilitated unfact unfactional unfactious unfactitious unfactorable unfactored unfactual unfadable unfaded unfading unfadingly unfadingness unfagged unfagoted unfailable unfailableness unfailably unfailed unfailing unfailingly unfailingness unfain unfaint unfainting unfaintly unfair unfairly unfairminded unfairness unfairylike unfaith unfaithful unfaithfully unfaithfulness unfaked unfallacious unfallaciously unfallen unfallenness unfallible unfallibleness unfallibly unfalling unfallowed unfalse unfalsifiable unfalsified unfalsifiedness unfalsity unfaltering unfalteringly unfamed unfamiliar unfamiliarity unfamiliarized unfamiliarly unfanatical unfanciable unfancied unfanciful unfancy unfanged unfanned unfantastic unfantastical unfantastically unfar unfarced unfarcical unfarewelled unfarmed unfarming unfarrowed unfarsighted unfasciated unfascinate unfascinated unfascinating unfashion unfashionable unfashionableness unfashionably unfashioned unfast unfasten unfastenable unfastened unfastener unfastidious unfastidiously unfastidiousness unfasting unfather unfathered unfatherlike unfatherliness unfatherly unfathomability unfathomable unfathomableness unfathomably unfathomed unfatigue unfatigueable unfatigued unfatiguing unfattable unfatted unfatten unfauceted unfaultfinding unfaulty unfavorable unfavorableness unfavorably unfavored unfavoring unfavorite unfawning unfealty unfeared unfearful unfearfully unfearing unfearingly unfeary unfeasable unfeasableness unfeasably unfeasibility unfeasible unfeasibleness unfeasibly unfeasted unfeather unfeathered unfeatured unfecund unfecundated unfed unfederal unfederated unfeeble unfeed unfeedable unfeeding unfeeing unfeelable unfeeling unfeelingly unfeelingness unfeignable unfeignableness unfeignably unfeigned unfeignedly unfeignedness unfeigning unfeigningly unfeigningness unfele unfelicitated unfelicitating unfelicitous unfelicitously unfelicitousness unfeline unfellable unfelled unfellied unfellow unfellowed unfellowlike unfellowly unfellowshiped unfelon unfelonious unfeloniously unfelony unfelt unfelted unfemale unfeminine unfemininely unfeminineness unfemininity unfeminist unfeminize unfence unfenced unfendered unfenestrated unfeoffed unfermentable unfermentableness unfermentably unfermented unfermenting unfernlike unferocious unferreted unferried unfertile unfertileness unfertility unfertilizable unfertilized unfervent unfervid unfester unfestered unfestival unfestive unfestively unfestooned unfetchable unfetched unfeted unfetter unfettered unfettled unfeudal unfeudalize unfeudalized unfeued unfevered unfeverish unfew unfibbed unfibbing unfiber unfibered unfibrous unfickle unfictitious unfidelity unfidgeting unfielded unfiend unfiendlike unfierce unfiery unfight unfightable unfighting unfigurable unfigurative unfigured unfilamentous unfilched unfile unfiled unfilial unfilially unfilialness unfill unfillable unfilled unfilleted unfilling unfilm unfilmed unfiltered unfiltrated unfinable unfinancial unfine unfined unfinessed unfingered unfinical unfinish unfinishable unfinished unfinishedly unfinishedness unfinite unfired unfireproof unfiring unfirm unfirmamented unfirmly unfirmness unfiscal unfishable unfished unfishing unfishlike unfissile unfistulous unfit unfitly unfitness unfittable unfitted unfittedness unfitten unfitting unfittingly unfittingness unfitty unfix unfixable unfixated unfixed unfixedness unfixing unfixity unflag unflagged unflagging unflaggingly unflaggingness unflagitious unflagrant unflaky unflamboyant unflaming unflanged unflank unflanked unflapping unflashing unflat unflated unflattened unflatterable unflattered unflattering unflatteringly unflaunted unflavored unflawed unflayed unflead unflecked unfledge unfledged unfledgedness unfleece unfleeced unfleeing unfleeting unflesh unfleshed unfleshliness unfleshly unfleshy unfletched unflexed unflexible unflexibleness unflexibly unflickering unflickeringly unflighty unflinching unflinchingly unflinchingness unflintify unflippant unflirtatious unflitched unfloatable unfloating unflock unfloggable unflogged unflooded unfloor unfloored unflorid unflossy unflounced unfloured unflourished unflourishing unflouted unflower unflowered unflowing unflown unfluctuating unfluent unfluid unfluked unflunked unfluorescent unflurried unflush unflushed unflustered unfluted unflutterable unfluttered unfluttering unfluvial unfluxile unflying unfoaled unfoaming unfocused unfoggy unfoilable unfoiled unfoisted unfold unfoldable unfolded unfolder unfolding unfoldment unfoldure unfoliaged unfoliated unfollowable unfollowed unfollowing unfomented unfond unfondled unfondness unfoodful unfool unfoolable unfooled unfooling unfoolish unfooted unfootsore unfoppish unforaged unforbade unforbearance unforbearing unforbid unforbidden unforbiddenly unforbiddenness unforbidding unforceable unforced unforcedly unforcedness unforceful unforcible unforcibleness unforcibly unfordable unfordableness unforded unforeboded unforeboding unforecasted unforegone unforeign unforeknowable unforeknown unforensic unforeordained unforesee unforeseeable unforeseeableness unforeseeably unforeseeing unforeseeingly unforeseen unforeseenly unforeseenness unforeshortened unforest unforestallable unforestalled unforested unforetellable unforethought unforethoughtful unforetold unforewarned unforewarnedness unforfeit unforfeitable unforfeited unforgeability unforgeable unforged unforget unforgetful unforgettable unforgettableness unforgettably unforgetting unforgettingly unforgivable unforgivableness unforgivably unforgiven unforgiveness unforgiver unforgiving unforgivingly unforgivingness unforgone unforgot unforgotten unfork unforked unforkedness unforlorn unform unformal unformality unformalized unformally unformalness unformative unformed unformidable unformulable unformularizable unformularize unformulated unformulistic unforsaken unforsaking unforsook unforsworn unforthright unfortifiable unfortified unfortify unfortuitous unfortunate unfortunately unfortunateness unfortune unforward unforwarded unfossiliferous unfossilized unfostered unfought unfoughten unfoul unfoulable unfouled unfound unfounded unfoundedly unfoundedness unfoundered unfountained unfowllike unfoxy unfractured unfragrance unfragrant unfragrantly unfrail unframable unframableness unframably unframe unframed unfranchised unfrank unfrankable unfranked unfrankly unfrankness unfraternal unfraternizing unfraudulent unfraught unfrayed unfreckled unfree unfreed unfreedom unfreehold unfreely unfreeman unfreeness unfreezable unfreeze unfreezing unfreighted unfrenchified unfrenzied unfrequency unfrequent unfrequented unfrequentedness unfrequently unfrequentness unfret unfretful unfretting unfriable unfriarlike unfricative unfrictioned unfried unfriend unfriended unfriendedness unfriending unfriendlike unfriendlily unfriendliness unfriendly unfriendship unfrighted unfrightenable unfrightened unfrightenedness unfrightful unfrigid unfrill unfrilled unfringe unfringed unfrisky unfrivolous unfrizz unfrizzled unfrizzy unfrock unfrocked unfroglike unfrolicsome unfronted unfrost unfrosted unfrosty unfrounced unfroward unfrowardly unfrowning unfroze unfrozen unfructed unfructified unfructify unfructuous unfructuously unfrugal unfrugally unfrugalness unfruitful unfruitfully unfruitfulness unfruity unfrustrable unfrustrably unfrustratable unfrustrated unfrutuosity unfuddled unfueled unfulfill unfulfillable unfulfilled unfulfilling unfulfillment unfull unfulled unfully unfulminated unfulsome unfumbled unfumbling unfumed unfumigated unfunctional unfundamental unfunded unfunnily unfunniness unfunny unfur unfurbelowed unfurbished unfurcate unfurious unfurl unfurlable unfurnish unfurnished unfurnishedness unfurnitured unfurred unfurrow unfurrowable unfurrowed unfurthersome unfused unfusible unfusibleness unfusibly unfussed unfussing unfussy unfutile unfuturistic ungabled ungag ungaged ungagged ungain ungainable ungained ungainful ungainfully ungainfulness ungaining ungainlike ungainliness ungainly ungainness ungainsaid ungainsayable ungainsayably ungainsaying ungainsome ungainsomely ungaite ungallant ungallantly ungallantness ungalling ungalvanized ungamboling ungamelike unganged ungangrened ungarbed ungarbled ungardened ungargled ungarland ungarlanded ungarment ungarmented ungarnered ungarnish ungarnished ungaro ungarrisoned ungarter ungartered ungashed ungassed ungastric ungathered ungaudy ungauged ungauntlet ungauntleted ungazetted ungazing ungear ungeared ungelatinizable ungelatinized ungelded ungelt ungeminated ungenerable ungeneral ungeneraled ungeneralized ungenerate ungenerated ungenerative ungeneric ungenerical ungenerosity ungenerous ungenerously ungenerousness ungenial ungeniality ungenially ungenialness ungenitured ungenius ungenteel ungenteelly ungenteelness ungentile ungentility ungentilize ungentle ungentled ungentleman ungentlemanize ungentlemanlike ungentlemanlikeness ungentlemanliness ungentlemanly ungentleness ungentlewomanlike ungently ungenuine ungenuinely ungenuineness ungeodetical ungeographic ungeographical ungeographically ungeological ungeometric ungeometrical ungeometrically ungeometricalness ungerminated ungerminating ungermlike ungerontic ungesting ungesturing unget ungettable unghostlike unghostly ungiant ungibbet ungiddy ungifted ungiftedness ungild ungilded ungill ungilt ungingled unginned ungird ungirded ungirdle ungirdled ungirlish ungirt ungirth ungirthed ungive ungiveable ungiven ungiving ungka unglaciated unglad ungladden ungladdened ungladly ungladness ungladsome unglamorous unglandular unglassed unglaze unglazed ungleaned unglee ungleeful unglimpsed unglistening unglittering ungloating unglobe unglobular ungloom ungloomed ungloomy unglorified unglorify unglorifying unglorious ungloriously ungloriousness unglory unglosed ungloss unglossaried unglossed unglossily unglossiness unglossy unglove ungloved unglowing unglozed unglue unglued unglutinate unglutted ungluttonous ungnarred ungnaw ungnawn ungnostic ungoaded ungoatlike ungod ungoddess ungodlike ungodlily ungodliness ungodly ungodmothered ungold ungolden ungone ungood ungoodliness ungoodly ungored ungorge ungorged ungorgeous ungospel ungospelized ungospelled ungospellike ungossiping ungot ungothic ungotten ungouged ungouty ungovernable ungovernableness ungovernably ungoverned ungovernedness ungoverning ungown ungowned ungrace ungraced ungraceful ungracefully ungracefulness ungracious ungraciously ungraciousness ungradated ungraded ungradual ungradually ungraduated ungraduating ungraft ungrafted ungrain ungrainable ungrained ungrammar ungrammared ungrammatic ungrammatical ungrammatically ungrammaticalness ungrammaticism ungrand ungrantable ungranted ungranulated ungraphic ungraphitized ungrapple ungrappled ungrappler ungrasp ungraspable ungrasped ungrasping ungrassed ungrassy ungrated ungrateful ungratefully ungratefulness ungratifiable ungratified ungratifying ungrating ungrave ungraved ungraveled ungravelly ungravely ungraven ungrayed ungrazed ungreased ungreat ungreatly ungreatness ungreeable ungreedy ungreen ungreenable ungreened ungreeted ungregarious ungrieve ungrieved ungrieving ungrilled ungrimed ungrindable ungrip ungripe ungrizzled ungroaning ungroined ungroomed ungrooved ungropeable ungross ungrotesque unground ungroundable ungroundably ungrounded ungroundedly ungroundedness ungroupable ungrouped ungrow ungrowing ungrown ungrubbed ungrudged ungrudging ungrudgingly ungrudgingness ungruesome ungruff ungrumbling ungual unguaranteed unguard unguardable unguarded unguardedly unguardedness ungueal unguent unguentaria unguentarium unguentary unguentiferous unguentous unguentum unguerdoned ungues unguessable unguessableness unguessed unguical unguicorn unguicular Unguiculata unguiculate unguiculated unguidable unguidableness unguidably unguided unguidedly unguiferous unguiform unguiled unguileful unguilefully unguilefulness unguillotined unguiltily unguiltiness unguilty unguinal unguinous unguirostral unguis ungula ungulae ungular Ungulata ungulate ungulated unguled unguligrade ungull ungulous ungulp ungum ungummed ungushing ungutted unguttural unguyed unguzzled ungymnastic ungypsylike ungyve ungyved unhabit unhabitable unhabitableness unhabited unhabitual unhabitually unhabituate unhabituated unhacked unhackled unhackneyed unhackneyedness unhad unhaft unhafted unhaggled unhaggling unhailable unhailed unhair unhaired unhairer unhairily unhairiness unhairing unhairy unhallooed unhallow unhallowed unhallowedness unhaloed unhalsed unhalted unhalter unhaltered unhalting unhalved unhammered unhamper unhampered unhand unhandcuff unhandcuffed unhandicapped unhandily unhandiness unhandled unhandseled unhandsome unhandsomely unhandsomeness unhandy unhang unhanged unhap unhappen unhappily unhappiness unhappy unharangued unharassed unharbor unharbored unhard unharden unhardenable unhardened unhardihood unhardily unhardiness unhardness unhardy unharked unharmable unharmed unharmful unharmfully unharming unharmonic unharmonical unharmonious unharmoniously unharmoniousness unharmonize unharmonized unharmony unharness unharnessed unharped unharried unharrowed unharsh unharvested unhashed unhasp unhasped unhaste unhasted unhastened unhastily unhastiness unhasting unhasty unhat unhatchability unhatchable unhatched unhatcheled unhate unhated unhateful unhating unhatingly unhatted unhauled unhaunt unhaunted unhave unhawked unhayed unhazarded unhazarding unhazardous unhazardousness unhazed unhead unheaded unheader unheady unheal unhealable unhealableness unhealably unhealed unhealing unhealth unhealthful unhealthfully unhealthfulness unhealthily unhealthiness unhealthsome unhealthsomeness unhealthy unheaped unhearable unheard unhearing unhearsed unheart unhearten unheartsome unhearty unheatable unheated unheathen unheaved unheaven unheavenly unheavily unheaviness unheavy unhectored unhedge unhedged unheed unheeded unheededly unheedful unheedfully unheedfulness unheeding unheedingly unheedy unheeled unheelpieced unhefted unheightened unheired unheld unhele unheler unhelm unhelmed unhelmet unhelmeted unhelpable unhelpableness unhelped unhelpful unhelpfully unhelpfulness unhelping unhelved unhemmed unheppen unheralded unheraldic unherd unherded unhereditary unheretical unheritable unhermetic unhero unheroic unheroical unheroically unheroism unheroize unherolike unhesitant unhesitating unhesitatingly unhesitatingness unheuristic unhewable unhewed unhewn unhex unhid unhidable unhidableness unhidably unhidated unhidden unhide unhidebound unhideous unhieratic unhigh unhilarious unhinderable unhinderably unhindered unhindering unhinge unhingement unhinted unhipped unhired unhissed unhistoric unhistorical unhistorically unhistory unhistrionic unhit unhitch unhitched unhittable unhive unhoard unhoarded unhoarding unhoary unhoaxed unhobble unhocked unhoed unhogged unhoist unhoisted unhold unholiday unholily unholiness unhollow unhollowed unholy unhome unhomelike unhomelikeness unhomeliness unhomely unhomish unhomogeneity unhomogeneous unhomogeneously unhomologous unhoned unhonest unhonestly unhoneyed unhonied unhonorable unhonorably unhonored unhonoured unhood unhooded unhoodwink unhoodwinked unhoofed unhook unhooked unhoop unhooped unhooper unhooted unhoped unhopedly unhopedness unhopeful unhopefully unhopefulness unhoping unhopingly unhopped unhoppled unhorizoned unhorizontal unhorned unhorny unhoroscopic unhorse unhose unhosed unhospitable unhospitableness unhospitably unhostile unhostilely unhostileness unhostility unhot unhoundlike unhouse unhoused unhouseled unhouselike unhousewifely unhuddle unhugged unhull unhulled unhuman unhumanize unhumanized unhumanly unhumanness unhumble unhumbled unhumbledness unhumbleness unhumbly unhumbugged unhumid unhumiliated unhumored unhumorous unhumorously unhumorousness unhumoured unhung unhuntable unhunted unhurdled unhurled unhurried unhurriedly unhurriedness unhurrying unhurryingly unhurt unhurted unhurtful unhurtfully unhurtfulness unhurting unhusbanded unhusbandly unhushable unhushed unhushing unhusk unhusked unhustled unhustling unhutched unhuzzaed unhydraulic unhydrolyzed unhygienic unhygienically unhygrometric unhymeneal unhymned unhyphenated unhyphened unhypnotic unhypnotizable unhypnotize unhypocritical unhypocritically unhypothecated unhypothetical unhysterical uniambic uniambically uniangulate uniarticular uniarticulate Uniat uniat Uniate uniate uniauriculate uniauriculated uniaxal uniaxally uniaxial uniaxially unibasal unibivalent unible unibracteate unibracteolate unibranchiate unicalcarate unicameral unicameralism unicameralist unicamerate unicapsular unicarinate unicarinated unice uniced unicell unicellate unicelled unicellular unicellularity unicentral unichord uniciliate unicism unicist unicity uniclinal unicolor unicolorate unicolored unicolorous uniconstant unicorn unicorneal unicornic unicornlike unicornous unicornuted unicostate unicotyledonous unicum unicursal unicursality unicursally unicuspid unicuspidate unicycle unicyclist unidactyl unidactyle unidactylous unideaed unideal unidealism unidealist unidealistic unidealized unidentate unidentated unidenticulate unidentifiable unidentifiableness unidentifiably unidentified unidentifiedly unidentifying unideographic unidextral unidextrality unidigitate unidimensional unidiomatic unidiomatically unidirect unidirected unidirection unidirectional unidle unidleness unidly unidolatrous unidolized unidyllic unie uniembryonate uniequivalent uniface unifaced unifacial unifactorial unifarious unifiable unific unification unificationist unificator unified unifiedly unifiedness unifier unifilar uniflagellate unifloral uniflorate uniflorous uniflow uniflowered unifocal unifoliar unifoliate unifoliolate Unifolium uniform uniformal uniformalization uniformalize uniformally uniformation uniformed uniformist uniformitarian uniformitarianism uniformity uniformization uniformize uniformless uniformly uniformness unify unigenesis unigenetic unigenist unigenistic unigenital unigeniture unigenous uniglandular uniglobular unignitable unignited unignitible unignominious unignorant unignored unigravida uniguttulate unijugate unijugous unilabiate unilabiated unilamellar unilamellate unilaminar unilaminate unilateral unilateralism unilateralist unilaterality unilateralization unilateralize unilaterally unilinear unilingual unilingualism uniliteral unilludedly unillumed unilluminated unilluminating unillumination unillumined unillusioned unillusory unillustrated unillustrative unillustrious unilobal unilobar unilobate unilobe unilobed unilobular unilocular unilocularity uniloculate unimacular unimaged unimaginable unimaginableness unimaginably unimaginary unimaginative unimaginatively unimaginativeness unimagine unimagined unimanual unimbanked unimbellished unimbezzled unimbibed unimbibing unimbittered unimbodied unimboldened unimbordered unimbosomed unimbowed unimbowered unimbroiled unimbrowned unimbrued unimbued unimedial unimitable unimitableness unimitably unimitated unimitating unimitative unimmaculate unimmanent unimmediate unimmerged unimmergible unimmersed unimmigrating unimmolated unimmortal unimmortalize unimmortalized unimmovable unimmured unimodal unimodality unimodular unimolecular unimolecularity unimpair unimpairable unimpaired unimpartable unimparted unimpartial unimpassionate unimpassioned unimpassionedly unimpassionedness unimpatient unimpawned unimpeachability unimpeachable unimpeachableness unimpeachably unimpeached unimpearled unimped unimpeded unimpededly unimpedible unimpedness unimpelled unimpenetrable unimperative unimperial unimperialistic unimperious unimpertinent unimpinging unimplanted unimplicable unimplicate unimplicated unimplicit unimplicitly unimplied unimplorable unimplored unimpoisoned unimportance unimportant unimportantly unimported unimporting unimportunate unimportunately unimportuned unimposed unimposedly unimposing unimpostrous unimpounded unimpoverished unimpowered unimprecated unimpregnable unimpregnate unimpregnated unimpressed unimpressibility unimpressible unimpressibleness unimpressibly unimpressionability unimpressionable unimpressive unimpressively unimpressiveness unimprinted unimprison unimprisonable unimprisoned unimpropriated unimprovable unimprovableness unimprovably unimproved unimprovedly unimprovedness unimprovement unimproving unimprovised unimpugnable unimpugned unimpulsive unimpurpled unimputable unimputed unimucronate unimultiplex unimuscular uninaugurated unincantoned unincarcerated unincarnate unincarnated unincensed uninchoative unincidental unincised unincisive unincited uninclinable uninclined uninclining uninclosed uninclosedness unincludable unincluded uninclusive uninclusiveness uninconvenienced unincorporate unincorporated unincorporatedly unincorporatedness unincreasable unincreased unincreasing unincubated uninculcated unincumbered unindebted unindebtedly unindebtedness unindemnified unindentable unindented unindentured unindexed unindicable unindicated unindicative unindictable unindicted unindifference unindifferency unindifferent unindifferently unindigent unindignant unindividual unindividualize unindividualized unindividuated unindorsed uninduced uninductive unindulged unindulgent unindulgently unindurated unindustrial unindustrialized unindustrious unindustriously unindwellable uninebriated uninebriating uninervate uninerved uninfallibility uninfallible uninfatuated uninfectable uninfected uninfectious uninfectiousness uninfeft uninferred uninfested uninfiltrated uninfinite uninfiniteness uninfixed uninflamed uninflammability uninflammable uninflated uninflected uninflectedness uninflicted uninfluenceable uninfluenced uninfluencing uninfluencive uninfluential uninfluentiality uninfolded uninformed uninforming uninfracted uninfringeable uninfringed uninfringible uninfuriated uninfused uningenious uningeniously uningeniousness uningenuity uningenuous uningenuously uningenuousness uningested uningrafted uningrained uninhabitability uninhabitable uninhabitableness uninhabitably uninhabited uninhabitedness uninhaled uninheritability uninheritable uninherited uninhibited uninhibitive uninhumed uninimical uniniquitous uninitialed uninitialled uninitiate uninitiated uninitiatedness uninitiation uninjectable uninjected uninjurable uninjured uninjuredness uninjuring uninjurious uninjuriously uninjuriousness uninked uninlaid uninn uninnate uninnocence uninnocent uninnocently uninnocuous uninnovating uninoculable uninoculated uninodal uninominal uninquired uninquiring uninquisitive uninquisitively uninquisitiveness uninquisitorial uninsane uninsatiable uninscribed uninserted uninshrined uninsinuated uninsistent uninsolvent uninspected uninspirable uninspired uninspiring uninspiringly uninspirited uninspissated uninstalled uninstanced uninstated uninstigated uninstilled uninstituted uninstructed uninstructedly uninstructedness uninstructible uninstructing uninstructive uninstructively uninstructiveness uninstrumental uninsular uninsulate uninsulated uninsultable uninsulted uninsulting uninsurability uninsurable uninsured unintegrated unintellective unintellectual unintellectualism unintellectuality unintellectually unintelligence unintelligent unintelligently unintelligentsia unintelligibility unintelligible unintelligibleness unintelligibly unintended unintendedly unintensive unintent unintentional unintentionality unintentionally unintentionalness unintently unintentness unintercalated unintercepted uninterchangeable uninterdicted uninterested uninterestedly uninterestedness uninteresting uninterestingly uninterestingness uninterferedwith uninterjected uninterlaced uninterlarded uninterleave uninterleaved uninterlined uninterlinked uninterlocked unintermarrying unintermediate unintermingled unintermission unintermissive unintermitted unintermittedly unintermittedness unintermittent unintermitting unintermittingly unintermittingness unintermixed uninternational uninterpleaded uninterpolated uninterposed uninterposing uninterpretable uninterpreted uninterred uninterrogable uninterrogated uninterrupted uninterruptedly uninterruptedness uninterruptible uninterruptibleness uninterrupting uninterruption unintersected uninterspersed unintervening uninterviewed unintervolved uninterwoven uninthroned unintimate unintimated unintimidated unintitled unintombed unintoned unintoxicated unintoxicatedness unintoxicating unintrenchable unintrenched unintricate unintrigued unintriguing unintroduced unintroducible unintroitive unintromitted unintrospective unintruded unintruding unintrusive unintrusively unintrusted unintuitive unintwined uninuclear uninucleate uninucleated uninundated uninured uninurned uninvadable uninvaded uninvaginated uninvalidated uninveighing uninveigled uninvented uninventful uninventibleness uninventive uninventively uninventiveness uninverted uninvested uninvestigable uninvestigated uninvestigating uninvestigative uninvidious uninvidiously uninvigorated uninvincible uninvite uninvited uninvitedly uninviting uninvoiced uninvoked uninvolved uninweaved uninwoven uninwrapped uninwreathed Unio unio uniocular unioid Uniola union unioned unionic unionid Unionidae unioniform unionism unionist unionistic unionization unionize unionoid unioval uniovular uniovulate unipara uniparental uniparient uniparous unipartite uniped unipeltate uniperiodic unipersonal unipersonalist unipersonality unipetalous uniphase uniphaser uniphonous uniplanar uniplicate unipod unipolar unipolarity uniporous unipotence unipotent unipotential unipulse uniquantic unique uniquely uniqueness uniquity uniradial uniradiate uniradiated uniradical uniramose uniramous unirascible unireme unirenic unirhyme uniridescent unironed unironical unirradiated unirrigated unirritable unirritant unirritated unirritatedly unirritating unisepalous uniseptate uniserial uniserially uniseriate uniseriately uniserrate uniserrulate unisexed unisexual unisexuality unisexually unisilicate unisoil unisolable unisolate unisolated unisomeric unisometrical unisomorphic unison unisonal unisonally unisonance unisonant unisonous unisotropic unisparker unispiculate unispinose unispiral unissuable unissued unistylist unisulcate unit unitage unital unitalicized Unitarian unitarian Unitarianism Unitarianize unitarily unitariness unitarism unitarist unitary unite uniteability uniteable uniteably united unitedly unitedness unitemized unitentacular uniter uniting unitingly unition unitism unitistic unitive unitively unitiveness unitize unitooth unitrivalent unitrope unituberculate unitude unity uniunguiculate uniungulate univalence univalency univalent univalvate univalve univalvular univariant univerbal universal universalia Universalian Universalism universalism Universalist universalist Universalistic universalistic universality universalization universalize universalizer universally universalness universanimous universe universeful universitarian universitarianism universitary universitize university universityless universitylike universityship universological universologist universology univied univocability univocacy univocal univocalized univocally univocity univoltine univorous unjacketed unjaded unjagged unjailed unjam unjapanned unjarred unjarring unjaundiced unjaunty unjealous unjealoused unjellied unjesting unjesuited unjesuitical unjesuitically unjewel unjeweled unjewelled Unjewish unjilted unjocose unjocund unjogged unjogging unjoin unjoinable unjoint unjointed unjointedness unjointured unjoking unjokingly unjolly unjolted unjostled unjournalized unjovial unjovially unjoyed unjoyful unjoyfully unjoyfulness unjoyous unjoyously unjoyousness unjudgable unjudge unjudged unjudgelike unjudging unjudicable unjudicial unjudicially unjudicious unjudiciously unjudiciousness unjuggled unjuiced unjuicy unjumbled unjumpable unjust unjustice unjusticiable unjustifiable unjustifiableness unjustifiably unjustified unjustifiedly unjustifiedness unjustify unjustled unjustly unjustness unjuvenile unkaiserlike unkamed unked unkeeled unkembed unkempt unkemptly unkemptness unken unkenned unkennedness unkennel unkenneled unkenning unkensome unkept unkerchiefed unket unkey unkeyed unkicked unkid unkill unkillability unkillable unkilled unkilling unkilned unkin unkind unkindhearted unkindled unkindledness unkindlily unkindliness unkindling unkindly unkindness unkindred unkindredly unking unkingdom unkinged unkinger unkinglike unkingly unkink unkinlike unkirk unkiss unkissed unkist unknave unkneaded unkneeling unknelled unknew unknight unknighted unknightlike unknit unknittable unknitted unknitting unknocked unknocking unknot unknotted unknotty unknow unknowability unknowable unknowableness unknowably unknowing unknowingly unknowingness unknowledgeable unknown unknownly unknownness unknownst unkodaked unkoshered unlabeled unlabialize unlabiate unlaborable unlabored unlaboring unlaborious unlaboriously unlaboriousness unlace unlaced unlacerated unlackeyed unlacquered unlade unladen unladled unladyfied unladylike unlagging unlaid unlame unlamed unlamented unlampooned unlanced unland unlanded unlandmarked unlanguaged unlanguid unlanguishing unlanterned unlap unlapped unlapsed unlapsing unlarded unlarge unlash unlashed unlasher unlassoed unlasting unlatch unlath unlathed unlathered unlatinized unlatticed unlaudable unlaudableness unlaudably unlauded unlaugh unlaughing unlaunched unlaundered unlaureled unlaved unlaving unlavish unlavished unlaw unlawed unlawful unlawfully unlawfulness unlawlearned unlawlike unlawly unlawyered unlawyerlike unlay unlayable unleached unlead unleaded unleaderly unleaf unleafed unleagued unleaguer unleakable unleaky unleal unlean unleared unlearn unlearnability unlearnable unlearnableness unlearned unlearnedly unlearnedness unlearning unlearnt unleasable unleased unleash unleashed unleathered unleave unleaved unleavenable unleavened unlectured unled unleft unlegacied unlegal unlegalized unlegally unlegalness unlegate unlegislative unleisured unleisuredness unleisurely unlenient unlensed unlent unless unlessened unlessoned unlet unlettable unletted unlettered unletteredly unletteredness unlettering unletterlike unlevel unleveled unlevelly unlevelness unlevied unlevigated unlexicographical unliability unliable unlibeled unliberal unliberalized unliberated unlibidinous unlicensed unlicentiated unlicentious unlichened unlickable unlicked unlid unlidded unlie unlifelike unliftable unlifted unlifting unligable unligatured unlight unlighted unlightedly unlightedness unlightened unlignified unlikable unlikableness unlikably unlike unlikeable unlikeableness unlikeably unliked unlikelihood unlikeliness unlikely unliken unlikeness unliking unlimb unlimber unlime unlimed unlimitable unlimitableness unlimitably unlimited unlimitedly unlimitedness unlimitless unlimned unlimp unline unlineal unlined unlingering unlink unlinked unlionlike unliquefiable unliquefied unliquid unliquidatable unliquidated unliquidating unliquidation unliquored unlisping unlist unlisted unlistened unlistening unlisty unlit unliteral unliterally unliteralness unliterary unliterate unlitigated unlitten unlittered unliturgical unliturgize unlivable unlivableness unlivably unlive unliveable unliveableness unliveably unliveliness unlively unliveried unlivery unliving unlizardlike unload unloaded unloaden unloader unloafing unloanably unloaned unloaning unloath unloathed unloathful unloathly unloathsome unlobed unlocal unlocalizable unlocalize unlocalized unlocally unlocated unlock unlockable unlocked unlocker unlocking unlocomotive unlodge unlodged unlofty unlogged unlogic unlogical unlogically unlogicalness unlonely unlook unlooked unloop unlooped unloosable unloosably unloose unloosen unloosening unloosing unlooted unlopped unloquacious unlord unlorded unlordly unlosable unlosableness unlost unlotted unlousy unlovable unlovableness unlovably unlove unloveable unloveableness unloveably unloved unlovelily unloveliness unlovely unloverlike unloverly unloving unlovingly unlovingness unlowered unlowly unloyal unloyally unloyalty unlubricated unlucent unlucid unluck unluckful unluckily unluckiness unlucky unlucrative unludicrous unluffed unlugged unlugubrious unluminous unlumped unlunar unlured unlust unlustily unlustiness unlustrous unlusty unlute unluted unluxated unluxuriant unluxurious unlycanthropize unlying unlyrical unlyrically unmacadamized unmacerated unmachinable unmackly unmad unmadded unmaddened unmade unmagic unmagical unmagisterial unmagistratelike unmagnanimous unmagnetic unmagnetical unmagnetized unmagnified unmagnify unmaid unmaidenlike unmaidenliness unmaidenly unmail unmailable unmailableness unmailed unmaimable unmaimed unmaintainable unmaintained unmajestic unmakable unmake unmaker unmalevolent unmalicious unmalignant unmaligned unmalleability unmalleable unmalleableness unmalled unmaltable unmalted unmammalian unmammonized unman unmanacle unmanacled unmanageable unmanageableness unmanageably unmanaged unmancipated unmandated unmanducated unmaned unmaneged unmanful unmanfully unmangled unmaniable unmaniac unmaniacal unmanicured unmanifest unmanifested unmanipulatable unmanipulated unmanlike unmanlily unmanliness unmanly unmanned unmanner unmannered unmanneredly unmannerliness unmannerly unmannish unmanored unmantle unmantled unmanufacturable unmanufactured unmanumissible unmanumitted unmanurable unmanured unmappable unmapped unmarbled unmarch unmarching unmarginal unmarginated unmarine unmaritime unmarkable unmarked unmarketable unmarketed unmarled unmarred unmarriable unmarriageability unmarriageable unmarried unmarring unmarry unmarrying unmarshaled unmartial unmartyr unmartyred unmarvelous unmasculine unmashed unmask unmasked unmasker unmasking unmasquerade unmassacred unmassed unmast unmaster unmasterable unmastered unmasterful unmasticable unmasticated unmatchable unmatchableness unmatchably unmatched unmatchedness unmate unmated unmaterial unmaterialistic unmateriate unmaternal unmathematical unmathematically unmating unmatriculated unmatrimonial unmatronlike unmatted unmature unmatured unmaturely unmatureness unmaturing unmaturity unmauled unmaze unmeaning unmeaningly unmeaningness unmeant unmeasurable unmeasurableness unmeasurably unmeasured unmeasuredly unmeasuredness unmeated unmechanic unmechanical unmechanically unmechanistic unmechanize unmechanized unmedaled unmedalled unmeddle unmeddled unmeddlesome unmeddling unmeddlingly unmeddlingness unmediaeval unmediated unmediatized unmedicable unmedical unmedicated unmedicative unmedicinable unmedicinal unmeditated unmeditative unmediumistic unmedullated unmeek unmeekly unmeekness unmeet unmeetable unmeetly unmeetness unmelancholy unmeliorated unmellow unmellowed unmelodic unmelodious unmelodiously unmelodiousness unmelodized unmelodramatic unmeltable unmeltableness unmeltably unmelted unmeltedness unmelting unmember unmemoired unmemorable unmemorialized unmemoried unmemorized unmenaced unmenacing unmendable unmendableness unmendably unmendacious unmended unmenial unmenseful unmenstruating unmensurable unmental unmentionability unmentionable unmentionableness unmentionables unmentionably unmentioned unmercantile unmercenariness unmercenary unmercerized unmerchantable unmerchantlike unmerchantly unmerciful unmercifully unmercifulness unmercurial unmeretricious unmerge unmerged unmeridional unmerited unmeritedly unmeritedness unmeriting unmeritorious unmeritoriously unmeritoriousness unmerry unmesh unmesmeric unmesmerize unmesmerized unmet unmetaled unmetalized unmetalled unmetallic unmetallurgical unmetamorphosed unmetaphorical unmetaphysic unmetaphysical unmeted unmeteorological unmetered unmethodical unmethodically unmethodicalness unmethodized unmethodizing unmethylated unmeticulous unmetric unmetrical unmetrically unmetricalness unmetropolitan unmettle unmew unmewed unmicaceous unmicrobic unmicroscopic unmidwifed unmighty unmigrating unmildewed unmilitant unmilitarily unmilitariness unmilitaristic unmilitarized unmilitary unmilked unmilled unmillinered unmilted unmimicked unminable unminced unmincing unmind unminded unmindful unmindfully unmindfulness unminding unmined unmineralized unmingle unmingleable unmingled unmingling unminimized unminished unminister unministered unministerial unministerially unminted unminuted unmiracled unmiraculous unmiraculously unmired unmirrored unmirthful unmirthfully unmirthfulness unmiry unmisanthropic unmiscarrying unmischievous unmiscible unmisconceivable unmiserly unmisgiving unmisgivingly unmisguided unmisinterpretable unmisled unmissable unmissed unmissionary unmissionized unmist unmistakable unmistakableness unmistakably unmistakedly unmistaken unmistakingly unmistressed unmistrusted unmistrustful unmistrusting unmisunderstandable unmisunderstanding unmisunderstood unmiter unmitigable unmitigated unmitigatedly unmitigatedness unmitigative unmittened unmix unmixable unmixableness unmixed unmixedly unmixedness unmoaned unmoated unmobbed unmobilized unmocked unmocking unmockingly unmodel unmodeled unmodelled unmoderate unmoderately unmoderateness unmoderating unmodern unmodernity unmodernize unmodernized unmodest unmodifiable unmodifiableness unmodifiably unmodified unmodifiedness unmodish unmodulated unmoiled unmoist unmoisten unmold unmoldable unmolded unmoldered unmoldering unmoldy unmolested unmolestedly unmolesting unmollifiable unmollifiably unmollified unmollifying unmolten unmomentary unmomentous unmomentously unmonarch unmonarchical unmonastic unmonetary unmoneyed unmonistic unmonitored unmonkish unmonkly unmonopolize unmonopolized unmonopolizing unmonotonous unmonumented unmoor unmoored unmooted unmopped unmoral unmoralist unmorality unmoralize unmoralized unmoralizing unmorally unmoralness unmorbid unmordanted unmoribund unmorose unmorphological unmortal unmortared unmortgage unmortgageable unmortgaged unmortified unmortifiedly unmortifiedness unmortise unmortised unmossed unmothered unmotherly unmotionable unmotivated unmotivatedly unmotivatedness unmotived unmotorized unmottled unmounded unmount unmountable unmountainous unmounted unmounting unmourned unmournful unmourning unmouthable unmouthed unmouthpieced unmovability unmovable unmovableness unmovably unmoved unmovedly unmoving unmovingly unmovingness unmowed unmown unmucilaged unmudded unmuddied unmuddle unmuddled unmuddy unmuffle unmuffled unmulcted unmulish unmulled unmullioned unmultipliable unmultiplied unmultipliedly unmultiply unmummied unmummify unmunched unmundane unmundified unmunicipalized unmunificent unmunitioned unmurmured unmurmuring unmurmuringly unmurmurous unmuscled unmuscular unmusical unmusicality unmusically unmusicalness unmusicianly unmusked unmussed unmusted unmusterable unmustered unmutated unmutation unmuted unmutilated unmutinous unmuttered unmutual unmutualized unmuzzle unmuzzled unmuzzling unmyelinated unmysterious unmysteriously unmystery unmystical unmysticize unmystified unmythical unnabbed unnagged unnagging unnail unnailed unnaked unnamability unnamable unnamableness unnamably unname unnameability unnameable unnameableness unnameably unnamed unnapkined unnapped unnarcotic unnarrated unnarrow unnation unnational unnationalized unnative unnatural unnaturalism unnaturalist unnaturalistic unnaturality unnaturalizable unnaturalize unnaturalized unnaturally unnaturalness unnature unnautical unnavigability unnavigable unnavigableness unnavigably unnavigated unneaped unnearable unneared unnearly unnearness unneat unneatly unneatness unnebulous unnecessarily unnecessariness unnecessary unnecessitated unnecessitating unnecessity unneeded unneedful unneedfully unneedfulness unneedy unnefarious unnegated unneglected unnegligent unnegotiable unnegotiableness unnegotiably unnegotiated unnegro unneighbored unneighborlike unneighborliness unneighborly unnephritic unnerve unnerved unnervous unnest unnestle unnestled unneth unnethe unnethes unnethis unnetted unnettled unneurotic unneutral unneutralized unneutrally unnew unnewly unnewness unnibbed unnibbied unnice unnicely unniceness unniched unnicked unnickeled unnickelled unnicknamed unniggard unniggardly unnigh unnimbed unnimble unnimbleness unnimbly unnipped unnitrogenized unnobilitated unnobility unnoble unnobleness unnobly unnoised unnomadic unnominated unnonsensical unnoosed unnormal unnorthern unnose unnosed unnotable unnotched unnoted unnoteworthy unnoticeable unnoticeableness unnoticeably unnoticed unnoticing unnotified unnotify unnoting unnourishable unnourished unnourishing unnovel unnovercal unnucleated unnullified unnumberable unnumberableness unnumberably unnumbered unnumberedness unnumerical unnumerous unnurtured unnutritious unnutritive unnuzzled unnymphlike unoared unobdurate unobedience unobedient unobediently unobese unobeyed unobeying unobjected unobjectionable unobjectionableness unobjectionably unobjectional unobjective unobligated unobligatory unobliged unobliging unobligingly unobligingness unobliterable unobliterated unoblivious unobnoxious unobscene unobscure unobscured unobsequious unobsequiously unobsequiousness unobservable unobservance unobservant unobservantly unobservantness unobserved unobservedly unobserving unobservingly unobsessed unobsolete unobstinate unobstruct unobstructed unobstructedly unobstructedness unobstructive unobstruent unobtainable unobtainableness unobtainably unobtained unobtruded unobtruding unobtrusive unobtrusively unobtrusiveness unobtunded unobumbrated unobverted unobviated unobvious unoccasional unoccasioned unoccidental unoccluded unoccupancy unoccupation unoccupied unoccupiedly unoccupiedness unoccurring unoceanic unocular unode unodious unodoriferous unoecumenic unoecumenical unoffendable unoffended unoffendedly unoffender unoffending unoffendingly unoffensive unoffensively unoffensiveness unoffered unofficed unofficered unofficerlike unofficial unofficialdom unofficially unofficialness unofficiating unofficinal unofficious unofficiously unofficiousness unoffset unoften unogled unoil unoiled unoiling unoily unold unomened unominous unomitted unomnipotent unomniscient Unona unonerous unontological unopaque unoped unopen unopenable unopened unopening unopenly unopenness unoperably unoperated unoperatic unoperating unoperative unoperculate unoperculated unopined unopinionated unoppignorated unopportune unopportunely unopportuneness unopposable unopposed unopposedly unopposedness unopposite unoppressed unoppressive unoppressively unoppressiveness unopprobrious unoppugned unopulence unopulent unoratorial unoratorical unorbed unorbital unorchestrated unordain unordainable unordained unorder unorderable unordered unorderly unordinarily unordinariness unordinary unordinate unordinately unordinateness unordnanced unorganic unorganical unorganically unorganicalness unorganizable unorganized unorganizedly unorganizedness unoriental unorientalness unoriented unoriginal unoriginality unoriginally unoriginalness unoriginate unoriginated unoriginatedness unoriginately unoriginateness unorigination unoriginative unoriginatively unoriginativeness unorn unornamental unornamentally unornamentalness unornamented unornate unornithological unornly unorphaned unorthodox unorthodoxically unorthodoxly unorthodoxness unorthodoxy unorthographical unorthographically unoscillating unosculated unossified unostensible unostentation unostentatious unostentatiously unostentatiousness unoutgrown unoutlawed unoutraged unoutspeakable unoutspoken unoutworn unoverclouded unovercome unoverdone unoverdrawn unoverflowing unoverhauled unoverleaped unoverlooked unoverpaid unoverpowered unoverruled unovert unovertaken unoverthrown unovervalued unoverwhelmed unowed unowing unown unowned unoxidable unoxidated unoxidizable unoxidized unoxygenated unoxygenized unpacable unpaced unpacifiable unpacific unpacified unpacifiedly unpacifiedness unpacifist unpack unpacked unpacker unpadded unpadlocked unpagan unpaganize unpaged unpaginal unpaid unpained unpainful unpaining unpainstaking unpaint unpaintability unpaintable unpaintableness unpaintably unpainted unpaintedly unpaintedness unpaired unpalatability unpalatable unpalatableness unpalatably unpalatal unpalatial unpale unpaled unpalisaded unpalisadoed unpalled unpalliable unpalliated unpalpable unpalped unpalpitating unpalsied unpampered unpanegyrized unpanel unpaneled unpanelled unpanged unpanniered unpanoplied unpantheistic unpanting unpapal unpapaverous unpaper unpapered unparaded unparadise unparadox unparagoned unparagonized unparagraphed unparallel unparallelable unparalleled unparalleledly unparalleledness unparallelness unparalyzed unparaphrased unparasitical unparcel unparceled unparceling unparcelled unparcelling unparch unparched unparching unpardon unpardonable unpardonableness unpardonably unpardoned unpardonedness unpardoning unpared unparented unparfit unpargeted unpark unparked unparking unparliamentary unparliamented unparodied unparrel unparriable unparried unparroted unparrying unparsed unparsimonious unparsonic unparsonical unpartable unpartableness unpartably unpartaken unpartaking unparted unpartial unpartiality unpartially unpartialness unparticipant unparticipated unparticipating unparticipative unparticular unparticularized unparticularizing unpartisan unpartitioned unpartizan unpartnered unpartook unparty unpass unpassable unpassableness unpassably unpassed unpassing unpassionate unpassionately unpassionateness unpassioned unpassive unpaste unpasted unpasteurized unpasting unpastor unpastoral unpastured unpatched unpatent unpatentable unpatented unpaternal unpathed unpathetic unpathwayed unpatient unpatiently unpatientness unpatriarchal unpatrician unpatriotic unpatriotically unpatriotism unpatristic unpatrolled unpatronizable unpatronized unpatronizing unpatted unpatterned unpaunch unpaunched unpauperized unpausing unpausingly unpave unpaved unpavilioned unpaving unpawed unpawn unpawned unpayable unpayableness unpayably unpaying unpayment unpeace unpeaceable unpeaceableness unpeaceably unpeaceful unpeacefully unpeacefulness unpealed unpearled unpebbled unpeccable unpecked unpecuniarily unpedagogical unpedantic unpeddled unpedestal unpedigreed unpeel unpeelable unpeelableness unpeeled unpeerable unpeered unpeg unpejorative unpelagic unpelted unpen unpenal unpenalized unpenanced unpenciled unpencilled unpenetrable unpenetrated unpenetrating unpenitent unpenitently unpenitentness unpenned unpennied unpennoned unpensionable unpensionableness unpensioned unpensioning unpent unpenurious unpeople unpeopled unpeopling unperceived unperceivedly unperceptible unperceptibly unperceptive unperch unperched unpercipient unpercolated unpercussed unperfect unperfected unperfectedly unperfectedness unperfectly unperfectness unperfidious unperflated unperforate unperforated unperformable unperformance unperformed unperforming unperfumed unperilous unperiodic unperiodical unperiphrased unperishable unperishableness unperishably unperished unperishing unperjured unpermanency unpermanent unpermanently unpermeable unpermeated unpermissible unpermissive unpermitted unpermitting unpermixed unpernicious unperpendicular unperpetrated unperpetuated unperplex unperplexed unperplexing unpersecuted unpersecutive unperseverance unpersevering unperseveringly unperseveringness unpersonable unpersonableness unpersonal unpersonality unpersonified unpersonify unperspicuous unperspirable unperspiring unpersuadable unpersuadableness unpersuadably unpersuaded unpersuadedness unpersuasibleness unpersuasion unpersuasive unpersuasively unpersuasiveness unpertaining unpertinent unpertinently unperturbed unperturbedly unperturbedness unperuked unperused unpervaded unperverse unpervert unperverted unpervious unpessimistic unpestered unpestilential unpetal unpetitioned unpetrified unpetrify unpetticoated unpetulant unpharasaic unpharasaical unphased unphenomenal unphilanthropic unphilanthropically unphilological unphilosophic unphilosophically unphilosophicalness unphilosophize unphilosophized unphilosophy unphlegmatic unphonetic unphoneticness unphonographed unphosphatized unphotographed unphrasable unphrasableness unphrased unphrenological unphysical unphysically unphysicianlike unphysicked unphysiological unpicaresque unpick unpickable unpicked unpicketed unpickled unpictorial unpictorially unpicturability unpicturable unpictured unpicturesque unpicturesquely unpicturesqueness unpiece unpieced unpierceable unpierced unpiercing unpiety unpigmented unpile unpiled unpilfered unpilgrimlike unpillaged unpillared unpilled unpilloried unpillowed unpiloted unpimpled unpin unpinched unpining unpinion unpinioned unpinked unpinned unpious unpiped unpiqued unpirated unpitched unpiteous unpiteously unpiteousness unpitiable unpitiably unpitied unpitiedly unpitiedness unpitiful unpitifully unpitifulness unpitted unpitying unpityingly unpityingness unplacable unplacably unplacated unplace unplaced unplacid unplagiarized unplagued unplaid unplain unplained unplainly unplainness unplait unplaited unplan unplaned unplanished unplank unplanked unplanned unplannedly unplannedness unplant unplantable unplanted unplantlike unplashed unplaster unplastered unplastic unplat unplated unplatted unplausible unplausibleness unplausibly unplayable unplayed unplayful unplaying unpleached unpleadable unpleaded unpleading unpleasable unpleasant unpleasantish unpleasantly unpleasantness unpleasantry unpleased unpleasing unpleasingly unpleasingness unpleasurable unpleasurably unpleasure unpleat unpleated unplebeian unpledged unplenished unplenteous unplentiful unplentifulness unpliable unpliableness unpliably unpliancy unpliant unpliantly unplied unplighted unplodding unplotted unplotting unplough unploughed unplow unplowed unplucked unplug unplugged unplugging unplumb unplumbed unplume unplumed unplummeted unplump unplundered unplunge unplunged unplutocratic unplutocratically unpoached unpocket unpocketed unpodded unpoetic unpoetically unpoeticalness unpoeticized unpoetize unpoetized unpoignard unpointed unpointing unpoise unpoised unpoison unpoisonable unpoisoned unpoisonous unpolarizable unpolarized unpoled unpolemical unpolemically unpoliced unpolicied unpolish unpolishable unpolished unpolishedness unpolite unpolitely unpoliteness unpolitic unpolitical unpolitically unpoliticly unpollarded unpolled unpollutable unpolluted unpollutedly unpolluting unpolymerized unpompous unpondered unpontifical unpooled unpope unpopular unpopularity unpopularize unpopularly unpopularness unpopulate unpopulated unpopulous unpopulousness unporous unportable unportended unportentous unportioned unportly unportmanteaued unportraited unportrayable unportrayed unportuous unposed unposing unpositive unpossessable unpossessed unpossessedness unpossessing unpossibility unpossible unpossibleness unpossibly unposted unpostered unposthumous unpostmarked unpostponable unpostponed unpostulated unpot unpotted unpouched unpoulticed unpounced unpounded unpoured unpowdered unpower unpowerful unpowerfulness unpracticability unpracticable unpracticableness unpracticably unpractical unpracticality unpractically unpracticalness unpractice unpracticed unpragmatical unpraisable unpraise unpraised unpraiseful unpraiseworthy unpranked unpray unprayable unprayed unprayerful unpraying unpreach unpreached unpreaching unprecarious unprecautioned unpreceded unprecedented unprecedentedly unprecedentedness unprecedential unprecedently unprecious unprecipitate unprecipitated unprecise unprecisely unpreciseness unprecluded unprecludible unprecocious unpredacious unpredestinated unpredestined unpredicable unpredicated unpredict unpredictable unpredictableness unpredictably unpredicted unpredictedness unpredicting unpredisposed unpredisposing unpreened unprefaced unpreferable unpreferred unprefigured unprefined unprefixed unpregnant unprejudged unprejudicated unprejudice unprejudiced unprejudicedly unprejudicedness unprejudiciable unprejudicial unprejudicially unprejudicialness unprelatic unprelatical unpreluded unpremature unpremeditate unpremeditated unpremeditatedly unpremeditatedness unpremeditately unpremeditation unpremonished unpremonstrated unprenominated unprenticed unpreoccupied unpreordained unpreparation unprepare unprepared unpreparedly unpreparedness unpreparing unpreponderated unpreponderating unprepossessedly unprepossessing unprepossessingly unprepossessingness unpreposterous unpresaged unpresageful unpresaging unpresbyterated unprescient unprescinded unprescribed unpresentability unpresentable unpresentableness unpresentably unpresented unpreservable unpreserved unpresidential unpresiding unpressed unpresumable unpresumed unpresuming unpresumingness unpresumptuous unpresumptuously unpresupposed unpretended unpretending unpretendingly unpretendingness unpretentious unpretentiously unpretentiousness unpretermitted unpreternatural unprettiness unpretty unprevailing unprevalent unprevaricating unpreventable unpreventableness unpreventably unprevented unpreventible unpreventive unpriceably unpriced unpricked unprickled unprickly unpriest unpriestlike unpriestly unpriggish unprim unprime unprimed unprimitive unprimmed unprince unprincelike unprinceliness unprincely unprincess unprincipal unprinciple unprincipled unprincipledly unprincipledness unprint unprintable unprintableness unprintably unprinted unpriority unprismatic unprison unprisonable unprisoned unprivate unprivileged unprizable unprized unprobated unprobationary unprobed unprobity unproblematic unproblematical unprocessed unproclaimed unprocrastinated unprocreant unprocreated unproctored unprocurable unprocurableness unprocure unprocured unproded unproduceable unproduceableness unproduceably unproduced unproducedness unproducible unproducibleness unproducibly unproductive unproductively unproductiveness unproductivity unprofanable unprofane unprofaned unprofessed unprofessing unprofessional unprofessionalism unprofessionally unprofessorial unproffered unproficiency unproficient unproficiently unprofit unprofitable unprofitableness unprofitably unprofited unprofiteering unprofiting unprofound unprofuse unprofusely unprofuseness unprognosticated unprogressed unprogressive unprogressively unprogressiveness unprohibited unprohibitedness unprohibitive unprojected unprojecting unproliferous unprolific unprolix unprologued unprolonged unpromiscuous unpromise unpromised unpromising unpromisingly unpromisingness unpromotable unpromoted unprompted unpromptly unpromulgated unpronounce unpronounceable unpronounced unpronouncing unproofread unprop unpropagated unpropelled unpropense unproper unproperly unproperness unpropertied unprophesiable unprophesied unprophetic unprophetical unprophetically unprophetlike unpropitiable unpropitiated unpropitiatedness unpropitiatory unpropitious unpropitiously unpropitiousness unproportion unproportionable unproportionableness unproportionably unproportional unproportionality unproportionally unproportionate unproportionately unproportionateness unproportioned unproportionedly unproportionedness unproposed unproposing unpropounded unpropped unpropriety unprorogued unprosaic unproscribable unproscribed unprosecutable unprosecuted unprosecuting unproselyte unproselyted unprosodic unprospected unprospective unprosperably unprospered unprosperity unprosperous unprosperously unprosperousness unprostitute unprostituted unprostrated unprotectable unprotected unprotectedly unprotectedness unprotective unprotestant unprotestantize unprotested unprotesting unprotruded unprotruding unprotrusive unproud unprovability unprovable unprovableness unprovably unproved unprovedness unproven unproverbial unprovidable unprovide unprovided unprovidedly unprovidedness unprovidenced unprovident unprovidential unprovidently unprovincial unproving unprovision unprovisioned unprovocative unprovokable unprovoke unprovoked unprovokedly unprovokedness unprovoking unproximity unprudence unprudent unprudently unpruned unprying unpsychic unpsychological unpublic unpublicity unpublishable unpublishableness unpublishably unpublished unpucker unpuckered unpuddled unpuffed unpuffing unpugilistic unpugnacious unpulled unpulleyed unpulped unpulverable unpulverize unpulverized unpulvinate unpulvinated unpumicated unpummeled unpummelled unpumpable unpumped unpunched unpunctated unpunctilious unpunctual unpunctuality unpunctually unpunctuated unpunctuating unpunishable unpunishably unpunished unpunishedly unpunishedness unpunishing unpunishingly unpurchasable unpurchased unpure unpurely unpureness unpurgeable unpurged unpurifiable unpurified unpurifying unpuritan unpurled unpurloined unpurpled unpurported unpurposed unpurposelike unpurposely unpurposing unpurse unpursed unpursuable unpursued unpursuing unpurveyed unpushed unput unputrefiable unputrefied unputrid unputtied unpuzzle unquadded unquaffed unquailed unquailing unquailingly unquakerlike unquakerly unquaking unqualifiable unqualification unqualified unqualifiedly unqualifiedness unqualify unqualifying unqualifyingly unqualitied unquality unquantified unquantitative unquarantined unquarreled unquarreling unquarrelled unquarrelling unquarrelsome unquarried unquartered unquashed unquayed unqueen unqueened unqueening unqueenlike unqueenly unquellable unquelled unquenchable unquenchableness unquenchably unquenched unqueried unquested unquestionability unquestionable unquestionableness unquestionably unquestionate unquestioned unquestionedly unquestionedness unquestioning unquestioningly unquestioningness unquibbled unquibbling unquick unquickened unquickly unquicksilvered unquiescence unquiescent unquiescently unquiet unquietable unquieted unquieting unquietly unquietness unquietude unquilleted unquilted unquit unquittable unquitted unquivered unquivering unquizzable unquizzed unquotable unquote unquoted unrabbeted unrabbinical unraced unrack unracked unracking unradiated unradical unradicalize unraffled unraftered unraided unrailed unrailroaded unrailwayed unrainy unraised unrake unraked unraking unrallied unram unrambling unramified unrammed unramped unranched unrancid unrancored unrandom unrank unranked unransacked unransomable unransomed unrapacious unraped unraptured unrare unrarefied unrash unrasped unratable unrated unratified unrational unrattled unravaged unravel unravelable unraveled unraveler unraveling unravellable unravelled unraveller unravelling unravelment unraving unravished unravishing unray unrayed unrazed unrazored unreachable unreachably unreached unreactive unread unreadability unreadable unreadableness unreadably unreadily unreadiness unready unreal unrealism unrealist unrealistic unreality unrealizable unrealize unrealized unrealizing unreally unrealmed unrealness unreaped unreared unreason unreasonability unreasonable unreasonableness unreasonably unreasoned unreasoning unreasoningly unreassuring unreassuringly unreave unreaving unrebated unrebel unrebellious unrebuffable unrebuffably unrebuilt unrebukable unrebukably unrebuked unrebuttable unrebuttableness unrebutted unrecallable unrecallably unrecalled unrecalling unrecantable unrecanted unrecaptured unreceding unreceipted unreceivable unreceived unreceiving unrecent unreceptant unreceptive unreceptivity unreciprocal unreciprocated unrecited unrecked unrecking unreckingness unreckon unreckonable unreckoned unreclaimable unreclaimably unreclaimed unreclaimedness unreclaiming unreclined unreclining unrecognition unrecognizable unrecognizableness unrecognizably unrecognized unrecognizing unrecognizingly unrecoined unrecollected unrecommendable unrecompensable unrecompensed unreconcilable unreconcilableness unreconcilably unreconciled unrecondite unreconnoitered unreconsidered unreconstructed unrecordable unrecorded unrecordedness unrecording unrecountable unrecounted unrecoverable unrecoverableness unrecoverably unrecovered unrecreant unrecreated unrecreating unrecriminative unrecruitable unrecruited unrectangular unrectifiable unrectifiably unrectified unrecumbent unrecuperated unrecurrent unrecurring unrecusant unred unredacted unredeemable unredeemableness unredeemably unredeemed unredeemedly unredeemedness unredeeming unredressable unredressed unreduceable unreduced unreducible unreducibleness unreducibly unreduct unreefed unreel unreelable unreeled unreeling unreeve unreeving unreferenced unreferred unrefilled unrefine unrefined unrefinedly unrefinedness unrefinement unrefining unrefitted unreflected unreflecting unreflectingly unreflectingness unreflective unreflectively unreformable unreformed unreformedness unreforming unrefracted unrefracting unrefrainable unrefrained unrefraining unrefreshed unrefreshful unrefreshing unrefreshingly unrefrigerated unrefulgent unrefunded unrefunding unrefusable unrefusably unrefused unrefusing unrefusingly unrefutable unrefuted unrefuting unregainable unregained unregal unregaled unregality unregally unregard unregardable unregardant unregarded unregardedly unregardful unregeneracy unregenerate unregenerately unregenerateness unregenerating unregeneration unregimented unregistered unregressive unregretful unregretfully unregretfulness unregrettable unregretted unregretting unregular unregulated unregulative unregurgitated unrehabilitated unrehearsable unrehearsed unrehearsing unreigning unreimbodied unrein unreined unreinstated unreiterable unreiterated unrejectable unrejoiced unrejoicing unrejuvenated unrelapsing unrelated unrelatedness unrelating unrelational unrelative unrelatively unrelaxable unrelaxed unrelaxing unrelaxingly unreleasable unreleased unreleasing unrelegated unrelentance unrelented unrelenting unrelentingly unrelentingness unrelentor unrelevant unreliability unreliable unreliableness unreliably unreliance unrelievable unrelievableness unrelieved unrelievedly unreligion unreligioned unreligious unreligiously unreligiousness unrelinquishable unrelinquishably unrelinquished unrelinquishing unrelishable unrelished unrelishing unreluctant unreluctantly unremaining unremanded unremarkable unremarked unremarried unremediable unremedied unremember unrememberable unremembered unremembering unremembrance unreminded unremissible unremittable unremitted unremittedly unremittent unremittently unremitting unremittingly unremittingness unremonstrant unremonstrated unremonstrating unremorseful unremorsefully unremote unremotely unremounted unremovable unremovableness unremovably unremoved unremunerated unremunerating unremunerative unremuneratively unremunerativeness unrenderable unrendered unrenewable unrenewed unrenounceable unrenounced unrenouncing unrenovated unrenowned unrenownedly unrenownedness unrent unrentable unrented unreorganized unrepaid unrepair unrepairable unrepaired unrepartable unreparted unrepealability unrepealable unrepealableness unrepealably unrepealed unrepeatable unrepeated unrepellable unrepelled unrepellent unrepent unrepentable unrepentance unrepentant unrepentantly unrepentantness unrepented unrepenting unrepentingly unrepentingness unrepetitive unrepined unrepining unrepiningly unrepiqued unreplaceable unreplaced unreplenished unrepleviable unreplevined unrepliable unrepliably unreplied unreplying unreportable unreported unreportedly unreportedness unrepose unreposed unreposeful unreposefulness unreposing unrepossessed unreprehended unrepresentable unrepresentation unrepresentative unrepresented unrepresentedness unrepressed unrepressible unreprievable unreprievably unreprieved unreprimanded unreprinted unreproachable unreproachableness unreproachably unreproached unreproachful unreproachfully unreproaching unreproachingly unreprobated unreproducible unreprovable unreprovableness unreprovably unreproved unreprovedly unreprovedness unreproving unrepublican unrepudiable unrepudiated unrepugnant unrepulsable unrepulsed unrepulsing unrepulsive unreputable unreputed unrequalified unrequested unrequickened unrequired unrequisite unrequitable unrequital unrequited unrequitedly unrequitedness unrequitement unrequiter unrequiting unrescinded unrescued unresemblant unresembling unresented unresentful unresenting unreserve unreserved unreservedly unreservedness unresifted unresigned unresistable unresistably unresistance unresistant unresistantly unresisted unresistedly unresistedness unresistible unresistibleness unresistibly unresisting unresistingly unresistingness unresolute unresolvable unresolve unresolved unresolvedly unresolvedness unresolving unresonant unresounded unresounding unresourceful unresourcefulness unrespect unrespectability unrespectable unrespected unrespectful unrespectfully unrespectfulness unrespective unrespectively unrespectiveness unrespirable unrespired unrespited unresplendent unresponding unresponsible unresponsibleness unresponsive unresponsively unresponsiveness unrest unrestable unrested unrestful unrestfully unrestfulness unresting unrestingly unrestingness unrestorable unrestored unrestrainable unrestrainably unrestrained unrestrainedly unrestrainedness unrestraint unrestrictable unrestricted unrestrictedly unrestrictedness unrestrictive unresty unresultive unresumed unresumptive unretainable unretained unretaliated unretaliating unretardable unretarded unretentive unreticent unretinued unretired unretiring unretorted unretouched unretractable unretracted unretreating unretrenchable unretrenched unretrievable unretrieved unretrievingly unretted unreturnable unreturnably unreturned unreturning unreturningly unrevealable unrevealed unrevealedness unrevealing unrevealingly unrevelationize unrevenged unrevengeful unrevengefulness unrevenging unrevengingly unrevenue unrevenued unreverberated unrevered unreverence unreverenced unreverend unreverendly unreverent unreverential unreverently unreverentness unreversable unreversed unreversible unreverted unrevertible unreverting unrevested unrevetted unreviewable unreviewed unreviled unrevised unrevivable unrevived unrevocable unrevocableness unrevocably unrevoked unrevolted unrevolting unrevolutionary unrevolutionized unrevolved unrevolving unrewardable unrewarded unrewardedly unrewarding unreworded unrhetorical unrhetorically unrhetoricalness unrhyme unrhymed unrhythmic unrhythmical unrhythmically unribbed unribboned unrich unriched unricht unricked unrid unridable unridableness unridably unridden unriddle unriddleable unriddled unriddler unriddling unride unridely unridered unridged unridiculed unridiculous unrife unriffled unrifled unrifted unrig unrigged unrigging unright unrightable unrighted unrighteous unrighteously unrighteousness unrightful unrightfully unrightfulness unrightly unrightwise unrigid unrigorous unrimpled unrind unring unringable unringed unringing unrinsed unrioted unrioting unriotous unrip unripe unriped unripely unripened unripeness unripening unrippable unripped unripping unrippled unrippling unripplingly unrisen unrising unriskable unrisked unrisky unritual unritualistic unrivalable unrivaled unrivaledly unrivaledness unrived unriven unrivet unriveted unriveting unroaded unroadworthy unroaming unroast unroasted unrobbed unrobe unrobed unrobust unrocked unrococo unrodded unroiled unroll unrollable unrolled unroller unrolling unrollment unromantic unromantical unromantically unromanticalness unromanticized unroof unroofed unroofing unroomy unroost unroosted unroosting unroot unrooted unrooting unrope unroped unrosed unrosined unrostrated unrotated unrotating unroted unrotted unrotten unrotund unrouged unrough unroughened unround unrounded unrounding unrousable unroused unroutable unrouted unrove unroved unroving unrow unrowed unroweled unroyal unroyalist unroyalized unroyally unroyalness Unrra unrubbed unrubbish unrubified unrubrical unrubricated unruddered unruddled unrueful unruffable unruffed unruffle unruffled unruffling unrugged unruinable unruinated unruined unrulable unrulableness unrule unruled unruledly unruledness unruleful unrulily unruliness unruly unruminated unruminating unruminatingly unrummaged unrumored unrumple unrumpled unrun unrung unruptured unrural unrushed Unrussian unrust unrusted unrustic unrusticated unrustling unruth unsabbatical unsabered unsabled unsabred unsaccharic unsacerdotal unsacerdotally unsack unsacked unsacramental unsacramentally unsacramentarian unsacred unsacredly unsacrificeable unsacrificeably unsacrificed unsacrificial unsacrificing unsacrilegious unsad unsadden unsaddened unsaddle unsaddled unsaddling unsafe unsafeguarded unsafely unsafeness unsafety unsagacious unsage unsagging unsaid unsailable unsailed unsailorlike unsaint unsainted unsaintlike unsaintly unsalability unsalable unsalableness unsalably unsalaried unsalesmanlike unsaline unsalivated unsallying unsalmonlike unsalt unsaltable unsaltatory unsalted unsalubrious unsalutary unsaluted unsaluting unsalvability unsalvable unsalvableness unsalvaged unsalved unsampled unsanctification unsanctified unsanctifiedly unsanctifiedness unsanctify unsanctifying unsanctimonious unsanctimoniously unsanctimoniousness unsanction unsanctionable unsanctioned unsanctioning unsanctitude unsanctity unsanctuaried unsandaled unsanded unsane unsanguinary unsanguine unsanguinely unsanguineness unsanguineous unsanguineously unsanitariness unsanitary unsanitated unsanitation unsanity unsaponifiable unsaponified unsapped unsappy unsarcastic unsardonic unsartorial unsash unsashed unsatable unsatanic unsated unsatedly unsatedness unsatiability unsatiable unsatiableness unsatiably unsatiate unsatiated unsatiating unsatin unsatire unsatirical unsatirically unsatirize unsatirized unsatisfaction unsatisfactorily unsatisfactoriness unsatisfactory unsatisfiable unsatisfiableness unsatisfiably unsatisfied unsatisfiedly unsatisfiedness unsatisfying unsatisfyingly unsatisfyingness unsaturable unsaturated unsaturatedly unsaturatedness unsaturation unsatyrlike unsauced unsaurian unsavable unsaveable unsaved unsaving unsavored unsavoredly unsavoredness unsavorily unsavoriness unsavory unsawed unsawn unsay unsayability unsayable unscabbard unscabbarded unscabbed unscaffolded unscalable unscalableness unscalably unscale unscaled unscaledness unscalloped unscaly unscamped unscandalize unscandalized unscandalous unscannable unscanned unscanted unscanty unscarb unscarce unscared unscarfed unscarified unscarred unscathed unscathedly unscathedness unscattered unscavengered unscenic unscent unscented unscepter unsceptered unsceptical unsceptre unsceptred unscheduled unschematic unschematized unscholar unscholarlike unscholarly unscholastic unschool unschooled unschooledly unschooledness unscienced unscientific unscientifical unscientifically unscintillating unscioned unscissored unscoffed unscoffing unscolded unsconced unscooped unscorched unscored unscorified unscoring unscorned unscornful unscornfully unscornfulness unscotch unscotched unscottify unscoured unscourged unscowling unscramble unscrambling unscraped unscratchable unscratched unscratching unscratchingly unscrawled unscreen unscreenable unscreenably unscreened unscrew unscrewable unscrewed unscrewing unscribal unscribbled unscribed unscrimped unscriptural unscripturally unscripturalness unscrubbed unscrupled unscrupulosity unscrupulous unscrupulously unscrupulousness unscrutable unscrutinized unscrutinizing unscrutinizingly unsculptural unsculptured unscummed unscutcheoned unseafaring unseal unsealable unsealed unsealer unsealing unseam unseamanlike unseamanship unseamed unseaming unsearchable unsearchableness unsearchably unsearched unsearcherlike unsearching unseared unseason unseasonable unseasonableness unseasonably unseasoned unseat unseated unseaworthiness unseaworthy unseceding unsecluded unseclusive unseconded unsecrecy unsecret unsecretarylike unsecreted unsecreting unsecretly unsecretness unsectarian unsectarianism unsectarianize unsectional unsecular unsecularize unsecularized unsecure unsecured unsecuredly unsecuredness unsecurely unsecureness unsecurity unsedate unsedentary unseditious unseduce unseduced unseducible unseductive unsedulous unsee unseeable unseeded unseeing unseeingly unseeking unseeming unseemingly unseemlily unseemliness unseemly unseen unseethed unsegmented unsegregable unsegregated unsegregatedness unseignorial unseismic unseizable unseized unseldom unselect unselected unselecting unselective unself unselfish unselfishly unselfishness unselflike unselfness unselling unsenatorial unsenescent unsensational unsense unsensed unsensibility unsensible unsensibleness unsensibly unsensitive unsensitize unsensitized unsensory unsensual unsensualize unsensualized unsensually unsensuous unsensuousness unsent unsentenced unsententious unsentient unsentimental unsentimentalist unsentimentality unsentimentalize unsentimentally unsentineled unsentinelled unseparable unseparableness unseparably unseparate unseparated unseptate unseptated unsepulcher unsepulchered unsepulchral unsepulchre unsepulchred unsepultured unsequenced unsequential unsequestered unseraphical unserenaded unserene unserflike unserious unseriousness unserrated unserried unservable unserved unserviceability unserviceable unserviceableness unserviceably unservicelike unservile unsesquipedalian unset unsetting unsettle unsettleable unsettled unsettledness unsettlement unsettling unseverable unseverableness unsevere unsevered unseveredly unseveredness unsew unsewed unsewered unsewing unsewn unsex unsexed unsexing unsexlike unsexual unshackle unshackled unshackling unshade unshaded unshadow unshadowable unshadowed unshady unshafted unshakable unshakably unshakeable unshakeably unshaken unshakenly unshakenness unshaking unshakingness unshaled unshamable unshamableness unshamably unshameable unshameableness unshameably unshamed unshamefaced unshamefacedness unshameful unshamefully unshamefulness unshammed unshanked unshapable unshape unshapeable unshaped unshapedness unshapeliness unshapely unshapen unshapenly unshapenness unsharable unshared unsharedness unsharing unsharp unsharped unsharpen unsharpened unsharpening unsharping unshattered unshavable unshaveable unshaved unshavedly unshavedness unshaven unshavenly unshavenness unshawl unsheaf unsheared unsheathe unsheathed unsheathing unshed unsheet unsheeted unsheeting unshell unshelled unshelling unshelterable unsheltered unsheltering unshelve unshepherded unshepherding unsheriff unshewed unshieldable unshielded unshielding unshiftable unshifted unshiftiness unshifting unshifty unshimmering unshingled unshining unship unshiplike unshipment unshipped unshipping unshipshape unshipwrecked unshirking unshirted unshivered unshivering unshockable unshocked unshod unshodden unshoe unshoed unshoeing unshop unshore unshored unshorn unshort unshortened unshot unshotted unshoulder unshouted unshouting unshoved unshoveled unshowable unshowed unshowmanlike unshown unshowy unshredded unshrew unshrewd unshrewish unshrill unshrine unshrined unshrinement unshrink unshrinkability unshrinkable unshrinking unshrinkingly unshrived unshriveled unshrivelled unshriven unshroud unshrouded unshrubbed unshrugging unshrunk unshrunken unshuddering unshuffle unshuffled unshunnable unshunned unshunted unshut unshutter unshuttered unshy unshyly unshyness unsibilant unsiccated unsick unsickened unsicker unsickerly unsickerness unsickled unsickly unsided unsiding unsiege unsifted unsighing unsight unsightable unsighted unsighting unsightliness unsightly unsigmatic unsignable unsignaled unsignalized unsignalled unsignatured unsigned unsigneted unsignificancy unsignificant unsignificantly unsignificative unsignified unsignifying unsilenceable unsilenceably unsilenced unsilent unsilentious unsilently unsilicified unsilly unsilvered unsimilar unsimilarity unsimilarly unsimple unsimplicity unsimplified unsimplify unsimulated unsimultaneous unsin unsincere unsincerely unsincereness unsincerity unsinew unsinewed unsinewing unsinewy unsinful unsinfully unsinfulness unsing unsingability unsingable unsingableness unsinged unsingle unsingled unsingleness unsingular unsinister unsinkability unsinkable unsinking unsinnable unsinning unsinningness unsiphon unsipped unsister unsistered unsisterliness unsisterly unsizable unsizableness unsizeable unsizeableness unsized unskaithd unskeptical unsketchable unsketched unskewed unskewered unskilful unskilfully unskilled unskilledly unskilledness unskillful unskillfully unskillfulness unskimmed unskin unskinned unskirted unslack unslacked unslackened unslackening unslacking unslagged unslain unslakable unslakeable unslaked unslammed unslandered unslanderous unslapped unslashed unslate unslated unslating unslaughtered unslave unslayable unsleaved unsleek unsleepably unsleeping unsleepingly unsleepy unsleeve unsleeved unslender unslept unsliced unsliding unslighted unsling unslip unslipped unslippery unslipping unslit unslockened unsloped unslopped unslot unslothful unslothfully unslothfulness unslotted unsloughed unsloughing unslow unsluggish unsluice unsluiced unslumbering unslumberous unslumbrous unslung unslurred unsly unsmacked unsmart unsmartly unsmartness unsmeared unsmelled unsmelling unsmelted unsmiled unsmiling unsmilingly unsmilingness unsmirched unsmirking unsmitten unsmokable unsmokeable unsmoked unsmokified unsmoking unsmoky unsmooth unsmoothed unsmoothly unsmoothness unsmote unsmotherable unsmothered unsmudged unsmuggled unsmutched unsmutted unsmutty unsnaffled unsnagged unsnaggled unsnaky unsnap unsnapped unsnare unsnared unsnarl unsnatch unsnatched unsneck unsneering unsnib unsnipped unsnobbish unsnoring unsnouted unsnow unsnubbable unsnubbed unsnuffed unsoaked unsoaped unsoarable unsober unsoberly unsoberness unsobriety unsociability unsociable unsociableness unsociably unsocial unsocialism unsocialistic unsociality unsocializable unsocialized unsocially unsocialness unsociological unsocket unsodden unsoft unsoftened unsoftening unsoggy unsoil unsoiled unsoiledness unsolaced unsolacing unsolar unsold unsolder unsoldered unsoldering unsoldier unsoldiered unsoldierlike unsoldierly unsole unsoled unsolemn unsolemness unsolemnize unsolemnized unsolemnly unsolicitated unsolicited unsolicitedly unsolicitous unsolicitously unsolicitousness unsolid unsolidarity unsolidifiable unsolidified unsolidity unsolidly unsolidness unsolitary unsolubility unsoluble unsolvable unsolvableness unsolvably unsolved unsomatic unsomber unsombre unsome unson unsonable unsonant unsonlike unsonneted unsonorous unsonsy unsoothable unsoothed unsoothfast unsoothing unsooty unsophistical unsophistically unsophisticate unsophisticated unsophisticatedly unsophisticatedness unsophistication unsophomoric unsordid unsore unsorrowed unsorrowing unsorry unsort unsortable unsorted unsorting unsotted unsought unsoul unsoulful unsoulfully unsoulish unsound unsoundable unsoundableness unsounded unsounding unsoundly unsoundness unsour unsoured unsoused unsovereign unsowed unsown unspaced unspacious unspaded unspan unspangled unspanked unspanned unspar unsparable unspared unsparing unsparingly unsparingness unsparkling unsparred unsparse unspatial unspatiality unspattered unspawned unspayed unspeak unspeakability unspeakable unspeakableness unspeakably unspeaking unspeared unspecialized unspecializing unspecific unspecified unspecifiedly unspecious unspecked unspeckled unspectacled unspectacular unspectacularly unspecterlike unspectrelike unspeculating unspeculative unspeculatively unsped unspeed unspeedy unspeered unspell unspellable unspelled unspelt unspendable unspending unspent unspewed unsphere unsphered unsphering unspiable unspiced unspicy unspied unspike unspillable unspin unspinsterlike unspinsterlikeness unspiral unspired unspirit unspirited unspiritedly unspiriting unspiritual unspirituality unspiritualize unspiritualized unspiritually unspiritualness unspissated unspit unspited unspiteful unspitted unsplashed unsplattered unsplayed unspleened unspleenish unspleenishly unsplendid unspliced unsplinted unsplintered unsplit unspoil unspoilable unspoilableness unspoilably unspoiled unspoken unspokenly unsponged unspongy unsponsored unspontaneous unspontaneously unspookish unsported unsportful unsporting unsportive unsportsmanlike unsportsmanly unspot unspotlighted unspottable unspotted unspottedly unspottedness unspoused unspouselike unspouted unsprained unsprayed unspread unsprightliness unsprightly unspring unspringing unspringlike unsprinkled unsprinklered unsprouted unsproutful unsprouting unspruced unsprung unspun unspurned unspurred unspying unsquandered unsquarable unsquare unsquared unsquashed unsqueamish unsqueezable unsqueezed unsquelched unsquinting unsquire unsquired unsquirelike unsquirted unstabbed unstability unstable unstabled unstableness unstablished unstably unstack unstacked unstacker unstaffed unstaged unstaggered unstaggering unstagnating unstagy unstaid unstaidly unstaidness unstain unstainable unstainableness unstained unstainedly unstainedness unstaled unstalked unstalled unstammering unstamped unstampeded unstanch unstanchable unstandard unstandardized unstanzaic unstar unstarch unstarched unstarlike unstarred unstarted unstarting unstartled unstarved unstatable unstate unstateable unstated unstately unstatesmanlike unstatic unstating unstation unstationary unstationed unstatistic unstatistical unstatued unstatuesque unstatutable unstatutably unstaunch unstaunchable unstaunched unstavable unstaveable unstaved unstayable unstayed unstayedness unstaying unsteadfast unsteadfastly unsteadfastness unsteadied unsteadily unsteadiness unsteady unsteadying unstealthy unsteamed unsteaming unsteck unstecked unsteel unsteeled unsteep unsteeped unsteepled unsteered unstemmable unstemmed unstentorian unstep unstercorated unstereotyped unsterile unsterilized unstern unstethoscoped unstewardlike unstewed unstick unsticking unstickingness unsticky unstiffen unstiffened unstifled unstigmatized unstill unstilled unstillness unstilted unstimulated unstimulating unsting unstinged unstinging unstinted unstintedly unstinting unstintingly unstippled unstipulated unstirrable unstirred unstirring unstitch unstitched unstitching unstock unstocked unstocking unstockinged unstoic unstoical unstoically unstoicize unstoked unstoken unstolen unstonable unstone unstoned unstoniness unstony unstooping unstop unstoppable unstopped unstopper unstoppered unstopple unstore unstored unstoried unstormed unstormy unstout unstoved unstow unstowed unstraddled unstrafed unstraight unstraightened unstraightforward unstraightness unstrain unstrained unstraitened unstrand unstranded unstrange unstrangered unstrangled unstrangulable unstrap unstrapped unstrategic unstrategically unstratified unstraying unstreaked unstrength unstrengthen unstrengthened unstrenuous unstressed unstressedly unstressedness unstretch unstretched unstrewed unstrewn unstriated unstricken unstrictured unstridulous unstrike unstriking unstring unstringed unstringing unstrip unstriped unstripped unstriving unstroked unstrong unstructural unstruggling unstrung unstubbed unstubborn unstuccoed unstuck unstudded unstudied unstudious unstuff unstuffed unstuffing unstultified unstumbling unstung unstunned unstunted unstupefied unstupid unstuttered unstuttering unsty unstyled unstylish unstylishly unstylishness unsubdivided unsubduable unsubduableness unsubduably unsubducted unsubdued unsubduedly unsubduedness unsubject unsubjectable unsubjected unsubjectedness unsubjection unsubjective unsubjectlike unsubjugate unsubjugated unsublimable unsublimated unsublimed unsubmerged unsubmergible unsubmerging unsubmission unsubmissive unsubmissively unsubmissiveness unsubmitted unsubmitting unsubordinate unsubordinated unsuborned unsubpoenaed unsubscribed unsubscribing unsubservient unsubsided unsubsidiary unsubsiding unsubsidized unsubstanced unsubstantial unsubstantiality unsubstantialize unsubstantially unsubstantialness unsubstantiate unsubstantiated unsubstantiation unsubstituted unsubtle unsubtleness unsubtlety unsubtly unsubtracted unsubventioned unsubventionized unsubversive unsubvertable unsubverted unsubvertive unsucceedable unsucceeded unsucceeding unsuccess unsuccessful unsuccessfully unsuccessfulness unsuccessive unsuccessively unsuccessiveness unsuccinct unsuccorable unsuccored unsucculent unsuccumbing unsucked unsuckled unsued unsufferable unsufferableness unsufferably unsuffered unsuffering unsufficed unsufficience unsufficiency unsufficient unsufficiently unsufficing unsufficingness unsufflated unsuffocate unsuffocated unsuffocative unsuffused unsugared unsugary unsuggested unsuggestedness unsuggestive unsuggestiveness unsuit unsuitability unsuitable unsuitableness unsuitably unsuited unsuiting unsulky unsullen unsulliable unsullied unsulliedly unsulliedness unsulphonated unsulphureous unsulphurized unsultry unsummable unsummarized unsummed unsummered unsummerlike unsummerly unsummonable unsummoned unsumptuary unsumptuous unsun unsunburned unsundered unsung unsunk unsunken unsunned unsunny unsuperable unsuperannuated unsupercilious unsuperficial unsuperfluous unsuperior unsuperlative unsupernatural unsupernaturalize unsupernaturalized unsuperscribed unsuperseded unsuperstitious unsupervised unsupervisedly unsupped unsupplantable unsupplanted unsupple unsuppled unsupplemented unsuppliable unsupplicated unsupplied unsupportable unsupportableness unsupportably unsupported unsupportedly unsupportedness unsupporting unsupposable unsupposed unsuppressed unsuppressible unsuppressibly unsuppurated unsuppurative unsupreme unsurcharge unsurcharged unsure unsurfaced unsurfeited unsurfeiting unsurgical unsurging unsurmised unsurmising unsurmountable unsurmountableness unsurmountably unsurmounted unsurnamed unsurpassable unsurpassableness unsurpassably unsurpassed unsurplice unsurpliced unsurprised unsurprising unsurrendered unsurrendering unsurrounded unsurveyable unsurveyed unsurvived unsurviving unsusceptibility unsusceptible unsusceptibleness unsusceptibly unsusceptive unsuspectable unsuspectably unsuspected unsuspectedly unsuspectedness unsuspectful unsuspectfulness unsuspectible unsuspecting unsuspectingly unsuspectingness unsuspective unsuspended unsuspicion unsuspicious unsuspiciously unsuspiciousness unsustainable unsustained unsustaining unsutured unswabbed unswaddle unswaddled unswaddling unswallowable unswallowed unswanlike unswapped unswarming unswathable unswathe unswathed unswathing unswayable unswayed unswayedness unswaying unswear unswearing unsweat unsweated unsweating unsweepable unsweet unsweeten unsweetened unsweetenedness unsweetly unsweetness unswell unswelled unswelling unsweltered unswept unswervable unswerved unswerving unswervingly unswilled unswing unswingled unswitched unswivel unswollen unswooning unsworn unswung unsyllabic unsyllabled unsyllogistical unsymbolic unsymbolical unsymbolically unsymbolicalness unsymbolized unsymmetrical unsymmetrically unsymmetricalness unsymmetrized unsymmetry unsympathetic unsympathetically unsympathizability unsympathizable unsympathized unsympathizing unsympathizingly unsympathy unsymphonious unsymptomatic unsynchronized unsynchronous unsyncopated unsyndicated unsynonymous unsyntactical unsynthetic unsyringed unsystematic unsystematical unsystematically unsystematized unsystematizedly unsystematizing unsystemizable untabernacled untabled untabulated untack untacked untacking untackle untackled untactful untactfully untactfulness untagged untailed untailorlike untailorly untaint untaintable untainted untaintedly untaintedness untainting untakable untakableness untakeable untakeableness untaken untaking untalented untalkative untalked untalking untall untallied untallowed untamable untamableness untame untamed untamedly untamedness untamely untameness untampered untangential untangibility untangible untangibleness untangibly untangle untangled untangling untanned untantalized untantalizing untap untaped untapered untapering untapestried untappable untapped untar untarnishable untarnished untarred untarried untarrying untartarized untasked untasseled untastable untaste untasteable untasted untasteful untastefully untastefulness untasting untasty untattered untattooed untaught untaughtness untaunted untaut untautological untawdry untawed untax untaxable untaxed untaxing unteach unteachable unteachableness unteachably unteacherlike unteaching unteam unteamed unteaming untearable unteased unteasled untechnical untechnicalize untechnically untedded untedious unteem unteeming unteethed untelegraphed untell untellable untellably untelling untemper untemperamental untemperate untemperately untemperateness untempered untempering untempested untempestuous untempled untemporal untemporary untemporizing untemptability untemptable untemptably untempted untemptible untemptibly untempting untemptingly untemptingness untenability untenable untenableness untenably untenacious untenacity untenant untenantable untenantableness untenanted untended untender untendered untenderly untenderness untenible untenibleness untenibly untense untent untentaculate untented untentered untenty unterminable unterminableness unterminably unterminated unterminating unterraced unterrestrial unterrible unterribly unterrifiable unterrific unterrified unterrifying unterrorized untessellated untestable untestamentary untested untestifying untether untethered untethering untewed untextual unthank unthanked unthankful unthankfully unthankfulness unthanking unthatch unthatched unthaw unthawed unthawing untheatric untheatrical untheatrically untheistic unthematic untheological untheologically untheologize untheoretic untheoretical untheorizable untherapeutical unthick unthicken unthickened unthievish unthink unthinkability unthinkable unthinkableness unthinkably unthinker unthinking unthinkingly unthinkingness unthinned unthinning unthirsting unthirsty unthistle untholeable untholeably unthorn unthorny unthorough unthought unthoughted unthoughtedly unthoughtful unthoughtfully unthoughtfulness unthoughtlike unthrall unthralled unthrashed unthread unthreadable unthreaded unthreading unthreatened unthreatening unthreshed unthrid unthridden unthrift unthriftihood unthriftily unthriftiness unthriftlike unthrifty unthrilled unthrilling unthriven unthriving unthrivingly unthrivingness unthrob unthrone unthroned unthronged unthroning unthrottled unthrowable unthrown unthrushlike unthrust unthumbed unthumped unthundered unthwacked unthwarted untiaraed unticketed untickled untidal untidily untidiness untidy untie untied untight untighten untightness until untile untiled untill untillable untilled untilling untilt untilted untilting untimbered untimed untimedness untimeliness untimely untimeous untimeously untimesome untimorous untin untinct untinctured untine untinged untinkered untinned untinseled untinted untippable untipped untippled untipt untirability untirable untire untired untiredly untiring untiringly untissued untithability untithable untithed untitled untittering untitular unto untoadying untoasted untogaed untoggle untoggler untoiled untoileted untoiling untold untolerable untolerableness untolerably untolerated untomb untombed untonality untone untoned untongued untonsured untooled untooth untoothed untoothsome untoothsomeness untop untopographical untopped untopping untormented untorn untorpedoed untorpid untorrid untortuous untorture untortured untossed untotaled untotalled untottering untouch untouchability untouchable untouchableness untouchably untouched untouchedness untouching untough untoured untouristed untoward untowardliness untowardly untowardness untowered untown untownlike untrace untraceable untraceableness untraceably untraced untraceried untracked untractability untractable untractableness untractably untractarian untractible untractibleness untradeable untraded untradesmanlike untrading untraditional untraduced untraffickable untrafficked untragic untragical untrailed untrain untrainable untrained untrainedly untrainedness untraitored untraitorous untrammed untrammeled untrammeledness untramped untrampled untrance untranquil untranquilized untranquillize untranquillized untransacted untranscended untranscendental untranscribable untranscribed untransferable untransferred untransfigured untransfixed untransformable untransformed untransforming untransfused untransfusible untransgressed untransient untransitable untransitive untransitory untranslatability untranslatable untranslatableness untranslatably untranslated untransmigrated untransmissible untransmitted untransmutable untransmuted untransparent untranspassable untranspired untranspiring untransplanted untransportable untransported untransposed untransubstantiated untrappable untrapped untrashed untravelable untraveled untraveling untravellable untravelling untraversable untraversed untravestied untreacherous untread untreadable untreading untreasonable untreasure untreasured untreatable untreatableness untreatably untreated untreed untrekked untrellised untrembling untremblingly untremendous untremulous untrenched untrepanned untrespassed untrespassing untress untressed untriable untribal untributary untriced untrickable untricked untried untrifling untrig untrigonometrical untrill untrim untrimmable untrimmed untrimmedness untrinitarian untripe untrippable untripped untripping untrite untriturated untriumphable untriumphant untriumphed untrochaic untrod untrodden untroddenness untrolled untrophied untropical untrotted untroublable untrouble untroubled untroubledly untroubledness untroublesome untroublesomeness untrounced untrowed untruant untruck untruckled untruckling untrue untrueness untruism untruly untrumped untrumpeted untrumping untrundled untrunked untruss untrussed untrusser untrussing untrust untrustably untrusted untrustful untrustiness untrusting untrustworthily untrustworthiness untrustworthy untrusty untruth untruther untruthful untruthfully untruthfulness untrying untubbed untuck untucked untuckered untucking untufted untugged untumbled untumefied untumid untumultuous untunable untunableness untunably untune untuneable untuneableness untuneably untuned untuneful untunefully untunefulness untuning untunneled untupped unturbaned unturbid unturbulent unturf unturfed unturgid unturn unturnable unturned unturning unturpentined unturreted untusked untutelar untutored untutoredly untutoredness untwilled untwinable untwine untwineable untwined untwining untwinkling untwinned untwirl untwirled untwirling untwist untwisted untwister untwisting untwitched untying untypical untypically untyrannic untyrannical untyrantlike untz unubiquitous unugly unulcerated unultra unumpired ununanimity ununanimous ununanimously ununderstandable ununderstandably ununderstanding ununderstood unundertaken unundulatory Unungun ununifiable ununified ununiform ununiformed ununiformity ununiformly ununiformness ununitable ununitableness ununitably ununited ununiting ununiversity ununiversitylike unupbraiding unupbraidingly unupholstered unupright unuprightly unuprightness unupset unupsettable unurban unurbane unurged unurgent unurging unurn unurned unusable unusableness unusably unuse unused unusedness unuseful unusefully unusefulness unushered unusual unusuality unusually unusualness unusurious unusurped unusurping unutilizable unutterability unutterable unutterableness unutterably unuttered unuxorial unuxorious unvacant unvaccinated unvacillating unvailable unvain unvaleted unvaletudinary unvaliant unvalid unvalidated unvalidating unvalidity unvalidly unvalidness unvalorous unvaluable unvaluableness unvaluably unvalue unvalued unvamped unvanishing unvanquishable unvanquished unvantaged unvaporized unvariable unvariableness unvariably unvariant unvaried unvariedly unvariegated unvarnished unvarnishedly unvarnishedness unvarying unvaryingly unvaryingness unvascular unvassal unvatted unvaulted unvaulting unvaunted unvaunting unvauntingly unveering unveil unveiled unveiledly unveiledness unveiler unveiling unveilment unveined unvelvety unvendable unvendableness unvended unvendible unvendibleness unveneered unvenerable unvenerated unvenereal unvenged unveniable unvenial unvenom unvenomed unvenomous unventable unvented unventilated unventured unventurous unvenued unveracious unveracity unverbalized unverdant unverdured unveridical unverifiable unverifiableness unverifiably unverified unverifiedness unveritable unverity unvermiculated unverminous unvernicular unversatile unversed unversedly unversedness unversified unvertical unvessel unvesseled unvest unvested unvetoed unvexed unviable unvibrated unvibrating unvicar unvicarious unvicariously unvicious unvictimized unvictorious unvictualed unvictualled unviewable unviewed unvigilant unvigorous unvigorously unvilified unvillaged unvindicated unvindictive unvindictively unvindictiveness unvinous unvintaged unviolable unviolated unviolenced unviolent unviolined unvirgin unvirginal unvirginlike unvirile unvirility unvirtue unvirtuous unvirtuously unvirtuousness unvirulent unvisible unvisibleness unvisibly unvision unvisionary unvisioned unvisitable unvisited unvisor unvisored unvisualized unvital unvitalized unvitalness unvitiated unvitiatedly unvitiatedness unvitrescibility unvitrescible unvitrifiable unvitrified unvitriolized unvituperated unvivacious unvivid unvivified unvizard unvizarded unvocal unvocalized unvociferous unvoice unvoiced unvoiceful unvoicing unvoidable unvoided unvolatile unvolatilize unvolatilized unvolcanic unvolitioned unvoluminous unvoluntarily unvoluntariness unvoluntary unvolunteering unvoluptuous unvomited unvoracious unvote unvoted unvoting unvouched unvouchedly unvouchedness unvouchsafed unvowed unvoweled unvoyageable unvoyaging unvulcanized unvulgar unvulgarize unvulgarized unvulgarly unvulnerable unwadable unwadded unwadeable unwaded unwading unwafted unwaged unwagered unwaggable unwaggably unwagged unwailed unwailing unwainscoted unwaited unwaiting unwaked unwakeful unwakefulness unwakened unwakening unwaking unwalkable unwalked unwalking unwall unwalled unwallet unwallowed unwan unwandered unwandering unwaning unwanted unwanton unwarbled unware unwarely unwareness unwarily unwariness unwarlike unwarlikeness unwarm unwarmable unwarmed unwarming unwarn unwarned unwarnedly unwarnedness unwarnished unwarp unwarpable unwarped unwarping unwarrant unwarrantability unwarrantable unwarrantableness unwarrantably unwarranted unwarrantedly unwarrantedness unwary unwashable unwashed unwashedness unwassailing unwastable unwasted unwasteful unwastefully unwasting unwastingly unwatchable unwatched unwatchful unwatchfully unwatchfulness unwatching unwater unwatered unwaterlike unwatermarked unwatery unwattled unwaved unwaverable unwavered unwavering unwaveringly unwaving unwax unwaxed unwayed unwayward unweaken unweakened unweal unwealsomeness unwealthy unweaned unweapon unweaponed unwearable unweariability unweariable unweariableness unweariably unwearied unweariedly unweariedness unwearily unweariness unwearing unwearisome unwearisomeness unweary unwearying unwearyingly unweathered unweatherly unweatherwise unweave unweaving unweb unwebbed unwebbing unwed unwedded unweddedly unweddedness unwedge unwedgeable unwedged unweeded unweel unweelness unweened unweeping unweeting unweetingly unweft unweighable unweighed unweighing unweight unweighted unweighty unwelcome unwelcomed unwelcomely unwelcomeness unweld unweldable unwelded unwell unwellness unwelted unwept unwestern unwesternized unwet unwettable unwetted unwheedled unwheel unwheeled unwhelmed unwhelped unwhetted unwhig unwhiglike unwhimsical unwhining unwhip unwhipped unwhirled unwhisked unwhiskered unwhisperable unwhispered unwhispering unwhistled unwhite unwhited unwhitened unwhitewashed unwholesome unwholesomely unwholesomeness unwidened unwidowed unwield unwieldable unwieldily unwieldiness unwieldly unwieldy unwifed unwifelike unwifely unwig unwigged unwild unwilily unwiliness unwill unwilled unwillful unwillfully unwillfulness unwilling unwillingly unwillingness unwilted unwilting unwily unwincing unwincingly unwind unwindable unwinding unwindingly unwindowed unwindy unwingable unwinged unwinking unwinkingly unwinnable unwinning unwinnowed unwinsome unwinter unwintry unwiped unwire unwired unwisdom unwise unwisely unwiseness unwish unwished unwishful unwishing unwist unwistful unwitch unwitched unwithdrawable unwithdrawing unwithdrawn unwitherable unwithered unwithering unwithheld unwithholden unwithholding unwithstanding unwithstood unwitless unwitnessed unwitted unwittily unwitting unwittingly unwittingness unwitty unwive unwived unwoeful unwoful unwoman unwomanish unwomanize unwomanized unwomanlike unwomanliness unwomanly unwomb unwon unwonder unwonderful unwondering unwonted unwontedly unwontedness unwooded unwooed unwoof unwooly unwordable unwordably unwordily unwordy unwork unworkability unworkable unworkableness unworkably unworked unworkedness unworker unworking unworkmanlike unworkmanly unworld unworldliness unworldly unwormed unwormy unworn unworried unworriedly unworriedness unworshiped unworshipful unworshiping unworshipped unworshipping unworth unworthily unworthiness unworthy unwotting unwound unwoundable unwoundableness unwounded unwoven unwrangling unwrap unwrapped unwrapper unwrapping unwrathful unwrathfully unwreaked unwreathe unwreathed unwreathing unwrecked unwrench unwrenched unwrested unwrestedly unwresting unwrestled unwretched unwriggled unwrinkle unwrinkleable unwrinkled unwrit unwritable unwrite unwriting unwritten unwronged unwrongful unwrought unwrung unyachtsmanlike unyeaned unyearned unyearning unyielded unyielding unyieldingly unyieldingness unyoke unyoked unyoking unyoung unyouthful unyouthfully unze unzealous unzealously unzealousness unzen unzephyrlike unzone unzoned up upaisle upaithric upalley upalong upanishadic upapurana uparch uparching uparise uparm uparna upas upattic upavenue upbank upbar upbay upbear upbearer upbeat upbelch upbelt upbend upbid upbind upblacken upblast upblaze upblow upboil upbolster upbolt upboost upborne upbotch upboulevard upbound upbrace upbraid upbraider upbraiding upbraidingly upbray upbreak upbred upbreed upbreeze upbrighten upbrim upbring upbristle upbroken upbrook upbrought upbrow upbubble upbuild upbuilder upbulging upbuoy upbuoyance upburn upburst upbuy upcall upcanal upcanyon upcarry upcast upcatch upcaught upchamber upchannel upchariot upchimney upchoke upchuck upcity upclimb upclose upcloser upcoast upcock upcoil upcolumn upcome upcoming upconjure upcountry upcourse upcover upcrane upcrawl upcreek upcreep upcrop upcrowd upcry upcurl upcurrent upcurve upcushion upcut updart update updeck updelve updive updo updome updraft updrag updraw updrink updry upeat upend upeygan upfeed upfield upfill upfingered upflame upflare upflash upflee upflicker upfling upfloat upflood upflow upflower upflung upfly upfold upfollow upframe upfurl upgale upgang upgape upgather upgaze upget upgird upgirt upgive upglean upglide upgo upgorge upgrade upgrave upgrow upgrowth upgully upgush uphand uphang upharbor upharrow uphasp upheal upheap uphearted upheaval upheavalist upheave upheaven upheld uphelm uphelya upher uphill uphillward uphoard uphoist uphold upholden upholder upholster upholstered upholsterer upholsteress upholsterous upholstery upholsterydom upholstress uphung uphurl upisland upjerk upjet upkeep upkindle upknell upknit upla upladder uplaid uplake upland uplander uplandish uplane uplay uplead upleap upleg uplick uplift upliftable uplifted upliftedly upliftedness uplifter uplifting upliftingly upliftingness upliftitis upliftment uplight uplimb uplimber upline uplock uplong uplook uplooker uploom uploop uplying upmaking upmast upmix upmost upmount upmountain upmove upness upo upon uppard uppent upper upperch uppercut upperer upperest upperhandism uppermore uppermost uppers uppertendom uppile upping uppish uppishly uppishness uppity upplough upplow uppluck uppoint uppoise uppop uppour uppowoc upprick upprop uppuff uppull uppush upquiver upraisal upraise upraiser upreach uprear uprein uprend uprender uprest uprestore uprid upridge upright uprighteous uprighteously uprighteousness uprighting uprightish uprightly uprightness uprights uprip uprisal uprise uprisement uprisen upriser uprising uprist uprive upriver uproad uproar uproariness uproarious uproariously uproariousness uproom uproot uprootal uprooter uprose uprouse uproute uprun uprush upsaddle upscale upscrew upscuddle upseal upseek upseize upsend upset upsetment upsettable upsettal upsetted upsetter upsetting upsettingly upsey upshaft upshear upsheath upshoot upshore upshot upshoulder upshove upshut upside upsides upsighted upsiloid upsilon upsilonism upsit upsitten upsitting upslant upslip upslope upsmite upsnatch upsoak upsoar upsolve upspeak upspear upspeed upspew upspin upspire upsplash upspout upspread upspring upsprinkle upsprout upspurt upstaff upstage upstair upstairs upstamp upstand upstander upstanding upstare upstart upstartism upstartle upstartness upstate upstater upstaunch upstay upsteal upsteam upstem upstep upstick upstir upstraight upstream upstreamward upstreet upstretch upstrike upstrive upstroke upstruggle upsuck upsun upsup upsurge upsurgence upswallow upswarm upsway upsweep upswell upswing uptable uptake uptaker uptear uptemper uptend upthrow upthrust upthunder uptide uptie uptill uptilt uptorn uptoss uptower uptown uptowner uptrace uptrack uptrail uptrain uptree uptrend uptrill uptrunk uptruss uptube uptuck upturn uptwined uptwist Upupa Upupidae upupoid upvalley upvomit upwaft upwall upward upwardly upwardness upwards upwarp upwax upway upways upwell upwent upwheel upwhelm upwhir upwhirl upwind upwith upwork upwound upwrap upwreathe upwrench upwring upwrought upyard upyoke ur ura urachal urachovesical urachus uracil uraemic uraeus Uragoga Ural ural urali Uralian Uralic uraline uralite uralitic uralitization uralitize uralium uramido uramil uramilic uramino Uran uran uranalysis uranate Urania Uranian uranic Uranicentric uranidine uraniferous uraniid Uraniidae uranin uranine uraninite uranion uraniscochasma uraniscoplasty uraniscoraphy uraniscorrhaphy uranism uranist uranite uranitic uranium uranocircite uranographer uranographic uranographical uranographist uranography uranolatry uranolite uranological uranology uranometria uranometrical uranometry uranophane uranophotography uranoplastic uranoplasty uranoplegia uranorrhaphia uranorrhaphy uranoschisis uranoschism uranoscope uranoscopia uranoscopic Uranoscopidae Uranoscopus uranoscopy uranospathite uranosphaerite uranospinite uranostaphyloplasty uranostaphylorrhaphy uranotantalite uranothallite uranothorite uranotil uranous Uranus uranyl uranylic urao urare urari Urartaean Urartic urase urataemia urate uratemia uratic uratoma uratosis uraturia urazine urazole urbacity urbainite Urban urban urbane urbanely urbaneness urbanism Urbanist urbanist urbanite urbanity urbanization urbanize urbarial urbian urbic Urbicolae urbicolous urbification urbify urbinate urceiform urceolar urceolate urceole urceoli Urceolina urceolus urceus urchin urchiness urchinlike urchinly urd urde urdee Urdu ure urea ureal ureameter ureametry urease urechitin urechitoxin uredema Uredinales uredine Uredineae uredineal uredineous uredinia uredinial Urediniopsis urediniospore urediniosporic uredinium uredinoid uredinologist uredinology uredinous Uredo uredo uredosorus uredospore uredosporic uredosporiferous uredosporous uredostage ureic ureid ureide ureido uremia uremic Urena urent ureometer ureometry ureosecretory uresis uretal ureter ureteral ureteralgia uretercystoscope ureterectasia ureterectasis ureterectomy ureteric ureteritis ureterocele ureterocervical ureterocolostomy ureterocystanastomosis ureterocystoscope ureterocystostomy ureterodialysis ureteroenteric ureteroenterostomy ureterogenital ureterogram ureterograph ureterography ureterointestinal ureterolith ureterolithiasis ureterolithic ureterolithotomy ureterolysis ureteronephrectomy ureterophlegma ureteroplasty ureteroproctostomy ureteropyelitis ureteropyelogram ureteropyelography ureteropyelonephritis ureteropyelostomy ureteropyosis ureteroradiography ureterorectostomy ureterorrhagia ureterorrhaphy ureterosalpingostomy ureterosigmoidostomy ureterostegnosis ureterostenoma ureterostenosis ureterostoma ureterostomy ureterotomy ureterouteral ureterovaginal ureterovesical urethan urethane urethra urethrae urethragraph urethral urethralgia urethrameter urethrascope urethratome urethratresia urethrectomy urethremphraxis urethreurynter urethrism urethritic urethritis urethroblennorrhea urethrobulbar urethrocele urethrocystitis urethrogenital urethrogram urethrograph urethrometer urethropenile urethroperineal urethrophyma urethroplastic urethroplasty urethroprostatic urethrorectal urethrorrhagia urethrorrhaphy urethrorrhea urethrorrhoea urethroscope urethroscopic urethroscopical urethroscopy urethrosexual urethrospasm urethrostaxis urethrostenosis urethrostomy urethrotome urethrotomic urethrotomy urethrovaginal urethrovesical urethylan uretic ureylene urf urfirnis urge urgence urgency urgent urgently urgentness urger Urginea urging urgingly Urgonian urheen Uri Uria Uriah urial Urian uric uricacidemia uricaciduria uricaemia uricaemic uricemia uricemic uricolysis uricolytic uridrosis Uriel urinaemia urinal urinalist urinalysis urinant urinarium urinary urinate urination urinative urinator urine urinemia uriniferous uriniparous urinocryoscopy urinogenital urinogenitary urinogenous urinologist urinology urinomancy urinometer urinometric urinometry urinoscopic urinoscopist urinoscopy urinose urinosexual urinous urinousness urite urlar urled urling urluch urman urn urna urnae urnal urnflower urnful urning urningism urnism urnlike urnmaker Uro uroacidimeter uroazotometer urobenzoic urobilin urobilinemia urobilinogen urobilinogenuria urobilinuria urocanic urocele Urocerata urocerid Uroceridae urochloralic urochord Urochorda urochordal urochordate urochrome urochromogen Urocoptidae Urocoptis urocyanogen Urocyon urocyst urocystic Urocystis urocystitis urodaeum Urodela urodelan urodele urodelous urodialysis urodynia uroedema uroerythrin urofuscohematin urogaster urogastric urogenic urogenital urogenitary urogenous uroglaucin Uroglena urogram urography urogravimeter urohematin urohyal urolagnia uroleucic uroleucinic urolith urolithiasis urolithic urolithology urologic urological urologist urology urolutein urolytic uromancy uromantia uromantist Uromastix uromelanin uromelus uromere uromeric urometer Uromyces Uromycladium uronephrosis uronic uronology uropatagium Uropeltidae urophanic urophanous urophein Urophlyctis urophthisis uroplania uropod uropodal uropodous uropoetic uropoiesis uropoietic uroporphyrin uropsile Uropsilus uroptysis Uropygi uropygial uropygium uropyloric urorosein urorrhagia urorrhea urorubin urosaccharometry urosacral uroschesis uroscopic uroscopist uroscopy urosepsis uroseptic urosis urosomatic urosome urosomite urosomitic urostea urostealith urostegal urostege urostegite urosteon urosternite urosthene urosthenic urostylar urostyle urotoxia urotoxic urotoxicity urotoxin urotoxy uroxanate uroxanic uroxanthin uroxin urradhus urrhodin urrhodinic Urs Ursa ursal ursicidal ursicide Ursid Ursidae ursiform ursigram ursine ursoid ursolic urson ursone ursuk Ursula Ursuline Ursus Urtica urtica Urticaceae urticaceous Urticales urticant urticaria urticarial urticarious Urticastrum urticate urticating urtication urticose urtite Uru urubu urucu urucuri Uruguayan uruisg Urukuena urunday urus urushi urushic urushinic urushiol urushiye urva us usability usable usableness usage usager usance usar usara usaron usation use used usedly usedness usednt usee useful usefullish usefully usefulness usehold useless uselessly uselessness usent user ush ushabti ushabtiu Ushak Usheen usher usherance usherdom usherer usheress usherette Usherian usherian usherism usherless ushership usings Usipetes usitate usitative Uskara Uskok Usnea usnea Usneaceae usneaceous usneoid usnic usninic Uspanteca usque usquebaugh usself ussels usselven ussingite ust Ustarana uster Ustilaginaceae ustilaginaceous Ustilaginales ustilagineous Ustilaginoidea Ustilago ustion ustorious ustulate ustulation Ustulina usual usualism usually usualness usuary usucapient usucapion usucapionary usucapt usucaptable usucaption usucaptor usufruct usufructuary Usun usure usurer usurerlike usuress usurious usuriously usuriousness usurp usurpation usurpative usurpatively usurpatory usurpature usurpedly usurper usurpership usurping usurpingly usurpment usurpor usurpress usury usward uswards ut Uta uta Utah Utahan utahite utai utas utch utchy Ute utees utensil uteralgia uterectomy uteri uterine uteritis uteroabdominal uterocele uterocervical uterocystotomy uterofixation uterogestation uterogram uterography uterointestinal uterolith uterology uteromania uterometer uteroovarian uteroparietal uteropelvic uteroperitoneal uteropexia uteropexy uteroplacental uteroplasty uterosacral uterosclerosis uteroscope uterotomy uterotonic uterotubal uterovaginal uteroventral uterovesical uterus utfangenethef utfangethef utfangthef utfangthief utick utile utilitarian utilitarianism utilitarianist utilitarianize utilitarianly utility utilizable utilization utilize utilizer utinam utmost utmostness Utopia utopia Utopian utopian utopianism utopianist Utopianize Utopianizer utopianizer utopiast utopism utopist utopistic utopographer Utraquism utraquist utraquistic Utrecht utricle utricul utricular Utricularia Utriculariaceae utriculate utriculiferous utriculiform utriculitis utriculoid utriculoplastic utriculoplasty utriculosaccular utriculose utriculus utriform utrubi utrum utsuk utter utterability utterable utterableness utterance utterancy utterer utterless utterly uttermost utterness utu utum uturuncu uva uval uvalha uvanite uvarovite uvate uvea uveal uveitic uveitis Uvella uveous uvic uvid uviol uvitic uvitinic uvito uvitonic uvrou uvula uvulae uvular Uvularia uvularly uvulitis uvuloptosis uvulotome uvulotomy uvver uxorial uxoriality uxorially uxoricidal uxoricide uxorious uxoriously uxoriousness uzan uzara uzarin uzaron Uzbak Uzbeg Uzbek V v vaagmer vaalite Vaalpens vacabond vacancy vacant vacanthearted vacantheartedness vacantly vacantness vacantry vacatable vacate vacation vacational vacationer vacationist vacationless vacatur Vaccaria vaccary vaccenic vaccicide vaccigenous vaccina vaccinable vaccinal vaccinate vaccination vaccinationist vaccinator vaccinatory vaccine vaccinee vaccinella vaccinia Vacciniaceae vacciniaceous vaccinial vaccinifer vacciniform vacciniola vaccinist Vaccinium vaccinium vaccinization vaccinogenic vaccinogenous vaccinoid vaccinophobia vaccinotherapy vache Vachellia vachette vacillancy vacillant vacillate vacillating vacillatingly vacillation vacillator vacillatory vacoa vacona vacoua vacouf vacual vacuate vacuation vacuefy vacuist vacuity vacuolar vacuolary vacuolate vacuolated vacuolation vacuole vacuolization vacuome vacuometer vacuous vacuously vacuousness vacuum vacuuma vacuumize vade Vadim vadimonium vadimony vadium vadose vady vag vagabond vagabondage vagabondager vagabondia vagabondish vagabondism vagabondismus vagabondize vagabondizer vagabondry vagal vagarian vagarious vagariously vagarish vagarisome vagarist vagaristic vagarity vagary vagas vage vagiform vagile vagina vaginal vaginalectomy vaginaless vaginalitis vaginant vaginate vaginated vaginectomy vaginervose Vaginicola vaginicoline vaginicolous vaginiferous vaginipennate vaginismus vaginitis vaginoabdominal vaginocele vaginodynia vaginofixation vaginolabial vaginometer vaginomycosis vaginoperineal vaginoperitoneal vaginopexy vaginoplasty vaginoscope vaginoscopy vaginotome vaginotomy vaginovesical vaginovulvar vaginula vaginulate vaginule vagitus Vagnera vagoaccessorius vagodepressor vagoglossopharyngeal vagogram vagolysis vagosympathetic vagotomize vagotomy vagotonia vagotonic vagotropic vagotropism vagrance vagrancy vagrant vagrantism vagrantize vagrantlike vagrantly vagrantness vagrate vagrom vague vaguely vagueness vaguish vaguity vagulous vagus vahine Vai Vaidic vail vailable vain vainful vainglorious vaingloriously vaingloriousness vainglory vainly vainness vair vairagi vaire vairy Vaishnava Vaishnavism vaivode vajra vajrasana vakass vakia vakil vakkaliga Val valance valanced valanche valbellite vale valediction valedictorian valedictorily valedictory valence Valencia Valencian valencianite Valenciennes valency valent Valentide Valentin Valentine valentine Valentinian Valentinianism valentinite valeral valeraldehyde valeramide valerate Valeria valerian Valeriana Valerianaceae valerianaceous Valerianales valerianate Valerianella Valerianoides valeric Valerie valerin valerolactone valerone valeryl valerylene valet valeta valetage valetdom valethood valetism valetry valetudinarian valetudinarianism valetudinariness valetudinarist valetudinarium valetudinary valeur valeward valgoid valgus valhall Valhalla Vali vali valiance valiancy valiant valiantly valiantness valid validate validation validatory validification validity validly validness valine valise valiseful valiship Valkyr Valkyria Valkyrian Valkyrie vall vallancy vallar vallary vallate vallated vallation vallecula vallecular valleculate vallevarite valley valleyful valleyite valleylet valleylike valleyward valleywise vallicula vallicular vallidom vallis Valliscaulian Vallisneria Vallisneriaceae vallisneriaceous Vallombrosan Vallota vallum Valmy Valois valonia Valoniaceae valoniaceous valor valorization valorize valorous valorously valorousness Valsa Valsaceae Valsalvan valse valsoid valuable valuableness valuably valuate valuation valuational valuator value valued valueless valuelessness valuer valuta valva valval Valvata valvate Valvatidae valve valved valveless valvelet valvelike valveman valviferous valviform valvotomy valvula valvular valvulate valvule valvulitis valvulotome valvulotomy valyl valylene vambrace vambraced vamfont vammazsa vamoose vamp vamped vamper vamphorn vampire vampireproof vampiric vampirish vampirism vampirize vamplate vampproof Vampyrella Vampyrellidae Vampyrum Van van vanadate vanadiate vanadic vanadiferous vanadinite vanadium vanadosilicate vanadous vanadyl Vanaheim vanaprastha Vance vancourier Vancouveria Vanda Vandal Vandalic vandalish vandalism vandalistic vandalization vandalize vandalroot Vandemonian Vandemonianism Vandiemenian Vandyke vane vaned vaneless vanelike Vanellus Vanessa vanessian vanfoss vang vangee vangeli vanglo vanguard Vanguardist Vangueria vanilla vanillal vanillaldehyde vanillate vanille vanillery vanillic vanillin vanillinic vanillism vanilloes vanillon vanilloyl vanillyl Vanir vanish vanisher vanishing vanishingly vanishment Vanist vanitarianism vanitied vanity vanjarrah vanman vanmost Vannai vanner vannerman vannet Vannic vanquish vanquishable vanquisher vanquishment vansire vantage vantageless vantbrace vantbrass vanward vapid vapidism vapidity vapidly vapidness vapocauterization vapographic vapography vapor vaporability vaporable vaporarium vaporary vaporate vapored vaporer vaporescence vaporescent vaporiferous vaporiferousness vaporific vaporiform vaporimeter vaporing vaporingly vaporish vaporishness vaporium vaporizable vaporization vaporize vaporizer vaporless vaporlike vaporograph vaporographic vaporose vaporoseness vaporosity vaporous vaporously vaporousness vaportight vapory vapulary vapulate vapulation vapulatory vara varahan varan Varanger Varangi Varangian varanid Varanidae Varanoid Varanus Varda vardapet vardy vare varec vareheaded vareuse vargueno vari variability variable variableness variably Variag variance variancy variant variate variation variational variationist variatious variative variatively variator varical varicated varication varicella varicellar varicellate varicellation varicelliform varicelloid varicellous varices variciform varicoblepharon varicocele varicoid varicolored varicolorous varicose varicosed varicoseness varicosis varicosity varicotomy varicula varied variedly variegate variegated variegation variegator varier varietal varietally varietism varietist variety variform variformed variformity variformly varigradation variocoupler variola variolar Variolaria variolate variolation variole variolic varioliform variolite variolitic variolitization variolization varioloid variolous variolovaccine variolovaccinia variometer variorum variotinted various variously variousness variscite varisse varix varlet varletaille varletess varletry varletto varment varna varnashrama varnish varnished varnisher varnishing varnishlike varnishment varnishy varnpliktige varnsingite Varolian Varronia Varronian varsha varsity Varsovian varsoviana Varuna varus varve varved vary varyingly vas Vasa vasa vasal Vascons vascular vascularity vascularization vascularize vascularly vasculated vasculature vasculiferous vasculiform vasculitis vasculogenesis vasculolymphatic vasculomotor vasculose vasculum vase vasectomize vasectomy vaseful vaselet vaselike Vaseline vasemaker vasemaking vasewise vasework vashegyite vasicentric vasicine vasifactive vasiferous vasiform vasoconstricting vasoconstriction vasoconstrictive vasoconstrictor vasocorona vasodentinal vasodentine vasodilatation vasodilatin vasodilating vasodilation vasodilator vasoepididymostomy vasofactive vasoformative vasoganglion vasohypertonic vasohypotonic vasoinhibitor vasoinhibitory vasoligation vasoligature vasomotion vasomotor vasomotorial vasomotoric vasomotory vasoneurosis vasoparesis vasopressor vasopuncture vasoreflex vasorrhaphy vasosection vasospasm vasospastic vasostimulant vasostomy vasotomy vasotonic vasotribe vasotripsy vasotrophic vasovesiculectomy vasquine vassal vassalage vassaldom vassaless vassalic vassalism vassality vassalize vassalless vassalry vassalship Vassos vast vastate vastation vastidity vastily vastiness vastitude vastity vastly vastness vasty vasu Vasudeva Vasundhara vat Vateria vatful vatic vatically Vatican vaticanal vaticanic vaticanical Vaticanism Vaticanist Vaticanization Vaticanize vaticide vaticinal vaticinant vaticinate vaticination vaticinator vaticinatory vaticinatress vaticinatrix vatmaker vatmaking vatman Vatteluttu vatter vau Vaucheria Vaucheriaceae vaucheriaceous vaudeville vaudevillian vaudevillist Vaudism Vaudois vaudy Vaughn vaugnerite vault vaulted vaultedly vaulter vaulting vaultlike vaulty vaunt vauntage vaunted vaunter vauntery vauntful vauntiness vaunting vauntingly vauntmure vaunty vauquelinite Vauxhall Vauxhallian vauxite vavasor vavasory vaward Vayu Vazimba Veadar veal vealer vealiness veallike vealskin vealy vectigal vection vectis vectograph vectographic vector vectorial vectorially vecture Veda Vedaic Vedaism Vedalia vedana Vedanga Vedanta Vedantic Vedantism Vedantist Vedda Veddoid vedette Vedic vedika Vediovis Vedism Vedist vedro Veduis veduis vee veen veep veer veerable veeringly veery Vega vegasite vegeculture vegetability vegetable vegetablelike vegetablewise vegetablize vegetably vegetal vegetalcule vegetality vegetant vegetarian vegetarianism vegetate vegetation vegetational vegetationless vegetative vegetatively vegetativeness vegete vegeteness vegetism vegetive vegetivorous vegetoalkali vegetoalkaline vegetoalkaloid vegetoanimal vegetobituminous vegetocarbonaceous vegetomineral vehemence vehemency vehement vehemently vehicle vehicular vehicularly vehiculary vehiculate vehiculation vehiculatory Vehmic vei veigle veil veiled veiledly veiledness veiler veiling veilless veillike veilmaker veilmaking Veiltail veily vein veinage veinal veinbanding veined veiner veinery veininess veining veinless veinlet veinous veinstone veinstuff veinule veinulet veinwise veinwork veiny Vejoces vejoces Vejovis Vejoz vela velal velamen velamentous velamentum velar velardenite velaric velarium velarize velary velate velated velation velatura Velchanos veldcraft veldman veldschoen veldt veldtschoen Velella velellidous velic veliferous veliform veliger veligerous Velika velitation vell vellala velleda velleity vellicate vellication vellicative vellinch vellon vellosine Vellozia Velloziaceae velloziaceous vellum vellumy velo velociman velocimeter velocious velociously velocipedal velocipede velocipedean velocipedic velocitous velocity velodrome velometer velours veloutine velte velum velumen velure Velutina velutinous velveret velvet velvetbreast velveted velveteen velveteened velvetiness velveting velvetleaf velvetlike velvetry velvetseed velvetweed velvetwork velvety venada venal venality venalization venalize venally venalness Venantes venanzite venatic venatical venatically venation venational venator venatorial venatorious venatory vencola Vend vend vendace Vendean vendee vender vendetta vendettist vendibility vendible vendibleness vendibly vendicate Vendidad vending venditate venditation vendition venditor vendor vendue Vened Venedotian veneer veneerer veneering venefical veneficious veneficness veneficous venenate venenation venene veneniferous venenific venenosalivary venenous venenousness venepuncture venerability venerable venerableness venerably Veneracea veneracean veneraceous veneral Veneralia venerance venerant venerate veneration venerational venerative veneratively venerativeness venerator venereal venerealness venereologist venereology venerer Veneres venerial Veneridae veneriform venery venesect venesection venesector venesia Venetes Veneti Venetian Venetianed Venetic venezolano Venezuelan vengeable vengeance vengeant vengeful vengefully vengefulness vengeously venger venial veniality venially venialness Venice venie venin veniplex venipuncture venireman venison venisonivorous venisonlike venisuture Venite Venizelist Venkata vennel venner venoatrial venoauricular venom venomed venomer venomization venomize venomly venomness venomosalivary venomous venomously venomousness venomproof venomsome venomy venosal venosclerosis venose venosinal venosity venostasis venous venously venousness vent ventage ventail venter Ventersdorp venthole ventiduct ventifact ventil ventilable ventilagin ventilate ventilating ventilation ventilative ventilator ventilatory ventless ventometer ventose ventoseness ventosity ventpiece ventrad ventral ventrally ventralmost ventralward ventric ventricle ventricolumna ventricolumnar ventricornu ventricornual ventricose ventricoseness ventricosity ventricous ventricular ventricularis ventriculite Ventriculites ventriculitic Ventriculitidae ventriculogram ventriculography ventriculoscopy ventriculose ventriculous ventriculus ventricumbent ventriduct ventrifixation ventrilateral ventrilocution ventriloqual ventriloqually ventriloque ventriloquial ventriloquially ventriloquism ventriloquist ventriloquistic ventriloquize ventriloquous ventriloquously ventriloquy ventrimesal ventrimeson ventrine ventripotency ventripotent ventripotential ventripyramid ventroaxial ventroaxillary ventrocaudal ventrocystorrhaphy ventrodorsad ventrodorsal ventrodorsally ventrofixation ventrohysteropexy ventroinguinal ventrolateral ventrolaterally ventromedial ventromedian ventromesal ventromesial ventromyel ventroposterior ventroptosia ventroptosis ventroscopy ventrose ventrosity ventrosuspension ventrotomy venture venturer venturesome venturesomely venturesomeness Venturia venturine venturous venturously venturousness venue venula venular venule venulose Venus Venusian venust Venutian venville Veps Vepse Vepsish vera veracious veraciously veraciousness veracity veranda verandaed verascope veratral veratralbine veratraldehyde veratrate veratria veratric veratridine veratrine veratrinize veratrize veratroidine veratrole veratroyl Veratrum veratryl veratrylidene verb verbal verbalism verbalist verbality verbalization verbalize verbalizer verbally verbarian verbarium verbasco verbascose Verbascum verbate verbatim verbena Verbenaceae verbenaceous verbenalike verbenalin Verbenarius verbenate verbene verbenone verberate verberation verberative Verbesina verbiage verbicide verbiculture verbid verbification verbify verbigerate verbigeration verbigerative verbile verbless verbolatry verbomania verbomaniac verbomotor verbose verbosely verboseness verbosity verbous verby verchok verd verdancy verdant verdantly verdantness verdea verdelho verderer verderership verdet verdict verdigris verdigrisy verdin verditer verdoy verdugoship verdun verdure verdured verdureless verdurous verdurousness verecund verecundity verecundness verek veretilliform Veretillum veretillum verge vergeboard vergence vergency vergent vergentness verger vergeress vergerism vergerless vergership vergery vergi vergiform Vergilianism verglas vergobret veri veridic veridical veridicality veridically veridicalness veridicous veridity verifiability verifiable verifiableness verifiably verificate verification verificative verificatory verifier verify verily verine verisimilar verisimilarly verisimilitude verisimilitudinous verisimility verism verist veristic veritability veritable veritableness veritably verite veritism veritist veritistic verity verjuice vermeil vermeologist vermeology Vermes vermetid Vermetidae vermetidae Vermetus vermian vermicelli vermicidal vermicide vermicious vermicle vermicular Vermicularia vermicularly vermiculate vermiculated vermiculation vermicule vermiculite vermiculose vermiculosity vermiculous vermiform Vermiformia vermiformis vermiformity vermiformous vermifugal vermifuge vermifugous vermigerous vermigrade Vermilingues Vermilinguia vermilinguial vermilion vermilionette vermilionize vermin verminal verminate vermination verminer verminicidal verminicide verminiferous verminlike verminly verminosis verminous verminously verminousness verminproof verminy vermiparous vermiparousness vermis vermivorous vermivorousness vermix Vermont Vermonter Vermontese vermorel vermouth Vern vernacle vernacular vernacularism vernacularist vernacularity vernacularization vernacularize vernacularly vernacularness vernaculate vernal vernality vernalization vernalize vernally vernant vernation vernicose vernier vernile vernility vernin vernine vernition Vernon Vernonia vernoniaceous Vernonieae vernonin Verona Veronal veronalism Veronese Veronica Veronicella Veronicellidae Verpa verre verrel verriculate verriculated verricule verruca verrucano Verrucaria Verrucariaceae verrucariaceous verrucarioid verrucated verruciferous verruciform verrucose verrucoseness verrucosis verrucosity verrucous verruculose verruga versability versable versableness versal versant versate versatile versatilely versatileness versatility versation versative verse versecraft versed verseless verselet versemaker versemaking verseman versemanship versemonger versemongering versemongery verser versesmith verset versette verseward versewright versicle versicler versicolor versicolorate versicolored versicolorous versicular versicule versifiable versifiaster versification versificator versificatory versificatrix versifier versiform versify versiloquy versine version versional versioner versionist versionize versipel verso versor verst versta versual versus vert vertebra vertebrae vertebral vertebraless vertebrally Vertebraria vertebrarium vertebrarterial Vertebrata vertebrate vertebrated vertebration vertebre vertebrectomy vertebriform vertebroarterial vertebrobasilar vertebrochondral vertebrocostal vertebrodymus vertebrofemoral vertebroiliac vertebromammary vertebrosacral vertebrosternal vertex vertibility vertible vertibleness vertical verticalism verticality vertically verticalness vertices verticil verticillary verticillaster verticillastrate verticillate verticillated verticillately verticillation verticilliaceous verticilliose Verticillium verticillus verticity verticomental verticordious vertiginate vertigines vertiginous vertigo vertilinear vertimeter Vertumnus Verulamian veruled verumontanum vervain vervainlike verve vervecine vervel verveled vervelle vervenia vervet very Vesalian vesania vesanic vesbite vesicae vesical vesicant vesicate vesication vesicatory vesicle vesicoabdominal vesicocavernous vesicocele vesicocervical vesicoclysis vesicofixation vesicointestinal vesicoprostatic vesicopubic vesicorectal vesicosigmoid vesicospinal vesicotomy vesicovaginal vesicular Vesicularia vesicularly vesiculary vesiculase Vesiculata Vesiculatae vesiculate vesiculation vesicule vesiculectomy vesiculiferous vesiculiform vesiculigerous vesiculitis vesiculobronchial vesiculocavernous vesiculopustular vesiculose vesiculotomy vesiculotubular vesiculotympanic vesiculotympanitic vesiculous vesiculus vesicupapular veskit Vespa vespacide vespal vesper vesperal vesperian vespering vespers vespertide vespertilian Vespertilio vespertilio Vespertiliones vespertilionid Vespertilionidae Vespertilioninae vespertilionine vespertinal vespertine vespery vespiary vespid Vespidae vespiform Vespina vespine vespoid Vespoidea vessel vesseled vesselful vessignon vest Vesta vestal Vestalia vestalia vestalship Vestas vestee vester vestiarian vestiarium vestiary vestibula vestibular vestibulary vestibulate vestibule vestibuled vestibulospinal vestibulum vestige vestigial vestigially Vestigian vestigiary vestigium vestiment vestimental vestimentary vesting Vestini Vestinian vestiture vestlet vestment vestmental vestmented vestral vestralization vestrical vestrification vestrify vestry vestrydom vestryhood vestryish vestryism vestryize vestryman vestrymanly vestrymanship vestuary vestural vesture vesturer Vesuvian vesuvian vesuvianite vesuviate vesuvite vesuvius veszelyite vet veta vetanda vetch vetchling vetchy veteran veterancy veteraness veteranize veterinarian veterinarianism veterinary vetitive vetivene vetivenol vetiver Vetiveria vetiveria vetivert vetkousie veto vetoer vetoism vetoist vetoistic vetoistical vetust vetusty veuglaire veuve vex vexable vexation vexatious vexatiously vexatiousness vexatory vexed vexedly vexedness vexer vexful vexil vexillar vexillarious vexillary vexillate vexillation vexillum vexingly vexingness vext via viability viable viaduct viaggiatory viagram viagraph viajaca vial vialful vialmaker vialmaking vialogue viameter viand viander viatic viatica viatical viaticum viatometer viator viatorial viatorially vibetoite vibex vibgyor vibix vibracular vibracularium vibraculoid vibraculum vibrance vibrancy vibrant vibrantly vibraphone vibrate vibratile vibratility vibrating vibratingly vibration vibrational vibrationless vibratiuncle vibratiunculation vibrative vibrato vibrator vibratory Vibrio vibrioid vibrion vibrionic vibrissa vibrissae vibrissal vibrograph vibromassage vibrometer vibromotive vibronic vibrophone vibroscope vibroscopic vibrotherapeutics viburnic viburnin Viburnum Vic vicar vicarage vicarate vicaress vicarial vicarian vicarianism vicariate vicariateship vicarious vicariously vicariousness vicarly vicarship Vice vice vicecomes vicecomital vicegeral vicegerency vicegerent vicegerentship viceless vicelike vicenary vicennial viceregal viceregally vicereine viceroy viceroyal viceroyalty viceroydom viceroyship vicety viceversally Vichyite vichyssoise Vicia vicianin vicianose vicilin vicinage vicinal vicine vicinity viciosity vicious viciously viciousness vicissitous vicissitude vicissitudinary vicissitudinous vicissitudinousness Vick Vicki Vickie Vicky vicoite vicontiel victim victimhood victimizable victimization victimize victimizer victless Victor victor victordom victorfish Victoria Victorian Victorianism Victorianize Victorianly victoriate victoriatus victorine victorious victoriously victoriousness victorium victory victoryless victress victrix Victrola victrola victual victualage victualer victualing victuallership victualless victualry victuals vicuna Viddhal viddui videndum video videogenic vidette Vidhyanath Vidian vidonia vidry Vidua viduage vidual vidually viduate viduated viduation Viduinae viduine viduity viduous vidya vie vielle Vienna Viennese vier vierling viertel viertelein Vietminh Vietnamese view viewable viewably viewer viewiness viewless viewlessly viewly viewpoint viewsome viewster viewworthy viewy vifda viga vigentennial vigesimal vigesimation vigia vigil vigilance vigilancy vigilant vigilante vigilantism vigilantly vigilantness vigilate vigilation vigintiangular vigneron vignette vignetter vignettist vignin vigonia vigor vigorist vigorless vigorous vigorously vigorousness vihara vihuela vijao Vijay viking vikingism vikinglike vikingship vila vilayet vile vilehearted Vilela vilely vileness Vilhelm Vili vilicate vilification vilifier vilify vilifyingly vilipend vilipender vilipenditory vility vill villa villadom villaette village villageful villagehood villageless villagelet villagelike villageous villager villageress villagery villaget villageward villagey villagism villain villainage villaindom villainess villainist villainous villainously villainousness villainproof villainy villakin villaless villalike villanage villanella villanelle villanette villanous villanously Villanova Villanovan villar villate villatic ville villein villeinage villeiness villeinhold villenage villiaumite villiferous villiform villiplacental Villiplacentalia villitis villoid villose villosity villous villously villus vim vimana vimen vimful Viminal viminal vimineous vina vinaceous vinaconic vinage vinagron vinaigrette vinaigretted vinaigrier vinaigrous vinal Vinalia vinasse vinata Vince Vincent vincent Vincentian Vincenzo Vincetoxicum vincetoxin vincibility vincible vincibleness vincibly vincular vinculate vinculation vinculum Vindelici vindemial vindemiate vindemiation vindemiatory Vindemiatrix vindex vindhyan vindicability vindicable vindicableness vindicably vindicate vindication vindicative vindicatively vindicativeness vindicator vindicatorily vindicatorship vindicatory vindicatress vindictive vindictively vindictiveness vindictivolence vindresser vine vinea vineal vineatic vined vinegar vinegarer vinegarette vinegarish vinegarist vinegarroon vinegarweed vinegary vinegerone vinegrower vineity vineland vineless vinelet vinelike viner vinery vinestalk vinewise vineyard Vineyarder vineyarding vineyardist vingerhoed Vingolf vinhatico vinic vinicultural viniculture viniculturist vinifera viniferous vinification vinificator Vinland vinny vino vinoacetous Vinod vinolence vinolent vinologist vinology vinometer vinomethylic vinose vinosity vinosulphureous vinous vinously vinousness vinquish vint vinta vintage vintager vintaging vintem vintener vintlite vintner vintneress vintnership vintnery vintress vintry viny vinyl vinylbenzene vinylene vinylic vinylidene viol viola violability violable violableness violably Violaceae violacean violaceous violaceously violal Violales violanin violaquercitrin violate violater violation violational violative violator violatory violature violence violent violently violentness violer violescent violet violetish violetlike violette violetwise violety violin violina violine violinette violinist violinistic violinlike violinmaker violinmaking violist violmaker violmaking violon violoncellist violoncello violone violotta violuric viosterol Vip viper Vipera viperan viperess viperfish viperian viperid Viperidae viperiform Viperina Viperinae viperine viperish viperishly viperlike viperling viperoid Viperoidea viperous viperously viperousness vipery vipolitic vipresident viqueen Vira viragin viraginian viraginity viraginous virago viragoish viragolike viragoship viral Virales Virbius vire virelay viremia viremic virent vireo vireonine virescence virescent virga virgal virgate virgated virgater virgation virgilia Virgilism virgin virginal Virginale virginalist virginality virginally virgineous virginhead Virginia Virginian Virginid virginitis virginity virginityship virginium virginlike virginly virginship Virgo virgula virgular Virgularia virgularian Virgulariidae virgulate virgule virgultum virial viricide virid viridene viridescence viridescent viridian viridigenous viridine viridite viridity virific virify virile virilely virileness virilescence virilescent virilify viriliously virilism virilist virility viripotent viritrate virl virole viroled virological virologist virology viron virose virosis virous virtu virtual virtualism virtualist virtuality virtualize virtually virtue virtued virtuefy virtuelessness virtueproof virtuless virtuosa virtuose virtuosi virtuosic virtuosity virtuoso virtuosoship virtuous virtuouslike virtuously virtuousness virucidal virucide viruela virulence virulency virulent virulented virulently virulentness viruliferous virus viruscidal viruscide virusemic vis visa visage visaged visagraph visarga Visaya Visayan viscacha viscera visceral visceralgia viscerally viscerate visceration visceripericardial visceroinhibitory visceromotor visceroparietal visceroperitioneal visceropleural visceroptosis visceroptotic viscerosensory visceroskeletal viscerosomatic viscerotomy viscerotonia viscerotonic viscerotrophic viscerotropic viscerous viscid viscidity viscidize viscidly viscidness viscidulous viscin viscoidal viscolize viscometer viscometrical viscometrically viscometry viscontal viscoscope viscose viscosimeter viscosimetry viscosity viscount viscountcy viscountess viscountship viscounty viscous viscously viscousness viscus vise viseman Vishal Vishnavite Vishnu Vishnuism Vishnuite Vishnuvite visibility visibilize visible visibleness visibly visie Visigoth Visigothic visile vision visional visionally visionarily visionariness visionary visioned visioner visionic visionist visionize visionless visionlike visionmonger visionproof visit visita visitable Visitandine visitant visitation visitational visitative visitator visitatorial visite visitee visiter visiting visitment visitor visitoress visitorial visitorship visitress visitrix visive visne vison visor visorless visorlike vista vistaed vistal vistaless vistamente Vistlik visto Vistulian visual visualist visuality visualization visualize visualizer visually visuoauditory visuokinesthetic visuometer visuopsychic visuosensory vita Vitaceae Vitaglass vital vitalic vitalism vitalist vitalistic vitalistically vitality vitalization vitalize vitalizer vitalizing vitalizingly Vitallium vitally vitalness vitals vitamer vitameric vitamin vitaminic vitaminize vitaminology vitapath vitapathy vitaphone vitascope vitascopic vitasti vitativeness vitellarian vitellarium vitellary vitellicle vitelliferous vitelligenous vitelligerous vitellin vitelline vitellogene vitellogenous vitellose vitellus viterbite Viti vitiable vitiate vitiated vitiation vitiator viticetum viticulose viticultural viticulture viticulturer viticulturist vitiferous vitiliginous vitiligo vitiligoidea vitiosity Vitis vitium vitochemic vitochemical vitrage vitrail vitrailed vitrailist vitrain vitraux vitreal vitrean vitrella vitremyte vitreodentinal vitreodentine vitreoelectric vitreosity vitreous vitreouslike vitreously vitreousness vitrescence vitrescency vitrescent vitrescibility vitrescible vitreum vitric vitrics vitrifaction vitrifacture vitrifiability vitrifiable vitrification vitriform vitrify Vitrina vitrine vitrinoid vitriol vitriolate vitriolation vitriolic vitrioline vitriolizable vitriolization vitriolize vitriolizer vitrite vitrobasalt vitrophyre vitrophyric vitrotype vitrous Vitruvian Vitruvianism vitta vittate vitular vituline vituperable vituperate vituperation vituperative vituperatively vituperator vituperatory vituperious viuva viva vivacious vivaciously vivaciousness vivacity vivandiere vivarium vivary vivax vive Vivek vively vivency viver Viverridae viverriform Viverrinae viverrine vivers vives vivianite vivicremation vivid vividialysis vividiffusion vividissection vividity vividly vividness vivific vivificate vivification vivificative vivificator vivifier vivify viviparism viviparity viviparous viviparously viviparousness vivipary viviperfuse vivisect vivisection vivisectional vivisectionally vivisectionist vivisective vivisector vivisectorium vivisepulture vixen vixenish vixenishly vixenishness vixenlike vixenly vizard vizarded vizardless vizardlike vizardmonger vizier vizierate viziercraft vizierial viziership vizircraft Vlach Vladimir Vladislav vlei voar vocability vocable vocably vocabular vocabularian vocabularied vocabulary vocabulation vocabulist vocal vocalic vocalion vocalise vocalism vocalist vocalistic vocality vocalization vocalize vocalizer vocaller vocally vocalness vocate vocation vocational vocationalism vocationalization vocationalize vocationally vocative vocatively Vochysiaceae vochysiaceous vocicultural vociferance vociferant vociferate vociferation vociferative vociferator vociferize vociferosity vociferous vociferously vociferousness vocification vocimotor vocular vocule Vod vodka voe voet voeten Voetian vog vogesite voglite vogue voguey voguish Vogul voice voiced voiceful voicefulness voiceless voicelessly voicelessness voicelet voicelike voicer voicing void voidable voidableness voidance voided voidee voider voiding voidless voidly voidness voile voiturette voivode voivodeship vol volable volage Volans volant volantly Volapuk Volapuker Volapukism Volapukist volar volata volatic volatile volatilely volatileness volatility volatilizable volatilization volatilize volatilizer volation volational volborthite Volcae volcan Volcanalia volcanian volcanic volcanically volcanicity volcanism volcanist volcanite volcanity volcanization volcanize volcano volcanoism volcanological volcanologist volcanologize volcanology Volcanus vole volemitol volency volent volently volery volet volhynite volipresence volipresent volitant volitate volitation volitational volitiency volitient volition volitional volitionalist volitionality volitionally volitionary volitionate volitionless volitive volitorial Volkerwanderung volley volleyball volleyer volleying volleyingly volost volplane volplanist Volsci Volscian volsella volsellum Volstead Volsteadism volt Volta voltaelectric voltaelectricity voltaelectrometer voltaelectrometric voltage voltagraphy voltaic Voltairian Voltairianize Voltairish Voltairism voltaism voltaite voltameter voltametric voltammeter voltaplast voltatype voltinism voltivity voltize voltmeter voltzite volubilate volubility voluble volubleness volubly volucrine volume volumed volumenometer volumenometry volumescope volumeter volumetric volumetrical volumetrically volumetry volumette voluminal voluminosity voluminous voluminously voluminousness volumist volumometer volumometrical volumometry voluntariate voluntarily voluntariness voluntarism voluntarist voluntaristic voluntarity voluntary voluntaryism voluntaryist voluntative volunteer volunteerism volunteerly volunteership volupt voluptary voluptas voluptuarian voluptuary voluptuate voluptuosity voluptuous voluptuously voluptuousness volupty Voluspa voluta volutate volutation volute voluted Volutidae volutiform volutin volution volutoid volva volvate volvelle volvent Volvocaceae volvocaceous volvulus vomer vomerine vomerobasilar vomeronasal vomeropalatine vomica vomicine vomit vomitable vomiter vomiting vomitingly vomition vomitive vomitiveness vomito vomitory vomiture vomiturition vomitus vomitwort vondsira vonsenite voodoo voodooism voodooist voodooistic voracious voraciously voraciousness voracity voraginous vorago vorant vorhand vorlooper vorondreo vorpal vortex vortical vortically vorticel Vorticella vorticellid Vorticellidae vortices vorticial vorticiform vorticism vorticist vorticity vorticose vorticosely vorticular vorticularly vortiginous Vortumnus Vosgian vota votable votal votally votaress votarist votary votation Vote vote voteen voteless voter voting Votish votive votively votiveness votometer votress Votyak vouch vouchable vouchee voucher voucheress vouchment vouchsafe vouchsafement vouge Vougeot Vouli voussoir vow vowed vowel vowelish vowelism vowelist vowelization vowelize vowelless vowellessness vowellike vowely vower vowess vowless vowmaker vowmaking voyage voyageable voyager voyance voyeur voyeurism vraic vraicker vraicking vrbaite vriddhi vrother Vu vug vuggy Vulcan Vulcanalia Vulcanalial Vulcanalian Vulcanian Vulcanic vulcanicity vulcanism vulcanist vulcanite vulcanizable vulcanizate vulcanization vulcanize vulcanizer vulcanological vulcanologist vulcanology vulgar vulgare vulgarian vulgarish vulgarism vulgarist vulgarity vulgarization vulgarize vulgarizer vulgarlike vulgarly vulgarness vulgarwise Vulgate vulgate vulgus vuln vulnerability vulnerable vulnerableness vulnerably vulnerary vulnerate vulneration vulnerative vulnerose vulnific vulnose Vulpecula vulpecular Vulpeculid Vulpes vulpic vulpicidal vulpicide vulpicidism Vulpinae vulpine vulpinism vulpinite vulsella vulsellum vulsinite Vultur vulture vulturelike vulturewise Vulturidae Vulturinae vulturine vulturish vulturism vulturn vulturous vulva vulval vulvar vulvate vulviform vulvitis vulvocrural vulvouterine vulvovaginal vulvovaginitis vum vying vyingly W w Wa wa Waac waag waapa waar Waasi wab wabber wabble wabbly wabby wabe Wabena wabeno Wabi wabster Wabuma Wabunga Wac wacago wace Wachaga Wachenheimer wachna Wachuset wack wacke wacken wacker wackiness wacky Waco wad waddent wadder wadding waddler waddlesome waddling waddlingly waddly waddy waddywood Wade wade wadeable wader wadi wading wadingly wadlike wadmaker wadmaking wadmal wadmeal wadna wadset wadsetter wae waeg waer waesome waesuck Waf Wafd Wafdist wafer waferer waferish wafermaker wafermaking waferwoman waferwork wafery waff waffle wafflike waffly waft waftage wafter wafture wafty wag Waganda waganging wagaun wagbeard wage waged wagedom wageless wagelessness wagenboom Wagener wager wagerer wagering wages wagesman wagework wageworker wageworking waggable waggably waggel wagger waggery waggie waggish waggishly waggishness waggle waggling wagglingly waggly Waggumbura waggy waglike wagling Wagneresque Wagnerian Wagneriana Wagnerianism Wagnerism Wagnerist Wagnerite wagnerite Wagnerize Wagogo Wagoma wagon wagonable wagonage wagoner wagoness wagonette wagonful wagonload wagonmaker wagonmaking wagonman wagonry wagonsmith wagonway wagonwayman wagonwork wagonwright wagsome wagtail Waguha wagwag wagwants Wagweno wagwit wah Wahabi Wahabiism Wahabit Wahabitism wahahe Wahehe Wahima wahine Wahlenbergia wahoo wahpekute Wahpeton waiata Waibling Waicuri Waicurian waif Waiguli Waiilatpuan waik waikly waikness wail Wailaki wailer wailful wailfully wailingly wailsome waily wain wainage wainbote wainer wainful wainman wainrope wainscot wainscoting wainwright waipiro wairch waird wairepo wairsh waise waist waistband waistcloth waistcoat waistcoated waistcoateer waistcoathole waistcoating waistcoatless waisted waister waisting waistless waistline wait waiter waiterage waiterdom waiterhood waitering waiterlike waitership waiting waitingly waitress waivatua waive waiver waivery waivod Waiwai waiwode wajang waka Wakamba wakan Wakashan wake wakeel wakeful wakefully wakefulness wakeless waken wakener wakening waker wakes waketime wakf Wakhi wakif wakiki waking wakingly wakiup wakken wakon wakonda Wakore Wakwafi waky Walach Walachian walahee Walapai Walchia Waldenses Waldensian waldflute waldgrave waldgravine Waldheimia waldhorn waldmeister Waldsteinia wale waled walepiece Waler waler walewort wali waling walk walkable walkaway walker walking walkist walkmill walkmiller walkout walkover walkrife walkside walksman walkway walkyrie wall wallaba wallaby Wallach wallah wallaroo Wallawalla wallbird wallboard walled waller Wallerian wallet walletful walleye walleyed wallflower wallful wallhick walling wallise wallless wallman Wallon Wallonian Walloon walloon wallop walloper walloping wallow wallower wallowish wallowishly wallowishness wallpaper wallpapering wallpiece Wallsend wallwise wallwork wallwort wally walnut Walpapi Walpolean Walpurgis walpurgite walrus walsh Walt walt Walter walter walth Waltonian waltz waltzer waltzlike walycoat wamara wambais wamble wambliness wambling wamblingly wambly Wambuba Wambugu Wambutti wame wamefou wamel wammikin wamp Wampanoag wampee wample wampum wampumpeag wampus wamus wan Wanapum wanchancy wand wander wanderable wanderer wandering wanderingly wanderingness Wanderjahr wanderlust wanderluster wanderlustful wanderoo wandery wanderyear wandflower wandle wandlike wandoo Wandorobo wandsman wandy wane Waneatta waned waneless wang wanga wangala wangan Wangara wangateur wanghee wangle wangler Wangoni wangrace wangtooth wanhope wanhorn wanigan waning wankapin wankle wankliness wankly wanle wanly wanner wanness wannish wanny wanrufe wansonsy want wantage wanter wantful wanthill wanthrift wanting wantingly wantingness wantless wantlessness wanton wantoner wantonlike wantonly wantonness wantwit wanty wanwordy wanworth wany Wanyakyusa Wanyamwezi Wanyasa Wanyoro wap wapacut Wapato wapatoo wapentake Wapisiana wapiti Wapogoro Wapokomo wapp Wappato wappenschaw wappenschawing wapper wapping Wappinger Wappo war warabi waratah warble warbled warblelike warbler warblerlike warblet warbling warblingly warbly warch warcraft ward wardable wardage wardapet warday warded Warden warden wardency wardenry wardenship warder warderer wardership wardholding warding wardite wardless wardlike wardmaid wardman wardmote wardress wardrobe wardrober wardroom wardship wardsmaid wardsman wardswoman wardwite wardwoman ware Waregga warehou warehouse warehouseage warehoused warehouseful warehouseman warehouser wareless waremaker waremaking wareman wareroom warf warfare warfarer warfaring warful warily wariness Waring waringin warish warison wark warkamoowee warl warless warlessly warlike warlikely warlikeness warlock warluck warly warm warmable warman warmed warmedly warmer warmful warmhearted warmheartedly warmheartedness warmhouse warming warmish warmly warmness warmonger warmongering warmouth warmth warmthless warmus warn warnel warner warning warningly warningproof warnish warnoth warnt Warori warp warpable warpage warped warper warping warplane warple warplike warproof warpwise warragal warrambool warran warrand warrandice warrant warrantable warrantableness warrantably warranted warrantee warranter warrantise warrantless warrantor warranty warratau Warrau warree Warren warren warrener warrenlike warrer Warri warrin warrior warrioress warriorhood warriorism warriorlike warriorship warriorwise warrok Warsaw warsaw warse warsel warship warsle warsler warst wart warted wartern wartflower warth wartime wartless wartlet wartlike wartproof wartweed wartwort warty wartyback Warua Warundi warve warwards Warwick warwickite warwolf warworn wary was wasabi Wasagara Wasandawi Wasango Wasat Wasatch Wasco wase Wasegua wasel wash washability washable washableness Washaki washaway washbasin washbasket washboard washbowl washbrew washcloth washday washdish washdown washed washen washer washerless washerman washerwife washerwoman washery washeryman washhand washhouse washin washiness washing Washington Washingtonia Washingtonian Washingtoniana Washita washland washmaid washman Washo Washoan washoff washout washpot washproof washrag washroad washroom washshed washstand washtail washtray washtrough washtub washway washwoman washwork washy Wasir wasnt Wasoga Wasp wasp waspen wasphood waspily waspish waspishly waspishness wasplike waspling waspnesting waspy wassail wassailer wassailous wassailry wassie wast wastable wastage waste wastebasket wasteboard wasted wasteful wastefully wastefulness wastel wasteland wastelbread wasteless wasteman wastement wasteness wastepaper wasteproof waster wasterful wasterfully wasterfulness wastethrift wasteword wasteyard wasting wastingly wastingness wastland wastrel wastrife wasty Wasukuma Waswahili Wat wat Watala watap watch watchable watchboat watchcase watchcry watchdog watched watcher watchfree watchful watchfully watchfulness watchglassful watchhouse watching watchingly watchkeeper watchless watchlessness watchmaker watchmaking watchman watchmanly watchmanship watchmate watchment watchout watchtower watchwise watchwoman watchword watchwork water waterage waterbailage waterbelly Waterberg waterboard waterbok waterbosh waterbrain waterchat watercup waterdoe waterdrop watered waterer waterfall waterfinder waterflood waterfowl waterfront waterhead waterhorse waterie waterily wateriness watering wateringly wateringman waterish waterishly waterishness Waterlander Waterlandian waterleave waterless waterlessly waterlessness waterlike waterline waterlog waterlogged waterloggedness waterlogger waterlogging Waterloo waterman watermanship watermark watermaster watermelon watermonger waterphone waterpot waterproof waterproofer waterproofing waterproofness waterquake waterscape watershed watershoot waterside watersider waterskin watersmeet waterspout waterstead watertight watertightal watertightness waterward waterwards waterway waterweed waterwise waterwoman waterwood waterwork waterworker waterworm waterworn waterwort watery wath wathstead Watsonia watt wattage wattape wattle wattlebird wattled wattless wattlework wattling wattman wattmeter Watusi wauble wauch wauchle waucht wauf waugh waughy wauken waukit waukrife waul waumle wauner wauns waup waur Waura wauregan wauve wavable wavably Wave wave waved waveless wavelessly wavelessness wavelet wavelike wavellite wavemark wavement wavemeter waveproof waver waverable waverer wavering waveringly waveringness waverous wavery waveson waveward wavewise wavey wavicle wavily waviness waving wavingly Wavira wavy waw wawa wawah wawaskeesh wax waxberry waxbill waxbird waxbush waxchandler waxchandlery waxen waxer waxflower Waxhaw waxhearted waxily waxiness waxing waxingly waxlike waxmaker waxmaking waxman waxweed waxwing waxwork waxworker waxworking waxy way wayaka wayang Wayao wayback wayberry waybill waybird waybook waybread waybung wayfare wayfarer wayfaring wayfaringly wayfellow waygang waygate waygoing waygone waygoose wayhouse waying waylaid waylaidlessness waylay waylayer wayleave wayless waymaker wayman waymark waymate Wayne waypost ways wayside waysider waysliding waythorn wayward waywarden waywardly waywardness waywiser waywode waywodeship wayworn waywort wayzgoose Wazir we Wea weak weakbrained weaken weakener weakening weakfish weakhanded weakhearted weakheartedly weakheartedness weakish weakishly weakishness weakliness weakling weakly weakmouthed weakness weaky weal weald Wealden wealdsman wealth wealthily wealthiness wealthless wealthmaker wealthmaking wealthmonger Wealthy wealthy weam wean weanable weanedness weanel weaner weanling Weanoc weanyer Weapemeoc weapon weaponed weaponeer weaponless weaponmaker weaponmaking weaponproof weaponry weaponshaw weaponshow weaponshowing weaponsmith weaponsmithy wear wearability wearable wearer weariable weariableness wearied weariedly weariedness wearier weariful wearifully wearifulness weariless wearilessly wearily weariness wearing wearingly wearish wearishly wearishness wearisome wearisomely wearisomeness wearproof weary wearying wearyingly weasand weasel weaselfish weasellike weaselly weaselship weaselskin weaselsnout weaselwise weaser weason weather weatherboard weatherboarding weatherbreak weathercock weathercockish weathercockism weathercocky weathered weatherer weatherfish weatherglass weathergleam weatherhead weatherheaded weathering weatherliness weatherly weathermaker weathermaking weatherman weathermost weatherology weatherproof weatherproofed weatherproofing weatherproofness weatherward weatherworn weathery weavable weave weaveable weaved weavement weaver weaverbird weaveress weaving weazen weazened weazeny web webbed webber webbing webby weber Weberian webeye webfoot webfooter webless weblike webmaker webmaking webster Websterian websterite webwork webworm wecht wed wedana wedbed wedbedrip wedded weddedly weddedness wedder wedding weddinger wede wedge wedgeable wedgebill wedged wedgelike wedger wedgewise Wedgie wedging Wedgwood wedgy wedlock Wednesday wedset wee weeble weed weeda weedable weedage weeded weeder weedery weedful weedhook weediness weedingtime weedish weedless weedlike weedling weedow weedproof weedy week weekday weekend weekender weekly weekwam weel weelfard weelfaured weemen ween weendigo weeness weening weenong weeny weep weepable weeper weepered weepful weeping weepingly weeps weepy weesh weeshy weet weetbird weetless weever weevil weeviled weevillike weevilproof weevily weewow weeze weft weftage wefted wefty Wega wegenerian wegotism wehrlite Wei weibyeite weichselwood Weierstrassian Weigela weigelite weigh weighable weighage weighbar weighbauk weighbridge weighbridgeman weighed weigher weighership weighhouse weighin weighing weighman weighment weighshaft weight weightchaser weighted weightedly weightedness weightily weightiness weighting weightless weightlessly weightlessness weightometer weighty weinbergerite Weinmannia weinschenkite weir weirangle weird weirdful weirdish weirdless weirdlessness weirdlike weirdliness weirdly weirdness weirdsome weirdward weirdwoman weiring weisbachite weiselbergite weism Weismannian Weismannism weissite Weissnichtwo Weitspekan wejack weka wekau wekeen weki welcome welcomeless welcomely welcomeness welcomer welcoming welcomingly weld weldability weldable welder welding weldless weldment weldor Welf welfare welfaring Welfic welk welkin welkinlike well wellat wellaway wellborn wellcurb wellhead wellhole welling wellington Wellingtonia wellish wellmaker wellmaking wellman wellnear wellness wellring Wellsian wellside wellsite wellspring wellstead wellstrand welly wellyard wels Welsh welsh welsher Welshery Welshism Welshland Welshlike Welshman Welshness Welshry Welshwoman Welshy welsium welt welted welter welterweight welting Welwitschia wem wemless wen wench wencher wenchless wenchlike Wenchow Wenchowese Wend wend wende Wendell Wendi Wendic Wendish Wendy wene Wenlock Wenlockian wennebergite wennish wenny Wenonah Wenrohronon went wentletrap wenzel wept wer Werchowinci were werebear werecalf werefolk werefox werehyena werejaguar wereleopard werent weretiger werewolf werewolfish werewolfism werf wergil weri Werner Wernerian Wernerism wernerite werowance wert Werther Wertherian Wertherism wervel Wes wese weskit Wesleyan Wesleyanism Wesleyism wesselton Wessexman west westaway westbound weste wester westering westerliness westerly westermost western westerner westernism westernization westernize westernly westernmost westerwards westfalite westing westland Westlander westlandways westmost westness Westphalian Westralian Westralianism westward westwardly westwardmost westwards westy wet weta wetback wetbird wetched wetchet wether wetherhog wetherteg wetly wetness wettability wettable wetted wetter wetting wettish Wetumpka weve wevet Wewenoc wey Wezen Wezn wha whabby whack whacker whacking whacky whafabout whale whaleback whalebacker whalebird whaleboat whalebone whaleboned whaledom whalehead whalelike whaleman whaler whaleroad whalery whaleship whaling whalish whally whalm whalp whaly wham whamble whame whammle whamp whampee whample whan whand whang whangable whangam whangdoodle whangee whanghee whank whap whappet whapuka whapukee whapuku whar whare whareer wharf wharfage wharfhead wharfholder wharfing wharfinger wharfland wharfless wharfman wharfmaster wharfrae wharfside wharl wharp wharry whart wharve whase whasle what whata whatabouts whatever whatkin whatlike whatna whatness whatnot whatreck whats whatso whatsoeer whatsoever whatsomever whatten whau whauk whaup whaur whauve wheal whealworm whealy wheam wheat wheatbird wheatear wheateared wheaten wheatgrower wheatland wheatless wheatlike wheatstalk wheatworm wheaty whedder whee wheedle wheedler wheedlesome wheedling wheedlingly wheel wheelage wheelband wheelbarrow wheelbarrowful wheelbird wheelbox wheeldom wheeled wheeler wheelery wheelhouse wheeling wheelingly wheelless wheellike wheelmaker wheelmaking wheelman wheelrace wheelroad wheelsman wheelsmith wheelspin wheelswarf wheelway wheelwise wheelwork wheelwright wheelwrighting wheely wheem wheen wheencat wheenge wheep wheeple wheer wheerikins wheesht wheetle wheeze wheezer wheezily wheeziness wheezingly wheezle wheezy wheft whein whekau wheki whelk whelked whelker whelklike whelky whelm whelp whelphood whelpish whelpless whelpling whelve whemmel when whenabouts whenas whence whenceeer whenceforth whenceforward whencesoeer whencesoever whencever wheneer whenever whenness whenso whensoever whensomever where whereabout whereabouts whereafter whereanent whereas whereat whereaway whereby whereer wherefor wherefore wherefrom wherein whereinsoever whereinto whereness whereof whereon whereout whereover whereso wheresoeer wheresoever wheresomever wherethrough wheretill whereto wheretoever wheretosoever whereunder whereuntil whereunto whereup whereupon wherever wherewith wherewithal wherret wherrit wherry wherryman whet whether whetile whetrock whetstone whetter whew whewellite whewer whewl whewt whey wheybeard wheyey wheyeyness wheyface wheyfaced wheyish wheyishness wheylike wheyness whiba which whichever whichsoever whichway whichways whick whicken whicker whid whidah whidder whiff whiffenpoof whiffer whiffet whiffle whiffler whifflery whiffletree whiffling whifflingly whiffy whift Whig whig Whiggamore whiggamore Whiggarchy Whiggery Whiggess Whiggification Whiggify Whiggish Whiggishly Whiggishness Whiggism Whiglet Whigling whigmaleerie whigship whikerby while whileen whilere whiles whilie whilk Whilkut whill whillaballoo whillaloo whillilew whilly whillywha whilock whilom whils whilst whilter whim whimberry whimble whimbrel whimling whimmy whimper whimperer whimpering whimperingly whimsey whimsic whimsical whimsicality whimsically whimsicalness whimsied whimstone whimwham whin whinberry whinchacker whinchat whincheck whincow whindle whine whiner whinestone whing whinge whinger whininess whiningly whinnel whinner whinnock whinny whinstone whiny whinyard whip whipbelly whipbird whipcat whipcord whipcordy whipcrack whipcracker whipcraft whipgraft whipjack whipking whiplash whiplike whipmaker whipmaking whipman whipmanship whipmaster whippa whippable whipparee whipped whipper whippersnapper whippertail whippet whippeter whippiness whipping whippingly whippletree whippoorwill whippost whippowill whippy whipsaw whipsawyer whipship whipsocket whipstaff whipstalk whipstall whipster whipstick whipstitch whipstock whipt whiptail whiptree whipwise whipworm whir whirken whirl whirlabout whirlblast whirlbone whirlbrain whirled whirler whirley whirlgig whirlicane whirligig whirlimagig whirling whirlingly whirlmagee whirlpool whirlpuff whirlwig whirlwind whirlwindish whirlwindy whirly whirlygigum whirret whirrey whirroo whirry whirtle whish whisk whisker whiskerage whiskerando whiskerandoed whiskered whiskerer whiskerette whiskerless whiskerlike whiskery whiskey whiskful whiskied whiskified whisking whiskingly whisky whiskyfied whiskylike whisp whisper whisperable whisperation whispered whisperer whisperhood whispering whisperingly whisperingness whisperless whisperous whisperously whisperproof whispery whissle Whisson whist whister whisterpoop whistle whistlebelly whistlefish whistlelike whistler Whistlerian whistlerism whistlewing whistlewood whistlike whistling whistlingly whistly whistness Whistonian Whit whit white whiteback whitebait whitebark whitebeard whitebelly whitebill whitebird whiteblaze whiteblow whitebottle Whiteboy Whiteboyism whitecap whitecapper Whitechapel whitecoat whitecomb whitecorn whitecup whited whiteface Whitefieldian Whitefieldism Whitefieldite whitefish whitefisher whitefishery Whitefoot whitefoot whitefootism whitehanded whitehass whitehawse whitehead whiteheart whitehearted whitelike whitely whiten whitener whiteness whitening whitenose whitepot whiteroot whiterump whites whitesark whiteseam whiteshank whiteside whitesmith whitestone whitetail whitethorn whitethroat whitetip whitetop whitevein whitewall whitewards whiteware whitewash whitewasher whiteweed whitewing whitewood whiteworm whitewort whitfinch whither whitherso whithersoever whitherto whitherward whiting whitish whitishness whitleather Whitleyism whitling whitlow whitlowwort Whitmanese Whitmanesque Whitmanism Whitmanize Whitmonday whitneyite whitrack whits whitster Whitsun Whitsunday Whitsuntide whittaw whitten whittener whitter whitterick whittle whittler whittling whittret whittrick whity whiz whizgig whizzer whizzerman whizziness whizzing whizzingly whizzle who whoa whodunit whoever whole wholehearted wholeheartedly wholeheartedness wholeness wholesale wholesalely wholesaleness wholesaler wholesome wholesomely wholesomeness wholewise wholly whom whomble whomever whomso whomsoever whone whoo whoof whoop whoopee whooper whooping whoopingly whooplike whoops whoosh whop whopper whopping whorage whore whoredom whorelike whoremaster whoremasterly whoremastery whoremonger whoremonging whoreship whoreson whorish whorishly whorishness whorl whorled whorlflower whorly whorlywort whort whortle whortleberry whose whosen whosesoever whosever whosomever whosumdever whud whuff whuffle whulk whulter whummle whun whunstane whup whush whuskie whussle whute whuther whutter whuttering whuz why whyever whyfor whyness whyo wi wice Wichita wicht wichtisite wichtje wick wickawee wicked wickedish wickedlike wickedly wickedness wicken wicker wickerby wickerware wickerwork wickerworked wickerworker wicket wicketkeep wicketkeeper wicketkeeping wicketwork wicking wickiup wickless wickup wicky wicopy wid widbin widdendream widder widdershins widdifow widdle widdy wide widegab widehearted widely widemouthed widen widener wideness widespread widespreadedly widespreadly widespreadness widewhere widework widgeon widish widow widowed widower widowered widowerhood widowership widowery widowhood widowish widowlike widowly widowman widowy width widthless widthway widthways widthwise widu wield wieldable wielder wieldiness wieldy wiener wienerwurst wienie wierangle wiesenboden wife wifecarl wifedom wifehood wifeism wifekin wifeless wifelessness wifelet wifelike wifeling wifelkin wifely wifeship wifeward wifie wifiekie wifish wifock wig wigan wigdom wigful wigged wiggen wigger wiggery wigging wiggish wiggishness wiggism wiggle wiggler wiggly wiggy wight wightly wightness wigless wiglet wiglike wigmaker wigmaking wigtail wigwag wigwagger wigwam wiikite Wikeno Wikstroemia Wilbur Wilburite wild wildbore wildcat wildcatter wildcatting wildebeest wilded wilder wilderedly wildering wilderment wilderness wildfire wildfowl wildgrave wilding wildish wildishly wildishness wildlife wildlike wildling wildly wildness wildsome wildwind wile wileful wileless wileproof Wilfred wilga wilgers Wilhelm Wilhelmina Wilhelmine wilily wiliness wilk wilkeite wilkin Wilkinson Will will willable willawa willed willedness willemite willer willet willey willeyer willful willfully willfulness William williamsite Williamsonia Williamsoniaceae Willie willie willier willies willing willinghearted willinghood willingly willingness williwaw willmaker willmaking willness willock willow willowbiter willowed willower willowish willowlike willowware willowweed willowworm willowwort willowy Willugbaeya Willy willy willyard willyart willyer Wilmer wilsome wilsomely wilsomeness Wilson Wilsonian wilt wilter Wilton wiltproof Wiltshire wily wim wimberry wimble wimblelike wimbrel wime wimick wimple wimpleless wimplelike Win win winberry wince wincer wincey winch wincher Winchester winchman wincing wincingly Wind wind windable windage windbag windbagged windbaggery windball windberry windbibber windbore windbracing windbreak Windbreaker windbreaker windbroach windclothes windcuffer winddog winded windedly windedness winder windermost Windesheimer windfall windfallen windfanner windfirm windfish windflaw windflower windgall windgalled windhole windhover windigo windily windiness winding windingly windingness windjammer windjamming windlass windlasser windle windles windless windlessly windlessness windlestrae windlestraw windlike windlin windling windmill windmilly windock windore window windowful windowless windowlessness windowlet windowlight windowlike windowmaker windowmaking windowman windowpane windowpeeper windowshut windowward windowwards windowwise windowy windpipe windplayer windproof windring windroad windroot windrow windrower windscreen windshield windshock Windsor windsorite windstorm windsucker windtight windup windward windwardly windwardmost windwardness windwards windway windwayward windwaywardly windy wine wineball wineberry winebibber winebibbery winebibbing Winebrennerian wineconner wined wineglass wineglassful winegrower winegrowing winehouse wineless winelike winemay winepot winer winery Winesap wineshop wineskin winesop winetaster winetree winevat Winfred winful wing wingable wingbeat wingcut winged wingedly wingedness winger wingfish winghanded wingle wingless winglessness winglet winglike wingman wingmanship wingpiece wingpost wingseed wingspread wingstem wingy Winifred winish wink winkel winkelman winker winkered winking winkingly winkle winklehawk winklehole winklet winly winna winnable winnard Winnebago Winnecowet winnel winnelstrae winner Winnie winning winningly winningness winnings winninish Winnipesaukee winnle winnonish winnow winnower winnowing winnowingly Winona winrace winrow winsome winsomely winsomeness Winston wint winter Winteraceae winterage Winteranaceae winterberry winterbloom winterbourne winterdykes wintered winterer winterfeed wintergreen winterhain wintering winterish winterishly winterishness winterization winterize winterkill winterkilling winterless winterlike winterliness winterling winterly winterproof wintersome wintertide wintertime winterward winterwards winterweed wintle wintrify wintrily wintriness wintrish wintrous wintry Wintun winy winze winzeman wipe wiper wippen wips wir wirable wirble wird wire wirebar wirebird wired wiredancer wiredancing wiredraw wiredrawer wiredrawn wirehair wireless wirelessly wirelessness wirelike wiremaker wiremaking wireman wiremonger Wirephoto wirepull wirepuller wirepulling wirer wiresmith wirespun wiretail wireway wireweed wirework wireworker wireworking wireworks wireworm wirily wiriness wiring wirl wirling Wiros wirr wirra wirrah wirrasthru wiry wis Wisconsinite wisdom wisdomful wisdomless wisdomproof wisdomship wise wiseacre wiseacred wiseacredness wiseacredom wiseacreish wiseacreishness wiseacreism wisecrack wisecracker wisecrackery wisehead wisehearted wiseheartedly wiseheimer wiselike wiseling wisely wiseman wisen wiseness wisenheimer wisent wiser wiseweed wisewoman wish wisha wishable wishbone wished wishedly wisher wishful wishfully wishfulness wishing wishingly wishless wishly wishmay wishness Wishoskan Wishram wisht wishtonwish Wisigothic wisket wiskinky wisp wispish wisplike wispy wiss wisse wissel wist Wistaria wistaria wiste wistened Wisteria wisteria wistful wistfully wistfulness wistit wistiti wistless wistlessness wistonwish wit witan Witbooi witch witchbells witchcraft witched witchedly witchen witchering witchery witchet witchetty witchhood witching witchingly witchleaf witchlike witchman witchmonger witchuck witchweed witchwife witchwoman witchwood witchwork witchy witcraft wite witeless witenagemot witepenny witess witful with withal withamite Withania withdraught withdraw withdrawable withdrawal withdrawer withdrawing withdrawingness withdrawment withdrawn withdrawnness withe withen wither witherband withered witheredly witheredness witherer withergloom withering witheringly witherite witherly withernam withers withershins withertip witherwards witherweight withery withewood withheld withhold withholdable withholdal withholder withholdment within withindoors withinside withinsides withinward withinwards withness witholden without withoutdoors withouten withoutforth withoutside withoutwards withsave withstand withstander withstandingness withstay withstood withstrain withvine withwind withy withypot withywind witjar witless witlessly witlessness witlet witling witloof witmonger witness witnessable witnessdom witnesser witney witneyer Witoto witship wittal wittawer witteboom witted witter wittering witticaster wittichenite witticism witticize wittified wittily wittiness witting wittingly wittol wittolly witty Witumki witwall witzchoura wive wiver wivern Wiyat Wiyot wiz wizard wizardess wizardism wizardlike wizardly wizardry wizardship wizen wizened wizenedness wizier wizzen wloka wo woad woader woadman woadwaxen woady woak woald woan wob wobbegong wobble wobbler wobbliness wobbling wobblingly wobbly wobster wocheinite Wochua wod woddie wode Wodenism wodge wodgy woe woebegone woebegoneness woebegonish woeful woefully woefulness woehlerite woesome woevine woeworn woffler woft wog wogiet Wogulian woibe wokas woke wokowi wold woldlike woldsman woldy Wolf wolf wolfachite wolfberry wolfdom wolfen wolfer Wolffia Wolffian Wolffianism Wolfgang wolfhood wolfhound Wolfian wolfish wolfishly wolfishness wolfkin wolfless wolflike wolfling wolfram wolframate wolframic wolframine wolframinium wolframite wolfsbane wolfsbergite wolfskin wolfward wolfwards wollastonite wollomai wollop Wolof wolter wolve wolveboon wolver wolverine woman womanbody womandom womanfolk womanfully womanhead womanhearted womanhood womanhouse womanish womanishly womanishness womanism womanist womanity womanization womanize womanizer womankind womanless womanlike womanliness womanly womanmuckle womanness womanpost womanproof womanship womanways womanwise womb wombat wombed womble wombstone womby womenfolk womenfolks womenkind womera wommerala won wonder wonderberry wonderbright wondercraft wonderer wonderful wonderfully wonderfulness wondering wonderingly wonderland wonderlandish wonderless wonderment wondermonger wondermongering wondersmith wondersome wonderstrong wonderwell wonderwork wonderworthy wondrous wondrously wondrousness wone wonegan wong wonga Wongara wongen wongshy wongsky woning wonky wonna wonned wonner wonning wonnot wont wonted wontedly wontedness wonting woo wooable wood woodagate woodbark woodbin woodbind woodbine woodbined woodbound woodburytype woodbush woodchat woodchuck woodcock woodcockize woodcracker woodcraft woodcrafter woodcraftiness woodcraftsman woodcrafty woodcut woodcutter woodcutting wooded wooden woodendite woodenhead woodenheaded woodenheadedness woodenly woodenness woodenware woodenweary woodeny woodfish woodgeld woodgrub woodhack woodhacker woodhole woodhorse woodhouse woodhung woodine woodiness wooding woodish woodjobber woodkern woodknacker woodland woodlander woodless woodlessness woodlet woodlike woodlocked woodly woodman woodmancraft woodmanship woodmonger woodmote woodness woodpeck woodpecker woodpenny woodpile woodprint woodranger woodreeve woodrick woodrock woodroof woodrow woodrowel Woodruff woodruff woodsere woodshed woodshop Woodsia woodside woodsilver woodskin woodsman woodspite woodstone woodsy woodwall woodward Woodwardia woodwardship woodware woodwax woodwaxen woodwise woodwork woodworker woodworking woodworm woodwose woodwright Woody woody woodyard wooer woof woofed woofell woofer woofy woohoo wooing wooingly wool woold woolder woolding wooled woolen woolenet woolenization woolenize wooler woolert woolfell woolgatherer woolgathering woolgrower woolgrowing woolhead wooliness woollike woolly woollyhead woollyish woolman woolpack woolpress woolsack woolsey woolshearer woolshearing woolshears woolshed woolskin woolsorter woolsorting woolsower woolstock woolulose Woolwa woolwasher woolweed woolwheel woolwinder woolwork woolworker woolworking woom woomer woomerang woon woons woorali woorari woosh wootz woozle woozy wop woppish wops worble worcester word wordable wordably wordage wordbook wordbuilding wordcraft wordcraftsman worded Worden worder wordily wordiness wording wordish wordishly wordishness wordle wordless wordlessly wordlessness wordlike wordlorist wordmaker wordmaking wordman wordmanship wordmonger wordmongering wordmongery wordplay wordsman wordsmanship wordsmith wordspite wordster Wordsworthian Wordsworthianism wordy wore work workability workable workableness workaday workaway workbag workbasket workbench workbook workbox workbrittle workday worked worker workfellow workfolk workfolks workgirl workhand workhouse workhoused working workingly workingman workingwoman workless worklessness workloom workman workmanlike workmanlikeness workmanliness workmanly workmanship workmaster workmistress workout workpan workpeople workpiece workplace workroom works workship workshop worksome workstand worktable worktime workways workwise workwoman workwomanlike workwomanly worky workyard world worlded worldful worldish worldless worldlet worldlike worldlily worldliness worldling worldly worldmaker worldmaking worldproof worldquake worldward worldwards worldway worldy worm wormed wormer wormhole wormholed wormhood Wormian wormil worming wormless wormlike wormling wormproof wormroot wormseed wormship wormweed wormwood wormy worn wornil wornness worral worriable worricow worried worriedly worriedness worrier worriless worriment worrisome worrisomely worrisomeness worrit worriter worry worrying worryingly worryproof worrywart worse worsement worsen worseness worsening worser worserment worset worship worshipability worshipable worshiper worshipful worshipfully worshipfulness worshipingly worshipless worshipworth worshipworthy worst worsted wort worth worthful worthfulness worthiest worthily worthiness worthless worthlessly worthlessness worthship worthward worthy wosbird wot wote wots wottest wotteth woubit wouch wouf wough would wouldest wouldnt wouldst wound woundability woundable woundableness wounded woundedly wounder woundily wounding woundingly woundless wounds woundwort woundworth woundy wourali wourari wournil wove woven Wovoka wow wowser wowserdom wowserian wowserish wowserism wowsery wowt woy Woyaway wrack wracker wrackful Wraf wraggle wrainbolt wrainstaff wrainstave wraith wraithe wraithlike wraithy wraitly wramp wran wrang wrangle wrangler wranglership wranglesome wranglingly wrannock wranny wrap wrappage wrapped wrapper wrapperer wrappering wrapping wraprascal wrasse wrastle wrastler wrath wrathful wrathfully wrathfulness wrathily wrathiness wrathlike wrathy wraw wrawl wrawler wraxle wreak wreakful wreakless wreat wreath wreathage wreathe wreathed wreathen wreather wreathingly wreathless wreathlet wreathlike wreathmaker wreathmaking wreathwise wreathwork wreathwort wreathy wreck wreckage wrecker wreckfish wreckful wrecking wrecky Wren wren wrench wrenched wrencher wrenchingly wrenlet wrenlike wrentail wrest wrestable wrester wresting wrestingly wrestle wrestler wrestlerlike wrestling wretch wretched wretchedly wretchedness wretchless wretchlessly wretchlessness wretchock wricht wrick wride wried wrier wriest wrig wriggle wriggler wrigglesome wrigglingly wriggly wright wrightine wring wringbolt wringer wringman wringstaff wrinkle wrinkleable wrinkled wrinkledness wrinkledy wrinkleful wrinkleless wrinkleproof wrinklet wrinkly wrist wristband wristbone wristed wrister wristfall wristikin wristlet wristlock wristwork writ writability writable writation writative write writeable writee writer writeress writerling writership writh writhe writhed writhedly writhedness writhen writheneck writher writhing writhingly writhy writing writinger writmaker writmaking writproof written writter wrive wrizzled wro wrocht wroke wroken wrong wrongdoer wrongdoing wronged wronger wrongful wrongfully wrongfulness wronghead wrongheaded wrongheadedly wrongheadedness wronghearted wrongheartedly wrongheartedness wrongish wrongless wronglessly wrongly wrongness wrongous wrongously wrongousness wrongwise Wronskian wrossle wrote wroth wrothful wrothfully wrothily wrothiness wrothly wrothsome wrothy wrought wrox wrung wrungness wry wrybill wryly wrymouth wryneck wryness wrytail Wu Wuchereria wud wuddie wudge wudu wugg wulfenite wulk wull wullawins wullcat Wullie wulliwa wumble wumman wummel wun Wundtian wungee wunna wunner wunsome wup wur wurley wurmal Wurmian wurrus wurset wurtzilite wurtzite Wurzburger wurzel wush wusp wuss wusser wust wut wuther wuzu wuzzer wuzzle wuzzy wy Wyandot Wyandotte Wycliffian Wycliffism Wycliffist Wycliffite wyde wye Wyethia wyke Wykehamical Wykehamist wyle wyliecoat wymote wyn wynd wyne wynkernel wynn Wyomingite wyomingite wype wyson wyss wyve wyver X x xanthaline xanthamic xanthamide xanthane xanthate xanthation xanthein xanthelasma xanthelasmic xanthelasmoidea xanthene Xanthian xanthic xanthide Xanthidium xanthin xanthine xanthinuria xanthione Xanthisma xanthite Xanthium xanthiuria xanthocarpous Xanthocephalus Xanthoceras Xanthochroi xanthochroia Xanthochroic xanthochroid xanthochroism xanthochromia xanthochromic xanthochroous xanthocobaltic xanthocone xanthoconite xanthocreatinine xanthocyanopsia xanthocyanopsy xanthocyanopy xanthoderm xanthoderma xanthodont xanthodontous xanthogen xanthogenamic xanthogenamide xanthogenate xanthogenic xantholeucophore xanthoma xanthomata xanthomatosis xanthomatous Xanthomelanoi xanthomelanous xanthometer Xanthomonas xanthomyeloma xanthone xanthophane xanthophore xanthophose Xanthophyceae xanthophyll xanthophyllite xanthophyllous Xanthopia xanthopia xanthopicrin xanthopicrite xanthoproteic xanthoprotein xanthoproteinic xanthopsia xanthopsin xanthopsydracia xanthopterin xanthopurpurin xanthorhamnin Xanthorrhiza Xanthorrhoea xanthorrhoea xanthosiderite xanthosis Xanthosoma xanthospermous xanthotic Xanthoura xanthous Xanthoxalis xanthoxenite xanthoxylin xanthuria xanthydrol xanthyl xarque Xaverian xebec Xema xenacanthine Xenacanthini xenagogue xenagogy Xenarchi Xenarthra xenarthral xenarthrous xenelasia xenelasy xenia xenial xenian Xenicidae Xenicus xenium xenobiosis xenoblast Xenocratean Xenocratic xenocryst xenodochium xenogamous xenogamy xenogenesis xenogenetic xenogenic xenogenous xenogeny xenolite xenolith xenolithic xenomania xenomaniac Xenomi Xenomorpha xenomorphic xenomorphosis xenon xenoparasite xenoparasitism xenopeltid Xenopeltidae Xenophanean xenophile xenophilism xenophobe xenophobia xenophobian xenophobism xenophoby Xenophonic Xenophontean Xenophontian Xenophontic Xenophontine Xenophora xenophoran Xenophoridae xenophthalmia xenophya xenopodid Xenopodidae xenopodoid Xenopsylla xenopteran Xenopteri xenopterygian Xenopterygii Xenopus Xenorhynchus Xenos xenosaurid Xenosauridae xenosauroid Xenosaurus xenotime Xenurus xenyl xenylamine xerafin xeransis Xeranthemum xeranthemum xerantic xerarch xerasia Xeres xeric xerically xeriff xerocline xeroderma xerodermatic xerodermatous xerodermia xerodermic xerogel xerography xeroma xeromata xeromenia xeromorph xeromorphic xeromorphous xeromorphy xeromyron xeromyrum xeronate xeronic xerophagia xerophagy xerophil xerophile xerophilous xerophily xerophobous xerophthalmia xerophthalmos xerophthalmy Xerophyllum xerophyte xerophytic xerophytically xerophytism xeroprinting xerosis xerostoma xerostomia xerotes xerotherm xerotic xerotocia xerotripsis Xerus xi Xicak Xicaque Ximenia Xina Xinca Xipe Xiphias xiphias xiphihumeralis xiphiid Xiphiidae xiphiiform xiphioid xiphiplastra xiphiplastral xiphiplastron xiphisterna xiphisternal xiphisternum Xiphisura xiphisuran Xiphiura Xiphius xiphocostal Xiphodon Xiphodontidae xiphodynia xiphoid xiphoidal xiphoidian xiphopagic xiphopagous xiphopagus xiphophyllous xiphosterna xiphosternum Xiphosura xiphosuran xiphosure Xiphosuridae xiphosurous Xiphosurus xiphuous Xiphura Xiphydria xiphydriid Xiphydriidae Xiraxara Xmas xoana xoanon Xosa xurel xyla xylan Xylaria Xylariaceae xylate Xyleborus xylem xylene xylenol xylenyl xyletic Xylia xylic xylidic xylidine Xylina xylindein xylinid xylite xylitol xylitone xylobalsamum xylocarp xylocarpous Xylocopa xylocopid Xylocopidae xylogen xyloglyphy xylograph xylographer xylographic xylographical xylographically xylography xyloid xyloidin xylol xylology xyloma xylomancy xylometer xylon xylonic Xylonite xylonitrile Xylophaga xylophagan xylophage xylophagid Xylophagidae xylophagous Xylophagus xylophilous xylophone xylophonic xylophonist Xylopia xyloplastic xylopyrography xyloquinone xylorcin xylorcinol xylose xyloside Xylosma xylostroma xylostromata xylostromatoid xylotile xylotomist xylotomous xylotomy Xylotrya xylotypographic xylotypography xyloyl xylyl xylylene xylylic xyphoid Xyrichthys xyrid Xyridaceae xyridaceous Xyridales Xyris xyst xyster xysti xystos xystum xystus Y y ya yaba yabber yabbi yabble yabby yabu yacal yacca yachan yacht yachtdom yachter yachting yachtist yachtman yachtmanship yachtsman yachtsmanlike yachtsmanship yachtswoman yachty yad Yadava yade yaff yaffingale yaffle yagger yaghourt yagi Yagnob yagourundi Yagua yagua yaguarundi yaguaza yah yahan Yahgan Yahganan Yahoo yahoo Yahoodom Yahooish Yahooism Yahuna Yahuskin Yahweh Yahwism Yahwist Yahwistic yair yaird yaje yajeine yajenine Yajna Yajnavalkya yajnopavita yak Yaka Yakala yakalo yakamik Yakan yakattalo Yakima yakin yakka yakman Yakona Yakonan Yakut Yakutat yalb Yale yale Yalensian yali yalla yallaer yallow yam Yamacraw Yamamadi yamamai yamanai yamaskite Yamassee Yamato Yamel yamen Yameo yamilke yammadji yammer yamp yampa yamph yamshik yamstchik yan Yana Yanan yancopin yander yang yangtao yank Yankee Yankeedom Yankeefy Yankeeism Yankeeist Yankeeize Yankeeland Yankeeness yanking Yankton Yanktonai yanky Yannigan Yao yaoort yaourti yap yapa yaply Yapman yapness yapok yapp yapped yapper yappiness yapping yappingly yappish yappy yapster Yaqui Yaquina yar yarak yaray yarb Yarborough yard yardage yardang yardarm yarder yardful yarding yardkeep yardland yardman yardmaster yardsman yardstick yardwand yare yareta yark Yarkand yarke yarl yarly yarm yarn yarnen yarner yarnwindle yarpha yarr yarraman yarran yarringle yarrow yarth yarthen Yaru Yarura Yaruran Yaruro yarwhelp yarwhip yas yashiro yashmak Yasht Yasna yat yataghan yatalite yate yati Yatigan yatter Yatvyag Yauapery yaud yauld yaupon yautia yava Yavapai yaw yawl yawler yawlsman yawmeter yawn yawner yawney yawnful yawnfully yawnily yawniness yawning yawningly yawnproof yawnups yawny yawp yawper yawroot yaws yawweed yawy yaxche yaya Yazdegerdian Yazoo ycie yday ye yea yeah yealing yean yeanling year yeara yearbird yearbook yeard yearday yearful yearling yearlong yearly yearn yearnful yearnfully yearnfulness yearning yearnling yearock yearth yeast yeastily yeastiness yeasting yeastlike yeasty yeat yeather yed yede yee yeel yeelaman yees yegg yeggman yeguita yeld yeldrin yeldrock yelk yell yeller yelling yelloch yellow yellowammer yellowback yellowbelly yellowberry yellowbill yellowbird yellowcrown yellowcup yellowfin yellowfish yellowhammer yellowhead yellowing yellowish yellowishness Yellowknife yellowlegs yellowly yellowness yellowroot yellowrump yellows yellowseed yellowshank yellowshanks yellowshins yellowtail yellowthorn yellowthroat yellowtop yellowware yellowweed yellowwood yellowwort yellowy yelm yelmer yelp yelper yelt Yemen Yemeni Yemenic Yemenite yen yender Yengee Yengeese yeni Yenisei Yeniseian yenite yentnite yeo yeoman yeomaness yeomanette yeomanhood yeomanlike yeomanly yeomanry yeomanwise yeorling yeowoman yep yer Yerava Yeraver yerb yerba yercum yerd yere yerga yerk yern yerth yes yese Yeshibah Yeshiva yeso yesso yest yester yesterday yestereve yestereven yesterevening yestermorn yestermorning yestern yesternight yesternoon yesterweek yesteryear yestreen yesty yet yeta yetapa yeth yether yetlin yeuk yeukieness yeuky yeven yew yex yez Yezdi Yezidi yezzy ygapo Yid Yiddish Yiddisher Yiddishism Yiddishist yield yieldable yieldableness yieldance yielden yielder yielding yieldingly yieldingness yieldy yigh Yikirgaulit Yildun yill yilt Yin yin yince yinst yip yird yirk yirm yirmilik yirn yirr yirth yis yite ym yn ynambu yo yobi yocco yochel yock yockel yodel yodeler yodelist yodh yoe yoga yogasana yogh yoghurt yogi yogin yogism yogist yogoite yohimbe yohimbi yohimbine yohimbinization yohimbinize yoi yoick yoicks yojan yojana Yojuane yok yoke yokeable yokeableness yokeage yokefellow yokel yokeldom yokeless yokelish yokelism yokelry yokemate yokemating yoker yokewise yokewood yoking Yokuts yoky yolden Yoldia yoldring yolk yolked yolkiness yolkless yolky yom yomer Yomud yon yoncopin yond yonder Yonkalla yonner yonside yont yook yoop yor yore yoretime york Yorker yorker Yorkish Yorkist Yorkshire Yorkshireism Yorkshireman Yoruba Yoruban yot yotacism yotacize yote you youd youden youdendrift youdith youff youl young youngberry younger younghearted youngish younglet youngling youngly youngness youngster youngun younker youp your yourn yours yoursel yourself yourselves youse youth youthen youthful youthfullity youthfully youthfulness youthhead youthheid youthhood youthily youthless youthlessness youthlike youthlikeness youthsome youthtide youthwort youthy youve youward youwards youze yoven yow yowie yowl yowler yowley yowlring yowt yox yoy yperite Yponomeuta Yponomeutid Yponomeutidae ypsiliform ypsiloid Ypurinan Yquem yr ytterbia ytterbic ytterbium yttria yttrialite yttric yttriferous yttrious yttrium yttrocerite yttrocolumbite yttrocrasite yttrofluorite yttrogummite yttrotantalite Yuan yuan Yuapin yuca Yucatec Yucatecan Yucateco Yucca yucca Yuchi yuck yuckel yucker yuckle yucky Yuechi yuft Yuga yugada Yugoslav Yugoslavian Yugoslavic yuh Yuit Yukaghir Yuki Yukian yukkel yulan yule yuleblock yuletide Yuma Yuman yummy Yun Yunca Yuncan yungan Yunnanese Yurak Yurok yurt yurta Yurucare Yurucarean Yurucari Yurujure Yuruk Yuruna Yurupary yus yusdrum Yustaga yutu yuzlik yuzluk Yvonne Z z za Zabaean zabaglione Zabaism Zaberma zabeta Zabian Zabism zabra zabti zabtie zac zacate Zacatec Zacateco zacaton Zach Zachariah zachun zad Zadokite zadruga zaffar zaffer zafree zag zagged Zaglossus zaibatsu zain Zaitha zak zakkeu Zaklohpakap zalambdodont Zalambdodonta Zalophus zaman zamang zamarra zamarro Zambal Zambezian zambo zamboorak Zamenis Zamia Zamiaceae Zamicrus zamindar zamindari zamorin zamouse Zan Zanclidae Zanclodon Zanclodontidae Zande zander zandmole zanella Zaniah Zannichellia Zannichelliaceae Zanonia zant zante Zantedeschia zantewood Zanthorrhiza Zanthoxylaceae Zanthoxylum zanthoxylum Zantiot zantiote zany zanyish zanyism zanyship Zanzalian zanze Zanzibari Zapara Zaparan Zaparo Zaparoan zapas zapatero zaphara Zaphetic zaphrentid Zaphrentidae Zaphrentis zaphrentoid Zapodidae Zapodinae Zaporogian Zaporogue zapota Zapotec Zapotecan Zapoteco zaptiah zaptieh Zaptoeca zapupe Zapus zaqqum Zaque zar zarabanda Zaramo Zarathustrian Zarathustrianism Zarathustrism zaratite Zardushti zareba Zarema zarf zarnich zarp zarzuela zat zati zattare Zaurak Zauschneria Zavijava zax zayat zayin Zea zeal Zealander zealful zealless zeallessness zealot zealotic zealotical zealotism zealotist zealotry zealous zealously zealousness zealousy zealproof zebra zebraic zebralike zebrass zebrawood Zebrina zebrine zebrinny zebroid zebrula zebrule zebu zebub Zebulunite zeburro zecchini zecchino zechin Zechstein zed zedoary zee zeed Zeelander Zeguha zehner Zeidae zein zeism zeist Zeke zel Zelanian zelator zelatrice zelatrix Zelkova Zeltinger zemeism zemi zemimdari zemindar zemmi zemni zemstroist zemstvo Zen Zenaga Zenaida Zenaidinae Zenaidura zenana Zend Zendic zendician zendik zendikite Zenelophon zenick zenith zenithal zenithward zenithwards Zenobia zenocentric zenographic zenographical zenography Zenonian Zenonic zenu Zeoidei zeolite zeolitic zeolitization zeolitize zeoscope Zep zepharovichite zephyr Zephyranthes zephyrean zephyrless zephyrlike zephyrous zephyrus zephyry Zeppelin zeppelin zequin zer zerda Zerma zermahbub zero zeroaxial zeroize zerumbet zest zestful zestfully zestfulness zesty zeta zetacism zetetic Zeuctocoelomata zeuctocoelomatic zeuctocoelomic Zeuglodon zeuglodon zeuglodont Zeuglodonta Zeuglodontia Zeuglodontidae zeuglodontoid zeugma zeugmatic zeugmatically Zeugobranchia Zeugobranchiata zeunerite Zeus Zeuxian Zeuzera zeuzerian Zeuzeridae Zhmud ziamet ziara ziarat zibeline zibet zibethone zibetone zibetum ziega zieger zietrisikite ziffs zig ziganka ziggurat zigzag zigzagged zigzaggedly zigzaggedness zigzagger zigzaggery zigzaggy zigzagwise zihar zikurat Zilla zillah zimarra zimb zimbabwe zimbalon zimbaloon zimbi zimentwater zimme Zimmerwaldian Zimmerwaldist zimmi zimmis zimocca zinc Zincalo zincate zincic zincide zinciferous zincification zincify zincing zincite zincize zincke zincky zinco zincograph zincographer zincographic zincographical zincography zincotype zincous zincum zincuret zinfandel zing zingaresca zingel zingerone Zingiber Zingiberaceae zingiberaceous zingiberene zingiberol zingiberone zink zinkenite Zinnia zinnwaldite zinsang zinyamunga Zinzar Zinziberaceae zinziberaceous Zion Zionism Zionist Zionistic Zionite Zionless Zionward zip Zipa ziphian Ziphiidae Ziphiinae ziphioid Ziphius Zipper zipper zipping zippingly zippy Zips zira zirai Zirak Zirbanit zircite zircofluoride zircon zirconate zirconia zirconian zirconic zirconiferous zirconifluoride zirconium zirconofluoride zirconoid zirconyl Zirian Zirianian zirkelite zither zitherist Zizania Zizia Zizyphus zizz zloty Zmudz zo Zoa zoa zoacum Zoanthacea zoanthacean Zoantharia zoantharian zoanthid Zoanthidae Zoanthidea zoanthodeme zoanthodemic zoanthoid zoanthropy Zoanthus Zoarces zoarcidae zoaria zoarial Zoarite zoarium zobo zobtenite zocco zoccolo zodiac zodiacal zodiophilous zoea zoeaform zoeal zoeform zoehemera zoehemerae zoetic zoetrope zoetropic zogan zogo Zohak Zoharist Zoharite zoiatria zoiatrics zoic zoid zoidiophilous zoidogamous Zoilean Zoilism Zoilist zoisite zoisitization zoism zoist zoistic zokor Zolaesque Zolaism Zolaist Zolaistic Zolaize zoll zolle Zollernia zollpfund zolotink zolotnik zombi zombie zombiism zomotherapeutic zomotherapy zonal zonality zonally zonar Zonaria zonary zonate zonated zonation zone zoned zoneless zonelet zonelike zonesthesia Zongora zonic zoniferous zoning zonite Zonites zonitid Zonitidae Zonitoides zonochlorite zonociliate zonoid zonolimnetic zonoplacental Zonoplacentalia zonoskeleton Zonotrichia Zonta Zontian zonular zonule zonulet zonure zonurid Zonuridae zonuroid Zonurus zoo zoobenthos zooblast zoocarp zoocecidium zoochemical zoochemistry zoochemy Zoochlorella zoochore zoocoenocyte zoocultural zooculture zoocurrent zoocyst zoocystic zoocytial zoocytium zoodendria zoodendrium zoodynamic zoodynamics zooecia zooecial zooecium zooerastia zooerythrin zoofulvin zoogamete zoogamous zoogamy zoogene zoogenesis zoogenic zoogenous zoogeny zoogeographer zoogeographic zoogeographical zoogeographically zoogeography zoogeological zoogeologist zoogeology zoogloea zoogloeal zoogloeic zoogonic zoogonidium zoogonous zoogony zoograft zoografting zoographer zoographic zoographical zoographically zoographist zoography zooid zooidal zooidiophilous zooks zoolater zoolatria zoolatrous zoolatry zoolite zoolith zoolithic zoolitic zoologer zoologic zoological zoologically zoologicoarchaeologist zoologicobotanical zoologist zoologize zoology zoom zoomagnetic zoomagnetism zoomancy zoomania zoomantic zoomantist Zoomastigina Zoomastigoda zoomechanical zoomechanics zoomelanin zoometric zoometry zoomimetic zoomimic zoomorph zoomorphic zoomorphism zoomorphize zoomorphy zoon zoonal zoonerythrin zoonic zoonist zoonite zoonitic zoonomia zoonomic zoonomical zoonomist zoonomy zoonosis zoonosologist zoonosology zoonotic zoons zoonule zoopaleontology zoopantheon zooparasite zooparasitic zoopathological zoopathologist zoopathology zoopathy zooperal zooperist zoopery Zoophaga zoophagan Zoophagineae zoophagous zoopharmacological zoopharmacy zoophile zoophilia zoophilic zoophilism zoophilist zoophilite zoophilitic zoophilous zoophily zoophobia zoophobous zoophoric zoophorus zoophysical zoophysics zoophysiology Zoophyta zoophytal zoophyte zoophytic zoophytical zoophytish zoophytography zoophytoid zoophytological zoophytologist zoophytology zooplankton zooplanktonic zooplastic zooplasty zoopraxiscope zoopsia zoopsychological zoopsychologist zoopsychology zooscopic zooscopy zoosis zoosmosis zoosperm zoospermatic zoospermia zoospermium zoosphere zoosporange zoosporangia zoosporangial zoosporangiophore zoosporangium zoospore zoosporic zoosporiferous zoosporocyst zoosporous zootaxy zootechnic zootechnics zootechny zooter zoothecia zoothecial zoothecium zootheism zootheist zootheistic zootherapy zoothome zootic Zootoca zootomic zootomical zootomically zootomist zootomy zoototemism zootoxin zootrophic zootrophy zootype zootypic zooxanthella zooxanthellae zooxanthin zoozoo zopilote Zoque Zoquean Zoraptera zorgite zoril zorilla Zorillinae zorillo Zoroastrian Zoroastrianism Zoroastrism Zorotypus zorrillo zorro Zosma zoster Zostera Zosteraceae zosteriform Zosteropinae Zosterops Zouave zounds zowie Zoysia Zubeneschamali zuccarino zucchetto zucchini zudda zugtierlast zugtierlaster zuisin Zuleika Zulhijjah Zulinde Zulkadah Zulu Zuludom Zuluize zumatic zumbooruk Zuni Zunian zunyite zupanate Zutugil zuurveldt zuza zwanziger Zwieback zwieback Zwinglian Zwinglianism Zwinglianist zwitter zwitterion zwitterionic zyga zygadenine Zygadenus Zygaena zygaenid Zygaenidae zygal zygantra zygantrum zygapophyseal zygapophysis zygion zygite Zygnema Zygnemaceae Zygnemales Zygnemataceae zygnemataceous Zygnematales zygobranch Zygobranchia Zygobranchiata zygobranchiate Zygocactus zygodactyl Zygodactylae Zygodactyli zygodactylic zygodactylism zygodactylous zygodont zygolabialis zygoma zygomata zygomatic zygomaticoauricular zygomaticoauricularis zygomaticofacial zygomaticofrontal zygomaticomaxillary zygomaticoorbital zygomaticosphenoid zygomaticotemporal zygomaticum zygomaticus zygomaxillare zygomaxillary zygomorphic zygomorphism zygomorphous zygomycete Zygomycetes zygomycetous zygon zygoneure zygophore zygophoric Zygophyceae zygophyceous Zygophyllaceae zygophyllaceous Zygophyllum zygophyte zygopleural Zygoptera Zygopteraceae zygopteran zygopterid Zygopterides Zygopteris zygopteron zygopterous Zygosaccharomyces zygose zygosis zygosperm zygosphenal zygosphene zygosphere zygosporange zygosporangium zygospore zygosporic zygosporophore zygostyle zygotactic zygotaxis zygote zygotene zygotic zygotoblast zygotoid zygotomere zygous zygozoospore zymase zyme zymic zymin zymite zymogen zymogene zymogenesis zymogenic zymogenous zymoid zymologic zymological zymologist zymology zymolyis zymolysis zymolytic zymome zymometer zymomin zymophore zymophoric zymophosphate zymophyte zymoplastic zymoscope zymosimeter zymosis zymosterol zymosthenic zymotechnic zymotechnical zymotechnics zymotechny zymotic zymotically zymotize zymotoxic zymurgy Zyrenian Zyrian Zyryan zythem Zythia zythum Zyzomys Zyzzogeton ================================================ FILE: strings/z_function.py ================================================ """ https://cp-algorithms.com/string/z-function.html Z-function or Z algorithm Efficient algorithm for pattern occurrence in a string Time Complexity: O(n) - where n is the length of the string """ def z_function(input_str: str) -> list[int]: """ For the given string this function computes value for each index, which represents the maximal length substring starting from the index and is the same as the prefix of the same size e.x. for string 'abab' for second index value would be 2 For the value of the first element the algorithm always returns 0 >>> z_function("abracadabra") [0, 0, 0, 1, 0, 1, 0, 4, 0, 0, 1] >>> z_function("aaaa") [0, 3, 2, 1] >>> z_function("zxxzxxz") [0, 0, 0, 4, 0, 0, 1] """ z_result = [0 for i in range(len(input_str))] # initialize interval's left pointer and right pointer left_pointer, right_pointer = 0, 0 for i in range(1, len(input_str)): # case when current index is inside the interval if i <= right_pointer: min_edge = min(right_pointer - i + 1, z_result[i - left_pointer]) z_result[i] = min_edge while go_next(i, z_result, input_str): z_result[i] += 1 # if new index's result gives us more right interval, # we've to update left_pointer and right_pointer if i + z_result[i] - 1 > right_pointer: left_pointer, right_pointer = i, i + z_result[i] - 1 return z_result def go_next(i: int, z_result: list[int], s: str) -> bool: """ Check if we have to move forward to the next characters or not """ return i + z_result[i] < len(s) and s[z_result[i]] == s[i + z_result[i]] def find_pattern(pattern: str, input_str: str) -> int: """ Example of using z-function for pattern occurrence Given function returns the number of times 'pattern' appears in 'input_str' as a substring >>> find_pattern("abr", "abracadabra") 2 >>> find_pattern("a", "aaaa") 4 >>> find_pattern("xz", "zxxzxxz") 2 """ answer = 0 # concatenate 'pattern' and 'input_str' and call z_function # with concatenated string z_result = z_function(pattern + input_str) for val in z_result: # if value is greater then length of the pattern string # that means this index is starting position of substring # which is equal to pattern string if val >= len(pattern): answer += 1 return answer if __name__ == "__main__": import doctest doctest.testmod() ================================================ FILE: web_programming/__init__.py ================================================ ================================================ FILE: web_programming/co2_emission.py ================================================ """ Get CO2 emission data from the UK CarbonIntensity API """ # /// script # requires-python = ">=3.13" # dependencies = [ # "httpx", # ] # /// from datetime import date import httpx BASE_URL = "https://api.carbonintensity.org.uk/intensity" # Emission in the last half hour def fetch_last_half_hour() -> str: last_half_hour = httpx.get(BASE_URL, timeout=10).json()["data"][0] return last_half_hour["intensity"]["actual"] # Emissions in a specific date range def fetch_from_to(start, end) -> list: return httpx.get(f"{BASE_URL}/{start}/{end}", timeout=10).json()["data"] if __name__ == "__main__": for entry in fetch_from_to(start=date(2020, 10, 1), end=date(2020, 10, 3)): print("from {from} to {to}: {intensity[actual]}".format(**entry)) print(f"{fetch_last_half_hour() = }") ================================================ FILE: web_programming/covid_stats_via_xpath.py ================================================ """ This script demonstrates fetching simple COVID-19 statistics from the Worldometers archive site using lxml. lxml is chosen over BeautifulSoup for its speed and convenience in Python web projects (such as Django or Flask). """ # /// script # requires-python = ">=3.13" # dependencies = [ # "httpx", # "lxml", # ] # /// from typing import NamedTuple import httpx from lxml import html class CovidData(NamedTuple): cases: str deaths: str recovered: str def covid_stats( url: str = ( "https://web.archive.org/web/20250825095350/" "https://www.worldometers.info/coronavirus/" ), ) -> CovidData: xpath_str = '//div[@class = "maincounter-number"]/span/text()' try: response = httpx.get(url, timeout=10).raise_for_status() except httpx.TimeoutException: print( "Request timed out. Please check your network connection " "or try again later." ) return CovidData("N/A", "N/A", "N/A") except httpx.HTTPStatusError as e: print(f"HTTP error occurred: {e}") return CovidData("N/A", "N/A", "N/A") data = html.fromstring(response.content).xpath(xpath_str) if len(data) != 3: print("Unexpected data format. The page structure may have changed.") data = "N/A", "N/A", "N/A" return CovidData(*data) if __name__ == "__main__": fmt = ( "Total COVID-19 cases in the world: {}\n" "Total deaths due to COVID-19 in the world: {}\n" "Total COVID-19 patients recovered in the world: {}" ) print(fmt.format(*covid_stats())) ================================================ FILE: web_programming/crawl_google_results.py ================================================ # /// script # requires-python = ">=3.13" # dependencies = [ # "beautifulsoup4", # "fake-useragent", # "httpx", # ] # /// import sys import webbrowser import httpx from bs4 import BeautifulSoup from fake_useragent import UserAgent if __name__ == "__main__": print("Googling.....") url = "https://www.google.com/search?q=" + " ".join(sys.argv[1:]) res = httpx.get( url, headers={"UserAgent": UserAgent().random}, timeout=10, follow_redirects=True, ) # res.raise_for_status() with open("project1a.html", "wb") as out_file: # only for knowing the class for data in res.iter_content(10000): out_file.write(data) soup = BeautifulSoup(res.text, "html.parser") links = list(soup.select(".eZt8xd"))[:5] print(len(links)) for link in links: if link.text == "Maps": webbrowser.open(link.get("href")) else: webbrowser.open(f"https://google.com{link.get('href')}") ================================================ FILE: web_programming/crawl_google_scholar_citation.py ================================================ """ Get the citation from google scholar using title and year of publication, and volume and pages of journal. """ # /// script # requires-python = ">=3.13" # dependencies = [ # "beautifulsoup4", # "httpx", # ] # /// import httpx from bs4 import BeautifulSoup def get_citation(base_url: str, params: dict) -> str: """ Return the citation number. """ soup = BeautifulSoup( httpx.get(base_url, params=params, timeout=10).content, "html.parser" ) div = soup.find("div", attrs={"class": "gs_ri"}) anchors = div.find("div", attrs={"class": "gs_fl"}).find_all("a") return anchors[2].get_text() if __name__ == "__main__": params = { "title": ( "Precisely geometry controlled microsupercapacitors for ultrahigh areal " "capacitance, volumetric capacitance, and energy density" ), "journal": "Chem. Mater.", "volume": 30, "pages": "3979-3990", "year": 2018, "hl": "en", } print(get_citation("https://scholar.google.com/scholar_lookup", params=params)) ================================================ FILE: web_programming/currency_converter.py ================================================ """ This is used to convert the currency using the Amdoren Currency API https://www.amdoren.com """ # /// script # requires-python = ">=3.13" # dependencies = [ # "httpx", # ] # /// import os import httpx URL_BASE = "https://www.amdoren.com/api/currency.php" # Currency and their description list_of_currencies = """ AED United Arab Emirates Dirham AFN Afghan Afghani ALL Albanian Lek AMD Armenian Dram ANG Netherlands Antillean Guilder AOA Angolan Kwanza ARS Argentine Peso AUD Australian Dollar AWG Aruban Florin AZN Azerbaijani Manat BAM Bosnia & Herzegovina Convertible Mark BBD Barbadian Dollar BDT Bangladeshi Taka BGN Bulgarian Lev BHD Bahraini Dinar BIF Burundian Franc BMD Bermudian Dollar BND Brunei Dollar BOB Bolivian Boliviano BRL Brazilian Real BSD Bahamian Dollar BTN Bhutanese Ngultrum BWP Botswana Pula BYN Belarus Ruble BZD Belize Dollar CAD Canadian Dollar CDF Congolese Franc CHF Swiss Franc CLP Chilean Peso CNY Chinese Yuan COP Colombian Peso CRC Costa Rican Colon CUC Cuban Convertible Peso CVE Cape Verdean Escudo CZK Czech Republic Koruna DJF Djiboutian Franc DKK Danish Krone DOP Dominican Peso DZD Algerian Dinar EGP Egyptian Pound ERN Eritrean Nakfa ETB Ethiopian Birr EUR Euro FJD Fiji Dollar GBP British Pound Sterling GEL Georgian Lari GHS Ghanaian Cedi GIP Gibraltar Pound GMD Gambian Dalasi GNF Guinea Franc GTQ Guatemalan Quetzal GYD Guyanaese Dollar HKD Hong Kong Dollar HNL Honduran Lempira HRK Croatian Kuna HTG Haiti Gourde HUF Hungarian Forint IDR Indonesian Rupiah ILS Israeli Shekel INR Indian Rupee IQD Iraqi Dinar IRR Iranian Rial ISK Icelandic Krona JMD Jamaican Dollar JOD Jordanian Dinar JPY Japanese Yen KES Kenyan Shilling KGS Kyrgystani Som KHR Cambodian Riel KMF Comorian Franc KPW North Korean Won KRW South Korean Won KWD Kuwaiti Dinar KYD Cayman Islands Dollar KZT Kazakhstan Tenge LAK Laotian Kip LBP Lebanese Pound LKR Sri Lankan Rupee LRD Liberian Dollar LSL Lesotho Loti LYD Libyan Dinar MAD Moroccan Dirham MDL Moldovan Leu MGA Malagasy Ariary MKD Macedonian Denar MMK Myanma Kyat MNT Mongolian Tugrik MOP Macau Pataca MRO Mauritanian Ouguiya MUR Mauritian Rupee MVR Maldivian Rufiyaa MWK Malawi Kwacha MXN Mexican Peso MYR Malaysian Ringgit MZN Mozambican Metical NAD Namibian Dollar NGN Nigerian Naira NIO Nicaragua Cordoba NOK Norwegian Krone NPR Nepalese Rupee NZD New Zealand Dollar OMR Omani Rial PAB Panamanian Balboa PEN Peruvian Nuevo Sol PGK Papua New Guinean Kina PHP Philippine Peso PKR Pakistani Rupee PLN Polish Zloty PYG Paraguayan Guarani QAR Qatari Riyal RON Romanian Leu RSD Serbian Dinar RUB Russian Ruble RWF Rwanda Franc SAR Saudi Riyal SBD Solomon Islands Dollar SCR Seychellois Rupee SDG Sudanese Pound SEK Swedish Krona SGD Singapore Dollar SHP Saint Helena Pound SLL Sierra Leonean Leone SOS Somali Shilling SRD Surinamese Dollar SSP South Sudanese Pound STD Sao Tome and Principe Dobra SYP Syrian Pound SZL Swazi Lilangeni THB Thai Baht TJS Tajikistan Somoni TMT Turkmenistani Manat TND Tunisian Dinar TOP Tonga Paanga TRY Turkish Lira TTD Trinidad and Tobago Dollar TWD New Taiwan Dollar TZS Tanzanian Shilling UAH Ukrainian Hryvnia UGX Ugandan Shilling USD United States Dollar UYU Uruguayan Peso UZS Uzbekistan Som VEF Venezuelan Bolivar VND Vietnamese Dong VUV Vanuatu Vatu WST Samoan Tala XAF Central African CFA franc XCD East Caribbean Dollar XOF West African CFA franc XPF CFP Franc YER Yemeni Rial ZAR South African Rand ZMW Zambian Kwacha """ def convert_currency( from_: str = "USD", to: str = "INR", amount: float = 1.0, api_key: str = "" ) -> str: """https://www.amdoren.com/currency-api/""" # Instead of manually generating parameters params = locals() # from is a reserved keyword params["from"] = params.pop("from_") res = httpx.get(URL_BASE, params=params, timeout=10).json() return str(res["amount"]) if res["error"] == 0 else res["error_message"] if __name__ == "__main__": TESTING = os.getenv("CI", "") API_KEY = os.getenv("AMDOREN_API_KEY", "") if not API_KEY and not TESTING: raise KeyError( "API key must be provided in the 'AMDOREN_API_KEY' environment variable." ) print( convert_currency( input("Enter from currency: ").strip(), input("Enter to currency: ").strip(), float(input("Enter the amount: ").strip()), API_KEY, ) ) ================================================ FILE: web_programming/current_stock_price.py ================================================ # /// script # requires-python = ">=3.13" # dependencies = [ # "beautifulsoup4", # "httpx", # ] # /// import httpx from bs4 import BeautifulSoup """ Get the HTML code of finance yahoo and select the current qsp-price Current AAPL stock price is 228.43 Current AMZN stock price is 201.85 Current IBM stock price is 210.30 Current GOOG stock price is 177.86 Current MSFT stock price is 414.82 Current ORCL stock price is 188.87 """ def stock_price(symbol: str = "AAPL") -> str: """ >>> stock_price("EEEE") 'No tag with the specified data-testid attribute found.' >>> isinstance(float(stock_price("GOOG")),float) True """ url = f"https://finance.yahoo.com/quote/{symbol}?p={symbol}" yahoo_finance_source = httpx.get( url, headers={"USER-AGENT": "Mozilla/5.0"}, timeout=10, follow_redirects=True ).text soup = BeautifulSoup(yahoo_finance_source, "html.parser") if specific_fin_streamer_tag := soup.find("span", {"data-testid": "qsp-price"}): return specific_fin_streamer_tag.get_text() return "No tag with the specified data-testid attribute found." # Search for the symbol at https://finance.yahoo.com/lookup if __name__ == "__main__": from doctest import testmod testmod() for symbol in "AAPL AMZN IBM GOOG MSFT ORCL".split(): print(f"Current {symbol:<4} stock price is {stock_price(symbol):>8}") ================================================ FILE: web_programming/current_weather.py ================================================ # /// script # requires-python = ">=3.13" # dependencies = [ # "httpx", # ] # /// import httpx # Put your API key(s) here OPENWEATHERMAP_API_KEY = "" WEATHERSTACK_API_KEY = "" # Define the URL for the APIs with placeholders OPENWEATHERMAP_URL_BASE = "https://api.openweathermap.org/data/2.5/weather" WEATHERSTACK_URL_BASE = "http://api.weatherstack.com/current" def current_weather(location: str) -> list[dict]: """ >>> current_weather("location") Traceback (most recent call last): ... ValueError: No API keys provided or no valid data returned. """ weather_data = [] if OPENWEATHERMAP_API_KEY: params_openweathermap = {"q": location, "appid": OPENWEATHERMAP_API_KEY} response_openweathermap = httpx.get( OPENWEATHERMAP_URL_BASE, params=params_openweathermap, timeout=10 ) weather_data.append({"OpenWeatherMap": response_openweathermap.json()}) if WEATHERSTACK_API_KEY: params_weatherstack = {"query": location, "access_key": WEATHERSTACK_API_KEY} response_weatherstack = httpx.get( WEATHERSTACK_URL_BASE, params=params_weatherstack, timeout=10 ) weather_data.append({"Weatherstack": response_weatherstack.json()}) if not weather_data: raise ValueError("No API keys provided or no valid data returned.") return weather_data if __name__ == "__main__": from pprint import pprint location = "to be determined..." while location: location = input("Enter a location (city name or latitude,longitude): ").strip() if location: try: weather_data = current_weather(location) for forecast in weather_data: pprint(forecast) except ValueError as e: print(repr(e)) location = "" ================================================ FILE: web_programming/daily_horoscope.py ================================================ # /// script # requires-python = ">=3.13" # dependencies = [ # "beautifulsoup4", # "httpx", # ] # /// import httpx from bs4 import BeautifulSoup def horoscope(zodiac_sign: int, day: str) -> str: url = ( "https://www.horoscope.com/us/horoscopes/general/" f"horoscope-general-daily-{day}.aspx?sign={zodiac_sign}" ) soup = BeautifulSoup(httpx.get(url, timeout=10).content, "html.parser") return soup.find("div", class_="main-horoscope").p.text if __name__ == "__main__": print("Daily Horoscope. \n") print( "enter your Zodiac sign number:\n", "1. Aries\n", "2. Taurus\n", "3. Gemini\n", "4. Cancer\n", "5. Leo\n", "6. Virgo\n", "7. Libra\n", "8. Scorpio\n", "9. Sagittarius\n", "10. Capricorn\n", "11. Aquarius\n", "12. Pisces\n", ) zodiac_sign = int(input("number> ").strip()) print("choose some day:\n", "yesterday\n", "today\n", "tomorrow\n") day = input("enter the day> ") horoscope_text = horoscope(zodiac_sign, day) print(horoscope_text) ================================================ FILE: web_programming/download_images_from_google_query.py ================================================ # /// script # requires-python = ">=3.13" # dependencies = [ # "beautifulsoup4", # "httpx", # ] # /// import json import os import re import sys import urllib.request import httpx from bs4 import BeautifulSoup headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" " (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582" } def download_images_from_google_query(query: str = "dhaka", max_images: int = 5) -> int: """ Searches google using the provided query term and downloads the images in a folder. Args: query : The image search term to be provided by the user. Defaults to "dhaka". image_numbers : [description]. Defaults to 5. Returns: The number of images successfully downloaded. # Comment out slow (4.20s call) doctests # >>> download_images_from_google_query() 5 # >>> download_images_from_google_query("potato") 5 """ max_images = min(max_images, 50) # Prevent abuse! params = { "q": query, "tbm": "isch", "hl": "en", "ijn": "0", } html = httpx.get( "https://www.google.com/search", params=params, headers=headers, timeout=10 ) soup = BeautifulSoup(html.text, "html.parser") matched_images_data = "".join( re.findall(r"AF_initDataCallback\(([^<]+)\);", str(soup.select("script"))) ) matched_images_data_fix = json.dumps(matched_images_data) matched_images_data_json = json.loads(matched_images_data_fix) matched_google_image_data = re.findall( r"\[\"GRID_STATE0\",null,\[\[1,\[0,\".*?\",(.*),\"All\",", matched_images_data_json, ) if not matched_google_image_data: return 0 removed_matched_google_images_thumbnails = re.sub( r"\[\"(https\:\/\/encrypted-tbn0\.gstatic\.com\/images\?.*?)\",\d+,\d+\]", "", str(matched_google_image_data), ) matched_google_full_resolution_images = re.findall( r"(?:'|,),\[\"(https:|http.*?)\",\d+,\d+\]", removed_matched_google_images_thumbnails, ) for index, fixed_full_res_image in enumerate(matched_google_full_resolution_images): if index >= max_images: return index original_size_img_not_fixed = bytes(fixed_full_res_image, "ascii").decode( "unicode-escape" ) original_size_img = bytes(original_size_img_not_fixed, "ascii").decode( "unicode-escape" ) opener = urllib.request.build_opener() opener.addheaders = [ ( "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" " (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582", ) ] urllib.request.install_opener(opener) path_name = f"query_{query.replace(' ', '_')}" if not os.path.exists(path_name): os.makedirs(path_name) urllib.request.urlretrieve( # noqa: S310 original_size_img, f"{path_name}/original_size_img_{index}.jpg" ) return index if __name__ == "__main__": try: image_count = download_images_from_google_query(sys.argv[1]) print(f"{image_count} images were downloaded to disk.") except IndexError: print("Please provide a search term.") raise ================================================ FILE: web_programming/emails_from_url.py ================================================ """Get the site emails from URL.""" # /// script # requires-python = ">=3.13" # dependencies = [ # "httpx", # ] # /// from __future__ import annotations __author__ = "Muhammad Umer Farooq" __license__ = "MIT" __version__ = "1.0.0" __maintainer__ = "Muhammad Umer Farooq" __email__ = "contact@muhammadumerfarooq.me" __status__ = "Alpha" import re from html.parser import HTMLParser from urllib import parse import httpx class Parser(HTMLParser): def __init__(self, domain: str) -> None: super().__init__() self.urls: list[str] = [] self.domain = domain def handle_starttag(self, tag: str, attrs: list[tuple[str, str | None]]) -> None: """ This function parse html to take takes url from tags """ # Only parse the 'anchor' tag. if tag == "a": # Check the list of defined attributes. for name, value in attrs: # If href is defined, not empty nor # print it and not already in urls. if name == "href" and value not in (*self.urls, "", "#"): url = parse.urljoin(self.domain, value) self.urls.append(url) # Get main domain name (example.com) def get_domain_name(url: str) -> str: """ This function get the main domain name >>> get_domain_name("https://a.b.c.d/e/f?g=h,i=j#k") 'c.d' >>> get_domain_name("Not a URL!") '' """ return ".".join(get_sub_domain_name(url).split(".")[-2:]) # Get sub domain name (sub.example.com) def get_sub_domain_name(url: str) -> str: """ >>> get_sub_domain_name("https://a.b.c.d/e/f?g=h,i=j#k") 'a.b.c.d' >>> get_sub_domain_name("Not a URL!") '' """ return parse.urlparse(url).netloc def emails_from_url(url: str = "https://github.com") -> list[str]: """ This function takes url and return all valid urls """ # Get the base domain from the url domain = get_domain_name(url) # Initialize the parser parser = Parser(domain) try: # Open URL r = httpx.get(url, timeout=10, follow_redirects=True) # pass the raw HTML to the parser to get links parser.feed(r.text) # Get links and loop through valid_emails = set() for link in parser.urls: # open URL. # Check if the link is already absolute if not link.startswith("http://") and not link.startswith("https://"): # Prepend protocol only if link starts with domain, normalize otherwise if link.startswith(domain): link = f"https://{link}" else: link = parse.urljoin(f"https://{domain}", link) try: read = httpx.get(link, timeout=10, follow_redirects=True) # Get the valid email. emails = re.findall("[a-zA-Z0-9]+@" + domain, read.text) # If not in list then append it. for email in emails: valid_emails.add(email) except ValueError: pass except ValueError: raise SystemExit(1) # Finally return a sorted list of email addresses with no duplicates. return sorted(valid_emails) if __name__ == "__main__": emails = emails_from_url("https://github.com") print(f"{len(emails)} emails found:") print("\n".join(sorted(emails))) ================================================ FILE: web_programming/fetch_anime_and_play.py ================================================ # /// script # requires-python = ">=3.13" # dependencies = [ # "beautifulsoup4", # "fake-useragent", # "httpx", # ] # /// import httpx from bs4 import BeautifulSoup, NavigableString, Tag from fake_useragent import UserAgent BASE_URL = "https://ww7.gogoanime2.org" def search_scraper(anime_name: str) -> list: """[summary] Take an url and return list of anime after scraping the site. >>> type(search_scraper("demon_slayer")) Args: anime_name (str): [Name of anime] Raises: e: [Raises exception on failure] Returns: [list]: [List of animes] """ # concat the name to form the search url. search_url = f"{BASE_URL}/search?keyword={anime_name}" response = httpx.get( search_url, headers={"UserAgent": UserAgent().chrome}, timeout=10 ) # request the url. # Is the response ok? response.raise_for_status() # parse with soup. soup = BeautifulSoup(response.text, "html.parser") # get list of anime anime_ul = soup.find("ul", {"class": "items"}) if anime_ul is None or isinstance(anime_ul, NavigableString): msg = f"Could not find and anime with name {anime_name}" raise ValueError(msg) anime_li = anime_ul.children # for each anime, insert to list. the name and url. anime_list = [] for anime in anime_li: if isinstance(anime, Tag): anime_url = anime.find("a") if anime_url is None or isinstance(anime_url, NavigableString): continue anime_title = anime.find("a") if anime_title is None or isinstance(anime_title, NavigableString): continue anime_list.append({"title": anime_title["title"], "url": anime_url["href"]}) return anime_list def search_anime_episode_list(episode_endpoint: str) -> list: """[summary] Take an url and return list of episodes after scraping the site for an url. >>> type(search_anime_episode_list("/anime/kimetsu-no-yaiba")) Args: episode_endpoint (str): [Endpoint of episode] Raises: e: [description] Returns: [list]: [List of episodes] """ request_url = f"{BASE_URL}{episode_endpoint}" response = httpx.get( url=request_url, headers={"UserAgent": UserAgent().chrome}, timeout=10 ) response.raise_for_status() soup = BeautifulSoup(response.text, "html.parser") # With this id. get the episode list. episode_page_ul = soup.find("ul", {"id": "episode_related"}) if episode_page_ul is None or isinstance(episode_page_ul, NavigableString): msg = f"Could not find any anime eposiodes with name {anime_name}" raise ValueError(msg) episode_page_li = episode_page_ul.children episode_list = [] for episode in episode_page_li: if isinstance(episode, Tag): url = episode.find("a") if url is None or isinstance(url, NavigableString): continue title = episode.find("div", {"class": "name"}) if title is None or isinstance(title, NavigableString): continue episode_list.append( {"title": title.text.replace(" ", ""), "url": url["href"]} ) return episode_list def get_anime_episode(episode_endpoint: str) -> list: """[summary] Get click url and download url from episode url >>> type(get_anime_episode("/watch/kimetsu-no-yaiba/1")) Args: episode_endpoint (str): [Endpoint of episode] Raises: e: [description] Returns: [list]: [List of download and watch url] """ episode_page_url = f"{BASE_URL}{episode_endpoint}" response = httpx.get( url=episode_page_url, headers={"User-Agent": UserAgent().chrome}, timeout=10 ) response.raise_for_status() soup = BeautifulSoup(response.text, "html.parser") url = soup.find("iframe", {"id": "playerframe"}) if url is None or isinstance(url, NavigableString): msg = f"Could not find url and download url from {episode_endpoint}" raise RuntimeError(msg) episode_url = url["src"] if not isinstance(episode_url, str): msg = f"Could not find url and download url from {episode_endpoint}" raise RuntimeError(msg) download_url = episode_url.replace("/embed/", "/playlist/") + ".m3u8" return [f"{BASE_URL}{episode_url}", f"{BASE_URL}{download_url}"] if __name__ == "__main__": anime_name = input("Enter anime name: ").strip() anime_list = search_scraper(anime_name) print("\n") if len(anime_list) == 0: print("No anime found with this name") else: print(f"Found {len(anime_list)} results: ") for i, anime in enumerate(anime_list): anime_title = anime["title"] print(f"{i + 1}. {anime_title}") anime_choice = int(input("\nPlease choose from the following list: ").strip()) chosen_anime = anime_list[anime_choice - 1] print(f"You chose {chosen_anime['title']}. Searching for episodes...") episode_list = search_anime_episode_list(chosen_anime["url"]) if len(episode_list) == 0: print("No episode found for this anime") else: print(f"Found {len(episode_list)} results: ") for i, episode in enumerate(episode_list): print(f"{i + 1}. {episode['title']}") episode_choice = int(input("\nChoose an episode by serial no: ").strip()) chosen_episode = episode_list[episode_choice - 1] print(f"You chose {chosen_episode['title']}. Searching...") episode_url, download_url = get_anime_episode(chosen_episode["url"]) print(f"\nTo watch, ctrl+click on {episode_url}.") print(f"To download, ctrl+click on {download_url}.") ================================================ FILE: web_programming/fetch_bbc_news.py ================================================ # Created by sarathkaul on 12/11/19 # /// script # requires-python = ">=3.13" # dependencies = [ # "httpx", # ] # /// import httpx _NEWS_API = "https://newsapi.org/v1/articles?source=bbc-news&sortBy=top&apiKey=" def fetch_bbc_news(bbc_news_api_key: str) -> None: # fetching a list of articles in json format bbc_news_page = httpx.get(_NEWS_API + bbc_news_api_key, timeout=10).json() # each article in the list is a dict for i, article in enumerate(bbc_news_page["articles"], 1): print(f"{i}.) {article['title']}") if __name__ == "__main__": fetch_bbc_news(bbc_news_api_key="") ================================================ FILE: web_programming/fetch_github_info.py ================================================ #!/usr/bin/env python3 """ Created by sarathkaul on 14/11/19 Updated by lawric1 on 24/11/20 Authentication will be made via access token. To generate your personal access token visit https://github.com/settings/tokens. NOTE: Never hardcode any credential information in the code. Always use an environment file to store the private information and use the `os` module to get the information during runtime. Create a ".env" file in the root directory and write these two lines in that file with your token:: #!/usr/bin/env bash export USER_TOKEN="" """ # /// script # requires-python = ">=3.13" # dependencies = [ # "httpx", # ] # /// from __future__ import annotations import os from typing import Any import httpx BASE_URL = "https://api.github.com" # https://docs.github.com/en/free-pro-team@latest/rest/reference/users#get-the-authenticated-user AUTHENTICATED_USER_ENDPOINT = BASE_URL + "/user" # https://github.com/settings/tokens USER_TOKEN = os.environ.get("USER_TOKEN", "") def fetch_github_info(auth_token: str) -> dict[Any, Any]: """ Fetch GitHub info of a user using the httpx module """ headers = { "Authorization": f"token {auth_token}", "Accept": "application/vnd.github.v3+json", } return httpx.get(AUTHENTICATED_USER_ENDPOINT, headers=headers, timeout=10).json() if __name__ == "__main__": # pragma: no cover if USER_TOKEN: for key, value in fetch_github_info(USER_TOKEN).items(): print(f"{key}: {value}") else: raise ValueError("'USER_TOKEN' field cannot be empty.") ================================================ FILE: web_programming/fetch_jobs.py ================================================ """ Scraping jobs given job title and location from indeed website """ # /// script # requires-python = ">=3.13" # dependencies = [ # "beautifulsoup4", # "httpx", # ] # /// from __future__ import annotations from collections.abc import Generator import httpx from bs4 import BeautifulSoup url = "https://www.indeed.co.in/jobs?q=mobile+app+development&l=" def fetch_jobs(location: str = "mumbai") -> Generator[tuple[str, str]]: soup = BeautifulSoup(httpx.get(url + location, timeout=10).content, "html.parser") # This attribute finds out all the specifics listed in a job for job in soup.find_all("div", attrs={"data-tn-component": "organicJob"}): job_title = job.find("a", attrs={"data-tn-element": "jobTitle"}).text.strip() company_name = job.find("span", {"class": "company"}).text.strip() yield job_title, company_name if __name__ == "__main__": for i, job in enumerate(fetch_jobs("Bangalore"), 1): print(f"Job {i:>2} is {job[0]} at {job[1]}") ================================================ FILE: web_programming/fetch_quotes.py ================================================ """ This file fetches quotes from the " ZenQuotes API ". It does not require any API key as it uses free tier. For more details and premium features visit: https://zenquotes.io/ """ # /// script # requires-python = ">=3.13" # dependencies = [ # "httpx", # ] # /// import pprint import httpx API_ENDPOINT_URL = "https://zenquotes.io/api" def quote_of_the_day() -> list: return httpx.get(API_ENDPOINT_URL + "/today", timeout=10).json() def random_quotes() -> list: return httpx.get(API_ENDPOINT_URL + "/random", timeout=10).json() if __name__ == "__main__": """ response object has all the info with the quote To retrieve the actual quote access the response.json() object as below response.json() is a list of json object response.json()[0]['q'] = actual quote. response.json()[0]['a'] = author name. response.json()[0]['h'] = in html format. """ response = random_quotes() pprint.pprint(response) ================================================ FILE: web_programming/fetch_well_rx_price.py ================================================ """ Scrape the price and pharmacy name for a prescription drug from rx site after providing the drug name and zipcode. """ import httpx from bs4 import BeautifulSoup BASE_URL = "https://www.wellrx.com/prescriptions/{}/{}/?freshSearch=true" def fetch_pharmacy_and_price_list(drug_name: str, zip_code: str) -> list | None: """[summary] This function will take input of drug name and zipcode, then request to the BASE_URL site. Get the page data and scrape it to generate the list of the lowest prices for the prescription drug. Args: drug_name (str): [Drug name] zip_code(str): [Zip code] Returns: list: [List of pharmacy name and price] >>> print(fetch_pharmacy_and_price_list(None, None)) None >>> print(fetch_pharmacy_and_price_list(None, 30303)) None >>> print(fetch_pharmacy_and_price_list("eliquis", None)) None """ try: # Has user provided both inputs? if not drug_name or not zip_code: return None request_url = BASE_URL.format(drug_name, zip_code) response = httpx.get(request_url, timeout=10).raise_for_status() # Scrape the data using bs4 soup = BeautifulSoup(response.text, "html.parser") # This list will store the name and price. pharmacy_price_list = [] # Fetch all the grids that contain the items. grid_list = soup.find_all("div", {"class": "grid-x pharmCard"}) if grid_list and len(grid_list) > 0: for grid in grid_list: # Get the pharmacy price. pharmacy_name = grid.find("p", {"class": "list-title"}).text # Get the price of the drug. price = grid.find("span", {"p", "price price-large"}).text pharmacy_price_list.append( { "pharmacy_name": pharmacy_name, "price": price, } ) return pharmacy_price_list except (httpx.HTTPError, ValueError): return None if __name__ == "__main__": # Enter a drug name and a zip code drug_name = input("Enter drug name: ").strip() zip_code = input("Enter zip code: ").strip() pharmacy_price_list: list | None = fetch_pharmacy_and_price_list( drug_name, zip_code ) if pharmacy_price_list: print(f"\nSearch results for {drug_name} at location {zip_code}:") for pharmacy_price in pharmacy_price_list: name = pharmacy_price["pharmacy_name"] price = pharmacy_price["price"] print(f"Pharmacy: {name} Price: {price}") else: print(f"No results found for {drug_name}") ================================================ FILE: web_programming/get_amazon_product_data.py ================================================ """ This file provides a function which will take a product name as input from the user, and fetch from Amazon information about products of this name or category. The product information will include title, URL, price, ratings, and the discount available. """ # /// script # requires-python = ">=3.13" # dependencies = [ # "beautifulsoup4", # "httpx", # "pandas", # ] # /// from itertools import zip_longest import httpx from bs4 import BeautifulSoup from pandas import DataFrame def get_amazon_product_data(product: str = "laptop") -> DataFrame: """ Take a product name or category as input and return product information from Amazon including title, URL, price, ratings, and the discount available. """ url = f"https://www.amazon.in/laptop/s?k={product}" header = { "User-Agent": ( "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36" "(KHTML, like Gecko)Chrome/44.0.2403.157 Safari/537.36" ), "Accept-Language": "en-US, en;q=0.5", } soup = BeautifulSoup( httpx.get(url, headers=header, timeout=10).text, features="lxml" ) # Initialize a Pandas dataframe with the column titles data_frame = DataFrame( columns=[ "Product Title", "Product Link", "Current Price of the product", "Product Rating", "MRP of the product", "Discount", ] ) # Loop through each entry and store them in the dataframe for item, _ in zip_longest( soup.find_all( "div", attrs={"class": "s-result-item", "data-component-type": "s-search-result"}, ), soup.find_all("div", attrs={"class": "a-row a-size-base a-color-base"}), ): try: product_title = item.h2.text product_link = "https://www.amazon.in/" + item.h2.a["href"] product_price = item.find("span", attrs={"class": "a-offscreen"}).text try: product_rating = item.find("span", attrs={"class": "a-icon-alt"}).text except AttributeError: product_rating = "Not available" try: product_mrp = ( "₹" + item.find( "span", attrs={"class": "a-price a-text-price"} ).text.split("₹")[1] ) except AttributeError: product_mrp = "" try: discount = float( ( ( float(product_mrp.strip("₹").replace(",", "")) - float(product_price.strip("₹").replace(",", "")) ) / float(product_mrp.strip("₹").replace(",", "")) ) * 100 ) except ValueError: discount = float("nan") except AttributeError: continue data_frame.loc[str(len(data_frame.index))] = [ product_title, product_link, product_price, product_rating, product_mrp, discount, ] data_frame.loc[ data_frame["Current Price of the product"] > data_frame["MRP of the product"], "MRP of the product", ] = " " data_frame.loc[ data_frame["Current Price of the product"] > data_frame["MRP of the product"], "Discount", ] = " " data_frame.index += 1 return data_frame if __name__ == "__main__": product = "headphones" get_amazon_product_data(product).to_csv(f"Amazon Product Data for {product}.csv") ================================================ FILE: web_programming/get_imdb_top_250_movies_csv.py ================================================ # /// script # requires-python = ">=3.13" # dependencies = [ # "beautifulsoup4", # "httpx", # ] # /// from __future__ import annotations import csv import httpx from bs4 import BeautifulSoup def get_imdb_top_250_movies(url: str = "") -> dict[str, float]: url = url or "https://www.imdb.com/chart/top/?ref_=nv_mv_250" soup = BeautifulSoup(httpx.get(url, timeout=10).text, "html.parser") titles = soup.find_all("h3", class_="ipc-title__text") ratings = soup.find_all("span", class_="ipc-rating-star--rating") return { title.a.text: float(rating.strong.text) for title, rating in zip(titles, ratings) } def write_movies(filename: str = "IMDb_Top_250_Movies.csv") -> None: movies = get_imdb_top_250_movies() with open(filename, "w", newline="") as out_file: writer = csv.writer(out_file) writer.writerow(["Movie title", "IMDb rating"]) for title, rating in movies.items(): writer.writerow([title, rating]) if __name__ == "__main__": write_movies() ================================================ FILE: web_programming/get_imdbtop.py.DISABLED ================================================ import bs4 import requests def get_movie_data_from_soup(soup: bs4.element.ResultSet) -> dict[str, str]: return { "name": soup.h3.a.text, "genre": soup.find("span", class_="genre").text.strip(), "rating": soup.strong.text, "page_link": f"https://www.imdb.com{soup.a.get('href')}", } def get_imdb_top_movies(num_movies: int = 5) -> tuple: """Get the top num_movies most highly rated movies from IMDB and return a tuple of dicts describing each movie's name, genre, rating, and URL. Args: num_movies: The number of movies to get. Defaults to 5. Returns: A list of tuples containing information about the top n movies. >>> len(get_imdb_top_movies(5)) 5 >>> len(get_imdb_top_movies(-3)) 0 >>> len(get_imdb_top_movies(4.99999)) 4 """ num_movies = int(float(num_movies)) if num_movies < 1: return () base_url = ( "https://www.imdb.com/search/title?title_type=" f"feature&sort=num_votes,desc&count={num_movies}" ) source = bs4.BeautifulSoup(requests.get(base_url).content, "html.parser") return tuple( get_movie_data_from_soup(movie) for movie in source.find_all("div", class_="lister-item mode-advanced") ) if __name__ == "__main__": import json num_movies = int(input("How many movies would you like to see? ")) print( ", ".join( json.dumps(movie, indent=4) for movie in get_imdb_top_movies(num_movies) ) ) ================================================ FILE: web_programming/get_ip_geolocation.py ================================================ # /// script # requires-python = ">=3.13" # dependencies = [ # "httpx", # ] # /// import httpx # Function to get geolocation data for an IP address def get_ip_geolocation(ip_address: str) -> str: try: # Construct the URL for the IP geolocation API url = f"https://ipinfo.io/{ip_address}/json" # Send a GET request to the API response = httpx.get(url, timeout=10) # Check if the HTTP request was successful response.raise_for_status() # Parse the response as JSON data = response.json() # Check if city, region, and country information is available if "city" in data and "region" in data and "country" in data: location = f"Location: {data['city']}, {data['region']}, {data['country']}" else: location = "Location data not found." return location except httpx.RequestError as e: # Handle network-related exceptions return f"Request error: {e}" except ValueError as e: # Handle JSON parsing errors return f"JSON parsing error: {e}" if __name__ == "__main__": # Prompt the user to enter an IP address ip_address = input("Enter an IP address: ") # Get the geolocation data and print it location = get_ip_geolocation(ip_address) print(location) ================================================ FILE: web_programming/get_top_billionaires.py ================================================ """ CAUTION: You may get a json.decoding error. This works for some of us but fails for others. """ # /// script # requires-python = ">=3.13" # dependencies = [ # "httpx", # "rich", # ] # /// from datetime import UTC, date, datetime import httpx from rich import box from rich import console as rich_console from rich import table as rich_table LIMIT = 10 TODAY = datetime.now(tz=UTC) API_URL = ( "https://www.forbes.com/forbesapi/person/rtb/0/position/true.json" "?fields=personName,gender,source,countryOfCitizenship,birthDate,finalWorth" f"&limit={LIMIT}" ) def years_old(birth_timestamp: int, today: date | None = None) -> int: """ Calculate the age in years based on the given birth date. Only the year, month, and day are used in the calculation. The time of day is ignored. Args: birth_timestamp: The date of birth. today: (useful for writing tests) or if None then datetime.date.today(). Returns: int: The age in years. Examples: >>> today = date(2024, 1, 12) >>> years_old(birth_timestamp=datetime(1959, 11, 20).timestamp(), today=today) 64 >>> years_old(birth_timestamp=datetime(1970, 2, 13).timestamp(), today=today) 53 >>> all( ... years_old(datetime(today.year - i, 1, 12).timestamp(), today=today) == i ... for i in range(1, 111) ... ) True """ today = today or TODAY.date() birth_date = datetime.fromtimestamp(birth_timestamp, tz=UTC).date() return (today.year - birth_date.year) - ( (today.month, today.day) < (birth_date.month, birth_date.day) ) def get_forbes_real_time_billionaires() -> list[dict[str, int | str]]: """ Get the top 10 real-time billionaires using Forbes API. Returns: List of top 10 realtime billionaires data. """ response_json = httpx.get(API_URL, timeout=10).json() return [ { "Name": person["personName"], "Source": person["source"], "Country": person["countryOfCitizenship"], "Gender": person["gender"], "Worth ($)": f"{person['finalWorth'] / 1000:.1f} Billion", "Age": str(years_old(person["birthDate"] / 1000)), } for person in response_json["personList"]["personsLists"] ] def display_billionaires(forbes_billionaires: list[dict[str, int | str]]) -> None: """ Display Forbes real-time billionaires in a rich table. Args: forbes_billionaires (list): Forbes top 10 real-time billionaires """ table = rich_table.Table( title=f"Forbes Top {LIMIT} Real-Time Billionaires at {TODAY:%Y-%m-%d %H:%M}", style="green", highlight=True, box=box.SQUARE, ) for key in forbes_billionaires[0]: table.add_column(key) for billionaire in forbes_billionaires: table.add_row(*billionaire.values()) rich_console.Console().print(table) if __name__ == "__main__": from doctest import testmod testmod() display_billionaires(get_forbes_real_time_billionaires()) ================================================ FILE: web_programming/get_top_hn_posts.py ================================================ # /// script # requires-python = ">=3.13" # dependencies = [ # "httpx", # ] # /// from __future__ import annotations import httpx def get_hackernews_story(story_id: str) -> dict: url = f"https://hacker-news.firebaseio.com/v0/item/{story_id}.json?print=pretty" return httpx.get(url, timeout=10).json() def hackernews_top_stories(max_stories: int = 10) -> list[dict]: """ Get the top max_stories posts from HackerNews - https://news.ycombinator.com/ """ url = "https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty" story_ids = httpx.get(url, timeout=10).json()[:max_stories] return [get_hackernews_story(story_id) for story_id in story_ids] def hackernews_top_stories_as_markdown(max_stories: int = 10) -> str: stories = hackernews_top_stories(max_stories) return "\n".join("* [{title}]({url})".format(**story) for story in stories) if __name__ == "__main__": print(hackernews_top_stories_as_markdown()) ================================================ FILE: web_programming/get_user_tweets.py.DISABLED ================================================ import csv import tweepy # Twitter API credentials consumer_key = "" consumer_secret = "" access_key = "" access_secret = "" def get_all_tweets(screen_name: str) -> None: # authorize twitter, initialize tweepy auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_key, access_secret) api = tweepy.API(auth) # initialize a list to hold all the tweepy Tweets alltweets = [] # make initial request for most recent tweets (200 is the maximum allowed count) new_tweets = api.user_timeline(screen_name=screen_name, count=200) # save most recent tweets alltweets.extend(new_tweets) # save the id of the oldest tweet less one oldest = alltweets[-1].id - 1 # keep grabbing tweets until there are no tweets left to grab while len(new_tweets) > 0: print(f"getting tweets before {oldest}") # all subsequent requests use the max_id param to prevent duplicates new_tweets = api.user_timeline( screen_name=screen_name, count=200, max_id=oldest ) # save most recent tweets alltweets.extend(new_tweets) # update the id of the oldest tweet less one oldest = alltweets[-1].id - 1 print(f"...{len(alltweets)} tweets downloaded so far") # transform the tweepy tweets into a 2D array that will populate the csv outtweets = [[tweet.id_str, tweet.created_at, tweet.text] for tweet in alltweets] # write the csv with open(f"new_{screen_name}_tweets.csv", "w") as f: writer = csv.writer(f) writer.writerow(["id", "created_at", "text"]) writer.writerows(outtweets) if __name__ == "__main__": # pass in the username of the account you want to download get_all_tweets("FirePing32") ================================================ FILE: web_programming/giphy.py ================================================ #!/usr/bin/env python3 # /// script # requires-python = ">=3.13" # dependencies = [ # "httpx", # ] # /// import httpx giphy_api_key = "YOUR API KEY" # Can be fetched from https://developers.giphy.com/dashboard/ def get_gifs(query: str, api_key: str = giphy_api_key) -> list: """ Get a list of URLs of GIFs based on a given query.. """ formatted_query = "+".join(query.split()) url = f"https://api.giphy.com/v1/gifs/search?q={formatted_query}&api_key={api_key}" gifs = httpx.get(url, timeout=10).json()["data"] return [gif["url"] for gif in gifs] if __name__ == "__main__": print("\n".join(get_gifs("space ship"))) ================================================ FILE: web_programming/instagram_crawler.py ================================================ #!/usr/bin/env python3 # /// script # requires-python = ">=3.13" # dependencies = [ # "beautifulsoup4", # "fake-useragent", # "httpx", # ] # /// from __future__ import annotations import json import httpx from bs4 import BeautifulSoup from fake_useragent import UserAgent headers = {"UserAgent": UserAgent().random} def extract_user_profile(script) -> dict: """ May raise json.decoder.JSONDecodeError """ data = script.contents[0] info = json.loads(data[data.find('{"config"') : -1]) return info["entry_data"]["ProfilePage"][0]["graphql"]["user"] class InstagramUser: """ Class Instagram crawl instagram user information Usage: (doctest failing on GitHub Actions) # >>> instagram_user = InstagramUser("github") # >>> instagram_user.is_verified True # >>> instagram_user.biography 'Built for developers.' """ def __init__(self, username): self.url = f"https://www.instagram.com/{username}/" self.user_data = self.get_json() def get_json(self) -> dict: """ Return a dict of user information """ html = httpx.get(self.url, headers=headers, timeout=10).text scripts = BeautifulSoup(html, "html.parser").find_all("script") try: return extract_user_profile(scripts[4]) except (json.decoder.JSONDecodeError, KeyError): return extract_user_profile(scripts[3]) def __repr__(self) -> str: return f"{self.__class__.__name__}('{self.username}')" def __str__(self) -> str: return f"{self.fullname} ({self.username}) is {self.biography}" @property def username(self) -> str: return self.user_data["username"] @property def fullname(self) -> str: return self.user_data["full_name"] @property def biography(self) -> str: return self.user_data["biography"] @property def email(self) -> str: return self.user_data["business_email"] @property def website(self) -> str: return self.user_data["external_url"] @property def number_of_followers(self) -> int: return self.user_data["edge_followed_by"]["count"] @property def number_of_followings(self) -> int: return self.user_data["edge_follow"]["count"] @property def number_of_posts(self) -> int: return self.user_data["edge_owner_to_timeline_media"]["count"] @property def profile_picture_url(self) -> str: return self.user_data["profile_pic_url_hd"] @property def is_verified(self) -> bool: return self.user_data["is_verified"] @property def is_private(self) -> bool: return self.user_data["is_private"] def test_instagram_user(username: str = "github") -> None: """ A self running doctest >>> test_instagram_user() """ import os if os.environ.get("CI"): return # test failing on GitHub Actions instagram_user = InstagramUser(username) assert instagram_user.user_data assert isinstance(instagram_user.user_data, dict) assert instagram_user.username == username if username != "github": return assert instagram_user.fullname == "GitHub" assert instagram_user.biography == "Built for developers." assert instagram_user.number_of_posts > 150 assert instagram_user.number_of_followers > 120000 assert instagram_user.number_of_followings > 15 assert instagram_user.email == "support@github.com" assert instagram_user.website == "https://github.com/readme" assert instagram_user.profile_picture_url.startswith("https://instagram.") assert instagram_user.is_verified is True assert instagram_user.is_private is False if __name__ == "__main__": import doctest doctest.testmod() instagram_user = InstagramUser("github") print(instagram_user) print(f"{instagram_user.number_of_posts = }") print(f"{instagram_user.number_of_followers = }") print(f"{instagram_user.number_of_followings = }") print(f"{instagram_user.email = }") print(f"{instagram_user.website = }") print(f"{instagram_user.profile_picture_url = }") print(f"{instagram_user.is_verified = }") print(f"{instagram_user.is_private = }") ================================================ FILE: web_programming/instagram_pic.py ================================================ # /// script # requires-python = ">=3.13" # dependencies = [ # "beautifulsoup4", # "httpx", # ] # /// from datetime import UTC, datetime import httpx from bs4 import BeautifulSoup def download_image(url: str) -> str: """ Download an image from a given URL by scraping the 'og:image' meta tag. Parameters: url: The URL to scrape. Returns: A message indicating the result of the operation. """ try: response = httpx.get(url, timeout=10) response.raise_for_status() except httpx.RequestError as e: return f"An error occurred during the HTTP request to {url}: {e!r}" soup = BeautifulSoup(response.text, "html.parser") image_meta_tag = soup.find("meta", {"property": "og:image"}) if not image_meta_tag: return "No meta tag with property 'og:image' was found." image_url = image_meta_tag.get("content") if not image_url: return f"Image URL not found in meta tag {image_meta_tag}." try: image_data = httpx.get(image_url, timeout=10).content except httpx.RequestError as e: return f"An error occurred during the HTTP request to {image_url}: {e!r}" if not image_data: return f"Failed to download the image from {image_url}." file_name = f"{datetime.now(tz=UTC).astimezone():%Y-%m-%d_%H-%M-%S}.jpg" with open(file_name, "wb") as out_file: out_file.write(image_data) return f"Image downloaded and saved in the file {file_name}" if __name__ == "__main__": url = input("Enter image URL: ").strip() or "https://www.instagram.com" print(f"download_image({url}): {download_image(url)}") ================================================ FILE: web_programming/instagram_video.py ================================================ # /// script # requires-python = ">=3.13" # dependencies = [ # "httpx", # ] # /// from datetime import UTC, datetime import httpx def download_video(url: str) -> bytes: base_url = "https://downloadgram.net/wp-json/wppress/video-downloader/video?url=" video_url = httpx.get(base_url + url, timeout=10) return httpx.get(video_url, timeout=10).content if __name__ == "__main__": url = input("Enter Video/IGTV url: ").strip() file_name = f"{datetime.now(tz=UTC).astimezone():%Y-%m-%d_%H-%M-%S}.mp4" with open(file_name, "wb") as fp: fp.write(download_video(url)) print(f"Done. Video saved to disk as {file_name}.") ================================================ FILE: web_programming/nasa_data.py ================================================ # /// script # requires-python = ">=3.13" # dependencies = [ # "httpx", # ] # /// import httpx def get_apod_data(api_key: str) -> dict: """ Get the APOD(Astronomical Picture of the day) data Get your API Key from: https://api.nasa.gov/ """ url = "https://api.nasa.gov/planetary/apod" return httpx.get(url, params={"api_key": api_key}, timeout=10).json() def save_apod(api_key: str, path: str = ".") -> dict: apod_data = get_apod_data(api_key) img_url = apod_data["url"] img_name = img_url.split("/")[-1] response = httpx.get(img_url, timeout=10) with open(f"{path}/{img_name}", "wb+") as img_file: img_file.write(response.content) del response return apod_data def get_archive_data(query: str) -> dict: """ Get the data of a particular query from NASA archives """ url = "https://images-api.nasa.gov/search" return httpx.get(url, params={"q": query}, timeout=10).json() if __name__ == "__main__": print(save_apod("YOUR API KEY")) apollo_2011_items = get_archive_data("apollo 2011")["collection"]["items"] print(apollo_2011_items[0]["data"][0]["description"]) ================================================ FILE: web_programming/open_google_results.py ================================================ # /// script # requires-python = ">=3.13" # dependencies = [ # "beautifulsoup4", # "fake-useragent", # "httpx", # ] # /// import webbrowser from sys import argv from urllib.parse import parse_qs, quote import httpx from bs4 import BeautifulSoup from fake_useragent import UserAgent if __name__ == "__main__": query = "%20".join(argv[1:]) if len(argv) > 1 else quote(str(input("Search: "))) print("Googling.....") url = f"https://www.google.com/search?q={query}&num=100" res = httpx.get( url, headers={"User-Agent": str(UserAgent().random)}, timeout=10, ) try: link = BeautifulSoup(res.text, "html.parser").find("div").find("a").get("href") except AttributeError: link = parse_qs( BeautifulSoup(res.text, "html.parser").find("div").find("a").get("href") )["url"][0] webbrowser.open(link) ================================================ FILE: web_programming/random_anime_character.py ================================================ # /// script # requires-python = ">=3.13" # dependencies = [ # "beautifulsoup4", # "fake-useragent", # "httpx", # ] # /// import os import httpx from bs4 import BeautifulSoup from fake_useragent import UserAgent headers = {"UserAgent": UserAgent().random} URL = "https://www.mywaifulist.moe/random" def save_image(image_url: str, image_title: str) -> None: """ Saves the image of anime character """ image = httpx.get(image_url, headers=headers, timeout=10) with open(image_title, "wb") as file: file.write(image.content) def random_anime_character() -> tuple[str, str, str]: """ Returns the Title, Description, and Image Title of a random anime character . """ soup = BeautifulSoup( httpx.get(URL, headers=headers, timeout=10).text, "html.parser" ) title = soup.find("meta", attrs={"property": "og:title"}).attrs["content"] image_url = soup.find("meta", attrs={"property": "og:image"}).attrs["content"] description = soup.find("p", id="description").get_text() _, image_extension = os.path.splitext(os.path.basename(image_url)) image_title = title.strip().replace(" ", "_") image_title = f"{image_title}{image_extension}" save_image(image_url, image_title) return (title, description, image_title) if __name__ == "__main__": title, desc, image_title = random_anime_character() print(f"{title}\n\n{desc}\n\nImage saved : {image_title}") ================================================ FILE: web_programming/recaptcha_verification.py ================================================ """ Recaptcha is a free captcha service offered by Google in order to secure websites and forms. At https://www.google.com/recaptcha/admin/create you can create new recaptcha keys and see the keys that your have already created. * Keep in mind that recaptcha doesn't work with localhost When you create a recaptcha key, your will get two separate keys: ClientKey & SecretKey. ClientKey should be kept in your site's front end SecretKey should be kept in your site's back end # An example HTML login form with recaptcha tag is shown below

Log in

{% csrf_token %}
Below a Django function for the views.py file contains a login form for demonstrating recaptcha verification. """ # /// script # requires-python = ">=3.13" # dependencies = [ # "httpx", # ] # /// import httpx try: from django.contrib.auth import authenticate, login from django.shortcuts import redirect, render except ImportError: authenticate = login = render = redirect = print def login_using_recaptcha(request): # Enter your recaptcha secret key here secret_key = "secretKey" # noqa: S105 url = "https://www.google.com/recaptcha/api/siteverify" # when method is not POST, direct user to login page if request.method != "POST": return render(request, "login.html") # from the frontend, get username, password, and client_key username = request.POST.get("username") password = request.POST.get("password") client_key = request.POST.get("g-recaptcha-response") # post recaptcha response to Google's recaptcha api response = httpx.post( url, data={"secret": secret_key, "response": client_key}, timeout=10 ) # if the recaptcha api verified our keys if response.json().get("success", False): # authenticate the user user_in_database = authenticate(request, username=username, password=password) if user_in_database: login(request, user_in_database) return redirect("/your-webpage") return render(request, "login.html") ================================================ FILE: web_programming/reddit.py ================================================ # /// script # requires-python = ">=3.13" # dependencies = [ # "httpx", # ] # /// from __future__ import annotations import httpx valid_terms = set( """approved_at_utc approved_by author_flair_background_color author_flair_css_class author_flair_richtext author_flair_template_id author_fullname author_premium can_mod_post category clicked content_categories created_utc downs edited gilded gildings hidden hide_score is_created_from_ads_ui is_meta is_original_content is_reddit_media_domain is_video link_flair_css_class link_flair_richtext link_flair_text link_flair_text_color media_embed mod_reason_title name permalink pwls quarantine saved score secure_media secure_media_embed selftext subreddit subreddit_name_prefixed subreddit_type thumbnail title top_awarded_type total_awards_received ups upvote_ratio url user_reports""".split() ) def get_subreddit_data( subreddit: str, limit: int = 1, age: str = "new", wanted_data: list | None = None ) -> dict: """ subreddit : Subreddit to query limit : Number of posts to fetch age : ["new", "top", "hot"] wanted_data : Get only the required data in the list """ wanted_data = wanted_data or [] if invalid_search_terms := ", ".join(sorted(set(wanted_data) - valid_terms)): msg = f"Invalid search term: {invalid_search_terms}" raise ValueError(msg) response = httpx.get( f"https://www.reddit.com/r/{subreddit}/{age}.json?limit={limit}", headers={"User-agent": "A random string"}, timeout=10, ) response.raise_for_status() if response.status_code == 429: raise httpx.HTTPError(response=response) data = response.json() if not wanted_data: return {id_: data["data"]["children"][id_] for id_ in range(limit)} data_dict = {} for id_ in range(limit): data_dict[id_] = { item: data["data"]["children"][id_]["data"][item] for item in wanted_data } return data_dict if __name__ == "__main__": # If you get Error 429, that means you are rate limited.Try after some time print(get_subreddit_data("learnpython", wanted_data=["title", "url", "selftext"])) ================================================ FILE: web_programming/search_books_by_isbn.py ================================================ """ Get book and author data from https://openlibrary.org ISBN: https://en.wikipedia.org/wiki/International_Standard_Book_Number """ # /// script # requires-python = ">=3.13" # dependencies = [ # "httpx", # ] # /// from json import JSONDecodeError import httpx def get_openlibrary_data(olid: str = "isbn/0140328726") -> dict: """ Given an 'isbn/0140328726', return book data from Open Library as a Python dict. Given an '/authors/OL34184A', return authors data as a Python dict. This code must work for olids with or without a leading slash ('/'). # Comment out doctests if they take too long or have results that may change # >>> get_openlibrary_data(olid='isbn/0140328726') # doctest: +ELLIPSIS {'publishers': ['Puffin'], 'number_of_pages': 96, 'isbn_10': ['0140328726'], ... # >>> get_openlibrary_data(olid='/authors/OL7353617A') # doctest: +ELLIPSIS {'name': 'Adrian Brisku', 'created': {'type': '/type/datetime', ... """ new_olid = olid.strip().strip("/") # Remove leading/trailing whitespace & slashes if new_olid.count("/") != 1: msg = f"{olid} is not a valid Open Library olid" raise ValueError(msg) return httpx.get( f"https://openlibrary.org/{new_olid}.json", timeout=10, follow_redirects=True ).json() def summarize_book(ol_book_data: dict) -> dict: """ Given Open Library book data, return a summary as a Python dict. """ desired_keys = { "title": "Title", "publish_date": "Publish date", "authors": "Authors", "number_of_pages": "Number of pages", "isbn_10": "ISBN (10)", "isbn_13": "ISBN (13)", } data = {better_key: ol_book_data[key] for key, better_key in desired_keys.items()} data["Authors"] = [ get_openlibrary_data(author["key"])["name"] for author in data["Authors"] ] for key, value in data.items(): if isinstance(value, list): data[key] = ", ".join(value) return data if __name__ == "__main__": import doctest doctest.testmod() while True: isbn = input("\nEnter the ISBN code to search (or 'quit' to stop): ").strip() if isbn.lower() in ("", "q", "quit", "exit", "stop"): break if len(isbn) not in (10, 13) or not isbn.isdigit(): print(f"Sorry, {isbn} is not a valid ISBN. Please, input a valid ISBN.") continue print(f"\nSearching Open Library for ISBN: {isbn}...\n") try: book_summary = summarize_book(get_openlibrary_data(f"isbn/{isbn}")) print("\n".join(f"{key}: {value}" for key, value in book_summary.items())) except JSONDecodeError: print(f"Sorry, there are no results for ISBN: {isbn}.") ================================================ FILE: web_programming/slack_message.py ================================================ # Created by sarathkaul on 12/11/19 # /// script # requires-python = ">=3.13" # dependencies = [ # "httpx", # ] # /// import httpx def send_slack_message(message_body: str, slack_url: str) -> None: headers = {"Content-Type": "application/json"} response = httpx.post( slack_url, json={"text": message_body}, headers=headers, timeout=10 ) if response.status_code != 200: msg = ( "Request to slack returned an error " f"{response.status_code}, the response is:\n{response.text}" ) raise ValueError(msg) if __name__ == "__main__": # Set the slack url to the one provided by Slack when you create the webhook at # https://my.slack.com/services/new/incoming-webhook/ send_slack_message("", "") ================================================ FILE: web_programming/test_fetch_github_info.py ================================================ import json import httpx from .fetch_github_info import AUTHENTICATED_USER_ENDPOINT, fetch_github_info def test_fetch_github_info(monkeypatch): class FakeResponse: def __init__(self, content) -> None: assert isinstance(content, (bytes, str)) self.content = content def json(self): return json.loads(self.content) def mock_response(*args, **kwargs): assert args[0] == AUTHENTICATED_USER_ENDPOINT assert "Authorization" in kwargs["headers"] assert kwargs["headers"]["Authorization"].startswith("token ") assert "Accept" in kwargs["headers"] return FakeResponse(b'{"login":"test","id":1}') monkeypatch.setattr(httpx, "get", mock_response) result = fetch_github_info("token") assert result["login"] == "test" assert result["id"] == 1 ================================================ FILE: web_programming/world_covid19_stats.py ================================================ #!/usr/bin/env python3 """ Provide the current worldwide COVID-19 statistics. This data is being scrapped from 'https://www.worldometers.info/coronavirus/'. """ # /// script # requires-python = ">=3.13" # dependencies = [ # "beautifulsoup4", # "httpx", # ] # /// import httpx from bs4 import BeautifulSoup def world_covid19_stats( url: str = "https://www.worldometers.info/coronavirus/", ) -> dict: """ Return a dict of current worldwide COVID-19 statistics """ soup = BeautifulSoup( httpx.get(url, timeout=10, follow_redirects=True).text, "html.parser" ) keys = soup.find_all("h1") values = soup.find_all("div", {"class": "maincounter-number"}) keys += soup.find_all("span", {"class": "panel-title"}) values += soup.find_all("div", {"class": "number-table-main"}) return {key.text.strip(): value.text.strip() for key, value in zip(keys, values)} if __name__ == "__main__": print("\033[1m COVID-19 Status of the World \033[0m\n") print("\n".join(f"{key}\n{value}" for key, value in world_covid19_stats().items()))