z3-z3-4.13.0.src.util.mpn.h Maven / Gradle / Ivy
The newest version!
/*++
Copyright (c) 2011 Microsoft Corporation
Module Name:
mpn.h
Abstract:
Multi Precision Natural Numbers
Author:
Christoph Wintersteiger (cwinter) 2011-11-16.
Revision History:
--*/
#pragma once
#include
#include "util/util.h"
#include "util/buffer.h"
typedef unsigned int mpn_digit;
class mpn_manager {
public:
int compare(mpn_digit const * a, unsigned lnga,
mpn_digit const * b, unsigned lngb) const;
bool add(mpn_digit const * a, unsigned lnga,
mpn_digit const * b, unsigned lngb,
mpn_digit *c, unsigned lngc_alloc,
unsigned * plngc) const;
bool sub(mpn_digit const * a, unsigned lnga,
mpn_digit const * b, unsigned lngb,
mpn_digit * c, mpn_digit * pborrow) const;
bool mul(mpn_digit const * a, unsigned lnga,
mpn_digit const * b, unsigned lngb,
mpn_digit * c) const;
bool div(mpn_digit const * numer, unsigned lnum,
mpn_digit const * denom, unsigned lden,
mpn_digit * quot,
mpn_digit * rem);
char * to_string(mpn_digit const * a, unsigned lng,
char * buf, unsigned lbuf) const;
private:
using mpn_sbuffer = sbuffer;
void display_raw(std::ostream & out, mpn_digit const * a, unsigned lng) const;
unsigned div_normalize(mpn_digit const * numer, unsigned lnum,
mpn_digit const * denom, unsigned lden,
mpn_sbuffer & n_numer,
mpn_sbuffer & n_denom) const;
void div_unnormalize(mpn_sbuffer & numer, mpn_sbuffer & denom,
unsigned d, mpn_digit * rem) const;
bool div_1(mpn_sbuffer & numer, mpn_digit denom,
mpn_digit * quot) const;
bool div_n(mpn_sbuffer & numer, mpn_sbuffer const & denom,
mpn_digit * quot, mpn_digit * rem,
mpn_sbuffer & ms, mpn_sbuffer & ab) const;
void trace(mpn_digit const * a, unsigned lnga,
mpn_digit const * b, unsigned lngb,
const char * op) const;
void trace(mpn_digit const * a, unsigned lnga) const;
void trace_nl(mpn_digit const * a, unsigned lnga) const;
};