To study and get intuition on different types of relational algebras (groups, semigroups, and their ordered versions, quasigroups, fields, rings, MV-algebras, lattices, etc.), mathematicians resort to libraries of all models, up to isomorphism, of order n (for small values of n) of the classes of algebras they are interested in. These libraries allow experimentation such as forming and/or testing conjectures etc., to gain insights into the classes of algebras in question. Since an isomorphism partitions the set of all models into equivalence classes, so, only one representative element in each equivalence class is needed. The rest of them are redundant and are removed to make it easy to discern the structure of the algebras. To construct these libraries, we need first to find all models up to isomorphism of the classes of algebras of interest. Enumerating all finite models from first-order formulas up to isomorphism is a hard problem, even for algebras of small orders. The current best practice of finite model enumeration is to divide the job into two steps: first generate models according to the laws laid down by the first-order formula defining the class of algebra, then in the post-processing step, find only one representative model of each equivalence class of isomorphic models. An algebra of finite order n defined by a first-order formula can be represented by operation tables (also known as multiplication tables) of finite sizes. Traditional finite model enumerators such as Mace4 basically perform combinatorial search on these operation tables to find instances that satisfy, or equivalently, not violate, the rules laid down by the first-order formula. This is a hard problem. For example, there are n n 2 possible binary operation tables of size n × n with n possible values in each cell. That is, even to enumerate all models of order 4 defined with just one binary operation in its first-order formula, we are facing the task of checking 4 4 2 ≈ 4.3 billion possibilities. Traditional finite model enumerators also produce a lot of isomorphic models to the extent that isomorphism models often constitute over 99% of the outputs. This is a characteristics of algebras definable by FOL: any permutation on the domain elements of a model is a model. Finding non-isomorphic models is very computationally intensive. If we follow a simple brute-force approach, then, given m models, it may require in the worst case m(m −1)/2 comparisons of models to check for isomorphism. Each comparison of models of order n may require in the worst case n! checks because there are n! different permutations on n symbols. Thus, both of these two steps (generating models from FOL and removing isomorphic models) are resource-intensive. They prompt us to find better algorithms that also make optimal use of the available computing resources. The matter is further complicated by the fact that while modern-day generalpurpose computers are predominantly multi-core, harnessing parallelism for combinatorial search is surprisingly difficult. In this thesis, we propose the isomorphic cubes removal algorithm and the parallel cubes search algorithm to improve the speed of the traditional finite model enumerator. Searching the operation tables can be seen as searching a search tree. Any partial branch from the root (called a cube) can be searched in parallel with other branches, making full use of the computing resources available. Furthermore, some (isomorphic) cubes produce isomorphic models and hence only one of them needs to be searched. Removing isomorphic cubes not only speeds up the search process, but also reduces the number of isomorphic models that need to be removed in the post-processing step. These parallel algorithms are very scalable: more cubes can be generated if more computing resources are available. They also cope with big problems well: longer cubes are possible with higher orders of algebra; with longer cubes, more isomorphic cubes can be removed. To speed up the isomorphic models removal process, we propose the parallel invariant-based isomorphic model removal algorithms. We note that models with different sets of invariant vectors (ordered list of invariants) cannot be isomorphic. We put models into blocks in a hash-table using invariant vectors as the keys. Models across different blocks thus have different sets of invariant vectors and hence cannot be isomorphic. These blocks of models can be checked for isomorphism separately in parallel. The improvement in speed comes from (1) smaller block size means fewer pairs of models to compare for isomorphism, (2) the blocks can be processed in parallel, making full use of the computing resources available. These algorithms also cope with big problems well: models of higher orders give more different invariant vectors to spread out the models. These algorithms together often give an improvement of orders of magnitude in the performance of the traditional finite model enumerators. Better yet, these algorithms can be incorporated in many common finite model enumerators with minimal change in their code base. Furthermore, the proposed algorithms are proved to be correct. In any mathematical research, humans are the most important factor to be given considerations. Not all mathematicians are computer experts, and not all of them want to invest their valuable time in the tools of mathematics. Thus, the tools must be designed to be user-friendly, without a steep learning curve for the user to be able to use the tools effectively. We therefore develop a GAP package generator to automatically generate GAP package for algebras of small orders. The generator hides the technical details of the generation process, but gives users the ability to control many of the non-technical aspects such as the name and the definition (in FOL) of the algebra to be explored. The GAP package generator makes extensive use of the facilities provided by the GAP system, and the generated package complies with the latest GAP standards. A separate, standalone GAP package, Magmaut, is developed to provide functions to manipulate isomorphism and automorphism for algebras of type (2 m, 1 n). It supplements the generated GAP package of algebra of small orders with isomorphism-related functionality. With the tools provided by this project, mathematicians can generate the GAP packages of algebras of type (2 m, 1 n) of their interest, without being bogged down by the complexity that often comes with the tools that generate such GAP packages. In this thesis, we propose many parallel algorithms to take advantage of modern-day multi-core computers to enumerate finite models. We show some important applications of these algorithms in developing GAP packages to calculate different morphisms such as isomorphism and monomorphism etc., in generating GAP packages of algebras, and in counting the number of algebras of small orders. We also develop a user-friendly tool to help mathematicians to generate GAP packages of algebras (of type (2 m, 1 n)) of small orders. Para estudar e compreender diferentes tipos de álgebras relacionais (grupos, semigrupos e suas versões ordenadas, quasigrupos, corpos, anéis, MV- álgebras, reticulados, etc.), os matemáticos recorrem a bibliotecas de todos os modelos, a menos de isomorfismo, de ordem n (para pequenos valores de n) de classes de álgebras de seu interesse. Essas bibliotecas permitem experimentação, como formular e/ou testar conjeturas, etc., para obter intuição sobre as classes de álgebras em questão. Como um isomorfismo divide o conjunto de todos os modelos em classes de equivalência, apenas um elemento representativo em cada classe de equivalência é necessário. Os demais são redundantes e foram removidos para melhor se entender a estrutura das álgebras. Para construir essas bibliotecas, precisamos encontrar todos os modelos a menos de isomorfismo de classes de álgebras em que estamos interessados. Enumerar todos os modelos finitos de fórmulas de álgebras de primeira ordem a menos de isomorfismo é um problema difícil, mesmo para álgebras de ordens pequenas. Atualmente, a melhor estratégia de enumeração de modelos finitos é dividir o trabalho em duas fases: primeiro, gerir modelos de acordo com as leis estabelecidas pela fórmula de primeira ordem que definem a álgebra, depois, na etapa de pós-processamento, encontrar apenas um modelo representativo de cada classe de equivalência de modelos isomórficos. Uma álgebra de ordem finita não definida com fórmulas de primeira ordem, pode ser representada por tabelas de operações (também conhecidas como multiplicação) de tamanhos finitos. Os enumeradores de modelos finitos tradicionais, como Mace4, basicamente executam pesquisas combinatórias nessas tabelas de operação para encontrar instâncias que satisfaçam, ou equivalentemente, não violem as regras estabelecidas pela fórmula de primeira ordem. Isto constitui um enorme problema. Por exemplo, existem nn 2 possíveis tabelas de operações binárias de tamanho n × n com n valores possíveis em cada célula. Ou seja, mesmo para enumerar todos os modelos de ordem 4 para uma álgebra definida com apenas uma operação binária em sua fórmula de primeira ordem, estamos diante da tarefa de verificar 442 ≈ 4.3 mil milhões de possibilidades. Os enumeradores de modelos finitos tradicionais também produzem muitos modelos isomórficos na medida em que os modelos de isomorfismo geralmente constituem mais de 99% das saídas. Esta é uma característica das álgebras definíveis por FOL: qualquer permutação nos elementos de domínio de um modelo é um modelo. Encontrar modelos não isomórficos é computacionalmente muito dispendioso. Se seguirmos uma abordagem simples de força bruta, então, dados os modelos m, pode ser necessário, no pior caso, m (m − 1)/2 comparações de modelos para verificar o isomorfismo. Cada comparação de modelos de ordem n não pode exigir, no pior caso, n! verificações porque existem n! permutações diferentes nos símbolos n. Assim, essas duas etapas (gerar modelos de FOL e remover modelos isomórficos) consomem muitos recursos. Somos assim impelidos a encontrar algoritmos melhores que façam uso otimizado dos recursos de computação disponíveis. A questão é ainda mais complicada pelo fato de que, embora os computadores modernos de uso geral sejam predominantemente multi-core, aproveitar o paralelismo para a pesquisa combinatória é surpreendentemente difícil. Nesta tese, propomos o algoritmo de remoção de cubos isomórficos e o algoritmo de busca de cubos paralelos para melhorar a velocidade do enumerador de modelos finitos tradicional. A pesquisa nas tabelas de operações pode ser vista como uma pesquisa numa árvore de pesquisa. Qualquer ramo parcial da raiz (chamado cubo) pode ser pesquisado em paralelo com outros ramos, fazendo pleno uso dos recursos computacionais disponíveis. Além disso alguns cubos produzem modelos isomórficos e, portanto, apenas um deles precisa ser pesquisado. A remoção de cubos isomórficos não apenas acelera o processo de busca, mas também reduz o número de modelos isomórficos que precisam ser removidos na etapa de pós-processamento. Esses algoritmos paralelos são muito escaláveis: mais cubos podem ser gerados se mais recursos de computação estiverem disponíveis. Eles também lidam bem com grandes problemas: cubos mais longos são possíveis com ordens mais altas de álgebra; com cubos mais longos, cubos mais isomórficos podem ser removidos. Para acelerar o processo de remoção de modelos isomórficos, propomos os algoritmos de remoção de modelos isomórficos baseados em invariantes paralelos. Notamos que modelos com diferentes conjuntos de vetores invariantes não podem ser isomórficos. Colocamos modelos em blocos numa tabela de hash usando vetores invariantes como chaves. Modelos em diferentes blocos, portanto, têm diferentes conjuntos de vetores invariantes e, portanto, não podem ser isomórficos. Esses blocos de modelos podem ser verificados quanto ao isomorfismo, separadamente, em paralelo. A melhoria na velocidade obtém-se por (1) tamanho de bloco menor significa menos pares de modelos para comparar em termos de isomorfismo, (2) os blocos podem ser processados em paralelo, fazendo pleno uso dos recursos computacionais disponíveis. Esses algoritmos também lidam bem com grandes problemas: modelos de ordens mais altas fornecem mais vetores invariantes o que permite maior dispersão dos modelos. A junção desses algoritmos geralmente permite uma acentuada melhoria no desempenho dos enumeradores de modelos finitos tradicionais. Melhor ainda, esses algoritmos podem ser incorporados em muitos enumeradores de modelos finitos comuns com alterações mínimas no seu código base. Além disso, os algoritmos propostos são comprovadamente corretos. Em qualquer pesquisa matemática, o ser humano é o fator mais importante a ser considerado. Nem todos os matemáticos são especialistas em computação e nem todos querem investir o seu valioso tempo em ferramentas matemáticas. Assim, as ferramentas devem ser projetadas para serem fáceis de usar, sem uma curva de aprendizagem íngreme para que o utilizador possa usar as ferramentas de forma eficaz. Nesse sentido, desenvolvemos um gerador de pacotes GAP para gerar automaticamente pacotes GAP para álgebras de pequenas ordens. O gerador oculta os detalhes técnicos do processo de geração, mas dão aos utilizadores a capacidade de controlar muitos dos aspetos não técnicos, como o nome e a definição (em FOL) da álgebra a ser explorada. O gerador de pacotes GAP faz uso extensivo das facilidades fornecidas pelo sistema GAP, e o pacote gerado está em conformidade com os padrões GAP mais recentes. Um pacote GAP separado e autónomo, Magmaut, é desenvolvido para fornecer funções que permitam a manipulação de isomorfismos e automorfismos para álgebras do tipo (2m, 1n). Ele complementa o pacote GAP gerado para álgebra de pequenas ordens com funcionalidades relacionadas com o isomorfismo. Com as ferramentas fornecidas por este projeto, os matemáticos podem gerar os pacotes GAP de álgebras do tipo (2m, 1n) de seu interesse, sem se prenderem à complexidade que muitas vezes vem com as ferramentas que geram tais pacotes GAP. Nesta tese, propomos ainda muitos algoritmos paralelos para aproveitar os computadores multinúcleos modernos para enumerar modelos finitos de álgebras. Mostramos algumas aplicações importantes desses algoritmos no desenvolvimento de pacotes GAP para calcular diferentes morfismos como isomorfismo e monomorfismo etc., na geração de pacotes GAP de álgebras e na contagem do número de álgebras de pequenas ordens. Também desenvolvemos uma ferramenta de fácil utilização para ajudar os matemáticos a gerar pacotes GAP de álgebras (do tipo (2m, 1n)) de pequenas ordens.