bugGNU Scientific Library - Bugs: bug #66850, Feature: special cases...

 
 

You are not allowed to post comments on this tracker with your current authentication level.

bug #66850: Feature: special cases hypergeometric2F1(a+1, b, a, x) and hypergeometric2F1(a, b+1, b, x)

Submitter:  Fermé le Lundi <fermelelundi>
Submitted:  Wed 26 Feb 2025 12:16:00 PM UTC
   
 
Category:  Build Severity:  3 - Normal
Operating System:  Status:  None
Assigned to:  None Open/Closed:  Open
Release:  2.8

Thu 27 Feb 2025 11:40:34 AM UTC, comment #1: 

Though the solution is exact and performant (it circumvents the use of series or continued fraction calculations), it has the same limitations: numerous test cases fail regardless of whether the patch is installed. The following test cases can be added tp specfunc/test_hyperg.c:

  TEST_SF(s, gsl_sf_hyperg_2F1_e, (1, 4, 3, -1/2.0, &r), 16/27.0, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (1, 40, 39, -1/2.0, &r), 232/351.0, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (1, 400, 399, -1/2.0, &r), 2392/3591.0, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (10, 40, 39, -1/2.0, &r), 0.0158593478717443560201269, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (20, 14, 13, -1/3.0, &r), 0.00195151503934399583018743074, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (2, 14, 13, -1/3.0, &r), 225/416.0, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (2, 14, 13, -1/9.0, &r), 1296/1625.0, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (2, 2, 1, -1/9.0, &r), 81/125.0, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (2, 2, 1, -1/10.0, &r), 900/1331.0, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (4, 2, 1, -1, &r), -1/16.0, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (8, 2, 1, -1, &r), -3/256.0, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (10, 2, 1, -1, &r), -1/256.0, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (-1, 2, 1, -1, &r), 3, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (-1, 5, 4, -1, &r), 9/4.0, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (-1, 15, 14, 10, &r), -68/7.0, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (-1, 3, 2, 1, &r), -0.5, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (-1, 3, 2, 10, &r), -14, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (-1, 3, 2, 100, &r), -149, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (-1, 3, 2, 1000, &r), -1499, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (-1, 3, 2, 10000, &r), -14999, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (3, 1, 2, -1, &r), 3/8.0, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (4, 1, 3, -1, &r), 5/12.0, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (14, 1, 13, -1, &r), 25/52.0, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (140, 1, 139, -1, &r), 277/556.0, TEST_TOL0, GSL_SUCCESS);

  /* the following test cases fail */
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (1, 1, 0, 0, &r), undefined, TEST_TOL0, GSL_SUCCESS);   /* undefined, hence needs special handling */
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (100, 2, 1, -1/2.0, &r), -7.9528826459414479705549e-17, TEST_TOL0, GSL_SUCCESS); /* accuracy */
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (100, 3, 2, -1/2.0, &r), -3.8534586016417325218152e-17, TEST_TOL0, GSL_SUCCESS); /* accuracy */
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (20, 40, 39, -1/2.0, &r), 0.0002493220513051845892, TEST_TOL0, GSL_SUCCESS);     /* accuracy */
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (20, 14, 13, -1/2.0, &r), 0.00014650883427211877925283, TEST_TOL0, GSL_SUCCESS); /* accuracy */
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (8, 2, 1, -2, &r), -13/19683.0, TEST_TOL0, GSL_SUCCESS);                         /* a too large */
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (3, 2, 1, -12, &r), -23/28561.0, TEST_TOL0, GSL_SUCCESS);                        /* x too large (abs) */
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (-1, 4, 3, -1, &r), 7/3.0, TEST_TOL0, GSL_SUCCESS);                              /* accuracy */
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (-1, 15, 14, -1, &r), 29/14.0, TEST_TOL0, GSL_SUCCESS);                          /* accuracy */
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (2, 15, 14, 10, &r), 53/5103.0, TEST_TOL0, GSL_SUCCESS);                         /* x too large */
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (3, 15, 14, 10, &r), -16/15309.0, TEST_TOL0, GSL_SUCCESS);                       /* x too large */
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (-3, 15, 14, 10, &r), -6318/7.0, TEST_TOL0, GSL_SUCCESS);                        /* x too large */
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (-3, 5, 4, 5, &r), -124, TEST_TOL0, GSL_SUCCESS);                                /* x too large */
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (-1, 4, 3, 10000, &r), -39997/3.0, TEST_TOL0, GSL_SUCCESS);                      /* x too large */
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (-2, 4, 3, 1000, &r), -1664001, TEST_TOL0, GSL_SUCCESS);                         /* x too large */
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (-3, 4, 3, 1000, &r), -1995003999, TEST_TOL0, GSL_SUCCESS);                      /* x too large */
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (-3, 3, 2, 1000, &r), -2494004499, TEST_TOL0, GSL_SUCCESS);                      /* x too large */
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (-3, 2, 1, 1000, &r), -3991005999, TEST_TOL0, GSL_SUCCESS);                      /* x too large */
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (-8, 2, 1, 10, &r), 425684241, TEST_TOL0, GSL_SUCCESS);                          /* x too large? */
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (-10, -10, -11, 100, &r), 7391185002367640001, TEST_TOL0, GSL_SUCCESS);          /* x too large? */
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (-10, -10, -11, 10, &r), -387420489/11.0, TEST_TOL0, GSL_SUCCESS);               /* x too large? */
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (14, 1, 13, -1/2, &r), 76/117.0, TEST_TOL0, GSL_SUCCESS);
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (14, 1, 13, -2, &r), 37/117.0, TEST_TOL0, GSL_SUCCESS);
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (140, 1, 139, -2, &r), 415/1251.0, TEST_TOL0, GSL_SUCCESS);
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (140, 1, 139, 1/2, &r), 280/139.0, TEST_TOL0, GSL_SUCCESS);
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (140, 1, 139, 2, &r), -137/139.0, TEST_TOL0, GSL_SUCCESS);
  // TEST_SF(s, gsl_sf_hyperg_2F1_e, (11, 10, 10, -3, &r), 2.384185791015625e-07, TEST_TOL0, GSL_SUCCESS);

