diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/numerica/numerica-plus.def')
-rw-r--r-- | Master/texmf-dist/tex/latex/numerica/numerica-plus.def | 876 |
1 files changed, 0 insertions, 876 deletions
diff --git a/Master/texmf-dist/tex/latex/numerica/numerica-plus.def b/Master/texmf-dist/tex/latex/numerica/numerica-plus.def deleted file mode 100644 index 6301dc96434..00000000000 --- a/Master/texmf-dist/tex/latex/numerica/numerica-plus.def +++ /dev/null @@ -1,876 +0,0 @@ -% This is file `numerica-plus.def', -% part of the `numerica' package. -% -% This work may be distributed and/or modified under the conditions -% of the LaTeX Project Public License, either version 1.3c of this -% license or any later version; see -% http://www.latex-project.org/lppl.txt -% -% Andrew Parsloe (ajparsloe@gmail.com) -% -\ProvidesExplFile - {numerica-plus.def} - {2021/02/15} - {1.0.0} - { Iterate functions, find fixed points, zeros, extrema and recurrence terms } -%---------------------------------------------------------- -\cs_new_protected:Npn \__nmc_plus_reuse:nNN #1#2#3 - { - \int_case:nnF { #1 } - { - { 1 } - { - \seq_pop:NN #2 \l_tmpa_tl - \seq_pop:NN #3 \l_tmpb_tl - \tl_gset:Nx \g__nmc_reuse_tl { { \l_tmpa_tl , \l_tmpb_tl } } - \seq_mapthread_function:NNN #2 #3 \__nmc_plus_reuse_display:nn - } - { 2 } - { - \tl_gset:Nx \g__nmc_reuse_tl - { \seq_use:Nn #3 { , } } - } - } - { \tl_gset_eq:NN \g__nmc_reuse_tl \l_nmc_result_tl } - } -\cs_new_protected:Npn \__nmc_plus_reuse_display:nn #1#2 - { \tl_gput_right:Nx \g__nmc_reuse_tl { , { #1 , #2 } } } -%-------------------------------------- -% \nmcIterate -\int_new:N \l__nmc_iter_total_int -\int_new:N \l__nmc_iter_view_int -\int_new:N \l__nmc_iter_round_int -\tl_new:N \l__nmc_iter_var_tl -\fp_new:N \l__nmc_iter_first_fp -\seq_new:N \l__nmc_iter_result_seq -\seq_new:N \l__nmc_iter_index_seq - -\fp_new:N \l__nmc_iter_fixedpti_fp -\fp_new:N \l__nmc_iter_fixedptii_fp - -\tl_new:N \l__nmc_iter_begin_tl -\tl_new:N \l__nmc_iter_end_tl -\tl_new:N \g__nmc_iter_info_tl - -\nmc_define:nnN { \nmcIterate } { iter } \iter - -\cs_new_protected:Npn \__nmc_iter_settings_digest: - { - \bool_set_false:N \l__nmc_allow_TF_out_bool - \int_set:Nn \l__nmc_iter_total_int - { \int_max:nn { \l__nmc_iter_total_int } { 1 } } - \int_set:Nn \l__nmc_iter_view_int - { \int_min:nn { \int_max:nn { \l__nmc_iter_view_int } - { 1 } } { \l__nmc_iter_total_int } } - } -\cs_new_protected:Npn \__nmc_iter_vv_digest:N #1 - { - \tl_if_empty:NTF \l__nmc_iter_var_tl - { \__nmc_vv_digest:N #1 } - { - \clist_push:NV \l__nmc_formula_tl \l__nmc_iter_var_tl - \__nmc_vv_digest:N #1 - \clist_pop:NN \l__nmc_formula_tl \l__nmc_iter_var_tl - } - } -\cs_new_protected:Npn \__nmc_iter_process: - { - \int_set:Nn \l__nmc_iter_round_int - { \l__nmc_round_int + \l__nmc_iter_extra_int } - % first iterate - \__nmc_error_where:n { formula } - \tl_clear:N \l__nmc_fp_expr_tl - \__nmc_fpify:VN \l__nmc_formula_tl \l__nmc_fp_expr_tl - \fp_set:Nn \l__nmc_result_fp { \l__nmc_fp_expr_tl } - \__nmc_error_fpflag: - - \bool_if:NF \g__nmc_error_bool - { - \fp_set_eq:NN \l__nmc_iter_first_fp \l__nmc_result_fp - \tl_if_empty:NT \l__nmc_iter_var_tl - { % get iter. var if unspecified - \seq_get:NN \l__nmc_vv_all_seq \l_tmpa_tl - \__nmc_vv_split_item:V \l_tmpa_tl - \tl_set_eq:NN \l__nmc_iter_var_tl \l__nmc_eq_var_tl - } - \__nmc_iter_do: - \tl_set_eq:NN \l__nmc_fp_expr_tl \l__nmc_fp_exprn_tl - } - \bool_if:nF { \g__nmc_error_bool || \l__nmc_num_only_bool } - { - \__nmc_iter_environ: - \__nmc_iter_write: - } - } -%-------------------------------------- -\cs_new_protected:Npn \__nmc_iter_do: - { - \bool_if:NTF \l__nmc_num_only_bool - { - \__nmc_iter_fixed_pt: - \bool_if:NF \g__nmc_error_bool - { - \__nmc_num_format:nNnN { \l__nmc_iter_fixedpti_fp } - \l_nmc_result_tl { \l__nmc_round_int } - \l__nmc_sci_num_out_bool - \int_decr:N \l__nmc_iter_total_int - \tl_gset:Nx \g__nmc_iter_info_tl - { \int_use:N \l__nmc_iter_total_int } - } - } - { % don't print initial iterations - \int_step_function:nnnN { 1 } { 1 } - { \l__nmc_iter_total_int - \l__nmc_iter_view_int - 1 } - \__nmc_iter_current:n - \bool_if:NF \g__nmc_error_bool - { % store then print these ones - \seq_clear:N \l__nmc_iter_result_seq - \int_step_function:nnnN { 1 } { 1 } - { \int_min:nn { \l__nmc_iter_view_int } - { \l__nmc_iter_total_int - 1 } } \__nmc_iter_current_store:n - } - } - } -\cs_new_protected:Npn \__nmc_iter_current:n #1 - { % stepping function - \bool_if:NF \g__nmc_error_bool - { - \__nmc_calc_fn_val:VNnN \l__nmc_iter_var_tl \l__nmc_formula_tl - { \l__nmc_result_fp } \l__nmc_result_fp - } - } -\cs_new_protected:Npn \__nmc_iter_current_store:n #1 - { % stepping function - \__nmc_calc_fn_val:VNnN \l__nmc_iter_var_tl \l__nmc_formula_tl - { \l__nmc_result_fp } \l__nmc_result_fp - \bool_if:NF \g__nmc_error_bool - { - \__nmc_num_format:nNnN { \l__nmc_result_fp } \l_nmc_result_tl - { \l__nmc_round_int } \l__nmc_sci_num_out_bool - \seq_put_right:NV \l__nmc_iter_result_seq \l_nmc_result_tl - \int_set:Nn \l_tmpa_int - { \l__nmc_iter_total_int - \l__nmc_iter_view_int + #1 } - \seq_put_right:Nx \l__nmc_iter_index_seq { \int_use:N \l_tmpa_int } - } - } -\cs_new_protected:Npn \__nmc_iter_fixed_pt: - { % already 1 iteration - \int_set:Nn \l__nmc_iter_total_int { 1 } - \fp_set_eq:NN \l__nmc_iter_fixedpti_fp \l__nmc_iter_first_fp - \fp_set:Nn \l__nmc_iter_fixedptii_fp { \l__nmc_iter_fixedpti_fp + 1 } - \bool_until_do:nn - { - \fp_compare_p:nNn { 0 } = - { round( \l__nmc_iter_fixedpti_fp - \l__nmc_iter_fixedptii_fp, - \l__nmc_iter_round_int ) } - || \g__nmc_error_bool - } - { - \int_incr:N \l__nmc_iter_total_int - \fp_set_eq:NN \l__nmc_iter_fixedptii_fp \l__nmc_iter_fixedpti_fp - \__nmc_calc_fn_val:VNnN \l__nmc_iter_var_tl \l__nmc_formula_tl - { \l__nmc_result_fp } \l__nmc_result_fp - \fp_set_eq:NN \l__nmc_iter_fixedpti_fp \l__nmc_result_fp - \int_compare:nNnF { \l__nmc_iter_total_int } < - { \l__nmc_iter_max_int } - { - \bool_gset_true:N \g__nmc_error_bool - \__nmc_error_what:n - { - No~fixed~point~attained~after~$\int_use:N - \l__nmc_iter_total_int$~iterations~of - } - } - } - } -\cs_new_protected:Npn \__nmc_iter_environ: - { - \tl_set:Nx \l__nmc_iter_begin_tl - { - \mode_if_math:F { \exp_not:o \l__nmc_math_delimi_tl } - \exp_not:N \begin{array}{r@{}l} - \bool_if:NTF \l__nmc_wraps_math_bool - { \exp_not:o \l__nmc_formula_dup_tl &{}= } - { &{} } - } - \tl_set:Nx \l__nmc_iter_end_tl - { - \exp_not:N \end{array} - \mode_if_math:F { \exp_not:o \l__nmc_math_delimii_tl } - } - } -\cs_new_protected:Npn \__nmc_iter_write: - { - \__nmc_num_format:nNnN { \l__nmc_iter_first_fp } \l_tmpa_tl - { \l__nmc_round_int } \l__nmc_sci_num_out_bool - \tl_gset:Nx \g__nmc_iter_info_tl { \int_use:N \l__nmc_iter_total_int } - \__nmc_if_mod_zero:nnTF { \l__nmc_debug_int } { 7 } - { \seq_get_right:NN \l__nmc_iter_result_seq \l_nmc_result_tl } - { - \tl_set:Nx \l_nmc_result_tl - { - \exp_not:o \l__nmc_iter_begin_tl - \l_tmpa_tl \l__nmc_vv_display_tl - \int_compare:nNnT - { \l__nmc_iter_total_int } > { \l__nmc_iter_view_int + 1 } - { - \\ & \exp_not:N \ldots - \ \exp_not:N\mbox{final\ - \int_use:N \l__nmc_iter_view_int\ of\ \g__nmc_iter_info_tl :} - } - \int_compare:nNnT { \l__nmc_iter_total_int } > { 1 } - { \\ & \exp_not:N \hookrightarrow } - \seq_use:Nn \l__nmc_iter_result_seq { \\ & \hookrightarrow } - \exp_not:o \l__nmc_iter_end_tl - } - } - } -\cs_new_protected:Npn \__nmc_iter_display: - { - \bool_if:NTF \l__nmc_num_only_bool - { \tl_gset_eq:NN \g__nmc_reuse_tl \l_nmc_result_tl } - { - \__nmc_plus_reuse:nNN { \l__nmc_iter_reuse_int } - \l__nmc_iter_index_seq \l__nmc_iter_result_seq - } - \l_nmc_result_tl - } -%-------------------------------------- -%\nmcSolve -\int_new:N \l__nmc_solve_round_int -\int_new:N \l__nmc_solve_steps_int -\int_new:N \l__nmc_solve_slope_int -\int_new:N \l__nmc_solve_slopei_int -\int_new:N \l__nmc_solve_signs_int -\fp_new:N \l__nmc_solvea_fp -\fp_new:N \l__nmc_solveb_fp -\fp_new:N \l__nmc_solvec_fp -\fp_new:N \l__nmc_solved_fp - -\fp_new:N \l__nmc_solvefa_fp -\fp_new:N \l__nmc_solvefb_fp -\fp_new:N \l__nmc_solvefc_fp -\bool_new:N \l__nmc_solve_stop_bool -\tl_new:N \g__nmc_sove_info_tl - -\nmc_define:nnN { \nmcSolve } { solve } \solve - -\cs_new_protected:Npn \__nmc_solve_settings_digest: - { - \bool_set_false:N \l__nmc_allow_TF_out_bool - \tl_if_empty:NF \l__nmc_solve_step_tl - { - \__nmc_fpify_set:NN \l__nmc_solve_step_fp \l__nmc_solve_step_tl - \fp_compare:nNnT \l__nmc_solve_step_fp = { 0 } - { \__nmc_error_what:n { Non-zero~initial~step~required~in } } - } - } -\cs_new_protected:Npn \__nmc_solve_vv_digest:N #1 - { - \tl_if_empty:NTF \l__nmc_solve_var_tl - { \__nmc_vv_digest:N #1 } - { - \clist_push:NV \l__nmc_formula_tl \l__nmc_solve_var_tl - \__nmc_vv_digest:N #1 - \clist_pop:NN \l__nmc_formula_tl \l__nmc_solve_var_tl - } - } -\cs_new_protected:Npn \__nmc_solve_process: - { - \int_set:Nn \l__nmc_solve_round_int - { \l__nmc_round_int + \l__nmc_solve_extra_int } - % get equation var if unspecified - \tl_if_empty:NT \l__nmc_solve_var_tl - { - \seq_get:NN \l__nmc_vv_all_seq \l_tmpa_tl - \__nmc_vv_split_item:V \l_tmpa_tl - \tl_set_eq:NN \l__nmc_solve_var_tl \l__nmc_eq_var_tl - } - \bool_if:NF \g__nmc_error_bool - { \__nmc_solve_get_trial_vals: } - \bool_if:NF \g__nmc_error_bool - { - \__nmc_error_where:n { function } - \__nmc_solve_do: - } - \bool_if:NF \g__nmc_error_bool - { - \__nmc_num_format:nNnN { \l__nmc_solvea_fp } \l_nmc_result_tl - { \l__nmc_round_int } \l__nmc_sci_num_out_bool - \tl_gset:Nx \g__nmc_solve_info_tl - { \clist_use:Nn \g__nmc_solve_info_tl { + } } - \tl_set_eq:NN \l__nmc_fp_expr_tl \l__nmc_fp_exprn_tl - } - } -\cs_new_protected:Npn \__nmc_solve_get_trial_vals: - { - \prop_get:NVN \g__nmc_subst_var_prop - \l__nmc_solve_var_tl \l__nmc_subst_tl - % ensure a < b - \int_case:nn { \fp_sign:n { \l__nmc_solve_step_fp } } - { - { 1 } - { - \fp_set:Nn \l__nmc_solvea_fp { \l__nmc_subst_tl } - \fp_set:Nn \l__nmc_solveb_fp - { \l__nmc_solvea_fp + \l__nmc_solve_step_fp } - } - { -1 } - { - \fp_set:Nn \l__nmc_solveb_fp { \l__nmc_subst_tl } - \fp_set:Nn \l__nmc_solvea_fp - { \l__nmc_solveb_fp + \l__nmc_solve_step_fp } - } - } - } -% find opp. signs, zero, or fn min. -% a b = var vals; fa fb = fn vals -\cs_new_protected:Npn \__nmc_solve_do: - { - \__nmc_solve_calc_values: - \int_zero:N \l__nmc_solve_steps_int - \tl_gclear:N \g__nmc_solve_info_tl - \bool_do_until:nn - { - \g__nmc_error_bool || \l__nmc_solve_stop_bool - || \int_compare_p:nNn - { \l__nmc_solve_steps_int } > { \l__nmc_solve_max_int } - || \fp_compare_p:nNn { 0 } = - { round(\l__nmc_solveb_fp - \l__nmc_solvea_fp, - \l__nmc_solve_round_int) } - } - { - \int_incr:N \l__nmc_solve_steps_int - \int_case:nn { \l__nmc_solve_signs_int } - { - { 0 } { \__nmc_solve_do_bingo: } - { -1 } { \__nmc_solve_do_bisect: } - { 1 } { \__nmc_solve_do_slope: } - } - } - \bool_if:nF { \g__nmc_error_bool || \l__nmc_solve_stop_bool } - { - \__nmc_error_where:n { $\l__nmc_formula_tl$ } - \__nmc_error_what:n - { - No~zero/extremum~found~after~$\int_use:N - \l__nmc_solve_max_int$~steps~for~function - } - } - } -\cs_new_protected:Npn \__nmc_solve_do_bingo: - { % fn = 0 to 16 figures - \fp_compare:nNnTF { \l__nmc_solvefb_fp } = { 0 } - { - \fp_set_eq:NN \l__nmc_solvea_fp \l__nmc_solveb_fp - \fp_set_eq:NN \l__nmc_solvefa_fp \l__nmc_solvefb_fp - } - { - \fp_set_eq:NN \l__nmc_solveb_fp \l__nmc_solvea_fp - \fp_set_eq:NN \l__nmc_solvefb_fp \l__nmc_solvefa_fp - } - \bool_set_true:N \l__nmc_solve_stop_bool - } -\cs_new_protected:Npn \__nmc_solve_do_bisect: - { - \tl_gset:Nx \g__nmc_solve_info_tl { \int_use:N \l__nmc_solve_steps_int } - \int_zero:N \l__nmc_solve_steps_int - \fp_set:Nn \l__nmc_solvec_fp { ( \l__nmc_solvea_fp + \l__nmc_solveb_fp ) / 2 } - \__nmc_calc_fn_val:VNnN \l__nmc_solve_var_tl \l__nmc_formula_tl - { \l__nmc_solvec_fp } \l__nmc_solvefc_fp - \fp_set:Nn \l__nmc_solved_fp { \l__nmc_solvec_fp + 1 } - \bool_until_do:nn - { - \g__nmc_error_bool || - \fp_compare_p:nNn { 0 } = - { round( \l__nmc_solvec_fp - \l__nmc_solved_fp , - \l__nmc_solve_round_int ) } - } - { - \int_incr:N \l__nmc_solve_steps_int - \fp_set_eq:NN \l__nmc_solved_fp \l__nmc_solvec_fp - \fp_compare:nNnTF { 0 } = { \l__nmc_solvefc_fp } - { - \fp_set_eq:NN \l__nmc_solvea_fp \l__nmc_solvec_fp - \fp_set_eq:NN \l__nmc_solvefa_fp \l__nmc_solvefc_fp - } - { - \fp_compare:nNnTF - { sign(\l__nmc_solvefa_fp)sign(\l__nmc_solvefc_fp) } = { 1 } - { - \fp_set_eq:NN \l__nmc_solvea_fp \l__nmc_solvec_fp - \fp_set_eq:NN \l__nmc_solvefa_fp \l__nmc_solvefc_fp - } - { - \fp_set_eq:NN \l__nmc_solveb_fp \l__nmc_solvec_fp - \fp_set_eq:NN \l__nmc_solvefb_fp \l__nmc_solvefc_fp - } - \fp_set:Nn \l__nmc_solvec_fp - { ( \l__nmc_solvea_fp + \l__nmc_solveb_fp ) / 2 } - \__nmc_calc_fn_val:VNnN \l__nmc_solve_var_tl - \l__nmc_formula_tl { \l__nmc_solvec_fp } \l__nmc_solvefc_fp - } - } - \bool_set_true:N \l__nmc_solve_stop_bool - \clist_gput_right:Nx \g__nmc_solve_info_tl { \int_use:N \l__nmc_solve_steps_int } - } -\cs_new_protected:Npn \__nmc_solve_do_slope: - { - \bool_if:NF \g__nmc_error_bool - { - \int_if_zero:nTF { \l__nmc_solve_slope_int } - { % contract - \fp_add:Nn \l__nmc_solvea_fp - { ( \l__nmc_solveb_fp - \l__nmc_solvea_fp ) / 4 } - \fp_sub:Nn \l__nmc_solveb_fp - { ( \l__nmc_solveb_fp - \l__nmc_solvea_fp ) / 4 } - } - { % always towards x-axis - \fp_compare:nNnTF { 0 } < - { \l__nmc_solvefa_fp * \l__nmc_solve_slope_int } - { \__nmc_solve_do_slope_left: } - { \__nmc_solve_do_slope_right: } - } - \fp_set_eq:NN \l__nmc_solved_fp \l__nmc_solvea_fp - \int_set_eq:NN \l__nmc_solve_slopei_int \l__nmc_solve_slope_int - \__nmc_solve_calc_values: - } - \bool_if:NF \g__nmc_error_bool - { - \int_compare:nNnF { \l__nmc_solve_slope_int } = - { \l__nmc_solve_slopei_int } - { - \fp_set:Nn \l__nmc_solvec_fp { ( \l__nmc_solvea_fp + \l__nmc_solveb_fp ) / 2 } - \int_case:nn { \l__nmc_solve_slopei_int } - { - { 1 } { \fp_set_eq:NN \l__nmc_solvea_fp \l__nmc_solvec_fp } - { -1 } { \fp_set_eq:NN \l__nmc_solveb_fp \l__nmc_solvec_fp } - } - \__nmc_solve_calc_values: - } - } - \fp_compare:nNnT { 0 } = - { round(\l__nmc_solveb_fp - \l__nmc_solvea_fp, - \l__nmc_solve_round_int) } - { \bool_set_true:N \l__nmc_solve_stop_bool } - } -\cs_new_protected:Npn \__nmc_solve_do_slope_left: - { - \fp_set:Nn \l__nmc_solvec_fp { 2 \l__nmc_solvea_fp - \l__nmc_solveb_fp } - \fp_set_eq:NN \l__nmc_solveb_fp \l__nmc_solvea_fp - \fp_set_eq:NN \l__nmc_solvea_fp \l__nmc_solvec_fp - } -\cs_new_protected:Npn \__nmc_solve_do_slope_right: - { - \fp_set:Nn \l__nmc_solvec_fp { 2 \l__nmc_solveb_fp - \l__nmc_solvea_fp } - \fp_set_eq:NN \l__nmc_solvea_fp \l__nmc_solveb_fp - \fp_set_eq:NN \l__nmc_solveb_fp \l__nmc_solvec_fp - } -\cs_new_protected:Npn \__nmc_solve_calc_values: - { - \__nmc_calc_fn_val:VNnN \l__nmc_solve_var_tl \l__nmc_formula_tl - { \l__nmc_solvea_fp } \l__nmc_solvefa_fp - \bool_if:NF \g__nmc_error_bool - { - \__nmc_calc_fn_val:VNnN \l__nmc_solve_var_tl \l__nmc_formula_tl - { \l__nmc_solveb_fp } \l__nmc_solvefb_fp - } - \bool_if:NF \g__nmc_error_bool - { - \int_set:Nn \l__nmc_solve_slope_int - { \fp_eval:n { sign(\l__nmc_solvefb_fp - \l__nmc_solvefa_fp) } } - \int_set:Nn \l__nmc_solve_signs_int - { \fp_eval:n { sign(\l__nmc_solvefa_fp) sign(\l__nmc_solvefb_fp) } } - } - } -\cs_new_protected:Npn \__nmc_solve_display: - { - \tl_gset_eq:NN \g__nmc_reuse_tl \l_nmc_result_tl - \bool_if:NF \l__nmc_num_only_bool - { - \__nmc_num_format:nNnN { \l__nmc_solvefa_fp } \l_tmpa_tl - { \l__nmc_round_int } \l__nmc_sci_num_out_bool - \tl_set:Nx \l_nmc_result_tl - { - \exp_not:o \l__nmc_math_delimi_tl - \bool_if:NTF \l__nmc_wraps_math_bool - { - \exp_not:o \l__nmc_formula_tl = \l_tmpa_tl - \bool_if:NTF \l__nmc_vv_multline_bool - { \exp_not:o \l__nmc_vv_display_tl } - { - \mathchoice{ \exp_not:o \l__nmc_vv_display_tl } - { \exp_not:o \l__nmc_vv_inline_tl }{}{} - } - \rightarrow \exp_not:N \quad - \l__nmc_solve_var_tl = \l_nmc_result_tl - } - { - \l__nmc_solve_var_tl = \l_nmc_result_tl - \mathchoice{ \exp_not:o \l__nmc_vv_display_tl } - { \exp_not:o \l__nmc_vv_inline_tl }{}{} - } - \l__nmc_punc_tl - \exp_not:o \l__nmc_math_delimii_tl - } - \int_if_zero:nT { \l__nmc_solve_reuse_int } - { \tl_gset_eq:NN \g__nmc_reuse_tl \l_nmc_result_tl } - } - \l_nmc_result_tl - } -%-------------------------------------- -% \nmcRecur -\bool_new:N \l__nmc_recur_ellipsis_bool -\int_new:N \l__nmc_recur_last_int -\fp_new:N \l__nmc_recur_result_fp - -\int_new:N \l__nmc_recur_subscr_ini_int -\int_new:N \l__nmc_recur_subscr_val_int -\int_new:N \l__nmc_recur_order_int -\int_new:N \l__nmc_recur_var_int - -\tl_new:N \l__nmc_recurrence_tl -\tl_new:N \l__nmc_recur_base_var_tl -\tl_new:N \l__nmc_recur_subscr_var_tl - -\seq_new:N \l__nmc_recur_result_seq -\seq_new:N \l__nmc_recur_index_seq -\seq_new:N \l__nmc_recur_vars_seq - -\nmc_define:nnN { \nmcRecur } { recur } \recur - -\cs_new_protected:Npn \__nmc_recur_settings_digest: - { - \bool_set_false:N \l__nmc_allow_TF_out_bool - \int_set:Nn \l__nmc_recur_total_int - { \int_max:nn { \l__nmc_recur_total_int } { 1 } } - \int_set:Nn \l__nmc_recur_last_int - { \int_max:nn { 0 } { \int_min:nn - { \l__nmc_recur_last_int } { \l__nmc_recur_total_int } } } - \int_set:Nn \l__nmc_recur_first_int - { \int_max:nn { 0 } { \int_min:nn { \l__nmc_recur_first_int } - { \l__nmc_recur_total_int - \l__nmc_recur_last_int } } } - \int_if_zero:nT { \l__nmc_recur_first_int } - { \int_decr:N \l__nmc_recur_first_int } - } -\cs_new_protected:Npn \__nmc_recur_vv_digest:N #1 - { % #1 = reversed vv clist - \bool_set_true:N \l__nmc_multitok_bool - \__nmc_recur_elements: - \__nmc_recur_vars_change:N #1 - \__nmc_vv_digest:N #1 - \__nmc_recur_vv_post: - \tl_set_eq:NN \l__nmc_formula_tl \l__nmc_recurrence_tl - } -% \l__nmc_recurrence_tl, \l__nmc_recur_base_var_tl, -% \l__nmc_recur_subscr_var_tl, \l__nmc_recur_subscr_val_int -\cs_new_protected:Npn \__nmc_recur_elements: - { - \tl_clear:N \l_tmpa_tl - \bool_set_false:N \l_tmpa_bool - \tl_map_inline:Nn \l__nmc_formula_tl - { - \bool_if:NTF \l_tmpa_bool - { - \tl_set:Nn \l_tmpa_tl { ##1 } - \tl_map_break: - } - { - \token_if_math_subscript:NTF ##1 - { - \tl_set:NV \l__nmc_recur_base_var_tl \l_tmpa_tl - \bool_set_true:N \l_tmpa_bool - } - { \tl_put_right:Nn \l_tmpa_tl { ##1 } } - } - } - \__nmc_recur_parse_subscr:N \l_tmpa_tl - \exp_last_unbraced:NV\__nmc_split_eq:w \l__nmc_formula_tl \q_stop - \tl_set:NV \l__nmc_recurrence_tl \l__nmc_eq_val_tl - \tl_set_rescan:Nno \l__nmc_recurrence_tl { \ExplSyntaxOn } \l__nmc_recurrence_tl - } -\cs_new_protected:Npn \__nmc_recur_parse_subscr:N #1 - { - \tl_clear:N \l__nmc_recur_subscr_var_tl - \tl_set:Nn \l_tmpb_tl { 0 } - \int_zero:N \l__nmc_recur_subscr_val_int - \bool_set_false:N \l_tmpa_bool - \tl_map_inline:Nn #1 - { - \bool_if:NTF \l_tmpa_bool - { \tl_put_right:Nn \l_tmpb_tl { ##1 } } - { - \tl_if_in:nnTF { +- } { ##1 } - { - \tl_put_right:Nn \l_tmpb_tl { ##1 } - \bool_set_true:N \l_tmpa_bool - } - { \tl_put_right:Nn \l__nmc_recur_subscr_var_tl { ##1 } } - } - } - \int_set:Nn \l__nmc_recur_subscr_val_int { \l_tmpb_tl } - } -\cs_new_protected:Npn \__nmc_recur_vars_change:N #1 - { % f_{1} etc ==> f_{n-1} etc in #1 (reverse order vv-list) - \clist_reverse:N #1 - \int_zero:N \l__nmc_recur_order_int - \clist_clear:N \l_tmpa_clist % --> \l__nmc_recur_vars_seq - \clist_clear:N \l_tmpb_clist % --> #1 - \int_set:Nn \l_tmpb_int { \l__nmc_recur_subscr_val_int - 1 } - \tl_set_rescan:Nno #1 { \ExplSyntaxOn } #1 - \clist_map_inline:Nn #1 - { - \seq_set_split:Nnn \l_tmpa_seq {_} { ##1 } - \seq_pop:NN \l_tmpa_seq \l_tmpa_tl - \seq_if_empty:NTF \l_tmpa_seq - { \clist_put_left:NV \l_tmpb_clist \l_tmpa_tl } - { - \tl_if_eq:NNTF \l_tmpa_tl \l__nmc_recur_base_var_tl - { % change e.g. f_{1}(x) to f_{n-1}(x) - \int_incr:N \l__nmc_recur_order_int - \tl_put_right:Nn \l_tmpa_tl { _ } - \tl_set_eq:NN \l_tmpb_tl \l__nmc_recur_subscr_var_tl - \int_case:nn { \int_sign:n { \l_tmpb_int } } - { - { -1 } - { - \tl_put_right:Nx \l_tmpb_tl - { \int_use:N \l_tmpb_int } - } - { 0 } { \prg_do_nothing: } - { 1 } - { - \tl_put_right:Nn \l_tmpb_tl { + } - \tl_put_right:Nx \l_tmpb_tl - { \int_use:N \l_tmpb_int } - } - } - \tl_put_right:Nx \l_tmpa_tl { { \l_tmpb_tl } } - \int_decr:N \l_tmpb_int - \seq_pop:NN \l_tmpa_seq \l_tmpb_tl - \int_set:Nn \l__nmc_recur_subscr_ini_int - { \tl_head:N \l_tmpb_tl } - \tl_put_right:Nx \l_tmpa_tl - { \tl_range:Nnn \l_tmpb_tl { 2 } { -1 } } - \clist_put_left:NV \l_tmpb_clist \l_tmpa_tl - \seq_set_split:NnV \l_tmpb_seq { = } \l_tmpa_tl - \seq_pop:NN \l_tmpb_seq \l_tmpa_tl - \clist_put_left:NV \l_tmpa_clist \l_tmpa_tl - } - { \clist_put_left:Nn \l_tmpb_clist { ##1 } } - } - } - \int_set:Nn \l__nmc_recur_var_int - { \l__nmc_recur_subscr_ini_int + \l__nmc_recur_order_int - - \l__nmc_recur_subscr_val_int } - \clist_set_eq:NN #1 \l_tmpb_clist - \clist_put_left:NV \l_tmpa_clist \l__nmc_recur_subscr_var_tl - \clist_concat:NNN \l__nmc_formula_tl \l__nmc_recurrence_tl \l_tmpa_clist - } -\cs_new_protected:Npn \__nmc_recur_vv_post: - { - \clist_pop:NN \l__nmc_formula_tl \l__nmc_recurrence_tl - \clist_pop:NN \l__nmc_formula_tl \l__nmc_recur_subscr_var_tl - \tl_set:Nx \l_tmpa_tl { \int_use:N \l__nmc_recur_var_int } - \__nmc_vv_record:NVN \l__nmc_recur_subscr_var_tl \l_tmpa_tl \c_empty_prop - \tl_set_eq:NN \l_tmpa_tl \l__nmc_recur_subscr_var_tl - \tl_put_right:Nn \l_tmpa_tl { =0 } % formal value - \seq_put_left:NV \l__nmc_calc_fn_seq \l_tmpa_tl - \seq_set_from_clist:NN \l__nmc_recur_vars_seq \l__nmc_formula_tl - } -%%%%%%%%%%%%%%%%%%% -\cs_new_protected:Npn \__nmc_recur_process: - { % store initial vals; generate later vals - \__nmc_recur_store_ini: - \__nmc_error_where:n { recurrence~formula } - \__nmc_recur_generate: - \seq_get_right:NN \l__nmc_recur_result_seq \l_nmc_result_tl - \tl_set_eq:NN \l__nmc_fp_expr_tl \l__nmc_fp_exprn_tl - } -\cs_new_protected:Npn \__nmc_recur_store_ini: - { - \seq_set_eq:NN \l_tmpa_seq \l__nmc_recur_vars_seq - \int_step_inline:nnnn { 1 } { 1 } { \l__nmc_recur_order_int } - { - \seq_pop:NN \l_tmpa_seq \l_tmpa_tl - \prop_get:NVN \g__nmc_subst_var_prop \l_tmpa_tl \l__nmc_subst_tl - \__nmc_num_format:nNnN { \l__nmc_subst_tl } \l_tmpa_tl - { \l__nmc_round_int } \l__nmc_sci_num_out_bool - \seq_put_right:NV \l__nmc_recur_result_seq \l_tmpa_tl - \tl_set:Nx \l_tmpb_tl { \int_eval:n - { \l__nmc_recur_subscr_ini_int + ##1 -1 } } - \seq_put_right:NV \l__nmc_recur_index_seq \l_tmpb_tl - } - } -\cs_new_protected:Npn \__nmc_recur_generate: - { - \prop_get:NVN \g__nmc_subst_var_prop - \l__nmc_recur_subscr_var_tl \l__nmc_subst_tl - \int_set:Nn \l__nmc_recur_var_int { \l__nmc_subst_tl } - \int_set:Nn \l_tmpa_int { \l__nmc_recur_var_int + - \l__nmc_recur_total_int - \l__nmc_recur_order_int - 1 } - \__nmc_error_where:n { recurrence~relation } - \__nmc_if_mod_zero:nnT { \l__nmc_debug_int } { 7 } - { \__nmc_fpify:VN \l__nmc_recurrence_tl \l__nmc_fp_expr_tl } - \int_step_function:nnnN { \l__nmc_recur_var_int } { 1 } - {\l_tmpa_int } \__nmc_recur_generate_loop:n - } -\cs_new_protected:Npn \__nmc_recur_generate_loop:n #1 - { - \bool_if:NF \g__nmc_error_bool - { % calc. the next term - \fp_set:Nn \l_tmpa_fp { #1 } - \__nmc_calc_fn_val:VNnN \l__nmc_recur_subscr_var_tl - \l__nmc_recurrence_tl { \l_tmpa_fp } \l__nmc_recur_result_fp - } - \bool_if:NF \g__nmc_error_bool - { % store the result - \__nmc_num_format:nNnN { \l__nmc_recur_result_fp } - \l_tmpa_tl { \l__nmc_round_int } \l__nmc_sci_num_out_bool - \seq_put_right:NV \l__nmc_recur_result_seq \l_tmpa_tl - \seq_put_right:Nn \l__nmc_recur_index_seq { #1 } - % shift vals "down variable"; tmpa above, tmpb below - \seq_set_eq:NN \l_tmpa_seq \l__nmc_recur_vars_seq - \seq_pop:NN \l_tmpa_seq \l_tmpb_tl % low var - \int_step_inline:nnnn {2} { 1 } { \l__nmc_recur_order_int } - { - \seq_pop:NN \l_tmpa_seq \l_tmpa_tl % hi var - \prop_get:NVN \g__nmc_subst_var_prop \l_tmpa_tl \l__nmc_subst_tl - \prop_put:NVV \g__nmc_subst_var_prop \l_tmpb_tl \l__nmc_subst_tl - \prop_put:NVV \l__nmc_vv_change_prop \l_tmpb_tl \l__nmc_subst_tl - \tl_set_eq:NN \l_tmpb_tl \l_tmpa_tl - } - % use tmpb, not tmpa, in case order = 1 - \prop_put:NVx \g__nmc_subst_var_prop \l_tmpb_tl - { \fp_use:N \l__nmc_recur_result_fp } - \prop_put:NVx \l__nmc_vv_change_prop \l_tmpb_tl - { \fp_use:N \l__nmc_recur_result_fp } - } - } -\cs_new_protected:Npn \__nmc_recur_display: - { - \bool_if:NTF \l__nmc_num_only_bool - { \tl_gset_eq:NN \g__nmc_reuse_tl \l_nmc_result_tl } - { - \seq_clear:N \l_tmpa_seq - \seq_clear:N \l_tmpb_seq - \seq_clear:N \l_tmpc_seq - \__nmc_recur_result:NN \l_tmpa_seq \l_tmpb_seq - \tl_set:Nx \l_nmc_result_tl - { - \exp_not:o \l__nmc_math_delimi_tl - \bool_if:NT \l__nmc_wraps_math_bool - { - \exp_not:o \l__nmc_formula_dup_tl - \bool_if:NTF \l__nmc_vv_multline_bool - { \exp_not:o \l__nmc_vv_display_tl } - { - \mathchoice{ \exp_not:o \l__nmc_vv_display_tl } - { \exp_not:o \l__nmc_vv_inline_tl }{}{} - } - \rightarrow \exp_not:N \quad - } - \seq_use:Nn \l_tmpa_seq { ,\ } - \l__nmc_punc_tl - \exp_not:o \l__nmc_math_delimii_tl - } - \__nmc_plus_reuse:nNN { \l__nmc_recur_reuse_int } \l_tmpc_seq \l_tmpb_seq - } - \l_nmc_result_tl - } -\cs_new_protected:Npn \__nmc_recur_result:NN #1#2 - { - \int_zero:N \l_tmpa_int - \seq_map_inline:Nn \l__nmc_recur_result_seq - { - \seq_pop:NN \l__nmc_recur_index_seq \l__nmc_toss_tl - \int_compare:nNnTF { \l_tmpa_int } < { \l__nmc_recur_first_int } - { \seq_put_right:Nn #1 { ##1 } } - { - \int_compare:nTF { \l_tmpa_int = \l__nmc_recur_first_int - < \l__nmc_recur_total_int - \l__nmc_recur_last_int } - { \seq_put_right:Nn #1 { \ldots } } - { - \int_compare:nNnT { 1 + \l_tmpa_int } > - { \l__nmc_recur_total_int - \l__nmc_recur_last_int } - { - \seq_put_right:Nn #1 { ##1 } - \seq_put_right:Nn #2 { ##1 } - \seq_put_right:Nx \l_tmpc_seq { \int_eval:n { \l_tmpa_int + \l__nmc_recur_subscr_val_int } } - } - } - } - \int_incr:N \l_tmpa_int - } - \bool_if:NT \l__nmc_recur_ellipsis_bool - { \seq_put_right:Nn #1{ \ldots } } - } -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\keys_define:nn { numerica } - { - iter-do .int_set:N = \l__nmc_iter_total_int, - iter-see-last .int_set:N = \l__nmc_iter_view_int, - iter-max-iterations .int_set:N = \l__nmc_iter_max_int, - iter-extra-rounding .int_set:N = \l__nmc_iter_extra_int, - iter-reuse .int_set:N = \l__nmc_iter_reuse_int, - - iter-do .default:n = 5, - iter-see-last .default:n = 4, - iter-max-iterations .default:n = 100, - iter-extra-rounding .default:n = 0, - iter-reuse .default:n = 0, -% - solve-max-steps .int_set:N = \l__nmc_solve_max_int, - solve-extra-rounding .int_set:N = \l__nmc_solve_extra_int, - solve-first-step .tl_set:N = \l__nmc_solve_step_tl, - solve-reuse .int_set:N = \l__nmc_solve_reuse_int, - - solve-max-steps .default:n = 100, - solve-extra-rounding .default:n = 0, - solve-first-step .default:n = 1, - solve-reuse .default:n = 0, -% - recur-do .int_set:N = \l__nmc_recur_total_int, - recur-see-first .int_set:N = \l__nmc_recur_first_int, - recur-see-last .int_set:N = \l__nmc_recur_last_int, - recur-reuse .int_set:N = \l__nmc_recur_reuse_int, - - recur-do .default:n = 7, - recur-see-first .default:n = 3, - recur-see-last .default:n = 2, - recur-reuse .default:n = 0 - } -\keys_set_known:nn { numerica } - { - iter-do,iter-see-last,iter-max-iterations, - iter-extra-rounding,iter-reuse, - solve-variable,solve-first-step,solve-max-steps, - solve-extra-rounding,solve-reuse, - recur-do,recur-see-first,recur-see-last,recur-reuse - } -\keys_define:nn { numerica/iter } - { - var .tl_set:N = \l__nmc_iter_var_tl, - + .int_set:N = \l__nmc_iter_extra_int, - max .int_set:N = \l__nmc_iter_max_int, - do .int_set:N = \l__nmc_iter_total_int, - see .int_set:N = \l__nmc_iter_view_int, - reuse .int_set:N = \l__nmc_iter_reuse_int - } -\keys_define:nn { numerica/solve } - { - var .tl_set:N = \l__nmc_solve_var_tl, - + .int_set:N = \l__nmc_solve_extra_int, - max .int_set:N = \l__nmc_solve_max_int, - dvar .tl_set:N = \l__nmc_solve_step_tl, - reuse .int_set:N = \l__nmc_solve_reuse_int - } -\keys_define:nn { numerica/recur } - { - do .int_set:N = \l__nmc_recur_total_int, - see1 .int_set:N = \l__nmc_recur_first_int, - see2 .int_set:N = \l__nmc_recur_last_int, - ... .code:n = \bool_set_true:N \l__nmc_recur_ellipsis_bool, - reuse .int_set:N = \l__nmc_recur_reuse_int - } -% end of `numerica-plus.def'
\ No newline at end of file |