/* $Id: t_mpJacobi.c $ */

/*
 * Copyright (C) 2001-26 David Ireland, D.I. Management Services Pty Limited
 * <https://di-mgt.com.au/contact/> <https://di-mgt.com.au/bigdigits.html>
 * SPDX-License-Identifier: MPL-2.0
 *
 * Last updated:
 * $Date: 2026-03-29 08:07:00 $
 * $Revision: 2.7.0 $
 * $Author: dai $
 */

/* Some tests of the mpJacobi function using an example taken from ANSI X9.31 Appendix D.5.2. */

#include <stdio.h>
#include <assert.h>
#include "bigdigits.h"

#define TEST_LEN (1024/8)

char *strA = 
    "6BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
    "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
    "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
    "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
    "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
    "BBBBBBBBBBBAA9993E364706816ABA3E25717850"
    "C26C9CD0D89D33CC";

const char *strN = 
    "CCD34C2F4D95FFAD1420E666C07E39D1450A1330"
    "4C3F5891EDE57595C772A3691AB51D2BECE1476B"
    "8F22AE223365F183BC3EE2D4CACDBA3AD0C4D478"
    "1C523A10EFE6203D6F3BC226BF9A459727B8F122"
    "C482D8C86019F9A869329187096430A6C67CB103"
    "742BCBC66906AD23836EBABB511D5D80AB8CB599"
    "74E9AAC62D785C45";

int main(void)
{
    size_t ndigits = TEST_LEN;
    DIGIT_T a[TEST_LEN];
    DIGIT_T n[TEST_LEN];
    int j;

    /* Use numbers from X9.31 Appendix D.5.2 */
    mpConvFromHex(a, ndigits, strA);
    mpConvFromHex(n, ndigits, strN);
    mpPrintHex("n=\n", n, ndigits, "\n");
    mpPrintHex("a=\n", a, ndigits, "\n");
    j= mpJacobi(a, n, ndigits);
    printf("Jacobi(a/n)=%d\n", j); // Expected -1
    assert(j == -1);

    /* Divide a by 2 */
    mpShiftRight(a, a, 1, ndigits);
    mpPrintHex("a=a/2=\n", a, ndigits, "\n");
    j= mpJacobi(a, n, ndigits);
    printf("Jacobi(a/n)=%d\n", j); // Expected +1
    assert(j == +1);

    /* Make n|a */
    mpShortMult(a, n, 7, ndigits);
    mpPrintHex("a=n*7=\n", a, ndigits, "\n");
    j= mpJacobi(a, n, ndigits);
    printf("Jacobi(a/n)=%d\n", j); // Expected 0
    assert(j == 0);

    printf("Jacobi tests completed OK\n");

    return 0;
}