Hence further development needed and almost certainly the use of the pow-function needs to be reviewed.

Fermé le Lundi <fermelelundi>
Wed 26 Feb 2025 12:16:00 PM UTC, original submission:  

Two more special cases for hypergeometric2F1:
hypergeometric2F1(a+1, b, a, x) = ((1 - x)^(-b) (-a + a x - b x))/(a (-1 + x)), where a not equal 0
hypergeometric2F1(a, b+1, b, x) = ((1 - x)^(-a) (-b - a x + b x))/(b (-1 + x)), where b not equal 0

Or, simplified and in Latex:
_2F_1(a+1, b, a, x) = \frac{1 - (1-\frac{b}{a})x}{(1-x)^{b+1}} \\
_2F_1(a, b+1, b, x) = \frac{1 - (1-\frac{a}{b})x}{(1-x)^{a+1}}

The attached diff-file includes these cases and below some test cases for inclusion into specfunc/test_hyperg.c:

  TEST_SF(s, gsl_sf_hyperg_2F1_e, (2, 1, 1, 0, &r), 1, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (3, 2, 2, 0, &r), 1, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (4, 200, 3, 0, &r), 1, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (4, -500, 3, 0, &r), 1, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (2, 1, 1, 1/2.0, &r), 4, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (4, 1, 3, 1/2.0, &r), (2/3.0)+2, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (5, 1, 4, 1/2.0, &r), 2.5, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (10, 1, 9, 1/2.0, &r), (2/9.0)+2, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (-9, 1, -10, 1/2.0, &r), 9217/5120.0, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (3, -1, 2, -1, &r), 5/2.0, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (-3, -1, -4, -1, &r), 7/4.0, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (2, -1, 1, -1, &r), 3, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (11, -1, 10, -1, &r), 2.1, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (0, 1, 2, 0, &r), 1, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (1, 3, 2, 0, &r), 1, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (2, 30, 29, 0, &r), 1, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (200, -1, -2, 0, &r), 1, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (-500, -1, -2, 0, &r), 1, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (1, 5, 4, 1/2.0, &r), 5/2.0, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (1, 15, 14, 1/2.0, &r), 15/7.0, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (1, -2, -3, 1/2.0, &r), 17/12.0, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (1, -12, -13, 1/2.0, &r), 98305/53248.0, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (-1, 5, 4, -1, &r), 9/4.0, TEST_TOL0, GSL_SUCCESS);
  TEST_SF(s, gsl_sf_hyperg_2F1_e, (-1, 3, 2, -1, &r), 2.5, TEST_TOL0, GSL_SUCCESS);

Fermé le Lundi <fermelelundi>

 

(Note: upload size limit is set to 16384 kB, after insertion of the required escape characters.)

Attached Files

 

Depends on the following items: None found

Items that depend on this one: None found

 

Carbon-Copy List
  • -email is unavailable- added by fermelelundi (Submitted the item)
  •  

    Follows 1 latest change.

    Date Changed by Updated Field Previous Value => Replaced by
    2025-02-26 fermelelundi Attached File- Added specfunc_hyperg_2F1.diff, #56955

    Back to the top

    Powered by Savane 3.15-e6e5.
    Corresponding source code