Revision 371fb45476f4f481c803a62229edec1095f7bf30 authored by Emmanuel Thomé on 17 January 2013, 18:25:58 UTC, committed by Emmanuel Thomé on 17 January 2013, 18:26:51 UTC
1 parent 2b6f189
hashpair.c
#include "cado.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <inttypes.h>
#include "hashpair.h"
#include "utils.h"
void
hashClear(hashtable_t *H)
{
MEMSETZERO(H->hc, H->hm);
MEMSETZERO(H->ht, H->hm);
}
/* need64 is non-zero if we need 64-bit fields for primes and/or ideals */
void
hashInit (hashtable_t *H, HR_T n, unsigned int verbose)
{
H->hm = (HR_T) (ulong_nextprime ((unsigned long) ((n>>1)*3)));
if (verbose) fprintf (stderr, "# hashmod = %lu\n", (unsigned long) H->hm);
SMALLOC(H->hc, H->hm, "hashInit 1");
SMALLOC(H->ht, H->hm, "hashInit 2");
if (verbose) fprintf (stderr, "Hash table:\n"
"Hash (p,r) uses %zu-bit type, hash index uses %zu-bit type,\n"
"Allocated hash table of total size %lu MB\n",
sizeof(HT_T) * CHAR_BIT, sizeof(HR_T) * CHAR_BIT,
(unsigned long) (H->hm * (sizeof(HC_T) + sizeof(ht_t))) >> 20);
H->hr = NULL;
hashClear (H);
}
void
hashFree (hashtable_t *H)
{
SFREE(H->hc);
SFREE(H->ht);
SFREE(H->hr);
}
void
hashCheck (hashtable_t *H)
{
HR_T nb = 0;
HC_T *p = H->hc, *m = &(H->hc[H->hm]);
while (p != m) if (*p++) nb++;
fprintf(stderr, "Hash table %1.1f%% full (%lu entries vs size %lu)\n",
100.0 * (double) nb / (double) H->hm, (unsigned long) nb, (unsigned long) H->hm);
}
/* special values of the root r:
p for a projective root (can happen both in normal relations when p
divides b, or in free relations when p divides
the leading coefficient of f)
p+2 for rational ideals */
HR_T
hashInsertWithKey(hashtable_t *H, HT_T p, HT_T r, HR_T h, unsigned int *f)
{
for ( ; ; ) {
if (H->ht[h].p == p && H->ht[h].r == r) {
if (H->hc[h] < UMAX(H->hc[h])) (H->hc[h])++;
*f = 0;
return h;
}
if (!(H->hc[h])) {
H->ht[h] = (ht_t) { p, r };
H->hc[h] = 1;
*f = 1;
return h;
}
h++;
if (h >= H->hm) h = 0;
}
}
HR_T
hashInsert(hashtable_t *H, HT_T p, HT_T r, unsigned int *f)
{
return HASHINSERT(H,p,r,f);
}
![swh spinner](/static/img/swh-spinner.gif)
Computing file changes ...